Compare commits

..

1 Commits

Author SHA1 Message Date
YeonGyu-Kim
2abecfead8 docs(roadmap): add #358 — history entries missing role field, no pagination 2026-04-30 06:02:52 +09:00

View File

@@ -6288,4 +6288,4 @@ Original filing (2026-04-18): the session emitted `SessionStart hook (completed)
346. **Top-level `agents show <name> --output-format json` accepts a natural agent-detail request but falls back to generic help JSON instead of returning the selected agent or a typed unsupported-detail error** — dogfooded 2026-04-29 for the 20:00 nudge on current `origin/main` / rebuilt `./rust/target/debug/claw` with embedded `git_sha` `c6c01bea`. Running `./rust/target/debug/claw agents list --output-format json` returned a valid stdout JSON inventory with `kind:"agents"`, `action:"list"`, and an `agents[]` entry named `analyst`. Immediately running `./rust/target/debug/claw agents show analyst --output-format json` returned success on stdout but did not return the `analyst` detail object; instead it returned generic help-shaped JSON: `{"action":"help","kind":"agents","unexpected":"show analyst","usage":{"direct_cli":"claw agents [list|help]","slash_command":"/agents [list|help]",...}}`. Both stderr streams were empty. The command therefore accepts a natural detail-inspection spelling, recognizes it only as `unexpected`, and hides the absence of an agent-detail surface behind a successful help fallback rather than a typed `unsupported_agents_action` / `agent_detail_unavailable` error. This is distinct from #328 and #329: those cover source/provenance mismatch and slash `/agents` inventory flattening, while this pinpoint is the missing top-level agent detail/inspection contract after inventory discovery succeeds. **Required fix shape:** (a) either implement `agents show <name> --output-format json` returning the selected agent's structured fields and provenance, or return a non-success typed JSON error with `code:"unsupported_agents_action"`, `requested_action:"show"`, and `supported_actions:["list","help"]`; (b) include `agent_name` and whether the name exists in the current inventory when rejecting detail inspection; (c) avoid `action:"help"` success envelopes for unsupported subcommands because they make failed detail inspection look like intentional help output; (d) add regression coverage proving `agents show analyst --output-format json` does not silently collapse to generic help when `analyst` exists in `agents list`. **Why this matters:** claws discover agents first, then need to inspect a chosen agent before delegation. If the natural detail command returns successful generic help instead of a selected-agent payload or typed unsupported-action error, automation cannot distinguish typo, unsupported detail view, missing agent, or successful help request without comparing unrelated inventory output. Source: gaebal-gajae dogfood follow-up for the 20:00 nudge on rebuilt `./rust/target/debug/claw` `c6c01bea`; earlier false hang hypotheses for `mcp help` and `agents list` were closed after bounded repros succeeded.
347. **Top-level `mcp show <missing-server> --output-format json` reports a missing server as `status:"ok"` instead of a typed not-found/error status** — dogfooded 2026-04-29 for the 20:30 nudge on current `origin/main` / rebuilt `./rust/target/debug/claw` with embedded `git_sha` `ee41b266`. After rebuilding and verifying the binary provenance, running `./rust/target/debug/claw mcp show does-not-exist --output-format json` returned stdout JSON with `{"action":"show","config_load_error":null,"found":false,"kind":"mcp","message":"server `does-not-exist` is not configured","server_name":"does-not-exist","status":"ok"}` and no stderr. `found:false` is useful, but pairing it with `status:"ok"` makes the command-level outcome ambiguous: a missing requested server is not an OK inspection result for automation that needs to distinguish successful detail retrieval from a not-found lookup. This is distinct from #327's MCP source-list mismatch and the invalid #2874/#2879/#2880 hang/nondeterminism hypotheses that were closed after bounded repros. **Required fix shape:** (a) return a typed not-found status such as `status:"not_found"` or `kind:"error"` plus `code:"mcp_server_not_found"` while preserving `server_name` and optional `available_servers[]`; (b) document whether `found:false` objects are considered success or error and keep that convention consistent across text and JSON modes; (c) ensure process exit semantics match the JSON status contract or expose a separate `exit_ok`/`lookup_status` field; (d) add regression coverage proving missing-server lookup is distinguishable from successful server detail retrieval without parsing the human `message`. **Why this matters:** MCP inspection is a control-plane diagnostic. If a missing server returns `status:"ok"`, claws can silently treat a failed lookup as healthy MCP state unless they special-case `found:false`, which defeats the purpose of a clear machine-readable status field. Source: gaebal-gajae dogfood follow-up for the 20:30 nudge on rebuilt `./rust/target/debug/claw` `ee41b266`.
359. **`/memory --output-format json` returns a file inventory (CLAUDE.md paths and line counts) instead of the actual memory/instruction content; no `memories[]`, no content body, no `total_memories`** — dogfooded 2026-04-30 by Jobdori on `cca6f682`. Running `./rust/target/debug/claw --output-format json --resume latest /memory` returns: `{"cwd":"/path","files":[{"lines":12,"path":"/Users/.../CLAUDE.md","preview":"# CLAUDE.md"},{"lines":21,"path":"/Users/.../claw-code/CLAUDE.md","preview":"# CLAUDE.md"}],"instruction_files":2,"kind":"memory"}`. The response contains only file provenance metadata: the number of CLAUDE.md files found and their paths/line counts. There is no `memories[]` array, no `content` field, no `sections[]`, no `total_memories`, no indication of what instructions are actually loaded, and no way for automation to read the memory content without re-reading the CLAUDE.md files independently. The field `preview` is set to only the first line (`# CLAUDE.md`) with no configurable depth. **Required fix shape:** (a) include an `entries[]` or `content` array in the response with the actual loaded instruction text (or at minimum a per-file content block); (b) add `total_lines` and optionally `truncated: true` when content exceeds a threshold; (c) add `preview_lines: N` parameter to control how many lines appear in the preview; (d) distinguish between system memory (CLAUDE.md), user-set memory (`/remember`), and project memory so callers can identify which instructions are in scope; (e) add regression coverage confirming `/memory --output-format json` returns non-empty `content` or `entries[]` when at least one CLAUDE.md is present. Source: Jobdori live dogfood, mengmotaHost, `cca6f682`, 2026-04-30.
358. **`/history --output-format json` entries contain only `text` and `timestamp_ms` fields; `role` is absent, making user vs assistant turns indistinguishable programmatically; no `--limit`/`--offset` pagination** — dogfooded 2026-04-30 by Jobdori on `c6c01bea`. Running `./rust/target/debug/claw --output-format json --resume latest /history` returns a `history[]` array where each entry has `text` and `timestamp_ms` only. There is no `role` field (`user`/`assistant`/`tool`), no `message_id`, no `turn_index`, and no indication of which side of the conversation produced each entry. An orchestrator that needs to extract only user prompts, or only assistant responses, cannot do so without heuristics (e.g. trying to detect prompt vs response by content). Additionally, `/history` returns all entries with no pagination controls: no `--limit`, no `--offset`, no `total_count`, no `has_more` flag. Long sessions will return unbounded output with no way to request a tail window. **Required fix shape:** (a) add `role` field to each history entry with values matching the message originator (e.g. `"user"`, `"assistant"`, `"tool_result"`); (b) add optional `--limit N` and `--offset N` flags to `/history` for pagination; (c) include `total` and `returned` counts in the response envelope; (d) add regression coverage confirming each history entry contains a non-null `role` field and that `--limit`/`--offset` return the correct slice. Source: Jobdori live dogfood, mengmotaHost, `c6c01bea`, 2026-04-30.