From 3311266b593fbc6608a75235c929a5e974b48465 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Thu, 23 Apr 2026 05:52:27 +0900 Subject: [PATCH] roadmap: Phase 0 locked as 'JSON emission baseline stabilization' (cycle #88) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per gaebal-gajae framing: Phase 0 addresses EMISSION (stream routing + exit code + no-silent guarantee), not SHAPE (which moves to Phase 1). Phase 0 subtasks (1.25 days total): 1. Stream routing fix — bootstrap/dump-manifests/state stderr → stdout for JSON 2. No-silent guarantee — CI asserts every verb emits valid JSON or exits non-zero 3. Per-verb emission inventory — authoritative catalog artifact 4. CI parity test — prevent regressions Phase 1 now owns shape normalization (list-sessions 'command' → 'kind'). Phase 0 owns emission stability; Phase 1 owns shape consistency; Phase 2+ handles envelope wrapping. #168b formally closed as INVALID (cycle #84 misread; stderr output routing is real issue, now tracked as #168c). Revised pinpoint accounting: - Filed: 60 (audit trail includes #168b as invalid) - Genuinely-open: 52 - Phase 0 active: #168c + emission CI - Phase 1 active: #168a --- ROADMAP.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 329446d..2f02c48 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -9667,3 +9667,59 @@ missing Anthropic credentials; export ANTHROPIC_AUTH_TOKEN... **Total Phase 0 effort:** ~1.5 days (reduced from "unclear" to concrete work). + +--- + +## Program: JSON Productization — Phase 0 Final Framing (Cycle #88) + +**Lock:** "Phase 0 = JSON emission baseline stabilization" (per gaebal-gajae review, cycle #88). + +**Why this framing beats previous versions:** + +- "Fix bootstrap silent failure" ❌ — anchored to refuted claim (#168b) +- "Controlled JSON baseline audit + minimum invariant normalization" — accurate but vague on WHAT is being normalized +- **"JSON emission baseline stabilization"** ✅ — names the axis: emission (what goes out, where, when) + +**Phase 0 = stabilize emission before designing shape.** + +### Phase 0 Subtasks (Locked Ordering) + +Before any shape-level work, answer: **"What does each verb emit, to which stream, with which exit code?"** + +| # | Task | Addresses | Effort | +|---|---|---|---| +| 1 | **Stream routing fix** — `bootstrap`/`dump-manifests`/`state` emit JSON to stdout (not stderr) under `--output-format json` | #168c | 0.5 day | +| 2 | **No-silent guarantee** — Every verb under `--output-format json` emits valid JSON to stdout OR exits non-zero. No silent-success cases permitted. Assert via CI. | General contract | 0.25 day | +| 3 | **Per-verb emission inventory** — Produce authoritative catalog: verb → (stdout bytes, stderr bytes, exit code, keys). Lock as baseline. | Reference artifact | 0.25 day | +| 4 | **CI parity test** — Prevent regressions. Any new verb must conform to emission baseline. | Regression prevention | 0.25 day | + +**Phase 0 output (deliverables):** +- Clean emission baseline across 16 verbs +- `SCHEMAS.md` § "v1.5 Emission Baseline" with inventory +- CI test `test_emission_baseline.rs` (or equivalent) +- #168c closed, #168b formally invalid + +**Phase 0 does NOT include:** +- Shape normalization (moved to Phase 1) — that's where `list-sessions` `command` → `kind` goes +- Envelope wrapping (Phase 2) +- Default version bump (Phase 3) + +**Rationale for separation:** Shape work requires a stable emission baseline. Can't normalize shapes until we know which verbs even emit to which stream. Phase 0 stabilizes the ground; Phase 1 renovates the building. + +### #168b — Formally Closed as INVALID + +**Original claim (cycle #84):** `claw bootstrap hello --output-format json` produces no output with exit 0. + +**Refutation evidence (cycle #87 controlled matrix):** Exit 1, stderr 483 bytes, stdout 0 bytes. Not silent; misrouted. + +**Reframed under #168c:** Real issue is stderr routing, not silent emission. + +**Marked:** INVALID. Retained in ROADMAP for audit trail; not counted in open pinpoint total. + +### Revised Pinpoint Accounting + +- Filed total: 60 (was 58; +2 from #168a/#168c split; #168b retained as invalid audit record) +- Genuinely-open: 52 (#168a, #168c active; #168b closed invalid; others unchanged) +- Phase 0 active targets: #168c (primary), emission CI (general) +- Phase 1 active targets: #168a (shape normalization) +