Files
tutti/docs/adr/0002-codexproto-pinning-source-drift.md
agent-radar 2ed3415fb7
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
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

62 lines
3.0 KiB
Markdown

# ADR 0002 — codexproto: pinning, source acquisition, drift tolerance
- Date: 2026-07-02
- Status: Accepted (grilling session)
- Context: Step 1 codegen inputs. Corroborated by two independent real
consumers: `codex-sdk-go` (Go) and `t3code/effect-codex-app-server` (TS).
## Decisions
### Pinning (Q3-A)
- codexproto is generated against an explicit **codex git commit SHA**, stamped
into `metadata_gen.go` (cf. codex-sdk-go `Source codex commit:` and t3code
`meta.gen.ts` `Upstream protocol ref:`).
- The Step-0 runtime **binary** baseline (`codex-cli 0.142.5`) and this **source
SHA** are recorded together in the bug-corpus/baseline doc. They are distinct
axes: source SHA governs the typed surface; binary version is what the daemon
actually spawns.
### Source acquisition (Q4 → option 1)
- **Vendor the upstream _already-committed_ `schema/json/*.json` at the pinned
SHA. Do NOT run the Rust `export` bin.** The schema artifacts are tracked in
the codex repo (`git ls-files codex-rs/app-server-protocol/schema/json`), so
no Rust toolchain or local codex checkout is required.
- **Eliminates design Risk #1** ("codegen toolchain depends on the Rust export
bin"). Ops-2 becomes: vendor committed schema at pinned SHA + CI re-fetches the
same ref and diffs.
- Generator = adapted `codex-sdk-go/internal/codegen` (Go, go-jsonschema), with
its `exportSchemas` (run-Rust) step **replaced** by "read vendored JSON".
### Drift tolerance (Q3-B)
- The runtime codex binary floats (auto-updates) relative to the pinned source.
The CI drift check only catches codexproto-vs-pinned-source drift, NOT
codexproto-vs-running-binary drift.
- Therefore: generated types **allow unknown fields**, and notification/server-
request dispatch keeps an explicit **unknown-method fallback** (cf. t3code
`handleUnknownServerRequest` / `handleUnknownServerNotification`) that logs and
degrades instead of crashing. This preserves the tolerance `map[string]any`
has today. Extends the Step-4 "lossless tier / degradable events" principle
down into the decode layer.
### Manual type supplement
- A hand-maintained supplement is unavoidable and universal across consumers
(codex-sdk-go `manual_types.go` 214 lines; t3code `ManualSchemas`).
- **`collaborationMode/list` is "used-but-unexported":** tutti calls it live
(`codex_appserver_adapter.go:807`, feeding `turn/start`'s `collaborationMode`),
but it is absent from upstream `ClientRequest.json` and from both reference
consumers' generated output. It goes in tutti's manual supplement — NOT
deleted, NOT expected from the generator.
## Evidence
- `git ls-files` lists `ClientRequest.json`, `codex_app_server_protocol.schemas.json`,
`…v2.schemas.json` → schema is committed upstream.
- t3code `generate.ts`: `UPSTREAM_REF` SHA + GitHub API `?ref=` fetch of committed
JSON; `ManualSchemas`; `handleUnknown*` fallbacks.
- collaborationMode exists upstream only as a ServerNotification/ThreadSettings
field, never as a `collaborationMode/list` method.