@bongos/core 1.25.2 → 1.25.4

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 (37) hide show
  1. package/.bongos-core.json +55 -40
  2. package/docs/copy-inventory.md +30 -29
  3. package/docs/copy-registry.json +78 -58
  4. package/docs/module-api-changelog.md +4 -0
  5. package/docs/page-inventory.json +5 -3
  6. package/docs/page-readings.json +44 -44
  7. package/modules/hall-ui/public/builders.js +3 -27
  8. package/modules/hall-ui/public/genesis-home.js +54 -4
  9. package/modules/hall-ui/public/hall-render.js +5 -119
  10. package/modules/hall-ui/public/hall-widgets.js +3 -3
  11. package/modules/hall-ui/public/index-genesis-votes.states.json +61 -0
  12. package/modules/hall-ui/public/index.html +0 -7
  13. package/modules/hall-ui/public/shell-game.js +22 -4
  14. package/modules/hall-ui/public/style.css +3 -73
  15. package/modules/hall-ui/public/visor.css +31 -1
  16. package/modules/hall-ui/public/visor.js +53 -3
  17. package/modules/hall-ui/records/home-reshuffle.md +1 -1
  18. package/modules/hall-ui/records/visor.md +10 -0
  19. package/modules/onboarding/founding-mode.js +4 -1
  20. package/modules/onboarding/genesis-home.js +57 -2
  21. package/modules/onboarding/routes/onboarding.js +2 -0
  22. package/modules/ui-design/kit/fixtures/founding-genesis-votes.json +193 -0
  23. package/modules/ui-design/kit/fixtures/me-founding-demo.json +0 -1
  24. package/modules/ui-design/kit/fixtures/me-founding.json +0 -1
  25. package/package-lock.json +2 -2
  26. package/package.json +1 -1
  27. package/release-notes.json +12 -0
  28. package/src/module-api.js +1 -1
  29. package/tests/founding_mode.mjs +13 -3
  30. package/tests/genesis_home.mjs +92 -4
  31. package/tests/hall_board_world.mjs +7 -35
  32. package/tests/hall_home_ships_bounded.mjs +11 -27
  33. package/tests/hall_landing_boot.mjs +7 -8
  34. package/tests/hall_nav.mjs +2 -2
  35. package/tests/hall_visor.mjs +9 -2
  36. package/tests/hall_visor_profile.mjs +150 -0
  37. package/tests/leaderboard_roles.mjs +3 -17
@@ -5,14 +5,14 @@
5
5
  "adr": "0341 D3",
6
6
  "reread": "node scripts/bongos/page-reader.js --stale",
7
7
  "how": ["Generated by node scripts/bongos/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
8
- "counts": {"pages":45,"lines":4411,"placed":1638,"shared":369,"unplaced":2404,"omitted_data":2981},
8
+ "counts": {"pages":45,"lines":4411,"placed":1638,"shared":369,"unplaced":2404,"omitted_data":2980},
9
9
  "pages": [
10
10
  {
11
11
  "id": "builders:ai-studio",
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": "bfd352bc483d41c2",
15
+ "files_hash": "5b785de6639c8ec5",
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": "133220425bccce34",
134
+ "files_hash": "76f3f9d62c147df5",
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": "a819c6030cf15a6e",
172
+ "files_hash": "8492188331702a2f",
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": "649b8241ac4ad473",
221
+ "files_hash": "4218d029418aa874",
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": "573bb0fbcdcafa9a",
286
+ "files_hash": "3a16e78aaab2e893",
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": "6e58d1336b59ed6d",
325
+ "files_hash": "9e9d0d3b86089631",
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": "6c7abde80e1c7a74",
420
+ "files_hash": "14d04212aba71360",
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": "1f6a0864849d0263",
504
+ "files_hash": "498777214970f599",
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": "b534665c0eb1a176",
589
+ "files_hash": "d93352de799f272f",
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": "fe5e504a7e12bca9",
616
+ "files_hash": "50735ca110164fe8",
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": "83d51fe0a0cbdc81",
679
+ "files_hash": "23bb6e3ad6306135",
680
680
  "reading_hash": "13a5d07b3804b627",
681
681
  "counts": {"lines":187,"placed":61,"shared":7,"unplaced":119},
682
682
  "omitted": {"data":315},
@@ -776,7 +776,7 @@
776
776
  {"key":"L0092","section":"Tasks","text":"{…} (high → low)","placement":"unplaced","state":"detail"},
777
777
  {"key":"L0093","section":"Tasks","text":"minutes (low → high)","placement":"unplaced","state":"detail"},
778
778
  {"key":"L0094","section":"Tasks","text":"priority (P0 first)","placement":"unplaced","state":"detail"},
779
- {"key":"L0095","section":"Tasks","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":521,"string_id":"4d8ee7d68974","state":"detail"},
779
+ {"key":"L0095","section":"Tasks","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":460,"string_id":"4d8ee7d68974","state":"detail"},
780
780
  {"key":"L0096","section":"Tasks","text":"status","placement":"unplaced","state":"detail"},
781
781
  {"key":"L0097","section":"Tasks","text":"Filters","placement":"unplaced","state":"detail"},
782
782
  {"key":"L0098","section":"Tasks","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"detail","occurrences":3},
@@ -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": "67e03165f6801e25",
879
+ "files_hash": "d168f2cd8aa66e32",
880
880
  "reading_hash": "37c6878d60447fd6",
881
881
  "counts": {"lines":65,"placed":27,"shared":7,"unplaced":31},
882
882
  "omitted": {"data":276},
@@ -953,17 +953,17 @@
953
953
  "id": "builders:home",
954
954
  "surface": "builders",
955
955
  "title": "Builders' Hall",
956
- "states_read": ["home","out","founding","genesis","decide","demo"],
957
- "files_hash": "b3b116e114d183f4",
958
- "reading_hash": "59797028e6124c9c",
956
+ "states_read": ["home","out","founding","genesis","decide","demo","votes"],
957
+ "files_hash": "730694ff18f4468d",
958
+ "reading_hash": "177d0c13a53c0491",
959
959
  "counts": {"lines":32,"placed":12,"shared":8,"unplaced":12},
960
- "omitted": {"data":5},
960
+ "omitted": {"data":4},
961
961
  "notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
962
962
  "lines": [
963
963
  {"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":814,"string_id":"87cee78ca134"},
964
964
  {"key":"L0002","section":"top bar","text":"Home","placement":"shared"},
965
965
  {"key":"L0003","section":"top bar","text":"Update","placement":"shared"},
966
- {"key":"L0004","section":"top bar","text":"Welcome back, {…}.","placement":"shared","file":"modules/hall-ui/public/hall-render.js","line":448,"string_id":"0658f0358ffd"},
966
+ {"key":"L0004","section":"top bar","text":"Welcome back, {…}.","placement":"shared","file":"modules/hall-ui/public/hall-render.js","line":442,"string_id":"0658f0358ffd"},
967
967
  {"key":"L0005","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":536,"string_id":"eba610d25523"},
968
968
  {"key":"L0006","section":"top bar","text":"Ctrl K","placement":"shared"},
969
969
  {"key":"L0007","section":"top bar","text":"Artist","placement":"shared"},
@@ -973,11 +973,11 @@
973
973
  {"key":"L0011","section":"Good morning, {…}","text":"Oct","placement":"unplaced"},
974
974
  {"key":"L0012","section":"Good morning, {…}","text":"Live","placement":"unplaced"},
975
975
  {"key":"L0013","section":"Needs your attention13","text":"Needs your attention","placement":"placed","file":"modules/hall-ui/public/goal-inbox.js","line":580,"string_id":"7def635421ea"},
976
- {"key":"L0014","section":"Needs your attention13","text":"From the system","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":556,"string_id":"d32c5e058d1e"},
976
+ {"key":"L0014","section":"Needs your attention13","text":"From the system","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":495,"string_id":"d32c5e058d1e"},
977
977
  {"key":"L0015","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":320,"string_id":"e181637c5a5e"},
978
978
  {"key":"L0016","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
979
979
  {"key":"L0017","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":514,"string_id":"1883ad7f07fc"},
980
- {"key":"L0018","section":"Needs your attention13","text":"core 1.25.1","placement":"unplaced"},
980
+ {"key":"L0018","section":"Needs your attention13","text":"core 1.25.2","placement":"unplaced"},
981
981
  {"key":"L0019","section":"Needs your attention13","text":"Skip","placement":"unplaced"},
982
982
  {"key":"L0020","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":183,"string_id":"fef59346ffee"},
983
983
  {"key":"L0021","section":"Needs your attention13","text":"cloudbongos.com","placement":"unplaced"},
@@ -999,7 +999,7 @@
999
999
  "surface": "builders",
1000
1000
  "title": "Idea",
1001
1001
  "states_read": ["record","missing"],
1002
- "files_hash": "b19a972d3190b27c",
1002
+ "files_hash": "02820c742a0bceb9",
1003
1003
  "reading_hash": "f7d644748c87e426",
1004
1004
  "counts": {"lines":52,"placed":25,"shared":8,"unplaced":19},
1005
1005
  "omitted": {"data":25},
@@ -1064,7 +1064,7 @@
1064
1064
  "surface": "builders",
1065
1065
  "title": "Ideas",
1066
1066
  "states_read": ["compose","full","develop"],
1067
- "files_hash": "65f50755fa5d2c77",
1067
+ "files_hash": "59688a8b224ba2ec",
1068
1068
  "reading_hash": "a62c05dcef3bf87f",
1069
1069
  "counts": {"lines":68,"placed":34,"shared":7,"unplaced":27},
1070
1070
  "omitted": {"data":118},
@@ -1145,7 +1145,7 @@
1145
1145
  "surface": "builders",
1146
1146
  "title": "Market Watch",
1147
1147
  "states_read": ["desk","settings","out"],
1148
- "files_hash": "2685309696818881",
1148
+ "files_hash": "377ad66b86dfdd0b",
1149
1149
  "reading_hash": "30512dda207b5ea6",
1150
1150
  "counts": {"lines":23,"placed":11,"shared":7,"unplaced":5},
1151
1151
  "omitted": {"data":5},
@@ -1181,7 +1181,7 @@
1181
1181
  "surface": "builders",
1182
1182
  "title": "Market Watch",
1183
1183
  "states_read": ["dossier","out","propose","correct","filtered"],
1184
- "files_hash": "4dd2ab01e84c217f",
1184
+ "files_hash": "bb602ff95badc43c",
1185
1185
  "reading_hash": "129bff28c4e4ed6d",
1186
1186
  "counts": {"lines":24,"placed":12,"shared":7,"unplaced":5},
1187
1187
  "omitted": {"data":5},
@@ -1218,7 +1218,7 @@
1218
1218
  "surface": "builders",
1219
1219
  "title": "Market Watch rules",
1220
1220
  "states_read": ["in","scoring","names","propose","out"],
1221
- "files_hash": "526c2149de84f633",
1221
+ "files_hash": "6c2edc411eed69bc",
1222
1222
  "reading_hash": "ca0c62e8dce51c8b",
1223
1223
  "counts": {"lines":36,"placed":12,"shared":7,"unplaced":17},
1224
1224
  "omitted": {"data":20},
@@ -1267,7 +1267,7 @@
1267
1267
  "surface": "builders",
1268
1268
  "title": "Modules",
1269
1269
  "states_read": ["browse","search-empty","lens","details","out"],
1270
- "files_hash": "574e1738477d342c",
1270
+ "files_hash": "61872edf35808d71",
1271
1271
  "reading_hash": "6a12e9306bba5622",
1272
1272
  "counts": {"lines":59,"placed":29,"shared":7,"unplaced":23},
1273
1273
  "omitted": {"data":107},
@@ -1339,7 +1339,7 @@
1339
1339
  "surface": "builders",
1340
1340
  "title": "Money",
1341
1341
  "states_read": ["money","hosting","out"],
1342
- "files_hash": "816343bf158f836b",
1342
+ "files_hash": "cbce1cf96f277a69",
1343
1343
  "reading_hash": "e355d5466b123e07",
1344
1344
  "counts": {"lines":83,"placed":28,"shared":7,"unplaced":48},
1345
1345
  "omitted": {"data":27},
@@ -1435,7 +1435,7 @@
1435
1435
  "surface": "builders",
1436
1436
  "title": "My agents",
1437
1437
  "states_read": ["desk","factory","saved","what-it-knows","speciality-walk","speciality-forms","nobody"],
1438
- "files_hash": "3e69046bdd44b756",
1438
+ "files_hash": "d3dbce13a5390286",
1439
1439
  "reading_hash": "5347e0496b38727d",
1440
1440
  "counts": {"lines":100,"placed":33,"shared":7,"unplaced":60},
1441
1441
  "omitted": {"data":38},
@@ -1548,7 +1548,7 @@
1548
1548
  "surface": "builders",
1549
1549
  "title": "Primer",
1550
1550
  "states_read": ["in","toc-open","jump","out"],
1551
- "files_hash": "da0299600036bb6f",
1551
+ "files_hash": "df4ef875bc5238b7",
1552
1552
  "reading_hash": "85790bd421e5c387",
1553
1553
  "counts": {"lines":487,"placed":57,"shared":7,"unplaced":423},
1554
1554
  "omitted": {"data":18},
@@ -1689,7 +1689,7 @@
1689
1689
  {"key":"L0133","section":"The rank ladder","text":"automatically after your 3rd shipped task","placement":"unplaced"},
1690
1690
  {"key":"L0134","section":"The rank ladder","text":"— no one has to promote you.","placement":"unplaced"},
1691
1691
  {"key":"L0135","section":"The rank ladder","text":"any","placement":"unplaced"},
1692
- {"key":"L0136","section":"The rank ladder","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":521,"string_id":"4d8ee7d68974"},
1692
+ {"key":"L0136","section":"The rank ladder","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":460,"string_id":"4d8ee7d68974"},
1693
1693
  {"key":"L0137","section":"The rank ladder","text":"Metic","placement":"unplaced"},
1694
1694
  {"key":"L0138","section":"The rank ladder","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
1695
1695
  {"key":"L0139","section":"The rank ladder","text":"Archon","placement":"unplaced"},
@@ -2048,7 +2048,7 @@
2048
2048
  "surface": "builders",
2049
2049
  "title": "Profile",
2050
2050
  "states_read": ["own","works","activity","yours","activity-artist","activity-artist-ideas","other","artist","artist-ideas","out"],
2051
- "files_hash": "88fc36c8238827bf",
2051
+ "files_hash": "412b85b0c70da301",
2052
2052
  "reading_hash": "3ff8d703d17e8c2a",
2053
2053
  "counts": {"lines":232,"placed":84,"shared":7,"unplaced":141},
2054
2054
  "omitted": {"data":263},
@@ -2293,7 +2293,7 @@
2293
2293
  "surface": "builders",
2294
2294
  "title": "Project settings",
2295
2295
  "states_read": ["default"],
2296
- "files_hash": "dec5d7d8359c913d",
2296
+ "files_hash": "4f917ac224479a34",
2297
2297
  "reading_hash": "283df27d0d5bfc1b",
2298
2298
  "counts": {"lines":43,"placed":25,"shared":7,"unplaced":11},
2299
2299
  "omitted": {"data":33},
@@ -2349,7 +2349,7 @@
2349
2349
  "surface": "builders",
2350
2350
  "title": "Builders",
2351
2351
  "states_read": ["roster","artists","search","out"],
2352
- "files_hash": "eada2a8ff8a184ab",
2352
+ "files_hash": "337395b2465f66fc",
2353
2353
  "reading_hash": "665ac2e36339f5d3",
2354
2354
  "counts": {"lines":56,"placed":17,"shared":7,"unplaced":32},
2355
2355
  "omitted": {"data":137},
@@ -2418,7 +2418,7 @@
2418
2418
  "surface": "builders",
2419
2419
  "title": "Options",
2420
2420
  "states_read": ["account","access","preferences","install-reports","sound","update"],
2421
- "files_hash": "9ee8d40cdee36f53",
2421
+ "files_hash": "77001d9bd6423a92",
2422
2422
  "reading_hash": "898a13fda24c3c90",
2423
2423
  "counts": {"lines":162,"placed":104,"shared":7,"unplaced":51},
2424
2424
  "omitted": {"data":23},
@@ -2593,7 +2593,7 @@
2593
2593
  "surface": "builders",
2594
2594
  "title": "The street",
2595
2595
  "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"],
2596
- "files_hash": "b034bee92146665b",
2596
+ "files_hash": "8cd0e137ff9ec280",
2597
2597
  "reading_hash": "e788e6bf4be8d68c",
2598
2598
  "counts": {"lines":325,"placed":54,"shared":6,"unplaced":265},
2599
2599
  "omitted": {"data":240},
@@ -2766,7 +2766,7 @@
2766
2766
  {"key":"L0165","section":"{…} reports","text":"5 matters on the docket · 20 on the {…}","placement":"unplaced","state":"inside-disputes"},
2767
2767
  {"key":"L0166","section":"{…} reports","text":"aug","placement":"unplaced","state":"inside-disputes"},
2768
2768
  {"key":"L0167","section":"{…} reports","text":"jun","placement":"unplaced","state":"inside-disputes"},
2769
- {"key":"L0168","section":"{…} reports","text":"confirmed","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":526,"string_id":"d427d9dab01c","state":"inside-disputes"},
2769
+ {"key":"L0168","section":"{…} reports","text":"confirmed","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":465,"string_id":"d427d9dab01c","state":"inside-disputes"},
2770
2770
  {"key":"L0169","section":"{…} reports","text":"{…} you","placement":"unplaced","state":"inside-disputes","occurrences":3},
2771
2771
  {"key":"L0170","section":"{…} reports","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":746,"string_id":"fd1903586e8e","state":"inside-disputes"},
2772
2772
  {"key":"L0171","section":"{…}","text":"the law book","placement":"unplaced","state":"inside-rules"},
@@ -2931,7 +2931,7 @@
2931
2931
  "surface": "builders",
2932
2932
  "title": "Studio",
2933
2933
  "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"],
2934
- "files_hash": "c01cf7220bebfb79",
2934
+ "files_hash": "3378703eddb55c9f",
2935
2935
  "reading_hash": "c4e3b4188c1db755",
2936
2936
  "counts": {"lines":51,"placed":29,"shared":7,"unplaced":15},
2937
2937
  "omitted": {"data":23},
@@ -2995,7 +2995,7 @@
2995
2995
  "surface": "builders",
2996
2996
  "title": "Task",
2997
2997
  "states_read": ["record","from-goal","missing"],
2998
- "files_hash": "91a9c833cdebb28b",
2998
+ "files_hash": "ddaf83cea69ef7e7",
2999
2999
  "reading_hash": "8dd803b6934e6388",
3000
3000
  "counts": {"lines":151,"placed":46,"shared":9,"unplaced":96},
3001
3001
  "omitted": {"data":111},
@@ -3159,7 +3159,7 @@
3159
3159
  "surface": "builders",
3160
3160
  "title": "Your thinking",
3161
3161
  "states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
3162
- "files_hash": "cd0f2d8f522becc8",
3162
+ "files_hash": "63660aafe0fd02da",
3163
3163
  "reading_hash": "b73f848b46b0f9b8",
3164
3164
  "counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
3165
3165
  "omitted": {"data":10},
@@ -3222,7 +3222,7 @@
3222
3222
  "surface": "builders",
3223
3223
  "title": "Tweak a page",
3224
3224
  "states_read": ["doc","typed","chrome","submitted","picking","out"],
3225
- "files_hash": "f52e3d547a72e46c",
3225
+ "files_hash": "e1bf8da355d6cfb7",
3226
3226
  "reading_hash": "f521f8d9a7147557",
3227
3227
  "counts": {"lines":26,"placed":18,"shared":2,"unplaced":6},
3228
3228
  "omitted": {"data":19},
@@ -3261,7 +3261,7 @@
3261
3261
  "surface": "builders",
3262
3262
  "title": "Watch",
3263
3263
  "states_read": ["board","out","operations","security","sessions","autobongos"],
3264
- "files_hash": "8c900aaef19935e9",
3264
+ "files_hash": "293ae9537963df09",
3265
3265
  "reading_hash": "1961a0c06b9d8477",
3266
3266
  "counts": {"lines":72,"placed":33,"shared":7,"unplaced":32},
3267
3267
  "omitted": {"data":52},
@@ -3346,7 +3346,7 @@
3346
3346
  "surface": "builders",
3347
3347
  "title": "Tasks",
3348
3348
  "states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
3349
- "files_hash": "932f03e5ce99e576",
3349
+ "files_hash": "8fee1f62e3f188bc",
3350
3350
  "reading_hash": "e9b412d1ec59ceee",
3351
3351
  "counts": {"lines":122,"placed":49,"shared":7,"unplaced":66},
3352
3352
  "omitted": {"data":323},
@@ -3405,7 +3405,7 @@
3405
3405
  {"key":"L0051","section":"page top","text":"{…} (high → low)","placement":"unplaced"},
3406
3406
  {"key":"L0052","section":"page top","text":"minutes (low → high)","placement":"unplaced"},
3407
3407
  {"key":"L0053","section":"page top","text":"priority (P0 first)","placement":"unplaced"},
3408
- {"key":"L0054","section":"page top","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":521,"string_id":"4d8ee7d68974"},
3408
+ {"key":"L0054","section":"page top","text":"task {…}","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":460,"string_id":"4d8ee7d68974"},
3409
3409
  {"key":"L0055","section":"page top","text":"stalest first (untouched longest)","placement":"unplaced"},
3410
3410
  {"key":"L0056","section":"page top","text":"Version","placement":"unplaced"},
3411
3411
  {"key":"L0057","section":"page top","text":"— any —","placement":"unplaced","occurrences":2},
@@ -416,32 +416,8 @@
416
416
  canTriage = ['metic', 'archon'].includes(normalizeRank(me.builder?.rank));
417
417
  loadTriageInbox();
418
418
 
419
- // Then the rest, in parallel. Any individual section failure shouldn't take
420
- // down the page — log and show an inline placeholder.
421
- // #726: the per-skill model picker (Voices) moved to /builders/settings,
422
- // so the hall no longer fetches /me/skill-prefs here.
423
- const [ships, lb] = await Promise.allSettled([
424
- // task 1004854: Home's newest few + a count — never the whole history
425
- // (the Profile page's Works ledger reads that, since task 1005050).
426
- getJSON(`${API}/me/recent-ships?limit=${HOME_SHIPS_LIMIT}`),
427
- getJSON(`${API}/public/leaderboard`), // task 1004437: the list with each builder's roles
428
- ]);
429
-
430
- // Only the Standing chip's shipped count reads this; a failure leaves its dash.
431
- if (ships.status === 'fulfilled') setRecentShips(ships.value);
432
-
433
- if (lb.status === 'fulfilled') {
434
- lbState.rows = lb.value.leaderboard || [];
435
- // #757: the Standing card painted before the Roll loaded, so re-render it
436
- // now that lbState.rows exists — this is when its "#N on the Roll" stat
437
- // can resolve.
438
- if (lastMeState && lastMeState.builder) renderProfile(lastMeState.builder);
439
- } else {
440
- // The Roll’s rows only feed the Standing card’s "#N" stat now — the table
441
- // itself is /roster (task 1003441) — so a failed fetch degrades that one
442
- // stat rather than blanking a panel this page no longer has.
443
- lbState.rows = [];
444
- }
419
+ // The Standing chip's shipped count and leaderboard place (Home's last two
420
+ // fetches here) went with the chip in task 1005249; the Profile page has both.
445
421
  }
446
422
 
447
423
  function wireEvents() {
@@ -549,7 +525,7 @@
549
525
  // reads what this page holds NOW rather than what it held at boot. Everything
550
526
  // else is stable for the life of the page. This call sits AFTER every
551
527
  // declaration it passes — moving it earlier is a temporal-dead-zone crash.
552
- const { lbState, mountHallWidgets, renderGreeting, renderLanding, renderSessionRefused, renderNav, renderProfile, HOME_SHIPS_LIMIT, setRecentShips } = window.OTBHallRender({
528
+ const { mountHallWidgets, renderGreeting, renderLanding, renderSessionRefused, renderNav, renderProfile } = window.OTBHallRender({
553
529
  API, RANK_ORDER, api, brandWorld, curLabel, normalizeRank, postJSON, rankLabel, rankWeight, toast,
554
530
  get lastCostState() { return lastCostState; },
555
531
  get lastKarmaState() { return lastKarmaState; },
@@ -28,7 +28,7 @@
28
28
  var DAY_CHOICES = [1, 2, 3, 4, 5, 7, 10, 14, 21, 30];
29
29
  var REFUSED = {
30
30
  stage_tasks_unfinished: 'This stage still has unfinished tasks.',
31
- not_current_stage: 'That stage is not the one in progress.',
31
+ not_current_stage: 'That stage is already behind you.',
32
32
  legislation_not_passed: 'Legislation has to pass the Board Room first.',
33
33
  not_deciding: 'The plan is already settled.',
34
34
  };
@@ -159,9 +159,15 @@
159
159
  }).join('') + '</ol>';
160
160
  }
161
161
 
162
+ // task 1005199: a later stage can already be in the Board Room, or passed and
163
+ // waiting for the stages before it, so its line says so instead of just "later".
162
164
  function stateText(s) {
163
165
  if (s.state === 'done') return 'done';
164
- if (s.state === 'later') return 'later';
166
+ var b = s.board && s.board.state;
167
+ if (b === 'sitting') return 'in the Board Room';
168
+ if (b === 'passed') return s.state === 'later' ? 'passed, waits its turn' : 'passed';
169
+ if (b === 'returned') return 'sent back';
170
+ if (s.state === 'later') return s.total && s.finished === s.total ? 'ready for the board' : 'later';
165
171
  return s.total ? s.finished + ' of ' + s.total + ' done' : 'in progress';
166
172
  }
167
173
 
@@ -175,7 +181,9 @@
175
181
  return '<li class="genesis__stage is-' + s.state + '">'
176
182
  + '<span class="genesis__stage-n">0' + s.number + '</span>'
177
183
  + '<span class="genesis__stage-t"><b>' + esc(s.label) + '</b>'
178
- + '<span>' + esc(wakes.length ? 'Wakes ' + wakes.join(', ') : '') + esc(due) + '</span></span>'
184
+ + '<span>' + esc(wakes.length ? 'Wakes ' + wakes.join(', ') : '') + esc(due) + '</span>'
185
+ + (s.state === 'later' && s.can_close ? '<span><button type="button" class="btn-ghost" data-genesis-close="' + esc(s.key) + '">Put to the board</button></span>' : '')
186
+ + '</span>'
179
187
  + '<span class="genesis__stage-st">' + esc(stateText(s)) + '</span></li>';
180
188
  }).join('') + '</ol>';
181
189
  }
@@ -222,6 +230,37 @@
222
230
  return '<p class="genesis__note">Finish every task above, then put this stage to the board.</p>';
223
231
  }
224
232
 
233
+ // ── every stage vote waiting on the viewer, in one place (task 1005199) ──────
234
+ // Each finished stage sits in the Board Room at once; this lists the ones still
235
+ // waiting on THIS viewer's vote, in stage order, and one button votes yes on all of
236
+ // them in that order. They still pass in order: the project only moves past a
237
+ // stage whose own sitting passed.
238
+ function votesWaiting(g, viewerId) {
239
+ return g.stages.filter(function (s) {
240
+ var b = s.board;
241
+ return b && b.state === 'sitting' && b.item_id && (b.waiting_on || []).some(function (m) {
242
+ return String(m.builder_id) === String(viewerId);
243
+ });
244
+ });
245
+ }
246
+
247
+ function votesHtml(g, viewerId) {
248
+ var list = votesWaiting(g, viewerId);
249
+ // The current stage's own Confirm button already covers a lone vote on it.
250
+ if (!list.length || (list.length === 1 && list[0].state === 'now')) return '';
251
+ var many = list.length > 1;
252
+ return '<section class="genesis__now" aria-labelledby="genesis-votes-h">'
253
+ + '<h3 id="genesis-votes-h" class="genesis__now-h">Waiting for your vote · ' + list.length + (many ? ' stages' : ' stage') + '</h3>'
254
+ + '<ul class="genesis__tasks">' + list.map(function (s) {
255
+ return '<li class="genesis__task"><span class="genesis__task-t">0' + s.number + ' ' + esc(s.label) + '</span></li>';
256
+ }).join('') + '</ul>'
257
+ // The rule is said once: every stage put up under one constitution reads the same.
258
+ + '<p class="genesis__note">' + esc(list[0].board.needs ? list[0].board.needs + ' ' : '')
259
+ + 'They pass in order: a later stage waits for the ones before it.</p>'
260
+ + '<div class="genesis__doors"><button type="button" class="btn-accent" data-genesis-vote-all>' + (many ? 'Vote yes on all ' + list.length : 'Vote yes') + '</button>'
261
+ + '<a class="btn-ghost" href="/board-room">Open the Board Room</a></div></section>';
262
+ }
263
+
225
264
  function aliveHtml() {
226
265
  var name = projectName();
227
266
  return '<div class="genesis__alive">'
@@ -254,7 +293,7 @@
254
293
  if (!g) { host.hidden = true; return; }
255
294
  host.innerHTML = headHtml(g) + (g.deciding
256
295
  ? decideHtml(g, state.gov)
257
- : demoHtml(g) + lifeHtml(g) + '<div class="genesis__grid">' + stagesHtml(g) + nowHtml(g, state.viewer) + '</div>');
296
+ : demoHtml(g) + lifeHtml(g) + votesHtml(g, state.viewer) + '<div class="genesis__grid">' + stagesHtml(g) + nowHtml(g, state.viewer) + '</div>');
258
297
  host.hidden = false;
259
298
  }
260
299
 
@@ -345,6 +384,17 @@
345
384
  } else if (t.hasAttribute('data-genesis-confirm')) {
346
385
  act(send('POST', '/government/board/items/' + encodeURIComponent(t.getAttribute('data-genesis-confirm')) + '/votes', { direction: 'yes' })
347
386
  .then(function () { return load(host, state); }));
387
+ } else if (t.hasAttribute('data-genesis-vote-all')) {
388
+ // One yes per stage, earliest first, each after the last has landed (task
389
+ // 1005199). A refusal on one stage stops the run and says why; the rest stay.
390
+ var ids = votesWaiting(state.genesis, state.viewer).map(function (s) { return s.board.item_id; });
391
+ act(ids.reduce(function (p, id) {
392
+ return p.then(function () {
393
+ return send('POST', '/government/board/items/' + encodeURIComponent(id) + '/votes', { direction: 'yes' });
394
+ });
395
+ }, Promise.resolve()).then(function () { return load(host, state); }, function (err) {
396
+ return load(host, state).then(function () { throw err; });
397
+ }));
348
398
  } else if (t.hasAttribute('data-genesis-alive')) {
349
399
  act(send('POST', '/founding/alive', {}).then(function () { host.innerHTML = aliveHtml(); }));
350
400
  } else if (t.hasAttribute('data-genesis-enter')) {