Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -6302,3 +6302,5 @@ Original filing (2026-04-18): the session emitted `SessionStart hook (completed)
381. **Top-level `cache --help --output-format json` hangs with zero stdout/stderr instead of returning bounded command help JSON** — dogfooded 2026-04-30 for the 03:00 nudge on current `origin/main` / rebuilt `./rust/target/debug/claw` with embedded `git_sha` `d95b230c`. After #358 and #380 landed for the cost/tokens preflight help hangs, a fresh adjacent probe on the cache-control surface showed the same silent failure class: repeated bounded runs of `timeout --kill-after=1s 8s ./rust/target/debug/claw cache --help --output-format json` exited `124` with `stdout=0` and `stderr=0`. In the same rebuilt binary, `version --output-format json` returned promptly with version/build metadata, proving the binary itself and JSON output path are reachable. This is distinct from the separate `/cache` slash-command envelope mismatch class: the affected surface here is top-level `cache` command help, where agents need bounded local discovery before deciding whether to inspect, clear, or summarize cache state. **Required fix shape:** (a) make `cache --help --output-format json` return static/bounded stdout JSON with `kind:"help"` or `kind:"cache"`, `action:"help"`, usage, options, examples, supported output formats, and related slash/direct commands; (b) ensure help rendering does not initialize slow cache/session/provider state; (c) if any dynamic provider is consulted, return a typed JSON timeout/unavailable error instead of hanging; (d) add regression coverage proving cache help in JSON mode returns within a deterministic budget. **Why this matters:** cache inspection and cleanup are recovery/control-plane operations. If cache help hangs silently, claws cannot safely discover cache semantics before attempting cleanup, and automation stalls before it can choose a non-destructive cache action. Source: gaebal-gajae dogfood follow-up for the 03:00 nudge on rebuilt `./rust/target/debug/claw` `d95b230c`.

422. **`export --output-format json` and `--resume latest` report the same "no managed sessions" scenario using two different `kind` codes — `no_managed_sessions` vs `session_load_failed` — making "no session found" undetectable by a single kind-code check** — dogfooded 2026-04-30 KST (UTC+9) by Jobdori on `e939777f`. Running `claw export --output-format json` with no session present returns (on stderr, exit 1): `{"error":"no managed sessions found in .claw/sessions/<fingerprint>/","hint":"Start \`claw\` to create a session, then rerun with \`--resume latest\`.\nNote: claw partitions sessions per workspace fingerprint; sessions from other CWDs are invisible.","kind":"no_managed_sessions","type":"error"}`. Running `claw --resume latest /status --output-format json` with no session present returns (on stderr, exit 1): `{"error":"failed to restore session: no managed sessions found in .claw/sessions/<fingerprint>/","hint":"Start \`claw\` to create a session, then rerun with \`--resume latest\`.\nNote: claw partitions sessions per workspace fingerprint; sessions from other CWDs are invisible.","kind":"session_load_failed","type":"error"}`. Both describe the same root condition — there are no sessions to operate on — but they expose it via different `kind` discriminants. Automation that checks `kind == "no_managed_sessions"` to detect a cold workspace will miss the `--resume` path's `session_load_failed`, and vice versa. A wrapper that guards "run with --resume only if a session exists" must special-case both codes. The hint text is identical between them, suggesting the messages are logically equivalent. Additionally neither code matches the proposed canonical names `session_not_found` / `session_load_failed` as stable `ErrorKind` discriminants described in ROADMAP #77's fix shape, which explicitly proposes typed error-kind codes for session lifecycle failures. **Required fix shape:** (a) unify "no sessions found for this workspace fingerprint" under a single canonical `kind` code — either `no_managed_sessions` or `session_not_found` — used consistently by every command path that encounters an empty session registry; (b) if `session_load_failed` is a more general category (covering e.g. corrupt session files, IO errors, schema version mismatches), it should nest a concrete `reason:"no_managed_sessions"` or `reason:"session_not_found"` sub-field so callers can distinguish "empty registry" from "found but unreadable"; (c) align with the canonical error-kind contract proposed in #77; (d) add regression coverage proving `export` and `--resume latest` in an empty workspace both return an error with the same top-level `kind` code. **Why this matters:** session guard-rails in orchestration need a single stable `kind` to detect cold workspaces without enumerating all possible no-session synonyms. Two divergent codes for the same condition make defensive automation brittle and contradict the promise of machine-readable error envelopes. Source: Jobdori live dogfood, `e939777f`, 2026-04-30 KST (UTC+9).

426. **`claw plugins --output-format json` surface has zero test coverage in `output_format_contract.rs` — the contract tests that lock every other major JSON surface (`agents`, `mcp`, `skills`, `status`, `sandbox`, `doctor`, `help`, `version`, `acp`, `bootstrap-plan`, `system-prompt`, `init`, `diff`, `config`) do not include a single assertion about `plugins`, leaving the plugin JSON shape entirely untested and free to silently drift** — dogfooded 2026-05-01 KST (UTC+9) by Jobdori on `57096b0a`. Inspection of `rust/crates/rusty-claude-cli/tests/output_format_contract.rs` (11 tests) shows coverage for every major `--output-format json` surface except `plugins`. Live binary produces `{"action":"list","kind":"plugin","message":"<prose table>","reload_runtime":false,"target":null}` for `claw plugins --output-format json`, but no test asserts (a) that `kind == "plugin"`, (b) that `action == "list"`, (c) that the payload is valid JSON at all, (d) that `reload_runtime` is present and boolean, or (e) that `target` is present and null/typed. The only plugin-related test in `mock_parity_harness.rs` covers plugin tool execution round-trip, not the CLI inspection surface. This means the `plugins list` JSON schema documented in ROADMAP #416 (mutation-shape envelope, missing `plugins:[]` array) can silently regress or change shape between commits with no CI signal. By contrast, if `agents list` drops the `agents[]` field, `inventory_commands_emit_structured_json_when_requested` catches it immediately. **Required fix shape:** (a) add a `plugins_command_emits_json_when_requested` test in `output_format_contract.rs` that: runs `claw plugins --output-format json` in an isolated temp dir, asserts stdout is valid JSON, asserts `kind == "plugin"`, asserts `action == "list"`, asserts `reload_runtime` is boolean, asserts `target` is JSON null when no plugin is targeted; (b) add a second assertion variant for `claw plugins enable <name> --output-format json` to confirm the lifecycle-mutation envelope fields are stable; (c) pair with the existing ROADMAP #416 fix so when `plugins:[]` array is added, a test assertion locks it; (d) extend to `plugins disable`, `plugins install`, and `plugins uninstall` shapes once they are implemented. **Why this matters:** test brittleness — the plugin JSON surface is the only major `--output-format json` surface with zero contract coverage. Any schema change, regression, or panic in `plugins` dispatch goes undetected until a downstream claw hits it at runtime. CI's four-check suite gives a false assurance of coverage for plugin JSON because `cargo test --workspace` passes even with zero plugin contract assertions. Source: Jobdori dogfood + test-file inspection, `57096b0a`, 2026-05-01 KST (UTC+9). Cross-reference: #416 (plugins list returns mutation shape, no plugins array).
Loading