@bongos/core 1.19.514 → 1.19.516

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 (38) hide show
  1. package/.bongos-core.json +81 -36
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +12 -0
  4. package/clients/bongos-client/index.cjs +12 -0
  5. package/clients/bongos-client/index.d.ts +22 -2
  6. package/clients/bongos-client/index.mjs +12 -0
  7. package/docs/adr/0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md +157 -0
  8. package/docs/adr/README.md +1 -0
  9. package/docs/api/openapi.json +362 -6
  10. package/docs/api-reference.md +12 -2
  11. package/docs/copy-inventory.md +224 -218
  12. package/docs/copy-registry.json +357 -291
  13. package/docs/module-api-changelog.md +4 -0
  14. package/modules/dev-box/app/src/vendor/bongos-client.cjs +12 -0
  15. package/modules/government/catalog.js +6 -0
  16. package/modules/government/migrations/government_009_mingle_manage.sql +55 -0
  17. package/modules/lifecycle/migrations/lifecycle_007_mingle.sql +134 -0
  18. package/modules/lifecycle/mingle.js +337 -0
  19. package/modules/lifecycle/module.json +1 -0
  20. package/modules/lifecycle/routes/mingle.js +116 -0
  21. package/modules/provisioning/migrations/provisioning_014_module_selection.sql +60 -0
  22. package/modules/provisioning/provisioning.js +24 -4
  23. package/modules/provisioning/routes/provisioning.js +59 -2
  24. package/modules/provisioning/starter-bundles.js +91 -0
  25. package/modules/public-landing/public/assets/cosmos.css +1 -1
  26. package/modules/public-landing/public/projects.html +230 -35
  27. package/modules/public-landing/public/projects.probes.json +2 -2
  28. package/modules/public-landing/public/projects.states.json +5 -4
  29. package/modules/ui-design/kit/serve.js +32 -0
  30. package/package-lock.json +2 -2
  31. package/package.json +1 -1
  32. package/src/module-api.js +1 -1
  33. package/tests/government_seed.mjs +35 -0
  34. package/tests/mingle.mjs +370 -0
  35. package/tests/projects_hub.mjs +72 -7
  36. package/tests/projects_hub_module_picker.mjs +369 -0
  37. package/tests/provisioning_module_selection.mjs +286 -0
  38. package/tests/provisioning_starter_bundles.mjs +131 -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.514",
6
- "core_contract": "1.19.514",
7
- "source_commit": "b092f2a3e4ee99d6f856ae4d1440ed723f1dcba8",
5
+ "core_version": "1.19.516",
6
+ "core_contract": "1.19.516",
7
+ "source_commit": "b92f5957bf6d2995db7633b965ea029192fb05df",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-03T19:32:24.004Z",
9
+ "built_at": "2026-09-03T19:52:58.155Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 430,
12
+ "docs_redacted": 431,
13
13
  "agent_docs_stubbed": 24,
14
- "functional_verbatim": 1958,
14
+ "functional_verbatim": 1966,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2412,
20
- "tree_sha256": "4ea8c8583161c137a8be9e3d96b1db2589a64bd504a47f7e75ebeb15232753d2",
19
+ "file_count": 2421,
20
+ "tree_sha256": "d9225673c69711642ce6ca8ae5ec201351c431974565132d756573f715a2c62e",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -362,12 +362,12 @@
362
362
  {
363
363
  "path": "clients/bongos-client/README.md",
364
364
  "mode": "0000644",
365
- "sha256": "546f5670b4637aa1d4c492a8616d5189a971c79e8e2e163d12fe11276292faa6"
365
+ "sha256": "7a346b2474cdde1c10c16c55defddb37ea43f462cee07b6b0bb8262114fa4296"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/bongos-client.global.js",
369
369
  "mode": "0000644",
370
- "sha256": "ae151ff268d04dced73fae1136c682215a02e59bae5edb68a3d6001c0143dd57"
370
+ "sha256": "1ca4f95d1d9dbd9edacdee3731182fcd7bee8f5fe247d681028657c3a4481cb5"
371
371
  },
372
372
  {
373
373
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -377,17 +377,17 @@
377
377
  {
378
378
  "path": "clients/bongos-client/index.cjs",
379
379
  "mode": "0000644",
380
- "sha256": "72d841c53787c5ad83b214c2ac816fd4cb9c97b47329eb0417b80e660a9f6b02"
380
+ "sha256": "8243bbb4887f66a4e6f25ed22b664d3ee123ebaa015271d01ae61dbc7d05112c"
381
381
  },
382
382
  {
383
383
  "path": "clients/bongos-client/index.d.ts",
384
384
  "mode": "0000644",
385
- "sha256": "07554254c8559f81ec5cf45807ddccd8488732b228a618167455c932e7f05750"
385
+ "sha256": "2f810adf74673288b2c564c1624f06c5c320e4fe050af55b0cc8bc671ec10143"
386
386
  },
387
387
  {
388
388
  "path": "clients/bongos-client/index.mjs",
389
389
  "mode": "0000644",
390
- "sha256": "c4b04368e61803e2fe36f26ba3757aa75ada7e465384baf3e53cd012c9ce8423"
390
+ "sha256": "c64f0c9b8f785680f2f2ee47307dde71c69d8b0f05bcffc1777d55a059b63fd5"
391
391
  },
392
392
  {
393
393
  "path": "clients/bongos-client/package.json",
@@ -1704,20 +1704,25 @@
1704
1704
  "mode": "0000644",
1705
1705
  "sha256": "42b20cd6d2e8a8d76c980df73087fd404487e4c479034dbe34d8297677bd9387"
1706
1706
  },
1707
+ {
1708
+ "path": "docs/adr/0240-a-skipped-module-picker-stores-nothing-and-resolves-the-bundle-on-read.md",
1709
+ "mode": "0000644",
1710
+ "sha256": "d8bffd4c66cfddfeadd3c734d029e357f05a8eb804a79e5c3cad4014c9417b56"
1711
+ },
1707
1712
  {
1708
1713
  "path": "docs/adr/README.md",
1709
1714
  "mode": "0000644",
1710
- "sha256": "cef542ef427dd81632465f17c6343c6b27f3ab69436eba2130c4fa4b5c9bc4ae"
1715
+ "sha256": "e3bb2c282df45ec41150fd041df3c2525d653184858c2bb0a6c7fff670f4b85c"
1711
1716
  },
1712
1717
  {
1713
1718
  "path": "docs/api-reference.md",
1714
1719
  "mode": "0000644",
1715
- "sha256": "36baedec0a98a17dd013bf264cdb5502624de9529ed62e69aa88590574b1b236"
1720
+ "sha256": "b137673ee16cd6f7d32b0b24d12b6c8e844a2e6e415a8118a4d458c382e5724f"
1716
1721
  },
1717
1722
  {
1718
1723
  "path": "docs/api/openapi.json",
1719
1724
  "mode": "0000644",
1720
- "sha256": "718e7ab37e024cce51fb82da0b3a535aff961d04fb0dc5e25b8ec31a61e64851"
1725
+ "sha256": "fd2bf9ee3b86b31bff72933594b984324c4387b36a369a6cbb3998389aaa2bcf"
1721
1726
  },
1722
1727
  {
1723
1728
  "path": "docs/architecture.md",
@@ -1742,12 +1747,12 @@
1742
1747
  {
1743
1748
  "path": "docs/copy-inventory.md",
1744
1749
  "mode": "0000644",
1745
- "sha256": "0cc8ccfda8d8e3e7b518fae7a7584bb368d7d2eac6703518404d30f0b6ead30d"
1750
+ "sha256": "e6aba956f5d6f056788f8d43f52dfcf4e242a9dff3bc348f312c875b4cd04be2"
1746
1751
  },
1747
1752
  {
1748
1753
  "path": "docs/copy-registry.json",
1749
1754
  "mode": "0000644",
1750
- "sha256": "1003ea51740a5f71af49e05c66ba088c337185680dd92a391c959e8ea76a3f40"
1755
+ "sha256": "5d0fca4e1e8b63e3679fe656ad773e914f944fa93fac66defeb46bb3642a6d74"
1751
1756
  },
1752
1757
  {
1753
1758
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2592,7 +2597,7 @@
2592
2597
  {
2593
2598
  "path": "docs/module-api-changelog.md",
2594
2599
  "mode": "0000644",
2595
- "sha256": "decebcba9ee02ff15412e119309d9a37203ee82159922157b37c7cd7ddc21926"
2600
+ "sha256": "98e8b564cdaccd042553e8337d0d67222911bdf7958f02e168f1b200da2183a9"
2596
2601
  },
2597
2602
  {
2598
2603
  "path": "docs/modules-contract.md",
@@ -3962,7 +3967,7 @@
3962
3967
  {
3963
3968
  "path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
3964
3969
  "mode": "0000644",
3965
- "sha256": "72d841c53787c5ad83b214c2ac816fd4cb9c97b47329eb0417b80e660a9f6b02"
3970
+ "sha256": "8243bbb4887f66a4e6f25ed22b664d3ee123ebaa015271d01ae61dbc7d05112c"
3966
3971
  },
3967
3972
  {
3968
3973
  "path": "modules/dev-box/app/test/unit.mjs",
@@ -4202,7 +4207,7 @@
4202
4207
  {
4203
4208
  "path": "modules/government/catalog.js",
4204
4209
  "mode": "0000644",
4205
- "sha256": "89c03f4af6b1a2bfef8c6820621b977d4872cd7fd4432e4f5ab506063c9acf96"
4210
+ "sha256": "36914d187c0dfe9d87d8d82b19111aa1d338de15b64724275dd8ecc005eead13"
4206
4211
  },
4207
4212
  {
4208
4213
  "path": "modules/government/config.js",
@@ -4294,6 +4299,11 @@
4294
4299
  "mode": "0000644",
4295
4300
  "sha256": "2392050b4295f9fdb4105b8434a4c44833b5f0e850f11b41afe82ea1860fef34"
4296
4301
  },
4302
+ {
4303
+ "path": "modules/government/migrations/government_009_mingle_manage.sql",
4304
+ "mode": "0000644",
4305
+ "sha256": "986be40845d7a5d786d088dc9c0b8d6f9990062299418edb648c246c5a49fb07"
4306
+ },
4297
4307
  {
4298
4308
  "path": "modules/government/module.json",
4299
4309
  "mode": "0000644",
@@ -5429,10 +5439,20 @@
5429
5439
  "mode": "0000644",
5430
5440
  "sha256": "52c140f39410d4feaf6facd9b2c53b6a5d93ac12d44a0a71fcb81fc5aa1b5c3a"
5431
5441
  },
5442
+ {
5443
+ "path": "modules/lifecycle/migrations/lifecycle_007_mingle.sql",
5444
+ "mode": "0000644",
5445
+ "sha256": "0d17971d88c2f75a61a5646325ebab121fd4406cdd39324a1128a5e610ce6d7d"
5446
+ },
5447
+ {
5448
+ "path": "modules/lifecycle/mingle.js",
5449
+ "mode": "0000644",
5450
+ "sha256": "0b64c29f05955182bb0b767cd09d48d80143016ffc77bc16ff56a8b7fde1ebd9"
5451
+ },
5432
5452
  {
5433
5453
  "path": "modules/lifecycle/module.json",
5434
5454
  "mode": "0000644",
5435
- "sha256": "c18bea123294d549c14b33d121c911e737fa10d12b62d9fe25d73d2387b2f4c1"
5455
+ "sha256": "41da723fe35c3ca3db6226a1ff2208c5256c71eebe3a3768437aeff1fb070312"
5436
5456
  },
5437
5457
  {
5438
5458
  "path": "modules/lifecycle/pollers/publish-reconciler.js",
@@ -5504,6 +5524,11 @@
5504
5524
  "mode": "0000644",
5505
5525
  "sha256": "637c442875fbe297e3aba54f4b6b16f9d06b740782e3506f65c58f34b67ea81d"
5506
5526
  },
5527
+ {
5528
+ "path": "modules/lifecycle/routes/mingle.js",
5529
+ "mode": "0000644",
5530
+ "sha256": "a68f85eb06a620ae7cacd2d04d3056a46191c347e0d975681ab594f7316e8cd6"
5531
+ },
5507
5532
  {
5508
5533
  "path": "modules/lifecycle/routes/recommendations.js",
5509
5534
  "mode": "0000644",
@@ -5969,6 +5994,11 @@
5969
5994
  "mode": "0000644",
5970
5995
  "sha256": "7abe41633cd7f98712c39960fba7175f0bb3340c4568bfbfdc640af911a31e15"
5971
5996
  },
5997
+ {
5998
+ "path": "modules/provisioning/migrations/provisioning_014_module_selection.sql",
5999
+ "mode": "0000644",
6000
+ "sha256": "f4562bd90fdae26c5f7c51851bd2ad7752535bd0dcfb62dd567c11e76330c42b"
6001
+ },
5972
6002
  {
5973
6003
  "path": "modules/provisioning/module.json",
5974
6004
  "mode": "0000644",
@@ -5987,7 +6017,7 @@
5987
6017
  {
5988
6018
  "path": "modules/provisioning/provisioning.js",
5989
6019
  "mode": "0000644",
5990
- "sha256": "67eb2963688cba73fe846b354070e1e43333971425f603b1e84b45552b5381f0"
6020
+ "sha256": "8745258599d655b34204e5878b413308ae48a012b0306bde3297e98e452b3686"
5991
6021
  },
5992
6022
  {
5993
6023
  "path": "modules/provisioning/rate-limit.js",
@@ -6002,12 +6032,12 @@
6002
6032
  {
6003
6033
  "path": "modules/provisioning/routes/provisioning.js",
6004
6034
  "mode": "0000644",
6005
- "sha256": "9285f3f2d426305c060eef4b3b98ae64fc386e4ce487f99d9ad59d9921dc493e"
6035
+ "sha256": "6e78e87a2112974db6db804280c346daa7c38684adace638e3c5734fe6d1ca72"
6006
6036
  },
6007
6037
  {
6008
6038
  "path": "modules/provisioning/starter-bundles.js",
6009
6039
  "mode": "0000644",
6010
- "sha256": "760382a3e361692f9d8457f88122fda498eb6bccecd37b351837fa5c4fa5e6f4"
6040
+ "sha256": "9dd1fe5bd16d22245d62dae05aefb0c74c82772a937da155f1e8d2403f911886"
6011
6041
  },
6012
6042
  {
6013
6043
  "path": "modules/provisioning/tests/liveness.mjs",
@@ -6257,7 +6287,7 @@
6257
6287
  {
6258
6288
  "path": "modules/public-landing/public/assets/cosmos.css",
6259
6289
  "mode": "0000644",
6260
- "sha256": "bb2fa6d0a1c87aeb3e08038faf1d3ae0f06a1a41f9fe6d83f357146bc7e73045"
6290
+ "sha256": "f10975893b3522accc6592246af0b07645c8d910c7637ecc5a006064a0988057"
6261
6291
  },
6262
6292
  {
6263
6293
  "path": "modules/public-landing/public/assets/verro-medallion.png",
@@ -6517,17 +6547,17 @@
6517
6547
  {
6518
6548
  "path": "modules/public-landing/public/projects.html",
6519
6549
  "mode": "0000644",
6520
- "sha256": "8af95785b813eb27e6356fa717a4f20cb73f1220dd9ce15de2d62a18631afdd3"
6550
+ "sha256": "a93dbf381a39bde8d4424bd3f241d24a72d9ed915e7da48bdb125d15085f6fef"
6521
6551
  },
6522
6552
  {
6523
6553
  "path": "modules/public-landing/public/projects.probes.json",
6524
6554
  "mode": "0000644",
6525
- "sha256": "856e0a8a9c4f8b19a05bf1e5e0c0f848a94038e933fa10bbbf35529edbaa9ae9"
6555
+ "sha256": "5801951d08323e2f59aa4e9435e0a7d82c712714a6d1c925768dcfd2bd9a6525"
6526
6556
  },
6527
6557
  {
6528
6558
  "path": "modules/public-landing/public/projects.states.json",
6529
6559
  "mode": "0000644",
6530
- "sha256": "dfe69ecaa3923669bd0c07d440886410e4f67c843e13a1fac4e7b2a1429c3ba3"
6560
+ "sha256": "16fbd27a36c9c32696539c74a815dc9b3f187f5b539b393e3bee7f7dabc4e2a6"
6531
6561
  },
6532
6562
  {
6533
6563
  "path": "modules/public-landing/public/terms.html",
@@ -6952,7 +6982,7 @@
6952
6982
  {
6953
6983
  "path": "modules/ui-design/kit/serve.js",
6954
6984
  "mode": "0000644",
6955
- "sha256": "efb50e76596a5ad009dab58d8e12b590382cc6bf1f819d0ab447cb14a4b4d6a3"
6985
+ "sha256": "4c52462cf61559e9a424107398eca58aa56b3783338827dda6110200fcdfd00a"
6956
6986
  },
6957
6987
  {
6958
6988
  "path": "modules/ui-design/kit/tells.js",
@@ -7262,12 +7292,12 @@
7262
7292
  {
7263
7293
  "path": "package-lock.json",
7264
7294
  "mode": "0000644",
7265
- "sha256": "9c126ed4b632afd9452b01fa9e08eb97295699e99efc9c7d4040a761cac7f58d"
7295
+ "sha256": "d137b5fec77d066d3e93b56a0af042e80252513dfa759872ae352a99b92170f6"
7266
7296
  },
7267
7297
  {
7268
7298
  "path": "package.json",
7269
7299
  "mode": "0000644",
7270
- "sha256": "7cc213de070341042dae24c32b6fc458ae6912399a715d50b18dd92c52548fd8"
7300
+ "sha256": "a212fc90527071642d6693ca0ea6dae91c8ad9c9452a8c19d550f2bf452d1e92"
7271
7301
  },
7272
7302
  {
7273
7303
  "path": "public-docs/index.html",
@@ -8937,7 +8967,7 @@
8937
8967
  {
8938
8968
  "path": "src/module-api.js",
8939
8969
  "mode": "0000644",
8940
- "sha256": "ace7f9365df0b8019d1fbc1758832db878c9b00ff59583a5ddcd839bbb69b1eb"
8970
+ "sha256": "ec17c796e1498bc12b3ecce4d194f7a4026081373d7d209fbfb49343368b5498"
8941
8971
  },
8942
8972
  {
8943
8973
  "path": "src/module-loader/catalog.js",
@@ -10227,7 +10257,7 @@
10227
10257
  {
10228
10258
  "path": "tests/government_seed.mjs",
10229
10259
  "mode": "0000644",
10230
- "sha256": "cd67c76a30e1c69838f99afbb8edd17a0ec2109a8105b61805b9564e27464137"
10260
+ "sha256": "ab6404171b072748798728cba7c5b1a6f759170996d8fea8be5ab26a033b7ac1"
10231
10261
  },
10232
10262
  {
10233
10263
  "path": "tests/government_session_scope.mjs",
@@ -10824,6 +10854,11 @@
10824
10854
  "mode": "0000644",
10825
10855
  "sha256": "db4bbcfea38c91611947c99ca057c15b5e567d04ad9d267b9eee41981bc9418a"
10826
10856
  },
10857
+ {
10858
+ "path": "tests/mingle.mjs",
10859
+ "mode": "0000644",
10860
+ "sha256": "ec5aaf634a70a100b6acb0f28b5b5256865d6d71d1a310dc7384295e133303ed"
10861
+ },
10827
10862
  {
10828
10863
  "path": "tests/mirror_lineage_fulltree.mjs",
10829
10864
  "mode": "0000644",
@@ -11142,7 +11177,12 @@
11142
11177
  {
11143
11178
  "path": "tests/projects_hub.mjs",
11144
11179
  "mode": "0000644",
11145
- "sha256": "22461d4febf616202af96aa37fc940a686841bbf68155094526455ae85ab9886"
11180
+ "sha256": "f8e557372a86d42dc0433414a1d5821a350dc545056fcc8104aa151b51e939f7"
11181
+ },
11182
+ {
11183
+ "path": "tests/projects_hub_module_picker.mjs",
11184
+ "mode": "0000644",
11185
+ "sha256": "5eaa61295f2a22f5b10cb365cee58e485390ccb763a14be15fec00f23aa23087"
11146
11186
  },
11147
11187
  {
11148
11188
  "path": "tests/projects_hub_pre_uat.mjs",
@@ -11189,6 +11229,11 @@
11189
11229
  "mode": "0000644",
11190
11230
  "sha256": "dd53361cf8bd7e517e886701753d64c05c3235995785991558805f493cde529c"
11191
11231
  },
11232
+ {
11233
+ "path": "tests/provisioning_module_selection.mjs",
11234
+ "mode": "0000644",
11235
+ "sha256": "48fc7c59efae4b7d1b9ab565882473483d7b4d8a40635583a789d0749da16578"
11236
+ },
11192
11237
  {
11193
11238
  "path": "tests/provisioning_onboard_mode.mjs",
11194
11239
  "mode": "0000644",
@@ -11227,7 +11272,7 @@
11227
11272
  {
11228
11273
  "path": "tests/provisioning_starter_bundles.mjs",
11229
11274
  "mode": "0000644",
11230
- "sha256": "0d3dadff4425e8d014cca29c66c31ff094e78ffbf2fd246f56ba11c5e1cefc93"
11275
+ "sha256": "9ecf7cda8e47a6e17bbc73afdb0c30c867ab967cea66943082cbe15502fd63bc"
11231
11276
  },
11232
11277
  {
11233
11278
  "path": "tests/provisioning_teardown_intent.mjs",
@@ -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
- - 347 operations across 53 resource groups
8
+ - 352 operations across 54 resource groups
9
9
 
10
10
  ## Install
11
11
 
@@ -588,6 +588,18 @@ function createClient(opts = {}) {
588
588
  // POST /memory/sync — rank: any-builder — POST /memory/sync
589
589
  postMemorySync: (args) => request("POST", "/memory/sync", { hasBody: true }, args),
590
590
  },
591
+ "mingle": {
592
+ // GET /mingle — rank: any-builder — GET /mingle
593
+ getMingle: (args) => request("GET", "/mingle", { hasBody: false }, args),
594
+ // PUT /mingle/opt-in — rank: any-builder — PUT /mingle/opt-in
595
+ putMingleOptIn: (args) => request("PUT", "/mingle/opt-in", { hasBody: true }, args),
596
+ // POST /mingle/pairs/{id}/decide — rank: any-builder — POST /mingle/pairs/:id/decide
597
+ postMinglePairsIdDecide: (args) => request("POST", "/mingle/pairs/{id}/decide", { hasBody: true }, args),
598
+ // PUT /mingle/project — rank: metic+archon — PUT /mingle/project
599
+ putMingleProject: (args) => request("PUT", "/mingle/project", { hasBody: true }, args),
600
+ // POST /mingle/round — rank: metic+archon — POST /mingle/round
601
+ postMingleRound: (args) => request("POST", "/mingle/round", { hasBody: true }, args),
602
+ },
591
603
  "modules": {
592
604
  // GET /modules — rank: any-builder — GET /modules
593
605
  getModules: (args) => request("GET", "/modules", { hasBody: false }, args),
@@ -587,6 +587,18 @@ function createClient(opts = {}) {
587
587
  // POST /memory/sync — rank: any-builder — POST /memory/sync
588
588
  postMemorySync: (args) => request("POST", "/memory/sync", { hasBody: true }, args),
589
589
  },
590
+ "mingle": {
591
+ // GET /mingle — rank: any-builder — GET /mingle
592
+ getMingle: (args) => request("GET", "/mingle", { hasBody: false }, args),
593
+ // PUT /mingle/opt-in — rank: any-builder — PUT /mingle/opt-in
594
+ putMingleOptIn: (args) => request("PUT", "/mingle/opt-in", { hasBody: true }, args),
595
+ // POST /mingle/pairs/{id}/decide — rank: any-builder — POST /mingle/pairs/:id/decide
596
+ postMinglePairsIdDecide: (args) => request("POST", "/mingle/pairs/{id}/decide", { hasBody: true }, args),
597
+ // PUT /mingle/project — rank: metic+archon — PUT /mingle/project
598
+ putMingleProject: (args) => request("PUT", "/mingle/project", { hasBody: true }, args),
599
+ // POST /mingle/round — rank: metic+archon — POST /mingle/round
600
+ postMingleRound: (args) => request("POST", "/mingle/round", { hasBody: true }, args),
601
+ },
590
602
  "modules": {
591
603
  // GET /modules — rank: any-builder — GET /modules
592
604
  getModules: (args) => request("GET", "/modules", { hasBody: false }, args),
@@ -82,6 +82,7 @@ export interface GetMemoryBuildersBuilderIdFileResponse { builder_id: unknown; f
82
82
  export interface GetMemoryBuildersBuilderIdFilesResponse { builder_id: unknown; forensic: boolean; count: unknown; files: unknown }
83
83
  export interface GetMemoryFileResponse { builder_id: unknown; path: unknown; content: unknown; sha256: unknown; byte_len: unknown; mtime: unknown; updated_at: unknown; created_at: unknown }
84
84
  export interface GetMemoryFilesResponse { builder_id: unknown; count: unknown; files: unknown }
85
+ export interface GetMingleResponse { mingle: unknown; open_pairs: unknown; matching: unknown }
85
86
  export interface GetModulesResponse { modules: unknown; own_built: unknown; core_loaded: unknown; catalog: unknown; submit_pipeline_live: boolean }
86
87
  export interface GetModulesSubmissionsResponse { submissions: unknown }
87
88
  export interface GetMyProjectsInvitesResponse { invites: unknown }
@@ -99,7 +100,7 @@ export interface GetProvisioningInstancesResponse { instances: unknown }
99
100
  export interface GetProvisioningOnboardPlanResponse { mode: unknown; steps: unknown }
100
101
  export interface GetProvisioningRecommendationsResponse { recommendations: unknown }
101
102
  export interface GetProvisioningSlugAvailableResponse { slug: unknown; available: unknown; reason: unknown; address: unknown }
102
- export interface GetProvisioningStarterBundlesResponse { core: unknown; bundles: unknown }
103
+ export interface GetProvisioningStarterBundlesResponse { core: unknown; bundles: unknown; optional: unknown }
103
104
  export interface GetPublicBlockersIdResponse { blocker: unknown }
104
105
  export interface GetPublicBountyTableResponse { table: unknown; currency: unknown }
105
106
  export interface GetPublicGradesResponse { window_days: unknown; rolling: unknown; trend: unknown; attempts: unknown; threshold: unknown; grader_version: unknown }
@@ -304,6 +305,10 @@ export interface PostMeSessionsRevokeResponse { ok: boolean; revoked: unknown }
304
305
  export interface PostMemoryBuildersBuilderIdBfgWriteRequest { kind?: string; slug?: string; title?: string; body_md?: string; rationale?: string; karma_delta?: unknown }
305
306
  export interface PostMemoryBuildersBuilderIdBfgWriteResponse { ok: boolean; builder_id: unknown; path: unknown; kind: unknown; author: unknown; audit_id: unknown; karma_id: unknown; sha256: unknown; byte_len: unknown; updated_at: unknown }
306
307
  export interface PostMemorySyncRequest { files?: unknown[] }
308
+ export interface PostMinglePairsIdDecideRequest { decision: "accepted" | "declined" }
309
+ export interface PostMinglePairsIdDecideResponse { pair: unknown }
310
+ export interface PostMingleRoundRequest { limit?: number }
311
+ export interface PostMingleRoundResponse { paired: unknown; count: unknown; skipped: unknown }
307
312
  export interface PostModulesKeyEnableRequest { enabled?: unknown }
308
313
  export interface PostModulesKeyEnableResponse { ok: boolean; key: unknown; enabled: unknown; note: unknown }
309
314
  export interface PostModulesKeySubmitRequest { signed_by?: string }
@@ -324,7 +329,7 @@ export interface PostProvisioningInstancesIdGithubAppRequest { account?: string
324
329
  export interface PostProvisioningInstancesIdGithubAppResponse { state: unknown; account: unknown; post_url: unknown; personal_url: unknown; org_url: unknown; org_login: unknown; manifest: unknown; redirect_url: unknown; expires_at: unknown }
325
330
  export interface PostProvisioningInstancesIdRestartResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; message: unknown }
326
331
  export interface PostProvisioningInstancesIdTeardownResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; superseded: unknown; message: unknown }
327
- export interface PostProvisioningInstancesRequest { slug: string; target_ref?: string; hosting_shape?: string; domain?: string; no_address?: boolean; tier?: string; onboard_mode?: string; type?: string; description?: string; detail?: Record<string, unknown> }
332
+ export interface PostProvisioningInstancesRequest { slug: string; target_ref?: string; hosting_shape?: string; domain?: string; no_address?: boolean; tier?: string; onboard_mode?: string; type?: string; description?: string; detail?: Record<string, unknown>; modules?: string[] }
328
333
  export interface PostSearchMarkRequest { chunk_id?: StringifiableId; useful?: unknown }
329
334
  export interface PostSearchRequest { expand?: unknown; q?: string; source_kind?: string; limit?: unknown }
330
335
  export interface PostSearchResponse { expand?: unknown; chunk?: unknown; query?: unknown; count?: unknown; total_full_tokens?: unknown; results?: unknown; corpus?: unknown }
@@ -380,6 +385,9 @@ export interface PostVersionsIdDoneWhenResponse { ok: boolean; criterion: unknow
380
385
  export interface PostVersionsRequest { id: string; name: string; status?: string; track?: string; done_when?: string; scope_doc_path?: string; criteria?: unknown[] }
381
386
  export interface PostVersionsResponse { version: unknown; criteria: unknown }
382
387
  export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; granted: unknown }
388
+ export interface PutMingleOptInRequest { opted_in: boolean }
389
+ export interface PutMingleOptInResponse { opted_in: unknown; updated_at: unknown }
390
+ export interface PutMingleProjectRequest { enabled: boolean }
383
391
  export interface PutTasksIdDependenciesRequest { depends_on_task_ids: unknown[] }
384
392
  export interface PutTasksIdDependenciesResponse { ok: boolean; written: unknown; dependencies: unknown }
385
393
  export type StringifiableId = number | string;
@@ -900,6 +908,18 @@ export interface BongosClient {
900
908
  /** POST /memory/sync — rank: any-builder */
901
909
  postMemorySync(args?: RequestArgs & { body?: PostMemorySyncRequest }): Promise<ApiResponse>;
902
910
  };
911
+ "mingle": {
912
+ /** GET /mingle — rank: any-builder */
913
+ getMingle(args?: RequestArgs): Promise<GetMingleResponse>;
914
+ /** PUT /mingle/opt-in — rank: any-builder */
915
+ putMingleOptIn(args: RequestArgs & { body: PutMingleOptInRequest }): Promise<PutMingleOptInResponse>;
916
+ /** POST /mingle/pairs/{id}/decide — rank: any-builder */
917
+ postMinglePairsIdDecide(args: RequestArgs & { body: PostMinglePairsIdDecideRequest }): Promise<PostMinglePairsIdDecideResponse>;
918
+ /** PUT /mingle/project — rank: metic+archon */
919
+ putMingleProject(args: RequestArgs & { body: PutMingleProjectRequest }): Promise<ApiResponse>;
920
+ /** POST /mingle/round — rank: metic+archon */
921
+ postMingleRound(args?: RequestArgs & { body?: PostMingleRoundRequest }): Promise<PostMingleRoundResponse>;
922
+ };
903
923
  "modules": {
904
924
  /** GET /modules — rank: any-builder */
905
925
  getModules(args?: RequestArgs): Promise<GetModulesResponse>;
@@ -584,6 +584,18 @@ export function createClient(opts = {}) {
584
584
  // POST /memory/sync — rank: any-builder — POST /memory/sync
585
585
  postMemorySync: (args) => request("POST", "/memory/sync", { hasBody: true }, args),
586
586
  },
587
+ "mingle": {
588
+ // GET /mingle — rank: any-builder — GET /mingle
589
+ getMingle: (args) => request("GET", "/mingle", { hasBody: false }, args),
590
+ // PUT /mingle/opt-in — rank: any-builder — PUT /mingle/opt-in
591
+ putMingleOptIn: (args) => request("PUT", "/mingle/opt-in", { hasBody: true }, args),
592
+ // POST /mingle/pairs/{id}/decide — rank: any-builder — POST /mingle/pairs/:id/decide
593
+ postMinglePairsIdDecide: (args) => request("POST", "/mingle/pairs/{id}/decide", { hasBody: true }, args),
594
+ // PUT /mingle/project — rank: metic+archon — PUT /mingle/project
595
+ putMingleProject: (args) => request("PUT", "/mingle/project", { hasBody: true }, args),
596
+ // POST /mingle/round — rank: metic+archon — POST /mingle/round
597
+ postMingleRound: (args) => request("POST", "/mingle/round", { hasBody: true }, args),
598
+ },
587
599
  "modules": {
588
600
  // GET /modules — rank: any-builder — GET /modules
589
601
  getModules: (args) => request("GET", "/modules", { hasBody: false }, args),
@@ -0,0 +1,157 @@
1
+ # 0240 — A skipped module picker stores nothing, and the bundle is resolved on read
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-09-03
5
+ - **Tasks:** [#1002339](https://cloudbongos.com/builders#/task/1002339) (this decision — BV1.R20)
6
+ - **Goal:** [#1000046](https://cloudbongos.com/builders#/goal/1000046) — Project creation: visibility and
7
+ customization, criterion `proj-module-select` ("during setup a default set of modules is pre-selected…")
8
+ - **Related:** [ADR 0237](<redacted>.md)
9
+ (R19 — the bundles this picker renders, and the file that closed with "where a chosen selection lands
10
+ is R20's decision"), [ADR 0182](<redacted>.md) D4 (the publish bar a module set
11
+ may not join), [ADR 0083](<redacted>.md) (the one-way import rule),
12
+ [ADR 0111](<redacted>.md) (the enqueue-only web tier), migration
13
+ `provisioning_013` (the `detail` column this deliberately does not use)
14
+
15
+ ## 1. The problem
16
+
17
+ R19 declared the starter bundles and served them; nothing rendered them. R20 is the
18
+ picker: the owner sees what their declared project type preselects, switches
19
+ individual modules on or off, and the answer has to survive into the project.
20
+
21
+ Three questions had no answer yet, and the first is the one everything else hangs
22
+ off:
23
+
24
+ 1. **Where does a chosen selection live?** ADR 0237 §6: *"Nothing is stored yet…
25
+ there is still no module-selection column on any table."*
26
+ 2. **What does *skipping* mean?** The picker is optional like the About step
27
+ before it. "Skip = you get the preselect" is easy to say and easy to get
28
+ subtly wrong.
29
+ 3. **Where does the picker learn what may be chosen?** A bundle names module
30
+ keys; a picker has to render a name and a sentence per key, for an owner who
31
+ has met none of them.
32
+
33
+ ## 2. Three-valued, or the skip is unreadable forever
34
+
35
+ A new nullable `modules jsonb` column on `provisioning_instances`
36
+ (`provisioning_014`), read through `effectiveModules(row)`:
37
+
38
+ | stored | means | what the project gets |
39
+ |---|---|---|
40
+ | `NULL` | nobody answered — the picker was skipped, or the caller does not ask | the declared type's starter bundle, resolved at read time |
41
+ | `[]` | the owner switched them all off | the always-on core, and nothing else |
42
+ | `["dev-box",…]` | what they picked | exactly that |
43
+
44
+ The temptation was `NOT NULL DEFAULT '[]'`, and it is the mistake: it collapses
45
+ rows 1 and 2, so a project that skipped and a project that deliberately declined
46
+ everything become the same row and no later surface can tell them apart. That is
47
+ the rule `PROJECT_DETAIL_VOCAB` already states out loud — *"a detail answer is
48
+ something the owner SAID… Absent stays absent, and skipped stays skipped"* — and
49
+ it applies here for the same reason: R23 ("add modules later") and R24 (the proof
50
+ walk) both need to know whether an owner has ever been asked.
51
+
52
+ **Skipping is safe because the preselect and the fallback are the same
53
+ declaration.** The panel preselects `bundleForProjectType(type).bundle`; an
54
+ omitted `modules` key makes the server resolve `bundleForProjectType(type).bundle`.
55
+ Not two lists kept in agreement — one function, called twice. That is what lets
56
+ the panel promise "skip and you get the suggested set" without the promise being
57
+ a thing anyone has to maintain.
58
+
59
+ It also means **`bongos onboard` and any API caller inherit the bundle for free**.
60
+ Neither asks the question, both omit the field, and both get the type's preselect.
61
+ So the canonical onboarding sequence (`onboard-plan.js`) grows **no new step** —
62
+ the picker is a refinement of an answer already in the sequence (`type`), not a
63
+ new question in it. `tests/onboard.mjs` says one optional step keeps that flag
64
+ meaningful; it still does.
65
+
66
+ ## 3. Not `detail`, not `settings`
67
+
68
+ `provisioning_013`'s own comment named R19 as a reason `detail` was jsonb, so
69
+ `detail.modules` was the obvious home. It is the wrong one:
70
+
71
+ - `detail` holds the **interview's** answers under `PROJECT_DETAIL_VOCAB`, a
72
+ closed map of scalar vocabularies that `normalizeProjectDetail` filters
73
+ key-by-value and `badProjectDetail` 400s on. A list of module keys is not that
74
+ shape. Carrying it there means teaching a normalizer, a route guard and a read
75
+ projection about a value type none of them have — in order to store something
76
+ ADR 0237 §2 already ruled the interview must not ask.
77
+ - `settings` is worse: a setting is a **policy the running instance obeys**. It
78
+ rides `web.env`, queues a `settings-apply` intent and restarts the service.
79
+ A module selection is a declaration made before the instance exists.
80
+
81
+ A column is the honest shape, and it is additive + namespaced (ADR 0083 §5), so
82
+ the previous release still runs against the schema and every pre-existing row
83
+ reads as its bundle rather than as an error.
84
+
85
+ ## 4. The picker's catalog is declared beside the bundles
86
+
87
+ The picker needs, per opt-in module, a label and one owner-facing line. Neither
88
+ existing source can give it:
89
+
90
+ - `module.json`'s `title`/`description` are written for a builder reading a
91
+ module list. *"Outbound ship broadcast + the inbound #ideas/#bugs bot +
92
+ role-sync + channel management + account-link state. Mirror only, never
93
+ authority (ADR 0033)"* is true, and it is not copy you put in front of someone
94
+ who has not built anything yet.
95
+ - `GET /modules` needs a session and imports the live catalog; the create wizard
96
+ is read **signed out**, and a module may not import `src/module-loader/catalog.js`
97
+ (ADR 0083's one-way rule).
98
+ - `GET /public/modules` serves booleans, not copy.
99
+
100
+ So `OPTIONAL_MODULES` joins `STARTER_BUNDLES` in `starter-bundles.js` — the same
101
+ decision ADR 0237 §3 made for the bundle keys, extended to the choices, and kept
102
+ honest the same way: `tests/provisioning_starter_bundles.mjs` reads every
103
+ `modules/*/module.json` and fails the build if the declared opt-in set drifts from
104
+ the on-disk `default: false` set (minus the two hub-only modules). **A new opt-in
105
+ module therefore cannot ship without owner-facing copy**, which is the property
106
+ worth buying.
107
+
108
+ `GET /provisioning/starter-bundles` gains `optional` alongside `core` and
109
+ `bundles`. **One read, one declaration**: a picker that fetched its preselect and
110
+ its catalog separately could preselect a key it has no row for.
111
+
112
+ ## 5. Loud at the boundary, quiet at the store
113
+
114
+ `normalizeModuleSelection` drops an unknown, always-on or hub-only key on the way
115
+ to storage. The **route refuses it** (`400 bad_modules`, naming the choices)
116
+ rather than dropping it silently — `badProjectDetail`'s rule, for `badProjectDetail`'s
117
+ reason: a caller who names a module that does not exist has made a mistake, and
118
+ being told nothing and handed a project without it is the silent-drop failure the
119
+ strict validator exists to prevent. A re-request reports `modules_ignored`, the
120
+ same honesty `type_ignored` carries.
121
+
122
+ ## 6. Consequences
123
+
124
+ - **The picker cannot block a create.** A failed catalog fetch renders a
125
+ "couldn't load" clause, leaves the answer unsaid, and the create still files —
126
+ the server applies the bundle. A picker that could stop a project from existing
127
+ would be worse than no picker.
128
+ - **A module selection is still not a publish precondition** (ADR 0182 D4,
129
+ restated by ADR 0237 §6). Taking or declining a bundle cannot move a project's
130
+ dark-matter state.
131
+ - **The column is a DECLARATION, not yet an input to the runner.** It is held on
132
+ the platform row exactly as `type` and `description` are, until a catalog row
133
+ materializes. `provisioning_intents` carries no payload, and turning a stored
134
+ selection into the child instance's own `config/modules.json` is separate work —
135
+ named here so nobody reads the stored array as already-provisioned.
136
+ - **The wizard renumbered a third time** (gate 0 · name 1 · type 2 · about 3 ·
137
+ **modules 4** · home 5 · address 6 · review 7 · done 8), so `DRAFT_KEY` moved to
138
+ `-v4`: a draft replayed under the old numbering lands on the wrong panel.
139
+
140
+ ## 7. Rejected
141
+
142
+ - **`NOT NULL DEFAULT '[]'`** — collapses "skipped" into "declined everything",
143
+ permanently.
144
+ - **Storing the preselect when the owner skips** — it writes down an answer
145
+ nobody gave, and freezes today's bundle onto a project whose owner never
146
+ expressed a view. Read-time resolution is what `effectiveSettings` already does
147
+ for the same reason.
148
+ - **`detail.modules`** — the interview's vocabulary is scalar by construction, and
149
+ ADR 0237 §2 ruled the interview does not ask this question.
150
+ - **A new step in `onboardPlan`** — the CLI and the skill would have to ask a
151
+ question whose answer they already get by omission. The sequence gains nothing;
152
+ `tests/onboard.mjs`'s "one optional step keeps the flag meaningful" stands.
153
+ - **Rendering the always-on core as sixteen disabled toggles** — a disabled
154
+ control reads as a choice the owner failed to make. The core was never a
155
+ choice, so it is a clause: visible, counted, and outside the band.
156
+ - **Reading the manifests at request time to build the catalog** — costs the
157
+ purity ADR 0237 §3 bought, for copy that is fixed at build time anyway.