Files
AgentHub/AGENTS.md
T
nntrivi2001 fd7f57929c fix(lanes): auto-detect and report stage for codex lanes (issue 11)
A lane on the 16-node `ship-feature` template showed an untouched pipeline
map and never declared a stage. Four independent causes, fixed at their
shared choke points:

1. Codex emits no hooks, so `touchLaneFromHook` — the only caller of
   `stage-detect.detect()`, and correctly pinned to `claude` — could never
   see a `codex` lane. New `server/lib/codex-ingest.js` tails Codex's own
   rollout journals (`$CODEX_HOME/sessions/**/rollout-*.jsonl`), maps its
   tool calls onto the hook-shaped `{tool_name, tool_input}` the matcher
   already understands, and feeds the existing detect path plus an
   idle/running status mirror under the same guard hooks use. Polled every
   `DASHBOARD_CODEX_POLL_MS` ms (default 15000, `0` disables).
2. `resolveLaneArg` matched on cwd alone, so with a claude and a codex lane
   at one directory (the composite `idx_lanes_cwd_tool`) a `ccam stage`
   call could drive the sibling lane's card. It now resolves by
   `--lane` → `CCAM_LANE_ID` → `--tool`/harness marker → owning lane, and
   errors naming both candidates rather than picking one. Every pane the
   dashboard starts carries `CCAM_LANE_ID` (`tmux new-session -e`, or an
   assignment prefix when typing into a live shell pane).
3. `recordDetection`'s declared-wins veto had no exit: a lane left at the
   pipeline's last node rejected every detection for the rest of its life.
   A declaration on the LAST node no longer vetoes — the pipeline is over
   there, so a later detection is new work. Nothing else is relaxed, and
   detection still never writes `stage` nor renders `done`.
4. The run console pre-filled the pipeline's Claude slash command into
   codex panes, which Codex reads as prose — so the skill that would have
   called `ccam stage` never ran. Claude lanes only now.

A codex lane's *declared* stage still depends on the session calling
`ccam stage`; `AGENTS.md` is the only lever CCAM has, so it now says so.

Verified: server 1345/1345, client 441/441, and end-to-end against a real
codex lane row (detected_stage/detected_signal set, declared stage
untouched, no node rendered done).
2026-08-27 16:38:23 +07:00

3.3 KiB

Codex Project Instructions

Project intent

  • Keep this repository a stable, local-first Claude Code monitoring platform.
  • Maintain correctness across hooks, API, DB, websocket, UI, and MCP integration.

Priorities

  • Correctness over cleverness.
  • Small, scoped, reversible diffs.
  • Preserve existing behavior unless change is requested.
  • Update docs whenever workflow or architecture changes — follow skills/update-project-docs/ automatically at the end of every change-set (README + VN/CN/KO mirrors, ARCHITECTURE, wiki + i18n + cache bump, server/client READMEs, docs/*).
  • Every applicable source file you create or update (.js/.ts/.tsx/.cjs/.mjs/.py/.sh/.css) must start with the authorship header: a truthful file overview plus the exact line @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>. See skills/file-headers/ and .claude/rules/file-headers.md; verify with bash skills/file-headers/scripts/check-headers.sh.

Declare your lane stage as you work

This repository is watched by CCAM, its own dashboard. A lane is keyed by working directory, and the pipeline map only moves forward when the agent doing the work declares its stage:

ccam stage <stage> --tool codex --evidence "<what is actually done>"
  • Call it at every real transition — starting to plan, starting to implement, running tests, opening the PR — not once at the end.
  • Stage names, default template: intake → plan → implement → tests → review → gate → ship → done (the 16-node ship-feature template accepts these as aliases too; ccam stage warns on stderr and names the valid nodes if a stage matches none).
  • --tool codex matters. One directory can back both a claude lane and a codex lane, and without a tool the command fails rather than guess (it names both candidates). Inside a pane the dashboard started you need nothing — that pane carries CCAM_LANE_ID, which outranks everything but --lane.
  • If ccam stage reports that no lane owns the directory, this checkout was never adopted: skip the stage calls and carry on. Stage reporting is reporting, never control flow — a failed ccam stage never justifies skipping a step of the actual work.

The dashboard also infers your stage from your tool calls (it reads Codex's 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.

Where to work

  • server/ for API/routes/data processing.
  • client/ for React UI behavior.
  • mcp/ for local MCP server tooling.
  • scripts/ for hook/install/import/cleanup utilities.

Validation expectations

  • Backend changes: run npm run test:server when possible.
  • Frontend changes: run npm run test:client when possible.
  • MCP changes: run npm run mcp:typecheck and npm run mcp:build.
  • If any check is skipped, report it explicitly.

Safety expectations

  • Keep destructive capabilities behind explicit configuration gates.
  • Never broaden destructive behavior without explicit user request.
  • Treat hook execution path as fail-safe and non-blocking.

Useful commands

  • Setup: npm run setup
  • Dev: npm run dev
  • Build/start: npm run build then npm start
  • MCP helpers: npm run mcp:install, npm run mcp:build, npm run mcp:start