feat(lanes): prime and nudge codex lanes into declaring their own stage

A codex lane's declared stage has always depended entirely on the session
reading AGENTS.md and calling `ccam stage` on its own — no hook, no wrapper,
no enforcement. Two additions make that more reliable without touching the
declared-wins / inferred-never-done invariants:

- LaneConsolePane pre-fills a codex pane's opening prompt with a plain-text
  stage-declaration checklist built from the lane's own pipeline_nodes —
  the same up-front priming a Claude lane gets from its pre-filled
  /ccam:ship-feature-lane skill command, just as prose since Codex has no
  slash commands.
- server/lib/codex-nudge.js sweeps every 60s and types a one-line reminder
  into a lane's live tmux pane (tmux.sendText, a new literal-text primitive
  alongside sendCommand) when its fresh detected_stage has sat undeclared
  for over two minutes. It never writes stage/detected_stage itself — any
  resulting declaration is still the codex session's own real ccam stage
  call, just server-prompted instead of relying on memory alone.

server 1354/1354, client 449/449, tsc clean.
This commit is contained in:
2026-08-28 15:59:22 +07:00
parent 5c297c6483
commit 8bd74a57e6
14 changed files with 388 additions and 10 deletions
+6
View File
@@ -41,6 +41,12 @@ own rollout journals — see `docs/LANES.md#stage-detection`), but an inference
only paints a dashed amber badge. It never counts as evidence and never renders
a node green. Only your own declaration does.
If you go a while without declaring while that inference has clearly moved
past your last declared stage, the dashboard may type a one-line `[ccam]`
reminder straight into this pane asking you to run `ccam stage`. That is the
dashboard, not the user — treat it as the same instruction as this section and
just make the real call.
## Where to work
- `server/` for API/routes/data processing.
- `client/` for React UI behavior.