The Derivation boundary
The Fact store contains captured Facts. It contains no chosen Attribution, edit retention score, final Fate, Reward, or Rollout. Those depend on policy and belong on the derived side. Merge retention is another diagnostic Derivation. A captured observation must first qualify the Attribution’s exact repository, commit, and Session. The Derivation then joins one pull request through the final head, captured revision heads, or exact CI evidence. It then compares the attributed addition with the final head and merged commit. It doesn’t alter a canonical artifact or supply training eligibility. A CI outcome preserves one provider run attempt and its structured evidence. Onlypassed and failed supply a binary CI verdict. Neither result proves
code quality.
CIResolutionPolicy groups attempts by provider run identity. It orders them
only by run_attempt. A null attempt sorts as 0 when mixed with numbered
attempts.
The policy never uses capture time, ingest order, URL, or generated IDs to
order attempts. A failure-then-pass retry resolves to pass. It also records
suspected-flake evidence and reliability 0.0 by default.
Infrastructure errors and other non-verdicts remain evidence without a
direction. The Fact store never records is_flake, code causality, or a
resolved Reward.
Several agreeing workflow lineages use their minimum reliability. Conflicting
workflow verdicts produce no aggregate verdict and count
ambiguous_workflow_verdicts.
Every projection recomputes this resolution from the exact immutable Facts.
sediment derive materializes that view as an immutable local build artifact.
The bundle isn’t service state and never writes results back to the Fact store.
Deleting it loses no source data. The same inputs reproduce it.
Complete evidence and resident content have different lifetimes. Compact identity
populations span the required organization scope. Content can pass through
complete dependency groups and private file-backed bundle sequences. Validation
retains every source relationship without retaining every raw payload together.
ADR 0020 defines this execution
contract and explicit capacity failures.
A coherent input view
A run holds one read-only, repeatable-read PostgreSQL snapshot while it reads Facts and the quarantine revision. Capture can continue concurrently. The run doesn’t observe Facts appended after its snapshot begins. The run also locks every relevant mirror in sorted repository order. While the Derivation holds those locks, a fetch, rename, garbage-collection action, or removal can’t change git objects or notes. Sediment counts a missing mirror as a data-quality skip. The manifest records the integer quarantine revision, the newest visible Fact timestamp asas_of, and the mirror refs used by the run. It doesn’t record a
generation timestamp, because wall-clock time isn’t a Derivation input.
Observation boundary selection and comparisons use UTC instants, including
when preloaded Facts carry repeated local times during daylight-saving changes.
Full Derivation before cohort selection
Sediment readsSEDIMENT_ORG_ID from the environment and uses that organization
as the Derivation scope. It derives the complete organization before it applies
user or time filters.
An Attributed completion qualifies through its referenced inference call.
--since is inclusive, and --until is exclusive. Both filters use
inference-call observation time.
A Rollout qualifies by time when at least one inference call in the Session
falls inside the interval. Sediment keeps the complete Rollout.
If --users is present, every inference-call user in a Rollout must appear in
the allowlist. Sediment excludes and counts a Rollout that crosses that
boundary.
If you omit --users, Sediment derives across every user in the configured
organization. Time bounds never add an implicit user filter.
One policy for both artifacts
The resolved Attribution policy feeds both Attributed completions and Rollouts. The Session-level split primitive applies the same split fraction to both artifacts. Decision attachment checks uniqueness over the supplied candidate population, then requires the Inference call and Developer decision to share organization and Session. Assembly checks organization-wide ambiguity; Rollout checks each Session independently. One policy prevents the artifacts in a bundle from carrying different Attribution or holdout semantics. The policy digest identifies the complete resolved configuration, including defaults. Provenance carries the implementation version, integer quarantine revision, and complete resolved-policy digest:Train and evaluation isolation
A split divides rows into training and evaluation partitions. Training rows can influence model weights. Evaluation rows stay held out so they can measure behavior that training didn’t expose. Sediment supports one split rule: it hashes the Session identifier. Every row from one Session stays in one partition across Attributed completions and Rollouts. This rule prevents shared message prefixes and other near-duplicate rows from one workflow from crossing the boundary. Holdout boundaries differ by the identity that must remain on one side:
Task identity is study-specific. A task-keyed pilot therefore belongs in its
versioned benchmark manifest, outside the final holdout.
The Derivation policy implements only the Session boundary through
eval_fraction. It rejects a split.mode field because no mode value exists.
Repository, prompt, strict, and task-keyed boundaries remain
benchmark-specific.
A benchmark manifest must enforce those stronger holdouts. Its export audit
must confirm the boundary before training. A Session split alone doesn’t
support a stronger generalization claim.
The canonical bundle
A successful run writes seven files:inference_calls.jsonl contains every inference-call Fact referenced by a
selected Attributed completion or Rollout and no unrelated calls. Each row keeps
structured input and output messages.
The Derivation uses render_scoring_text when it needs a scalar response. The
pure renderer combines model-produced text with string leaves from tool-call
arguments.
The renderer excludes readable reasoning and tool responses. It never
persists the rendered value.
Bundle version 4 declares record_encoding: "sediment-record-json-v1" and
identity_population: "organization-through-as-of-v1". The file
inference_call_identities.jsonl contains every visible organization call’s
identity, Session, observation time, and distinct provider/tool aliases through
as_of. Cohort selection doesn’t narrow this population. An explicitly empty
population is valid; omitted evidence isn’t. The 50,000-row identity limit
refuses incomplete populations, including when the selected cohort is small.
Every artifact line contains exactly one record_json string. The string holds
one canonical record encoded with ASCII escapes and the declared Python numeric
extensions NaN, Infinity, and -Infinity. The manifest and outer lines are
strict JSON. This preserves NUL, surrogate strings, exceptional numbers, empty
values, and null without changing Fact meaning.
repository_identities.jsonl contains every visible repository source role,
including explicit identity absence. repository_renames.jsonl contains every
visible Repository rename. Each population has an independent 50,000-row cap
and remains complete through as_of before cohort selection. The manifest
declares this boundary with repository_population. The validator checks
retained source Push anchors and exact CI and observation projections against
these populations. The declaration cannot prove that an external producer
supplied every Fact. Bundle versions 1–3 require recomputation from Facts.
Each JSONL file has a fixed row order and deterministic encoding. Counts and
SHA-256 digests cover the exact outer bytes. Both decoders reject duplicate
object keys and trailing payload data. Unknown fields and encodings fail.
Public validate_derived_bundle checks canonical relationships before write,
after read and before bundle-based training, including in-memory exports. Every
Attributed completion and Rollout Turn references exactly one included Inference
call with the same organization and Session and agrees with its identity witness.
Decisions attach uniquely over organization evidence for Attributed completions
and Session evidence for Rollouts. Every carried Rollout retains all declared
Session calls; the pure Rollout owner reconstructs its Turn content and boundaries.
CI evidence matches a repository-qualified commit. The validator also checks the
Session split, Provenance, and consistent repeated Fact identities. The existing
assembly retention projection can fill an absent Decision score in Attributed
completions while Rollout keeps the captured null. Every other captured field
must agree, captured scores stay unchanged, and derived copies share one score.
Canonical artifacts embed matching SessionCommitObservation Facts. The builder
sets as_of from its snapshot before either artifact binds observations. The
validator requires matching organization, Session, repository, commit, and
captured_at <= as_of. Empty observation tuples remain valid inferred artifacts;
they don’t establish factual outcomes or individual call-to-file authorship.
The reader never substitutes live data or repairs an imported relationship.
Versions 1 and 2 receive an unsupported-version error requiring recomputation.
Their published schemas remain available. Validation and serialization failures
leave existing destinations intact; a writer never overwrites a bundle.
The producer declares source population completeness. Offline validation can’t
prove that an external producer disclosed every Fact or that the source was
truthful. The identity budget doesn’t bound message bytes or database scan work.
The bundle contract treats completeness as a producer assertion rather than a
validation result.
Rollout version 3 checks typed prior input and captured output before continuing
a Segment. The Derivation retains every Turn and records each unproven boundary
in the manifest’s required fragmented map: prior_output_absent, input_history_changed, or
prior_output_not_replayed. These counts describe retained Turns; skipped
describes declined inputs or artifacts.
The manifest keeps two kinds of absence separate:
skippedcounts data-quality gaps such asmirror_absent.excludedcounts intended cohort filters such as a user or time boundary.
Separate projection
sediment derive computes and freezes the two canonical artifacts. It doesn’t
choose a training format. sediment export --from validates the bundle, then
projects it into DPO, SFT, diff-SFT, or RLVR rows.
Projection policies remain outside the Derivation policy because they don’t
change the canonical artifacts. Each projection applies one versioned Evidence
recipe and records its label or eligibility source.
The conservative defaults use human-explicit evidence for DPO and curated
human or edit-retention evidence for SFT. Outcome-derived recipes require
explicit selection.
Recovery remains separate. A red-to-green commit pair is the one sanctioned
Fact-derived training-row shape. It isn’t a projection of an Attributed
completion or Rollout. Sediment persists no recipe decision as a Fact or
canonical artifact.
Attribution explains the hardest join in the Derivation.
How Sediment works places Derivation in the complete
capture-to-export pipeline.