@bongos/core 1.19.418 → 1.19.420

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.
Files changed (48) hide show
  1. package/.bongos-core.json +95 -45
  2. package/.claude/skills/new-project/SKILL.md +22 -11
  3. package/clients/bongos-client/README.md +1 -1
  4. package/clients/bongos-client/bongos-client.global.js +18 -0
  5. package/clients/bongos-client/index.cjs +18 -0
  6. package/clients/bongos-client/index.d.ts +28 -1
  7. package/clients/bongos-client/index.mjs +18 -0
  8. package/docs/adr/0207-connections-implementation-departures-and-honest-limits.md +90 -0
  9. package/docs/adr/0209-one-budget-for-the-account-existence-oracle.md +79 -0
  10. package/docs/adr/README.md +2 -0
  11. package/docs/api/openapi.json +518 -5
  12. package/docs/api-reference.md +16 -3
  13. package/docs/copy-inventory.md +186 -174
  14. package/docs/copy-registry.json +348 -238
  15. package/docs/file-map.md +1 -0
  16. package/docs/module-api-changelog.md +4 -0
  17. package/modules/dev-box/app/src/vendor/bongos-client.cjs +18 -0
  18. package/modules/onboarding/routes/access-requests.js +16 -3
  19. package/modules/platform-identity/account-visibility.js +58 -0
  20. package/modules/platform-identity/connections.js +490 -0
  21. package/modules/platform-identity/migrations/platform_identity_015_connections.sql +78 -0
  22. package/modules/platform-identity/module.json +1 -1
  23. package/modules/platform-identity/platform-identity.js +5 -5
  24. package/modules/platform-identity/routes/connections.js +236 -0
  25. package/modules/platform-identity/tests/platform-identity.mjs +20 -0
  26. package/modules/provisioning/migrations/provisioning_013_project_detail.sql +54 -0
  27. package/modules/provisioning/onboard-plan.js +13 -0
  28. package/modules/provisioning/provisioning.js +113 -5
  29. package/modules/provisioning/routes/provisioning.js +105 -0
  30. package/modules/provisioning/tests/provisioning.mjs +84 -0
  31. package/package-lock.json +2 -2
  32. package/package.json +1 -1
  33. package/public-landing/projects.html +161 -42
  34. package/scripts/gds/fitness.js +9 -0
  35. package/scripts/gds/onboard.js +41 -1
  36. package/scripts/gds/provision-net.js +7 -3
  37. package/src/bongos/middleware/rate-limit.js +68 -2
  38. package/src/bongos/routes/auth.js +19 -12
  39. package/src/module-api.js +13 -1
  40. package/tests/account_existence_rate_limit.mjs +375 -0
  41. package/tests/connections_api.mjs +568 -0
  42. package/tests/connections_ownership.mjs +313 -0
  43. package/tests/module_api.mjs +1 -0
  44. package/tests/onboard.mjs +56 -0
  45. package/tests/own_scope_guard.mjs +5 -0
  46. package/tests/projects_hub.mjs +69 -0
  47. package/tests/projects_hub_pre_uat.mjs +27 -5
  48. package/tests/provision.mjs +20 -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.19.418",
6
- "core_contract": "1.19.418",
7
- "source_commit": "e87d7993f31b4954beb97e7d65573bc9410f1192",
5
+ "core_version": "1.19.420",
6
+ "core_contract": "1.19.420",
7
+ "source_commit": "059167905bf23b4894c42e7e705ae7a4985e44b1",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-29T16:52:59.816Z",
9
+ "built_at": "2026-08-29T17:36:00.281Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 357,
12
+ "docs_redacted": 359,
13
13
  "agent_docs_stubbed": 23,
14
- "functional_verbatim": 1704,
14
+ "functional_verbatim": 1712,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2084,
20
- "tree_sha256": "8422d1d3312cf70f1ec09e532c01c0c368328ee68577712e0a6f98df0078f338",
19
+ "file_count": 2094,
20
+ "tree_sha256": "a7b3cb6487d5d1efdfb01330f81239e7e7000cbebf3ec2ca6d8bcd13d5e9dd87",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -192,7 +192,7 @@
192
192
  {
193
193
  "path": ".claude/skills/new-project/SKILL.md",
194
194
  "mode": "0000644",
195
- "sha256": "1d6f60e8fa3cbf06cc5f8901ccf21fd8cac8050f81b3296039b659d700eba242"
195
+ "sha256": "21ae14d681f0b8a7056b320c764ffbaa88c9cf777afc67589049e4778bf98d3b"
196
196
  },
197
197
  {
198
198
  "path": ".claude/skills/otb-character-review/SKILL.md",
@@ -352,12 +352,12 @@
352
352
  {
353
353
  "path": "clients/bongos-client/README.md",
354
354
  "mode": "0000644",
355
- "sha256": "2d74abb8d89022d621f105f019b2d0e4c7cef399e14e54fab64fb443b0f49179"
355
+ "sha256": "f190d3844d06a676480e270b05f14c13bd797915a43619be0a18affa06117000"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/bongos-client.global.js",
359
359
  "mode": "0000644",
360
- "sha256": "02b57e81ee53386d1392c769fb39adda73440fe016699b0e6b3a3b01a554d060"
360
+ "sha256": "562e26ce56898840c4bacf89ab7b31f7f80b30fa393374a3f8dc9c7ef973e48f"
361
361
  },
362
362
  {
363
363
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -367,17 +367,17 @@
367
367
  {
368
368
  "path": "clients/bongos-client/index.cjs",
369
369
  "mode": "0000644",
370
- "sha256": "07dc39d1991ca379b67de839752cfc4578036172f113d15b96d4a39b0eb7f9b4"
370
+ "sha256": "a4b6049666626ab1a99c8c30b0e8fa0ce40e11ba3e4ae61e5763c6ce6338a5e5"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/index.d.ts",
374
374
  "mode": "0000644",
375
- "sha256": "41363423243953f69a663ec425c439e61149f139ad7f0a3c721fd1f7a02047ef"
375
+ "sha256": "272b28e3c36e61ad0f7d578679a6c097238807fb284f130dbcd132d618c865fb"
376
376
  },
377
377
  {
378
378
  "path": "clients/bongos-client/index.mjs",
379
379
  "mode": "0000644",
380
- "sha256": "9cd5857fc781c8518d9cfedfe690af7487dde2da53fef0861bb6c6cded4d9b2e"
380
+ "sha256": "a8ea6b45b485350bb0190839cd89429706f9a046c9d2be2a7fe99555e691b852"
381
381
  },
382
382
  {
383
383
  "path": "clients/bongos-client/package.json",
@@ -1534,20 +1534,30 @@
1534
1534
  "mode": "0000644",
1535
1535
  "sha256": "634404f2eb0d29386460e0ea008a826069d80bfbd42721aa7b2cd4d74cb4fa86"
1536
1536
  },
1537
+ {
1538
+ "path": "docs/adr/0207-connections-implementation-departures-and-honest-limits.md",
1539
+ "mode": "0000644",
1540
+ "sha256": "72c859bdfc70fd4fc0d104439985a43eaf60cce281bbaae8b8faaffb40546973"
1541
+ },
1542
+ {
1543
+ "path": "docs/adr/0209-one-budget-for-the-account-existence-oracle.md",
1544
+ "mode": "0000644",
1545
+ "sha256": "bdf26860d1f10413a30a770ab420d49fdf58f922d75e23fb1cf9f174f7e469e4"
1546
+ },
1537
1547
  {
1538
1548
  "path": "docs/adr/README.md",
1539
1549
  "mode": "0000644",
1540
- "sha256": "fb4ae772f6d0289385dc1caddd24a2271510d85f4b4eb6d039248310defc84d7"
1550
+ "sha256": "19b8ba0e720f3df34e710c074dfeeabb64729acb4bd42f08c0378470dbfc3c99"
1541
1551
  },
1542
1552
  {
1543
1553
  "path": "docs/api-reference.md",
1544
1554
  "mode": "0000644",
1545
- "sha256": "05d778a5f5d44ef620fc266add8626f344308ff44f031b16a65441a1de38d67c"
1555
+ "sha256": "d4295ad9e1a6e0003f804fd1e9541414b2337d61469b58844e2f8008a893413c"
1546
1556
  },
1547
1557
  {
1548
1558
  "path": "docs/api/openapi.json",
1549
1559
  "mode": "0000644",
1550
- "sha256": "cc4545032233412b8938f8d399d24a3427789f5213dfdd29f33b3de1c4c3c3ac"
1560
+ "sha256": "1fff6c12d94b54f129023b50fb469652e2d558b816c7de6d8906f3ae772be47b"
1551
1561
  },
1552
1562
  {
1553
1563
  "path": "docs/architecture.md",
@@ -1572,12 +1582,12 @@
1572
1582
  {
1573
1583
  "path": "docs/copy-inventory.md",
1574
1584
  "mode": "0000644",
1575
- "sha256": "3e70beb03c93a71f5068c407467deeeca3c69d5271372de04399a9094fa32dd9"
1585
+ "sha256": "09df23ba8d777ddaab052ef0362f2ab3039818915101c3d7360893ba3516ee3a"
1576
1586
  },
1577
1587
  {
1578
1588
  "path": "docs/copy-registry.json",
1579
1589
  "mode": "0000644",
1580
- "sha256": "ae4ffbc86e556ea5463b8289754b70e9465a581e93a40f8713204c34d433e00a"
1590
+ "sha256": "d250537ce6978a0611104b5ece649905204beaf56fc63a923cf87410ab8c5a33"
1581
1591
  },
1582
1592
  {
1583
1593
  "path": "docs/design/apex-pass-2-direction.md",
@@ -1912,7 +1922,7 @@
1912
1922
  {
1913
1923
  "path": "docs/file-map.md",
1914
1924
  "mode": "0000644",
1915
- "sha256": "2464bcb60656e263ef00002c928a2e6f0d4b812b7a7b8183c634535f1192e58d"
1925
+ "sha256": "3d5b793c64f79c7c867f63440fbb949022426b0c849e3536f0988ebaa38e396b"
1916
1926
  },
1917
1927
  {
1918
1928
  "path": "docs/handoff-template.md",
@@ -1922,7 +1932,7 @@
1922
1932
  {
1923
1933
  "path": "docs/module-api-changelog.md",
1924
1934
  "mode": "0000644",
1925
- "sha256": "11919db7fb659bf498544aa14b39cef44166ed3ad596784281e8f6cd7efd6fa5"
1935
+ "sha256": "c59a19d11ab8ac21bdad72060f87d43b2e8774173dd7465ad45c30187ce44016"
1926
1936
  },
1927
1937
  {
1928
1938
  "path": "docs/modules-contract.md",
@@ -3232,7 +3242,7 @@
3232
3242
  {
3233
3243
  "path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
3234
3244
  "mode": "0000644",
3235
- "sha256": "07dc39d1991ca379b67de839752cfc4578036172f113d15b96d4a39b0eb7f9b4"
3245
+ "sha256": "a4b6049666626ab1a99c8c30b0e8fa0ce40e11ba3e4ae61e5763c6ce6338a5e5"
3236
3246
  },
3237
3247
  {
3238
3248
  "path": "modules/dev-box/app/test/unit.mjs",
@@ -4752,7 +4762,7 @@
4752
4762
  {
4753
4763
  "path": "modules/onboarding/routes/access-requests.js",
4754
4764
  "mode": "0000644",
4755
- "sha256": "060e8c33c5182c3d11b2b39b721f485deecc07b51f735b98f97aafbcc7e7657a"
4765
+ "sha256": "254eaab3d13d796fb19a029ddc00d429ee5e28827003c407cfdd969d9d9aab28"
4756
4766
  },
4757
4767
  {
4758
4768
  "path": "modules/onboarding/routes/onboarding.js",
@@ -4764,6 +4774,16 @@
4764
4774
  "mode": "0000644",
4765
4775
  "sha256": "7cb9dac9cb87b679e1ae50e4112b3a7928a38ebb9902c8947a74d17bec4d9009"
4766
4776
  },
4777
+ {
4778
+ "path": "modules/platform-identity/account-visibility.js",
4779
+ "mode": "0000644",
4780
+ "sha256": "744a7293bbdf4e2340baf0dc7f789df03a63ba7970741b8aef5922c02cb8910e"
4781
+ },
4782
+ {
4783
+ "path": "modules/platform-identity/connections.js",
4784
+ "mode": "0000644",
4785
+ "sha256": "3bdd5edf87ff2095035e8945afb7d3a0779cbb9f691e6e634f12a6500edeb21b"
4786
+ },
4767
4787
  {
4768
4788
  "path": "modules/platform-identity/hub-device.js",
4769
4789
  "mode": "0000644",
@@ -4854,15 +4874,20 @@
4854
4874
  "mode": "0000644",
4855
4875
  "sha256": "cf29832de04b2b31e1d36b5d595489bbbb09d14b12c86da7c5ac7557917475bf"
4856
4876
  },
4877
+ {
4878
+ "path": "modules/platform-identity/migrations/platform_identity_015_connections.sql",
4879
+ "mode": "0000644",
4880
+ "sha256": "edaced87ae340bb4c0a8c73d5dc40f8578bf7be0bd4064a02d6c4fcf0cf94be3"
4881
+ },
4857
4882
  {
4858
4883
  "path": "modules/platform-identity/module.json",
4859
4884
  "mode": "0000644",
4860
- "sha256": "c4c02577f7318e994301bbe700e20dfb24519e411fee04539755f7374a73590b"
4885
+ "sha256": "d7c74b8b41b3c0f6d0d072632f4a8d04f11b06c39203c6f759dcaf4e324fd9b0"
4861
4886
  },
4862
4887
  {
4863
4888
  "path": "modules/platform-identity/platform-identity.js",
4864
4889
  "mode": "0000644",
4865
- "sha256": "16f86cd9b5a4b934b90a0332651b18c8bd8b1ccbfdbf0c5b23fffe50dbe8d8f8"
4890
+ "sha256": "cd9aabc9c78964de0a93387b9edd46ee03a0f7c5e6d3f1153b6274204c27a2b6"
4866
4891
  },
4867
4892
  {
4868
4893
  "path": "modules/platform-identity/pollers/code-sweep.js",
@@ -4874,6 +4899,11 @@
4874
4899
  "mode": "0000644",
4875
4900
  "sha256": "2e898799632a2b5c2ead9cb44fa0b8029fcb6d217f7d5f26c8a39b34c75bbea7"
4876
4901
  },
4902
+ {
4903
+ "path": "modules/platform-identity/routes/connections.js",
4904
+ "mode": "0000644",
4905
+ "sha256": "d4b7ddb7ec100899e95e73428fba8dc5e3f41005e021fcf887ea80ba8ae0e1b6"
4906
+ },
4877
4907
  {
4878
4908
  "path": "modules/platform-identity/routes/my-projects.js",
4879
4909
  "mode": "0000644",
@@ -4907,7 +4937,7 @@
4907
4937
  {
4908
4938
  "path": "modules/platform-identity/tests/platform-identity.mjs",
4909
4939
  "mode": "0000644",
4910
- "sha256": "5403d391a22cffa58722923beee730db0bf4052ee933a84ab1e11fcbab9ea5e4"
4940
+ "sha256": "6b523f1fbecaaa29310d3439cc1e4164f7dba3d01057812ccb4ac71bca861b68"
4911
4941
  },
4912
4942
  {
4913
4943
  "path": "modules/platform-identity/ui/.gitkeep",
@@ -4979,6 +5009,11 @@
4979
5009
  "mode": "0000644",
4980
5010
  "sha256": "74c46df38eab2b8c0f59b2da423691b170e3e85a7ec9857fad239b912bca99f4"
4981
5011
  },
5012
+ {
5013
+ "path": "modules/provisioning/migrations/provisioning_013_project_detail.sql",
5014
+ "mode": "0000644",
5015
+ "sha256": "7abe41633cd7f98712c39960fba7175f0bb3340c4568bfbfdc640af911a31e15"
5016
+ },
4982
5017
  {
4983
5018
  "path": "modules/provisioning/module.json",
4984
5019
  "mode": "0000644",
@@ -4987,7 +5022,7 @@
4987
5022
  {
4988
5023
  "path": "modules/provisioning/onboard-plan.js",
4989
5024
  "mode": "0000644",
4990
- "sha256": "9124712dbaa724d03177f1b5779ca3aad639151c7b1ef9721dd65f5374de4afe"
5025
+ "sha256": "31f14cbf3d649c25f1f17c508ae19be2f39d9e1991fde17cdce08cb15837ffa1"
4991
5026
  },
4992
5027
  {
4993
5028
  "path": "modules/provisioning/pollers/liveness-sweep.js",
@@ -4997,7 +5032,7 @@
4997
5032
  {
4998
5033
  "path": "modules/provisioning/provisioning.js",
4999
5034
  "mode": "0000644",
5000
- "sha256": "82c2502ad0c535a1faa43b167735d988527b54149778e5e796c1306139e760f9"
5035
+ "sha256": "b643caae4ce9e8cfa8d5f3dccbfe41e709b89ce6820ca0422aee3ac184f45a12"
5001
5036
  },
5002
5037
  {
5003
5038
  "path": "modules/provisioning/rate-limit.js",
@@ -5007,7 +5042,7 @@
5007
5042
  {
5008
5043
  "path": "modules/provisioning/routes/provisioning.js",
5009
5044
  "mode": "0000644",
5010
- "sha256": "bdf000da67e09dfa3bc394d7c3d7dbbd9e65fe4a653cc558291c5806f2ca46ca"
5045
+ "sha256": "100c0f73c26c1c4858009d8ce324b99e632c30725f32df84542ff7862bd339c2"
5011
5046
  },
5012
5047
  {
5013
5048
  "path": "modules/provisioning/tests/liveness.mjs",
@@ -5017,7 +5052,7 @@
5017
5052
  {
5018
5053
  "path": "modules/provisioning/tests/provisioning.mjs",
5019
5054
  "mode": "0000644",
5020
- "sha256": "3db404b6ad50e01de0b1d73131cefc01ab8fe939eee18157ba6aa8f28a05fb7f"
5055
+ "sha256": "38bc7eb2f1dfd3c03f2c48f42683821ebefbe68fafec95dec491bb3df926b7e0"
5021
5056
  },
5022
5057
  {
5023
5058
  "path": "modules/provisioning/ui/.gitkeep",
@@ -5442,12 +5477,12 @@
5442
5477
  {
5443
5478
  "path": "package-lock.json",
5444
5479
  "mode": "0000644",
5445
- "sha256": "022b69ded283068fcd60758e3dbb676e64fd660c782700e3d52da3f7c00b8b1e"
5480
+ "sha256": "4e7b2bce0bc55c3eba541e39d4d28348353108eb837b9469b02267bdb42e9628"
5446
5481
  },
5447
5482
  {
5448
5483
  "path": "package.json",
5449
5484
  "mode": "0000644",
5450
- "sha256": "39ac5d6d5119b7473a0247f6296c83d175af6323f9d6b3c23ad83f6ff89f332e"
5485
+ "sha256": "173eb6f8f5be1226bd5193296aa3f0e8700b185ee850f250d8a6357cf5f3b6e6"
5451
5486
  },
5452
5487
  {
5453
5488
  "path": "public-docs/index.html",
@@ -5897,7 +5932,7 @@
5897
5932
  {
5898
5933
  "path": "public-landing/projects.html",
5899
5934
  "mode": "0000644",
5900
- "sha256": "6d67e17827d007228c41e7d2dc7d823a5c33a81cb904f1a7e4b0849daf290974"
5935
+ "sha256": "274377ffb14a84b47867728bfa04a8198b57f9b13bcb3e16cadcd1a6ae2810d9"
5901
5936
  },
5902
5937
  {
5903
5938
  "path": "public-landing/projects.probes.json",
@@ -6352,7 +6387,7 @@
6352
6387
  {
6353
6388
  "path": "scripts/gds/fitness.js",
6354
6389
  "mode": "0000644",
6355
- "sha256": "2fcc7dfa75a6fcf1ebc0fb75d0e4343dc54b9d75b88fb798f8b16674b919c1b8"
6390
+ "sha256": "ec823ee34e55318a1bee8008658fe44c24158e43a3736065312ae931d0bab796"
6356
6391
  },
6357
6392
  {
6358
6393
  "path": "scripts/gds/gate-review.js",
@@ -6622,7 +6657,7 @@
6622
6657
  {
6623
6658
  "path": "scripts/gds/onboard.js",
6624
6659
  "mode": "0000644",
6625
- "sha256": "71ee037f1e893a1bcbcaca95e6bdc80c5eb4f5d3e613b59b95e1272d673d3d12"
6660
+ "sha256": "bc169c26bfcddb6789e5fd7f8c2fc53bdaccadf75b7ea4dc2a96ea81d3f92c4d"
6626
6661
  },
6627
6662
  {
6628
6663
  "path": "scripts/gds/onboarding-analyze.js",
@@ -6672,7 +6707,7 @@
6672
6707
  {
6673
6708
  "path": "scripts/gds/provision-net.js",
6674
6709
  "mode": "0000644",
6675
- "sha256": "18c03ffa9cb4ec417ca527928a2146fa72630eada173c7e207dbad513af70acc"
6710
+ "sha256": "01b6ef89cbef4d898934c1802dec416c6085f0dde5ae49012bd2fa7a14bb9589"
6676
6711
  },
6677
6712
  {
6678
6713
  "path": "scripts/gds/provision-repo.js",
@@ -7382,7 +7417,7 @@
7382
7417
  {
7383
7418
  "path": "src/bongos/middleware/rate-limit.js",
7384
7419
  "mode": "0000644",
7385
- "sha256": "3c725bd59ff9be82850b1f68ceb5e9d0dfb2ded9371e0623fab816a6b03fc144"
7420
+ "sha256": "cd28f4517614b4b812aba3c051674ebaff8e78fd741a2e464966b687c459a654"
7386
7421
  },
7387
7422
  {
7388
7423
  "path": "src/bongos/module-scope-map.js",
@@ -7452,7 +7487,7 @@
7452
7487
  {
7453
7488
  "path": "src/bongos/routes/auth.js",
7454
7489
  "mode": "0000644",
7455
- "sha256": "ba9fbc7fb9d210d850578b81dd54bbbe777634988107e8d5791b37acd0fffa0d"
7490
+ "sha256": "4c26db2cae7070a44523053d369da83a41ed38677b46292da927b061a398a4eb"
7456
7491
  },
7457
7492
  {
7458
7493
  "path": "src/bongos/routes/backup.js",
@@ -7567,7 +7602,7 @@
7567
7602
  {
7568
7603
  "path": "src/module-api.js",
7569
7604
  "mode": "0000644",
7570
- "sha256": "a0b22f52d4549706a689fe6e4c328f03f36d0ad340e90fc4a8bf6c555ea94b54"
7605
+ "sha256": "f2d4f01228f6c10d90a87717756c696e1a0c37d52872f735f2e26da19ea4cb66"
7571
7606
  },
7572
7607
  {
7573
7608
  "path": "src/module-loader/catalog.js",
@@ -7619,6 +7654,11 @@
7619
7654
  "mode": "0000644",
7620
7655
  "sha256": "4d8435e7f8b949715ee40843beddc1868105edd9c67b269cfa8f510a192e9212"
7621
7656
  },
7657
+ {
7658
+ "path": "tests/account_existence_rate_limit.mjs",
7659
+ "mode": "0000644",
7660
+ "sha256": "41170e6fa3bc063770a39f4fe5b21e049ae91c8c4115b3b2152a7e464420fb6f"
7661
+ },
7622
7662
  {
7623
7663
  "path": "tests/account_privacy_flags.mjs",
7624
7664
  "mode": "0000644",
@@ -8129,6 +8169,16 @@
8129
8169
  "mode": "0000644",
8130
8170
  "sha256": "69f4e40c66e49e4d2c58f1f41ec1c515b2cb44891e40b6192ed898484d10671d"
8131
8171
  },
8172
+ {
8173
+ "path": "tests/connections_api.mjs",
8174
+ "mode": "0000644",
8175
+ "sha256": "fe844d310fbe79e38f199dc623a96e0facd751967a9a247be5cbe9c15f80f13a"
8176
+ },
8177
+ {
8178
+ "path": "tests/connections_ownership.mjs",
8179
+ "mode": "0000644",
8180
+ "sha256": "1d716fc81ebdb81daedade019f5adcdda2161c06df40711c8fb78f3ec5d605b0"
8181
+ },
8132
8182
  {
8133
8183
  "path": "tests/consumer_layout_boot.mjs",
8134
8184
  "mode": "0000644",
@@ -9332,7 +9382,7 @@
9332
9382
  {
9333
9383
  "path": "tests/module_api.mjs",
9334
9384
  "mode": "0000644",
9335
- "sha256": "e5bb1ae80c818eec08f3f06999037b61d176afecb850fe65e4eab6c34e97b6b1"
9385
+ "sha256": "9b2394ce72e74a96460c6d9ef1cc2ee280dded85523fae2979d56a49fb514b85"
9336
9386
  },
9337
9387
  {
9338
9388
  "path": "tests/module_catalog.mjs",
@@ -9432,7 +9482,7 @@
9432
9482
  {
9433
9483
  "path": "tests/onboard.mjs",
9434
9484
  "mode": "0000644",
9435
- "sha256": "92dd484634703c5204bc88eeccfdfdf310a2b0984488fb8d065d52a246b9f998"
9485
+ "sha256": "3065c1ef3a57e3cd53b4e18bf7193cc3fe93efa012958628e8c99d6b9bfd8eae"
9436
9486
  },
9437
9487
  {
9438
9488
  "path": "tests/onboarding_gate.mjs",
@@ -9477,7 +9527,7 @@
9477
9527
  {
9478
9528
  "path": "tests/own_scope_guard.mjs",
9479
9529
  "mode": "0000644",
9480
- "sha256": "da02342121dbf5be0cc31c009316f0473d010e592f1a06fc9276a184a3be2846"
9530
+ "sha256": "074346fee8dbc4de221600d21a4066852125f4f3d0b4f792093e9546ba2cd900"
9481
9531
  },
9482
9532
  {
9483
9533
  "path": "tests/own_session_revoke.mjs",
@@ -9597,12 +9647,12 @@
9597
9647
  {
9598
9648
  "path": "tests/projects_hub.mjs",
9599
9649
  "mode": "0000644",
9600
- "sha256": "16d5ed7e9d6c24b8743996e8de44674297ef1355605f90b60783cd6fba419ea0"
9650
+ "sha256": "b4090f624c1887dede854f67dfcb5c5dd851fdd90b048f6a649fcf651f70bc27"
9601
9651
  },
9602
9652
  {
9603
9653
  "path": "tests/projects_hub_pre_uat.mjs",
9604
9654
  "mode": "0000644",
9605
- "sha256": "9cf9882d54011ea2284cb709c02abd2228d6a073b207e255b8958e0ca54794ae"
9655
+ "sha256": "ccf476dbf012724c8b5de2080decd322eed3febb97d4079bfda7f0e1ec2ed733"
9606
9656
  },
9607
9657
  {
9608
9658
  "path": "tests/promote_goal_id.mjs",
@@ -9617,7 +9667,7 @@
9617
9667
  {
9618
9668
  "path": "tests/provision.mjs",
9619
9669
  "mode": "0000644",
9620
- "sha256": "32f6a64ed1da1fcfe703f16ee171592262268b24eb833a171d1b5e289ad3e804"
9670
+ "sha256": "9744b866060ae83fc560f65e579fc30e73957ff21329994ca3d581dbe1726053"
9621
9671
  },
9622
9672
  {
9623
9673
  "path": "tests/provision_restart.mjs",
@@ -19,7 +19,18 @@ Interview the owner for: product name, world name, company; the **GitHub repo**
19
19
 
20
20
  **Human-only (UI-first):** have them create an **empty** GitHub repository — github.com → **New repository** → name it, leave it empty (no README), Create. That repo is where the instance's own code will live.
21
21
 
22
- ### 2. DNS token preflight — BEFORE you commit the address (task 1980)
22
+ ### 2. Tell us about the project — OPTIONAL, and skipping it is fine (task 1002334)
23
+
24
+ Ask two things, and offer the skip in the same breath — a "you can leave this blank" that arrives *after* the question reads as a test:
25
+
26
+ - **What are you building?** A sentence or two. This is the project's **description**, and it is half of the publish gate ([ADR 0182](../../../docs/adr/<redacted>.md) D4: a project is on the public map iff it has a name AND a description).
27
+ - **Who's building it?** `solo` / `small-team` / `community`. This is what the platform's setup recommendations read.
28
+
29
+ Both ride the provisioning request as `description` and `detail: { team_shape }`. **Skipping is a supported default, not a failure:** the project stands up exactly the same, it just stays *dark matter* — off the public map and un-joinable — until a description exists. Say that plainly when the owner skips, and say the way back with it: `PATCH /provisioning/instances/:id/detail` fills either answer in later, and publishes the project the moment the description lands.
30
+
31
+ Never gate the standup on this step, and never invent an answer the owner didn't give — a recommendation built on a guess is worse than no recommendation.
32
+
33
+ ### 3. DNS token preflight — BEFORE you commit the address (task 1980)
23
34
 
24
35
  Before anything is provisioned, verify the control-plane's Cloudflare token can actually manage the domain's zone (a mismatched-zone token is exactly what broke the Emersonian standup mid-flow):
25
36
 
@@ -30,12 +41,12 @@ node scripts/gds/provision.js dns-check <domain>
30
41
  - ✓ reachable → continue.
31
42
  - ✗ not reachable → **STOP and resolve it now**, don't push past it. The command prints the fix; usually: widen the Cloudflare API token to include the domain's zone (CF dashboard → My Profile → API Tokens → edit → Zone Resources → Include → the zone), then re-run `dns-check` until green. Only then proceed.
32
43
 
33
- ### 3. `bongos init` — scaffold (greenfield) **or** `--adopt` (brownfield)
44
+ ### 4. `bongos init` — scaffold (greenfield) **or** `--adopt` (brownfield)
34
45
 
35
46
  **This is the one leg that branches** (ADR 0121 §Decision 1). Pick the mode that matches the repo:
36
47
 
37
48
  - **Greenfield** — a NEW, empty repo. The default below.
38
- - **Brownfield / adopt** — an EXISTING repo (code, history, a backlog). Run `node bin/bongos.js init --adopt` instead. It DETECTS the repo's stack, runs a conflict **pre-flight** (migration-namespace / fitness-boundary / protected-path / CI-check collisions) and writes **nothing until you accept** (interactive y/N, or `--accept`); a genuine BLOCK (e.g. a `core_`-prefixed migration) is a hard stop, not accept-able. On accept it LAYERS the lean config + the pinned `@cloudbongos/core` dep + `.claude/` **additively** (merges-or-leaves-and-reports; never clobbers, never the `--force` path), captures the repo's **REAL** current version/goal, and imports its existing backlog (open GitHub issues via `GITHUB_TOKEN`/`GH_TOKEN`, else a `TODO`/`ROADMAP`/`BACKLOG` file). Then **skip step 4** — adopt layered onto the existing repo, there is no empty repo to scaffold — and continue from step 5 (provision). Every other leg is identical.
49
+ - **Brownfield / adopt** — an EXISTING repo (code, history, a backlog). Run `node bin/bongos.js init --adopt` instead. It DETECTS the repo's stack, runs a conflict **pre-flight** (migration-namespace / fitness-boundary / protected-path / CI-check collisions) and writes **nothing until you accept** (interactive y/N, or `--accept`); a genuine BLOCK (e.g. a `core_`-prefixed migration) is a hard stop, not accept-able. On accept it LAYERS the lean config + the pinned `@cloudbongos/core` dep + `.claude/` **additively** (merges-or-leaves-and-reports; never clobbers, never the `--force` path), captures the repo's **REAL** current version/goal, and imports its existing backlog (open GitHub issues via `GITHUB_TOKEN`/`GH_TOKEN`, else a `TODO`/`ROADMAP`/`BACKLOG` file). Then **skip step 5** — adopt layered onto the existing repo, there is no empty repo to scaffold — and continue from step 6 (provision). Every other leg is identical.
39
50
 
40
51
  Greenfield:
41
52
 
@@ -45,11 +56,11 @@ node bin/bongos.js init # interview (or: init --from spec.json for non-
45
56
 
46
57
  It writes lean `config/branding.json` / `config/modules.json` / `config/hierarchy.json`, seeds the first version + its done-when goal, files the human-only kickoff tasks, and — when you opt into hosting — files a **provisioning request** (`POST /provisioning/instances`). Choose **hosting shape `standalone`**. Enable the `provisioning` module on the target so the request is honored (`config/modules.json` → `"provisioning": true`).
47
58
 
48
- ### 4. Scaffold the standalone repo
59
+ ### 5. Scaffold the standalone repo
49
60
 
50
- Materialize the instance's own repo (ADR 0108): clone the empty GitHub repo to the standalone root (`${PROVISION_STANDALONE_BASE:-/srv/cloudbongos}/<slug>` on the control plane), drop in the `config/` + `.claude/` from step 3, and pin the core as a dependency (`@cloudbongos/core` in the instance `package.json`). Commit + push. This checkout is what the standalone service will run from.
61
+ Materialize the instance's own repo (ADR 0108): clone the empty GitHub repo to the standalone root (`${PROVISION_STANDALONE_BASE:-/srv/cloudbongos}/<slug>` on the control plane), drop in the `config/` + `.claude/` from step 4, and pin the core as a dependency (`@cloudbongos/core` in the instance `package.json`). Commit + push. This checkout is what the standalone service will run from.
51
62
 
52
- ### 5. Provision — core + DB + address + service (task 1978)
63
+ ### 6. Provision — core + DB + address + service (task 1978)
53
64
 
54
65
  The web tier only **enqueued** the request; the **control-plane runner** does the real work (it alone holds the DO/Cloudflare tokens):
55
66
 
@@ -60,7 +71,7 @@ node scripts/gds/provision.js run-intents --apply # drains the queue
60
71
 
61
72
  For `standalone` this composes: allocate a port → `git pull` + `npm ci --omit=dev` (installs the pinned core) → `createdb` + **instance-root** migrate (`node_modules/@cloudbongos/core/scripts/migrate.sh`) → per-instance `/etc/<slug>/web.env` → a **standalone systemd unit** (runs the core package's `platform-server.js` from the instance repo) → DNS A-record UPSERT → per-instance Caddy snippet (on-demand TLS) → `/healthz`. It is idempotent + dry-run-by-default (omit `--apply` to preview). It **fail-fasts on the step-2 DNS preflight** if step 2's token check was skipped.
62
73
 
63
- ### 6. GitHub sign-in — ONE click (App Manifest flow), or a manual OAuth app + first sign-in
74
+ ### 7. GitHub sign-in — ONE click (App Manifest flow), or a manual OAuth app + first sign-in
64
75
 
65
76
  **Recommended — one click (task 2080, ADR 0133).** GitHub has no create-an-OAuth-App API, but it *does* let us pre-fill a **GitHub App Manifest**: the owner clicks one link, approves on GitHub, and GitHub hands the control plane the credentials automatically — **no OAuth app to hand-create, no secret to copy-paste ever.** From the control-plane hall, **Start a project → “Set up GitHub sign-in”** (the button appears once the instance is requested; it needs the instance's **domain** set). Under the hood it:
66
77
 
@@ -89,7 +100,7 @@ node scripts/gds/oauth-secret.js place <slug> --client-id <id> --client-secret <
89
100
 
90
101
  **Human-only — first sign-in.** The owner opens `https://<domain>` and signs in with GitHub **once**. This seats the **founding Archon** — config alone seats no one, so this step is inherent and cannot be automated.
91
102
 
92
- ### 7. Verify
103
+ ### 8. Verify
93
104
 
94
105
  ```bash
95
106
  curl -s https://<domain>/healthz # → {"ok":true,"auth_configured":true}
@@ -97,11 +108,11 @@ curl -s https://<domain>/healthz # → {"ok":true,"auth_configured":tru
97
108
 
98
109
  Confirm the owner is **Archon** (their profile / the hall roster). If `auth_configured` is `false`, re-run the `oauth-secret place` step and recheck the OAuth app values.
99
110
 
100
- ### 8. Brand
111
+ ### 9. Brand
101
112
 
102
113
  Fill the instance **look** — theme / palette / fonts in `config/branding.json` (see `docs/branding-fill-prompt.md`). The identity strings were set at init; this is the visual layer. "Brand with your own LLM."
103
114
 
104
- ### 9. Enter your builders hall
115
+ ### 10. Enter your builders hall
105
116
 
106
117
  The hall is the point of everything above — end there, not at brand (task 1002703):
107
118
 
@@ -118,4 +129,4 @@ A new owner has gone zero → live: their own standalone repo on a pinned core,
118
129
  - **Standalone only** (ADR 0108) — do not fall back to editing this monorepo's checkout for a new project.
119
130
  - **Never weaken the trust boundary** — the web tier enqueues; only the control-plane runner (`provision.js`) touches cloud tokens (ADR 0016 / 0111 §2).
120
131
  - **Live docs are automatic** — a standalone instance's session-log index regenerates on deploy (`provision.js` runs `regen-instance-docs.js` after migrate; `bongos init`/`upgrade` seed+refresh it), and the whole-file nav docs are gitignored so `git reset --hard` never wipes them ([ADR 0147](../../../docs/adr/<redacted>.md)). If you wire a **bespoke** deploy script for an instance, it MUST call `node node_modules/@bongos/core/scripts/gds/regen-instance-docs.js` after `git reset` + migrate — see [`docs/recipes/standalone-live-docs.md`](../../../docs/recipes/standalone-live-docs.md).
121
- - **Adopting an EXISTING repo** (brownfield) is the other branch of the scaffold leg (step 3) — `bongos init --adopt` ([ADR 0121](../../../docs/adr/<redacted>.md)): detect → accept-gated conflict pre-flight → additive layering (never clobbers) → real version/goal + backlog import. Built; the `bongos onboard` CLI and the hall "start a project" wizard offer the same greenfield-vs-adopt choice.
132
+ - **Adopting an EXISTING repo** (brownfield) is the other branch of the scaffold leg (step 4) — `bongos init --adopt` ([ADR 0121](../../../docs/adr/<redacted>.md)): detect → accept-gated conflict pre-flight → additive layering (never clobbers) → real version/goal + backlog import. Built; the `bongos onboard` CLI and the hall "start a project" wizard offer the same greenfield-vs-adopt choice.
@@ -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
- - 330 operations across 52 resource groups
8
+ - 338 operations across 53 resource groups
9
9
 
10
10
  ## Install
11
11
 
@@ -264,6 +264,22 @@ function createClient(opts = {}) {
264
264
  // GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
265
265
  getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
266
266
  },
267
+ "connections": {
268
+ // GET /connections — rank: any-builder — GET /connections
269
+ getConnections: (args) => request("GET", "/connections", { hasBody: false }, args),
270
+ // POST /connections — rank: any-builder — POST /connections
271
+ postConnections: (args) => request("POST", "/connections", { hasBody: true }, args),
272
+ // DELETE /connections/{id} — rank: any-builder — DELETE /connections/:id
273
+ deleteConnectionsId: (args) => request("DELETE", "/connections/{id}", { hasBody: false }, args),
274
+ // POST /connections/{id}/accept — rank: any-builder — POST /connections/:id/accept
275
+ postConnectionsIdAccept: (args) => request("POST", "/connections/{id}/accept", { hasBody: true }, args),
276
+ // POST /connections/{id}/decline — rank: any-builder — POST /connections/:id/decline
277
+ postConnectionsIdDecline: (args) => request("POST", "/connections/{id}/decline", { hasBody: true }, args),
278
+ // GET /connections/degree/{handle} — rank: any-builder — GET /connections/degree/:handle
279
+ getConnectionsDegreeHandle: (args) => request("GET", "/connections/degree/{handle}", { hasBody: false }, args),
280
+ // GET /connections/requests — rank: any-builder — GET /connections/requests
281
+ getConnectionsRequests: (args) => request("GET", "/connections/requests", { hasBody: false }, args),
282
+ },
267
283
  "copyDesk": {
268
284
  // POST /copy-desk/flags — rank: any-builder — POST /copy-desk/flags
269
285
  postCopyDeskFlags: (args) => request("POST", "/copy-desk/flags", { hasBody: true }, args),
@@ -625,6 +641,8 @@ function createClient(opts = {}) {
625
641
  postProvisioningInstances: (args) => request("POST", "/provisioning/instances", { hasBody: true }, args),
626
642
  // GET /provisioning/instances/{id} — rank: any-builder — GET /provisioning/instances/:id
627
643
  getProvisioningInstancesId: (args) => request("GET", "/provisioning/instances/{id}", { hasBody: false }, args),
644
+ // PATCH /provisioning/instances/{id}/detail — rank: any-builder — PATCH /provisioning/instances/:id/detail
645
+ patchProvisioningInstancesIdDetail: (args) => request("PATCH", "/provisioning/instances/{id}/detail", { hasBody: true }, args),
628
646
  // POST /provisioning/instances/{id}/domain — rank: any-builder — POST /provisioning/instances/:id/domain
629
647
  postProvisioningInstancesIdDomain: (args) => request("POST", "/provisioning/instances/{id}/domain", { hasBody: true }, args),
630
648
  // POST /provisioning/instances/{id}/force-teardown — rank: metic+archon — POST /provisioning/instances/:id/force-teardown
@@ -263,6 +263,22 @@ function createClient(opts = {}) {
263
263
  // GET /closeness/with/{builderId} — rank: any-builder — GET /closeness/with/:builderId
264
264
  getClosenessWithBuilderId: (args) => request("GET", "/closeness/with/{builderId}", { hasBody: false }, args),
265
265
  },
266
+ "connections": {
267
+ // GET /connections — rank: any-builder — GET /connections
268
+ getConnections: (args) => request("GET", "/connections", { hasBody: false }, args),
269
+ // POST /connections — rank: any-builder — POST /connections
270
+ postConnections: (args) => request("POST", "/connections", { hasBody: true }, args),
271
+ // DELETE /connections/{id} — rank: any-builder — DELETE /connections/:id
272
+ deleteConnectionsId: (args) => request("DELETE", "/connections/{id}", { hasBody: false }, args),
273
+ // POST /connections/{id}/accept — rank: any-builder — POST /connections/:id/accept
274
+ postConnectionsIdAccept: (args) => request("POST", "/connections/{id}/accept", { hasBody: true }, args),
275
+ // POST /connections/{id}/decline — rank: any-builder — POST /connections/:id/decline
276
+ postConnectionsIdDecline: (args) => request("POST", "/connections/{id}/decline", { hasBody: true }, args),
277
+ // GET /connections/degree/{handle} — rank: any-builder — GET /connections/degree/:handle
278
+ getConnectionsDegreeHandle: (args) => request("GET", "/connections/degree/{handle}", { hasBody: false }, args),
279
+ // GET /connections/requests — rank: any-builder — GET /connections/requests
280
+ getConnectionsRequests: (args) => request("GET", "/connections/requests", { hasBody: false }, args),
281
+ },
266
282
  "copyDesk": {
267
283
  // POST /copy-desk/flags — rank: any-builder — POST /copy-desk/flags
268
284
  postCopyDeskFlags: (args) => request("POST", "/copy-desk/flags", { hasBody: true }, args),
@@ -624,6 +640,8 @@ function createClient(opts = {}) {
624
640
  postProvisioningInstances: (args) => request("POST", "/provisioning/instances", { hasBody: true }, args),
625
641
  // GET /provisioning/instances/{id} — rank: any-builder — GET /provisioning/instances/:id
626
642
  getProvisioningInstancesId: (args) => request("GET", "/provisioning/instances/{id}", { hasBody: false }, args),
643
+ // PATCH /provisioning/instances/{id}/detail — rank: any-builder — PATCH /provisioning/instances/:id/detail
644
+ patchProvisioningInstancesIdDetail: (args) => request("PATCH", "/provisioning/instances/{id}/detail", { hasBody: true }, args),
627
645
  // POST /provisioning/instances/{id}/domain — rank: any-builder — POST /provisioning/instances/:id/domain
628
646
  postProvisioningInstancesIdDomain: (args) => request("POST", "/provisioning/instances/{id}/domain", { hasBody: true }, args),
629
647
  // POST /provisioning/instances/{id}/force-teardown — rank: metic+archon — POST /provisioning/instances/:id/force-teardown