@bongos/core 1.20.78 → 1.20.80

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 (39) hide show
  1. package/.bongos-core.json +74 -39
  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/docs/adr/0161-publish-on-merge.md +1 -1
  8. package/docs/adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md +59 -0
  9. package/docs/adr/README.md +1 -0
  10. package/docs/api/openapi.json +60 -2
  11. package/docs/api-reference.md +3 -2
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/recipes/private-npm-distribution.md +2 -0
  14. package/docs/recipes/upgrading-the-core.md +1 -1
  15. package/modules/lifecycle/module.json +2 -1
  16. package/modules/lifecycle/routes/lifecycle.js +7 -0
  17. package/modules/lifecycle/workflow-dispatch.js +45 -0
  18. package/modules/npm-release/module.json +2 -1
  19. package/modules/npm-release/public/work.js +74 -0
  20. package/modules/npm-release/release.js +129 -0
  21. package/modules/npm-release/routes/release.js +65 -0
  22. package/modules/npm-release/work.js +16 -0
  23. package/modules/provisioning/render-standup.js +2 -1
  24. package/package-lock.json +2 -2
  25. package/package.json +1 -1
  26. package/release-notes.json +16 -0
  27. package/scripts/gds/init.js +16 -6
  28. package/scripts/gds/provision-core-upgrade.js +30 -2
  29. package/scripts/gds/release-core.js +80 -0
  30. package/scripts/gds/update-channel.js +12 -3
  31. package/src/bongos/core-update.js +17 -8
  32. package/src/module-api.js +1 -1
  33. package/tests/core_update_banner.mjs +41 -5
  34. package/tests/core_upgrade_runner.mjs +66 -1
  35. package/tests/init.mjs +21 -5
  36. package/tests/npm_release_release.mjs +195 -0
  37. package/tests/release_core.mjs +110 -0
  38. package/tests/update_channel.mjs +7 -0
  39. package/tests/upgrade_migrate.mjs +1 -1
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.20.78",
6
- "core_contract": "1.20.78",
7
- "source_commit": "54fe45a4edf4789308fc09a05904110b20b555ff",
5
+ "core_version": "1.20.80",
6
+ "core_contract": "1.20.80",
7
+ "source_commit": "2d9219d9d076b61f42d6fab1bd14c09a0ad44977",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-01T20:43:40.208Z",
9
+ "built_at": "2026-10-01T21:17:56.014Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 575,
12
+ "docs_redacted": 576,
13
13
  "agent_docs_stubbed": 27,
14
- "functional_verbatim": 2811,
14
+ "functional_verbatim": 2817,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3414,
20
- "tree_sha256": "f7d14f92e9dd084e4959190624762c8a22148f6700e48f0ef079e9988a92a5dc",
19
+ "file_count": 3421,
20
+ "tree_sha256": "930db69afea73a2acf5a2e95947d339e87f00d05026959754cbdbcb7f27d4ac4",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -317,12 +317,12 @@
317
317
  {
318
318
  "path": "clients/bongos-client/README.md",
319
319
  "mode": "0000644",
320
- "sha256": "63c9cef50cf602cac2c7b7cb24c878acd07d11d1c4354ef68d75987b9ecae150"
320
+ "sha256": "3b5c17644e042b58fa061e1981a0fd234b1868d25551002214d65716f8ced6ea"
321
321
  },
322
322
  {
323
323
  "path": "clients/bongos-client/bongos-client.global.js",
324
324
  "mode": "0000644",
325
- "sha256": "bb9b35d76798248f6e711f5b95af076cac45b1cc373ca02733aad95d3990db27"
325
+ "sha256": "2afaea5660bc6dea5cadae88b68b2b52cb088243da2b186d2ab09c660fd5cafb"
326
326
  },
327
327
  {
328
328
  "path": "clients/bongos-client/examples/hello-world.mjs",
@@ -332,17 +332,17 @@
332
332
  {
333
333
  "path": "clients/bongos-client/index.cjs",
334
334
  "mode": "0000644",
335
- "sha256": "89eda37c197dc32fea981b5f07bc6aaafffe67d902117ca212231dd13bef1913"
335
+ "sha256": "955eaa24cf1955927a3462657e9d46ca8f27b3ab14864cff794d671e52c3c19d"
336
336
  },
337
337
  {
338
338
  "path": "clients/bongos-client/index.d.ts",
339
339
  "mode": "0000644",
340
- "sha256": "c71b82943cd6bd76f0740f6da9b44a212a3a4da3f7d7ccdc4d4c6d6e10d20802"
340
+ "sha256": "ad8dd5de9ff6a167f6695b5bf59e7e3fb4276f33e76a505322b907330a056ec9"
341
341
  },
342
342
  {
343
343
  "path": "clients/bongos-client/index.mjs",
344
344
  "mode": "0000644",
345
- "sha256": "2beca96b15c5ac7a97553c3bfd0757bf8c3ec449cc72db760cc8840f2ef68c54"
345
+ "sha256": "47c75a5b49baf0a5249c2d56371046b344110011463bf70b6bf643868a53ab39"
346
346
  },
347
347
  {
348
348
  "path": "clients/bongos-client/package.json",
@@ -1247,7 +1247,7 @@
1247
1247
  {
1248
1248
  "path": "docs/adr/0161-publish-on-merge.md",
1249
1249
  "mode": "0000644",
1250
- "sha256": "c3da608c2b3d17ceb9208abfadd8ed218654fcc67cc545528683da8a624834a0"
1250
+ "sha256": "25cf413de867af3aa480452339dd11ac449c0add97717bf16b8699cee3f25d1c"
1251
1251
  },
1252
1252
  {
1253
1253
  "path": "docs/adr/0162-review-gates-retired-rank-consistent-ci-only.md",
@@ -2264,20 +2264,25 @@
2264
2264
  "mode": "0000644",
2265
2265
  "sha256": "f1f9153e7975f30d7a2e53f31c3bacb15a270affb9c1b119930aa0104e55c4e6"
2266
2266
  },
2267
+ {
2268
+ "path": "docs/adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md",
2269
+ "mode": "0000644",
2270
+ "sha256": "b78abd9c3aa4badc6a5631e55e00f76fbcdeabc603b7f1885839fe1b8d533dac"
2271
+ },
2267
2272
  {
2268
2273
  "path": "docs/adr/README.md",
2269
2274
  "mode": "0000644",
2270
- "sha256": "504490989f3f23ff00e970f7da9a6b046a7ba94b415c9114d83d660885750c0e"
2275
+ "sha256": "88cd773536fd1397ae3b1b0f262d5c291b8762b6203c1dc1430b13e498a40311"
2271
2276
  },
2272
2277
  {
2273
2278
  "path": "docs/api-reference.md",
2274
2279
  "mode": "0000644",
2275
- "sha256": "c3b52f2ed9dce5b5bf72b8addc90293816837696ae06742e91e5d32ea69f5988"
2280
+ "sha256": "1590ef5cd06ec79bb3ee7de0d113bafe11e194add5d8d452f1970cb563eb3c9c"
2276
2281
  },
2277
2282
  {
2278
2283
  "path": "docs/api/openapi.json",
2279
2284
  "mode": "0000644",
2280
- "sha256": "94478baadf36dbd303c05548ed6d0a2ff20c1804848602aecfb148b506aa456d"
2285
+ "sha256": "16a216722d0e6f9c6b5e89f4c15a171e97f2924ad662adf1117d607ec1895ae5"
2281
2286
  },
2282
2287
  {
2283
2288
  "path": "docs/architecture.md",
@@ -2812,7 +2817,7 @@
2812
2817
  {
2813
2818
  "path": "docs/module-api-changelog.md",
2814
2819
  "mode": "0000644",
2815
- "sha256": "2b7d697f9a5870c16de63e84268ee995f0c1ef7aedc825cf1d7610559744677d"
2820
+ "sha256": "f538bffbc4e360ec61b27185b921972f32880c678f8b583a9ab2eeb134119e0d"
2816
2821
  },
2817
2822
  {
2818
2823
  "path": "docs/modules-contract.md",
@@ -3012,7 +3017,7 @@
3012
3017
  {
3013
3018
  "path": "docs/recipes/private-npm-distribution.md",
3014
3019
  "mode": "0000644",
3015
- "sha256": "0125fca7ef4c910f87a03e20ccfb06ae8a81cf5ebc8f9821e4bc3e8a8d0a7ea1"
3020
+ "sha256": "2a5cc6de16fc8ecf3539fda190cdfe3a2883e9edc6209084f950566c1999d814"
3016
3021
  },
3017
3022
  {
3018
3023
  "path": "docs/recipes/redteam-patrol.md",
@@ -3067,7 +3072,7 @@
3067
3072
  {
3068
3073
  "path": "docs/recipes/upgrading-the-core.md",
3069
3074
  "mode": "0000644",
3070
- "sha256": "d28d1f034a7a87164b780c7320ef36809a024bdd29e1e31a1b9e8e17bb911f49"
3075
+ "sha256": "db22c5d184e2eccffaca9ee17af76c3c716366fede40dc445001b213a0f3df4b"
3071
3076
  },
3072
3077
  {
3073
3078
  "path": "docs/recipes/windows-builders.md",
@@ -6832,7 +6837,7 @@
6832
6837
  {
6833
6838
  "path": "modules/lifecycle/module.json",
6834
6839
  "mode": "0000644",
6835
- "sha256": "4eaad6ef027c1e2f3baa2d589a963e721d1f4c20201ed003e412953ea570ee8e"
6840
+ "sha256": "d69e5c920cc0d32d81190ea8031556df8f48074807cd6661b5e380ebcd672ca1"
6836
6841
  },
6837
6842
  {
6838
6843
  "path": "modules/lifecycle/page-tweak-approve.js",
@@ -6982,7 +6987,7 @@
6982
6987
  {
6983
6988
  "path": "modules/lifecycle/routes/lifecycle.js",
6984
6989
  "mode": "0000644",
6985
- "sha256": "ddf0d0dd41ac412b7e82a541793f6cf182ef9063c91e541bb71a89a37b5a699e"
6990
+ "sha256": "7f4bc68875ba58aa5cfeae08fc7a7bffd4fbd42f0b6ce6489a70b96cdbc2272d"
6986
6991
  },
6987
6992
  {
6988
6993
  "path": "modules/lifecycle/routes/mingle.js",
@@ -7114,6 +7119,11 @@
7114
7119
  "mode": "0000644",
7115
7120
  "sha256": "10de74d2e44e3027932ace7d47238f48009ce79f73ba8d3aeb610b911afe4dcd"
7116
7121
  },
7122
+ {
7123
+ "path": "modules/lifecycle/workflow-dispatch.js",
7124
+ "mode": "0000644",
7125
+ "sha256": "33bf8630ec7b77f1f505f30e53cd0b000f37d9c4bafb8bcd4d4425425de1a6d1"
7126
+ },
7117
7127
  {
7118
7128
  "path": "modules/memory/CLAUDE.md",
7119
7129
  "mode": "0000644",
@@ -7167,7 +7177,7 @@
7167
7177
  {
7168
7178
  "path": "modules/npm-release/module.json",
7169
7179
  "mode": "0000644",
7170
- "sha256": "ede907b6b579c3213eaf45d12320a8765aebaa11adc9b534e9402271c5eb39f7"
7180
+ "sha256": "86e060e53371276912857f975de81c94cb2566d14bcdbbdc402f27c1a65fcb3f"
7171
7181
  },
7172
7182
  {
7173
7183
  "path": "modules/npm-release/preview/childlog.js",
@@ -7217,13 +7227,23 @@
7217
7227
  {
7218
7228
  "path": "modules/npm-release/public/work.js",
7219
7229
  "mode": "0000644",
7220
- "sha256": "73b94334328ea385ddb06090d1a2363b0878ca7be48072ea1361ae279022177e"
7230
+ "sha256": "ffba0707b82310100355183efe16fbd2e51f99bafd26e9b9a41deece210dc31d"
7231
+ },
7232
+ {
7233
+ "path": "modules/npm-release/release.js",
7234
+ "mode": "0000644",
7235
+ "sha256": "f47a649af323b234795ce243777f009dc6677f92fcbd6ad6d9cccd6f8c9c4426"
7221
7236
  },
7222
7237
  {
7223
7238
  "path": "modules/npm-release/routes/preview.js",
7224
7239
  "mode": "0000644",
7225
7240
  "sha256": "bb2d1b5db4a13949d69177ad10bdd9d4a3e6ad77710317317e764358bc150551"
7226
7241
  },
7242
+ {
7243
+ "path": "modules/npm-release/routes/release.js",
7244
+ "mode": "0000644",
7245
+ "sha256": "8f8fa94eafbe428628da850f62e19b845b2098df5392d9028e6e5d30b51c3a56"
7246
+ },
7227
7247
  {
7228
7248
  "path": "modules/npm-release/routes/task-where.js",
7229
7249
  "mode": "0000644",
@@ -7237,7 +7257,7 @@
7237
7257
  {
7238
7258
  "path": "modules/npm-release/work.js",
7239
7259
  "mode": "0000644",
7240
- "sha256": "5c38191935584b8a500b432ea913b4429a72a6c03277a1ff3e8fee4b5ab0a7f6"
7260
+ "sha256": "c5b1c300c217e8c74c6c7edea367e76cb12029029f5f9c8d9cac3a92b72764bf"
7241
7261
  },
7242
7262
  {
7243
7263
  "path": "modules/onboarding/CLAUDE.md",
@@ -8062,7 +8082,7 @@
8062
8082
  {
8063
8083
  "path": "modules/provisioning/render-standup.js",
8064
8084
  "mode": "0000644",
8065
- "sha256": "e1ace20074d6bcb25cc457b240512925ed5b7d4cc931633082d262067fce9f8a"
8085
+ "sha256": "51c00d712c515978cdffcde9ae2c6a170c96be931937a10d557b56de553baf67"
8066
8086
  },
8067
8087
  {
8068
8088
  "path": "modules/provisioning/repo-private.js",
@@ -9492,12 +9512,12 @@
9492
9512
  {
9493
9513
  "path": "package-lock.json",
9494
9514
  "mode": "0000644",
9495
- "sha256": "f8da6c11ec17d4c4a83d5e070d3ae0c941376a527b4a9a0be7ce1903d7beb482"
9515
+ "sha256": "65547dec9e40ab38b66301306ef0b723471fe9d66091e5fdc2bcd95985396332"
9496
9516
  },
9497
9517
  {
9498
9518
  "path": "package.json",
9499
9519
  "mode": "0000644",
9500
- "sha256": "8dfe3adc1e608279f3ffee6a8cdfd3c7c32b7581395ea81bb000dc370afe0035"
9520
+ "sha256": "5054d061aed2bf2fd2b4e1f53740d8eff0afd8376099a009b1fe34c497405565"
9501
9521
  },
9502
9522
  {
9503
9523
  "path": "public-docs/index.html",
@@ -9517,7 +9537,7 @@
9517
9537
  {
9518
9538
  "path": "release-notes.json",
9519
9539
  "mode": "0000644",
9520
- "sha256": "e70c626913df104cf096a75eb4b06ff9cabcddda470e063839a4fffd26e78407"
9540
+ "sha256": "6cd499f6303a23c1605494af3f5ef2f3a2e934fc80b5494f952c10f88db7b841"
9521
9541
  },
9522
9542
  {
9523
9543
  "path": "scripts/bongos-mcp.js",
@@ -10242,7 +10262,7 @@
10242
10262
  {
10243
10263
  "path": "scripts/gds/init.js",
10244
10264
  "mode": "0000644",
10245
- "sha256": "14c21f1640f81fa039c59a49acb0155e5fa6eb4eb177e845ceec1f88bc067528"
10265
+ "sha256": "f9e77db85aa1ec20f55f0e96cade7c2977863d21a4c148407deb965b436bfdc3"
10246
10266
  },
10247
10267
  {
10248
10268
  "path": "scripts/gds/install-git-hooks.js",
@@ -10517,7 +10537,7 @@
10517
10537
  {
10518
10538
  "path": "scripts/gds/provision-core-upgrade.js",
10519
10539
  "mode": "0000644",
10520
- "sha256": "1f63f4b896a235f6c4efc4889d8b94aba4118ab2d7e702d637fd3642f9de1ccc"
10540
+ "sha256": "1804ffb4da2732babbb955ef526a7c25b8da6a2acb8c50fac164b4b0d88a04e3"
10521
10541
  },
10522
10542
  {
10523
10543
  "path": "scripts/gds/provision-disconnect.js",
@@ -10634,6 +10654,11 @@
10634
10654
  "mode": "0000644",
10635
10655
  "sha256": "719bbb22e46ab948bb0c82c3818d69c3ed5324abf4d904270206a93872ffca39"
10636
10656
  },
10657
+ {
10658
+ "path": "scripts/gds/release-core.js",
10659
+ "mode": "0000644",
10660
+ "sha256": "d39109329da8c93910935318bf76f791b0a2c266ff1da769deaa20515eaaf30f"
10661
+ },
10637
10662
  {
10638
10663
  "path": "scripts/gds/release-notes.js",
10639
10664
  "mode": "0000644",
@@ -11172,7 +11197,7 @@
11172
11197
  {
11173
11198
  "path": "scripts/gds/update-channel.js",
11174
11199
  "mode": "0000644",
11175
- "sha256": "0168e8482e02d74ef59aa53f4874be6ec41e91747651a99009b56b764137bf0c"
11200
+ "sha256": "f6b0d78ff92c9962b158bc5b36bae021c63fcc24095c7b10866f1505ee3f5232"
11176
11201
  },
11177
11202
  {
11178
11203
  "path": "scripts/gds/update-sweep.js",
@@ -11392,7 +11417,7 @@
11392
11417
  {
11393
11418
  "path": "src/bongos/core-update.js",
11394
11419
  "mode": "0000644",
11395
- "sha256": "27630af327d56e6eea77eb7e402086ec695f9fd02f419e48af463ed1adbfab8c"
11420
+ "sha256": "9fa4053f230b9ee08a1b8a898256fde60814db0cc079f86f11d5e06fc70921e0"
11396
11421
  },
11397
11422
  {
11398
11423
  "path": "src/bongos/craft-mode.js",
@@ -11712,7 +11737,7 @@
11712
11737
  {
11713
11738
  "path": "src/module-api.js",
11714
11739
  "mode": "0000644",
11715
- "sha256": "f11189e9084e5a2b10a2767bfa8166a419fbd202e90252a628a1fc426f7102f9"
11740
+ "sha256": "6dbb388b1873983917f182cc7220fcee056c3a1f1f07810cdb635870fe2c3f4c"
11716
11741
  },
11717
11742
  {
11718
11743
  "path": "src/module-loader/catalog.js",
@@ -12672,7 +12697,7 @@
12672
12697
  {
12673
12698
  "path": "tests/core_update_banner.mjs",
12674
12699
  "mode": "0000644",
12675
- "sha256": "f3730a99e55845f6cf03789c364c78cdf2a6cf8aa6ae2f639041c14ea3f28864"
12700
+ "sha256": "0e09c40e79de4e1bd50c9f19651f3884838fbb5d87f48601f52793bb0dc89d06"
12676
12701
  },
12677
12702
  {
12678
12703
  "path": "tests/core_upgrade_door.mjs",
@@ -12687,7 +12712,7 @@
12687
12712
  {
12688
12713
  "path": "tests/core_upgrade_runner.mjs",
12689
12714
  "mode": "0000644",
12690
- "sha256": "756ddbafdf6e1d116c6984a989154c24cdbfb927572b71dc2b9dab27f82b2dab"
12715
+ "sha256": "aa5189d9988633d0529a50844ea31c9aabb825b7a1292fbe295f48a4ef452a6e"
12691
12716
  },
12692
12717
  {
12693
12718
  "path": "tests/cosmos_token_contrast.mjs",
@@ -14367,7 +14392,7 @@
14367
14392
  {
14368
14393
  "path": "tests/init.mjs",
14369
14394
  "mode": "0000644",
14370
- "sha256": "376da89565a6ad32788029406163bc6b5198e3279e07645256550747ec1b728a"
14395
+ "sha256": "6549706010a545b9d387d8e3f4f4a157a5088c4292dbc288e3e7fc27f5335ead"
14371
14396
  },
14372
14397
  {
14373
14398
  "path": "tests/instance_config.mjs",
@@ -15004,6 +15029,11 @@
15004
15029
  "mode": "0000644",
15005
15030
  "sha256": "f326bc26e3b137dc8e17a22beeb08861181d35dc881ec1762e05377b9d9430e7"
15006
15031
  },
15032
+ {
15033
+ "path": "tests/npm_release_release.mjs",
15034
+ "mode": "0000644",
15035
+ "sha256": "91df29bc16dc2386da58224f5d199daef545f566f40ef90eb2f957bf8a9dded3"
15036
+ },
15007
15037
  {
15008
15038
  "path": "tests/npm_release_where.mjs",
15009
15039
  "mode": "0000644",
@@ -15834,6 +15864,11 @@
15834
15864
  "mode": "0000644",
15835
15865
  "sha256": "ad53ec7d4b4002f8b349a47021081943ce74454ffd576bb91564f3b991afcbd7"
15836
15866
  },
15867
+ {
15868
+ "path": "tests/release_core.mjs",
15869
+ "mode": "0000644",
15870
+ "sha256": "1496a141ce8ad3c8c5186fc165a7d0c0642dd197d9b9f74386fd73313e176f81"
15871
+ },
15837
15872
  {
15838
15873
  "path": "tests/release_notes.mjs",
15839
15874
  "mode": "0000644",
@@ -16862,7 +16897,7 @@
16862
16897
  {
16863
16898
  "path": "tests/update_channel.mjs",
16864
16899
  "mode": "0000644",
16865
- "sha256": "2ceed0b397697a39ee2ee46f5fed7a0e659d1f18364369d510d6b64704d99f59"
16900
+ "sha256": "3b8edcf4d340315784594ff984b8fb165632ac6fe3b7b4ef9ab841ab6fe7e228"
16866
16901
  },
16867
16902
  {
16868
16903
  "path": "tests/update_channel_db.mjs",
@@ -16892,7 +16927,7 @@
16892
16927
  {
16893
16928
  "path": "tests/upgrade_migrate.mjs",
16894
16929
  "mode": "0000644",
16895
- "sha256": "d3f5b941b89ede78ebb3cd7af43467363e5d6c6d35c7ad26a2977683ecf869e7"
16930
+ "sha256": "47048521bb37c9debc02ef5c366bfe863450eb944023cce60ba182b9640563ee"
16896
16931
  },
16897
16932
  {
16898
16933
  "path": "tests/upgrade_outcome.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
- - 489 operations across 73 resource groups
8
+ - 490 operations across 73 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -779,6 +779,8 @@ function createClient(opts = {}) {
779
779
  getNpmReleasePreviewEnter: (args) => request("GET", "/npm-release/preview/enter", { hasBody: false }, args),
780
780
  // GET /npm-release/preview/exit — rank: any-builder — GET /npm-release/preview/exit
781
781
  getNpmReleasePreviewExit: (args) => request("GET", "/npm-release/preview/exit", { hasBody: false }, args),
782
+ // POST /npm-release/release — rank: archon — POST /npm-release/release
783
+ postNpmReleaseRelease: (args) => request("POST", "/npm-release/release", { hasBody: true }, args),
782
784
  // GET /npm-release/task/{id} — rank: any-builder — GET /npm-release/task/:id
783
785
  getNpmReleaseTaskId: (args) => request("GET", "/npm-release/task/{id}", { hasBody: false }, args),
784
786
  // GET /npm-release/work — rank: archon — GET /npm-release/work
@@ -778,6 +778,8 @@ function createClient(opts = {}) {
778
778
  getNpmReleasePreviewEnter: (args) => request("GET", "/npm-release/preview/enter", { hasBody: false }, args),
779
779
  // GET /npm-release/preview/exit — rank: any-builder — GET /npm-release/preview/exit
780
780
  getNpmReleasePreviewExit: (args) => request("GET", "/npm-release/preview/exit", { hasBody: false }, args),
781
+ // POST /npm-release/release — rank: archon — POST /npm-release/release
782
+ postNpmReleaseRelease: (args) => request("POST", "/npm-release/release", { hasBody: true }, args),
781
783
  // GET /npm-release/task/{id} — rank: any-builder — GET /npm-release/task/:id
782
784
  getNpmReleaseTaskId: (args) => request("GET", "/npm-release/task/{id}", { hasBody: false }, args),
783
785
  // GET /npm-release/work — rank: archon — GET /npm-release/work
@@ -401,6 +401,7 @@ export interface PostMyProjectsInvitesClientIdDeclineResponse { ok: boolean; acc
401
401
  export interface PostMyProjectsJoinRequest { origin: string; note?: string }
402
402
  export interface PostMyProjectsJoinResponse { ok: boolean; status: unknown; project: unknown; message: unknown }
403
403
  export interface PostNpmReleasePreviewRequest { version: string }
404
+ export interface PostNpmReleaseReleaseRequest { version: string }
404
405
  export interface PostOverrideRequestsIdDecideRequest { decision: string; note?: string }
405
406
  export interface PostProjectsInviteRequest { client_id: string; github_login: string }
406
407
  export interface PostProjectsInviteResponse { invited: boolean; invite_url: unknown }
@@ -1231,6 +1232,8 @@ export interface BongosClient {
1231
1232
  getNpmReleasePreviewEnter(args?: RequestArgs): Promise<ApiResponse>;
1232
1233
  /** GET /npm-release/preview/exit — rank: any-builder */
1233
1234
  getNpmReleasePreviewExit(args?: RequestArgs): Promise<ApiResponse>;
1235
+ /** POST /npm-release/release — rank: archon */
1236
+ postNpmReleaseRelease(args: RequestArgs & { body: PostNpmReleaseReleaseRequest }): Promise<ApiResponse>;
1234
1237
  /** GET /npm-release/task/{id} — rank: any-builder */
1235
1238
  getNpmReleaseTaskId(args?: RequestArgs): Promise<ApiResponse>;
1236
1239
  /** GET /npm-release/work — rank: archon */
@@ -775,6 +775,8 @@ export function createClient(opts = {}) {
775
775
  getNpmReleasePreviewEnter: (args) => request("GET", "/npm-release/preview/enter", { hasBody: false }, args),
776
776
  // GET /npm-release/preview/exit — rank: any-builder — GET /npm-release/preview/exit
777
777
  getNpmReleasePreviewExit: (args) => request("GET", "/npm-release/preview/exit", { hasBody: false }, args),
778
+ // POST /npm-release/release — rank: archon — POST /npm-release/release
779
+ postNpmReleaseRelease: (args) => request("POST", "/npm-release/release", { hasBody: true }, args),
778
780
  // GET /npm-release/task/{id} — rank: any-builder — GET /npm-release/task/:id
779
781
  getNpmReleaseTaskId: (args) => request("GET", "/npm-release/task/{id}", { hasBody: false }, args),
780
782
  // GET /npm-release/work — rank: archon — GET /npm-release/work
@@ -1,6 +1,6 @@
1
1
  # 0161 — Publish on merge: every merge to core `main` auto-publishes `@bongos/core`
2
2
 
3
- - **Status:** Accepted
3
+ - **Status:** Accepted. **Amended by [ADR 0361](0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md)** (task 1004298): merges publish as candidates under `next`; `latest` moves only on Release.
4
4
  - **Date:** 2026-08-08
5
5
  - **Deciders:** the owner (Archon), Claude. The owner chose this directly after reviewing the pipeline end-to-end: "any merge can publish, we can add in more complexity later."
6
6
  - **Task:** task 1002620 (BONGOS-V1, goal 1000024 — build-pipeline integrity)
@@ -0,0 +1,59 @@
1
+ # ADR 0361 — Merges publish as candidates; Release on /deploy decides what other projects are offered
2
+
3
+ - **Status:** Accepted. Ships **inert**: candidates start only when the owner sets `PUBLISH_AS_CANDIDATE=1` (see *Arming*).
4
+ - **Date:** 2026-10-01
5
+ - **Task:** [task 1004298](https://cloudbongos.com/builders#/task/1004298) (goal 1000090 — BONGOS-V2), split out of [task 1002622](https://cloudbongos.com/builders#/task/1002622) §3.
6
+ - **Deciders:** the owner. Decisions of 2026-09-25/26: nothing reaches other projects until it is released, **patches included**; the button belongs to the `npm-release` module.
7
+ - **Amends:** [ADR 0161](0161-publish-on-merge.md) (publish on merge). Every merge still publishes; it no longer becomes what every project is offered.
8
+ - **Builds on:** [ADR 0360](0360-bongos-follows-every-candidate-every-other-project-follows-releases.md) (the per-instance follow), [ADR 0136](0136-update-channel-subscription-policy.md) (channels).
9
+
10
+ ## Context
11
+
12
+ Under ADR 0161 every merge to core `main` publishes a new `@bongos/core` under npm's `latest` label, and every consumer read "newest on npm" as "what you may move to". So a merge was a release to every project, minutes after it landed, with no point at which the owner said yes.
13
+
14
+ ADR 0360 gave each instance a **follow**: `released` (at or below `latest`) or `candidates` (every version). Until now the two picked the same target, because `latest` was always the newest version.
15
+
16
+ ## Decision
17
+
18
+ ### D1 — Merges publish under `next`
19
+
20
+ `publish.yml` publishes with `--tag next` when the repository variable `PUBLISH_AS_CANDIDATE=1`. The version is on npm, installable by exact number, and `latest` does not move. Unset, the lane publishes under `latest` exactly as before. That is what lets this change land without changing anything.
21
+
22
+ ### D2 — Release moves `latest`, in GitHub
23
+
24
+ Release is a second job in `publish.yml` (`release`, on `workflow_dispatch` with `release_version`). It asks `scripts/gds/release-core.js` whether the version may be released, then runs `npm dist-tag add @bongos/core@<v> latest`.
25
+
26
+ - **The version must be published, stable, and newer than the current release.** An older version would move every project's offer backwards. That is a rollback for everyone, and it stays a terminal act. Releasing the current release again is a no-op.
27
+ - **It lives in `publish.yml`, not a new file.** npm's trusted publisher for `@bongos/core` names `publish.yml`. Since 2026-09-30 the same OIDC identity can move dist-tags once "Allow npm dist-tag" is ticked on that entry. A separate file would need a second trusted-publisher entry or a long-lived token, and this lane was built to be rid of the token (task 1003202).
28
+ - **The version reaches the shell through `env`**, never `${{ }}` inside a script, and is refused unless it is `x.y.z`.
29
+
30
+ ### D3 — The button starts the job; the server never holds an npm credential
31
+
32
+ `POST /api/bongos/npm-release/release` (`core.pin.move`, the deploy page's own atom) dispatches the release job through GitHub's API. The GitHub credential is the server's existing GitHub App; the call reaches it through a one-function port, `lifecycle.workflowDispatch`. The `npm-release` module can start a workflow and do nothing else with that credential. The route applies `releaseDecision` first, the same function the job applies again. So the button cannot promise what the job would refuse, and the job remains the gate.
33
+
34
+ ### D4 — The button shows the evidence
35
+
36
+ The deploy page's **Release** section lists the versions this hall runs that are not released, newest first. Each shows how long it has run on this hall and whether a move to it was ever rolled back here, from the `core_upgrades` ledger. Release covers a whole version: everything merged up to it.
37
+
38
+ ### D5 — Every consumer offers only what is released
39
+
40
+ - The update sweep (ADR 0360) already follows `released` by default.
41
+ - The "update available" banner (`src/bongos/core-update.js`) offers versions at or below `latest`, read from the same packument. With no readable label it has no answer.
42
+ - The platform's upgrade runner for hosted projects (`scripts/gds/provision-core-upgrade.js`) offers a project the versions its follow admits. The follow comes from its hosting shape: the `control-plane` row is the platform hall and takes candidates; every other shape takes releases (`followForShape`). It is derived, not a column, because there is exactly one platform hall. A column someone could set on a tenant would be one more way to hand a project an unreleased version.
43
+
44
+ ## Arming (owner steps, in this order)
45
+
46
+ 1. **Platform hall follows candidates.** On the control plane, set the platform's entry in `config/update-subscriptions.json` to `"follow": "candidates"` (ADR 0360). Otherwise, once D1 is on, cloudbongos.com stops updating itself.
47
+ 2. **npm:** on npmjs.com → `@bongos/core` → Settings → Trusted publishing, tick **Allow npm dist-tag** on the `publish.yml` entry.
48
+ 3. **GitHub App:** give the server's GitHub App **Actions: Read and write** on this repository, and accept the permission change on the installation.
49
+ 4. **Switch on:** set the repository Actions variable `PUBLISH_AS_CANDIDATE=1`.
50
+
51
+ Until step 4, every version this hall runs is already `latest`, so the Release section reads "Nothing is waiting" and nothing else changes. A press made before steps 2–3 fails with the reason (no dist-tag permission, or the App lacks Actions: write) and moves nothing.
52
+
53
+ ## Consequences
54
+
55
+ - Other projects stop receiving merges the moment step 4 is done. They receive the next version the owner releases, and everything merged before it.
56
+ - The deploy page's "Running here, not released" stage fills between merges and a Release, and empties after one.
57
+ - A version can be released only after this hall has run it, because the candidate list stops at the live version. The evidence is real, not inferred.
58
+ - **Rejected:** a long-lived npm token in a separate release workflow (the risk task 1003202 removed). Choosing "released" by a git tag or a file in the repo (every instance already reads npm, and a second source of truth would drift). A per-instance follow column (D5).
59
+ - **Proof:** `tests/release_core.mjs` (the rule and the workflow wiring), `tests/npm_release_release.mjs` (evidence, the press, the GitHub call, the route gate), `tests/core_update_banner.mjs` (only released versions offered), `tests/core_upgrade_runner.mjs` (the platform hall takes a candidate; a tenant is refused one), `tests/update_channel.mjs` (`followForShape`).
@@ -479,3 +479,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
479
479
  | 0358 | [**A hall wears a look, and its night takes a tint of it** ([task 1004421](https://cloudbongos.com/builders#/task/1004421), goal 1000121 — BV2.PS06; owner D2 + D8, 2026-09-30). Amends [ADR 0219](0219-a-look-is-a-branding-pack-the-style-library.md) (a look could not carry a dark ground) and DESIGN.md's pure-black rule, for halls only. **D1:** the night tint is a formula over the thirteen — the four dark grounds take 5–6% of the look's accent (src/night-tint.js), emitted after the sheet as both dark twins; no token added. **D2:** on by default, and only a chosen look turns it on — a hall with no look is unchanged. **D3:** the apex and hub stay pure black (ADR 0204). **D4:** a custom look is ONE accent for both modes, its lightness nudged until every pair the hall paints with it reads (lookAdjustAccent, client copy test-pinned). **D5:** look + night_tint join the provisioning settings vocabulary; the accent and logo address ride as companion env; the instance resolves the look from the style library. **D6:** a logo is PNG/JPEG/WebP ≤256 KB, magic-sniffed, never SVG, served content-addressed; it is the hall mark and the favicon. Rejected: per-look dark palettes, two custom accents, refusing an unreadable accent, sending the palette over env.](0358-a-hall-wears-a-look-and-its-night-takes-a-tint.md) | hall / branding / design world |
480
480
  | 0359 | [**Nobody sets a module's score by hand; a Metic+ person can ask for a re-check** ([task 1003796](https://cloudbongos.com/builders#/task/1003796) · goal 1000091, criterion `wa5-quality-assessed`). Amends [ADR 0343](0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md) D6 and [ADR 0347](0347-every-store-module-ships-a-how-to.md) D5 on the owner's ruling: there is no score override. A score only ever comes from its signals. Instead `POST /store/modules/:key/versions/:version/reassess { reason }`, gated by the new `module.assessment.rerun` atom (metic floor, granted to metic + archon by `government_021`), queues the same assessment a publish runs. A reason is required and nothing else is accepted. The delist (task 1003797) is unchanged.](0359-nobody-sets-a-module-score-by-hand-metic-can-ask-for-a-re-check.md) | module store / assessment / permissions |
481
481
  | 0360 | [**Bongos follows every candidate; every other project follows releases** ([task 1004297](https://cloudbongos.com/builders#/task/1004297), goal 1000090 — the owner's 2026-09-26 decision that the Bongos hall takes every candidate automatically). Amends ADR 0136. **D1:** a per-instance `follow` beside the channel — `released` (default: at or below the registry's `latest` label) or `candidates` (every version, the platform hall only). **D2:** released is the `latest` dist-tag, read separately; an unreadable label skips the instance, never a guess. **D3:** the timer period is the lag — 15 min declared, installed by task 1003969. **D4:** a version that failed here is held for a day per instance (recorded in the sweep's config home), while any newer version is taken at once — no restart loop at a 15-minute cadence. **D5:** the deploy page's "Upgrades on this hall" — the core_upgrades ledger, rollbacks flagged, and a published version waiting past 30 min said to be the automation stopping. Rejected: a second runner, CI pushing to the box, a hold only a human clears.](0360-bongos-follows-every-candidate-every-other-project-follows-releases.md) | update channel / deploy / core update |
482
+ | 0361 | [**Merges publish as candidates; Release on /deploy decides what other projects are offered** ([task 1004298](https://cloudbongos.com/builders#/task/1004298), goal 1000090). Amends ADR 0161. **D1:** merges publish under `next` when `PUBLISH_AS_CANDIDATE=1` (ships inert). **D2:** a `release` job in publish.yml moves `latest` (release-core.js: published, stable, newer than the release) over the same OIDC trusted publisher — no npm token. **D3:** /deploy's Release button (`core.pin.move`) dispatches it through the one-function `lifecycle.workflowDispatch` port. **D4:** evidence beside each button — hours on this hall, ever rolled back. **D5:** the banner and the hosted-project runner offer only released versions; the control-plane row follows candidates. Arming: roster follow → npm dist-tag permission → App Actions: write → the variable.](0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md) | publish / release / update channel |
@@ -14113,6 +14113,51 @@
14113
14113
  ]
14114
14114
  }
14115
14115
  },
14116
+ "/npm-release/release": {
14117
+ "post": {
14118
+ "operationId": "post_npm_release_release",
14119
+ "tags": [
14120
+ "npm-release"
14121
+ ],
14122
+ "summary": "POST /npm-release/release",
14123
+ "description": "**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `core.pin.move` (all required).",
14124
+ "x-rank": "archon",
14125
+ "x-source": "modules/npm-release/routes/release.js",
14126
+ "x-permissions": [
14127
+ "core.pin.move"
14128
+ ],
14129
+ "requestBody": {
14130
+ "required": true,
14131
+ "content": {
14132
+ "application/json": {
14133
+ "schema": {
14134
+ "$ref": "#/components/schemas/PostNpmReleaseReleaseRequest"
14135
+ }
14136
+ }
14137
+ },
14138
+ "x-validated": true
14139
+ },
14140
+ "responses": {
14141
+ "200": {
14142
+ "description": "Success."
14143
+ },
14144
+ "400": {
14145
+ "$ref": "#/components/responses/ValidationFailed"
14146
+ },
14147
+ "401": {
14148
+ "$ref": "#/components/responses/Unauthorized"
14149
+ },
14150
+ "403": {
14151
+ "$ref": "#/components/responses/Forbidden"
14152
+ }
14153
+ },
14154
+ "security": [
14155
+ {
14156
+ "builderSession": []
14157
+ }
14158
+ ]
14159
+ }
14160
+ },
14116
14161
  "/npm-release/task/{id}": {
14117
14162
  "get": {
14118
14163
  "operationId": "get_npm_release_task_id",
@@ -28893,6 +28938,19 @@
28893
28938
  ],
28894
28939
  "additionalProperties": false
28895
28940
  },
28941
+ "PostNpmReleaseReleaseRequest": {
28942
+ "type": "object",
28943
+ "properties": {
28944
+ "version": {
28945
+ "type": "string",
28946
+ "maxLength": 32
28947
+ }
28948
+ },
28949
+ "required": [
28950
+ "version"
28951
+ ],
28952
+ "additionalProperties": false
28953
+ },
28896
28954
  "PostOverrideRequestsIdDecideRequest": {
28897
28955
  "type": "object",
28898
28956
  "properties": {
@@ -31293,8 +31351,8 @@
31293
31351
  "description": "A required dependency/feature is not configured or is temporarily down."
31294
31352
  }
31295
31353
  },
31296
- "x-endpoint-count": 489,
31297
- "x-schema-count": 519,
31354
+ "x-endpoint-count": 490,
31355
+ "x-schema-count": 520,
31298
31356
  "x-undocumented-bodies": 12,
31299
31357
  "x-response-schemas": 347,
31300
31358
  "x-generated-by": "scripts/gds/gen-api-docs.js"
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Bongos API reference
4
4
 
5
- > **Generated from the live route files** — the route file is authoritative. 489 endpoints across 90 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 490 endpoints across 91 route files.
6
6
  > Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
7
7
 
8
8
  Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -545,7 +545,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
545
545
  | POST | `/api/bongos/my-projects/invites/:clientId/decline` | `any-builder` | — | decline an invite (delete the pending row) for the caller's OWN account. |
546
546
  | POST | `/api/bongos/my-projects/join` | `any-builder` | `origin`, `note` | request to join a project. |
547
547
 
548
- ## `npm-release` (7)
548
+ ## `npm-release` (8)
549
549
 
550
550
  | Method | Path | Rank | Body | Description |
551
551
  |---|---|---|---|---|
@@ -554,6 +554,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
554
554
  | DELETE | `/api/bongos/npm-release/preview` | `any-builder` | — | |
555
555
  | GET | `/api/bongos/npm-release/preview/enter` | `any-builder` | — | |
556
556
  | GET | `/api/bongos/npm-release/preview/exit` | `any-builder` | — | |
557
+ | POST | `/api/bongos/npm-release/release` | `archon` | `version` | |
557
558
  | GET | `/api/bongos/npm-release/task/:id` | `any-builder` | — | |
558
559
  | GET | `/api/bongos/npm-release/work` | `archon` | — | Query: days (ledger window, default 14, max 60), before + limit (history paging). |
559
560
 
@@ -2813,5 +2813,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
2813
2813
  landed since 1.20.76 with no explicit bump. run 36909904812. (task 1002620)
2814
2814
  1.20.78 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2815
2815
  landed since 1.20.77 with no explicit bump. run 36923602676. (task 1002620)
2816
+ 1.20.79 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2817
+ landed since 1.20.78 with no explicit bump. run 36924822923. (task 1002620)
2818
+ 1.20.80 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2819
+ landed since 1.20.79 with no explicit bump. run 36927627121. (task 1002620)
2816
2820
  ---------------------------------------------------------------------------
2817
2821
  ```
@@ -57,6 +57,8 @@ npm publish ./clients/bongos-client # real (publishConfig makes it
57
57
 
58
58
  **Publishing is automatic on merge** as of 2026-08-08: the `publish` workflow rides behind the required `unit` check and waits for the `integration` lane's verdict on the commit it releases (task 1004290), auto-bumps a patch when nobody bumped, builds through the fail-closed no-leak gate, publishes, and tags — see the workflow header (`.github/workflows/publish.yml`) and ADR 0161. It ships inert until the owner arms it: repo variable `PUBLISH_ON_MERGE=1`, a **trusted publisher** registered on npmjs.com for `@bongos/core` naming this repo + `publish.yml`, and the secret `RELEASE_PUSH_TOKEN` (contents:write, for the bump commit). There is deliberately **no** `NPM_TOKEN` — the lane authenticates by OIDC, and the workflow sets neither `NPM_TOKEN` nor `NODE_AUTH_TOKEN` because either one would send npm down the legacy token path and skip the OIDC exchange entirely. A **minor/major bump stays a human in-task edit**. The update subscription ([ADR 0136](../adr/0136-update-channel-subscription-policy.md)) consumes whatever is published, on its next sweep.
59
59
 
60
+ **Candidates and Release** ([ADR 0361](../adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md), task 1004298). With the repo variable `PUBLISH_AS_CANDIDATE=1`, each merge publishes under the `next` label: the platform hall runs it, and no other project is offered it. **Release** on /deploy runs `publish.yml`'s `release` job (`workflow_dispatch`, input `release_version`), which moves `latest` to that version over the same OIDC trusted publisher. It needs **Allow npm dist-tag** ticked on the `publish.yml` trusted-publisher entry, and the server's GitHub App needs **Actions: write** to start the job. From a terminal the same job runs as `gh workflow run publish.yml -f release_version=<x.y.z>`. The arming order is in the ADR.
61
+
60
62
  The steps below remain as the **manual fallback** (lane disarmed, npm outage, or a deliberate out-of-band release):
61
63
 
62
64
  1. **Bump `CORE_VERSION`** in [`src/module-api.js`](../../src/module-api.js) (semver; a **patch** for a fix, **minor** for additive surface — a **major** is a deliberate, human-only event) and append an entry to the release ledger [`docs/module-api-changelog.md`](../module-api-changelog.md) in the same commit ([ADR 0203](../adr/0203-doorway-changelog-out-of-module-api.md) moved that ledger out of `module-api.js`). This bump is a normal claimed task, not a release-tool side effect — the version's provenance stays in the git history + ledger.