@bongos/core 1.21.10 → 1.21.12

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.
@@ -1,43 +1,364 @@
1
1
  {
2
- "_": "THE STREET (task 1004525, goal 1000125) through modules/ui-design/kit/render.js. The page draws GET /government/docket, GET /goals, GET /goals/rollups and the viewer's GET /builders/:id/earnings; against the kit's own stub none exists, so every state renders the bare street (the nine civic buildings, no districts, no pins) with the readings saying the docket could not be read: a real state the floors must hold in. To look at the populated street, run it against the hall-preview harness, whose government__docket.json fixture carries the reference design's seven sample matters (3 need you, 2 moving, 2 settled) and whose goals fixtures carry the open goals:\n\n node scripts/hall-preview/server.js --port 4625 --fixture-me\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/street.states.json --base-in http://localhost:4625 --base-out http://localhost:4625\n\nThe page follows the OS mode until the switch is pressed (then the hall's own 'hall-theme' preference), so the kit's dark/light emulation renders both modes.",
2
+ "_": "THE STREET (task 1004525, goal 1000125) and inside every building and district (task 1004526) through modules/ui-design/kit/render.js. The page draws GET /government/docket, GET /goals, GET /goals/rollups and the viewer's GET /builders/:id/earnings; against the kit's own stub none exists, so every state renders the bare street (the nine civic buildings, no districts, no pins) with the readings saying the docket could not be read: a real state the floors must hold in. To look at the populated street, run it against the hall-preview harness, whose government__docket.json fixture carries the reference design's seven sample matters (3 need you, 2 moving, 2 settled) and whose goals fixtures carry the open goals:\n\n node scripts/hall-preview/server.js --port 4625 --fixture-me\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/street.states.json --base-in http://localhost:4625 --base-out http://localhost:4625\n\nThe page follows the OS mode until the switch is pressed (then the hall's own 'hall-theme' preference), so the kit's dark/light emulation renders both modes.",
3
3
  "page": "/builders/street",
4
4
  "surface": "hall-ui",
5
- "stub": { "prefix": "/builders/" },
5
+ "stub": {
6
+ "prefix": "/builders/"
7
+ },
6
8
  "modeQuery": false,
7
- "ignoreRequests": ["/api/(gds|bongos)/", "fonts\\.g(oogleapis|static)\\.com"],
8
- "ignoreConsole": ["/api/(gds|bongos)/", "\\b401\\b", "\\b403\\b", "\\b404\\b", "Unauthorized", "Forbidden", "Not Found", "load failed", "fonts\\.g(oogleapis|static)\\.com"],
9
+ "ignoreRequests": [
10
+ "/api/(gds|bongos)/",
11
+ "fonts\\.g(oogleapis|static)\\.com"
12
+ ],
13
+ "ignoreConsole": [
14
+ "/api/(gds|bongos)/",
15
+ "\\b401\\b",
16
+ "\\b403\\b",
17
+ "\\b404\\b",
18
+ "Unauthorized",
19
+ "Forbidden",
20
+ "Not Found",
21
+ "load failed",
22
+ "fonts\\.g(oogleapis|static)\\.com"
23
+ ],
9
24
  "states": {
10
25
  "street": {
11
26
  "auth": true,
12
27
  "_": "The street: the header, the buildings in the order work moves with their names, state lines and group brackets, the pins, and the six readings.",
13
- "actions": [["wait", 900]],
14
- "expect": { "visible": ["#streetBoard", "#streetSigns", "#streetMode", "#streetHome"], "href": [["#streetHome", "/builders/city"]] }
28
+ "actions": [
29
+ [
30
+ "wait",
31
+ 900
32
+ ]
33
+ ],
34
+ "expect": {
35
+ "visible": [
36
+ "#streetBoard",
37
+ "#streetSigns",
38
+ "#streetMode",
39
+ "#streetHome"
40
+ ],
41
+ "href": [
42
+ [
43
+ "#streetHome",
44
+ "/builders/city"
45
+ ]
46
+ ]
47
+ }
15
48
  },
16
49
  "card": {
17
50
  "auth": true,
18
51
  "_": "A pin pressed: the matter's short card over the street.",
19
- "actions": [["wait", 900], ["click", ".street-pin"], ["wait", 400]],
20
- "expect": { "visible": ["#streetCard", "#streetCardClose"] }
52
+ "actions": [
53
+ [
54
+ "wait",
55
+ 900
56
+ ],
57
+ [
58
+ "click",
59
+ ".street-pin"
60
+ ],
61
+ [
62
+ "wait",
63
+ 400
64
+ ]
65
+ ],
66
+ "expect": {
67
+ "visible": [
68
+ "#streetCard",
69
+ "#streetCardClose"
70
+ ]
71
+ }
21
72
  },
22
73
  "switched": {
23
74
  "auth": true,
24
75
  "_": "The light/dark switch pressed once: the other mode, the street redrawn in it.",
25
- "actions": [["wait", 600], ["click", "#streetMode"], ["wait", 400]],
26
- "expect": { "visible": ["#streetBoard", "#streetSigns"] }
76
+ "actions": [
77
+ [
78
+ "wait",
79
+ 600
80
+ ],
81
+ [
82
+ "click",
83
+ "#streetMode"
84
+ ],
85
+ [
86
+ "wait",
87
+ 400
88
+ ]
89
+ ],
90
+ "expect": {
91
+ "visible": [
92
+ "#streetBoard",
93
+ "#streetSigns"
94
+ ]
95
+ }
96
+ },
97
+ "focus": {
98
+ "auth": true,
99
+ "_": "Keyboard: the wordmark back to the city focused, its ring drawn.",
100
+ "actions": [
101
+ [
102
+ "wait",
103
+ 600
104
+ ],
105
+ [
106
+ "focus",
107
+ "#streetHome"
108
+ ],
109
+ [
110
+ "wait",
111
+ 100
112
+ ]
113
+ ],
114
+ "expect": {
115
+ "activeId": "streetHome"
116
+ }
27
117
  },
28
118
  "here": {
29
119
  "auth": true,
30
- "_": "Arrived through a door: the address names the Charter, so its door and the readings that open it are marked.",
120
+ "_": "Arrived through a door: the address names the Charter, so the street gives way to the Charter in section (every floor, its sign, the lift at the chosen floor) and its panel.",
31
121
  "url": "/builders/street#building=charter",
32
- "actions": [["wait", 900]],
33
- "expect": { "visible": ["#streetBoard"] }
122
+ "actions": [
123
+ [
124
+ "wait",
125
+ 900
126
+ ]
127
+ ],
128
+ "expect": {
129
+ "visible": [
130
+ "#streetInside",
131
+ "#insideName",
132
+ "#insideLift",
133
+ "#insideBack",
134
+ "#streetSigns"
135
+ ],
136
+ "href": [
137
+ [
138
+ "#insideBack",
139
+ "/builders/street"
140
+ ]
141
+ ]
142
+ }
34
143
  },
35
- "focus": {
144
+ "inside-rules": {
36
145
  "auth": true,
37
- "_": "Keyboard: the wordmark back to the city focused, its ring drawn.",
38
- "actions": [["wait", 600], ["focus", "#streetHome"], ["wait", 100]],
39
- "expect": { "activeId": "streetHome" }
146
+ "_": "Inside rules: its floors in section, its panel, its record.",
147
+ "url": "/builders/street#building=rules",
148
+ "actions": [
149
+ [
150
+ "wait",
151
+ 900
152
+ ]
153
+ ],
154
+ "expect": {
155
+ "visible": [
156
+ "#streetInside",
157
+ "#insideName",
158
+ "#insidePanel"
159
+ ]
160
+ }
161
+ },
162
+ "inside-disputes": {
163
+ "auth": true,
164
+ "_": "Inside disputes: its floors in section, its panel, its record.",
165
+ "url": "/builders/street#building=disputes",
166
+ "actions": [
167
+ [
168
+ "wait",
169
+ 900
170
+ ]
171
+ ],
172
+ "expect": {
173
+ "visible": [
174
+ "#streetInside",
175
+ "#insideName",
176
+ "#insidePanel"
177
+ ]
178
+ }
179
+ },
180
+ "inside-people": {
181
+ "auth": true,
182
+ "_": "Inside people: its floors in section, its panel, its record.",
183
+ "url": "/builders/street#building=people",
184
+ "actions": [
185
+ [
186
+ "wait",
187
+ 900
188
+ ]
189
+ ],
190
+ "expect": {
191
+ "visible": [
192
+ "#streetInside",
193
+ "#insideName",
194
+ "#insidePanel"
195
+ ]
196
+ }
197
+ },
198
+ "inside-planning": {
199
+ "auth": true,
200
+ "_": "Inside planning: its floors in section, its panel, its record.",
201
+ "url": "/builders/street#building=planning",
202
+ "actions": [
203
+ [
204
+ "wait",
205
+ 900
206
+ ]
207
+ ],
208
+ "expect": {
209
+ "visible": [
210
+ "#streetInside",
211
+ "#insideName",
212
+ "#insidePanel"
213
+ ]
214
+ }
215
+ },
216
+ "inside-automation": {
217
+ "auth": true,
218
+ "_": "Inside automation: its floors in section, its panel, its record.",
219
+ "url": "/builders/street#building=automation",
220
+ "actions": [
221
+ [
222
+ "wait",
223
+ 900
224
+ ]
225
+ ],
226
+ "expect": {
227
+ "visible": [
228
+ "#streetInside",
229
+ "#insideName",
230
+ "#insidePanel"
231
+ ]
232
+ }
233
+ },
234
+ "inside-review": {
235
+ "auth": true,
236
+ "_": "Inside review: its floors in section, its panel, its record.",
237
+ "url": "/builders/street#building=review",
238
+ "actions": [
239
+ [
240
+ "wait",
241
+ 900
242
+ ]
243
+ ],
244
+ "expect": {
245
+ "visible": [
246
+ "#streetInside",
247
+ "#insideName",
248
+ "#insidePanel"
249
+ ]
250
+ }
251
+ },
252
+ "inside-release": {
253
+ "auth": true,
254
+ "_": "Inside release: its floors in section, its panel, its record.",
255
+ "url": "/builders/street#building=release",
256
+ "actions": [
257
+ [
258
+ "wait",
259
+ 900
260
+ ]
261
+ ],
262
+ "expect": {
263
+ "visible": [
264
+ "#streetInside",
265
+ "#insideName",
266
+ "#insidePanel"
267
+ ]
268
+ }
269
+ },
270
+ "inside-treasury": {
271
+ "auth": true,
272
+ "_": "Inside treasury: its floors in section, its panel, its record.",
273
+ "url": "/builders/street#building=treasury",
274
+ "actions": [
275
+ [
276
+ "wait",
277
+ 900
278
+ ]
279
+ ],
280
+ "expect": {
281
+ "visible": [
282
+ "#streetInside",
283
+ "#insideName",
284
+ "#insidePanel"
285
+ ]
286
+ }
287
+ },
288
+ "floor": {
289
+ "auth": true,
290
+ "_": "A floor picked: the lift slides to it, its frame and sign turn orange, and its block re-enters with the sign large.",
291
+ "url": "/builders/street#building=people",
292
+ "actions": [
293
+ [
294
+ "wait",
295
+ 900
296
+ ],
297
+ [
298
+ "click",
299
+ ".inside-floor[data-floor=\"0\"]"
300
+ ],
301
+ [
302
+ "wait",
303
+ 900
304
+ ]
305
+ ],
306
+ "expect": {
307
+ "visible": [
308
+ "#insideOpenB"
309
+ ]
310
+ }
311
+ },
312
+ "amend": {
313
+ "auth": true,
314
+ "_": "Change how this works pressed: it says, in words, that drafting an amendment from here is not built yet (task 1004530).",
315
+ "url": "/builders/street#building=charter",
316
+ "actions": [
317
+ [
318
+ "wait",
319
+ 900
320
+ ],
321
+ [
322
+ "click",
323
+ "#insideAmend"
324
+ ],
325
+ [
326
+ "wait",
327
+ 200
328
+ ]
329
+ ],
330
+ "expect": {
331
+ "visible": [
332
+ "#insideAmendNote"
333
+ ]
334
+ }
335
+ },
336
+ "district": {
337
+ "auth": true,
338
+ "_": "Inside a district: the goal's tasks as buildings on a road, shape the craft, stage the status, label the kind.",
339
+ "url": "/builders/street#district=25",
340
+ "actions": [
341
+ [
342
+ "wait",
343
+ 1200
344
+ ]
345
+ ],
346
+ "expect": {
347
+ "visible": [
348
+ "#streetInside",
349
+ "#insideDName",
350
+ "#insideLegend"
351
+ ]
352
+ }
40
353
  }
41
354
  },
42
- "reducedMotion": { "auth": true, "actions": [["wait", 600]] }
355
+ "reducedMotion": {
356
+ "auth": true,
357
+ "actions": [
358
+ [
359
+ "wait",
360
+ 600
361
+ ]
362
+ ]
363
+ }
43
364
  }
@@ -1,4 +1,4 @@
1
- # The Governor City's street — /street, the six readings, and the doors to the interiors (task 1004525)
1
+ # The Governor City's street — /street, the six readings, and the interiors behind its doors (tasks 1004525, 1004526)
2
2
 
3
3
  **R03 of goal 1000125.** Built 1:1 on the street view of the reference design [`docs/design/mocks/governor-city/Street.dc.html`](../../../docs/design/mocks/governor-city/README.md): one front-on row in the order work moves under five group brackets, a name and one state line under every building, pins with their labels always showing, work queued at Review as crates by its door, the header (wordmark back to the city, needs you, moving, your share this month, the light/dark switch) and the six readings along the bottom. The home city (`/city`, task 1004524) links here from start governing.
4
4
 
@@ -9,6 +9,25 @@ What it settled:
9
9
  - **Standalone, like the city.** No hall sidebar or top bar; it is the second entry in `tests/hall_audit.mjs`'s `STANDALONE_EXEMPT`, with the city's reason. It still loads `style.css` and reads and writes the hall's own `hall-theme`.
10
10
  - **The artboard is the street band.** The prototype's 1440 x 900 board less its 64 px header and 128 px footer, which the page lays out as real rows; `street.js` scales the 1440 x 708 band to the window, and on a phone keeps it near full size and lets the street scroll sideways inside its own window, so a pin stays a pin. The header fits the 80 px top-bar floor at 390 and 320 by going to two rows, its three figures as their own sideways strip.
11
11
  - **Real data where the prototype had samples.** One district per open goal (up to eight plots; past that seven stand and the eighth is a staked lot that opens the goals page), each goal's tasks drawn in proportion (built, scaffold, the prototype's `ready` slab), Review held while any source that stands in it can be read, its open matters as crates and the dashed "waiting for a tester" count pin, a reading off drawn as a dash and its reason. The full list is the header of `street-draw.js`.
12
- - **Every building and district is a door** to `/street#building=<key>` or `/street#district=<goal id>`, where task 1004526 builds the interiors; until then the street marks the building the address names. A pin opens the matter's short card (task 1004528 makes it act); its link is offered only for an on-site path.
12
+ - **Every building and district is a door** to `/street#building=<key>` or `/street#district=<goal id>`, where its interior opens in place of the street (below). A pin opens the matter's short card (task 1004528 makes it act); its link is offered only for an on-site path.
13
13
 
14
14
  Tests: `tests/hall_street.mjs` holds the kit, the row, the pins, the doors and the crates equal to the prototype by running its own `Component` class beside `street-draw.js` in both modes, then the docket rules and the page itself in a vm. The states file is `public/street.states.json`; render it against the hall-preview harness, whose `government__docket.json` fixture carries the seven sample matters.
15
+
16
+
17
+ ## Inside every building and district (task 1004526, R04)
18
+
19
+ Built 1:1 on `buildingView()` and `districtView()` of the same prototype. The interior is a view of this page, not a page of its own: when the address names a building or a district, `#streetInside` replaces the street band, and the header and the six readings stay (the reading for that building is marked).
20
+
21
+ Files: `street-inside.js` (`window.GovInside`, node-require-safe, pure): the prototype's `crown()`, `workItem()`, `floorSymbol()`, `symbolPath()` (all forty symbols) and the section drawing itself, verbatim, plus the real-data adapters. `street.js` builds the nodes; `street.css` carries the interior's styles under the `inside-` prefix.
22
+
23
+ - **The building in section.** Every storey a real floor (slab, cut walls with glazing, three lamps, a partition with a doorway, the framed sign with the floor's symbol, its name and state lettered on the wall, its count, its level number), dark empty floors up to the building's capacity, the crown per building, the lift in its shaft, the orange frame and orange sign on the chosen floor, and the annex lot once the building is full. An unheld Review is the dashed ghost (`GovStreet.reviewHeldOf()`, so the street and the interior agree).
24
+ - **The right panel.** Name and what it holds, who holds it (seat chips), how it decides (the rule glyph), **change how this works**, the fill meter with its growth line, on the table here, the chosen floor with its sign large, and the record as monthly filing drawers.
25
+ - **Floors are the prototype's structure; a number appears only when the docket holds it.** `GovInside.PLAN` keeps each building's floors, order and capacity. A floor bound to a docket source shows that source's open matters at this building (count, line, needs you, the lines); one bound to a reading shows its figure; Planning's Goals floor counts the open goals. Every other floor says "not recorded yet" on the wall, lettered faint, with no number. A source that is off, coming, not yours or unreadable says which, never a figure. Filling every floor with real data is task 1004527, through `floorFor()` and `PLAN`.
26
+ - **Who holds it.** The docket names no holders yet (task 1004529), so the seat is an empty dashed chip and says "who holds it is not set on this project yet". The rule is the one the building's open matters are decided by, else the design's default, which the words call "by default". `holderOf()` reads a docket building's `holders` / `rule` / `who` first, so 1004529 lands without touching the drawing.
27
+ - **The lift and the flip.** The lift is one node kept across draws, so picking a floor slides it by a CSS transform transition; the chosen floor's block is two blocks that take turns (`flipA` / `flipB`), so it re-enters on every pick. Both are dead under reduced motion.
28
+ - **Change how this works** is present and honest: pressed, it says drafting an amendment from here is not built yet (task 1004530 wires it).
29
+ - **On the table here** rows open the same short card a pin opens, through `openCard()`; Escape gives focus back to the row.
30
+ - **Districts.** The goal's tasks (`GET /tasks?goal_id=N`, read once per goal): shape from the discipline (tower engineer, studio artist, glass front UI, pavilion ideator; none is a tower), stage from the status (backlog and blocked a staked plot, ready a slab, active a scaffold, completed and confirmed built with a flag, shipped lit), label the kind; height from the estimate. Up to ten stand on the road, work in flight first; the rest are counted with a link to the goal. Each one opens its task.
31
+ - **Narrow.** Under 900 px the board becomes a column: the drawing in its own sideways strip (never scaled under 0.6, so a floor stays a 24 px target), then the panel.
32
+
33
+ Tests: `tests/hall_street_inside.mjs` runs the prototype's own `Component` beside `street-inside.js` on the prototype's sample floors and holds every building's section, panel bindings and every district equal to it in both modes, then the docket rules (no invented numbers) and the page in a vm (the persistent lift, the flip, the drawers, the amendment note, the card from a table row, back to the street, a district's tasks). The states file renders every building, a floor pick, the amendment note and a district.
@@ -249,6 +249,12 @@ h1[tabindex="-1"]:focus:not(:focus-visible){outline:none;}
249
249
  #view-new .rmGlow,#view-new .rmStem,#view-new .rmShade,#view-new .rmMug,#view-new .rmLeaf{display:none;}
250
250
  #view-new .rmFloor{top:auto;height:80px;}
251
251
  }
252
+ /* under 600 the words fill the screen, so the window fades further and its lit windows
253
+ go — they read as stray marks between the review rows (task 1004543) */
254
+ @media (max-width:600px){
255
+ #view-new .rmWindow{opacity:.18;}
256
+ #view-new .rmLight{display:none;}
257
+ }
252
258
  /* the words column above the room, held to the mockup's measure so the window never
253
259
  slides under it; headings in the mockup's sentence case */
254
260
  #view-new .wrap{position:relative;z-index:1;min-height:calc(100vh - var(--top-h,64px) - 120px);}
@@ -386,7 +392,7 @@ h1[tabindex="-1"]:focus:not(:focus-visible){outline:none;}
386
392
  display:block;padding-top:4px;
387
393
  }
388
394
  .humanSteps b{display:block;font-size:16px;font-weight:500;color:var(--ink);}
389
- .humanSteps p{font-size:14px;font-weight:400;color:var(--ink-soft);line-height:1.5;margin-top:4px;max-width:56ch;}
395
+ .humanSteps p{font-size:14px;font-weight:400;color:var(--ink-soft);line-height:1.5;margin-top:4px;max-width:56ch;overflow-wrap:anywhere;}
390
396
  /* a repo the platform already handled is named as a plain inline link (task 1002855) —
391
397
  the .ghbtn treatment reads as an action to take, and there is nothing here to do */
392
398
  .humanSteps p a{color:var(--ink);font-weight:400;text-decoration:underline;text-underline-offset:3px;display:inline-block;padding:3px 0;min-height:24px;line-height:18px;}
@@ -415,6 +421,7 @@ h1[tabindex="-1"]:focus:not(:focus-visible){outline:none;}
415
421
  .copy:hover{border-color:var(--ink-faint);color:var(--ink);}
416
422
  .copy.did{background:none;border-color:var(--ok);color:var(--ok);}
417
423
  .samePath{font-size:13px;font-weight:400;color:var(--ink-faint);margin-top:18px;}
424
+ .samePath a{display:inline-block;padding:3px 0;min-height:24px;line-height:18px;}
418
425
  #liveProgress{margin-top:4px;}
419
426
 
420
427
  /* ── the standup strip (task 2083), drawn as the lifecycle rail (DESIGN.md):
@@ -6942,6 +6949,8 @@ summary{min-height:24px;padding:3px 0;}
6942
6949
  /* the alive moment (task 1004504): said only once the project has answered */
6943
6950
  $('done-h').textContent = (state.name || state.slug || 'Your project') + ' is alive.';
6944
6951
  paintInviteGate(true); /* the hall answers, so others can join now */
6952
+ /* task 1004543: the line under it stops saying "setting up" once it answers */
6953
+ $('doneLede').innerHTML = 'Its home is ready. Watch the rest here, or any time on <a href="?view=mine">your projects page</a>.';
6945
6954
  setProgress(progressMarkup(-1, 3,
6946
6955
  'Your project is answering at ' + link + '. Finish the steps below and the hall is yours.', 'isLive', flow));
6947
6956
  return true;
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.10",
3
+ "version": "1.21.12",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.21.10",
9
+ "version": "1.21.12",
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.21.10",
3
+ "version": "1.21.12",
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",
@@ -8816,5 +8816,17 @@
8816
8816
  "id": "1004545",
8817
8817
  "text": "The list of every piece of on-screen text now comes out the same on a Windows computer as on the build server, so updating it on Windows no longer breaks the automatic checks. Notes the authors left inside page source are no l"
8818
8818
  }
8819
+ ],
8820
+ "1.21.11": [
8821
+ {
8822
+ "id": "1004526",
8823
+ "text": "Every building on the governor's street now opens. Step through a door and the building appears in section, drawn exactly like the prototype: each floor a real storey with its sign, name and state on the wall, dark empty floor"
8824
+ }
8825
+ ],
8826
+ "1.21.12": [
8827
+ {
8828
+ "id": "1004543",
8829
+ "text": "When your new project comes alive, the line under \"is alive\" now says its home is ready instead of still saying it is being set up. On phones, the dim night-room picture behind the setup screens no longer shows stray lit windo"
8830
+ }
8819
8831
  ]
8820
8832
  }
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.21.10'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.21.12'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -377,7 +377,7 @@ test('the page holds the prototype\'s header, the street, the readings and the c
377
377
  for (const id of ['hudNeeds', 'hudMoving', 'hudShare', 'streetMode', 'streetSigns', 'streetPins', 'streetDoors', 'streetCard']) assert.match(html, new RegExp(`id="${id}"`), id);
378
378
  assert.doesNotMatch(html, /app-sidebar|shell\.js/, 'no hall chrome, as the city');
379
379
  const scripts = [...html.matchAll(/<script src="\/builders\/([a-z-]+)\.js/g)].map((m) => m[1]);
380
- assert.deepEqual(scripts, ['city-draw', 'street-draw', 'street'], 'the shared kit loads first');
380
+ assert.deepEqual(scripts, ['city-draw', 'street-draw', 'street-inside', 'street'], 'the shared kit loads first, then the interiors (task 1004526)');
381
381
  assert.equal(City.STREET_HREF, '/builders/street', 'the city\'s door is this page');
382
382
  });
383
383