@bongos/core 1.24.68 → 1.24.70

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.
Files changed (36) hide show
  1. package/.bongos-core.json +58 -38
  2. package/clients/bongos-client/index.d.ts +1 -1
  3. package/docs/adr/0029-status-page-outage-resilience.md +2 -2
  4. package/docs/api/openapi.json +4 -2
  5. package/docs/copy-inventory.md +36 -32
  6. package/docs/copy-registry.json +86 -50
  7. package/docs/module-api-changelog.md +2 -0
  8. package/docs/page-readings.json +7 -7
  9. package/docs/recipes/core-release-pipeline.md +3 -3
  10. package/modules/hall-ui/public/settings.js +49 -5
  11. package/modules/lifecycle/merge-reach.js +15 -8
  12. package/package-lock.json +2 -2
  13. package/package.json +1 -1
  14. package/release-notes.json +34 -0
  15. package/scripts/bongos/claim.js +16 -5
  16. package/scripts/bongos/deploy-divergence.js +5 -3
  17. package/scripts/bongos/docs-entropy.js +4 -1
  18. package/scripts/bongos/fitness-lib.js +19 -1
  19. package/scripts/bongos/paste-token.js +75 -4
  20. package/scripts/bongos/ship-check.js +11 -3
  21. package/src/bongos/device-flow-blocker.js +56 -0
  22. package/src/bongos/routes/auth.js +5 -0
  23. package/src/instance-config.js +7 -10
  24. package/src/module-api.js +1 -1
  25. package/tests/agent_standing_rules.mjs +14 -0
  26. package/tests/bongos_cli.mjs +2 -1
  27. package/tests/claim_finish_hint.mjs +50 -0
  28. package/tests/cli_token_reissue.mjs +4 -2
  29. package/tests/deploy_divergence_line.mjs +5 -1
  30. package/tests/hall_onboarding_bongos_setup.mjs +3 -1
  31. package/tests/hall_settings_world.mjs +2 -2
  32. package/tests/instance_config.mjs +32 -1
  33. package/tests/paste_token_windows.mjs +165 -0
  34. package/tests/shell_hooks.mjs +7 -0
  35. package/tests/status_mirror_sync.mjs +22 -1
  36. package/tests/vendored_work_root.mjs +72 -0
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/bongos/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 3133,
7
- "unique_ids": 2474,
8
- "certain": 3133,
6
+ "strings": 3137,
7
+ "unique_ids": 2478,
8
+ "certain": 3137,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 262
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 171,
16
- "strings": 2021
16
+ "strings": 2025
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -723,7 +723,7 @@
723
723
  "modules/hall-ui/public/settings-usage-reports.js:67",
724
724
  "modules/hall-ui/public/settings.js:401",
725
725
  "modules/hall-ui/public/settings.js:489",
726
- "modules/hall-ui/public/settings.js:773"
726
+ "modules/hall-ui/public/settings.js:817"
727
727
  ]
728
728
  },
729
729
  {
@@ -1462,7 +1462,7 @@
1462
1462
  "occurrences": 2,
1463
1463
  "at": [
1464
1464
  "modules/hall-ui/public/settings-ai-keys.js:101",
1465
- "modules/hall-ui/public/settings.js:834"
1465
+ "modules/hall-ui/public/settings.js:878"
1466
1466
  ]
1467
1467
  },
1468
1468
  {
@@ -1472,7 +1472,7 @@
1472
1472
  "occurrences": 2,
1473
1473
  "at": [
1474
1474
  "modules/hall-ui/public/settings-ai-keys.js:88",
1475
- "modules/hall-ui/public/settings.js:774"
1475
+ "modules/hall-ui/public/settings.js:818"
1476
1476
  ]
1477
1477
  },
1478
1478
  {
@@ -1752,7 +1752,7 @@
1752
1752
  "occurrences": 2,
1753
1753
  "at": [
1754
1754
  "modules/hall-ui/public/settings-ai-keys.js:102",
1755
- "modules/hall-ui/public/settings.js:829"
1755
+ "modules/hall-ui/public/settings.js:873"
1756
1756
  ]
1757
1757
  },
1758
1758
  {
@@ -2042,7 +2042,7 @@
2042
2042
  "occurrences": 2,
2043
2043
  "at": [
2044
2044
  "modules/hall-ui/public/settings-ai-keys.js:78",
2045
- "modules/hall-ui/public/settings.js:749"
2045
+ "modules/hall-ui/public/settings.js:793"
2046
2046
  ]
2047
2047
  },
2048
2048
  {
@@ -2222,7 +2222,7 @@
2222
2222
  "occurrences": 2,
2223
2223
  "at": [
2224
2224
  "modules/hall-ui/public/settings-ai-keys.js:21",
2225
- "modules/hall-ui/public/settings.js:685"
2225
+ "modules/hall-ui/public/settings.js:729"
2226
2226
  ]
2227
2227
  },
2228
2228
  {
@@ -2552,7 +2552,7 @@
2552
2552
  "occurrences": 2,
2553
2553
  "at": [
2554
2554
  "modules/hall-ui/public/settings.js:483",
2555
- "modules/hall-ui/public/settings.js:1043"
2555
+ "modules/hall-ui/public/settings.js:1087"
2556
2556
  ]
2557
2557
  },
2558
2558
  {
@@ -4925,7 +4925,7 @@
4925
4925
  "surface": "builders-hall",
4926
4926
  "text": "Checking your key…",
4927
4927
  "file": "modules/hall-ui/public/settings.js",
4928
- "line": 750,
4928
+ "line": 794,
4929
4929
  "origin": "js-text-assign",
4930
4930
  "confidence": "certain"
4931
4931
  },
@@ -5307,6 +5307,15 @@
5307
5307
  "origin": "js-text-assign",
5308
5308
  "confidence": "certain"
5309
5309
  },
5310
+ {
5311
+ "id": "0279e7634291",
5312
+ "surface": "builders-hall",
5313
+ "text": "Copy command",
5314
+ "file": "modules/hall-ui/public/settings.js",
5315
+ "line": 657,
5316
+ "origin": "js-text-assign",
5317
+ "confidence": "certain"
5318
+ },
5310
5319
  {
5311
5320
  "id": "12ee050d0180",
5312
5321
  "surface": "builders-hall",
@@ -5469,6 +5478,15 @@
5469
5478
  "origin": "js-markup",
5470
5479
  "confidence": "certain"
5471
5480
  },
5481
+ {
5482
+ "id": "8a1c2e87fc2d",
5483
+ "surface": "builders-hall",
5484
+ "text": "Copy token",
5485
+ "file": "modules/hall-ui/public/settings.js",
5486
+ "line": 660,
5487
+ "origin": "js-text-assign",
5488
+ "confidence": "certain"
5489
+ },
5472
5490
  {
5473
5491
  "id": "301afa9a94b9",
5474
5492
  "surface": "builders-hall",
@@ -5564,7 +5582,7 @@
5564
5582
  "surface": "builders-hall",
5565
5583
  "text": "Could not copy automatically — select and copy manually. ({…})",
5566
5584
  "file": "modules/hall-ui/public/settings.js",
5567
- "line": 629,
5585
+ "line": 670,
5568
5586
  "origin": "js-notice",
5569
5587
  "confidence": "certain"
5570
5588
  },
@@ -5771,7 +5789,7 @@
5771
5789
  "surface": "builders-hall",
5772
5790
  "text": "Could not load your account. Reload the page to try again.",
5773
5791
  "file": "modules/hall-ui/public/settings.js",
5774
- "line": 1026,
5792
+ "line": 1070,
5775
5793
  "origin": "js-text-assign",
5776
5794
  "confidence": "certain"
5777
5795
  },
@@ -5807,7 +5825,7 @@
5807
5825
  "surface": "builders-hall",
5808
5826
  "text": "Could not load your settings.",
5809
5827
  "file": "modules/hall-ui/public/settings.js",
5810
- "line": 1029,
5828
+ "line": 1073,
5811
5829
  "origin": "js-notice",
5812
5830
  "confidence": "certain"
5813
5831
  },
@@ -5915,7 +5933,7 @@
5915
5933
  "surface": "builders-hall",
5916
5934
  "text": "Could not remove your key. Try again.",
5917
5935
  "file": "modules/hall-ui/public/settings.js",
5918
- "line": 834,
5936
+ "line": 878,
5919
5937
  "origin": "js-notice",
5920
5938
  "confidence": "certain"
5921
5939
  },
@@ -5924,7 +5942,7 @@
5924
5942
  "surface": "builders-hall",
5925
5943
  "text": "Could not remove. Try again.",
5926
5944
  "file": "modules/hall-ui/public/settings.js",
5927
- "line": 833,
5945
+ "line": 877,
5928
5946
  "origin": "js-text-assign",
5929
5947
  "confidence": "certain"
5930
5948
  },
@@ -5996,7 +6014,7 @@
5996
6014
  "surface": "builders-hall",
5997
6015
  "text": "Could not save your key. Try again.",
5998
6016
  "file": "modules/hall-ui/public/settings.js",
5999
- "line": 774,
6017
+ "line": 818,
6000
6018
  "origin": "js-notice",
6001
6019
  "confidence": "certain"
6002
6020
  },
@@ -6077,7 +6095,7 @@
6077
6095
  "surface": "builders-hall",
6078
6096
  "text": "Could not save. Try again.",
6079
6097
  "file": "modules/hall-ui/public/settings.js",
6080
- "line": 773,
6098
+ "line": 817,
6081
6099
  "origin": "js-text-assign",
6082
6100
  "confidence": "certain"
6083
6101
  },
@@ -6113,7 +6131,7 @@
6113
6131
  "surface": "builders-hall",
6114
6132
  "text": "Could not set up key storage. Try again.",
6115
6133
  "file": "modules/hall-ui/public/settings.js",
6116
- "line": 810,
6134
+ "line": 854,
6117
6135
  "origin": "js-notice",
6118
6136
  "confidence": "certain"
6119
6137
  },
@@ -6122,7 +6140,7 @@
6122
6140
  "surface": "builders-hall",
6123
6141
  "text": "Could not set up storage. Try again.",
6124
6142
  "file": "modules/hall-ui/public/settings.js",
6125
- "line": 809,
6143
+ "line": 853,
6126
6144
  "origin": "js-text-assign",
6127
6145
  "confidence": "certain"
6128
6146
  },
@@ -7090,11 +7108,20 @@
7090
7108
  "confidence": "certain"
7091
7109
  },
7092
7110
  {
7093
- "id": "36ecb5d3686c",
7111
+ "id": "061f6f62c36a",
7094
7112
  "surface": "builders-hall",
7095
- "text": "Fresh CLI token issued. Paste this into a terminal in your project folder:",
7113
+ "text": "Fresh CLI token issued. Open PowerShell, cd into your project folder first (the command only runs there), then paste this:",
7096
7114
  "file": "modules/hall-ui/public/settings.js",
7097
- "line": 609,
7115
+ "line": 626,
7116
+ "origin": "js-text-assign",
7117
+ "confidence": "certain"
7118
+ },
7119
+ {
7120
+ "id": "67ad9b9f11c8",
7121
+ "surface": "builders-hall",
7122
+ "text": "Fresh CLI token issued. Open a terminal, cd into your project folder first (the command only runs there), then paste this:",
7123
+ "file": "modules/hall-ui/public/settings.js",
7124
+ "line": 627,
7098
7125
  "origin": "js-text-assign",
7099
7126
  "confidence": "certain"
7100
7127
  },
@@ -7193,7 +7220,7 @@
7193
7220
  "surface": "builders-hall",
7194
7221
  "text": "Get a free key ↗",
7195
7222
  "file": "modules/hall-ui/public/settings.js",
7196
- "line": 653,
7223
+ "line": 697,
7197
7224
  "origin": "js-markup",
7198
7225
  "confidence": "certain"
7199
7226
  },
@@ -7868,7 +7895,7 @@
7868
7895
  "surface": "builders-hall",
7869
7896
  "text": "Image key removed.",
7870
7897
  "file": "modules/hall-ui/public/settings.js",
7871
- "line": 830,
7898
+ "line": 874,
7872
7899
  "origin": "js-notice",
7873
7900
  "confidence": "certain"
7874
7901
  },
@@ -8268,6 +8295,15 @@
8268
8295
  "origin": "js-markup",
8269
8296
  "confidence": "certain"
8270
8297
  },
8298
+ {
8299
+ "id": "e3bbba45305c",
8300
+ "surface": "builders-hall",
8301
+ "text": "Keep the token out of your shell history",
8302
+ "file": "modules/hall-ui/public/settings.js",
8303
+ "line": 650,
8304
+ "origin": "js-text-assign",
8305
+ "confidence": "certain"
8306
+ },
8271
8307
  {
8272
8308
  "id": "08764cf156cc",
8273
8309
  "surface": "builders-hall",
@@ -8309,7 +8345,7 @@
8309
8345
  "surface": "builders-hall",
8310
8346
  "text": "Key removed.",
8311
8347
  "file": "modules/hall-ui/public/settings.js",
8312
- "line": 829,
8348
+ "line": 873,
8313
8349
  "origin": "js-text-assign",
8314
8350
  "confidence": "certain"
8315
8351
  },
@@ -8327,7 +8363,7 @@
8327
8363
  "surface": "builders-hall",
8328
8364
  "text": "Key storage is being set up by an Archon — check back shortly. {…}",
8329
8365
  "file": "modules/hall-ui/public/settings.js",
8330
- "line": 704,
8366
+ "line": 748,
8331
8367
  "origin": "js-markup",
8332
8368
  "confidence": "certain"
8333
8369
  },
@@ -8345,7 +8381,7 @@
8345
8381
  "surface": "builders-hall",
8346
8382
  "text": "Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the master key (no terminal needed).",
8347
8383
  "file": "modules/hall-ui/public/settings.js",
8348
- "line": 700,
8384
+ "line": 744,
8349
8385
  "origin": "js-markup",
8350
8386
  "confidence": "certain"
8351
8387
  },
@@ -9641,7 +9677,7 @@
9641
9677
  "surface": "builders-hall",
9642
9678
  "text": "No builder account found for this sign-in.",
9643
9679
  "file": "modules/hall-ui/public/settings.js",
9644
- "line": 1034,
9680
+ "line": 1078,
9645
9681
  "origin": "js-text-assign",
9646
9682
  "confidence": "certain"
9647
9683
  },
@@ -11184,15 +11220,6 @@
11184
11220
  "origin": "js-text-assign",
11185
11221
  "confidence": "certain"
11186
11222
  },
11187
- {
11188
- "id": "cf68a394cfa5",
11189
- "surface": "builders-hall",
11190
- "text": "Paste command copied.",
11191
- "file": "modules/hall-ui/public/settings.js",
11192
- "line": 628,
11193
- "origin": "js-notice",
11194
- "confidence": "certain"
11195
- },
11196
11223
  {
11197
11224
  "id": "6036f69e13bd",
11198
11225
  "surface": "builders-hall",
@@ -11216,7 +11243,7 @@
11216
11243
  "surface": "builders-hall",
11217
11244
  "text": "Paste your key first.",
11218
11245
  "file": "modules/hall-ui/public/settings.js",
11219
- "line": 749,
11246
+ "line": 793,
11220
11247
  "origin": "js-notice",
11221
11248
  "confidence": "certain"
11222
11249
  },
@@ -11837,7 +11864,7 @@
11837
11864
  "surface": "builders-hall",
11838
11865
  "text": "Re-issue failed: {…}",
11839
11866
  "file": "modules/hall-ui/public/settings.js",
11840
- "line": 633,
11867
+ "line": 677,
11841
11868
  "origin": "js-notice",
11842
11869
  "confidence": "certain"
11843
11870
  },
@@ -12462,6 +12489,15 @@
12462
12489
  "origin": "js-markup",
12463
12490
  "confidence": "certain"
12464
12491
  },
12492
+ {
12493
+ "id": "4c1e8ab8e1de",
12494
+ "surface": "builders-hall",
12495
+ "text": "Run this command instead (same folder). When it asks for the token, click Copy token and paste it there; nothing is shown as you paste.",
12496
+ "file": "modules/hall-ui/public/settings.js",
12497
+ "line": 652,
12498
+ "origin": "js-text-assign",
12499
+ "confidence": "certain"
12500
+ },
12465
12501
  {
12466
12502
  "id": "48e5f1d19e90",
12467
12503
  "surface": "builders-hall",
@@ -12530,7 +12566,7 @@
12530
12566
  "surface": "builders-hall",
12531
12567
  "text": "Save key",
12532
12568
  "file": "modules/hall-ui/public/settings.js",
12533
- "line": 685,
12569
+ "line": 729,
12534
12570
  "origin": "js-markup",
12535
12571
  "confidence": "certain"
12536
12572
  },
@@ -12980,7 +13016,7 @@
12980
13016
  "surface": "builders-hall",
12981
13017
  "text": "Set up key storage",
12982
13018
  "file": "modules/hall-ui/public/settings.js",
12983
- "line": 701,
13019
+ "line": 745,
12984
13020
  "origin": "js-markup",
12985
13021
  "confidence": "certain"
12986
13022
  },
@@ -12989,7 +13025,7 @@
12989
13025
  "surface": "builders-hall",
12990
13026
  "text": "Setting up key storage…",
12991
13027
  "file": "modules/hall-ui/public/settings.js",
12992
- "line": 785,
13028
+ "line": 829,
12993
13029
  "origin": "js-text-assign",
12994
13030
  "confidence": "certain"
12995
13031
  },
@@ -17210,7 +17246,7 @@
17210
17246
  "surface": "builders-hall",
17211
17247
  "text": "Your image-generation key settings could not be loaded. Reload the page to try again.",
17212
17248
  "file": "modules/hall-ui/public/settings.js",
17213
- "line": 860,
17249
+ "line": 904,
17214
17250
  "origin": "js-markup",
17215
17251
  "confidence": "certain"
17216
17252
  },
@@ -17219,7 +17255,7 @@
17219
17255
  "surface": "builders-hall",
17220
17256
  "text": "Your key",
17221
17257
  "file": "modules/hall-ui/public/settings.js",
17222
- "line": 681,
17258
+ "line": 725,
17223
17259
  "origin": "js-markup",
17224
17260
  "confidence": "certain"
17225
17261
  },
@@ -17273,7 +17309,7 @@
17273
17309
  "surface": "builders-hall",
17274
17310
  "text": "Your preferences, {…}.",
17275
17311
  "file": "modules/hall-ui/public/settings.js",
17276
- "line": 1043,
17312
+ "line": 1087,
17277
17313
  "origin": "js-text-assign",
17278
17314
  "confidence": "certain"
17279
17315
  },
@@ -18884,7 +18920,7 @@
18884
18920
  "surface": "builders-hall",
18885
18921
  "text": "paste command",
18886
18922
  "file": "modules/hall-ui/public/settings.js",
18887
- "line": 611,
18923
+ "line": 629,
18888
18924
  "origin": "js-text-assign",
18889
18925
  "confidence": "certain"
18890
18926
  },
@@ -20648,7 +20684,7 @@
20648
20684
  "surface": "builders-hall",
20649
20685
  "text": "{…} · Stored encrypted; never shown again after saving.",
20650
20686
  "file": "modules/hall-ui/public/settings.js",
20651
- "line": 687,
20687
+ "line": 731,
20652
20688
  "origin": "js-markup",
20653
20689
  "confidence": "certain"
20654
20690
  },
@@ -20657,7 +20693,7 @@
20657
20693
  "surface": "builders-hall",
20658
20694
  "text": "{…} · revoke it any time under Active sessions.",
20659
20695
  "file": "modules/hall-ui/public/settings.js",
20660
- "line": 619,
20696
+ "line": 637,
20661
20697
  "origin": "js-text-assign",
20662
20698
  "confidence": "certain"
20663
20699
  },
@@ -3390,5 +3390,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
3390
3390
  landed since 1.24.66 with no explicit bump. run 42689728958. (task 1002620)
3391
3391
  1.24.68 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3392
3392
  landed since 1.24.67 with no explicit bump. run 42692736161. (task 1002620)
3393
+ 1.24.70 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3394
+ landed since 1.24.68 with no explicit bump. run 42699948615. (task 1002620)
3393
3395
  ---------------------------------------------------------------------------
3394
3396
  ```
@@ -2449,7 +2449,7 @@
2449
2449
  "surface": "builders",
2450
2450
  "title": "Settings",
2451
2451
  "states_read": ["account","access","preferences","install-reports","sound","update"],
2452
- "files_hash": "6e7b5e2b903cd72c",
2452
+ "files_hash": "ea8de6fa68c456ab",
2453
2453
  "reading_hash": "085bb32894909ee0",
2454
2454
  "counts": {"lines":137,"placed":90,"shared":9,"unplaced":38},
2455
2455
  "omitted": {"data":16},
@@ -2459,7 +2459,7 @@
2459
2459
  {"key":"L0002","section":"top bar","text":"Settings","placement":"shared"},
2460
2460
  {"key":"L0003","section":"top bar","text":"Update","placement":"shared"},
2461
2461
  {"key":"L0004","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":555,"string_id":"eba610d25523"},
2462
- {"key":"L0005","section":"top bar","text":"⌘K","placement":"shared"},
2462
+ {"key":"L0005","section":"top bar","text":"Ctrl K","placement":"shared"},
2463
2463
  {"key":"L0006","section":"top bar","text":"Building","placement":"shared"},
2464
2464
  {"key":"L0007","section":"top bar","text":"Artistry","placement":"shared"},
2465
2465
  {"key":"L0008","section":"top bar","text":"Ideating","placement":"shared"},
@@ -2531,16 +2531,16 @@
2531
2531
  {"key":"L0074","section":"Your Autobongos runner","text":"The project has not allowed any goals for runners yet, so there is nothing to choose from.","placement":"unplaced","state":"access"},
2532
2532
  {"key":"L0075","section":"Image-generation key","text":"Image-generation key","placement":"placed","file":"modules/hall-ui/public/settings.html","line":244,"string_id":"783853467d52","state":"access","occurrences":2},
2533
2533
  {"key":"L0076","section":"Image-generation key","text":"The art pipeline draws tiles and sprites with Google AI Studio (Gemini). Needed only if you generate art — your key, your bill, paid only for what you make.","placement":"placed","file":"modules/hall-ui/public/settings.html","line":245,"string_id":"600b90074021","state":"access"},
2534
- {"key":"L0077","section":"Image-generation key","text":"Your key","placement":"placed","file":"modules/hall-ui/public/settings.js","line":681,"string_id":"51fd6f1ecb2f","state":"access"},
2534
+ {"key":"L0077","section":"Image-generation key","text":"Your key","placement":"placed","file":"modules/hall-ui/public/settings.js","line":725,"string_id":"51fd6f1ecb2f","state":"access"},
2535
2535
  {"key":"L0078","section":"Image-generation key","text":"Paste your {…} key","placement":"placed","file":"modules/hall-ui/public/settings-ai-keys.js","line":21,"string_id":"d7f9662b38fb","attr":"placeholder","state":"access"},
2536
- {"key":"L0079","section":"Image-generation key","text":"Save key","placement":"placed","file":"modules/hall-ui/public/settings.js","line":685,"string_id":"0c79b504aebe","state":"access"},
2537
- {"key":"L0080","section":"Image-generation key","text":"Get a free key ↗","placement":"placed","file":"modules/hall-ui/public/settings.js","line":653,"string_id":"2ae2114b61db","state":"access"},
2538
- {"key":"L0081","section":"Image-generation key","text":"· Stored encrypted; never shown again after saving.","placement":"placed","file":"modules/hall-ui/public/settings.js","line":687,"string_id":"b3757ba3bb46","state":"access"},
2536
+ {"key":"L0079","section":"Image-generation key","text":"Save key","placement":"placed","file":"modules/hall-ui/public/settings.js","line":729,"string_id":"0c79b504aebe","state":"access"},
2537
+ {"key":"L0080","section":"Image-generation key","text":"Get a free key ↗","placement":"placed","file":"modules/hall-ui/public/settings.js","line":697,"string_id":"2ae2114b61db","state":"access"},
2538
+ {"key":"L0081","section":"Image-generation key","text":"· Stored encrypted; never shown again after saving.","placement":"placed","file":"modules/hall-ui/public/settings.js","line":731,"string_id":"b3757ba3bb46","state":"access"},
2539
2539
  {"key":"L0082","section":"Image-generation key","text":"Stored encrypted; never shown again after saving — only its last four digits.","placement":"placed","file":"modules/hall-ui/public/settings.html","line":253,"string_id":"6c6544f5c011","state":"access"},
2540
2540
  {"key":"L0083","section":"Your AI keys","text":"Your AI keys","placement":"placed","file":"modules/hall-ui/public/settings.html","line":261,"string_id":"b22c34b9c30a","state":"access"},
2541
2541
  {"key":"L0084","section":"Your AI keys","text":"Link your own AI account so studio generations run on it and we charge you nothing. Without a key, generations run on ours and come out of your balance.","placement":"placed","file":"modules/hall-ui/public/settings.html","line":262,"string_id":"a0a4aaff6057","state":"access"},
2542
2542
  {"key":"L0085","section":"Your AI keys","text":"Paste your {…} key","placement":"placed","file":"modules/hall-ui/public/settings-ai-keys.js","line":21,"string_id":"d7f9662b38fb","attr":"placeholder","state":"access"},
2543
- {"key":"L0086","section":"Your AI keys","text":"Save key","placement":"placed","file":"modules/hall-ui/public/settings.js","line":685,"string_id":"0c79b504aebe","state":"access"},
2543
+ {"key":"L0086","section":"Your AI keys","text":"Save key","placement":"placed","file":"modules/hall-ui/public/settings.js","line":729,"string_id":"0c79b504aebe","state":"access"},
2544
2544
  {"key":"L0087","section":"Your AI keys","text":"Get a key ↗","placement":"placed","file":"modules/hall-ui/public/settings-ai-keys.js","line":29,"string_id":"ea60662c296c","state":"access"},
2545
2545
  {"key":"L0088","section":"Your AI keys","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"access"},
2546
2546
  {"key":"L0089","section":"Your AI keys","text":"Key on file ending …{…}{…}. Your generations run on it and we charge nothing.","placement":"placed","file":"modules/hall-ui/public/settings-ai-keys.js","line":36,"string_id":"a4e92424b2a4","state":"access"},
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Who | Gets a merged change | How to check |
6
6
  |---|---|---|
7
- | **cloudbongos.com** — the projects hub and the builders hall | only when a **published core release** carries it **and the hub's pin moves** — owner-gated, never automatic on merge | its `/version`; the ship card's **Deploy** row reads it: *"live at `<sha>` (includes this merge \| not yet)"* |
7
+ | **cloudbongos.com** — the projects hub and the builders hall | only when a **published core release** carries it **and the hub's pin moves** — its patch-channel subscription moves the pin to a new patch release on its own (task 1005020); a new minor release waits for the owner | its `/version`; the ship card's **Deploy** row reads it: *"live at `<sha>` (includes this merge \| not yet)"* |
8
8
  | **Projects hosted on the platform** | only when a **published core release** carries it (auto-published per merge, [ADR 0161](../adr/0161-publish-on-merge.md)) **and that project's pin moves** — a patch-channel subscription or a core-upgrade | that project's `/version` `coreVersion`; the ship card's **Projects** row states the rule |
9
9
 
10
10
  So a shipped task is live nowhere until a release carries it, and then only on an instance whose pin has moved — the hub included. The release itself waits on a green integration lane: the publish lane's integration gate refuses while `integration` on `main` is red. Never call work live until that instance's `/version` shows it. (This table used to say the hub redeploys from `main` on every merge, within minutes. It never did; on 2026-10-25 the hub had served one build through 200+ merges — task 1004873.) The wording has one source, [`modules/lifecycle/merge-reach.js`](../../modules/lifecycle/merge-reach.js); the ship card, `deploy-divergence.js` and the SessionStart line all print it (task 1004682). `/recall who sees a merge` finds the same rule as learning 1000292, which corrects learning 1000291 (that one still says the hub redeploys on every merge; the API has no way to edit a learning).
@@ -297,7 +297,7 @@ If live is **at or past** `<VER>`, stop and pick again. On 2026-09-17 a paste pr
297
297
 
298
298
  What each piece is for — each guards a failure that actually happened:
299
299
 
300
- - **`BONGOS_INSTANCE_ROOT`, not `CLOUDBONGOS_INSTANCE_ROOT`.** The legacy spelling still works but prints a deprecation warning three times per run and stops being read in core 1.21; the new spelling is verified in this exact line (2026-09-17, twice).
300
+ - **`BONGOS_INSTANCE_ROOT`, not `CLOUDBONGOS_INSTANCE_ROOT`.** The legacy spelling still works but prints a deprecation warning three times per run (it is still read, but will stop being read in a future core release); the new spelling is verified in this exact line (2026-09-17, twice).
301
301
  - **The token lives in root-only `/etc/cloudbongos/npm.env`, and is handed DOWN to `lars`.** This is the step that used to be documented wrongly, so read it before improvising. `NPM_TOKEN` is **not** in lars’s environment, **not** in the interactive profile, and **not** in `/home/lars/.npmrc` — all three probed empty (2026-08-17). An earlier version of this runbook grepped `~/.npmrc` and therefore aborted on its own `[ -n "$NPM_TOKEN" ]` guard every time. Worse, it could not have worked even if that file were populated: the project `.npmrc` says `_authToken=<redacted>, which **overrides** lars’s user `~/.npmrc`, so the variable is the only channel. Hence the shape above: `set -a; . /etc/cloudbongos/npm.env; set +a` reads it as **root** (mode 600), and `--preserve-env=NPM_TOKEN` hands it to the unprivileged `lars` — exactly what systemd does for the sweep unit (`User=lars` + `EnvironmentFile=`). Without it npm falls back to the **public** registry, 404s on the private `@bongos/core`, and rolls back cleanly having taught you nothing.
302
302
  - **Never put the token in the command line — `sudo` logs the full argv (task 1003218).** The shape above is safe *because* the token is read INSIDE the quoted script, so only the `grep` reaches argv. The tempting variant is not:
303
303
  ```
@@ -342,7 +342,7 @@ node scripts/bongos/deploy-divergence.js --url https://<instance-host>
342
342
  It reports the two gaps **separately**, because they have different fixes:
343
343
 
344
344
  - **UNRELEASED** — commits on `main` past the last `CORE_VERSION` bump. *No instance, the hub included, can take these at any pin* — no published version contains them yet. The publish lane (ADR 0161) normally carries a merge within minutes; a gap that stays means the lane is disarmed, red, or refused by its integration gate. The SessionStart line also says whether `main`'s latest merge is in a release yet.
345
- - **UNDEPLOYED** — the live instance's `coreVersion` is behind `main`'s. A release exists it has not picked up: its pin has not moved (gate 3). On the hub that move is owner-gated.
345
+ - **UNDEPLOYED** — the live instance's `coreVersion` is behind `main`'s. A release exists it has not picked up: its pin has not moved (gate 3). On the hub the patch-channel sweep makes that move on its own; a gap that stays means the sweep is held (artist gate, failed health check) or the release is a new minor, which waits for the owner.
346
346
 
347
347
  Exit codes: `0` aligned, `1` diverged, `2` undetermined.
348
348
 
@@ -578,6 +578,19 @@
578
578
 
579
579
  // ---- section 4: CLI ACCESS (re-issue a CLI bearer, V3.R91 #401) ----------
580
580
 
581
+ // Is this browser on Windows? (task 1005033) There the plain `npx` one-liner fails in
582
+ // a default PowerShell (npx.ps1 is blocked by the script policy), so the hall shows
583
+ // the npx.cmd form the server composes alongside it. The browser is the best signal
584
+ // for the machine the builder will paste into; a wrong guess still leaves a command
585
+ // that works in cmd, or in a PowerShell that allows scripts.
586
+ function isWindowsBrowser() {
587
+ try {
588
+ const uad = navigator.userAgentData;
589
+ if (uad && uad.platform) return /windows/i.test(uad.platform);
590
+ return /windows/i.test(navigator.userAgent || '');
591
+ } catch (_) { return false; }
592
+ }
593
+
581
594
  async function issueCliToken() {
582
595
  const btn = $('#cli-reissue-btn');
583
596
  const result = $('#cli-reissue-result');
@@ -594,7 +607,8 @@
594
607
  // plainly. 'unknown' read as a gap in the page's knowledge; the absence of a
595
608
  // date is the fact, and the revoke is what replaced the timer.
596
609
  const expires = body.expires_at ? `Expires ${new Date(body.expires_at).toLocaleString()}` : 'Never expires';
597
- const pasteCommand = body.paste_command || '';
610
+ const windows = isWindowsBrowser();
611
+ const pasteCommand = (windows && body.paste_command_windows) || body.paste_command || '';
598
612
  // The secret is QUOTED (settings.css `.quote`): a 64-character token cannot
599
613
  // be a line of prose, so it sits one tonal step down with its own foot. Same
600
614
  // markup as the innerHTML template it replaces (task 1003644) — what changes
@@ -606,7 +620,11 @@
606
620
  // three out of the copy registry, blinding the artist's queue to this panel.
607
621
  const el = (tag, cls) => Object.assign(document.createElement(tag), { className: cls });
608
622
  const say = el('p', 'cli-result__say');
609
- say.textContent = 'Fresh CLI token issued. Paste this into a terminal in your project folder:';
623
+ // Say WHERE it runs (task 1005033): npx finds `bongos` only inside the project
624
+ // folder, and a new Windows terminal opens in system32, where npm answers "could
625
+ // not determine executable to run" and nothing points at the cause.
626
+ if (windows) say.textContent = 'Fresh CLI token issued. Open PowerShell, cd into your project folder first (the command only runs there), then paste this:';
627
+ else say.textContent = 'Fresh CLI token issued. Open a terminal, cd into your project folder first (the command only runs there), then paste this:';
610
628
  const eyebrow = el('p', 'quote__eyebrow');
611
629
  eyebrow.textContent = 'paste command';
612
630
  const pre = el('pre', 'quote__pre');
@@ -621,13 +639,39 @@
621
639
  foot.append(copyBtn, hint);
622
640
  const quote = el('div', 'quote');
623
641
  quote.append(eyebrow, pre, foot);
642
+ // THE TOKEN-FREE ROUTE (task 1005033). The one-liner above carries the token, so
643
+ // it lands in shell history. `paste-token` with no token asks for it without echo;
644
+ // this offers that: the command without the token, and the token on its own
645
+ // button. The one-liner stays first because an older CLI in a builder's clone has
646
+ // no prompt and would stop at "No token given".
647
+ const promptCommand = `${windows ? 'npx.cmd' : 'npx'} bongos paste-token${body.api_base ? ` --api-base ${body.api_base}` : ''}`;
648
+ const quiet = el('details', 'cli-result__quiet');
649
+ const quietSum = el('summary', '');
650
+ quietSum.textContent = 'Keep the token out of your shell history';
651
+ const quietSay = el('p', 'settings-card__hint');
652
+ quietSay.textContent = 'Run this command instead (same folder). When it asks for the token, click Copy token and paste it there; nothing is shown as you paste.';
653
+ const quietPre = el('pre', 'quote__pre');
654
+ quietPre.textContent = promptCommand;
655
+ const copyPromptBtn = el('button', 'settings-btn settings-btn--quiet');
656
+ copyPromptBtn.type = 'button';
657
+ copyPromptBtn.textContent = 'Copy command';
658
+ const copyTokenBtn = el('button', 'settings-btn settings-btn--quiet');
659
+ copyTokenBtn.type = 'button';
660
+ copyTokenBtn.textContent = 'Copy token';
661
+ const quietFoot = el('div', 'quote__foot');
662
+ quietFoot.append(copyPromptBtn, copyTokenBtn);
663
+ quiet.append(quietSum, quietSay, quietPre, quietFoot);
624
664
  result.textContent = ''; // a re-issue replaces the previous token, as innerHTML did
625
665
  result.append(say, quote);
666
+ if (body.token) result.append(quiet);
626
667
  result.hidden = false;
627
- copyBtn.addEventListener('click', async () => {
628
- try { await navigator.clipboard.writeText(pasteCommand); toast('Paste command copied.'); }
668
+ const copy = async (text, done) => {
669
+ try { await navigator.clipboard.writeText(text); toast(done); }
629
670
  catch (err) { toast(`Could not copy automatically — select and copy manually. (${err.message})`); }
630
- });
671
+ };
672
+ copyBtn.addEventListener('click', () => copy(pasteCommand, 'Paste command copied.'));
673
+ copyPromptBtn.addEventListener('click', () => copy(promptCommand, 'Command copied.'));
674
+ copyTokenBtn.addEventListener('click', () => copy(body.token, 'Token copied.'));
631
675
  } catch (err) {
632
676
  console.error('[settings] cli token reissue failed', err);
633
677
  toast(`Re-issue failed: ${err.message}`);
@@ -1,14 +1,16 @@
1
1
  // modules/lifecycle/merge-reach.js — who sees a merge, and when. The ONE source of
2
- // the sentence (task 1004682; corrected by task 1004873).
2
+ // the sentence (task 1004682; corrected by tasks 1004873 and 1005020).
3
3
  //
4
4
  // One path, for every instance — the hub included:
5
5
  // 1. A merge to main is first carried by a PUBLISHED core release. The publish
6
6
  // lane cuts one per merge (ADR 0161), but only while its integration gate is
7
7
  // green; a red integration lane stalls every release behind it.
8
- // 2. An instance gets that release only when its PIN moves. On the hub
9
- // (cloudbongos.com: the projects hub and the builders hall) that is
10
- // owner-gated; on a hosted project it is a patch-channel subscription or a
11
- // core-upgrade.
8
+ // 2. An instance gets that release only when its PIN moves. The hub
9
+ // (cloudbongos.com: the projects hub and the builders hall) is subscribed to
10
+ // the patch channel, so its update sweep moves the pin to a new patch release
11
+ // on its own — no person needed; only a new MINOR release (which the patch
12
+ // channel never takes) waits for the owner's Hall → Deploy. On a hosted
13
+ // project it is a patch-channel subscription or a core-upgrade.
12
14
  //
13
15
  // History: this file used to say the hub "redeploys from main on every merge,
14
16
  // within minutes". It never did — the hub pins a published core like any other
@@ -16,7 +18,9 @@
16
18
  // while sessions told the owner that work was live (task 1004873). Before that,
17
19
  // deploy-divergence.js printed "Merging to main deploys nothing" (ADR 0137), false
18
20
  // in the other direction. The ship card, the divergence report and the SessionStart
19
- // line all read their wording from here, so they cannot drift apart again.
21
+ // line all read their wording from here, so they cannot drift apart again. Then
22
+ // task 1004873's wording called the hub's pin move "owner-gated", which was false
23
+ // for patches: cloudbongos.com moved to core 1.24.12 with no person (task 1005015).
20
24
  //
21
25
  // PURE and dependency-free: callers pass an already-sanitised reading (host, short
22
26
  // sha, inclusion), never a raw network response — some of this text is injected
@@ -26,8 +30,11 @@
26
30
 
27
31
  const HOSTED_LINE = 'Hosted projects: only when a published core release carries the change and their pin moves (patch-channel subscription or a core-upgrade).';
28
32
 
33
+ // How the hub's pin moves (task 1005020): by itself for a patch release, by the owner for a minor.
34
+ const HUB_PIN = 'its patch-channel subscription moves that pin on its own; a new minor release waits for the owner';
35
+
29
36
  function hubRule(host) {
30
- return `${host || 'The hub'} gets a merge only when a published core release carries it and its pin moves (owner-gated)`;
37
+ return `${host || 'The hub'} gets a merge only when a published core release carries it and its pin moves (${HUB_PIN})`;
31
38
  }
32
39
 
33
40
  // includes: true (the live build carries this merge), false (not yet), null (cannot tell).
@@ -36,7 +43,7 @@ function hubLine({ host = null, liveShort = null, includes = null } = {}) {
36
43
  const state = includes === true ? 'includes this merge'
37
44
  : includes === false ? 'not yet'
38
45
  : 'cannot tell yet whether it includes this merge';
39
- return `${host || 'The hub'}: live at ${liveShort} (${state}) — it gets a merge only when a published core release carries it and its pin moves (owner-gated).`;
46
+ return `${host || 'The hub'}: live at ${liveShort} (${state}) — it gets a merge only when a published core release carries it and its pin moves (${HUB_PIN}).`;
40
47
  }
41
48
 
42
49
  // Is main's latest merge in a published release yet? `tipShort` is a short sha,