@bongos/core 1.19.695 → 1.19.696

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,17 +3,17 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1759,
7
- "unique_ids": 1521,
8
- "certain": 1759,
6
+ "strings": 1749,
7
+ "unique_ids": 1513,
8
+ "certain": 1749,
9
9
  "heuristic": 0,
10
- "duplicate_ids": 165
10
+ "duplicate_ids": 164
11
11
  },
12
12
  "surfaces": {
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
- "files": 81,
16
- "strings": 1280
15
+ "files": 80,
16
+ "strings": 1270
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -176,18 +176,6 @@
176
176
  "modules/hall-ui/public/watch.js:1236"
177
177
  ]
178
178
  },
179
- {
180
- "id": "08afb1257b71",
181
- "surface": "builders-hall",
182
- "text": "Back to home",
183
- "occurrences": 4,
184
- "at": [
185
- "modules/hall-ui/public/drachmae.html:87",
186
- "modules/hall-ui/public/not-ready.html:38",
187
- "modules/hall-ui/public/primer.html:90",
188
- "modules/hall-ui/public/primer.js:283"
189
- ]
190
- },
191
179
  {
192
180
  "id": "90a128c97eae",
193
181
  "surface": "landing",
@@ -257,7 +245,7 @@
257
245
  "modules/hall-ui/public/hall-render.js:275",
258
246
  "modules/hall-ui/public/hall-render.js:346",
259
247
  "modules/hall-ui/public/hall-render.js:415",
260
- "modules/hall-ui/public/shell.js:413"
248
+ "modules/hall-ui/public/shell.js:416"
261
249
  ]
262
250
  },
263
251
  {
@@ -307,6 +295,17 @@
307
295
  "modules/hall-ui/public/harbor.js:340"
308
296
  ]
309
297
  },
298
+ {
299
+ "id": "08afb1257b71",
300
+ "surface": "builders-hall",
301
+ "text": "Back to home",
302
+ "occurrences": 3,
303
+ "at": [
304
+ "modules/hall-ui/public/drachmae.html:87",
305
+ "modules/hall-ui/public/primer.html:90",
306
+ "modules/hall-ui/public/primer.js:283"
307
+ ]
308
+ },
310
309
  {
311
310
  "id": "118026595c16",
312
311
  "surface": "builders-hall",
@@ -1011,16 +1010,6 @@
1011
1010
  "modules/hall-ui/public/profile.js:144"
1012
1011
  ]
1013
1012
  },
1014
- {
1015
- "id": "2c19f41704b9",
1016
- "surface": "builders-hall",
1017
- "text": "Not yet available — {{worldName}}",
1018
- "occurrences": 2,
1019
- "at": [
1020
- "modules/hall-ui/public/not-ready.html:6",
1021
- "modules/hall-ui/public/not-ready.html:6"
1022
- ]
1023
- },
1024
1013
  {
1025
1014
  "id": "ad9a17a8a5eb",
1026
1015
  "surface": "builders-hall",
@@ -1327,8 +1316,8 @@
1327
1316
  "text": "Sign out",
1328
1317
  "occurrences": 2,
1329
1318
  "at": [
1330
- "modules/hall-ui/public/shell.js:431",
1331
- "modules/hall-ui/public/shell.js:588"
1319
+ "modules/hall-ui/public/shell.js:434",
1320
+ "modules/hall-ui/public/shell.js:591"
1332
1321
  ]
1333
1322
  },
1334
1323
  {
@@ -2654,15 +2643,6 @@
2654
2643
  "origin": "html-text",
2655
2644
  "confidence": "certain"
2656
2645
  },
2657
- {
2658
- "id": "08afb1257b71",
2659
- "surface": "builders-hall",
2660
- "text": "Back to home",
2661
- "file": "modules/hall-ui/public/not-ready.html",
2662
- "line": 38,
2663
- "origin": "html-text",
2664
- "confidence": "certain"
2665
- },
2666
2646
  {
2667
2647
  "id": "08afb1257b71",
2668
2648
  "surface": "builders-hall",
@@ -5791,7 +5771,7 @@
5791
5771
  "surface": "builders-hall",
5792
5772
  "text": "Jump to a page or record",
5793
5773
  "file": "modules/hall-ui/public/shell.js",
5794
- "line": 452,
5774
+ "line": 455,
5795
5775
  "origin": "js-markup",
5796
5776
  "confidence": "certain"
5797
5777
  },
@@ -5800,7 +5780,7 @@
5800
5780
  "surface": "builders-hall",
5801
5781
  "text": "Jump to…",
5802
5782
  "file": "modules/hall-ui/public/shell.js",
5803
- "line": 454,
5783
+ "line": 457,
5804
5784
  "origin": "js-markup",
5805
5785
  "confidence": "certain"
5806
5786
  },
@@ -6848,33 +6828,6 @@
6848
6828
  "origin": "js-markup",
6849
6829
  "confidence": "certain"
6850
6830
  },
6851
- {
6852
- "id": "19adac0efed1",
6853
- "surface": "builders-hall",
6854
- "text": "Not yet available",
6855
- "file": "modules/hall-ui/public/not-ready.html",
6856
- "line": 30,
6857
- "origin": "html-text",
6858
- "confidence": "certain"
6859
- },
6860
- {
6861
- "id": "2c19f41704b9",
6862
- "surface": "builders-hall",
6863
- "text": "Not yet available — {{worldName}}",
6864
- "file": "modules/hall-ui/public/not-ready.html",
6865
- "line": 6,
6866
- "origin": "html-text",
6867
- "confidence": "certain"
6868
- },
6869
- {
6870
- "id": "2c19f41704b9",
6871
- "surface": "builders-hall",
6872
- "text": "Not yet available — {{worldName}}",
6873
- "file": "modules/hall-ui/public/not-ready.html",
6874
- "line": 6,
6875
- "origin": "html-title",
6876
- "confidence": "certain"
6877
- },
6878
6831
  {
6879
6832
  "id": "571b9b22dbda",
6880
6833
  "surface": "builders-hall",
@@ -7141,7 +7094,7 @@
7141
7094
  "surface": "builders-hall",
7142
7095
  "text": "Open navigation",
7143
7096
  "file": "modules/hall-ui/public/shell.js",
7144
- "line": 443,
7097
+ "line": 446,
7145
7098
  "origin": "js-markup",
7146
7099
  "confidence": "certain"
7147
7100
  },
@@ -8450,15 +8403,6 @@
8450
8403
  "origin": "js-markup",
8451
8404
  "confidence": "certain"
8452
8405
  },
8453
- {
8454
- "id": "fa1f021dbe21",
8455
- "surface": "builders-hall",
8456
- "text": "See how ranks work",
8457
- "file": "modules/hall-ui/public/not-ready.html",
8458
- "line": 37,
8459
- "origin": "html-text",
8460
- "confidence": "certain"
8461
- },
8462
8406
  {
8463
8407
  "id": "a9c398651862",
8464
8408
  "surface": "builders-hall",
@@ -8788,7 +8732,7 @@
8788
8732
  "surface": "builders-hall",
8789
8733
  "text": "Sign in with GitHub",
8790
8734
  "file": "modules/hall-ui/public/shell.js",
8791
- "line": 413,
8735
+ "line": 416,
8792
8736
  "origin": "js-markup",
8793
8737
  "confidence": "certain"
8794
8738
  },
@@ -8797,7 +8741,7 @@
8797
8741
  "surface": "builders-hall",
8798
8742
  "text": "Sign out",
8799
8743
  "file": "modules/hall-ui/public/shell.js",
8800
- "line": 431,
8744
+ "line": 434,
8801
8745
  "origin": "js-markup",
8802
8746
  "confidence": "certain"
8803
8747
  },
@@ -8806,7 +8750,7 @@
8806
8750
  "surface": "builders-hall",
8807
8751
  "text": "Sign out",
8808
8752
  "file": "modules/hall-ui/public/shell.js",
8809
- "line": 588,
8753
+ "line": 591,
8810
8754
  "origin": "js-markup",
8811
8755
  "confidence": "certain"
8812
8756
  },
@@ -8833,7 +8777,7 @@
8833
8777
  "surface": "builders-hall",
8834
8778
  "text": "Skip to content",
8835
8779
  "file": "modules/hall-ui/public/shell.js",
8836
- "line": 579,
8780
+ "line": 582,
8837
8781
  "origin": "js-text-assign",
8838
8782
  "confidence": "certain"
8839
8783
  },
@@ -9013,7 +8957,7 @@
9013
8957
  "surface": "builders-hall",
9014
8958
  "text": "Switch theme",
9015
8959
  "file": "modules/hall-ui/public/shell.js",
9016
- "line": 458,
8960
+ "line": 461,
9017
8961
  "origin": "js-markup",
9018
8962
  "confidence": "certain"
9019
8963
  },
@@ -9175,7 +9119,7 @@
9175
9119
  "surface": "builders-hall",
9176
9120
  "text": "Text size",
9177
9121
  "file": "modules/hall-ui/public/shell.js",
9178
- "line": 457,
9122
+ "line": 460,
9179
9123
  "origin": "js-markup",
9180
9124
  "confidence": "certain"
9181
9125
  },
@@ -9953,15 +9897,6 @@
9953
9897
  "origin": "html-text",
9954
9898
  "confidence": "certain"
9955
9899
  },
9956
- {
9957
- "id": "87f1c2e07790",
9958
- "surface": "builders-hall",
9959
- "text": "This page unlocks as you advance.",
9960
- "file": "modules/hall-ui/public/not-ready.html",
9961
- "line": 26,
9962
- "origin": "html-text",
9963
- "confidence": "certain"
9964
- },
9965
9900
  {
9966
9901
  "id": "69e8beced2ff",
9967
9902
  "surface": "builders-hall",
@@ -10601,15 +10536,6 @@
10601
10536
  "origin": "js-text-assign",
10602
10537
  "confidence": "certain"
10603
10538
  },
10604
- {
10605
- "id": "c368b56ecf40",
10606
- "surface": "builders-hall",
10607
- "text": "Xenos builders start with a focused set of pages — ship your first",
10608
- "file": "modules/hall-ui/public/not-ready.html",
10609
- "line": 31,
10610
- "origin": "html-text",
10611
- "confidence": "certain"
10612
- },
10613
10539
  {
10614
10540
  "id": "b6b0fcb2bcee",
10615
10541
  "surface": "builders-hall",
@@ -11825,15 +11751,6 @@
11825
11751
  "origin": "js-markup",
11826
11752
  "confidence": "certain"
11827
11753
  },
11828
- {
11829
- "id": "b5567b42fa52",
11830
- "surface": "builders-hall",
11831
- "text": "not yet",
11832
- "file": "modules/hall-ui/public/not-ready.html",
11833
- "line": 25,
11834
- "origin": "html-text",
11835
- "confidence": "certain"
11836
- },
11837
11754
  {
11838
11755
  "id": "8ca0a499ec86",
11839
11756
  "surface": "builders-hall",
@@ -12221,15 +12138,6 @@
12221
12138
  "origin": "js-markup",
12222
12139
  "confidence": "certain"
12223
12140
  },
12224
- {
12225
- "id": "ee431f143549",
12226
- "surface": "builders-hall",
12227
- "text": "three tasks",
12228
- "file": "modules/hall-ui/public/not-ready.html",
12229
- "line": 33,
12230
- "origin": "html-text",
12231
- "confidence": "certain"
12232
- },
12233
12141
  {
12234
12142
  "id": "d70c287bcd7f",
12235
12143
  "surface": "builders-hall",
@@ -12257,15 +12165,6 @@
12257
12165
  "origin": "html-text",
12258
12166
  "confidence": "certain"
12259
12167
  },
12260
- {
12261
- "id": "b8e12f871044",
12262
- "surface": "builders-hall",
12263
- "text": "to graduate and open the rest of {{worldName}}'s builder hub.",
12264
- "file": "modules/hall-ui/public/not-ready.html",
12265
- "line": 33,
12266
- "origin": "html-text",
12267
- "confidence": "certain"
12268
- },
12269
12168
  {
12270
12169
  "id": "7d54a818850d",
12271
12170
  "surface": "builders-hall",
package/docs/file-map.md CHANGED
@@ -134,7 +134,7 @@
134
134
  │ ├── sessions/ ← CORE-DOMAIN carve (BV1.R82, default-on): the session_records corpus + data plane (upload, cross-builder search/deep-dive), the BFG read-the-room scorer, session-pulse/stale-claim helpers. Registers no port — reached via HTTP POST to its own /sessions route; resolves the economy `reward` port for the cost-plus token reward. CLAUDE.md, module.json, routes/sessions.js, bfg.js, pulse.js.
135
135
  │ ├── autonomy/ ← CORE-DOMAIN carve (BV1.R83, default-on): the MAS autonomy surfaces — the $0 deterministic autonomy gate (System 3, inert until armed), the conductor/architect CLIs, and the in-process routine timers (incl. the weekly peer-vote-tally poller). Registers no port; resolves the lifecycle `tallyPeerVotes` doorway. CLAUDE.md, module.json, routes/autonomy.js, autonomy.js.
136
136
  │ ├── status-ui/ ← CORE-DOMAIN WEB-SURFACE carve (BV1.R84, default-on): the public status dashboard at status.<apex>, moved from public-status/. NO routes/db/port — declares contributes.webSurfaces:[{host:"status.",dir:"public"}], served by the loader web-surface seam (moduleWebSurfaces → serve-internal). CLAUDE.md, module.json, public/{index.html,status.js,style.css,cursors/,snapshots/}.
137
- │ ├── hall-ui/ ← CORE-DOMAIN WEB-SURFACE carve (BV1.R85, default-on): the authenticated builders' hall at builders.<apex>, moved from public-builders/ (~13k LOC, the largest). NO routes/db/port — declares contributes.webSurfaces:[{host:"builders.",dir:"public"}] for discovery, but UNLIKE status-ui keeps its DEDICATED serving block in serve-internal (the /builders shim + canonical redirects + citizen/Archon page gates + asset-stamping + hall-widget injection), partitioned out of the generic web-surface loop and served from BUILDERS_DIR. CLAUDE.md, module.json, public/{index.html,builders.js,style.css,work,watch,harbor,gate,pair,settings,ranks,sessions,primer,diagrams,atlas,...}.{html,js},cursors/,chime.wav. Four ARCHETYPE sheets sit beside the per-page ones: `record.css` (the task + idea records, task 1003305), `room.css` (the READING ROOMS — the primer + the diagrams index, task 1003306: the reading measure and rhythm, the table of contents, the progress hairline and the framed figure diagram-viewer.js upgrades on both pages), `oversight.css` (the OVERSIGHT family — government, watch, harbor, gate, task 1003469: the row, the figure band inside a panel, the group head, the inline form, the grant toggle and the shared confirm modal; named oversight because the vocabulary wall bans "governance" on the government surface) and `panel.css` (the PANEL family — settings, profile, pair, not-ready, task 1003308: the row, the switch, the field with its label above, the chip control, the four voices and the sign-in gate; the hall's my-projects page was DELETED in the same task — "my projects" is the hub's user-level page, and the hall keeps no link or redirect). A page sheet then holds only what one page has and the others do not — `primer.css` the acknowledge gate, `diagrams.css` the legend strip, `gate.css` the hold reasons and file chips, `watch.css` the severities, the report reader and the grade trend, `settings.css` the rail layout, the group head, the token ladder and the voices grid, `profile.css` the identity band and the shelf, `pair.css` the device row, `people.css` the directory's identity cell (task 1003470 made the legacy door `/scouting` ship the same body and script as `/people`; task 1003440 then deleted the door — `scouting.html` and `scouting.states.json` are gone and the URL 301s to `/people`).
137
+ │ ├── hall-ui/ ← CORE-DOMAIN WEB-SURFACE carve (BV1.R85, default-on): the authenticated builders' hall at builders.<apex>, moved from public-builders/ (~13k LOC, the largest). NO routes/db/port — declares contributes.webSurfaces:[{host:"builders.",dir:"public"}] for discovery, but UNLIKE status-ui keeps its DEDICATED serving block in serve-internal (the /builders shim + canonical redirects + citizen/Archon page gates + asset-stamping + hall-widget injection), partitioned out of the generic web-surface loop and served from BUILDERS_DIR. CLAUDE.md, module.json, public/{index.html,builders.js,style.css,work,watch,harbor,gate,pair,settings,ranks,sessions,primer,diagrams,atlas,...}.{html,js},cursors/,chime.wav. Four ARCHETYPE sheets sit beside the per-page ones: `record.css` (the task + idea records, task 1003305), `room.css` (the READING ROOMS — the primer + the diagrams index, task 1003306: the reading measure and rhythm, the table of contents, the progress hairline and the framed figure diagram-viewer.js upgrades on both pages), `oversight.css` (the OVERSIGHT family — government, watch, harbor, gate, task 1003469: the row, the figure band inside a panel, the group head, the inline form, the grant toggle and the shared confirm modal; named oversight because the vocabulary wall bans "governance" on the government surface) and `panel.css` (the PANEL family — settings, profile, pair, task 1003308: the row, the switch, the field with its label above, the chip control, the four voices and the sign-in gate; the hall's my-projects page was DELETED in the same task — "my projects" is the hub's user-level page, and the hall keeps no link or redirect; the family's fourth page `not-ready.html` was deleted by task 1003450, along with the emptied `requireNonXenosPage` gate that was the only thing redirecting to it). A page sheet then holds only what one page has and the others do not — `primer.css` the acknowledge gate, `diagrams.css` the legend strip, `gate.css` the hold reasons and file chips, `watch.css` the severities, the report reader and the grade trend, `settings.css` the rail layout, the group head, the token ladder and the voices grid, `profile.css` the identity band and the shelf, `pair.css` the device row, `people.css` the directory's identity cell (task 1003470 made the legacy door `/scouting` ship the same body and script as `/people`; task 1003440 then deleted the door — `scouting.html` and `scouting.states.json` are gone and the URL 301s to `/people`).
138
138
  │ ├── lifecycle/ ← CORE-DOMAIN carve (BV1.R86, default-on): the build state machine — tasks · claims · versions · done-when · goals · dependencies · claim→ship→grade→credit · github-push + merge-lock + conflict-resolve + publish-reconciler. The LAST, most-coupled carve; registers the `lifecycle` kernel port (createTask, classifyTaskKind, tallyPeerVotes, work-tracking reads). CLAUDE.md, module.json, routes/{tasks,claims,versions,done-when,goals,dependencies,gate-approvals,analytics}.js, lifecycle.js, github-push.js, merge-lock.js, conflict-resolve.js, publish-reconciler.js, task-visuals.js + task-visual-db.js + routes/visuals.js (the optional ship-time visual, task 1003109 — the route file is NOT named task-*.js on purpose; see the module CLAUDE.md).
139
139
  │ ├── copy-desk/ ← CORE-DOMAIN module (task 1003113 / R02 of goal 1000074, default-on): the COPY half of the design contract — ADR 0081 gave design TOKENS a repo-owned source of truth, text had none. Owns the FLAG (anyone in any role marks a string or a whole surface as needing an artist's attention, with a reason required in BOTH the route and a CHECK constraint) and the QUEUE an artist reads it from. READS R01's committed registry (docs/copy-registry.json, generated by scripts/gds/copy-inventory.js) and never writes it. NO LIVE CMS is the hard non-goal: no column here could hold replacement text, and copy_no_cms.mjs pins that. Key is `copy-desk`, not `copy` — the branding contract already owns a `copy` block, so the bare word reds the "core carries no module code" fitness check. R03 (task 1003114, ADR 0233) added the PROPOSAL: an artist writes the replacement wording and it becomes a Bongos task carrying a fenced copy-proposal patch — no row, NO second migration (a proposals table is the forbidden column with extra steps), and scripts/gds/copy-apply.js lands it as a real diff under a claim. CLAUDE.md, module.json, registry.js, flags.js, proposals.js, routes/copy-desk.js, migrations/copy_desk_001_flags.sql, tests/{copy_flags,copy_queue,copy_no_cms,copy_proposals}.mjs. Its hall surface lives with hall-ui (public/copy-desk.{html,js,css}), per the one-key-per-web-surface precedent.
140
140
  │ ├── ui-design/ ← CORE-DOMAIN module (task 1003324 / ADR 0197, default-on): the design capability every builder on every instance gets — ships METHOD, never a world. Absorbs ADR 0081's layer: adapters/{claude-design,figma}/index.js (moved from src/ui/adapters/), scripts/{design-sync,figma-design-sync,validate-design}.js (moved from scripts/gds/, which keeps thin shims), docs/design-contract.md (moved from docs/). Declaration-only: contributes.skills design (the /design playbook, new) + design-sync + figma-design-sync; no routes/port/migrations, so disabling it touches no served surface. CLAUDE.md separates the platform FLOORS (the Fifteen Rule, the dark twins, no page :root, the 24px floor, AA in both modes, the kill switch) from the instance's WORLD (its packs + DESIGN.md). kit/ (task 1003320) is the look-before-you-ship kit: lib.js (the floors, the states/probes contracts, the action + expectation vocabularies, the WCAG maths, the stub spawner), serve.js (any surface through the doorway's real transforms + fixtures/), render.js (states × 1440/390/320 × dark/light, audited), probe.js (PASS/FAIL contracts), check-mock.js (platform rules + the instance's DESIGN.md taste bans, then the detector), tells.js (task 1003329 / ADR 0223: the anti-pattern detector as two tiers — floors FAIL, craft tells WARN, kit-ignore waivers per file; the rendered twins live in lib.js factsInPage), contrast.js + png.js; a page's <page>.states.json / <page>.probes.json sit BESIDE the surface (modules/public-landing/public/, modules/hall-ui/public/). Recipe: docs/recipes/ui-look-before-you-ship.md. skills/ (task 1003321 / ADR 0198) is the vendoring policy: policy.json (licence allowlist, verdicts that may land, sidecar fields, preamble markers), PREAMBLE.md (the platform preamble every vendored SKILL.md opens with), README.md (the roster — both origins scanned dangerous on 2026-08-28, landed as rebuild specs; nothing vendored — and the landing recipe); a landable copy goes under skills/vendor/<name>/ with PROVENANCE.md + LICENSE and is materialised into an instance's .claude/skills/ by claude-materialize.js step 1b. skills/<name>/ (task 1003325 / ADR 0220) are the in-house rebuilds from the specs, first-party and counted: design-taste-frontend (the default taste skill), design-taste-frontend-v1 (the earlier generation, kept distinct), high-end-visual-design (the polish pass), redesign-existing-projects (the in-place upgrade); each opens with the same preamble and carries a "Rebuilt from" section instead of a sidecar. impeccable/ (task 1003326 / ADR 0221) is the design-craft method as ONE skill with sub-commands: SKILL.md (the router, the menu, the craft floor, the bounded finish) + reference/<sub-command>.md (eighteen playbooks, one loaded per request); no hooks, no bypass agent, no telemetry, no live server. minimalist-ui/, industrial-brutalist-ui/, gpt-taste/, stitch-design-taste/ (task 1003327 / ADR 0230) are the four looks, composition grammars with no colours of their own: the palette is the instance's pack and the texture is a named entry in styles/; a substrate is an archetype that still ships both modes, gpt-taste's selection is derived from the route rather than rolled, and stitch-design-taste writes a DESIGN.md-shaped contract document whose thirteen are transcribed from the pack. image-to-code/, imagegen-frontend-web/, imagegen-frontend-mobile/, brandkit/ (task 1003328 / ADR 0222) are the image family under the hero-only rule: plates and hero objects only, the pair (JPEG dark plate + WebP alpha cutout) with a <file>.json sidecar beside each, through the instance's art pipeline key; the grove specimen's styles/grove/assets/ is the worked example. style/ (task 1003475 / ADR 0231) is the module's first FIRST-PARTY skill (no upstream, so a `## First party` section instead of `## Rebuilt from`): the /style session in which an owner authors their own look in four bounded steps, rendering the nearest library entries before asking, drafting inside the contract, retuning by measurement, and handing over the one-step adoption without ever writing config/branding.json. styles/ (task 1003323 / ADR 0219) is the style library: <name>/pack.json (the theme.ui overlay, exactly the fifteen) + DESIGN.md (the look's derived recipes, thirteen in lockstep with the pack) + mock.html (the specimen); chrome-world (pinned to the neutral pack), expedition, grove, blueprint (the first cool look, authored through /style at task 1003475); STYLE=<name> on the kit lays a look over the instance's pack through GDS_BRANDING_FILE; tests/ui_design_styles.mjs runs the world/cosmos/hall token suites once per alternate (UI_DESIGN_PACK). config/design-tokens.* + design-sources.json STAY in config/ as the host boundary; public-landing keeps its own key (first customer, not owner).
@@ -1849,5 +1849,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
1849
1849
  landed since 1.19.693 with no explicit bump. run 34731674808. (task 1002620)
1850
1850
  1.19.695 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1851
1851
  landed since 1.19.694 with no explicit bump. run 34732266878. (task 1002620)
1852
+ 1.19.696 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1853
+ landed since 1.19.695 with no explicit bump. run 34733145358. (task 1002620)
1852
1854
  ---------------------------------------------------------------------------
1853
1855
  ```
@@ -246,7 +246,15 @@ const PERMISSIONS = [
246
246
 
247
247
  // ── ownership-scoped + baseline own-work (floor thetes / xenos) ───────────────
248
248
  { key: 'task.claim.any', system: false, floor: 'thetes', guards: 'claim the general queue (per-task requires_rank floor still applies)' },
249
- { key: 'page.view.builder', system: false, floor: 'thetes', guards: 'authenticated hall pages (requireNonXenosPage / requireBuilderPage)' },
249
+ // Guards NOTHING in the core, and that is recorded rather than hidden. It floored
250
+ // the hall's thetes+ page tier until task 1002710 moved the orientation reading
251
+ // rooms down to signed-in, and task 1003450 then deleted the emptied gate. The
252
+ // atom stays because governance_002 seeds it at thetes, metic and archon in the
253
+ // live DB and an Archon can still grant it — so a module or instance can floor a
254
+ // surface at thetes with `requirePermission('page.view.builder')`. Naming a
255
+ // deleted gate function here is what this string used to do; if the core gates
256
+ // something on it again, say WHICH surface.
257
+ { key: 'page.view.builder', system: false, floor: 'thetes', guards: 'nothing in the core today — seeded and attachable, for a module or instance that wants a thetes+ floor' },
250
258
  // floor 'metic' is real but NOT the whole gate — the `criterion.create` pattern
251
259
  // above, and here the floor is the LOOSER half. Both routes carry requireBuilder
252
260
  // and decide in-handler (authorizeMembershipKindChange / authorizeOwnershipTransfer,
@@ -301,7 +309,7 @@ const PERMISSIONS = [
301
309
  // `requireGovernmentPage`) once the floor moved. Viewing is all this grants: every
302
310
  // write those pages reach is its own atom, and `government.manage` (the
303
311
  // ranks/permissions tab) stayed archon.
304
- { key: 'page.view.government', system: false, floor: 'metic', guards: 'the government/monitoring pages — /watch, /harbor, /gate (requireGovernmentPage; write = government.manage, archon)' },
312
+ { key: 'page.view.government', system: false, floor: 'metic', guards: 'the government/monitoring pages — /watch, /harbor, /gate, /government (requireGovernmentPage; write = government.manage, archon)' },
305
313
  ];
306
314
 
307
315
  // ── invariants asserted at module load (fail loud on an authoring typo) ─────────
@@ -1,7 +1,7 @@
1
1
  /* panel.css — the PANEL archetype: a titled panel that holds a form, read top
2
- to bottom (task 1003308, goal 1000081). Shared by settings, profile, pair,
3
- and not-ready — the pages where the builder reads a label, a
4
- sentence of consequence, and then acts on ONE control.
2
+ to bottom (task 1003308, goal 1000081). Shared by settings, profile and pair
3
+ the pages where the builder reads a label, a sentence of consequence, and then
4
+ acts on ONE control. (not-ready was a fourth until task 1003450 deleted it.)
5
5
 
6
6
  THE ARCHETYPE is v3 "the glass hall", the owner's pick from the composition
7
7
  round — docs/design/hall-direction-v2.md §6, mock
@@ -10,8 +10,8 @@
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
12
12
  <!-- The PANEL archetype (task 1003308): the row, the switch, the field, the
13
- chip control and the family's voices, shared with profile, pair and
14
- not-ready. settings.css then holds only what this page
13
+ chip control and the family's voices, shared with profile and pair.
14
+ settings.css then holds only what this page
15
15
  has — the rail layout, the group head, the token ladder, the voices grid. -->
16
16
  <link rel="stylesheet" href="/builders/panel.css">
17
17
  <link rel="stylesheet" href="/builders/settings.css">
@@ -311,7 +311,10 @@
311
311
  { id: 'project-settings', label: 'Project settings', icon: 'admin', href: '/project-settings', gate: 'government' },
312
312
  // BV1.R113: the roles-and-permissions tab (ADR 0151). The one genuinely
313
313
  // Archon-only item the 'government' gate comment anticipated — cosmetic
314
- // only; requireGovernmentManagePage (the government.manage atom) is the wall.
314
+ // only. The wall is the `government.manage` atom checked on each of the
315
+ // tab's nine data routes (route-rank-check.js); the page SHELL itself is
316
+ // metic+, because R16 made /government three rooms and only this one is
317
+ // the archon surface.
315
318
  { id: 'government', label: 'Permissions', icon: 'admin', href: '/government', gate: 'archon' } // NOT 'Ranks': /ranks is the signed-in ladder explainer and two nav items
316
319
  // reading 'Ranks' is the confusion this rename exists to remove. This tab
317
320
  // is where a rank's permissions are granted, so it says what it does.,
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.695",
3
+ "version": "1.19.696",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.695",
9
+ "version": "1.19.696",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.695",
3
+ "version": "1.19.696",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
@@ -398,8 +398,10 @@ function signInWithReturn(req) {
398
398
  // that gate's EXISTING rank floor, so the audience is unchanged over the four live
399
399
  // ranks (catalog.RANK_ORDER):
400
400
  // requireBuilderPage was "any session" floor xenos → page.view.public
401
- // requireNonXenosPage was rank !== 'xenos' floor thetes → page.view.builder
402
401
  // requireGovernmentPage was rank === 'archon' floor archon → page.view.government
402
+ // (R107 migrated a third, `requireNonXenosPage` → page.view.builder, thetes+. It
403
+ // guarded the orientation reading rooms until task 1002710 moved them down a tier,
404
+ // and task 1003450 deleted the gate once nothing had dispatched it for a release.)
403
405
  // That third gate was spelled `requireArchonPage` until ADR 0157 lowered
404
406
  // page.view.government's floor archon→metic and the name stopped being true; the
405
407
  // floor now lives in modules/government/catalog.js, not in the function's name.
@@ -410,16 +412,19 @@ function signInWithReturn(req) {
410
412
  //
411
413
  // `deniedTo` is NEVER the sign-in flow. A visitor on that branch already HAS a
412
414
  // session, so bouncing them into sign-in returns them to the same gate — an
413
- // infinite loop. Every destination below is an ungated hall page:
415
+ // infinite loop. Every destination below is an ungated hall page — and it is
416
+ // /builders for every gate, because the REFUSAL ITSELF is carried in the query
417
+ // string: the redirect appends ?denied=<permission>, and the hall shell renders
418
+ // "you're signed in, but that page needs <permission>" on whatever page it lands
419
+ // on (shell.js renderDeniedNotice, task 1002613). A bespoke refusal PAGE per tier
420
+ // is the thing that mechanism replaced — /builders/not-ready was the last one, and
421
+ // task 1003450 deleted it: it hard-coded one tier's remedy ("ship three tasks"),
422
+ // could not name the permission actually missing, and by then nothing reached it.
414
423
  // - /builders the hall home. A signed-in builder who lacks the page's
415
424
  // permission IS still a citizen, so send them home.
416
- // - /builders/not-ready the friendly notice for the orientation reading rooms;
417
- // it shows the rank ladder and a way back to the hall.
418
425
  const PAGE_GATES = Object.freeze({
419
426
  requireBuilderPage: Object.freeze({ permission: 'page.view.public', deniedTo: '/builders' }),
420
- requireNonXenosPage: Object.freeze({ permission: 'page.view.builder', deniedTo: '/builders/not-ready' }),
421
427
  requireGovernmentPage: Object.freeze({ permission: 'page.view.government', deniedTo: '/builders' }),
422
- requireGovernmentManagePage: Object.freeze({ permission: 'government.manage', deniedTo: '/builders' }),
423
428
  // `alsoAdmits` — a SECOND, non-rank audience this page's DATA ROUTE admits, so
424
429
  // the page can follow it (ADR 0210, task 1002290). /people fronts GET /scouting,
425
430
  // which since R14 admits a `project.curate` holder OR a PROJECT OWNER; a page
@@ -593,15 +598,6 @@ async function requireGovernmentPage(req, res, next) {
593
598
  return runPageGate('requireGovernmentPage', req, res, next);
594
599
  }
595
600
 
596
- // The /governance roles-and-permissions tab (BV1.R113) — gated on the
597
- // `government.manage` ATOM itself (system, archon floor), the same key every
598
- // /governance/* data route checks, so the page layer can never drift wider than
599
- // the API it fronts. Defense-in-depth as above: the data endpoints are all
600
- // independently gated; this keeps the tab shell from rendering for anyone else.
601
- async function requireGovernmentManagePage(req, res, next) {
602
- return runPageGate('requireGovernmentManagePage', req, res, next);
603
- }
604
-
605
601
  // The /people builder-directory page (task 1002577) — gated on the
606
602
  // `project.curate` ATOM, the same key its one data route (GET /scouting,
607
603
  // modules/platform-identity) checks, so the page layer can never drift wider
@@ -624,14 +620,6 @@ async function requireBoardVotePage(req, res, next) {
624
620
  return runPageGate('requireBoardVotePage', req, res, next);
625
621
  }
626
622
 
627
- // The orientation reading rooms (the citizen's primer, the system-maps/diagrams)
628
- // that #766 closed to newcomers and #770 enforces at the URL. A Xenos's path is
629
- // action-only — find work, claim, ship three — so these pages are reserved for
630
- // graduated citizens (Thetes+).
631
- async function requireNonXenosPage(req, res, next) {
632
- return runPageGate('requireNonXenosPage', req, res, next);
633
- }
634
-
635
623
  // ---------------------------------------------------------------------------
636
624
  // Route-gate inventory (V3.R06 #231) — the canonical "who can call what" list.
637
625
  // Derived from ADR 0016's fail-closed rule: privileged routes that mutate
@@ -919,8 +907,6 @@ module.exports = {
919
907
  requireBuilder,
920
908
  requireBuilderPage,
921
909
  requireGovernmentPage,
922
- requireGovernmentManagePage,
923
- requireNonXenosPage,
924
910
  requireProjectCuratePage,
925
911
  requireBoardVotePage,
926
912
  requireRank,
@@ -840,9 +840,10 @@ function mountInternalSurfaces(app) {
840
840
  // parsing this file statically, and a comment in that gap drops the regex out of
841
841
  // the map. Prose goes above the const, as here.
842
842
  const PROJECT_SETTINGS_PAGE_RE = /^\/builders\/project-settings(?:\.html)?\/?$/;
843
- // The /government ranks-and-permissions tab (BV1.R113) sits one floor higher:
844
- // the `government.manage` atom itself (archon), the same key its data routes
845
- // check requireGovernmentManagePage, not the metic-floored gate above.
843
+ // The /government page. Its SHELL takes the same metic+ gate as the branch
844
+ // above (R16 widened it there — see the dispatch comment below); the archon
845
+ // wall for the ranks-and-permissions room is `government.manage`, checked per
846
+ // route in route-rank-check.js, never at this layer.
846
847
  const GOVERNMENT_PAGE_RE = /^\/builders\/government(?:\.html)?\/?$/;
847
848
  // /board-room — the Board Room, carved out of the /government tab strip onto
848
849
  // its own page (ADR 0266). It does NOT take the gate above. Its atom is
@@ -1015,8 +1016,8 @@ function mountInternalSurfaces(app) {
1015
1016
  // is only cosmetic.
1016
1017
  //
1017
1018
  // Scope is deliberately narrow: the hall index (/builders), the shared assets
1018
- // (style.css, *.js, fonts, cursors), the not-ready notice, and the sign-in flow
1019
- // itself stay PUBLIC so the landing card + GitHub button render for a stranger.
1019
+ // (style.css, *.js, fonts, cursors) and the sign-in flow itself stay PUBLIC so
1020
+ // the landing card + GitHub button render for a stranger.
1020
1021
  //
1021
1022
  // ONE tier of gate: ANY SIGNED-IN BUILDER — the Work Board, Roadmap, the Goals
1022
1023
  // page, the task-detail page, the Repo Atlas, the Dev Box pair page, Settings
@@ -1028,12 +1029,13 @@ function mountInternalSurfaces(app) {
1028
1029
  // (task 1291) — while still staying behind sign-in: it shows personal prefs
1029
1030
  // and mints CLI tokens.
1030
1031
  //
1031
- // The reading rooms USED to sit a tier above this, behind requireNonXenosPage
1032
- // (page.view.builder, thetes+), on #770's reasoning that a Xenos's path is
1033
- // action-only. That got it backwards: the citizen's primer and the onboarding
1034
- // diagrams are written FOR the first-session newcomer, and gating them at
1035
- // thetes redirected exactly that reader to /builders/not-ready. Owner's call
1036
- // (task 1002710) — the RANK floor is gone; sign-in is unchanged.
1032
+ // The reading rooms USED to sit a tier above this, behind a thetes+ gate
1033
+ // (page.view.builder), on #770's reasoning that a Xenos's path is action-only.
1034
+ // That got it backwards: the citizen's primer and the onboarding diagrams are
1035
+ // written FOR the first-session newcomer, and gating them at thetes redirected
1036
+ // exactly that reader away. Owner's call (task 1002710) — the RANK floor is
1037
+ // gone; sign-in is unchanged. Task 1003450 then deleted the emptied gate and
1038
+ // the bespoke refusal page it pointed at, neither of which anything reached.
1037
1039
  // The link-hiding in shell.js is only cosmetic; these are the real gates.
1038
1040
  // task 1003113: copy-desk joins this tier rather than a higher one. Filing a
1039
1041
  // flag is open to every rank by design (see the nav comment in shell.js), so
package/src/module-api.js CHANGED
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
71
71
  // there. scripts/gds/bump-version.js still rewrites the literal below; it appends
72
72
  // the entry to that file. Look for a version's history there, not here.
73
73
  // ---------------------------------------------------------------------------
74
- const CORE_VERSION = '1.19.695'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
74
+ const CORE_VERSION = '1.19.696'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
75
75
 
76
76
  // A namespaced logger so a module's log lines are attributable + consistent.
77
77
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -92,19 +92,20 @@ test('AUDIT: every async middleware mounted directly on a router owns its reject
92
92
  // The enumeration, kept as an executable assertion rather than prose so it cannot
93
93
  // rot: a NEW bare `async function require*` added later fails this test.
94
94
  // requireBuilder — the API gate. Guarded here (BV1.R109-follow-up).
95
- // requireBuilderPage \
96
- // requireGovernmentPage \
97
- // requireGovernmentManagePage \ all SIX delegate to runPageGate, guarded by BV1.R107.
98
- // requireNonXenosPage / (the R113 roles-tab gate; the /people curate
99
- // requireProjectCuratePage / gate; the ADR 0266 /board-room vote gate)
100
- // requireBoardVotePage /
95
+ // requireBuilderPage \
96
+ // requireGovernmentPage \ all FOUR delegate to runPageGate, guarded by
97
+ // requireProjectCuratePage / BV1.R107 (the /people curate gate; the
98
+ // requireBoardVotePage / ADR 0266 /board-room vote gate)
99
+ // Task 1003450 removed two more — requireNonXenosPage and the R113
100
+ // requireGovernmentManagePage — which had both ended up dispatched from no
101
+ // route at all; tests/hall_page_gate_map.mjs now fails if that recurs.
101
102
  // Anything else async and router-mounted must be added with its own try/catch.
102
103
  const src = fs.readFileSync(path.join(ROOT, 'src', 'bongos', 'auth.js'), 'utf8');
103
104
  const asyncMw = [...src.matchAll(/^async function (require\w+|allow\w+)\s*\(req, res, next\)/gm)].map((m) => m[1]);
104
- assert.deepEqual(asyncMw.sort(), ['requireBoardVotePage', 'requireBuilder', 'requireBuilderPage', 'requireGovernmentManagePage', 'requireGovernmentPage', 'requireNonXenosPage', 'requireProjectCuratePage'],
105
+ assert.deepEqual(asyncMw.sort(), ['requireBoardVotePage', 'requireBuilder', 'requireBuilderPage', 'requireGovernmentPage', 'requireProjectCuratePage'],
105
106
  'a new async router middleware appeared — give it a try/catch and add it here');
106
107
  // The page gates must actually delegate (that is WHY they are safe).
107
- for (const name of ['requireBuilderPage', 'requireGovernmentPage', 'requireGovernmentManagePage', 'requireNonXenosPage', 'requireProjectCuratePage', 'requireBoardVotePage']) {
108
+ for (const name of ['requireBuilderPage', 'requireGovernmentPage', 'requireProjectCuratePage', 'requireBoardVotePage']) {
108
109
  const fn = src.slice(src.indexOf(`async function ${name}`));
109
110
  assert.match(sliceFn(fn), /runPageGate\(/, `${name} must delegate to the guarded runPageGate`);
110
111
  }