@bongos/core 1.21.21 → 1.21.22

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.
package/.bongos-core.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.21.21",
6
- "core_contract": "1.21.21",
7
- "source_commit": "088255d528bc15019f3b97bed4f7fd8c9c80381c",
5
+ "core_version": "1.21.22",
6
+ "core_contract": "1.21.22",
7
+ "source_commit": "2a68dd5cb2764b3c551ad24493634477b247f32f",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-02T21:39:51.692Z",
9
+ "built_at": "2026-10-02T22:27:46.033Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 580,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 3506,
20
- "tree_sha256": "ca41de04801a1525a0277b802b9333104f8869cabad1645575f242ea5407caf5",
20
+ "tree_sha256": "a83f91642c863272631c45c06c69ef23e87fcb7055ad828f1f97c01ebd14274a",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2267,7 +2267,7 @@
2267
2267
  {
2268
2268
  "path": "docs/adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md",
2269
2269
  "mode": "0000644",
2270
- "sha256": "65a0dc5fd120b37b6c59a6e1b19c34d951a5cb277853ffb1664cd5506f490ff6"
2270
+ "sha256": "2e260e1e429e59156800f0abe9958a14e96c8cd027b7266a0e81ed79f7794cfa"
2271
2271
  },
2272
2272
  {
2273
2273
  "path": "docs/adr/0362-the-governor-docket-is-collected-from-contributed-sources.md",
@@ -2832,7 +2832,7 @@
2832
2832
  {
2833
2833
  "path": "docs/module-api-changelog.md",
2834
2834
  "mode": "0000644",
2835
- "sha256": "c1ff4f9c102a10de1b72fadff53df9ecb4f69db353058af6d82d2a41cfc05bcb"
2835
+ "sha256": "d54ceb69ddfd770cf8158a72c8a2772cb2bc0031e0412f4dd253d3ac04d38eaa"
2836
2836
  },
2837
2837
  {
2838
2838
  "path": "docs/modules-contract.md",
@@ -9787,12 +9787,12 @@
9787
9787
  {
9788
9788
  "path": "package-lock.json",
9789
9789
  "mode": "0000644",
9790
- "sha256": "412dc3a888e904e384aaf313170d1481e3eff74731ec56a8bd1b04e6f2590442"
9790
+ "sha256": "154fe2dcd1ad8a4dec91ca642e11b8c909320b8bb651105eb0ce687ba7a3f0f5"
9791
9791
  },
9792
9792
  {
9793
9793
  "path": "package.json",
9794
9794
  "mode": "0000644",
9795
- "sha256": "e78240e17e2fa848a9eafb6bf579ef4ae8d2d9e55849c415e913caf37c4e5bbc"
9795
+ "sha256": "c426e05132b8fb4f04e5136e175a2b368551200c561633e8d86e8d12a34f5653"
9796
9796
  },
9797
9797
  {
9798
9798
  "path": "public-docs/index.html",
@@ -9812,7 +9812,7 @@
9812
9812
  {
9813
9813
  "path": "release-notes.json",
9814
9814
  "mode": "0000644",
9815
- "sha256": "af98468e105af7980f0537e07b165f46f5159ba90500f4ff9bac9c9c3c2e7315"
9815
+ "sha256": "be314ea66baa33af4fc01f325fc0e70e4b9b4b947a70291b4174be59486591de"
9816
9816
  },
9817
9817
  {
9818
9818
  "path": "scripts/bongos-mcp.js",
@@ -10857,7 +10857,7 @@
10857
10857
  {
10858
10858
  "path": "scripts/gds/provision-repo.js",
10859
10859
  "mode": "0000644",
10860
- "sha256": "2ce88d5c4597d79b7efcc8023f74a1925f294a171284ee9b00d7c32a0ac9d1d8"
10860
+ "sha256": "ca7e46a175308c7789a530284c73ccf58b8c09eac873e07b516206e234be99ab"
10861
10861
  },
10862
10862
  {
10863
10863
  "path": "scripts/gds/provision-teardown.js",
@@ -12037,7 +12037,7 @@
12037
12037
  {
12038
12038
  "path": "src/module-api.js",
12039
12039
  "mode": "0000644",
12040
- "sha256": "5d62285199c27e8be924d39c61bba97235e3da8465cbe4a37e76bd83bb3045b7"
12040
+ "sha256": "75593eff057e1eacf641e8a33686e084bfe4f50308e33818bcd027e568760523"
12041
12041
  },
12042
12042
  {
12043
12043
  "path": "src/module-loader/catalog.js",
@@ -15892,7 +15892,7 @@
15892
15892
  {
15893
15893
  "path": "tests/provision.mjs",
15894
15894
  "mode": "0000644",
15895
- "sha256": "56664f258f297c98b883b2d02c5ad669796b817946d660826c9301598e6e2c09"
15895
+ "sha256": "4c9a2fb72e70f57aa9a83a9e9b526ff7004a1c15dd87628ba5436e53947001e5"
15896
15896
  },
15897
15897
  {
15898
15898
  "path": "tests/provision_account_identity.mjs",
@@ -41,6 +41,7 @@ The deploy page's **Release** section lists the versions this hall runs that are
41
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
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
43
  - **A new project is born on the release** ([task 1004299](https://cloudbongos.com/builders#/task/1004299)). The wizard vendors the core this hall runs (ADR 0292), which is a candidate once D1 is on. `projectCoreDecision` (`scripts/gds/provision-repo.js`) gives the project the `latest` version instead whenever the hall runs ahead of it, packed from the registry; the core-pin refresh that runs in the same provisioning pass uses the same target, so it cannot bump the new pin straight back. Level, or no readable label, keeps the byte-exact running core.
44
+ - **Behind the release, too** ([task 1004556](https://cloudbongos.com/builders#/task/1004556), 2026-10-02). The runner that scaffolds is not always the platform hall: on cloudbongos.com it ran from a patch-channel install stuck on 1.20.82, which cannot cross the 1.21.0 minor, so new projects were born without founding mode. A runner *behind* `latest` now also gives the project the release. A released core has already run on the platform hall, so this never hands out an untried version.
44
45
 
45
46
  ## Arming (owner steps, in this order)
46
47
 
@@ -2869,5 +2869,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2869
2869
  landed since 1.21.19 with no explicit bump. run 37066131214. (task 1002620)
2870
2870
  1.21.21 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2871
2871
  landed since 1.21.20 with no explicit bump. run 37068094560. (task 1002620)
2872
+ 1.21.22 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2873
+ landed since 1.21.21 with no explicit bump. run 37072549675. (task 1002620)
2872
2874
  ---------------------------------------------------------------------------
2873
2875
  ```
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.21",
3
+ "version": "1.21.22",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.21.21",
9
+ "version": "1.21.22",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.21",
3
+ "version": "1.21.22",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
@@ -8882,5 +8882,11 @@
8882
8882
  "id": "1004544",
8883
8883
  "text": "The governor city and the street now open inside the normal hall, with the sidebar and top bar around them like every other page. A full-screen button in the corner hides both so the city or the street fills the window again,"
8884
8884
  }
8885
+ ],
8886
+ "1.21.22": [
8887
+ {
8888
+ "id": "1004556",
8889
+ "text": "New projects are now always started on the latest released version of Cloud Bongos, even when the service that sets them up is running an older one. Until now, a lagging setup service passed its own old version to every new pr"
8890
+ }
8885
8891
  ]
8886
8892
  }
@@ -515,8 +515,14 @@ function runningCoreVersion({ instanceRoot, coreV }) {
515
515
  // publish as candidates, the platform hall runs ahead of the registry's `latest` label by
516
516
  // design — and the ladder below vends whatever the hall runs, so every new project would
517
517
  // be born on a version nobody released. When the hall is AHEAD of the release, the project
518
- // gets the release instead. Equal (or the hall behind it, which a release can't normally
519
- // produce) → the running core, byte-exact, as before.
518
+ // gets the release instead. Equal → the running core, byte-exact, as before.
519
+ //
520
+ // BEHIND the release is real too (task 1004556): the runner that scaffolds is not always
521
+ // the platform hall. On cloudbongos.com it ran from a patch-channel install that could not
522
+ // cross the 1.21.0 minor, so it sat on 1.20.82 and every new project was born there,
523
+ // without founding mode (1.21+). The release is what ADR 0361 D5 promises a new project,
524
+ // and a released core has already run on the platform hall, so the runner's lag must not
525
+ // set the project's version: behind → the release, packed from the registry, too.
520
526
  //
521
527
  // No readable label → the running core, deliberately (fail-open). Until candidates are
522
528
  // armed the running core IS the release; vendoring is the path that works with no
@@ -525,6 +531,7 @@ function runningCoreVersion({ instanceRoot, coreV }) {
525
531
  function projectCoreDecision({ running, released }) {
526
532
  if (!released || !isStable(released)) return { version: running, source: 'running', reason: 'no readable released (latest) label — using the core this hall runs' };
527
533
  if (compareSemver(running, released) > 0) return { version: released, source: 'released', reason: `this hall runs ${running}, ahead of the release` };
534
+ if (compareSemver(running, released) < 0) return { version: released, source: 'released', reason: `this runner is on ${running}, behind the release` };
528
535
  return { version: running, source: 'running', reason: `this hall runs the released core ${released}` };
529
536
  }
530
537
 
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.21.21'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.21.22'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -1078,12 +1078,17 @@ await ta('scaffoldStandaloneRepo: a REGISTRY-pinned consumer control plane PACKS
1078
1078
  // ADR 0361: merges publish as candidates and the platform hall runs them, so the core
1079
1079
  // this hall runs is routinely AHEAD of the registry's `latest` label. A new project —
1080
1080
  // and the pin refresh that runs in the same provisioning pass — must get the release.
1081
- t('projectCoreDecision: the hall ahead of the release → the release; level or unreadable → the running core', () => {
1081
+ t('projectCoreDecision: the hall ahead of OR behind the release → the release; level or unreadable → the running core', () => {
1082
1082
  assert.deepEqual(
1083
1083
  (({ version, source }) => ({ version, source }))(RP.projectCoreDecision({ running: '1.19.60', released: '1.19.50' })),
1084
1084
  { version: '1.19.50', source: 'released' });
1085
1085
  assert.equal(RP.projectCoreDecision({ running: '1.19.50', released: '1.19.50' }).source, 'running', 'level → byte-exact running core, no registry pack');
1086
- assert.equal(RP.projectCoreDecision({ running: '1.19.40', released: '1.19.50' }).version, '1.19.40', 'never moves a project PAST what the hall has run');
1086
+ // task 1004556: a runner BEHIND the release (a patch-channel install stuck on 1.20.82
1087
+ // while 1.21.x was released) must not hand its stale core to a new project
1088
+ assert.deepEqual(
1089
+ (({ version, source }) => ({ version, source }))(RP.projectCoreDecision({ running: '1.20.82', released: '1.21.20' })),
1090
+ { version: '1.21.20', source: 'released' }, 'behind the release → the release, across a minor too');
1091
+ assert.equal(RP.projectCoreDecision({ running: '1.19.40', released: '1.19.50' }).source, 'released', 'and within a minor');
1087
1092
  assert.equal(RP.projectCoreDecision({ running: '1.19.60', released: null }).version, '1.19.60', 'no label → fail-open to the running core');
1088
1093
  assert.equal(RP.projectCoreDecision({ running: '1.19.60', released: '1.19.50-rc.1' }).source, 'running', 'a prerelease label is not a release');
1089
1094
  assert.equal(RP.projectCoreDecision({ running: '1.19.60', released: '1.19.50;touch /tmp/x' }).source, 'running', 'a non-semver label never reaches a shell');