Execution Log: the operator chooses how many sessions a work item's pull requests get
Append-only log of progress for the user's visibility.
Phase transitions
| Phase | Entered | Reviewed/approved by | Notes |
|---|---|---|---|
| phase-selection | 2026-08-17 | @MadaraUchiha-314 | Declared by the owner filing the ticket and pointing this cloud session at a designated branch. brainstorming skipped — the ticket names the option it wants and the alternative was already argued in decision-088. design-critic-review not selected: no critic is configured in this repository (reviews.critics: []). See Deviations from the standard gates. |
| requirements-definition | 2026-08-17 | pending — PR for this branch | requirements.md, three requirements. The ticket has a title and no body, so the reading was posted on the ticket before any file was written (comment) and the requirements link back to it. |
| design | 2026-08-17 | pending — PR for this branch | One key grows a value; one seam grows a requirement. Six alternatives recorded as rejected in decision-092, each with why it fails. |
| test-planning | 2026-08-17 | pending — PR for this branch | 12 rows, 6 in scope; every n/a carries a reason. |
| tasks-breakdown | 2026-08-17 | 12 tasks, two independent red roots. | |
| implementation | 2026-08-17 | TDD: the red run captured and committed before the fix. | |
| verification | 2026-08-17 | Every planned activity ran. One replan, recorded below. | |
| needs-review | 2026-08-17 | ||
| complete |
Pull requests
| PR | Scope / tasks | Status |
|---|---|---|
| this branch's PR | The whole work item — the spec chain, the change, the docs. | open |
Progress entries
2026-08-17 — read the ticket, then decision-088
- Phase: requirements-definition
- Did: the ticket is one sentence, and the option it asks for looked like one that already exists (
routing.tmux.sessionPerPr). Read issue-253 and decision-088, merged the day before, and found that D1 had turned the same-repository half of that option into a rule — deliberately, with the reason written down: "a knob for it would be a documented way to reproduce the bug." - Decided: this ticket is its author overruling D1 and D4 of a decision they accepted yesterday. That is their call to make, so the work is to build the knob safely, not to re-argue 088. Posted that reading on the ticket before writing anything, with the option table showing that both current values collapse the case being asked about.
- Next: separate what 088 established into the claim that is negotiable (which pull requests are candidates) and the claim that is not (two conversations never share a tree).
2026-08-17 — the invariant, and the trap under it
- Phase: design
- Did: traced
_endpoint_for→_spawn_endpoint→_endpoint_cwd→Workspace.prepareand found the design already had the shape needed: 088 D2 put "a session needs a tree" at a seam of its own. Only_endpoint_for's answer was hard-coded. - Found (the important part): naïvely making the collapse optional would have shipped a new wrong-tree bug.
ensure_worktreeswallows a failed branch checkout and falls back to a detached default-branch worktree. For a same-repository pull request the work item's own session already holds that branch, sogit worktree add -Bfails every time — and the fallback returns a distinct path, which sails past_endpoint_cwd's existing_same_pathguard. The-loop would have announced a session for pull request #N sitting onmain. - Decided:
Workspace.prepare(require_branch=True), passed for a same-repository endpoint only. Recorded as decision-092 D4, and it is whyalwaysis honestly documented as needingstrategy: clone.
2026-08-17 — red, then green
- Phase: implementation
- Did: wrote the failing tests first and committed them alone (
3a71828): 28 failed, 173 passed acrosstest_routing.py,test_workspace.pyandtest_configschema.py. Evidence inevidence/red.md. - Then: the three modes and their two derived questions in
TmuxConfig; one clause in_endpoint_for;require_branchthroughprepare/ensure_worktree/ensure_workitem_clone/_prepare_workspace/_endpoint_cwd; the schema leaf. - Note on the schema: the design first said
anyOf.configschema.pyis a hand-written validator whose supported-keyword set is asserted by a test, soanyOfwould have meant implementing a combinator to say whattype: ["string", "boolean"]+enumalready says. Changed to the union, and the design records why. - Fixed while green: three call sites outside the diff's subject —
StubWorkspace.prepareintest_trust_integration.py, a_prepare_workspacelambda double intest_routing.py, and twoTmuxConfig(session_per_pr=False)constructions that pyright rejected once the field became astr. The last two now say"never", which is what they meant.
2026-08-17 — verification
- Phase: verification
- Ran: every activity in
testing-plan.md. Whole suite 2,308 passed / 1 skipped;make lint(776 markdown files, 0 errors),make format-check,make typecheck(0 errors),make validate(7 configs valid), docs↔schema parity green. - Replanned, with the reason: T2 was planned to run in
test_webhook_routing_integration.py. Itsserver_factorybuilds no git origin, so the scenarios would have needed themake_originhelpers duplicated into it. They run intest_workspace.pyinstead, besidetest_a_cross_repo_pr_endpoint_spawns_in_its_own_checkout, which is the same shape: dispatcher in-process, faked tmux, real git. They keep their Gherkin docstrings. The matrix and the environment section were updated to say so rather than left describing the plan that was not executed. - Corrected: the plan's Verification-results row said "13 failed" for the red run before the run existed; the actual count is 28, and the file now says 28.
Capability docs
docs/capabilities/webhook-triggers.md— the routing behaviour is restated as the invariant (a session needs a tree, in every mode) plus the three-mode choice, replacing the two bullets that stated the collapse as a rule. A history row for issue-258 was added.docs/capabilities/process-graph.md— which pull requests have a session to drive an innerpdlc-pr-loopfrom is now the mode, not "cross-repository only".
Documentation
docs/config/cli/routing-options.md— thetmux.sessionPerPrsection rewritten for three values, with the mode table, thealways+strategy: cloneobligation in a warning box, and an upgrade note for the booleans.docs/cli/state.md— what apullRequests[]entry means now that three modes decide whether it carries a conversation..the-loop/cli-config.yamlandskills/the-loop/templates/cli-config.yaml— the key is now stated explicitly with its three values commented, in this repository's own config and in the one/the-loop:initscaffolds.cli/the_loop/eventlog.py— thesession.pr_spawnedandsession.pr_session_declineddescriptions (read bythe-loop events --explain) say which pull requests reach them under which mode, and name the new decline case.cli/the_loop/graph/pdlc-pr-loop.yaml— the header comment, which told the reader an inner loop is a cross-repository thing.README.mdand the skill'sreference/docs: not changed, and here is the reason. Neither describessessionPerPror how many sessions a pull request gets — the CLI daemon's routing configuration is documented indocs/config/cli/, which is where the change landed. A blank would not have been an answer; this is the answer.
Decisions
- decision-092 — How many sessions a work item's pull requests get is the operator's choice — the tree is not. Refines decision-088 D1 and D4; D2, D3 and D5 stand and are what make the choice affordable. Numbered 092 because 089–091 were taken by work merged on 2026-08-16.
Deviations from the standard gates
phase-selectionwas not posted as a checklist on the ticket. This work item runs in a one-shot cloud session, not under the CLI daemon, so there is no session to wait for a reply into. The owner's own act — filing the ticket and pointing a session at a designated branch — is the declaration, and the phases actually walked are listed above. The reading of an otherwise-empty ticket was still posted first, so the gate's purpose (a human states what is wanted before code is written) is served by a comment rather than by a checklist.- Critic review not run.
reviews.criticReviewCountis 3, butreviews.criticsis empty in this repository — there is no second harness configured to run one. Self-review was run and its findings are in the diff (theanyOf→type+enumchange, therequire_branchnarrowing to same-repository only, and theNone-is-not-a-typo case in the fail-closed test all came out of it). - Human sign-off is pending, as it must be. Risk tier 4 — the diff touches
.the-loop/cli-config.schema.json, asensitivePathsentry — soautonomy.tiers."4"ishuman-approves-pr, andsecurity.review.humanSignOffMinTier: 4additionally requires a named human security sign-off. Both are requested on the pull request. Nothing here completes autonomously.