PureYAML/scripts/validation-coverage.tsv
Mihaela M 85663682a2 build: enforce validation coverage over every public type
Adopt the validation-rules discipline that every public type is either
validated or excluded, enforced mechanically rather than by review. A new
gate enumerates the public surface from the compiler symbol graph and
fails the build, naming the type, if any public type is missing from the
coverage manifest or any manifest entry is no longer public.

scripts/validation-coverage.tsv classifies all 58 public types: the value
models with the mapping-key-uniqueness runtime invariant are validated,
and the namespaces, closed sum types, data-transfer values, error types,
and engine machinery are excluded with a one-line reason each. The gate
runs in check-all.sh and CI; a planted unclassified type was confirmed to
fail it.

This is the coverage-first phase of moving the validation layer to the
type-directed Validation idiom; the framework backing the validated
entries, the de-duplication of the Tagged validator machinery, and the
exhaustive tests follow.
2026-06-28 05:00:54 +02:00

84 lines
5.4 KiB
Plaintext

# Public-type validation coverage manifest (validation-rules.md).
# Every public type in the PureYAML target is classified exactly once.
# Columns (tab-separated): <fully.qualified.Type> <validated|excluded> <one-line reason>
# `validated`: carries a runtime invariant the type system does not enforce; backed by a
# Validation<Subject> in the framework phase.
# `excluded`: a caseless namespace, a closed sum type whose illegal states are unrepresentable,
# a pure data-transfer type, an error value, or engine/machinery that is not a validated subject.
# scripts/check-validation-coverage.sh fails the build if a public type is missing here or a line
# here is no longer public.
# --- namespaces (caseless enums) ---
PureYAML excluded caseless namespace; holds no instances or state
PureYAML.Decoding excluded caseless namespace; holds no instances or state
PureYAML.Emitting excluded caseless namespace; holds no instances or state
PureYAML.Encoding excluded caseless namespace; holds no instances or state
PureYAML.Model excluded caseless namespace; holds no instances or state
PureYAML.Parsing excluded caseless namespace; holds no instances or state
PureYAML.Stream excluded caseless namespace; holds no instances or state
PureYAML.Tagged excluded caseless namespace; holds no instances or state
PureYAML.Validation excluded caseless namespace; holds no instances or state
# --- model ---
PureYAML.Model.Value validated core YAML value; mapping-key uniqueness and merge/alias shape are runtime invariants
PureYAML.Model.Mapping validated mapping keys must be unique within a mapping
PureYAML.Model.Pair excluded data-transfer key/value pair; no invariant beyond its components
PureYAML.Model.Key excluded closed sum type (string/sequence/mapping); illegal states unrepresentable
# --- stream ---
PureYAML.Stream.Document excluded wraps a validated Model.Value plus an index; no own invariant
PureYAML.Stream.Issue excluded diagnostic data-transfer type
PureYAML.Stream.Issue.Collection excluded error aggregate; data-transfer
PureYAML.Stream.Result excluded diagnostic result data-transfer type
# --- parsing ---
PureYAML.Parsing.ParseError excluded error enum; cases are unrepresentable-illegal, carries diagnostics only
PureYAML.Parsing.Parser excluded parsing engine; produces values, is not itself a validated subject
# --- emitting ---
PureYAML.Emitting.Dumper excluded emitter engine; not a validated subject
PureYAML.Emitting.Options excluded emitter configuration; no cross-field invariant
PureYAML.Emitting.CollectionStyle excluded closed enum; illegal states unrepresentable
PureYAML.Emitting.ScalarStyle excluded closed enum; illegal states unrepresentable
# --- decoding / encoding (Codable machinery) ---
PureYAML.Decoding.Decoder excluded Codable decoding machinery; not a validated subject
PureYAML.Decoding.Error excluded error enum; data-transfer
PureYAML.Encoding.Encoder excluded Codable encoding machinery; not a validated subject
PureYAML.Encoding.Error excluded error enum; data-transfer
# --- tagged node subsystem ---
PureYAML.Tagged.Node validated tagged node tree; mapping-key uniqueness is a runtime invariant
PureYAML.Tagged.Mapping validated tagged mapping keys must be unique
PureYAML.Tagged.Pair excluded data-transfer key/value pair
PureYAML.Tagged.Scalar excluded data-transfer scalar (value + tag)
PureYAML.Tagged.Sequence excluded data-transfer ordered nodes
PureYAML.Tagged.Tag excluded data-transfer tag identifier
PureYAML.Tagged.NodeKind excluded closed enum; illegal states unrepresentable
PureYAML.Tagged.Document excluded wraps a validated Tagged.Node
PureYAML.Tagged.Context excluded construction context data-transfer type
PureYAML.Tagged.ConstructionContext excluded construction context data-transfer type
PureYAML.Tagged.ConstructionError excluded error enum; data-transfer
PureYAML.Tagged.Constructor excluded tag-construction engine; not a validated subject
PureYAML.Tagged.Rule excluded validation machinery; duplicates Validation.Rule, slated for de-dup (principle 10)
PureYAML.Tagged.Validator excluded validation machinery; duplicates Validation.Validator, slated for de-dup (principle 10)
# --- validation framework's own types ---
PureYAML.Validation.Validator excluded validation machinery; not a validated subject
PureYAML.Validation.Rule excluded the Validation<Subject> analog; a rule type, not a subject
PureYAML.Validation.Context excluded validation context passed to checks; not a subject
PureYAML.Validation.Issue excluded validation error data-transfer type
PureYAML.Validation.Issue.Collection excluded error aggregate; data-transfer
PureYAML.Validation.Result excluded validation result data-transfer type
PureYAML.Validation.Severity excluded closed enum; illegal states unrepresentable
PureYAML.Validation.Path excluded coding-path data-transfer type
PureYAML.Validation.Path.Component excluded coding-path element; closed enum
PureYAML.Validation.Report excluded diagnostic report data-transfer type
PureYAML.Validation.ReportError excluded error type; data-transfer
PureYAML.Validation.SourceReport excluded diagnostic report data-transfer type
PureYAML.Validation.Source excluded source descriptor data-transfer type
PureYAML.Validation.BatchReport excluded diagnostic report data-transfer type
PureYAML.Validation.Diagnostic excluded diagnostic data-transfer type
PureYAML.Validation.DiagnosticKind excluded closed enum; illegal states unrepresentable
PureYAML.Validation.PreflightScanner excluded pre-parse scanner engine; not a validated subject