Compare commits

...

2 Commits

View File

@@ -12125,3 +12125,97 @@ Pattern: #35 complements #33 — where #33 prevents repetitive narrative during
🪨
---
## Pinpoint #197 — `enabledPlugins` deprecation: no migration path, warning on every invocation (Jobdori, cycle #132)
**Filed:** 2026-04-24 09:27 KST
**Cluster:** config-hygiene / migration UX
**Branch:** `feat/jobdori-197-config-migration-ux` (not yet created)
### Observation
`~/.claw/settings.json` contains `enabledPlugins` (deprecated field). On **every** claw invocation — including `/help`, `claw config`, and `claw doctor` — the runtime emits:
```
warning: /Users/yeongyu/.claw/settings.json: field "enabledPlugins" is deprecated (line 2). Use "plugins.enabled" instead
```
The warning fires twice on some invocations (`claw config` emits it twice: once for `--help` flag parse, once for subcommand dispatch). There is no `claw config migrate`, `claw doctor --fix`, or `claw config upgrade` command to auto-remediate. `claw doctor` does not report the stale field as a warning item in its structured output — it only surfaces auth and sandbox issues.
### Repro
```bash
# Check current settings
cat ~/.claw/settings.json
# → {"enabledPlugins": {"example-bundled@bundled": false}}
# Every invocation emits warning
./rust/target/release/claw --help 2>&1 | grep "deprecated"
# → warning: ...settings.json: field "enabledPlugins" is deprecated (line 2)...
./rust/target/release/claw config 2>&1 | grep "deprecated"
# → warning x2 (double-emit)
# Doctor does NOT surface this
./rust/target/release/claw doctor 2>&1 | grep -i "plugin\|deprecated"
# → (no output in structured doctor body)
```
### Gap
- Deprecated config field has no automated migration path
- Warning emits on every invocation — noise pollution that claws learn to ignore (cry-wolf degradation)
- `claw doctor` does not flag the stale field as a config warning; its structured `Config: ok` output gives false confidence
- Double-emit on `claw config` suggests the deprecation check runs at flag-parse time AND at subcommand dispatch time independently
- Correct field name (`plugins.enabled`) is only available in the warning string — not in `claw config` output or docs
### Proposed Fix
1. `claw doctor` to add config deprecation check: scan loaded settings files for known deprecated keys and surface them as `Config: warn` items
2. Add `claw config migrate` (or `claw config fix`) subcommand that rewrites deprecated keys to current schema in-place
3. Deduplicate deprecation warning to emit once per process lifecycle, not per parse phase
4. Document migration path in `claw config` output when stale keys are present
### Acceptance Criteria
- `claw doctor` reports `Config: warn` with `deprecated key: enabledPlugins → plugins.enabled` when stale field is present
- `claw config migrate` rewrites the file and confirms success
- Deprecation warning emits at most once per invocation after dedup fix
- `claw config` output references migration command when deprecated keys detected
**Status:** Open. No code changed. Merge-wait mode.
🪨
---
## Pinpoint #198 — MCP approval-prompt opacity: no `blocked.mcp_approval` state, pane-scrape required to detect approval-blocked sessions (gaebal-gajae, cycle #135 / Jobdori cross-filed cycle #248)
**Observed:** `clawcode-human` session alive but blocked on `omx_memory.project_memory_read(...)` TUI approval prompt (`Allow / Allow for this session / Always allow / Cancel`). From outside (clawhip, downstream monitors), the session emits no typed blocked state — it appears identical to ordinary idle/live work. Operator cannot distinguish "waiting for human MCP approval" from "working quietly" without pane scraping.
**Gap:** `lane.blocked` taxonomy (ROADMAP item around `blocked.mcp_handshake`, `blocked.trust_gate` etc.) does not include `blocked.mcp_approval` — the state where the runtime is paused at an interactive permission prompt awaiting operator decision. This means:
- Clawhip nudges can misread approval-blocked sessions as ordinary idle/live work
- No structured event (`needs_operator_decision`) emitted on approval-prompt display
- Recovery recipes cannot route "approve / deny / escalate" without pane scraping
**Repro:**
```
# Start session with MCP tool requiring approval
claw --session clawcode-human
# Session reaches omx_memory.project_memory_read(...) approval prompt
# From outside: session appears live/idle — no blocked.mcp_approval event emitted
claw status --session clawcode-human # → no approval-blocked indicator
```
**Expected:** Session status JSON includes `blocked.mcp_approval` when runtime is paused at approval prompt. Downstream monitors can act without pane scraping.
**Fix sketch:**
1. Emit `blocked.mcp_approval` event when TUI approval prompt is displayed
2. Include in session status JSON: `state: blocked`, `blocked_reason: mcp_approval`, `pending_tool: "<tool_name>"`
3. Add `claw approve` / `claw deny` CLI subcommand to resolve remotely without pane interaction
4. Surface in `claw doctor` as active blocked session
**Status:** Open. No code changed. Merge-wait mode. Filed from DOGFOOD_FINDINGS.md evidence (gaebal-gajae).
🪨