@bongos/core 1.20.25 → 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 +92 -37
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +7 -1
- package/clients/bongos-client/index.mjs +4 -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 +137 -3
- package/docs/api-reference.md +4 -2
- package/docs/copy-inventory.md +34 -34
- package/docs/copy-registry.json +38 -38
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +75 -73
- package/modules/discord/board-broadcast.js +1 -0
- package/modules/government/board.js +261 -2
- package/modules/government/charter.js +232 -0
- package/modules/government/db.js +42 -1
- package/modules/government/migrations/government_020_genesis_stage_subject.sql +55 -0
- package/modules/government/routes/government.js +82 -0
- package/modules/hall-ui/public/board-room.js +5 -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 +20 -0
- package/scripts/gds/run-unit-tests.js +4 -0
- package/src/bongos/route-rank-check.js +6 -0
- package/src/module-api.js +1 -1
- package/tests/government_board_genesis_stage.mjs +305 -0
- package/tests/government_charter_forms.mjs +283 -0
- package/tests/government_seed.mjs +1 -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-
|
|
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",
|
|
@@ -4317,7 +4322,7 @@
|
|
|
4317
4322
|
{
|
|
4318
4323
|
"path": "modules/discord/board-broadcast.js",
|
|
4319
4324
|
"mode": "0000644",
|
|
4320
|
-
"sha256": "
|
|
4325
|
+
"sha256": "55ebb3d10844b33e0984e553b87ee06abdc59a0684b555da462d4842155e8445"
|
|
4321
4326
|
},
|
|
4322
4327
|
{
|
|
4323
4328
|
"path": "modules/discord/bug-attachments.js",
|
|
@@ -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",
|
|
@@ -4542,7 +4552,7 @@
|
|
|
4542
4552
|
{
|
|
4543
4553
|
"path": "modules/government/db.js",
|
|
4544
4554
|
"mode": "0000644",
|
|
4545
|
-
"sha256": "
|
|
4555
|
+
"sha256": "1eb2e506878c52aa70fdc6b75b9a392dcb29d71617685f8efd58974b9fd92ae9"
|
|
4546
4556
|
},
|
|
4547
4557
|
{
|
|
4548
4558
|
"path": "modules/government/membership-predicate.js",
|
|
@@ -4679,6 +4689,11 @@
|
|
|
4679
4689
|
"mode": "0000644",
|
|
4680
4690
|
"sha256": "d267905e59cfcfa313c9f723d69bdf309d21490dc2ca9fae43422d087720470d"
|
|
4681
4691
|
},
|
|
4692
|
+
{
|
|
4693
|
+
"path": "modules/government/migrations/government_020_genesis_stage_subject.sql",
|
|
4694
|
+
"mode": "0000644",
|
|
4695
|
+
"sha256": "6eabf8b78f84922a44bdcfacf9e5dd4c2c5ead593b81125c2cc9ca8f13f844d9"
|
|
4696
|
+
},
|
|
4682
4697
|
{
|
|
4683
4698
|
"path": "modules/government/module.json",
|
|
4684
4699
|
"mode": "0000644",
|
|
@@ -4712,7 +4727,7 @@
|
|
|
4712
4727
|
{
|
|
4713
4728
|
"path": "modules/government/routes/government.js",
|
|
4714
4729
|
"mode": "0000644",
|
|
4715
|
-
"sha256": "
|
|
4730
|
+
"sha256": "9e98696154986f67d20a6563d71da353359b1acd8af7d29fe98d60973c5856e4"
|
|
4716
4731
|
},
|
|
4717
4732
|
{
|
|
4718
4733
|
"path": "modules/government/routes/rank-sync.js",
|
|
@@ -4952,7 +4967,7 @@
|
|
|
4952
4967
|
{
|
|
4953
4968
|
"path": "modules/hall-ui/public/board-room.js",
|
|
4954
4969
|
"mode": "0000644",
|
|
4955
|
-
"sha256": "
|
|
4970
|
+
"sha256": "8eb8c988b6cbdd59151f10593c3b751eac95ec2f73be198c52145d6bb934aefc"
|
|
4956
4971
|
},
|
|
4957
4972
|
{
|
|
4958
4973
|
"path": "modules/hall-ui/public/board-room.states.json",
|
|
@@ -5232,7 +5247,7 @@
|
|
|
5232
5247
|
{
|
|
5233
5248
|
"path": "modules/hall-ui/public/government.js",
|
|
5234
5249
|
"mode": "0000644",
|
|
5235
|
-
"sha256": "
|
|
5250
|
+
"sha256": "0d584e177a095a53449611feffee2eb9a2a35751154f329e985c8102f7b4fa02"
|
|
5236
5251
|
},
|
|
5237
5252
|
{
|
|
5238
5253
|
"path": "modules/hall-ui/public/government.states.json",
|
|
@@ -7059,6 +7074,11 @@
|
|
|
7059
7074
|
"mode": "0000644",
|
|
7060
7075
|
"sha256": "9b263f91ce6df19640ef8ae413f3eb40cc17589924fdf21256da7647b55631c1"
|
|
7061
7076
|
},
|
|
7077
|
+
{
|
|
7078
|
+
"path": "modules/platform-identity/migrations/platform_identity_028_purge_pre_notice_invites.sql",
|
|
7079
|
+
"mode": "0000644",
|
|
7080
|
+
"sha256": "7af1d5f5deeae675247ace4a796482ce5a606c871d611f90e2dade905b70a5c1"
|
|
7081
|
+
},
|
|
7062
7082
|
{
|
|
7063
7083
|
"path": "modules/platform-identity/module.json",
|
|
7064
7084
|
"mode": "0000644",
|
|
@@ -7439,6 +7459,11 @@
|
|
|
7439
7459
|
"mode": "0000644",
|
|
7440
7460
|
"sha256": "aad8d8e8a641ebcbff9aeeed765e6c1657fa5896dc9cc3e84aa32f6d327b7db2"
|
|
7441
7461
|
},
|
|
7462
|
+
{
|
|
7463
|
+
"path": "modules/provisioning/planet-physics.js",
|
|
7464
|
+
"mode": "0000644",
|
|
7465
|
+
"sha256": "e3b0539fff5af52fc24ea171fb6a7ee537c2952608ab59b59dc20596cfbee045"
|
|
7466
|
+
},
|
|
7442
7467
|
{
|
|
7443
7468
|
"path": "modules/provisioning/pollers/app-liveness.js",
|
|
7444
7469
|
"mode": "0000644",
|
|
@@ -7467,7 +7492,7 @@
|
|
|
7467
7492
|
{
|
|
7468
7493
|
"path": "modules/provisioning/provisioning.js",
|
|
7469
7494
|
"mode": "0000644",
|
|
7470
|
-
"sha256": "
|
|
7495
|
+
"sha256": "f2dd673e30cf17abbfbadd3c0142616a1c40b3b680c865b57db8330933816405"
|
|
7471
7496
|
},
|
|
7472
7497
|
{
|
|
7473
7498
|
"path": "modules/provisioning/public-refusal.js",
|
|
@@ -7502,7 +7527,7 @@
|
|
|
7502
7527
|
{
|
|
7503
7528
|
"path": "modules/provisioning/routes/body-validators.js",
|
|
7504
7529
|
"mode": "0000644",
|
|
7505
|
-
"sha256": "
|
|
7530
|
+
"sha256": "fdb68a0cf1717b861aabfb9d9b843e9cf3cc28dc4c60a58242597c821c4f8fba"
|
|
7506
7531
|
},
|
|
7507
7532
|
{
|
|
7508
7533
|
"path": "modules/provisioning/routes/callback-page.js",
|
|
@@ -7527,7 +7552,7 @@
|
|
|
7527
7552
|
{
|
|
7528
7553
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
7529
7554
|
"mode": "0000644",
|
|
7530
|
-
"sha256": "
|
|
7555
|
+
"sha256": "6269c57fd10238a0660beae9df2ab686ea62a8e777eee04bc64d15e03ca503b0"
|
|
7531
7556
|
},
|
|
7532
7557
|
{
|
|
7533
7558
|
"path": "modules/provisioning/routes/render-standup.js",
|
|
@@ -7539,11 +7564,21 @@
|
|
|
7539
7564
|
"mode": "0000644",
|
|
7540
7565
|
"sha256": "6189883417ca5703c67be2a66c687d8cdf45053ed28d72ac3775f2d3770d1106"
|
|
7541
7566
|
},
|
|
7567
|
+
{
|
|
7568
|
+
"path": "modules/provisioning/screening.js",
|
|
7569
|
+
"mode": "0000644",
|
|
7570
|
+
"sha256": "7c707281978f54483029743268f2280b77f3ebcd12a083dce51f81a1d9cfb963"
|
|
7571
|
+
},
|
|
7542
7572
|
{
|
|
7543
7573
|
"path": "modules/provisioning/seams.js",
|
|
7544
7574
|
"mode": "0000644",
|
|
7545
7575
|
"sha256": "68ba324773bbd9a347ef682c5b1f105b447c6760f24595b8850590ed6d64d78e"
|
|
7546
7576
|
},
|
|
7577
|
+
{
|
|
7578
|
+
"path": "modules/provisioning/soft-limits.js",
|
|
7579
|
+
"mode": "0000644",
|
|
7580
|
+
"sha256": "03991cd9683c3fc2b4a9fda9e359dcd40a1e782800884b33b49b1d6e1fd9637d"
|
|
7581
|
+
},
|
|
7547
7582
|
{
|
|
7548
7583
|
"path": "modules/provisioning/starter-bundles.js",
|
|
7549
7584
|
"mode": "0000644",
|
|
@@ -8927,12 +8962,12 @@
|
|
|
8927
8962
|
{
|
|
8928
8963
|
"path": "package-lock.json",
|
|
8929
8964
|
"mode": "0000644",
|
|
8930
|
-
"sha256": "
|
|
8965
|
+
"sha256": "b4b4420fef73f720a6180d45b5559b38b857fe80181e148715187c5f2c5ec498"
|
|
8931
8966
|
},
|
|
8932
8967
|
{
|
|
8933
8968
|
"path": "package.json",
|
|
8934
8969
|
"mode": "0000644",
|
|
8935
|
-
"sha256": "
|
|
8970
|
+
"sha256": "9c84d9545af388a0db6fed5fe78bf1c71469ffa1e69ea37386281f0c273cd656"
|
|
8936
8971
|
},
|
|
8937
8972
|
{
|
|
8938
8973
|
"path": "public-docs/index.html",
|
|
@@ -8952,7 +8987,7 @@
|
|
|
8952
8987
|
{
|
|
8953
8988
|
"path": "release-notes.json",
|
|
8954
8989
|
"mode": "0000644",
|
|
8955
|
-
"sha256": "
|
|
8990
|
+
"sha256": "f6b10e5e103f5007ef31e7d2f53c95e146a93562f5a5465ea4e85da2baeb3c52"
|
|
8956
8991
|
},
|
|
8957
8992
|
{
|
|
8958
8993
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -10112,7 +10147,7 @@
|
|
|
10112
10147
|
{
|
|
10113
10148
|
"path": "scripts/gds/run-unit-tests.js",
|
|
10114
10149
|
"mode": "0000644",
|
|
10115
|
-
"sha256": "
|
|
10150
|
+
"sha256": "d891a37574626191f7abc01c50a64178a128e4f8b53ceb17ad6ed6d7439bc56e"
|
|
10116
10151
|
},
|
|
10117
10152
|
{
|
|
10118
10153
|
"path": "scripts/gds/runner-drift.js",
|
|
@@ -10922,7 +10957,7 @@
|
|
|
10922
10957
|
{
|
|
10923
10958
|
"path": "src/bongos/route-rank-check.js",
|
|
10924
10959
|
"mode": "0000644",
|
|
10925
|
-
"sha256": "
|
|
10960
|
+
"sha256": "c7809ca26bf270ff260b79bf83f9c7dec27616c375ff8e9db78867a2a26a63eb"
|
|
10926
10961
|
},
|
|
10927
10962
|
{
|
|
10928
10963
|
"path": "src/bongos/routes.js",
|
|
@@ -11067,7 +11102,7 @@
|
|
|
11067
11102
|
{
|
|
11068
11103
|
"path": "src/module-api.js",
|
|
11069
11104
|
"mode": "0000644",
|
|
11070
|
-
"sha256": "
|
|
11105
|
+
"sha256": "b2361eff082828662c898922d47f4968192f852af7fbf5b03365c7624ffbfc55"
|
|
11071
11106
|
},
|
|
11072
11107
|
{
|
|
11073
11108
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12809,6 +12844,11 @@
|
|
|
12809
12844
|
"mode": "0000644",
|
|
12810
12845
|
"sha256": "1bf22bc4ae339459e28a9f4e7975aac9e9d84eacd3f901d30371b44574f714c1"
|
|
12811
12846
|
},
|
|
12847
|
+
{
|
|
12848
|
+
"path": "tests/government_board_genesis_stage.mjs",
|
|
12849
|
+
"mode": "0000644",
|
|
12850
|
+
"sha256": "a477c3f0aa0ab45167ed33a3452a8d9075a5a01a3d8722a1c290165b09ec08cf"
|
|
12851
|
+
},
|
|
12812
12852
|
{
|
|
12813
12853
|
"path": "tests/government_board_hash_redirect.mjs",
|
|
12814
12854
|
"mode": "0000644",
|
|
@@ -12864,6 +12904,11 @@
|
|
|
12864
12904
|
"mode": "0000644",
|
|
12865
12905
|
"sha256": "ba1c95ca55d8d8e256ba03f2543e44cee4272b9652742343617e35cebefe3ab9"
|
|
12866
12906
|
},
|
|
12907
|
+
{
|
|
12908
|
+
"path": "tests/government_charter_forms.mjs",
|
|
12909
|
+
"mode": "0000644",
|
|
12910
|
+
"sha256": "0e6e006ad15a39e34b22793be7c6987a8602690f48b65998da04358fd8be3449"
|
|
12911
|
+
},
|
|
12867
12912
|
{
|
|
12868
12913
|
"path": "tests/government_charter_library.mjs",
|
|
12869
12914
|
"mode": "0000644",
|
|
@@ -12962,7 +13007,7 @@
|
|
|
12962
13007
|
{
|
|
12963
13008
|
"path": "tests/government_seed.mjs",
|
|
12964
13009
|
"mode": "0000644",
|
|
12965
|
-
"sha256": "
|
|
13010
|
+
"sha256": "3ccf2c31544009a8031fc9a5b632f285ebd08712504684662317cfbadb879f4e"
|
|
12966
13011
|
},
|
|
12967
13012
|
{
|
|
12968
13013
|
"path": "tests/government_session_scope.mjs",
|
|
@@ -14339,6 +14384,11 @@
|
|
|
14339
14384
|
"mode": "0000644",
|
|
14340
14385
|
"sha256": "6c623a5abe9aadf4821ad8ca291fb5d7805a7a5bc874bfc3cd7e51e83de289d2"
|
|
14341
14386
|
},
|
|
14387
|
+
{
|
|
14388
|
+
"path": "tests/pending_invite_purge_db.mjs",
|
|
14389
|
+
"mode": "0000644",
|
|
14390
|
+
"sha256": "afc10a1fa260b41133399037cc7c6b1acdde91f9ffac5d62fa7d84f680138b8b"
|
|
14391
|
+
},
|
|
14342
14392
|
{
|
|
14343
14393
|
"path": "tests/permission_path.mjs",
|
|
14344
14394
|
"mode": "0000644",
|
|
@@ -14744,6 +14794,11 @@
|
|
|
14744
14794
|
"mode": "0000644",
|
|
14745
14795
|
"sha256": "c9fa4aa59e6e47c139277e3c57298ca441180c4d4752ca6994c72678219df8c8"
|
|
14746
14796
|
},
|
|
14797
|
+
{
|
|
14798
|
+
"path": "tests/provisioning_planet_physics.mjs",
|
|
14799
|
+
"mode": "0000644",
|
|
14800
|
+
"sha256": "febbdbf82e7521ef80fb00d48a0a5fa9edf063ec20efbb39ddf59051c5cad4b2"
|
|
14801
|
+
},
|
|
14747
14802
|
{
|
|
14748
14803
|
"path": "tests/provisioning_public_refusal.mjs",
|
|
14749
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,10 @@ 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),
|
|
470
|
+
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
471
|
+
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
468
472
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
469
473
|
getGovernmentBoardItems: (args) => request("GET", "/government/board/items", { hasBody: false }, args),
|
|
470
474
|
// POST /government/board/items — rank: metic+archon — POST /government/board/items
|
|
@@ -464,6 +464,10 @@ 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),
|
|
469
|
+
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
470
|
+
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
467
471
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
468
472
|
getGovernmentBoardItems: (args) => request("GET", "/government/board/items", { hasBody: false }, args),
|
|
469
473
|
// POST /government/board/items — rank: metic+archon — POST /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,10 @@ 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>;
|
|
901
|
+
/** GET /government/board/genesis-stages — rank: any-builder */
|
|
902
|
+
getGovernmentBoardGenesisStages(args?: RequestArgs): Promise<ApiResponse>;
|
|
897
903
|
/** GET /government/board/items — rank: any-builder */
|
|
898
904
|
getGovernmentBoardItems(args?: RequestArgs): Promise<ApiResponse>;
|
|
899
905
|
/** POST /government/board/items — rank: metic+archon */
|
|
@@ -461,6 +461,10 @@ 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),
|
|
466
|
+
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
467
|
+
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
464
468
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
465
469
|
getGovernmentBoardItems: (args) => request("GET", "/government/board/items", { hasBody: false }, args),
|
|
466
470
|
// POST /government/board/items — rank: metic+archon — POST /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 |
|