Repository navigation
Session Handoff [auto-2080]: Read an eval Argument as a Wait-Loop Payload in the Guard per #2080 #2137
Copy link
Copy link
Closed
Labels
blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoffBlocked on another issue: one in another repository, or a decision issue here for a parked handoffhandoffA link in the session handoff chain, one open issue per trackA link in the session handoff chain, one open issue per track
Description
Next steps, in priority order
- Fix The Guard's Wait-Loop Rule Never Reads an eval Argument #2080 in
host-setup/agent-safety/claude/gh-write-guard.py: read the arguments ofeval, joined with single spaces as bash joins them, as a payload the wait-loop rule inspects, the same way it already reads ash -c/bash -cargument. Done looks like both constructed commands in The Guard's Wait-Loop Rule Never Reads an eval Argument #2080 denied, a self-test row pinning each, the existing self-test suite still green, and a pull request into develop whose body carriesCloses on promotion: #2080. - Drive that pull request to develop per
drive-pr, runninglocal-strict-reviewbefore each push. Scope for this run is develop, so stop at the develop merge and close this lane out.
External blockers
None known at pick time. Re-check the Copilot review quota before a long wait.
Internal dependencies
- Two parked lanes hold open branches on the same guard file: Deny a Signal-0 timeout as a Wait Bound in the Guard #2117 (lane
auto-1634, blocked on decision Decision: How the Guard Reads a Shell-Rewritable Word in a timeout Run (#2117) #2118) and theauto-2112lane (blocked on decision Decision: Whether the #2112 Heredoc Fix Ships With Three Open Review Findings #2126). Base on current develop and keep the change confined to the payload-extraction path, so whichever lands second rebases cleanly. Do not touch the timeout-bound or heredoc-stripping code those lanes change.
State
- Nothing started. No branch, worktree, or pull request exists for The Guard's Wait-Loop Rule Never Reads an eval Argument #2080.
- Re-derive at resume:
origin/develophead, open pull requests naming The Guard's Wait-Loop Rule Never Reads an eval Argument #2080, and whether Deny a Signal-0 timeout as a Wait Bound in the Guard #2117 or theauto-2112branch has merged since this link was filed.
The parked decision queue
Three open decision issues at pick time, none blocking this lane: #2126, #2122, #2118. They belong to other lanes and are answered in an attended session.
What the last round did
Picker round only: ranked the open backlog and chose #2080, a pre-existing false allow in the guard's wait-loop rule (a safety defect in code that runs), over newer guard issues entangled with the parked heredoc and timeout lanes.
What not to repeat
- A Heredoc Inside a Substitution Whose Body Holds the Outer Tag Hides the Commands After It #2124, A Heredoc Opener Inside a Script Fed to a Shell Strips Past the Script's End #2125, A Heredoc Opener Inside a Multi-Line Quote Strips the Commands After It #2111, Fold a Line Continuation the Way Bash Does Before the Guard Reads a Command #2113, The Guard Folds a Backslash-Newline to a Space Where Bash Deletes It #2064, A Heredoc Closed by the End of a Substitution Stays Open to the Guard #2065, A Heredoc Body Kept as the Safe Direction Vouches for a Wait-Loop Bound #2063 are heredoc-handling issues entangled with the parked
auto-2112lane, so they were skipped rather than taken beside it.
New learnings
None.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoffBlocked on another issue: one in another repository, or a decision issue here for a parked handoffhandoffA link in the session handoff chain, one open issue per trackA link in the session handoff chain, one open issue per track
Activity
ptr727 commentedon Sep 30, 2026
Parked on decision #2139
Done. Branch
feature/auto-2080is pushed at1dd74971, based on develop2729f8f1, in three signed commits. It changes onlyhost-setup/agent-safety/claude/gh-write-guard.py._eval_payloadbuilds the shell text anevalin command position runs._unbounded_wait_loopreads that payload the way it reads abash -cone, inheriting only the enclosing shell's bound._sleepscounts a sleep inside an eval payload, taking the loop's quote-mask slices._collect_arglistis unchanged from develop._WAIT_CASESrows. Ten of them fail when their part of the fix is reverted, which was checked by mutation, and the eleventh pins that an eval payload's own arithmetic guard still bounds it.--selftest, ruff, mypy, the diff-scoped prose gate, andtest_install.pyall pass.Review record. Three
local-strict-reviewpasses were run on opus and recorded, the last one covering1dd74971.Not done. No pull request has been opened. The worktree
/home/pieter/repos/worktrees/ProjectTemplate-auto-2080is left standing, clean, on the branch.Remaining work. Act on #2139's answer.
local-strict-reviewagain, open the pull request into develop withCloses on promotion: #2080in its body, drive it to develop, and close this lane out.The issue's first command,
eval "until true; do sleep 1; done", is denied by the branch. Bash reads the issue's second command, as written, as a syntax error, so nothing loops there. The form bash does loop on iseval until [ -f y ";" -lt 5 ]\; do sleep 1\; done, which is the one the self-test pins.ptr727 commentedon Sep 30, 2026
Unblocked on 2026-09-30: decision #2139 is answered, option 1: one more edit round with the three stated designs (the redirection as an outer group, the suffix-payload guard, and ending the payload at the eval's own line when the quote mask is unknown), then drive to develop. The
blockedlabel is removed so the lane can resume.ptr727 commentedon Oct 1, 2026
Parked on decision #2208
Done. The branch
feature/auto-2080is pushed atc99a6484. It changes onlyhost-setup/agent-safety/claude/gh-write-guard.py. Current develop (658034f7, which includes #2203) is merged in with a signed merge commit, and it merged without conflict.4afa494aapplies Decide How the #2080 eval Fix Continues Past Its Review Budget #2139 option 1's three designs.cd928781replaces the textual suffix skip with an index-based one. The suffix skip gave a false allow when a later comment orechorepeated the text.c99a6484fixes three false allows. Two were under unknown quoting: a redirection, and the skip. The third was a separator fused to a redirection (;>), which is also fixed in_runs_as_command.--selftest, ruff, mypy, the diff-scoped prose gate, the eol gate,spec/validate.py, andtest_install.py.Review record. Three
local-strict-reviewpasses ran on opus and were recorded. The last one coversc99a6484.;>gap in_runs_as_commandis fixed on the branch.Not done. No pull request has been opened. The worktree
/home/pieter/repos/worktrees/ProjectTemplate-auto-2080is still there, clean, on the branch.Remaining work. Act on #2208's answer.
local-strict-reviewagain, open the pull request into develop withCloses on promotion: #2080in its body, drive it to develop, and close this lane out.A pull request body draft is not kept, since it would describe whichever option is chosen.
ptr727 commentedon Oct 1, 2026
Handed back to the unattended loop by an attended session. Decision #2208 is answered: option 1, fix the two regressions, file the two false allows, then drive to develop. Follow the answer recorded on #2208.
ptr727 commentedon Oct 4, 2026
Parked on decision #2367
Done. The branch
feature/auto-2080is pushed at19f8121a. It changes onlyhost-setup/agent-safety/claude/gh-write-guard.py. Current develop (cf053cb5) is merged in with a signed merge commit (3c3396fc), without conflict.c6424ac8applies Decide How the #2080 eval Fix Continues After Its Second Review Budget #2208 option 1. An unknown-quoting eval payload ends at an operator token holding a newline, and_sleepsreads each eval payload with its quote-kept mask. It also fixes a develop self-test row the merge broke: the fused-separator walk stopped at a quoted;.549b8e3banswers pass 1. The eval readers pass the quote mask to_runs_as_command, a quoted separator before a command no longer opens it, and the readers share a budget of eval reads.19f8121aanswers pass 2. It adds_runs_eval, charges each eval read by its payload's length, and passes masks through_sleeps's wrapper-payload and sleep checks.--selftest, ruff, mypy, the diff-scoped prose gate, the eol gate,spec/validate.py, andtest_install.py.Filed along the way. #2362 and #2363 are the two false allows #2208 split out, and the unknown-quoting form was commented onto #2363. #2364, #2365, and #2366 were filed from passes 1 and 2. No lesson issue was filed.
Review record. Three
local-strict-reviewpasses ran on opus and were recorded. The last one covers19f8121a.;.bash -lchides its loop.Not done. No pull request has been opened. The worktree
/home/pieter/repos/worktrees/ProjectTemplate-auto-2080is still there, clean, on the branch.Remaining work. Act on #2367's answer.
_runs_as_commandchanges, so the branch touches only eval paths. File the quoted-separator false denies and the;>false allow that this restores. Fix findings 3 to 5 in_runs_evaland the budget, and addevalto requirement 7 inhost-setup/agent-safety/README.md.local-strict-reviewagain. Then open the pull request into develop withCloses on promotion: #2080in its body, drive it to develop, and close this lane out.ptr727 commentedon Oct 6, 2026
Lane closed out: #2080 shipped in 2.0.852
An attended session worked this lane on decision #2367's answer, option 1. #2080 is fixed, promoted, and released.
946d9808. It narrowed the branch to eval-only paths:_runs_as_commandis byte-identical to develop, and the sleep check is unmasked. It also bounded the eval prefix walk, widened the runners, fds, and assignments, and stated the eval reading in requirement 7.00320647, closing The Guard's Wait-Loop Rule Never Reads an eval Argument #2080. Release run 37541430763 succeeded and published 2.0.852. This machine's Skills snapshot was refreshed and reads current.host-setup/agent-safety/claude/install.py.Decisions the maintainer answered in this session, each asked as a prompt when a push's two edit rounds were spent:
time -p {, and a subscript holding a newline), file the rest, then open the pull request.>eval, where a redirection target was read as running and caused a quadratic walk, then run pass 5.bash -c-heavy commands 1.8x slower, then run pass 6.Filed along the way: #2438 to #2451. Comments went on #2310, #2364, #2138, and #2446.
What not to repeat: a stop rule that reads "a slowdown worse than develop comes back to the maintainer" does not converge. Develop has no bound on its own runtime, so an adversarial reviewer can always build a larger input. #2451 is the root fix, a guard that bounds its own work.
Parked decision queue: 0 open
decisionissues.