| # | Pages that are NOT derived from another resource (about pages, privacy notices, documentation landings, glossaries) SHOULD be authored as site.StaticPage instances rather than embedded in CI heredocs or hand-written HTML files. The page's content lives in the Kanonak graph; the publisher's HTML layout transformation renders it. | The about-page-as-heredoc pattern was the canonical symptom of "this content has nowhere to live in the ontology." StaticPage gives it a home; universal defaults render it for free; publisher overrides give it the site-styled chrome. The content stops being divorced from the rest of the publisher's data graph. |
| # | Pages that aggregate over multiple resources of the same class (timelines, indexes, changes pages, registries) SHOULD be authored as site.AggregateView instances — scopeClass + scopeSources + transformation + outputPath. kanonak site build materializes them; consumers stop authoring per-aggregate workflow steps. | The "scope enumeration in CI shell" anti-pattern was the second-worst pain point in worldview's workflow. Each aggregate page required an explicit bash loop to list packages and pass them as --scope arguments. AggregateView captures the same intent declaratively; the pkg@* wildcard handles the time-axis case (every version of a snapshot package). |