@bongos/core 1.19.150 → 1.19.151
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.151",
|
|
6
|
+
"core_contract": "1.19.151",
|
|
7
|
+
"source_commit": "6ffcec970cdf3d4340b66e42edb33a49257fd4c5",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-16T14:
|
|
9
|
+
"built_at": "2026-08-16T14:50:02.406Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 304,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 1579,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "0b11b762ff3c5e42925fc4aa0d743f3bd3f3b77e4340e4d00013c3cefe401540",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1177,7 +1177,7 @@
|
|
|
1177
1177
|
{
|
|
1178
1178
|
"path": "docs/adr/0144-devbox-rehome-onto-cloudbongos-plane.md",
|
|
1179
1179
|
"mode": "0000644",
|
|
1180
|
-
"sha256": "
|
|
1180
|
+
"sha256": "6f3312ff0cdfdb824626375ca4e3e517e21f5f0f7087f579feee40e836bb3cc1"
|
|
1181
1181
|
},
|
|
1182
1182
|
{
|
|
1183
1183
|
"path": "docs/adr/0144-federated-single-logout-backchannel.md",
|
|
@@ -1352,7 +1352,7 @@
|
|
|
1352
1352
|
{
|
|
1353
1353
|
"path": "docs/architecture.md",
|
|
1354
1354
|
"mode": "0000644",
|
|
1355
|
-
"sha256": "
|
|
1355
|
+
"sha256": "49747f42b1229ee8a2ecc54c317fc7173a91a4340ddfe2033e1a78b0f6ed1482"
|
|
1356
1356
|
},
|
|
1357
1357
|
{
|
|
1358
1358
|
"path": "docs/branding-contract.md",
|
|
@@ -4187,12 +4187,12 @@
|
|
|
4187
4187
|
{
|
|
4188
4188
|
"path": "package-lock.json",
|
|
4189
4189
|
"mode": "0000644",
|
|
4190
|
-
"sha256": "
|
|
4190
|
+
"sha256": "739468093ef4eab580a28b005fd816fadee7f7cf1facf9db6f9f5cf9cc352b36"
|
|
4191
4191
|
},
|
|
4192
4192
|
{
|
|
4193
4193
|
"path": "package.json",
|
|
4194
4194
|
"mode": "0000644",
|
|
4195
|
-
"sha256": "
|
|
4195
|
+
"sha256": "6f3fd6f5b9780d2e612b95a4d1ba8cba840b1d5c79be73aaa034d435a8da344b"
|
|
4196
4196
|
},
|
|
4197
4197
|
{
|
|
4198
4198
|
"path": "public-docs/index.html",
|
|
@@ -4622,7 +4622,7 @@
|
|
|
4622
4622
|
{
|
|
4623
4623
|
"path": "scripts/gds/box.js",
|
|
4624
4624
|
"mode": "0000644",
|
|
4625
|
-
"sha256": "
|
|
4625
|
+
"sha256": "c8a79e6541a2e26e590bd8ee1bbf31cb0f7300c53dbd30c241f4c1f04a2af7bf"
|
|
4626
4626
|
},
|
|
4627
4627
|
{
|
|
4628
4628
|
"path": "scripts/gds/build-bongos.js",
|
|
@@ -5782,7 +5782,7 @@
|
|
|
5782
5782
|
{
|
|
5783
5783
|
"path": "src/module-api.js",
|
|
5784
5784
|
"mode": "0000644",
|
|
5785
|
-
"sha256": "
|
|
5785
|
+
"sha256": "ac7dd33de47d132bc68dca844d0d7f0992a5fa14249516e84c32c21960b14ba6"
|
|
5786
5786
|
},
|
|
5787
5787
|
{
|
|
5788
5788
|
"path": "src/module-loader/catalog.js",
|
|
@@ -39,3 +39,6 @@ Stand up a **cloudbongos-native box plane** alongside (not replacing) the legacy
|
|
|
39
39
|
2. **Cloudflare token scope.** Provision warned the ADR 0053 cookie-strip Transform Rule was **not** applied — `CLOUDFLARE_API_TOKEN` lacks "Transform Rules" edit scope on the cloudbongos.com zone. Add the scope (or apply the rule once in the dashboard) **before** other builders get boxes on `*.cloudbongos.com`, so platform cookies (`cookieDomain=<redacted> aren't sent to box subdomains.
|
|
40
40
|
3. **Cosmetic `otb-` prefix.** Tunnel names (`otb-term-<login>`) and the droplet name (`otb-box-<login>`) are still hardcoded in `box-onboard.js`/`box.js`. Harmless (fleet separation is by tag, and DNS is per-zone), but a branding leak worth parameterizing.
|
|
41
41
|
4. **Phase 4 — retire the legacy example plane** (owner decision) — **part (a) DONE in task 1002248 (2026-07-15).** Pre-checked read-only that the legacy fleet was empty (0 `otb-builder-box` droplets on DigitalOcean; cohost intent queue `ran=0`), then `systemctl disable --now` on the four `cohost-box-*` timers (intent-runner / idle-suspend / drift-reconcile / dormant-reclaim) on the control-plane host — now `disabled`/`inactive`; the native `cloudbongos-box-*` timers were left `enabled`/`active`. **Part (b) — disabling the dev-box module on example.com itself — NOT reachable from the control plane, flagged to owner:** example's web app + instance checkout are not co-located on the cloudbongos droplet (no local checkout, no ssh alias) and the local example GDS token is expired, so a durable module-disable needs owner access to example's own config/host. Harmless meanwhile: with the runners stopped there is no cost/security impact — worst case is a box request on the legacy instance that now hangs unfulfilled.
|
|
42
|
+
5. **The control plane silently froze on core 1.19.2 — FIXED (task 1002738, 2026-08-16).** The four `cloudbongos-box-*` units were installed with `WorkingDirectory=/home/lars/cloudbongos` (§2 above), and `infra/core-node.sh` resolves the core from *that* root's `node_modules/@bongos/core` — pinned to the vendored `bongos-core-1.19.2.tgz`. The web app meanwhile moved to the npm registry pin and rode the nightly patch sweep to **1.19.146**. The two never converged, because `config/update-subscriptions.json` lists exactly ONE instance (`/home/lars/cloudbongos-instance`) and the box root was never added. Net effect: **every park/destroy/provision decision on this fleet was made by a core ~145 patches old**, so the whole point of tasks 1002726/1002727 — an idle box *parks* instead of being destroyed — was landed in `main`, released, deployed to the web app, and still **never executed**: `cmdSweepIdle` in 1.19.2 calls `deprovisionOne`. Nothing surfaced it; a shipped, released, deployed fix was simply inert.
|
|
43
|
+
**Fix.** A systemd drop-in on each of the four units re-points `WorkingDirectory` at `/home/lars/cloudbongos-instance` — the subscribed root the nightly sweep keeps current — and runs `node node_modules/@bongos/core/scripts/gds/box.js <cmd> --apply` directly. Same shape as the drop-ins already applied to `{selfhost,cohost}-provision-intent-runner`. The box lifecycle now inherits every core release with no second upgrade path to remember. The stale root is NOT retired: it still vendors `infra/` (the cloud-init + bring-up scripts the core package does not ship — follow-up 1 / ADR 0150), supplied to the units via `CLOUDBONGOS_BOX_INFRA_DIR=/home/lars/cloudbongos/infra`, the documented escape hatch that is candidate [#1](http://localhost:3000/builders#/task/1) in `boxInfraCandidates()`. Verified: all four commands dry-ran **identically** on old and new core before cutover (0 idle, 0 intents, DO⇄DB consistent, 0 dormant), then ran live under the drop-ins; the dormant sweep's new `warn >11d` window in the journal is the 1002727 code proving itself present.
|
|
44
|
+
**Why it stayed invisible, and the guard.** The sweep banner printed the *threshold* but never the *code*, so a stale plane looked identical to a current one in `journalctl`; diagnosing it needed a filesystem dig across two instance roots. `box.js` now prints one provenance line on every invocation — `box.js · running from @bongos/core@<version> · instance <root>` — naming the package it actually resolved. A frozen plane now announces itself in its own logs.
|
package/docs/architecture.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
- **Domain:** `example.com` — registered at Cloudflare Registrar. DNS A records (apex + `www`) point to the droplet at `REDACTED_IP`. Cloudflare proxy is **ON (orange cloud)**. CF terminates TLS at the edge; the **Cloudflare Origin Certificate** handles the CF↔origin leg (valid through 2041-05-04). A `status` subdomain is added at PMS-V1 deploy time (see [`docs/pms-v1-deploy.md`](pms-v1-deploy.md)) with the same proxy/cert posture; Origin Cert needs `*.example.com` SAN. Real client IPs come in via `CF-Connecting-IP` / `X-Forwarded-For`, wired into Caddy's `trusted_proxies static` (the Cloudflare IP ranges) in the `infra/Caddyfile` global options block.
|
|
13
13
|
- **Production droplet (co-hosting box):** DigitalOcean, hostname `example`, IPv4 `REDACTED_IP`, IPv6 `REDACTED_IP`. NYC3, Premium Intel 2 GB / 1 vCPU / 60 GB NVMe. Ubuntu 24.04 LTS. ~$14/mo. Hosts the OTB game + co-hosted project instances (`emersonian-circles.`, `staging.`).
|
|
14
|
-
- **Cloud Bongos control-plane droplet (NEW 2026-07-05, [ADR 0126](adr/<redacted>.md), task [#2063](https://example.com/builders#/task/2063)):** DigitalOcean, hostname `cloudbongos`, IPv4 `REDACTED_IP`, NYC3, `s-1vcpu-2gb` (2 GB / 1 vCPU), Ubuntu 24.04, ~$12/mo, tag `cloudbongos-control`. Runs **cloudbongos.com + `builders.` + `status.`** (`src/platform-server.js`, Cloud Bongos brand, port 3002, own `cloudbongos` DB, checkout `/home/lars/cloudbongos
|
|
14
|
+
- **Cloud Bongos control-plane droplet (NEW 2026-07-05, [ADR 0126](adr/<redacted>.md), task [#2063](https://example.com/builders#/task/2063)):** DigitalOcean, hostname `cloudbongos`, IPv4 `REDACTED_IP`, NYC3, `s-1vcpu-2gb` (2 GB / 1 vCPU), Ubuntu 24.04, ~$12/mo, tag `cloudbongos-control`. Runs **cloudbongos.com + `builders.` + `status.`** (`src/platform-server.js`, Cloud Bongos brand, port 3002, own `cloudbongos` DB, checkout `/home/lars/cloudbongos-instance`, the root subscribed to the nightly core-patch sweep) and is the **sole token-holding control plane** — a SECOND root, `/home/lars/cloudbongos`, survives only to vendor `infra/` (the box cloud-init the core package does not ship, ADR 0150); it is not subscribed, so nothing may resolve core code from it (task 1002738, [ADR 0144](adr/<redacted>.md) follow-up 5) — `/etc/cloudbongos/box.env` holds the account-wide Cloudflare token (IP-locked to this box) + the DigitalOcean token; this is where `provision.js` provisions instance subdomains. **Structurally separate SSH** (own `cloudbongos_ed25519` key). IPv6 egress disabled so the IPv4-locked CF token can't be spuriously rejected. cloudbongos.com was previously a co-tenant on the co-hosting box; that unit was decommissioned at cutover. **Follow-ups:** deploy automation (task [#2064](https://example.com/builders#/task/2064)) + fully stripping cloud tokens off the co-hosting box (task [#2065](https://example.com/builders#/task/2065)).
|
|
15
15
|
- **Server stack:** Node.js 22 LTS · PostgreSQL 16 · Caddy 2.11.2. `example.service` (systemd) runs `node server.js` as user `lars` on `127.0.0.1:3000`; restart-on-failure.
|
|
16
16
|
- **Hardening:** `lars` user with passwordless sudo; SSH key-only (root login disabled, password auth disabled); ufw allows 22/80/443; fail2ban active; unattended-upgrades enabled; timezone `America/New_York`.
|
|
17
17
|
- **TLS:** Origin cert at `/etc/caddy/origin.crt` + `/etc/caddy/origin.key` for the example apexes on the co-hosting box. **cloudbongos.com's apexes moved to the dedicated control-plane droplet** ([ADR 0126](adr/<redacted>.md)) with their own copy of the Cloudflare Origin Cert (SAN `*.cloudbongos.com, cloudbongos.com`) at `/etc/caddy/cloudbongos-origin.{crt,key}` on `REDACTED_IP`. Cloudflare SSL/TLS mode = Full (strict). Renewal is a non-issue for ~15 years. **Provisioned instance hosts use a different, coexisting posture** ([ADR 0111](adr/<redacted>.md) §4 / task P4): Caddy **on-demand ACME** (Let's Encrypt) via the global `on_demand_tls { ask … }` block, gated to hostnames the `provisioning` module actually stood up (`/api/bongos/provisioning/tls-check`). Their DNS records are **proxied=false (grey cloud)** so the ACME challenge reaches Caddy — the opposite of the origin-cert apexes; do not enable the proxy on them or renewal breaks silently ([ADR 0003](adr/<redacted>.md)). Per-instance site snippets live in `/etc/caddy/sites/*.caddy` (`import`ed by `infra/Caddyfile`). **Tradeoff (accepted, SEC review of task 1945):** `proxied=false` publishes the box's real origin IP in public DNS for every co-tenant provisioned hostname — defeating, for those names, the Cloudflare-proxy IP-hiding the apexes enjoy (a co-tenant host resolves to the same `REDACTED_IP` that serves the main game). This is inherent to on-demand ACME (the challenge must hit the origin) and acceptable under the budget/trust model; prefer a **dedicated droplet** (its own IP) for any instance expected to draw hostile attention.
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.151",
|
|
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.151",
|
|
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.151",
|
|
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",
|
package/scripts/gds/box.js
CHANGED
|
@@ -1447,11 +1447,38 @@ Named browser-terminal tunnel (#771, ADR 0038 — OPT-IN, default OFF):
|
|
|
1447
1447
|
// never imports it, it is always spawned) it exposes the orchestration fns so the
|
|
1448
1448
|
// dry-run/live contract can be exercised with injected fakes (#1034). The guard
|
|
1449
1449
|
// keeps a require() from running the CLI + calling process.exit.
|
|
1450
|
+
// provenance() — WHICH core is making this fleet decision, and from which root.
|
|
1451
|
+
//
|
|
1452
|
+
// Task 1002738: the four cloudbongos-box-* units ran with WorkingDirectory pointed at
|
|
1453
|
+
// a root whose vendored @bongos/core was 1.19.2 while the web app had long since moved
|
|
1454
|
+
// to 1.19.146 — so every park/destroy/provision decision was made by a core ~145
|
|
1455
|
+
// patches behind, including a cmdSweepIdle that still DESTROYED an idle box. Nothing
|
|
1456
|
+
// in the journal said so: the sweep banner reports the THRESHOLD but never the code.
|
|
1457
|
+
// Diagnosing it took a filesystem dig across two instance roots.
|
|
1458
|
+
//
|
|
1459
|
+
// One line, printed by every invocation, makes that failure self-announcing: a stale
|
|
1460
|
+
// plane now says its own version in `journalctl -u cloudbongos-box-idle-suspend`, next
|
|
1461
|
+
// to the instance root that supplied it. Cheap, unconditional, and it can only be
|
|
1462
|
+
// wrong if the package it reads is the package it ran.
|
|
1463
|
+
// Names the package REPO_ROOT resolved to, not just its version: installed, that is
|
|
1464
|
+
// `@bongos/core@1.19.148`; in a monolith checkout it is the instance's own package, and
|
|
1465
|
+
// saying so is the point — the line must never let a monolith masquerade as a core pin.
|
|
1466
|
+
function provenance() {
|
|
1467
|
+
let pkg = 'unknown';
|
|
1468
|
+
try {
|
|
1469
|
+
const p = require(path.join(REPO_ROOT, 'package.json'));
|
|
1470
|
+
pkg = `${p.name || 'unknown'}@${p.version || 'unknown'}`;
|
|
1471
|
+
} catch { /* a core with no readable package.json still runs — just say unknown */ }
|
|
1472
|
+
const inst = instanceConfig.resolveInstanceRootExplicit() || process.cwd();
|
|
1473
|
+
return `box.js · running from ${pkg} · instance ${inst}`;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1450
1476
|
async function main() {
|
|
1451
1477
|
const args = process.argv.slice(2);
|
|
1452
1478
|
const cmd = args[0];
|
|
1453
1479
|
APPLY = hasFlag(args, '--apply');
|
|
1454
1480
|
if (!cmd || cmd === '--help' || cmd === '-h' || cmd === 'help') { usage(); process.exit(0); }
|
|
1481
|
+
console.log(provenance());
|
|
1455
1482
|
|
|
1456
1483
|
const known = ['provision', 'onboard', 'park', 'wake', 'deprovision', 'run-intents', 'sweep-idle', 'sweep-dormant', 'reconcile', 'reconcile-drift', 'status'];
|
|
1457
1484
|
if (!known.includes(cmd)) { console.error(`unknown command: ${cmd}\n`); usage(); process.exit(2); }
|
package/src/module-api.js
CHANGED
|
@@ -727,8 +727,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
727
727
|
// landed since 1.19.148 with no explicit bump. run 31953207683. (task 1002620)
|
|
728
728
|
// 1.19.150 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
729
729
|
// landed since 1.19.149 with no explicit bump. run 31953504697. (task 1002620)
|
|
730
|
+
// 1.19.151 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
731
|
+
// landed since 1.19.150 with no explicit bump. run 31953827282. (task 1002620)
|
|
730
732
|
// ---------------------------------------------------------------------------
|
|
731
|
-
const CORE_VERSION = '1.19.
|
|
733
|
+
const CORE_VERSION = '1.19.151'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
732
734
|
|
|
733
735
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
734
736
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|