@bongos/core 1.21.70 → 1.21.71
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 +114 -59
- package/.claude/skills/goal-create/SKILL.md +21 -3
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +5 -3
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/adr/0368-red-and-blue-teams-practice-on-a-range-never-on-live.md +99 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +46 -5
- package/docs/api-reference.md +4 -3
- package/docs/copy-inventory.md +25 -21
- package/docs/copy-registry.json +76 -30
- package/docs/file-map.md +1 -1
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +8 -8
- package/docs/recipes/core-release-pipeline.md +6 -0
- package/docs/recipes/upgrading-the-core.md +2 -0
- package/modules/hall-ui/public/settings-software-update.js +77 -2
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/lifecycle/db-tasks.js +12 -0
- package/modules/lifecycle/goal-spec-task.js +129 -0
- package/modules/lifecycle/routes/goals.js +7 -9
- package/modules/lifecycle/routes/task-write-routes.js +11 -1
- package/modules/lifecycle/upkeep-home.js +55 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +37 -0
- package/scripts/gds/claude-materialize.js +125 -31
- package/scripts/gds/claude-md-template.js +47 -10
- package/scripts/gds/cli-lib.js +4 -4
- package/scripts/gds/feedback-send.js +3 -3
- package/scripts/gds/paste-token.js +1 -1
- package/scripts/gds/provision-net.js +1 -8
- package/scripts/gds/provision-units.js +28 -2
- package/scripts/gds/reauth.js +1 -1
- package/scripts/gds/run-unit-tests.js +3 -0
- package/scripts/gds/setup.js +1 -1
- package/scripts/gds/start.js +4 -4
- package/scripts/gds/surface.js +15 -3
- package/scripts/gds/task.js +32 -5
- package/scripts/gds/upgrade-operator.js +73 -0
- package/scripts/gds/upgrade.js +7 -2
- package/scripts/hall-preview/server.js +3 -0
- package/src/bongos/routes/core-update.js +98 -4
- package/src/bongos/routes/feedback.js +11 -1
- package/src/bongos/upgrade-request.js +158 -0
- package/src/module-api.js +1 -1
- package/tests/claude_materialize.mjs +195 -18
- package/tests/cli_allowlist_permissions.mjs +6 -2
- package/tests/cli_surface.mjs +2 -2
- package/tests/fixtures/page-ledger.mjs +5 -0
- package/tests/goal_admission_override.mjs +1 -1
- package/tests/goal_category.mjs +1 -1
- package/tests/goal_create_spec_entry.mjs +61 -0
- package/tests/goal_spec_task.mjs +197 -0
- package/tests/goal_spec_task_db.mjs +95 -0
- package/tests/provision_settings_apply.mjs +25 -1
- package/tests/software_update.mjs +18 -1
- package/tests/start_env_guard.mjs +2 -2
- package/tests/upgrade_operator.mjs +105 -0
- package/tests/upgrade_request.mjs +348 -0
- package/tests/upkeep_home.mjs +156 -0
package/docs/copy-registry.json
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
6
|
+
"strings": 2593,
|
|
7
|
+
"unique_ids": 2202,
|
|
8
|
+
"certain": 2593,
|
|
9
9
|
"heuristic": 0,
|
|
10
|
-
"duplicate_ids":
|
|
10
|
+
"duplicate_ids": 229
|
|
11
11
|
},
|
|
12
12
|
"surfaces": {
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 133,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1832
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -790,6 +790,16 @@
|
|
|
790
790
|
"modules/hall-ui/public/goals-render.js:1045"
|
|
791
791
|
]
|
|
792
792
|
},
|
|
793
|
+
{
|
|
794
|
+
"id": "1ac8ed08e067",
|
|
795
|
+
"surface": "builders-hall",
|
|
796
|
+
"text": "Ask for this upgrade",
|
|
797
|
+
"occurrences": 2,
|
|
798
|
+
"at": [
|
|
799
|
+
"modules/hall-ui/public/settings-software-update.js:102",
|
|
800
|
+
"modules/hall-ui/public/settings-software-update.js:236"
|
|
801
|
+
]
|
|
802
|
+
},
|
|
793
803
|
{
|
|
794
804
|
"id": "688cc6dd38ee",
|
|
795
805
|
"surface": "builders-hall",
|
|
@@ -3427,6 +3437,24 @@
|
|
|
3427
3437
|
"origin": "js-markup",
|
|
3428
3438
|
"confidence": "certain"
|
|
3429
3439
|
},
|
|
3440
|
+
{
|
|
3441
|
+
"id": "1ac8ed08e067",
|
|
3442
|
+
"surface": "builders-hall",
|
|
3443
|
+
"text": "Ask for this upgrade",
|
|
3444
|
+
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
3445
|
+
"line": 102,
|
|
3446
|
+
"origin": "js-markup",
|
|
3447
|
+
"confidence": "certain"
|
|
3448
|
+
},
|
|
3449
|
+
{
|
|
3450
|
+
"id": "1ac8ed08e067",
|
|
3451
|
+
"surface": "builders-hall",
|
|
3452
|
+
"text": "Ask for this upgrade",
|
|
3453
|
+
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
3454
|
+
"line": 236,
|
|
3455
|
+
"origin": "js-text-assign",
|
|
3456
|
+
"confidence": "certain"
|
|
3457
|
+
},
|
|
3430
3458
|
{
|
|
3431
3459
|
"id": "fa86bf403775",
|
|
3432
3460
|
"surface": "builders-hall",
|
|
@@ -4107,7 +4135,7 @@
|
|
|
4107
4135
|
"surface": "builders-hall",
|
|
4108
4136
|
"text": "Checking for a newer version…",
|
|
4109
4137
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
4110
|
-
"line":
|
|
4138
|
+
"line": 245,
|
|
4111
4139
|
"origin": "js-markup",
|
|
4112
4140
|
"confidence": "certain"
|
|
4113
4141
|
},
|
|
@@ -4755,7 +4783,7 @@
|
|
|
4755
4783
|
"surface": "builders-hall",
|
|
4756
4784
|
"text": "Could not check for a newer version: {…}.",
|
|
4757
4785
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
4758
|
-
"line":
|
|
4786
|
+
"line": 180,
|
|
4759
4787
|
"origin": "js-markup",
|
|
4760
4788
|
"confidence": "certain"
|
|
4761
4789
|
},
|
|
@@ -4764,7 +4792,7 @@
|
|
|
4764
4792
|
"surface": "builders-hall",
|
|
4765
4793
|
"text": "Could not check for updates: {…}.",
|
|
4766
4794
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
4767
|
-
"line":
|
|
4795
|
+
"line": 255,
|
|
4768
4796
|
"origin": "js-markup",
|
|
4769
4797
|
"confidence": "certain"
|
|
4770
4798
|
},
|
|
@@ -5317,6 +5345,15 @@
|
|
|
5317
5345
|
"origin": "js-notice",
|
|
5318
5346
|
"confidence": "certain"
|
|
5319
5347
|
},
|
|
5348
|
+
{
|
|
5349
|
+
"id": "5d2e5fb4c8b5",
|
|
5350
|
+
"surface": "builders-hall",
|
|
5351
|
+
"text": "Could not send the request: {…}.",
|
|
5352
|
+
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
5353
|
+
"line": 237,
|
|
5354
|
+
"origin": "js-text-assign",
|
|
5355
|
+
"confidence": "certain"
|
|
5356
|
+
},
|
|
5320
5357
|
{
|
|
5321
5358
|
"id": "1f4d9a989606",
|
|
5322
5359
|
"surface": "builders-hall",
|
|
@@ -7279,6 +7316,15 @@
|
|
|
7279
7316
|
"origin": "js-markup",
|
|
7280
7317
|
"confidence": "certain"
|
|
7281
7318
|
},
|
|
7319
|
+
{
|
|
7320
|
+
"id": "3c24eedc9f2d",
|
|
7321
|
+
"surface": "builders-hall",
|
|
7322
|
+
"text": "If that page does not let you in, ask {…} to install it for you.{…}",
|
|
7323
|
+
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
7324
|
+
"line": 101,
|
|
7325
|
+
"origin": "js-markup",
|
|
7326
|
+
"confidence": "certain"
|
|
7327
|
+
},
|
|
7282
7328
|
{
|
|
7283
7329
|
"id": "7d6a7de7a69e",
|
|
7284
7330
|
"surface": "builders-hall",
|
|
@@ -7518,7 +7564,7 @@
|
|
|
7518
7564
|
"surface": "builders-hall",
|
|
7519
7565
|
"text": "Its notes could not be read.",
|
|
7520
7566
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
7521
|
-
"line":
|
|
7567
|
+
"line": 146,
|
|
7522
7568
|
"origin": "js-markup",
|
|
7523
7569
|
"confidence": "certain"
|
|
7524
7570
|
},
|
|
@@ -8562,7 +8608,7 @@
|
|
|
8562
8608
|
"surface": "builders-hall",
|
|
8563
8609
|
"text": "No changes are listed for this version.",
|
|
8564
8610
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
8565
|
-
"line":
|
|
8611
|
+
"line": 148,
|
|
8566
8612
|
"origin": "js-markup",
|
|
8567
8613
|
"confidence": "certain"
|
|
8568
8614
|
},
|
|
@@ -8679,7 +8725,7 @@
|
|
|
8679
8725
|
"surface": "builders-hall",
|
|
8680
8726
|
"text": "No notes were packed for this version.",
|
|
8681
8727
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
8682
|
-
"line":
|
|
8728
|
+
"line": 147,
|
|
8683
8729
|
"origin": "js-markup",
|
|
8684
8730
|
"confidence": "certain"
|
|
8685
8731
|
},
|
|
@@ -9390,7 +9436,7 @@
|
|
|
9390
9436
|
"surface": "builders-hall",
|
|
9391
9437
|
"text": "Only the people allowed to upgrade this project see an Update button here.",
|
|
9392
9438
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
9393
|
-
"line":
|
|
9439
|
+
"line": 116,
|
|
9394
9440
|
"origin": "js-markup",
|
|
9395
9441
|
"confidence": "certain"
|
|
9396
9442
|
},
|
|
@@ -9678,7 +9724,7 @@
|
|
|
9678
9724
|
"surface": "builders-hall",
|
|
9679
9725
|
"text": "Opens this project's upgrade{…}: you see what would move, confirm it, and it installs, checks itself, and rolls back if the project does not come back healthy.",
|
|
9680
9726
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
9681
|
-
"line":
|
|
9727
|
+
"line": 130,
|
|
9682
9728
|
"origin": "js-markup",
|
|
9683
9729
|
"confidence": "certain"
|
|
9684
9730
|
},
|
|
@@ -11541,7 +11587,7 @@
|
|
|
11541
11587
|
"surface": "builders-hall",
|
|
11542
11588
|
"text": "Show {…} more version{…}",
|
|
11543
11589
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
11544
|
-
"line":
|
|
11590
|
+
"line": 164,
|
|
11545
11591
|
"origin": "js-markup",
|
|
11546
11592
|
"confidence": "certain"
|
|
11547
11593
|
},
|
|
@@ -12927,7 +12973,7 @@
|
|
|
12927
12973
|
"surface": "builders-hall",
|
|
12928
12974
|
"text": "The release notes could not be read: {…}. The versions are still listed.",
|
|
12929
12975
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
12930
|
-
"line":
|
|
12976
|
+
"line": 160,
|
|
12931
12977
|
"origin": "js-markup",
|
|
12932
12978
|
"confidence": "certain"
|
|
12933
12979
|
},
|
|
@@ -13647,7 +13693,16 @@
|
|
|
13647
13693
|
"surface": "builders-hall",
|
|
13648
13694
|
"text": "This project is upgraded on the server that runs it:",
|
|
13649
13695
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
13650
|
-
"line":
|
|
13696
|
+
"line": 121,
|
|
13697
|
+
"origin": "js-markup",
|
|
13698
|
+
"confidence": "certain"
|
|
13699
|
+
},
|
|
13700
|
+
{
|
|
13701
|
+
"id": "53e287924841",
|
|
13702
|
+
"surface": "builders-hall",
|
|
13703
|
+
"text": "This project runs on a server that {…} looks after, so they install its updates. Ask them for this one and they are told which version you want.{…}",
|
|
13704
|
+
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
13705
|
+
"line": 100,
|
|
13651
13706
|
"origin": "js-markup",
|
|
13652
13707
|
"confidence": "certain"
|
|
13653
13708
|
},
|
|
@@ -13998,16 +14053,7 @@
|
|
|
13998
14053
|
"surface": "builders-hall",
|
|
13999
14054
|
"text": "Up to date",
|
|
14000
14055
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
14001
|
-
"line":
|
|
14002
|
-
"origin": "js-markup",
|
|
14003
|
-
"confidence": "certain"
|
|
14004
|
-
},
|
|
14005
|
-
{
|
|
14006
|
-
"id": "13ced9b2fa12",
|
|
14007
|
-
"surface": "builders-hall",
|
|
14008
|
-
"text": "Update ready",
|
|
14009
|
-
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
14010
|
-
"line": 145,
|
|
14056
|
+
"line": 187,
|
|
14011
14057
|
"origin": "js-markup",
|
|
14012
14058
|
"confidence": "certain"
|
|
14013
14059
|
},
|
|
@@ -14025,7 +14071,7 @@
|
|
|
14025
14071
|
"surface": "builders-hall",
|
|
14026
14072
|
"text": "Update to {…}{…}",
|
|
14027
14073
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
14028
|
-
"line":
|
|
14074
|
+
"line": 130,
|
|
14029
14075
|
"origin": "js-markup",
|
|
14030
14076
|
"confidence": "certain"
|
|
14031
14077
|
},
|
|
@@ -15609,7 +15655,7 @@
|
|
|
15609
15655
|
"surface": "builders-hall",
|
|
15610
15656
|
"text": "bongos upgrade",
|
|
15611
15657
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
15612
|
-
"line":
|
|
15658
|
+
"line": 121,
|
|
15613
15659
|
"origin": "js-markup",
|
|
15614
15660
|
"confidence": "certain"
|
|
15615
15661
|
},
|
|
@@ -17454,7 +17500,7 @@
|
|
|
17454
17500
|
"surface": "builders-hall",
|
|
17455
17501
|
"text": "there takes this version, with the same health check and rollback.",
|
|
17456
17502
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
17457
|
-
"line":
|
|
17503
|
+
"line": 121,
|
|
17458
17504
|
"origin": "js-markup",
|
|
17459
17505
|
"confidence": "certain"
|
|
17460
17506
|
},
|
|
@@ -18714,7 +18760,7 @@
|
|
|
18714
18760
|
"surface": "builders-hall",
|
|
18715
18761
|
"text": "…and {…} older version{…}, also in this update.",
|
|
18716
18762
|
"file": "modules/hall-ui/public/settings-software-update.js",
|
|
18717
|
-
"line":
|
|
18763
|
+
"line": 165,
|
|
18718
18764
|
"origin": "js-markup",
|
|
18719
18765
|
"confidence": "certain"
|
|
18720
18766
|
},
|
package/docs/file-map.md
CHANGED
|
@@ -398,7 +398,7 @@ tests/
|
|
|
398
398
|
├── figma-design-sync/SKILL.md ← sync UI-surface tokens/surfaces with Figma (push a frame plan, land a designer's Code Connect / MCP snapshot edit back as code) — the ADR 0081 human escape hatch; distinct from otb-figma-sync's pixel-art tile review (task 2048)
|
|
399
399
|
├── fix-task/SKILL.md ← /fix-task N — claim, fix (test-first), verify, and ship a single Bongos task by id end to end; defers to /builder-claim + /builder-ship for their own mechanics
|
|
400
400
|
├── goal-close/SKILL.md ← /goal-close — HIDDEN (typed-only); the merged goal-uat + goal-review: Part 1 tests criteria awaiting UAT on the live site and signs them off, Part 2 decides the ones a UAT cannot close (abandoned or unlinked work) (task 1004471, ADR 0351); Metic+
|
|
401
|
-
├── goal-create/SKILL.md ← /goal-create — plan and create ONE goal (the module-scoped workspace between version and criteria, ADR 0086) in one session: <redacted>, scope wall, 2-4 criteria, seed tasks; also the auto-pickup when a task is created with no goal to live in (goal_advisory); Metic+ (Archon for a protected-module scope)
|
|
401
|
+
├── goal-create/SKILL.md ← /goal-create — plan and create ONE goal (the module-scoped workspace between version and criteria, ADR 0086) in one session: <redacted>, scope wall, 2-4 criteria, seed tasks; also the auto-pickup when a task is created with no goal to live in (goal_advisory), and finishing a hall-made goal's Spec goal N task (ADR 0366 D3); Metic+ (Archon for a protected-module scope)
|
|
402
402
|
├── goal-review/SKILL.md ← /goal-review — HIDDEN alias (task 1004471): runs Part 2 (the residue a UAT cannot close) of /goal-close, so the old name still works when typed
|
|
403
403
|
├── goal-uat/SKILL.md ← /goal-uat — HIDDEN alias (task 1004471): runs Part 1 (UAT sign-off) of /goal-close, so the old name still works when typed
|
|
404
404
|
├── grade-audit/SKILL.md ← /grade-audit — HIDDEN alias (task 1004471): runs Part B (the accountability audit) of /grade-sweep, so the old name still works when typed
|
|
@@ -2972,5 +2972,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2972
2972
|
landed since 1.21.68 with no explicit bump. run 37516251453. (task 1002620)
|
|
2973
2973
|
1.21.70 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2974
2974
|
landed since 1.21.69 with no explicit bump. run 37524456209. (task 1002620)
|
|
2975
|
+
1.21.71 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2976
|
+
landed since 1.21.70 with no explicit bump. run 37533415950. (task 1002620)
|
|
2975
2977
|
---------------------------------------------------------------------------
|
|
2976
2978
|
```
|
package/docs/page-readings.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"adr": "0341 D3",
|
|
6
6
|
"reread": "node scripts/gds/page-reader.js --stale",
|
|
7
7
|
"how": ["Generated by node scripts/gds/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
|
|
8
|
-
"counts": {"pages":44,"lines":5087,"placed":
|
|
8
|
+
"counts": {"pages":44,"lines":5087,"placed":1610,"shared":405,"unplaced":3072,"omitted_data":2521},
|
|
9
9
|
"pages": [
|
|
10
10
|
{
|
|
11
11
|
"id": "builders:atlas",
|
|
@@ -2904,16 +2904,16 @@
|
|
|
2904
2904
|
"surface": "builders",
|
|
2905
2905
|
"title": "Settings",
|
|
2906
2906
|
"states_read": ["account","access","preferences","skills-walkthrough","offered-skills","sound","update"],
|
|
2907
|
-
"files_hash": "
|
|
2907
|
+
"files_hash": "37af1f8d2514152d",
|
|
2908
2908
|
"reading_hash": "da05f30e2cf4c979",
|
|
2909
|
-
"counts": {"lines":166,"placed":
|
|
2909
|
+
"counts": {"lines":166,"placed":107,"shared":9,"unplaced":50},
|
|
2910
2910
|
"omitted": {"data":68},
|
|
2911
2911
|
"notes": ["skills-walkthrough: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","offered-skills: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood"],
|
|
2912
2912
|
"lines": [
|
|
2913
2913
|
{"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":811,"string_id":"87cee78ca134"},
|
|
2914
2914
|
{"key":"L0002","section":"top bar","text":"Settings","placement":"shared"},
|
|
2915
2915
|
{"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":495,"string_id":"eba610d25523"},
|
|
2916
|
-
{"key":"L0004","section":"top bar","text":"
|
|
2916
|
+
{"key":"L0004","section":"top bar","text":"⌘K","placement":"shared"},
|
|
2917
2917
|
{"key":"L0005","section":"top bar","text":"Building","placement":"shared"},
|
|
2918
2918
|
{"key":"L0006","section":"top bar","text":"Artistry","placement":"shared"},
|
|
2919
2919
|
{"key":"L0007","section":"top bar","text":"Ideating","placement":"shared"},
|
|
@@ -2929,15 +2929,15 @@
|
|
|
2929
2929
|
{"key":"L0017","section":"Software update","text":"Which version of Cloud Bongos this project runs, whether a newer one is ready for it, and what each newer version brings.","placement":"placed","file":"modules/hall-ui/public/settings.html","line":409,"string_id":"68da8cb13058","state":"update"},
|
|
2930
2930
|
{"key":"L0018","section":"Software update","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","state":"update","occurrences":2},
|
|
2931
2931
|
{"key":"L0019","section":"Software update","text":"— published 21 hours ago","placement":"unplaced","state":"update"},
|
|
2932
|
-
{"key":"L0020","section":"Software update","text":"Update ready","placement":"
|
|
2933
|
-
{"key":"L0021","section":"Software update","text":"Update to {…}{…}","placement":"placed","file":"modules/hall-ui/public/settings-software-update.js","line":
|
|
2934
|
-
{"key":"L0022","section":"Software update","text":"Opens this project's upgrade{…}: you see what would move, confirm it, and it installs, checks itself, and rolls back if the project does not come back healthy.","placement":"placed","file":"modules/hall-ui/public/settings-software-update.js","line":
|
|
2932
|
+
{"key":"L0020","section":"Software update","text":"Update ready","placement":"unplaced","state":"update"},
|
|
2933
|
+
{"key":"L0021","section":"Software update","text":"Update to {…}{…}","placement":"placed","file":"modules/hall-ui/public/settings-software-update.js","line":130,"string_id":"55fde21d907b","state":"update"},
|
|
2934
|
+
{"key":"L0022","section":"Software update","text":"Opens this project's upgrade{…}: you see what would move, confirm it, and it installs, checks itself, and rolls back if the project does not come back healthy.","placement":"placed","file":"modules/hall-ui/public/settings-software-update.js","line":130,"string_id":"a2bd76ae030d","state":"update"},
|
|
2935
2935
|
{"key":"L0023","section":"What's new in these 7 versions","text":"What's new in these 7 versions","placement":"unplaced","state":"update"},
|
|
2936
2936
|
{"key":"L0024","section":"What's new in these 7 versions","text":"published 21 hours ago","placement":"unplaced","state":"update"},
|
|
2937
2937
|
{"key":"L0025","section":"What's new in these 7 versions","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"update","occurrences":6},
|
|
2938
2938
|
{"key":"L0026","section":"What's new in these 7 versions","text":"published 28 hours ago","placement":"unplaced","state":"update","occurrences":4},
|
|
2939
2939
|
{"key":"L0027","section":"What's new in these 7 versions","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","state":"update","occurrences":3},
|
|
2940
|
-
{"key":"L0028","section":"What's new in these 7 versions","text":"Show {…} more version{…}","placement":"placed","file":"modules/hall-ui/public/settings-software-update.js","line":
|
|
2940
|
+
{"key":"L0028","section":"What's new in these 7 versions","text":"Show {…} more version{…}","placement":"placed","file":"modules/hall-ui/public/settings-software-update.js","line":164,"string_id":"44945da22716","state":"update"},
|
|
2941
2941
|
{"key":"L0029","section":"What's new in these 7 versions","text":"Checked 20 hours ago.","placement":"unplaced","state":"update"},
|
|
2942
2942
|
{"key":"L0030","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":471,"string_id":"1883ad7f07fc","state":"update","occurrences":5},
|
|
2943
2943
|
{"key":"L0031","section":"What's new in these 7 versions","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":352,"string_id":"fd1903586e8e","state":"update"},
|
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
>
|
|
7
7
|
> A change that has landed on `main` is running on **zero** instances. It reaches users only after someone bumps `CORE_VERSION`, cuts an artifact, and moves an instance's pin. Those are three separate acts by design ([ADR 0137](../adr/0137-upstream-publish-policy-manual-owner-gated.md)) — and every layer around them reports success in the meantime.
|
|
8
8
|
|
|
9
|
+
> ## Working on a hosted project? Stop here — nothing in this file is yours to run.
|
|
10
|
+
>
|
|
11
|
+
> If the project you are building is run for you by an operator (it lives on their server; `bongos doctor` says *"Deploy mode: laptop — the operator lands ships"*; `bongos upgrade` says *"This project is upgraded by its operator"*), **the operator upgrades it**. Every command below runs on that server, which you cannot reach. The supported path is to ask: open **Settings → Software update** in the project and use the button there, or from a terminal run `bongos feedback "Please upgrade this project to the latest version"`.
|
|
12
|
+
>
|
|
13
|
+
> **For an assistant:** do not turn this recipe into steps for that builder — no ssh, no "log in as the account that owns the directory", and never a guessed database, service or health-check name. A placeholder you cannot fill in is a sign you are on the wrong path (task 1004596).
|
|
14
|
+
|
|
9
15
|
## Why this file exists
|
|
10
16
|
|
|
11
17
|
Between 2026-07-24 and 2026-08-03, **93 work commits (171 counting merges) — including the entire governance permission system — sat on `main` unreleased for ten days** while the live platform served the previous version. Nothing was broken. `/builder-ship` printed success, the publish-reconciler flipped `confirmed → shipped`, credits paid out. Every signal a builder could see said "delivered"; nothing compared live against `main` (blocker 1000097, task [1002521](https://example.com/builders#/task/1002521)).
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
>
|
|
5
5
|
> The R86 update-consumption channel ([ADR 0100](../adr/0100-two-repo-instance-model.md) §2, [ADR 0103](../adr/0103-core-first-extraction-cloud-bongos-trunk.md) §4, task [#1690](https://example.com/builders#/task/1690)). How a **two-repo consumer instance** — one that installs `@bongos/core` as a vendored-tarball dependency — pulls the core from version N → N+1. Tooling: [`scripts/gds/upgrade.js`](../../scripts/gds/upgrade.js) (`bongos upgrade`). First proven live on emersonian-circles 1.15.0 → 1.16.0 (task [#1976](https://example.com/builders#/task/1976)).
|
|
6
6
|
|
|
7
|
+
> **Not for a hosted project's builders.** Everything here runs on the server where the project lives. On a project its operator runs, `bongos upgrade` from your own computer says so and stops; ask for the upgrade through **Settings → Software update** or `bongos feedback "…"` instead — never write server steps or guess its names (task 1004596; [the release pipeline](core-release-pipeline.md) has the detail).
|
|
8
|
+
|
|
7
9
|
## What the channel does
|
|
8
10
|
|
|
9
11
|
`bongos upgrade --to <version> --from <tgz>` runs, from a consumer instance root:
|
|
@@ -65,6 +65,49 @@
|
|
|
65
65
|
</div>`;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// "Ask for this upgrade" (task 1004595). A project the hub's operator runs cannot take an
|
|
69
|
+
// update itself, so instead of a dead end the page offers one press that reaches the people
|
|
70
|
+
// who run its server, and then says that it was asked. The server decides whether it is
|
|
71
|
+
// offered (`ask.available`) and remembers the request (`ask.requested`).
|
|
72
|
+
function longDate(iso) {
|
|
73
|
+
const d = new Date(iso);
|
|
74
|
+
if (!Number.isFinite(d.getTime())) return null;
|
|
75
|
+
try { return d.toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric' }); } catch (e) { return d.toISOString().slice(0, 10); }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Asked, and still waiting: for this very version, or recently enough that asking again
|
|
79
|
+
// would only be refused.
|
|
80
|
+
function askPending(ask, offered) {
|
|
81
|
+
const r = ask && ask.requested;
|
|
82
|
+
if (!r) return false;
|
|
83
|
+
if (r.version === offered) return true;
|
|
84
|
+
const again = Date.parse(ask.ask_again_after);
|
|
85
|
+
return Number.isFinite(again) && Date.now() < again;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function askHtml(ask, offered, { lead }) {
|
|
89
|
+
const team = ask.hub_host ? `the team at ${escapeHtml(ask.hub_host)}` : 'the team that runs this project\'s server';
|
|
90
|
+
if (askPending(ask, offered)) {
|
|
91
|
+
const r = ask.requested;
|
|
92
|
+
const when = longDate(r.requested_at);
|
|
93
|
+
return `<div class="su-door su-ask">
|
|
94
|
+
<p class="panel-status panel-status--ok" role="status">Upgrade requested${when ? ` on ${escapeHtml(when)}` : ''}${r.by ? ` by @${escapeHtml(r.by)}` : ''}, for version ${mono(r.version)}. ${team.charAt(0).toUpperCase() + team.slice(1)} has your request. This page shows the new version once it is installed.</p>
|
|
95
|
+
</div>`;
|
|
96
|
+
}
|
|
97
|
+
const last = ask.requested && longDate(ask.requested.requested_at);
|
|
98
|
+
const before = last ? ` You last asked on ${escapeHtml(last)}, for ${mono(ask.requested.version)}.` : '';
|
|
99
|
+
const intro = lead
|
|
100
|
+
? `<p class="panel-hint">This project runs on a server that ${team} looks after, so they install its updates. Ask them for this one and they are told which version you want.${before}</p>`
|
|
101
|
+
: `<p class="panel-hint">If that page does not let you in, ask ${team} to install it for you.${before}</p>`;
|
|
102
|
+
return `<div class="su-door su-ask">
|
|
103
|
+
${intro}
|
|
104
|
+
<div class="row-end">
|
|
105
|
+
<button type="button" class="pbtn ${lead ? 'pbtn--save' : 'pbtn--quiet'}" id="su-ask">Ask for this upgrade</button>
|
|
106
|
+
<span class="panel-hint" id="su-ask-status" role="status"></span>
|
|
107
|
+
</div>
|
|
108
|
+
</div>`;
|
|
109
|
+
}
|
|
110
|
+
|
|
68
111
|
// Where the Update button goes, and what it says it will do. Only a plain same-origin path
|
|
69
112
|
// or an http(s) URL is ever put in an href; anything else draws no button.
|
|
70
113
|
function doorHtml(data, offered) {
|
|
@@ -72,7 +115,9 @@
|
|
|
72
115
|
if (!data.can_update) {
|
|
73
116
|
return '<p class="panel-hint su-door">Only the people allowed to upgrade this project see an Update button here.</p>';
|
|
74
117
|
}
|
|
118
|
+
const ask = data.ask || {};
|
|
75
119
|
if (door.kind === 'cli') {
|
|
120
|
+
if (ask.available) return askHtml(ask, offered, { lead: true });
|
|
76
121
|
return '<p class="panel-hint su-door">This project is upgraded on the server that runs it: <code>bongos upgrade</code> there takes this version, with the same health check and rollback.</p>';
|
|
77
122
|
}
|
|
78
123
|
const url = String(door.url || '');
|
|
@@ -85,7 +130,7 @@
|
|
|
85
130
|
return `<div class="row-end su-door">
|
|
86
131
|
<a class="pbtn pbtn--save" id="su-update" href="${escapeHtml(url)}">Update to ${escapeHtml(offered)}${sameOrigin ? '' : ' ↗'}</a>
|
|
87
132
|
<span class="panel-hint">Opens this project's upgrade${escapeHtml(where)}: you see what would move, confirm it, and it installs, checks itself, and rolls back if the project does not come back healthy.</span>
|
|
88
|
-
</div
|
|
133
|
+
</div>${door.kind === 'hub' && ask.available ? askHtml(ask, offered, { lead: false }) : ''}`;
|
|
89
134
|
}
|
|
90
135
|
|
|
91
136
|
// One entry: its text, and — only in the hall whose ledger the ids belong to, which is
|
|
@@ -142,7 +187,8 @@
|
|
|
142
187
|
html += row('Newest for this project', `${mono(u.running)} — this project is up to date.`, '<span class="su-pill su-pill--ok">Up to date</span>');
|
|
143
188
|
} else {
|
|
144
189
|
const when = ago(u.offered_published_at);
|
|
145
|
-
|
|
190
|
+
const pending = data.can_update && data.ask && data.ask.available && askPending(data.ask, u.offered);
|
|
191
|
+
html += row('Newest for this project', `${mono(u.offered)}${when ? ` — published ${escapeHtml(when)}` : ''}`, `<span class="su-pill">${pending ? 'Requested' : 'Update ready'}</span>`);
|
|
146
192
|
html += doorHtml(data, u.offered);
|
|
147
193
|
html += whatsNewHtml(u.whats_new, (data.door || {}).kind === 'local');
|
|
148
194
|
}
|
|
@@ -154,6 +200,9 @@
|
|
|
154
200
|
body.innerHTML = html;
|
|
155
201
|
if (note) note.textContent = notes.join(' ');
|
|
156
202
|
|
|
203
|
+
const askBtn = byId('su-ask');
|
|
204
|
+
if (askBtn) askBtn.addEventListener('click', () => askForUpgrade(data, askBtn));
|
|
205
|
+
|
|
157
206
|
const more = byId('su-more');
|
|
158
207
|
if (more) {
|
|
159
208
|
more.addEventListener('click', () => {
|
|
@@ -163,6 +212,32 @@
|
|
|
163
212
|
}
|
|
164
213
|
}
|
|
165
214
|
|
|
215
|
+
// One press: the server sends the request and remembers it; the panel redraws from its
|
|
216
|
+
// answer. "Asked recently" carries the stored request, so it redraws as pending too.
|
|
217
|
+
async function askForUpgrade(data, btn) {
|
|
218
|
+
const status = byId('su-ask-status');
|
|
219
|
+
btn.disabled = true;
|
|
220
|
+
btn.textContent = 'Asking…';
|
|
221
|
+
if (status) status.textContent = '';
|
|
222
|
+
try {
|
|
223
|
+
const res = await api.request('POST', `${API}/software-update/request`, { body: {} });
|
|
224
|
+
const err = (res.data && res.data.error) || {};
|
|
225
|
+
const request = (res.data && res.data.request) || (err.details && err.details.request);
|
|
226
|
+
if ((res.ok || res.status === 429) && request) {
|
|
227
|
+
const again = new Date(Date.parse(request.requested_at) + 24 * 3600 * 1000).toISOString();
|
|
228
|
+
render({ ...data, ask: { ...data.ask, requested: request, ask_again_after: again } });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// Every refusal the server sends carries a sentence; a bare code is only ever a
|
|
232
|
+
// proxy or a crash, so the status stands in for it.
|
|
233
|
+
throw new Error(err.message && err.message !== err.code ? err.message : `HTTP ${res.status}`);
|
|
234
|
+
} catch (e) {
|
|
235
|
+
btn.disabled = false;
|
|
236
|
+
btn.textContent = 'Ask for this upgrade';
|
|
237
|
+
if (status) status.textContent = `Could not send the request: ${String(e.message || 'unknown error').replace(/\.$/, '')}.`;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
166
241
|
async function load() {
|
|
167
242
|
if (asked) return;
|
|
168
243
|
asked = true;
|
|
@@ -461,7 +461,7 @@
|
|
|
461
461
|
settings.js is against the 1500-line ratchet. -->
|
|
462
462
|
<script src="/builders/settings-render.js?v=2026-09-16-render-levels"></script>
|
|
463
463
|
<!-- task 1004296: Settings → Software update. Own file on the same precedent. -->
|
|
464
|
-
<script src="/builders/settings-software-update.js?v=2026-
|
|
464
|
+
<script src="/builders/settings-software-update.js?v=2026-10-06-ask"></script>
|
|
465
465
|
<!-- task 1004501: Settings → Your Autobongos runner. Own file on the same precedent. -->
|
|
466
466
|
<script src="/builders/settings-autobongos.js?v=2026-10-01-autobongos"></script>
|
|
467
467
|
</body>
|
|
@@ -20,6 +20,7 @@ const { deriveRequiredRank, highestRank } = require('./db-rank-authz.js');
|
|
|
20
20
|
const { executorFor } = require('./db-executor.js');
|
|
21
21
|
const { isReservedCriterionSlug } = require('./criterion-ref.js');
|
|
22
22
|
const { resolveWriteDiscipline, WRITABLE_DISCIPLINES } = require('./task-classifier.js');
|
|
23
|
+
const { gateOnSpecTask } = require('./goal-spec-task.js');
|
|
23
24
|
|
|
24
25
|
// -------------------------------------------------------------------------
|
|
25
26
|
// Tasks
|
|
@@ -293,6 +294,10 @@ async function createTask({
|
|
|
293
294
|
`[reward-gate] AUTO-ASSIGN task ${rows[0].id} credits_reward -> ${creditsRewardEffective} (cap ${REWARD_SUGGESTION_CAP}) [creation]`
|
|
294
295
|
);
|
|
295
296
|
}
|
|
297
|
+
// task 1004585 / ADR 0366 D3: a task born into a goal whose spec task is still
|
|
298
|
+
// open waits on it. Here, at the lowest create layer, so every vector inherits it;
|
|
299
|
+
// inside the caller's transaction when there is one, like the INSERT above.
|
|
300
|
+
if (rows[0]) await gateOnSpecTask(rows[0], deps.client || pool);
|
|
296
301
|
return rows[0];
|
|
297
302
|
}
|
|
298
303
|
|
|
@@ -417,6 +422,13 @@ async function updateTaskGoal(id, goalId) {
|
|
|
417
422
|
`UPDATE tasks SET goal_id = $1, updated_at = now() WHERE id = $2 RETURNING *`,
|
|
418
423
|
[goalId, id]
|
|
419
424
|
);
|
|
425
|
+
// task 1004585: a task MOVED into a goal waits on its open spec task too. Through
|
|
426
|
+
// addTaskDependency (lazy — it lives beside this file), because a moved task may
|
|
427
|
+
// already have dependents and the edge must pass the cycle check.
|
|
428
|
+
if (rows[0]) {
|
|
429
|
+
const { addTaskDependency } = require('./db-deps-criteria.js');
|
|
430
|
+
await gateOnSpecTask(rows[0], pool, { addTaskDependency });
|
|
431
|
+
}
|
|
420
432
|
return rows[0] ?? null;
|
|
421
433
|
}
|
|
422
434
|
|