doxa-maps/plugin-designs/my-upg-100-list
Doxa Maps a681fd3c65 A zoning gate that checks a list against what its author declared, not against my intuition
Part 1 of making UPG-100 a reusable pattern (Driver via repo; dx-shepherd UPGPAT). Any project list —
7000 / 4700 / 3000 / 2000 / 700 — will be zoned by an agent who did not write this code. Zoning is human
judgement (geography first, balanced with language), so a gate cannot decide whether a zoning is GOOD. It
can decide whether it still matches what the author SAID, which turns "did I zone this right?" from a
browser question into an exit code.

★ EVERY OBVIOUS RULE I WOULD HAVE WRITTEN FAILED THE REFERENCE IMPLEMENTATION. Measured against the live
28 zones and 2,107 records BEFORE writing the assertions, which is the only reason they are right:
  "every group in exactly one zone"  → 112 groups are in two. 110 are the DEAF BLOC, and that is
                                       design-approved (legend-tree.js:151, slice 08): an affinity bloc's
                                       members also live in a geographic zone. So the rule is "at most one
                                       GEOGRAPHIC zone", with bloc zones declared as a second partition.
  "no group is unzoned"              → 11 are, all JPN/CHN/MNG, plausibly deliberate. A gate cannot tell a
                                       deliberate exclusion from a silent drop; only a declaration can.
  "no two zones overlap"             → 3 non-bloc overlaps exist, because "Scattered / Diaspora"
                                       (country_codes AND,CCK,GUF,USA) overlaps the regions it scatters
                                       across.
A gate that fails on the only correct example of the thing it checks teaches people to disable it.

⚠ AND THE GATE FOUND A THIRD OVERLAP MY OWN HAND ANALYSIS HAD MISSED: deaf-cocos-islanders, in both
oceania-indonesia and uncovered-scatter. I had filtered out every A017 group as "the design-approved deaf
double-count" — but its TWO GEOGRAPHIC claims (CCK is in both zones' country lists) are a SEPARATE fact
from its bloc membership. Conflating them is exactly what A2's bloc/geographic split exists to prevent,
and the gate was right where I was wrong. Best argument for it existing.

THE FIVE ASSERTIONS, and two would have caught this cycle's real defects before a browser did:
  A1 no zone resolves to zero groups     ← `deaf` + the 5 wagf zones were in exactly this state, found
                                           only by generating all 28 and reading the log
  A2 at most one GEOGRAPHIC zone/group   ← blocs declared; found the overlap above
  A3 orphan set EQUALS the declared set  ← and a RESOLVED orphan fails too, deliberately: leaving a
                                           now-zoned group listed means the next real drop passes
                                           silently. An unmaintained declaration stops being evidence.
  A4 every selector type is supported    ← the evaluator THROWS on an unknown type, at render time, on one
                                           zone's page; better as a build-time failure on the whole set
  A5 no zone over the declared budget    ← a wildly oversized zone is usually a selector matching too much

DECLARATIONS pre-filled with today's actuals and marked PENDING DRIVER, per UPGPAT: the 11 orphans and
the 3 overlaps are recorded so the gate is green on arrival and any CHANGE fails. Both are in
DRIVER-DECISIONS-DIGEST and neither membership was touched.

VERIFIED: --self-test PASSes 12 cases, each assertion firing on a violation AND staying quiet on the
declared exception (including the negative control that A2's bloc exemption is doing the work). Poison
test on REAL data: removing ainu-japan from the declaration makes A3 fail with that slug, so a green run
is meaningful rather than vacuous.

⚠ AND A package.json MISTAKE WORTH RECORDING. My first insertion put all three keys into the //scripts
DOC block, because re.finditer over the whole file matched check:zone-census there (//scripts comes later
in the file) — producing duplicate keys that json.load silently resolved last-wins, so the script COUNT
WENT DOWN and `npm run check:zoning-declared` reported "Missing script". Fixed by scoping each insertion
to its own block span. The diff is now exactly 3 added lines and reorders nothing: an earlier attempt that
re-serialised the sorted object moved gospel's check:embed-contract and check:engine-contract, which is
not mine to reshuffle in a shared file.
2026-09-27 03:36:19 +00:00
..
assets/previews Rename app-profiles -> plugin-designs; build green under new naming (load-bearing paths updated, guards pass) 2026-09-17 18:18:18 +00:00
data A zoning gate that checks a list against what its author declared, not against my intuition 2026-09-27 03:36:19 +00:00
index.html Session work: strobe fix, grid layout, stacked tree legend, selection camera, chip bounding, asset inheritance, gates 2026-09-20 04:49:25 +00:00
index.js Six entries hand-rolled the RTL text plugin; the library already installs it 2026-09-26 13:35:57 +00:00
poster-wall.vue Merge main (studio landing 6) into packet/vertical 2026-09-27 01:39:28 +00:00
upg-100-list.vue Delete the two legend-content RTL rules the library owns — one was dead all along 2026-09-27 02:03:54 +00:00
upg-100-mfe.meta.json Rename app-profiles -> plugin-designs; build green under new naming (load-bearing paths updated, guards pass) 2026-09-17 18:18:18 +00:00
upg-100-mfe.vue No "tap a coloured dot" on UPG-100 at all — its map is a poster preview 2026-09-27 02:40:26 +00:00