Skip to content

Publish the full schema 7 release contract: country, presentation, publisher_labels, and the generated-never-authored rule #858

Description

@MaxGhenis

The dashboard's release contract is now fully artifact-driven (calibration-diagnostics #166: the zz conformance suite is 4/4 green; readers in #168 and #170; contract in docs/spec-driven-countries.md). #854 / #855 publish the first producer slice: schema 7 structured source, variable, and dimensions with the dimension dictionary. This issue is the remainder, so schema 7 ships the whole contract rather than dimensions alone, and so the rules for how these fields are produced are written down once.

Emit the remaining release-manifest blocks

release_manifest gains three typed blocks the dashboard already reads (readers fall back cleanly when they are absent, so this is additive):

  • country: { code, label, geography_id, geography_label, repository_visibility, capabilities }. The dashboard's registry supplies defaults; the artifact may override labels and narrow capabilities, never widen them, and a code that does not match the selected country ignores the block.
  • presentation: { overview_intro, targets_intro } only — the two existing text slots. Not sections, not components.
  • publisher_labels: { <first Chronicle record-id segment>: <display label> }. Overrides the dashboard's shared humanizer (today the UK release renders slc as "Slc"; one entry here fixes it without a dashboard change).

Generated, never authored

Answering @anth-volk's question on #166: targets[].dimensions, the dimension dictionary, and publisher_labels are compiled from the pinned Chronicle consumer export during release construction, the same way the target rows are. Producers do not maintain a second copy. In docs/spec-engine.md terms they are in the "emitted, never authored" class, like bundle.lock.json and plan.lock.json; in docs/graph-acceptance.md terms every label in them is descriptive under A4 (a label change alters no node key), while dimension ids, raw values, geography role and level, source.id, variable.id, and variable.measure are the target's normative identity. The schema should mark each field accordingly so the canonicalizer hashes only the normative projection.

Release-owned values (set at construction, still not hand-maintained tables) exist only where a row is not 1:1 with a Chronicle record:

  1. Aligned targets — an aged source-year fact evaluated at the build year carries the alignment identity Chronicle does not own.
  2. Combined targets — one row summing a record set (the Statbel commune composite pattern) needs its own dimension values because no single Chronicle record has them.
  3. Non-Chronicle targets — engine-internal rows such as selection_mass_protection.* have no Chronicle identity; they still declare source/variable so the dashboard never falls back to name grammar.
  4. publisher_labels — a display name Chronicle does not carry today; if Chronicle later publishes producer display names, generate from there and this list goes to zero.

Done when

  • Every published country release (US, UK, BE) carries country, presentation, publisher_labels, the dimension dictionary, targets[].dimensions, and structured targets[].source/targets[].variable; publication validation rejects a schema 7 release missing any of them.
  • The dashboard classifies every row of each release as structured (dimension_adapter), with no legacy_filter / legacy_name rows left in a schema 7 release.
  • The four exception classes above are the only rows whose dimension values are release-owned, and each such row says so (a dimension_source or equivalent marker), so a reviewer can audit that the generated path covers everything else.
  • The dashboard's legacy name/filter adapters and the per-country copy fallbacks can then be deleted (that deletion is a calibration-diagnostics follow-up gated on this).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions