@bongos/core 1.19.307 → 1.19.309

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,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.307",
6
- "core_contract": "1.19.307",
7
- "source_commit": "b8d2ed227fd6cb0b948128e23f0daf0070b50bcc",
5
+ "core_version": "1.19.309",
6
+ "core_contract": "1.19.309",
7
+ "source_commit": "725e32b7a94f36cdc81dd834470b1b66f526097a",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-23T20:16:34.186Z",
9
+ "built_at": "2026-08-23T20:35:56.294Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 322,
13
13
  "agent_docs_stubbed": 22,
14
- "functional_verbatim": 1418,
14
+ "functional_verbatim": 1420,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1762,
20
- "tree_sha256": "2ce3db5cb1a893df39826469894f19d4acdee021e5729859eaa8d429933be04d",
19
+ "file_count": 1764,
20
+ "tree_sha256": "3cc77df63f396bc4dd00a837f27e9ec425e865292ef87c68631cd21424c2b3a4",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -1417,12 +1417,12 @@
1417
1417
  {
1418
1418
  "path": "docs/api-reference.md",
1419
1419
  "mode": "0000644",
1420
- "sha256": "d545aada2bc0127be904c5df12c393c3ab8756f84ef86cc7bcee1348074769f9"
1420
+ "sha256": "a654d9def4780d3210c66031193198f58fd0d7d84f5088c4ce7e6d0a58682193"
1421
1421
  },
1422
1422
  {
1423
1423
  "path": "docs/api/openapi.json",
1424
1424
  "mode": "0000644",
1425
- "sha256": "828558b3bd6cc8d7c9c720eef962e098e4f886ab33360833b2c6d3946acbd1d1"
1425
+ "sha256": "e0b531f19187a3c00a54917bff4e2827a75b250f1aaa761229660a974a4f6217"
1426
1426
  },
1427
1427
  {
1428
1428
  "path": "docs/architecture.md",
@@ -1667,7 +1667,7 @@
1667
1667
  {
1668
1668
  "path": "docs/recipes/core-release-pipeline.md",
1669
1669
  "mode": "0000644",
1670
- "sha256": "100a1bd6bde327c60f37727ce85f75cf5539b007473359692de7ab87876c936b"
1670
+ "sha256": "b42d8b4620355bef0e27480b2ddfaa07140e322de988839f0e102f1a1545ac47"
1671
1671
  },
1672
1672
  {
1673
1673
  "path": "docs/recipes/devbox-app-release.md",
@@ -3777,7 +3777,7 @@
3777
3777
  {
3778
3778
  "path": "modules/ideas/routes/blockers.js",
3779
3779
  "mode": "0000644",
3780
- "sha256": "7c61821b9ddf9a9255f6a9916659140881a6436dbd50f3d53b4cf818640a39a4"
3780
+ "sha256": "2247bb4499e6296fca8ccde3614b6726a50435786fc3cf634eaacd35982ef3f4"
3781
3781
  },
3782
3782
  {
3783
3783
  "path": "modules/ideas/routes/inbox.js",
@@ -3927,7 +3927,7 @@
3927
3927
  {
3928
3928
  "path": "modules/lifecycle/routes/done-when.js",
3929
3929
  "mode": "0000644",
3930
- "sha256": "7fb4a74237c1f84a5c20591663e634a7b190861e6a3f1c5804e22145ef58f6be"
3930
+ "sha256": "73dee3ef1546bf873a27bac8a160c8de64a6dbb5d0da6f3b68648d3a90e07d21"
3931
3931
  },
3932
3932
  {
3933
3933
  "path": "modules/lifecycle/routes/gate-approvals.js",
@@ -4577,12 +4577,12 @@
4577
4577
  {
4578
4578
  "path": "package-lock.json",
4579
4579
  "mode": "0000644",
4580
- "sha256": "4815e8ce78e80ac2fff7dad9f77bef508e2f0090459c67e59722b65af3e27294"
4580
+ "sha256": "773974cb943d497f52079b0a6c08f0847b26c1838ebbe19bc17c1d8dd645c014"
4581
4581
  },
4582
4582
  {
4583
4583
  "path": "package.json",
4584
4584
  "mode": "0000644",
4585
- "sha256": "bdeee91142d9d7f3930c99134be76d03f28329222adcf293deaa8f8354ab2cd8"
4585
+ "sha256": "55f105febecf217cd1bab4e0b599fea8440a9f4b7cde870d64d379777130e79e"
4586
4586
  },
4587
4587
  {
4588
4588
  "path": "public-docs/index.html",
@@ -5067,7 +5067,7 @@
5067
5067
  {
5068
5068
  "path": "scripts/gds/claude-materialize.js",
5069
5069
  "mode": "0000644",
5070
- "sha256": "e2d6f177e1ee5eda21b5d8711145b7de79b41a9f8dc1a1b9e2836dde2f1c0143"
5070
+ "sha256": "a044b7ea705a87e569f903eb4fb19c941a1fbfd11b069563a2bc767be339d184"
5071
5071
  },
5072
5072
  {
5073
5073
  "path": "scripts/gds/claude-md-template.js",
@@ -5309,6 +5309,11 @@
5309
5309
  "mode": "0000644",
5310
5310
  "sha256": "75130de4a880fc7d76f5a8d79ed65750238df94847c1ccfdc974188f9300a1e6"
5311
5311
  },
5312
+ {
5313
+ "path": "scripts/gds/go-live.js",
5314
+ "mode": "0000644",
5315
+ "sha256": "05734e21763cc0b0614275efa76b7b68afabee8be93f3f2d797400d6a97e86c1"
5316
+ },
5312
5317
  {
5313
5318
  "path": "scripts/gds/goal.js",
5314
5319
  "mode": "0000644",
@@ -6157,7 +6162,7 @@
6157
6162
  {
6158
6163
  "path": "src/bongos/routes/healthz.js",
6159
6164
  "mode": "0000644",
6160
- "sha256": "da50a75349d36f7fee03c00b5f89697cf97fba91d4778fe304257d29470fedb5"
6165
+ "sha256": "26f4992c484d2fc5882131c695c4173db950e4c815424fad68385bfa64fa7ab8"
6161
6166
  },
6162
6167
  {
6163
6168
  "path": "src/bongos/routes/instance.js",
@@ -6192,7 +6197,7 @@
6192
6197
  {
6193
6198
  "path": "src/bongos/routes/public.js",
6194
6199
  "mode": "0000644",
6195
- "sha256": "fbfc3422f111e6d3f1429cefec78741d4a919c89985bc9d69f0a7a8e070c52b5"
6200
+ "sha256": "295b4bafc8a7bf832ed33fb0d35f4487a788caaff994383cda451cc24de2c6c7"
6196
6201
  },
6197
6202
  {
6198
6203
  "path": "src/bongos/routes/security.js",
@@ -6247,7 +6252,7 @@
6247
6252
  {
6248
6253
  "path": "src/module-api.js",
6249
6254
  "mode": "0000644",
6250
- "sha256": "90436d6db6e32424c48549f61ad48a3a77f5c7cac1ae16d5559b7db76fee7b4a"
6255
+ "sha256": "568f4581ec3aaece8686d24935541d7a8783e8fbf0c9bb76b9fdf9be7150dff2"
6251
6256
  },
6252
6257
  {
6253
6258
  "path": "src/module-loader/catalog.js",
@@ -6722,7 +6727,7 @@
6722
6727
  {
6723
6728
  "path": "tests/claude_materialize.mjs",
6724
6729
  "mode": "0000644",
6725
- "sha256": "ad3daf4c6cc3a0f56d8d205077c835397b1d112a0219dabb05a7e8b3a8da9492"
6730
+ "sha256": "5ca8997f238d8395663992c9ce9ccef08ea2b09fbee6735c44f119050ef9455b"
6726
6731
  },
6727
6732
  {
6728
6733
  "path": "tests/clawback_confirmed_backlog.mjs",
@@ -7164,6 +7169,11 @@
7164
7169
  "mode": "0000644",
7165
7170
  "sha256": "d0d10628a17717fdef505dcf501915ecfcc31a0c99d9e5d4cf6dc06b47d8c883"
7166
7171
  },
7172
+ {
7173
+ "path": "tests/go_live.mjs",
7174
+ "mode": "0000644",
7175
+ "sha256": "90c8cbfd8bf0b446261f9fd837b9b08b1035210f1cbf1f7ff81998ec535c32f1"
7176
+ },
7167
7177
  {
7168
7178
  "path": "tests/goal_abuse_matrix.mjs",
7169
7179
  "mode": "0000644",
@@ -1269,7 +1269,7 @@
1269
1269
  "blockers"
1270
1270
  ],
1271
1271
  "summary": "GET /blockers",
1272
- "description": "List currently-open blockers + the tasks each is blocking. Public: anyone landing on /builders or status.amazonprimea.com can see what's stuck on Lars. rank: public — open blocker list; documented \"Public: anyone landing on /builders or status.amazonprimea.com can see what's stuck on Lars\" in the handler comment above.\n\n**Rank:** `public` — No authentication — any caller.",
1272
+ "description": "List currently-open blockers + the tasks each is blocking. Public: anyone landing on /builders or the status dashboard (status.<apex>) can see what's stuck on the owner. rank: public — open blocker list; documented \"Public: anyone landing on /builders or the status dashboard can see what's stuck on the owner\" in the handler comment above.\n\n**Rank:** `public` — No authentication — any caller.",
1273
1273
  "x-rank": "public",
1274
1274
  "x-source": "modules/ideas/routes/blockers.js",
1275
1275
  "responses": {
@@ -6167,7 +6167,7 @@
6167
6167
  "healthz"
6168
6168
  ],
6169
6169
  "summary": "GET /healthz",
6170
- "description": "liveness probe; status.amazonprimea.com hits this anonymously.\n\n**Rank:** `public` — No authentication — any caller.",
6170
+ "description": "liveness probe; the status dashboard (status.<apex>) hits this anonymously.\n\n**Rank:** `public` — No authentication — any caller.",
6171
6171
  "x-rank": "public",
6172
6172
  "x-source": "src/bongos/routes/healthz.js",
6173
6173
  "responses": {
@@ -10623,7 +10623,7 @@
10623
10623
  "public"
10624
10624
  ],
10625
10625
  "summary": "GET /public/tasks/:id",
10626
- "description": "Single-task resolver for \"#NNN\" deep links. Our docs reference GDS task IDs as bare \"#NNN\"; read on github.com those collide with GitHub's own PR/issue autolinker (a separate number space) and mis-link, so they are rewritten to status-dashboard permalinks (status.amazonprimea.com/#/task/N) that resolve here. Privacy gate: a full title/summary is exposed ONLY for already-public work (status shipped|confirmed — same surface as /public/recent-shipped). In-flight tasks return status + version with the title WITHHELD, so unshipped or security-sensitive task names never leak to the open web. `kind`/`priority` are non-sensitive and always returned. rank: public — single-task resolver for doc deep links (title gated to shipped/confirmed).\n\n**Rank:** `public` — No authentication — any caller.",
10626
+ "description": "Single-task resolver for \"#NNN\" deep links. Our docs reference GDS task IDs as bare \"#NNN\"; read on github.com those collide with GitHub's own PR/issue autolinker (a separate number space) and mis-link, so they are rewritten to status-dashboard permalinks (status.<apex>/#/task/N) that resolve here. Privacy gate: a full title/summary is exposed ONLY for already-public work (status shipped|confirmed — same surface as /public/recent-shipped). In-flight tasks return status + version with the title WITHHELD, so unshipped or security-sensitive task names never leak to the open web. `kind`/`priority` are non-sensitive and always returned. rank: public — single-task resolver for doc deep links (title gated to shipped/confirmed).\n\n**Rank:** `public` — No authentication — any caller.",
10627
10627
  "x-rank": "public",
10628
10628
  "x-source": "src/bongos/routes/public.js",
10629
10629
  "parameters": [
@@ -10693,7 +10693,7 @@
10693
10693
  "public"
10694
10694
  ],
10695
10695
  "summary": "GET /public/versions",
10696
- "description": "read-only surface for status.amazonprimea.com.\n\n**Rank:** `public` — No authentication — any caller.",
10696
+ "description": "read-only surface for the status dashboard (status.<apex>).\n\n**Rank:** `public` — No authentication — any caller.",
10697
10697
  "x-rank": "public",
10698
10698
  "x-source": "src/bongos/routes/public.js",
10699
10699
  "responses": {
@@ -13471,7 +13471,7 @@
13471
13471
  "versions"
13472
13472
  ],
13473
13473
  "summary": "GET /versions/:id/done-when",
13474
- "description": "Public: status.amazonprimea.com fetches this every 60s alongside other public/* surfaces. No auth, same Cache-Control posture as the other status feeds. rank: public — status.amazonprimea.com fetches every 60s anonymously.\n\n**Rank:** `public` — No authentication — any caller.",
13474
+ "description": "Public: the status dashboard (status.<apex>) fetches this every 60s alongside other public/* surfaces. No auth, same Cache-Control posture as the other status feeds. rank: public — the status dashboard (status.<apex>) fetches every 60s anonymously.\n\n**Rank:** `public` — No authentication — any caller.",
13475
13475
  "x-rank": "public",
13476
13476
  "x-source": "modules/lifecycle/routes/done-when.js",
13477
13477
  "parameters": [
@@ -256,7 +256,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
256
256
 
257
257
  | Method | Path | Rank | Body | Description |
258
258
  |---|---|---|---|---|
259
- | GET | `/api/bongos/healthz` | `public` | — | liveness probe; status.example.com hits this anonymously. |
259
+ | GET | `/api/bongos/healthz` | `public` | — | liveness probe; the status dashboard (status.<apex>) hits this anonymously. |
260
260
 
261
261
  ## `inbox` (14)
262
262
 
@@ -439,7 +439,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
439
439
  | GET | `/api/bongos/public/repo-info` | `public` | — | GitHub URL bases for the deployed checkout (V3.R13-followup-2 task 411). |
440
440
  | GET | `/api/bongos/public/tasks/:id` | `public` | — | Single-task resolver for "#NNN" deep links. |
441
441
  | GET | `/api/bongos/public/uptime` | `public` | — | Uptime: current status + 90-day history bucketed by hour. |
442
- | GET | `/api/bongos/public/versions` | `public` | — | read-only surface for status.example.com. |
442
+ | GET | `/api/bongos/public/versions` | `public` | — | read-only surface for the status dashboard (status.<apex>). |
443
443
 
444
444
  ## `scouting` (1)
445
445
 
@@ -536,7 +536,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
536
536
  |---|---|---|---|---|
537
537
  | GET | `/api/bongos/versions` | `public` | — | read-only version list; mirrors /public/versions. |
538
538
  | POST | `/api/bongos/versions` | `metic+archon` | `id`, `name`, `status`, `track`, `done_when`, `scope_doc_path`, `criteria` | POST /versions — create a version + its done-when criteria in one call. |
539
- | GET | `/api/bongos/versions/:id/done-when` | `public` | — | Public: status.example.com fetches this every 60s alongside other public/* surfaces. |
539
+ | GET | `/api/bongos/versions/:id/done-when` | `public` | — | Public: the status dashboard (status.<apex>) fetches this every 60s alongside other public/* surfaces. |
540
540
  | POST | `/api/bongos/versions/:id/done-when` | `metic+archon` | `criterion_id`, `criterion_md`, `goal_id`, `sort_order` | Auth (Metic+, then the goal's own authority): create a done-when criterion at RUNTIME. |
541
541
  | GET | `/api/bongos/versions/:id/progress` | `public` | — | Per-criterion progress rollup: each done-when criterion → the tasks that gate it (task_criteria, migration 055) → live statuses → what re… |
542
542
  | GET | `/api/bongos/versions/close-suggestions` | `public` | — | Close-flow gate suggestions for every version still 'building'. |
@@ -136,6 +136,38 @@ The generic mechanics are [upgrading-the-core](upgrading-the-core.md); this is t
136
136
 
137
137
  **Cadence: bump once, at session end.** One upgrade covers every release the session landed (publish-on-merge cuts one per merge — you don't chase each). Don't bump per-ship.
138
138
 
139
+ ### Step 0 — try the one command first (task 1003189)
140
+
141
+ The whole sequence below is deterministic, so it is also a script. `go-live.js` composes the
142
+ same parts this runbook narrates — `deploy-divergence.js` for the gap, the registry for proof a
143
+ release exists, and `bongos upgrade --registry --commit-pin` for the bump itself — and reports
144
+ once instead of forty times:
145
+
146
+ ```bash
147
+ node scripts/gds/go-live.js
148
+ ```
149
+
150
+ That is **plan-only and read-only**: it prints live-vs-target, checks the registry actually
151
+ carries the target, and names every halt condition it found. Add `--apply` to move the pin.
152
+
153
+ It **halts rather than guessing** on exactly the things that need judgement — unreleased commits
154
+ on `main`, a registry missing the target, a dirty tree on either end, a failed health check, an
155
+ uncommitted pin. When it halts, fall through to the manual steps below and use your own head;
156
+ that is what the rest of this section is for.
157
+
158
+ Two flags worth knowing:
159
+
160
+ - `--verify-marker <path>=<needle>` refuses a target that does not actually contain your change.
161
+ This is the guard for the trap in Step 1: the carrier sitting on `main` when your fix merged
162
+ was usually cut *before* it, so deploying "the version main was on" is a textbook-clean go-live
163
+ that changes nothing — and every downstream check agrees it worked.
164
+ - `--allow-unreleased` downgrades the UNRELEASED halt to a warning. Reach for it only when you
165
+ have already confirmed *why* main is ahead of its last release.
166
+
167
+ Host topology (ssh alias, box paths, service names, health URL) lives in a host-owned
168
+ `config/go-live.json`, never in the core — run `node scripts/gds/go-live.js --help` for the
169
+ schema. A core that named one instance's box would not be a core.
170
+
139
171
  ### Step 1 — pick the version (your machine, main checkout)
140
172
 
141
173
  ```bash
@@ -10,10 +10,10 @@ module.exports = function buildBlockersRouter() {
10
10
  const router = express.Router();
11
11
 
12
12
  // List currently-open blockers + the tasks each is blocking.
13
- // Public: anyone landing on /builders or status.amazonprimea.com can see
14
- // what's stuck on Lars.
13
+ // Public: anyone landing on /builders or the status dashboard (status.<apex>)
14
+ // can see what's stuck on the owner.
15
15
  // rank: public — open blocker list; documented "Public: anyone landing on /builders
16
- // or status.amazonprimea.com can see what's stuck on Lars" in the handler comment above.
16
+ // or the status dashboard can see what's stuck on the owner" in the handler comment above.
17
17
  router.get('/blockers', async (req, res) => {
18
18
  try {
19
19
  // R14 (#2001 / ADR 0119): the open-blocker list is public + grows with the
@@ -80,10 +80,10 @@ function authorizeCriterionCreate({ goal, version, actorId, actorRank, actorMemb
80
80
  module.exports = function buildDoneWhenRouter() {
81
81
  const router = express.Router();
82
82
 
83
- // Public: status.amazonprimea.com fetches this every 60s alongside other
84
- // public/* surfaces. No auth, same Cache-Control posture as the other
83
+ // Public: the status dashboard (status.<apex>) fetches this every 60s alongside
84
+ // other public/* surfaces. No auth, same Cache-Control posture as the other
85
85
  // status feeds.
86
- // rank: public — status.amazonprimea.com fetches every 60s anonymously.
86
+ // rank: public — the status dashboard (status.<apex>) fetches every 60s anonymously.
87
87
  router.get('/versions/:id/done-when', asyncHandler('GET /versions/:id/done-when', async (req, res) => {
88
88
  const versionId = String(req.params.id || '').trim();
89
89
  if (!versionId) return res.fail('version_id_required', 400);
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.307",
3
+ "version": "1.19.309",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.307",
9
+ "version": "1.19.309",
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.19.307",
3
+ "version": "1.19.309",
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",
@@ -82,6 +82,13 @@ function hostOf(origin) { try { return new URL(String(origin)).host || null; } c
82
82
  // instance-config uses, so nothing here is ever a founder literal (R76-safe).
83
83
  function effConfigDir(b) { return (b && b.configDir) || ic.FALLBACK_DIR; }
84
84
  function effEnvPrefix(b) { return (b && b.envPrefix) || ic.FALLBACK_ENV_PREFIX; }
85
+ // The brand token outbound User-Agents are built from, mirroring src/branding.js
86
+ // userAgent(): repo name, else env prefix, lowercased. Kept in sync by the
87
+ // tests/claude_materialize.mjs UA-rule case + tests/hook_user_agents.mjs.
88
+ function effUaBase(b) {
89
+ const base = (b && b.repo && b.repo.name) || (b && b.envPrefix) || '';
90
+ return String(base).toLowerCase();
91
+ }
85
92
 
86
93
  // Ordered source→target rebrand rules from two branding objects. PURE + exported.
87
94
  function buildRebrandRules(from = {}, to = {}) {
@@ -109,6 +116,15 @@ function buildRebrandRules(from = {}, to = {}) {
109
116
  add(`[${fc}]`, `[${tc}]`);
110
117
  // The instance env-var prefix (e.g. OTB_ → CLOUDBONGOS_), bounded by its underscore.
111
118
  add(`${effEnvPrefix(from)}_`, `${effEnvPrefix(to)}_`);
119
+ // task 1002672: the bare User-Agent brand token (e.g. `amazonprimea-gds-cli/1.0`
120
+ // in a hook's outbound fetch). It carries no TLD, so none of the HOST rules above
121
+ // ever matched it and a founder-branded UA leaked into every materialized
122
+ // instance verbatim. Bounded by the `-gds` suffix (the userAgent() convention)
123
+ // so a bare founder word in prose is NOT rewritten — only the UA token shape.
124
+ // Both bases must resolve: an empty side would degenerate into a bare `-gds`
125
+ // rule that rewrites every occurrence of the suffix itself.
126
+ const fromUa = effUaBase(from), toUa = effUaBase(to);
127
+ if (fromUa && toUa) add(`${fromUa}-gds`, `${toUa}-gds`);
112
128
  // Longest literal first so a full host is replaced before any bare token inside it.
113
129
  rules.sort((x, y) => y.pattern.source.length - x.pattern.source.length);
114
130
  return rules;