ID

R827

Status

Backlog

Bucket

model

Priority

4

Theme

model-cleanup

Created

2026-08-24

Updated

2026-08-24

The registered targets index exemptions are a Java set in a test, so the measurement that argues each one is not in the model

MaterializeRegistryGateTest gates that every registered materialization target carries a declared index, and exempts four of them through NO_INDEX, a Set.of of four relation names in the test class. Beside it sits about forty lines of javadoc carrying the measurement that argues each exemption: intent_resolved_type_binding takes intent_argument_scope_table’s source view from 559 scans to 952 on the coordinate its thirteen readers join; `intent_errors_field takes intent_carrier_routine_hop from 3876 to 8136 and intent_mutation_routine_seat from 28857 to 33117, with no reader improving; intent_carrier_data_field moves no reader at all, to the scan. Each figure was taken over every view whose derivation reaches the target, with statistics current on both sides.

None of that is in the model. It is a fact about the store’s physical shape, discoverable only by a Java reader who already knows the file exists, unqueryable from a booted store, and unreachable by the reference renderer. The schema states facts of exactly this kind about itself, and it already has the convention: meta_prefixless_relation is a placement exemption roster with a reason column, described in its own comment as being "in the exemption polarity the schema gates use throughout, so a new prefix-less relation fails the roster gate until an authored row argues it in", with the reason "rendered beside the relation in the reference". meta_materialize itself carries a reason column for why each registration exists. The index exemption is the same kind of claim as both, and it is the only one of the three that lives outside the DDL.

Shape

A separate meta_ relation keyed on the exempted relation, carrying the argument, not a column on meta_materialize. The grain question was considered and settled: a nullable column is not the form this schema takes for this, and a relation keyed on the exempted relation can later cover a table that is not a registration target, which a column on the register structurally cannot.

The gate then reads the roster instead of holding its own set, and keeps the equality in both directions it has today, so a target that later earns an index fails until its row goes rather than surviving as an exemption nobody revisits.

Boundaries

Two things sit near this and are not it.

HAND_WRITTEN, the other Java-side set in the same test, is a weaker case and is deliberately left alone here. Its own javadoc says each rostered table "argues impossibility in its own table comment", so the reason already is in the model and the Java set is a duplicated enumeration rather than a fact with no home. Worth revisiting, on different grounds, and not on this item’s contract.

Moving the roster into the model does not by itself publish it. SchemaReferencePages renders from meta_family, meta_family_headline, meta_family_bridge, meta_relation_reference and meta_prefixless_relation, and does not read meta_materialize, so the register’s existing reason column renders nowhere today either. R758 is the item for that half. This item makes the exemptions statable and gated in the model; whether they render is R758’s contract, not this one’s.