Skip to content

Conformance codes

Every code conformance validation can raise — the full set validate_print() returns, and the set dbprint check reports under conformance — sorted by code so one pasted from a failure can be found. Data-quality assertions carry their own assertion.* codes, which are specified in ASSERTIONS.md rather than here. This file is generated from the specification's own catalog — do not edit it by hand. Run just docs to regenerate it.

A print conforms when no error is raised against it. A warning records an anomaly that does not gate conformance; SPEC 6.1 defines both, and SPEC 6.2 defines the issue each one is reported in.

165 codes: 132 error, 33 warning.

CodeSeveritySpecified inTrigger
annotations.claim-contradicts-statisticwarningAnnotations (§2.7)A claims predicate (§2.7.1) evaluates against the column's own statistics.yaml and fails. WARNING — the axis is advisory (§2.4); a contradicted claim is never a gating defect
annotations.claim-unassertablewarningAnnotations (§2.7)A claims predicate cannot be evaluated: the stat is not in the assertion DSL's vocabulary, the predicate is malformed, the stat is not emitted for the column's classification, or the column is redacted
annotations.grain-unknown-columnwarningAnnotations (§2.7)A grain.keys[] entry in statistics.annotations.yaml names a column not present in the table's statistics.yaml columns map (§2.7.1; stale key, not fatal)
annotations.unknown-columnwarningAnnotations (§2.7)A key in statistics.annotations.yaml's columns map names a column not present in the table's statistics.yaml (stale key; not fatal)
annotations.unknown-edgewarningAnnotations (§2.7)A verdict in relationships.annotations.yaml addresses an edge absent from the table's own relationships.yaml refers_to (§2.7.2; stale, not fatal)
annotations.unknown-sourcewarningAnnotations (§2.7)A derived_from entry in statistics.annotations.yaml names a table absent from manifest.yaml's tables, or a column that table's statistics.yaml does not have (§2.7.1; stale, not fatal)
annotations.unknown-valuewarningAnnotations (§2.7)A values entry in statistics.annotations.yaml names a value the column's own exhaustive values list does not have (§2.7.1; stale, not fatal — a truncated list is not checked)
annotations.value-note-unassertablewarningAnnotations (§2.7)A values entry addresses a column carrying a redacted marker (§2.2.9) — there is no literal to check the note against
annotations.verdict-on-declared-edgewarningAnnotations (§2.7)A verdict addresses an edge whose matching refers_to entry carries detection: declared (§2.7.2) — an annotation may correct an inference, never contradict a measurement (§2.4)
ddl.empty-fileerrorDDL (§2.1)ddl.sql exists but is empty
ddl.missing-trailing-newlinewarningDDL (§2.1)File doesn't end with newline (POSIX convention; trivially auto-fixable)
diff.column-collation-changed-no-changeerrorDiff invariants (§2.6)column_collation_changed event's before and after are identical (§2.6.6)
diff.column-physical-name-changed-no-changeerrorDiff invariants (§2.6)column_physical_name_changed event's before and after are identical (§2.6.6)
diff.comment-target-column-mismatcherrorDiff invariants (§2.6)comment_changed with target=column missing column field, OR target=table with column field present
diff.depends-on-changed-no-changeerrorDiff invariants (§2.6)depends_on_changed event's before and after are identical (§2.6.6)
diff.external-changed-no-changeerrorDiff invariants (§2.6)external_changed event's before and after are identical (§2.6.6)
diff.grain-changed-no-changeerrorDiff invariants (§2.6)grain_changed event's before and after are identical (§2.6.6)
diff.merging-changed-no-changeerrorDiff invariants (§2.6)merging_changed event's before and after are identical (§2.6.6)
diff.physical-layout-changed-no-changeerrorDiff invariants (§2.6)physical_layout_changed event's before and after are identical (§2.6.6)
diff.relationship-modified-no-changeerrorDiff invariants (§2.6)relationship_modified event without on_delete OR on_update sub-objects (§2.6.6 rule)
diff.row-count-changed-delta-mismatcherrorDiff invariants (§2.6)table_row_count_changed where delta doesn't equal after - before
diff.statistic-changed-delta-on-non-numericerrorDiff invariants (§2.6)statistic_changed with delta or delta_pct on stats where they MUST be omitted (distribution, classification, values, cardinality_method)
diff.statistic-changed-delta-pct-sign-mismatcherrorDiff invariants (§2.6)statistic_changed where delta and delta_pct disagree in sign
diff.statistic-changed-not-a-measurementerrorDiff invariants (§2.6)A statistic_changed event's stat names a field that is not a measured statistic — a catalog fact with its own kind (physical_name, collation), a restatement (physical_layout_key), or a field drift never compares (§2.6.6)
diff.summary-count-mismatchwarningDiff invariants (§2.6)Summary count doesn't match actual events count for that kind (informational redundancy; producer bug but not format break)
diff.summary-total-mismatchwarningDiff invariants (§2.6)tables_modified + unchanged_tables + unevaluated_tables + tables_added doesn't equal target.tables_scanned (§2.6.4). WARNING on the same grounds as diff.summary-count-mismatch: the events remain readable, and every operand is redundant with them
diff.table-type-changed-no-changeerrorDiff invariants (§2.6)table_type_changed event's before and after are identical (§2.6.6)
layout.invalid-path-segmenterrorDirectory layout (§1)Directory segment fails the §1.5.1 allowlist regex (artifact file names are not segments)
layout.missing-differrorDirectory layout (§1)Connection root missing diff.yaml though manifest.yaml records a table (§1.2)
layout.missing-manifesterrorDirectory layout (§1)Connection root missing manifest.yaml
layout.missing-reading-guideerrorDirectory layout (§1)Connection root missing reading.md (§1.2)
layout.unexpected-directory-levelerrorDirectory layout (§1)A producer-written artifact (ddl.sql, statistics.yaml, relationships.yaml) in a directory no manifest.tables[*].path declares
layout.unknown-filewarningDirectory layout (§1)File inside per-table dir not in the canonical artifact list (extensibility tolerance)
manifest.columns-count-mismatcherrorManifest cross-checks (§2.5)A table entry's columns count disagrees with the size of its statistics.yaml columns map (§2.5)
manifest.missing-artifacterrorManifest cross-checks (§2.5)Manifest entry references file that doesn't exist on disk
manifest.orphaned-artifactwarningManifest cross-checks (§2.5)File on disk not listed in any manifest entry (could be in-progress write; not strictly a violation). The only finding for a user-authored file in a directory no manifest entry declares
manifest.path-fqn-mismatcherrorManifest cross-checks (§2.5)A manifest key's segments differ from its entry's path segments (§1.3)
manifest.path-outside-printerrorManifest cross-checks (§2.5)A table entry's path is absolute or has a .. segment, or its directory, a file its artifacts declares, or a connection-root file resolves outside the connection root through a symbolic link (§2.5); no consumer follows it
manifest.profile-disabled-mismatcherrorManifest cross-checks (§2.5)A table's effective profile switches a measurement off and its statistics.yaml's disabled does not name it, or the reverse (§2.5, §2.2.21). Checked only where the manifest carries profile
manifest.selectors-mismatch-differrorManifest cross-checks (§2.5)selectors disagrees with diff.yaml's target.selectors when both are present (§2.5, §2.6.3)
manifest.table-fqn-mismatcherrorManifest cross-checks (§2.5)Manifest's table FQN doesn't match the table field in the referenced statistics.yaml / relationships.yaml
privacy.redacted-value-comparederrorPrivacy (§4.4)diff.yaml carries a statistic_changed event for values, range, percentiles or any field §2.2.9 withholds from a marked column, on a column whose statistics.yaml declares a redacted marker (§2.6.6). ERROR, not WARNING: the marker is a producer's own declaration, so no inference is being second-guessed
privacy.unredacted-sensitivewarningPrivacy (§4.4)Column carries inferred.sensitivity, or a part sits inside a column or part that does, and publishes at least one of values, range, percentiles, extent, with no redacted primitive covering it (§4.4.2)
relationships.broken-reciprocityerrorRelationships invariants (§2.3)A referenced_by entry points to a source table that's in the manifest BUT lacks the matching refers_to entry
relationships.column-array-length-mismatcherrorRelationships invariants (§2.3)column and target_column (in refers_to) or column and referencer_column (in referenced_by) have different array lengths
relationships.ineligible-target-is-referencederrorRelationships invariants (§2.3)eligible_target: false but referenced_by carries an inferred entry — naming inference cannot resolve an edge to an ineligible object (§2.3.8). A declared entry there is unaffected; a composite key inference never reaches can still be a real FK target
relationships.inferred-edge-under-disablederrorRelationships invariants (§2.3)refers_to carries a detection: inferred entry while the same object's statistics.yaml names relationships.infer in disabled (§2.2.21)
relationships.measured-edge-under-disablederrorRelationships invariants (§2.3)A detection: measured entry has an endpoint whose statistics.yaml names sketches in disabled (§2.2.21)
relationships.mirror-mismatcherrorRelationships invariants (§2.3)A refers_to entry and its referenced_by mirror address the same edge but differ on a field both entry schemas define other than the address (detection, on_delete, on_update, constraint_name, observed), including a field present on one side only (§2.3.3, §2.3.10). Where several entries share one address, both sides must carry the same set
relationships.observed-answerable-count-mismatcherrorRelationships invariants (§2.3)observed.answerable_count disagrees with the count of the referencing column's own retained hashes below the shared threshold (§2.3.10, §2.2.14), including when the answerable subset is empty and no count should be published at all
relationships.observed-coherent-mismatcherrorRelationships invariants (§2.3)observed.coherent disagrees with whether the referencing column's cardinality exceeds the referenced column's (§2.3.10)
relationships.observed-containment-forbiddenerrorRelationships invariants (§2.3)observed.containment is published where the two endpoints' sketches carry no evidence to support it — the answerable subset between them is empty (§2.3.10)
relationships.observed-containment-mismatcherrorRelationships invariants (§2.3)observed.containment disagrees with the bottom-k intersection estimate recomputed from the two endpoints' own sketch (§2.3.10, §2.2.14)
relationships.observed-coverage-mismatcherrorRelationships invariants (§2.3)observed.target_coverage disagrees with the two endpoints' own cardinality / cardinality, rounded per §2.2.6 (§2.3.10)
relationships.observed-fanout-mismatcherrorRelationships invariants (§2.3)observed.fanout_avg disagrees with the referencing column's own (row_count - null_count) / cardinality, numerator floored at cardinality, rounded per §2.2.6 (§2.3.10)
relationships.path-on-composite-endpointerrorRelationships invariants (§2.3)path (or target_path) is present but its partner array (column or target_column) names more than one column (§2.3.9) — a path endpoint is representable only on a single-column endpoint
relationships.unmirrored-refers-toerrorRelationships invariants (§2.3)A refers_to entry's target_table is in the manifest and declares a relationships.yaml, but that file's referenced_by has no entry naming this table as referencer_table, this column as referencer_column and this target_column as column (§2.3.6). The reverse of relationships.broken-reciprocity; a target outside the manifest, or one declaring no relationships.yaml, is not checked
schema.invalid-percentile-keyerrorYAML / schema validity (§§2.2–2.6)Percentile key doesn't match ^p\d{2}$
schema.invalid-yamlerrorYAML / schema validity (§§2.2–2.6)File isn't valid YAML
schema.missing-required-fielderrorYAML / schema validity (§§2.2–2.6)Required field absent per JSON Schema
schema.type-mismatcherrorYAML / schema validity (§§2.2–2.6)Field has wrong scalar type
schema.unknown-change-kindwarningYAML / schema validity (§§2.2–2.6)kind value in diff not in the enum (forward-compat)
schema.unknown-classificationwarningYAML / schema validity (§§2.2–2.6)classification value not in the enum (forward-compat)
schema.unknown-epoch-unitwarningYAML / schema validity (§§2.2–2.6)inferred.epoch_unit value not in the enum (forward-compat)
schema.unknown-looks-likewarningYAML / schema validity (§§2.2–2.6)inferred.looks_like value not in the enum (forward-compat)
schema.unknown-sensitivitywarningYAML / schema validity (§§2.2–2.6)inferred.sensitivity value not in the enum (forward-compat)
stats.candidate-key-exception-mismatcherrorStatistics invariants (§2.2)inferred.candidate_key_exception disagrees with the value recomputed from cardinality, cardinality_ratio, cardinality_method and null_count (§4.2)
stats.candidate-key-mismatcherrorStatistics invariants (§2.2)inferred.candidate_key disagrees with whether cardinality_ratio clears the SPEC 4.2 threshold — present where it should be absent, or the reverse. Independent of classification
stats.cardinality-exceeds-row-counterrorStatistics invariants (§2.2)cardinality > row_count (invariant violation)
stats.cardinality-ratio-mismatcherrorStatistics invariants (§2.2)cardinality_ratio disagrees with cardinality / rows_scanned, rounded per §2.2.6
stats.degenerate-count-exceeds-row-counterrorStatistics invariants (§2.2)zero_count, negative_count, empty_count, quantized_count or non_finite_count exceeds the non-null scanned count (invariant violation)
stats.dependencies-direction-impossibleerrorStatistics invariants (§2.2)A dependencies entry's determinant has lower cardinality than its dependent — a function's image cannot exceed its domain, so that direction cannot hold (§2.2.13)
stats.dependencies-measured-on-empty-tableerrorStatistics invariants (§2.2)dependencies is non-empty on a table with row_count: 0 — every combination is trivially functional there (§2.2.13)
stats.dependencies-measured-under-scopeerrorStatistics invariants (§2.2)dependencies is non-empty on a file that also carries scope — a dependency measured over a sample is not a dependency (§2.2.13)
stats.dependencies-self-referentialerrorStatistics invariants (§2.2)A dependencies entry's determinant and dependent name the same column (§2.2.13)
stats.dependencies-strength-out-of-rangeerrorStatistics invariants (§2.2)A dependencies entry's strength is not in (0, 1] (§2.2.13)
stats.dependencies-unknown-columnerrorStatistics invariants (§2.2)A dependencies entry names a determinant or dependent absent from the file's columns map (§2.2.13)
stats.depends-on-on-tableerrorStatistics invariants (§2.2)depends_on is present but type is table — the field names what a view/matview reads and MUST NOT appear on a plain table (§2.2.17)
stats.disabled-and-unmeasurederrorStatistics invariants (§2.2)A block or field the file's or a column's unmeasured names belongs to a measurement the file's disabled names (§2.2.21)
stats.disabled-names-emitted-fielderrorStatistics invariants (§2.2)disabled names a measurement whose block, or whose field on any column or part, the same file emits (§2.2.21)
stats.distribution-contradicts-frequencieserrorStatistics invariants (§2.2)On a numeric/temporal column with cardinality_method: exact, distribution disagrees with the verdict recomputed from frequencies (§2.2.5). ERROR because the two come from the same fetch and are exact arithmetic, not a heuristic over a possibly-truncated list
stats.distribution-mismatchwarningStatistics invariants (§2.2)When verifiable from an exhaustive values list, distribution value doesn't match §2.2.5 rules. WARNING because heuristic-prone for truncated lists and exact-match boundaries.
stats.excess-precisionerrorStatistics invariants (§2.2)A numeric statistic is not the value §2.2.6's rounding rule emits for it: more than six decimals, or — for a measured field, where six decimals would round a nonzero value to zero — more than six significant figures (§2.2.6)
stats.extent-invertederrorStatistics invariants (§2.2)An extent carries min_x > max_x or min_y > max_y (§2.2.4)
stats.forbidden-field-for-classificationerrorStatistics invariants (§2.2)Column has a field marked — in the §2.2.3 matrix
stats.geometry-count-mismatcherrorStatistics invariants (§2.2)A geometry list's counts do not sum to the column's non-null count, or empty_count/invalid_count exceeds it (§2.2.4)
stats.grain-duplicate-keyerrorStatistics invariants (§2.2)The same column combination appears in more than one grain.keys entry (§2.2.12)
stats.grain-measured-on-empty-tableerrorStatistics invariants (§2.2)grain.keys carries a detection: measured entry on a table with row_count: 0 — every combination is trivially unique there (§2.2.12)
stats.grain-measured-under-scopeerrorStatistics invariants (§2.2)grain.keys carries a detection: measured entry on a file that also carries scope — uniqueness over a sample is not uniqueness (§2.2.12)
stats.grain-unknown-columnerrorStatistics invariants (§2.2)A grain.keys entry names a column absent from the file's columns map (§2.2.12)
stats.length-order-violatederrorStatistics invariants (§2.2)length.min, length.avg and length.max disagree with min <= avg <= max (§2.2.4)
stats.looks-like-candidate-at-verdict-thresholderrorStatistics invariants (§2.2)inferred.looks_like_candidate_share is at or above the 95% verdict threshold — a share that high would have been inferred.looks_like instead (§4.1.3)
stats.looks-like-candidate-with-verdicterrorStatistics invariants (§2.2)inferred.looks_like_candidate is present alongside inferred.looks_like; the near-miss and the verdict are mutually exclusive (§4.1.3)
stats.max-age-days-mismatcherrorStatistics invariants (§2.2)freshness.max_age_days disagrees with max(0, day_count(range.max, profiled_at)) (§2.2.4). Skipped when the column carries any redacted marker, max is named in unrepresentable, or range.max is not a parseable instant
stats.mean-outside-rangeerrorStatistics invariants (§2.2)mean lies outside [range.min, range.max] (§2.2.4). An average outside its own bounds is impossible over any nonempty column, so it reports a producer that lost the magnitude of one of the three
stats.measurement-under-catalog-onlyerrorStatistics invariants (§2.2)A column carries a field beyond sql_type, nullable, classification, physical_name, collation, physical_layout_key, derived_from on a file that also carries catalog_only — a measurement published where none was queried (§2.2.15)
stats.merging-unknown-columnerrorStatistics invariants (§2.2)merging.key names a column absent from the file's columns map (§2.2.19)
stats.missing-required-field-for-classificationerrorStatistics invariants (§2.2)Column missing a field marked R in the §2.2.3 matrix for its classification
stats.non-finite-statisticerrorStatistics invariants (§2.2)range.min, range.max, a percentiles entry, mean or sum on a numeric column is NaN or infinite; every numeric statistic reads the finite values alone (§2.2.4)
stats.normalized-cardinality-exceeds-cardinalitywarningStatistics invariants (§2.2)normalized_cardinality exceeds cardinality; folding case and trimming whitespace cannot increase distinctness (§2.2.4). Not checked when cardinality_method is approximate — the comparison is approximate on both sides there. WARNING because the two counts are measured in separate statements against a table taking writes — on a live database the later count can legitimately be the larger, not by producer defect
stats.null-count-exceeds-row-counterrorStatistics invariants (§2.2)null_count > row_count (invariant violation)
stats.null-patterns-absent-with-nullserrorStatistics invariants (§2.2)null_patterns is omitted although some column reports a non-zero null_count and neither the file's own unmeasured nor its disabled list names it, or present although no column reports one (§2.2.10)
stats.null-patterns-coverage-mismatcherrorStatistics invariants (§2.2)null_patterns.coverage disagrees with the listed counts over rows_scanned (§2.2.10)
stats.null-patterns-duplicate-combinationerrorStatistics invariants (§2.2)The same combination of columns appears in more than one null_patterns entry (§2.2.10)
stats.null-patterns-not-orderederrorStatistics invariants (§2.2)null_patterns.patterns is not ordered by count descending, ties by ascending columns (§2.2.10)
stats.null-patterns-reconciliation-mismatcherrorStatistics invariants (§2.2)The null_patterns counts naming a column exceed its null_count, or fall short of it at coverage: 1.0 (§2.2.10), coverage_method measured, or absent at coverage: 1.0. coverage_method: bounded, and a truncated list (coverage below 1.0, coverage_method absent), report stats.null-patterns-reconciliation-mismatch-bounded instead — see below
stats.null-patterns-reconciliation-mismatch-boundedwarningStatistics invariants (§2.2)The same disagreement as stats.null-patterns-reconciliation-mismatch, where coverage_method: bounded (§2.2.10) already discloses the cause, or the list is truncated (coverage below 1.0, coverage_method absent) and so can overcount a column only through writes between the reads. WARNING for the same reason
stats.null-patterns-sum-exceeds-rows-scannederrorStatistics invariants (§2.2)The null_patterns counts sum to more rows than were scanned (§2.2.10), coverage_method measured, or absent at coverage: 1.0. coverage_method: bounded, and a truncated list (coverage below 1.0, coverage_method absent), report stats.null-patterns-sum-exceeds-rows-scanned-bounded instead — see below
stats.null-patterns-sum-exceeds-rows-scanned-boundedwarningStatistics invariants (§2.2)The same disagreement as stats.null-patterns-sum-exceeds-rows-scanned, where coverage_method: bounded (§2.2.10) already discloses that the pattern counts and rows_scanned were not read at the same instant, or the list is truncated (coverage below 1.0, coverage_method absent) and so can overrun only through writes between the two reads. WARNING because the cause this error exists to catch is already named or the only one possible
stats.null-patterns-unknown-columnerrorStatistics invariants (§2.2)A null_patterns entry names a column absent from the file's columns map (§2.2.10)
stats.null-rate-mismatcherrorStatistics invariants (§2.2)null_rate disagrees with null_count / rows_scanned, rounded per §2.2.6
stats.nullable-contradicts-null-counterrorStatistics invariants (§2.2)nullable: false alongside a nonzero null_count — nullable is a DDL fact (§2.2.2), never a data measurement, so it cannot disagree with a NULL the column's own scan found
stats.part-parent-unlistederrorStatistics invariants (§2.2)A part's parent part is not listed in the same parts map (§2.2.18)
stats.part-path-not-canonicalerrorStatistics invariants (§2.2)A parts key does not parse under the §2.2.18 grammar, or is not in its one canonical spelling
stats.parts-found-below-listederrorStatistics invariants (§2.2)parts_found is below the number of parts entries (§2.2.18)
stats.percentile-outside-rangeerrorStatistics invariants (§2.2)A percentile lies outside [range.min, range.max] (§2.2.4). range and percentiles are read by one statement per column, so this does not carry the cross-phase tolerance stats.values-sum-mismatch does. A temporal value that does not parse as an instant compares by its leading year, so a year-10000 percentile against a year-9999 maximum is reported. Skipped when the column carries any redacted marker
stats.percentiles-not-orderederrorStatistics invariants (§2.2)percentiles do not ascend with their keys (§2.2.4). Compares parsed values, not key spelling; a temporal value that does not parse as an instant (unrepresentable) compares by its leading year, and two values of one year that cannot both be parsed are not compared
stats.physical-layout-key-missing-markererrorStatistics invariants (§2.2)physical_layout.keys names a column that does not carry physical_layout_key: true (§2.2.11)
stats.physical-layout-key-not-declarederrorStatistics invariants (§2.2)A column carries physical_layout_key: true but is not named in physical_layout.keys (§2.2.11)
stats.physical-layout-unknown-columnerrorStatistics invariants (§2.2)physical_layout.keys names a column absent from the file's columns map (§2.2.11)
stats.physical-name-matches-keywarningStatistics invariants (§2.2)physical_name is present and equals the column's own map key; the field asserts nothing and MUST be omitted (§2.2.4)
stats.populated-out-of-anchor-rangewarningStatistics invariants (§2.2)populated.from or populated.to falls outside the anchor column's own measured range (§2.2.4). WARNING because the window and the anchor's bounds are measured in separate statements against a table taking writes — an anchor advancing between them carries to past a bound recorded earlier, not by producer defect
stats.populated-without-timelineerrorStatistics invariants (§2.2)A column carries populated on a file with no timeline block — there is nowhere to read the anchor its instants are dated against (§2.2.4, §2.2.16)
stats.population-marker-mismatcherrorStatistics invariants (§2.2)A column's rows_scanned disagrees with what the file's scope requires — absent or wrong when scoped, present when not (§2.2.8)
stats.redacted-literal-publishederrorStatistics invariants (§2.2)A column or part carrying a redacted marker publishes a literal its primitive withholds: under drop, a values entry carrying value; under mask, a values entry's value, range.min, range.max or percentiles entry other than [redacted]; under hash, one that is not 16 lowercase hexadecimal characters; under any marker, a spelling_of (§2.2.9, §2.2.4)
stats.redacted-without-markererrorStatistics invariants (§2.2)A values entry carries no value but the column declares no redacted primitive (§2.2.9)
stats.scope-asserts-nothingwarningStatistics invariants (§2.2)scope covers the whole table and records neither sample nor filter; omit it
stats.scope-missing-rows-scannederrorStatistics invariants (§2.2)scope is present without an integer rows_scanned (§2.2.8)
stats.scope-not-a-mappingerrorStatistics invariants (§2.2)scope is present but is not a mapping (§2.2.8)
stats.scope-rows-scanned-exceeds-row-counterrorStatistics invariants (§2.2)scope.rows_scanned > row_count while row_count_method is exact — a subset cannot be larger than the set it was drawn from. Permitted under approximate, which is the estimate-undershot case §2.2.8 sanctions
stats.scope-sample-and-filtererrorStatistics invariants (§2.2)scope carries both sample and filter — a table is narrowed one way or the other (§2.2.8)
stats.scope-sample-out-of-rangeerrorStatistics invariants (§2.2)scope.sample outside the interval (0, 1]
stats.sketch-invalid-encodingerrorStatistics invariants (§2.2)sketch.values is not valid base64 of a length that is a multiple of 8 bytes (§2.2.14)
stats.sketch-not-ascendingerrorStatistics invariants (§2.2)A decoded sketch.values is not sorted ascending (§2.2.14)
stats.sketch-on-redacted-columnerrorStatistics invariants (§2.2)A column declaring a redacted primitive carries a sketch — the digests enumerate the cell values that primitive withheld (§2.2.14)
stats.sketch-oversizederrorStatistics invariants (§2.2)A decoded sketch.values carries more entries than method's own k (§2.2.14)
stats.sketch-unknown-methoderrorStatistics invariants (§2.2)sketch.method is not a value this MAJOR defines (§2.2.14)
stats.span-days-mismatcherrorStatistics invariants (§2.2)range.span_days disagrees with day_count(range.min, range.max) (§2.2.4). Skipped when either bound is redacted (mask/hash), named in unrepresentable, or not a parseable ISO date/instant
stats.spelling-of-key-mismatcherrorStatistics invariants (§2.2)A values entry's value and its spelling_of do not fold to one key — trimmed and case-folded, the key normalized_cardinality is measured with — so the group was formed under a key §2.2.4 forbids
stats.spelling-of-target-unlistederrorStatistics invariants (§2.2)A values entry's spelling_of names a value the same list does not carry as a canonical member — an entry with no spelling_of of its own (§2.2.4)
stats.timeline-anchor-not-temporalerrorStatistics invariants (§2.2)timeline.column names a column whose classification is not temporal (§2.2.16)
stats.timeline-anchor-redactederrorStatistics invariants (§2.2)timeline.column names a column carrying a redacted marker — the anchor rule MUST NOT choose a redacted column (§2.2.16)
stats.timeline-buckets-exceed-rows-scannedwarningStatistics invariants (§2.2)The listed bucket counts sum above rows_scanned (§2.2.16). WARNING because the buckets and the row count are measured in separate statements against a table taking writes — on a live database the two can disagree by design, not by producer defect
stats.timeline-buckets-unorderederrorStatistics invariants (§2.2)timeline.buckets is not ascending by start (§2.2.16)
stats.timeline-coverage-mismatcherrorStatistics invariants (§2.2)timeline.coverage disagrees with the listed bucket counts over rows_scanned, recomputed through the same bounded share the producer writes it with (§2.2.16)
stats.timeline-on-empty-tableerrorStatistics invariants (§2.2)timeline is present on a table with row_count: 0 — there is nothing to bucket (§2.2.16)
stats.timeline-under-scopeerrorStatistics invariants (§2.2)timeline is present on a file that also carries scope — a bucketed count over a sample is not a timeline (§2.2.16)
stats.timeline-unknown-columnerrorStatistics invariants (§2.2)timeline.column names a column absent from the file's columns map (§2.2.16)
stats.types-sum-mismatchwarningStatistics invariants (§2.2)A types map does not sum to its population: the scanned rows less null_count on a column, occurrences - null_count on a part (§2.2.4). WARNING because types is counted in its own statement, apart from the ones reading rows_scanned and null_count, against a table taking writes — the cross-statement disagreement stats.values-sum-mismatch tolerates for the same reason
stats.uncoarsened-redacted-day-counterrorStatistics invariants (§2.2)A temporal column carrying a redacted marker emits freshness.max_age_days or range.span_days not floored to a multiple of 90 (§2.2.9)
stats.unmeasured-names-emitted-blockerrorStatistics invariants (§2.2)the file's unmeasured list names a table-level block the same file also emits (§2.2.1)
stats.unmeasured-names-emitted-fielderrorStatistics invariants (§2.2)unmeasured names a field the same column also emits — a measurement and its own absence cannot both be claimed (§2.2.4)
stats.unmeasured-names-unrequired-fielderrorStatistics invariants (§2.2)unmeasured names a field the §2.2.3 matrix does not mark R for this column's classification; that absence is structural and needs no marker (§2.2.4). inferred.looks_like and inferred.epoch_unit on a classification §4.1.5 samples are the exception
stats.unrepresentable-emptyerrorStatistics invariants (§2.2)unrepresentable is present as an empty list; the key MUST be omitted instead (§2.2.4)
stats.unrepresentable-names-unemitted-fielderrorStatistics invariants (§2.2)unrepresentable names a field (min, max, or a percentiles key) the column did not emit (§2.2.4)
stats.values-coverage-mismatchwarningStatistics invariants (§2.2)values_coverage disagrees with the listed counts over rows_scanned - null_count. WARNING for the same cross-phase reason as stats.values-sum-mismatch: the two ratios share the same listed/non_null pair, and a drift small enough to still disagree at six decimals is the same drift, not a distinct producer defect
stats.values-list-exceeds-cardinalitywarningStatistics invariants (§2.2)An exhaustive values list carries more entries than cardinality, cardinality_method: exact. WARNING for the same cross-phase reason as stats.values-sum-mismatch
stats.values-list-short-of-cardinalityerrorStatistics invariants (§2.2)An exhaustive values list (values_coverage of 1.0, values_coverage_method absent or measured) carries fewer entries than cardinality, cardinality_method: exact (§2.2.4). ERROR because values_coverage and cardinality are both required exact fields whenever this fires — a live table taking writes between the two phases can widen cardinality past a list that was already complete when it was read, which is the phase A / phase B disagreement stats.values-sum-mismatch's neighbors tolerate at warning; this code's own severity is unchanged. values_coverage_method: bounded reports stats.values-list-short-of-cardinality-bounded instead — see below
stats.values-list-short-of-cardinality-boundedwarningStatistics invariants (§2.2)The same disagreement as stats.values-list-short-of-cardinality, where values_coverage_method: bounded (§2.2.4) already discloses that values_coverage is a clamp, not a measurement read at the same instant as cardinality. WARNING because the producer has already named the cause this error exists to catch
stats.values-not-orderederrorStatistics invariants (§2.2)values entries are not ordered by count DESC with a tie-break on the published text of value (§2.2.4)
stats.values-sum-mismatchwarningStatistics invariants (§2.2)An exhaustive values list (values_coverage of 1.0) whose counts do not sum to rows_scanned - null_count, OR a truncated list whose counts exceed it. WARNING because phase A and phase B are measured in separate statements against a table taking writes — on a live database the two counts can disagree by design, not by producer defect
stats.vector-bounds-invertederrorStatistics invariants (§2.2)A dimension or norm carries min > max (§2.2.4)
version.invalid-format-versionerrorFormat version (§5)format_version isn't a positive integer
version.missing-format-versionerrorFormat version (§5)Required artifact missing format_version field
version.unknown-format-versionerrorFormat version (§5)format_version is a MAJOR the v1 validator doesn't understand (e.g., 2) — the validator's job is to validate v1; cannot do so for unknown majors