hecks

report is the business-facing spelling of a read model

Status: Accepted — implemented (bluebook_builder.rb, syntax.bluebook via bin/evolve rename, docs/implemented/reference/)

Context

Hecks already had read_model, but the word doesn’t read as business vocabulary — it names an implementation pattern, not something an SME would say. The roadmap wanted report as the primary, taught spelling, with read_model demoted rather than removed, following this project’s existing convention for keyword renames (sets/then_set is the precedent: the new spelling is what’s taught, the old spelling is aliased and kept alive permanently).

Two constraints shaped how far the rename could go:

  1. Held era text is integrity-checked, not just historical. EraTamper compares a plain SHA256 over a held era’s frozen text; the refusal wording is explicit that “held era texts are storage facts.” bin/reattest_era’s digest-mismatch judgment and legacy-row backfill both re-execute that frozen text as live Ruby (Reattest.shape_guard!, EraStore’s backfill path). If read_model stopped existing as a callable method, those paths would raise NoMethodError against any era whose frozen source still says read_model — which real held eras (Banking era 1, Pizzas era 1) do.
  2. This is the project’s own enforced convention, not just a judgment call. bin/evolve rename’s own printed output says “the old spelling keeps parsing — that is the point,” and spec/syntax_conformance_spec.rb statically asserts that both a renamed word’s old and new spellings are answerable by the live Ruby builder. Removing read_model outright fails an existing test, independent of the era-integrity argument above.

We also investigated whether minting a new era could carry the rename forward instead of keeping read_model alive. It can’t help here: era-minting is driven by comparing canonical IR shape (Runtime::StorageShape.project) between the live declaration and the latest held era, not by diffing Ruby source text. Since report and read_model build byte-identical IR::ReadModel nodes, there is no shape difference for the minting mechanism to ever see — it would be a quiet reboot, not a mint. And even if an era were minted, it wouldn’t touch an earlier era’s independent digest check, which is keyed to that era’s own row.

Decision

Consequences

Rejected alternatives