@bongos/core 1.20.26 → 1.20.27
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 +78 -33
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +5 -1
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0353-a-hub-invite-is-a-notice-of-the-projects-own-invite.md +1 -1
- package/docs/adr/0355-a-soft-limit-is-a-rule-with-a-reason-and-nobody-enforces-it.md +30 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +103 -3
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +17 -17
- package/docs/copy-registry.json +18 -18
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +61 -59
- package/modules/government/board.js +64 -7
- package/modules/government/charter.js +232 -0
- package/modules/government/routes/government.js +62 -0
- package/modules/hall-ui/public/government.js +11 -0
- package/modules/platform-identity/migrations/platform_identity_028_purge_pre_notice_invites.sql +65 -0
- package/modules/provisioning/planet-physics.js +154 -0
- package/modules/provisioning/provisioning.js +29 -9
- package/modules/provisioning/routes/body-validators.js +25 -7
- package/modules/provisioning/routes/provisioning.js +8 -3
- package/modules/provisioning/screening.js +62 -0
- package/modules/provisioning/soft-limits.js +146 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +14 -0
- package/scripts/gds/run-unit-tests.js +4 -0
- package/src/bongos/route-rank-check.js +3 -0
- package/src/module-api.js +1 -1
- package/tests/government_charter_forms.mjs +283 -0
- package/tests/pending_invite_purge_db.mjs +129 -0
- package/tests/provisioning_planet_physics.mjs +377 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.20.
|
|
6
|
-
"core_contract": "1.20.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.20.27",
|
|
6
|
+
"core_contract": "1.20.27",
|
|
7
|
+
"source_commit": "1fc525416e379b30ced8b97b9999a269eb272392",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-30T19:
|
|
9
|
+
"built_at": "2026-09-30T19:45:22.316Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 561,
|
|
13
13
|
"agent_docs_stubbed": 25,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2655,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3242,
|
|
20
|
+
"tree_sha256": "c65b104e5fd942b276adceaae176a3d833b2fa53daebe3292ac36d278f890c2e",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -327,12 +327,12 @@
|
|
|
327
327
|
{
|
|
328
328
|
"path": "clients/bongos-client/README.md",
|
|
329
329
|
"mode": "0000644",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "8dde50025e6ac0a8e9742455d62495b72c1803b87044455c48b13b95209f59a2"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
334
334
|
"mode": "0000644",
|
|
335
|
-
"sha256": "
|
|
335
|
+
"sha256": "77f3e9375343c45fd538d179928628a7422858ddea7540cc60cfbdfba95a8545"
|
|
336
336
|
},
|
|
337
337
|
{
|
|
338
338
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -342,17 +342,17 @@
|
|
|
342
342
|
{
|
|
343
343
|
"path": "clients/bongos-client/index.cjs",
|
|
344
344
|
"mode": "0000644",
|
|
345
|
-
"sha256": "
|
|
345
|
+
"sha256": "2eea3743862e9ec173c63517b6f79073b25e71aa3cb2d0a2a19ecce95ef78ca0"
|
|
346
346
|
},
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/index.d.ts",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "065abbfa7d625aa5811ae9e6c27101ca5b9c824422a6a74bba22d92e3f5d53ae"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/index.mjs",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "e2714285309adfdb0644e82319363fdcc6fc19ad9f5a2cf0e71e203da8c5e188"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2237,27 +2237,32 @@
|
|
|
2237
2237
|
{
|
|
2238
2238
|
"path": "docs/adr/0353-a-hub-invite-is-a-notice-of-the-projects-own-invite.md",
|
|
2239
2239
|
"mode": "0000644",
|
|
2240
|
-
"sha256": "
|
|
2240
|
+
"sha256": "5c93de4ab1813f7641ec3b33ad620a609a77fbe6fb3cbaffd99b7e6e5f8282fa"
|
|
2241
2241
|
},
|
|
2242
2242
|
{
|
|
2243
2243
|
"path": "docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md",
|
|
2244
2244
|
"mode": "0000644",
|
|
2245
2245
|
"sha256": "962d868c0887244c53b53c58754f7232715a20df6feec694f30cbda707f9e17e"
|
|
2246
2246
|
},
|
|
2247
|
+
{
|
|
2248
|
+
"path": "docs/adr/0355-a-soft-limit-is-a-rule-with-a-reason-and-nobody-enforces-it.md",
|
|
2249
|
+
"mode": "0000644",
|
|
2250
|
+
"sha256": "6ad8ab3bd8bcb4f55575232af651f108e3879a5965f5daaac42ab693d00a1f0a"
|
|
2251
|
+
},
|
|
2247
2252
|
{
|
|
2248
2253
|
"path": "docs/adr/README.md",
|
|
2249
2254
|
"mode": "0000644",
|
|
2250
|
-
"sha256": "
|
|
2255
|
+
"sha256": "8258f16b11aaed9731afca21379b1ae976dc67040d6d35139987e29fd4acd360"
|
|
2251
2256
|
},
|
|
2252
2257
|
{
|
|
2253
2258
|
"path": "docs/api-reference.md",
|
|
2254
2259
|
"mode": "0000644",
|
|
2255
|
-
"sha256": "
|
|
2260
|
+
"sha256": "db03fd5370b7b592769a806607b9cd0880a56b53c64d8909ca24364feeff818e"
|
|
2256
2261
|
},
|
|
2257
2262
|
{
|
|
2258
2263
|
"path": "docs/api/openapi.json",
|
|
2259
2264
|
"mode": "0000644",
|
|
2260
|
-
"sha256": "
|
|
2265
|
+
"sha256": "545342fb2849e012cd5caca28d21659fe076a5158c0a0a4c2ca4a2b34abd34da"
|
|
2261
2266
|
},
|
|
2262
2267
|
{
|
|
2263
2268
|
"path": "docs/architecture.md",
|
|
@@ -2282,12 +2287,12 @@
|
|
|
2282
2287
|
{
|
|
2283
2288
|
"path": "docs/copy-inventory.md",
|
|
2284
2289
|
"mode": "0000644",
|
|
2285
|
-
"sha256": "
|
|
2290
|
+
"sha256": "3e6cb5cc724958b42912c60fa5cfe65cd6bd7baa7697c3b501534506053a5cb6"
|
|
2286
2291
|
},
|
|
2287
2292
|
{
|
|
2288
2293
|
"path": "docs/copy-registry.json",
|
|
2289
2294
|
"mode": "0000644",
|
|
2290
|
-
"sha256": "
|
|
2295
|
+
"sha256": "5eb31ba434dd1afbfe397ed33ae62ea76c51b71eaafca9b693bebfbe800e3b14"
|
|
2291
2296
|
},
|
|
2292
2297
|
{
|
|
2293
2298
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2792,7 +2797,7 @@
|
|
|
2792
2797
|
{
|
|
2793
2798
|
"path": "docs/module-api-changelog.md",
|
|
2794
2799
|
"mode": "0000644",
|
|
2795
|
-
"sha256": "
|
|
2800
|
+
"sha256": "7360408e833d4775efb81a46a20c2b357495e93532e08468fe59766cede1b0ad"
|
|
2796
2801
|
},
|
|
2797
2802
|
{
|
|
2798
2803
|
"path": "docs/modules-contract.md",
|
|
@@ -2882,7 +2887,7 @@
|
|
|
2882
2887
|
{
|
|
2883
2888
|
"path": "docs/page-readings.json",
|
|
2884
2889
|
"mode": "0000644",
|
|
2885
|
-
"sha256": "
|
|
2890
|
+
"sha256": "bed8eb280c3798e7def41bfff4d21ac22e8f16ded6174de18487d54e071af768"
|
|
2886
2891
|
},
|
|
2887
2892
|
{
|
|
2888
2893
|
"path": "docs/project-context.template.md",
|
|
@@ -4527,13 +4532,18 @@
|
|
|
4527
4532
|
{
|
|
4528
4533
|
"path": "modules/government/board.js",
|
|
4529
4534
|
"mode": "0000644",
|
|
4530
|
-
"sha256": "
|
|
4535
|
+
"sha256": "afb73887cf5fa3f2c3b1d963e3fd501b5d2251fe1cbe0b28ca1baacb2690410d"
|
|
4531
4536
|
},
|
|
4532
4537
|
{
|
|
4533
4538
|
"path": "modules/government/catalog.js",
|
|
4534
4539
|
"mode": "0000644",
|
|
4535
4540
|
"sha256": "0559d78f54b4b8a89ac4e6924d6dad4e2693a7e54f943532e83e4ac966868b76"
|
|
4536
4541
|
},
|
|
4542
|
+
{
|
|
4543
|
+
"path": "modules/government/charter.js",
|
|
4544
|
+
"mode": "0000644",
|
|
4545
|
+
"sha256": "5b0707da0b679b6b34bcca6f28354de1f4f1b31bc5255bcbca2b74eec5eaf67c"
|
|
4546
|
+
},
|
|
4537
4547
|
{
|
|
4538
4548
|
"path": "modules/government/config.js",
|
|
4539
4549
|
"mode": "0000644",
|
|
@@ -4717,7 +4727,7 @@
|
|
|
4717
4727
|
{
|
|
4718
4728
|
"path": "modules/government/routes/government.js",
|
|
4719
4729
|
"mode": "0000644",
|
|
4720
|
-
"sha256": "
|
|
4730
|
+
"sha256": "9e98696154986f67d20a6563d71da353359b1acd8af7d29fe98d60973c5856e4"
|
|
4721
4731
|
},
|
|
4722
4732
|
{
|
|
4723
4733
|
"path": "modules/government/routes/rank-sync.js",
|
|
@@ -5237,7 +5247,7 @@
|
|
|
5237
5247
|
{
|
|
5238
5248
|
"path": "modules/hall-ui/public/government.js",
|
|
5239
5249
|
"mode": "0000644",
|
|
5240
|
-
"sha256": "
|
|
5250
|
+
"sha256": "0d584e177a095a53449611feffee2eb9a2a35751154f329e985c8102f7b4fa02"
|
|
5241
5251
|
},
|
|
5242
5252
|
{
|
|
5243
5253
|
"path": "modules/hall-ui/public/government.states.json",
|
|
@@ -7064,6 +7074,11 @@
|
|
|
7064
7074
|
"mode": "0000644",
|
|
7065
7075
|
"sha256": "9b263f91ce6df19640ef8ae413f3eb40cc17589924fdf21256da7647b55631c1"
|
|
7066
7076
|
},
|
|
7077
|
+
{
|
|
7078
|
+
"path": "modules/platform-identity/migrations/platform_identity_028_purge_pre_notice_invites.sql",
|
|
7079
|
+
"mode": "0000644",
|
|
7080
|
+
"sha256": "7af1d5f5deeae675247ace4a796482ce5a606c871d611f90e2dade905b70a5c1"
|
|
7081
|
+
},
|
|
7067
7082
|
{
|
|
7068
7083
|
"path": "modules/platform-identity/module.json",
|
|
7069
7084
|
"mode": "0000644",
|
|
@@ -7444,6 +7459,11 @@
|
|
|
7444
7459
|
"mode": "0000644",
|
|
7445
7460
|
"sha256": "aad8d8e8a641ebcbff9aeeed765e6c1657fa5896dc9cc3e84aa32f6d327b7db2"
|
|
7446
7461
|
},
|
|
7462
|
+
{
|
|
7463
|
+
"path": "modules/provisioning/planet-physics.js",
|
|
7464
|
+
"mode": "0000644",
|
|
7465
|
+
"sha256": "e3b0539fff5af52fc24ea171fb6a7ee537c2952608ab59b59dc20596cfbee045"
|
|
7466
|
+
},
|
|
7447
7467
|
{
|
|
7448
7468
|
"path": "modules/provisioning/pollers/app-liveness.js",
|
|
7449
7469
|
"mode": "0000644",
|
|
@@ -7472,7 +7492,7 @@
|
|
|
7472
7492
|
{
|
|
7473
7493
|
"path": "modules/provisioning/provisioning.js",
|
|
7474
7494
|
"mode": "0000644",
|
|
7475
|
-
"sha256": "
|
|
7495
|
+
"sha256": "f2dd673e30cf17abbfbadd3c0142616a1c40b3b680c865b57db8330933816405"
|
|
7476
7496
|
},
|
|
7477
7497
|
{
|
|
7478
7498
|
"path": "modules/provisioning/public-refusal.js",
|
|
@@ -7507,7 +7527,7 @@
|
|
|
7507
7527
|
{
|
|
7508
7528
|
"path": "modules/provisioning/routes/body-validators.js",
|
|
7509
7529
|
"mode": "0000644",
|
|
7510
|
-
"sha256": "
|
|
7530
|
+
"sha256": "fdb68a0cf1717b861aabfb9d9b843e9cf3cc28dc4c60a58242597c821c4f8fba"
|
|
7511
7531
|
},
|
|
7512
7532
|
{
|
|
7513
7533
|
"path": "modules/provisioning/routes/callback-page.js",
|
|
@@ -7532,7 +7552,7 @@
|
|
|
7532
7552
|
{
|
|
7533
7553
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
7534
7554
|
"mode": "0000644",
|
|
7535
|
-
"sha256": "
|
|
7555
|
+
"sha256": "6269c57fd10238a0660beae9df2ab686ea62a8e777eee04bc64d15e03ca503b0"
|
|
7536
7556
|
},
|
|
7537
7557
|
{
|
|
7538
7558
|
"path": "modules/provisioning/routes/render-standup.js",
|
|
@@ -7544,11 +7564,21 @@
|
|
|
7544
7564
|
"mode": "0000644",
|
|
7545
7565
|
"sha256": "6189883417ca5703c67be2a66c687d8cdf45053ed28d72ac3775f2d3770d1106"
|
|
7546
7566
|
},
|
|
7567
|
+
{
|
|
7568
|
+
"path": "modules/provisioning/screening.js",
|
|
7569
|
+
"mode": "0000644",
|
|
7570
|
+
"sha256": "7c707281978f54483029743268f2280b77f3ebcd12a083dce51f81a1d9cfb963"
|
|
7571
|
+
},
|
|
7547
7572
|
{
|
|
7548
7573
|
"path": "modules/provisioning/seams.js",
|
|
7549
7574
|
"mode": "0000644",
|
|
7550
7575
|
"sha256": "68ba324773bbd9a347ef682c5b1f105b447c6760f24595b8850590ed6d64d78e"
|
|
7551
7576
|
},
|
|
7577
|
+
{
|
|
7578
|
+
"path": "modules/provisioning/soft-limits.js",
|
|
7579
|
+
"mode": "0000644",
|
|
7580
|
+
"sha256": "03991cd9683c3fc2b4a9fda9e359dcd40a1e782800884b33b49b1d6e1fd9637d"
|
|
7581
|
+
},
|
|
7552
7582
|
{
|
|
7553
7583
|
"path": "modules/provisioning/starter-bundles.js",
|
|
7554
7584
|
"mode": "0000644",
|
|
@@ -8932,12 +8962,12 @@
|
|
|
8932
8962
|
{
|
|
8933
8963
|
"path": "package-lock.json",
|
|
8934
8964
|
"mode": "0000644",
|
|
8935
|
-
"sha256": "
|
|
8965
|
+
"sha256": "b4b4420fef73f720a6180d45b5559b38b857fe80181e148715187c5f2c5ec498"
|
|
8936
8966
|
},
|
|
8937
8967
|
{
|
|
8938
8968
|
"path": "package.json",
|
|
8939
8969
|
"mode": "0000644",
|
|
8940
|
-
"sha256": "
|
|
8970
|
+
"sha256": "9c84d9545af388a0db6fed5fe78bf1c71469ffa1e69ea37386281f0c273cd656"
|
|
8941
8971
|
},
|
|
8942
8972
|
{
|
|
8943
8973
|
"path": "public-docs/index.html",
|
|
@@ -8957,7 +8987,7 @@
|
|
|
8957
8987
|
{
|
|
8958
8988
|
"path": "release-notes.json",
|
|
8959
8989
|
"mode": "0000644",
|
|
8960
|
-
"sha256": "
|
|
8990
|
+
"sha256": "f6b10e5e103f5007ef31e7d2f53c95e146a93562f5a5465ea4e85da2baeb3c52"
|
|
8961
8991
|
},
|
|
8962
8992
|
{
|
|
8963
8993
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -10117,7 +10147,7 @@
|
|
|
10117
10147
|
{
|
|
10118
10148
|
"path": "scripts/gds/run-unit-tests.js",
|
|
10119
10149
|
"mode": "0000644",
|
|
10120
|
-
"sha256": "
|
|
10150
|
+
"sha256": "d891a37574626191f7abc01c50a64178a128e4f8b53ceb17ad6ed6d7439bc56e"
|
|
10121
10151
|
},
|
|
10122
10152
|
{
|
|
10123
10153
|
"path": "scripts/gds/runner-drift.js",
|
|
@@ -10927,7 +10957,7 @@
|
|
|
10927
10957
|
{
|
|
10928
10958
|
"path": "src/bongos/route-rank-check.js",
|
|
10929
10959
|
"mode": "0000644",
|
|
10930
|
-
"sha256": "
|
|
10960
|
+
"sha256": "c7809ca26bf270ff260b79bf83f9c7dec27616c375ff8e9db78867a2a26a63eb"
|
|
10931
10961
|
},
|
|
10932
10962
|
{
|
|
10933
10963
|
"path": "src/bongos/routes.js",
|
|
@@ -11072,7 +11102,7 @@
|
|
|
11072
11102
|
{
|
|
11073
11103
|
"path": "src/module-api.js",
|
|
11074
11104
|
"mode": "0000644",
|
|
11075
|
-
"sha256": "
|
|
11105
|
+
"sha256": "b2361eff082828662c898922d47f4968192f852af7fbf5b03365c7624ffbfc55"
|
|
11076
11106
|
},
|
|
11077
11107
|
{
|
|
11078
11108
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12874,6 +12904,11 @@
|
|
|
12874
12904
|
"mode": "0000644",
|
|
12875
12905
|
"sha256": "ba1c95ca55d8d8e256ba03f2543e44cee4272b9652742343617e35cebefe3ab9"
|
|
12876
12906
|
},
|
|
12907
|
+
{
|
|
12908
|
+
"path": "tests/government_charter_forms.mjs",
|
|
12909
|
+
"mode": "0000644",
|
|
12910
|
+
"sha256": "0e6e006ad15a39e34b22793be7c6987a8602690f48b65998da04358fd8be3449"
|
|
12911
|
+
},
|
|
12877
12912
|
{
|
|
12878
12913
|
"path": "tests/government_charter_library.mjs",
|
|
12879
12914
|
"mode": "0000644",
|
|
@@ -14349,6 +14384,11 @@
|
|
|
14349
14384
|
"mode": "0000644",
|
|
14350
14385
|
"sha256": "6c623a5abe9aadf4821ad8ca291fb5d7805a7a5bc874bfc3cd7e51e83de289d2"
|
|
14351
14386
|
},
|
|
14387
|
+
{
|
|
14388
|
+
"path": "tests/pending_invite_purge_db.mjs",
|
|
14389
|
+
"mode": "0000644",
|
|
14390
|
+
"sha256": "afc10a1fa260b41133399037cc7c6b1acdde91f9ffac5d62fa7d84f680138b8b"
|
|
14391
|
+
},
|
|
14352
14392
|
{
|
|
14353
14393
|
"path": "tests/permission_path.mjs",
|
|
14354
14394
|
"mode": "0000644",
|
|
@@ -14754,6 +14794,11 @@
|
|
|
14754
14794
|
"mode": "0000644",
|
|
14755
14795
|
"sha256": "c9fa4aa59e6e47c139277e3c57298ca441180c4d4752ca6994c72678219df8c8"
|
|
14756
14796
|
},
|
|
14797
|
+
{
|
|
14798
|
+
"path": "tests/provisioning_planet_physics.mjs",
|
|
14799
|
+
"mode": "0000644",
|
|
14800
|
+
"sha256": "febbdbf82e7521ef80fb00d48a0a5fa9edf063ec20efbb39ddf59051c5cad4b2"
|
|
14801
|
+
},
|
|
14757
14802
|
{
|
|
14758
14803
|
"path": "tests/provisioning_public_refusal.mjs",
|
|
14759
14804
|
"mode": "0000644",
|
|
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
|
|
|
5
5
|
by hand; it regenerates when the spec changes, so it can never drift from the routes.
|
|
6
6
|
|
|
7
7
|
- API version: **v1** (served at `/api/bongos/v1`)
|
|
8
|
-
-
|
|
8
|
+
- 465 operations across 70 resource groups
|
|
9
9
|
|
|
10
10
|
## Use it from your project
|
|
11
11
|
|
|
@@ -465,6 +465,8 @@ function createClient(opts = {}) {
|
|
|
465
465
|
postGovernmentAssignments: (args) => request("POST", "/government/assignments", { hasBody: true }, args),
|
|
466
466
|
// DELETE /government/assignments/{builderId}/{rankKey} — rank: archon — DELETE /government/assignments/:builderId/:rankKey
|
|
467
467
|
deleteGovernmentAssignmentsBuilderIdRankKey: (args) => request("DELETE", "/government/assignments/{builderId}/{rankKey}", { hasBody: false }, args),
|
|
468
|
+
// POST /government/board/charter — rank: metic+archon — POST /government/board/charter
|
|
469
|
+
postGovernmentBoardCharter: (args) => request("POST", "/government/board/charter", { hasBody: true }, args),
|
|
468
470
|
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
469
471
|
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
470
472
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
@@ -464,6 +464,8 @@ function createClient(opts = {}) {
|
|
|
464
464
|
postGovernmentAssignments: (args) => request("POST", "/government/assignments", { hasBody: true }, args),
|
|
465
465
|
// DELETE /government/assignments/{builderId}/{rankKey} — rank: archon — DELETE /government/assignments/:builderId/:rankKey
|
|
466
466
|
deleteGovernmentAssignmentsBuilderIdRankKey: (args) => request("DELETE", "/government/assignments/{builderId}/{rankKey}", { hasBody: false }, args),
|
|
467
|
+
// POST /government/board/charter — rank: metic+archon — POST /government/board/charter
|
|
468
|
+
postGovernmentBoardCharter: (args) => request("POST", "/government/board/charter", { hasBody: true }, args),
|
|
467
469
|
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
468
470
|
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
469
471
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
@@ -219,7 +219,7 @@ export interface PatchProjectsIdFeaturedResponse { project: unknown }
|
|
|
219
219
|
export interface PatchProjectsIdStatusRequest { status: string }
|
|
220
220
|
export interface PatchProjectsIdStatusResponse { project: unknown }
|
|
221
221
|
export interface PatchProvisioningInstancesIdDetailRequest { description?: string; detail?: Record<string, unknown>; modules?: string[]; type?: string }
|
|
222
|
-
export interface PatchProvisioningInstancesIdDetailResponse { ok: boolean; description: unknown; detail: unknown; options: unknown; publish: unknown; modules: unknown; type: unknown }
|
|
222
|
+
export interface PatchProvisioningInstancesIdDetailResponse { ok: boolean; description: unknown; detail: unknown; options: unknown; soft_limits: unknown; publish: unknown; modules: unknown; type: unknown }
|
|
223
223
|
export interface PatchProvisioningInstancesIdEnvManifestVarIdRequest { name?: string; description?: string; environments?: unknown[]; required?: boolean }
|
|
224
224
|
export interface PatchProvisioningInstancesIdEnvManifestVarIdResponse { ok: boolean; env_var: unknown; values_held: boolean }
|
|
225
225
|
export interface PatchProvisioningInstancesIdSettingsResponse { ok: boolean; saved: unknown; planet: unknown; push: unknown }
|
|
@@ -330,6 +330,8 @@ export interface PostGoalsReorderResponse { ok: boolean; goals: unknown }
|
|
|
330
330
|
export interface PostGoalsRequest { version_id: string; title: string; subtitle?: string; description?: string; scope_modules?: string[]; succeeds_goal_id?: number; category_id?: number; admit_reason?: string }
|
|
331
331
|
export interface PostGoalsResponse { ok: boolean; goal: unknown; succeeds_goal_id: unknown; category_advisory: unknown; admitted: unknown }
|
|
332
332
|
export interface PostGovernmentAssignmentsRequest { builder_id: number; rank_key: string }
|
|
333
|
+
export interface PostGovernmentBoardCharterRequest { form?: string; franchise?: string; council_rank?: string; pass_rule?: string; rationale_md?: string; acknowledge_self_removal?: boolean }
|
|
334
|
+
export interface PostGovernmentBoardCharterResponse { ok: boolean; amendment: unknown; item: unknown; reads_as: unknown }
|
|
333
335
|
export interface PostGovernmentBoardItemsItemIdVotesRequest { direction: string; reason_md?: string; section_key?: string }
|
|
334
336
|
export interface PostGovernmentBoardItemsRequest { subject_type: string; proposal: Record<string, unknown>; rationale_md?: string; acknowledge_self_removal?: boolean }
|
|
335
337
|
export interface PostGovernmentBoardItemsResponse { ok: boolean; amendment: unknown; item: unknown }
|
|
@@ -894,6 +896,8 @@ export interface BongosClient {
|
|
|
894
896
|
postGovernmentAssignments(args: RequestArgs & { body: PostGovernmentAssignmentsRequest }): Promise<ApiResponse>;
|
|
895
897
|
/** DELETE /government/assignments/{builderId}/{rankKey} — rank: archon */
|
|
896
898
|
deleteGovernmentAssignmentsBuilderIdRankKey(args?: RequestArgs): Promise<DeleteGovernmentAssignmentsBuilderIdRankKeyResponse>;
|
|
899
|
+
/** POST /government/board/charter — rank: metic+archon */
|
|
900
|
+
postGovernmentBoardCharter(args?: RequestArgs & { body?: PostGovernmentBoardCharterRequest }): Promise<PostGovernmentBoardCharterResponse>;
|
|
897
901
|
/** GET /government/board/genesis-stages — rank: any-builder */
|
|
898
902
|
getGovernmentBoardGenesisStages(args?: RequestArgs): Promise<ApiResponse>;
|
|
899
903
|
/** GET /government/board/items — rank: any-builder */
|
|
@@ -461,6 +461,8 @@ export function createClient(opts = {}) {
|
|
|
461
461
|
postGovernmentAssignments: (args) => request("POST", "/government/assignments", { hasBody: true }, args),
|
|
462
462
|
// DELETE /government/assignments/{builderId}/{rankKey} — rank: archon — DELETE /government/assignments/:builderId/:rankKey
|
|
463
463
|
deleteGovernmentAssignmentsBuilderIdRankKey: (args) => request("DELETE", "/government/assignments/{builderId}/{rankKey}", { hasBody: false }, args),
|
|
464
|
+
// POST /government/board/charter — rank: metic+archon — POST /government/board/charter
|
|
465
|
+
postGovernmentBoardCharter: (args) => request("POST", "/government/board/charter", { hasBody: true }, args),
|
|
464
466
|
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
465
467
|
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
466
468
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
@@ -55,7 +55,7 @@ The two notice routes are **new**. An older hub answers 404, the sender swallows
|
|
|
55
55
|
## Consequences
|
|
56
56
|
|
|
57
57
|
- **The done-when holds for every invite created from now on.** A hub notice exists only because the project wrote an `invited` row, and a rescind that closes the door removes the notice. The hub's own invite creates no row at all.
|
|
58
|
-
- **Rows written before this change are untouched.** Pending rows the old hub invite wrote still render as **Open project →**, and on a door other than `open` they still lead to the project's gate. The invitee can decline them, and the project can clear one by inviting and then rescinding. Deleting them at deploy would need a data migration, and it would also delete notices that do work (on `open` doors). That is left to the owner (see the task's handoff), not done silently here.
|
|
58
|
+
- **Rows written before this change are untouched.** Pending rows the old hub invite wrote still render as **Open project →**, and on a door other than `open` they still lead to the project's gate. The invitee can decline them, and the project can clear one by inviting and then rescinding. Deleting them at deploy would need a data migration, and it would also delete notices that do work (on `open` doors). That is left to the owner (see the task's handoff), not done silently here. **Amended (task 1004408):** the owner chose to delete them. Migration `<redacted>` deletes every `pending` row older than the hub's first upgrade to core 1.20.22 (the first release carrying this ADR), read from the `core_upgrades` ledger, or every `pending` row if there is no such upgrade. Old rows on `open` doors go too; those invitees can still sign in to the project, and the inviter can re-invite from the project's hall. Proof: `tests/pending_invite_purge_db.mjs`.
|
|
59
59
|
- **The hub's invite now reaches people with no platform account.** The project's own invite takes any GitHub login, so the old `account_not_found` refusal is gone. Such an invitee sees no hub notice, because there is no account to show it to, but they are admitted when they sign in.
|
|
60
60
|
- **Three things still bypass the notice**, all by scope: the reviewer queue's approve (`PATCH` pending → invited), the Discord approval reaction, and R3's future recruiter rescind route. The first two are approvals of an application the applicant already knows about. R3 (task 1002815) must call the same port when it adds its rescind.
|
|
61
61
|
- **The 30-day invite expiry** (task 1002969) is read-time on the instance. An expired invite's hub notice stays until the invitee declines it or the project re-invites and rescinds. Task 1002969 owns closing that.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# ADR 0355 — A soft limit is a rule with a reason, and nobody enforces it
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-09-30
|
|
5
|
+
- **Task:** [task 1004416](https://cloudbongos.com/builders#/task/1004416) (BV2.PS02, goal 1000121)
|
|
6
|
+
- **Interacts with:** [ADR 0239](0239-a-recommendation-is-a-table-that-carries-its-own-reason.md) (a recommendation is a table that carries its own reason), the spec [`docs/specs/<redacted>.md`](../specs/<redacted>.md) decision D6
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
The new startup flow asks seven "planet physics" questions before any technical setup: state, geography, ages, entity, builders, rewards and framing. The answers carry legal weight. An individual has no shares to give, cash payouts to EU builders are not available yet, and 13 to 15 year olds join non-monetary tracks only. Spec decision D6 says the flow should grey or hide options that clearly do not apply, each with a line saying why. It also says nothing enforces these limits yet, and no screen may claim otherwise.
|
|
11
|
+
|
|
12
|
+
The flow also needs a stop screen: a project whose description is something Cloud Bongos will not help build is stopped before anything is created. The real classifier is out of scope.
|
|
13
|
+
|
|
14
|
+
## Decision
|
|
15
|
+
|
|
16
|
+
**D1: The answers are more `detail` keys.** They ride the provisioning `detail` jsonb under the same contract as `team_shape`: no defaults, an unknown value refused loudly at the route, and `null` to un-answer. Two new kinds of question join the closed single answer. A `many` question takes a list of members, stored de-duplicated in the vocabulary's order. A `count` question takes a whole number in a range. `PROJECT_DETAIL_QUESTIONS` is the whole contract. `PROJECT_DETAIL_VOCAB` stays the closed answer lists, so every existing reader and the `options` reply keep their shape. The country is a closed ISO 3166-1 list rather than a two-letter pattern, so a typo like `ZZ` is refused instead of stored.
|
|
17
|
+
|
|
18
|
+
**D2: Answers must agree only within one request.** The main kind of work must be one of the existing kinds, and the region must be inside the country, when both arrive in the same body. A merge patch may change one half now and the other later, and refusing a write because it disagrees with a stored answer would make the order of edits matter.
|
|
19
|
+
|
|
20
|
+
**D3: The soft limits are one declarative table, and every resolution says `enforced: false`.** Each rule has a `when` (data, never a function), the options it names, an effect (`hide`, `grey` or `note`) and an owner-facing reason. Because conditions are data, a test can check every rule against the vocabulary, and a browser could evaluate the same table. An unanswered key never matches, so no rule fires on an answer nobody gave. `note` exists because some options apply only in part: cash is still available to builders outside the EU, so greying it would be wrong. The resolution rides every owner read of a project and the `PATCH …/detail` reply. A test fails any reason worded as if the limit were enforced.
|
|
21
|
+
|
|
22
|
+
**D4: Screening is a seam with a deliberately small rule set.** `screenProject(texts, rules)` takes the project's own words and returns `{ stop }`. The real classifier replaces the rules or the function body, and no caller changes. A keyword rule that stops an honest project is worse than one that misses a bad one, so each rule names something no legitimate project is built to be. An `unless` lets a defensive project through (a ransomware detector, a phishing-awareness course). A stop is a 422 `screened_out` with the canvas's own sentence. Nothing in the reply names the rule, because a gate that says which rule it tripped teaches a caller how to reword around it. Whoever answers "contact us" reads the description itself.
|
|
23
|
+
|
|
24
|
+
**D5: The screen runs on the edit route too.** The stop happens on create before any row or intent exists. `PATCH …/detail` screens a new description as well. Otherwise a project could be created with no description and given the stopped one straight afterwards.
|
|
25
|
+
|
|
26
|
+
## Consequences
|
|
27
|
+
|
|
28
|
+
- No migration: `detail` is a dumb jsonb store, so new questions cost none.
|
|
29
|
+
- The age tiers and payout geography are stored facts, not policy. Server-side enforcement is a later goal, and it will read these keys.
|
|
30
|
+
- The screen's false positives are the risk to watch. Until the classifier exists, a rule should be added only when it cannot plausibly describe an honest project.
|
package/docs/adr/README.md
CHANGED
|
@@ -473,3 +473,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
|
|
|
473
473
|
| 0352 | [**A rollup report carries its "as of" in a header, and the hub keeps the newest** ([task 1004268](https://cloudbongos.com/builders#/task/1004268), goal 1000110). `POST /sso/activity/rollup` was last-writer-wins with no report timestamp, so a sign-in push read earlier and a ship push read later could land the older totals last. **D1:** the instance's read time rides a `Bongos-Report-As-Of` HEADER, not a body field, because the hub validates the body strictly and hub and instances upgrade independently: a body field from a newer instance would 400 on an older hub and lose the report, while an unknown header is ignored. **D2:** missing or unparseable = unstamped = last-writer-wins, never a 400. **D3:** the guard is a WHERE on the upsert's conflict branch (migration 026, `reported_as_of`, no backfill); a skipped update keeps the row lock, so the task 1004244 snapshot stays in step. **D4:** the stamp is compared only with the same client's, and clamped to the hub's `now()`.](0352-a-rollup-report-carries-its-as-of-in-a-header.md) | platform identity / federation |
|
|
474
474
|
| 0353 | [**A hub invite is a notice of the project's own invite, and signing in accepts it** ([task 1002818](https://cloudbongos.com/builders#/task/1002818), goal 1000110 — R6 of the admin console wave). The hub's own invite wrote a `pending` membership that no project reads, so an "accepted" invite met a locked door (new projects default to `apply`). **D1:** that row is now a NOTICE the PROJECT writes: its invite route calls `POST /sso/invites/notify` and a dismissal that leaves no invited row calls `/sso/invites/clear` (client credentials, pending rows only, always `{ ok: true }` so no account oracle); core's `notifyHubOfInvite` is fire-and-forget. **D2:** the hub-side accept route is deleted; signing in to the project accepts, and the hub's own sign-in witness turns the row into a membership. **D3 (owner):** `POST /projects/invite` writes nothing and answers `{ invited: false, invite_url }`, the project's hall invite link (`/builders/watch?invite=<login>`, which only pre-fills); the signed-assertion relay is deferred. **D4:** new routes, so an older hub 404s and only the notice is lost (ADR 0352).](0353-a-hub-invite-is-a-notice-of-the-projects-own-invite.md) | platform identity / federation |
|
|
475
475
|
| 0354 | [**A builder hosts one project for free, and more takes the fleet permission** ([task 1004412](https://cloudbongos.com/builders#/task/1004412), goal 1000106 — working area 1, the owner's ruling of 2026-09-30). The create wizard always asks for `cloud-host`, which task 1003370 had gated behind `provisioning.fleet.manage`, so every new (Xenos) user was refused at "Create my project" — against ADR 0345 decision 1. **D1:** a builder's first live `cloud-host` project needs no permission; a further one needs the fleet permission (a retry of your own slug is the same project; only `torn_down` frees the place; an unreadable count refuses). **D2:** one first-free request per builder at a time (409 `create_in_progress`), held as a Postgres advisory lock so it holds across processes. **D3:** the wizard states `permission_forbidden` and `box_full` in plain words. Nothing yet caps a hosted project's memory.](0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md) | provisioning / security / project creation |
|
|
476
|
+
| 0355 | [**A soft limit is a rule with a reason, and nobody enforces it** ([task 1004416](https://cloudbongos.com/builders#/task/1004416), goal 1000121 — BV2.PS02). The startup flow's seven planet-physics answers and what they rule out. **D1:** the answers are more provisioning `detail` keys under `team_shape`'s contract (no defaults, refused loudly, `null` un-answers), with two new kinds — a list (`many`) and a whole number (`count`); the country is a closed ISO list. **D2:** answers must agree only within one request, so a merge patch's edit order never matters. **D3:** one declarative soft-limit table (`soft-limits.js`) — data conditions, `hide`/`grey`/`note`, a reason on every rule — and every resolution says `enforced: false`. **D4:** screening is a seam (`screening.js`) with a deliberately small rule set; a stop is 422 `screened_out` before anything exists. **D5:** the edit route screens a new description too.](0355-a-soft-limit-is-a-rule-with-a-reason-and-nobody-enforces-it.md) | provisioning / project startup |
|
package/docs/api/openapi.json
CHANGED
|
@@ -7898,6 +7898,58 @@
|
|
|
7898
7898
|
]
|
|
7899
7899
|
}
|
|
7900
7900
|
},
|
|
7901
|
+
"/government/board/charter": {
|
|
7902
|
+
"post": {
|
|
7903
|
+
"operationId": "post_government_board_charter",
|
|
7904
|
+
"tags": [
|
|
7905
|
+
"government"
|
|
7906
|
+
],
|
|
7907
|
+
"summary": "POST /government/board/charter",
|
|
7908
|
+
"description": "board.item.open — the genesis charter + legislation choice (task 1004427, spec D10): a form of government and/or its two live settings (franchise, pass rule), built into a whole constitution on top of the live one and filed through the SAME amendment path as the route above — the same atom, the same strict validation, the same self-removal guard. Nothing here changes the constitution; the sitting it opens is what decides.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `board.item.open` (all required).",
|
|
7909
|
+
"x-rank": "metic+archon",
|
|
7910
|
+
"x-source": "modules/government/routes/government.js",
|
|
7911
|
+
"x-permissions": [
|
|
7912
|
+
"board.item.open"
|
|
7913
|
+
],
|
|
7914
|
+
"requestBody": {
|
|
7915
|
+
"required": false,
|
|
7916
|
+
"content": {
|
|
7917
|
+
"application/json": {
|
|
7918
|
+
"schema": {
|
|
7919
|
+
"$ref": "#/components/schemas/PostGovernmentBoardCharterRequest"
|
|
7920
|
+
}
|
|
7921
|
+
}
|
|
7922
|
+
},
|
|
7923
|
+
"x-validated": true
|
|
7924
|
+
},
|
|
7925
|
+
"responses": {
|
|
7926
|
+
"200": {
|
|
7927
|
+
"description": "Success.",
|
|
7928
|
+
"content": {
|
|
7929
|
+
"application/json": {
|
|
7930
|
+
"schema": {
|
|
7931
|
+
"$ref": "#/components/schemas/PostGovernmentBoardCharterResponse"
|
|
7932
|
+
}
|
|
7933
|
+
}
|
|
7934
|
+
}
|
|
7935
|
+
},
|
|
7936
|
+
"400": {
|
|
7937
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
7938
|
+
},
|
|
7939
|
+
"401": {
|
|
7940
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
7941
|
+
},
|
|
7942
|
+
"403": {
|
|
7943
|
+
"$ref": "#/components/responses/Forbidden"
|
|
7944
|
+
}
|
|
7945
|
+
},
|
|
7946
|
+
"security": [
|
|
7947
|
+
{
|
|
7948
|
+
"builderSession": []
|
|
7949
|
+
}
|
|
7950
|
+
]
|
|
7951
|
+
}
|
|
7952
|
+
},
|
|
7901
7953
|
"/government/board/genesis-stages": {
|
|
7902
7954
|
"get": {
|
|
7903
7955
|
"operationId": "get_government_board_genesis_stages",
|
|
@@ -24576,6 +24628,7 @@
|
|
|
24576
24628
|
"description": {},
|
|
24577
24629
|
"detail": {},
|
|
24578
24630
|
"options": {},
|
|
24631
|
+
"soft_limits": {},
|
|
24579
24632
|
"publish": {},
|
|
24580
24633
|
"modules": {},
|
|
24581
24634
|
"type": {}
|
|
@@ -24585,6 +24638,7 @@
|
|
|
24585
24638
|
"description",
|
|
24586
24639
|
"detail",
|
|
24587
24640
|
"options",
|
|
24641
|
+
"soft_limits",
|
|
24588
24642
|
"publish",
|
|
24589
24643
|
"modules",
|
|
24590
24644
|
"type"
|
|
@@ -26511,6 +26565,52 @@
|
|
|
26511
26565
|
],
|
|
26512
26566
|
"additionalProperties": false
|
|
26513
26567
|
},
|
|
26568
|
+
"PostGovernmentBoardCharterRequest": {
|
|
26569
|
+
"type": "object",
|
|
26570
|
+
"properties": {
|
|
26571
|
+
"form": {
|
|
26572
|
+
"type": "string",
|
|
26573
|
+
"maxLength": 64
|
|
26574
|
+
},
|
|
26575
|
+
"franchise": {
|
|
26576
|
+
"type": "string",
|
|
26577
|
+
"maxLength": 32
|
|
26578
|
+
},
|
|
26579
|
+
"council_rank": {
|
|
26580
|
+
"type": "string",
|
|
26581
|
+
"maxLength": 64
|
|
26582
|
+
},
|
|
26583
|
+
"pass_rule": {
|
|
26584
|
+
"type": "string",
|
|
26585
|
+
"maxLength": 32
|
|
26586
|
+
},
|
|
26587
|
+
"rationale_md": {
|
|
26588
|
+
"type": "string",
|
|
26589
|
+
"maxLength": 5000
|
|
26590
|
+
},
|
|
26591
|
+
"acknowledge_self_removal": {
|
|
26592
|
+
"type": "boolean"
|
|
26593
|
+
}
|
|
26594
|
+
},
|
|
26595
|
+
"additionalProperties": false
|
|
26596
|
+
},
|
|
26597
|
+
"PostGovernmentBoardCharterResponse": {
|
|
26598
|
+
"type": "object",
|
|
26599
|
+
"properties": {
|
|
26600
|
+
"ok": {
|
|
26601
|
+
"type": "boolean"
|
|
26602
|
+
},
|
|
26603
|
+
"amendment": {},
|
|
26604
|
+
"item": {},
|
|
26605
|
+
"reads_as": {}
|
|
26606
|
+
},
|
|
26607
|
+
"required": [
|
|
26608
|
+
"ok",
|
|
26609
|
+
"amendment",
|
|
26610
|
+
"item",
|
|
26611
|
+
"reads_as"
|
|
26612
|
+
]
|
|
26613
|
+
},
|
|
26514
26614
|
"PostGovernmentBoardItemsItemIdVotesRequest": {
|
|
26515
26615
|
"type": "object",
|
|
26516
26616
|
"properties": {
|
|
@@ -29663,9 +29763,9 @@
|
|
|
29663
29763
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
29664
29764
|
}
|
|
29665
29765
|
},
|
|
29666
|
-
"x-endpoint-count":
|
|
29667
|
-
"x-schema-count":
|
|
29766
|
+
"x-endpoint-count": 465,
|
|
29767
|
+
"x-schema-count": 498,
|
|
29668
29768
|
"x-undocumented-bodies": 12,
|
|
29669
|
-
"x-response-schemas":
|
|
29769
|
+
"x-response-schemas": 337,
|
|
29670
29770
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
29671
29771
|
}
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Bongos API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 465 endpoints across 83 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -310,13 +310,14 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
310
310
|
| GET | `/api/bongos/goals/rollups` | `any-builder` | — | GET /goals/rollups?version= — one small row per goal: readiness counters, the last-activity timestamp, the craft set, and the next claima… |
|
|
311
311
|
| GET | `/api/bongos/goals/suggestions` | `any-builder` | — | GET /goals/suggestions — "which goal should this draft live in?", answered before anything is created (task 1003062 / R07). |
|
|
312
312
|
|
|
313
|
-
## `government` (
|
|
313
|
+
## `government` (15)
|
|
314
314
|
|
|
315
315
|
| Method | Path | Rank | Body | Description |
|
|
316
316
|
|---|---|---|---|---|
|
|
317
317
|
| GET | `/api/bongos/government/assignments` | `archon` | — | government.manage — every builder↔rank assignment row. |
|
|
318
318
|
| POST | `/api/bongos/government/assignments` | `archon` | `builder_id`, `rank_key` | government.manage — assign a CUSTOM rank to a builder. |
|
|
319
319
|
| DELETE | `/api/bongos/government/assignments/:builderId/:rankKey` | `archon` | — | government.manage — remove a custom-rank assignment. |
|
|
320
|
+
| POST | `/api/bongos/government/board/charter` | `metic+archon` | `form`, `franchise`, `council_rank`, `pass_rule`, `rationale_md`, `acknowledge_self_removal` | board.item.open — the genesis charter + legislation choice (task 1004427, spec D10): a form of government and/or its two live settings (f… |
|
|
320
321
|
| GET | `/api/bongos/government/board/genesis-stages` | `any-builder` | — | board.vote.cast — the founding band's read (task 1004429): each genesis stage's latest sitting, and who it is still waiting on under the … |
|
|
321
322
|
| GET | `/api/bongos/government/board/items` | `any-builder` | — | board.vote.cast — the Board Room view: open items with their clock, the OPEN BALLOT, the closed history (R16 of goal 1000069). |
|
|
322
323
|
| POST | `/api/bongos/government/board/items` | `metic+archon` | `subject_type`, `proposal`, `rationale_md`, `acknowledge_self_removal` | board.item.open — put an AMENDMENT to the board (R14 of goal 1000069, ADR 0175 §7). |
|