@bongos/core 1.19.118 → 1.19.120
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.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.120",
|
|
6
|
+
"core_contract": "1.19.120",
|
|
7
|
+
"source_commit": "aa2b9a92ce2984a3d4095b234ee2757098a5dd5a",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-14T20:14:51.707Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 302,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 1562,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "84cbdf23f5f59fa6d3b2561ccc3fd1427ed42f8a1254864738f696d9ad68b431",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1577,7 +1577,7 @@
|
|
|
1577
1577
|
{
|
|
1578
1578
|
"path": "docs/recipes/core-release-pipeline.md",
|
|
1579
1579
|
"mode": "0000644",
|
|
1580
|
-
"sha256": "
|
|
1580
|
+
"sha256": "512d67da7fba233e31f318b3fa8aacb377fecaf4f1810696f8357507620424db"
|
|
1581
1581
|
},
|
|
1582
1582
|
{
|
|
1583
1583
|
"path": "docs/recipes/devbox-app-release.md",
|
|
@@ -1642,7 +1642,7 @@
|
|
|
1642
1642
|
{
|
|
1643
1643
|
"path": "docs/recipes/ops-gotchas.md",
|
|
1644
1644
|
"mode": "0000644",
|
|
1645
|
-
"sha256": "
|
|
1645
|
+
"sha256": "bafbbe9d5b6cde72bd2bdbe0b5578550a282b20e73a5f025da6ab7fdb46f69b1"
|
|
1646
1646
|
},
|
|
1647
1647
|
{
|
|
1648
1648
|
"path": "docs/recipes/overnight-builder.md",
|
|
@@ -4162,12 +4162,12 @@
|
|
|
4162
4162
|
{
|
|
4163
4163
|
"path": "package-lock.json",
|
|
4164
4164
|
"mode": "0000644",
|
|
4165
|
-
"sha256": "
|
|
4165
|
+
"sha256": "05d0b9f864bda27810fdb4395f11dbd2a10c154d990cb9a797b4861b12939200"
|
|
4166
4166
|
},
|
|
4167
4167
|
{
|
|
4168
4168
|
"path": "package.json",
|
|
4169
4169
|
"mode": "0000644",
|
|
4170
|
-
"sha256": "
|
|
4170
|
+
"sha256": "e3f4d846962f68ba3a7e53dc71476cf2d516dd7aa031bf03fa18abc9c09b3e07"
|
|
4171
4171
|
},
|
|
4172
4172
|
{
|
|
4173
4173
|
"path": "public-docs/index.html",
|
|
@@ -4417,7 +4417,7 @@
|
|
|
4417
4417
|
{
|
|
4418
4418
|
"path": "public-landing/index.html",
|
|
4419
4419
|
"mode": "0000644",
|
|
4420
|
-
"sha256": "
|
|
4420
|
+
"sha256": "1fa06d66fc4c1bbe3849e6fbf402852caea8b7cfc80a4c69ecad26d921d4264d"
|
|
4421
4421
|
},
|
|
4422
4422
|
{
|
|
4423
4423
|
"path": "public-landing/projects.html",
|
|
@@ -5742,7 +5742,7 @@
|
|
|
5742
5742
|
{
|
|
5743
5743
|
"path": "src/module-api.js",
|
|
5744
5744
|
"mode": "0000644",
|
|
5745
|
-
"sha256": "
|
|
5745
|
+
"sha256": "16aec96c16dd0b8315db0bc9879b36b75195a81f944ccae84ded61de76b5717f"
|
|
5746
5746
|
},
|
|
5747
5747
|
{
|
|
5748
5748
|
"path": "src/module-loader/catalog.js",
|
|
@@ -130,6 +130,59 @@ Also: an instance can have **more than one plane to update** (e.g. a web instanc
|
|
|
130
130
|
|
|
131
131
|
---
|
|
132
132
|
|
|
133
|
+
## The pin-bump runbook — cloudbongos.com, one paste per step (task 1002767)
|
|
134
|
+
|
|
135
|
+
The generic mechanics are [upgrading-the-core](upgrading-the-core.md); this is the **operational sequence for the live mothership** — registry pin, pull-deploy repo at `/home/lars/cloudbongos-instance`, `cloudbongos.service` serving `127.0.0.1:3002`. Every trap below cost a real round trip on the 2026-08-13 (`1.19.91 → 1.19.94`) run; the goal is that the next bump is one paste, not fifteen.
|
|
136
|
+
|
|
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
|
+
|
|
139
|
+
### Step 1 — pick the version (your machine, main checkout)
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
git fetch origin --tags
|
|
143
|
+
git tag --list 'core-v*' --contains <your-merge-sha> | sort -V | head -1
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Failure this prevents — pinning a release that predates your work.** The version your own ship report printed is usually the release cut for the *previous* merge (ADR 0161 publishes *after* each land). The version to pin is the newest tag that **contains** your merge. If no tag contains it, the publish lane hasn't finished (or is disarmed): a green `publish` *check* is not evidence of a publish — read the Publish **step log** for `+ @bongos/core@<version>`. The package is private, so an anonymous `npm view` proves nothing either.
|
|
147
|
+
|
|
148
|
+
### Step 2 — the bump (the owner runs this line, via `!` in the session)
|
|
149
|
+
|
|
150
|
+
The permission classifier blocks the agent from running a mutating `sudo -u lars` over ssh, so this paste is the **owner's**. The `!` prefix also keeps ssh honest: a bare `ssh host` is non-interactive here — it connects, prints the MOTD, and exits — so the command must ride as an argument.
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
! ssh -i ~/.ssh/otb_builder jaxri@REDACTED_IP "sudo -n -u lars bash -c 'cd /home/lars/cloudbongos-instance && export NPM_TOKEN=\$(grep -oP \"(?<=_authToken=).*\" /home/lars/.npmrc | head -1) && [ -n \"\$NPM_TOKEN\" ] || { echo EMPTY NPM_TOKEN — aborting; exit 12; }; ./node_modules/.bin/bongos upgrade --registry --to <VER> --service cloudbongos.service --health-url http://127.0.0.1:3002/healthz --commit-pin'"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
What each piece is for — each guards a failure that actually happened:
|
|
157
|
+
|
|
158
|
+
- **Token extraction runs as lars** (the whole command is inside `sudo -u lars bash -c`). Reading `/home/lars/.npmrc` as `jaxri` is `Permission denied`, which yields an **empty** `NPM_TOKEN`, which sends npm to the **public** registry, which 404s on the private `@bongos/core` — and the upgrade rolls back cleanly, having taught you nothing. The `[ -n "$NPM_TOKEN" ] || exit` guard aborts instead of half-running.
|
|
159
|
+
- **`--to <VER>` is required** — `bongos upgrade` refuses to guess a target.
|
|
160
|
+
- **`--service` + `--health-url` buy the automatic rollback.** Point the health URL at `http://127.0.0.1:3002/healthz`, **not the public URL** — a pre-launch `basic_auth` on the apex makes a healthy boot look failed and triggers a needless rollback.
|
|
161
|
+
- **`--commit-pin` commits AND pushes the pin.** The instance is a pull-deploy repo: the next sync runs `git reset --hard origin/main`, which reverts an uncommitted pin, and `npm ci` then reinstalls the old core. Nothing errors. This is exactly how live sat 13 releases behind (task 1002712). The same applies to any tracked instance-config edit (`config/branding.json`): commit + push or the next deploy tick undoes it. A commit that fails to *push* saves nothing — deploy.sh resets to the remote.
|
|
162
|
+
- **The `core_upgrades` ledger row needs `PGDATABASE`.** The migrate step resolves the instance DB itself, but the ledger write reads only the env — under `sudo -u lars bash -c` there is none, so the run logs `ledger skipped (no DATABASE_URL or PGDATABASE)`. The bump still succeeds. If you want the row: read the DB name once (`! ssh -i ~/.ssh/otb_builder jaxri@REDACTED_IP "sudo -n -u lars grep -A1 '\"db\"' /home/lars/cloudbongos-instance/config/branding.json"`) and splice `export PGDATABASE=<name> &&` into the paste before the `bongos upgrade` call.
|
|
163
|
+
|
|
164
|
+
### Step 3 — verify on the box, not from your browser
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
! ssh -i ~/.ssh/otb_builder jaxri@REDACTED_IP "curl -s http://127.0.0.1:3002/version"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
`coreVersion` must equal the target. This is the proof; the deploy tool's own output is not.
|
|
171
|
+
|
|
172
|
+
**Failure this prevents — trusting a stale or gated public view.** The apex may sit behind pre-launch `basic_auth`, and HTML rides the CDN. (The classic *stylesheet* staleness — new HTML styled by a 4-hour-old `cosmos.css` — was fixed by content-hashed asset URLs in task 1002766, so a broken-*looking* page is no longer expected; if you must check publicly, use a cold profile or `fetch(url, {cache:'reload'})`.)
|
|
173
|
+
|
|
174
|
+
### Step 4 — prove the pin is durable
|
|
175
|
+
|
|
176
|
+
The `--commit-pin` output already reports commit + push. To prove durability the hard way, force a deploy tick and re-read the version — a reverted pin shows up here and nowhere else:
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
! ssh -i ~/.ssh/otb_builder jaxri@REDACTED_IP "sudo -n systemctl start cloudbongos-deploy.service; sleep 5; curl -s http://127.0.0.1:3002/version"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
If `coreVersion` regressed: the pin didn't reach `origin/main` — re-run the bump and watch for the `PIN NOT COMMITTED` warning text, or commit+push `package.json` + `package-lock.json` in the instance repo by hand.
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
133
186
|
## Detecting divergence
|
|
134
187
|
|
|
135
188
|
[`scripts/gds/deploy-divergence.js`](../../scripts/gds/deploy-divergence.js) is the comparison that was missing during the ten-day incident. It runs **warn-only at the end of every ship** and can be run by hand any time:
|
|
@@ -198,6 +198,12 @@ Organized by topic, not chronology. New entries go in the matching section; crea
|
|
|
198
198
|
- **Related:** publish-on-merge (ADR 0161) pushes a `release: core X.Y.Z` carrier commit after every land, so on an instance that DOES deploy, the deploy run belongs to the carrier's sha, not the merge commit's. A strict sha match never hit — hence the same permanent `pending`. The probe now also accepts a successful `main` deploy that started after the merge.
|
|
199
199
|
- **The wait is bounded.** A probe stuck at `deploy=pending` for a reason that never resolves looks identical to a slow deploy on any single sweep, so after `<redacted>` (default 30 min) a task whose land is *provable on main* ships anyway, and the sweep logs `deploy still unconfirmed after Nmin`. This lifts only the deploy gate — the per-task land proof is untouched, so it can never become a branch-reuse false-ship. Raise the env var on an instance whose real deploy legitimately takes longer than 30 minutes.
|
|
200
200
|
|
|
201
|
+
### Moving the live cloudbongos.com pin — use the runbook, not memory
|
|
202
|
+
|
|
203
|
+
- **What:** the end-of-session pin bump (registry-pinned mothership) is a scripted sequence now: [the pin-bump runbook](core-release-pipeline.md#<redacted>). One paste per step; each step names the failure it prevents.
|
|
204
|
+
- **The three that bite hardest** if you freelance it: an NPM token extracted as the wrong user comes back **empty**, npm silently hits the public registry, 404s on the private package, and rolls back cleanly (you learn nothing); a pin left **uncommitted or unpushed** is reverted by the pull-deploy's `git reset --hard` on the next tick — this is how live sat 13 releases behind; and a `--health-url` pointed at the **public apex** instead of `127.0.0.1:3002` reads pre-launch `basic_auth` as a failed boot and triggers a needless rollback.
|
|
205
|
+
- **Cadence:** once per session, at close — one bump covers all the session's releases. The version to pin is the newest `core-v*` tag that **contains** your merge, not the one your ship report printed.
|
|
206
|
+
|
|
201
207
|
---
|
|
202
208
|
|
|
203
209
|
## Status page + monitoring
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.120",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.120",
|
|
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.
|
|
3
|
+
"version": "1.19.120",
|
|
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",
|
|
@@ -79,11 +79,15 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
|
|
|
79
79
|
The head is SKIN, not a card. It carries its own --skin-* tokens and must
|
|
80
80
|
NEVER inherit --bg-card — that turns it black in dark mode. These are
|
|
81
81
|
component-scoped (on .bongos, not :root) so they cannot collide with the
|
|
82
|
-
pack's contract tier.
|
|
82
|
+
pack's contract tier.
|
|
83
|
+
|
|
84
|
+
The ground shadow follows cosmos.css's --shadow-card rule: ink-derived in
|
|
85
|
+
light (warm brown), plain black in dark — in dark, --ink is near-white and
|
|
86
|
+
an ink fill would glow, not shade. */
|
|
83
87
|
.bongos{display:block;width:100%;height:auto;overflow:visible;
|
|
84
|
-
--skin-hi:#fffdf8;--skin-mid:#fff6e9;--skin-lo:#e8d3b6;}
|
|
85
|
-
:root[data-mode="dark"] .bongos{--skin-hi:#fdf7ea;--skin-mid:#efe1c8;--skin-lo:#c3ae90;}
|
|
86
|
-
@media (prefers-color-scheme:dark){:root:not([data-mode="light"]) .bongos{--skin-hi:#fdf7ea;--skin-mid:#efe1c8;--skin-lo:#c3ae90;}}
|
|
88
|
+
--skin-hi:#fffdf8;--skin-mid:#fff6e9;--skin-lo:#e8d3b6;--drum-shadow:var(--ink);}
|
|
89
|
+
:root[data-mode="dark"] .bongos{--skin-hi:#fdf7ea;--skin-mid:#efe1c8;--skin-lo:#c3ae90;--drum-shadow:#000;}
|
|
90
|
+
@media (prefers-color-scheme:dark){:root:not([data-mode="light"]) .bongos{--skin-hi:#fdf7ea;--skin-mid:#efe1c8;--skin-lo:#c3ae90;--drum-shadow:#000;}}
|
|
87
91
|
.mascot{position:relative;}
|
|
88
92
|
.mascot::before{content:"";position:absolute;inset:-8% -12%;z-index:-1;border-radius:50%;
|
|
89
93
|
background:radial-gradient(ellipse at center,rgba(255,255,255,.95) 0%,rgba(255,255,255,.7) 45%,rgba(255,255,255,0) 72%);}
|
|
@@ -274,7 +278,7 @@ h1.big{font-family:var(--font-display);font-weight:700;font-size:clamp(33px,5.4v
|
|
|
274
278
|
|
|
275
279
|
<ellipse class="glow" cx="222" cy="170" rx="215" ry="140" fill="url(#halo)"/>
|
|
276
280
|
<ellipse class="bshadow" cx="220" cy="286" rx="142" ry="14"
|
|
277
|
-
fill="var(--
|
|
281
|
+
fill="var(--drum-shadow)" opacity=".22" filter="url(#soft)"/>
|
|
278
282
|
|
|
279
283
|
<!-- the joining block, behind both shells -->
|
|
280
284
|
<path d="M 214,196 C 232,188 250,188 264,196 L 258,232 C 244,225 230,225 219,232 Z" fill="var(--accent-deep)"/>
|
package/src/module-api.js
CHANGED
|
@@ -663,8 +663,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
663
663
|
// landed since 1.19.116 with no explicit bump. run 31830559253. (task 1002620)
|
|
664
664
|
// 1.19.118 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
665
665
|
// landed since 1.19.117 with no explicit bump. run 31833658900. (task 1002620)
|
|
666
|
+
// 1.19.119 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
667
|
+
// landed since 1.19.118 with no explicit bump. run 31835957309. (task 1002620)
|
|
668
|
+
// 1.19.120 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
669
|
+
// landed since 1.19.119 with no explicit bump. run 31836959112. (task 1002620)
|
|
666
670
|
// ---------------------------------------------------------------------------
|
|
667
|
-
const CORE_VERSION = '1.19.
|
|
671
|
+
const CORE_VERSION = '1.19.120'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
668
672
|
|
|
669
673
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
670
674
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|