@bongos/core 1.25.8 → 1.25.9

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.
package/.bongos-core.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/bongos/package-core.js",
5
- "core_version": "1.25.8",
6
- "core_contract": "1.25.8",
7
- "source_commit": "3b2950ddd0ca81ca18697df19296575ea49e9196",
5
+ "core_version": "1.25.9",
6
+ "core_contract": "1.25.9",
7
+ "source_commit": "9ed90d8cd3b43792d4f4a598a347e8ab4441734d",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-13T10:54:51.185Z",
9
+ "built_at": "2026-11-13T11:07:19.108Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 655,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 4687,
20
- "tree_sha256": "f85bade83f9504facf4252e54b1c344079669dba7f5f8236cec91f0c7786e42c",
20
+ "tree_sha256": "a59edc6f17cdc5df23a1af969951b50606e5452598b4768170f27a744e38662b",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -3087,7 +3087,7 @@
3087
3087
  {
3088
3088
  "path": "docs/module-api-changelog.md",
3089
3089
  "mode": "0000644",
3090
- "sha256": "895fa05d71ab2f76d3a28c3d3ee497707c8822f75a8a93cc1e233168a2bb44a0"
3090
+ "sha256": "5aa4770f0789676665312ce6caf84e4a57f7910deb2a7fb010e7f5e7ead6e8c7"
3091
3091
  },
3092
3092
  {
3093
3093
  "path": "docs/modules-contract.md",
@@ -3172,7 +3172,7 @@
3172
3172
  {
3173
3173
  "path": "docs/page-readings.json",
3174
3174
  "mode": "0000644",
3175
- "sha256": "01d36cd0675f053a35f84c25505619ba55515ef1f49e8937aecbac5fbdc6e815"
3175
+ "sha256": "653e77ea77b0810685513cc5dc10aa56ddf6f35108916db2f0779e690772b9f6"
3176
3176
  },
3177
3177
  {
3178
3178
  "path": "docs/project-context.template.md",
@@ -7457,7 +7457,7 @@
7457
7457
  {
7458
7458
  "path": "modules/hall-ui/public/style.css",
7459
7459
  "mode": "0000644",
7460
- "sha256": "05470b3c1fc67ce8d07ccc00fd56a002cbb57004727ae5f474709f0fb48a98fd"
7460
+ "sha256": "4675124c888ba195047e9a54c769a6a415a9ef6158fa69570ca4609b9dd046d6"
7461
7461
  },
7462
7462
  {
7463
7463
  "path": "modules/hall-ui/public/task-detail.js",
@@ -7547,7 +7547,7 @@
7547
7547
  {
7548
7548
  "path": "modules/hall-ui/public/visor.css",
7549
7549
  "mode": "0000644",
7550
- "sha256": "b6e306527140861ea7dbd33ad812cace1a2fc0184385e4d751ce9059cfe71642"
7550
+ "sha256": "56f32d59d52af197c501ce9bb0436d03c12f318a8f1efd6ed71e8dddca303d7d"
7551
7551
  },
7552
7552
  {
7553
7553
  "path": "modules/hall-ui/public/visor.js",
@@ -7787,7 +7787,7 @@
7787
7787
  {
7788
7788
  "path": "modules/hall-ui/records/options-menu.md",
7789
7789
  "mode": "0000644",
7790
- "sha256": "f6af13fedfa165b016a5bee2e278f30f5241b5f170210a5cf48cce629cbdff96"
7790
+ "sha256": "836ed92db7f6762e178b44296ad34cf79800a838bfc88cb43b47a2ee06927242"
7791
7791
  },
7792
7792
  {
7793
7793
  "path": "modules/hall-ui/records/oversight-family.md",
@@ -7877,7 +7877,7 @@
7877
7877
  {
7878
7878
  "path": "modules/hall-ui/records/visor.md",
7879
7879
  "mode": "0000644",
7880
- "sha256": "77fc88979ebc0a8ee6409364adb9c1628a976f51311f5977f30cdc85e304b58b"
7880
+ "sha256": "bacc075f1b33733375259174e2251e29c471c2c3df821b774e7b346898f9c24e"
7881
7881
  },
7882
7882
  {
7883
7883
  "path": "modules/hall-ui/records/welcome-tower.md",
@@ -12247,12 +12247,12 @@
12247
12247
  {
12248
12248
  "path": "package-lock.json",
12249
12249
  "mode": "0000644",
12250
- "sha256": "80dbc08a47cd8871664df4eea619a52887fe87e9b50b5cc10575052a2cf41692"
12250
+ "sha256": "fcaa089d16adcf12a27e6946bf683e9198163ad06db072982c60cd01e23dd81d"
12251
12251
  },
12252
12252
  {
12253
12253
  "path": "package.json",
12254
12254
  "mode": "0000644",
12255
- "sha256": "9486e00f8f741e980b4262fdb5bd67f57e6cf409fcce5d6be500b0ea034834a4"
12255
+ "sha256": "90bf1fb6bd405112ae7b6d1025d94be97565f27390021d5ccbd29498c78aa64f"
12256
12256
  },
12257
12257
  {
12258
12258
  "path": "public-docs/index.html",
@@ -12272,7 +12272,7 @@
12272
12272
  {
12273
12273
  "path": "release-notes.json",
12274
12274
  "mode": "0000644",
12275
- "sha256": "4b198cb07fa4d8c2cfee7c68de87742b2977554728a481dadf30fa529797189f"
12275
+ "sha256": "8f297631502a99fdca4606ee73e11babb2845653242aea51af6536d69ecf6a5f"
12276
12276
  },
12277
12277
  {
12278
12278
  "path": "scripts/bongos/CLAUDE.md",
@@ -16282,7 +16282,7 @@
16282
16282
  {
16283
16283
  "path": "src/module-api.js",
16284
16284
  "mode": "0000644",
16285
- "sha256": "fcdecb611288dcf5afb97ec54aa6a296267b0374fe885173eaa5f538db2cf8bb"
16285
+ "sha256": "a983e792ad432153dc9855b490a47bbb33d01faa36448ee48bc4636e8ccd4a6e"
16286
16286
  },
16287
16287
  {
16288
16288
  "path": "src/module-loader/catalog.js",
@@ -19252,7 +19252,7 @@
19252
19252
  {
19253
19253
  "path": "tests/hall_game_menu.mjs",
19254
19254
  "mode": "0000644",
19255
- "sha256": "707826e67223aa26d8a2805d9b80a970c50144c66b84211daba2a886fa64c016"
19255
+ "sha256": "0c12b2f3b9023e9f94ae1170e22496ea16091baecaede14ea7576eb96cc0dd43"
19256
19256
  },
19257
19257
  {
19258
19258
  "path": "tests/hall_game_review_tab.mjs",
@@ -19567,7 +19567,7 @@
19567
19567
  {
19568
19568
  "path": "tests/hall_visor_profile.mjs",
19569
19569
  "mode": "0000644",
19570
- "sha256": "f703935b6156df91b074535a6285ec3e9462fd5de1002223a4efe5dcda87c927"
19570
+ "sha256": "e9264f8e025155951dcf59ce33919f760893eaff5e923336a5712fc24357e353"
19571
19571
  },
19572
19572
  {
19573
19573
  "path": "tests/hall_work_history_id.mjs",
@@ -3456,5 +3456,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
3456
3456
  landed since 1.25.5 with no explicit bump. run 43408206925. (task 1002620)
3457
3457
  1.25.8 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3458
3458
  landed since 1.25.7 with no explicit bump. run 43412600767. (task 1002620)
3459
+ 1.25.9 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3460
+ landed since 1.25.8 with no explicit bump. run 43414302004. (task 1002620)
3459
3461
  ---------------------------------------------------------------------------
3460
3462
  ```
@@ -12,7 +12,7 @@
12
12
  "surface": "builders",
13
13
  "title": "Studio",
14
14
  "states_read": ["pick","describe","make","waiting","result","result-own","failed","balance","balance-all","out"],
15
- "files_hash": "3d35f6429c350fff",
15
+ "files_hash": "edbac26dd39e70bc",
16
16
  "reading_hash": "d9e0e85bcee4aff4",
17
17
  "counts": {"lines":106,"placed":41,"shared":7,"unplaced":58},
18
18
  "omitted": {"data":17},
@@ -131,7 +131,7 @@
131
131
  "surface": "builders",
132
132
  "title": "Repo Atlas",
133
133
  "states_read": ["map","truth","detail","index","out"],
134
- "files_hash": "edfe4cc950edf0d4",
134
+ "files_hash": "b2f8a634b905363d",
135
135
  "reading_hash": "6934dead335b2507",
136
136
  "counts": {"lines":25,"placed":14,"shared":7,"unplaced":4},
137
137
  "omitted": {"data":5},
@@ -169,7 +169,7 @@
169
169
  "surface": "builders",
170
170
  "title": "Blockers",
171
171
  "states_read": ["default"],
172
- "files_hash": "f922e0329e8eb75f",
172
+ "files_hash": "b6e2a953bc435b4b",
173
173
  "reading_hash": "60d73d854ced958a",
174
174
  "counts": {"lines":36,"placed":17,"shared":7,"unplaced":12},
175
175
  "omitted": {"data":51},
@@ -218,7 +218,7 @@
218
218
  "surface": "builders",
219
219
  "title": "Board Room",
220
220
  "states_read": ["room","out","sitting-meta","objection-form"],
221
- "files_hash": "4e378a78e17d9366",
221
+ "files_hash": "f905f58209651dc7",
222
222
  "reading_hash": "0260b797b8dc1526",
223
223
  "counts": {"lines":52,"placed":21,"shared":7,"unplaced":24},
224
224
  "omitted": {"data":17},
@@ -283,7 +283,7 @@
283
283
  "surface": "builders",
284
284
  "title": "The city",
285
285
  "states_read": ["city","fullscreen","focus","pins","living","card","card-ask"],
286
- "files_hash": "914cb0dece28a131",
286
+ "files_hash": "fa85296c94285592",
287
287
  "reading_hash": "277096d903879a57",
288
288
  "counts": {"lines":26,"placed":9,"shared":6,"unplaced":11},
289
289
  "omitted": {"data":7},
@@ -322,7 +322,7 @@
322
322
  "surface": "builders",
323
323
  "title": "Collab",
324
324
  "states_read": ["board","out"],
325
- "files_hash": "3a06128fed49c33c",
325
+ "files_hash": "1a123673d5c42eb1",
326
326
  "reading_hash": "e6452bf92231656f",
327
327
  "counts": {"lines":82,"placed":36,"shared":6,"unplaced":40},
328
328
  "omitted": {"data":23},
@@ -417,7 +417,7 @@
417
417
  "surface": "builders",
418
418
  "title": "Commands",
419
419
  "states_read": ["in","out"],
420
- "files_hash": "706fcc645c941fde",
420
+ "files_hash": "f489c16266526faf",
421
421
  "reading_hash": "ecc452689a8ee9d7",
422
422
  "counts": {"lines":71,"placed":49,"shared":7,"unplaced":15},
423
423
  "omitted": {"data":177},
@@ -501,7 +501,7 @@
501
501
  "surface": "builders",
502
502
  "title": "Copy desk",
503
503
  "states_read": ["queue","out","search","composer","closer","proposer"],
504
- "files_hash": "d9a01382c115a92a",
504
+ "files_hash": "785cdc61de7f47d8",
505
505
  "reading_hash": "3819ef6fa8f6fb7c",
506
506
  "counts": {"lines":72,"placed":36,"shared":7,"unplaced":29},
507
507
  "omitted": {"data":94},
@@ -586,7 +586,7 @@
586
586
  "surface": "builders",
587
587
  "title": "Deploy",
588
588
  "states_read": ["work","out"],
589
- "files_hash": "b39bb32c17c12975",
589
+ "files_hash": "269ff7a1cfd6321c",
590
590
  "reading_hash": "3770e8b2fa56bee1",
591
591
  "counts": {"lines":14,"placed":5,"shared":7,"unplaced":2},
592
592
  "omitted": {"data":5},
@@ -613,7 +613,7 @@
613
613
  "surface": "builders",
614
614
  "title": "The sky",
615
615
  "states_read": ["tour","sky","wells","ledger","full","full-back","out"],
616
- "files_hash": "c8473c8bd6bfcff3",
616
+ "files_hash": "acd20be9a69d8558",
617
617
  "reading_hash": "4a879397a84631e3",
618
618
  "counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
619
619
  "omitted": {"data":10},
@@ -676,7 +676,7 @@
676
676
  "surface": "builders",
677
677
  "title": "Goals",
678
678
  "states_read": ["list","filters","cards","detail","dependencies","out","uat","uat-panel","author"],
679
- "files_hash": "ac39a09e8a923863",
679
+ "files_hash": "b39eeda78fc88c8b",
680
680
  "reading_hash": "13a5d07b3804b627",
681
681
  "counts": {"lines":187,"placed":61,"shared":7,"unplaced":119},
682
682
  "omitted": {"data":315},
@@ -876,7 +876,7 @@
876
876
  "surface": "builders",
877
877
  "title": "Government",
878
878
  "states_read": ["constitution","out","permissions","board","constitution-tab"],
879
- "files_hash": "ea32e1399fe5b394",
879
+ "files_hash": "1d4334e6e491f2e8",
880
880
  "reading_hash": "37c6878d60447fd6",
881
881
  "counts": {"lines":65,"placed":27,"shared":7,"unplaced":31},
882
882
  "omitted": {"data":276},
@@ -954,7 +954,7 @@
954
954
  "surface": "builders",
955
955
  "title": "Builders' Hall",
956
956
  "states_read": ["home","out","founding","genesis","decide","demo","votes"],
957
- "files_hash": "db319ffd04ab0951",
957
+ "files_hash": "6b487fdb592daf9f",
958
958
  "reading_hash": "c5f4986bd90e2a2a",
959
959
  "counts": {"lines":29,"placed":8,"shared":8,"unplaced":13},
960
960
  "omitted": {"data":4},
@@ -996,7 +996,7 @@
996
996
  "surface": "builders",
997
997
  "title": "Idea",
998
998
  "states_read": ["record","missing"],
999
- "files_hash": "3f72b14ed91b7803",
999
+ "files_hash": "353f7a1879a701b3",
1000
1000
  "reading_hash": "f7d644748c87e426",
1001
1001
  "counts": {"lines":52,"placed":25,"shared":8,"unplaced":19},
1002
1002
  "omitted": {"data":25},
@@ -1061,7 +1061,7 @@
1061
1061
  "surface": "builders",
1062
1062
  "title": "Ideas",
1063
1063
  "states_read": ["compose","full","develop"],
1064
- "files_hash": "69f7665f4d823b05",
1064
+ "files_hash": "05c0b64561105735",
1065
1065
  "reading_hash": "a62c05dcef3bf87f",
1066
1066
  "counts": {"lines":68,"placed":34,"shared":7,"unplaced":27},
1067
1067
  "omitted": {"data":118},
@@ -1142,7 +1142,7 @@
1142
1142
  "surface": "builders",
1143
1143
  "title": "Market Watch",
1144
1144
  "states_read": ["desk","settings","out"],
1145
- "files_hash": "d85500e69e188b5f",
1145
+ "files_hash": "2f439bfb64896471",
1146
1146
  "reading_hash": "30512dda207b5ea6",
1147
1147
  "counts": {"lines":23,"placed":11,"shared":7,"unplaced":5},
1148
1148
  "omitted": {"data":5},
@@ -1178,7 +1178,7 @@
1178
1178
  "surface": "builders",
1179
1179
  "title": "Market Watch",
1180
1180
  "states_read": ["dossier","out","propose","correct","filtered"],
1181
- "files_hash": "ea3c71cb05717cc8",
1181
+ "files_hash": "7410949d9aea8036",
1182
1182
  "reading_hash": "129bff28c4e4ed6d",
1183
1183
  "counts": {"lines":24,"placed":12,"shared":7,"unplaced":5},
1184
1184
  "omitted": {"data":5},
@@ -1215,7 +1215,7 @@
1215
1215
  "surface": "builders",
1216
1216
  "title": "Market Watch rules",
1217
1217
  "states_read": ["in","scoring","names","propose","out"],
1218
- "files_hash": "6f513cf7cdfe92ae",
1218
+ "files_hash": "1cc1e77329378c59",
1219
1219
  "reading_hash": "ca0c62e8dce51c8b",
1220
1220
  "counts": {"lines":36,"placed":12,"shared":7,"unplaced":17},
1221
1221
  "omitted": {"data":20},
@@ -1264,7 +1264,7 @@
1264
1264
  "surface": "builders",
1265
1265
  "title": "Modules",
1266
1266
  "states_read": ["browse","search-empty","lens","details","out"],
1267
- "files_hash": "2d24a52c632cde42",
1267
+ "files_hash": "ea01e6abd87dcd01",
1268
1268
  "reading_hash": "6a12e9306bba5622",
1269
1269
  "counts": {"lines":59,"placed":29,"shared":7,"unplaced":23},
1270
1270
  "omitted": {"data":107},
@@ -1336,7 +1336,7 @@
1336
1336
  "surface": "builders",
1337
1337
  "title": "Money",
1338
1338
  "states_read": ["money","hosting","out"],
1339
- "files_hash": "6096846da3462763",
1339
+ "files_hash": "08a51d923113820a",
1340
1340
  "reading_hash": "e355d5466b123e07",
1341
1341
  "counts": {"lines":83,"placed":28,"shared":7,"unplaced":48},
1342
1342
  "omitted": {"data":27},
@@ -1432,7 +1432,7 @@
1432
1432
  "surface": "builders",
1433
1433
  "title": "My agents",
1434
1434
  "states_read": ["desk","factory","saved","what-it-knows","speciality-walk","speciality-forms","nobody"],
1435
- "files_hash": "9c2b1b8aaf468c84",
1435
+ "files_hash": "54956a6409fa367f",
1436
1436
  "reading_hash": "5347e0496b38727d",
1437
1437
  "counts": {"lines":100,"placed":33,"shared":7,"unplaced":60},
1438
1438
  "omitted": {"data":38},
@@ -1545,7 +1545,7 @@
1545
1545
  "surface": "builders",
1546
1546
  "title": "Primer",
1547
1547
  "states_read": ["in","toc-open","jump","out"],
1548
- "files_hash": "40d793bc1f676419",
1548
+ "files_hash": "4383ba8fb3e392f2",
1549
1549
  "reading_hash": "85790bd421e5c387",
1550
1550
  "counts": {"lines":487,"placed":57,"shared":7,"unplaced":423},
1551
1551
  "omitted": {"data":18},
@@ -2045,7 +2045,7 @@
2045
2045
  "surface": "builders",
2046
2046
  "title": "Profile",
2047
2047
  "states_read": ["own","works","activity","yours","activity-artist","activity-artist-ideas","other","artist","artist-ideas","out"],
2048
- "files_hash": "2e5aad6962c3c8b3",
2048
+ "files_hash": "590c6916dbf983e9",
2049
2049
  "reading_hash": "3ff8d703d17e8c2a",
2050
2050
  "counts": {"lines":232,"placed":84,"shared":7,"unplaced":141},
2051
2051
  "omitted": {"data":263},
@@ -2290,7 +2290,7 @@
2290
2290
  "surface": "builders",
2291
2291
  "title": "Project settings",
2292
2292
  "states_read": ["default"],
2293
- "files_hash": "3dde20d38f2c06da",
2293
+ "files_hash": "c5e58719c2d5ed68",
2294
2294
  "reading_hash": "283df27d0d5bfc1b",
2295
2295
  "counts": {"lines":43,"placed":25,"shared":7,"unplaced":11},
2296
2296
  "omitted": {"data":33},
@@ -2346,7 +2346,7 @@
2346
2346
  "surface": "builders",
2347
2347
  "title": "Builders",
2348
2348
  "states_read": ["roster","artists","search","out"],
2349
- "files_hash": "fd4aafc69104eed7",
2349
+ "files_hash": "d8aaebb0b4307cb3",
2350
2350
  "reading_hash": "665ac2e36339f5d3",
2351
2351
  "counts": {"lines":56,"placed":17,"shared":7,"unplaced":32},
2352
2352
  "omitted": {"data":137},
@@ -2415,7 +2415,7 @@
2415
2415
  "surface": "builders",
2416
2416
  "title": "Options",
2417
2417
  "states_read": ["account","access","preferences","install-reports","sound","update"],
2418
- "files_hash": "6f61674891ca294c",
2418
+ "files_hash": "fb7a82cf8d12b927",
2419
2419
  "reading_hash": "898a13fda24c3c90",
2420
2420
  "counts": {"lines":162,"placed":104,"shared":7,"unplaced":51},
2421
2421
  "omitted": {"data":23},
@@ -2590,7 +2590,7 @@
2590
2590
  "surface": "builders",
2591
2591
  "title": "The street",
2592
2592
  "states_read": ["street","fullscreen","card","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district","desk","desk-facts","desk-quiet","desk-people-builders","desk-people-tier","desk-disputes","desk-automation-goals","desk-release-core","desk-rules","desk-rules-category","desk-planning-priorities","desk-planning-ideas","desk-planning-blockers","pins","pins-pager","living","deck","deck-treasury","sitting","object","voted","admission","settled","blocker","blocker-more","report","report-more","core","core-more","recheck","recheck-more","idea","idea-more","queue","queue-more","automation","automation-more"],
2593
- "files_hash": "0824158dfe86879b",
2593
+ "files_hash": "aef96af62a009d70",
2594
2594
  "reading_hash": "e788e6bf4be8d68c",
2595
2595
  "counts": {"lines":325,"placed":54,"shared":6,"unplaced":265},
2596
2596
  "omitted": {"data":240},
@@ -2928,7 +2928,7 @@
2928
2928
  "surface": "builders",
2929
2929
  "title": "Studio",
2930
2930
  "states_read": ["home","out","flow","flow-pick","status","words-offer","words-edit","reviews","full","full-back","approvals","approvals-before","approvals-phone","approvals-note","approved","sent-back","approvals-page"],
2931
- "files_hash": "b5217f22546d2ca2",
2931
+ "files_hash": "47860545115fd317",
2932
2932
  "reading_hash": "c4e3b4188c1db755",
2933
2933
  "counts": {"lines":51,"placed":29,"shared":7,"unplaced":15},
2934
2934
  "omitted": {"data":23},
@@ -2992,7 +2992,7 @@
2992
2992
  "surface": "builders",
2993
2993
  "title": "Task",
2994
2994
  "states_read": ["record","from-goal","missing"],
2995
- "files_hash": "9a949acc81a483c6",
2995
+ "files_hash": "88ed0a90ad234675",
2996
2996
  "reading_hash": "8dd803b6934e6388",
2997
2997
  "counts": {"lines":151,"placed":46,"shared":9,"unplaced":96},
2998
2998
  "omitted": {"data":111},
@@ -3156,7 +3156,7 @@
3156
3156
  "surface": "builders",
3157
3157
  "title": "Your thinking",
3158
3158
  "states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
3159
- "files_hash": "109968f4f22ab7b4",
3159
+ "files_hash": "19780a3e357c9e36",
3160
3160
  "reading_hash": "b73f848b46b0f9b8",
3161
3161
  "counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
3162
3162
  "omitted": {"data":10},
@@ -3219,7 +3219,7 @@
3219
3219
  "surface": "builders",
3220
3220
  "title": "Tweak a page",
3221
3221
  "states_read": ["doc","typed","chrome","submitted","picking","out"],
3222
- "files_hash": "a9131745a366382f",
3222
+ "files_hash": "0b07f1692457561d",
3223
3223
  "reading_hash": "f521f8d9a7147557",
3224
3224
  "counts": {"lines":26,"placed":18,"shared":2,"unplaced":6},
3225
3225
  "omitted": {"data":19},
@@ -3258,7 +3258,7 @@
3258
3258
  "surface": "builders",
3259
3259
  "title": "Watch",
3260
3260
  "states_read": ["board","out","operations","security","sessions","autobongos"],
3261
- "files_hash": "b6a3ff14b1b63837",
3261
+ "files_hash": "ff7431bb0ccb520f",
3262
3262
  "reading_hash": "1961a0c06b9d8477",
3263
3263
  "counts": {"lines":72,"placed":33,"shared":7,"unplaced":32},
3264
3264
  "omitted": {"data":52},
@@ -3343,7 +3343,7 @@
3343
3343
  "surface": "builders",
3344
3344
  "title": "Tasks",
3345
3345
  "states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
3346
- "files_hash": "fb251657db11b790",
3346
+ "files_hash": "1d8e106e9142a083",
3347
3347
  "reading_hash": "e9b412d1ec59ceee",
3348
3348
  "counts": {"lines":122,"placed":49,"shared":7,"unplaced":66},
3349
3349
  "omitted": {"data":323},
@@ -895,7 +895,7 @@ html[data-theme="dark"] .brand-mark__mark { --mark-ink: #e2e1e4; }
895
895
  and the shell’s corner buttons, so the top arc, its notch and the place all step aside. The foot row keeps its three parts in one line and nothing leans: the sprite
896
896
  with the count over its word, the one accent button (its name may take two lines; its key is in the sheet), and of
897
897
  the key hints only Actions, as its dots (every other hint is a row in its sheet). */
898
- html[data-game="on"] #visor { --visor-inset-bottom: 52px; }
898
+ :root[data-game="on"] { --visor-inset-bottom: 52px; --visor-foot-room: 112px; }
899
899
  html[data-game="on"] .visor__place, html[data-game="on"] .visor__progress, html[data-game="on"] .visor__notch, html[data-game="on"] .visor__frame--top, html[data-game="on"] .visor__name { display: none; }
900
900
  html[data-game="on"] .visor__foot { grid-template-columns: auto minmax(0, 1fr) auto; column-gap: var(--ds-space-hair); }
901
901
  html[data-game="on"] .visor__me, html[data-game="on"] .visor__hints { transform: none; }
@@ -914,7 +914,7 @@ html[data-theme="dark"] .brand-mark__mark { --mark-ink: #e2e1e4; }
914
914
  html[data-game="on"] .visor__who, html[data-game="on"] .visor__hint { background: var(--night-plate); box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; }
915
915
  html[data-game="on"] .visor__hint--sheet > :not(.visor__dots) { position: absolute; width: 1px; height: 1px; padding: 0; border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
916
916
  html[data-game="on"] .visor__main .visor__key { display: none; }
917
- html[data-game="on"] .visor__sheet { bottom: calc(var(--visor-inset-bottom) + 112px); max-height: 60vh; }
917
+ html[data-game="on"] .visor__sheet { max-height: 60vh; }
918
918
  }
919
919
  /* task 1004424 (BV2.PS10): THE FOUNDING MARK. A pill in .rank-badge's grammar (same
920
920
  height, type and radius) so it sits beside a rank without competing with it; the
@@ -10,11 +10,15 @@
10
10
  the night, and the place, each hint and your credits stand on a small night plate. Colours, sizes and corners
11
11
  are the hall tier's tokens; nothing here is typed in. Record: modules/hall-ui/records/visor.md. */
12
12
  .visor { display: none; }
13
+ /* where the glass sits, so a scene's pop-up, and a window the glass opens, can keep clear of
14
+ it (ADR 0399 §2.3). On the root, not the visor, because the options window is not inside
15
+ it. --visor-foot-room is the foot row's height with the hints wrapped onto a second line. */
16
+ html[data-game="on"] {
17
+ --visor-arc: 64px; --visor-inset-top: 88px; --visor-inset-bottom: 76px; --visor-foot-room: 100px;
18
+ --visor-inset-right: max(var(--ds-space-gutter-narrow), var(--helm-inset)); --visor-inset-left: var(--visor-inset-right);
19
+ }
13
20
  html[data-game="on"] .visor:not([hidden]) {
14
21
  display: block; position: fixed; inset: 0; z-index: 4; pointer-events: none;
15
- /* where the glass sits, so a scene's pop-up can keep clear of it (ADR 0399 §2.3) */
16
- --visor-arc: 64px; --visor-inset-top: 88px; --visor-inset-bottom: 76px;
17
- --visor-inset-right: max(var(--ds-space-gutter-narrow), var(--helm-inset)); --visor-inset-left: var(--visor-inset-right);
18
22
  color: var(--ink); font-family: var(--font-body);
19
23
  }
20
24
 
@@ -187,9 +191,9 @@ html[data-game="on"] .visor:not([hidden]) {
187
191
  panel between two strong hairlines, standing over the hints that opened it, clear of the foot
188
192
  row even when the hints have wrapped onto a second line. */
189
193
  .visor__sheet {
190
- position: absolute; right: var(--visor-inset-right); bottom: calc(var(--visor-inset-bottom) + 100px); z-index: 1;
194
+ position: absolute; right: var(--visor-inset-right); bottom: calc(var(--visor-inset-bottom) + var(--visor-foot-room)); z-index: 1;
191
195
  pointer-events: auto; box-sizing: border-box; width: min(18rem, calc(100vw - 2 * var(--ds-space-gutter-narrow)));
192
- max-height: calc(100% - var(--visor-inset-top) - var(--visor-inset-bottom) - 100px); overflow-y: auto;
196
+ max-height: calc(100% - var(--visor-inset-top) - var(--visor-inset-bottom) - var(--visor-foot-room)); overflow-y: auto;
193
197
  padding: var(--ds-space-sm); background: var(--bg-card);
194
198
  border: 0 solid var(--rule); border-left-width: var(--line-strong); border-right-width: var(--line-strong);
195
199
  }
@@ -237,5 +241,29 @@ html[data-game="on"] .visor:not([hidden]) {
237
241
  .visor__focus .visor__key { color: var(--ink-soft); background: none; }
238
242
  .visor__main--lead[aria-busy="true"] { cursor: progress; background: var(--accent-lift); }
239
243
 
244
+ /* A WINDOW THE GLASS OPENS OPENS IN THE GLASS (task 1005253, ADR 0403; owner 2026-11-13). The
245
+ options window and your profile (shell-game.js openOverlay, .opt-window) and the game menu
246
+ (openMenu, .game-menu) are reached from the visor, so they never cover it: in game mode each
247
+ fits between the top arc and the foot row, and the visor is drawn over its scrim, undimmed,
248
+ as the frame you see it through. While one is up the glass is a picture: nothing on it takes
249
+ a pointer (the window is modal and keeps the keyboard), the sight leaves the window's middle,
250
+ and the glass's own pop-ups (the sheet, the scene's pick, your card) step aside. */
251
+ html.visor-on .opt-window, html.visor-on .game-menu {
252
+ box-sizing: border-box;
253
+ padding: var(--visor-inset-top) var(--visor-inset-right) calc(var(--visor-inset-bottom) + var(--visor-foot-room)) var(--visor-inset-left);
254
+ }
255
+ html.visor-on .opt-window__box { width: min(1040px, 100%); height: min(720px, 100%); }
256
+ html.visor-on .game-menu__box { max-height: 100%; }
257
+ html.visor-on:is(.opt-window-open, .game-menu-open) .visor:not([hidden]) { z-index: calc(var(--ds-z-modal, 160) + 1); }
258
+ html.visor-on:is(.opt-window-open, .game-menu-open) .visor * { pointer-events: none; }
259
+ html.visor-on:is(.opt-window-open, .game-menu-open) :is(.visor__sight, .visor__sheet, .visor__focus, .visor__card) { visibility: hidden; }
260
+ /* THE GAME MENU IS THE ONE THING IN FOCUS (owner 2026-11-13): the place behind it is frosted
261
+ (the hall's glass blur, under the glass, so the visor's lines stay sharp), and everything on
262
+ the glass but its two arcs steps back, so the eye goes to the menu. The arcs stay as the frame
263
+ the menu is held in. */
264
+ html.visor-on .game-menu { -webkit-backdrop-filter: blur(var(--glass-blur)); backdrop-filter: blur(var(--glass-blur)); }
265
+ html.visor-on .visor > :not(.visor__frame, .visor__notch) { transition: opacity var(--ds-dur-fast) var(--ds-ease); }
266
+ html.visor-on.game-menu-open .visor > :not(.visor__frame, .visor__notch) { opacity: .25; }
267
+
240
268
  /* a phone (640px and narrower): the rules live in style.css’s shared phone block, so the
241
269
  visor adds no breakpoint of its own (the design-count ratchet). */
@@ -28,6 +28,6 @@ The menu is a Helm screen, written from the hall tier's tokens alone (`settings.
28
28
  ## The options window (owner, 2026-11-11: "WoW sizing, an overlay")
29
29
 
30
30
  - **In game mode the menu opens over the place, not as a page.** The game menu's Options row (task 1005250, `records/game-menu.md`; until then Escape itself), or a click on any link to `/settings` (the profile chip), draws one window (`shell-game.js` `openOverlay`, `window.OTBOptionsOverlay`), built on the shared dialog (`OTBDialog.bind`: Escape, scrim, close button, focus trap and return), with the page behind made `inert` while it is up, holding the menu framed with `?embed=1`; the place stays drawn behind it. Escape, the scrim or the × shuts it; `options-menu.js` `close()` shuts the window when it is in one. A page that cannot draw it falls back to the menu page. A plain visit to `/settings` is the page, as before.
31
- - **Window sized, see-through.** The window is `min(1040px, …) × min(720px, …)` of glass at 48% of the ground with a light blur, over the shared `--scrim` at a third. Every embedded screen is drawn at `zoom: 0.82` with no ground of its own (`style.css`), and the menu inside it takes smaller words (`settings.css`, `html[data-embed="on"]`); a window-high length divides by the zoom (`--opt-vh`).
31
+ - **Window sized, see-through.** The window is `min(1040px, …) × min(720px, …)` of glass at 48% of the ground with a light blur, over the shared `--scrim` at a third. Every embedded screen is drawn at `zoom: 0.82` with no ground of its own (`style.css`), and the menu inside it takes smaller words (`settings.css`, `html[data-embed="on"]`); a window-high length divides by the zoom (`--opt-vh`). In game mode with the visor up the window fits inside the glass, between the top arc and the foot row, and never covers the visor (task 1005253, `records/visor.md`).
32
32
  - **One review palette.** A framed screen docks no artist palette of its own (`craft-mode.js` `applyDocked`); the page around it has one.
33
33
  - **Tests:** `tests/hall_options_menu.mjs` ("away from the menu, Escape opens the options as a window…"), `tests/page_notes_panel.mjs` (the frame docks no panel).
@@ -6,6 +6,14 @@ Covers: `visor.js` + `visor.css`, loaded on Home, `/city`, `/goal-map` and `/thi
6
6
 
7
7
  The visor is the control and the scene is the view: every main call to action in game mode is on the glass (the accent button, the key hints, the Actions sheet), and a scene carries none of its own. A scene that has something to do registers it with `OTBVisor.scene({ actions, keys })`. ADR 0403 §3 lists the scenes that do not keep it yet; the Governor City keeps it since task 1005209 the sky since task 1005210, and Home's gallery since task 1005211 (below).
8
8
 
9
+ ## A window the glass opens opens in the glass (task 1005253, owner 2026-11-13)
10
+
11
+ - **The bug.** The options window and your profile window (`shell-game.js` `openOverlay`, `.opt-window`), and the game menu (`openMenu`, `.game-menu`, task 1005250), are reached from the visor, yet they opened as a box over the whole screen and covered the visor itself: the arcs, the place, your credits, the accent button and the hints.
12
+ - **The rule.** A menu or window the visor opens never covers the visor. In game mode (`html.visor-on`) the window fits between the top arc (`--visor-inset-top`) and the foot row (`--visor-inset-bottom` + `--visor-foot-room`), inside the side insets, and the visor is drawn over the window's scrim, undimmed, as the frame it is seen through (`visor.css`). While a window is up the glass is a picture: none of it takes a pointer (the window is modal and keeps the keyboard), the sight leaves the window's middle, and the glass's own pop-ups (the sheet, the scene's pick, your card) step aside. Shut, the glass goes back to z 4.
13
+ - **The game menu is the one thing in focus** (owner, same day: "a frosted glass or blur… so the user focuses specifically on the game menu"). While it is up the place behind it is frosted (`backdrop-filter` with the hall's `--glass-blur`, on `.game-menu`, so it is under the glass and the visor's lines stay sharp), and everything on the glass but its two arcs and the notch fades to a quarter. The options and profile windows are glass of their own and keep the visor whole around them.
14
+ - **The glass's measures are on the root now** (`html[data-game="on"]`, and the phone block's `:root[data-game="on"]`), not on `#visor`, because the window is not inside the visor. The sheet reads `--visor-foot-room` too, so the sheet and a window keep the same clearance over the foot row. Classic mode keeps the centred window.
15
+ - **Tests:** `tests/hall_visor_profile.mjs` ("a window the visor opens sits inside the glass…", at a desk and a phone width).
16
+
9
17
  ## One owner per key (task 1005248, owner 2026-11-12)
10
18
 
11
19
  - **The bug.** The Artist saw Esc twice: "Options" on the glass, then in the Actions sheet both Close and the Options row said Esc.
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.25.8",
3
+ "version": "1.25.9",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.25.8",
9
+ "version": "1.25.9",
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.25.8",
3
+ "version": "1.25.9",
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",
@@ -11754,5 +11754,11 @@
11754
11754
  "text": "Opening the builders' hall now starts on the Game or Classic choice. Signed out, your pick takes you to sign in and then straight to that menu."
11755
11755
  }
11756
11756
  ],
11757
- "1.25.8": []
11757
+ "1.25.8": [],
11758
+ "1.25.9": [
11759
+ {
11760
+ "id": "1005253",
11761
+ "text": "In game mode, the windows the visor opens (Options, your profile, the game menu) now open inside the visor instead of covering it, and the game menu blurs the place behind it and quiets the visor so it is the one thing in focu"
11762
+ }
11763
+ ]
11758
11764
  }
package/src/module-api.js CHANGED
@@ -81,7 +81,7 @@ const { sleep } = require('./sleep');
81
81
  // MAJOR (see allowBoxScope below): passes the request through untouched.
82
82
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
83
83
 
84
- const CORE_VERSION = '1.25.8'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
84
+ const CORE_VERSION = '1.25.9'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
85
85
 
86
86
  // A namespaced logger so a module's log lines are attributable + consistent.
87
87
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -93,6 +93,35 @@ test('Escape in a game place opens the game menu, not the options; Escape again
93
93
  await ctx.close();
94
94
  });
95
95
 
96
+ // task 1005253 (owner, 2026-11-13): the menu is in the glass and is the one thing in focus. The
97
+ // place behind it is frosted, the visor stays over it with only its arcs at full strength, and
98
+ // it ends above the foot row.
99
+ test('the game menu is the one thing in focus: the place frosted, the glass quiet but for its arcs', { skip }, async () => {
100
+ const { ctx, page, errors } = await open();
101
+ await escape(page);
102
+ assert.equal(await menuUp(page), true);
103
+ await page.waitForTimeout(300); // the glass's fade
104
+ const f = await page.evaluate(() => {
105
+ const cs = (s) => getComputedStyle(document.querySelector(s));
106
+ return {
107
+ blur: cs('.game-menu').backdropFilter,
108
+ visorOver: Number(cs('#visor').zIndex) > Number(cs('.game-menu').zIndex),
109
+ foot: Number(cs('.visor__foot').opacity), arc: Number(cs('.visor__frame--top').opacity),
110
+ clear: document.querySelector('.game-menu__box').getBoundingClientRect().bottom <= document.querySelector('.visor__foot').getBoundingClientRect().top,
111
+ };
112
+ });
113
+ assert.match(f.blur, /^blur\(\d/, 'the place behind is frosted');
114
+ assert.ok(f.visorOver, 'the glass stays over the menu\'s scrim');
115
+ assert.ok(f.foot < 0.5, 'the buttons and words on the glass step back');
116
+ assert.equal(f.arc, 1, 'the arcs hold the menu at full strength');
117
+ assert.ok(f.clear, 'the menu ends above the foot row');
118
+ await escape(page);
119
+ await page.waitForTimeout(300);
120
+ assert.equal(await page.evaluate(() => Number(getComputedStyle(document.querySelector('.visor__foot')).opacity)), 1, 'shut, the glass is whole again');
121
+ assert.deepEqual(errors, []);
122
+ await ctx.close();
123
+ });
124
+
96
125
  test('Return to game shuts the menu; Options opens the options window in its place', { skip }, async () => {
97
126
  const { ctx, page, errors } = await open();
98
127
  await escape(page);
@@ -65,7 +65,7 @@ const SCENE = `<script>
65
65
  window.__visorScene = { name: 'test', place: 'Test city', actions: [], keys: [] };
66
66
  </script>`;
67
67
  const PAGE = (withWindow) => `<!doctype html><html data-theme="dark" data-faces="helm"><head><meta charset="utf-8">
68
- <link rel="stylesheet" href="/builders/style.css"><link rel="stylesheet" href="/builders/visor.css"></head>
68
+ <link rel="stylesheet" href="/tokens.css"><link rel="stylesheet" href="/builders/style.css"><link rel="stylesheet" href="/builders/visor.css"></head>
69
69
  <body>${SCENE}<script src="/builders/hall-dialog.js"></script>${withWindow ? '<script src="/builders/shell-game.js"></script>' : ''}<script src="/builders/visor.js"></script></body></html>`;
70
70
 
71
71
  async function open({ withWindow = true } = {}) {
@@ -73,6 +73,7 @@ async function open({ withWindow = true } = {}) {
73
73
  await ctx.route(ORIGIN + '/**', (route) => {
74
74
  const p = new URL(route.request().url()).pathname;
75
75
  if (p === '/') return route.fulfill({ contentType: 'text/html', body: PAGE(withWindow) });
76
+ if (p === '/tokens.css') return route.fulfill({ contentType: 'text/css', body: fs.readFileSync(path.join(ROOT, 'modules/ui-design/public/tokens.css')) }); // the design tokens the hall loads first
76
77
  if (p === '/profile') return route.fulfill({ contentType: 'text/html', body: '<!doctype html><title>profile</title><p id="pp">your profile</p><script src="/builders/shell-game.js"></script>' }); // the real page carries the game shell, which hands an Escape up
77
78
  const f = path.join(HALL, p.replace(/^\/builders\//, ''));
78
79
  if (p.startsWith('/builders/') && TYPES[path.extname(p)] && fs.existsSync(f)) return route.fulfill({ contentType: TYPES[path.extname(p)], body: fs.readFileSync(f) });
@@ -133,6 +134,44 @@ test('clicking you opens your whole profile in the window over the place; Escape
133
134
  await ctx.close();
134
135
  });
135
136
 
137
+ // task 1005253 (owner, 2026-11-13): a window the glass opens opens IN the glass. It never covers
138
+ // the visor: it sits under the top arc and above the foot row, the visor is drawn over its scrim,
139
+ // and while it is up nothing on the glass takes a pointer and the glass's own pop-ups step aside.
140
+ test('a window the visor opens sits inside the glass, and the visor stays drawn around it', { skip }, async () => {
141
+ for (const viewport of [{ width: 1280, height: 800 }, { width: 390, height: 844 }]) {
142
+ const { ctx, page, errors } = await open();
143
+ await page.setViewportSize(viewport);
144
+ await page.evaluate(() => window.OTBOptionsOverlay.open(''));
145
+ await page.waitForFunction(() => window.OTBOptionsOverlay.isOpen());
146
+ const g = await page.evaluate(() => {
147
+ const r = (s) => document.querySelector(s).getBoundingClientRect();
148
+ const box = r('.opt-window__box'); const foot = r('.visor__foot'); const main = r('.visor__main');
149
+ const z = (s) => Number(getComputedStyle(document.querySelector(s)).zIndex);
150
+ // what is on top at the centre of the accent button: the glass, not the window
151
+ const hit = document.elementsFromPoint(main.left + main.width / 2, main.top + main.height / 2);
152
+ return {
153
+ top: box.top, bottom: box.bottom, footTop: foot.top, place: getComputedStyle(document.documentElement).getPropertyValue('--visor-inset-top').trim(),
154
+ visorOver: z('#visor') > z('.opt-window'),
155
+ buttonUnder: hit.some((el) => el.closest && el.closest('.opt-window__box')),
156
+ mainPointer: getComputedStyle(document.querySelector('.visor__main')).pointerEvents,
157
+ sight: getComputedStyle(document.querySelector('.visor__sight')).visibility,
158
+ };
159
+ });
160
+ assert.ok(g.bottom <= g.footTop, `${viewport.width}px: the window ends above the foot row (${g.bottom} > ${g.footTop})`);
161
+ assert.equal(g.top, parseFloat(g.place), `${viewport.width}px: the window starts under the top arc`);
162
+ assert.ok(g.visorOver, 'the glass is drawn over the window\'s scrim');
163
+ assert.ok(!g.buttonUnder, 'the window covers none of the foot row');
164
+ assert.equal(g.mainPointer, 'none', 'the glass is a picture while the window is up');
165
+ assert.equal(g.sight, 'hidden', 'the sight leaves the window\'s middle');
166
+ await page.evaluate(() => window.OTBOptionsOverlay.close());
167
+ await page.waitForFunction(() => !window.OTBOptionsOverlay.isOpen());
168
+ assert.equal(await page.evaluate(() => getComputedStyle(document.querySelector('#visor')).zIndex), '4', 'shut, the glass goes back under the pop-ups');
169
+ assert.equal(await page.evaluate(() => getComputedStyle(document.querySelector('.visor__main')).pointerEvents), 'auto');
170
+ assert.deepEqual(errors, []);
171
+ await ctx.close();
172
+ }
173
+ });
174
+
136
175
  test('with no window to draw, you are still a link to your profile', { skip }, async () => {
137
176
  const { ctx, page, errors } = await open({ withWindow: false });
138
177
  const r = await page.evaluate(() => {