@bongos/core 1.24.73 → 1.24.75
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 +90 -70
- package/docs/api/openapi.json +1 -1
- package/docs/api-reference.md +1 -1
- package/docs/copy-inventory.md +13 -13
- package/docs/copy-registry.json +15 -15
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +33 -0
- package/docs/page-readings.json +39 -39
- package/modules/government/board.js +10 -4
- package/modules/government/db.js +7 -5
- package/modules/government/genesis-close.js +45 -0
- package/modules/government/migrations/government_038_vote_cast_via.sql +23 -0
- package/modules/government/routes/government.js +4 -5
- package/modules/hall-ui/public/ai-studio.html +2 -1
- package/modules/hall-ui/public/atlas.html +2 -1
- package/modules/hall-ui/public/blockers.html +2 -1
- package/modules/hall-ui/public/board-room.html +2 -1
- package/modules/hall-ui/public/board-room.js +1 -0
- package/modules/hall-ui/public/city.html +2 -1
- package/modules/hall-ui/public/collab.html +2 -1
- package/modules/hall-ui/public/commands.html +2 -1
- package/modules/hall-ui/public/copy-desk.html +2 -1
- package/modules/hall-ui/public/deploy.html +2 -1
- package/modules/hall-ui/public/genesis-home.js +7 -12
- package/modules/hall-ui/public/goal-map.html +2 -1
- package/modules/hall-ui/public/goals.html +2 -1
- package/modules/hall-ui/public/government.html +2 -1
- package/modules/hall-ui/public/idea.html +2 -1
- package/modules/hall-ui/public/ideas.html +2 -1
- package/modules/hall-ui/public/index.html +2 -1
- package/modules/hall-ui/public/market-watch-item.html +2 -1
- package/modules/hall-ui/public/market-watch-rules.html +2 -1
- package/modules/hall-ui/public/market-watch.html +2 -1
- package/modules/hall-ui/public/modules.html +2 -1
- package/modules/hall-ui/public/money.html +2 -1
- package/modules/hall-ui/public/my-agents.html +2 -1
- package/modules/hall-ui/public/primer.html +2 -1
- package/modules/hall-ui/public/profile.html +2 -1
- package/modules/hall-ui/public/project-settings.html +2 -1
- package/modules/hall-ui/public/roster.html +2 -1
- package/modules/hall-ui/public/settings.html +2 -1
- package/modules/hall-ui/public/shell-game.js +50 -0
- package/modules/hall-ui/public/shell.js +11 -11
- package/modules/hall-ui/public/street.html +2 -1
- package/modules/hall-ui/public/studio.html +2 -1
- package/modules/hall-ui/public/task.html +2 -1
- package/modules/hall-ui/public/thinking.html +2 -1
- package/modules/hall-ui/public/tweak-editor.html +2 -1
- package/modules/hall-ui/public/watch.html +2 -1
- package/modules/hall-ui/public/work.html +2 -1
- package/modules/hall-ui/records/game-mode.md +20 -0
- package/modules/onboarding/genesis-home.js +65 -8
- package/modules/onboarding/routes/onboarding.js +15 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/bongos/government-walk.js +3 -3
- package/src/module-api.js +1 -1
- package/tests/genesis_home.mjs +86 -1
- package/tests/goal_map_page.mjs +2 -2
- package/tests/government_board_genesis_stage.mjs +83 -0
- package/tests/government_seed.mjs +1 -0
- package/tests/hall_city.mjs +1 -1
- package/tests/hall_fullscreen.mjs +101 -0
- package/tests/hall_my_agents.mjs +1 -1
- package/tests/hall_street.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
package/docs/page-readings.json
CHANGED
|
@@ -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": "
|
|
15
|
+
"files_hash": "4f71b6714f7e2d61",
|
|
16
16
|
"reading_hash": "e381a3141dc6b9cb",
|
|
17
17
|
"counts": {"lines":105,"placed":38,"shared":9,"unplaced":58},
|
|
18
18
|
"omitted": {"data":15},
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"surface": "builders",
|
|
131
131
|
"title": "Repo Atlas",
|
|
132
132
|
"states_read": ["map","truth","detail","index","out"],
|
|
133
|
-
"files_hash": "
|
|
133
|
+
"files_hash": "5c3b63261c77b636",
|
|
134
134
|
"reading_hash": "94058beb635218ba",
|
|
135
135
|
"counts": {"lines":24,"placed":11,"shared":9,"unplaced":4},
|
|
136
136
|
"omitted": {"data":3},
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"surface": "builders",
|
|
168
168
|
"title": "Blockers",
|
|
169
169
|
"states_read": ["default"],
|
|
170
|
-
"files_hash": "
|
|
170
|
+
"files_hash": "ab533cabec76122e",
|
|
171
171
|
"reading_hash": "ab984bd8e91a5a9d",
|
|
172
172
|
"counts": {"lines":35,"placed":14,"shared":9,"unplaced":12},
|
|
173
173
|
"omitted": {"data":49},
|
|
@@ -215,7 +215,7 @@
|
|
|
215
215
|
"surface": "builders",
|
|
216
216
|
"title": "Board Room",
|
|
217
217
|
"states_read": ["room","out","sitting-meta","objection-form"],
|
|
218
|
-
"files_hash": "
|
|
218
|
+
"files_hash": "0e6e17f03283a4a6",
|
|
219
219
|
"reading_hash": "020553cb2a438d56",
|
|
220
220
|
"counts": {"lines":51,"placed":18,"shared":9,"unplaced":24},
|
|
221
221
|
"omitted": {"data":15},
|
|
@@ -238,7 +238,7 @@
|
|
|
238
238
|
{"key":"L0015","section":"{…} Full Idea","text":"It counts toward passing","placement":"unplaced"},
|
|
239
239
|
{"key":"L0016","section":"{…} Full Idea","text":"Object","placement":"unplaced"},
|
|
240
240
|
{"key":"L0017","section":"{…} Full Idea","text":"It goes back with your reason","placement":"unplaced"},
|
|
241
|
-
{"key":"L0018","section":"{…} Full Idea","text":"Its author recommends this becomes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":
|
|
241
|
+
{"key":"L0018","section":"{…} Full Idea","text":"Its author recommends this becomes","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":311,"string_id":"680491549e47"},
|
|
242
242
|
{"key":"L0019","section":"{…} Full Idea","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","occurrences":2},
|
|
243
243
|
{"key":"L0020","section":"{…} Full Idea","text":". The {…} decides.","placement":"unplaced"},
|
|
244
244
|
{"key":"L0021","section":"{…} Full Idea","text":"What made you have the idea","placement":"unplaced"},
|
|
@@ -246,18 +246,18 @@
|
|
|
246
246
|
{"key":"L0023","section":"{…} Full Idea","text":"Scope it as best as you can here","placement":"unplaced"},
|
|
247
247
|
{"key":"L0024","section":"{…} Full Idea","text":"What should an {…} or {…} know prior to building","placement":"unplaced"},
|
|
248
248
|
{"key":"L0025","section":"{…} Full Idea","text":"How is this long term justified in the project","placement":"unplaced"},
|
|
249
|
-
{"key":"L0026","section":"{…} Full Idea","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":
|
|
249
|
+
{"key":"L0026","section":"{…} Full Idea","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":485,"string_id":"d73256fbc395","occurrences":9},
|
|
250
250
|
{"key":"L0027","section":"Constitutional amendment amendment","text":"Constitutional amendment","placement":"unplaced","occurrences":3},
|
|
251
251
|
{"key":"L0028","section":"Constitutional amendment amendment","text":"amendment","placement":"unplaced","occurrences":3},
|
|
252
252
|
{"key":"L0029","section":"Constitutional amendment amendment","text":"open","placement":"placed","file":"modules/hall-ui/public/approval-queue.js","line":173,"string_id":"9a803563c948"},
|
|
253
253
|
{"key":"L0030","section":"Constitutional amendment amendment","text":"no clock — waits for a {…} yes","placement":"unplaced"},
|
|
254
254
|
{"key":"L0031","section":"Constitutional amendment amendment","text":"Proposes","placement":"unplaced","occurrences":3},
|
|
255
|
-
{"key":"L0032","section":"Constitutional amendment amendment","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":
|
|
255
|
+
{"key":"L0032","section":"Constitutional amendment amendment","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":485,"string_id":"d73256fbc395","occurrences":3},
|
|
256
256
|
{"key":"L0033","section":"Constitutional amendment amendment","text":"Closed sittings","placement":"unplaced"},
|
|
257
257
|
{"key":"L0034","section":"{…} Full Idea","text":"passed","placement":"placed","file":"modules/hall-ui/public/government.js","line":679,"string_id":"da5368d10f85","occurrences":8},
|
|
258
258
|
{"key":"L0035","section":"{…} and {…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":5},
|
|
259
259
|
{"key":"L0036","section":"{…} and {…}","text":"Full Idea","placement":"unplaced","occurrences":5},
|
|
260
|
-
{"key":"L0037","section":"{…} and {…}","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":
|
|
260
|
+
{"key":"L0037","section":"{…} and {…}","text":"{…} · who votes, and how it {…}","placement":"placed","file":"modules/hall-ui/public/board-room.js","line":485,"string_id":"d73256fbc395","occurrences":5},
|
|
261
261
|
{"key":"L0038","section":"Constitutional amendment amendment","text":"passed","placement":"placed","file":"modules/hall-ui/public/government.js","line":679,"string_id":"da5368d10f85","occurrences":2},
|
|
262
262
|
{"key":"L0039","section":"Constitutional amendment amendment","text":"{\"{…}_{…}\":\"{…}\",\"membership\":\"{…}\",\"window_minutes\":1440,\"close_early_on_{…}_turnout\":true}","placement":"unplaced","occurrences":2},
|
|
263
263
|
{"key":"L0040","section":"Constitutional amendment amendment","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":2},
|
|
@@ -279,7 +279,7 @@
|
|
|
279
279
|
"surface": "builders",
|
|
280
280
|
"title": "The city",
|
|
281
281
|
"states_read": ["city","fullscreen","switched","focus","pins","living","card","card-ask"],
|
|
282
|
-
"files_hash": "
|
|
282
|
+
"files_hash": "9ed0417e2e4dfb92",
|
|
283
283
|
"reading_hash": "11234462e18a0037",
|
|
284
284
|
"counts": {"lines":44,"placed":10,"shared":9,"unplaced":25},
|
|
285
285
|
"omitted": {"data":18},
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
"surface": "builders",
|
|
337
337
|
"title": "Collab",
|
|
338
338
|
"states_read": ["board","out"],
|
|
339
|
-
"files_hash": "
|
|
339
|
+
"files_hash": "887a503d80d5c0e2",
|
|
340
340
|
"reading_hash": "2d5df14f73c44d86",
|
|
341
341
|
"counts": {"lines":81,"placed":33,"shared":8,"unplaced":40},
|
|
342
342
|
"omitted": {"data":21},
|
|
@@ -430,7 +430,7 @@
|
|
|
430
430
|
"surface": "builders",
|
|
431
431
|
"title": "Commands",
|
|
432
432
|
"states_read": ["in","out"],
|
|
433
|
-
"files_hash": "
|
|
433
|
+
"files_hash": "687bb6af0eff6e0c",
|
|
434
434
|
"reading_hash": "b7107deecbf6bf46",
|
|
435
435
|
"counts": {"lines":70,"placed":46,"shared":9,"unplaced":15},
|
|
436
436
|
"omitted": {"data":175},
|
|
@@ -513,7 +513,7 @@
|
|
|
513
513
|
"surface": "builders",
|
|
514
514
|
"title": "Copy desk",
|
|
515
515
|
"states_read": ["queue","out","search","composer","closer","proposer"],
|
|
516
|
-
"files_hash": "
|
|
516
|
+
"files_hash": "6d4903527b0a1c30",
|
|
517
517
|
"reading_hash": "4476deef6b37ffe5",
|
|
518
518
|
"counts": {"lines":78,"placed":39,"shared":9,"unplaced":30},
|
|
519
519
|
"omitted": {"data":119},
|
|
@@ -604,7 +604,7 @@
|
|
|
604
604
|
"surface": "builders",
|
|
605
605
|
"title": "Deploy",
|
|
606
606
|
"states_read": ["work","out"],
|
|
607
|
-
"files_hash": "
|
|
607
|
+
"files_hash": "a0ab8445ee5bf294",
|
|
608
608
|
"reading_hash": "76c11d0fbc739610",
|
|
609
609
|
"counts": {"lines":19,"placed":5,"shared":9,"unplaced":5},
|
|
610
610
|
"omitted": {"data":3},
|
|
@@ -636,7 +636,7 @@
|
|
|
636
636
|
"surface": "builders",
|
|
637
637
|
"title": "The sky",
|
|
638
638
|
"states_read": ["tour","sky","wells","ledger","full","full-back","out"],
|
|
639
|
-
"files_hash": "
|
|
639
|
+
"files_hash": "b47d4ef94ef6d2c5",
|
|
640
640
|
"reading_hash": "2ae796b3e72c6d26",
|
|
641
641
|
"counts": {"lines":49,"placed":22,"shared":8,"unplaced":19},
|
|
642
642
|
"omitted": {"data":8},
|
|
@@ -698,7 +698,7 @@
|
|
|
698
698
|
"surface": "builders",
|
|
699
699
|
"title": "Goals",
|
|
700
700
|
"states_read": ["list","filters","cards","detail","dependencies","out","uat","uat-panel","author"],
|
|
701
|
-
"files_hash": "
|
|
701
|
+
"files_hash": "ddc111d1819224ad",
|
|
702
702
|
"reading_hash": "82f9b0ae157d2700",
|
|
703
703
|
"counts": {"lines":186,"placed":58,"shared":9,"unplaced":119},
|
|
704
704
|
"omitted": {"data":313},
|
|
@@ -897,7 +897,7 @@
|
|
|
897
897
|
"surface": "builders",
|
|
898
898
|
"title": "Government",
|
|
899
899
|
"states_read": ["constitution","out","permissions","board","constitution-tab"],
|
|
900
|
-
"files_hash": "
|
|
900
|
+
"files_hash": "3a9b128ca492be07",
|
|
901
901
|
"reading_hash": "0d1ee732e57189fb",
|
|
902
902
|
"counts": {"lines":64,"placed":24,"shared":9,"unplaced":31},
|
|
903
903
|
"omitted": {"data":274},
|
|
@@ -974,8 +974,8 @@
|
|
|
974
974
|
"surface": "builders",
|
|
975
975
|
"title": "Builders' Hall",
|
|
976
976
|
"states_read": ["home","out","founding","genesis","decide","demo"],
|
|
977
|
-
"files_hash": "
|
|
978
|
-
"reading_hash": "
|
|
977
|
+
"files_hash": "0680b2faae3f956f",
|
|
978
|
+
"reading_hash": "ae7a0c466a3aee85",
|
|
979
979
|
"counts": {"lines":28,"placed":9,"shared":10,"unplaced":9},
|
|
980
980
|
"omitted": {"data":4},
|
|
981
981
|
"notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
|
|
@@ -999,7 +999,7 @@
|
|
|
999
999
|
{"key":"L0017","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":320,"string_id":"e181637c5a5e"},
|
|
1000
1000
|
{"key":"L0018","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
|
|
1001
1001
|
{"key":"L0019","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":533,"string_id":"1883ad7f07fc"},
|
|
1002
|
-
{"key":"L0020","section":"Needs your attention13","text":"core 1.24.
|
|
1002
|
+
{"key":"L0020","section":"Needs your attention13","text":"core 1.24.74","placement":"unplaced"},
|
|
1003
1003
|
{"key":"L0021","section":"Needs your attention13","text":"Skip","placement":"unplaced"},
|
|
1004
1004
|
{"key":"L0022","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":181,"string_id":"fef59346ffee"},
|
|
1005
1005
|
{"key":"L0023","section":"Needs your attention13","text":"cloudbongos.com","placement":"unplaced"},
|
|
@@ -1015,7 +1015,7 @@
|
|
|
1015
1015
|
"surface": "builders",
|
|
1016
1016
|
"title": "Idea",
|
|
1017
1017
|
"states_read": ["record","missing"],
|
|
1018
|
-
"files_hash": "
|
|
1018
|
+
"files_hash": "d31ed5e538fa57ac",
|
|
1019
1019
|
"reading_hash": "1924057e1bb86631",
|
|
1020
1020
|
"counts": {"lines":51,"placed":22,"shared":10,"unplaced":19},
|
|
1021
1021
|
"omitted": {"data":23},
|
|
@@ -1079,7 +1079,7 @@
|
|
|
1079
1079
|
"surface": "builders",
|
|
1080
1080
|
"title": "Ideas",
|
|
1081
1081
|
"states_read": ["compose","full","develop"],
|
|
1082
|
-
"files_hash": "
|
|
1082
|
+
"files_hash": "59081864d4eabae8",
|
|
1083
1083
|
"reading_hash": "9ed251f7cc60a885",
|
|
1084
1084
|
"counts": {"lines":67,"placed":31,"shared":9,"unplaced":27},
|
|
1085
1085
|
"omitted": {"data":116},
|
|
@@ -1159,7 +1159,7 @@
|
|
|
1159
1159
|
"surface": "builders",
|
|
1160
1160
|
"title": "Market Watch",
|
|
1161
1161
|
"states_read": ["desk","settings","out"],
|
|
1162
|
-
"files_hash": "
|
|
1162
|
+
"files_hash": "a46496a5cf19a695",
|
|
1163
1163
|
"reading_hash": "de1a8fdf7ebcc959",
|
|
1164
1164
|
"counts": {"lines":13,"placed":3,"shared":9,"unplaced":1},
|
|
1165
1165
|
"omitted": {"data":2},
|
|
@@ -1185,7 +1185,7 @@
|
|
|
1185
1185
|
"surface": "builders",
|
|
1186
1186
|
"title": "Market Watch",
|
|
1187
1187
|
"states_read": ["dossier","out","propose","correct","filtered"],
|
|
1188
|
-
"files_hash": "
|
|
1188
|
+
"files_hash": "f3b5b24581756454",
|
|
1189
1189
|
"reading_hash": "12483255342bd007",
|
|
1190
1190
|
"counts": {"lines":14,"placed":4,"shared":9,"unplaced":1},
|
|
1191
1191
|
"omitted": {"data":2},
|
|
@@ -1212,7 +1212,7 @@
|
|
|
1212
1212
|
"surface": "builders",
|
|
1213
1213
|
"title": "Market Watch rules",
|
|
1214
1214
|
"states_read": ["in","scoring","names","propose","out"],
|
|
1215
|
-
"files_hash": "
|
|
1215
|
+
"files_hash": "d37cdb4cc97ae6a3",
|
|
1216
1216
|
"reading_hash": "bf661622dd283b83",
|
|
1217
1217
|
"counts": {"lines":48,"placed":13,"shared":9,"unplaced":26},
|
|
1218
1218
|
"omitted": {"data":45},
|
|
@@ -1273,7 +1273,7 @@
|
|
|
1273
1273
|
"surface": "builders",
|
|
1274
1274
|
"title": "Modules",
|
|
1275
1275
|
"states_read": ["browse","search-empty","lens","details","out"],
|
|
1276
|
-
"files_hash": "
|
|
1276
|
+
"files_hash": "85e1f48677ea96f7",
|
|
1277
1277
|
"reading_hash": "cdf89441f9e9516e",
|
|
1278
1278
|
"counts": {"lines":60,"placed":26,"shared":9,"unplaced":25},
|
|
1279
1279
|
"omitted": {"data":105},
|
|
@@ -1346,7 +1346,7 @@
|
|
|
1346
1346
|
"surface": "builders",
|
|
1347
1347
|
"title": "Money",
|
|
1348
1348
|
"states_read": ["money","hosting","out"],
|
|
1349
|
-
"files_hash": "
|
|
1349
|
+
"files_hash": "cbf3f8ed30ccfff6",
|
|
1350
1350
|
"reading_hash": "285d714c7aba1fc9",
|
|
1351
1351
|
"counts": {"lines":82,"placed":25,"shared":9,"unplaced":48},
|
|
1352
1352
|
"omitted": {"data":25},
|
|
@@ -1441,7 +1441,7 @@
|
|
|
1441
1441
|
"surface": "builders",
|
|
1442
1442
|
"title": "My agents",
|
|
1443
1443
|
"states_read": ["desk","factory","saved","what-it-knows","speciality-walk","speciality-forms","nobody"],
|
|
1444
|
-
"files_hash": "
|
|
1444
|
+
"files_hash": "25a31340d16b79d9",
|
|
1445
1445
|
"reading_hash": "74d10b6c2a24ce2e",
|
|
1446
1446
|
"counts": {"lines":138,"placed":60,"shared":9,"unplaced":69},
|
|
1447
1447
|
"omitted": {"data":171},
|
|
@@ -1592,7 +1592,7 @@
|
|
|
1592
1592
|
"surface": "builders",
|
|
1593
1593
|
"title": "Primer",
|
|
1594
1594
|
"states_read": ["in","toc-open","jump","out"],
|
|
1595
|
-
"files_hash": "
|
|
1595
|
+
"files_hash": "93efc9b10054a26a",
|
|
1596
1596
|
"reading_hash": "395c98d876001b5a",
|
|
1597
1597
|
"counts": {"lines":486,"placed":54,"shared":9,"unplaced":423},
|
|
1598
1598
|
"omitted": {"data":16},
|
|
@@ -2091,7 +2091,7 @@
|
|
|
2091
2091
|
"surface": "builders",
|
|
2092
2092
|
"title": "Profile",
|
|
2093
2093
|
"states_read": ["own","works","activity","yours","activity-artist","activity-ideator","other","artist","ideator","out"],
|
|
2094
|
-
"files_hash": "
|
|
2094
|
+
"files_hash": "fd066c9c1add890e",
|
|
2095
2095
|
"reading_hash": "fe899712427882ff",
|
|
2096
2096
|
"counts": {"lines":219,"placed":77,"shared":9,"unplaced":133},
|
|
2097
2097
|
"omitted": {"data":250},
|
|
@@ -2323,7 +2323,7 @@
|
|
|
2323
2323
|
"surface": "builders",
|
|
2324
2324
|
"title": "Project settings",
|
|
2325
2325
|
"states_read": ["default"],
|
|
2326
|
-
"files_hash": "
|
|
2326
|
+
"files_hash": "2c0f365687004dda",
|
|
2327
2327
|
"reading_hash": "849399ad428ae9c7",
|
|
2328
2328
|
"counts": {"lines":42,"placed":22,"shared":9,"unplaced":11},
|
|
2329
2329
|
"omitted": {"data":31},
|
|
@@ -2378,7 +2378,7 @@
|
|
|
2378
2378
|
"surface": "builders",
|
|
2379
2379
|
"title": "Builders",
|
|
2380
2380
|
"states_read": ["roster","artists","search","out"],
|
|
2381
|
-
"files_hash": "
|
|
2381
|
+
"files_hash": "562ab7294ed7994a",
|
|
2382
2382
|
"reading_hash": "ab1f237b3ce6f134",
|
|
2383
2383
|
"counts": {"lines":58,"placed":14,"shared":9,"unplaced":35},
|
|
2384
2384
|
"omitted": {"data":135},
|
|
@@ -2449,7 +2449,7 @@
|
|
|
2449
2449
|
"surface": "builders",
|
|
2450
2450
|
"title": "Settings",
|
|
2451
2451
|
"states_read": ["account","access","preferences","install-reports","sound","update"],
|
|
2452
|
-
"files_hash": "
|
|
2452
|
+
"files_hash": "685465c1780ddf1b",
|
|
2453
2453
|
"reading_hash": "085bb32894909ee0",
|
|
2454
2454
|
"counts": {"lines":137,"placed":90,"shared":9,"unplaced":38},
|
|
2455
2455
|
"omitted": {"data":16},
|
|
@@ -2599,7 +2599,7 @@
|
|
|
2599
2599
|
"surface": "builders",
|
|
2600
2600
|
"title": "The street",
|
|
2601
2601
|
"states_read": ["street","fullscreen","card","switched","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"],
|
|
2602
|
-
"files_hash": "
|
|
2602
|
+
"files_hash": "bcc43de9ec38fb26",
|
|
2603
2603
|
"reading_hash": "8e9e3422f6b72884",
|
|
2604
2604
|
"counts": {"lines":460,"placed":65,"shared":9,"unplaced":386},
|
|
2605
2605
|
"omitted": {"data":433},
|
|
@@ -3072,7 +3072,7 @@
|
|
|
3072
3072
|
"surface": "builders",
|
|
3073
3073
|
"title": "Studio",
|
|
3074
3074
|
"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"],
|
|
3075
|
-
"files_hash": "
|
|
3075
|
+
"files_hash": "6b37ea0de369e584",
|
|
3076
3076
|
"reading_hash": "55463fb0c09b5d71",
|
|
3077
3077
|
"counts": {"lines":50,"placed":26,"shared":9,"unplaced":15},
|
|
3078
3078
|
"omitted": {"data":21},
|
|
@@ -3135,7 +3135,7 @@
|
|
|
3135
3135
|
"surface": "builders",
|
|
3136
3136
|
"title": "Task",
|
|
3137
3137
|
"states_read": ["record","from-goal","missing"],
|
|
3138
|
-
"files_hash": "
|
|
3138
|
+
"files_hash": "7f1c8fcc8e9f83d5",
|
|
3139
3139
|
"reading_hash": "ecaa5fba5bc119a8",
|
|
3140
3140
|
"counts": {"lines":150,"placed":43,"shared":11,"unplaced":96},
|
|
3141
3141
|
"omitted": {"data":109},
|
|
@@ -3298,7 +3298,7 @@
|
|
|
3298
3298
|
"surface": "builders",
|
|
3299
3299
|
"title": "Your thinking",
|
|
3300
3300
|
"states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
|
|
3301
|
-
"files_hash": "
|
|
3301
|
+
"files_hash": "ec5269e1f8585592",
|
|
3302
3302
|
"reading_hash": "8113aa9e50ec5600",
|
|
3303
3303
|
"counts": {"lines":49,"placed":22,"shared":8,"unplaced":19},
|
|
3304
3304
|
"omitted": {"data":8},
|
|
@@ -3360,7 +3360,7 @@
|
|
|
3360
3360
|
"surface": "builders",
|
|
3361
3361
|
"title": "Tweak a page",
|
|
3362
3362
|
"states_read": ["doc","typed","chrome","submitted","picking","out"],
|
|
3363
|
-
"files_hash": "
|
|
3363
|
+
"files_hash": "cbd96ef300b7e801",
|
|
3364
3364
|
"reading_hash": "711c540ebc7ef977",
|
|
3365
3365
|
"counts": {"lines":23,"placed":15,"shared":1,"unplaced":7},
|
|
3366
3366
|
"omitted": {"data":35},
|
|
@@ -3396,7 +3396,7 @@
|
|
|
3396
3396
|
"surface": "builders",
|
|
3397
3397
|
"title": "Watch",
|
|
3398
3398
|
"states_read": ["board","out","operations","security","sessions","autobongos"],
|
|
3399
|
-
"files_hash": "
|
|
3399
|
+
"files_hash": "08e46562439e6d7b",
|
|
3400
3400
|
"reading_hash": "2e2e07eab2e3e772",
|
|
3401
3401
|
"counts": {"lines":69,"placed":28,"shared":9,"unplaced":32},
|
|
3402
3402
|
"omitted": {"data":50},
|
|
@@ -3478,7 +3478,7 @@
|
|
|
3478
3478
|
"surface": "builders",
|
|
3479
3479
|
"title": "Tasks",
|
|
3480
3480
|
"states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
|
|
3481
|
-
"files_hash": "
|
|
3481
|
+
"files_hash": "469be6bdd4773fb7",
|
|
3482
3482
|
"reading_hash": "f1d7a8ed45e60ffa",
|
|
3483
3483
|
"counts": {"lines":122,"placed":46,"shared":9,"unplaced":67},
|
|
3484
3484
|
"omitted": {"data":321},
|
|
@@ -255,18 +255,21 @@ function validateVote({ direction, reasonMd, sectionKey } = {}) {
|
|
|
255
255
|
// { ok: true, vote, fresh: true, karma_delta, self_cast } — recorded now
|
|
256
256
|
// { ok: true, vote, fresh: false, self_cast } — idempotent re-cast
|
|
257
257
|
// { ok: false, reason: 'item_not_found' | 'item_closed' | 'vote_window_expired'
|
|
258
|
-
// | 'not_board_member' | <validateVote reason> }
|
|
258
|
+
// | 'not_board_member' | 'bad_cast_via' | <validateVote reason> }
|
|
259
|
+
// `castVia` (task 1005121, government_038) is internal — never read from a request: 'ballot', or 'stage_close' (genesis-close.js: a founder's confirm given by closing a genesis stage — genesis_stage + yes only, no vote karma).
|
|
259
260
|
// 'anti_self_vote' is GONE as of task 1003273 — an author may cast; what they
|
|
260
261
|
// cannot do is decide alone, which shouldCloseAfterVote and tallyOutcome enforce.
|
|
261
262
|
// A self-cast is recorded and visible but earns no karma (karma_delta: 0).
|
|
262
|
-
async function castVote({ itemId, voterId, direction, reasonMd = null, sectionKey = null } = {}) {
|
|
263
|
+
async function castVote({ itemId, voterId, direction, reasonMd = null, sectionKey = null, castVia = 'ballot' } = {}) {
|
|
263
264
|
const id = Number(itemId);
|
|
264
265
|
if (!Number.isFinite(id) || id <= 0) return { ok: false, reason: 'item_not_found' };
|
|
266
|
+
if (castVia !== 'ballot' && castVia !== 'stage_close') return { ok: false, reason: 'bad_cast_via' };
|
|
265
267
|
const v = validateVote({ direction, reasonMd, sectionKey });
|
|
266
268
|
if (!v.ok) return v;
|
|
267
269
|
|
|
268
270
|
const item = await db.getBoardItemForVote(id);
|
|
269
271
|
if (!item) return { ok: false, reason: 'item_not_found' };
|
|
272
|
+
if (castVia === 'stage_close' && (item.subject_type !== 'genesis_stage' || v.direction !== 'yes')) return { ok: false, reason: 'bad_cast_via' };
|
|
270
273
|
if (item.closed_at) return { ok: false, reason: 'item_closed' };
|
|
271
274
|
// The clock is checked here as well as by the R11 poller: a vote landing in
|
|
272
275
|
// the gap between expiry and the sweep would be a vote after time. The
|
|
@@ -309,6 +312,7 @@ async function castVote({ itemId, voterId, direction, reasonMd = null, sectionKe
|
|
|
309
312
|
|
|
310
313
|
const inserted = await db.insertBoardVote({
|
|
311
314
|
itemId: id, voterId, direction: v.direction, reasonMd: v.reasonMd, sectionKey: v.sectionKey,
|
|
315
|
+
...(castVia === 'ballot' ? {} : { castVia }), // db defaults a ballot
|
|
312
316
|
});
|
|
313
317
|
if (!inserted) {
|
|
314
318
|
// UNIQUE(item_id, voter_id) — the idempotent path. Return what stands.
|
|
@@ -317,8 +321,8 @@ async function castVote({ itemId, voterId, direction, reasonMd = null, sectionKe
|
|
|
317
321
|
}
|
|
318
322
|
// Karma rides the FRESH insert only, and the whole route refused a closed or
|
|
319
323
|
// expired item above, so every paid vote is by construction in-window.
|
|
320
|
-
if (isSelfCast) {
|
|
321
|
-
return { ok: true, vote: inserted, fresh: true, karma_delta: 0, self_cast:
|
|
324
|
+
if (isSelfCast || castVia === 'stage_close') {
|
|
325
|
+
return { ok: true, vote: inserted, fresh: true, karma_delta: 0, self_cast: isSelfCast };
|
|
322
326
|
}
|
|
323
327
|
await db.insertVoteKarma({ voterId, itemId: id, delta: VOTE_KARMA_DELTA });
|
|
324
328
|
return { ok: true, vote: inserted, fresh: true, karma_delta: VOTE_KARMA_DELTA, self_cast: false };
|
|
@@ -1103,6 +1107,7 @@ async function genesisStageStatus() {
|
|
|
1103
1107
|
remaining_seconds: item.remaining_seconds ?? null,
|
|
1104
1108
|
voted: cast.map((v) => ({
|
|
1105
1109
|
builder_id: String(v.voter_id), github_login: v.github_login, display_name: v.display_name, direction: v.direction,
|
|
1110
|
+
cast_via: v.cast_via || 'ballot',
|
|
1106
1111
|
})),
|
|
1107
1112
|
waiting_on: members.filter((m) => !castBy.has(String(m.builder_id))).map((m) => ({
|
|
1108
1113
|
builder_id: m.builder_id, github_login: m.github_login, display_name: m.display_name,
|
|
@@ -1155,6 +1160,7 @@ async function boardRoomView({ closedLimit = 20, viewerId = null } = {}) {
|
|
|
1155
1160
|
reason_md: v.reason_md,
|
|
1156
1161
|
section_key: v.section_key,
|
|
1157
1162
|
cast_at: v.cast_at,
|
|
1163
|
+
cast_via: v.cast_via || 'ballot', // task 1005121: a ballot, or a confirm given by closing a genesis stage
|
|
1158
1164
|
});
|
|
1159
1165
|
}
|
|
1160
1166
|
const project = (item) => {
|
package/modules/government/db.js
CHANGED
|
@@ -494,13 +494,15 @@ async function getBoardItemAuthor(item) {
|
|
|
494
494
|
// The open ballot's one write. Idempotency is STRUCTURAL — UNIQUE(item_id,
|
|
495
495
|
// voter_id); the loser of a double-cast gets null and the caller reads the
|
|
496
496
|
// standing vote back.
|
|
497
|
-
|
|
497
|
+
// cast_via (government_038, task 1005121): 'ballot', or 'stage_close' for the
|
|
498
|
+
// confirm a founder gives by closing a genesis stage. board.js decides which.
|
|
499
|
+
async function insertBoardVote({ itemId, voterId, direction, reasonMd = null, sectionKey = null, castVia = 'ballot' }) {
|
|
498
500
|
const { rows } = await pool.query(
|
|
499
|
-
`INSERT INTO government_board_votes (item_id, voter_id, direction, reason_md, section_key)
|
|
500
|
-
VALUES ($1, $2, $3, $4, $5)
|
|
501
|
+
`INSERT INTO government_board_votes (item_id, voter_id, direction, reason_md, section_key, cast_via)
|
|
502
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
501
503
|
ON CONFLICT (item_id, voter_id) DO NOTHING
|
|
502
504
|
RETURNING *`,
|
|
503
|
-
[itemId, voterId, direction, reasonMd, sectionKey],
|
|
505
|
+
[itemId, voterId, direction, reasonMd, sectionKey, castVia],
|
|
504
506
|
);
|
|
505
507
|
return rows[0] || null;
|
|
506
508
|
}
|
|
@@ -1321,7 +1323,7 @@ async function insertVoteKarma({ voterId, itemId, delta }) {
|
|
|
1321
1323
|
}
|
|
1322
1324
|
|
|
1323
1325
|
// ── the constitution in force (task 1005140) ─────────────────────────────────
|
|
1324
|
-
// ONE row (
|
|
1326
|
+
// ONE row (government_038). The board block is stored exactly as sanitizeBoard
|
|
1325
1327
|
// returns it; constitution.js owns the rules for when it is written and how the
|
|
1326
1328
|
// running process is brought in step with it. `q` is a client or the pool.
|
|
1327
1329
|
async function getConstitutionRow(q = pool) {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// modules/government/genesis-close.js — closing a genesis stage is ONE call
|
|
3
|
+
// (task 1005121). Its own file so board.js stays under the size ratchet; it is
|
|
4
|
+
// composed only from board.js's exported functions (looked up at call time, so a
|
|
5
|
+
// test's stubs on board's db bite exactly as they do for board itself).
|
|
6
|
+
const board = require('./board.js');
|
|
7
|
+
|
|
8
|
+
// Close a genesis stage in ONE call (task 1005121; owner ruling 2026-11-07:
|
|
9
|
+
// "closing a stage shouldn't be such a big thing"). Opens the sitting (or reads
|
|
10
|
+
// the one already open) and, where the item's constitution says one person
|
|
11
|
+
// decides (first_ratifier) and the caller is a member under its snapshot, casts
|
|
12
|
+
// the caller's yes in the same breath — recorded cast_via 'stage_close', so the
|
|
13
|
+
// ledger tells a confirm given by closing the stage from a clicked ballot — and
|
|
14
|
+
// closes it. The same rule at every stage: nothing here forks on which stage.
|
|
15
|
+
// Returns, never throws for a refusal:
|
|
16
|
+
// { closed: true, item, stage, cast } — the sitting passed
|
|
17
|
+
// { closed: false, item, stage, opened, status } — a real sitting waits;
|
|
18
|
+
// `status` is genesisStageStatus' entry for this stage (who has voted, who
|
|
19
|
+
// it waits on, the rule in words, the clock)
|
|
20
|
+
// { closed: false, reason, unfinished? } — openGenesisStageClose refused
|
|
21
|
+
async function closeGenesisStage({ stageKey, taskIds, closedBy = null } = {}) {
|
|
22
|
+
const r = await board.openGenesisStageClose({ stageKey, taskIds, openedBy: closedBy });
|
|
23
|
+
if (!r.opened && r.reason !== 'already_open') return { closed: false, reason: r.reason, unfinished: r.unfinished || [] };
|
|
24
|
+
const item = r.item;
|
|
25
|
+
const stage = r.stage || board.GENESIS_STAGES.find((s) => s.key === stageKey);
|
|
26
|
+
if (!item) return { closed: false, reason: 'already_open' };
|
|
27
|
+
const constitution = item.constitution || {};
|
|
28
|
+
let cast = null;
|
|
29
|
+
if (constitution.pass_rule === 'first_ratifier' && closedBy != null && closedBy !== '') {
|
|
30
|
+
const v = await board.castVote({ itemId: item.id, voterId: closedBy, direction: 'yes', castVia: 'stage_close' });
|
|
31
|
+
if (v.ok) {
|
|
32
|
+
cast = { cast_via: v.vote ? v.vote.cast_via || 'stage_close' : 'stage_close', fresh: v.fresh };
|
|
33
|
+
const c = await board.maybeCloseAfterVote(item.id);
|
|
34
|
+
if (c && c.closed && c.outcome === 'passed') return { closed: true, item: c.item || item, stage, cast };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
let status = null;
|
|
38
|
+
try {
|
|
39
|
+
const all = await board.genesisStageStatus();
|
|
40
|
+
status = (all.stages || []).find((s) => s.key === stage.key) || null;
|
|
41
|
+
} catch (_) { /* the answer still says a sitting is open, and its id */ }
|
|
42
|
+
return { closed: false, item, stage, opened: !!r.opened, status, cast };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = { closeGenesisStage };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- government_038_vote_cast_via.sql — HOW a vote was cast (task 1005121).
|
|
2
|
+
--
|
|
3
|
+
-- Closing a genesis stage is one call: where the constitution says one person
|
|
4
|
+
-- decides (first_ratifier) and that person is the founder asking to close it, the
|
|
5
|
+
-- close casts their confirming yes in the same breath (board.js closeGenesisStage).
|
|
6
|
+
-- The owner's condition (2026-11-07): a ratification carries a person's name, so
|
|
7
|
+
-- the record must say HOW it was cast — a confirm given by closing the stage — not
|
|
8
|
+
-- merely that the founder voted. Every vote before this column is a ballot.
|
|
9
|
+
--
|
|
10
|
+
-- cast_via 'ballot' a vote cast in the Board Room (the vote route)
|
|
11
|
+
-- 'stage_close' the confirm given by closing a genesis stage; only
|
|
12
|
+
-- board.js writes it, only on a genesis_stage item, only yes
|
|
13
|
+
|
|
14
|
+
BEGIN;
|
|
15
|
+
|
|
16
|
+
ALTER TABLE government_board_votes
|
|
17
|
+
ADD COLUMN IF NOT EXISTS cast_via text NOT NULL DEFAULT 'ballot';
|
|
18
|
+
|
|
19
|
+
ALTER TABLE government_board_votes DROP CONSTRAINT IF EXISTS government_board_votes_cast_via_check;
|
|
20
|
+
ALTER TABLE government_board_votes ADD CONSTRAINT government_board_votes_cast_via_check
|
|
21
|
+
CHECK (cast_via IN ('ballot', 'stage_close') AND (cast_via = 'ballot' OR direction = 'yes'));
|
|
22
|
+
|
|
23
|
+
COMMIT;
|
|
@@ -126,12 +126,11 @@ const governmentPort = {
|
|
|
126
126
|
// outcome is written by a close, never by the module reading it.
|
|
127
127
|
boardPassForIdea: board.boardPassForIdea,
|
|
128
128
|
boardPassedIdeaIds: board.boardPassedIdeaIds,
|
|
129
|
-
// task 1004429 (BV2.PS04): a finished genesis stage is put to the board
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
// the constitution in force. And the founding band's read: per stage, what it
|
|
133
|
-
// is waiting on. A pass is announced as `board.genesis_stage.passed`.
|
|
129
|
+
// task 1004429 (BV2.PS04): a finished genesis stage is put to the board (the gate
|
|
130
|
+
// lives in board.js; an ordinary item under the constitution in force), and the
|
|
131
|
+
// founding band's read. task 1005121: closeGenesisStage closes it in one call.
|
|
134
132
|
openGenesisStageClose: board.openGenesisStageClose,
|
|
133
|
+
closeGenesisStage: require('../genesis-close').closeGenesisStage, // task 1005121: one call closes a stage
|
|
135
134
|
// task 1004941: POST /government/board/matters' own openMatter, for a module's proposal (callers gate on board.item.open)
|
|
136
135
|
openMatter: board.openMatter,
|
|
137
136
|
// task 1004427 (BV2.PS13): the genesis charter + legislation choice, filed as
|
|
@@ -87,9 +87,10 @@
|
|
|
87
87
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
88
88
|
|
|
89
89
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
90
|
+
<script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
|
|
90
91
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
91
92
|
<script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
|
|
92
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
93
|
+
<script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
|
|
93
94
|
<script src="/builders/hall-dialog.js"></script>
|
|
94
95
|
<script src="/builders/palette.js" defer></script>
|
|
95
96
|
<script src="/builders/tweak-editor-lib.js?v=2026-09-28-tw23"></script>
|
|
@@ -90,9 +90,10 @@
|
|
|
90
90
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
91
91
|
|
|
92
92
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
93
|
+
<script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
|
|
93
94
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
94
95
|
<script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
|
|
95
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
96
|
+
<script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
|
|
96
97
|
<script src="/builders/hall-dialog.js"></script>
|
|
97
98
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
98
99
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -59,9 +59,10 @@
|
|
|
59
59
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
60
60
|
chrome exists before the page script runs. -->
|
|
61
61
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
62
|
+
<script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
|
|
62
63
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
63
64
|
<script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
|
|
64
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
65
|
+
<script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
|
|
65
66
|
<script src="/builders/hall-dialog.js"></script>
|
|
66
67
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
67
68
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -61,9 +61,10 @@
|
|
|
61
61
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
62
62
|
|
|
63
63
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
64
|
+
<script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
|
|
64
65
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
65
66
|
<script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
|
|
66
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
67
|
+
<script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
|
|
67
68
|
<script src="/builders/hall-dialog.js"></script>
|
|
68
69
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
69
70
|
<script src="/builders/palette.js" defer></script>
|
|
@@ -100,6 +100,7 @@
|
|
|
100
100
|
// rank/permission-CRUD refusals stayed with the Permissions surface — this page
|
|
101
101
|
// cannot provoke them.
|
|
102
102
|
const ERROR_COPY = {
|
|
103
|
+
bad_cast_via: 'That vote could not be recorded that way — cast it from the ballot.',
|
|
103
104
|
not_board_member: 'Only members of this item’s board may vote on it — membership follows the rules that were in force when the window opened.',
|
|
104
105
|
item_closed: 'This sitting has closed — refreshing.',
|
|
105
106
|
vote_window_expired: 'This sitting’s clock has run out — the sweep is closing it.',
|
|
@@ -106,9 +106,10 @@
|
|
|
106
106
|
</div>
|
|
107
107
|
|
|
108
108
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
109
|
+
<script src="/builders/shell-game.js?v=2026-11-09-game-mode" defer></script>
|
|
109
110
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers" defer></script>
|
|
110
111
|
<script src="/builders/craft-mode.js?v=2026-11-05-goals" defer></script>
|
|
111
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
112
|
+
<script src="/builders/shell.js?v=2026-11-09-game-mode" defer></script>
|
|
112
113
|
<script src="/builders/hall-dialog.js" defer></script>
|
|
113
114
|
<script src="/builders/palette.js" defer></script>
|
|
114
115
|
<script src="/builders/gov-living.js?v=2026-10-09-positions1" defer></script>
|
|
@@ -160,9 +160,10 @@
|
|
|
160
160
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
161
161
|
|
|
162
162
|
<script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
|
|
163
|
+
<script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
|
|
163
164
|
<script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
|
|
164
165
|
<script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
|
|
165
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
166
|
+
<script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
|
|
166
167
|
<script src="/builders/hall-dialog.js"></script>
|
|
167
168
|
<script src="/builders/palette.js" defer></script>
|
|
168
169
|
<script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
|