What changed

A compatibility fallback is still a hidden product decision.

The missing values became visible once the publishing system gained generated audits and visual regression fixtures. If an audit says a section is explicit but the renderer supplied its template, the audit is describing the output rather than the source of truth.

The repair was deliberately mechanical: scan raw section records, backfill an authored template and a semantic ID, verify the count reached zero, then delete the runtime normalizer.

Before: a missing template could be inferred from section type.

Before: an anchor could be derived from copy or position.

After: every published section owns both values in source.

After: missing, mismatched, or experimental templates fail validation.

311

published sections audited

0

derived templates

0

derived section IDs

The migration

Make the exception visible before removing it.

This sequence matters because strict validation without a migration path turns old content into a sudden release problem. The audit supplied a measurable finish line instead.

  1. 01

    Inventory the raw records

    Inspect authored sections, not rendered output, so defaults cannot hide missing contracts.

  2. 02

    Backfill semantic contracts

    Give each section an explicit template and an ID that describes its purpose on that page.

  3. 03

    Verify zero derived values

    Treat the audit count as the migration condition, not a subjective sense that the work is done.

  4. 04

    Remove the fallback

    Make incomplete source records fail at validation rather than letting the renderer decide.

The same contract, one more author

A record explicit enough to validate is a record a machine can be held to.

Moving the decision into the source, not the renderer, does more than stop the guess. It turns the section record into one declarative contract, and a contract a build can check is a contract any author can be held to, including a model.

One source drives every layer. The same section record feeds the renderer, the validator, and the audit, and, if a model ever drafts a page, the schema it must fill. Derive them all from one declaration and they cannot drift apart.

A machine author gets no special path. A model that writes a section is held to the exact validation a human save runs, so it cannot ship a section with a missing template any more than a person can. The contract is the safety, not a separate review.

The shape recurs. The same discipline governs a form's fields, an API's request schema, and a CMS content model: one authored definition, many checked representations, never a second hand-written copy that drifts.

What remains unproven

Explicit contracts make the site easier to inspect. They do not prove that every template is visually good.

That is why the builder now also has a deterministic stable-template gallery and screenshot coverage. The contract prevents hidden layout choice; visual review still judges whether the chosen layout works.

Questions

What this contract does and does not solve.

No. It moves design judgement to the authored record, where it can be reviewed, tested, and changed deliberately.

Defaults are useful for internal experiments. Published content needs an explicit record because the release system must be able to prove what will render.

A useful starting point

Bring one publishing or workflow surface that is starting to drift.

We can identify which decisions belong in an explicit contract and which still need a human review point.

Bring the page, report, or workflow as it is now.

We reply with the clearest next step, or an honest no.