@bongos/core 1.21.117 → 1.21.119

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.21.117",
6
- "core_contract": "1.21.117",
7
- "source_commit": "24f86969a6ea67bd13ceaa3e1a6b4193a717de4e",
5
+ "core_version": "1.21.119",
6
+ "core_contract": "1.21.119",
7
+ "source_commit": "e45da330efcf6e68ae4775165b5025cbb4903372",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-14T10:20:16.439Z",
9
+ "built_at": "2026-10-14T13:43:35.449Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 604,
12
+ "docs_redacted": 605,
13
13
  "agent_docs_stubbed": 28,
14
- "functional_verbatim": 3113,
14
+ "functional_verbatim": 3116,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3746,
20
- "tree_sha256": "a7996793fd481f433e052680171e0844fa40b4f7bd34e9a5533bba236e3979bc",
19
+ "file_count": 3750,
20
+ "tree_sha256": "ab4ca3dcbd21d9cc55a93db106532caca2363b955e5c205e9f69d3992547742e",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -1927,7 +1927,7 @@
1927
1927
  {
1928
1928
  "path": "docs/adr/0293-the-owners-deploy-door-is-an-intent-the-control-plane-drains.md",
1929
1929
  "mode": "0000644",
1930
- "sha256": "fb72a972f472cfea4c214dc73c7c5e811670d4eb2bbbc8d397495c8756daa625"
1930
+ "sha256": "116ff65c499cbf91e5f872b63ef37d9fb1c68a171e3649232e8bd2da28311d51"
1931
1931
  },
1932
1932
  {
1933
1933
  "path": "docs/adr/0294-cli-sessions-do-not-expire.md",
@@ -2364,10 +2364,15 @@
2364
2364
  "mode": "0000644",
2365
2365
  "sha256": "3615157fc3eeeb2dca5136f33fde3a19c2b603cfc26dc25de82a02719346f2f4"
2366
2366
  },
2367
+ {
2368
+ "path": "docs/adr/0381-the-hub-moves-each-hosted-project-by-its-update-rule.md",
2369
+ "mode": "0000644",
2370
+ "sha256": "12602b29d3a701e7ad1e6c411f7cbf6de3c3148b9c08624b6197968de8079c5f"
2371
+ },
2367
2372
  {
2368
2373
  "path": "docs/adr/README.md",
2369
2374
  "mode": "0000644",
2370
- "sha256": "b3329d0ba7a95583b785b010e123f4a8ccaf593c645d6802d3ba5a2bf23b70e8"
2375
+ "sha256": "6d2a97e2c7ce557aad5e82dd02c529dc05f0bdf6c014df9a812d3e65c7216763"
2371
2376
  },
2372
2377
  {
2373
2378
  "path": "docs/api-reference.md",
@@ -2402,12 +2407,12 @@
2402
2407
  {
2403
2408
  "path": "docs/copy-inventory.md",
2404
2409
  "mode": "0000644",
2405
- "sha256": "5faccb2629a8dde143bf9ca0e8c517dbb498a77825b2e947c9c01b37b6d0edd9"
2410
+ "sha256": "32112bc332f327d446a1a066fc4036a916ca7e1a021202d4c07f468973910697"
2406
2411
  },
2407
2412
  {
2408
2413
  "path": "docs/copy-registry.json",
2409
2414
  "mode": "0000644",
2410
- "sha256": "5d239ce9856df53342344b750e07b4d8d74b634c4d10e05c9aed4f9210825a35"
2415
+ "sha256": "50acc9b093e07c52ee9fc4b31a3e69c5ae6bc73c00530c71fc4a81c6f6aca727"
2411
2416
  },
2412
2417
  {
2413
2418
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2917,7 +2922,7 @@
2917
2922
  {
2918
2923
  "path": "docs/module-api-changelog.md",
2919
2924
  "mode": "0000644",
2920
- "sha256": "d8e108772dbf146ba2c2a7bc345e62c49564629e17f7ff1f155cf9bc8aa1a19b"
2925
+ "sha256": "9273e8ea9033856fb3df24625de22515aa4129046a17c41c65bc5d3f71ec8e24"
2921
2926
  },
2922
2927
  {
2923
2928
  "path": "docs/modules-contract.md",
@@ -3007,7 +3012,7 @@
3007
3012
  {
3008
3013
  "path": "docs/page-readings.json",
3009
3014
  "mode": "0000644",
3010
- "sha256": "ed3f0e2bb4fbebc9dad91c09c656620095101b61d4a0693df519281786efefd1"
3015
+ "sha256": "03476cabc2dae58cf07f00b17125cfaca03a5de921359c8a6e14e540cb40d2ce"
3011
3016
  },
3012
3017
  {
3013
3018
  "path": "docs/project-context.template.md",
@@ -3172,7 +3177,7 @@
3172
3177
  {
3173
3178
  "path": "docs/recipes/upgrading-the-core.md",
3174
3179
  "mode": "0000644",
3175
- "sha256": "6a6dde2f442d101c4f84a24d3ec44196c1b5b0dfe71e55e980defc9aec082068"
3180
+ "sha256": "644da54bb231559bff762350dd10a45e1fa91c516853111757e50321de1a061d"
3176
3181
  },
3177
3182
  {
3178
3183
  "path": "docs/recipes/windows-builders.md",
@@ -5752,7 +5757,7 @@
5752
5757
  {
5753
5758
  "path": "modules/hall-ui/public/deploy.js",
5754
5759
  "mode": "0000644",
5755
- "sha256": "2dd86dbafbaa97bfbca3ab457dc8845b788b36af3657442d28e24cb02fcbcc5b"
5760
+ "sha256": "054270fdc5aac397498b9fb412025347ccb1c985fbb7b0a113bed636a20234ec"
5756
5761
  },
5757
5762
  {
5758
5763
  "path": "modules/hall-ui/public/deploy.states.json",
@@ -10462,12 +10467,12 @@
10462
10467
  {
10463
10468
  "path": "package-lock.json",
10464
10469
  "mode": "0000644",
10465
- "sha256": "0ace635f24556f8dcafe05047ac751909d9059cecc2a69a0870e4bfa317265df"
10470
+ "sha256": "6469337696b64177fd52f7466f9ac81a7944f2095f16b3d0f7689569038efd02"
10466
10471
  },
10467
10472
  {
10468
10473
  "path": "package.json",
10469
10474
  "mode": "0000644",
10470
- "sha256": "38e0e4baa27d16b52a5e5b5ec1a142ed61c2d096b07df5ef684a33ad81e14143"
10475
+ "sha256": "90f1c32901b1026f763dc05ee48aa2e1a6aa09727fbe360f49fbb4d21e5126a6"
10471
10476
  },
10472
10477
  {
10473
10478
  "path": "public-docs/index.html",
@@ -10487,7 +10492,7 @@
10487
10492
  {
10488
10493
  "path": "release-notes.json",
10489
10494
  "mode": "0000644",
10490
- "sha256": "4b3698521da6c1ef14a15c8e3ee3a42f6f7532c4db9f6a9cf40c0e9cd77c4d3e"
10495
+ "sha256": "ef8c6938bb9e62be346bd1a44b2a590a7ff503bbbc0b44fc7ad2a4d112e96910"
10491
10496
  },
10492
10497
  {
10493
10498
  "path": "scripts/cron/style_guide_audit.sh",
@@ -11494,6 +11499,11 @@
11494
11499
  "mode": "0000644",
11495
11500
  "sha256": "65bb758becd002ae830a8338ec6ba0bc21ec5ef91ad564c85a2a94b7ab6ffbbc"
11496
11501
  },
11502
+ {
11503
+ "path": "scripts/gds/provision-auto-upgrade.js",
11504
+ "mode": "0000644",
11505
+ "sha256": "73448d6c9ee02f1300e71cc4ed752c32e120a4f08621413164674a962fce8176"
11506
+ },
11497
11507
  {
11498
11508
  "path": "scripts/gds/provision-byo-host.js",
11499
11509
  "mode": "0000644",
@@ -11562,7 +11572,7 @@
11562
11572
  {
11563
11573
  "path": "scripts/gds/provision-repo.js",
11564
11574
  "mode": "0000644",
11565
- "sha256": "a52e17d4341c7498d9fc204bfaa7447305a19924e8e05f0fde10583eb1f0a6da"
11575
+ "sha256": "d8c873365cf8f32c9c5eaac6c5cae11126f6e4c786d57eea515714730a31d774"
11566
11576
  },
11567
11577
  {
11568
11578
  "path": "scripts/gds/provision-teardown.js",
@@ -11577,7 +11587,7 @@
11577
11587
  {
11578
11588
  "path": "scripts/gds/provision.js",
11579
11589
  "mode": "0000644",
11580
- "sha256": "772a2586d3601723f096f74f9d8aad82d418c5dce4dc9cb8809525ecd4a005ba"
11590
+ "sha256": "ff2d4e3576942d20056d11236dc13481a8ef560fa9828b691b30ba3758203048"
11581
11591
  },
11582
11592
  {
11583
11593
  "path": "scripts/gds/publish-credential-check.js",
@@ -11732,7 +11742,7 @@
11732
11742
  {
11733
11743
  "path": "scripts/gds/run-unit-tests.js",
11734
11744
  "mode": "0000644",
11735
- "sha256": "e9324b2fe5b23acb8b45723ba7d11d708cbdf92b63e70d0387246eb6fd1a5ac9"
11745
+ "sha256": "d6d81c3bb8017122cb6b5a46355b637f7986ec324132bcd583f0c02d2725b6d0"
11736
11746
  },
11737
11747
  {
11738
11748
  "path": "scripts/gds/runner-drift.js",
@@ -12242,7 +12252,7 @@
12242
12252
  {
12243
12253
  "path": "scripts/gds/upgrade-outcome.js",
12244
12254
  "mode": "0000644",
12245
- "sha256": "199eda583c51bdeb467cc9d84281c9762942e0aa4cb7e76f916fcd18093c06d2"
12255
+ "sha256": "bce74ee06baafe627b418cacd9bbd07eed3760700c98f32630752eed0f358e72"
12246
12256
  },
12247
12257
  {
12248
12258
  "path": "scripts/gds/upgrade.js",
@@ -12277,7 +12287,7 @@
12277
12287
  {
12278
12288
  "path": "scripts/gds/wedge-remedy.js",
12279
12289
  "mode": "0000644",
12280
- "sha256": "611a04666351d8efc7ac5f32a5fef3e846bb087c3397ffd6e3c15a9d9a8dbacb"
12290
+ "sha256": "f842c89729e74b1b7cb9bf647d4fdb0db9959ed41303077d1790cb28a78ca104"
12281
12291
  },
12282
12292
  {
12283
12293
  "path": "scripts/gds/worktree-claim-guard.js",
@@ -12792,7 +12802,7 @@
12792
12802
  {
12793
12803
  "path": "src/module-api.js",
12794
12804
  "mode": "0000644",
12795
- "sha256": "ad17db745ec1ff7924bd9b01437ae13fa716bd9738b8ac57dceeaa8f591ea2d7"
12805
+ "sha256": "9d6d6c4c7cbec83c8655f8299d3700b0810cb2d6e0cf5b7a06757e33cd756263"
12796
12806
  },
12797
12807
  {
12798
12808
  "path": "src/module-loader/catalog.js",
@@ -13799,6 +13809,11 @@
13799
13809
  "mode": "0000644",
13800
13810
  "sha256": "72880fa2f4217ee7cab6a5845a0f5c94a5faf22241583b6749c440bb8fc6c6f3"
13801
13811
  },
13812
+ {
13813
+ "path": "tests/core_auto_upgrade.mjs",
13814
+ "mode": "0000644",
13815
+ "sha256": "a3cf352d5dc340b453b22513c28d8c0a439526862535f51f84b7aea2161c734f"
13816
+ },
13802
13817
  {
13803
13818
  "path": "tests/core_update_banner.mjs",
13804
13819
  "mode": "0000644",
@@ -13989,6 +14004,11 @@
13989
14004
  "mode": "0000644",
13990
14005
  "sha256": "4ee5d0ca5117ebc8a50eb5e49d6c4c47987c4c6de4553e59f5e0531a52a7c041"
13991
14006
  },
14007
+ {
14008
+ "path": "tests/db_ownership_handover.mjs",
14009
+ "mode": "0000644",
14010
+ "sha256": "8a758dbdaebf69b5a4ba811a49058fac3e98cae68dbafa674b287ff26c4f3b39"
14011
+ },
13992
14012
  {
13993
14013
  "path": "tests/dead_deps.mjs",
13994
14014
  "mode": "0000644",
@@ -15612,7 +15632,7 @@
15612
15632
  {
15613
15633
  "path": "tests/hub_profile_leak.mjs",
15614
15634
  "mode": "0000644",
15615
- "sha256": "e9609a8adad0c460c24db69211f02beef3699e3e841d44c1385105c4f5c93385"
15635
+ "sha256": "298afa1c71a485c3c64d90a3976c1a7147f1e888a9362a84502d5a9a94611d56"
15616
15636
  },
15617
15637
  {
15618
15638
  "path": "tests/hub_recent_ships.mjs",
@@ -17037,7 +17057,7 @@
17037
17057
  {
17038
17058
  "path": "tests/provision.mjs",
17039
17059
  "mode": "0000644",
17040
- "sha256": "71ea3289a3007e08249cfb309272208c6ec740d7345d8fbf9638e81b6ece5010"
17060
+ "sha256": "2c31c74c71147c5fe96beb8e6a53f8793ea3f42870512a6005f43df7c6fb5382"
17041
17061
  },
17042
17062
  {
17043
17063
  "path": "tests/provision_account_identity.mjs",
@@ -18522,7 +18542,7 @@
18522
18542
  {
18523
18543
  "path": "tests/upgrade_migrate.mjs",
18524
18544
  "mode": "0000644",
18525
- "sha256": "7f9ca799ee14a5b501ed8446e682d67c43c132738c047ba8752e3f20bda3d030"
18545
+ "sha256": "ceaebfb9bd0a20e4aec695ae8cddcd5a3ddcfe45ebc6772bc0352a257c3d77ab"
18526
18546
  },
18527
18547
  {
18528
18548
  "path": "tests/upgrade_operator.mjs",
@@ -18652,7 +18672,7 @@
18652
18672
  {
18653
18673
  "path": "tests/wedge_remedy.mjs",
18654
18674
  "mode": "0000644",
18655
- "sha256": "dfb1683e7654269be0c92fce88954aa25146027373581d3b8bfcc6fbdf11f2b0"
18675
+ "sha256": "72540ade635a0328ae188da1d7e18061f665e563d3f3ed8a73ed9165b2e77b77"
18656
18676
  },
18657
18677
  {
18658
18678
  "path": "tests/wizard_born_first_board.mjs",
@@ -121,4 +121,5 @@ reused unchanged; this decision is only about what the *control* believes and di
121
121
  guard makes the leg a no-op when the box already serves the target.
122
122
  - **What this does not do:** it does not make deploys automatic. ADR 0137's three gates
123
123
  stand — land, release, deploy — and this only gives the third gate a handle. An owner who
124
- never presses it ships nothing, exactly as today.
124
+ never presses it ships nothing, exactly as today. *(Amended by [ADR 0381](0381-the-hub-moves-each-hosted-project-by-its-update-rule.md),
125
+ 2026-10-14: the hub now queues released moves for hosted projects by their update rule.)*
@@ -0,0 +1,34 @@
1
+ # 0381 — The hub moves each hosted project's core on its own, by that project's update rule
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-10-14
5
+ - **Task:** [task 1004729](https://cloudbongos.com/builders#/task/1004729) (goal 1000090)
6
+ - **Decided by:** the owner (2026-10-14): "projects need to be able to upgrade on their own"
7
+ - **Amends:** [ADR 0293](0293-the-owners-deploy-door-is-an-intent-the-control-plane-drains.md) — its "it does not make deploys automatic", for hosted projects only
8
+ - **Related:** 0357 (the update rule set on /deploy), 0360 / 0361 (projects follow releases), 0137 / 0161 (the publish gates)
9
+
10
+ ## Context
11
+
12
+ Every runner tick, `snapshotAllCoreVersions` works out `recommended` for each active hosted project (`cloud-host`) under its own update rule, then stops. A move happened only when someone pressed the button on /deploy. The other path, `update-sweep.js`, reads a hand-kept roster that provisioning never writes. So toast (rule `patch`) sat on 1.21.20 for 11 days while 1.21.69 was released. The update rule is already the owner's answer to "do you take updates" (`pinned` never moves; `patch` / `minor` move within their bound; tenants take released versions only), so nothing was acting on a decision that had already been made.
13
+
14
+ ## Decision
15
+
16
+ **D1 — The hub runner queues the move itself, after each snapshot** (`scripts/gds/provision-auto-upgrade.js`, called from `cmdRunIntents` on an `--apply` tick). It uses the same two steps the button uses. For an active `cloud-host` whose `recommended` is newer than what it serves, whose rule is not `pinned`, and with no open intent:
17
+ 1. no preflight has passed for that exact target → queue `core-upgrade-preflight` for `recommended`;
18
+ 2. the stored preflight PASSED for that target → queue `core-upgrade` to it.
19
+
20
+ **D2 — Through the existing intent queue.** Every automatic intent goes through `provisioning.enqueueIntent` with `requested_by = 'runner:auto-upgrade'`, as the runner's own reconcile does. The control-plane guard and the single-open-intent slot apply, and /deploy shows these moves like any other. The `control-plane` row is never moved automatically; the platform's own core moves when its owner presses the button.
21
+
22
+ **D3 — Paced.** At most `AUTO_MOVES_PER_TICK` (1) automatic intents are created per tick across all projects, so a release never restarts every project at once. An intent that lost a race for the slot does not spend the pace.
23
+
24
+ **D4 — A target that already failed is held.** A passing preflight does not run migrations (toast's 1.21.115 passed its preflight and failed at migrate). So a target is never queued again for an instance that already has, for that target: a `core-upgrade` that ended (error, or done with the box still behind), a preflight intent that errored, or a stored preflight verdict that refused. A newer release is a new target. This reads the existing intent and snapshot rows; there is no new table. Telling the project owner about a hold, and releasing it, is [task 1004730](https://cloudbongos.com/builders#/task/1004730).
25
+
26
+ **D5 — One platform-wide off switch.** `BONGOS_AUTO_CORE_UPGRADE` (read with `resolveEnv('AUTO_CORE_UPGRADE')`, so `<PREFIX>_AUTO_CORE_UPGRADE` on a re-prefixed hub) in the runner's environment. Unset means **on**. `off` / `0` / `false` / `no` / `disabled` stops every automatic move. Set it in the runner unit's environment (a systemd drop-in) on the hub. The per-project `pinned` rule stays the project-level off switch.
27
+
28
+ ## Consequences
29
+
30
+ - ADR 0293's "it does not make deploys automatic" no longer holds for hosted projects. The gates before it still stand: a project only moves to a version the owner has **released** (ADR 0361), within its rule.
31
+ - Every existing hosted project benefits on the hub's next tick, whatever core it runs, because the step lives on the hub runner.
32
+ - For hosted projects this replaces the hand-kept roster in `config/update-subscriptions.json`. The roster still matters for installs the hub does not run (task 1004150).
33
+ - The automatic move carries no builder id, so its `core_upgrades` ledger row has no `--requested-by`; the intent row says `runner:auto-upgrade`.
34
+ - Rejected: dry-running every behind project every tick (ADR 0293's reason stands: one preflight per target, cached); moving without a preflight; a new settings table for the switch (an env var is the cheapest hub-side toggle and needs no migration).
@@ -499,3 +499,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
499
499
  | 0378 | [**A Lead's build-outs are rows on the record, built at once or by a passed vote** ([task 1004711](https://cloudbongos.com/builders#/task/1004711), goal 1000111). **D1:** `government_buildouts` (government_030): one row per committee room, floor, annex or district, never edited. **D2:** `POST /government/buildouts`: only the building's holder; build-rights says at once (written now, with its ground) or a vote (a `build_out` matter through `openMatter`). **D3:** the vote sits under the board unless the building has its own sitting; a district and the Charter always the board. **D4:** a passed vote builds once; the trigger refuses anything else. **D5:** `GET /government/leads` carries each building's `structure`. **D6:** the hall draws the real site, ghost and tally, and the vote picture from the real building.](0378-a-leads-build-outs-are-rows-built-at-once-or-by-a-passed-vote.md) | government / leads / city |
500
500
  | 0379 | [**The treasury is pots per goal, a reserve, and borrowing, over real spend** ([task 1004712](https://cloudbongos.com/builders#/task/1004712), goal 1000111). **D1:** spend is cost_log through each task's goal, this month, read every time. **D2:** a pot is a budget the Treasury's holder gives a goal (`government_pots`, government_031). **D3:** the reserve is last month's spend no pot was given, less loans; it may be overdrawn. **D4:** a dry pot files a borrow (poller), its ask stored on `treasury_spending:<id>` and routed to the Treasury. **D5:** answered once (lend, half, no) by its seat. **D6:** the spend cap is a project setting, off by default. **D7:** the docket source and the hall's pots, reserve, beacon and book are real.](0379-the-treasury-is-pots-per-goal-a-reserve-and-borrowing-over-real-spend.md) | government / treasury / city |
501
501
  | 0380 | [**A strictness preset is a bundle of laws, switched by one laws vote and read from the laws in force** ([task 1004715](https://cloudbongos.com/builders#/task/1004715), goal 1000111). **D1:** Open workshop, Guild, Factory are catalogues of laws in `presets.js`; every lock names a stored personal setting. **D2:** a switch is ONE laws amendment through `board.proposeLaws` (`POST /government/board/presets`); only its passing writes. **D3:** the preset in force is read from the laws in force, never stored; nothing is seeded. **D4:** `GET /government/presets` says what each would lock; My agents and the Charter are real.](0380-a-strictness-preset-is-a-bundle-of-laws-switched-by-one-laws-vote.md) | government / laws / my agents |
502
+ | 0381 | [**The hub moves each hosted project's core on its own, by that project's update rule** ([task 1004729](https://cloudbongos.com/builders#/task/1004729), goal 1000090). Amends ADR 0293's "not automatic" for hosted projects. **D1:** after each snapshot the runner queues a preflight for `recommended`, then the move once that preflight passed. **D2:** through `enqueueIntent` as `runner:auto-upgrade`; never the control-plane row. **D3:** one automatic intent per tick. **D4:** a target that already failed or was refused is held (read from existing rows; task 1004730 is the richer hold). **D5:** `BONGOS_AUTO_CORE_UPGRADE=off` stops it platform-wide; default on; `pinned` is the per-project switch.](0381-the-hub-moves-each-hosted-project-by-its-update-rule.md) | provisioning / core upgrade / automation |