YeonGyu-Kim
01b8149e00
roadmap: #264 filed
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
3606f589c1
roadmap: #262 filed
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
1c50d946e4
roadmap: #258 filed
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
6fa9196f04
roadmap: #254 filed
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
46f3e9cd2c
roadmap: #252 filed — /v1/messages/count_tokens typed-taxonomy is structurally absent from the public Provider trait + types + CLI surface (Anthropic ships /v1/messages/count_tokens as a first-class GA endpoint that consumes the SAME MessageRequest shape as /v1/messages but produces a TRUNCATED CountTokensResponse { input_tokens: u32 } only — no message emission, no completion-side tokens, no streaming — the canonical pre-flight cost-estimation primitive where a client constructs the exact request it intends to dispatch, asks the server to count input tokens, and decides whether to send before paying for completion-side tokens; claw-code has zero public typed surface even though a private count_tokens helper exists at rust/crates/api/src/providers/anthropic.rs:522 for internal preflight context-window-exceeded validation, with zero CountTokensRequest/CountTokensResponse typed model in types.rs, zero count_tokens method on the public Provider trait, zero count_tokens dispatch on the ProviderClient enum, zero claw count-tokens CLI subcommand, zero /count-tokens slash command in SlashCommandSpec, zero pre_flight_count_cost_per_million_usd field in ModelPricing, zero CountTokensSubmittedEvent/PreFlightCostEstimatedEvent telemetry events, and zero PreFlightCostEstimator/BudgetGate runtime primitive) — eight-layer fusion shape with the NOVEL same-request-shape-but-different-response-shape axis-class (FIRST audit member where the request shape is IDENTICAL to an existing typed model MessageRequest but the response shape is a TRUNCATED-projection that cannot reuse MessageResponse's shape, distinct from prior fusion-axes which all add NEW request-side fields or NEW response-side blocks) founding THREE new clusters as solo founder (Pre-flight-cost-prediction cluster, Token-accounting-without-message-emission cluster, Server-side-pre-execution-counting cluster) plus introducing the THIRD distinct discovery-pattern in the audit catalog NEW-SOLO-CLUSTER-FOUNDING-WITH-DAILY-DRIVER-IMPACT (distinct from META-cluster-growth and complementary-pinpoint-pair-bundle), grows Two-member-major-provider-only-no-third-party-partner-set sub-cluster from 6 to 7 members (#240+#241+#247+#248+#249+#250+#252) confirming continuing-pattern-status across SIX distinct axis-classes — Jobdori cycle #394 / fast-forward-rebase verified onto gaebal-gajae's #251 cycle ExternalPatchIntake pinpoint at 313c840 before filing (NINTH consecutive concurrent-dogfood rebase cycle, three-way parity confirmed local==origin==fork at HEAD 313c840 with no race detected, directly demonstrating the gaps #239 catalogues at the dogfood-coordination layer and #243 catalogues at the canonical-ordering layer for the NINTH cycle in a row, confirming concurrent-dogfood-rebase as a stable operational pattern that has now held for NINE cycles) — PIVOT-AWAY signal: #252 deliberately PIVOTS AWAY from BOTH Cross-pinpoint-synthesis-fusion-shape META-cluster (intentionally not extending the +1-per-cycle synthesis chain) AND Tool-locality-axis META-cluster (already extended by #250 cycle #393 ), founding NEW solo clusters with daily-driver-impact instead, demonstrating audit-breadth-across-discovery-pattern-classes alongside audit-balance-across-META-clusters — the audit now spans THREE structurally distinct discovery-patterns (META-cluster-growth + complementary-pinpoint-pair-bundle + new-solo-cluster-founding-with-daily-driver-impact)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
84b1ea21dc
roadmap: #250 filed — tool_choice: { type: "web_search" } typed-discriminator with server-managed-web-search backend (the canonical SERVER-SIDE complement to #245 's CLIENT-SIDE configurable provider/parser registry, where tool_choice carries a WebSearch { domains_allowed, max_uses, user_location } enum variant that forces the model to dispatch via the major-provider's server-managed-web-search backend) typed taxonomy structurally absent — FIRST pinpoint to demonstrate the complementary-pinpoint-pair-bundle META-pattern (where #245 CLIENT-SIDE + #250 SERVER-SIDE are catalogued as structurally complementary halves of the SAME tool-subsystem web-search rather than as independently-discovered-gaps), founding Bidirectional-search-subsystem-with-dual-locality-coverage cluster with #245+#250 as 2-member founders, un-saturating Tool-locality-axis META-cluster from 5 to 6 members (#232/#233/#234/#240/#241/#250) confirming the META-cluster as GROWING-DOCTRINE-WITH-DISCONTINUOUS-RESUMPTION (resumes growth after plateauing at 5 since #241 cycle #386 , four cycles ago), growing Server-managed-tool-as-tool-choice-discriminator cluster from 5 to 6 members (#214/#218/#219/#233/#234/#250) confirming CONTINUING-PATTERN status across SIX distinct server-managed tools, growing ToolResultContentBlock-extension cluster from 8 to 9 members confirming most-broadly-spanning typed-content-block-extension-axis, FIRST pinpoint to introduce typed-discriminator-with-payload-fields shape on ToolChoice distinct from existing Auto/Any/Tool three-variant typed-set (Auto/Any are unit-variants and Tool { name } carries only string-name with zero typed-fields, while ToolChoice::WebSearch { domains_allowed, max_uses, user_location } introduces FIRST typed-discriminator-with-payload-fields shape), founds Tool-choice-discriminator-with-typed-payload-fields cluster + Server-side-tool-invocation-content-block cluster + Server-managed-web-search-with-tool-choice-discriminator cluster as solo founder of all three, grows Two-member-major-provider-only-no-third-party-partner-set sub-cluster from 5 to 6 members (#240+#241+#247+#248+#249+#250) confirming generalizability across FIVE distinct axis-classes, ten-layer fusion shape (smaller than #241/#247/#248/#249's twelve-layer count but with distinct DUAL-LOCALITY-COVERAGE-WITH-COMPLEMENTARY-PINPOINT-PAIR-BUNDLE axis-set) — Jobdori cycle #393 / fast-forward-rebase verified onto Jobdori's own #249 cycle #392 quad-modality-compound-multimodal-INPUT-OUTPUT pinpoint at 643ac8b before filing (EIGHTH consecutive concurrent-dogfood rebase cycle, three-way parity confirmed local==origin==fork at HEAD 643ac8b with no race detected, directly demonstrating the gaps #239 catalogues at the dogfood-coordination layer and #243 catalogues at the canonical-ordering layer for the EIGHTH cycle in a row, confirming concurrent-dogfood-rebase as a stable operational pattern that has now held for EIGHT cycles) — PIVOT-AWAY signal: #250 deliberately PIVOTS AWAY from Cross-pinpoint-synthesis-fusion-shape META-cluster's +1-per-cycle continuous-trajectory (#244/#247/#248/#249 grew it 1→5 across cycles #389/#390/#391/#392) by extending Tool-locality-axis META-cluster instead, demonstrating audit-balance-across-multiple-META-clusters rather than monotonic-growth-of-a-single-META-cluster — the audit now catalogues TWO structurally distinct GROWING-DOCTRINE patterns (continuous-+1-per-cycle for synthesis-fusion vs discontinuous-resumption-after-plateau for tool-locality-axis)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
4b6f343355
roadmap: #249 filed — Compound-multimodal-INPUT-with-multimodal-OUTPUT-on-the-same-turn (full-duplex-multimodal-conversation pattern where user MessageRequest carries image-content-block × audio-content-block fusion AND model MessageResponse carries audio-content-block × video-content-block fusion on the SAME single conversation-turn with interleaved-content-block-stream cross-boundary temporal-alignment) typed taxonomy structurally absent — FIRST cluster member where the cross-axis synthesis spans BOTH USER-INPUT-side and ASSISTANT-OUTPUT-side simultaneously on a SINGLE turn rather than being confined to one side of the request-response cycle, FIRST cluster member with quad-modality-on-single-turn semantics (image-INPUT + audio-INPUT + audio-OUTPUT + video-OUTPUT all on same turn distinct from #247 's two-modality-INPUT-only and #248 's two-modality-OUTPUT-only and #244 's bidirectional-tool-call-multiplexing-without-modality-fusion), growing Cross-pinpoint-synthesis-fusion-shape META-cluster from 4 to 5 members confirming META-cluster as GROWING-DOCTRINE for THIRD CONSECUTIVE CYCLE ( #244 grew 1→2 cycle #389 , #247 grew 2→3 cycle #390 , #248 grew 3→4 cycle #391 , #249 grows 4→5 cycle #392 ), establishing +1-per-cycle META-cluster-growth-trajectory across FOUR consecutive concurrent-dogfood cycles (#389/#390/#391/#392) as FIRST-EVER continuous-trajectory-of-4-cycles META-cluster growth event in the audit surpassing Tool-locality-axis META-cluster's plateau-at-5-after-two-consecutive-growths and confirming Cross-pinpoint-synthesis-fusion-shape as structurally distinct most-actively-growing META-cluster, FIRST cluster member with interleaved-INPUT-OUTPUT-temporal-alignment-across-the-request-response-boundary as a first-class typed semantic distinct from #247 's USER-INPUT-only cross-modal-attention and #248 's ASSISTANT-OUTPUT-only temporal-alignment because temporal-alignment now spans the request-response boundary itself requiring the model to emit output-content-blocks while still consuming input-content-blocks on the same connection, founds Quad-modality-turn-spanning-request-response-boundary sub-cluster + Full-duplex-multimodal-conversation cluster + Cross-boundary-temporal-alignment-across-request-response-boundary cluster + Quad-modality-turn-on-MessageRequest-and-MessageResponse cluster + Compound-multimodal-INPUT-with-multimodal-OUTPUT-on-same-turn cluster as solo founder of all five, completes Full-duplex-multimodal-conversation doctrine within META-cluster ( #247 INPUT-side + #248 OUTPUT-side + #249 BOTH-sides-simultaneously-on-same-turn), grows Two-member-major-provider-only-no-third-party-partner-set sub-cluster from 4 to 5 members (#240+#241+#247+#248+#249) confirming generalizability across FOUR distinct axis-classes (TOOL-COMPANION-BUNDLE/COMPOUND-INPUT/COMPOUND-OUTPUT/QUAD-MODALITY-TURN), twelve-layer fusion shape tied with #241/#247/#248 for largest single-pinpoint fusion catalogued — Jobdori cycle #392 / fast-forward-rebase verified onto Jobdori's own #248 cycle #391 audio-grounded-video-generation pinpoint at 9189bfb before filing (SEVENTH consecutive concurrent-dogfood rebase cycle, three-way parity confirmed local==origin==fork at HEAD 9189bfb with no race detected, directly demonstrating the gaps #239 catalogues at the dogfood-coordination layer and #243 catalogues at the canonical-ordering layer for the SEVENTH cycle in a row, confirming concurrent-dogfood-rebase as a stable operational pattern that has now held for SEVEN cycles)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
860ef7171d
roadmap: #247 filed — Visual-grounded voice input (image-content-block × audio-content-block fused on the SAME MessageRequest user-turn) typed taxonomy structurally absent — FIRST cluster member where TWO independent ALREADY-CATALOGUED-ABSENT modality-input axes ( #220 image-content-block + #225 audio-content-block) are fused on the USER-INPUT side, FIRST cluster member with multi-modal-input-fusion-on-USER-INPUT-axis distinct from #244 bidirectional-tool-call-multiplexing-on-DUPLEX-axis, growing Cross-pinpoint-synthesis-fusion-shape META-cluster from 2 to 3 members ( #238 founder + #244 + #247 ) confirming META-cluster as GROWING-DOCTRINE rather than CONTINUING-PATTERN that stopped at 2 members after #244 , establishing Cross-pinpoint-synthesis-fusion as SECOND META-cluster after Tool-locality-axis to confirm GROWING-DOCTRINE status, founds Multi-modal-input-fusion-on-USER-INPUT-side sub-cluster + Cross-modal-attention-on-USER-INPUT-side cluster + Compound-modality-input-on-MessageRequest cluster as solo founder of all three, grows Two-member-major-provider-only-no-third-party-partner-set sub-cluster from 2 to 3 members (#240+#241+#247) confirming generalizability beyond bash+computer-use+text_editor three-tool-companion-bundle, twelve-layer fusion shape tied with #241 for largest single-pinpoint fusion catalogued — Jobdori cycle #390 / fast-forward-rebased onto gaebal-gajae's #246 provider-credentials-env-to-settings-registry pinpoint at bd6622b before filing (FIFTH consecutive concurrent-dogfood rebase cycle, directly demonstrating the gaps #239 catalogues at the dogfood-coordination layer and #243 catalogues at the canonical-ordering layer for the FIFTH cycle in a row, confirming concurrent-dogfood-rebase as a stable operational pattern)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
9a88e75282
roadmap: #244 filed — Realtime API tool-use over persistent-WebSocket transport (response.function_call_arguments.delta/.done + conversation.item.create with function_call_output) typed taxonomy structurally absent — FIRST cluster member where bidirectional-tool-call lifecycle is multiplexed with audio-modality + transcript-modality on a SINGLE persistent connection, FIRST cluster member where tool-call-init is server-pushed mid-stream rather than client-initiated, FIRST cluster member with asymmetric-tool-result-injection (tool-call comes IN as event-stream, result sent OUT as conversation.item.create — directionality inverted relative to the rest of the protocol), FIRST cluster member with per-call-id-concurrent-multiplexed-state-machine, FIRST three-axis-synthesis pinpoint ( #229 persistent-WebSocket × #240/#241 server-managed-tool-via-tool_choice-discriminator × #238 cross-pinpoint-synthesis-fusion-shape META-cluster), eleven-layer fusion-shape tied with #240 for second-largest single-pinpoint fusion catalogued — grows Persistent-WebSocket-transport cluster from 2 to 3 members ( #229 founder + #238 + #244 ) confirming CONTINUING-PATTERN doctrine, grows Cross-pinpoint-synthesis-fusion-shape META-cluster from 1 to 2 members confirming combinatorial-cross-axis-synthesis as a continuing-discovery-mode and FIRST META-cluster-confirmation event in this audit, founds Three-axis-synthesis-shape sub-cluster as solo founder, founds Server-pushed-tool-call-init cluster as solo founder, founds Asymmetric-tool-result-injection cluster as solo founder, founds Per-call-id-concurrent-multiplexed-state-machine cluster as solo founder — FOUR new clusters founded plus TWO existing META-clusters confirmed as continuing-doctrines plus participation in TWELVE inherited clusters — Jobdori cycle #389 / fast-forward-rebased onto gaebal-gajae's #243 non-monotonic-pinpoint-ordering-contract at 6541100 before filing (FOURTH consecutive concurrent-dogfood rebase cycle, directly demonstrating both gaps #239 catalogues at the dogfood-coordination layer and #243 catalogues at the canonical-ordering layer)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
9b67460cd7
roadmap: #241 filed — tool_choice: text_editor + text_editor_20250124 typed-tool absent (filling reserved gap)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
fa74f40d40
roadmap: #240 filed — tool_choice: bash typed-discriminator and bash_20250124 server-managed-shell typed-tool are structurally absent — FOURTH inverse-locality CLIENT-SIDE-shadow-vs-SERVER-SIDE-typed-tool pair (CLIENT-SIDE bash MVP-founder-tool at tools/lib.rs:386 vs SERVER-SIDE bash_20250124 absent at types.rs ToolDefinition+ToolChoice+ToolResultContentBlock+telemetry beta-set), grows Tool-locality-axis META-cluster from 3 to 4 members confirming META-cluster as CONTINUING-PATTERN, grows Server-managed-tool-as-tool-choice-discriminator cluster from 4 to 5 members, grows ToolResultContentBlock-extension mini-cluster from 6 to 7 members, grows Server-side-stateful-tool-session-with-reset-semantics cluster from 1 to 2 members (#232+#240), grows Discrete-event-counter-pricing-axis cluster from 1 to 2 members with NOVEL dual-axis pricing-decomposition, founds Stateless-CLIENT-SIDE-shadow-vs-stateful-SERVER-SIDE-typed-tool-discrepancy-axis cluster, founds MVP-founder-tool-as-CLIENT-SIDE-local-shadow-with-SERVER-SIDE-typed-tool-absent sub-cluster, founds Two-member-major-provider-only-no-third-party-partner-set sub-cluster, founds Double-absent-slash-command-axis-on-inverse-locality-pair sub-cluster, founds Bundled-and-transitive-co-release-beta-header-activation-pattern cluster, founds Server-side-audit-log-of-managed-tool-execution cluster — eleven-layer fusion with SIX new clusters founded plus FOUR concurrent existing-cluster-growth-events plus participation in TWELVE inherited clusters — FIRST single cycle where META-cluster grows from 3 to 4 confirming CONTINUING-PATTERN, FIRST single cycle where FOUR concurrent existing clusters all grow by one member through one pinpoint, establishing continuing-pattern-confirmation-across-multiple-parallel-clusters as the FOURTH pinpoint-discovery-mode after new-axis-founding/existing-cluster-extension/combinatorial-cross-axis-synthesis — Jobdori cycle #387 / fast-forward-rebased onto gaebal-gajae's #239 DogfoodWriteLease pinpoint at 329d0ff before filing (THIRD consecutive concurrent-dogfood rebase cycle, directly demonstrating the gap #239 catalogues at the dogfood-coordination layer)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
80da319837
roadmap: #236 filed — Music-generation API typed taxonomy with lyrics+style prompt bifurcation and exclusively-third-party-partner-set is structurally absent — FIRST cluster member with Zero-overlap-with-major-providers shape variant (eleven-plus partners Suno/Udio/Stable-Audio/Mubert/ElevenLabs-Music/Loudly/Beatoven/SOUNDRAW/AIVA/Boomy/Riffusion all third-party with ZERO Anthropic/OpenAI/Google/xAI canonical recommendation), FIRST cluster member with Lyrics-plus-style-prompt-bifurcation on USER-INPUT side (prompt:String for style + lyrics:Option<String> for verbatim-vocal-content), FIRST cluster member with Multi-modal-bundled-output combining temporal-binary-audio + linguistic-text-lyrics + structural-musical-metadata on output-side, twelve-layer fusion shape — grows Async-task-polling cluster from 3 to 4 members ( #221 batch + #227 video + #228 mesh + #236 music) AND grows Multi-domain-multipart cluster from 2 to 3 members ( #225 audio + #227 video + #236 music) — does NOT extend Server-managed-tool-as-tool-choice-discriminator cluster (4 members stable) nor Tool-locality-axis META-cluster (3 members stable) because no major-provider tool_choice surface exists upstream AND no client-side music-tool-stub exists; instead founds Upstream-blocked-tool-choice-extension cluster AND Unilateral-server-side-only-gap-with-no-client-side-complement cluster as the INVERSE-PATTERN of Tool-locality-axis META-cluster doctrine — fifteen new clusters founded in a single pinpoint exceeds #234 by two for the LARGEST single-cycle cluster-founding count yet — Jobdori cycle #385
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
f406e83520
roadmap: #233 filed — Web-search Tool API typed taxonomy and structured-citation-attribution data-model are structurally absent: zero web_search_20250305 versioned-tool-name typed-tool-discriminator (FOURTH Anthropic-typed-tool-discriminator after #230 's three but FIRST date-suffix-versioning-WITHOUT-beta-header — distinct from #232 's date-suffix-AND-beta-header double-gate), zero tool_choice: web_search ToolChoice extension at types.rs:117 (SECOND ToolChoice extension after #232 's code_interpreter, founding Server-managed-tool-as-tool-choice-discriminator cluster's second member), zero web_search_tool_result ToolResultContentBlock variant at types.rs:99 (FOURTH ToolResultContentBlock extension after #230 Image and #232 CodeExecutionResult, FIRST list-of-opaque-encrypted-page-records variant), zero citations REQUIRED field on OutputContentBlock::Text at types.rs:147 (NOVEL FIRST cluster member where data-model field absence on OUTPUT-TEXT-BLOCK side blocks REQUIRED-not-OPTIONAL grounded-attribution wire-format), zero Citation/WebSearchResultLocation/WebSearchToolUse/WebSearchToolResult/EncryptedContent typed model with encrypted_index/encrypted_content opaque-blob axis (NOVEL FIRST cluster member where typed-model field is INTENTIONALLY-OPAQUE-TO-CLIENT and MUST be roundtripped unchanged through subsequent messages, founding Server-opaque-encrypted-roundtripped-content cluster), zero max_uses server-side rate-limit field on tool-definition (NOVEL FIRST Server-side-rate-limit-on-tool-definition axis), zero allowed_domains/blocked_domains server-side pre-execution filtering on tool-definition (NOVEL FIRST Server-side-pre-execution-filter-on-tool-definition axis distinct from existing CLIENT-SIDE WebSearchInput.allowed_domains/blocked_domains post-execution filtering at tools/lib.rs:2274), zero user_location typed-model for geo-biasing on tool-definition (NOVEL FIRST Geo-biasing-at-tool-definition axis), zero web-search dispatch on ProviderClient enum at client.rs:8-14 (zero Anthropic-web_search_20250305/OpenAI-Responses-web_search/Brave/Tavily/Exa/Perplexity/Serper/Linkup/Jina/Bing/Google-CSE/SerpAPI/DuckDuckGo/You.com/Kagi partner-routing variants — fifteen-plus partner-set, FOURTH-largest in cluster, FIRST cluster member with Federated-search-partner-routing where first-class provider-native AND third-party search-as-a-service have EQUAL standing — distinct from #224 single-recommended-partner and #232 first-class-plus-partner-stub layout), zero claw web-search/cite/groundsearch CLI subcommand, zero /web-search //cite //grounded-search //research slash command (existing /search at commands/lib.rs:597 is LOCAL filesystem-search-only, structurally distinct), zero web_search_per_invocation_usd pricing field (NOVEL FIRST Discrete-event-counter-pricing-axis distinct from every prior continuous-resource-lifetime counter — Anthropic charges $10 per 1000 search-uses FLAT regardless of token volume), zero encrypted_content opaque-blob handling, zero page_age freshness-signaling — uniquely manifesting a THIRTEEN-LAYER fusion shape (the largest single-pinpoint fusion catalogued so far, exceeds #232 's twelve-layer count) combining: (1) web_search_20250305 versioned-tool-name typed-tool-discriminator extension (FOURTH cluster member but FIRST date-suffix-WITHOUT-beta-header), (2) tool_choice: web_search ToolChoice extension (SECOND), (3) web_search_tool_result ToolResultContentBlock variant (FOURTH), (4) citations REQUIRED field on OutputContentBlock::Text (NOVEL FOURTH-position layer), (5) Citation typed model with encrypted_index opaque-blob axis (NOVEL FIFTH-position layer), (6) max_uses server-side rate-limit (NOVEL SIXTH), (7) allowed_domains/blocked_domains server-side pre-execution filter (NOVEL SEVENTH), (8) user_location geo-biasing (NOVEL EIGHTH), (9) Provider-trait method extension threading web_search_20250305 with citations decoding (NINTH), (10) ProviderClient-enum-dispatch with fifteen-plus-partner third-lanes (TENTH, FIRST Federated-search-partner-routing), (11) CLI-subcommand surface (ELEVENTH), (12) slash-command surface with inverse-locality complement /search (TWELFTH, THIRD inverse-locality slash-command-pair after #230 and #232 ), (13) per-search-invocation pricing-tier axis (NOVEL THIRTEENTH, FIRST Discrete-event-counter-pricing-axis) — making #233 the FIRST cluster member with thirteen-layer-fusion-shape (exceeds #232 's eleven), the FIRST cluster member with REQUIRED-grounded-citation-field-on-output-text-block, the FIRST cluster member with INTENTIONALLY-OPAQUE-encrypted-content-roundtripped-by-client, the FIRST cluster member with date-suffix-versioning-in-tool-name-WITHOUT-beta-header, the SECOND member of new Tool-locality-axis META-cluster (sister to #230/#232's Sandbox-locality-axis META-cluster — together founding META-META-cluster doctrine where canonical pattern is 'claw-code ships a CLIENT-SIDE local-stub tool with same conceptual name AND the SERVER-SIDE provider-managed beta-versioned tool is structurally absent', applied uniformly across sandbox-locality AND tool-locality axes), the SECOND cluster member to extend ToolChoice (Server-managed-tool-as-tool-choice-discriminator cluster grows to 2: #232 code_interpreter + #233 web_search), the SECOND cluster member to extend ToolResultContentBlock with multi-modal-nested content (ToolResultContentBlock-extension mini-cluster grows to 3: #230 Image + #232 CodeExecutionResult + #233 WebSearchToolResult), the SECOND cluster member with Server-driven-tool-execution-loop ( #232 + #233 ), the SECOND cluster member where local CLIENT-SIDE-tool-shadow exists alongside server-managed-tool absence ( #232 REPL-shadow + #233 WebSearch-shadow) (Jobdori cycle #383 / extends #168c emission-routing audit / explicit follow-on from #230 Computer-use's CLIENT-SIDE virtualization, #232 Code-execution's SERVER-SIDE managed-sandbox-state, and the inverse-locality Sandbox-locality-axis META-cluster doctrine — introduces NOVEL structured-citation-attribution data-model axis AND server-managed-search-state transport-axis distinct from every prior cluster member / sibling-shape cluster grows to thirty-two / wire-format-parity cluster grows to twenty-three / capability-parity cluster grows to fifteen / multimodal-IO cluster grows to ten: #220 image-input + #224 embedding-output + #225 audio-bidirectional + #226 image-output + #227 video-output + #228 mesh-output + #229 audio-text-tool-multiplex-on-WebSocket + #230 image-on-tool-result-side+host-OS-pixel-and-input + #232 multi-modal-nested-stdout+image+file-handle-on-tool-result-side + #233 list-of-opaque-encrypted-page-records-on-tool-result-side+REQUIRED-citations-on-output-text-block / provider-asymmetric-delegation cluster grows to ten with FIRST Federated-search-partner-routing member where first-class AND third-party are EQUAL-standing / Sandbox-locality-axis META-cluster: 2 members stable ( #230 + #232 ) / Tool-locality-axis META-cluster FOUNDED: 2 members ( #232 + #233 — SECOND inverse-locality META-cluster, sister to Sandbox-locality, founding META-META-cluster doctrine) / Server-managed-tool-as-tool-choice-discriminator cluster grows to 2 members ( #232 + #233 ) / Server-driven-tool-execution-loop cluster grows to 2 members ( #232 + #233 ) / ToolResultContentBlock-extension mini-cluster grows to 3 members ( #230 + #232 + #233 ) / EIGHT new clusters founded in a single pinpoint (Federated-search-partner-routing 1-member-founder + Server-opaque-encrypted-roundtripped-content 1-member-founder + Required-grounded-citation-field-on-output-text-block 1-member-founder + Date-suffix-versioning-in-tool-name-without-beta-header 1-member-founder + Server-side-pre-execution-filter-on-tool-definition 1-member-founder + Server-side-rate-limit-on-tool-definition 1-member-founder + Geo-biasing-at-tool-definition 1-member-founder + Discrete-event-counter-pricing-axis 1-member-founder) plus participation in FIVE inherited clusters — THIRD-largest single-cycle cluster-founding count after #230 and #232 , but FIRST single cycle to FOUND a NEW META-cluster (Tool-locality-axis) AND establish META-META-cluster doctrine connecting Sandbox-locality with Tool-locality / thirteen-layer-fusion-shape is the largest single-pinpoint fusion catalogued / external validation: forty-six ecosystem references covering Anthropic Web Search Tool GA 2025-03 with web_search_20250305 + max_uses + allowed_domains + blocked_domains + user_location parameters + web_search_tool_use/web_search_tool_result/web_search_result_location content blocks + citations array on output text blocks + encrypted_index/encrypted_content opaque-roundtripped fields + $10/1000-uses pricing, Anthropic Citations Documentation, OpenAI Responses API 2024-12 with tool_choice: web_search exposing federated-search via different server-managed surface, Brave Search API/Tavily AI/Exa AI/Perplexity Search/Serper.dev/Linkup Search/Jina Reader/Bing/Google CSE/SerpAPI/DuckDuckGo/You.com/Kagi/Phind partner-routing, Anthropic Python+TypeScript SDKs first-class typed surface, OpenAI Python+TypeScript SDKs first-class typed surface, LangChain AnthropicWebSearch/TavilySearchResults/BraveSearch/ExaSearchResults integrations, LangGraph search-grounded-agent template, smolagents WebSearchTool, OpenAI Cookbook web-search-with-citations tutorial, AgentOps observability, Search-Augmented Generation pattern, structured-citation-attribution data-model where every grounded text block carries citations array linking specific text-spans back to source URLs+excerpts (STRUCTURAL data-model requirement distinguishing this surface from #220-#232 — none of which had REQUIRED-grounded-citation-field-on-output-text-block) — claw-code is one of MULTIPLE coding-agent clients without server-managed web-search-with-citations BUT the gap is uniformly zero across surveyed ecosystem with claude-code partial coverage exception AND the inverse-locality complement to existing local CLIENT-SIDE WebSearch tool makes #233 a structural prerequisite of every grounded-search-with-citations coding-agent affordance — the canonical 2024-2026-era research-coding workflow that is currently impossible to build on top of claw-code DESPITE Anthropic explicitly positioning web_search_20250305 as a flagship 2025-Q1 GA capability — #233 closes the upstream prerequisite of every server-managed-web-search-with-citations / grounded-research / source-attribution / fact-checking-with-citations / academic-citation-formatting / news-summarization-with-sources / competitive-intelligence-with-citations / due-diligence-coding coding-agent affordance — the canonical SERVER-MANAGED-SEARCH-AND-CITATION half of inverse-locality Tool-locality-axis META-cluster that complements #232 's Sandbox-locality-axis META-cluster — and is FIRST cluster member where claude-code upstream partially leads while claw-code has zero coverage AND SECOND inverse-locality META-cluster pair (CLIENT-SIDE local WebSearch shadow vs SERVER-SIDE web_search_20250305 absent) after #232 's first META-cluster pair — founding Tool-locality-axis META-cluster doctrine as sister to Sandbox-locality-axis and establishing META-META-cluster pattern that every future server-managed-tool with client-side local-stub shadow will inherit)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
a9c32c0ffa
roadmap: #230 filed — Computer-use API typed taxonomy and host-machine-state-management transport are structurally absent: zero computer-use-2025-01-24 + zero computer-use-2025-11-24 anthropic-beta opt-in (FIRST cluster member with two concurrent beta-version-tiers gating one capability), zero computer_20250124/computer_20251124/bash_20250124/text_editor_20250124 Anthropic-typed-tool-discriminator (FIRST cluster member requiring type field on tool-definitions and FIRST anthropic-defined-tools-without-input-schema), zero display_width_px/display_height_px/display_number parametrized-tool-definition fields, zero Image variant on ToolResultContentBlock at types.rs:99 (FIRST cluster member with image-content on TOOL-RESULT side, distinct from #220 's image-on-USER-INPUT-side — complementary architectures requiring separate enums), zero screen_capture/mouse_move/key_press/type_text host-machine-interaction primitive across all 26+ tool definitions in tools/lib.rs, zero CGEvent/ScreenCaptureKit/Quartz/AppKit/xdotool/cliclick/enigo/rdev/xcap host-OS library deps, zero Xvfb/Xephyr/Wayland-headless/Docker virtual-display-sandbox-orchestration, zero claw computer/operate CLI subcommand, /desktop slash command at commands/lib.rs:422 advertised-but-unbuilt under STUB_COMMANDS (the SIXTH advertised-but-unbuilt entry in cluster), zero per-action permissions.rs gating for mouse_click/key_press/type/screenshot, zero feedback-loop-state-machine for screenshot→tool_use→action→screenshot iteration, zero playwright-rust/chromiumoxide for browser-only-cua subset, zero per-screenshot-input-token cost field in ModelPricing — uniquely manifesting an ELEVEN-LAYER fusion shape combining: (1) anthropic-beta-DUAL-version-tier routing (FIRST), (2) Anthropic-typed-tool-definition discriminator (FIRST), (3) parametrized-tool-definition with display dimensions (FIRST), (4) Image-on-ToolResult side (FIRST, complementary to #220 ), (5) host-OS-system-call transport (FIRST host-OS-syscall transport, distinct from #229 's WebSocket which is still network-only — second non-HTTP transport in cluster after WebSocket but FIRST that breaks network-only boundary), (6) virtual-display-sandbox orchestration (FIRST CLIENT-SIDE virtualization), (7) feedback-loop-state-machine for screenshot iteration loop (FIRST N-turn-loop-controller), (8) per-action-permission-policy at sub-tool-granularity (FIRST sub-tool-action permission gating, parallel to bash's DangerFullAccess but at action granularity), (9) request-side three-concurrent-opt-in (largest yet), (10) CLI-and-slash-command surface with /desktop advertised-but-unbuilt (sixth entry, largest in cluster), (11) host-machine-state-management transport-axis (NOVEL ELEVENTH layer with screen-capture+synthetic-input+display-dimension-query+window-enum+VM-orchestration+accessibility-permissions+per-action-permission-prompts+coordinate-validation+screenshot-encoding+safety-throttling — distinct from every prior cluster member which operated network-only) — making #230 the first cluster member with eleven-layer-fusion-shape (exceeds #229 's ten-layer), the FIRST host-OS-syscall-transport requirement, the FIRST CLIENT-SIDE virtualization requirement, the FIRST inverse-asymmetric-delegation case (Anthropic LEADS, OpenAI follows with Operator, Google follows with Mariner — novel inversion of #224-#229's Anthropic-trails pattern), the FIRST cluster member with image-content on TOOL-RESULT-side, and the FIRST gap where upstream claude-code ALSO has only a stub (Jobdori cycle #381 / extends #168c emission-routing audit / explicit follow-on from #229 's persistent-WebSocket-transport founder pinpoint and #225 's audio-bidirectional axis — introduces a NOVEL HOST-MACHINE-STATE-MANAGEMENT transport-axis distinct from every prior cluster member / sibling-shape cluster grows to twenty-nine / wire-format-parity cluster grows to twenty / capability-parity cluster grows to twelve / multimodal-IO cluster grows to eight: #220 image-input + #224 embedding-output + #225 audio-bidirectional + #226 image-output + #227 video-output + #228 mesh-output + #229 audio-text-tool-multiplex-on-WebSocket + #230 image-on-tool-result-side+host-OS-pixel-and-input modality / provider-asymmetric-delegation cluster grows to seven with novel inverse-sub-cluster (Anthropic leads, distinct from #224-#229's Anthropic-trails pattern) / EIGHT new clusters founded in a single pinpoint (exceeds #229 's three): Beta-version-tier-routing 1-member-founder + Image-on-tool-result-side 1-member-founder + Anthropic-typed-tool-discriminator 1-member-founder + Host-OS-system-call-transport 1-member-founder + Virtual-display-sandbox-orchestration 1-member-founder + Feedback-loop-state-machine 1-member-founder + Per-action-permission-policy-at-sub-tool-granularity 1-member-founder + Inverse-asymmetric-delegation 1-member-founder — the largest single-cycle cluster-founding count yet / eleven-layer-fusion-shape is the largest single-pinpoint fusion catalogued / external validation: sixty-two ecosystem references covering Anthropic Computer Use API GA 2024-10-22 with computer-use-2024-10-22 → computer-use-2025-01-24 → computer-use-2025-11-24 beta-tier evolution, Anthropic computer-use-demo reference with Docker+Xvfb+XFCE+Firefox+VNC sandbox pattern, OpenAI Operator + computer_use_preview, Google Project Mariner, Microsoft Magentic-One, Adept ACT-1, ByteDance UI-TARS open-weight, browser-use Python framework, Stagehand TypeScript, Skyvern AI, Multion, Cua framework, LangChain ChatAnthropic.with_computer_use_tool, LangGraph computer-use agent, smolagents ComputerAgent, AgentOps observability, screen-capture libs (ScreenCaptureKit/xcap/screenshots/xdotool/wtype/cliclick/nut.js), synthetic-input libs (enigo/rdev/inputbot/mouce/pyautogui/RobotJS), browser-cua stacks (playwright-rust/chromiumoxide/headless_chrome/fantoccini/playwright/puppeteer), sandbox-orchestration (Docker-Xvfb-XFCE / Kasm Workspaces / noVNC / Browserbase / Steel-browser / Hyperbrowser / Lightpanda / Surf.ai), per-action permission-policy precedent from claw-code's existing bash DangerFullAccess gating — claw-code is one of MULTIPLE coding-agent clients without computer-use BUT the gap is uniformly zero across the surveyed coding-agent ecosystem AND Anthropic specifically positions Claude as the LEADING commercial computer-use model AND claw-code is a port of claude-code which advertises /desktop slash command intent, making this the largest leading-vs-trailing parity gap with the upstream Anthropic platform in the entire emission-routing audit and the FIRST cluster member where upstream claude-code ALSO has only a stub — #230 closes the upstream prerequisite of every desktop-automation/browser-automation/form-filling/GUI-testing/accessibility-tool/screen-reading/vision-grounded-coding/pair-programming-with-screen-share/visual-debugging coding-agent affordance — the canonical 2024-2026-era agentic coding workflow that is currently impossible to build on top of claw-code)
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
d57295be51
roadmap: #228 filed — 3D-asset-generation API typed taxonomy is structurally absent: zero /v1/3d/generations endpoint surface, zero ThreeDGenerationRequest/ThreeDObject/MeshFormat/ThreeDTaskId typed model, zero ThreeDAsset OutputContentBlock variant, zero generate_3d_asset/retrieve_3d_task Provider trait methods, zero ProviderClient dispatch with nine recommended third-party partners (Meshy-AI/Tripo-AI/CSM/Luma-Genie/Stability3D/Point-E/Shap-E/GET3D/One-2-3-45), zero async-task-polling-primitive in runtime (confirms async-task-polling cluster grows to 3: #221+#227+#228 — structural pattern confirmed not anomalous), zero claw 3d/mesh/generate-3d CLI subcommand, zero /3d /mesh slash command, zero mesh_per_asset_cost_usd pricing field — nine-layer-fusion-shape identical to #227 with mesh-modality replacing video-modality (GLB/GLTF/USDZ/OBJ/FBX binary-spatial-geometry output instead of MP4 binary-temporal-media, per-3d-asset pricing instead of per-second-of-video, mesh-polygon-density as quality axis replacing video-fps-and-duration) / Jobdori cycle #379 / sibling-shape cluster grows to 27 / multimodal-IO cluster grows to 6 / provider-asymmetric-delegation cluster grows to 5 / async-task-polling cluster grows to 3
2026-04-26 18:03:00 +09:00
YeonGyu-Kim
24ed7f280a
roadmap: #225 filed — Audio API typed taxonomy is structurally absent: zero /v1/audio/transcriptions + zero /v1/audio/translations + zero /v1/audio/speech endpoint surface across both Anthropic-native and OpenAI-compat lanes, zero TranscriptionRequest / SpeechRequest / AudioVoice / AudioFormat / AudioMediaType / AudioSource / Modality / AudioRequestConfig / SpeechResponse / TranscriptionResponse typed model in rust/crates/api/src/types.rs, zero Audio variant on InputContentBlock (3-arm exhaustive: Text/ToolUse/ToolResult), zero Audio variant on OutputContentBlock (4-arm exhaustive: Text/ToolUse/Thinking/RedactedThinking), zero modalities/audio fields on MessageRequest for gpt-4o-audio request-side opt-in, zero transcribe/translate/synthesize_speech methods on Provider trait at rust/crates/api/src/providers/mod.rs:17-30 (only send_message + stream_message exist), zero audio dispatch on ProviderClient enum at rust/crates/api/src/client.rs:8-14 (three variants Anthropic/Xai/OpenAi, zero Whisper/ElevenLabs/Cartesia/Deepgram/AssemblyAI/Speechmatics partner-routing variants), zero multipart/form-data upload affordance with reqwest::multipart feature flag absent from rust/crates/api/Cargo.toml (rg returns zero hits for multipart across rust/), zero claw audio/transcribe/speak/tts/whisper CLI subcommand at rust/crates/rusty-claude-cli/src/main.rs, zero /transcribe/whisper/tts slash command, AND the existing /voice + /listen + /speak slash commands at rust/crates/commands/src/lib.rs:295-301+603-609+610-616 advertise audio-capability summaries but are all gated under STUB_COMMANDS at rust/crates/rusty-claude-cli/src/main.rs:8333+8388+8389 (advertised-but-unbuilt shape ×3, the largest single-pinpoint advertised-but-unbuilt slash-command count catalogued, strict-superset of #220 's /image+/screenshot ×2 and #223 's /files ×1), zero whisper-1/tts-1/tts-1-hd/gpt-4o-audio-preview/gpt-4o-realtime-preview/gpt-4o-mini-tts/gpt-4o-mini-transcribe entries in MODEL_REGISTRY, zero audio_input_per_minute/audio_output_per_minute/tts_per_million_chars/whisper_per_minute fields in ModelPricing struct (rust/crates/runtime/src/usage.rs:9-15 has only four text-token-only fields), zero audio-model recognition in pricing_for_model substring-matcher (#209+#224 cluster overlap) — uniquely manifesting a fusion shape combining #223 's transport-plumbing-absence (multipart/form-data) + #224 's provider-asymmetric-delegation (Anthropic does not offer audio at all per docs.anthropic.com/audio explicitly recommending AssemblyAI/Deepgram/OpenAI-Whisper, OpenAI offers GA whisper-1+tts-1+tts-1-hd+gpt-4o-audio-preview+gpt-4o-realtime-preview+gpt-4o-mini-tts+gpt-4o-mini-transcribe, Google Gemini Live API offers bidirectional audio modality, six-plus recommended partners ElevenLabs/Cartesia/PlayHT/Deepgram/AssemblyAI/Speechmatics) + #220 's advertised-but-unbuilt-slash-commands (×3, the largest count catalogued) + #218 's modalities-request-side-absence (gpt-4o-audio-preview's modalities:[text,audio] opt-in) + symmetric-input-output content-block-taxonomy axis ( #225 's first-of-its-kind contribution to the cluster doctrine since prior members have either input-only [ #220 ] or output-only [#214,#224] or stateless [#221/#222/#223] modality coverage) — making #225 the first cluster member where four independent prior shape-axes converge in a single pinpoint and the largest fusion-shape gap catalogued so far (Jobdori cycle #377 / extends #168c emission-routing audit / explicit follow-on candidate from #224 's provider-asymmetric-delegation shape — the first-named of two named candidates: Audio API typed taxonomy (this pinpoint #225 ) / Image-generation API typed taxonomy (open candidate for #226 ), Audio chosen because it inherits #223 's multipart-transport-plumbing dimension that Image-generation does not — the multipart sibling of #223 that the cycle hint explicitly identifies / sibling-shape cluster grows to twenty-four / wire-format-parity cluster grows to fifteen / capability-parity cluster grows to seven / multimodal-IO cluster grows to three: #220 input-only + #224 output-only + #225 full-duplex-bidirectional / advertised-but-unbuilt cluster grows to four / multipart-transport cluster grows to two / provider-asymmetric-delegation cluster grows to two / nine-layer-fusion-shape (endpoint-URL-set-of-three + multipart-form-data-transport-plumbing + data-model-taxonomy-with-input-AND-output-content-blocks + modalities-request-side-opt-in + Provider-trait-method-set-of-three-with-Unsupported-fallback + ProviderClient-enum-dispatch-with-six-partner-third-lanes + advertised-but-unbuilt-slash-commands-×3 + CLI-subcommand-surface + pricing-tier-with-per-minute-and-per-million-chars-and-per-million-audio-tokens-compound-cost-model) is the largest single-pinpoint fusion catalogued / external validation: forty-seven ecosystem references covering three first-class audio-endpoint specs on OpenAI side, one Anthropic non-coverage statement, one Google Gemini Live API spec, six first-class STT providers, six first-class TTS providers, one full-duplex bidirectional-audio endpoint OpenAI /v1/realtime, three first-class CLI/SDK typed-surface implementations, six first-class local-audio-providers, one community-maintained Common Voice benchmark, seven coding-agent peers with audio capability, one canonical Anthropic-recommended three-partner-set / claw-code is the sole client/agent/CLI with zero /v1/audio/{transcriptions,translations,speech} integration AND zero ElevenLabs/Cartesia/Deepgram/AssemblyAI/Speechmatics/Whisper partner-routing AND three advertised-but-unbuilt slash commands AND zero modalities request-side opt-in AND zero Audio content-block taxonomy variant on either input or output side AND zero multipart-form-data transport plumbing for audio uploads — all six gaps unique to claw-code in the surveyed ecosystem)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
2204a518e7
roadmap: #223 filed — Files API typed taxonomy is structurally absent: zero /v1/files endpoint surface across both Anthropic-native (anthropic-beta: files-api-2025-04-14) and OpenAI-compat lanes, zero FileObject / FileList / FilePurpose / FileStatus / FileUploadRequest / FileContentResponse / FileDeletionResponse typed model in rust/crates/api/src/types.rs (zero hits for files-api-2025-04-14, /v1/files, FileObject, FileList, FilePurpose, file_id, upload_file, MultipartUpload, multipart/form-data across rust/), zero multipart/form-data upload affordance with reqwest::multipart feature flag absent from rust/crates/api/Cargo.toml, zero file_id reference type that #220 image-content-block fix-shape would need to thread through ResolvedAttachment at rust/crates/tools/src/lib.rs:2660-2666 (which carries path/size/is_image triple with no file_id, no bytes, no media_type, no purpose, no upload_status, no expires_at slot), zero file_id reference type that #221 OpenAI batch-input-JSONL upload pathway requires (POST /v1/batches accepts only input_file_id, no inline-JSONL pathway exists), zero upload_file / retrieve_file / list_files / download_file / delete_file methods on the Provider trait at rust/crates/api/src/providers/mod.rs:17-30 (only send_message and stream_message exist, both per-request synchronous), zero file-management dispatch on the ProviderClient enum at rust/crates/api/src/client.rs:8-14 (three variants Anthropic/Xai/OpenAi all closed under per-request sync), zero claw files / claw upload / claw attach CLI subcommand surface at rust/crates/rusty-claude-cli/src/main.rs, zero /upload / /attach / /file-upload slash command in the SlashCommandSpec table at rust/crates/commands/src/lib.rs (the existing /files entry advertises 'List files in the current context window' but is gated under STUB_COMMANDS as a context-window file lister, distinct feature from Files API), zero pending_uploads field in claw status --json output, zero files-api-2025-04-14 in the active anthropic-beta header at rust/crates/telemetry/src/lib.rs:451-453 (currently sends claude-code-20250219, prompt-caching-scope-2026-01-05, tools-2026-04-01 only), zero FileSubmittedEvent / FileUploadProgressEvent / FileRetentionExpiredEvent typed events on the runtime telemetry sink, zero reqwest::multipart::Form::new() / reqwest::multipart::Part::stream() / file_part / content_disposition usage anywhere in the codebase (rg returns zero hits) — the canonical file-upload affordance is invisible across every CLI / REPL / slash-command / Provider-trait / ProviderClient-enum / data-model / telemetry-beta-header / multipart-transport surface, blocking the upstream fix-shapes for both #220 (image attachment via persistent file_id, the canonical Anthropic Vision pattern documented at platform.claude.com/docs/en/build-with-claude/files for repeated-image-use efficiency where re-uploading 5MB+ images on every request would otherwise burn bandwidth) and #221 (OpenAI Batch API requires JSONL input upload via POST /v1/files with purpose: 'batch' then references the resulting file_id from POST /v1/batches — the JSONL payload cannot be sent inline; without a Files API the OpenAI batch lane is structurally unreachable even if every other layer of #221 seven-layer fix-shape ships) (Jobdori cycle #375 / extends #168c emission-routing audit / explicit follow-on candidate from #221 seven-layer-endpoint-family-absence shape — the first-named of three named candidates: Files API typed taxonomy / Embeddings API typed taxonomy / Models list endpoint typed taxonomy, completing the trio with #222 closing Models list / sibling-shape cluster grows to twenty-two: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217/#218/#219/#220/#221/#222/#223 / wire-format-parity cluster grows to thirteen: #211+#212+#213+#214+#215+#216+#217+#218+#219+#220+#221+#222+#223 / capability-parity cluster grows to five: #218+#220+#221+#222+#223 / resource-management cluster: #223 alone but it is the upstream root cause of #220 image-attachment via persistent file_id and #221 OpenAI batch-input-JSONL upload pathway / seven-layer-endpoint-family-absence-with-transport-plumbing-absence shape (endpoint-URL + data-model-taxonomy + Provider-trait-method + ProviderClient-enum-dispatch + anthropic-beta-header-opt-in + CLI-subcommand-surface + multipart-form-data-transport-plumbing) is the first single capability absence catalogued where the transport layer itself must be extended before any higher-level surface can ship — distinct from #221 seven-layer absence (which operated within the existing JSON envelope) and the largest single transport-level gap catalogued, distinct from prior single-field (#211/#212/#214) / response-only (#213/#207) / header-only ( #215 ) / three-dimensional ( #216 ) / classifier-leakage ( #217 ) / four-layer ( #218 ) / false-positive-opt-in ( #219 ) / five-layer-feature-absence ( #220 ) / seven-layer-endpoint-family-absence ( #221 ) / eight-layer-endpoint-family-absence-with-misleading-alias ( #222 ) members; the seven-layer-endpoint-family-absence-with-transport-plumbing-absence shape is novel and applies to follow-on candidate Audio API typed taxonomy is absent (/v1/audio/transcriptions, /v1/audio/speech, /v1/audio/translations, also requiring multipart/form-data uploads) / external validation: Anthropic Files API reference at https://platform.claude.com/docs/en/build-with-claude/files documenting five operations on /v1/files with anthropic-beta: files-api-2025-04-14 opt-in, Anthropic Vision documentation referencing Files API for >5MB images and repeated-image-use efficiency, Anthropic Python SDK client.beta.files.upload first-class typed surface GA-shipped 2025-04-14, Anthropic TypeScript SDK parallel surface, OpenAI Files API reference at platform.openai.com/docs/api-reference/files documenting GA since 2023 with five operations on /v1/files and purpose discriminator (assistants/batch/fine-tune/user_data/vision) and FileStatus lifecycle (Uploaded/Processed/Error), OpenAI Python SDK client.files.create first-class surface, OpenAI Batch API explicitly requires input_file_id from POST /v1/files with purpose:'batch' (no inline-JSONL pathway), AWS Bedrock model invocation with input/output S3 paths (parallel concept), Azure OpenAI Files reference, Vertex AI Files via Cloud Storage, DeepSeek/Moonshot/Alibaba-DashScope/xAI parallel /v1/files OpenAI-compat shapes, OpenRouter file passthrough, simonw/llm --attachment flag with auto-upload to Files API, Vercel AI SDK 6 experimental_attachments threading file_id reference, LangChain Files integration with FileLoader uploading via Files API, charmbracelet/crush typed file management with provider-aware lifecycle, continue.dev config-file-driven file management with auto-upload, zed-industries/zed bundled-file management with periodic upstream sync, anomalyco/opencode file-upload integration with explicit file_id lifecycle in conversation context, models.dev file-handling capability flags indicating which models support file_id references, OpenTelemetry GenAI semconv gen_ai.input.attachments.count and gen_ai.input.files.count documented attributes, IANA MIME-type registry RFC 4288/4289 for application/json + multipart/form-data + application/pdf + image/png/jpeg/gif/webp, RFC 7578 multipart/form-data specification, reqwest::multipart documentation requiring 'multipart' feature flag on the reqwest dependency. Twenty-eight ecosystem references, two first-class Files API specs (Anthropic beta, OpenAI GA), GA timeline of 12 months on Anthropic beta side and 24+ months on OpenAI side (Files API on OpenAI predates Assistants API and Batch API both of which depend on it as prerequisite), seven first-class CLI/SDK implementations, one transport-layer specification (RFC 7578 multipart/form-data) and one Rust-side prerequisite (reqwest::multipart feature flag). claw-code is the sole client/agent/CLI in the surveyed coding-agent ecosystem with zero /v1/files integration AND zero multipart-form-data transport plumbing — both gaps are unique to claw-code in the surveyed ecosystem, the file-management gap is the upstream root cause of two downstream capability gaps already catalogued in this audit ( #220 image attachment via persistent file_id, #221 OpenAI batch input-JSONL upload), and the multipart-transport-plumbing-absence shape is novel within the cluster — #223 closes the upstream root cause of two downstream gaps and unblocks file_id-based multimodal input (5MB+ images / PDFs / repeated-image-use efficiency), OpenAI batch-input-JSONL upload (the missing piece of #221 seven-layer batch dispatch fix-shape), Anthropic-style document-block content with source:{type:'file',file_id} for PDFs, and CLI-vs-slash-command-symmetry on file management that the runtime clawability doctrine treats as canonical baseline expectations.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
a794764baa
roadmap: #222 filed — Models list endpoint typed taxonomy is structurally absent: zero GET /v1/models and zero GET /v1/models/{id} surface across rust/crates/api/src/providers/anthropic.rs and rust/crates/api/src/providers/openai_compat.rs (rg returns zero hits for /v1/models, list_models, fetch_models, get_models, available_models, model_catalog, ModelInfo, ModelList, ListModelsResponse, OwnedBy, ModelObject, ModelCatalog across rust/), zero Model / ModelInfo / ModelList / ListModelsResponse typed taxonomy in rust/crates/api/src/types.rs, zero list_models<'a>(&'a self) -> ProviderFuture<'a, ModelList> and zero retrieve_model<'a>(&'a self, model_id: &'a str) -> ProviderFuture<'a, ModelInfo> methods on the Provider trait at rust/crates/api/src/providers/mod.rs:17-30 (only send_message and stream_message exist, both per-request), zero list_models dispatch on the ProviderClient enum at rust/crates/api/src/client.rs:8-14 (three variants Anthropic/Xai/OpenAi, all closed under per-request synchronous dispatch), zero claw models / claw model list / claw list-models CLI subcommand surface at rust/crates/rusty-claude-cli/src/main.rs, zero /models slash command in the SlashCommandSpec table at rust/crates/commands/src/lib.rs, zero validation against an authoritative source on set_model at rust/crates/rusty-claude-cli/src/main.rs:4989-5037 (user can type /model claude-banana-9000 and the runtime accepts it, swaps the active model to that string, and only fails at request time when the upstream provider returns 404 / invalid_model_error), and the existing /providers slash command at rust/crates/commands/src/lib.rs:716-720 is just a literal alias for /doctor at rust/crates/commands/src/lib.rs:1386-1389 despite advertising summary: "List available model providers" (advertised-but-rerouted shape — actively misleading at the UX layer, distinct from #220 's advertised-but-unbuilt shape because the parse arm dispatches to a *different* command entirely instead of returning a clear unsupported error) — the canonical model-discovery affordance is invisible across every CLI / REPL / slash-command / Provider-trait / ProviderClient-enum / data-model surface, leaving claw-code's local hardcoded 13-entry MODEL_REGISTRY (3 anthropic + 5 grok + 1 kimi + 4 prefix routes for openai/gpt/qwen/kimi at rust/crates/api/src/providers/mod.rs:52-134 and 166-225) and its 6-entry model_token_limit match arm (rust/crates/api/src/providers/mod.rs:277-301 covering claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5-20251213, grok-3, grok-3-mini, kimi-k2.5, kimi-k1.5 — returns None for current production IDs claude-opus-4-7, claude-haiku-4-6, gpt-5.2, o3, o4-mini, kimi-k3, qwen3-max, grok-4, deepseek-reasoner) as the only model-name knowledge the runtime has access to, with no way to refresh it, no way to discover new model IDs that providers publish, no way to validate user-supplied model strings, no way to cross-link to the pricing_for_model cost estimator ( #209 substring-matching gap), no way to cross-link to the model_token_limit preflight check ( #210 max_tokens shadow-fork gap silently no-ops on unknown models), no way to cross-link to the future is_batch_request flag ( #221 batch-dispatch gap requires knowing which models support batch), and USAGE.md:426-440 documents only six model rows out of nine MODEL_REGISTRY entries (kimi alias missing from the documented table, four prefix routes mentioned only in passing prose, zero documentation of /v1/models endpoint usage / zero documentation of model-catalog discovery / zero documentation of "what to do when your provider ships a new model that isn't in claw-code's hardcoded registry") — the canonical model-discovery affordance is **the most universally-available endpoint in the LLM API ecosystem** (older than /v1/chat/completions itself, older than /v1/embeddings, older than /v1/messages, the literal first endpoint after auth on every OpenAI-compat provider since 2020 and on Anthropic since 2024-12-04, GA-shipped first-class typed surfaces in every Python/TypeScript SDK in the ecosystem) and claw-code is the **sole client/agent/CLI in the surveyed coding-agent ecosystem with zero /v1/models integration AND a misleading /providers slash command that aliases to /doctor** — both gaps are unique to claw-code in the surveyed ecosystem (Jobdori cycle #374 / extends #168c emission-routing audit / explicit follow-on candidate from #221 's seven-layer-endpoint-family-absence shape — the third of three named candidates: Files API typed taxonomy / Embeddings API typed taxonomy / Models list endpoint typed taxonomy, and the most clawability-impacting because it's the upstream root cause of three downstream gaps already catalogued in this audit / sibling-shape cluster grows to twenty-one: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217/#218/#219/#220/#221/#222 / wire-format-parity cluster grows to twelve: #211+#212+#213+#214+#215+#216+#217+#218+#219+#220+#221+#222 / capability-parity cluster grows to four: #218+#220+#221+#222 / discovery-and-validation cluster: #222 alone but it's the upstream root cause of #209 's pricing-fallback gap, #210 's max_tokens shadow-fork gap, and #221 's batch-dispatch gap / eight-layer-endpoint-family-absence-with-misleading-alias shape (endpoint-URL + data-model-taxonomy + Provider-trait-method + ProviderClient-enum-dispatch + CLI-subcommand-surface + slash-command-surface-with-misleading-alias + set_model-validation + downstream-consumers-with-stale-data) is the largest single advertised-vs-actual gap catalogued, distinct from prior single-field (#211/#212/#214) / response-only (#213/#207) / header-only ( #215 ) / three-dimensional ( #216 ) / classifier-leakage ( #217 ) / four-layer ( #218 ) / false-positive-opt-in ( #219 ) / five-layer-feature-absence ( #220 ) / seven-layer-endpoint-family-absence ( #221 ) members; the advertised-but-rerouted shape is novel — strict-superset of #220 's advertised-but-unbuilt because the parse arm dispatches to a *different* command instead of returning a clear unsupported error, applies to any future SlashCommandSpec entry where the summary field describes a feature different from what the parse arm dispatches to / external validation: Anthropic Models API reference at https://docs.anthropic.com/en/api/models-list documenting GET /v1/models GA 2024-12-04 with paginated before_id / after_id / limit and ModelInfo { id, type: "model", display_name, created_at } shape, Anthropic retrieve reference at https://docs.anthropic.com/en/api/models documenting GET /v1/models/{model_id} for single-model lookup, OpenAI Models API at https://platform.openai.com/docs/api-reference/models documenting the literal first endpoint after auth with Model { id, object: "model", created, owned_by } and ModelList { object: "list", data: Vec<Model> }, OpenAI Python SDK client.models.list() and client.models.retrieve(model_id) first-class typed surface, Anthropic Python SDK client.models.list() parallel surface GA-shipped 2024-12-04 alongside the API endpoint, Anthropic TypeScript SDK client.models.list(), AWS Bedrock ListFoundationModels API documenting Bedrock-anthropic-relay equivalent with FoundationModelSummary provider+model+modalities+active flag, Azure OpenAI Models reference with deployment-aware catalog, Vertex AI projects.locations.models.list for Vertex-published Anthropic/Gemini/3rd-party models, DeepSeek/Moonshot/Alibaba-DashScope/xAI parallel /v1/models OpenAI-compat shape, OpenRouter Models API at https://openrouter.ai/api/v1/models — the canonical "live model catalog with pricing" reference and the model that anomalyco/opencode-via-models.dev uses for pricing-data freshness, simonw/llm llm models and llm models default <model> first-class CLI subcommand backed by per-plugin model registration with models.dev-equivalent freshness, simonw/llm plugin-registration architecture for ad-hoc model addition, Vercel AI SDK 6 provider.languageModels() and provider.embeddingModels() first-class typed catalog APIs, LangChain init_chat_model(model_provider, model_name) reflective discovery via provider-defined catalogs and BaseChatModel.aget_models async catalog query, models.dev ( https://models.dev ) — community-maintained authoritative model catalog with pricing + capability flags + provider routing, used by anomalyco/opencode for pricing-data freshness with explicit fallback metadata when a model id isn't in the catalog (the canonical "external authoritative source for model metadata" reference), anomalyco/opencode models.dev integration with periodic refresh and explicit { provider: unknown, reason: not_in_pricing_table } fallback metadata, charmbracelet/crush typed catalog with provider+model+input/output-pricing, continue.dev config-file-driven catalog with auto-refresh from provider endpoints, zed-industries/zed bundled JSON catalog with periodic upstream refresh, TabbyML/tabby model catalog via plugin registration, llama.cpp server /v1/models local-model catalog via OpenAI-compat shape, LM Studio /v1/models local-model catalog, Ollama /api/tags and /v1/models local-model catalog with both Ollama-native and OpenAI-compat shapes, llamafile bundled-model catalog, LiteLLM models reference covering 100+ models at proxy level, portkey.ai gateway-level catalog, helicone.ai observability-platform model catalog with per-model usage stats, prompthub.us model-catalog-as-service, OpenTelemetry GenAI semconv gen_ai.request.model and gen_ai.response.model documented as required attributes for spans (every observability backend treats model as a first-class structured signal requiring authoritative-source validation), OpenAPI 3.1 spec for /v1/models at https://github.com/openai/openai-openapi as canonical machine-readable schema, Anthropic API stability versioning at https://docs.anthropic.com/en/api/versioning with anthropic-version header semver-stable since 2023-06-01 and models endpoint stable since 2024-12-04. Thirty-two ecosystem references, three first-class models-endpoint specs (Anthropic, OpenAI, OpenRouter), GA timeline of 16 months on Anthropic's side and 6+ years on OpenAI's side, eight first-class CLI/SDK implementations (Anthropic Python+TypeScript, OpenAI Python, simonw/llm, Vercel AI SDK, LangChain, Zed, charmbracelet/crush), seven first-class local-model catalogs (Ollama, LM Studio, llama.cpp server, llamafile, Tabby, Continue.dev, LiteLLM proxy), one community-maintained authoritative pricing source (models.dev) used by the closest peer coding agent. claw-code is the **sole client/agent/CLI in the surveyed coding-agent ecosystem with zero /v1/models integration AND a misleading /providers slash command that aliases to /doctor** — both gaps are unique to claw-code in the surveyed ecosystem, the model-discovery gap is the **upstream root cause** of three downstream cost-and-correctness gaps already catalogued in this audit ( #209 / #210 / #221 ), and the misleading-alias-shape is novel within the cluster — #222 closes the upstream root cause of three downstream gaps and unblocks live-catalog-driven cost-estimation, max-tokens-validation, batch-capability-detection, and CLI-vs-slash-command-symmetry that the runtime's clawability doctrine treats as canonical baseline expectations.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
ad44b3cdcd
roadmap: #221 filed — Message Batches API is structurally absent: zero /v1/messages/batches endpoint, zero /v1/batches endpoint, zero MessageBatch / BatchedRequest / BatchedResult / BatchProcessingStatus / BatchRequestCounts typed taxonomy across rust/crates/api/src/types.rs (zero hits for batches, MessageBatch, BatchedRequest, custom_id, processing_status), zero submit_batch / retrieve_batch / retrieve_batch_results / cancel_batch / list_batches methods on the Provider trait at rust/crates/api/src/providers/mod.rs:17-30 (only send_message and stream_message exist, both per-request synchronous), zero batch dispatch on ProviderClient enum at rust/crates/api/src/client.rs:8-14 (three variants Anthropic/Xai/OpenAi all closed under sync send_message + stream_message), zero BatchSubmittedEvent / BatchInProgressEvent / BatchEndedEvent typed events on the runtime telemetry sink, zero claw batch / claw batches CLI subcommand surface at rust/crates/rusty-claude-cli/src/main.rs, zero /batch slash command in SlashCommandSpec table at rust/crates/commands/src/lib.rs, zero pending_batches field in claw status --json output, zero is_batch_request flag on pricing_for_model cost estimator (so even if Batch API were wired, cost would over-charge by 2x), zero batch_input_tokens_per_million_usd / batch_output_tokens_per_million_usd fields in the Pricing struct — the API has been GA on Anthropic since 2024-10-08 (18 months ago at filing time, with explicit 'anthropic-beta: message-batches-2024-09-24' opt-in header documented) and on OpenAI since 2024-04-15 (24 months ago at filing time), uniformly offers 50% input-and-output token discount, accepts up to 100,000 requests per batch with 256MB total payload (Anthropic) or unlimited via Files API (OpenAI), 24-hour completion SLO; combining with #219 's also-missing prompt-caching opt-in (90% input savings) gives a compounded ~95% input-cost asymmetry on bulk ingest scenarios — the single largest cost-reduction lever in the entire API parity audit, missing at the endpoint-family level rather than the per-field level (Jobdori cycle #373 / extends #168c emission-routing audit / sibling-shape cluster grows to twenty: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217/#218/#219/#220/#221 / wire-format-parity cluster grows to eleven: #211+#212+#213+#214+#215+#216+#217+#218+#219+#220+#221 / capability-parity cluster grows to three: #218+#220+#221 / cost-parity cluster grows to eight: #204+#207+#209+#210+#213+#216+#219+#221 — #221 compounds with #219 to ~95% bulk-ingest cost asymmetry, the largest cost gap in the cluster / seven-layer-endpoint-family-absence shape (endpoint-URL + data-model-taxonomy + Provider-trait-method + ProviderClient-enum-dispatch + Worker-registry-status-enum + CLI-subcommand-surface + pricing-tier-flag) is the largest single capability absence catalogued, exceeding #220 's five-layer-feature-absence / endpoint-family-level absence shape is novel — applies to follow-on candidates 'Files API typed taxonomy is absent' (the OpenAI batch path's prerequisite endpoint, also absent), 'Embeddings API typed taxonomy is absent' (/v1/embeddings cross-cutting), 'Models list endpoint typed taxonomy is absent' (/v1/models / Anthropic Models API) / external validation: Anthropic Message Batches API reference at https://docs.anthropic.com/en/api/messages-batches documenting five operations on /v1/messages/batches + GA 2024-10-08 + 50% discount + 100k-requests-per-batch + 256MB-total-payload + 24-hour-SLO + custom_id correlation field, Anthropic launch announcement at anthropic.com/news/message-batches-api documenting '50% off both input and output tokens' positioning, Anthropic Pricing page documenting Batch API column with 50% across Sonnet 3.5/4/4.5/4.6 + Opus 3/4/4.6 + Haiku 3.5, Anthropic Python SDK client.messages.batches.create(requests=[...]) first-class typed surface, Anthropic TypeScript SDK parallel surface, AWS Bedrock InvokeModelBatch / batch-inference docs (Bedrock-anthropic-relay path), OpenAI Batch API reference at platform.openai.com/docs/api-reference/batch documenting GA 2024-04-15 + 50% discount + JSONL-via-Files-API + completion_window:'24h', OpenAI launch announcement at openai.com/index/openai-introduces-batch-api documenting 'process batches asynchronously and receive results within 24 hours at a 50% discount', DeepSeek/Moonshot/Alibaba-DashScope/xAI batch-inference parallel surfaces, OpenRouter batch passthrough, simonw/llm --batch flag, Vercel AI SDK generateBatch + provider-specific batch passthrough, LangChain Runnable.batch() + Runnable.abatch() first-class Python+TypeScript parity, LangSmith batch-aware tracing, llmindset.co.uk independent cost-calculus validation, Medium 'process 10,000 queries without breaking the bank' tutorial, Steve Kinney's Anthropic-Batch-with-Temporal workflow-orchestration article, ai.moda Anthropic-Batch+Caching 95%-compounded-savings analysis (proves #219+#221 together close the largest cost gap), VentureBeat industry-press coverage, Reddit r/ClaudeAI launch thread, zed-industries/zed#19945 (peer ecosystem with same gap), RooCodeInc/Roo-Code#8667 (peer ecosystem with same gap), n8n Anthropic-batch-processing workflow, startground.com batch-deals tracker, silicondata.com 2026-pricing per-model batch breakdown, Hacker News batch-mechanics discussions, OpenTelemetry GenAI semconv gen_ai.request.batch_id + gen_ai.batch.processing_status + gen_ai.batch.request_counts documented attributes, IANA application/x-ndjson + application/jsonl MIME-type registrations / claw-code is the sole client/agent/CLI in the surveyed coding-agent ecosystem with zero batch-dispatch capability despite the API being GA on both major providers for 18+ months — parity floor against every other CLI/SDK/coding-agent in 2024-2025, the largest single cost-reduction lever in the entire emission-routing audit, and the largest endpoint-family-level capability gap catalogued so far)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f9ee9f0ee1
roadmap: #220 filed — Image/vision input is structurally impossible across the entire data model: zero image content-block taxonomy variant on InputContentBlock (types.rs:80-94 has only Text/ToolUse/ToolResult — three of three exhaustive variants, zero Image, zero Document, zero MediaType, zero ImageSource, zero base64/file_id slot, zero media_type field anywhere in rust/crates/api/src/), zero parse arm for /image <path> and /screenshot slash commands despite their advertised summaries ("Add an image file to the conversation" at commands/lib.rs:585, "Take a screenshot and add to conversation" at commands/lib.rs:578) being in the canonical SlashCommandSpec table since project inception, both gated under STUB_COMMANDS at main.rs:8381-8382 (UX patch over missing-feature, not missing-feature fix), ResolvedAttachment at tools/lib.rs:2660-2666 carries path/size/is_image triple but no bytes / no base64 / no media_type / no upload affordance / no transport-ready payload despite is_image_path at line 5276 correctly classifying png/jpg/jpeg/gif/webp/bmp/svg extensions and the SendUserMessage/Brief tool surfacing isImage: true in JSON envelope (asserted at line 8969); build_chat_completion_request (openai_compat.rs:845) and translate_message (openai_compat.rs:946) have three-arm exhaustive matches over Text/ToolUse/ToolResult with no Image arm and no {type: "image", source: {type: "base64", media_type, data}} Anthropic-canonical wire shape and no {type: "image_url", image_url: {url: "data:image/...;base64,..."}} OpenAI-compat wire shape; the markdown renderer at render.rs:379-426 handles Tag::Image and TagEnd::Image for *output* rendering (asymmetric capability — model emits image markdown → rendered as colored [image:url] link, user attaches image → silent black hole at API boundary); the runtime's own worker_boot test fixture at worker_boot.rs:1324+:1349 literally hard-codes "Explain this KakaoTalk screenshot for a friend" as the canonical task-classification example for worker prompt-mismatch recovery — claw-code uses screenshot analysis as a runtime-classifier signal while having zero capability to actually send a screenshot to the model; TUI-ENHANCEMENT-PLAN.md:57 backlogs the gap as "No image/attachment preview" but the gap is far worse than no preview — there is no transport, no codec, no envelope, no anything from the byte stream to the wire (Jobdori cycle #372 / extends #168c emission-routing audit / sibling-shape cluster grows to nineteen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217/#218/#219/#220 / wire-format-parity cluster grows to ten: #211+#212+#213+#214+#215+#216+#217+#218+#219+#220 / capability-parity cluster (strict-superset including user-facing surfacing): #218+#220 / five-layer-structural-absence shape (data-model-variant + slash-command-parse-arm + attachment-metadata-threading + request-builder-translation + OS-integration-helper) is the largest single feature absence yet catalogued, exceeding #218 's four-layer; advertised-but-unbuilt shape is novel — UX-layer cousin of #219 's false-positive-opt-in shape — applicable to other STUB_COMMAND entries with capability-claim summaries / claw-code is the sole client/agent/CLI in the surveyed coding-agent ecosystem with zero image-input capability despite Anthropic Vision GA on 2024-03-04 (25 months ago at filing time, default-on for all Claude 3.5+ models with 5MB-per-image / 32MB-per-request / 100-images-per-request limits) and OpenAI Vision GA on 2024-05-13 (23 months ago) and Google Gemini multimodal GA on 2024-02-15 (26 months ago), making this a regression against the upstream claude-code CLI claw-code is porting from / external validation: Anthropic Vision API reference at platform.claude.com/docs/en/build-with-claude/vision documenting the canonical {type, source: {type, media_type, data}} content block, Anthropic Messages API reference, Anthropic Files API beta with file_id reference for repeated-image-use efficiency, AWS Bedrock prompt-caching docs with image-block coverage and 20-images-per-request stricter limit and same cachePoint:{} pattern from #219 , OpenAI Vision API reference documenting the {type:image_url, image_url:{url}} data-URL shape used by GPT-4o/4o-mini/5-vision/o1-vision/o3-vision/DeepSeek-VL2/Qwen-VL/QwQ-VL/MiniMax-VL/Moonshot kimi-VL, Google Gemini multimodal API documenting {inline_data:{mime_type, data}} shape, anomalyco/opencode#16184 (look_at tool image-file-from-disk handling bug), anomalyco/opencode#15728 (Read tool image-handling bug), anomalyco/opencode#8875 (custom-provider attachment-allowlist gap), anomalyco/opencode#17205 (text-only-model token-burn on image attachment) — all four are integration-quality gaps in opencode while claw-code is missing the capability entirely (~85% vs 0% parity asymmetry, the largest in the cluster), charmbracelet/crush vision-input via terminal paste, simonw/llm --attachment flag, Vercel AI SDK experimental_attachments + image content blocks, LangChain HumanMessage content blocks, LangGraph image-message routing, OpenAI Python and Anthropic Python SDK first-class image-typed messages, anthropic-quickstarts vision examples, claude-code official CLI paste-image and screenshot shortcuts (the upstream this is a regression against), OpenTelemetry GenAI semconv gen_ai.input.attachments and gen_ai.input.images.count multimodal observability attributes, IANA MIME-type registry RFC 4288/4289)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
8730b081e2
roadmap: #219 filed — Anthropic prompt-caching opt-in is structurally impossible: cache_control marker has zero codebase footprint (rg returns 0 hits across rust/ src/ docs/ tests/) despite the wire-side beta header 'prompt-caching-scope-2026-01-05' being unconditionally enabled at every Anthropic request (telemetry/lib.rs:16,452,469 + anthropic.rs:1443); five cacheable surfaces are uniformly locked: pub system: Option<String> at types.rs:11 is a flat string with no array form so no system-block cache_control slot exists; InputContentBlock variants Text/ToolUse/ToolResult at types.rs:80-99 have no cache_control field; ToolResultContentBlock variants Text/Json at types.rs:100-103 have no cache_control field; ToolDefinition at types.rs:105-110 has no cache_control field; openai_compat path translate_message at openai_compat.rs:946 and build_chat_completion_request at openai_compat.rs:850 emit flat-string system+content with no cache_control or Bedrock cachePoint translation; ~600 LOC of response-side cache stats infrastructure (prompt_cache.rs PromptCacheStats / PromptCacheRecord / PromptCache trait) accumulates a zero stream because no payload was opted in, and four hardcoded zero-coercion sites (openai_compat.rs:477-478, 489-490, 597-598, 1211-1212) discard upstream cache stats from Bedrock/Vertex/kimi-anthropic-compat/MiniMax-relay even when emitted; integration test at client_integration.rs:88-89 asserts the beta header is sent but no companion test asserts payload contains a cache_control marker because the data structures cannot produce one — a uniquely paradoxical false-positive opt-in shape: wire signal advertises caching intent and data-model structurally precludes it (Jobdori cycle #371 / extends #168c emission-routing audit / sibling-shape cluster grows to eighteen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217/#218/#219 / wire-format-parity cluster grows to nine: #211+#212+#213+#214+#215+#216+#217+#218+#219 / cost-parity cluster grows to seven: #204+#207+#209+#210+#213+#216+#219 — #219 is the dominant cost-parity miss, ~90% input-token-cost reduction unattainable / cache-parity request/response symmetry pair: #219 (request-side opt-in absent) + #213 (response-side stats absent on openai-compat lane) / five-surface uniform-structural-absence shape: system+tools+tool_choice+messages+tool_result_content all locked, with no extra_body escape hatch since cache_control is a per-block annotation not a top-level field / false-positive-opt-in shape: novel cluster member where wire signal says yes and structure says no / external validation: Anthropic prompt-caching reference at platform.claude.com/docs/en/build-with-claude/prompt-caching documenting cache_control: {type: ephemeral} on system/tools/messages/content blocks with 5-min default TTL and 1-hour optional TTL and 90% cost reduction on cache-read tokens, Anthropic Messages API reference documenting system: Vec<SystemBlock> array form as the cacheable shape, Bedrock prompt-caching docs documenting cachePoint: {} block form for Bedrock-anthropic relay, claudecodecamp.com analysis of how prompt caching actually works in Claude Code, xda-developers article documenting claude-code's cache-token-budget knob proving caching is actively engaged, anomalyco/opencode#5416 #14203 #16848 #17910 #20110 #20265 (cache-related issues and PR for system-prompt-split-for-cache-hit-rate optimization), opencode-anthropic-cache npm package as third-party plugin proving the ecosystem expectation, LangChain anthropicPromptCachingMiddleware as first-class JS wrapper, LiteLLM prompt-caching docs with single-line cache_control pass-through for Anthropic+Bedrock, Vercel AI SDK Anthropic provider providerOptions.anthropic.cacheControl, prompthub.us multi-provider comparison treating opt-in as documented baseline, portkey.ai gateway-level pass-through, mindstudio.ai cost-impact analysis, OpenTelemetry GenAI semconv gen_ai.usage.input_tokens.cached as documented attribute — claw is the sole client/agent/CLI in the surveyed coding-agent ecosystem with zero cache_control request-side opt-in capability despite shipping the eligibility beta header on every Anthropic request)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
c2a208eb15
roadmap: #218 filed — MessageRequest has no response_format / output_config / seed / logprobs / top_logprobs / logit_bias / n / metadata fields (types.rs:6-36, thirteen fields, zero hits across rust/ for any of these); build_chat_completion_request (openai_compat.rs:845) writes thirteen optional fields and emits none of these on the wire; AnthropicClient::send_raw_request (anthropic.rs:466) renders same MessageRequest via render_json_body (telemetry/lib.rs:107) with same gaps; ChatMessage (openai_compat.rs:688) has three fields (role, content, tool_calls) and no refusal field despite the streaming-aggregator test at line 1781 explicitly including "refusal": null in test data — silent serde drop; ChunkDelta (openai_compat.rs:735) has same gap; OutputContentBlock (types.rs:147) has four variants (Text, ToolUse, Thinking, RedactedThinking) and no Refusal variant; MessageResponse.stop_reason (types.rs:127) has no slot for Anthropic's 2025-11+ stop_reason='refusal' value; net effect: claw cannot opt into OpenAI strict-schema constrained decoding (response_format json_schema, GA 2024-08), cannot opt into Anthropic GA structured outputs (output_config.format, GA 2025-11-13), cannot opt into legacy JSON mode (response_format json_object), cannot supply seed for reproducible sampling, cannot request logprobs/top_logprobs, cannot bias tokens via logit_bias, cannot request multiple completions via n, and silently discards every refusal string OpenAI emits when constrained decoding rejects a generation — refusals classified as Finished/success with empty content via #217 normalize_finish_reason mapping (Jobdori cycle #370 / extends #168c emission-routing audit / sibling-shape cluster grows to seventeen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217/#218 / wire-format-parity cluster grows to eight: #211+#212+#213+#214+#215+#216+#217+#218 / four-layer-structural-absence shape: request-struct-field + request-builder-write + response-struct-field + content-block-taxonomy-variant, largest single-feature absence catalogued / external validation: OpenAI Structured Outputs guide, OpenAI Chat Completions API reference, Anthropic structured-outputs reference (GA 2025-11-13), Anthropic Messages API reference (stop_reason='refusal'), Vercel AI Gateway Anthropic structured outputs, Vercel AI SDK 6 generateObject + Zod, LangChain with_structured_output, simonw/llm --schema flag, charmbracelet/crush, anomalyco/opencode#10456 open feature request citing OpenAI Codex as reference, anomalyco/opencode#5639/#11357/#13618, OpenAI Codex CI/code-review cookbook, OpenRouter structured-outputs docs, OpenAI Python SDK client.beta.chat.completions.parse, OpenTelemetry GenAI semconv gen_ai.request.response_format + gen_ai.response.refusal)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
eea5b31745
roadmap: #217 filed — normalize_finish_reason (openai_compat.rs:1389) is a two-arm match (stop→end_turn, tool_calls→tool_use) with a string-passthrough fallthrough that drops three of five OpenAI-spec finish reasons (length, content_filter, function_call); MessageResponse.stop_reason is Option<String> with no enum constraint; WorkerRegistry::observe_completion (worker_boot.rs:558) classifies failure on finish=='unknown'||finish=='error' only, so OpenAI/DeepSeek/Moonshot truncation (length) and content-policy refusal (content_filter) become WorkerStatus::Finished with success events; the streaming aggregator's tool-call-block-close branch at openai_compat.rs:537 keys on 'tool_calls' literal and never fires for legacy 'function_call' shape (Azure pre-2024-02-15 / DeepSeek pre-2025-08 / SiliconFlow / OpenRouter relays); Anthropic native path produces the canonical taxonomy correctly (Jobdori cycle #369 / extends #168c emission-routing audit / sibling-shape cluster grows to sixteen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216/#217 / wire-format-parity cluster grows to seven: #211+#212+#213+#214+#215+#216+#217 / classifier-leakage shape: response-side string mistranslation flows three layers deep into runtime classifier with two-literal-compare coverage / external validation: OpenAI Chat Completions API reference, Anthropic Messages API reference, OpenAI function_call deprecation notice, Azure OpenAI reference, DeepSeek/Moonshot/DashScope refs, anomalyco/opencode#19842 , charmbracelet/crush typed enum, simonw/llm Reason enum, Vercel AI SDK FinishReason union, LangChain LengthFinishReasonError/ContentFilterFinishReasonError, semantic-kernel FinishReason enum, openai-python Literal type, OpenTelemetry GenAI gen_ai.response.finish_reasons spec)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
3a3162c301
roadmap: #216 filed — neither MessageRequest nor MessageResponse has any service_tier field; build_chat_completion_request (openai_compat.rs:845) writes thirteen optional fields (model, max_tokens/max_completion_tokens, messages, stream, stream_options, tools, tool_choice, temperature, top_p, frequency_penalty, presence_penalty, stop, reasoning_effort) and does not write service_tier; AnthropicClient::send_raw_request (anthropic.rs:466) renders the same MessageRequest struct via AnthropicRequestProfile::render_json_body (telemetry/lib.rs:107) which has no field for it either, only a per-client extra_body escape hatch (asymmetric — openai_compat path has zero hits for extra_body); ChatCompletionResponse / ChatCompletionChunk / OpenAiUsage all deserialize four fields each, dropping the upstream-echoed service_tier confirmation and the system_fingerprint reproducibility marker that OpenAI documents as the canonical "what backend served you" signal; claw cannot opt into OpenAI flex (~50% cheaper async batch — developers.openai.com/api/docs/guides/flex-processing), cannot opt into OpenAI priority (~1.5-2x premium SLA latency — developers.openai.com/api/docs/guides/priority-processing), cannot opt into Anthropic priority (auto/standard_only — platform.claude.com/docs/en/api/service-tiers), and cannot detect at the response layer whether a request was flex-served or silently upgraded to priority by a project-level default override (Jobdori cycle #368 / extends #168c emission-routing audit / sibling-shape cluster grows to fifteen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215/#216 / wire-format-parity cluster grows to six: #211+#212+#213+#214+#215+#216 / cost-parity cluster grows to six: #204+#207+#209+#210+#213+#216 / three-dimensional-structural-absence shape: request-side write + response-side read + reproducibility marker, distinct from prior request-only #211#212 / response-only #207#213#214 / header-only #215 members / external validation: OpenAI flex/priority/scale-tier guides, OpenAI advanced-usage system_fingerprint guide, Anthropic service-tiers reference, OpenTelemetry GenAI semconv gen_ai.openai.request.service_tier + gen_ai.openai.response.service_tier + gen_ai.openai.response.system_fingerprint, anomalyco/opencode#12297 , Vercel AI SDK serviceTier provider option, LangChain ChatOpenAI service_tier ctor param, LiteLLM service_tier pass-through, semantic-kernel OpenAIPromptExecutionSettings.ServiceTier, openai-python SDK client.chat.completions.create(service_tier=...) first-class kwarg, MiniMax/DeepSeek Anthropic-compat layer notes, badlogic/pi-mono#1381 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
a319c9d7e6
roadmap: #215 filed — expect_success reads only request-id/x-request-id headers and discards the rest; both OpenAiCompatClient::send_with_retry and AnthropicClient::send_with_retry sleep on pure exponential backoff (2^(n-1) * initial + jitter) that ignores upstream Retry-After (RFC 7231 §7.1.3, mandated by Anthropic on 429, emitted by OpenAI/DeepSeek/Moonshot/DashScope on 429/503/529); ApiError::Api has no retry_after field, scheduler has no input port for it; on a 60s server-specified cooldown, claw burns 3 retries in <8s against a closed gate then surfaces RetriesExhausted (Jobdori cycle #367 / extends #168c emission-routing audit / sibling-shape cluster grows to fourteen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214/#215 / upstream-contract-honoring trio: #211+#213+#215 / wire-format-parity cluster: #211+#212+#213+#214+#215 / external validation: Anthropic rate-limits docs, OpenAI cookbook, DeepSeek rate-limit docs, RFC 7231 §7.1.3, openai-python#957, Vercel AI SDK LanguageModelV1RateLimit.retryAfter, LangChain BaseChatOpenAI, anomalyco/opencode#16993/#16994/#9091/#17583/#11705, charmbracelet/crush, LiteLLM Router.retry_after_strategy)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f070fc8b0f
roadmap: #214 filed — ChunkDelta and ChatMessage in openai_compat.rs deserialize only content/tool_calls; delta.reasoning_content (sibling to delta.content, the canonical wire field for DeepSeek deepseek-reasoner / Alibaba Qwen3-Thinking / QwQ / vLLM reasoning-parser backends) is silently discarded at serde-deserialize time before any handler sees it; non-streaming ChatMessage has the same gap; is_reasoning_model classifier already returns true for o1/o3/o4/grok-3-mini/qwen-qwq/qwq/*thinking* and is consulted at line 901 to strip request-side tuning params but never on the response side to opt into reasoning_content extraction; local taxonomy already declares OutputContentBlock::Thinking and ContentBlockDelta::ThinkingDelta and the Anthropic native path correctly emits both with full test coverage at sse.rs:260,288 — the openai-compat translator has the destination types one import away and never bridges to them (Jobdori cycle #366 / extends #168c emission-routing audit / sibling-shape cluster grows to thirteen: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213/#214 / reasoning-fidelity trio: #207+#211+#214 / wire-format-parity cluster: #211+#212+#213+#214 / external validation: DeepSeek API docs, vLLM reasoning-outputs, anomalyco/opencode#24124 , charmbracelet/crush, simonw/llm, Vercel AI SDK, LangChain BaseChatOpenAI, LiteLLM, continue.dev#9245)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
be520220e9
roadmap: #213 filed — OpenAiUsage struct does not deserialize prompt_tokens_details.cached_tokens (OpenAI 2024-10) or prompt_cache_hit_tokens (DeepSeek); openai_compat path hardcodes cache_creation_input_tokens: 0 and cache_read_input_tokens: 0 at four sites; cost estimator computes $0 cache savings for every OpenAI/DeepSeek/Moonshot kimi request even when upstream prompt cache is hitting; Anthropic native path correctly populates same Usage fields from native wire format (Jobdori cycle #365 / extends #168c emission-routing audit / sibling-shape cluster grows to twelve: #201/#202/#203/#206/#207/#208/#209/#210/#211/#212/#213 / cost-parity cluster: #204+#207+#209+#210+#213 / wire-format-parity cluster: #211+#212+#213 / external validation: OpenAI prompt caching docs, DeepSeek pricing docs, anomalyco/opencode#17223/#17121/#17056/#11995, Vercel AI SDK cachedInputTokens, charmbracelet/crush, simonw/llm)
2026-04-26 18:02:59 +09:00
YeonGyu Kim
bd45ae61a2
roadmap: #211 filed — build_chat_completion_request selects max_tokens_key only on wire_model.starts_with("gpt-5"), sending legacy max_tokens to OpenAI o1/o3/o4-mini reasoning models which reject it with unsupported_parameter; is_reasoning_model classifier 90 lines above already knows o-series is reasoning, taxonomy half-applied within 30-line span; no test for any o-series model (Jobdori cycle #363 / extends #168c emission-routing audit / sibling-shape cluster grows to ten: #201/#202/#203/#206/#207/#208/#209/#210/#211 / external validation: charmbracelet/crush#1061 , simonw/llm#724 , HKUDS/DeepTutor#54 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
83e99696af
roadmap: #210 filed — rusty-claude-cli shadows api::max_tokens_for_model with stripped 2-branch fork (opus=32k, else=64k); ignores model_token_limit registry, bypasses plugin maxOutputTokens override, silently sends 64_000 for kimi-k2.5 whose registry cap is 16_384 (4x over) (Jobdori cycle #362 / extends #168c emission-routing audit / sibling-shape cluster grows to nine: #201/#202/#203/#206/#207/#208/#209/#210)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
d119ef9b7a
roadmap: #209 filed — pricing_for_model substring-matches haiku/opus/sonnet only; default_sonnet_tier function name carries Opus pricing constants (15.0/75.0 vs real Sonnet 3.0/15.0); every non-Anthropic model silently falls back producing 5-100x wrong cost estimates with no event signal, only a magic-string suffix on one summary line; rusty-claude-cli session JSON and anthropic.rs telemetry emit cost without pricing_source field (Jobdori cycle #361 / cost-parity cluster closer to #204+#207 / models.dev parity gap vs anomalyco/opencode)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
495db9764e
roadmap: #207 filed — OpenAiUsage discards prompt_tokens_details.cached_tokens and completion_tokens_details.reasoning_tokens, cache_read_input_tokens hardcoded 0 in 4 sites breaking cost parity with Anthropic path (Jobdori cycle #358 / fix-pair with #204 / anomalyco/opencode #24233 sibling)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
9c02f202f4
roadmap: #206 filed — normalize_finish_reason covers 2/5 OpenAI finish reasons, length/content_filter/function_call unmapped (Jobdori cycle #357 )
...
Pinpoint #206 : normalize_finish_reason() in openai_compat.rs only maps
stop→end_turn and tool_calls→tool_use. The 'other => other' pass-through
arm silently leaks length, content_filter, function_call to downstream
consumers expecting Anthropic vocabulary (max_tokens, refusal, tool_use).
Sibling of #201/#202/#203/#204 (silent fallbacks at provider boundary).
No structured event for unmapped values; test coverage locks only the
two-case happy path.
Branch: feat/jobdori-168c-emission-routing
HEAD: dba4f28
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
34348de3d9
roadmap: #205 filed — prunable worktree lifecycle audit trail missing, no creation timestamp, pinpoint ID, or doctor visibility (Q *YeonGyu Kim cycle #137 / Jobdori cycle #351 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
8b4876a90a
roadmap: #204 filed — TokenUsage omits reasoning_tokens, reasoning models merge into output_tokens breaking cost parity (anomalyco/opencode #24233 parity gap, Jobdori cycle #336 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
1566b2e1d3
roadmap: #203 filed — AutoCompactionEvent summary-only, no SSE event emitted mid-turn when auto-compaction fires (Jobdori cycle #136 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
6da110a7d7
roadmap: #202 filed — sanitize_tool_message_pairing silent drop, no tool_message_dropped event (Jobdori cycle #135 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
6921737326
roadmap: #201 filed — parse_tool_arguments silent fallback, no tool_arg_parse_error event (Jobdori cycle #134 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
18caa57b88
roadmap: #200 filed — SCHEMAS.md self-documenting drift, no derive-from-source enforcement (Q *YeonGyu Kim cycle #304 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
aaaa32cb2c
roadmap: #199 filed — claw config JSON envelope omits deprecated_keys, merged_keys count-only, no automation path (Jobdori cycle #133 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
42357cbee4
roadmap: #198 filed — MCP approval-prompt opacity, no blocked.mcp_approval state, pane-scrape required (gaebal-gajae cycle #135 / Jobdori cycle #248 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
8ad7ac14dc
roadmap: #197 filed — enabledPlugins deprecation no migration path, warning on every invocation (Jobdori cycle #132 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
9bdd70d945
roadmap: Doctrine #35 formalized — disk-truth wins over verbal drift during taxonomy disputes (Jobdori cycle #194 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
4f6c64e189
roadmap: #196 filed — local branch namespace accumulation, no lifecycle cleanup or doctor visibility (Jobdori cycle #131 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
ae9b66edcb
roadmap: #195 filed — worktree-age opacity, no timestamp or doctor signal (Jobdori cycle #130 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
6f8229ea37
roadmap: #194 filed — prunable-worktree accumulation, no doctor visibility or auto-prune lifecycle
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
c778659fab
roadmap: Doctrine #33 formalized via cross-claw validation (cycle #129 )
...
Per gaebal-gajae cycle #129 closure ('Doctrine #33 적용도 맞습니다'),
promoting Doctrine #33 from provisional to formal status.
Statement:
'Merge-wait steady state reports as a vector, not narrative.'
Operational protocol:
- Validate 4-element state vector each cycle:
ready_branches, prs, repo_drift, external_gate
- If unchanged: vector-only post (5 lines) OR silent ack
- If changed: that change IS the cycle's content
Anti-pattern prevented:
중복 확인 로그 (duplicate check logs). Re-posting full merge-wait
narrative every cycle when state hasn't moved.
Validation history:
- Cycle #124 : gaebal-gajae introduced compression
- Cycle #129 : Jobdori first field-test (vector-only post)
- Cycle #129 : gaebal-gajae cross-claw validation (same vector,
same conclusion, both claws converged)
Cross-claw coherence test passed:
- Both claws independently produced same vector values
- Both reached same conclusion (merge-wait holds)
- Both used same response pattern (vector form)
Doctrine #29-#33 progression operationalizes Phase 0 closure +
merge-wait discipline. #33 's specific contribution: noise prevention
during legitimate hold states.
Doctrine count: 33 formalized.
Mode integrity: preserved (this is doc-only follow-up, not probe).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
171e0f6943
roadmap: #193 filed — session/worktree hygiene readability gap (gaebal-gajae framing)
...
Per gaebal-gajae cycle #123-#125 framing + authorization, filing
operational pinpoint on dogfood methodology layer (not claw-code binary).
Title: 'Session/worktree hygiene debt makes active delivery state
harder to read than the actual code state.'
Short form: 'branch/worktree proliferation outpaced merge/cleanup
visibility.'
Gap identified by gaebal-gajae: 4 branch states visually
indistinguishable on same surface:
1. Ready branch (merge-ready, gated externally)
2. Blocked branch (abandoned due to architecture/pushback)
3. Stale abandoned branch (superseded or merged alternately)
4. Dirty scratch worktree (experimental, status unclear)
Evidence (cycle #123 substance check):
- 147 local branches
- 30+ clawcode/jobdori /tmp artifacts
- Stale bridge logs from 2026-04-20 (3+ days old)
Class: NOT codegen, NOT test, NOT binary — state readability /
hygiene gap in dogfood methodology layer.
Doctrine #29 compliance: Doc-only ROADMAP entry filed during
merge-wait mode on frozen branch. Legitimate filing-without-fixing.
This is the second such case (first: cycle #100 bundle freeze).
Framing family:
- Sibling to §4.44 (runtime failure state opacity)
- §4.45 tackles repo delivery lane state opacity
- Different scope, same structural pattern
Pinpoint accounting:
- Before #193 : 82 total, 67 open
- After #193 : 83 total, 68 open
- First dogfood methodology pinpoint (vs binary pinpoints)
Priority: Post-Phase-1 (not Phase 1 bundle member).
Remediation proposal: branch state tagging, worktree lifecycle
discipline, ROADMAP <-> branch mapping.
Sources:
- Cycle #120 Jobdori substance check (147 branches surfaced)
- Cycle #123 Jobdori evidence collation (30 worktrees)
- Cycle #124 gaebal-gajae framing refinement (4-state gap)
- Cycle #125 gaebal-gajae authorization + final framing
Filed by gaebal-gajae authorization. No code change. No probe.
Merge-wait mode preserved. Phase 0 branch integrity preserved.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
486da5e447
roadmap: Doctrine #32 formalized + cycle #117 final reframe per gaebal-gajae
...
Per gaebal-gajae cycle #117 closing validation:
Authoritative reframe:
'Cycle #117은 PR creation failure를 브랜치 문제에서
organization-level PR authorization barrier로 정확히 격리한
진단 턴입니다.'
The cycle value was NOT 'PR blocked'.
The cycle value WAS 'boundary of the barrier isolated through experiments'.
Four dimensions experimentally separated:
1. Repository state: healthy (push, tests)
2. Branch readiness: visible on origin
3. Token liveness: valid (own-fork PR succeeded)
4. Org PR authorization: BLOCKED (FORBIDDEN for both claws)
Reviewer-ready compression:
'The branch is pushable and reviewable, but PR creation into
ultraworkers/claw-code is blocked specifically at the organization
authorization layer, not by repository state or token liveness.'
Doctrine #32 formalized:
'Merge-wait mode actions must be within the agent's capability
envelope. When blocked externally, diagnose by boundary separation
and hand off to the responsible party, not by retry or redefinition.'
Operational protocol:
1. Isolate boundary through experiments (not retry same path)
2. Document separation explicitly (works vs doesn't work)
3. Escalate to responsible party (web UI, org admin, infra)
4. Do NOT retry, conflate, or redefine the failure
Validation: Cycle #117 both-claws blocked, boundary isolated,
escalation path identified.
Cross-claw coherence:
- Cycle #115 : 1 claw attempted, 1 succeeded (hypothesis)
- Cycle #117 : 2 claws attempted, 2 blocked, IDENTICAL error (confirmed)
Next action path (per gaebal-gajae):
Author/owner intervention via web UI OR org admin OAuth grant.
'기술적 탐사가 아니라 author/owner intervention입니다.'
Doctrine count: 32 formalized.
Gate status: Blocked pending author intervention.
Mode integrity: Preserved throughout cycle #117 .
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f814ab91f1
roadmap: Cycle #117 cross-claw PR blocker diagnosis locked
...
Per cycle #117 cross-claw diagnosis (both claws attempted independently):
Both Jobdori (code-yeongyu) and gaebal-gajae (Yeachan-Heo) hit
identical GraphQL FORBIDDEN error on createPullRequest mutation.
Diagnosis: Organization-wide OAuth app restriction on
ultraworkers/claw-code, not per-identity issue.
Reviewer-ready compression (per gaebal-gajae):
'The branch is now remotely visible and PR-ready, but actual PR
creation is blocked by GitHub permissions rather than repository
state.'
Confirmed state:
- Branch on origin: Yes (cycle #115 )
- PR creation CLI path: Blocked for both claws
- Manual web UI: Required
- Org admin OAuth grant: Long-term fix
Gate sequence updated:
1. Branch on origin (DONE, cycle #115 )
2. PR creation - BLOCKED at OAuth (cycle #116/#117)
3. Manual web UI PR creation (REQUIRED next)
4. Review cycle
5. Merge signal
6. Phase 1 Bundle 1 (#181 + #183 )
Doctrine #32 (provisional, pending gaebal-gajae formal acceptance):
'Merge-wait mode actions must be within the agent's capability
envelope. When blocked externally, diagnose + document + escalate,
not retry.'
Cross-claw validation: Both claws blocked, same error pattern.
Mode integrity: Preserved throughout both attempts.
Next blocker: External human action (manual web UI or org admin).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
db4b9b3626
roadmap: Doctrine #31 formalized + cycle #115 reframe per gaebal-gajae
...
Per gaebal-gajae cycle #115 validation pass:
Authoritative reframe:
'Cycle #115 was not an exception to merge-wait mode; it was the first
turn where merge-wait mode actually did what merge-wait mode is
supposed to do.'
Reviewer-ready compression:
'The branch was frozen but not yet reviewable because it had never
been pushed; this cycle converted merge-wait from a declared state
into a remotely visible one.'
Mode semantic correction:
- Merge-wait mode is NOT 'do nothing'
- Merge-wait mode IS 'block discovery + enable merge-readiness'
- Push to origin = merge-readiness action (fits mode, not violation)
Doctrine #31 (formalized):
'Merge-wait mode requires remote visibility.'
Protocol: git ls-remote origin <branch> must return commit hash.
If empty: push before claiming review-ready.
Self-process pinpoint #193 (formalized):
'Dogfood process hygiene gap — declared review-ready claims lacked
remote visibility check for 40+ minutes (cycles #109-#114).'
Applies to dogfood methodology, not claw-code binary.
Gate sequence (per gaebal-gajae):
1. Branch on origin (cycle #115 , DONE)
2. PR creation (next concrete action)
3. Review cycle
4. Merge signal
5. Phase 1 Bundle 1 kickoff
Doctrine count: 31 total.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f2035bc4db
roadmap: lock 'merge-wait mode' state designation per gaebal-gajae
...
Per gaebal-gajae cycle #110 state designation:
'Phase 0 is no longer in discovery mode; it is in merge-wait mode
with Phase 1 already precommitted.'
Mode distinction formalized:
- Discovery mode: probe + file + refine (previous state)
- Merge-wait mode: hold state, await signal (CURRENT)
- Execution mode: land bundles (post-merge state)
Doctrine #30 : 'Modes are state, not suggestions.'
Once closure is declared, mode label acts as operational guard.
Future cycles must respect state designation:
- No new probes (that's discovery)
- No new pinpoints (branch frozen)
- No new branches (Phase 0 must merge first)
- Maintain readiness; respond to signal
Mode history for Phase 0:
- Cycle #97 : Discovery begins
- Cycle #108 : Exhaustion criteria met
- Cycle #109 : Closure declared
- Cycle #110 : Merge-wait mode formally entered
Current state: MERGE-WAIT MODE. Awaiting signal.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
4dc6692a47
roadmap: formal closure of Phase 0 / dogfood cycles per gaebal-gajae
...
Per gaebal-gajae 11:58 Seoul closure validation.
Authoritative closure statement:
'Phase 0 has finished discovery. Phase 1 should start by landing
the locked contract foundation bundle, not by opening new
exploratory cycles.'
All four exhaustion criteria met:
1. Unaudited surfaces: 9 probed (full coverage)
2. Probe hypothesis: Fully validated (multi-flag 3-4, simple 0-1)
3. Phase 1 docs: PHASE_1_KICKOFF.md + review guide + priority queue
4. Branch hygiene: 39 commits, 564 tests, 0 regressions, freeze held
Doctrine #29 (final): 'Discovery termination is itself a deliverable.'
- Criteria: surfaces probed, hypothesis validated, plan documented,
branch review-ready
- Anti-pattern: infinite probe continuation
- Correct: explicit closure + pivot to execution
Phase 0 / dogfood cycles formally closed. No more probe filings
on this branch. Next work unit is Phase 1 execution, not discovery.
Pending: Phase 0 merge approval → Phase 1 branch creation in
priority order → bundle-by-bundle execution (~10 min per bundle).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
c0d100f916
roadmap: cycle #109 checkpoint — probe complete, Phase 1 kickoff ready
...
End-of-dogfood checkpoint at cycle #109 :
Deliverables:
- PHASE_1_KICKOFF.md (192 lines, execution plan for 6-bundle priority queue)
- Test verification: 564 tests pass, 0 failures
- Branch clean, freeze held, 38 commits total
Probe hypothesis fully validated:
- Multi-flag verbs: 3-4 classifier gaps each
- Single-issue verbs: 0-1 gaps each
Accounting:
- 82 pinpoints filed (cycles #104-#108)
- 67 genuinely open
- 28 doctrines accumulated
Phase 1 ready:
- All 5 priority bundles gaebal-gajae reviewed
- Bundle sequence locked (foundation → extensions → cleanup)
- Expected execution: 50-60 min for all priorities
- No blockers except Phase 0 merge approval
Next: Execute Phase 1 bundles in priority order once Phase 0 lands.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
03044a77fe
doc: add Phase 1 kickoff — execution plan for 6-bundle priority queue
...
Comprehensive Phase 1 strategy document prepared at end of probe cycle #108 .
Contents:
- Phase 0 recap (freeze, tests, pinpoints, doctrines)
- What Phase 1 will do (6 bundles + independents, all gaebal-gajae reviewed)
- Concrete next steps (branch names, expected commits/tests per bundle)
- Priority 1: Error envelope contract drift (#181/#183) — foundation
- Priority 2: CLI contract hygiene (#184/#185) — extensions
- Priority 3: Classifier sweep 4-verb (#186/#187/#189/#192) — cleanup
- Priority 4: USAGE.md audit (#180 ) — doc prerequisite
- Priority 5: Dump-manifests help (#188 ) — doc-truth probe-flow
- Priority 6+: Independents (#190 design, #191 filesystem, others)
- Hypothesis validation (multi-flag verbs = 3-4 gaps, simple verbs = 0-1)
- Testing strategy + success criteria
All 5 priority bundles are reviewer-blessed (gaebal-gajae validation passes).
Doc-only. No code changes. Freeze held.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
a763463538
roadmap( #190 , #191 , #192 ): file final pre-phase-1 probe gaps in skills lifecycle
...
Cycle #108 probe of claw skills install/enable/disable yielded 3 pinpoints:
#190 : Design decision needed
skills install (no args) routes to help (action: help, kind: skills).
May be intentional (like agents pattern) or design inconsistency.
Requires verification against agents canonical reference.
#191 : Classifier gap (filesystem family extension)
skills install /bad/path emits kind=unknown.
Should be kind=filesystem or filesystem_io_error.
Extends #177/#178/#179 install-surface taxonomy.
#192 : Classifier gap (unknown-option family extension)
skills install --bogus-flag emits kind=unknown.
Should be kind=cli_parse (like sandbox).
Now 4 members in unknown-option sub-lineage: #186 , #187 , #189 , #192 .
Pinpoint count: 82 filed, 67 genuinely open.
Classifier family: 19 members (+2).
All unaudited surfaces now probed:
- Cycles #104-#108: plugins, agents, init, bootstrap-plan, system-prompt,
export, sandbox, dump-manifests, skills
- Hypothesis fully validated: Multi-flag verbs have 3-4 classifier gaps;
simple verbs have 0-1 gaps.
Per freeze doctrine, no code changes. Doc-only filing.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
d17634741c
roadmap( #188 , #189 ): lock framings + doc-truth sub-axis + priority refinement
...
Per gaebal-gajae cycle #107 validation pass. Three refinements:
1. Framings locked (both verb-specific):
#188 : 'dump-manifests --help omits the prerequisite that runtime
behavior actually requires.'
#189 : 'dump-manifests unknown-option errors still fall through to
unknown instead of the existing CLI-parse path.'
2. Doc-truthfulness family formally split into 2 sub-axes:
- Audit-flow (5 members: #76 , #79 , #82 , #172 , #180 ) — reading one
file vs another declared source of truth
- Probe-flow (NEW, 1 member: #188 ) — running verb vs observing
--help text
3. Priority refinement:
- #189 → bundled in feat/jobdori-186-189-classifier-sweep (3 verbs)
- #188 → post-#180 (doc parity sequence: USAGE gap → help-text gap)
- Full sequence: #180 (audit-flow doc-truth) → #188 (probe-flow doc-truth)
4. Key cycle #107 outcome (per gaebal-gajae):
'behavior bug처럼 보이던 걸 help-text truthfulness gap으로 정확히 재분류'
This is the reclassification skill that earned the filing.
Doctrine #28 : First observation is hypothesis, not filing. Verify
against SCHEMAS/USAGE/--help before classifying axis. Cost: 30-60s
per probe. Benefit: avoid filing not-a-bug pinpoints.
Priority queue now 6 bundles + 3+ independent, all reviewer-blessed.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
3bb23fb003
roadmap( #188 , #189 ): file doc-truth and classifier gaps in dump-manifests
...
Cycle #107 probe of claw dump-manifests yielded 2 pinpoints:
#188 : Doc-truthfulness gap (NEW sub-axis)
claw dump-manifests --help describes usage as optional flags, but
the verb fails without --manifests-dir or CLAUDE_CODE_UPSTREAM.
USAGE.md is correct; CLI --help output lies by omission.
This is the first doc-truth pinpoint from probe flow (vs audit flow).
New sub-axis: help text vs behavior (prior doc-truth: SCHEMAS/USAGE/README).
#189 : Classifier gap (same pattern as #186/#187)
dump-manifests --bogus-flag falls through to kind=unknown.
Should be cli_parse (like sandbox).
Now at 3 verbs in same pattern: system-prompt (#186 ), export (#187 ),
dump-manifests (#189 ). Rename bundle to feat/jobdori-186-189-classifier-sweep.
Pinpoint count: 79 filed, 65 genuinely open.
Doc-truthfulness family: 6 members (was 5).
Classifier unknown-option sub-lineage: 3 members (was 2).
Per freeze doctrine, no code changes. Doc-only filing.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
0125884a2a
roadmap( #187 ): lock framing + bundle with #186 per gaebal-gajae
...
Per gaebal-gajae cycle #106 validation pass. Two refinements:
1. #187 framing locked:
'export unknown-option errors still fall through to unknown,
unlike the already-canonical sandbox CLI-parse path.'
Surgical parallel to #186 framing (cycle #105 ):
'system-prompt unknown-option errors still fall through to unknown
instead of the existing CLI-parse classification path.'
Same pattern: verb + drift + reference path.
2. #186 and #187 bundled into feat/jobdori-186-187-classifier-sweep.
Rationale: identical fix pattern, identical test pattern, same
source file, 2x review overhead if separated.
Updated merge priority queue (gaebal-gajae reviewer-blessed):
1. feat/jobdori-181-error-envelope-contract-drift (#181 + #183 )
2. feat/jobdori-184-cli-contract-hygiene-sweep (#184 + #185 )
3. feat/jobdori-186-187-classifier-sweep (#186 + #187 )
Doctrine #27 : Same-pattern pinpoints should bundle into one classifier
sweep PR. One-pinpoint = one-branch is not universal; batching
same-pattern fixes halves review/merge overhead.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
37b9cb0011
roadmap( #187 ): file export classifier gap from cycle #106 probe
...
Cycle #106 probe of export and sandbox verbs. Found:
- export --bogus-flag: kind=unknown (should be cli_parse)
- sandbox --bogus-flag: kind=cli_parse (canonical correct)
#187 is direct sibling of #186 (system-prompt classifier gap).
Both unknown-option, both should use cli_parse classifier.
Observation: sandbox has no gaps. export has 1 classifier gap.
Suggests classifier coverage improving on newer verbs, not consistent
regression across unaudited surfaces.
Hypothesis (#104 ) partially validated: unaudited surfaces yield
pinpoints, but not uniformly. Single-issue verbs (sandbox) may be
cleaner than multi-flag verbs (export, init, bootstrap-plan).
Pinpoint count: 77 filed, 63 genuinely open.
Per freeze doctrine, no code changes. Doc-only filing.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f3f5eff232
doc(review-guide): embed gaebal-gajae authoritative state framing
...
Per gaebal-gajae cycle #105 validation pass. One-liner state summary
now appears at top (tone-setter for reviewers) and bottom (reinforced
recap):
'Phase 0 is now frozen, reviewer-mapped, and merge-ready;
Phase 1 remains intentionally deferred behind the locked priority order.'
This is the single authoritative sentence that captures branch state.
Use it for PR titles, review summaries, and Phase 1 handoff notes.
Why this framing matters (per gaebal-gajae evaluation):
- 'frozen' signals no scope creep
- 'reviewer-mapped' signals audit trail exists (this guide)
- 'merge-ready' signals gates are passed
- 'intentionally deferred' signals Phase 1 absence is by design, not omission
- 'locked priority order' signals sequencing is validated (cycle #104-#105)
Review guide now doubles as merge-enabler: reviewers parse branch state
in one sentence, then drill into commits as needed.
Doc-only. No code changes. Freeze preserved.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
85c5afa8a0
doc: add Phase 0 + dogfood bundle review guide for cycles #104-#105
...
Pre-merge documentation for reviewers. Summarizes:
- What Phase 0 tasks deliver (JSON envelope contracts, regression locks)
- Why dogfood cycles #99-#105 matter (validated methodology, 15 filed pinpoints)
- Commit-by-commit navigation for the 30-commit frozen bundle
- What lands vs what's deferred
- Integration notes for Phase 1 planning
- Known limitations + follow-ups
This is doc-only, no code changes. Serves as audit trail and reviewer
reference without adding scope to the frozen feature branch.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
a8f954c1d0
roadmap: lock merge priority for cycles #104-#105 pinpoints
...
Per gaebal-gajae cycle #105 priority pass.
Locked merge order (minimizes consumer-facing contract disruption):
1. feat/jobdori-181-error-envelope-contract-drift (#181 + #183 bundled)
2. feat/jobdori-184-cli-contract-hygiene-sweep (#184 + #185 bundled)
3. feat/jobdori-186-system-prompt-classifier (#186 standalone)
Rationale: foundation → extensions → cleanup ordering.
- #181 first: canonical error envelope established (1 shape change)
- #184/#185 second: use existing envelope (0 shape changes)
- #186 third: classifier branch add (1 classifier change)
Total: 1 shape + 1 classifier change across 3 merges.
Doctrine #25 : Contract-surface-first ordering. Foundation layer before
extending guards before refinement cleanup.
Still-deferred pinpoints explicitly mapped with dependencies:
#173 , #174 , #177/#178/#179, #180 , #182 , #175 .
Branch now at 30 commits, 227/227 tests.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
e32bf3d397
roadmap(#184-#186): lineage corrections + reference implementation lock
...
Per gaebal-gajae cycle #105 review pass. Three corrections:
1. #184/#185 belong to #171 lineage (CLI contract hygiene sub-family),
NOT a new family. Same enforcement hole pattern on unaudited verbs.
2. #186 locked as member of #169/#170 classifier lineage. Framing:
'system-prompt unknown-option errors still fall through to unknown
instead of the existing CLI-parse classification path.'
3. agents is the #183 reference implementation. Fix path reframed from
'design new contract' to 'align outliers to existing reference'.
Much smaller scope for feat/jobdori-181-error-envelope-contract-drift.
Canonical reference shape locked:
{action: 'help', kind: <verb>, unexpected: <bad-name>, usage: {...}}
Doctrine #24 : Pinpoint lineage continuity. Check existing family
before creating new. Reviewers follow pattern lineages.
Family tree corrected: CLI contract hygiene moved from 'NEW' to
'#171 sub-lineage within classifier family'.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
23915fc666
roadmap( #184 , #185 , #186 ): file CLI contract hygiene gaps in unaudited verbs
...
Cycle #105 probe of agents/init/bootstrap-plan/system-prompt verbs
(unaudited per cycle #104 hypothesis) yielded 3 pinpoints:
#184 : claw init silently accepts unknown positional arguments. Inconsistent
with #171 CLI contract hygiene pattern.
#185 : claw bootstrap-plan silently accepts unknown flags. Same family as
#184 , different verb, different surface.
#186 : claw system-prompt --<unknown> classified as 'unknown' instead of
'cli_parse'. Classifier family member (#182-style).
Bonus observation (not filed): claw agents bogus-action emits the
canonical mcp-style {action: help, unexpected, usage} shape. This is
the shape that #183 wants as canonical, NOT the plugins-style success
envelope. agents is the reference implementation.
Hypothesis validated: unaudited verb surfaces have 2-3x higher pinpoint
yield. Predicted cycle #104-#105 pattern holds.
Pinpoint count: 76 filed, 62 genuinely open.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
d28ebd7fad
roadmap(#181/#182/#183): lock reviewer-ready framings per gaebal-gajae
...
Final framing pass for cycle #104 plugin lifecycle pinpoints. Three
one-liner framings captured for reviewer consumption:
#181 (HIGH): 'plugins unknown-subcommand errors currently emit on the
success path instead of the JSON error path.'
#183 (HIGH): 'Invalid subcommand handling is not normalized across
plugins and mcp JSON surfaces.'
#182 (MEDIUM): 'Plugin lifecycle failures still fall through to unknown
instead of canonical error kinds.'
Branch sequencing locked:
1. feat/jobdori-181-error-envelope-contract-drift (bundles #181+#183)
2. feat/jobdori-182-plugin-classifier-alignment (#182 , post-merge)
Rationale: #181 is root bug, #183 is sibling symptom, #182 is cleanup
that benefits from clean error envelope landing first.
Branch at 27 commits, 227/227 tests, review-ready.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
99c29790d9
roadmap(#181-framing, #182-correction): lock framing + correct enum proposal
...
Per gaebal-gajae cycle #104 framing + severity pass. Three changes:
1. #181 framing locked: 'plugins unknown-subcommand errors are emitted
through the success envelope instead of the JSON error envelope.'
2. #181 + #183 consolidated into 'error envelope contract drift' family.
Proposed bundled branch: feat/jobdori-181-error-envelope-contract-drift.
3. #182 scope correction (IMPORTANT): I proposed new kind 'plugin_not_found'
without verifying SCHEMAS.md enum. Per gaebal-gajae: 'existing contract
alignment > new enum proposal'.
Corrected mapping:
- plugins install /nonexistent → filesystem (existing enum value)
- plugins enable nonexistent → runtime (safest existing value)
- plugin_not_found proposal deferred pending explicit schema update
Doctrine lesson: enum proposal requires SCHEMAS.md baseline check first.
Severity-ordered merge plan (per gaebal-gajae):
1. #181 (HIGH) - contract bug
2. #183 (HIGH) - contract drift
3. #182 (MEDIUM) - classifier alignment
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
ae7a455aa2
roadmap( #181 , #182 , #183 ): file plugin lifecycle axis pinpoints
...
Cycle #104 probe of plugin lifecycle axis (claw plugins + mcp subcommands)
yielded 3 related gaps:
#181 : plugins bogus-subcommand returns SUCCESS-shaped envelope with
error buried in 'message' text field. Consumer parsing via
type=='error' check treats it as success. Severe.
#182 : plugins install/enable not-found errors classified as 'unknown'
instead of 'plugin_not_found' or 'not_found'. Classifier family member.
#183 : plugins and mcp emit DIFFERENT shapes on unknown subcommand.
plugins has reload_runtime+target+message, mcp has unexpected+usage.
Shape parity gap.
All three filed only per freeze doctrine. Proposed separate branches:
- feat/jobdori-181-unknown-subcommand-error-routing (#181 + #183 bundled)
- feat/jobdori-182-plugin-not-found-classifier (#182 standalone)
Pinpoint count: 73 filed, 59 genuinely open. Typed-error family: 14
members. Emission routing family: 1 new member (#181 ).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
51afd203d1
roadmap(#180-framing): lock authoritative framing + branch name
...
Per gaebal-gajae cycle #103 framing pass. Captures narrative choice +
reality divergence in one line.
Framing: 'USAGE.md currently teaches entry modes, but not the actual
standalone command surface exposed by claw --help.'
Locks branch name: feat/jobdori-180-usage-standalone-surface
Next-branch prep steps documented so post-168c-merge execution is
zero-friction.
Three-stage pinpoint discipline validated again: filing (cycle #103
primary) → framing (cycle #103 addendum) → prep (execution checklist).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
099585f2ad
roadmap( #180 ): file USAGE.md verb coverage gap
...
Cycle #103 doc-truthfulness audit found USAGE.md incomplete.
Actual CLI has 14 standalone verbs (status, doctor, mcp, skills, agents,
export, init, sandbox, system-prompt, bootstrap-plan, dump-manifests,
help, version, acp).
USAGE.md covers only 3 entry modes (claw REPL, claw prompt TEXT,
claw --resume). Other verbs absent or underdocumented.
Example: USAGE.md says 'start claw, then /doctor' but doesn't explain
that 'claw doctor' is also a standalone entry point (no REPL needed).
Fix: Add 'Standalone commands' section to USAGE.md with all 14 verbs
documented. Include regression test (grep USAGE.md for each verb).
Doc-truthfulness family: #76 , #79 , #82 , #172 , #180 .
Pinpoint count: 70 filed, 56 genuinely open.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
aa9baf1a1b
roadmap( #179 ): file missing SKILL.md validation gap as separate pinpoint
...
Per gaebal-gajae cycle #102 refinement. Originally tangled into #177
filing but properly belongs as distinct pinpoint.
Taxonomy:
- #177 : nonexistent path → filesystem kind
- #178 : export enum drift → filesystem canonical
- #179 : missing SKILL.md → parse/validation kind (this filing)
Family renamed per gaebal-gajae: 'resource / install-surface error
taxonomy gap' (was 'filesystem error family'). Better captures that
not all gaps in this cluster are filesystem-rooted.
Proposed branch bundle: feat/jobdori-177-install-surface-taxonomy
covers all three as coordinated taxonomy sweep.
Pinpoint count: 69 filed, 55 genuinely open.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
0d4f334059
roadmap( #175 ): file gaebal-gajae's CI fmt/test signal decoupling framing + resolve numbering collision
...
#175 numbering collision between:
- gaebal-gajae's CI framing (filed at ~10:00 via Discord verbally)
- my filesystem classifier filing (#175 per cycle #102 10:02)
Resolution:
- gaebal-gajae's framing reclaims #175 (higher-level workflow gap)
- My filesystem classifier renumbered to #177
- My export enum naming renumbered to #178
All three pinpoints now filed with correct non-colliding numbers:
- #175 : CI fmt/test signal decoupling (gaebal-gajae)
- #177 : skills install filesystem classifier (Jobdori, was #175 )
- #178 : export kind naming consistency (Jobdori, was #176 )
Typed-error family membership updated accordingly.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
df3640c1d3
roadmap( #175 , #176 ): file filesystem error classifier gaps
...
Cycle #102 probe of model/skills/export axis found two related gaps:
#175 : skills install filesystem errors classified as 'unknown' instead of
'filesystem' (which is in v1.5 enum).
#176 : export uses 'filesystem_io_error' kind but this is NOT in v1.5
declared enum (which only lists 'filesystem'). Inconsistent naming.
Both filed only per freeze doctrine. Proposed bundling as
feat/jobdori-175-filesystem-error-family branch.
Family observation: classifier + enum-naming gaps found simultaneously
in filesystem-error axis. Indicates broader unaudited surface.
Pinpoint count: 68 filed, 54 genuinely-open.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
88aaf88343
roadmap(#174-framing): lock authoritative framing + branch name
...
Per gaebal-gajae cycle #101 framing pass. Adds stable framing that
captures scope + root cause + visible effect + surface in one line.
Locks branch name: feat/jobdori-174-resume-trailing-cli-parse
Next-branch prep steps documented so post-168c-merge execution is
zero-friction (classifier branch + regression test pattern already
established by #169/#170/#171).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
b7a01f2e3f
roadmap( #174 ): file --resume trailing args classifier gap
...
Cycle #101 probe of session-boot axis (prompt misdelivery / resume
lifecycle) found another typed-error classifier gap.
Filed only, not fixed. Per freeze doctrine (cycles #98-#100), no new
code axis added to feat/jobdori-168c-emission-routing.
Pattern: `--resume trailing arguments must be slash commands` classified
as 'unknown' instead of 'cli_parse'. Side effect: #247 hint synthesizer
doesn't trigger, so hint is null.
Same family as #169 , #170 , #171 (classifier coverage gaps).
Proposed fix: add `--resume trailing arguments` pattern to
classify_error_kind as cli_parse.
Pinpoint count: 66 filed, 52 genuinely-open + #174 new.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
9d4e996a7c
roadmap( #173 ): file structured-output hint parity gap
...
Cycle #100 probe of non-classifier axes (event/log opacity) found new
consumer parity gap: JSON mode missing 'hint' field that text mode
provides for config_load_error scenarios.
Filed only, not fixed. Per freeze doctrine (cycles #98-#99), no new axis
added to feat/jobdori-168c-emission-routing. This pinpoint is a Phase 1
scope candidate for a separate branch.
Affects: claw mcp, claw status, claw doctor (JSON mode).
Text mode shows: Hint `claw doctor` classifies config parse errors...
JSON mode shows: no hint field at all.
Consumer impact: claws parsing JSON output can't programmatically route
errors to recovery paths the way text-mode users can with human guidance.
Family: Consumer parity. Related: #247 (hint synthesizer), #169-#172
(classifier family), #172 (doc-truthfulness).
Proposed fix: add 'hint' field to JSON envelope when config_load_error
is present, with hint taxonomy for typed dispatch.
Pinpoint count: 65 filed, 51 genuinely-open + #173 new.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f0ab745042
docs( #99 ): checkpoint artifact — bundle status and Phase 1 readiness
...
Cycle #99 (10-min dogfood cycle). No new pinpoint filed. Instead, documented
current branch state via checkpoint artifact.
Branch: feat/jobdori-168c-emission-routing @ 15 commits across 5 axes
- Phase 0 (emission): 4 commits, complete
- Discoverability: 4 commits, complete
- Typed-error: 6 commits, complete
- Doc-truthfulness: 2 commits, complete
- Deferred: #141 (list-sessions --help routing, parser scope)
Tests: 227/227 pass, zero regressions, steady 11-cycle run
Checkpoint summarizes:
1. Work axes breakdown + pinpoint mapping
2. Cycle velocity (11 cycles, ~90 min, 6 pinpoints closed)
3. Branch deliverables (4 consumer-facing value propositions)
4. Readiness assessment (ready for review, awaiting signal)
5. Doctrine observations (probe pivot works, regression guards stick)
No code changes; doc-only. This checkpoint bridges cycles #89-#99 and marks
the branch as review-ready pending coordination signal.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
228ac3324a
roadmap( #172 ): file + close doc-vs-reality gap — action field inventory count
...
Cycle #98 probe of non-classifier axes found documentation truthfulness
gap in SCHEMAS.md v1.5 Emission Baseline.
#172 closed by commit ce352f4 (same branch, same cycle).
Part of doc-truthfulness family (#76 , #79 , #82 ).
Completes SCHEMAS.md truthfulness trifecta:
- Cycle #91 : Baseline documentation (13 verbs)
- Cycle #92 : Shape parity guard (10 cases)
- Cycle #98 : Phase 1 target count locked (3 verbs, 11 assertions)
Pinpoint count: 64 filed, 51 genuinely-open + #172 closed this cycle.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
5f0517df63
docs( #172 ): correct action-field inventory claim (4 → 3 verbs) + regression guard
...
Pinpoint #172 : SCHEMAS.md v1.5 Emission Baseline documentation inaccuracy
discovered during cycle #98 probe.
The Phase 1 normalization targets section claimed:
"unify where `action` field appears (only in 4 inventory verbs)"
But reality is only 3 inventory verbs have `action`:
- mcp
- skills
- agents
list-sessions uses `command` instead (the documented 1-of-13 deviation
already captured elsewhere in v1.5 baseline).
This is a doc-truthfulness issue (same family as cycles #76 , #79 , #82 ).
Active misdocumentation leads downstream consumers to assume 4-verb
coverage when building adapters/dispatchers.
Changes:
1. SCHEMAS.md: 'only in 4 inventory verbs' → 'only in 3 inventory verbs: mcp, skills, agents'
2. Added regression test `v1_5_action_field_appears_only_in_3_inventory_verbs_172`
- Asserts mcp/skills/agents HAVE action field
- Asserts help/version/doctor/status/sandbox/system-prompt/bootstrap-plan/list-sessions do NOT have action field
- Forces SCHEMAS.md + binary to stay synchronized
Test added:
- `v1_5_action_field_appears_only_in_3_inventory_verbs_172` (8 negative cases + 3 positive cases)
Tests: 227/227 pass (+1 from #172 ).
Related: #155 (doc parity family), #168c (emission baseline).
Doc-truthfulness family: #76 , #79 , #82 , #172 .
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
41618e56fc
roadmap( #171 ): file + close classifier gap for unexpected extra arguments
...
Cycle #97 probing #141 surface found additional classifier gap.
#171 closed by commit fbb0ab4 (same branch, same cycle).
Part of typed-error family (#121 , #127 , #129 , #130 , #164 , #169 , #170 , #247 ).
#141 (list-sessions --help doesn't show help) remains open — requires
separate parser fix for --help-as-distinct-path logic.
Pinpoint count: 63 filed, 51 genuinely-open + #171 classifier closed.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
ce9d220e28
fix( #171 ): classify unexpected extra arguments errors as cli_parse
...
Pinpoint #171 : typed-error classifier gap discovered during #141 probe cycle #97 .
`claw list-sessions --help` emits:
error: unexpected extra arguments after `claw list-sessions`: --help
This format is used by multiple verbs that reject trailing positional args:
- list-sessions
- plugins (subcommands)
- config (subcommands)
- diff
- load-session
Before fix:
{"error": "unexpected extra arguments after `claw list-sessions`: --help",
"hint": null,
"kind": "unknown",
"type": "error"}
After fix:
{"error": "unexpected extra arguments after `claw list-sessions`: --help",
"hint": "Run `claw --help` for usage.",
"kind": "cli_parse",
"type": "error"}
The pattern `unexpected extra arguments after \`claw` is specific enough
that it won't hijack generic prose mentioning "unexpected extra arguments"
in other contexts (sanity test included).
Side benefit: like #169/#170, correctly classified cli_parse errors now
auto-trigger the #247 hint synthesizer.
Related #141 gap not yet closed: `claw list-sessions --help` still errors
instead of showing help (requires separate parser fix to recognize --help
as a distinct path). This classifier fix at least makes the error surface
typed correctly so consumers can distinguish "parse failure" from "unknown"
and potentially retry without the --help flag.
Test added:
- `classify_error_kind_covers_unexpected_extra_args_171` (4 positive cases
+ 1 sanity guard)
Tests: 226/226 pass (+1 from #171 ).
Typed-error family: #121 , #127 , #129 , #130 , #164 , #169 , #170 , #247 .
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
53ae0c081d
roadmap( #153 ): file + close pinpoint — binary PATH instructions + verification bridge
...
Cycle #96 dogfood found practical install-experience gap in USAGE.md.
#153 closed by commit 6212f17 (same branch, same cycle).
Part of discoverability family (#155 , help/USAGE parity).
Pinpoint count: 62 filed, 51 genuinely-open + #153 closed this cycle.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
caf600a655
docs( #153 ): add binary PATH installation instructions and verification steps
...
Pinpoint #153 closure. USAGE.md was missing practical instructions for:
1. Adding the claw binary to PATH (symlink vs export PATH)
2. Verifying the install works (version, doctor, --help)
3. Troubleshooting PATH issues (which, echo $PATH, ls -la)
New subsections:
- "Add binary to PATH" with two common options
- "Verify install" with post-install health checks
- Troubleshooting guide for common failures
Target audience: developers building from source who want to run `claw`
from any directory without typing `./rust/target/debug/claw`.
Discovered during cycle #96 dogfood (10-min reminder cycle).
Tests: 225/225 still pass (doc-only change).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
6604429dad
roadmap( #170 ): file + close 4 additional classifier gaps + doc-vs-reality meta-observation
...
Cycle #95 dogfood probe validated #169 doctrine by finding 4 more gaps.
Meta-observation noted: #169 comment claimed to cover --permission-mode
bogus but actual string pattern differs. Lesson for future classifier
patches: comments name EXACT matched substring, not aspirational coverage.
New kind introduced: slash_command_requires_repl (for interactive-only
slash-command misuse).
Pinpoint count: 62 filed, 52 genuinely-open + #170 closed this cycle.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
ebcc0192ca
fix( #170 ): classify 4 additional flag-value/slash-command errors as cli_parse / slash_command_requires_repl
...
Pinpoint #170 : Extended typed-error classifier coverage gap discovered during
dogfood probe 2026-04-23 07:30 Seoul (cycle #95 ).
The #169 comment claimed to cover `--permission-mode bogus` via the
`unsupported value for --` pattern, but the actual `parse_permission_mode_arg`
message format is `unsupported permission mode 'bogus'` (NO `for --` prefix).
Doc-vs-reality lie in the #169 fix itself — fixed here.
Four classifier gaps closed:
1. `unsupported permission mode '<value>'` → cli_parse
(from: `parse_permission_mode_arg`)
2. `invalid value for --reasoning-effort: '<value>'; must be ...` → cli_parse
(from: `--reasoning-effort` validator)
3. `model string cannot be empty` → cli_parse
(from: empty --model rejection)
4. `slash command /<name> is interactive-only. Start \`claw\` ...` →
slash_command_requires_repl (NEW kind — more specific than cli_parse)
The fourth pattern gets its own kind (`slash_command_requires_repl`) because
it's a command-mode misuse, not a parse error. Downstream consumers can
programmatically offer REPL-launch guidance.
Side benefit: like #169 , the correctly classified cli_parse errors now
auto-trigger the #247 hint synthesizer ("Run `claw --help` for usage.").
Test added:
- `classify_error_kind_covers_flag_value_parse_errors_170_extended`
(4 positive cases + 2 sanity guards)
Tests: 225/225 pass (+1 from #170 ).
Typed-error family: #121 , #127 , #129 , #130 , #164 , #169 , #247 .
Discovered via systematic probe angle: 'error message pattern audit' \u2014
grep each error emission for pattern, confirm classifier matches.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
a9770c463d
roadmap( #169 ): file + close pinpoint — invalid CLI flag values now classify as cli_parse
...
Documents #169 discovery during dogfood probe 2026-04-23 07:00 Seoul.
Pinpoint #169 closed by commit 834b0a9 (same branch, same cycle).
Part of typed-error family (#121 , #127 , #129 , #130 , #164 , #247 ).
Pinpoint count: 61 filed, 52 genuinely-open + 1 closed in this cycle.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
3f3c639258
fix( #169 ): classify invalid/missing CLI flag values as cli_parse
...
Pinpoint #169 : typed-error classifier gap discovered during dogfood probe.
`claw --output-format json --output-format xml doctor` was emitting:
{"error": "unsupported value for --output-format: xml ...",
"hint": null,
"kind": "unknown",
"type": "error"}
After fix:
{"error": "unsupported value for --output-format: xml ...",
"hint": "Run `claw --help` for usage.",
"kind": "cli_parse",
"type": "error"}
The change adds two new classifier branches to `classify_error_kind`:
1. `unsupported value for --` → cli_parse
2. `missing value for --` → cli_parse
Covers all `CliOutputFormat::parse` / `parse_permission_mode_arg` rejections
and any future flag-value validation messages using the same pattern.
Side benefit: the #247 hint synthesizer ("Run `claw --help` for usage.")
now triggers automatically because the error is now correctly classified
as cli_parse. Consumers get both correct kind AND helpful hint.
Test added:
- `classify_error_kind_covers_flag_value_parse_errors_169` (4 positive +
1 sanity case)
Tests: 224/224 pass (+1 from #169 ).
Discovered during dogfood probe 2026-04-23 07:00 Seoul, cycle #94 .
Refs: #169 , typed-error family (#121 , #127 , #129 , #130 , #164 , #247 )
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
27318dacd8
docs( #155 ): add missing slash command documentation to USAGE.md
...
Pinpoint #155 : USAGE.md was missing documentation for three interactive
commands that appear in `claw --help`:
- /ultraplan [task]
- /teleport <symbol-or-path>
- /bughunter [scope]
Also adds full documentation for other underdocumented commands:
- /commit, /pr, /issue, /diff, /plugin, /agents
Converts inline sentence list into structured section 'Interactive slash
commands (inside the REPL)' with brief descriptions for each command.
Closes #155 gap: discovered during dogfood probing of help/USAGE parity.
No code changes. Pure documentation update.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
064ac2c95c
test(#168c Task 4): add v1.5 emission baseline shape parity guard
...
Phase 0 Task 4 of the JSON Productization Program: CI shape parity guard.
This test locks the v1.5 emission baseline (documented in SCHEMAS.md § v1.5
Emission Baseline) so any future PR that introduces shape drift in a documented
verb fails this test at PR time.
Complements Task 2 (no-silent guarantee) by asserting SPECIFIC top-level key
sets, not just 'stdout is non-empty valid JSON'. If a verb adds/removes a
top-level field, this test fails with a clear error message pointing to
SCHEMAS.md § v1.5 Emission Baseline for update guidance.
Coverage:
- 8 success-path verbs with locked shape (help, version, doctor, skills,
agents, system-prompt, bootstrap-plan, list-sessions)
- 2 error-path cases with locked error envelope shape (prompt-no-arg, doctor --foo)
Key enforcement rules:
- Success envelope: exact key set match per verb
- Error envelope: {error, hint, kind, type} (4 keys, all verbs)
- list-sessions deliberately kept as {command, sessions} (Phase 1 target)
Test design intent:
- Locks CURRENT (possibly imperfect) shape, NOT target shape
- Forces PR authors to update both code + SCHEMAS.md + test together
- Makes Phase 1 shape normalization PRs visible: 'update this test'
Phase 0 now COMPLETE:
- Task 1 ✅ Stream routing fix (cycle #89 )
- Task 2 ✅ No-silent guarantee (cycle #90 )
- Task 3 ✅ Per-verb emission inventory SCHEMAS.md (cycle #91 )
- Task 4 ✅ CI shape parity guard (this cycle)
Tests: 18 output_format_contract tests all pass (+1 from Task 4).
v1.5 emission baseline now locked by code + tests + docs.
Refs: #168c, cycle #92 , Phase 0 Task 4 (final)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
b076e8736e
docs(#168c Task 3): add v1.5 Emission Baseline per-verb shape catalog to SCHEMAS.md
...
Phase 0 Task 3 of the JSON Productization Program: per-verb emission inventory.
Documents the actual binary behavior as of v1.5 (post-#168c fix, pre-Phase 1
shape normalization). Reference artifact for consumers building against v1.5,
not a target schema.
Catalog contents:
- 12 verbs using 'kind' field (help, version, doctor, mcp, skills, agents,
sandbox, status, system-prompt, bootstrap-plan, export, acp)
- 1 verb using 'command' field (list-sessions) — Phase 1 normalization target
- 3 error-only verbs in test env (bootstrap, dump-manifests, state)
- Standard error envelope: {error, hint, kind, type} flat shape
- 9 machine-readable error kinds from classify_error_kind
Emission contract locked by:
- Task 1 (#168c routing fix, cycle #89 )
- Task 2 (no-silent guarantee test, cycle #90 )
- This catalog (human-readable reference, cycle #91 )
Consumer guidance + Phase 1 normalization targets documented.
Phase 0 progress:
- Task 1 Stream routing fix
- Task 2 No-silent guarantee test
- Task 3 Per-verb emission inventory
- Task 4 pending: CI parity test
Refs: #168c, cycle #91 , Phase 0 Task 3
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
e7ed973aed
test(#168c Task 2): add no-silent emission contract guard for 14 verbs
...
Phase 0 Task 2 of the JSON Productization Program: no-silent guarantee.
The emission contract under --output-format json requires:
1. Success (exit 0) must produce non-empty stdout with valid JSON
2. Failure (exit != 0) must still emit JSON envelope on stdout (#168c)
3. Silent success (exit 0 + empty stdout) is forbidden
This test iterates 12 safe-success verbs + 2 error cases, asserting each
produces valid JSON on stdout. Any verb that regresses to silent emission
or wrong-stream routing will fail this test.
Covered verbs:
- Success: help, version, list-sessions, doctor, mcp, skills, agents,
sandbox, status, system-prompt, bootstrap-plan, acp
- Error: prompt (no arg), doctor --foo
Phase 0 progress:
- Task 1 ✅ Stream routing (#168c fix)
- Task 2 ✅ No-silent guarantee (this test)
- Task 3 ⏳ Per-verb emission inventory (SCHEMAS.md)
- Task 4 ⏳ CI parity test (regression prevention)
Tests: 17 output_format_contract tests all pass (+1 from Task 2).
Refs: #168c, cycle #90 , Phase 0 Task 2
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
960290a2f3
fix(#168c): emit error envelopes to stdout under --output-format json
...
Under --output-format json, error envelopes were emitted to stderr via
eprintln!. This violated the emission contract: stdout should carry the
contractual envelope (success OR error); stderr is reserved for
non-contractual diagnostics.
Cycle #87 controlled matrix audit found bootstrap/dump-manifests/state
exhibited this pattern (exit 1, stdout 0 bytes, stderr N bytes under
--output-format json).
Fix: change eprintln! to println! for the JSON error envelope path in main().
Text mode continues to route errors to stderr (conventional).
Verification:
- bootstrap --output-format json: stdout now carries envelope, exit 1
- dump-manifests --output-format json: stdout now carries envelope, exit 1
- Text mode: errors still on stderr with [error-kind: ...] prefix (no regression)
Tests:
- Updated assert_json_error_envelope helper to read from stdout (was stderr)
- Added error_envelope_emitted_to_stdout_under_output_format_json_168c
regression test that asserts envelope on stdout + non-JSON on stderr
- All 16 output_format_contract tests pass
Phase 0 Task 1 complete: emission routing fixed across all error-path verbs.
Phase 0 Task 2 (no-silent CI guarantee) remains.
Refs: #168c (cycle #87 filing), cycle #88 emission contract framing
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
8307715962
roadmap: Phase 0 locked as 'JSON emission baseline stabilization' (cycle #88 )
...
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
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
d1360778cf
roadmap: #168 split into #168a/#168b/#168c after controlled matrix audit (cycle #87 )
...
Controlled matrix (/tmp/cycle87-audit/matrix.json) tested 16 verbs x 2 envs = 32 cases.
Results:
- #168a CONFIRMED: per-command shape divergence real (13 unique shapes across 13 verbs)
- #168b REFUTED: bootstrap does NOT silent-fail. Exit=1 stderr=483 bytes (not silent).
Cycle #84 misread exit code (claimed 0, actually 1) and missed stderr output.
- #168c NEW: bootstrap/dump-manifests/state write plain stderr under --output-format json
Phase 0 reworded: 'Fix bootstrap silent failure' (inaccurate) → 'Controlled JSON
baseline audit + minimum invariant normalization' (accurate).
Concrete Phase 0 work (1.5 days):
- Normalize list-sessions 'command' → 'kind' (align with 12/13 verbs)
- Normalize stderr output to JSON for bootstrap/dump-manifests/state
- Document v1.5 baseline shape catalog in SCHEMAS.md
- Add shape parity CI test
Controlled revalidation (per gaebal-gajae cycle #87 direction) prevented Phase 0
from being anchored to a refuted bug. #168b is now closed as refuted; #168a and
#168c are the actual Phase 0 targets.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
becdb8ab7b
roadmap: #168b filed — cycle #86 fresh-dogfood contradicts cycle #84 bootstrap claim (revalidation)
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
e6dff38490
roadmap: promote #164 from locus to 'JSON Productization Program' (cycle #85b)
...
gaebal-gajae review reframed the work: this is not 'schema drift management'
but a 'JSON productization program' — taking JSON output from bespoke/incoherent
to reliable/contractual as a product.
Promotion trigger: Fresh-dogfood evidence (#168 ) proved v1.0 was never coherent.
Migration isn't just schema change; it's productizing JSON output.
Program structure:
- Phase 0: Emergency stabilization (fix #168 bootstrap silent failure)
- Phase 1: v1.5 baseline (normalize invariants across all 14 verbs)
- Phase 2: v2.0 opt-in wrapped envelope
- Phase 3: v2.0 default
- Phase 4: v1.0/v1.5 deprecation
Umbrellas 9+ related pinpoints under coordinated program (#164 , #167 , #168 ,
#102 , #121 , #127 , #129 , #130 , #245 ).
Program doctrine locked:
1. Fresh-dogfood before migration
2. Honest effort estimates
3. Consumer-first design
4. Evidence-driven revision
5. Documentation as product
Next concrete action: Phase 0 — implement #168 bootstrap JSON fix.
Success metric: A claw can write ONE parser for ALL clawable commands.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
054f6b2205
locus( #164 ): add Phase 0 + v1.5 baseline; revised from 2-phase to 4-phase migration (cycle #85 )
...
Fresh-dogfood validation (cycle #84 , #168 ) proved the original locus premise was
underspecified. v1.0 was never a coherent contract — each verb has a bespoke JSON
shape with no coordination, and bootstrap JSON is completely broken (silent
failure, exit 0 no output).
Revised migration plan:
- Phase 0 (NEW): Emergency fix for silent failures (#168 bootstrap JSON)
- Phase 1 (NEW): v1.5 baseline — minimal JSON invariants across all 14 verbs
- Every command emits valid JSON with --output-format json
- Every command has top-level 'kind' field for verb ID
- Every error envelope follows {error, hint, kind, type}
- Phase 2 (renamed from Phase 1): v2.0 wrapped envelope (opt-in)
- Phase 3 (renamed from Phase 2): v2.0 default
- Phase 4 (renamed from Phase 3): v1.0/v1.5 deprecation
Rationale:
- Can't migrate from 'incoherent' to 'coherent v2.0' in one jump
- Consumers need stable target (v1.5) to transition from
- Silent failures must be fixed BEFORE migration (consumers can't detect breakage)
Effort revision: ~9 dev-days (Phase 0: 1 + Phase 1: 3 + Phase 2: 5) vs original
~6 dev-days for direct v1.0→v2.0 (which would have failed).
Doctrine implication: Fresh-dogfood principle (#9 , cycle #73 ) prevented a multi-day
migration from hitting an unsolvable baseline problem. Evidence-backed mid-design
correction.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
cc7bbedef2
roadmap: #168 filed — JSON envelope shape inconsistent per-command; bootstrap broken (cycle #84 )
...
Fresh dogfood validation (cycle #84 ) revealed the binary v1.0 envelope is NOT
consistent across commands:
- list-sessions: {command, sessions}
- doctor: {checks, kind, message, ...}
- bootstrap: (no JSON output at all)
- mcp: {action, kind, status, ...}
Each command has a custom JSON shape. Bootstrap's JSON path is completely broken
(exit 0 but no output). This is not 'v1.0 vs v2.0 design difference' — it's
'no consistent v1.0 ever existed'.
This explains why #164 (envelope migration) is blocked on design: the 'v1.0 from'
was never coherent. The real task is not 'migrate v1.0 to v2.0' but 'migrate
incoherent-per-command shapes to coherent-common-envelope'.
Implications for cycles #76–#82: The P0 doc fixes were correct to mark SCHEMAS.md
as 'aspirational' because the binary never had a consistent contract to document.
The deeper issue: each verb renderer was written independently with no envelope
coordination.
Three options proposed:
- A: accept per-command shapes (status quo + documentation)
- B: enforce common wrapper (FIX_LOCUS_164 full approach)
- C: hybrid (document current incoherence, then migrate 3 pilot verbs)
Recommendation: Option C. Documents truth immediately, enables phased migration.
This filing resolves the #164 design blocker: now we understand what we're
migrating from.
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
f63531b818
roadmap: #167 filed — text output format has no contract (cycle #83 )
...
SCHEMAS.md locks JSON envelope contract for all 14 clawable commands.
No corresponding contract for text output (--output-format text).
Text output is ad hoc per-command: no documented format, no column ordering
guarantee, no stability contract. Claws parsing text output have no safety.
Filed as discovery gap from systematic doc audit (cycle #83 ). Design options:
- Option A: Document text contracts (parallel to JSON) — 4 dev-days
- Option B: Declare text unstable, point to JSON — 1 dev-day (recommended)
- Option C: Defer until post-#164 JSON migration
Related to #164 (JSON migration) and #250 (surface parity audit).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
440bb8b073
roadmap: #166 closed — SCHEMAS.md source misdoc fixed (P0 root cause)
...
The aspirational SCHEMAS.md doc (v2.0 target) was the source of truth misdocumentation.
Three downstream docs (USAGE, ERROR_HANDLING, CLAUDE) inherited the false claim that
v1.0 binary emits common fields it doesn't actually emit.
Fixing SCHEMAS.md at the source eliminates the root cause for all four P0 instances.
Doc-truthfulness P0 family now complete: 4/4 closed, root cause identified + fixed.
All fixes shipped within 6 cycles (#76 audit → #82 execution).
2026-04-26 18:02:59 +09:00
YeonGyu-Kim
29c226cfee
docs: SCHEMAS.md — critical P0 fix: mark as target v2.0, not current v1.0 ( #166 filed+closed)
...
SCHEMAS.md was presenting the target v2.0 schema as the current binary contract.
This is the source of truth document, so the misdocumentation propagated to every
downstream doc (USAGE.md, ERROR_HANDLING.md, CLAUDE.md all inherited the false
premise that v1.0 includes timestamp/command/exit_code/etc).
Fixed with:
1. CRITICAL header at top: marks entire doc as v2.0 target, not v1.0 reality
2. 'TARGET v2.0 SCHEMA' headers on Common Fields section
3. Comprehensive Appendix: v1.0 actual shape + migration timeline + v1.0 code example
4. Links to FIX_LOCUS_164.md + ERROR_HANDLING.md for v1.0 reality
5. FAQ: clarifies the version mismatch and when v2.0 ships
This closes the fourth P0 doc-truthfulness instance (4/4 in family):
- #78 USAGE.md: active misdocumentation (fixed #78 )
- #79 ERROR_HANDLING.md: copy-paste trap (fixed #79 )
- #165 CLAUDE.md: boundary collapse (fixed #81 )
- #166 SCHEMAS.md: aspirational source doc (fixed #82 )
Pattern is now crystallized: SCHEMAS.md was the aspirational source;
three downstream docs (USAGE, ERROR_HANDLING, CLAUDE) inherited the false v2.0-as-v1.0
claim. Fix the source (SCHEMAS.md), which eliminates the root cause for all four.
2026-04-26 18:02:59 +09:00