@bongos/core 1.24.80 → 1.24.82

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.
Files changed (123) hide show
  1. package/.bongos-core.json +154 -124
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +5 -0
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md +142 -0
  8. package/docs/adr/README.md +1 -0
  9. package/docs/api/openapi.json +86 -2
  10. package/docs/api-reference.md +4 -2
  11. package/docs/copy-inventory.md +51 -50
  12. package/docs/copy-registry.json +121 -123
  13. package/docs/module-api-changelog.md +4 -0
  14. package/docs/page-inventory.json +2 -3
  15. package/docs/page-readings.json +226 -220
  16. package/modules/builder-settings/hall-view-prefs.js +50 -0
  17. package/modules/builder-settings/routes/settings.js +32 -0
  18. package/modules/hall-ui/public/ai-studio.html +5 -3
  19. package/modules/hall-ui/public/ai-studio.states.json +1 -0
  20. package/modules/hall-ui/public/atlas.html +3 -3
  21. package/modules/hall-ui/public/atlas.states.json +1 -0
  22. package/modules/hall-ui/public/blockers.html +3 -3
  23. package/modules/hall-ui/public/board-room.html +3 -3
  24. package/modules/hall-ui/public/board-room.states.json +1 -0
  25. package/modules/hall-ui/public/city.css +1 -3
  26. package/modules/hall-ui/public/city.html +6 -9
  27. package/modules/hall-ui/public/city.js +10 -55
  28. package/modules/hall-ui/public/city.states.json +7 -32
  29. package/modules/hall-ui/public/collab.html +3 -3
  30. package/modules/hall-ui/public/collab.states.json +1 -0
  31. package/modules/hall-ui/public/commands.html +3 -3
  32. package/modules/hall-ui/public/commands.states.json +1 -0
  33. package/modules/hall-ui/public/controls.css +63 -11
  34. package/modules/hall-ui/public/copy-desk.html +3 -3
  35. package/modules/hall-ui/public/copy-desk.states.json +1 -0
  36. package/modules/hall-ui/public/deploy.html +3 -3
  37. package/modules/hall-ui/public/deploy.states.json +1 -0
  38. package/modules/hall-ui/public/goal-map.html +4 -4
  39. package/modules/hall-ui/public/goals.html +3 -3
  40. package/modules/hall-ui/public/goals.states.json +1 -0
  41. package/modules/hall-ui/public/government.html +3 -3
  42. package/modules/hall-ui/public/government.states.json +1 -0
  43. package/modules/hall-ui/public/idea.html +3 -3
  44. package/modules/hall-ui/public/idea.states.json +1 -0
  45. package/modules/hall-ui/public/ideas.html +3 -3
  46. package/modules/hall-ui/public/ideas.states.json +1 -0
  47. package/modules/hall-ui/public/index-founding.states.json +1 -0
  48. package/modules/hall-ui/public/index-genesis-decide.states.json +1 -0
  49. package/modules/hall-ui/public/index-genesis-demo.states.json +1 -0
  50. package/modules/hall-ui/public/index-genesis.states.json +1 -0
  51. package/modules/hall-ui/public/index.html +5 -5
  52. package/modules/hall-ui/public/index.states.json +1 -0
  53. package/modules/hall-ui/public/market-watch-item.html +3 -3
  54. package/modules/hall-ui/public/market-watch-item.states.json +1 -0
  55. package/modules/hall-ui/public/market-watch-rules.html +3 -3
  56. package/modules/hall-ui/public/market-watch-rules.states.json +1 -0
  57. package/modules/hall-ui/public/market-watch.html +3 -3
  58. package/modules/hall-ui/public/market-watch.states.json +1 -0
  59. package/modules/hall-ui/public/modules.html +3 -3
  60. package/modules/hall-ui/public/modules.states.json +1 -0
  61. package/modules/hall-ui/public/money.html +3 -3
  62. package/modules/hall-ui/public/money.states.json +1 -0
  63. package/modules/hall-ui/public/my-agents.html +3 -3
  64. package/modules/hall-ui/public/my-agents.states.json +1 -0
  65. package/modules/hall-ui/public/options-menu.js +2 -1
  66. package/modules/hall-ui/public/primer.html +3 -3
  67. package/modules/hall-ui/public/primer.states.json +1 -0
  68. package/modules/hall-ui/public/profile.html +3 -3
  69. package/modules/hall-ui/public/profile.states.json +1 -0
  70. package/modules/hall-ui/public/project-settings.html +3 -3
  71. package/modules/hall-ui/public/roster.html +3 -3
  72. package/modules/hall-ui/public/roster.states.json +1 -0
  73. package/modules/hall-ui/public/settings-view.js +75 -0
  74. package/modules/hall-ui/public/settings.html +17 -4
  75. package/modules/hall-ui/public/settings.states.json +1 -0
  76. package/modules/hall-ui/public/shell-game.css +97 -42
  77. package/modules/hall-ui/public/shell-game.js +138 -40
  78. package/modules/hall-ui/public/shell.js +12 -43
  79. package/modules/hall-ui/public/street-card.states.json +1 -0
  80. package/modules/hall-ui/public/street.css +1 -5
  81. package/modules/hall-ui/public/street.html +5 -9
  82. package/modules/hall-ui/public/street.js +8 -59
  83. package/modules/hall-ui/public/street.states.json +7 -32
  84. package/modules/hall-ui/public/studio.html +3 -3
  85. package/modules/hall-ui/public/studio.states.json +1 -0
  86. package/modules/hall-ui/public/style.css +126 -65
  87. package/modules/hall-ui/public/task.html +3 -3
  88. package/modules/hall-ui/public/task.states.json +1 -0
  89. package/modules/hall-ui/public/thinking.html +4 -4
  90. package/modules/hall-ui/public/thinking.states.json +1 -0
  91. package/modules/hall-ui/public/tweak-editor.html +3 -3
  92. package/modules/hall-ui/public/tweak-editor.states.json +1 -0
  93. package/modules/hall-ui/public/visor.js +7 -1
  94. package/modules/hall-ui/public/watch.html +3 -3
  95. package/modules/hall-ui/public/watch.states.json +1 -0
  96. package/modules/hall-ui/public/work-founding.states.json +1 -0
  97. package/modules/hall-ui/public/work.html +3 -3
  98. package/modules/hall-ui/public/work.states.json +1 -0
  99. package/modules/hall-ui/records/game-mode.md +5 -4
  100. package/modules/hall-ui/records/start-screen.md +10 -2
  101. package/modules/hall-ui/specimens/components.states.json +2 -1
  102. package/modules/ui-design/public/brand.html +2 -2
  103. package/package-lock.json +2 -2
  104. package/package.json +1 -1
  105. package/release-notes.json +12 -0
  106. package/scripts/hall-preview/README.md +2 -3
  107. package/scripts/hall-preview/pref-writes.js +8 -1
  108. package/src/bongos/serve-internal.js +7 -2
  109. package/src/hall-helm.js +79 -0
  110. package/src/module-api.js +1 -1
  111. package/tests/design_reference.mjs +1 -1
  112. package/tests/hall_builders_page_pass.mjs +2 -1
  113. package/tests/hall_city.mjs +15 -29
  114. package/tests/hall_controls.mjs +52 -4
  115. package/tests/hall_fullscreen.mjs +42 -21
  116. package/tests/hall_helm.mjs +187 -0
  117. package/tests/hall_record_world.mjs +4 -2
  118. package/tests/hall_start_screen.mjs +103 -5
  119. package/tests/hall_street.mjs +13 -26
  120. package/tests/hall_topbar_320.mjs +4 -2
  121. package/tests/hall_view_prefs.mjs +42 -0
  122. package/tests/hall_visor.mjs +3 -2
  123. package/tests/nav_permission_atoms.mjs +1 -1
@@ -10,8 +10,8 @@
10
10
  THE BUTTON — `.btn` and three modifiers:
11
11
  .btn primary: the accent fill with --accent-on, the DARK ink.
12
12
  White on the salmon fails AA and DESIGN.md bans it.
13
- 46px, a full pill: DESIGN.md's door height.
14
- .btn--ghost the quiet sibling: no fill, one hairline, soft ink.
13
+ 46px: DESIGN.md's door height.
14
+ .btn--ghost the quiet sibling: the press fill, one hairline, soft ink.
15
15
  .btn--sm the row size, for a button that repeats down a list or
16
16
  sits in a table: 30px, still over the 24px floor.
17
17
  .btn--text a button that reads as a link: no fill, no edge, the
@@ -31,6 +31,21 @@
31
31
  text .cb-ask__door
32
32
  A new page writes `.btn` and its modifiers, never a new name.
33
33
 
34
+ THE SHAPE AND THE VOICE ARE HELM'S IN THE HALL (task 1005192, ADR 0402).
35
+ Anything you can press takes the CUT CORNER (top-left and bottom-right, the
36
+ hall tier's --cut-path) and names itself in the NAME VOICE (the display
37
+ face, wide tracked capitals: --name-face / --name-weight / --name-space-tight
38
+ / --name-case). Every one of those is a hall-tier token spent with a
39
+ fallback, and the fallback is the pill and the lowercase body voice this
40
+ sheet drew before: the status page links this sheet without the hall's tier,
41
+ so there the fallbacks stand and nothing on it moves.
42
+ A clip-path clips an outline, so in the hall a cut button's focus is the
43
+ inset two-tone ring --press-focus (the focus colour on the edge, a band of
44
+ the ground inside it: one of the two reads on any fill). A cut also removes
45
+ the hairline at the two cut corners, so the ghost takes the press fill
46
+ (--press-fill) and reads as a shape rather than as a broken outline.
47
+ The text button is a link in a sentence: no cut, no capitals.
48
+
34
49
  THE FIELD — one text input / select / textarea, `.input` for a field the
35
50
  element selectors do not reach. 40px, a pill (a textarea takes the tile
36
51
  corner), an edge that clears 3:1 against the card in both modes so the
@@ -54,17 +69,21 @@
54
69
  min-height: 46px;
55
70
  min-width: 46px;
56
71
  padding: 0 var(--ds-space-md);
57
- font-family: var(--font-body);
72
+ font-family: var(--name-face, var(--font-body));
58
73
  font-size: var(--ds-text-lg);
59
- font-weight: 500;
74
+ font-weight: var(--name-weight, 500);
60
75
  line-height: 1.2;
61
- text-transform: lowercase;
76
+ letter-spacing: var(--name-space-tight, normal);
77
+ text-transform: var(--name-case, lowercase);
62
78
  text-decoration: none;
63
79
  white-space: nowrap;
64
80
  /* transparent rather than absent: a modifier that sets only a border COLOUR
65
81
  (collab.css's .btn--quiet) cannot paint an edge that was never reserved. */
66
82
  border: var(--line) solid transparent;
67
- border-radius: var(--radius-pill);
83
+ border-radius: var(--press-radius, var(--radius-pill));
84
+ clip-path: var(--cut-path, none);
85
+ /* the hall's :focus-visible rule (style.css) spends this in place of its halo */
86
+ --focus-ring: var(--press-focus);
68
87
  cursor: pointer;
69
88
  transition: background-color var(--ds-dur-fast) var(--ds-ease),
70
89
  border-color var(--ds-dur-fast) var(--ds-ease),
@@ -97,7 +116,7 @@
97
116
  .btn--ghost, .btn--quiet, .btn-ghost, .landing__btn--quiet, .td-btn, .wip__release,
98
117
  .pbtn, .settings-btn, .sessions-row__end, .event-sound-preview {
99
118
  color: var(--ink-soft);
100
- background: transparent;
119
+ background: var(--press-fill, transparent);
101
120
  border-color: var(--rule);
102
121
  }
103
122
  .btn--ghost:hover:not(:disabled), .btn--quiet:hover:not(:disabled), .btn-ghost:hover:not(:disabled),
@@ -105,7 +124,7 @@
105
124
  .pbtn:hover:not(:disabled), .settings-btn:hover:not(:disabled),
106
125
  .sessions-row__end:hover:not(:disabled), .event-sound-preview:hover:not(:disabled) {
107
126
  color: var(--ink);
108
- background: transparent;
127
+ background: var(--press-fill, transparent);
109
128
  border-color: var(--ink-faint);
110
129
  text-decoration: none;
111
130
  }
@@ -142,6 +161,7 @@
142
161
  min-width: 30px;
143
162
  padding: 0 var(--ds-space-sm);
144
163
  font-size: var(--ds-text-sm);
164
+ clip-path: var(--cut-path-sm, none);
145
165
  }
146
166
 
147
167
  /* text — a button that reads as a link: the sentence's own size and case, the
@@ -151,9 +171,13 @@
151
171
  min-height: 24px;
152
172
  min-width: 24px;
153
173
  padding: 0 2px;
174
+ font-family: inherit;
154
175
  font-size: inherit;
155
176
  font-weight: inherit;
177
+ letter-spacing: inherit;
156
178
  text-transform: none;
179
+ clip-path: none;
180
+ --focus-ring: initial;
157
181
  color: var(--accent-ink);
158
182
  background: transparent;
159
183
  border-color: transparent;
@@ -166,16 +190,44 @@
166
190
  }
167
191
  .btn--text:disabled { color: var(--ink-faint); background: transparent; }
168
192
 
169
- /* Focus keeps the pill. The shell's two-tone ring (style.css :focus-visible)
170
- sets the tile corner for the general case; a pill under it would square off. */
193
+ /* Focus keeps the button's own corner. The shell's two-tone ring (style.css
194
+ :focus-visible) sets the tile corner for the general case; a pill under it
195
+ would square off. In the hall the button is cut, and the cut clips that
196
+ outline and its halo away, so the ring is drawn INSIDE the shape instead:
197
+ the base rule hands --press-focus to the shell's ring as --focus-ring. */
171
198
  .btn:focus-visible, .btn-accent:focus-visible, .btn-ghost:focus-visible,
172
199
  .landing__btn:focus-visible, .task__claim:focus-visible, .td-btn:focus-visible,
173
200
  .wip__release:focus-visible, .setup-gate__save:focus-visible, .pbtn:focus-visible,
174
201
  .settings-btn:focus-visible, .sessions-row__end:focus-visible,
175
202
  .event-sound-preview:focus-visible, button.craft-save:focus-visible {
176
- border-radius: var(--radius-pill);
203
+ border-radius: var(--press-radius, var(--radius-pill));
177
204
  }
178
205
 
206
+ /* ---------- the segment (task 1005192, ADR 0402) ----------
207
+ HELM'S PROGRESS: one small skewed bar per step, in a row. A step that is done
208
+ is filled with the soft ink (information you read); one still to come is an
209
+ outline; the accent fills only a step the reader can act on now (.seg--now).
210
+ Always beside words that say the same thing: a row of bars is never the only
211
+ reading. The measures are the hall tier's (--seg-*). */
212
+ .segs {
213
+ display: flex;
214
+ flex-wrap: wrap;
215
+ gap: var(--seg-gap);
216
+ margin: 0;
217
+ padding: 0 var(--seg-gap);
218
+ list-style: none;
219
+ }
220
+ .seg {
221
+ box-sizing: border-box;
222
+ flex: 0 1 var(--seg-w);
223
+ min-width: var(--seg-h);
224
+ height: var(--seg-h);
225
+ border: var(--line-strong) solid var(--rule);
226
+ transform: skewX(var(--seg-skew));
227
+ }
228
+ .seg--done { background: var(--ink-soft); border-color: transparent; }
229
+ .seg--now { background: var(--accent); border-color: transparent; }
230
+
179
231
  /* ---------- the field ----------
180
232
  The four element selectors the hall always styled keep their weight (0,1,1),
181
233
  so nothing that leaned on them moves in the cascade. The other text types
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/copy-desk.css">
14
14
  </head>
@@ -178,10 +178,10 @@
178
178
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
179
179
 
180
180
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
181
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
181
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
182
182
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
183
183
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
184
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
184
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
185
185
  <script src="/builders/hall-dialog.js"></script>
186
186
  <script src="/builders/palette.js" defer></script>
187
187
  <script src="/builders/hall-kit.js"></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "Copy desk — the one-voice review queue. Its three dialogs are real <dialog>s, so their ::backdrop is the sheet's single sanctioned literal (black with alpha as a scrim). Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once; the redesign (task 1003471) put a queue, ten duplicates and a search's hits in the harness so the rows and the dialogs can be looked at; task 1003114 (R03) added the proposal composer and the `proposer` state that opens it.",
3
3
  "page": "/builders/copy-desk",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/hall-ask.css">
14
14
  <link rel="stylesheet" href="/builders/project-settings.css">
@@ -79,10 +79,10 @@
79
79
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
80
80
 
81
81
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
82
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
82
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
83
83
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
84
84
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
85
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
85
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
86
86
  <script src="/builders/hall-dialog.js"></script>
87
87
  <script src="/builders/palette.js" defer></script>
88
88
  <script src="/builders/hall-kit.js"></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "DEPLOY (task 1003159, ADR 0293; the npm-release module's sections, task 1002622) through modules/ui-design/kit/render.js. The page reads authenticated routes gated on core.pin.move, so against the kit's own stub it renders its restricted or failed-read state. To look at the populated page — the deploy door AND the module's 'where the work is' + version history, from a fixture taken off the live registry and ledger — run the hall-preview harness with the module on:\n\n BONGOS_MODULE_NPM_RELEASE=1 node scripts/hall-preview/server.js --port 4602 --rank archon --fixture-me --modules-on npm-release,provisioning\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/deploy.states.json --base-in http://localhost:4602 --base-out http://localhost:4602",
3
3
  "page": "/builders/deploy",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -11,7 +11,7 @@
11
11
  <!-- The faces (Manrope, JetBrains Mono) come from the branding pack's font
12
12
  links, injected into this head by the server like every hall page's
13
13
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet). -->
14
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
14
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
15
15
  <link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
16
16
  <link rel="stylesheet" href="/builders/thinking.css?v=2026-11-10-visor">
17
17
  </head>
@@ -139,13 +139,13 @@
139
139
  </div>
140
140
 
141
141
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
142
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
142
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
143
143
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
144
144
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
145
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
145
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
146
146
  <script src="/builders/hall-dialog.js"></script>
147
147
  <!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
148
- <script src="/builders/visor.js?v=2026-11-10-visor"></script>
148
+ <script src="/builders/visor.js?v=2026-11-11-view2"></script>
149
149
  <script src="/builders/palette.js" defer></script>
150
150
 
151
151
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <!-- task 1003470: the family sheet the list's figure band and group heads
13
13
  come from (.ov-figs, .ov-group__head), linked before the page's own. -->
14
14
  <link rel="stylesheet" href="/builders/oversight.css">
@@ -251,10 +251,10 @@
251
251
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
252
252
 
253
253
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
254
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
254
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
255
255
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
256
256
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
257
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
257
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
258
258
  <script src="/builders/hall-dialog.js"></script>
259
259
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
260
260
  <script src="/builders/palette.js" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's Goals list + goal detail through modules/ui-design/kit/render.js (task 1003307; redesigned in task 1003470). Goals is the LIST ARCHETYPE the governance-and-lists re-skin applies across thirteen pages, so its floors are measured first and the rest are held against them. Populated look: node scripts/hall-preview/server.js --port 4620 --fixture-me, then --base-in/--base-out at that origin (the harness carries goals, goals/rollups and work-categories since task 1003470). `filters` opens the kit's Filters disclosure (the five lenses that left the open bar); `cards` flips the rows|cards toggle on the count line.",
3
3
  "page": "/builders/goals",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/government.css">
14
14
  </head>
@@ -155,10 +155,10 @@
155
155
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
156
156
 
157
157
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
158
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
158
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
159
159
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
160
160
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
161
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
161
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
162
162
  <script src="/builders/hall-dialog.js"></script>
163
163
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
164
164
  <script src="/builders/palette.js" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "Government — the constitution, ranks, permissions and assignments, behind requireGovernmentPage (metic+). The tabbed panels are the state vocabulary here: one render per tab is what proves the panel switch does not reflow the column. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once.",
3
3
  "page": "/builders/government",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <!-- The record archetype, shared with task.html (task 1003305). idea.css below
13
13
  carries only what an idea record has and a task record does not. -->
14
14
  <link rel="stylesheet" href="/builders/record.css">
@@ -51,10 +51,10 @@
51
51
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
52
52
 
53
53
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
54
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
54
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
55
55
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
56
56
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
57
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
57
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
58
58
  <script src="/builders/hall-dialog.js"></script>
59
59
  <script src="/builders/palette.js" defer></script>
60
60
  <!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's IDEA RECORD through modules/ui-design/kit/render.js (task 1003305). Same harness note as task.states.json: the idea's five answers, its completeness bar and its author-only mark control need a LOADED idea, so run it against the hall-preview harness:\n\n node scripts/hall-preview/server.js --port 4612 --fixture-me\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/idea.states.json --base-in http://builders.localhost:4612 --base-out http://builders.localhost:4612",
3
3
  "page": "/idea/12",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
13
13
  <link rel="preconnect" href="https://fonts.googleapis.com">
14
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
15
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
16
16
  <link rel="stylesheet" href="/builders/ideas.css">
17
17
  </head>
18
18
  <body data-page="ideas" data-page-title="Ideas">
@@ -226,10 +226,10 @@
226
226
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
227
227
 
228
228
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
229
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
229
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
230
230
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
231
231
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
232
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
232
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
233
233
  <script src="/builders/hall-dialog.js"></script>
234
234
  <script src="/builders/palette.js" defer></script>
235
235
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's IDEA COMPOSER through modules/ui-design/kit/render.js (task 1003305). The five questions are rendered from GET /inbox/template and the spark queue from GET /inbox/sparks, so the populated form needs the hall-preview harness; the kit's own stub answers neither and renders the honest `could not load the idea template` line instead, which is the `no-template` state below.\n\n node scripts/hall-preview/server.js --port 4612 --fixture-me\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/ideas.states.json --base-in http://builders.localhost:4612 --base-out http://builders.localhost:4612\n\nTHE FOLD (task 1004087 / spec R04) is why there are now three states rather than two. `compose` is what a builder actually lands on — the one-line composer at the top, the Full Idea form folded away behind one press, and NO rail reserve, which is the whole reason that state is rendered at 1440 as well as at 390/320. `full` is the same page one press later: the five questions, the meter, and the rail. Rendering only one of them would measure half the page, and the half that is measured on every arrival is the first.",
3
3
  "page": "/ideas",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The founding wall on Home (task 1004424): the home-founding widget a founded project shows, from the kit fixture founding-builders-sample.json. The page itself is index.states.json's; only the founding read differs. The never-founded case is index.states.json, where the wall stays hidden. Run it with --states (Home has no last path segment).",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The genesis home on Home (task 1004423) while the founder decides the plan: each stage's length and done-when line, the starting government by its real name with its plain explanation (the recommended one picked, from government-constitution-sample.json), passes and advisors, every default pre-picked so a solo founder needs one click. /founding/genesis answers founding-genesis-decide.json, built from the real server shaper.",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The genesis home of a DEMO, born into genesis (task 1004506): 3 people, 4 hours each. The plan was settled at birth from the demo's picks, so there is no decide form: one line names the plan, and each stage reads in minutes (scope in progress, due at a time). /me says founding at scope (kit fixture me-founding-demo.json) and /founding/genesis answers founding-genesis-demo.json, built from the real server shaper. A real project's genesis is index-genesis.states.json and index-genesis-decide.states.json; a hall that is not founding is index.states.json.",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The genesis home on Home (task 1004423), mid-genesis: scope passed, strategize in progress. /me says founding (kit fixture me-founding.json) and /founding/genesis answers founding-genesis-stage.json, built from the real server shaper. The deciding step is index-genesis-decide.states.json; a hall that is not founding is index.states.json, where the card never renders and never asks. Run it with --states (Home has no last path segment).",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -18,10 +18,10 @@
18
18
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
19
19
  <link rel="preconnect" href="https://fonts.googleapis.com">
20
20
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
21
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
21
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
22
22
  <link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
23
23
  <link rel="stylesheet" href="/builders/welcome-boot.css?v=2026-11-07-brand-mark">
24
- <link rel="stylesheet" href="/builders/shell-game.css?v=2026-11-10-start-screen">
24
+ <link rel="stylesheet" href="/builders/shell-game.css?v=2026-11-11-view2">
25
25
  <link rel="stylesheet" href="/builders/hall-ask.css">
26
26
  <link rel="stylesheet" href="/builders/home-city.css?v=2026-11-10-visor">
27
27
  <link rel="stylesheet" href="/builders/home-gallery.css">
@@ -110,13 +110,13 @@
110
110
  <!-- task 1004785: the first-visit-of-the-day welcome (the tower). Before shell.js, which asks it
111
111
  before the craft picker so the two never stack. Home only. -->
112
112
  <script src="/builders/welcome-boot.js?v=2026-11-07-brand-mark" defer></script>
113
- <script src="/builders/shell-game.js?v=2026-11-10-options" defer></script>
113
+ <script src="/builders/shell-game.js?v=2026-11-11-view2" defer></script>
114
114
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers" defer></script>
115
115
  <script src="/builders/craft-mode.js?v=2026-11-10-visor" defer></script>
116
- <script src="/builders/shell.js?v=2026-11-10-character" defer></script>
116
+ <script src="/builders/shell.js?v=2026-11-11-view2" defer></script>
117
117
  <script src="/builders/hall-dialog.js" defer></script>
118
118
  <!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
119
- <script src="/builders/visor.js?v=2026-11-10-visor" defer></script>
119
+ <script src="/builders/visor.js?v=2026-11-11-view2" defer></script>
120
120
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
121
121
  <script src="/builders/palette.js" defer></script>
122
122
  <!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's HOME page through modules/ui-design/kit/render.js (task 1003304). Home is served at the surface root, so its page path has no last segment to name the file — run it with `--states modules/hall-ui/public/index.states.json`, not `--page`.",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <link rel="stylesheet" href="/builders/market-watch.css">
13
13
  </head>
14
14
  <body data-page="market-watch-item" data-page-title="Market Watch">
@@ -72,10 +72,10 @@
72
72
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
73
73
 
74
74
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
75
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
75
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
76
76
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
77
77
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
78
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
78
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
79
79
  <script src="/builders/hall-dialog.js"></script>
80
80
  <script src="/builders/palette.js" defer></script>
81
81
  <script src="/builders/hall-kit.js"></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "MARKET WATCH ITEM, the dossier (task 1004939; design of record docs/design/mocks/market-watch/item.html, option B). One read, GET /market-watch/items/:id. Against the kit's own stub it 404s with no item code, which the page reads as the module being off. The populated card and case file need the hall-preview harness with the module reported on; its market-watch__items__4.json (GitHub Copilot coding agent) and market-watch__items__37.json (NLnet Foundation) fixtures were built from the committed 2026-10-28 seed through the real shapes:\n\n node scripts/hall-preview/server.js --port 4639 --fixture-me --modules-on market-watch\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/market-watch-item.states.json --base-in http://localhost:4639 --base-out http://localhost:4639",
3
3
  "page": "/builders/market-watch-item?id=4",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <link rel="stylesheet" href="/builders/hall-ask.css">
13
13
  <link rel="stylesheet" href="/builders/market-watch-rules.css">
14
14
  </head>
@@ -41,10 +41,10 @@
41
41
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
42
42
 
43
43
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
44
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
44
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
45
45
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
46
46
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
47
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
47
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
48
48
  <script src="/builders/hall-dialog.js"></script>
49
49
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
50
50
  <script src="/builders/palette.js" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The Market Watch rules page (task 1004941), built to docs/design/mocks/market-watch/rules.html, option C (the pipeline map). One read, GET /market-watch/rules. Against the kit's own stub it 404s, so the page renders its 'Market Watch is off' state, which the floors must hold too. TO SEE IT POPULATED, point the kit at the hall-preview harness: `node scripts/hall-preview/server.js --port 4641 --fixture-me`, then `render.js --page /builders/market-watch-rules --base-in http://builders.localhost:4641 --base-out http://builders.localhost:4641`. The harness answers from fixtures/market-watch__rules.json, built by the real composers (rules-view.buildView over the seed's rules and 60 items, two approved changes and four open proposals). Steps are opened with clickIfVisible because against the stub the nodes do not exist.",
3
3
  "page": "/builders/market-watch-rules",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <link rel="stylesheet" href="/builders/market-watch.css">
13
13
  <link rel="stylesheet" href="/builders/market-watch-settings.css">
14
14
  </head>
@@ -183,10 +183,10 @@
183
183
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
184
184
 
185
185
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
186
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
186
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
187
187
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
188
188
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
189
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
189
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
190
190
  <script src="/builders/hall-dialog.js"></script>
191
191
  <script src="/builders/palette.js" defer></script>
192
192
  <script src="/builders/hall-kit.js"></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "MARKET WATCH HOME, the watchtower desk (task 1004939; design of record docs/design/mocks/market-watch/home.html, option D). One read, GET /market-watch/home. Against the kit's own stub it 404s, which the page reads as the module being off, so the stub render is the quiet off state. The populated desk needs the hall-preview harness with the module reported on; its market-watch__home.json fixture was built from the committed 2026-10-28 seed through the real shapes (tests/fixtures/market-watch-seed-rows.cjs):\n\n node scripts/hall-preview/server.js --port 4639 --fixture-me --modules-on market-watch --rank archon\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/market-watch.states.json --base-in http://localhost:4639 --base-out http://localhost:4639\n\nThe 'settings' state is the owner's Settings tab (task 1005045; task 1004938's page before it), drawn from GET /market-watch/settings (the harness's market-watch__settings.json, the mockup's month). Only an archon viewer gets the tab, so the harness needs --rank archon; for anyone else the state renders the desk with no tab strip.",
3
3
  "page": "/builders/market-watch",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-view2">
12
12
  <!-- task 1004366: a store version's how-to reads as a document, so it borrows the
13
13
  reading room's article card (room.css is scoped to its own primer- classes). -->
14
14
  <link rel="stylesheet" href="/builders/room.css">
@@ -126,10 +126,10 @@
126
126
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
127
127
 
128
128
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
129
- <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
129
+ <script src="/builders/shell-game.js?v=2026-11-11-view2"></script>
130
130
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
131
131
  <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
132
- <script src="/builders/shell.js?v=2026-11-10-character"></script>
132
+ <script src="/builders/shell.js?v=2026-11-11-view2"></script>
133
133
  <script src="/builders/hall-dialog.js"></script>
134
134
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
135
135
  <script src="/builders/palette.js" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "Modules — the catalog as ONE panel of oversight rows (task 1003472): the kit filter bar, the figure band, two groups under heads. The empty state matters more than the populated one: a filter that matches nothing is the state a browse page spends real time in. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once; the redesign added the `lens` and `details` states. Populated look: the hall-preview harness (scripts/hall-preview/fixtures/modules.json carries eighteen modules, one built by the project).",
3
3
  "page": "/builders/modules",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",