diff options
Diffstat (limited to 'docs/design')
| -rw-r--r-- | docs/design/2026-05-28-generic-agent-runtime-spec-review.org | 188 | ||||
| -rw-r--r-- | docs/design/2026-05-28-generic-agent-runtime-spec.org | 24 |
2 files changed, 102 insertions, 110 deletions
diff --git a/docs/design/2026-05-28-generic-agent-runtime-spec-review.org b/docs/design/2026-05-28-generic-agent-runtime-spec-review.org index 90d7030..3acd16b 100644 --- a/docs/design/2026-05-28-generic-agent-runtime-spec-review.org +++ b/docs/design/2026-05-28-generic-agent-runtime-spec-review.org @@ -5,174 +5,144 @@ * Scope reviewed -Reviewed the target spec at [[file:2026-05-28-generic-agent-runtime-spec.org][2026-05-28-generic-agent-runtime-spec.org]], the spec-review workflow, the current launcher/install/template implementation, existing tests, and existing task tracking. +Second review pass after the 2026-06-12 spec-response update. -Code and docs read: +Reviewed: -- [[file:../../Makefile][Makefile]] — global install/deps targets still install Claude-only roots and the Claude launcher. -- [[file:../../claude-templates/bin/ai][claude-templates/bin/ai]] — tmux launcher still hard-codes =CLAUDE_CMD=claude=, project detection via =.ai/protocols.org=, and one window per project name. -- [[file:../../scripts/install-lang.sh][scripts/install-lang.sh]] and [[file:../../scripts/sync-language-bundle.sh][scripts/sync-language-bundle.sh]] — language bundle install/sync still writes =.claude/= and =CLAUDE.md=. -- [[file:../../.ai/scripts/session-context-path][.ai/scripts/session-context-path]] and [[file:../../.ai/scripts/tests/session-context-path.bats][its bats tests]] — Phase 1 resolver exists and covers unset, empty, distinct, and sanitized =AI_AGENT_ID= values. -- [[file:../../.ai/protocols.org][.ai/protocols.org]], [[file:../../.ai/workflows/startup.org][startup.org]], and [[file:../../.ai/workflows/wrap-it-up.org][wrap-it-up.org]] — protocols documents the agent-scoped path; startup/wrap-up resolve that path but do not yet implement roster-first helper branching or live-helper gates. -- [[file:../../.ai/scripts/todo-cleanup.el][todo-cleanup.el]], [[file:../../.ai/scripts/lint-org.el][lint-org.el]], and [[file:../../.ai/scripts/wrap-org-table.el][wrap-org-table.el]] — =lint-org= and =wrap-org-table= already take =/tmp= backups; =todo-cleanup= does not. -- [[file:../../todo.org][todo.org]] — existing Phase 1.5 helper task and broader generic-runtime parent task. +- [[file:2026-05-28-generic-agent-runtime-spec.org][2026-05-28-generic-agent-runtime-spec.org]] end to end, including the new split readiness rubric, Review dispositions, Phase 1.5 rollback/test gates, and phases 2-5 decision fence. +- [[file:../../Makefile][Makefile]], [[file:../../claude-templates/bin/ai][claude-templates/bin/ai]], [[file:../../scripts/install-lang.sh][scripts/install-lang.sh]], and [[file:../../scripts/sync-language-bundle.sh][scripts/sync-language-bundle.sh]] as the current Claude-specific implementation surface the runtime-neutral arc would touch. +- [[file:../../.ai/scripts/session-context-path][.ai/scripts/session-context-path]] and [[file:../../.ai/scripts/tests/session-context-path.bats][session-context-path.bats]] as the already-shipped Phase 1 slice. +- [[file:../../todo.org][todo.org]] tracking for the Phase 1.5 helper task and the parked phases 2-5 runtime-neutral task. -I did not re-verify the time-sensitive Hugging Face model recommendations online during this review. Treat the local-model picks as stale-until-checked before Phase 5. +I did not reverify current Hugging Face/model/backend facts online. The updated spec now makes that a Phase 5 prerequisite before implementation, so stale model facts no longer block the helper slice. * Implementation-readiness -Rubric for the whole spec: =Not ready=. +Rubric by arc: -The spec is strong enough to implement the Phase 1.5 helper-instance slice if Craig accepts the caveats already captured in tracking: the synced-template rollout must stay gated, the live sandbox drills must pass, and the Emacs =ai-term.el= work must land as a coordinated cross-project change. The broader runtime-neutral refactor in phases 2-5 is not implementation-ready because it still has unresolved product choices and time-sensitive external assumptions. +- *Phase 1.5 helper instances:* =Ready with caveats=. +- *Phases 2-5 runtime-neutral refactor:* =Not ready=. +- *Combined document:* =Ready with caveats for Phase 1.5 only; not ready for phases 2-5=. -* Overall assessment - -The spec correctly identifies the current architecture: the reusable project core lives under =.ai/=, while the install surface, bundle layout, launcher, hooks, and user-facing docs remain Claude-specific. Phase 1 is already done in the repo: =session-context-path= is present, tested, and wired into startup/wrap-up path resolution. - -The helper-instance amendment is the most actionable part. It names the concurrency risk, defines a role contract, narrows helper writes, and gives concrete tests and manual drills. The main risk is rollout, not design: =startup.org= and =.ai/scripts/= sync broadly, so a partially validated helper branch could affect every project. - -The generic runtime arc is still a product decision package, not an implementation plan. It names plausible phases, but the open decisions determine file names, local runtime UX, adapter scope, and support burden. - -* High-priority findings - -** Split the ready helper slice from the not-ready runtime-neutral arc - -Blocking status: blocks =Ready= for the whole spec; does not block a scoped Phase 1.5 implementation if tracked as its own accepted slice. +The 2026-06-12 response pass dispositioned the prior blockers for Phase 1.5. The spec now says exactly how helper startup is detected, how helpers get identity, what they may write, how wrap-up behaves, how synced-template rollout is gated and rolled back, how stale helper files are reported, what the Emacs handoff artifact is, and which tests/manual drills gate release. -Why it matters: the spec now contains two different projects. Phase 1.5 solves a near-term same-runtime concurrency problem. Phases 2-5 rename and generalize the entire distribution. The current Status section says the spec is not implementation-ready, while the Phase 1.5 section is detailed enough for implementation. Without an explicit split, an implementer has to decide whether "start implementation" means helper support only or the full runtime-neutral refactor. +Phases 2-5 remain intentionally parked. That is acceptable because the spec now fences them behind explicit decisions and a current-source verification prerequisite instead of pretending they are ready. -What to change: in the spec Status or Recommended next step, state two rubrics separately: - -- Phase 1.5 helper instances: =Ready with caveats= once Craig accepts the pre-live gating and cross-project Emacs handoff. -- Phases 2-5 generic runtime refactor: =Not ready= until the open decisions are answered and model/runtime assumptions are reverified. - -** Resolve the phase 2-5 product choices before implementation - -Blocking status: blocks =Ready= for phases 2-5. - -Why it matters: the spec still asks which generic instruction file to use, whether to standardize on =llama.cpp= or =ollama=, and which local agent CLI is first-supported. Those choices affect manifest schema, install paths, docs, doctor checks, runtime command templates, and test fixtures. If implementation starts now, those decisions will be made inside code. +* Overall assessment -What to change: add a short "Decisions required before phases 2-5" section with accepted answers for: +The spec is now useful as two linked plans in one file: -- generic instruction file strategy; -- default local runtime manager/server; -- first supported local editing CLI; -- whether phase 2 should support only Claude + one local runtime or also Codex immediately; -- compatibility behavior for existing =CLAUDE.md= and =.claude/= projects during the transition. +- a concrete, implementable helper-instance slice for same-project Claude concurrency; and +- a broader runtime-neutral architecture proposal that is deliberately not implementation-ready yet. -** Reverify external runtime and model assumptions before the local-model phase +That split resolves the earlier ambiguity. An implementer can start the helper work without accidentally starting the manifest/local-model/bundle refactor, and the parked arc has a clear list of decisions that must be answered before code starts. -Blocking status: blocks =Ready= for Phase 5, not for Phase 1.5. +* High-priority findings -Why it matters: the local-model recommendations are inherently time-sensitive. Model availability, quant files, serving backends, GPU support, context behavior, and practical latency can change. The spec cites sources, but implementation of =rulesets doctor= and archsetup handoff should not bake in stale assumptions. +None for Phase 1.5. -What to change: make Phase 5 start with a research/verification task that records current model URLs, file sizes, license, backend support, smoke command, memory fit, and fallback behavior. Keep the spec's current model table as a recommendation, not as an implementation constant. +For phases 2-5, the blocking state is already captured in the spec's =Decisions required before phases 2-5= section and Phase 5 reverification prerequisite. No new high-priority finding is needed beyond preserving that gate. * Medium-priority findings -** Add the exact cross-project handoff artifact for ai-term.el +None. -Blocking status: not blocking for the rulesets side if the handoff is created before or during implementation. - -The spec correctly says =ai-term.el= lives in =~/.emacs.d= and is not a rulesets edit. That means the implementation plan should say exactly how the rulesets task hands off the required Emacs change: an inbox file, a linked task, or a commit in that repo. Otherwise the rulesets implementation can finish with shell helpers working while the F9 path remains unsafe. - -** Name the rollback point for template-wide helper rollout - -Blocking status: not blocking if the three-ring gate is accepted; it is a release-safety improvement. - -The pre-live gate is good: bats, sandbox, pilot, then template-wide release. Add the rollback action for each ring: remove =agent-roster= from the pilot project, revert the =startup.org= helper branch, or disable helper detection when =agent-roster= is absent. This matters because startup template sync has broad blast radius. +The prior medium recommendations were folded in: exact =.emacs.d= handoff artifact, per-ring rollback actions, stale-helper message contract, unsupported-platform roster behavior, and normative ring-1 test inventory. * UX observations -The helper UX is concrete enough for v1: launcher path, raw-launch safety net, helper opener, helper workflow, and wrap-up behavior are all named. The no-trigger-phrase decision for =helper-mode.org= is good because humans should not have to remember a workflow incantation when the launcher can route. +Phase 1.5 now matches the user's mental model: "spawn a helper" is a launcher/Emacs action, not a remembered workflow incantation. The safety-net path for raw =claude= launches also keeps accidental helper sessions from running full startup. -For phases 2-5, the user mental model is not yet settled. A user will need to know whether they are installing a runtime, choosing a model profile, or creating project instructions. That should be decided before docs or commands ship. +For phases 2-5, UX is not yet settled, but the spec now explicitly parks that work until the instruction-file/runtime/CLI choices are made. * Architecture observations -The spec fits the current repo boundaries. =.ai/= remains core; runtime adapters can sit beside existing Claude-specific layout; the launcher and install scripts are the right integration points. The current implementation confirms the major refactor points: =Makefile=, =install-lang.sh=, =sync-language-bundle.sh=, and =claude-templates/bin/ai= all hard-code Claude assumptions today. +The helper slice stays correctly scoped. It builds on the shipped =AI_AGENT_ID= resolver without introducing runtime manifests, bundle splitting, or local-model service setup. -The helper slice is intentionally smaller than the runtime manifest work and should stay that way. Do not introduce TOML manifests, local model service config, or bundle splitting while implementing =agent-roster= and helper startup/wrap-up. +The current implementation still supports the spec's current-state claims: =Makefile=, =install-lang.sh=, =sync-language-bundle.sh=, and =claude-templates/bin/ai= remain Claude-centered. That is fine for Phase 1.5 and remains the reason phases 2-5 need a separate go/no-go. * Robustness and performance observations -The helper data-integrity rules cover the important local lost-update shapes: scoped org edits, no helper memory writes, git mutation primary-only while concurrent, and log-before-write. The remaining robustness question is how stale helper files are surfaced without permanently blocking hygiene. The spec says this is a judgment call; implementation should make the message explicit and include file path, timestamp, and suggested actions. +Phase 1.5 now names the important robustness details: -The =agent-roster= scan is cheap enough for startup on Linux, but it is Linux =/proc= specific. That is fine for v1 if the script reports a clear unsupported-platform result and startup treats "roster unavailable" as the no-op path described in the pre-live gate. +- roster unavailable is explicit and takes the no-op path; +- startup helper routing happens before pulls/rsync; +- helpers avoid full-file passes, inbox processing, memory writes, and concurrent git mutation; +- stale helper files surface path, timestamps, and concrete actions; +- file-wide passes require =/tmp= backups, including =todo-cleanup.el=; +- template-wide rollout has rollback semantics even during partial propagation. + +No additional robustness blocker found. * Test strategy recommendations -Specific tests to add for Phase 1.5: +The spec's ring-1 test inventory is now concrete enough to implement: -- =agent-roster= returns alone when no other matching process has cwd under the project. -- =agent-roster= excludes its own process ancestry. -- =agent-roster= reports not-alone when a spawned sleeper or test helper has cwd at the project root or below it. -- Startup helper branch is byte-identical to today's path when =agent-roster= is missing or reports alone. -- Startup routes to =helper-mode.org= and skips pulls/rsync/inbox processing when =agent-roster= reports another live agent. -- =ai --helper= assigns a sanitized helper id, exports =AI_AGENT_ID= and =AI_HELPER=, and uses the helper opener. -- Primary and helper resolve distinct context paths. -- Helper-originated inbox send includes the helper id in same-minute slug generation. -- Wrap-up with live helpers pauses before hygiene/commit. -- Orphaned-helper wrap-up runs the full closing path only when the roster reports alone. -- =todo-cleanup.el= copies a =/tmp= backup before any mutating mode. +- roster alone / not-alone / ancestry-exclusion cases; +- startup byte-identity when roster is absent or alone; +- startup helper branch skips pulls, rsync, and inbox processing; +- =ai --helper= id/export/opener behavior; +- primary/helper distinct context paths; +- helper-originated =inbox-send= slug id; +- live-helper wrap-up pause; +- orphaned-helper close only when alone; +- =todo-cleanup.el= backup before mutation. -Manual drills from the spec are necessary and should remain gates: live helper + primary scoped edit, primary wrap-up while helper is mid-task, orphaned helper closes the tree, and raw =claude= launch gets caught by startup. +Manual gates are also explicit: live helper scoped edit, corruption drill, orphaned-helper close, raw-launch safety net, and Emacs F9 helper path. * Documentation and tooling recommendations -For Phase 1.5, update: - -- =protocols.org= with a short pointer to =helper-mode.org= and the helper write tiers. -- =startup.org= with the roster-first branch and the no-op guarantee when unavailable. -- =wrap-it-up.org= with helper/primary wrap-up ordering and live-helper pause messages. -- =INDEX.org= with =helper-mode.org= marked auto-routed, not user-triggered. -- README only if the user-facing launcher gains =ai --helper= before broader runtime docs exist. +No new documentation recommendation. -For phases 2-5, defer broad README renames until the runtime choices are resolved. +Phase 1.5 already names the documentation surface: =protocols.org= points to =helper-mode.org=, =startup.org= and =wrap-it-up.org= carry branches, and =INDEX.org= marks =helper-mode.org= auto-routed rather than user-triggered. * Suggested spec edits -- Add separate readiness labels for "Phase 1.5 helper instances" and "Phases 2-5 runtime-neutral refactor." -- Add a "Decisions required before phases 2-5" section listing the instruction-file, local runtime, first CLI, and adapter-scope choices. -- Add a Phase 5 prerequisite to reverify model/backend assumptions against current sources before implementation. -- Add the exact =.emacs.d= handoff artifact for the =ai-term.el= helper path. -- Add rollback actions for the bats/sandbox/pilot/template rollout rings. +No blocking edits. + +Optional clarity edit: change the heading =Open issue: the Emacs launch surface — unresolved, blocks readiness= because the body now says the integration is designed and the Status checklist marks the launch surface closed. A neutral heading such as =Emacs launch surface — integration contract= would better match the current status. This is editorial and does not block implementation. * Agreed decisions -None newly agreed during this review. Existing decisions in the spec stand: primary keeps the singleton path for Phase 1.5, helpers use =helper-<rand4>= and =session-context.d/=, =helper-mode.org= is canonical, =agent-roster= is the shared detection primitive, and =ai-term.el= owns its own tmux naming/wiring on top of the shared roster. +The second pass accepts the spec-response dispositions: + +- Phase 1.5 helper instances are =Ready with caveats=. +- Phases 2-5 remain =Not ready= until the five listed decisions and Phase 5 reverification happen. +- The spec stays in one document with split rubrics rather than being physically split. * Open questions -- Are phases 2-5 still desired near-term, or should the spec be split so the helper-instance slice can ship independently and the runtime-neutral arc remains parked? -- Which local runtime stack and editing CLI should become the first supported v1 target? -- What exact handoff path should be used for the =~/.emacs.d= =ai-term.el= changes? +Only for phases 2-5: + +- generic instruction-file strategy; +- local runtime manager/server default; +- first supported local editing CLI; +- phase-2 adapter scope; +- compatibility behavior for existing =CLAUDE.md= / =.claude/= projects. + +These do not block Phase 1.5. * vNext candidates -- Runtime manifests for Claude plus one local runtime. -- Generic bundle layout split into common + runtime adapters. -- Local-model doctor checks once archsetup owns install and model cache setup. +Same as the parked runtime-neutral arc: + +- runtime manifests for Claude plus one local runtime; +- common/runtime language-bundle split; +- local-model doctor checks after archsetup owns install/cache setup; - Codex adapter support after the first non-Claude runtime proves the manifest shape. * Implementation tasks (drop-in for todo.org) -These tasks are already represented in [[file:../../todo.org][todo.org]] as parent tasks. If copied elsewhere, keep Phase 1.5 separate from the parked runtime-neutral arc. +These are already represented in [[file:../../todo.org][todo.org]]. The helper task can proceed under the caveats; phases 2-5 remain parked. ** TODO [#B] Helper instances — concurrent same-project Claude :feature: -Implement Phase 1.5: =agent-roster=, =ai --helper=, =helper-mode.org=, startup/wrap-up helper branches, live-helper gates, and helper write-safety docs. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 1.5). - -** TODO [#C] Runtime manifests and generic install commands :feature: -Resolve the phase 2 decisions, then add =runtimes/claude.toml=, one local runtime manifest, and =make install-runtime= while keeping =make install= Claude-compatible. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 2). - -** TODO [#C] Runtime-aware language bundles :feature: -Split common language material from runtime-specific adapters and add at least elisp support for the first local runtime. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 3). +Implement Phase 1.5: =agent-roster=, =ai --helper=, =helper-mode.org=, startup/wrap-up helper branches, live-helper gates, the =.emacs.d= handoff, and helper write-safety docs. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 1.5). -** TODO [#D] Runtime-neutral user-facing docs and aliases :chore: -After compatibility aliases exist, rename Claude-specific public docs and source directories where the behavior is actually runtime-neutral. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 4). +** TODO [#B] Helper instances — test surface :test: +Unit: roster detection, id generation/sanitization, context path resolution, backup-before-mutation. Integration: startup no-op and helper branch behavior, launcher helper exports/opener, inbox-send helper slug, wrap-up live-helper pause. Manual: live helper scoped edit, corruption drill, orphaned-helper close, raw-launch safety net, Emacs F9 helper path. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Phase 1.5 pre-live gating). -** TODO [#D] Local model install handoff and doctor checks :feature: -After current model/backend assumptions are reverified and archsetup owns install/cache setup, add doctor checks for server availability, model files, and smoke prompts. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 5). +** TODO [#D] Runtime-neutral arc — decision pass :spec: +Answer the five =Decisions required before phases 2-5= items before implementation starts. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Open decisions). -** TODO [#B] Generic agent runtime — test surface :test: -Unit: launcher id/runtime selection, session-context path/archive names, roster detection, helper id sanitization. Integration: two fake runtimes or primary/helper sessions writing distinct contexts; install-lang/sync-language-bundle legacy compatibility. Manual: live helper scoped edit, corruption drill, orphaned-helper close, raw-launch safety net, and Emacs F9 helper path. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Test strategy and Phase 1.5 pre-live gating). +** TODO [#D] Local model assumptions — current-source recheck :spec: +Before Phase 5, record current model URLs, file sizes, licenses, backend support, smoke command, memory fit, and fallback behavior against live sources. Spec: [[file:2026-05-28-generic-agent-runtime-spec.org]] (Migration plan, Phase 5). diff --git a/docs/design/2026-05-28-generic-agent-runtime-spec.org b/docs/design/2026-05-28-generic-agent-runtime-spec.org index 0b37814..01be6d4 100644 --- a/docs/design/2026-05-28-generic-agent-runtime-spec.org +++ b/docs/design/2026-05-28-generic-agent-runtime-spec.org @@ -583,7 +583,7 @@ timestamps (=YYYY-MM-DD-HHMM-from-<project>-<slug>=). A helper and primary sending to the same target in the same minute with the same slug would collide; helper-originated sends include the agent id in the slug. -*** Open issue: the Emacs launch surface — unresolved, blocks readiness +*** Emacs launch surface — integration contract Corrected 2026-06-12 after reading the actual config (the first draft of this subsection assumed eat/vterm and was wrong). The facts, verified in @@ -954,6 +954,18 @@ Every recommendation from [[file:2026-05-28-generic-agent-runtime-spec-review.or Rejections: none. +** Second pass — 2026-06-12 + +The re-review after the fold-in confirmed every disposition (its Agreed +decisions section accepts the split rubric, the caveats, and the +one-document structure) and found no new high- or medium-priority issues. +One optional editorial edit was suggested and accepted: the Emacs +subsection heading no longer says "open issue / blocks readiness", since +its body and the Status checklist had already closed it — it now reads +/Emacs launch surface — integration contract/. The review's drop-in task +shapes are already represented in todo.org per the review itself; no new +tasks were filed. + * Review and iteration history ** 2026-06-12 Fri @ 02:09:10 -0500 — Codex — reviewer @@ -965,3 +977,13 @@ Rejections: none. - What changed: folded the review in. All recommendations accepted except the document-split open question, modified to a dual rubric in one document (see Review dispositions). Status now labels Phase 1.5 READY WITH CAVEATS and phases 2-5 NOT READY; the original readiness checklist is fully resolved. - Why: the review's top finding was that one Not-ready label hid an implementable slice; the rest hardened the slice's rollout (per-ring rollbacks, normative test inventory, exact .emacs.d handoff artifact, stale-helper message contract, roster platform behavior) and fenced the parked arc (decisions-required section, Phase 5 reverification prerequisite). - Artifacts: this spec's Status, Pre-live gating, Phase 5, Open decisions, and Review dispositions sections; the helper task in todo.org carries the same caveats. + +** 2026-06-12 Fri @ 02:39:38 -0500 — Codex — reviewer +- What changed or was recommended: re-ran the spec-review workflow after the response pass. Rubric by arc: Phase 1.5 helper instances =Ready with caveats=; phases 2-5 runtime-neutral refactor =Not ready=; combined document =ready only for the scoped helper slice. No new blocking findings for Phase 1.5. Optional editorial note: rename the stale "Open issue: the Emacs launch surface" heading now that the body is an integration contract. +- Why: the response pass accepted or modified every prior recommendation into the spec, so the remaining implementation risk is controlled by the caveats/gates already written. The broader runtime-neutral arc still correctly waits on explicit product decisions and current-source local-runtime verification. +- Artifacts: [[file:2026-05-28-generic-agent-runtime-spec-review.org][2026-05-28-generic-agent-runtime-spec-review.org]] updated with this second-pass review; existing [[file:../../todo.org][todo.org]] helper/runtime tasks remain the tracking surface. + +** 2026-06-12 Fri @ 02:47:07 -0500 — Claude — author (spec-response, second pass) +- What changed: folded the second review in. Nothing substantive remained to change — the review confirmed all dispositions with zero new high/medium findings — so the response is the accepted editorial heading rename (the Emacs subsection is now /Emacs launch surface — integration contract/) and the second-pass note under Review dispositions. +- Why: the review cycle has converged. Phase 1.5 stands at Ready-with-caveats with both reviewer and author aligned on the caveats; phases 2-5 stay parked behind the decisions fence. +- Artifacts: the renamed Emacs subsection; the Review dispositions second-pass note; Codex's second-pass review file and its todo.org/history edits ride in the same commit. |
