Description
internal/model already carries a scaffolded Session/Turn/Item. Every decoder and every sink depends on it alone, so it has to be correct and complete before parallel work starts; changing it later invalidates every lane at once.
The contract that matters is provenance. Codex measures TTFT and per-item boundaries. Claude Code measures neither and everything comparable is derived from record write times. A duration without its Source is uninterpretable and no test catches a dashboard that averages the two.
Acceptance Criteria
- #1 Session, Turn and Item cover every field named in docs/transcript-formats.md for both tools, or the omission is recorded in the doc as deliberate
- #2 Every duration and timing is a model.Duration carrying a Source of native, derived or absent
- #3 A measured zero is distinguishable from an absent measurement for every optional numeric field
- #4 Where two sources describe one idea they are two fields; a test asserts neither overwrites the other
- #5 Unit tests cover the provenance contract and the ordinal ordering guarantee across item kinds
Definition of Done
- #1 just check passes: fmt-check, lint, build, test-short, probe-ci, dashboard-check and docs-links all clean
Final Summary
Unified Session, Turn and Item provenance contract is implemented and covered by the integrated unit suite; just check passed at 0d177e3.