mirror of
https://github.com/instructkr/claw-code.git
synced 2026-06-06 09:52:43 -04:00
Compare commits
1 Commits
docs/roadm
...
docs/roadm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6094254b2 |
@@ -6294,4 +6294,4 @@ Original filing (2026-04-18): the session emitted `SessionStart hook (completed)
|
||||
352. **Top-level `plugins update <missing-plugin> --output-format json` sends a generic JSON error envelope to stderr only, leaving stdout empty** — dogfooded 2026-04-29 for the 23:00 nudge on current `origin/main` / rebuilt `./rust/target/debug/claw` with embedded `git_sha` `5eb1d7d8`. After rebuilding and verifying the binary provenance, repeated bounded runs of `timeout 8 ./rust/target/debug/claw plugins update does-not-exist --output-format json` exited `1` with `stdout=0` and `stderr=97`; stderr contained JSON (`{"error":"plugin `does-not-exist` is not installed","hint":null,"kind":"unknown","type":"error"}`), but stdout was empty. In the same rebuilt binary, `plugins list --output-format json` returned stdout JSON promptly with the known plugin inventory payload. This is distinct from #350's missing-target `plugins enable` zero-byte timeout and parallel to #351's `plugins disable` stderr-only JSON envelope: update fails fast, but the JSON-mode error lives on stderr only and uses generic `kind:"unknown"`/`type:"error"` instead of a plugin-specific not-found contract. **Required fix shape:** (a) define and consistently document stdout/stderr placement for JSON-mode lifecycle errors; (b) return a plugin-specific typed error with `kind:"plugin"` or `domain:"plugin"`, `action:"update"`, `status:"not_found"` or `code:"plugin_not_found"`, `plugin`, and optional `available_plugins[]`; (c) share missing-target error-envelope behavior across disable/update/uninstall and reconcile it with enable's timeout path; (d) add regression coverage proving `plugins update does-not-exist --output-format json` produces a typed plugin-not-found JSON contract on the documented stream. **Why this matters:** update is a maintenance/control-plane operation often run in automation. A stale plugin name should produce a predictable, domain-specific not-found result, not require callers to special-case stderr-only generic error envelopes after explicitly requesting JSON. Source: gaebal-gajae dogfood follow-up for the 23:00 nudge on rebuilt `./rust/target/debug/claw` `5eb1d7d8`; invalid hang PR #2894 was closed after repeated bounded repros returned exit 1 with JSON on stderr.
|
||||
353. **Top-level `plugins uninstall <missing-plugin> --output-format json` sends a generic JSON error envelope to stderr only, leaving stdout empty** — dogfooded 2026-04-29 for the 23:30 nudge on current `origin/main` / rebuilt `./rust/target/debug/claw` with embedded `git_sha` `6f92e54d`. After rebuilding and verifying the binary provenance, repeated bounded runs of `timeout 8 ./rust/target/debug/claw plugins uninstall does-not-exist --output-format json` exited `1` with `stdout=0` and `stderr=97`; stderr contained JSON (`{"error":"plugin `does-not-exist` is not installed","hint":null,"kind":"unknown","type":"error"}`), but stdout was empty. In the same rebuilt binary, `plugins list --output-format json` returned stdout JSON promptly with the known plugin inventory payload. This is distinct from #350's missing-target `plugins enable` zero-byte timeout and parallel to #351/#352 for disable/update: uninstall fails fast, but the JSON-mode error lives on stderr only and uses generic `kind:"unknown"`/`type:"error"` instead of a plugin-specific not-found contract. **Required fix shape:** (a) define and consistently document stdout/stderr placement for JSON-mode lifecycle errors; (b) return a plugin-specific typed error with `kind:"plugin"` or `domain:"plugin"`, `action:"uninstall"`, `status:"not_found"` or `code:"plugin_not_found"`, `plugin`, and optional `available_plugins[]`; (c) share missing-target error-envelope behavior across disable/update/uninstall and reconcile it with enable's timeout path; (d) add regression coverage proving `plugins uninstall does-not-exist --output-format json` produces a typed plugin-not-found JSON contract on the documented stream. **Why this matters:** uninstall is the most destructive plugin lifecycle action. A stale plugin name should produce a predictable, domain-specific not-found result before cleanup hooks or loader work, not require callers to special-case stderr-only generic error envelopes after explicitly requesting JSON. Source: gaebal-gajae dogfood follow-up for the 23:30 nudge on rebuilt `./rust/target/debug/claw` `6f92e54d`; invalid hang PR #2897 was closed after repeated bounded repros returned exit 1 with JSON on stderr.
|
||||
|
||||
371. **`/cache --output-format json` returns `kind: "stats"` instead of `kind: "cache"`; `/providers --output-format json` returns a full `doctor` response body instead of a providers list** — dogfooded 2026-04-30 by Jobdori on `19947545`. (1) Running `/cache --output-format json` returns `{"kind":"stats","cache_creation_input_tokens":0,"cache_read_input_tokens":0,...}` — the `kind` field says `"stats"` even though the command is `/cache`, and the response schema is identical to `/stats`. The cache-specific breakdown fields `cache_creation_input_tokens` and `cache_read_input_tokens` are present but the `kind` discriminator is wrong. (2) Running `/providers --output-format json` returns a complete `doctor` check response with `kind: "doctor"`, `checks[]`, `has_failures`, `summary`, `report` — not a providers list. An automation calling `/providers` to enumerate available model providers receives a doctor-diagnostic blob instead. Both cases are bounded-reproducible (verified ≥2 times). These bugs are distinct from #360 (three commands returning identical blobs): here the commands return wrong-kind or wrong-command responses entirely. **Required fix shape:** (a) `/cache --output-format json` must return `kind: "cache"` with the cache-specific fields; (b) `/providers --output-format json` must return `kind: "providers"` with a `providers[]` array; (c) add regression coverage confirming each command's `kind` field matches the command name. Source: Jobdori live dogfood, mengmotaHost, `19947545`, 2026-04-30.
|
||||
370. **`--resume SESSION non-slash-arg` emits `"trailing arguments must be slash commands"` with `hint: null`; the constraint that `--resume` only accepts slash commands as trailing arguments is undocumented in `--help` and the error provides no hint about valid forms** — dogfooded 2026-04-30 by Jobdori on `19947545`. Running `./claw --output-format json --resume latest session list` returns: `{"error":"--resume trailing arguments must be slash commands","hint":null,"kind":"unknown","type":"error"}`. The `--help` output shows `claw --resume latest /status /diff /export notes.txt` as an example and describes `[/status] [/compact] [...]` as valid trailing args, but does not explicitly state that only slash commands (starting with `/`) are permitted — top-level subcommands like `session list`, `mcp list`, `doctor` are not valid trailing arguments even though they overlap functionally with their slash-command equivalents (`/session list`, `/mcp list`, `/doctor`). The error has `hint: null`, missing an actionable suggestion like "Did you mean `/session list`?". An automation author who tries `claw --resume latest doctor` (instead of `claw --resume latest /doctor`) receives an unhelpful null hint. **Required fix shape:** (a) populate `hint` with a concrete correction when the non-slash argument has a slash-command equivalent (e.g., `session list` → `Hint: use /session list instead`); (b) update `--help` to explicitly note that only slash commands (prefixed with `/`) are accepted as `--resume` trailing arguments; (c) optionally, auto-prefix bare subcommand names that have slash-command equivalents (e.g., treat `--resume latest doctor` as `--resume latest /doctor`); (d) add regression coverage confirming `hint` is non-null when a known subcommand is passed bare to `--resume`. Source: Jobdori live dogfood, mengmotaHost, `19947545`, 2026-04-30.
|
||||
|
||||
Reference in New Issue
Block a user