Skip to content

Session Handoff [auto-2080]: Read an eval Argument as a Wait-Loop Payload in the Guard per #2080 #2137

Closed

Description

@ptr727

Next steps, in priority order

  1. 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 of eval, joined with single spaces as bash joins them, as a payload the wait-loop rule inspects, the same way it already reads a sh -c/bash -c argument. 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 carries Closes on promotion: #2080.
  2. Drive that pull request to develop per drive-pr, running local-strict-review before 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

State

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

New learnings

None.

Activity

  1. added
    handoffA link in the session handoff chain, one open issue per track
    on Sep 30, 2026
  2. ptr727 commented on Sep 30, 2026

    @ptr727
    OwnerAuthor

    Parked on decision #2139

    Done. Branch feature/auto-2080 is pushed at 1dd74971, based on develop 2729f8f1, in three signed commits. It changes only host-setup/agent-safety/claude/gh-write-guard.py.

    • _eval_payload builds the shell text an eval in command position runs.
    • _unbounded_wait_loop reads that payload the way it reads a bash -c one, inheriting only the enclosing shell's bound.
    • _sleeps counts a sleep inside an eval payload, taking the loop's quote-mask slices.
    • _collect_arglist is unchanged from develop.
    • 11 new _WAIT_CASES rows. 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, and test_install.py all pass.

    Review record. Three local-strict-review passes were run on opus and recorded, the last one covering 1dd74971.

    Not done. No pull request has been opened. The worktree /home/pieter/repos/worktrees/ProjectTemplate-auto-2080 is left standing, clean, on the branch.

    Remaining work. Act on #2139's answer.

    • Option 1: fix the three findings on this branch.
    • Option 2: trim the branch to the narrowed form.
    • Either way, run local-strict-review again, open the pull request into develop with Closes on promotion: #2080 in its body, drive it to develop, and close this lane out.
    • Option 3: delete the branch and worktree, and record The Guard's Wait-Loop Rule Never Reads an eval Argument #2080 as a known limit.

    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 is eval until [ -f y ";" -lt 5 ]\; do sleep 1\; done, which is the one the self-test pins.

  3. added
    blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoff
    on Sep 30, 2026
  4. ptr727 commented on Sep 30, 2026

    @ptr727
    OwnerAuthor

    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 blocked label is removed so the lane can resume.

  5. removed
    blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoff
    on Sep 30, 2026
  6. ptr727 commented on Oct 1, 2026

    @ptr727
    OwnerAuthor

    Parked on decision #2208

    Done. The branch feature/auto-2080 is pushed at c99a6484. It changes only host-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.

    • 4afa494a applies Decide How the #2080 eval Fix Continues Past Its Review Budget #2139 option 1's three designs.
    • cd928781 replaces the textual suffix skip with an index-based one. The suffix skip gave a false allow when a later comment or echo repeated the text.
    • c99a6484 fixes 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.
    • Each fix has a self-test row that fails when the fix is reverted, checked by mutation.
    • These all pass: --selftest, ruff, mypy, the diff-scoped prose gate, the eol gate, spec/validate.py, and test_install.py.

    Review record. Three local-strict-review passes ran on opus and were recorded. The last one covers c99a6484.

    Not done. No pull request has been opened. The worktree /home/pieter/repos/worktrees/ProjectTemplate-auto-2080 is still there, clean, on the branch.

    Remaining work. Act on #2208's answer.

    • Option 1: fix findings 3 and 4 on this branch, and file 1 and 2 as issues.
    • Option 2: fix all four.
    • Either way, run local-strict-review again, open the pull request into develop with Closes on promotion: #2080 in its body, drive it to develop, and close this lane out.
    • Option 3: delete the branch and worktree, and record The Guard's Wait-Loop Rule Never Reads an eval Argument #2080 as a known limit.

    A pull request body draft is not kept, since it would describe whichever option is chosen.

  7. added
    blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoff
    on Oct 1, 2026
  8. ptr727 commented on Oct 1, 2026

    @ptr727
    OwnerAuthor

    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.

  9. removed
    blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoff
    on Oct 1, 2026
  10. ptr727 commented on Oct 4, 2026

    @ptr727
    OwnerAuthor

    Parked on decision #2367

    Done. The branch feature/auto-2080 is pushed at 19f8121a. It changes only host-setup/agent-safety/claude/gh-write-guard.py. Current develop (cf053cb5) is merged in with a signed merge commit (3c3396fc), without conflict.

    • c6424ac8 applies 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 _sleeps reads 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 ;.
    • 549b8e3b answers 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.
    • 19f8121a answers 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.
    • Each fix has a self-test row that fails when the fix is reverted, checked by mutation. These all pass: --selftest, ruff, mypy, the diff-scoped prose gate, the eol gate, spec/validate.py, and test_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-review passes ran on opus and were recorded. The last one covers 19f8121a.

    Not done. No pull request has been opened. The worktree /home/pieter/repos/worktrees/ProjectTemplate-auto-2080 is still there, clean, on the branch.

    Remaining work. Act on #2367's answer.

    • Option 1: revert the two _runs_as_command changes, 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_eval and the budget, and add eval to requirement 7 in host-setup/agent-safety/README.md.
    • Option 2: fix all six in place.
    • With either option, run local-strict-review again. Then open the pull request into develop with Closes on promotion: #2080 in its body, drive it to develop, and close this lane out.
    • Option 3: delete the branch and worktree, record The Guard's Wait-Loop Rule Never Reads an eval Argument #2080 as a known limit in requirement 7, and close the issues the option names.
  11. added
    blockedBlocked on another issue: one in another repository, or a decision issue here for a parked handoff
    on Oct 4, 2026
  12. ptr727 commented on Oct 6, 2026

    @ptr727
    OwnerAuthor

    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.

    Decisions the maintainer answered in this session, each asked as a prompt when a push's two edit rounds were spent:

    1. After pass 3: fix the two round-2 regressions (time -p {, and a subscript holding a newline), file the rest, then open the pull request.
    2. After pass 4: fix >eval, where a redirection target was read as running and caused a quadratic walk, then run pass 5.
    3. After pass 5: fix only the extra lex that made bash -c-heavy commands 1.8x slower, then run pass 6.
    4. After pass 6: ship as is, filing two slowdowns on 100 KB+ constructed inputs. Develop itself crosses the 60s hook timeout on the same shapes at about 330 KB (The Guard Has No Bound on Its Own Running Time, So a Large Command Outlasts the Hook Timeout #2451).
    5. Merge Promote develop to main: Read an eval's Arguments as a Wait-Loop Payload in the Guard #2453 and release.

    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 decision issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    blockedBlocked 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 track

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions