@bongos/core 1.19.511 → 1.19.513

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 (50) hide show
  1. package/.bongos-core.json +85 -50
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +2 -0
  4. package/clients/bongos-client/index.cjs +2 -0
  5. package/clients/bongos-client/index.d.ts +3 -0
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/config/branding.neutral.json +3 -2
  8. package/docs/adr/0238-the-join-door-is-a-provisioning-settings-policy-key.md +57 -0
  9. package/docs/adr/0239-a-recommendation-is-a-table-that-carries-its-own-reason.md +177 -0
  10. package/docs/adr/README.md +2 -0
  11. package/docs/api/openapi.json +40 -3
  12. package/docs/api-reference.md +3 -2
  13. package/docs/copy-inventory.md +158 -151
  14. package/docs/copy-registry.json +313 -229
  15. package/docs/module-api-changelog.md +4 -0
  16. package/modules/dev-box/app/src/vendor/bongos-client.cjs +2 -0
  17. package/modules/hall-ui/public/hall-kit.js +309 -0
  18. package/modules/hall-ui/public/hall-render.js +10 -38
  19. package/modules/hall-ui/public/profile-charts.js +58 -65
  20. package/modules/hall-ui/public/profile.css +9 -18
  21. package/modules/hall-ui/public/style.css +101 -15
  22. package/modules/hall-ui/public/watch.css +6 -14
  23. package/modules/hall-ui/public/watch.html +1 -1
  24. package/modules/hall-ui/public/watch.js +139 -54
  25. package/modules/provisioning/provisioning.js +27 -1
  26. package/modules/provisioning/recommendations.js +260 -0
  27. package/modules/provisioning/routes/provisioning.js +29 -0
  28. package/modules/provisioning/tests/provisioning.mjs +17 -14
  29. package/modules/public-landing/public/projects.html +125 -0
  30. package/modules/ui-design/kit/serve.js +4 -3
  31. package/package-lock.json +2 -2
  32. package/package.json +1 -1
  33. package/src/branding.js +9 -0
  34. package/src/module-api.js +1 -1
  35. package/tests/currency_label.mjs +5 -4
  36. package/tests/hall_audit.mjs +84 -0
  37. package/tests/hall_kit_charts.mjs +328 -0
  38. package/tests/hall_profile_world.mjs +27 -6
  39. package/tests/helpers.mjs +161 -0
  40. package/tests/joinability_invite_only.mjs +10 -2
  41. package/tests/project_door_ui.mjs +267 -0
  42. package/tests/projects_hub.mjs +73 -1
  43. package/tests/projects_hub_pre_uat.mjs +4 -1
  44. package/tests/provision_settings_apply.mjs +8 -7
  45. package/tests/provisioning_recommendations.mjs +448 -0
  46. package/tests/provisioning_settings.mjs +65 -6
  47. package/tests/provisioning_settings_apply.mjs +3 -3
  48. package/tests/provisioning_settings_env.mjs +10 -8
  49. package/tests/task_detail_ui.mjs +1 -153
  50. package/tests/watch_applications_queue.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.19.511",
6
- "core_contract": "1.19.511",
7
- "source_commit": "3a3d1626dee489511d9d444d6cd3c78620a5fffd",
5
+ "core_version": "1.19.513",
6
+ "core_contract": "1.19.513",
7
+ "source_commit": "9e6d801ba8dcecaefcb3b75033642211d8275198",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-03T18:50:51.590Z",
9
+ "built_at": "2026-09-03T19:22:17.457Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 428,
12
+ "docs_redacted": 430,
13
13
  "agent_docs_stubbed": 24,
14
- "functional_verbatim": 1951,
14
+ "functional_verbatim": 1956,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2403,
20
- "tree_sha256": "61291b79de3b99190857d7ed49c124e41ac765c57c9ad792cf8cfa1e62f002cb",
19
+ "file_count": 2410,
20
+ "tree_sha256": "a794da9ad6fee320c375a0fe3bea353d508f6d1fe6cba0dd1761da71a9ef5f32",
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": "146ce9d114ec7d5a90413713b8604843c42eac060dd943648412868e214a1a6e"
365
+ "sha256": "546f5670b4637aa1d4c492a8616d5189a971c79e8e2e163d12fe11276292faa6"
366
366
  },
367
367
  {
368
368
  "path": "clients/bongos-client/bongos-client.global.js",
369
369
  "mode": "0000644",
370
- "sha256": "0e3fb901fd7110352e0edb686cfd8824d71687b88bd7e42269d0fe855177ac9f"
370
+ "sha256": "ae151ff268d04dced73fae1136c682215a02e59bae5edb68a3d6001c0143dd57"
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": "19f11ecf8c9eda49cd1f2ac2425f1d3d9772ad46495305d9ae4bdeadf4695ea2"
380
+ "sha256": "72d841c53787c5ad83b214c2ac816fd4cb9c97b47329eb0417b80e660a9f6b02"
381
381
  },
382
382
  {
383
383
  "path": "clients/bongos-client/index.d.ts",
384
384
  "mode": "0000644",
385
- "sha256": "4ced11579608e8fdb481a07b5555c41b3cbf3018cb3a8bd7697fb58368283bf0"
385
+ "sha256": "07554254c8559f81ec5cf45807ddccd8488732b228a618167455c932e7f05750"
386
386
  },
387
387
  {
388
388
  "path": "clients/bongos-client/index.mjs",
389
389
  "mode": "0000644",
390
- "sha256": "3d5868d134bce56923b8f0270fbb2e988dea5b6a5ea1a00b96ff8bcde06bb40e"
390
+ "sha256": "c4b04368e61803e2fe36f26ba3757aa75ada7e465384baf3e53cd012c9ce8423"
391
391
  },
392
392
  {
393
393
  "path": "clients/bongos-client/package.json",
@@ -397,7 +397,7 @@
397
397
  {
398
398
  "path": "config/branding.neutral.json",
399
399
  "mode": "0000644",
400
- "sha256": "1b4d9952aebc5306b1ec212e05a72431ed1b4b0d36748a2fe547941a1e3f4a56"
400
+ "sha256": "c33b285d6a88d38eb15e062e0da845d29ec2aa7e6bfc5a4d321a3a49e0b7b2f9"
401
401
  },
402
402
  {
403
403
  "path": "config/design-tokens.neutral.json",
@@ -1694,20 +1694,30 @@
1694
1694
  "mode": "0000644",
1695
1695
  "sha256": "10534e533c2c70baf670048fb38e18ddedb36925312806afbae9941a9c958667"
1696
1696
  },
1697
+ {
1698
+ "path": "docs/adr/0238-the-join-door-is-a-provisioning-settings-policy-key.md",
1699
+ "mode": "0000644",
1700
+ "sha256": "fb05e36eb48861f2b32a38da04eba839f8141bd52ff9d913070bc589c115f9d5"
1701
+ },
1702
+ {
1703
+ "path": "docs/adr/0239-a-recommendation-is-a-table-that-carries-its-own-reason.md",
1704
+ "mode": "0000644",
1705
+ "sha256": "42b20cd6d2e8a8d76c980df73087fd404487e4c479034dbe34d8297677bd9387"
1706
+ },
1697
1707
  {
1698
1708
  "path": "docs/adr/README.md",
1699
1709
  "mode": "0000644",
1700
- "sha256": "e6b0e3bc8becec5ed9c7384596e205cc5a78e6145da244c8d6d2c1d5a4514380"
1710
+ "sha256": "cef542ef427dd81632465f17c6343c6b27f3ab69436eba2130c4fa4b5c9bc4ae"
1701
1711
  },
1702
1712
  {
1703
1713
  "path": "docs/api-reference.md",
1704
1714
  "mode": "0000644",
1705
- "sha256": "f9a893262b5112e48a8bffa455c8e1a7ce8aed663e34141ef9c48117882a2ad7"
1715
+ "sha256": "af226ff669081accc330b8797ec6ac766bef9066a9fc97e834c66ad61fcec22c"
1706
1716
  },
1707
1717
  {
1708
1718
  "path": "docs/api/openapi.json",
1709
1719
  "mode": "0000644",
1710
- "sha256": "ec2d400cae26a7b89f644e978840927fd0fb88fc0b7b94e9f0d00dd19955aaf2"
1720
+ "sha256": "34cd50bf2154126c9a402235972642f4430281434852977c4e7277febc959a18"
1711
1721
  },
1712
1722
  {
1713
1723
  "path": "docs/architecture.md",
@@ -1732,12 +1742,12 @@
1732
1742
  {
1733
1743
  "path": "docs/copy-inventory.md",
1734
1744
  "mode": "0000644",
1735
- "sha256": "c3c4bf94c9565778297efc223bd8a3d0adea4b96d6c484d516f21885532dcdaf"
1745
+ "sha256": "0cc8ccfda8d8e3e7b518fae7a7584bb368d7d2eac6703518404d30f0b6ead30d"
1736
1746
  },
1737
1747
  {
1738
1748
  "path": "docs/copy-registry.json",
1739
1749
  "mode": "0000644",
1740
- "sha256": "e757dec5eb8da4947297f2fdae06b460e888d6e7cad1a5d13d0dae5e03df4aa1"
1750
+ "sha256": "1003ea51740a5f71af49e05c66ba088c337185680dd92a391c959e8ea76a3f40"
1741
1751
  },
1742
1752
  {
1743
1753
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2582,7 +2592,7 @@
2582
2592
  {
2583
2593
  "path": "docs/module-api-changelog.md",
2584
2594
  "mode": "0000644",
2585
- "sha256": "2e35f3f9c7c2c961b5c8274d20202664564cb33d59b046ef4d2e190c15c05afe"
2595
+ "sha256": "326d065772f944339af791ceb779b2724c0feef4d4937d1aa9e13c9bc5b8a38e"
2586
2596
  },
2587
2597
  {
2588
2598
  "path": "docs/modules-contract.md",
@@ -3952,7 +3962,7 @@
3952
3962
  {
3953
3963
  "path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
3954
3964
  "mode": "0000644",
3955
- "sha256": "19f11ecf8c9eda49cd1f2ac2425f1d3d9772ad46495305d9ae4bdeadf4695ea2"
3965
+ "sha256": "72d841c53787c5ad83b214c2ac816fd4cb9c97b47329eb0417b80e660a9f6b02"
3956
3966
  },
3957
3967
  {
3958
3968
  "path": "modules/dev-box/app/test/unit.mjs",
@@ -4702,12 +4712,12 @@
4702
4712
  {
4703
4713
  "path": "modules/hall-ui/public/hall-kit.js",
4704
4714
  "mode": "0000644",
4705
- "sha256": "e392af98c2d310bfe80ccc560895dc2729abbe416087fcc7609d22dd4593484c"
4715
+ "sha256": "9fdd4fa659a6ff1f36159a89a5bab9d12009b1624f7d72f8d1296d1dffff0d3f"
4706
4716
  },
4707
4717
  {
4708
4718
  "path": "modules/hall-ui/public/hall-render.js",
4709
4719
  "mode": "0000644",
4710
- "sha256": "d3ec5ebd2a4b60f0e87d82304920905021c6ee992e6a371516317da02f78ac3e"
4720
+ "sha256": "e06761bf930a2b7bf8b0c4a3eba0532edb1a6f0d49d366b6889ebba9101e5d4f"
4711
4721
  },
4712
4722
  {
4713
4723
  "path": "modules/hall-ui/public/hall-widgets.js",
@@ -4902,7 +4912,7 @@
4902
4912
  {
4903
4913
  "path": "modules/hall-ui/public/profile-charts.js",
4904
4914
  "mode": "0000644",
4905
- "sha256": "865df71a66dd944006b01dfb1317778a1d733d9320b4486efd8ee1ed3ea76f19"
4915
+ "sha256": "6eb791bb5d73e869f1af1dbabe6fbd04eccf970b54696a89a4cd1d28e6e705df"
4906
4916
  },
4907
4917
  {
4908
4918
  "path": "modules/hall-ui/public/profile-connections.js",
@@ -4917,7 +4927,7 @@
4917
4927
  {
4918
4928
  "path": "modules/hall-ui/public/profile.css",
4919
4929
  "mode": "0000644",
4920
- "sha256": "81712abfa291664378581139a3611acaff0ebdcd2cb77d641e8543d653080c30"
4930
+ "sha256": "18d65cb2bab78487a4cbf2447154a69674291972d15256d338123c2a437abc87"
4921
4931
  },
4922
4932
  {
4923
4933
  "path": "modules/hall-ui/public/profile.html",
@@ -5052,7 +5062,7 @@
5052
5062
  {
5053
5063
  "path": "modules/hall-ui/public/style.css",
5054
5064
  "mode": "0000644",
5055
- "sha256": "287e9d4c4a2f57e812051dc6613d4c5ef493924c1a3de1b15fa91072128fa46e"
5065
+ "sha256": "801d467a63d65c24877cac2741308590b9cd66530231f77bdf7230d1c4ebe513"
5056
5066
  },
5057
5067
  {
5058
5068
  "path": "modules/hall-ui/public/task-detail.js",
@@ -5092,17 +5102,17 @@
5092
5102
  {
5093
5103
  "path": "modules/hall-ui/public/watch.css",
5094
5104
  "mode": "0000644",
5095
- "sha256": "0c877cf6decf1b7291c877ec2e6c0603c5170cfecabf0d6be15a793b6858dad8"
5105
+ "sha256": "ea2f7870bdd9383cfded8b2b09724486faa0793438dfa17bc52af189c8a81c6f"
5096
5106
  },
5097
5107
  {
5098
5108
  "path": "modules/hall-ui/public/watch.html",
5099
5109
  "mode": "0000644",
5100
- "sha256": "b20c001318da04ee5ca731702356479b0c7e4bffdd5784be9b1984db31d30777"
5110
+ "sha256": "60ffce27ce4250223dc6bbaa22e1b7b9dfb4f689bd78b6ca1c75445088c5ddb9"
5101
5111
  },
5102
5112
  {
5103
5113
  "path": "modules/hall-ui/public/watch.js",
5104
5114
  "mode": "0000644",
5105
- "sha256": "0576fa65e1ac51a3928e1ac584532b9e4db1102513d35acc5e31c1afef66c32c"
5115
+ "sha256": "f5d264fde6898c3cf82387d042d26fb434bbd8e60657c376b452f89b0a85435c"
5106
5116
  },
5107
5117
  {
5108
5118
  "path": "modules/hall-ui/public/watch.states.json",
@@ -5972,17 +5982,22 @@
5972
5982
  {
5973
5983
  "path": "modules/provisioning/provisioning.js",
5974
5984
  "mode": "0000644",
5975
- "sha256": "f68f397e4b3b1879c69f8b3369cfb499a270ca7f29963412da917f1185838981"
5985
+ "sha256": "67eb2963688cba73fe846b354070e1e43333971425f603b1e84b45552b5381f0"
5976
5986
  },
5977
5987
  {
5978
5988
  "path": "modules/provisioning/rate-limit.js",
5979
5989
  "mode": "0000644",
5980
5990
  "sha256": "27046325beffad5d1edfcc91c331048038900ef7d32f1d38796755c7990ba202"
5981
5991
  },
5992
+ {
5993
+ "path": "modules/provisioning/recommendations.js",
5994
+ "mode": "0000644",
5995
+ "sha256": "8c4b2d8d17b80229c371b82ac9a5a2cf2fa979683ac586e8b833ca0a309a92fc"
5996
+ },
5982
5997
  {
5983
5998
  "path": "modules/provisioning/routes/provisioning.js",
5984
5999
  "mode": "0000644",
5985
- "sha256": "338e135f492e584aa4539d4a64d7c881b964c9ffa8428ff3359ad96d80b82a5c"
6000
+ "sha256": "9285f3f2d426305c060eef4b3b98ae64fc386e4ce487f99d9ad59d9921dc493e"
5986
6001
  },
5987
6002
  {
5988
6003
  "path": "modules/provisioning/starter-bundles.js",
@@ -5997,7 +6012,7 @@
5997
6012
  {
5998
6013
  "path": "modules/provisioning/tests/provisioning.mjs",
5999
6014
  "mode": "0000644",
6000
- "sha256": "559ae0d8025693a997a16012758236dbe895f28621de1a1a591d2a43fb21ff00"
6015
+ "sha256": "03e4ba2a5625ac321a95392c91b8e90cc6f7e235dc9a0c4bbcb742cbd459b083"
6001
6016
  },
6002
6017
  {
6003
6018
  "path": "modules/provisioning/ui/.gitkeep",
@@ -6497,7 +6512,7 @@
6497
6512
  {
6498
6513
  "path": "modules/public-landing/public/projects.html",
6499
6514
  "mode": "0000644",
6500
- "sha256": "f744bab1254cec8220d3399c829bd566f8a6f2d07b412e531720476798837d7b"
6515
+ "sha256": "8af95785b813eb27e6356fa717a4f20cb73f1220dd9ce15de2d62a18631afdd3"
6501
6516
  },
6502
6517
  {
6503
6518
  "path": "modules/public-landing/public/projects.probes.json",
@@ -6932,7 +6947,7 @@
6932
6947
  {
6933
6948
  "path": "modules/ui-design/kit/serve.js",
6934
6949
  "mode": "0000644",
6935
- "sha256": "745fdc2ff5f72951b919ba49ab871b8cdbe0f09db73e79dfa248cd01e9232cdd"
6950
+ "sha256": "efb50e76596a5ad009dab58d8e12b590382cc6bf1f819d0ab447cb14a4b4d6a3"
6936
6951
  },
6937
6952
  {
6938
6953
  "path": "modules/ui-design/kit/tells.js",
@@ -7242,12 +7257,12 @@
7242
7257
  {
7243
7258
  "path": "package-lock.json",
7244
7259
  "mode": "0000644",
7245
- "sha256": "0c5b45784b5275f6c58d456a275a390b6ef111efbcc1fb7653750120a8a84981"
7260
+ "sha256": "afcb15b2197925baf012e363e7af8de096c9e2f6bbdd6cf50015b4039a2e0441"
7246
7261
  },
7247
7262
  {
7248
7263
  "path": "package.json",
7249
7264
  "mode": "0000644",
7250
- "sha256": "2605b735d7f5d07c4eb993212d4901e7043138693d4d2bb56492f9fb18c0baf0"
7265
+ "sha256": "a9827319a035ff87ca5805284b7296d80d1148390a3bb99ae03f46307a6952e8"
7251
7266
  },
7252
7267
  {
7253
7268
  "path": "public-docs/index.html",
@@ -8897,7 +8912,7 @@
8897
8912
  {
8898
8913
  "path": "src/branding.js",
8899
8914
  "mode": "0000644",
8900
- "sha256": "51d70cad3ef6955a0648f4467dd3e0ffa54d747d93b7a30301dce3c8afdbe1cb"
8915
+ "sha256": "e603fa0fabe63b7150f649db1ecaa50ef0908a803396e808cf212f4378cbb053"
8901
8916
  },
8902
8917
  {
8903
8918
  "path": "src/build-info.js",
@@ -8917,7 +8932,7 @@
8917
8932
  {
8918
8933
  "path": "src/module-api.js",
8919
8934
  "mode": "0000644",
8920
- "sha256": "ac752bde3af7292c3b4a1857045652f7d3badf0d1bbdf02cf3fd47f2ac8c40fc"
8935
+ "sha256": "86d6ba39dbe1e2b39067a2fd2328284fd950a9f9060450f87e55b3be84f5fef9"
8921
8936
  },
8922
8937
  {
8923
8938
  "path": "src/module-loader/catalog.js",
@@ -9617,7 +9632,7 @@
9617
9632
  {
9618
9633
  "path": "tests/currency_label.mjs",
9619
9634
  "mode": "0000644",
9620
- "sha256": "e6e6f835296328e1055b048c6610c2c69853d311252365f904c6a3de4a2c4d59"
9635
+ "sha256": "09a937b9a9550b77659c0e60b3bc44c45378fdb3545c510d7579d4711518a733"
9621
9636
  },
9622
9637
  {
9623
9638
  "path": "tests/cutover_codemod.mjs",
@@ -10297,7 +10312,7 @@
10297
10312
  {
10298
10313
  "path": "tests/hall_audit.mjs",
10299
10314
  "mode": "0000644",
10300
- "sha256": "7df5602bb92b44186613870501ecb4e959c9288f8d103cfc8075a3a24d51d840"
10315
+ "sha256": "0b30e949b0479adb4b436aa32e741c9f2ab3925a1ac4327daf6e8a95700a8c14"
10301
10316
  },
10302
10317
  {
10303
10318
  "path": "tests/hall_board_world.mjs",
@@ -10319,6 +10334,11 @@
10319
10334
  "mode": "0000644",
10320
10335
  "sha256": "1d9c1d345a6fe25eacf810703a3e7f9f3b33f8e982aef49364e19eb4469de668"
10321
10336
  },
10337
+ {
10338
+ "path": "tests/hall_kit_charts.mjs",
10339
+ "mode": "0000644",
10340
+ "sha256": "475c712af2b45fed7863b486c3d2ed3b96e955dccb9acc5909999db3990843d5"
10341
+ },
10322
10342
  {
10323
10343
  "path": "tests/hall_nav.mjs",
10324
10344
  "mode": "0000644",
@@ -10347,7 +10367,7 @@
10347
10367
  {
10348
10368
  "path": "tests/hall_profile_world.mjs",
10349
10369
  "mode": "0000644",
10350
- "sha256": "9e5047b39d55875e167c992157c6c04a9a766ec331c1a3bf343fe7ea194a8309"
10370
+ "sha256": "b35d647c4cb7b90be70dee8e7245396cc901479992fafbf19ceef734d8195399"
10351
10371
  },
10352
10372
  {
10353
10373
  "path": "tests/hall_reading_world.mjs",
@@ -10397,7 +10417,7 @@
10397
10417
  {
10398
10418
  "path": "tests/helpers.mjs",
10399
10419
  "mode": "0000644",
10400
- "sha256": "89d0ebdf842108bcf807bd08663e9f83566d9b0ae80e72ba038f8d4f0b30b0f8"
10420
+ "sha256": "b3f0a87c51c9e655c712db00a0a8763e2fc08e4de3c6904c6080385e7c7dad14"
10401
10421
  },
10402
10422
  {
10403
10423
  "path": "tests/hierarchy-config.mjs",
@@ -10627,7 +10647,7 @@
10627
10647
  {
10628
10648
  "path": "tests/joinability_invite_only.mjs",
10629
10649
  "mode": "0000644",
10630
- "sha256": "082693b5e07c1c25cec17cde7f93a8716aafa94ead9b1cee76b1643f30edff79"
10650
+ "sha256": "5311e076e8a72b993a235e57ebc54c9ecd529ccd31b65609432677a12e15e85d"
10631
10651
  },
10632
10652
  {
10633
10653
  "path": "tests/joinability_open.mjs",
@@ -11099,6 +11119,11 @@
11099
11119
  "mode": "0000644",
11100
11120
  "sha256": "6a7a223a678b56333befaed017429e5b9d8a81e4405efae72a23355902517d9d"
11101
11121
  },
11122
+ {
11123
+ "path": "tests/project_door_ui.mjs",
11124
+ "mode": "0000644",
11125
+ "sha256": "29f59ab64b231a7ec5d17a3e784d451f75d80c19efd4cb6a523d263e8f88b581"
11126
+ },
11102
11127
  {
11103
11128
  "path": "tests/project_stats.mjs",
11104
11129
  "mode": "0000644",
@@ -11112,12 +11137,12 @@
11112
11137
  {
11113
11138
  "path": "tests/projects_hub.mjs",
11114
11139
  "mode": "0000644",
11115
- "sha256": "712e02763f7e9f3e6f4acc17a5a757a4aee11e9234909dcf50923b85679e09e6"
11140
+ "sha256": "eeb54786e5cb1211f0036d7c72119082fe47c023502c017b0092c6b22f60f0c1"
11116
11141
  },
11117
11142
  {
11118
11143
  "path": "tests/projects_hub_pre_uat.mjs",
11119
11144
  "mode": "0000644",
11120
- "sha256": "033c9054a24f5ef93694fc4c9db54d4790e9e342d2e36fda78075d6a9d3252e9"
11145
+ "sha256": "fef872ed80c7efdbf37e0672067f555c76aa17368a515afb99b1fa7e7ca3c4b4"
11121
11146
  },
11122
11147
  {
11123
11148
  "path": "tests/promote_goal_id.mjs",
@@ -11142,7 +11167,7 @@
11142
11167
  {
11143
11168
  "path": "tests/provision_settings_apply.mjs",
11144
11169
  "mode": "0000644",
11145
- "sha256": "9666ed868774ebe49a76b15b9de6db17ac93af23a740c3384e25b73b4536cc58"
11170
+ "sha256": "9a04386b3047177bb55b6d392db88764f06f92e5c0b20c16ed9e0f8ce520b07d"
11146
11171
  },
11147
11172
  {
11148
11173
  "path": "tests/provisioning_default_domain.mjs",
@@ -11164,6 +11189,11 @@
11164
11189
  "mode": "0000644",
11165
11190
  "sha256": "97d04ee39cc06b720d4a5b42f3e3cc614f64d9462b27471a1af7598b5e2929be"
11166
11191
  },
11192
+ {
11193
+ "path": "tests/provisioning_recommendations.mjs",
11194
+ "mode": "0000644",
11195
+ "sha256": "0557876002c1f0efde5a8e7c87702fa57df3a9efb26ea93b077969bcc10e3637"
11196
+ },
11167
11197
  {
11168
11198
  "path": "tests/provisioning_restart.mjs",
11169
11199
  "mode": "0000644",
@@ -11172,17 +11202,17 @@
11172
11202
  {
11173
11203
  "path": "tests/provisioning_settings.mjs",
11174
11204
  "mode": "0000644",
11175
- "sha256": "ffc902b4296017dd9069a17d2a098053f2d3de08dfade2b93ec5f72866b55eb7"
11205
+ "sha256": "6f78a45d0c68a0da780d40c602f23bca3d48a80524218d4d7d311b2f8574dbee"
11176
11206
  },
11177
11207
  {
11178
11208
  "path": "tests/provisioning_settings_apply.mjs",
11179
11209
  "mode": "0000644",
11180
- "sha256": "f36148bcb14a666c95ddc4f0ac4d59af2e5409db01fcf338930a813a7f383f76"
11210
+ "sha256": "c453bab3768953257be481cb8df700530f964e167fdca073cf4ae69892930a79"
11181
11211
  },
11182
11212
  {
11183
11213
  "path": "tests/provisioning_settings_env.mjs",
11184
11214
  "mode": "0000644",
11185
- "sha256": "4c8f1c7bdec5a063bcd3e76f4d43245c9491e3b8529593cdfaf33a3fbc85e319"
11215
+ "sha256": "4f51ea07fe3d80d52d6998547b028bec0a97267210faeffd75d9a47f7b5643e8"
11186
11216
  },
11187
11217
  {
11188
11218
  "path": "tests/provisioning_slug_available.mjs",
@@ -11837,7 +11867,7 @@
11837
11867
  {
11838
11868
  "path": "tests/task_detail_ui.mjs",
11839
11869
  "mode": "0000644",
11840
- "sha256": "5e7150f8651a3c147b17f51800f5f8afa1e9534b3ec545584e5c37792475b2aa"
11870
+ "sha256": "d7b12d56b50a0412d50f3558065c681d92c0c631edfef5553164e646979e6fa5"
11841
11871
  },
11842
11872
  {
11843
11873
  "path": "tests/task_goal_link.mjs",
@@ -11994,6 +12024,11 @@
11994
12024
  "mode": "0000644",
11995
12025
  "sha256": "745a868a2e13f34afd29f96840102205792bac810f2fd911c7da00f6a5695242"
11996
12026
  },
12027
+ {
12028
+ "path": "tests/watch_applications_queue.mjs",
12029
+ "mode": "0000644",
12030
+ "sha256": "b1f7df5aa40b89f8737c76d94def15c539514f7f439cca79a034bf37b922158d"
12031
+ },
11997
12032
  {
11998
12033
  "path": "tests/web_admission_status.mjs",
11999
12034
  "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
- - 346 operations across 53 resource groups
8
+ - 347 operations across 53 resource groups
9
9
 
10
10
  ## Install
11
11
 
@@ -669,6 +669,8 @@ function createClient(opts = {}) {
669
669
  postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
670
670
  // GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
671
671
  getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
672
+ // GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
673
+ getProvisioningRecommendations: (args) => request("GET", "/provisioning/recommendations", { hasBody: false }, args),
672
674
  // GET /provisioning/slug-available — rank: any-builder — GET /provisioning/slug-available
673
675
  getProvisioningSlugAvailable: (args) => request("GET", "/provisioning/slug-available", { hasBody: false }, args),
674
676
  // GET /provisioning/starter-bundles — rank: public — GET /provisioning/starter-bundles
@@ -668,6 +668,8 @@ function createClient(opts = {}) {
668
668
  postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
669
669
  // GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
670
670
  getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
671
+ // GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
672
+ getProvisioningRecommendations: (args) => request("GET", "/provisioning/recommendations", { hasBody: false }, args),
671
673
  // GET /provisioning/slug-available — rank: any-builder — GET /provisioning/slug-available
672
674
  getProvisioningSlugAvailable: (args) => request("GET", "/provisioning/slug-available", { hasBody: false }, args),
673
675
  // GET /provisioning/starter-bundles — rank: public — GET /provisioning/starter-bundles
@@ -97,6 +97,7 @@ export interface GetProvisioningInstancesIdResponse { instance: unknown; open_in
97
97
  export interface GetProvisioningInstancesIdSettingsResponse { ok: boolean; settings: unknown; planet: unknown; options: unknown }
98
98
  export interface GetProvisioningInstancesResponse { instances: unknown }
99
99
  export interface GetProvisioningOnboardPlanResponse { mode: unknown; steps: unknown }
100
+ export interface GetProvisioningRecommendationsResponse { recommendations: unknown }
100
101
  export interface GetProvisioningSlugAvailableResponse { slug: unknown; available: unknown; reason: unknown; address: unknown }
101
102
  export interface GetProvisioningStarterBundlesResponse { core: unknown; bundles: unknown }
102
103
  export interface GetPublicBlockersIdResponse { blocker: unknown }
@@ -980,6 +981,8 @@ export interface BongosClient {
980
981
  postProvisioningInstancesIdTeardown(args?: RequestArgs): Promise<PostProvisioningInstancesIdTeardownResponse>;
981
982
  /** GET /provisioning/onboard-plan — rank: public */
982
983
  getProvisioningOnboardPlan(args?: RequestArgs): Promise<GetProvisioningOnboardPlanResponse>;
984
+ /** GET /provisioning/recommendations — rank: public */
985
+ getProvisioningRecommendations(args?: RequestArgs): Promise<GetProvisioningRecommendationsResponse>;
983
986
  /** GET /provisioning/slug-available — rank: any-builder */
984
987
  getProvisioningSlugAvailable(args?: RequestArgs): Promise<GetProvisioningSlugAvailableResponse>;
985
988
  /** GET /provisioning/starter-bundles — rank: public */
@@ -665,6 +665,8 @@ export function createClient(opts = {}) {
665
665
  postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
666
666
  // GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
667
667
  getProvisioningOnboardPlan: (args) => request("GET", "/provisioning/onboard-plan", { hasBody: false }, args),
668
+ // GET /provisioning/recommendations — rank: public — GET /provisioning/recommendations
669
+ getProvisioningRecommendations: (args) => request("GET", "/provisioning/recommendations", { hasBody: false }, args),
668
670
  // GET /provisioning/slug-available — rank: any-builder — GET /provisioning/slug-available
669
671
  getProvisioningSlugAvailable: (args) => request("GET", "/provisioning/slug-available", { hasBody: false }, args),
670
672
  // GET /provisioning/starter-bundles — rank: public — GET /provisioning/starter-bundles
@@ -27,9 +27,10 @@
27
27
  "idp": false
28
28
  },
29
29
  "project": {
30
- "_note": "Per-project policy the PLATFORM decides and this instance OBEYS (task 1003139, goal 1000058). Stored on the platform's provisioning_instances.settings; written here as <PREFIX>_PLATFORM_VISIBILITY / <PREFIX>_JOINABILITY by the provisioning runner, which re-writes web.env and restarts the service when the owner changes one. The defaults are TODAY's behavior, so an instance that never receives a push — a self-hosted one, or one provisioned before this channel — keeps behaving exactly as it does now. platformVisibility: public | gated. joinability: open | apply | invite_only.",
30
+ "_note": "Per-project policy the PLATFORM decides and this instance OBEYS (task 1003139, goal 1000058). Stored on the platform's provisioning_instances.settings; written here as <PREFIX>_PLATFORM_VISIBILITY / <PREFIX>_JOINABILITY / <PREFIX>_VISIBILITY by the provisioning runner, which re-writes web.env and restarts the service when the owner changes one. The defaults are TODAY's behavior, so an instance that never receives a push — a self-hosted one, or one provisioned before this channel — keeps behaving exactly as it does now. platformVisibility (who may READ this instance's own pages): public | gated. joinability (HOW someone becomes a member): open | apply | invite_only. visibility (the join door, ADR 0182 D1 — how this project stands on the platform's map): public | private | stealth; it does NOT decide whether the project is on the map, publishability does.",
31
31
  "platformVisibility": "public",
32
- "joinability": "apply"
32
+ "joinability": "apply",
33
+ "visibility": "public"
33
34
  },
34
35
  "repo": {
35
36
  "owner": "",
@@ -0,0 +1,57 @@
1
+ # ADR 0238 — The join door is a provisioning SETTINGS key, and the hub column stays the cache
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-09-03
5
+ - **Task:** [task 1002324](https://cloudbongos.com/builders#/task/1002324) (BONGOS-V1, goal 1000046 — *Project creation — visibility and customization*, criterion `proj-visibility-states`)
6
+ - **Deciders:** jaxri (Archon), Claude
7
+ - **Related:** [ADR 0182](<redacted>.md) (the two axes — this ADR only says *where* R05's half lives) · [ADR 0141](<redacted>.md) §3 (authority stays local) · [ADR 0190](<redacted>.md) (a pushed setting takes effect by a restart) · [ADR 0192](<redacted>.md) (`platform_visibility`, the neighbouring axis)
8
+
9
+ ---
10
+
11
+ ## Context
12
+
13
+ ADR 0182 D5 says R05 "**moves host** — an instance surface, not a hub one … The setting lives in the project's own hall settings, gated by the project's own ranks." It does not say through which channel, and on the tree as R05 was claimed those two sentences pointed at nothing that existed:
14
+
15
+ - **The hub catalog column that R04 shipped** — `platform_identity_projects.visibility` — is written by **no route at all**. Every write on `routes/projects.js` is `requirePermission('project.curate')`, an Archon/Metic *curation* gate with no ownership check, and `upsertProject` deliberately omits `visibility` from its column list (ADR 0182 D5: a client re-registration must not reset an owner's door). `owner_github_id` on that table is commented "advisory attribution (not an authority)". So the hub has, by design, no way to authorise an owner's visibility change.
16
+ - **"The project's own hall settings"** is a page that does not exist. `modules/hall-ui/public/settings.html` is per-**builder** (account / access / dev box / preferences); the hall's `my-projects.html` was deleted in task 1003308 ("the hub owns it"). Building a new project-settings page on the instance, plus the hub sync (R08, unshipped), to carry one radio group would ship a control that changes nothing anyone can see.
17
+
18
+ Meanwhile the surface where an owner **already manages a project** — `/projects?view=manage` on the hub — carries two adjacent settings that are the same shape as this one, on a channel built for exactly this: `provisioning_instances.settings`, a jsonb "dumb store" whose migration header names the keys the manage-page wave adds "one task at a time — *platform visibility, joinability, repo visibility, …*".
19
+
20
+ ## Decision
21
+
22
+ **The owner's join door is a key in `provisioning.SETTINGS_VOCAB`** — `visibility ∈ (public, private, stealth)`, default `public` — set through the existing `PATCH /api/gds/provisioning/instances/:id/settings`, and rendered as one more section on the manage view.
23
+
24
+ That one line buys the whole of R05 from machinery already in place and already proven:
25
+
26
+ | What R05 needs | What the channel already does |
27
+ |---|---|
28
+ | only the owner may set it | `instanceAccessDenied` — own-scoped, Archon override, **404** (never 403) so there is no existence leak |
29
+ | the enum is enforced by the server | the route's schema **is** the vocabulary (`vocabSchema(SETTINGS_VOCAB)`), so a value off the list is a 400 and a key added to the vocabulary can never drift out of the validator |
30
+ | an audit trail | a `provisioning_events` row with the actor, `api:archon:<id>` on an override |
31
+ | the value reaches the instance | `settingsEnvVars` derives `<PREFIX>_VISIBILITY` from the vocabulary automatically; the runner patches `web.env` in place and restarts |
32
+ | the instance can read it | `src/branding.js` maps that env onto `project.visibility` and publishes it in the public manifest, beside its two neighbours |
33
+
34
+ ### It is a POLICY key, not a platform-drawn one
35
+
36
+ The same store holds `PLANET_VOCAB` — keys the platform *draws* with, which have no default, ride no env and restart nothing. The door could have gone there (today only the map reads it, and the restart currently applies an env nothing consumes yet). It does not, for two reasons that outlive today:
37
+
38
+ 1. **ADR 0182 D6 makes the door the ceiling `joinability` may only narrow**, and D1/D5 put admission authority on the instance. The instance is the thing that must refuse a self-join on `private` and refuse an application *at the door* on `stealth` (R11/R12). A door the instance cannot read cannot be a ceiling.
39
+ 2. **A key with a default belongs in the defaulted vocabulary.** `effectiveSettings` gives `SETTINGS_VOCAB` keys today's behaviour for rows that predate them, which is exactly what ADR 0182's migration default (`'public'`, "existing rows keep today's behaviour") asks for. `PLANET_VOCAB` keys are nullable — null means *the platform picks* — and there is no such thing as "the platform picks your join door".
40
+
41
+ ### The hub column is unchanged, and stays the cache
42
+
43
+ Nothing here writes `platform_identity_projects.visibility`. ADR 0182 D5 already calls that row a cache fed by the instance's report, and **R08 is that report** — this ADR only fixes where the truth it will carry is written. Until R08 ships, the map still reads the old `featured + active` predicate (R06's job), so an owner's pick is stored, validated, audited and delivered to their instance, and does not yet move the orb. That gap is R06/R08's, named here so the next builder does not go looking for a bug.
44
+
45
+ ## Consequences
46
+
47
+ - Adding one key to `SETTINGS_VOCAB` propagates through every derived surface at once — the GET's `options`, the PATCH's validator, the env transport, the push receipt. The lockstep tests that had hardcoded the two-key world (`provisioning_settings*.mjs`, `provision_settings_apply.mjs`, the module's own unit file, the kit stub) all had to be told about the third key; that they broke is the guard working.
48
+ - The manage section deliberately has **no "what your project runs" read-back line**, unlike its two siblings. An already-deployed project reports no door until it takes a release carrying `project.visibility`, and a line that could only ever say *"this project's server doesn't report this setting yet"* is worse than no line. It arrives with the enforcement.
49
+ - `config/branding.neutral.json` gains `project.visibility: "public"`, so a self-hosted instance that never receives a push behaves exactly as it does now.
50
+ - The three settings on that page now answer three different questions and are easy to confuse. The mitigation is copy, not naming: each section's fold says what it is *not* ("separate from 'Who can see it' above — that one is the door on the project's own pages"), and the vocabulary comment in `provisioning.js` lays the three side by side.
51
+
52
+ ## Alternatives rejected
53
+
54
+ - **A new owner-scoped write route on the hub catalog** (`PATCH /projects/:id/visibility`). Rejected: it would make the hub authorise a visibility change, which ADR 0182 D5 forbids in as many words, and it would have to invent per-project ownership authority on a table whose owner column is documented as advisory.
55
+ - **A new project-settings page on the instance's hall.** Rejected as the literal reading of D5: it is the right *long-run* home once a project has instance-side settings worth a page, but on its own today it is a control with no consumer — the map is fed by the hub, and the sync that would connect them (R08) is unshipped. The manage view is where an owner already goes, and the same value reaches the instance anyway through the push.
56
+ - **A `visibility` column on `provisioning_instances`, beside `description`.** Rejected: `description` earned a column because it is half the publish gate and is read by SQL; the door is a closed-vocabulary knob, which is exactly what the jsonb store plus a code-side vocabulary exists for (migration `provisioning_009`'s own reasoning: "a new key must not cost a migration each time").
57
+ - **Putting it in `PLANET_VOCAB` to avoid the restart.** Rejected above — it would buy a quieter save today and cost the ceiling rule tomorrow.