@bongos/core 1.19.1080 → 1.19.1081

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 (31) hide show
  1. package/.bongos-core.json +78 -28
  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 +4 -0
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/docs/adr/0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md +2 -0
  8. package/docs/adr/0347-every-store-module-ships-a-how-to.md +135 -0
  9. package/docs/adr/README.md +1 -0
  10. package/docs/api/openapi.json +126 -3
  11. package/docs/api-reference.md +3 -2
  12. package/docs/module-api-changelog.md +2 -0
  13. package/modules/provisioning/migrations/provisioning_028_render_standup.sql +46 -0
  14. package/modules/provisioning/module.json +2 -1
  15. package/modules/provisioning/provisioning.js +5 -5
  16. package/modules/provisioning/render-standup.js +91 -0
  17. package/modules/provisioning/routes/render-standup.js +90 -0
  18. package/package-lock.json +2 -2
  19. package/package.json +1 -1
  20. package/release-notes.json +10 -0
  21. package/scripts/gds/provision-render.js +158 -0
  22. package/scripts/gds/provision-teardown.js +2 -0
  23. package/scripts/gds/provision.js +2 -2
  24. package/scripts/gds/render-api.js +178 -0
  25. package/scripts/gds/render-payload.js +110 -0
  26. package/src/module-api.js +1 -1
  27. package/tests/provision_render.mjs +269 -0
  28. package/tests/provisioning_render_route.mjs +216 -0
  29. package/tests/provisioning_settings_apply.mjs +1 -1
  30. package/tests/provisioning_teardown_intent.mjs +2 -2
  31. package/tests/render_api.mjs +153 -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.1080",
6
- "core_contract": "1.19.1080",
7
- "source_commit": "266542d6d4b7b351e1b5e52e624d6429f20e4a3e",
5
+ "core_version": "1.19.1081",
6
+ "core_contract": "1.19.1081",
7
+ "source_commit": "4c16627cb7cf5c157bc8f62ad568bba7392ab994",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-29T22:14:01.252Z",
9
+ "built_at": "2026-09-29T22:26:53.648Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 550,
12
+ "docs_redacted": 551,
13
13
  "agent_docs_stubbed": 25,
14
- "functional_verbatim": 2535,
14
+ "functional_verbatim": 2544,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3111,
20
- "tree_sha256": "05cc1fdd03c698fc64c21d2c5b4c72150f293acda99233129517b7954d4dfda8",
19
+ "file_count": 3121,
20
+ "tree_sha256": "522f4882eb02038ac8ec418b2ce059e889a48c0f20dcd91a32ea13ed45eac6aa",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -322,12 +322,12 @@
322
322
  {
323
323
  "path": "clients/bongos-client/README.md",
324
324
  "mode": "0000644",
325
- "sha256": "8aa624b247e99bb0a7e3a97745ecd4aa64d7fdddc89d92f47cb20d433d2ad5b0"
325
+ "sha256": "313943caf3bc117539688dafeecb7a3bc1746c3038d68e471e652e303bad53d7"
326
326
  },
327
327
  {
328
328
  "path": "clients/bongos-client/bongos-client.global.js",
329
329
  "mode": "0000644",
330
- "sha256": "510df3006216f3a54f88d90e802d565cc52753ab723061787229ee3d65bd5c83"
330
+ "sha256": "4fff2b043649f142e270d01f844e6fcd2f41466f12a0897f64fe745a8dec9685"
331
331
  },
332
332
  {
333
333
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -337,17 +337,17 @@
337
337
  {
338
338
  "path": "clients/bongos-client/index.cjs",
339
339
  "mode": "0000644",
340
- "sha256": "3e76df3485bb6fb4555e2b85b6637104718eee1fd325f9a951641dc971833295"
340
+ "sha256": "3faf82efd3a0b620552cf75d430d7c750e9c1c74b59825774618e265ee2d0b0a"
341
341
  },
342
342
  {
343
343
  "path": "clients/bongos-client/index.d.ts",
344
344
  "mode": "0000644",
345
- "sha256": "129e807451025dd8346054523b1829db460319c04c640b9e78af39ba012c73bc"
345
+ "sha256": "896ad373b22d96a0be3d404f665fea630dd2cd064e33148908ab1d2ceb64ab3e"
346
346
  },
347
347
  {
348
348
  "path": "clients/bongos-client/index.mjs",
349
349
  "mode": "0000644",
350
- "sha256": "de3ceb5761e334327e7e6367acc8dc4daea75561c1b17c967bb0b7fc43aa7dc1"
350
+ "sha256": "b9d2c891e25c7da32829290b458491ceb6a0ae6461a976801d7b9976d6448473"
351
351
  },
352
352
  {
353
353
  "path": "clients/bongos-client/package.json",
@@ -2182,7 +2182,7 @@
2182
2182
  {
2183
2183
  "path": "docs/adr/0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md",
2184
2184
  "mode": "0000644",
2185
- "sha256": "821f3c073de063aa9f3df9622a5b138cc5060754bb986cd5c747494150ec59db"
2185
+ "sha256": "668d76cffbfaeb9662fc84b4d2c185bc7cd0109a403e6b9bf3032ebe3b569457"
2186
2186
  },
2187
2187
  {
2188
2188
  "path": "docs/adr/0344-a-tester-is-a-project-that-opts-in-once.md",
@@ -2199,20 +2199,25 @@
2199
2199
  "mode": "0000644",
2200
2200
  "sha256": "2ac7140de42599e7ab20785a3fc9265be60fbcd2c4438b2bdc65238c25657c17"
2201
2201
  },
2202
+ {
2203
+ "path": "docs/adr/0347-every-store-module-ships-a-how-to.md",
2204
+ "mode": "0000644",
2205
+ "sha256": "c662705a72d4f7a11e71b0ad5d7ceb6f9c8a4c252925e3c0b4f1584bb1b40a04"
2206
+ },
2202
2207
  {
2203
2208
  "path": "docs/adr/README.md",
2204
2209
  "mode": "0000644",
2205
- "sha256": "835128e78686d49a23125ab8cc09ca90714c6706beb171114ebb34de4aaf548a"
2210
+ "sha256": "72757774554d673f85d7f881f45d12bf5ee3f9b8c1797b50d3de2001dcdaf2de"
2206
2211
  },
2207
2212
  {
2208
2213
  "path": "docs/api-reference.md",
2209
2214
  "mode": "0000644",
2210
- "sha256": "db6392644382a35358daedffe8289ba644ee4d005e842110271702966a8e7cd3"
2215
+ "sha256": "933700d35f098a683e10b72c606ccbdbde79baeed24d860ca3c65edcce38486e"
2211
2216
  },
2212
2217
  {
2213
2218
  "path": "docs/api/openapi.json",
2214
2219
  "mode": "0000644",
2215
- "sha256": "b3795bc67242cfbebf5cd0023327dfc768293fbe09b5998b3c0c2a8f26754ea0"
2220
+ "sha256": "92eb5b8ca11812ff15b26b89971b0565a2c379ca0db68f4f11177d6e485cf6bc"
2216
2221
  },
2217
2222
  {
2218
2223
  "path": "docs/architecture.md",
@@ -2742,7 +2747,7 @@
2742
2747
  {
2743
2748
  "path": "docs/module-api-changelog.md",
2744
2749
  "mode": "0000644",
2745
- "sha256": "f6df65117a87e0af4721f2872bba4ee9f7ab4a01a8ae8b76d38206cad08bf712"
2750
+ "sha256": "b9efde41756d37bae682d8147229faa46bc7b07a0426563ae6712ea55d7f6e2a"
2746
2751
  },
2747
2752
  {
2748
2753
  "path": "docs/modules-contract.md",
@@ -7209,10 +7214,15 @@
7209
7214
  "mode": "0000644",
7210
7215
  "sha256": "0640a034263db802ba64a960f8f71001ecd69b1dffbf54497efc9df6cc778ab0"
7211
7216
  },
7217
+ {
7218
+ "path": "modules/provisioning/migrations/provisioning_028_render_standup.sql",
7219
+ "mode": "0000644",
7220
+ "sha256": "9726682ff47916ca8ef999fe70ed5995c3bad7680b0821b87e4cab8a74d9f867"
7221
+ },
7212
7222
  {
7213
7223
  "path": "modules/provisioning/module.json",
7214
7224
  "mode": "0000644",
7215
- "sha256": "6a6f0aeefd43d68a877a987787a82b02838c8f8f7d3caf53233e68743c425a57"
7225
+ "sha256": "e67258d932d180476a4662df53ee7b39efd865651755f2627855a248f3138266"
7216
7226
  },
7217
7227
  {
7218
7228
  "path": "modules/provisioning/onboard-plan.js",
@@ -7247,7 +7257,7 @@
7247
7257
  {
7248
7258
  "path": "modules/provisioning/provisioning.js",
7249
7259
  "mode": "0000644",
7250
- "sha256": "fcd72068122a7f829fe892da120442edb8042a5dc361e112e82115fd655606ea"
7260
+ "sha256": "92e9a12c0d07d87a16f0d036369967a60c2dfaca3fb1bce78fab97ad54dac0bf"
7251
7261
  },
7252
7262
  {
7253
7263
  "path": "modules/provisioning/public-refusal.js",
@@ -7264,6 +7274,11 @@
7264
7274
  "mode": "0000644",
7265
7275
  "sha256": "4c933aad1307378496d47960e24c9d797a1f122f28aefa27b769f336e4cf2e75"
7266
7276
  },
7277
+ {
7278
+ "path": "modules/provisioning/render-standup.js",
7279
+ "mode": "0000644",
7280
+ "sha256": "69142ba889a008b78ef2222c5acfe7c8c2552bc21df3264ce698e9101f3dee8e"
7281
+ },
7267
7282
  {
7268
7283
  "path": "modules/provisioning/repo-private.js",
7269
7284
  "mode": "0000644",
@@ -7299,6 +7314,11 @@
7299
7314
  "mode": "0000644",
7300
7315
  "sha256": "18a8a728c48070f99dfdaa1c21d738f8d6fcfe8dc8534574fc115cec77f8bf77"
7301
7316
  },
7317
+ {
7318
+ "path": "modules/provisioning/routes/render-standup.js",
7319
+ "mode": "0000644",
7320
+ "sha256": "a1ff9877e727da483946a69dade72a74d0baedd4deb565c8a4c43b43812a4186"
7321
+ },
7302
7322
  {
7303
7323
  "path": "modules/provisioning/routes/repo-private.js",
7304
7324
  "mode": "0000644",
@@ -8602,12 +8622,12 @@
8602
8622
  {
8603
8623
  "path": "package-lock.json",
8604
8624
  "mode": "0000644",
8605
- "sha256": "4187718df5a94313b87e2871b5c296229ea1a92dabe2c75275f05e3174539c74"
8625
+ "sha256": "946d21b8b8e584a4e4e6a3a89d11b1e2dc2ba8de5490db77969eab7f4abd474b"
8606
8626
  },
8607
8627
  {
8608
8628
  "path": "package.json",
8609
8629
  "mode": "0000644",
8610
- "sha256": "4307d22a2cadfdbbd821db8058f22dc4b74f47864b5d405a8b6efca3fd842158"
8630
+ "sha256": "0c96fbccafa2dc7ecce6142620055231ed84dfaebaa15c3d43bda539e2498750"
8611
8631
  },
8612
8632
  {
8613
8633
  "path": "public-docs/index.html",
@@ -8627,7 +8647,7 @@
8627
8647
  {
8628
8648
  "path": "release-notes.json",
8629
8649
  "mode": "0000644",
8630
- "sha256": "e987059aae853c4e12e0890a050c9d8b1f81d2254060d5ea714378ec60b2193e"
8650
+ "sha256": "4b2fec4975e2080384ad450a2b89d86ff3d700bd3c1805392fdb89a8744a2ebf"
8631
8651
  },
8632
8652
  {
8633
8653
  "path": "scripts/bongos-mcp.js",
@@ -9594,6 +9614,11 @@
9594
9614
  "mode": "0000644",
9595
9615
  "sha256": "6a784f63078e5cb2c0f85475672b02b18ded67a36a8041b1ba3643b227a465d0"
9596
9616
  },
9617
+ {
9618
+ "path": "scripts/gds/provision-render.js",
9619
+ "mode": "0000644",
9620
+ "sha256": "33c1c71cdd367305ae57849511f4bb1965a7cb74b4751303fcbb74b8a6ecc040"
9621
+ },
9597
9622
  {
9598
9623
  "path": "scripts/gds/provision-repo-auth.js",
9599
9624
  "mode": "0000644",
@@ -9612,7 +9637,7 @@
9612
9637
  {
9613
9638
  "path": "scripts/gds/provision-teardown.js",
9614
9639
  "mode": "0000644",
9615
- "sha256": "e4ed73f42e4e9c6d9903f8a4d64bc125c09ba42f996b8741b125a972c3afcfb4"
9640
+ "sha256": "60ee12f5ebfa74d4ed8224e93fbd632ef5df750c3842221546de9682bdb31170"
9616
9641
  },
9617
9642
  {
9618
9643
  "path": "scripts/gds/provision-units.js",
@@ -9622,7 +9647,7 @@
9622
9647
  {
9623
9648
  "path": "scripts/gds/provision.js",
9624
9649
  "mode": "0000644",
9625
- "sha256": "563eb4001dba94c4f83ba31e0a004f946e2124bfebb581c73d1c6dc43602766a"
9650
+ "sha256": "d70a94e7dd757b6f57b644ba839117d6624574c25105853048b0e5c6ee6c6320"
9626
9651
  },
9627
9652
  {
9628
9653
  "path": "scripts/gds/publish-credential-check.js",
@@ -9709,6 +9734,11 @@
9709
9734
  "mode": "0000644",
9710
9735
  "sha256": "f73e495ab63fbca755e652d284e378d9b2afef67fe43c4c5a66e2962c92cef1d"
9711
9736
  },
9737
+ {
9738
+ "path": "scripts/gds/render-api.js",
9739
+ "mode": "0000644",
9740
+ "sha256": "1ed4918bf4c615bd4d5ef5b38c2f221df1d1aa80c232f5fe5e056299b6414d08"
9741
+ },
9712
9742
  {
9713
9743
  "path": "scripts/gds/render-check.js",
9714
9744
  "mode": "0000644",
@@ -9719,6 +9749,11 @@
9719
9749
  "mode": "0000644",
9720
9750
  "sha256": "07c4fa6c1c3a9e7502e44abf6ed4d82125bccfd81d1bea8f4b5095c710d07f94"
9721
9751
  },
9752
+ {
9753
+ "path": "scripts/gds/render-payload.js",
9754
+ "mode": "0000644",
9755
+ "sha256": "30de1bc73ee0af4d60577bad0744ff07ba165965b0d24459ce0d85dfcc92a27e"
9756
+ },
9722
9757
  {
9723
9758
  "path": "scripts/gds/repo-metrics.js",
9724
9759
  "mode": "0000644",
@@ -10702,7 +10737,7 @@
10702
10737
  {
10703
10738
  "path": "src/module-api.js",
10704
10739
  "mode": "0000644",
10705
- "sha256": "5f4628ecd7603c1275a4ea0efcdef38540130eb9dfdb6eb0d37dbd28fe675663"
10740
+ "sha256": "0cff8622b007399191c9acb9f2b8d0e502a88dd028d6a9243c05425029b4ffb6"
10706
10741
  },
10707
10742
  {
10708
10743
  "path": "src/module-loader/catalog.js",
@@ -14099,6 +14134,11 @@
14099
14134
  "mode": "0000644",
14100
14135
  "sha256": "20de6ef694e176459b690aac55351f97a77bf91a3076870ba43972a6b8b6e54c"
14101
14136
  },
14137
+ {
14138
+ "path": "tests/provision_render.mjs",
14139
+ "mode": "0000644",
14140
+ "sha256": "775438e10325d1dd38f4f14ebc620b4d01bf1546d94382825be8fc4b658e2801"
14141
+ },
14102
14142
  {
14103
14143
  "path": "tests/provision_repo_private.mjs",
14104
14144
  "mode": "0000644",
@@ -14209,6 +14249,11 @@
14209
14249
  "mode": "0000644",
14210
14250
  "sha256": "641d4ba5fd4de4034e7059b835e98e5a386917d76935555e43c3eb436cbaeb20"
14211
14251
  },
14252
+ {
14253
+ "path": "tests/provisioning_render_route.mjs",
14254
+ "mode": "0000644",
14255
+ "sha256": "e904608ab90777976be12bbfe6d18bb8bbab9b60200d05625b1381ef4f4e6aa9"
14256
+ },
14212
14257
  {
14213
14258
  "path": "tests/provisioning_repo_private_route.mjs",
14214
14259
  "mode": "0000644",
@@ -14232,7 +14277,7 @@
14232
14277
  {
14233
14278
  "path": "tests/provisioning_settings_apply.mjs",
14234
14279
  "mode": "0000644",
14235
- "sha256": "550f67b56dd92d413a1bafc70d76375df9c02d84f9d3e4dfd5789697ae0164f0"
14280
+ "sha256": "92d004e056d55d3b24083e5eb31da64ac5466e34a89f1fb205377882cdcb493c"
14236
14281
  },
14237
14282
  {
14238
14283
  "path": "tests/provisioning_settings_env.mjs",
@@ -14252,7 +14297,7 @@
14252
14297
  {
14253
14298
  "path": "tests/provisioning_teardown_intent.mjs",
14254
14299
  "mode": "0000644",
14255
- "sha256": "51cbc39169b50eae3e88a2d435bfe1d2f25474c12125898040715b0c35aedbf9"
14300
+ "sha256": "08128da3c6b810df963cb167cf29608181627d6c6203efe57f27d1c29e22d54a"
14256
14301
  },
14257
14302
  {
14258
14303
  "path": "tests/provisioning_teardown_states.mjs",
@@ -14439,6 +14484,11 @@
14439
14484
  "mode": "0000644",
14440
14485
  "sha256": "39eaa32121eae07fa7f508d60324e896e4c1b98c53ff390bb8bdca4b952c874f"
14441
14486
  },
14487
+ {
14488
+ "path": "tests/render_api.mjs",
14489
+ "mode": "0000644",
14490
+ "sha256": "8a210e13b8fe1d65c73c3d5a59fada131297a1875b57807cee91534f3b2741c0"
14491
+ },
14442
14492
  {
14443
14493
  "path": "tests/render_check.mjs",
14444
14494
  "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
- - 439 operations across 67 resource groups
8
+ - 440 operations across 67 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -797,6 +797,8 @@ function createClient(opts = {}) {
797
797
  postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
798
798
  // GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
799
799
  getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
800
+ // POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
801
+ postProvisioningInstancesIdRender: (args) => request("POST", "/provisioning/instances/{id}/render", { hasBody: true }, args),
800
802
  // POST /provisioning/instances/{id}/repo-private — rank: any-builder — POST /provisioning/instances/:id/repo-private
801
803
  postProvisioningInstancesIdRepoPrivate: (args) => request("POST", "/provisioning/instances/{id}/repo-private", { hasBody: true }, args),
802
804
  // POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
@@ -796,6 +796,8 @@ function createClient(opts = {}) {
796
796
  postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
797
797
  // GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
798
798
  getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
799
+ // POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
800
+ postProvisioningInstancesIdRender: (args) => request("POST", "/provisioning/instances/{id}/render", { hasBody: true }, args),
799
801
  // POST /provisioning/instances/{id}/repo-private — rank: any-builder — POST /provisioning/instances/:id/repo-private
800
802
  postProvisioningInstancesIdRepoPrivate: (args) => request("POST", "/provisioning/instances/{id}/repo-private", { hasBody: true }, args),
801
803
  // POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
@@ -389,6 +389,8 @@ export interface PostProvisioningInstancesIdEnvManifestRequest { name: string; d
389
389
  export interface PostProvisioningInstancesIdForceTeardownResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; superseded: unknown; message: unknown }
390
390
  export interface PostProvisioningInstancesIdGithubAppRequest { account?: string }
391
391
  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 }
392
+ export interface PostProvisioningInstancesIdRenderRequest { key: string; owner_id: string; mode: string; service_id?: string; web_plan?: string; db_plan?: string; region?: string }
393
+ export interface PostProvisioningInstancesIdRenderResponse { ok: boolean; queued: boolean; action: unknown; mode: unknown; message: unknown }
392
394
  export interface PostProvisioningInstancesIdRepoPrivateResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; message: unknown }
393
395
  export interface PostProvisioningInstancesIdRestartResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; message: unknown }
394
396
  export interface PostProvisioningInstancesIdTeardownResponse { ok: boolean; queued: unknown; action: unknown; status: unknown; superseded: unknown; message: unknown }
@@ -1201,6 +1203,8 @@ export interface BongosClient {
1201
1203
  postProvisioningInstancesIdGithubApp(args?: RequestArgs & { body?: PostProvisioningInstancesIdGithubAppRequest }): Promise<PostProvisioningInstancesIdGithubAppResponse>;
1202
1204
  /** GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder */
1203
1205
  getProvisioningInstancesIdInviteSuggestions(args?: RequestArgs): Promise<GetProvisioningInstancesIdInviteSuggestionsResponse>;
1206
+ /** POST /provisioning/instances/{id}/render — rank: any-builder */
1207
+ postProvisioningInstancesIdRender(args: RequestArgs & { body: PostProvisioningInstancesIdRenderRequest }): Promise<PostProvisioningInstancesIdRenderResponse>;
1204
1208
  /** POST /provisioning/instances/{id}/repo-private — rank: any-builder */
1205
1209
  postProvisioningInstancesIdRepoPrivate(args?: RequestArgs): Promise<PostProvisioningInstancesIdRepoPrivateResponse>;
1206
1210
  /** POST /provisioning/instances/{id}/restart — rank: any-builder */
@@ -793,6 +793,8 @@ export function createClient(opts = {}) {
793
793
  postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
794
794
  // GET /provisioning/instances/{id}/invite-suggestions — rank: any-builder — GET /provisioning/instances/:id/invite-suggestions
795
795
  getProvisioningInstancesIdInviteSuggestions: (args) => request("GET", "/provisioning/instances/{id}/invite-suggestions", { hasBody: false }, args),
796
+ // POST /provisioning/instances/{id}/render — rank: any-builder — POST /provisioning/instances/:id/render
797
+ postProvisioningInstancesIdRender: (args) => request("POST", "/provisioning/instances/{id}/render", { hasBody: true }, args),
796
798
  // POST /provisioning/instances/{id}/repo-private — rank: any-builder — POST /provisioning/instances/:id/repo-private
797
799
  postProvisioningInstancesIdRepoPrivate: (args) => request("POST", "/provisioning/instances/{id}/repo-private", { hasBody: true }, args),
798
800
  // POST /provisioning/instances/{id}/restart — rank: any-builder — POST /provisioning/instances/:id/restart
@@ -30,6 +30,8 @@ explainable in a sentence.
30
30
  Each part is scored 0–100 per module **version**, because a new version can be better or worse
31
31
  than the last.
32
32
 
33
+ > **Amended by [ADR 0347](0347-every-store-module-ships-a-how-to.md):** adds a **Docs** part (the how-to, scored day one), shown with the parts but not in the D3 average.
34
+
33
35
  ### D2 — Security is a gate, not an ingredient
34
36
 
35
37
  A version that **fails the security check is not listed**, whatever else it scores. Security is
@@ -0,0 +1,135 @@
1
+ # ADR 0347 — Every store module ships a how-to: a file in the module, a publish gate, and a Docs score shown on its own
2
+
3
+ - **Status:** accepted
4
+ - **Date:** 2026-09-29
5
+ - **Task:** [task 1004364](https://cloudbongos.com/builders#/task/1004364) (goal 1000091 — working area 5, Module distribution & economy)
6
+ - **Deciders:** Will (owner of working area 5) decided the how-to is a file, the "gate plus score" grader, that the Docs score is shown separately rather than averaged in, and the grader's model and cost ceiling; Claude wrote the record.
7
+ - **Related:** [ADR 0343](0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md) (the score; D1's parts table is amended here) · [ADR 0338](0338-modules-travel-through-a-bongos-hosted-store.md) (the store, the tarball and its hashes) · [ADR 0098](0098-public-mirror-publish-manifest.md) (`isPublishable()`) · [`docs/modules-contract.md`](../modules-contract.md) §6 (publish) and §7 (install) · follow-on tasks 1004365 (the file and the publish check), 1004366 (the store page and PDF), 1004367 (the AI grader)
8
+
9
+ ## Context
10
+
11
+ A buyer browsing the store (ADR 0338) sees a module's name, category and score (ADR 0343),
12
+ but nothing tells them how to use what they are getting. Today a module carries a
13
+ `CLAUDE.md` written for AI sessions working *inside* the module, not for the person who
14
+ installs it. There is no rule that an author explains their module at all.
15
+
16
+ The owner wants every store module to come with a how-to that works for a person or for any
17
+ AI, that the buyer can read before acquiring, and that is judged so good explanations are
18
+ visible.
19
+
20
+ ## Decision
21
+
22
+ ### D1 — The how-to is a file: `HOWTO.md` at the module root (owner)
23
+
24
+ The how-to is `modules/<key>/HOWTO.md`, plain Markdown. It is a **file in the module**, not a
25
+ hosted page, because:
26
+
27
+ - it travels inside the tarball, so it is covered by the manifest hashes and **cannot change
28
+ after a version is published** — the how-to a buyer read is the one they get;
29
+ - any AI or person can read and write Markdown, so the module does not depend on one vendor;
30
+ - it goes wherever the module goes, including instances that are offline.
31
+
32
+ The packaging allowlist (`isPublishable()`, ADR 0098) must include `HOWTO.md`; task 1004365
33
+ checks it is in the tarball.
34
+
35
+ ### D2 — Five required sections, kept short
36
+
37
+ `HOWTO.md` must contain these five level-2 headings, matched case-insensitively and in any
38
+ order, each with some text under it:
39
+
40
+ | Heading | What goes in it |
41
+ |---|---|
42
+ | `## What it does` | A few sentences: what the module adds and who it is for. |
43
+ | `## Install and enable` | How to get it (`bongos module install <key>`) and switch it on (hall Modules tab). |
44
+ | `## How to use it` | Its commands, routes and hall surfaces, with **one worked example**. |
45
+ | `## Configuration` | Env vars and settings, with defaults. "None." is a valid answer. |
46
+ | `## Limits and known issues` | What it doesn't do, and anything known to go wrong. "None known." is a valid answer. |
47
+
48
+ Other headings and sections are welcome. The list is short on purpose, so an author can meet
49
+ it in minutes; quality above that bar is what the Docs score (D5) rewards.
50
+
51
+ ### D3 — An optional Claude artifact link, shown as an extra and never graded (owner)
52
+
53
+ An author may set `howto.artifactUrl` in `module.json` to a Claude artifact (an `https://`
54
+ link on `claude.ai`). The store page shows it as **"Also available as a Claude page"**, next
55
+ to the file, never instead of it.
56
+
57
+ It is **never graded and never required**, because a hosted page can change after publish;
58
+ only the file is frozen with the version. The store validates the field's shape only.
59
+
60
+ ### D4 — The gate: no how-to, no publish
61
+
62
+ `bongos module publish` **refuses** a version when `HOWTO.md` is missing, or when any required
63
+ section (D2) is missing or empty. The refusal names the file or each failing section, e.g.
64
+ `HOWTO.md: section "Configuration" is empty`.
65
+
66
+ - It is a free, deterministic check: it reads headings, it does not judge writing.
67
+ - The CLI runs it before uploading, and the store runs it again on upload (as it already
68
+ re-checks hashes and the denylist, `modules-contract.md` §6), so a hand-built upload can't
69
+ skip it.
70
+ - It applies **only to store versions**. Core-bundled modules and `bongos module submit`
71
+ (proposing a module into core, ADR 0135) are not gated by it.
72
+ - Versions published before the gate existed are not delisted or re-checked; the gate applies
73
+ from the next version.
74
+
75
+ ### D5 — The Docs part: scored, visible, and **not** in the overall score (owner)
76
+
77
+ This amends ADR 0343 D1's parts table with one row:
78
+
79
+ | Part | What it measures | Available |
80
+ |---|---|---|
81
+ | **Docs** | clarity and completeness of the version's `HOWTO.md`, scored by an AI grader (task 1004367) | day one |
82
+
83
+ - **Scored 0–100 per version**, like every other part, because each version ships its own
84
+ how-to.
85
+ - **Shown separately, not averaged in (owner).** Docs is displayed with the other parts
86
+ (ADR 0343 D4), labelled as not counting toward the overall score. It does **not** join the
87
+ plain average in ADR 0343 D3, and so does not move the floor, ranking or cap
88
+ (tasks 1003807–1003809). The overall score stays a measure of how the module *works*; Docs
89
+ tells the buyer how well it is *explained*. A superseding ADR can fold it in later if the
90
+ owner wants.
91
+ - **The grader gives a short reason** with the number (a sentence on what is clear and what is
92
+ missing, such as "no worked example"), so an author knows what to fix.
93
+ - **"No score yet" is never a zero** (ADR 0343 D5). While grading is under way the part shows
94
+ **"Docs: pending"**; if grading could not run, **"Docs: not scored"**. A version is listed
95
+ as soon as it passes the gate; it never waits for the grader.
96
+ - **Price is never an input** (ADR 0343 D6). Free and paid modules are graded by the same
97
+ call, and the Metic+ override applies to Docs like any part, with an audit entry.
98
+
99
+ ### D6 — Cost: one Sonnet 5 call per version, capped at 5¢ (owner)
100
+
101
+ - **One grader call per published version**, made by the store after the version is accepted.
102
+ A failed call is retried once; if both fail, the part stays "not scored" until Metic+
103
+ re-runs it. Nothing re-grades a version automatically after that.
104
+ - **Model: Claude Sonnet 5** (`claude-sonnet-5`), the rung the task grader already uses
105
+ (`modules/grading/grader-rubric.json`). Changing the rung needs the area owner's nod.
106
+ - **Ceiling: 5¢ per call** at list price (Sonnet 5 is $2 in / $10 out per million tokens,
107
+ `src/bongos/llm-pricing.js`). The grader caps its output and its input to fit: a how-to too
108
+ long to read in full is cut to fit, and the reason says the score covers only the part read.
109
+ A typical how-to costs about 1–2¢.
110
+ - The platform pays, and each call is recorded in the cost log like any other API spend
111
+ (CLAUDE.md §4). At 5¢ a version, a thousand published versions is $50.
112
+
113
+ ## Consequences
114
+
115
+ - **Task 1004365** adds the scaffolded `HOWTO.md` (with the five headings) to
116
+ `bongos module new`, the section check in `bongos module publish`, the same check on the
117
+ store's upload route, and `HOWTO.md` in the packaging allowlist.
118
+ - **Task 1004366** renders the file as the module's store page, with a PDF download of the
119
+ same content, and shows the D3 link when present.
120
+ - **Task 1004367** builds the grader to D5 and D6, and stores its score and reason as the
121
+ Docs part.
122
+ - **Authors of existing store modules** must add a `HOWTO.md` before their next version.
123
+ - **The overall score and ranking are unchanged** by this ADR (D5).
124
+
125
+ ## Rejected
126
+
127
+ - **A hosted Claude artifact as the how-to.** It can change after publish, isn't covered by
128
+ the hashes, and ties the module to one vendor. Kept only as the optional extra (D3).
129
+ - **Gate only, no score.** It proves the sections exist, not that they are any good.
130
+ - **AI grader only, no gate.** It costs money for modules with no how-to at all, and an
131
+ outage would leave nothing enforcing the basics.
132
+ - **Docs in the plain average.** Considered; the owner chose to keep the overall score about
133
+ how the module works and show Docs beside it.
134
+ - **Grading core-bundled modules.** They reach instances through the core, not the store; the
135
+ store page is where the how-to is read.
@@ -438,3 +438,4 @@ This keeps the decision history honest and traceable.
438
438
  | 0344 | [**A tester is a project that opts in once; an untested version reaches everyone after seven days** ([task 1003801](https://cloudbongos.com/builders#/task/1003801), goal 1000091 — working area 5, owner Will). Settles "willing user" for criterion `wa5-staged-rollout`. **D1 (owner):** a project's own admin switches on "tester" once and gets tester versions of every module it has, with a per-module "general only" override; never on by default; a builder cannot opt in someone else's project. **D2:** first releases and updates alike go to testers first. **D3 (owner):** a version moves to general after seven days if it still passes the security gate and tests, tested or not; the promotion gate may promote earlier or hold on evidence, never forever. **D4:** testers pay the normal price; any tester discount is area 8's call, named not decided. **D5:** tester installs, errors and crashes feed the score (ADR 0343). Rejected: per-module-only opt-in, one all-or-nothing switch, waiting for a tester, releasing at once.](0344-a-tester-is-a-project-that-opts-in-once.md) | modules / store / rollout |
439
439
  | 0345 | [**We host every project's hall, and its app deploys where the owner chooses** ([task 1004349](https://cloudbongos.com/builders#/task/1004349), goal 1000106 — working area 1, owner Lars). Reverses ADR 0323 §2 and the hall half of ADR 0327. **D1 (owner):** every project's Builders Hall runs on our shared server; `cloud-host` now means "hosted by us". **D2 (owner):** the hall's address is ours or the owner's own domain. **D3 (owner):** the setup wizard asks where the APP deploys; Render only at launch; choosing it creates the app on the owner's own Render account with ADR 0327's borrowed key. **D4 (owner):** "decide later" is allowed. **D5 (owner):** no project is moved. **D6 (measured):** ADR 0145 Finding 1 is live — the hub cookie is `Domain=.cloudbongos.com` and a hall loads modules from its own repo — so our-address halls need task 1004357; an owner domain is safe. **D7 (measured):** at the ceiling the create route refuses `box_full` up front, and the resize is not a prerequisite. Task 1004184 re-scoped, task 1004185 on hold.](0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md) | hosting / provisioning / security |
440
440
  | 0346 | [**Dev boxes are retired; a builder builds from their own checkout** ([task 1003898](https://cloudbongos.com/builders#/task/1003898), goal 1000120 — owner Lars). Records the whole removal, link by link, the owner's three rulings of 2026-09-13 (drop the data, delete `.devcontainer/`, remove `bongos box`/`shell`/`code`), what was kept on purpose (server-mediated publish, the CLI downloads, `secret-box`, `do-api`, the declared-source rule), and the retirement guards that still name the box. Supersedes 0031, 0044, 0045, 0053, 0057, 0059, 0071, 0072 (code staleness), 0123, 0144, 0145 (desktop-app branding), 0148, 0193, 0277; supersedes in part 0035, 0046, 0052, 0055, 0072 (Bongos app), 0151 §3.](0346-dev-boxes-are-retired.md) | builder environment / removal |
441
+ | 0347 | [**Every store module ships a how-to: a file in the module, a publish gate, and a Docs score shown on its own** ([task 1004364](https://cloudbongos.com/builders#/task/1004364), goal 1000091 — working area 5, owner Will). Amends ADR 0343 D1. **D1-D2 (owner):** the how-to is `HOWTO.md` at the module root, frozen with the version by the tarball hashes, with five required sections (what it does; install and enable; how to use it, with one worked example; configuration; limits and known issues). **D3:** an optional `howto.artifactUrl` Claude artifact shown as "also available as", never graded. **D4:** `bongos module publish` and the store refuse a version with a missing file or empty section, naming it; store versions only. **D5 (owner):** a Docs part scored 0–100 per version, day one, shown beside the parts but NOT in the D3 average, floor or ranking; "pending"/"not scored" never zero; price never an input. **D6 (owner):** one Sonnet 5 call per version, 5¢ ceiling.](0347-every-store-module-ships-a-how-to.md) | modules / store / quality |