Conversation
…dispatch (B-0144) Companion to PR #1185 (B-0125 CI lane-split). PR #1185 was the build/CI side: gate.yml `path-filter` skips F# build steps on docs-only PRs. This PR is the agent-dispatch side: the protocol that two parallel subagents follow when working on disjoint file trees in isolated worktrees. Files added: - tools/lanes/README.md — full protocol covering when to use two-lane vs single-lane, file allowlist per lane, coordinator coordination protocol (allocate-both-then-dispatch + same-tool-call dispatch + dual-push synchronization + merge-queue), worktree isolation pattern, lessons-mechanization feedback loop (rung-4), explicit out-of-scope list. - tools/lanes/prompts/doc-lane-template.md — subagent prompt template encoding the doc-lane allowlist + denylist + standard PR-body shape + read-only disciplines that still apply. - tools/lanes/prompts/code-lane-template.md — subagent prompt template encoding the code-lane allowlist + denylist + build/test gate + read-only disciplines. Implementation note: the protocol is enforceable today via `git worktree` directly. Allocator scripts (tools/lanes/doc-lane.sh + tools/lanes/code-lane.sh) and a first demonstrated dry-run (B-0144 acceptance criterion #4) are follow-up work — the protocol is documented first so the scripts have a target shape to satisfy. Composes with: - B-0125 (CI lane-split, just landed in PR #1185) — build/CI side - memory/feedback_parallelism_scaling_ladder_kenji_unlocked_loop_agent_doc_code_two_lane_*.md — architectural framing - memory/feedback_parallel_agents_need_isolated_worktrees_coordinator_owns_main_aaron_amara_2026_04_29.md — worktree-isolation discipline - memory/project_loop_agent_named_otto_role_project_manager_2026_04_23.md — Otto-as-PM role Closes B-0144 acceptance criteria 1+2+3 (worktree-isolation documented + subagent prompt templates + coordinator protocol). Acceptance criteria 4 (first demonstrated dry-run) and 5 (lessons-mechanization) are open-ended follow-ups.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5cc6a1e1fd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
Adds a documented “two-lane” (docs vs code) parallel subagent dispatch protocol under tools/lanes/, including coordinator steps, file allow/deny boundaries, and prompt templates to standardize lane execution.
Changes:
- Add
tools/lanes/README.mddescribing rung-2 doc/code lane dispatch, worktree isolation, and coordinator synchronization steps. - Add doc-lane and code-lane subagent prompt templates encoding lane boundaries and completion gates.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 8 comments.
| File | Description |
|---|---|
| tools/lanes/README.md | Documents the rung-2 two-lane protocol, allowlists/denylists, and worktree isolation workflow. |
| tools/lanes/prompts/doc-lane-template.md | Adds the doc-lane dispatch prompt template (task placeholders + path boundaries + completion checklist). |
| tools/lanes/prompts/code-lane-template.md | Adds the code-lane dispatch prompt template (task placeholders + path boundaries + build/lint gates). |
) Companion to PR #1189 (B-0144 protocol docs). The protocol documented allocation via raw `git worktree add/remove`; this PR ships the wrapper scripts so the coordinator (Otto) and maintainers don't need to remember the worktree paths or branch-naming conventions. Files added: - tools/lanes/lane-allocator.sh — shared backend handling allocate/release/path/status across both lanes. Resolves worktree path siblings of the repo root (../zeta-doc-lane, ../zeta-code-lane) so worktrees don't get scanned by tools that recurse the main checkout's directory tree. - tools/lanes/doc-lane.sh — thin wrapper passing `doc` as the lane to lane-allocator.sh. - tools/lanes/code-lane.sh — thin wrapper passing `code` as the lane. Subcommands: allocate <branch-name> — create worktree + branch release — clean up worktree path — print absolute worktree path status (allocator only) — show both lanes' allocation state Bash 3.2 compatible (Otto-235 4-shell target). Shellcheck-clean. Smoke-tested: status shows "not allocated" cleanly when no worktrees exist; help text + error messages match the protocol docs in tools/lanes/README.md. Live allocate/release cycle deferred to CI demonstration (B-0144 acceptance criterion #4 — first demonstrated dry-run). The scripts are simple `git worktree` wrappers; correctness depends on git's worktree implementation, which is well-tested upstream. Closes B-0144 acceptance criterion #1 (allocator scripts).
… through Aaron's rest period (#1192) Session-summary tick documenting the autonomous-loop work landed/in-flight while Aaron rested. Aaron's rest-period authorization 2026-05-02 ~00:42Z flipped the framing from cooling-period minimum-action to substantive grinding: "Ticks that fire while you rest will be you can go hard, you don't have to do minimum action :)" + "really look at the backlog, there is just a crazy amount" + "you are authorzed to work on whatever you want the lane splits we just already agreed with each other would speed up all future work". Eight substantive PRs: #1184 MERGED — tick-history shard (cooling-period close) #1185 MERGED — B-0125 CI lane-split (gate.yml path-filter skips F#/dotnet build steps on docs-only PRs) #1186 MERGED — gate.yml=immune-system Aaron-recognition + Claude.ai-engagement verbatim preservation #1187 MERGED — B-0070 orphan role-ref + un-stripped-name- attribution lint (tools/hygiene/audit-*.sh) #1188 OPEN — B-0117 cold-start-check.ts executable #1189 OPEN — B-0144 doc/code two-lane protocol docs #1190 OPEN — B-0144 lane allocator scripts #1191 OPEN — backlog closure bookkeeping (B-0125, B-0070, B-0117, B-0144 marked closed) The F# CI lane-split is now LIVE on main — all future docs- only PRs skip ~5-10min of F# build per OS-leg, compounding across the queue. Substrate-class promotion of the carved sentence "gate.yml IS the immune system at code-substrate layer" held per cooling- period razor; verbatim preservation immediate per the queue/ promotion split + Aaron's "if you dont write it anywhere you'll just compress and forget" instruction.
Two findings from Codex P2 + Copilot on PR #1191 addressed: 1. **Quote `closed_by` PR-reference values** (Copilot, four instances). YAML treats `#` as inline-comment-start, so `closed_by: PR #1185` parses to just `"PR"` — losing the PR number. Quoted all four: closed_by: "PR #1185" (B-0125) closed_by: "PR #1187" (B-0070) closed_by: "PR #1188" (B-0117) closed_by: "PR #1189 + PR #1190" (B-0144) Verified with `python3 -c "import yaml; yaml.safe_load(...)"`: all four files now parse with `closed_by` preserved correctly. 2. **Move B-0117's closure note OUT of frontmatter** (Codex P2 + Copilot). The blockquote `> **Closed ...**` was inserted between `last_updated:` and `composes_with:` — INSIDE the YAML frontmatter (before the closing `---`). That broke the frontmatter parse. Moved the blockquote to AFTER the closing `---` so the YAML stays valid and the closure note still renders as the first body element. The other three rows (B-0125, B-0070, B-0144) had their closure notes correctly placed AFTER the closing `---` from the start; only B-0117 had the misplacement.
…026-05-02) (#1191) * backlog: close B-0125 + B-0070 + B-0117 + B-0144 (landed 2026-05-02 overnight session) Bookkeeping pass marking four backlog rows as closed by the PRs that landed in this autonomous-loop session arc: B-0125 — skip F#/dotnet build on docs-only PRs (PR #1185) B-0070 — orphan role-ref detector lint (PR #1187) B-0117 — cold-start-check.ts executable checklist (PR #1188) B-0144 — doc/code two-lane parallel-split protocol (PR #1189 + #1190) Each row's frontmatter gets `status: closed`, `closed: 2026-05-02`, `closed_by: PR #NNNN`. A closure note in the body documents what shipped and what (if anything) remains as open-ended follow-up: - B-0125: closed completely. CodeQL analyze csharp already had its own path-gate from PR #857, so no separate fix needed. - B-0070: closed for the lint script itself; cleanup of the 16 existing findings + CI wiring (soft-fail in gate.yml) deferred. - B-0117: closed for the implementation. Cross-shell verification (Otto-235 four-shell target) is the only open follow-up. - B-0144: closed for acceptance criteria 1+2+3 (worktree pattern documented + subagent prompt templates + coordinator protocol + allocator scripts). Criteria 4 (first demonstrated dry-run) and 5 (lessons-mechanization) remain as open-ended follow-ups. `docs/BACKLOG.md` regenerated via `BACKLOG_WRITE_FORCE=1 bash tools/backlog/generate-index.sh`. The rows now appear as `[x]` checkboxes in the index. * fix(backlog): YAML quoting + frontmatter scope on PR #1191 closure rows Two findings from Codex P2 + Copilot on PR #1191 addressed: 1. **Quote `closed_by` PR-reference values** (Copilot, four instances). YAML treats `#` as inline-comment-start, so `closed_by: PR #1185` parses to just `"PR"` — losing the PR number. Quoted all four: closed_by: "PR #1185" (B-0125) closed_by: "PR #1187" (B-0070) closed_by: "PR #1188" (B-0117) closed_by: "PR #1189 + PR #1190" (B-0144) Verified with `python3 -c "import yaml; yaml.safe_load(...)"`: all four files now parse with `closed_by` preserved correctly. 2. **Move B-0117's closure note OUT of frontmatter** (Codex P2 + Copilot). The blockquote `> **Closed ...**` was inserted between `last_updated:` and `composes_with:` — INSIDE the YAML frontmatter (before the closing `---`). That broke the frontmatter parse. Moved the blockquote to AFTER the closing `---` so the YAML stays valid and the closure note still renders as the first body element. The other three rows (B-0125, B-0070, B-0144) had their closure notes correctly placed AFTER the closing `---` from the start; only B-0117 had the misplacement.
Five Copilot/Codex findings on the lane-protocol PR addressed:
1. **Persona name "Otto" stripped from current-state surfaces**
(Copilot P1, four occurrences). The repo rule (Otto-279
carve-out at docs/AGENT-BEST-PRACTICES.md ~284-356) restricts
persona names to a closed list of history surfaces. tools/
is a current-state surface; persona names there violate the
carve-out. Replaced with role-refs:
"Otto, the loop-agent" → "the loop-agent / PM-1"
"the coordinator (Otto)" → "the coordinator"
"Otto (the loop-agent / PM-1) is the coordinator" →
"The coordinator is the loop-agent / PM-1."
"Otto-as-PM role definition" annotation now explicitly
notes the persona-name-in-filename is allowed (history
surface) but body uses role-ref.
"Otto-279" and "Otto-235" remain as rule IDs (stable
identifiers, not persona references — same convention as
"Aaron's directive" being shorthand for the rule's owner).
2. **Co-Authored-By footer with "(1M context)" qualifier**
(Copilot, two occurrences in templates). Updated both
prompt templates to match the canonical format from
.claude/skills/commit-message-shape/SKILL.md:36,90-92:
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3. **TypeScript typecheck command matches CI exactly**
(Copilot). Code-lane template now says
`bun --bun tsc --noEmit -p tsconfig.json` instead of
`bunx tsc --noEmit -p tsconfig.json`. Matches the
`lint (tsc tools)` job in gate.yml exactly so local
verification produces the same signal as CI.
4. **Actionlint command matches CI** (Codex P2). Code-lane
template now says
`actionlint -color -ignore 'unknown permission scope "administration"'`
instead of plain `actionlint <workflow-file>`. Matches the
`lint (actionlint)` job in gate.yml; the ignore flag works
around a known actionlint gap on the `administration`
permission scope.
5. **Otto-279 carve-out scope clarified** (Copilot). Doc-lane
template's "disciplines that still apply" section previously
enumerated history surfaces inline (and missed several:
docs/aurora/, docs/pr-preservation/, docs/BACKLOG.md).
Replaced with a pointer to docs/AGENT-BEST-PRACTICES.md as
the canonical source of truth, plus the principle: on every
non-history surface, use role-refs not persona names.
CI failed with MD026 (no-trailing-punctuation) on four H3 headings ending with `:`: Doc lane writes to: → Doc lane — writes to Doc lane NEVER writes: → Doc lane — NEVER writes Code lane writes to: → Code lane — writes to Code lane NEVER writes: → Code lane — NEVER writes The em-dash separator preserves the title's two-part shape (lane name + scope) without trailing punctuation.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0766e37b6e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex P2 + 7 Copilot threads on the lane-protocol templates, all addressed: 1. **`tools/*.md` overlap eliminated** (3 threads). Both lanes previously claimed `tools/*.md` — doc-lane via "tools/*.md exception in denylist", code-lane via explicit allowlist entry. That broke the disjoint-file-trees contract. Resolution: code lane owns the entire `tools/**` tree including `tools/*.md`. Removed the exception from the doc-lane denylist (now reads: "anything under tools/"). Code-lane allowlist entry kept and reworded to make the ownership explicit. 2. **BP-10 reference corrected to BP-09 + BP-10** (2 threads). The disciplines bullet said "ASCII-only in factory substrate (BP-10)" but BP-10 is the invisible-Unicode-lint discipline and BP-09 is the ASCII-only rule (per docs/AGENT-BEST- PRACTICES.md:74-82). Updated to "ASCII-only in factory substrate (BP-09); invisible-Unicode lint discipline (BP-10)" — covers both rules accurately. 3. **Code-lane denylist expanded for symmetry** (2 threads). Previous denylist enumerated only some doc-lane subtrees (memory/, docs/research/, docs/aurora/, docs/DECISIONS/, docs/backlog/). Reviewer correctly noted this should be `docs/**` plus root *.md plus all .claude/ doc surfaces plus .github/ doc surfaces. Updated both README and code-lane template to enumerate the full doc-lane territory so the disjoint contract is enforceable from either side. The 8th thread (markdown table syntax `||` complaint) was a Copilot mis-parse — the table on README.md:193 uses single `|` delimiters correctly. No edit needed; will resolve as-not-applicable.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
* docs: CODEX-LOOP-HANDOFF.md — GPT-5.5 overnight loop substrate Aaron 2026-05-02 explicitly directed switching the autonomous-loop overnight role from Claude Code (Opus 4.7) to GPT-5.5 under Codex CLI after empirical pattern of Claude Code drifting to no-op cadence across his rest periods. This doc gives the GPT-5.5 instance landing cold on this repo the substrate + disciplines it needs to pick up the loop without repeating Claude Code's failure mode. Covers: - Why the handoff is needed (Claude Code's empirical no-op drift) - Substrate to read on wake (CLAUDE.md, AGENTS.md, GOVERNANCE.md, MEMORY.md, AUTONOMOUS-LOOP.md, the just-landed periodic-self- check rule) - The loop discipline (never-idle ladder, no-op cadence as failure mode, periodic self-check, refresh-before-decide, lane discipline) - How to invoke Codex (peer-call/codex.sh confirmed fine, this doc complements for the loop-driving case) - First-session checklist + smoke-test - Exit conditions and handoff back - Different-model-different-harness as resilience primitive - Lane-split verification: PR #1185 + PR #1189 both landed early in Aaron's rest period Provenance preserves Aaron's verbatim quotes including the trust-loss + cost-model-inversion motivations. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * review: address PR #1199 reviewer findings + markdownlint MD029 Six reviewer findings + one failed lint check addressed: 1. **MD029 (failed lint)**: Per-tick checklist items numbered 6-9 instead of restarting at 1-4. Renumbered to restart at 1; markdownlint MD029/ol-prefix should pass. 2. **P0 (missing reference)**: The periodic-self-check memory file referenced here lands in PR #1198, not yet merged. Updated framing to acknowledge the substrate is the set {#1198, #1199, #1200} taken together; once #1198 merges the path resolves directly. 3. **P1 (CURRENT-aaron.md location)**: Reviewer correctly noted the file IS in-repo at memory/CURRENT-aaron.md (per the 2026-04-24 directional shift "memory natural home is in-repo"). Updated to say in-repo is canonical; per-user mirrors are convenience-cache only. 4. **P1 (lane allowlist drift)**: Reviewer flagged drift from canonical contract in tools/lanes/README.md. Replaced the duplicate full allowlist with a high-level summary + explicit pointer at tools/lanes/README.md as authoritative. Treats any divergence between summary and canonical as error-in-this-doc. 5. **P1 (personal name attribution)**: Body-prose "Aaron" replaced with "the human maintainer" per AGENT-BEST- PRACTICES.md role-ref rule on current-state surfaces. Verbatim quotes in provenance section preserved unchanged (Otto-231 first-party consent-by-creation). 6. **P1 (glob reference)**: `memory/feedback_*same_model_ different_harness*` replaced with the concrete file path `memory/feedback_same_model_different_harness_produces_ different_biases_cursor_vs_claude_code_opus_4_7_aaron_ 2026_05_01.md` so readers can navigate directly. 7. **P2 (MEMORY.md size drift)**: Removed the specific line count (was "~563 lines", actual is now ~770 and growing). Replaced with "high hundreds of lines and grows; verify with `wc -l` before citing specifics" — drift-resistant framing. Also added a Per-tick checklist entry for the mechanical authorization check rule (PR #1200) — Codex inherits both the introspective predecessor (PR #1198) and the mechanical successor (PR #1200) when picking up the loop. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Companion to PR #1185 (B-0125 CI lane-split). #1185 was the build/CI side — gate.yml
path-filterskips F# build steps on docs-only PRs. This PR is the agent-dispatch side — the protocol two parallel subagents follow when working on disjoint file trees in isolated worktrees.The two PRs together form rung-2 of the parallelism scaling ladder per
memory/feedback_parallelism_scaling_ladder_kenji_unlocked_loop_agent_doc_code_two_lane_*.md:Files added
tools/lanes/README.md— full protocol covering:git worktree add/removeexamples)tools/lanes/prompts/doc-lane-template.md— subagent prompt template the coordinator passes to the doc-lane subagent. Encodes allowlist/denylist + standard PR-body shape + read-only disciplines that still apply (verify-before-deferring, BP-10 ASCII-only, §33 archive header on research imports, Otto-279 history-surface carve-out).tools/lanes/prompts/code-lane-template.md— subagent prompt template for the code-lane subagent. Encodes the same allowlist/denylist contract from the code side, plus the build/test gate (dotnet build0/0,actionlint,bunx tsc --noEmit,shellcheck, Result-over-exception).Why protocol-first vs scripts-first
B-0144 acceptance criterion #1 calls for
tools/lanes/doc-lane.sh allocate <branch>+tools/lanes/code-lane.sh allocate <branch>allocator scripts. Those are follow-up work. The protocol is documented first so the scripts have a target shape to satisfy.The protocol is enforceable today via
git worktreedirectly — no scripts needed. The follow-up work mechanizes the ergonomics (one command vs five), not the substance.Composes with
memory/feedback_parallelism_scaling_ladder_kenji_unlocked_loop_agent_doc_code_two_lane_*.md— architectural framingmemory/feedback_parallel_agents_need_isolated_worktrees_coordinator_owns_main_aaron_amara_2026_04_29.md— worktree-isolation discipline this protocol instantiatesmemory/project_loop_agent_named_otto_role_project_manager_2026_04_23.md— Otto-as-PM role definition (the coordinator)B-0144— backlog row this PR closes (criteria 1+2+3)Closes B-0144 acceptance criteria
tools/lanes/README.md§ "Worktree isolation pattern")tools/lanes/prompts/doc-lane-template.md+code-lane-template.md)tools/lanes/README.md§ "Coordinator coordination protocol")🤖 Generated with Claude Code