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 @@ -6428,3 +6428,5 @@ Original filing (2026-04-18): the session emitted `SessionStart hook (completed)


450. **`prompt` emits `kind:"missing_credentials"` JSON on STDERR (not stdout), leaving stdout at 0 bytes — automation pattern `output=$(claw prompt hello --output-format json)` captures nothing on auth-absent failure; `doctor` correctly surfaces `auth.status:"warn"` with `api_key_present:false` but exposes no `prompt_ready:false` field that automation can check before invoking `prompt`** — dogfooded 2026-05-16 by Jobdori on `a35ee9a0` in response to Clawhip pinpoint nudge at `1505208225321062521`. Exact reproduction (isolated env, no creds, fresh git repo, HEAD `a35ee9a0`): `timeout 5 env -i HOME=$ISOLATED_HOME PATH=$PATH CLAW_CONFIG_HOME=$PROBE/.claw-cfg claw prompt hello --output-format json > stdout.txt 2> stderr.txt` → stdout = **0 bytes**, stderr = 195 bytes containing `{"error":"missing Anthropic credentials…","exit_code":1,"hint":null,"kind":"missing_credentials","type":"error"}`, exit code 1. Confirms Gaebal's `1505208553793781792` pinpoint that `prompt` timeout + zero bytes was the prior state — HEAD `a35ee9a0` now correctly exits 1 with `kind:"missing_credentials"` **but the envelope is still routed to stderr** (issue #447 class, same class as prior entries #422, #435). **Contrast with `doctor`:** `claw doctor --output-format json 2>/dev/null` succeeds to stdout with `checks[auth].status:"warn"`, `api_key_present:false`, `auth_token_present:false` — but the auth check has no `prompt_ready:false` field. Automation that gates on `doctor` before invoking `prompt` must re-derive readiness from `api_key_present && auth_token_present` — there is no single canonical boolean. **Three compound problems:** (a) **stdout-empty on `--output-format json` failure**: same class as #447; `prompt`'s error envelope goes to stderr, not stdout. The canonical automation idiom `if ! result=$(claw prompt "q" --output-format json); then echo "$result" | jq .kind; fi` sees `$result=""` on failure — the jq call gets nothing. All `--output-format json` error paths must route JSON to stdout per #447 contract; (b) **`doctor` missing `prompt_ready` field**: `doctor --output-format json` already knows auth is absent (`api_key_present:false`) but surfaces no derived `prompt_ready:bool` or `prompt_blocked_reason:string` field. Automation must infer readiness from `api_key_present || auth_token_present || legacy_*_present` — a 5-field OR across legacy fields that is fragile as auth mechanisms evolve. A single `prompt_ready:false` (with `prompt_blocked_reason:"auth_missing"`) inside the `auth` check would give downstream a stable contract; (c) **`claw prompt` with no auth does no preflight and fires straight at the API**: the preflight check that `doctor` runs (auth discovery) is not reused by `prompt` to emit a fast typed error before attempting the network call. Both Gaebal's pinpoint (prompt hanging silently on older HEAD) and the current behavior (prompt hitting auth gate after a brief API attempt) stem from the same root: prompt does not short-circuit at the point where `doctor` already knows auth is absent. If `doctor` can emit `kind:"doctor"` with `auth.status:"warn"` in ~20ms without a network call, `prompt` should emit `kind:"missing_credentials"` in the same window and output it to stdout. **Required fix shape:** (a) `prompt --output-format json` must write the `kind:"missing_credentials"` JSON envelope to **stdout**, not stderr — same fix as #447 for all error envelopes; (b) add `prompt_ready:bool` and `prompt_blocked_reason:string|null` to the `auth` check in `doctor --output-format json`; derive it as `api_key_present || auth_token_present || legacy_saved_oauth_present`; (c) `prompt` must run the credential preflight check (same codepath as doctor's auth check) before attempting any API call and emit `{"kind":"missing_credentials","prompt_blocked_reason":"auth_missing"}` on **stdout** with exit 1 if the check fails; (d) `--output-format json` stdout routing fix must cover: `prompt`, `session list` (cross-ref #449), `skills uninstall` (cross-ref #431), `resume` (cross-ref #435), `acp serve` (cross-ref #443) — the full `kind:"missing_credentials"` class; (e) regression test: `claw prompt hello --output-format json` with no creds writes JSON to stdout (0 bytes stderr), exits 1, `kind:"missing_credentials"`, in under 200ms (no network attempt). **Why this matters:** `prompt` is the primary consumer entry point. Auth-absent failure routing to stderr breaks every automation wrapper that captures `$(claw prompt ... --output-format json)`. The `doctor` preflight metadata gap means auth-readiness checks require parsing 5 legacy fields instead of reading one boolean. Cross-references #447 (all JSON error envelopes on stderr), #449 (session list hits auth gate), #431 (skills uninstall hits auth gate), #357 (auth gate on local ops cluster), #422 (exit-code parity). Source: Jobdori live dogfood, `a35ee9a0`, 2026-05-16.

451. **Top-level `models list --output-format json` and `models --help --output-format json` hang with zero stdout/stderr instead of returning bounded model inventory or help JSON** — dogfooded 2026-05-24 for the 04:00 Clawhip pinpoint nudge at message `1507956340130316460`, reproduced on local `./rust/target/debug/claw` `git_sha 003b739d` (origin/main was `f8e1bb72`; the `models` dispatch path is not touched in commits `63ce483c..f8e1bb72`, which are docs-only ROADMAP additions, so the failure mode is expected to reproduce on a fresh main build). Repeated bounded runs of `timeout 6 ./rust/target/debug/claw models list --output-format json` and `timeout 6 ./rust/target/debug/claw models --help --output-format json` exited `124` with `stdout=0` and `stderr=0` (or only the `enabledPlugins` deprecation warning on stderr, distinct from the zero-byte stdout symptom). Positive controls in the same binary: `version --output-format json` and `doctor --output-format json` returned promptly with valid JSON, proving the JSON output path itself is reachable. The hang also reproduces in a clean isolated HOME (`{}` settings, no plugins) — so it is not caused by deprecated config fields, host plugin leakage, or the broader stderr-warning class already tracked by #322. This is distinct from #355 (session list/help JSON hang) and the auth provider-help hang cluster (#382–407 in the parallel dirty cluster) because the surface here is the **model provider/registry discovery** path, which automation must walk before choosing a provider, validating a `--model <alias>` flag, or estimating cost/token budgets — none of which it can do if even the inventory and help paths silently deadlock at zero bytes. **Required fix shape:** (a) make `models list --output-format json` and `models --help --output-format json` return bounded stdout JSON without waiting on remote API/auth/provider availability; the list response should carry `kind:"models"`, `action:"list"`, `status`, `models[]` with per-model `name`, `provider`, `alias`, `available`, `requires_credentials`, `source` (`builtin`/`profile`/`alias`), and counts/truncation metadata, and the help response should carry static `kind:"help"` or `kind:"models"` with `action:"help"`, usage, options, supported output formats, and related slash/direct commands; (b) render both responses from a static local registry + already-loaded settings only — no provider network probes, OAuth flows, or credential validation during help/list; (c) when a provider-specific availability check cannot complete quickly, emit a typed `status:"unavailable"` / `code` entry per affected model rather than dropping the entire response into a zero-byte timeout; (d) add regression coverage proving both `models list --output-format json` and `models --help --output-format json` terminate within a deterministic budget with and without provider credentials in env, on at least Anthropic + one OpenAI-compatible profile. **Why this matters:** model registry inspection is a preflight clawability surface. Before invoking `prompt`, claws must resolve `--model <alias>` to a concrete provider, decide which credential env var to ask for, and present a model menu to the user. If `models list` and `models --help` silently deadlock with zero stdout, automation cannot distinguish "no models configured", "provider discovery slow", "missing credentials", "deprecated config blocking load", or "dispatch deadlock", and the only working preflight is `doctor` — which reports configuration health but not the model inventory. Without bounded model discovery, every routing/auth/cost decision either falls back to hardcoded defaults or to a human pane-scraping interactively. Source: gaebal-gajae dogfood follow-up for the 2026-05-24 04:00 Clawhip pinpoint nudge at message `1507956340130316460`.
Loading