Skip to content

overrides.csv

One row is one authored correction to one cell of one derived table — and it is the only place a person may contradict a machine. Every other row in the tables it names is enricher-written, so this is the authored-versus-derived boundary made into a file.

The correction is applied and never merged in. The derived table on disk keeps the machine's value; the overlay sits beside it and wins at read time. So a correction is a third category that appears in neither table registry, and "fix the derived CSV directly" is the repair this file exists to refuse — the next enricher run would overwrite it.

Match the key as the model stores it, not as you spelled it. A raw string compare against the authored spelling grew the overlay by one row per run, because the stored form had already been normalised. This is the single most common way to author this table wrong, and the symptom is a table that keeps growing while appearing to do nothing.

Six of its columns are the claim and three are provenance. table, subject, member, field, operation and value say what the correction is and are inside content_signature — two modules differing in any of them assert different things. reason, decided_by and decided_at say why, who and when; nothing reads them, and they are exactly the cells an author improves on a second pass, so they sit outside content identity and editing one does not move the digest.

Counting a correction counts the overlay, never the effect. A report that counted what a correction removed disagreed with itself between two runs of the same module, because the second run had nothing left to remove.

Identity

Row model OverrideRow (just_dna_format.overrides)
Becomes overrides.parquet
Authored or derived authored — a person writes it (a drafter may append rows)
Draftable yes — draft can append rows
Drafted by no drafting provider targets this table — draft writes no row of it
Natural key table, subject, member, field
Fact signature no
In the attestation binding yes — manifest.inputs[]

Columns

Column Type Required Values Meaning
table str required one of: clin_sig_concordance.csv, clinical_assertions.csv, expression_effects.csv, frequencies.csv, gene_metrics.csv, gene_validity.csv, gwas_effects.csv, literature.csv, resolution.csv The derived table this row corrects, by its authored filename (e.g. 'resolution.csv'). The overlay lies on a table the module CARRIES — it never creates one.
subject str required The value identifying the group of derived rows this corrects, in the named table's own subject column: variant_key for resolution/frequencies/clinical_assertions/clin_sig_concordance/expression_effects, gene for gene_metrics/gene_validity, pmid for literature, association_id for gwas_effects.
member str | None optional The within-group discriminator, in the named table's own member column — locus_index for resolution, population for frequencies, dataset for gene_metrics, assertion_id for gene_validity, variation_id for clinical_assertions, genotype for clin_sig_concordance, gene for expression_effects. Empty for a table whose subject already identifies one row, and empty on a grouped table means group-scoped, which only update accepts.
field str | None optional The column being written, for update and insert. Empty (and required empty) for suppress, which names a row rather than a cell. It may not name the table's own subject or member column: re-keying a row is a suppress plus an insert, not a correction.
operation str required one of: insert, suppress, update What this row does: update|insert|suppress
value str | None optional The value to write, read with the target column's own type (so '5' lands in an int column as 5). Empty on an update clears the cell to absent, which the target model refuses where the column is required. Required empty for suppress.
reason str required Why this correction was made, in a sentence. REQUIRED, and that is what makes the overlay a record rather than a knob: a derived cell that disagrees with its source is a claim, and a claim with no reason beside it is indistinguishable from a mistake.
decided_by str | None optional Who decided it (a curator, a panel, a tool run)
decided_at str | None optional When it was decided — ISO-8601, canonicalized to UTC on load. A bare date is accepted and reads as midnight UTC.

Generated from the row model at build time — reference.authoring_reference(), the same answer describe_table gives an authoring tool. Nothing on this page is hand-kept.