The pipeline, in section.
Traces without outcomes aren't training data. Observability tools see the gateway; Sediment sees the gateway, the editor, and the CI run. It ties them together. Claude Code, Copilot, and Codex each speak their own dialect; Sediment normalizes them into one dataset. Only facts persist; everything else is recomputed from them. Four stages, one direction of flow.
01
Facts
what we captureImmutable records of what actually happened: appended, never mutated.
- completions Every gateway request/response pair
- developer decisions Accept, reject, revert: from Claude Code, Copilot, and Codex
- pushes Commits and workflow runs, straight from source control
- ci outcomes Build pass/fail for every attributed commit
- git mirror Full history per repository, including session attribution notes
02
Derivations
what we computePure functions of the facts: recomputable over all history, never a source of truth.
- correlations Each completion tied to the commit that carried it: deterministic git-notes attribution first, similarity only as fallback
- reward linkage CI outcomes attached to correlated completions
- rollouts Session trajectories with a terminal, verifiable reward
- eval split Deterministic, session-keyed holdout
03
Clean triples
the canonical artifactOne resolved record per correlated completion.
- the completion And every decision made on it
- survival evidence What happened to the code, and the reward from CI
- provenance Which derivation and policy version produced it
- split assignment Train or eval, fixed at the triple
- session rollouts The second canonical artifact: full session trajectories with their rewards · rows below
04
Projections
what we exportThin, stateless projections over triples and rollouts: plain JSONL, inside your perimeter.
- dpo pairs CI-pass set against CI-fail: same prompt, same model
- sft sets High-confidence completions that passed CI
- recovery pairs Red-to-green CI transitions, mined
- rlvr Verifiable task specs with re-runnable CI rewards, plus reward-labeled rollouts
- outcome report Which model actually performs best on your code
exhibit
The artifact
what stage 04 hands to your fine-tuning stack{"instance_id":"acme-9f41c2-seg0","turns":[{"new_messages":[{"role":"user","content":"Fix the flaky retry backoff test"}],"completion":"def test_retry_backoff():\n clock = FakeClock()\n …","decisions":[{"accepted":true,"explicit":true,"source":"claude-code","file_path":"payments/tests/test_retry.py"}]}],"terminal_outcomes":[{"result":"passed","workflow_name":"CI","commit_sha":"9f41c2e"}],"provenance":{"attribution":"notes","split":"train"}}
{"instance_id":"acme-31d8a0-seg0","turns":[{"new_messages":[{"role":"user","content":"Add retries to the webhook client"}],"completion":"class WebhookClient:\n def post(self, url, payload, retries=3):\n …","decisions":[{"accepted":false,"explicit":true,"source":"copilot","file_path":"clients/webhook.py"}]}],"terminal_outcomes":[],"provenance":{"attribution":"notes","split":"train"}}
{"instance_id":"acme-c07be4-seg0","turns":[{"new_messages":[{"role":"user","content":"Migrate the session store to SQLite"}],"completion":"*** Update File: store/session.py\n …","decisions":[{"accepted":true,"explicit":false,"source":"codex","file_path":"store/session.py"}]}],"terminal_outcomes":[{"result":"failed","workflow_name":"CI","commit_sha":"c07be44"}],"provenance":{"attribution":"notes","split":"eval"}}