ID

R531

Status

Backlog

Bucket

architecture

Priority

5

Theme

classification-model

Created

2026-07-24

Updated

2026-08-06

Meta-test: no registry reads in the classify-time set

The read-free classification invariant (no read of the type registry under construction during the single classify-and-emit walk) now spans several classes: FieldBuilder, ServiceCatalog, InputBeanResolver, EnumMappingResolver, and TypeBuilder’s classify path all resolve referenced-type verdicts through `TypeBuilder.lookAheadVerdict / BuildContext.lookAheadVerdict or the fixed-point indices (BuildContext.scalarVerdicts and siblings), never ctx.types. The invariant’s history is the argument for pinning it: it was believed to hold after R317/R325, held lexically for FieldBuilder only, and was falsified by transitive helper reads while implementing the walk’s input-surface extension. Today it is enforced by one marker comment in FieldBuilder and review; the next helper that reaches for ctx.types.get(...) mid-walk reopens the hole with an order-dependent misclassification no existing test is guaranteed to notice (the failure mode is often permissive: a lost rejection, not a crash). File shape: a meta-test in the same lexical-scan style as RoadmapReferenceGuardTest, scanning the classify-time set for ctx.types / typeRegistry.entries() / typeRegistry.get reads, with an explicit allow-list for the deliberate post-walk readers (validator, index folds, GraphitronSchemaBuilder’s post-walk reductions and the visitor’s own sibling-independent `parentType read).

Fact-base note (2026-08-06)

The read-free invariant is structural for consumers migrated onto the store: capture-then-derive has no classify-time registry to read. Scope the meta-test to the shrinking un-migrated set with an explicit retirement gate, or fold it into the shadow window’s agreement tests. Context and the whole-board picture: roadmap/audits/2026-08-06-fact-base-impact-sweep.md.