Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
2.3 KiB
2.3 KiB
ADR 0001 — Codex app-server codegen: full generated surface, subset wiring
- Date: 2026-07-02
- Status: Accepted (grilling session)
- Context: protocol generation for the Codex app-server layer refactor.
Decision
Port-and-slim codex-sdk-go's internal/codegen generator into tutti's
codexproto package (design option a, not hand-written stubs and not
vendoring the SDK's generated output).
- Codegen surface = full. Generate the complete protocol surface
(~84 client methods / 8 server requests / 64 notifications) from the upstream
export, plus the unavoidable hand-maintained type supplement (cf. SDKprotocol/manual_types.go, 214 lines — go-jsonschema cannot express the whole schema). - Wiring = subset. This refactor's steps wire only the four-state-machine subset tutti actually uses today (~21 client / 4 server-req / 22 notif); the rest of the generated surface is additive and unwired (Step 1 is "purely additive").
- Full capability alignment is a direction, not this refactor's wiring scope. Keeps the design's out-of-scope boundary (fork/compact/realtime/inject_items wiring) and the one-state-machine-per-step discipline intact, while laying the generator foundation so future alignment is "re-run + wire", not "write a generator".
Why not
- (b) hand-write stubs for the subset: minimal now, but re-writing 156 stubs by hand for future full alignment and chasing every codex version bump is the exact cost a generator exists to remove.
- (c) vendor SDK's generated
protocol/+rpc/: pinned to an older codex commit (e2b60462) that lacks methods tutti already uses (collaborationMode/list), and inherits the SDK's facade opinions — contradicts D5 supply-chain stance for daemon core.
Evidence
- SDK generator is
codex-sdk-go/internal/codegen/main.go(1066 lines): runs Rustexport, feeds JSON Schema → go-jsonschema →protocol/types_gen.go(3973 lines), and separately rendersrpc/*_requests_gen.gofrom theClientRequest.json/ServerRequest.jsononeOfmethod-unions. - Generated files are stamped by codex git commit, not version string.
- tutti uses ~25% of the client surface today; 3 used methods
(
initialize,initialized,collaborationMode/list) are NOT in the SDK's generated output — version/commit skew.