@bongos/core 1.25.20 → 1.25.21
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 +157 -62
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +10 -0
- package/clients/bongos-client/index.cjs +10 -0
- package/clients/bongos-client/index.d.ts +23 -8
- package/clients/bongos-client/index.mjs +10 -0
- package/docs/adr/0406-every-project-gets-a-sandbox-that-follows-main-and-live-moves-only-when-a-person-promotes.md +10 -0
- package/docs/adr/0407-a-project-grant-is-made-by-the-owner-not-witnessed-at-sign-in.md +3 -1
- package/docs/api/openapi.json +409 -36
- package/docs/api-reference.md +7 -2
- package/docs/copy-inventory.md +20 -20
- package/docs/copy-registry.json +23 -23
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +2 -2
- package/modules/government/board.js +8 -7
- package/modules/government/charter-advice.js +10 -3
- package/modules/government/charter.js +88 -4
- package/modules/government/migrations/government_039_vote_cast_via_filed.sql +22 -0
- package/modules/government/routes/government.js +12 -12
- package/modules/government/sole-member.js +75 -0
- package/modules/hall-ui/public/genesis-home.js +12 -5
- package/modules/onboarding/genesis-home.js +14 -2
- package/modules/platform-identity/module.json +1 -1
- package/modules/platform-identity/project-standing.js +49 -0
- package/modules/platform-identity/routes/my-projects.js +8 -0
- package/modules/provisioning/grants.js +126 -0
- package/modules/provisioning/migrations/provisioning_038_render_promote.sql +43 -0
- package/modules/provisioning/migrations/provisioning_039_project_grants.sql +40 -0
- package/modules/provisioning/module.json +2 -1
- package/modules/provisioning/project-refusal.js +107 -0
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/render-lookup.js +36 -1
- package/modules/provisioning/render-promote.js +80 -0
- package/modules/provisioning/route-helpers.js +70 -16
- package/modules/provisioning/routes/env-manifest.js +21 -5
- package/modules/provisioning/routes/grants.js +141 -0
- package/modules/provisioning/routes/provisioning.js +8 -7
- package/modules/provisioning/routes/render-standup.js +82 -3
- package/modules/public-landing/public/projects.html +99 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +18 -0
- package/scripts/bongos/genesis.js +11 -1
- package/scripts/bongos/government-walk-sole.js +41 -0
- package/scripts/bongos/government-walk.js +15 -16
- package/scripts/bongos/provision-render-common.js +48 -0
- package/scripts/bongos/provision-render-promote.js +93 -0
- package/scripts/bongos/provision-render-sandbox.js +14 -2
- package/scripts/bongos/provision-render.js +4 -36
- package/scripts/bongos/provision.js +1 -0
- package/scripts/bongos/render-api.js +17 -2
- package/scripts/gds/government-walk-sole.js +6 -0
- package/scripts/gds/provision-render-common.js +6 -0
- package/scripts/gds/provision-render-promote.js +6 -0
- package/src/module-api.js +1 -1
- package/tests/fleet_cost_view.mjs +2 -0
- package/tests/genesis_government.mjs +5 -1
- package/tests/genesis_home.mjs +17 -0
- package/tests/government_charter_advice.mjs +49 -0
- package/tests/government_charter_forms.mjs +14 -3
- package/tests/government_seed.mjs +1 -0
- package/tests/government_sole_member.mjs +153 -0
- package/tests/project_catalog_routes.mjs +2 -0
- package/tests/provisioning_env_manifest.mjs +4 -0
- package/tests/provisioning_env_manifest_edit_delete.mjs +2 -0
- package/tests/provisioning_project_grants.mjs +458 -0
- package/tests/provisioning_project_owner_gate.mjs +3 -1
- package/tests/provisioning_project_refusal.mjs +316 -0
- package/tests/provisioning_render_route.mjs +1 -1
- package/tests/provisioning_restart.mjs +2 -0
- package/tests/provisioning_settings.mjs +2 -0
- package/tests/provisioning_settings_apply.mjs +1 -1
- package/tests/provisioning_teardown_intent.mjs +2 -2
- package/tests/render_promote.mjs +309 -0
- package/tests/render_sandbox.mjs +9 -4
package/docs/copy-inventory.md
CHANGED
|
@@ -320,7 +320,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
320
320
|
| `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
|
|
321
321
|
| `053e576ba9a3` | certain | Close options | `modules/hall-ui/public/shell-game.js:589` |
|
|
322
322
|
| `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
|
|
323
|
-
| `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:
|
|
323
|
+
| `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:317` |
|
|
324
324
|
| `e6f1842afde1` | certain | Close transcript | `modules/hall-ui/public/watch.html:222` |
|
|
325
325
|
| `29e8c5e30095` | certain | Close without choosing | `modules/hall-ui/public/craft-mode.js:744` |
|
|
326
326
|
| `3d148e19e03a` | certain | Closed. | `modules/hall-ui/public/copy-desk.js:514` |
|
|
@@ -335,7 +335,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
335
335
|
| `fe4a2b04eda5` | certain | Commands — {{worldName}} | `modules/hall-ui/public/commands.html:6` |
|
|
336
336
|
| `cfc287c42263` | certain | Complete your profile | `modules/hall-ui/public/profile-nudge.js:79` |
|
|
337
337
|
| `140f2126c0a3` | certain | Confirm the cost | `modules/hall-ui/public/ai-studio.js:354` |
|
|
338
|
-
| `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:
|
|
338
|
+
| `e74f4442c338` | certain | Confirm this stage | `modules/hall-ui/public/genesis-home.js:308` |
|
|
339
339
|
| `9b16a22bf24c` | certain | Connect Discord & join the server | `modules/hall-ui/public/settings.js:536` |
|
|
340
340
|
| `c07898571b24` | certain | Connects to | `modules/hall-ui/public/atlas.js:293` |
|
|
341
341
|
| `999e1955bb1c` | certain | Context layer | `modules/hall-ui/public/atlas.html:45` |
|
|
@@ -494,7 +494,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
494
494
|
| `6fd9b1bf8d97` | certain | Engineering work is open on this page ({…}), so code may change around your words. You can keep writing. | `modules/hall-ui/public/tweak-editor.js:304` |
|
|
495
495
|
| `690609c8e9a9` | certain | Enter a goal number. | `modules/hall-ui/public/gate.js:323` |
|
|
496
496
|
| `8eabe3d69bf3` | certain | Enter files the idea. Shift and Enter starts a new line. | `modules/hall-ui/public/home-idea-box.js:55` |
|
|
497
|
-
| `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:
|
|
497
|
+
| `4f776bc33d5f` | certain | Enter the builders’ hall | `modules/hall-ui/public/genesis-home.js:362` |
|
|
498
498
|
| `1825c9c467d8` | certain | Enter the id of the task this one should wait for. | `modules/hall-ui/public/task.js:965` |
|
|
499
499
|
| `bd7a40639a1c` | certain | Estimate (min) | `modules/hall-ui/public/task-detail.js:465` |
|
|
500
500
|
| `c15d1f0ddfb6` | certain | Estimation accuracy | `modules/hall-ui/public/watch.html:147` |
|
|
@@ -504,7 +504,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
504
504
|
| `25b6c0f9e74e` | certain | Every page is taken or on its way to the site right now. Come back soon. | `modules/hall-ui/public/studio.js:737` |
|
|
505
505
|
| `c188854da766` | certain | Every place you are currently signed in — this browser, your terminal, any other machine. A session refreshes | `modules/hall-ui/public/settings.html:191` |
|
|
506
506
|
| `8b2cd7714fa4` | certain | Every rank and what it unlocks, in the Primer → | `modules/hall-ui/public/profile-own.js:103` |
|
|
507
|
-
| `823db1913949` | certain | Every room in the hall is open now. The founding builders keep their mark for good. | `modules/hall-ui/public/genesis-home.js:
|
|
507
|
+
| `823db1913949` | certain | Every room in the hall is open now. The founding builders keep their mark for good. | `modules/hall-ui/public/genesis-home.js:361` |
|
|
508
508
|
| `47be006e5ad5` | certain | Every sitting since has been decided under the constitution below, not the ratified one. Nothing is re-applied | `modules/hall-ui/public/government.js:679` |
|
|
509
509
|
| `6604d63c2fb4` | certain | Everyone who joined while this project was being founded, in the order they arrived. The mark is for good. | `modules/hall-ui/public/hall-widgets.js:75` |
|
|
510
510
|
| `d9927beb8cb7` | certain | Everything shipped. By role, with goals and ideas: | `modules/hall-ui/public/profile.html:112` |
|
|
@@ -530,8 +530,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
530
530
|
| `e77b158b074d` | certain | Find a skill | `modules/hall-ui/public/speciality-tools.js:262` |
|
|
531
531
|
| `1def0e7c716e` | certain | Find something to flag | `modules/hall-ui/public/copy-desk.html:64` |
|
|
532
532
|
| `32b40fdae34f` | certain | Finding the next page… | `modules/hall-ui/public/tweak-editor.html:101` |
|
|
533
|
-
| `d320e778ed17` | certain | Finish every task above and this stage moves on by itself. | `modules/hall-ui/public/genesis-home.js:
|
|
534
|
-
| `f3c56ef0d809` | certain | Finish every task above, then put this stage to the board. | `modules/hall-ui/public/genesis-home.js:
|
|
533
|
+
| `d320e778ed17` | certain | Finish every task above and this stage moves on by itself. | `modules/hall-ui/public/genesis-home.js:320` |
|
|
534
|
+
| `f3c56ef0d809` | certain | Finish every task above, then put this stage to the board. | `modules/hall-ui/public/genesis-home.js:321` |
|
|
535
535
|
| `e8738f535783` | certain | Finish later — everything stays off until you save | `modules/hall-ui/public/speciality-tools.js:199` |
|
|
536
536
|
| `defed93e8e28` | certain | Finish these steps once and you’re in. Each one ticks itself as you go. | `modules/hall-ui/public/setup-gate.js:136` |
|
|
537
537
|
| `149d97457483` | certain | Fit the sky (0) | `modules/hall-ui/public/goal-map.html:80` |
|
|
@@ -561,7 +561,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
561
561
|
| `c93912bbad76` | certain | Gathering the reviews and flagged copy that wait for you. | `modules/hall-ui/public/studio.html:201` |
|
|
562
562
|
| `4638e024f0af` | certain | Generated from the code on the last deploy · | `modules/hall-ui/public/atlas.js:436` |
|
|
563
563
|
| `3c1a5d27ef0b` | certain | Generated from the code on the last deploy. | `modules/hall-ui/public/atlas.js:436` |
|
|
564
|
-
| `e79fe220b0fc` | certain | Genesis stages | `modules/hall-ui/public/genesis-home.js:
|
|
564
|
+
| `e79fe220b0fc` | certain | Genesis stages | `modules/hall-ui/public/genesis-home.js:84` |
|
|
565
565
|
| `2ae2114b61db` | certain | Get a free key ↗ | `modules/hall-ui/public/settings.js:697` |
|
|
566
566
|
| `ea60662c296c` | certain | Get a key ↗ | `modules/hall-ui/public/settings-ai-keys.js:29` |
|
|
567
567
|
| `a28b1a567f1a` | certain | GitHub username | `modules/hall-ui/public/hall-render.js:238` |
|
|
@@ -606,7 +606,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
606
606
|
| `1e8da0baf421` | certain | How do you want to see it? | `modules/hall-ui/public/shell-game.js:165` |
|
|
607
607
|
| `0bab9286ea38` | certain | How each builder's shipped work has been graded over the past thirty days. | `modules/hall-ui/public/watch.html:75` |
|
|
608
608
|
| `fb7489e8b67c` | certain | How it has changed | `modules/hall-ui/public/government.js:1017` |
|
|
609
|
-
| `1afadcefd6ea` | certain | How many passes | `modules/hall-ui/public/genesis-home.js:
|
|
609
|
+
| `1afadcefd6ea` | certain | How many passes | `modules/hall-ui/public/genesis-home.js:118` |
|
|
610
610
|
| `868cf6930d64` | certain | How task estimates compare with the time work actually took. | `modules/hall-ui/public/watch.html:148` |
|
|
611
611
|
| `76f344dd4727` | certain | How tasks ship | `modules/hall-ui/public/project-settings.js:136` |
|
|
612
612
|
| `6fad68f727e2` | certain | How the session read to this builder, scored against their own interaction profile. Advisory — it gates nothin | `modules/hall-ui/public/watch.html:201` |
|
|
@@ -653,7 +653,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
653
653
|
| `a16b0f9e8dc1` | certain | Invite-only — there is nothing to apply for here. | `modules/hall-ui/public/hall-render.js:235` |
|
|
654
654
|
| `0e48bb2c8c94` | certain | Island index | `modules/hall-ui/public/atlas.html:74` |
|
|
655
655
|
| `2170b74c6526` | certain | Isometric map of the repository | `modules/hall-ui/public/atlas.html:52` |
|
|
656
|
-
| `a4631fe26669` | certain | It already exists, so gather what it has first | `modules/hall-ui/public/genesis-home.js:
|
|
656
|
+
| `a4631fe26669` | certain | It already exists, so gather what it has first | `modules/hall-ui/public/genesis-home.js:126` |
|
|
657
657
|
| `36632d62169d` | certain | It became {…} {…} | `modules/hall-ui/public/studio.js:1210` |
|
|
658
658
|
| `bd8d04eb265c` | certain | It cleared the completeness grade at {…}/100. | `modules/hall-ui/public/board-room.js:343` |
|
|
659
659
|
| `bef8dbf78170` | certain | It comes back to your studio once it is applied, and nothing ships until you have seen it. | `modules/hall-ui/public/tweak-editor.html:97` |
|
|
@@ -872,7 +872,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
872
872
|
| `3f2dfb5a98ce` | certain | No signed works hang here yet. A page an artist tweaks, or a design that ships with its picture, hangs here on | `modules/hall-ui/public/home-gallery.js:111` |
|
|
873
873
|
| `4485497d87bb` | certain | No specialities yet. Create one below — it takes a name and a craft, and you can train it afterwards. | `modules/hall-ui/public/speciality-tools.js:436` |
|
|
874
874
|
| `545dc44ad427` | certain | No task in this goal depends on another task in this goal. | `modules/hall-ui/public/goal-forest-render.js:164` |
|
|
875
|
-
| `da838f6056b1` | certain | No tasks for this stage yet. | `modules/hall-ui/public/genesis-home.js:
|
|
875
|
+
| `da838f6056b1` | certain | No tasks for this stage yet. | `modules/hall-ui/public/genesis-home.js:266` |
|
|
876
876
|
| `712b64d8273f` | certain | No tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:445` |
|
|
877
877
|
| `2302ee46744e` | certain | No terminal commands found. | `modules/hall-ui/public/commands.js:45` |
|
|
878
878
|
| `78f78d1d1e1f` | certain | No version is in flight right now. | `modules/hall-ui/public/roadmap.js:191` |
|
|
@@ -980,9 +980,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
980
980
|
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/goals-render.js:438` |
|
|
981
981
|
| `855277dff074` | certain | Open task #{…} | `modules/hall-ui/public/work.js:838` |
|
|
982
982
|
| `99c630009152` | certain | Open tasks whose declared files overlap — sequence these before two builders collide. | `modules/hall-ui/public/goals.html:217` |
|
|
983
|
-
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:
|
|
984
|
-
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:
|
|
985
|
-
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:
|
|
983
|
+
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:309` |
|
|
984
|
+
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:314` |
|
|
985
|
+
| `fe9986a9d821` | certain | Open the Board Room | `modules/hall-ui/public/genesis-home.js:352` |
|
|
986
986
|
| `e073aa0c3847` | certain | Open the conflicts for {…} | `modules/hall-ui/public/goal-inbox.js:111` |
|
|
987
987
|
| `676361254d92` | certain | Open the idea composer | `modules/hall-ui/public/idea.js:504` |
|
|
988
988
|
| `29e1cb2d32fc` | certain | Open the recording | `modules/hall-ui/public/criterion-uat-ui.js:124` |
|
|
@@ -1072,9 +1072,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1072
1072
|
| `995dd1ee728d` | certain | Proposed to | `modules/hall-ui/public/my-agents.js:583` |
|
|
1073
1073
|
| `3f85bdc47099` | certain | Protected module scope — join by request; an Archon admits members | `modules/hall-ui/public/goals-render.js:876` |
|
|
1074
1074
|
| `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:291` |
|
|
1075
|
-
| `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:
|
|
1075
|
+
| `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:313` |
|
|
1076
1076
|
| `55ff5cd9f7a9` | certain | Put to a vote: | `modules/hall-ui/public/my-agents.js:603` |
|
|
1077
|
-
| `8888a7fd45be` | certain | Put to the board | `modules/hall-ui/public/genesis-home.js:
|
|
1077
|
+
| `8888a7fd45be` | certain | Put to the board | `modules/hall-ui/public/genesis-home.js:209` |
|
|
1078
1078
|
| `b3b52d7a9a40` | certain | Quiet. Nothing here is due. | `modules/hall-ui/public/home-studio.js:80` |
|
|
1079
1079
|
| `4de232a05888` | certain | Raise after | `modules/hall-ui/public/project-settings.js:115` |
|
|
1080
1080
|
| `1a4c7be3abb0` | certain | Ran {…} | `modules/hall-ui/public/sessions.js:205` |
|
|
@@ -1290,7 +1290,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1290
1290
|
| `eaad12cacb9d` | certain | Start over | `modules/hall-ui/public/studio.js:269` |
|
|
1291
1291
|
| `45e2495c0dbd` | certain | Start something new | `modules/hall-ui/public/ai-studio.js:514` |
|
|
1292
1292
|
| `58cef7963b6c` | certain | Start with your role | `modules/hall-ui/public/welcome-boot.js:192` |
|
|
1293
|
-
| `b01258e8242a` | certain | Starting government | `modules/hall-ui/public/genesis-home.js:
|
|
1293
|
+
| `b01258e8242a` | certain | Starting government | `modules/hall-ui/public/genesis-home.js:146` |
|
|
1294
1294
|
| `42a57b62b2fe` | certain | Still loading this goal's tasks. Try again in a moment. | `modules/hall-ui/public/goals-page.js:400` |
|
|
1295
1295
|
| `efe530c0e3a7` | certain | Still open | `modules/hall-ui/public/profile.js:564` |
|
|
1296
1296
|
| `92f87ca38190` | certain | Still splitting. It will appear in this page's docs when it is done. | `modules/hall-ui/public/page-notes.js:285` |
|
|
@@ -1350,7 +1350,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1350
1350
|
| `4462dcaaaa7d` | certain | The artist reads this instead of guessing. A pointer with no judgement costs them a look and tells them nothin | `modules/hall-ui/public/copy-desk.html:103` |
|
|
1351
1351
|
| `ca3708a6566a` | certain | The bench | `modules/hall-ui/public/home-studio.js:82` |
|
|
1352
1352
|
| `f38140e472df` | certain | The board ratified a change that is not in force. | `modules/hall-ui/public/government.js:679` |
|
|
1353
|
-
| `ecc7215524c0` | certain | The board sent this stage back. Read why in the Board Room, then put it up again. | `modules/hall-ui/public/genesis-home.js:
|
|
1353
|
+
| `ecc7215524c0` | certain | The board sent this stage back. Read why in the Board Room, then put it up again. | `modules/hall-ui/public/genesis-home.js:312` |
|
|
1354
1354
|
| `a335af65398d` | certain | The city | `modules/hall-ui/public/city.html:62` |
|
|
1355
1355
|
| `a335af65398d` | certain | The city | `modules/hall-ui/public/city.html:62` |
|
|
1356
1356
|
| `4593b431e7b7` | certain | The city — {{worldName}} | `modules/hall-ui/public/city.html:6` |
|
|
@@ -1409,7 +1409,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1409
1409
|
| `dea378cd4837` | certain | The primer did not load | `modules/hall-ui/public/primer.html:83` |
|
|
1410
1410
|
| `08ec02eb31fb` | certain | The project city building up, week by week | `modules/hall-ui/public/shell-game.js:181` |
|
|
1411
1411
|
| `ca10fbab561e` | certain | The project this week | `modules/hall-ui/public/home-city.js:325` |
|
|
1412
|
-
| `dc2d6fd0350a` | certain | The project’s life so far | `modules/hall-ui/public/genesis-home.js:
|
|
1412
|
+
| `dc2d6fd0350a` | certain | The project’s life so far | `modules/hall-ui/public/genesis-home.js:163` |
|
|
1413
1413
|
| `169a03d777a1` | certain | The rank above yours is {…}. | `modules/hall-ui/public/profile-own.js:101` |
|
|
1414
1414
|
| `c0034db3281c` | certain | The reason is recorded in the audit log. This is recoverable: a retired task can be restored to the backlog wi | `modules/hall-ui/public/task.js:840` |
|
|
1415
1415
|
| `c43812b59e97` | certain | The release notes could not be read: {…}. The versions are still listed. | `modules/hall-ui/public/settings-software-update.js:127` |
|
|
@@ -1539,7 +1539,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1539
1539
|
| `a501b466c24b` | certain | Updating Bongos | `modules/hall-ui/public/update-pill.js:252` |
|
|
1540
1540
|
| `f4520cdf67b4` | certain | Upvote (+1 karma) | `modules/hall-ui/public/vote-control.js:42` |
|
|
1541
1541
|
| `e7e2a99a2bea` | certain | Use this | `modules/hall-ui/public/speciality-tools.js:415` |
|
|
1542
|
-
| `fe0f438b2ff9` | certain | Use this plan | `modules/hall-ui/public/genesis-home.js:
|
|
1542
|
+
| `fe0f438b2ff9` | certain | Use this plan | `modules/hall-ui/public/genesis-home.js:128` |
|
|
1543
1543
|
| `e1ecd543a2ca` | certain | Using this speciality. | `modules/hall-ui/public/speciality-tools.js:474` |
|
|
1544
1544
|
| `664555b65658` | certain | Usually a few cents. Up to {…} is set aside, and the rest comes back. | `modules/hall-ui/public/ai-studio.js:340` |
|
|
1545
1545
|
| `6200bac6bdca` | certain | View all sessions | `modules/hall-ui/public/watch.html:98` |
|
|
@@ -1609,7 +1609,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1609
1609
|
| `515ac3e721ee` | certain | What would help someone scope this or finish it? | `modules/hall-ui/public/notes-panel.js:68` |
|
|
1610
1610
|
| `1d5bfd09068c` | certain | What you saw | `modules/hall-ui/public/studio.js:196` |
|
|
1611
1611
|
| `470de13e9ef7` | certain | What your agent reads first | `modules/hall-ui/public/my-agents.html:70` |
|
|
1612
|
-
| `41d9ab42e41d` | certain | What your stages left behind. Edit any of them at any time; it does not reopen the stage. | `modules/hall-ui/public/genesis-home.js:
|
|
1612
|
+
| `41d9ab42e41d` | certain | What your stages left behind. Edit any of them at any time; it does not reopen the stage. | `modules/hall-ui/public/genesis-home.js:290` |
|
|
1613
1613
|
| `a9e95b5fda1d` | certain | What {…} offers | `modules/hall-ui/public/speciality-tools.js:296` |
|
|
1614
1614
|
| `b8743d16eab8` | certain | What {…} unlocks | `modules/hall-ui/public/hall-render.js:83` |
|
|
1615
1615
|
| `338673475642` | certain | What's new | `modules/hall-ui/public/update-pill.js:295` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -943,9 +943,9 @@
|
|
|
943
943
|
"text": "Open the Board Room",
|
|
944
944
|
"occurrences": 3,
|
|
945
945
|
"at": [
|
|
946
|
-
"modules/hall-ui/public/genesis-home.js:
|
|
947
|
-
"modules/hall-ui/public/genesis-home.js:
|
|
948
|
-
"modules/hall-ui/public/genesis-home.js:
|
|
946
|
+
"modules/hall-ui/public/genesis-home.js:309",
|
|
947
|
+
"modules/hall-ui/public/genesis-home.js:314",
|
|
948
|
+
"modules/hall-ui/public/genesis-home.js:352"
|
|
949
949
|
]
|
|
950
950
|
},
|
|
951
951
|
{
|
|
@@ -5289,7 +5289,7 @@
|
|
|
5289
5289
|
"surface": "builders-hall",
|
|
5290
5290
|
"text": "Close this stage",
|
|
5291
5291
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
5292
|
-
"line":
|
|
5292
|
+
"line": 317,
|
|
5293
5293
|
"origin": "js-markup",
|
|
5294
5294
|
"confidence": "certain"
|
|
5295
5295
|
},
|
|
@@ -5424,7 +5424,7 @@
|
|
|
5424
5424
|
"surface": "builders-hall",
|
|
5425
5425
|
"text": "Confirm this stage",
|
|
5426
5426
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
5427
|
-
"line":
|
|
5427
|
+
"line": 308,
|
|
5428
5428
|
"origin": "js-markup",
|
|
5429
5429
|
"confidence": "certain"
|
|
5430
5430
|
},
|
|
@@ -6855,7 +6855,7 @@
|
|
|
6855
6855
|
"surface": "builders-hall",
|
|
6856
6856
|
"text": "Enter the builders’ hall",
|
|
6857
6857
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
6858
|
-
"line":
|
|
6858
|
+
"line": 362,
|
|
6859
6859
|
"origin": "js-markup",
|
|
6860
6860
|
"confidence": "certain"
|
|
6861
6861
|
},
|
|
@@ -6945,7 +6945,7 @@
|
|
|
6945
6945
|
"surface": "builders-hall",
|
|
6946
6946
|
"text": "Every room in the hall is open now. The founding builders keep their mark for good.",
|
|
6947
6947
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
6948
|
-
"line":
|
|
6948
|
+
"line": 361,
|
|
6949
6949
|
"origin": "js-markup",
|
|
6950
6950
|
"confidence": "certain"
|
|
6951
6951
|
},
|
|
@@ -7179,7 +7179,7 @@
|
|
|
7179
7179
|
"surface": "builders-hall",
|
|
7180
7180
|
"text": "Finish every task above and this stage moves on by itself.",
|
|
7181
7181
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
7182
|
-
"line":
|
|
7182
|
+
"line": 320,
|
|
7183
7183
|
"origin": "js-markup",
|
|
7184
7184
|
"confidence": "certain"
|
|
7185
7185
|
},
|
|
@@ -7188,7 +7188,7 @@
|
|
|
7188
7188
|
"surface": "builders-hall",
|
|
7189
7189
|
"text": "Finish every task above, then put this stage to the board.",
|
|
7190
7190
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
7191
|
-
"line":
|
|
7191
|
+
"line": 321,
|
|
7192
7192
|
"origin": "js-markup",
|
|
7193
7193
|
"confidence": "certain"
|
|
7194
7194
|
},
|
|
@@ -7458,7 +7458,7 @@
|
|
|
7458
7458
|
"surface": "builders-hall",
|
|
7459
7459
|
"text": "Genesis stages",
|
|
7460
7460
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
7461
|
-
"line":
|
|
7461
|
+
"line": 84,
|
|
7462
7462
|
"origin": "js-markup",
|
|
7463
7463
|
"confidence": "certain"
|
|
7464
7464
|
},
|
|
@@ -7863,7 +7863,7 @@
|
|
|
7863
7863
|
"surface": "builders-hall",
|
|
7864
7864
|
"text": "How many passes",
|
|
7865
7865
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
7866
|
-
"line":
|
|
7866
|
+
"line": 118,
|
|
7867
7867
|
"origin": "js-markup",
|
|
7868
7868
|
"confidence": "certain"
|
|
7869
7869
|
},
|
|
@@ -8286,7 +8286,7 @@
|
|
|
8286
8286
|
"surface": "builders-hall",
|
|
8287
8287
|
"text": "It already exists, so gather what it has first",
|
|
8288
8288
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
8289
|
-
"line":
|
|
8289
|
+
"line": 126,
|
|
8290
8290
|
"origin": "js-markup",
|
|
8291
8291
|
"confidence": "certain"
|
|
8292
8292
|
},
|
|
@@ -10257,7 +10257,7 @@
|
|
|
10257
10257
|
"surface": "builders-hall",
|
|
10258
10258
|
"text": "No tasks for this stage yet.",
|
|
10259
10259
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
10260
|
-
"line":
|
|
10260
|
+
"line": 266,
|
|
10261
10261
|
"origin": "js-markup",
|
|
10262
10262
|
"confidence": "certain"
|
|
10263
10263
|
},
|
|
@@ -11229,7 +11229,7 @@
|
|
|
11229
11229
|
"surface": "builders-hall",
|
|
11230
11230
|
"text": "Open the Board Room",
|
|
11231
11231
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
11232
|
-
"line":
|
|
11232
|
+
"line": 309,
|
|
11233
11233
|
"origin": "js-markup",
|
|
11234
11234
|
"confidence": "certain"
|
|
11235
11235
|
},
|
|
@@ -11238,7 +11238,7 @@
|
|
|
11238
11238
|
"surface": "builders-hall",
|
|
11239
11239
|
"text": "Open the Board Room",
|
|
11240
11240
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
11241
|
-
"line":
|
|
11241
|
+
"line": 314,
|
|
11242
11242
|
"origin": "js-markup",
|
|
11243
11243
|
"confidence": "certain"
|
|
11244
11244
|
},
|
|
@@ -11247,7 +11247,7 @@
|
|
|
11247
11247
|
"surface": "builders-hall",
|
|
11248
11248
|
"text": "Open the Board Room",
|
|
11249
11249
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
11250
|
-
"line":
|
|
11250
|
+
"line": 352,
|
|
11251
11251
|
"origin": "js-markup",
|
|
11252
11252
|
"confidence": "certain"
|
|
11253
11253
|
},
|
|
@@ -12057,7 +12057,7 @@
|
|
|
12057
12057
|
"surface": "builders-hall",
|
|
12058
12058
|
"text": "Put it to the board again",
|
|
12059
12059
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
12060
|
-
"line":
|
|
12060
|
+
"line": 313,
|
|
12061
12061
|
"origin": "js-markup",
|
|
12062
12062
|
"confidence": "certain"
|
|
12063
12063
|
},
|
|
@@ -12075,7 +12075,7 @@
|
|
|
12075
12075
|
"surface": "builders-hall",
|
|
12076
12076
|
"text": "Put to the board",
|
|
12077
12077
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
12078
|
-
"line":
|
|
12078
|
+
"line": 209,
|
|
12079
12079
|
"origin": "js-markup",
|
|
12080
12080
|
"confidence": "certain"
|
|
12081
12081
|
},
|
|
@@ -14019,7 +14019,7 @@
|
|
|
14019
14019
|
"surface": "builders-hall",
|
|
14020
14020
|
"text": "Starting government",
|
|
14021
14021
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
14022
|
-
"line":
|
|
14022
|
+
"line": 146,
|
|
14023
14023
|
"origin": "js-markup",
|
|
14024
14024
|
"confidence": "certain"
|
|
14025
14025
|
},
|
|
@@ -14559,7 +14559,7 @@
|
|
|
14559
14559
|
"surface": "builders-hall",
|
|
14560
14560
|
"text": "The board sent this stage back. Read why in the Board Room, then put it up again.",
|
|
14561
14561
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
14562
|
-
"line":
|
|
14562
|
+
"line": 312,
|
|
14563
14563
|
"origin": "js-markup",
|
|
14564
14564
|
"confidence": "certain"
|
|
14565
14565
|
},
|
|
@@ -15090,7 +15090,7 @@
|
|
|
15090
15090
|
"surface": "builders-hall",
|
|
15091
15091
|
"text": "The project’s life so far",
|
|
15092
15092
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
15093
|
-
"line":
|
|
15093
|
+
"line": 163,
|
|
15094
15094
|
"origin": "js-markup",
|
|
15095
15095
|
"confidence": "certain"
|
|
15096
15096
|
},
|
|
@@ -16260,7 +16260,7 @@
|
|
|
16260
16260
|
"surface": "builders-hall",
|
|
16261
16261
|
"text": "Use this plan",
|
|
16262
16262
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
16263
|
-
"line":
|
|
16263
|
+
"line": 128,
|
|
16264
16264
|
"origin": "js-markup",
|
|
16265
16265
|
"confidence": "certain"
|
|
16266
16266
|
},
|
|
@@ -16890,7 +16890,7 @@
|
|
|
16890
16890
|
"surface": "builders-hall",
|
|
16891
16891
|
"text": "What your stages left behind. Edit any of them at any time; it does not reopen the stage.",
|
|
16892
16892
|
"file": "modules/hall-ui/public/genesis-home.js",
|
|
16893
|
-
"line":
|
|
16893
|
+
"line": 290,
|
|
16894
16894
|
"origin": "js-markup",
|
|
16895
16895
|
"confidence": "certain"
|
|
16896
16896
|
},
|
|
@@ -3478,5 +3478,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
3478
3478
|
landed since 1.25.18 with no explicit bump. run 43520229236. (task 1002620)
|
|
3479
3479
|
1.25.20 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3480
3480
|
landed since 1.25.19 with no explicit bump. run 43522487559. (task 1002620)
|
|
3481
|
+
1.25.21 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
3482
|
+
landed since 1.25.20 with no explicit bump. run 43528908009. (task 1002620)
|
|
3481
3483
|
---------------------------------------------------------------------------
|
|
3482
3484
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -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": "
|
|
957
|
+
"files_hash": "d403a1522c33b4af",
|
|
958
958
|
"reading_hash": "c5f4986bd90e2a2a",
|
|
959
959
|
"counts": {"lines":29,"placed":8,"shared":8,"unplaced":13},
|
|
960
960
|
"omitted": {"data":4},
|
|
@@ -4139,7 +4139,7 @@
|
|
|
4139
4139
|
"surface": "landing",
|
|
4140
4140
|
"title": "{{productName}} — projects",
|
|
4141
4141
|
"states_read": ["out-map","in-map","in-map-projects","in-map-profile","in-map-kbd","in-map-search","in-map-mine-on","in-table","in-table-by-builders","in-mine","in-manage","in-manage-address","in-manage-planet","in-manage-card","in-manage-look","in-manage-kind","in-manage-invite","in-manage-invite-handoff","in-manage-invite-guild","in-manage-app-live","in-manage-app-building","in-manage-app-failed","in-manage-app-retry","in-manage-app-offer","in-manage-app-connect","in-manage-snag","in-manage-gone","in-manage-missing","out-manage","in-new","in-new-named","in-new-ready","in-new-name-prefilled","in-new-demo","in-new-demo-used","in-new-checks-filled","in-new-checks-entity","in-new-row-code","in-new-row-address","in-new-row-team","in-new-row-extras","in-new-row-rewards","in-new-row-app","in-new-row-run","in-new-row-ship","in-new-look","in-new-look-custom","in-new-create-blocked","in-new-done","in-new-resume-offer","out-new","out-map-projects","card","card-noart","card-self","in-manage-demo","in-mine-dns-pending","in-manage-dns-pending","in-mine-empty","card-floor","card-backdrop","in-google","in-new-done-live","setup-just-created","setup-waiting-on-github","setup-installing","setup-stopped","setup-all-done","setup-cloud-hop-open"],
|
|
4142
|
-
"files_hash": "
|
|
4142
|
+
"files_hash": "e741ab9303262949",
|
|
4143
4143
|
"reading_hash": "b1b60799f9b3f5c8",
|
|
4144
4144
|
"counts": {"lines":687,"placed":239,"shared":23,"unplaced":425},
|
|
4145
4145
|
"omitted": {"data":135},
|
|
@@ -256,20 +256,20 @@ function validateVote({ direction, reasonMd, sectionKey } = {}) {
|
|
|
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
258
|
// | 'not_board_member' | 'bad_cast_via' | <validateVote reason> }
|
|
259
|
-
// `castVia` (task 1005121, government_038) is internal — never read from a request: 'ballot',
|
|
259
|
+
// `castVia` (task 1005121, government_038) is internal — never read from a request: 'ballot', 'stage_close' (genesis-close.js: a founder's confirm given by closing a genesis stage — genesis_stage + yes only, no vote karma), or 'filed' (sole-member.js, task 1005130 / government_039: a board of one's confirm given by filing — constitutional_amendment + yes only, no vote karma).
|
|
260
260
|
// 'anti_self_vote' is GONE as of task 1003273 — an author may cast; what they
|
|
261
261
|
// cannot do is decide alone, which shouldCloseAfterVote and tallyOutcome enforce.
|
|
262
262
|
// A self-cast is recorded and visible but earns no karma (karma_delta: 0).
|
|
263
263
|
async function castVote({ itemId, voterId, direction, reasonMd = null, sectionKey = null, castVia = 'ballot' } = {}) {
|
|
264
264
|
const id = Number(itemId);
|
|
265
265
|
if (!Number.isFinite(id) || id <= 0) return { ok: false, reason: 'item_not_found' };
|
|
266
|
-
if (
|
|
266
|
+
if (!['ballot', 'stage_close', 'filed'].includes(castVia)) return { ok: false, reason: 'bad_cast_via' };
|
|
267
267
|
const v = validateVote({ direction, reasonMd, sectionKey });
|
|
268
268
|
if (!v.ok) return v;
|
|
269
269
|
|
|
270
270
|
const item = await db.getBoardItemForVote(id);
|
|
271
271
|
if (!item) return { ok: false, reason: 'item_not_found' };
|
|
272
|
-
if (castVia
|
|
272
|
+
if (castVia !== 'ballot' && (item.subject_type !== (castVia === 'filed' ? 'constitutional_amendment' : 'genesis_stage') || v.direction !== 'yes')) return { ok: false, reason: 'bad_cast_via' };
|
|
273
273
|
if (item.closed_at) return { ok: false, reason: 'item_closed' };
|
|
274
274
|
// The clock is checked here as well as by the R11 poller: a vote landing in
|
|
275
275
|
// the gap between expiry and the sweep would be a vote after time. The
|
|
@@ -321,7 +321,7 @@ async function castVote({ itemId, voterId, direction, reasonMd = null, sectionKe
|
|
|
321
321
|
}
|
|
322
322
|
// Karma rides the FRESH insert only, and the whole route refused a closed or
|
|
323
323
|
// expired item above, so every paid vote is by construction in-window.
|
|
324
|
-
if (isSelfCast || castVia
|
|
324
|
+
if (isSelfCast || castVia !== 'ballot') {
|
|
325
325
|
return { ok: true, vote: inserted, fresh: true, karma_delta: 0, self_cast: isSelfCast };
|
|
326
326
|
}
|
|
327
327
|
await db.insertVoteKarma({ voterId, itemId: id, delta: VOTE_KARMA_DELTA });
|
|
@@ -906,9 +906,10 @@ async function proposeCharter({
|
|
|
906
906
|
}
|
|
907
907
|
const unchanged = ['membership', 'pass_rule', 'window_minutes', 'close_early_on_full_turnout']
|
|
908
908
|
.every((k) => v.proposal[k] === live[k]);
|
|
909
|
-
|
|
910
|
-
|
|
909
|
+
// task 1005130: a choice that changes nothing SAYS so, and counts as done.
|
|
910
|
+
if (unchanged) return { ok: false, reason: 'no_change', in_force: charter.readCharter(live).name, complete: true, message: charter.alreadyLine(live) };
|
|
911
911
|
const readsAs = charter.readCharter(v.proposal);
|
|
912
|
+
const next = `${readsAs.form === 'custom' ? 'These settings' : `Choosing ${readsAs.name}`} ${charter.whatHappensNext(live)}`;
|
|
912
913
|
const out = await proposeAmendment({
|
|
913
914
|
proposal: v.proposal,
|
|
914
915
|
// The record says in words what was chosen, so the amendment history reads
|
|
@@ -917,7 +918,7 @@ async function proposeCharter({
|
|
|
917
918
|
proposedBy,
|
|
918
919
|
acknowledgeSelfRemoval,
|
|
919
920
|
});
|
|
920
|
-
return out.ok ? { ...out, reads_as: readsAs } : out;
|
|
921
|
+
return out.ok ? { ...out, reads_as: readsAs, what_happens_next: next } : out;
|
|
921
922
|
}
|
|
922
923
|
|
|
923
924
|
// ── who decides what (task 1004529, ADR 0363) ───────────────────────────────
|
|
@@ -67,12 +67,18 @@ function draftBylaws({ charter: rec, preset, prose = {} }) {
|
|
|
67
67
|
// buildAdvice({ answers, prose, headcount, type, laws }) — PURE. `answers` holds only
|
|
68
68
|
// the closed answers the founder actually gave (not "not sure yet", not skipped);
|
|
69
69
|
// `laws` is db.listLaws() rows, so the preset view says which is in force now.
|
|
70
|
-
function buildAdvice({ answers = {}, prose = {}, headcount = 0, type = null, laws = [] } = {}) {
|
|
70
|
+
function buildAdvice({ answers = {}, prose = {}, headcount = 0, type = null, laws = [], board = null } = {}) {
|
|
71
71
|
const rec = recommendedCharter(headcount, type, answers);
|
|
72
72
|
const preset = presets.recommendedPreset(answers);
|
|
73
73
|
const view = presets.presetsView(laws);
|
|
74
|
+
// task 1005130: what is true NOW, before the founder chooses — the form in force,
|
|
75
|
+
// every form saying who decides and what closing takes, and what choosing the
|
|
76
|
+
// recommended one would do (nothing, when it is already in force).
|
|
77
|
+
const forms = board ? charter.charterView(board) : null;
|
|
74
78
|
return {
|
|
75
|
-
|
|
79
|
+
in_force: forms ? forms.in_force : null,
|
|
80
|
+
forms: forms ? forms.forms : null,
|
|
81
|
+
charter: board ? { ...rec, on_choose: charter.choiceOutcome(board, rec.key) } : rec,
|
|
76
82
|
// null when the founder's principles do not point at one — no preset is fine
|
|
77
83
|
preset: preset ? { ...preset, locks: (view.presets.find((p) => p.key === preset.key) || {}).locks || [] } : null,
|
|
78
84
|
preset_in_force: view.current,
|
|
@@ -91,13 +97,14 @@ function recommendedCharter(headcount, type, answers) {
|
|
|
91
97
|
// otherwise the live count of active builders.
|
|
92
98
|
async function charterAdvice({ answers, prose, headcount = null, type = null } = {}, deps = {}) {
|
|
93
99
|
const db = deps.db || require('./db');
|
|
100
|
+
const board = deps.board !== undefined ? deps.board : require('./config').loadGovernmentConfig().board;
|
|
94
101
|
const [count, laws] = await Promise.all([
|
|
95
102
|
headcount != null && Number(headcount) > 0 ? Number(headcount) : db.countActiveBuilders(),
|
|
96
103
|
db.listLaws(),
|
|
97
104
|
]);
|
|
98
105
|
const p = {};
|
|
99
106
|
for (const k of PROSE) if (prose && text(prose[k])) p[k] = text(prose[k]);
|
|
100
|
-
return buildAdvice({ answers, prose: p, headcount: count, type, laws });
|
|
107
|
+
return buildAdvice({ answers, prose: p, headcount: count, type, laws, board });
|
|
101
108
|
}
|
|
102
109
|
|
|
103
110
|
module.exports = { buildAdvice, charterAdvice };
|
|
@@ -123,6 +123,41 @@ const FORMS = freezeAll([
|
|
|
123
123
|
explanation: 'Self-governing teams coordinate under one shared pact. Coming later, for projects with many teams.' },
|
|
124
124
|
]);
|
|
125
125
|
|
|
126
|
+
// ── what a form asks of the founder day to day (task 1005130) ───────────────
|
|
127
|
+
// Owner, 2026-11-07: "I am the monarch" read as "nothing is asked of me", and the
|
|
128
|
+
// project still asked for a vote to close a stage. Monarchy means ONE yes decides,
|
|
129
|
+
// not NO yes is needed. So every form says, beside its name, who decides and what
|
|
130
|
+
// closing something takes — DERIVED from its franchise and pass rule, never written
|
|
131
|
+
// by hand, so it can never disagree with what the board actually runs.
|
|
132
|
+
const WHO_DECIDES = Object.freeze({
|
|
133
|
+
founder: 'You decide.',
|
|
134
|
+
trusted: 'You and the builders who have earned the trusted rank decide together.',
|
|
135
|
+
everyone: 'Every builder on the project decides.',
|
|
136
|
+
council: 'The council you appoint decides.',
|
|
137
|
+
custom: 'The members these settings seat decide.',
|
|
138
|
+
});
|
|
139
|
+
const TO_CLOSE = Object.freeze({
|
|
140
|
+
first_ratifier: 'Each decision takes one yes from one of them.',
|
|
141
|
+
consent: 'Each decision passes unless one of them objects, once they have all voted (or its clock runs out, if one is set).',
|
|
142
|
+
majority: 'Each decision needs a yes from more than half of them.',
|
|
143
|
+
unanimous: 'Each decision needs everyone who votes to agree, and at least one yes.',
|
|
144
|
+
});
|
|
145
|
+
// A board of one: every rule comes down to that one person's vote.
|
|
146
|
+
const TO_CLOSE_FOUNDER = Object.freeze({
|
|
147
|
+
first_ratifier: 'Each decision takes one yes from you.',
|
|
148
|
+
consent: 'Each decision takes your vote: it passes unless you object.',
|
|
149
|
+
majority: 'Each decision takes one yes from you.',
|
|
150
|
+
unanimous: 'Each decision takes one yes from you.',
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// dutyOf(franchise, passRule) → { who_decides, to_close } in plain words.
|
|
154
|
+
function dutyOf(franchise, passRule) {
|
|
155
|
+
const who = WHO_DECIDES[franchise] || WHO_DECIDES.custom;
|
|
156
|
+
const close = (franchise === 'founder' ? TO_CLOSE_FOUNDER : TO_CLOSE)[passRule]
|
|
157
|
+
|| 'This pass rule is not one this version knows; only its clock can close a decision.';
|
|
158
|
+
return { who_decides: who, to_close: close };
|
|
159
|
+
}
|
|
160
|
+
|
|
126
161
|
const CUSTOM_EXPLANATION = 'These settings match no named form of government. They are still the real rules the board runs under.';
|
|
127
162
|
|
|
128
163
|
const byKey = (list, key) => list.find((x) => x.key === key) || null;
|
|
@@ -152,8 +187,8 @@ function readCharter(board) {
|
|
|
152
187
|
const passRule = byKey(PASS_RULE_OPTIONS, b.pass_rule) ? b.pass_rule : 'custom';
|
|
153
188
|
const form = FORMS.find((f) => f.available && f.franchise === franchise && f.pass_rule === passRule);
|
|
154
189
|
return Object.freeze(form
|
|
155
|
-
? { form: form.key, name: form.name, explanation: form.explanation, franchise, pass_rule: passRule }
|
|
156
|
-
: { form: 'custom', name: 'Custom', explanation: CUSTOM_EXPLANATION, franchise, pass_rule: passRule });
|
|
190
|
+
? { form: form.key, name: form.name, explanation: form.explanation, franchise, pass_rule: passRule, ...dutyOf(franchise, passRule) }
|
|
191
|
+
: { form: 'custom', name: 'Custom', explanation: CUSTOM_EXPLANATION, franchise, pass_rule: passRule, ...dutyOf(franchise, passRule) });
|
|
157
192
|
}
|
|
158
193
|
|
|
159
194
|
// Build the WHOLE constitution a charter choice makes, on top of the live one.
|
|
@@ -209,17 +244,62 @@ function buildCharterProposal(liveBoard, { form, franchise, councilRank, passRul
|
|
|
209
244
|
// The whole vocabulary plus what the constitution in force reads as — the
|
|
210
245
|
// payload the genesis charter and legislation stages render from.
|
|
211
246
|
function charterView(liveBoard) {
|
|
247
|
+
const readsAs = readCharter(liveBoard);
|
|
212
248
|
return {
|
|
213
|
-
|
|
249
|
+
// Every form, each saying what it asks day to day, and the one in force marked.
|
|
250
|
+
forms: FORMS.map((f) => (f.available
|
|
251
|
+
? { ...f, ...dutyOf(f.franchise, f.pass_rule), current: f.key === readsAs.form }
|
|
252
|
+
: { ...f, current: false })),
|
|
253
|
+
in_force: inForce(readsAs),
|
|
214
254
|
variables: VARIABLES.map((v) => (
|
|
215
255
|
v.key === 'franchise' ? { ...v, options: FRANCHISE_OPTIONS }
|
|
216
256
|
: v.key === 'pass_rule' ? { ...v, options: PASS_RULE_OPTIONS }
|
|
217
257
|
: v.key === 'trajectory' ? { ...v, options: TRAJECTORIES }
|
|
218
258
|
: v)),
|
|
219
|
-
reads_as:
|
|
259
|
+
reads_as: readsAs,
|
|
220
260
|
};
|
|
221
261
|
}
|
|
222
262
|
|
|
263
|
+
// inForce(readsAs) → what is true NOW, said before the founder chooses (task 1005130):
|
|
264
|
+
// every project opens as Monarchy / BDFL, and a founder should learn that from the
|
|
265
|
+
// platform rather than infer it from a choice that does nothing.
|
|
266
|
+
function inForce(readsAs) {
|
|
267
|
+
const opening = readsAs.form === 'monarchy'
|
|
268
|
+
? ' Every project opens as one, so choosing Monarchy / BDFL changes nothing.'
|
|
269
|
+
: '';
|
|
270
|
+
return Object.freeze({
|
|
271
|
+
form: readsAs.form,
|
|
272
|
+
name: readsAs.name,
|
|
273
|
+
who_decides: readsAs.who_decides,
|
|
274
|
+
to_close: readsAs.to_close,
|
|
275
|
+
line: `This project runs as ${readsAs.name} now.${opening} ${readsAs.who_decides} ${readsAs.to_close}`,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// choiceOutcome(liveBoard, formKey) → what choosing a form would DO, in words: nothing
|
|
280
|
+
// (it is already in force, so this part of the stage is done), or an amendment
|
|
281
|
+
// decided under the government in force — and, when one yes carries it, whose.
|
|
282
|
+
function choiceOutcome(liveBoard, formKey) {
|
|
283
|
+
const now = readCharter(liveBoard);
|
|
284
|
+
const f = byKey(FORMS, formKey);
|
|
285
|
+
if (!f) return null;
|
|
286
|
+
if (now.form === f.key) return Object.freeze({ changes: false, complete: true, line: alreadyLine(liveBoard) });
|
|
287
|
+
return Object.freeze({ changes: true, complete: false, line: `Choosing ${f.name} ${whatHappensNext(liveBoard)}` });
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// whatHappensNext(liveBoard) → the rest of the sentence "Choosing X …": a change is
|
|
291
|
+
// filed as an amendment and decided under the government in force, and who carries it.
|
|
292
|
+
function whatHappensNext(liveBoard) {
|
|
293
|
+
const now = readCharter(liveBoard);
|
|
294
|
+
const oneYes = now.pass_rule === 'first_ratifier';
|
|
295
|
+
const whose = now.franchise === 'founder' ? 'your own one yes applies it' : 'one yes from a member applies it';
|
|
296
|
+
return `is filed as a change to the rules and decided under the government in force (${now.name}). ${oneYes ? `Under it, ${whose}.` : now.to_close}`;
|
|
297
|
+
}
|
|
298
|
+
// alreadyLine(liveBoard) → "You are already a Monarchy / BDFL. Nothing to change…"
|
|
299
|
+
function alreadyLine(liveBoard) {
|
|
300
|
+
return `You are already a ${readCharter(liveBoard).name}. Nothing to change, and this choice is done.`;
|
|
301
|
+
}
|
|
302
|
+
|
|
223
303
|
module.exports = {
|
|
224
304
|
FORMS,
|
|
225
305
|
VARIABLES,
|
|
@@ -227,6 +307,10 @@ module.exports = {
|
|
|
227
307
|
PASS_RULE_OPTIONS,
|
|
228
308
|
TRAJECTORIES,
|
|
229
309
|
readCharter,
|
|
310
|
+
dutyOf,
|
|
311
|
+
choiceOutcome,
|
|
312
|
+
alreadyLine,
|
|
313
|
+
whatHappensNext,
|
|
230
314
|
buildCharterProposal,
|
|
231
315
|
charterView,
|
|
232
316
|
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-- government_039_vote_cast_via_filed.sql — a third way a vote is cast (task 1005130).
|
|
2
|
+
--
|
|
3
|
+
-- A board of ONE under first_ratifier: the board exists only to collect that one
|
|
4
|
+
-- person's yes, so asking them to vote on their own instruction is ceremony, not
|
|
5
|
+
-- governance (owner feedback 2026-11-07; the same ruling task 1005121 shipped for
|
|
6
|
+
-- closing a genesis stage). When that sole member FILES an amendment, their yes is
|
|
7
|
+
-- cast in the same call (sole-member.js) — and, as with a stage close, the record
|
|
8
|
+
-- says HOW it was cast rather than looking like a clicked 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
|
|
12
|
+
-- 'filed' the sole member's confirm given by filing an amendment;
|
|
13
|
+
-- only board.js writes it, only on a
|
|
14
|
+
-- constitutional_amendment item, only yes
|
|
15
|
+
|
|
16
|
+
BEGIN;
|
|
17
|
+
|
|
18
|
+
ALTER TABLE government_board_votes DROP CONSTRAINT IF EXISTS government_board_votes_cast_via_check;
|
|
19
|
+
ALTER TABLE government_board_votes ADD CONSTRAINT government_board_votes_cast_via_check
|
|
20
|
+
CHECK (cast_via IN ('ballot', 'stage_close', 'filed') AND (cast_via = 'ballot' OR direction = 'yes'));
|
|
21
|
+
|
|
22
|
+
COMMIT;
|