@bongos/core 1.20.24 → 1.20.26
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 +70 -40
- 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 +2 -0
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md +46 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +36 -2
- package/docs/api-reference.md +3 -2
- package/docs/copy-inventory.md +18 -18
- package/docs/copy-registry.json +20 -20
- package/docs/design/project-startup-direction.md +131 -0
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +15 -15
- package/modules/discord/board-broadcast.js +1 -0
- package/modules/government/board.js +204 -2
- 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 +20 -0
- package/modules/hall-ui/public/board-room.js +5 -0
- package/modules/provisioning/free-place-lock.js +52 -0
- package/modules/provisioning/paid-shape-gate.js +90 -30
- package/modules/provisioning/routes/provisioning.js +6 -6
- package/modules/public-landing/public/projects.html +7 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +16 -0
- package/src/bongos/route-rank-check.js +3 -0
- package/src/module-api.js +1 -1
- package/tests/government_board_genesis_stage.mjs +305 -0
- package/tests/government_seed.mjs +1 -0
- package/tests/project_catalog_routes.mjs +2 -0
- package/tests/projects_hub_pre_uat.mjs +1 -1
- package/tests/provisioning_capacity_gate.mjs +2 -0
- package/tests/provisioning_domain_attach.mjs +2 -0
- package/tests/provisioning_paid_shape_gate.mjs +43 -11
- package/tests/provisioning_teardown_intent.mjs +2 -0
- package/tests/provisioning_wizard_create_xenos.mjs +381 -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.26",
|
|
6
|
+
"core_contract": "1.20.26",
|
|
7
|
+
"source_commit": "7bf58c3913461c4383f40d27a2c2abe4b357ee85",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-30T19:12:54.558Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 560,
|
|
13
13
|
"agent_docs_stubbed": 25,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2647,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3233,
|
|
20
|
+
"tree_sha256": "6cc2f111dd67610b01e2286ded5cfef7db118cdbb5afe9d134262e29262f7ade",
|
|
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": "6142e330ccbf058cfe2d266b80d1dab1419cdd9194f39933da2f410d6e20abb1"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
334
334
|
"mode": "0000644",
|
|
335
|
-
"sha256": "
|
|
335
|
+
"sha256": "094ba492c058258352e891a1d418fbff5777d40176e21292a6c92c0ad4c55902"
|
|
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": "4b57358e758f2959d9564bd59dab8c8d4ecfddebba4ee972884dd19522eb0f6c"
|
|
346
346
|
},
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/index.d.ts",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "c8fab17a151038309beceb2ca3e07a4dfbaa8d79f82b2b314cb3f1440882c3b6"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/index.mjs",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "007c35d80ca1e647157a3330d4791871119659228b4ad2fc8091d9f6b00b6e3b"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/package.json",
|
|
@@ -2239,20 +2239,25 @@
|
|
|
2239
2239
|
"mode": "0000644",
|
|
2240
2240
|
"sha256": "4445d9c306a22fb3b7e72467bedad262f4653c092bf4866f8a39410248da2724"
|
|
2241
2241
|
},
|
|
2242
|
+
{
|
|
2243
|
+
"path": "docs/adr/0354-a-builder-hosts-one-project-free-and-more-takes-the-fleet-permission.md",
|
|
2244
|
+
"mode": "0000644",
|
|
2245
|
+
"sha256": "962d868c0887244c53b53c58754f7232715a20df6feec694f30cbda707f9e17e"
|
|
2246
|
+
},
|
|
2242
2247
|
{
|
|
2243
2248
|
"path": "docs/adr/README.md",
|
|
2244
2249
|
"mode": "0000644",
|
|
2245
|
-
"sha256": "
|
|
2250
|
+
"sha256": "850168519d3ef7eaf6d9658b9e2b19a80402147e9f3e8fc5318c53b7647fa9b0"
|
|
2246
2251
|
},
|
|
2247
2252
|
{
|
|
2248
2253
|
"path": "docs/api-reference.md",
|
|
2249
2254
|
"mode": "0000644",
|
|
2250
|
-
"sha256": "
|
|
2255
|
+
"sha256": "0d81859e19436003332c5ee22b94c7e0a23636a61ac2a52118c15caae71fb31c"
|
|
2251
2256
|
},
|
|
2252
2257
|
{
|
|
2253
2258
|
"path": "docs/api/openapi.json",
|
|
2254
2259
|
"mode": "0000644",
|
|
2255
|
-
"sha256": "
|
|
2260
|
+
"sha256": "ce15358f33baf4ba95f59b2e2de9bfc4a5a4a0dddde5bfc91a0bfab09e4447f9"
|
|
2256
2261
|
},
|
|
2257
2262
|
{
|
|
2258
2263
|
"path": "docs/architecture.md",
|
|
@@ -2277,12 +2282,12 @@
|
|
|
2277
2282
|
{
|
|
2278
2283
|
"path": "docs/copy-inventory.md",
|
|
2279
2284
|
"mode": "0000644",
|
|
2280
|
-
"sha256": "
|
|
2285
|
+
"sha256": "cc3d3c2334fabc860be82ea509588681ca03cdd34da374011e2b0d5a646b8c9a"
|
|
2281
2286
|
},
|
|
2282
2287
|
{
|
|
2283
2288
|
"path": "docs/copy-registry.json",
|
|
2284
2289
|
"mode": "0000644",
|
|
2285
|
-
"sha256": "
|
|
2290
|
+
"sha256": "efedc6e640a54a117e108ae85654fec0385580a108918c62a8ec96fc3b927daa"
|
|
2286
2291
|
},
|
|
2287
2292
|
{
|
|
2288
2293
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2354,6 +2359,11 @@
|
|
|
2354
2359
|
"mode": "0000644",
|
|
2355
2360
|
"sha256": "dfa1ea2c45eddd5a9528487f3a0fe80398ba9018c5f73706629015ff6c2108e0"
|
|
2356
2361
|
},
|
|
2362
|
+
{
|
|
2363
|
+
"path": "docs/design/project-startup-direction.md",
|
|
2364
|
+
"mode": "0000644",
|
|
2365
|
+
"sha256": "b7c67956a0fe3c38efc22701741b4e19ba383c942b864d2b37b195619594392f"
|
|
2366
|
+
},
|
|
2357
2367
|
{
|
|
2358
2368
|
"path": "docs/design/projects-hub-direction-v2.md",
|
|
2359
2369
|
"mode": "0000644",
|
|
@@ -2782,7 +2792,7 @@
|
|
|
2782
2792
|
{
|
|
2783
2793
|
"path": "docs/module-api-changelog.md",
|
|
2784
2794
|
"mode": "0000644",
|
|
2785
|
-
"sha256": "
|
|
2795
|
+
"sha256": "7ceae0d7b1f9b1305c7dbec25e411f80c7700a128bbcf140ae65da98d73323c9"
|
|
2786
2796
|
},
|
|
2787
2797
|
{
|
|
2788
2798
|
"path": "docs/modules-contract.md",
|
|
@@ -2872,7 +2882,7 @@
|
|
|
2872
2882
|
{
|
|
2873
2883
|
"path": "docs/page-readings.json",
|
|
2874
2884
|
"mode": "0000644",
|
|
2875
|
-
"sha256": "
|
|
2885
|
+
"sha256": "e9b2c838868e4b23789112734c976ecae722ee3dcc4bea948482666e7a17863a"
|
|
2876
2886
|
},
|
|
2877
2887
|
{
|
|
2878
2888
|
"path": "docs/project-context.template.md",
|
|
@@ -4307,7 +4317,7 @@
|
|
|
4307
4317
|
{
|
|
4308
4318
|
"path": "modules/discord/board-broadcast.js",
|
|
4309
4319
|
"mode": "0000644",
|
|
4310
|
-
"sha256": "
|
|
4320
|
+
"sha256": "55ebb3d10844b33e0984e553b87ee06abdc59a0684b555da462d4842155e8445"
|
|
4311
4321
|
},
|
|
4312
4322
|
{
|
|
4313
4323
|
"path": "modules/discord/bug-attachments.js",
|
|
@@ -4517,7 +4527,7 @@
|
|
|
4517
4527
|
{
|
|
4518
4528
|
"path": "modules/government/board.js",
|
|
4519
4529
|
"mode": "0000644",
|
|
4520
|
-
"sha256": "
|
|
4530
|
+
"sha256": "f620a9c3cfe606955aa4b6b7dd0d194c1160bab99ee6ffc81a801edf6b3db4a6"
|
|
4521
4531
|
},
|
|
4522
4532
|
{
|
|
4523
4533
|
"path": "modules/government/catalog.js",
|
|
@@ -4532,7 +4542,7 @@
|
|
|
4532
4542
|
{
|
|
4533
4543
|
"path": "modules/government/db.js",
|
|
4534
4544
|
"mode": "0000644",
|
|
4535
|
-
"sha256": "
|
|
4545
|
+
"sha256": "1eb2e506878c52aa70fdc6b75b9a392dcb29d71617685f8efd58974b9fd92ae9"
|
|
4536
4546
|
},
|
|
4537
4547
|
{
|
|
4538
4548
|
"path": "modules/government/membership-predicate.js",
|
|
@@ -4669,6 +4679,11 @@
|
|
|
4669
4679
|
"mode": "0000644",
|
|
4670
4680
|
"sha256": "d267905e59cfcfa313c9f723d69bdf309d21490dc2ca9fae43422d087720470d"
|
|
4671
4681
|
},
|
|
4682
|
+
{
|
|
4683
|
+
"path": "modules/government/migrations/government_020_genesis_stage_subject.sql",
|
|
4684
|
+
"mode": "0000644",
|
|
4685
|
+
"sha256": "6eabf8b78f84922a44bdcfacf9e5dd4c2c5ead593b81125c2cc9ca8f13f844d9"
|
|
4686
|
+
},
|
|
4672
4687
|
{
|
|
4673
4688
|
"path": "modules/government/module.json",
|
|
4674
4689
|
"mode": "0000644",
|
|
@@ -4702,7 +4717,7 @@
|
|
|
4702
4717
|
{
|
|
4703
4718
|
"path": "modules/government/routes/government.js",
|
|
4704
4719
|
"mode": "0000644",
|
|
4705
|
-
"sha256": "
|
|
4720
|
+
"sha256": "58415db3a65d68f1e30f626cab20882fc324c2575226b8d6f0a82b8f018694c4"
|
|
4706
4721
|
},
|
|
4707
4722
|
{
|
|
4708
4723
|
"path": "modules/government/routes/rank-sync.js",
|
|
@@ -4942,7 +4957,7 @@
|
|
|
4942
4957
|
{
|
|
4943
4958
|
"path": "modules/hall-ui/public/board-room.js",
|
|
4944
4959
|
"mode": "0000644",
|
|
4945
|
-
"sha256": "
|
|
4960
|
+
"sha256": "8eb8c988b6cbdd59151f10593c3b751eac95ec2f73be198c52145d6bb934aefc"
|
|
4946
4961
|
},
|
|
4947
4962
|
{
|
|
4948
4963
|
"path": "modules/hall-ui/public/board-room.states.json",
|
|
@@ -7269,6 +7284,11 @@
|
|
|
7269
7284
|
"mode": "0000644",
|
|
7270
7285
|
"sha256": "f00a21da3c27933cd34cb66a7d99ef1104eac1180d0655e8fa59e96f9a366ace"
|
|
7271
7286
|
},
|
|
7287
|
+
{
|
|
7288
|
+
"path": "modules/provisioning/free-place-lock.js",
|
|
7289
|
+
"mode": "0000644",
|
|
7290
|
+
"sha256": "82b9f7ee39820735ca4d0f55b12fd72903b9909d3c9f0abedb684dcc98ac77c6"
|
|
7291
|
+
},
|
|
7272
7292
|
{
|
|
7273
7293
|
"path": "modules/provisioning/migrations/provisioning_001_tables.sql",
|
|
7274
7294
|
"mode": "0000644",
|
|
@@ -7422,7 +7442,7 @@
|
|
|
7422
7442
|
{
|
|
7423
7443
|
"path": "modules/provisioning/paid-shape-gate.js",
|
|
7424
7444
|
"mode": "0000644",
|
|
7425
|
-
"sha256": "
|
|
7445
|
+
"sha256": "aad8d8e8a641ebcbff9aeeed765e6c1657fa5896dc9cc3e84aa32f6d327b7db2"
|
|
7426
7446
|
},
|
|
7427
7447
|
{
|
|
7428
7448
|
"path": "modules/provisioning/pollers/app-liveness.js",
|
|
@@ -7512,7 +7532,7 @@
|
|
|
7512
7532
|
{
|
|
7513
7533
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
7514
7534
|
"mode": "0000644",
|
|
7515
|
-
"sha256": "
|
|
7535
|
+
"sha256": "d0a1e16b8ba6cb03bfadf95c7a3b688007309d173812e34b4e69d6e4dc33d21f"
|
|
7516
7536
|
},
|
|
7517
7537
|
{
|
|
7518
7538
|
"path": "modules/provisioning/routes/render-standup.js",
|
|
@@ -8067,7 +8087,7 @@
|
|
|
8067
8087
|
{
|
|
8068
8088
|
"path": "modules/public-landing/public/projects.html",
|
|
8069
8089
|
"mode": "0000644",
|
|
8070
|
-
"sha256": "
|
|
8090
|
+
"sha256": "dc489131cceef3330ea6d3ee0d24c05a723076478496efb46ce8e509381aea03"
|
|
8071
8091
|
},
|
|
8072
8092
|
{
|
|
8073
8093
|
"path": "modules/public-landing/public/projects.probes.json",
|
|
@@ -8912,12 +8932,12 @@
|
|
|
8912
8932
|
{
|
|
8913
8933
|
"path": "package-lock.json",
|
|
8914
8934
|
"mode": "0000644",
|
|
8915
|
-
"sha256": "
|
|
8935
|
+
"sha256": "60d6f4672fc29b5851546d35e5a6f14c6323d7e5946908d1c2bbe301bb3a0dfa"
|
|
8916
8936
|
},
|
|
8917
8937
|
{
|
|
8918
8938
|
"path": "package.json",
|
|
8919
8939
|
"mode": "0000644",
|
|
8920
|
-
"sha256": "
|
|
8940
|
+
"sha256": "9bb1f16462f06299a105da0895a24faac4f1c5bb689c5c9045deeb4bb97fb5bc"
|
|
8921
8941
|
},
|
|
8922
8942
|
{
|
|
8923
8943
|
"path": "public-docs/index.html",
|
|
@@ -8937,7 +8957,7 @@
|
|
|
8937
8957
|
{
|
|
8938
8958
|
"path": "release-notes.json",
|
|
8939
8959
|
"mode": "0000644",
|
|
8940
|
-
"sha256": "
|
|
8960
|
+
"sha256": "1e79c9b3c2692c720aac6166d50e881f8069d94be738e57e6eef882ea2ec9d4a"
|
|
8941
8961
|
},
|
|
8942
8962
|
{
|
|
8943
8963
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -10907,7 +10927,7 @@
|
|
|
10907
10927
|
{
|
|
10908
10928
|
"path": "src/bongos/route-rank-check.js",
|
|
10909
10929
|
"mode": "0000644",
|
|
10910
|
-
"sha256": "
|
|
10930
|
+
"sha256": "0a4448143b5673781ab21a3ec982a3a183c410caeb7e3afd3ba5d69586de06b2"
|
|
10911
10931
|
},
|
|
10912
10932
|
{
|
|
10913
10933
|
"path": "src/bongos/routes.js",
|
|
@@ -11052,7 +11072,7 @@
|
|
|
11052
11072
|
{
|
|
11053
11073
|
"path": "src/module-api.js",
|
|
11054
11074
|
"mode": "0000644",
|
|
11055
|
-
"sha256": "
|
|
11075
|
+
"sha256": "3e5ca31fb6e6c2fc7f351aa64ef4946c206050c6c34df748946a794011cd6f66"
|
|
11056
11076
|
},
|
|
11057
11077
|
{
|
|
11058
11078
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12794,6 +12814,11 @@
|
|
|
12794
12814
|
"mode": "0000644",
|
|
12795
12815
|
"sha256": "1bf22bc4ae339459e28a9f4e7975aac9e9d84eacd3f901d30371b44574f714c1"
|
|
12796
12816
|
},
|
|
12817
|
+
{
|
|
12818
|
+
"path": "tests/government_board_genesis_stage.mjs",
|
|
12819
|
+
"mode": "0000644",
|
|
12820
|
+
"sha256": "a477c3f0aa0ab45167ed33a3452a8d9075a5a01a3d8722a1c290165b09ec08cf"
|
|
12821
|
+
},
|
|
12797
12822
|
{
|
|
12798
12823
|
"path": "tests/government_board_hash_redirect.mjs",
|
|
12799
12824
|
"mode": "0000644",
|
|
@@ -12947,7 +12972,7 @@
|
|
|
12947
12972
|
{
|
|
12948
12973
|
"path": "tests/government_seed.mjs",
|
|
12949
12974
|
"mode": "0000644",
|
|
12950
|
-
"sha256": "
|
|
12975
|
+
"sha256": "3ccf2c31544009a8031fc9a5b632f285ebd08712504684662317cfbadb879f4e"
|
|
12951
12976
|
},
|
|
12952
12977
|
{
|
|
12953
12978
|
"path": "tests/government_session_scope.mjs",
|
|
@@ -14467,7 +14492,7 @@
|
|
|
14467
14492
|
{
|
|
14468
14493
|
"path": "tests/project_catalog_routes.mjs",
|
|
14469
14494
|
"mode": "0000644",
|
|
14470
|
-
"sha256": "
|
|
14495
|
+
"sha256": "e19d61fb2734092104276d1f74f1cbdf691bfe4f920414c543a1c07e839725e6"
|
|
14471
14496
|
},
|
|
14472
14497
|
{
|
|
14473
14498
|
"path": "tests/project_door_ui.mjs",
|
|
@@ -14552,7 +14577,7 @@
|
|
|
14552
14577
|
{
|
|
14553
14578
|
"path": "tests/projects_hub_pre_uat.mjs",
|
|
14554
14579
|
"mode": "0000644",
|
|
14555
|
-
"sha256": "
|
|
14580
|
+
"sha256": "5a2d7c53cf71d22dc7a7f4547c9dc59746002e35330a92c7047e4742c1977073"
|
|
14556
14581
|
},
|
|
14557
14582
|
{
|
|
14558
14583
|
"path": "tests/projects_hub_render_connect.mjs",
|
|
@@ -14662,7 +14687,7 @@
|
|
|
14662
14687
|
{
|
|
14663
14688
|
"path": "tests/provisioning_capacity_gate.mjs",
|
|
14664
14689
|
"mode": "0000644",
|
|
14665
|
-
"sha256": "
|
|
14690
|
+
"sha256": "478f4e06bd11f64e69efd9482094f262ac29016d052117c6a866cc9f0d55c318"
|
|
14666
14691
|
},
|
|
14667
14692
|
{
|
|
14668
14693
|
"path": "tests/provisioning_cost_ledger.mjs",
|
|
@@ -14687,7 +14712,7 @@
|
|
|
14687
14712
|
{
|
|
14688
14713
|
"path": "tests/provisioning_domain_attach.mjs",
|
|
14689
14714
|
"mode": "0000644",
|
|
14690
|
-
"sha256": "
|
|
14715
|
+
"sha256": "160acd275e3b466088ee5913186d430e974973a4e3eee51f3d62d8604a8fd64f"
|
|
14691
14716
|
},
|
|
14692
14717
|
{
|
|
14693
14718
|
"path": "tests/provisioning_domain_lookup_index.mjs",
|
|
@@ -14727,7 +14752,7 @@
|
|
|
14727
14752
|
{
|
|
14728
14753
|
"path": "tests/provisioning_paid_shape_gate.mjs",
|
|
14729
14754
|
"mode": "0000644",
|
|
14730
|
-
"sha256": "
|
|
14755
|
+
"sha256": "c9fa4aa59e6e47c139277e3c57298ca441180c4d4752ca6994c72678219df8c8"
|
|
14731
14756
|
},
|
|
14732
14757
|
{
|
|
14733
14758
|
"path": "tests/provisioning_public_refusal.mjs",
|
|
@@ -14787,13 +14812,18 @@
|
|
|
14787
14812
|
{
|
|
14788
14813
|
"path": "tests/provisioning_teardown_intent.mjs",
|
|
14789
14814
|
"mode": "0000644",
|
|
14790
|
-
"sha256": "
|
|
14815
|
+
"sha256": "4d06c5fd13f8cc81c050c2ed6940c91db5cdd95dea9f26ad7b8d6a8089c0254a"
|
|
14791
14816
|
},
|
|
14792
14817
|
{
|
|
14793
14818
|
"path": "tests/provisioning_teardown_states.mjs",
|
|
14794
14819
|
"mode": "0000644",
|
|
14795
14820
|
"sha256": "1b5decd026e6487c9477b87f533852dd93821b6688c3c76e694041b3918ee420"
|
|
14796
14821
|
},
|
|
14822
|
+
{
|
|
14823
|
+
"path": "tests/provisioning_wizard_create_xenos.mjs",
|
|
14824
|
+
"mode": "0000644",
|
|
14825
|
+
"sha256": "2b7048eb35f09fd40f93e301e7c7e999db1b12b04bd0855e616b8ae1d93006a8"
|
|
14826
|
+
},
|
|
14797
14827
|
{
|
|
14798
14828
|
"path": "tests/pruned_lockfile_integrity.mjs",
|
|
14799
14829
|
"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
|
+
- 464 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
|
+
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
469
|
+
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
468
470
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
469
471
|
getGovernmentBoardItems: (args) => request("GET", "/government/board/items", { hasBody: false }, args),
|
|
470
472
|
// POST /government/board/items — rank: metic+archon — POST /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
|
+
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
468
|
+
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
467
469
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
468
470
|
getGovernmentBoardItems: (args) => request("GET", "/government/board/items", { hasBody: false }, args),
|
|
469
471
|
// POST /government/board/items — rank: metic+archon — POST /government/board/items
|
|
@@ -894,6 +894,8 @@ export interface BongosClient {
|
|
|
894
894
|
postGovernmentAssignments(args: RequestArgs & { body: PostGovernmentAssignmentsRequest }): Promise<ApiResponse>;
|
|
895
895
|
/** DELETE /government/assignments/{builderId}/{rankKey} — rank: archon */
|
|
896
896
|
deleteGovernmentAssignmentsBuilderIdRankKey(args?: RequestArgs): Promise<DeleteGovernmentAssignmentsBuilderIdRankKeyResponse>;
|
|
897
|
+
/** GET /government/board/genesis-stages — rank: any-builder */
|
|
898
|
+
getGovernmentBoardGenesisStages(args?: RequestArgs): Promise<ApiResponse>;
|
|
897
899
|
/** GET /government/board/items — rank: any-builder */
|
|
898
900
|
getGovernmentBoardItems(args?: RequestArgs): Promise<ApiResponse>;
|
|
899
901
|
/** POST /government/board/items — rank: metic+archon */
|
|
@@ -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
|
+
// GET /government/board/genesis-stages — rank: any-builder — GET /government/board/genesis-stages
|
|
465
|
+
getGovernmentBoardGenesisStages: (args) => request("GET", "/government/board/genesis-stages", { hasBody: false }, args),
|
|
464
466
|
// GET /government/board/items — rank: any-builder — GET /government/board/items
|
|
465
467
|
getGovernmentBoardItems: (args) => request("GET", "/government/board/items", { hasBody: false }, args),
|
|
466
468
|
// POST /government/board/items — rank: metic+archon — POST /government/board/items
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# ADR 0354 — A builder hosts one project for free, and more takes the fleet permission
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-09-30
|
|
5
|
+
- **Task:** [task 1004412](https://cloudbongos.com/builders#/task/1004412) (goal 1000106 — working area 1, Project creation)
|
|
6
|
+
- **Amends:** the gate [task 1003370](https://cloudbongos.com/builders#/task/1003370) put on `cloud-host` (audit B4), for a builder's first hosted project only
|
|
7
|
+
- **Builds on:** [ADR 0345](0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md) decision 1 (we host every project's hall, and creating a project needs no platform account, key or bill) · [ADR 0285](0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md) (the shared box holds about fifteen projects)
|
|
8
|
+
- **Decided with:** the owner chose D1 on 2026-09-30, from three options put to them in plain language.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
The create wizard sends one request when the owner presses its last button, "Create my project", and that request always asks for `cloud-host`: the hall, hosted by us. Task 1003370 (2026-09-19) gated that shape behind `provisioning.fleet.manage` (floor: Metic), because a hosted hall runs code from its owner's repository on the platform's own box. A new hub signup is a Xenos. So from that day, every new user who pressed "Create my project" was refused with `permission_forbidden`. The wizard showed it as its generic "We couldn't file the request just now", with the permission name underneath. Task 1004412 confirmed this with a route-level test that uses the real permission gate and a Xenos's real grants.
|
|
13
|
+
|
|
14
|
+
ADR 0345 came nine days later and made `cloud-host` the free front door. The two decisions contradicted each other, and no test covered the path they shared.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### D1 — One live hosted project per builder needs no permission
|
|
19
|
+
|
|
20
|
+
A builder may create a `cloud-host` project with no permission if they hold no other live `cloud-host` project. "Live" means any status except `torn_down`. A queued or failed project still holds its place, and its owner can retry it or take it offline. Asking again for your own project's slug (a retry or a revive) counts as that same project, not a second one. A further live hosted project needs `provisioning.fleet.manage`, and the refusal is the kernel gate's own `permission_forbidden`.
|
|
21
|
+
|
|
22
|
+
What stops one person taking every place on the box is this limit, not rank. `byo-host` stays open without limit, and `control-plane` and `co-tenant` stay unrequestable. The gate is still an allow-list, so a shape added later is gated by omission.
|
|
23
|
+
|
|
24
|
+
If the count cannot be read, the gate refuses with `request_failed`. It is an authority gate, so it fails closed (ADR 0016).
|
|
25
|
+
|
|
26
|
+
### D2 — One first-free request per builder at a time
|
|
27
|
+
|
|
28
|
+
The count and the insert are two separate steps, so two requests sent together would both count zero. The gate takes a Postgres advisory lock keyed on the builder (`free-place-lock.js`, a try-lock on its own connection) before it counts, and lets it go as soon as the route has inserted the row (or when the response closes, on any earlier exit). A second request sent in the meantime, from any web process, gets 409 `create_in_progress`. A lock that cannot be taken refuses, like an unreadable count. (The first version used a process-local mark; the grader flagged that it would not hold across processes, so it moved into the database before shipping.)
|
|
29
|
+
|
|
30
|
+
### D3 — The wizard states both refusals in plain words
|
|
31
|
+
|
|
32
|
+
- **`permission_forbidden` with a readable `held`:** "Each account can host one project for free, and yours already has one…". The sentence names the project page's own "Take it offline" control, and says that trusted builders can host more than one (the owner asked for that line when reviewing the wording).
|
|
33
|
+
- **`box_full`:** "Our shared server is full right now…", instead of the operator's sentence.
|
|
34
|
+
- **`permission_forbidden` with `held: null`:** authority could not be checked at all, so the wizard keeps its generic sentence.
|
|
35
|
+
|
|
36
|
+
## Consequences
|
|
37
|
+
|
|
38
|
+
- New users can create a project from the wizard again. Each project costs us about $0.80 a month (ADR 0285).
|
|
39
|
+
- A stranger's code now runs on the shared box, on the same server as the hub. It runs in its own locked account (task 1003369), and the hub's sign-in cookie no longer reaches project halls (task 1004357). **Nothing caps a hosted project's memory or CPU**, so one misbehaving project can slow every hall and the hub. That was already true of every hosted project; this decision widens who can have one.
|
|
40
|
+
- Each first-free request holds one database connection from its count to its insert. Creates are rare, so the pool can carry it.
|
|
41
|
+
|
|
42
|
+
## Alternatives considered
|
|
43
|
+
|
|
44
|
+
- **Open to everyone, limited only by the box's capacity.** The smallest change. But one person could take every free place, and the capacity gate would then refuse everyone else.
|
|
45
|
+
- **Trusted builders only, with a plain refusal.** Keeps task 1003370's rule whole. But new users still could not start a project, which ADR 0345 decision 1 rules out.
|
|
46
|
+
- **An approval queue for new users' projects.** Keeps the rule and admits new users. But it is new machinery, and it would collide with the owner's redesign of the creation flow (begun 2026-09-30).
|
package/docs/adr/README.md
CHANGED
|
@@ -472,3 +472,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
|
|
|
472
472
|
| 0351 | [**A criterion closes on a UAT, not on its linked tasks shipping** ([task 1004392](https://cloudbongos.com/builders#/task/1004392), goal 1000089 — working area 3). Supersedes ADR 0183's close rule. `wa7-government` had closed on six Board Room navigation tasks while nothing it describes was on the live site. **D1:** three checks — Code (linked tasks done, ≥1 shipped; automatic), Live, UAT — and the sweep closes a criterion only with a CURRENT sign-off (no older than the newest linked ship). **D2 (owner):** "Awaiting UAT" is a visible state. **D3 (owner):** one step; the signer is refused if they shipped linked work, the project owner excepted. **D4 (owner):** an mp4/webm up to 100 MB on the project's own server. **D5 (owner):** backend-only is set while a criterion is open and takes a recording-free sign-off. **D6 (owner):** Live is read via the `deploy.taskWhere` port where the site can tell, attested otherwise. **D7 (owner):** already-closed criteria stay closed ("Closed before UAT"). **D8:** `/satisfy` is a recorded override that needs a reason. **D9:** `/goal-uat` + `scripts/gds/uat.js`; the hall is task 1004402.](0351-a-criterion-closes-on-a-uat.md) | lifecycle / criteria / review |
|
|
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
|
+
| 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 |
|
package/docs/api/openapi.json
CHANGED
|
@@ -7898,6 +7898,40 @@
|
|
|
7898
7898
|
]
|
|
7899
7899
|
}
|
|
7900
7900
|
},
|
|
7901
|
+
"/government/board/genesis-stages": {
|
|
7902
|
+
"get": {
|
|
7903
|
+
"operationId": "get_government_board_genesis_stages",
|
|
7904
|
+
"tags": [
|
|
7905
|
+
"government"
|
|
7906
|
+
],
|
|
7907
|
+
"summary": "GET /government/board/genesis-stages",
|
|
7908
|
+
"description": "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 item's own snapshot. Same atom as the room — seeing who is still to vote is part of the open ballot (§9). A read; nothing here opens or decides.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).\n\n**Permissions:** `board.vote.cast` (all required).",
|
|
7909
|
+
"x-rank": "any-builder",
|
|
7910
|
+
"x-source": "modules/government/routes/government.js",
|
|
7911
|
+
"x-permissions": [
|
|
7912
|
+
"board.vote.cast"
|
|
7913
|
+
],
|
|
7914
|
+
"responses": {
|
|
7915
|
+
"200": {
|
|
7916
|
+
"description": "Success."
|
|
7917
|
+
},
|
|
7918
|
+
"400": {
|
|
7919
|
+
"$ref": "#/components/responses/BadRequest"
|
|
7920
|
+
},
|
|
7921
|
+
"401": {
|
|
7922
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
7923
|
+
},
|
|
7924
|
+
"403": {
|
|
7925
|
+
"$ref": "#/components/responses/Forbidden"
|
|
7926
|
+
}
|
|
7927
|
+
},
|
|
7928
|
+
"security": [
|
|
7929
|
+
{
|
|
7930
|
+
"builderSession": []
|
|
7931
|
+
}
|
|
7932
|
+
]
|
|
7933
|
+
}
|
|
7934
|
+
},
|
|
7901
7935
|
"/government/board/items": {
|
|
7902
7936
|
"get": {
|
|
7903
7937
|
"operationId": "get_government_board_items",
|
|
@@ -14418,7 +14452,7 @@
|
|
|
14418
14452
|
"provisioning"
|
|
14419
14453
|
],
|
|
14420
14454
|
"summary": "POST /provisioning/instances",
|
|
14421
|
-
"description": "POST /provisioning/instances — request a new instance. rank: any authenticated builder (own resource) for
|
|
14455
|
+
"description": "POST /provisioning/instances — request a new instance. rank: any authenticated builder (own resource) for `byo-host`, and for their FIRST live `cloud-host` (task 1004412, ADR 0354). A further cloud-host needs provisioning.fleet.manage, and `control-plane` / `co-tenant` are refused outright (../paid-shape-gate.js). A full shared box answers 409 box_full up front (../capacity-gate.js). ENQUEUES a 'provision' intent the runner (task P3) stands up. Idempotent on slug for the SAME owner (re-request returns the existing row); a slug owned by ANOTHER builder → 409. Body: { slug (required), target_ref?, hosting_shape? (byo-host free; one cloud-host free), domain?, tier?, onboard_mode? (greenfield|adopt) }. onboard_mode is LOAD-BEARING, not a label (task 1002562): the control-plane runner branches its repo scaffold on it. 'adopt' means target_ref is a repo the owner ALREADY has, so the runner must clone + layer onto its history instead of pushing a fresh tree at `main` (which an existing repo rejects as unrelated history). Absent → 'greenfield', the safe default.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
14422
14456
|
"x-rank": "any-builder",
|
|
14423
14457
|
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
14424
14458
|
"requestBody": {
|
|
@@ -29629,7 +29663,7 @@
|
|
|
29629
29663
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
29630
29664
|
}
|
|
29631
29665
|
},
|
|
29632
|
-
"x-endpoint-count":
|
|
29666
|
+
"x-endpoint-count": 464,
|
|
29633
29667
|
"x-schema-count": 496,
|
|
29634
29668
|
"x-undocumented-bodies": 12,
|
|
29635
29669
|
"x-response-schemas": 336,
|
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. 464 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` (14)
|
|
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
|
+
| 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 … |
|
|
320
321
|
| 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). |
|
|
321
322
|
| 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). |
|
|
322
323
|
| POST | `/api/bongos/government/board/items/:itemId/votes` | `any-builder` | `direction`, `reason_md`, `section_key` | board.vote.cast — cast a vote on an open board item (R08 of goal 1000069, ADR 0175). |
|