Turn claw-code into the most clawable coding harness:
- no human-first terminal assumptions
- no fragile prompt injection timing
- no opaque session state
- no hidden plugin or MCP failures
- no manual babysitting for routine recovery
This roadmap assumes the primary users are claws wired through hooks, plugins, sessions, and channel events.
A clawable harness is:
- deterministic to start
- machine-readable in state and failure modes
- recoverable without a human watching the terminal
- branch/test/worktree aware
- plugin/MCP lifecycle aware
- event-first, not log-first
- capable of autonomous next-step execution
- trust prompts can block TUI startup
- prompts can land in the shell instead of the coding agent
- "session exists" does not mean "session is ready"
- tmux state
- clawhip event stream
- git/worktree state
- test state
- gateway/plugin/MCP runtime state
- claws currently infer too much from noisy text
- important states are not normalized into machine-readable events
- restart worker
- accept trust prompt
- re-inject prompt
- detect stale branch
- retry failed startup
- classify infra vs code failures manually
- side branches can miss already-landed main fixes
- broad test failures can be stale-branch noise instead of real regressions
- startup failures, handshake failures, config errors, partial startup, and degraded mode are not exposed cleanly enough
- too much depends on terminal/TUI behavior instead of explicit agent state transitions and control APIs
- State machine first — every worker has explicit lifecycle states.
- Events over scraped prose — channel output should be derived from typed events.
- Recovery before escalation — known failure modes should auto-heal once before asking for help.
- Branch freshness before blame — detect stale branches before treating red tests as new regressions.
- Partial success is first-class — e.g. MCP startup can succeed for some servers and fail for others, with structured degraded-mode reporting.
- Terminal is transport, not truth — tmux/TUI may remain implementation details, but orchestration state must live above them.
- Policy is executable — merge, retry, rebase, stale cleanup, and escalation rules should be machine-enforced.
Add explicit states:
spawningtrust_requiredready_for_promptprompt_acceptedrunningblockedfinishedfailed
Acceptance:
- prompts are never sent before
ready_for_prompt - trust prompt state is detectable and emitted
- shell misdelivery becomes detectable as a first-class failure state
Add allowlisted auto-trust behavior for known repos/worktrees.
Acceptance:
- trusted repos auto-clear trust prompts
- events emitted for
trust_requiredandtrust_resolved - non-allowlisted repos remain gated
- config-backed
trust.allowlist/trust.denylistaccumulate across discovered.claw/settings*.jsonentries with per-file relative path resolution
Provide machine control above tmux:
- create worker
- await ready
- send task
- fetch state
- fetch last error
- restart worker
- terminate worker
Acceptance:
- a claw can operate a coding worker without raw send-keys as the primary control plane
Define typed events such as:
lane.startedlane.readylane.prompt_misdeliverylane.blockedlane.redlane.greenlane.commit.createdlane.pr.openedlane.merge.readylane.finishedlane.failedbranch.stale_against_main
Acceptance:
- clawhip consumes typed lane events
- Discord summaries are rendered from structured events instead of pane scraping alone
Normalize failure classes:
prompt_deliverytrust_gatebranch_divergencecompiletestplugin_startupmcp_startupmcp_handshakegateway_routingtool_runtimeinfra
Acceptance:
- blockers are machine-classified
- dashboards and retry policies can branch on failure type
- done: the canonical claw-level taxonomy now exists as
FailureClass/LaneFailureClass, API errors map into it viato_failure_class(), doctor JSON checks exposefailure_classwhere classification is meaningful, and sessionturn_failedtraces retain the machine-readable class.
Collapse noisy event streams into:
- current phase
- last successful checkpoint
- current blocker
- recommended next recovery action
Acceptance:
- channel status updates stay short and machine-grounded
- claws stop inferring state from raw build spam
Before broad test runs, compare current branch to main and detect if known fixes are missing.
Acceptance:
- emit
branch.stale_against_main - suggest or auto-run rebase/merge-forward according to policy
- avoid misclassifying stale-branch failures as new regressions
- done: reusable
resolve_main_ref/current_branchhelpers inruntime::stale_branch, broad-test preflight intools/src/lib.rsdelegates to runtime helpers,claw status --output-format jsonandclaw doctor --output-format jsonexposestale_against_mainandmissing_commits_counton the workspace surface, text status/doctor output includes stale info, and doctor workspace check uses warning level for stale branches.
Encode known automatic recoveries for:
- trust prompt unresolved
- prompt delivered to shell
- stale branch
- compile red after cross-crate refactor
- MCP startup handshake failure
- partial plugin startup
Acceptance:
- one automatic recovery attempt occurs before escalation — done:
attempt_recovery()enforcesmax_attemptsthen escalates - the attempted recovery is itself emitted as structured event data — done:
RecoveryEvent::RecoveryAttemptedconverts to canonicallane.recovery_attemptedLaneEventwith scenario/recipe/result JSON payload; cross-module bridges fromBranchFreshness,McpDiscoveryFailure, andPluginStateintoFailureScenario→LaneFailureClass→ lane event
Workers should distinguish:
- targeted tests green
- package green
- workspace green
- merge-ready green
Acceptance:
- no more ambiguous "tests passed" messaging
- merge policy can require the correct green level for the lane type
Define a structured task packet with fields like:
- objective
- scope
- repo/worktree
- branch policy
- acceptance tests
- commit policy
- reporting contract
- escalation policy
Acceptance:
- claws can dispatch work without relying on long natural-language prompt blobs alone
- task packets can be logged, retried, and transformed safely
- Done:
TaskPacketnow uses typed serde enums plus optionalrepo/worktreepaths inrust/crates/runtime/src/task_packet.rs,RunTaskPacketexposes the typed schema, andclaw task create --from-json <path|->/claw task validate <path|->provide direct local text/JSON packet handling.
Encode automation rules such as:
- if green + scoped diff + review passed -> merge to dev
- if stale branch -> merge-forward before broad tests
- if startup blocked -> recover once, then escalate
- if lane completed -> emit closeout and cleanup session
Acceptance:
- doctrine moves from chat instructions into executable rules
Expose a machine-readable board of:
- repos
- active claws
- worktrees
- branch freshness
- red/green state
- current blocker
- merge readiness
- last meaningful event
Acceptance:
- claws can query status directly
- human-facing views become a rendering layer, not the source of truth
Each plugin/MCP integration should expose:
- config validation contract
- startup healthcheck
- discovery result
- degraded-mode behavior
- shutdown/cleanup contract
Acceptance:
- partial-startup and per-server failures are reported structurally
- successful servers remain usable even when one server fails
Close gaps from:
- config load
- server registration
- spawn/connect
- initialize handshake
- tool/resource discovery
- invocation path
- error surfacing
- shutdown/cleanup
Acceptance:
- parity harness and runtime tests cover healthy and degraded startup cases
- broken servers are surfaced as structured failures, not opaque warnings
Priority order: P0 = blocks CI/green state, P1 = blocks integration wiring, P2 = clawability hardening, P3 = swarm-efficiency improvements.
P0 — Fix first (CI reliability)
- Isolate
render_diff_reporttests into tmpdir — done:render_diff_report_for()tests run in temp git repos instead of the live working tree, and targetedcargo test -p rusty-claude-cli render_diff_report -- --nocapturenow stays green during branch/worktree activity - Expand GitHub CI from single-crate coverage to workspace-grade verification — done:
.github/workflows/rust-ci.ymlnow runscargo test --workspaceplus fmt/clippy at the workspace level - Add release-grade binary workflow — done:
.github/workflows/release.ymlnow builds tagged Rust release artifacts for the CLI - Add container-first test/run docs — done:
Containerfile+docs/container.mddocument the canonical Docker/Podman workflow for build, bind-mount, andcargo test --workspaceusage - Surface
doctor/ preflight diagnostics in onboarding docs and help — done: README + USAGE now putclaw doctor//doctorin the first-run path and point at the built-in preflight report - Automate branding/source-of-truth residue checks in CI — done:
.github/scripts/check_doc_source_of_truth.pyand thedoc-source-of-truthCI job now block stale repo/org/invite residue in tracked docs and metadata - Eliminate warning spam from first-run help/build path — done: current
cargo run -q -p rusty-claude-cli -- --helprenders clean help output without a warning wall before the product surface - Promote
doctorfrom slash-only to top-level CLI entrypoint — done:claw doctoris now a local shell entrypoint with regression coverage for direct help and health-report output - Make machine-readable status commands actually machine-readable — done:
claw --output-format json statusandclaw --output-format json sandboxnow emit structured JSON snapshots instead of prose tables - Unify legacy config/skill namespaces in user-facing output — done: skills/help JSON/text output now present
.clawas the canonical namespace and collapse legacy roots behind.claw-shaped source ids/labels - Honor JSON output on inventory commands like
skillsandmcp— done: direct CLI inventory commands now honor--output-format jsonwith structured payloads for both skills and MCP inventory - Audit
--output-formatcontract across the whole CLI surface — done: direct CLI commands now honor deterministic JSON/text handling across help/version/status/sandbox/agents/mcp/skills/bootstrap-plan/system-prompt/init/doctor, with regression coverage inoutput_format_contract.rsand resumed/statusJSON coverage
P1 — Next (integration wiring, unblocks verification)
2. Add cross-module integration tests — done: 12 integration tests covering worker→recovery→policy, stale_branch→policy, green_contract→policy, reconciliation flows
3. Wire lane-completion emitter — done: lane_completion module with detect_lane_completion() auto-sets LaneContext::completed from session-finished + tests-green + push-complete → policy closeout
4. Wire SummaryCompressor into the lane event pipeline — done: compress_summary_text() feeds into LaneEvent::Finished detail field in tools/src/lib.rs
P2 — Clawability hardening (original backlog)
5. Worker readiness handshake + trust resolution — done: WorkerStatus state machine with Spawning → TrustRequired → ReadyForPrompt → PromptAccepted → Running lifecycle, trust_auto_resolve + trust_gate_cleared gating
6. Prompt misdelivery detection and recovery — done: prompt_delivery_attempts counter, PromptMisdelivery event detection, auto_recover_prompt_misdelivery + replay_prompt recovery arm
7. Canonical lane event schema in clawhip — done: runtime::lane_events now owns the canonical typed lane event schema and serde wire names for lane.started, lane.ready, lane.prompt_misdelivery, lane.blocked, lane.red, lane.green, lane.commit.created, lane.pr.opened, lane.merge.ready, lane.finished, lane.failed, and branch.stale_against_main; tools/src/lib.rs emits typed manifest events for stale-branch, commit, finish, and high-confidence green/red/PR/merge-ready signals, and worker_boot exposes a narrow worker→lane bridge for ready + prompt-misdelivery lifecycle events with round-trip serialization coverage.
8. Failure taxonomy + blocker normalization — done: WorkerFailureKind enum (TrustGate/PromptDelivery/Protocol/Provider), FailureScenario::from_worker_failure_kind() bridge to recovery recipes
9. Stale-branch detection before workspace tests — done: stale_branch.rs module with freshness detection, behind/ahead metrics, policy integration
10. MCP structured degraded-startup reporting — done: McpManager degraded-startup reporting (+183 lines in mcp_stdio.rs), failed server classification (startup/handshake/config/partial), structured failed_servers + recovery_recommendations in tool output
11. Structured task packet format — done: task_packet.rs now uses typed serde enums (scope, branch_policy, commit_policy, reporting_contract, escalation_policy) plus optional repo/worktree paths, validation rejects blank objectives/tests, tools/src/lib.rs advertises the typed RunTaskPacket schema, and claw task create|validate exposes the packet format directly for local automation.
12. Lane board / machine-readable status API — done: Lane completion hardening + LaneContext::completed auto-detection + MCP degraded reporting surface machine-readable state
13. Session completion failure classification — done: WorkerFailureKind::Provider + observe_completion() + recovery recipe bridge landed
14. Config merge validation gap — done: config.rs hook validation before deep-merge (+56 lines), malformed entries fail with source-path context instead of merged parse errors
15. MCP manager discovery flaky test — done: manager_discovery_report_keeps_healthy_servers_when_one_server_fails now runs as a normal workspace test again after repeated stable passes, so degraded-startup coverage is no longer hidden behind #[ignore]
- Commit provenance / worktree-aware push events — done:
LaneCommitProvenancenow carries branch/worktree/canonical-commit/supersession metadata in lane events, anddedupe_superseded_commit_events()is applied before agent manifests are written so superseded commit events collapse to the latest canonical lineage - Orphaned module integration audit — done:
runtimenow keepssession_controlandtrust_resolverbehind#[cfg(test)]until they are wired into a real non-test execution path, so normal builds no longer advertise dead clawability surface area. - Context-window preflight gap — done: provider request sizing now emits
context_window_blockedbefore oversized requests leave the process, using a model-context registry instead of the old naive max-token heuristic. - Subcommand help falls through into runtime/API path — done:
claw doctor --help,claw status --help,claw sandbox --help, and nestedmcp/skillshelp are now intercepted locally without runtime/provider startup, with regression tests covering the direct CLI paths. - Session state classification gap (working vs blocked vs finished vs truly stale) — done: agent manifests now derive machine states such as
working,blocked_background_job,blocked_merge_conflict,degraded_mcp,interrupted_transport,finished_pending_report, andfinished_cleanable, and terminal-state persistence records commit provenance plus derived state so downstream monitoring can distinguish quiet progress from truly idle sessions. - Resumed
/statusJSON parity gap — dogfooding shows freshclaw status --output-format jsonnow emits structured JSON, but resumed slash-command status still leaks through a text-shaped path in at least one dispatch path. Local CI-equivalent repro failsrust/crates/rusty-claude-cli/tests/resume_slash_commands.rs::resumed_status_command_emits_structured_json_when_requestedwithexpected value at line 1 column 1, so resumed automation can receive text where JSON was explicitly requested. Action: unify fresh vs resumed/statusrendering through one output-format contract and add regression coverage so resumed JSON output is guaranteed valid. - Opaque failure surface for session/runtime crashes — repeated dogfood-facing failures can currently collapse to generic wrappers like
Something went wrong while processing your request. Please try again, or use /new to start a fresh session.without exposing whether the fault was provider auth, session corruption, slash-command dispatch, render failure, or transport/runtime panic. This blocks fast self-recovery and turns actionable clawability bugs into blind retries. Action: preserve a short user-safe failure class (provider_auth,session_load,command_dispatch,render,runtime_panic, etc.), attach a local trace/session id, and ensure operators can jump from the chat-visible error to the exact failure log quickly. doctor --output-format jsoncheck-level structure gap — done:claw doctor --output-format jsonnow keeps the human-readablemessage/reportwhile also emitting structured per-check diagnostics (name,status,summary,details, plus typed fields like workspace paths and sandbox fallback data), with regression coverage inoutput_format_contract.rs.- Plugin lifecycle init/shutdown test flakes under workspace-parallel execution — dogfooding surfaced that
build_runtime_runs_plugin_lifecycle_init_and_shutdowncan fail undercargo test --workspacewhile passing in isolation because sibling tests race on tempdir-backed shell init script paths. This is test brittleness rather than a code-path regression, but it still destabilizes CI confidence and wastes diagnosis cycles. Action: isolate temp resources per test robustly (unique dirs + no shared cwd assumptions), audit cleanup timing, and add a regression guard so the plugin lifecycle test remains stable under parallel workspace execution. - Resumed local-command JSON parity gap — done: direct
claw --output-format jsonalready had structured renderers forsandbox,mcp,skills,version, andinit, but resumedclaw --output-format json --resume <session> /…paths still fell back to prose because resumed slash dispatch only emitted JSON for/status. Resumed/sandbox,/mcp,/skills,/version, and/initnow reuse the same JSON envelopes as their direct CLI counterparts, with regression coverage inrust/crates/rusty-claude-cli/tests/resume_slash_commands.rsandrust/crates/rusty-claude-cli/tests/output_format_contract.rs. P3 — Swarm efficiency - Swarm branch-lock protocol — done:
branch_lock::detect_branch_lock_collisions()now detects same-branch/same-scope and nested-module collisions before parallel lanes drift into duplicate implementation - Commit provenance / worktree-aware push events — done: lane event provenance now includes branch/worktree/superseded/canonical lineage metadata, and manifest persistence de-dupes superseded commit events before downstream consumers render them
Focus:
- trust prompt detection
- ready-for-prompt handshake
- prompt misdelivery detection
Focus:
- canonical lane event schema
- failure taxonomy
- summary compression
Focus:
- stale-branch detection
- green-level contract
- recovery recipes
Focus:
- startup/handshake reliability
- structured failed server reporting
- degraded-mode runtime behavior
- lifecycle tests/harness coverage
Focus:
- structured task format
- retry/merge/escalation rules
- autonomous lane closure behavior
We should consider claw-code materially more clawable when:
- a claw can start a worker and know with certainty when it is ready
- claws no longer accidentally type tasks into the shell
- stale-branch failures are identified before they waste debugging time
- clawhip reports machine states, not just tmux prose
- MCP/plugin startup failures are classified and surfaced cleanly
- a coding lane can self-recover from common startup and branch issues without human babysitting
claw-code should evolve from:
- a CLI a human can also drive
to:
- a claw-native execution runtime
- an event-native orchestration substrate
- a plugin/hook-first autonomous coding harness
Status: Backlog
Pinpoint: To answer "what's active/blocked/cleanable", operator must scrape tmux + enumerate worktrees + inspect ROADMAP text. No single machine-readable lane board exists.
Action: Expose one machine-readable lane inventory endpoint/command:
claw lanes → JSON array of { session_id, repo, worktree_path, branch, phase: exploring|planning|implementing|verifying|blocked, last_event_ms, blocker: string|null }
Acceptance: claw lanes --output-format json returns current lane state in <100ms without requiring tmux or worktree enumeration.
Status: Backlog
Pinpoint: cargo test --workspace --manifest-path rust/Cargo.toml silently skips the repo-root tests/ integration suite, making "workspace green" ambiguous. Operators running from wrong directory see 0 tests pass and think it's green.
Action: Define one canonical repo-level verification entrypoint (e.g., just test or scripts/verify.sh) that:
- Runs from repo root
- Includes integration suite
- Fails loud if integration tests are missing or skipped Acceptance: Running the canonical command from any directory produces identical results; missing integration suite causes non-zero exit.
Status: Backlog Pinpoint: Long-running orchestration sessions (e.g., multi-hour UltraClaw batch coordination) accumulate context until exec becomes unusable — outputs get compacted before they can be read, making local verification impossible. Subagent spawning becomes the only viable workaround. Action: Add orchestrator session affordances:
- Context pressure warning at ~70% capacity: "context filling, consider compacting"
- Auto-shedding of old tool outputs (keep last N per tool) before hitting the wall
claw compact --session <id>to compact a running session's history without restarting Acceptance: An orchestrator session running 4+ hours of parallel session coordination can still rungit logandcargo testwithout output being compacted away.
Status: Backlog
Pinpoint: claw lanes currently returns a hardcoded empty stub. During a real UltraClaw batch, there is no CLI surface to inspect which sessions are running, which are idle, which have a blocker, or what their last event was — forcing operators to either poll the Agentika topic or parse raw JSONL session files manually.
Action: Wire claw lanes --output-format json to read live session state:
- Enumerate active sessions from session JSONL files (or running opencode server API)
- Return
{ kind: "lanes", lanes: [{ session_id, repo, worktree_path, branch, phase, last_event_ms, blocker }] }per lane - Respond in <100ms without tmux/worktree scraping
Acceptance:
claw lanes --output-format jsonduring a 4-session batch returns one entry per session with correct phase and a non-nulllast_event_ms.
Status: Done — a3c643b (claw new <branch> with 30s timeout, stale-branch attach-instead, REPL dispatch 50afdf9)
Pinpoint: When launching multiple claw-code-* work lanes sequentially, the lane-spawn wrapper hangs after the first tmux new-session completes — the second invocation blocks indefinitely with no timeout, no error output, and no clear indication of what's stuck. Operators must kill the wrapper process manually and issue the second lane create separately.
Observed: 2026-04-06, reproducible on back-to-back lane spawns against existing worktrees.
Action:
- Add a spawn timeout (e.g., 30s) to each tmux/worktree create step with a non-zero exit and clear error message on expiry
- Add a pre-flight check: if the target branch/worktree already exists, skip creation and attach directly rather than erroring silently
- Log each lane-spawn step to stderr in real time so operators can see where it stalled Acceptance: Spawning 3 lanes in sequence completes without manual intervention; stale-branch collision prints an actionable message instead of hanging.
Status: Backlog
Pinpoint: There is no claw command to distinguish "this branch has unique commits not on main" from "this branch is stale pre-merge history". During lane cleanup, operators must run git log branch ^main --oneline per branch manually. With 10+ active lanes this becomes a real source of data loss — actual unmerged work gets mistakenly pruned alongside dead branches.
Observed: 2026-04-06, during post-batch worktree reconciliation.
Action:
- Add
claw branches --statusthat outputs per-branch:{ branch, commits_ahead, last_commit_ms, merged_into_main: bool } - Flag branches with
commits_ahead > 0 && !merged_into_mainas "live unmerged" in both text and JSON output - Optionally surface this in
claw lanesso each lane entry includesbranch_statusAcceptance:claw branches --status --output-format jsoncompletes in <500ms and correctly identifies which branches carry unmerged code vs which are purely historical.
Status: Backlog
Pinpoint: claw /omc exits with unknown slash command outside the REPL: /omc. The OMC interop path exists in the provider/tools layer but the CLI dispatch table has no /omc entry for non-REPL invocation.
Observed: 2026-04-06, direct dogfooding by gaebal-gajae.
Action:
- Find where slash commands are registered for CLI (non-REPL) mode in
main.rs - Add
/omcentry that routes to the OMC interop handler - Add test:
claw /omc --helpexits 0 and prints usage Acceptance:claw /omc <args>works outside REPL without "unknown slash command" error.
Status: Done — be561bf (Claude-family uses real Anthropic count_tokens API; non-Anthropic keeps explicit heuristic label)
Pinpoint: Preflight context-window check uses serialized_json_bytes / 4 + 1 heuristic. The wording now says "estimate (heuristic)" (c1883d0f) but the count is still approximate. Operators hitting context limits get misleading numbers.
API path: POST /v1/messages/count_tokens + anthropic-beta: token-counting-2024-11-01 (Anthropic). xAI/OpenAI-compat: no equivalent — heuristic stays for those providers.
Tradeoffs: Adds one network round-trip to preflight (~100–300ms). Fails offline. Consider: run exact count only when --verbose or when request is within 10% of limit; keep heuristic as fast path.
Action:
- Add
count_tokens(messages: &[Message]) -> Result<u32>toapicrate using the beta endpoint - In preflight, call it when provider is Anthropic and estimated total > 80% of context window
- Surface exact count in error:
Input 352,102 tokens (exact)vs~352,332 tokens (heuristic) - For xAI/other providers, keep heuristic with explicit label Acceptance: Anthropic context-window error shows exact token count; non-Anthropic shows explicit heuristic label.
Status: Done (3dccca0)
Pinpoint: A session can spin for 30+ minutes with 0 code changes and never signal that it is stuck. claw lanes shows phase: running based on last event timestamp, but has no concept of "running but not making progress." The context pressure warning (#29) fires on token pressure, not idle loops.
Observed: 2026-04-06, ses_29dc4e62 ran ROADMAP #31 for 30min, 0 additions, had to be killed manually.
Action:
- Add
idle_without_progress_msto lane state: time since last file change or tool-use event - If
idle_without_progress_ms > 10min, surfacephase: stalledinclaw lanes --output-format json - Optionally emit a
LaneEvent::StallDetected { idle_ms }into the session JSONL - CLI should print
WARN: session <id> has been idle for Xm — consider inspecting or restartingAcceptance: After 10min idle with no file edits,claw lanesshowsphase: stalledand CLI emits a warning.
Status: Backlog
Pinpoint: Agents with local commit access but HTTP 403 on push have no claw primitive to hand off work upstream. Current workaround: git bundle + scp over Tailscale + manual relay by a privileged operator. This adds 5–30min latency to every dogfood cycle and creates merge debt accumulation.
Observed: 2026-04-06, Jobdori accumulated 15 local commits over ~3 hours that could not reach upstream without manual relay.
Action:
- Add
claw push-requestcommand: packages local commits not onorigin/mainas a bundle + opens a PR or posts the bundle URL to a configured channel - OR: Add a
claw relay --to <agent-id>that sends the local bundle to a privileged agent via Agentika topic for auto-push - The receiving agent validates (build + test) then pushes
Acceptance: A read-only agent can run
claw push-requestand have commits reach upstream within 5 minutes without human intervention.
Status: Backlog
Pinpoint: CLI parse (parse_args match arm) and REPL dispatch (try_parse_repl_subcommand match arm) are two independent match blocks with no shared command registry. Adding a new subcommand requires manual edits to both, plus the help topic table, plus the bare_slash_command_guidance exclusion list, plus the main print_help_to listing — 5 separate sites, zero compile-time link between them. claw new proved this: it was wired into 3 of 5 sites on first commit, needed 3 follow-up commits to close the gaps.
Observed: 2026-04-06, claw new was missing from REPL dispatch (50afdf9), main help listing (01ddc26), and had no parity test.
Action:
- Extract a shared
SubcommandSpecenum or registry that both CLI parse and REPL dispatch read from - Add a compile-time or test-time assertion: every
SubcommandSpecvariant must appear in parse, REPL dispatch, help listing, and bare-command guidance - Alternatively: a single
#[test]that iterates known subcommands and asserts each one parses successfully in bothparse_argsandtry_parse_repl_subcommandAcceptance: Adding a new subcommand that compiles but is missing from REPL dispatch causes a test failure.
Status: Backlog
Pinpoint: claw new fix/foo creates a git worktree and prints success, but claw lanes only reads opencode session JSONL files — it has no awareness of worktrees without active sessions. An operator creates a lane, runs claw lanes to confirm, sees nothing. The two commands share no state.
Observed: 2026-04-07, after claw new implementation. Worktree exists on disk but claw lanes returns empty.
Action:
claw lanesshould also scan for worktrees matching theclaw-worktree-*naming pattern- Worktrees without active sessions should show
phase: pending(created but no session started) - Alternatively,
claw newshould write a lightweight marker file thatclaw lanescan discover Acceptance:claw new foo && claw lanesshows the new lane withphase: pending.