Step D1
The recorded wish
A page may ask for the site's coat; the asking is a fact about the page, so it lives on the page.
A boolean on the Page: chrome, default off. This is the
first new model field in four snippet sequences, and it is taken only after
the cheaper routes are checked and refused: kind already means
something else; body is spoken for (snippet A spent it); a
naming convention would be a meaning hidden in a string, which is a lie
waiting to be believed. When a wish is genuinely a new fact about a page,
the honest place for it is a field — and a defaulted boolean is
addition-only tissue: every entity in a live datastore already reads
correctly without being written.
Then the dividend arrives, from two snippets back. The export manifest
carries the flag automatically (it speaks whole records); old archives that
have never heard of it import cleanly, the field taking its default through
the tolerance clause. etl.py changes by zero lines. When
snippet B claimed its archive format was built to unfold, this is what it
was claiming.
@dataclass
class Page:
...
in_nav: bool = False # step 8
chrome: bool = False # snippet D: raw/file pages may ask
# for the site header
# etl.py — no change. The flag rides the manifest; old archives
# import with the default. Snippet B's promise, collected.
Addition-only tissue: a defaulted boolean, and a dividend.