@bongos/core 1.24.91 → 1.24.93

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 +54 -39
  2. package/.claude/skills/builder-reauth/SKILL.md +23 -25
  3. package/clients/bongos-client/index.d.ts +2 -1
  4. package/docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md +8 -0
  5. package/docs/api/openapi.json +22 -2
  6. package/docs/api-reference.md +1 -1
  7. package/docs/copy-inventory.md +3 -3
  8. package/docs/copy-registry.json +3 -3
  9. package/docs/module-api-changelog.md +4 -2
  10. package/docs/page-inventory.json +4 -2
  11. package/docs/page-readings.json +6 -6
  12. package/modules/hall-ui/public/city.css +6 -2
  13. package/modules/hall-ui/public/city.js +44 -2
  14. package/modules/hall-ui/public/goal-map.html +2 -0
  15. package/modules/hall-ui/public/sky-interaction.js +4 -9
  16. package/modules/hall-ui/public/sky-visor.js +96 -0
  17. package/modules/hall-ui/public/thinking.css +8 -0
  18. package/modules/hall-ui/public/thinking.html +2 -0
  19. package/modules/hall-ui/public/visor.js +20 -4
  20. package/modules/hall-ui/records/visor.md +16 -2
  21. package/package-lock.json +2 -2
  22. package/package.json +1 -1
  23. package/release-notes.json +15 -1
  24. package/scripts/bongos/cli-lib.js +7 -6
  25. package/scripts/bongos/login.js +14 -3
  26. package/scripts/bongos/plain-cards.js +1 -1
  27. package/scripts/bongos/reauth.js +100 -50
  28. package/src/bongos/routes/auth-google.js +5 -3
  29. package/src/bongos/routes/auth.js +3 -3
  30. package/src/bongos/sign-in-pages.js +1 -2
  31. package/src/module-api.js +1 -1
  32. package/tests/cli_reauth_browser.mjs +157 -0
  33. package/tests/hall_city.mjs +41 -1
  34. package/tests/hall_city_living.mjs +2 -0
  35. package/tests/hall_sky_visor.mjs +150 -0
  36. package/tests/hall_visor.mjs +28 -2
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/bongos/package-core.js",
5
- "core_version": "1.24.91",
6
- "core_contract": "1.24.91",
7
- "source_commit": "a22021565f291899e091258dc39071e4b3261e2e",
5
+ "core_version": "1.24.93",
6
+ "core_contract": "1.24.93",
7
+ "source_commit": "8071fd2502f713c6b549097cfd5d79d606f32867",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-12T12:41:58.407Z",
9
+ "built_at": "2026-11-12T20:21:01.886Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 650,
13
13
  "agent_docs_stubbed": 32,
14
- "functional_verbatim": 3964,
14
+ "functional_verbatim": 3967,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 4647,
20
- "tree_sha256": "195792ff38f7ebbfcfcb39423492588ebbf36563eccdbadb90f4207164f06fad",
19
+ "file_count": 4650,
20
+ "tree_sha256": "14cce51acfe462e49a4caaa95f39316299e9da4b7eaad55df49bd1082d03adaf",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -82,7 +82,7 @@
82
82
  {
83
83
  "path": ".claude/skills/builder-reauth/SKILL.md",
84
84
  "mode": "0000644",
85
- "sha256": "87914427956d7dd7d947e56fc3aaa0029c53aae738469470782ed7b3b397c8fc"
85
+ "sha256": "66a2755314dbf7e4ede87854b8a47730f0603196ab79498f85b5a8ba175e155d"
86
86
  },
87
87
  {
88
88
  "path": ".claude/skills/builder-redteam/SKILL.md",
@@ -352,7 +352,7 @@
352
352
  {
353
353
  "path": "clients/bongos-client/index.d.ts",
354
354
  "mode": "0000644",
355
- "sha256": "f9f0e9f4f0d7f87abffa4d19cd4a25d4ab1d9bd6403c50e739acd37383aa2db9"
355
+ "sha256": "61118835fbddfe0f7a64113ccc4b9e2f79ea095b4c7bef0b079250a83871f652"
356
356
  },
357
357
  {
358
358
  "path": "clients/bongos-client/index.mjs",
@@ -2442,7 +2442,7 @@
2442
2442
  {
2443
2443
  "path": "docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md",
2444
2444
  "mode": "0000644",
2445
- "sha256": "7c13a3f082ab91435a181f8b197f1e46708cc1b24a9ad80463c74f3726280d70"
2445
+ "sha256": "fc77036762aa8daa9820f22f0d75dfaa63c1de282efe9124cfbc31fdc2d45cf7"
2446
2446
  },
2447
2447
  {
2448
2448
  "path": "docs/adr/0397-the-payment-rail-is-stripe-connect-with-one-connected-account-per-project.md",
@@ -2487,12 +2487,12 @@
2487
2487
  {
2488
2488
  "path": "docs/api-reference.md",
2489
2489
  "mode": "0000644",
2490
- "sha256": "65f7628372fca1bb6fd5feb7199e68fddac624f3d8541a77ebd5828b7fdf0a9a"
2490
+ "sha256": "dd3ab48cc4735ba7af87f656b299ede977c38623318350b6b32191538c6f8b52"
2491
2491
  },
2492
2492
  {
2493
2493
  "path": "docs/api/openapi.json",
2494
2494
  "mode": "0000644",
2495
- "sha256": "335d23581fe7d06ff91aa155b70edb69c0195c46a49aaa8959db0d707b4abf19"
2495
+ "sha256": "8004732e03a7d1cead9cba35155c8336015e23f509fcd2b1ef13fbf887a549ec"
2496
2496
  },
2497
2497
  {
2498
2498
  "path": "docs/architecture.md",
@@ -2517,12 +2517,12 @@
2517
2517
  {
2518
2518
  "path": "docs/copy-inventory.md",
2519
2519
  "mode": "0000644",
2520
- "sha256": "290386a7922531e1b30de4adcd4fb541880a94b3ff7db78d72ac10f6bcff314b"
2520
+ "sha256": "4f561c4c13b185d12c1cb4c2dce8d7f4415bf22fd3d9f6969556e21335a1f643"
2521
2521
  },
2522
2522
  {
2523
2523
  "path": "docs/copy-registry.json",
2524
2524
  "mode": "0000644",
2525
- "sha256": "611c4618f066d69b80124ad51138927337aa64401fe566eddbd5f2f7f329591d"
2525
+ "sha256": "e2fd36ea4e5ba73c38737e07f3ced678d330356bd803cb52ecbb65063e85e457"
2526
2526
  },
2527
2527
  {
2528
2528
  "path": "docs/design/apex-pass-2-direction.md",
@@ -3037,7 +3037,7 @@
3037
3037
  {
3038
3038
  "path": "docs/module-api-changelog.md",
3039
3039
  "mode": "0000644",
3040
- "sha256": "cd252fd841709bd269f9925c659e02876523dbf626959f4e3bd3feb1c88745d4"
3040
+ "sha256": "bba6458b2c8742106eabe1e8c4646fb9a5ceea75fba0bb3a375b6ea7a986fc80"
3041
3041
  },
3042
3042
  {
3043
3043
  "path": "docs/modules-contract.md",
@@ -3117,12 +3117,12 @@
3117
3117
  {
3118
3118
  "path": "docs/page-inventory.json",
3119
3119
  "mode": "0000644",
3120
- "sha256": "2b6eff1405abfb279b3c239a0e71cad3b0801eb4d21a798536443e84ff7d648e"
3120
+ "sha256": "4b063630995768d45aa24d10d484607495ce6732fbf279488bbba89cccb1c17c"
3121
3121
  },
3122
3122
  {
3123
3123
  "path": "docs/page-readings.json",
3124
3124
  "mode": "0000644",
3125
- "sha256": "e793384169510479355b6d08b5d937d3d3b907a244c37bb2af6f03d1615d57bb"
3125
+ "sha256": "a15df86b33d43c4b42bc9854319497d86b3671ffbda88f765bfe8ed3a9ed6fde"
3126
3126
  },
3127
3127
  {
3128
3128
  "path": "docs/project-context.template.md",
@@ -6222,7 +6222,7 @@
6222
6222
  {
6223
6223
  "path": "modules/hall-ui/public/city.css",
6224
6224
  "mode": "0000644",
6225
- "sha256": "33056c156e2ec8a8ad008c1e268b82e7445f3e1471e79e572c3054cfdf56d474"
6225
+ "sha256": "4696bb120ec74640555ad747711986e96dea49c658e782f77f1042b9f70a0ecd"
6226
6226
  },
6227
6227
  {
6228
6228
  "path": "modules/hall-ui/public/city.html",
@@ -6232,7 +6232,7 @@
6232
6232
  {
6233
6233
  "path": "modules/hall-ui/public/city.js",
6234
6234
  "mode": "0000644",
6235
- "sha256": "e0800a150b163e23a233dbf0fd05a67fdf7af0eff71d2f5b519d74ebc4d347af"
6235
+ "sha256": "928ef8c8b5f567195c6892673d61e5a953c80f95f4524de1fe258a68fc926e81"
6236
6236
  },
6237
6237
  {
6238
6238
  "path": "modules/hall-ui/public/city.states.json",
@@ -6517,7 +6517,7 @@
6517
6517
  {
6518
6518
  "path": "modules/hall-ui/public/goal-map.html",
6519
6519
  "mode": "0000644",
6520
- "sha256": "22bfd6cbf4bfbd6c31611ca8ce2f0160a0ff29ab920280d1c53e43151a33cc14"
6520
+ "sha256": "94be9df5343f593a296586185b4b544640063d8f8bd64c1c10d1061b275c37d0"
6521
6521
  },
6522
6522
  {
6523
6523
  "path": "modules/hall-ui/public/goal-map.states.json",
@@ -7212,7 +7212,7 @@
7212
7212
  {
7213
7213
  "path": "modules/hall-ui/public/sky-interaction.js",
7214
7214
  "mode": "0000644",
7215
- "sha256": "488a6d7de479e546ad8f263aba7bea767867e22e5eb9897d5531ea032fc82beb"
7215
+ "sha256": "2eae15cb9ec10e0317be9e92670bbaaf21e8157fa53234d1ca458c30c48eec6d"
7216
7216
  },
7217
7217
  {
7218
7218
  "path": "modules/hall-ui/public/sky-layout.js",
@@ -7234,6 +7234,11 @@
7234
7234
  "mode": "0000644",
7235
7235
  "sha256": "8b9b9495eac0febcf56d4e049f1ceeb9cfdc6fc0031c93d99256dc628a95585a"
7236
7236
  },
7237
+ {
7238
+ "path": "modules/hall-ui/public/sky-visor.js",
7239
+ "mode": "0000644",
7240
+ "sha256": "d3b594d333a427fbafb7584be6ceeb965f06d8363bfea322bab61dfbecf8fd3e"
7241
+ },
7237
7242
  {
7238
7243
  "path": "modules/hall-ui/public/speciality-tools.css",
7239
7244
  "mode": "0000644",
@@ -7387,12 +7392,12 @@
7387
7392
  {
7388
7393
  "path": "modules/hall-ui/public/thinking.css",
7389
7394
  "mode": "0000644",
7390
- "sha256": "99df2ce6bb017b78d0fd4f3f4f4607cecfea3e3a9275aaded09c4a66bdfe5a9f"
7395
+ "sha256": "b0be3e10a3413a833043dc43d568071bc20040e593b2cad52016b5176be5269a"
7391
7396
  },
7392
7397
  {
7393
7398
  "path": "modules/hall-ui/public/thinking.html",
7394
7399
  "mode": "0000644",
7395
- "sha256": "fa46073d30502efef230a21e48146a044916d487c79e099433917407575fd60a"
7400
+ "sha256": "494e89a7a527be66b61d330047d0c425967f920140bcba6340fa25f51d53f185"
7396
7401
  },
7397
7402
  {
7398
7403
  "path": "modules/hall-ui/public/thinking.states.json",
@@ -7442,7 +7447,7 @@
7442
7447
  {
7443
7448
  "path": "modules/hall-ui/public/visor.js",
7444
7449
  "mode": "0000644",
7445
- "sha256": "7c3dec2c81435516e15a35d4245557215c84d809f76ac9b49f95529a935518ec"
7450
+ "sha256": "ce6b2a68e041a0e529fed8270405dcd15bb300e1ec5bf1d3c6afbf561ee53936"
7446
7451
  },
7447
7452
  {
7448
7453
  "path": "modules/hall-ui/public/vote-control.js",
@@ -7752,7 +7757,7 @@
7752
7757
  {
7753
7758
  "path": "modules/hall-ui/records/visor.md",
7754
7759
  "mode": "0000644",
7755
- "sha256": "515c6e31880265d11477e723fd0307d49409b6c04d5e53aa6579ef809c88269b"
7760
+ "sha256": "a1e1421463d9107782c46309339510d6e5c82a38f142ccf35f17fb53effb6c97"
7756
7761
  },
7757
7762
  {
7758
7763
  "path": "modules/hall-ui/records/welcome-tower.md",
@@ -12102,12 +12107,12 @@
12102
12107
  {
12103
12108
  "path": "package-lock.json",
12104
12109
  "mode": "0000644",
12105
- "sha256": "ab7441e6cc38edc40acce9d7090d25016f42420246eaf6ed7e2f37eab0200024"
12110
+ "sha256": "aca584f965a5191a12f9c0547ed3bc0be72a13f8043b13a2d3a2ec65b08d8632"
12106
12111
  },
12107
12112
  {
12108
12113
  "path": "package.json",
12109
12114
  "mode": "0000644",
12110
- "sha256": "eb582572ac4dd9fa60fe3275a450b9aa4599edc45600a1f8bf066e15d9a341b3"
12115
+ "sha256": "c0cae817310174c3e98cef573263c33c9807c1c8086b050fc13f5f1a18001b4d"
12111
12116
  },
12112
12117
  {
12113
12118
  "path": "public-docs/index.html",
@@ -12127,7 +12132,7 @@
12127
12132
  {
12128
12133
  "path": "release-notes.json",
12129
12134
  "mode": "0000644",
12130
- "sha256": "c44e40bf773cc25fdb58b9bae2081fb6fa18132e915649a6acf05a18a74412d6"
12135
+ "sha256": "6aff28036a7071c6895abc1f682477f4cd41b1fe02bf96fad15a7f42c05de7d9"
12131
12136
  },
12132
12137
  {
12133
12138
  "path": "scripts/bongos/CLAUDE.md",
@@ -12417,7 +12422,7 @@
12417
12422
  {
12418
12423
  "path": "scripts/bongos/cli-lib.js",
12419
12424
  "mode": "0000644",
12420
- "sha256": "7f00d2ce761ee775341e21cce68e64b8346f2f2c4bcd5cd41b16b9e8404f926e"
12425
+ "sha256": "49a35fbc1523b75e922ed79ff473e833a8cae915d46d36981b8993eb522571be"
12421
12426
  },
12422
12427
  {
12423
12428
  "path": "scripts/bongos/client-baseurl-guard.js",
@@ -12937,7 +12942,7 @@
12937
12942
  {
12938
12943
  "path": "scripts/bongos/login.js",
12939
12944
  "mode": "0000644",
12940
- "sha256": "0a13005b8a73dd31b46bdb6f7762f483654e85e060f37eb8e78d9a6088f7245c"
12945
+ "sha256": "c6e9232bae6700d8e4bebfd11796b00ee850ae78da5ae689dcc109366bb46600"
12941
12946
  },
12942
12947
  {
12943
12948
  "path": "scripts/bongos/main-audit.js",
@@ -13127,7 +13132,7 @@
13127
13132
  {
13128
13133
  "path": "scripts/bongos/plain-cards.js",
13129
13134
  "mode": "0000644",
13130
- "sha256": "2fc62830cab07c3536eeb531429de39b1726657e5fd6862b9bf3b6d76e93e56d"
13135
+ "sha256": "755fdb4f7596c114a888fbdaf540e82bccd184b6ae7b4bf01d8163b3f0b9ed0e"
13131
13136
  },
13132
13137
  {
13133
13138
  "path": "scripts/bongos/portability-smoke-art.sh",
@@ -13292,7 +13297,7 @@
13292
13297
  {
13293
13298
  "path": "scripts/bongos/reauth.js",
13294
13299
  "mode": "0000644",
13295
- "sha256": "2e790186eebf403037e61a499bd865a9ebdfb8fe6e9958d95a4cd078f7b521fa"
13300
+ "sha256": "5d62a84e7f2e35ab6fa37c5fd7b37bd9baf48b7bc984591a01c8850665746f88"
13296
13301
  },
13297
13302
  {
13298
13303
  "path": "scripts/bongos/recall.js",
@@ -15912,7 +15917,7 @@
15912
15917
  {
15913
15918
  "path": "src/bongos/routes/auth-google.js",
15914
15919
  "mode": "0000644",
15915
- "sha256": "f7531eefb5d958f4924aff1e0e1bf8bf258f82cc676d7bdb0f26e6235a181ae4"
15920
+ "sha256": "7d42cf2a68ebf6d852cc63fdfb8774867221b880025669d5f9a29ac20f26bd9d"
15916
15921
  },
15917
15922
  {
15918
15923
  "path": "src/bongos/routes/auth-link.js",
@@ -15922,7 +15927,7 @@
15922
15927
  {
15923
15928
  "path": "src/bongos/routes/auth.js",
15924
15929
  "mode": "0000644",
15925
- "sha256": "5dac69f518fb0933f111d3df4dfc400e1573ffd2849abe7599ed16bd0ab63d58"
15930
+ "sha256": "438f7feeb87eb85b4aaca2bf20e0304d95822a8e77c92f9c2a042a90dd0bb03d"
15926
15931
  },
15927
15932
  {
15928
15933
  "path": "src/bongos/routes/backup.js",
@@ -16062,7 +16067,7 @@
16062
16067
  {
16063
16068
  "path": "src/bongos/sign-in-pages.js",
16064
16069
  "mode": "0000644",
16065
- "sha256": "cfd8a09da90e8f2a176e94c960736bbb295c216a1d6bf1f8027f7f0ce1ceacc8"
16070
+ "sha256": "8f93a2b576e4f2b2bdaf8feec2a8c6c4b23f31be4c071f119a4ca56f39e5fa6c"
16066
16071
  },
16067
16072
  {
16068
16073
  "path": "src/bongos/software-update.js",
@@ -16132,7 +16137,7 @@
16132
16137
  {
16133
16138
  "path": "src/module-api.js",
16134
16139
  "mode": "0000644",
16135
- "sha256": "95d86d1e9db626680711ac8e0f79e6458c5e20b0af7343640c6cf0d4e5e6cadd"
16140
+ "sha256": "a8399bb92d13d12c44c07cf942398f10b93590bbeb054610a5d9952cd9b044ab"
16136
16141
  },
16137
16142
  {
16138
16143
  "path": "src/module-loader/catalog.js",
@@ -17174,6 +17179,11 @@
17174
17179
  "mode": "0000644",
17175
17180
  "sha256": "79c57041a871f9700682ac96cebf5d07fe393cc274b5549e8659cad34f44cee1"
17176
17181
  },
17182
+ {
17183
+ "path": "tests/cli_reauth_browser.mjs",
17184
+ "mode": "0000644",
17185
+ "sha256": "758964ef9d4d5d1921162aab1e86a4fb07fe7347aca5866391c8dd33ce67d94d"
17186
+ },
17177
17187
  {
17178
17188
  "path": "tests/cli_sessions.mjs",
17179
17189
  "mode": "0000644",
@@ -19027,7 +19037,7 @@
19027
19037
  {
19028
19038
  "path": "tests/hall_city.mjs",
19029
19039
  "mode": "0000644",
19030
- "sha256": "781ad77857a1c04165bdd98d033a0776f036feff0752a49b033a4a1bc8179f13"
19040
+ "sha256": "3505970e7551ed2d4ca8767ba0b3b63f564ffc6d76706a181db8826aeb4d8efd"
19031
19041
  },
19032
19042
  {
19033
19043
  "path": "tests/hall_city_card_words.mjs",
@@ -19037,7 +19047,7 @@
19037
19047
  {
19038
19048
  "path": "tests/hall_city_living.mjs",
19039
19049
  "mode": "0000644",
19040
- "sha256": "1b6744e38a44f486978a1f3ecf275fa260a6d79b0779242fdd4827980b14593d"
19050
+ "sha256": "a8d7ef26e5f647dac6fb03d3759968585ef0146a03de6c8e2897c0943c6db1ee"
19041
19051
  },
19042
19052
  {
19043
19053
  "path": "tests/hall_city_rewording.mjs",
@@ -19304,6 +19314,11 @@
19304
19314
  "mode": "0000644",
19305
19315
  "sha256": "77589e0ab28f723090eeb1863e1a431ed6fec9c761ece66239431d3116b1c63a"
19306
19316
  },
19317
+ {
19318
+ "path": "tests/hall_sky_visor.mjs",
19319
+ "mode": "0000644",
19320
+ "sha256": "ffbf1958a0d19b498ebaa7d1b3d0865252c33bc3eb7ca9f58f10bb9861d05927"
19321
+ },
19307
19322
  {
19308
19323
  "path": "tests/hall_start_screen.mjs",
19309
19324
  "mode": "0000644",
@@ -19387,7 +19402,7 @@
19387
19402
  {
19388
19403
  "path": "tests/hall_visor.mjs",
19389
19404
  "mode": "0000644",
19390
- "sha256": "055de4ac3afe4e7883be6cb462e00879bafc4c7593186ae7d728dbd5ee13f6f6"
19405
+ "sha256": "7cebc92c9a8c34eb1d11ef0316767fd0ff3fc01dfe20917f7b4194f89174830c"
19391
19406
  },
19392
19407
  {
19393
19408
  "path": "tests/hall_work_history_id.mjs",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: builder-reauth
3
3
  description: >-
4
- Refresh an expired Bongos CLI session, UI-first. Triggers: "/builder-reauth", "re-auth", "refresh my session", "my Bongos session expired", "re-issue my CLI token", or any /builder-* failing with "Bongos CLI session is no longer valid".
4
+ Sign the CLI back in with one browser click. Triggers: "/builder-reauth", "re-auth", "sign me back in", "refresh my session", "re-issue my CLI token", or any /builder-* failing with "Bongos CLI session is no longer valid".
5
5
  plain: >-
6
6
  Signs your assistant back in when its sign-in to the project has expired.
7
7
  reach-for: >-
@@ -10,7 +10,7 @@ cost: >-
10
10
  Free. It replaces your saved sign-in and changes nothing else.
11
11
  ---
12
12
 
13
- You are refreshing the current builder's Bongos CLI session. CLI bearer tokens **do not expire** — since [ADR 0294](../../../docs/adr/0294-cli-sessions-do-not-expire.md) a session lasts until it is revoked. So a rejected token means something killed it: the builder (or an Archon) revoked it, a demotion swept it, or an auth-changing deploy invalidated it. This skill is the **fast path back in**: browser clicks plus a single copy/paste, instead of the slower terminal Device Flow.
13
+ You are signing the current builder's command line back in to Bongos. CLI sessions **do not expire** — since [ADR 0294](../../../docs/adr/0294-cli-sessions-do-not-expire.md) a session lasts until it is revoked. So a rejected session means something killed it: the builder (or an Archon) revoked it, a demotion swept it, or an auth-changing deploy invalidated it. This skill gets them back in with **one Approve click in their browser** — nothing to copy, nothing to paste, and the token never passes through the chat (task 1005118).
14
14
 
15
15
  ## Why there is no expiry (so you can explain it if asked)
16
16
 
@@ -18,42 +18,40 @@ There used to be a 24h idle TTL, for auth-token hygiene (GDS-V3 criterion **C9**
18
18
 
19
19
  What actually bounds a leaked token is **revocation**, and it is faster than any clock: the builder kills it themselves from Settings → Active sessions or "Sign out everywhere" ([ADR 0206](../../../docs/adr/0206-own-scoped-session-revocation-no-absolute-ceiling.md)). Rank changes were never the TTL's job either — demotion calls `revokeAllSessionsForBuilder` synchronously and rank is read fresh from the DB on every request ([ADR 0016](../../../docs/adr/0016-trust-boundary-server-enforced-permissions.md)).
20
20
 
21
- ## The flow (guided paste)
21
+ ## The flow (one click)
22
22
 
23
- 1. **Detect.** Run the helper — it checks whether the existing session is still valid and, if not, opens the hall:
23
+ 1. **Say what is about to happen, in one line**, before running anything: a page will open in their browser; they check the code and click **Approve**, and you carry on by yourself.
24
+
25
+ 2. **Run the helper with a long timeout** — it waits for the click (up to ten minutes):
24
26
  ```bash
25
27
  node scripts/bongos/reauth.js
26
28
  ```
27
- - **Exit 0** → the session is already valid. Relay who they're signed in as and stop — there is nothing to do. Do NOT re-auth a working session.
28
- - **Exit 10** → re-auth is needed. The helper has opened (or printed) the builders' hall URL and the click-path. Continue to step 2.
29
- - **Exit 2** → the API was unreachable (network). Relay that, and let them retry once they're back online. The session may be fine.
29
+ Give the Bash call `timeout: 600000`. The helper checks the current session first; if it is broken it asks the instance for its own approval page (`approve_in_browser`), opens it with the code filled in, waits for the click, and saves the new session itself.
30
+ - **Exit 0** → signed in. Either the session was already working (say so — do NOT re-sign-in a working session) or the approval just landed. Relay who they are signed in as, then re-run whatever `/builder-*` command they were trying.
31
+ - **Exit 10** → not signed in: they pressed Cancel, the page ran out, or the account is not let in. The helper says which and prints the fallback below. Offer to run it again once; if that also fails, use the fallback.
32
+ - **Exit 2** → the instance was unreachable (network). The session may be fine; let them retry once they are back online.
30
33
 
31
- 2. **Relay the click-path verbatim.** The helper prints the exact steps; pass them to the user clearly (don't paraphrase the URL):
32
- - Open `https://example.com/builders/settings` (the helper tries to open it automatically; if not, give them the link).
33
- - They are already signed in there via the browser cookie. Under the **"CLI Access"** section, click **"Re-issue CLI token"**.
34
- - Click **"Copy"** — it copies a one-line command of the form `bongos paste-token <token>`.
35
- - Ask them to **paste that one line back into the chat**.
34
+ 3. **If the page says they are not signed in** in the browser, it shows a **Continue with GitHub** button (and Google where the instance offers it). They sign in there and land straight back on the Approve page — the helper is still waiting.
36
35
 
37
- 3. **Run the pasted command.** When the user pastes `bongos paste-token <token>`, run it exactly as given. `paste-token.js` verifies the token against `/api/bongos/me` **before** touching the session file (a bad paste leaves the existing session intact) and preserves any `gemini_api_key`. On success it prints the builder login, rank, and confirms the session file was written.
36
+ ## Fallback — the copied line (no browser on this machine)
38
37
 
39
- 4. **Confirm.** Relay the authenticated identity + rank back to the user, and tell them they can now re-run whatever `/builder-*` command they were trying.
38
+ Only when the one-click path cannot work — a remote/SSH machine with no browser, or the click path failed twice — run `node scripts/bongos/reauth.js --paste` and relay its click-path: Settings → **CLI Access** → **Re-issue CLI token** → **Copy**, then paste the `bongos paste-token <token>` line back into the chat and run it exactly as given. `paste-token.js` verifies the token before writing and preserves `gemini_api_key`. This path puts the token in the chat, so never echo it beyond running that one command, and never write it anywhere yourself.
40
39
 
41
40
  ## Edge cases
42
41
 
43
- - **"You are not signed in" / `cookie_required`.** The re-issue endpoint mints CLI bearers from a browser *cookie*, not a bearer — a leaked CLI token can't extend its own life. If the Settings page shows them logged out, they sign in at `https://example.com/builders` first, then return to `/builders/settings` and click Re-issue. Once signed in the button works.
44
- - **No session file at all (fresh machine).** The helper still guides them to the Settings page; if they've never authed on this machine, the hall sign-in + Settings → CLI Access → Re-issue path still works. The terminal Device Flow (`node scripts/bongos/setup.js`) remains the fallback for a brand-new builder with no browser session anywhere.
45
- - **Browser can't open automatically** (headless / SSH). The helper prints the URL; relay it so they can open it on whatever machine has their browser, then paste the one-liner back.
46
- - **Fallback — terminal Device Flow.** If the browser path is unavailable for any reason, `node scripts/bongos/setup.js --force` re-auths via GitHub Device Flow (terminal code entry). Slower and not UI-first; use only when the hall route can't be used.
42
+ - **An instance older than task 1005118** ignores the browser-approval ask and answers GitHub's own device flow: the helper prints a code and opens github.com/login/device. Relay the code; the person types it there and approves. It still finishes by itself.
43
+ - **No session file at all (fresh machine).** The helper runs the same browser approval. A brand-new builder who has never signed in anywhere uses `/builder-setup` instead.
44
+ - **Several projects on one machine.** The helper signs in to the project the active session names (or `BONGOS_API_BASE`). Saving goes through the per-instance store (ADR 0269), so other projects' sign-ins are kept.
47
45
 
48
46
  ## Constraints
49
47
 
50
- - **The token briefly transits the chat — that's the known cost of guided-paste.** The user pastes `bongos paste-token <token>` into the conversation, so the bearer appears in the chat (and any log/context that captures it). That's the accepted trade-off Lars chose; the deferred zero-paste loopback flow removes it. So: treat the session log as sensitive, **never echo the token beyond running that one pasted command**, and never write it to any file other than `~/.config/otb/gds-session.json` (`paste-token.js` is the only thing that should write it — let it do the write). The token rotates whenever the builder clicks Re-issue again, so re-running this flow invalidates an exposed paste's usefulness for an attacker who lacks the browser cookie.
51
- - **Don't re-auth a valid session.** If `reauth.js` exits 0, stop.
52
- - **`GDS_API_BASE`** overrides the endpoint (default `https://example.com`); for local dev `GDS_API_BASE=http://localhost:3000`.
48
+ - **Don't re-sign-in a working session.** If the helper says the sign-in is working, stop.
49
+ - **Never ask for or accept a token in chat** on the one-click path — there is none to handle. Only the fallback carries one.
50
+ - **`BONGOS_API_BASE`** overrides the instance (for local dev `BONGOS_API_BASE=http://localhost:3000`).
53
51
 
54
52
  ## Files this skill touches
55
53
 
56
- - Runs: `node scripts/bongos/reauth.js` (detect + open browser + print click-path)
57
- - Runs: `bongos paste-token <token>` (verify + write the new session)
58
- - Reads/Writes (via paste-token.js): `~/.config/otb/gds-session.json`
59
- - Calls: `GET /api/bongos/me`; the Settings page (CLI Access) calls `POST /api/bongos/auth/cli-token/issue`
54
+ - Runs: `node scripts/bongos/reauth.js` (detect, browser approval, save) — `--paste` for the fallback
55
+ - Runs (fallback only): `bongos paste-token <token>`
56
+ - Writes (via `saveSession`): the active session file and the per-instance store under `~/.config/cloudbongos/`
57
+ - Calls: `GET /api/bongos/me`, `POST /api/bongos/auth/device/start` + `/auth/device/poll`; the browser page is `/api/bongos/auth/device`
@@ -322,6 +322,7 @@ export interface PostAuthDeviceApproveRequest { user_code: string; decision: "ap
322
322
  export interface PostAuthDeviceExchangeRequest { assertion: string }
323
323
  export interface PostAuthDeviceExchangeResponse { token: unknown; builder: unknown }
324
324
  export interface PostAuthDevicePollRequest { device_code: string }
325
+ export interface PostAuthDeviceStartRequest { approve_in_browser?: boolean }
325
326
  export interface PostAuthDiscordUnlinkResponse { ok: boolean; unlinked: unknown }
326
327
  export interface PostAuthLogoutResponse { ok: boolean }
327
328
  export interface PostAuthRevokeAllRequest { builder_id?: StringifiableId }
@@ -839,7 +840,7 @@ export interface BongosClient {
839
840
  /** POST /auth/device/poll — rank: public */
840
841
  postAuthDevicePoll(args: RequestArgs & { body: PostAuthDevicePollRequest }): Promise<ApiResponse>;
841
842
  /** POST /auth/device/start — rank: public */
842
- postAuthDeviceStart(args?: RequestArgs): Promise<ApiResponse>;
843
+ postAuthDeviceStart(args?: RequestArgs & { body?: PostAuthDeviceStartRequest }): Promise<ApiResponse>;
843
844
  /** GET /auth/discord/callback — rank: any-builder */
844
845
  getAuthDiscordCallback(args?: RequestArgs): Promise<ApiResponse>;
845
846
  /** GET /auth/discord/start — rank: any-builder */
@@ -58,3 +58,11 @@ Credits, ranks and community pages needed no change: the hub's check-in and roll
58
58
  - **Removing.** Never the last way in. And never GitHub from an account born with it: that account's key is its GitHub id, so a GitHub sign-in would still reach it and the removal would be a lie. A person who joined with Google may remove a linked GitHub, and then shows their stand-in again from their next sign-in.
59
59
  - **Every GitHub sign-in on the hub finds the person first** (the ADR 0393 carry-over, closed): the web and device sign-ins ask the hub who the GitHub id reaches and use that key. A project's command-line sign-in (`/sso/device/poll`) cannot tell whether the project takes a minted key, so for a GitHub account linked to someone who joined with Google it says to sign in in the browser.
60
60
  - **Matching emails suggest, never join.** This amends decision 3's "emails are never looked up" in one place only: on a first Google sign-in, if another account's GitHub way in shows the address Google verified, the person is offered "Sign in with GitHub" (then link Google from the account page) or "Make a new account with Google". Only the provider's name crosses; no account is named or joined. The hub keeps the GitHub address it sees at sign-in (GitHub's public address) for this alone.
61
+
62
+ ## Amendment — every re-sign-in is approved in the browser (task 1005118)
63
+
64
+ Decision 6 sent the terminal to the approval page only where Google is offered. A returning builder whose CLI session was revoked then had a four-step way back on every other instance: Settings → Re-issue CLI token → Copy → paste a `bongos paste-token <token>` line into the chat, which put a live bearer in the chat history.
65
+
66
+ So `/auth/device/start` now also answers with the approval page when the CLI asks for it (`{ "approve_in_browser": true }`), Google or not, and `scripts/bongos/reauth.js` asks. The browser is usually already signed in, so the way back is one Approve click and the token never leaves the server-to-terminal poll. On a GitHub-only instance the page's sign-in step offers GitHub alone.
67
+
68
+ A plain start is unchanged: a first sign-in on a GitHub-only instance keeps GitHub's device flow, because its `not_approved` answer is what `bongos login` turns into an access request. An older instance ignores the ask and answers GitHub's flow, which the CLI runs as before. The paste path stays as the fallback for a machine with no browser (`reauth.js --paste`).
@@ -2040,12 +2040,23 @@
2040
2040
  "description": "/auth/device — CLI flow rank: public — auth flow itself; identity establishment, not authorization.\n\n**Rank:** `public` — No authentication — any caller.",
2041
2041
  "x-rank": "public",
2042
2042
  "x-source": "src/bongos/routes/auth.js",
2043
+ "requestBody": {
2044
+ "required": false,
2045
+ "content": {
2046
+ "application/json": {
2047
+ "schema": {
2048
+ "$ref": "#/components/schemas/PostAuthDeviceStartRequest"
2049
+ }
2050
+ }
2051
+ },
2052
+ "x-validated": true
2053
+ },
2043
2054
  "responses": {
2044
2055
  "200": {
2045
2056
  "description": "Success."
2046
2057
  },
2047
2058
  "400": {
2048
- "$ref": "#/components/responses/BadRequest"
2059
+ "$ref": "#/components/responses/ValidationFailed"
2049
2060
  }
2050
2061
  },
2051
2062
  "security": []
@@ -36584,6 +36595,15 @@
36584
36595
  ],
36585
36596
  "additionalProperties": false
36586
36597
  },
36598
+ "PostAuthDeviceStartRequest": {
36599
+ "type": "object",
36600
+ "properties": {
36601
+ "approve_in_browser": {
36602
+ "type": "boolean"
36603
+ }
36604
+ },
36605
+ "additionalProperties": false
36606
+ },
36587
36607
  "PostAuthDiscordUnlinkResponse": {
36588
36608
  "type": "object",
36589
36609
  "properties": {
@@ -43542,7 +43562,7 @@
43542
43562
  }
43543
43563
  },
43544
43564
  "x-endpoint-count": 696,
43545
- "x-schema-count": 730,
43565
+ "x-schema-count": 731,
43546
43566
  "x-undocumented-bodies": 12,
43547
43567
  "x-response-schemas": 462,
43548
43568
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
@@ -88,7 +88,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
88
88
  | POST | `/api/bongos/auth/device/approve` | `any-builder` | `user_code`, `decision` | (own identity only) — mints a CLI session for the signed-in person themselves, from their browser cookie, never from a bearer (the /auth/… |
89
89
  | POST | `/api/bongos/auth/device/exchange` | `public` | `assertion` | POST /auth/device/exchange — CLI federation (ADR 0141 §1). |
90
90
  | POST | `/api/bongos/auth/device/poll` | `public` | `device_code` | auth flow; the device code itself is the bearer. |
91
- | POST | `/api/bongos/auth/device/start` | `public` | — | /auth/device — CLI flow rank: public — auth flow itself; identity establishment, not authorization. |
91
+ | POST | `/api/bongos/auth/device/start` | `public` | `approve_in_browser` | /auth/device — CLI flow rank: public — auth flow itself; identity establishment, not authorization. |
92
92
  | GET | `/api/bongos/auth/discord/callback` | `any-builder` | — | completes the link to the caller's own identity. |
93
93
  | GET | `/api/bongos/auth/discord/start` | `any-builder` | — | /auth/discord — account-linking OAuth (Phase 3 F2, ADR 0033 §2). |
94
94
  | POST | `/api/bongos/auth/discord/unlink` | `any-builder` | — | unlink your OWN Discord. |
@@ -10,7 +10,7 @@
10
10
 
11
11
  | surface | lives at | files | strings |
12
12
  |---|---|---|---|
13
- | `builders-hall` | `modules/hall-ui/public` | 179 | 2072 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 180 | 2072 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 89 |
15
15
  | `landing` | `modules/public-landing/public` | 10 | 1023 |
16
16
 
@@ -316,7 +316,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
316
316
  | `4df46e2be815` | certain | Clear the key? | `modules/hall-ui/public/market-watch-settings.js:218` |
317
317
  | `593dda3178eb` | certain | Click to copy | `modules/hall-ui/public/copy-on-click.js:137` |
318
318
  | `34624d39ff29` | certain | Clone the project to your machine and run | `modules/hall-ui/public/setup-gate.js:34` |
319
- | `3a426bad2c49` | certain | Close actions | `modules/hall-ui/public/visor.js:222` |
319
+ | `3a426bad2c49` | certain | Close actions | `modules/hall-ui/public/visor.js:232` |
320
320
  | `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
321
321
  | `053e576ba9a3` | certain | Close options | `modules/hall-ui/public/shell-game.js:454` |
322
322
  | `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
@@ -1486,7 +1486,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1486
1486
  | `9a685b01e2c6` | certain | This page opens at a higher rank. | `modules/hall-ui/public/watch.html:237` |
1487
1487
  | `e7a289134dc3` | certain | This page shows no words the reader could find. | `modules/hall-ui/public/tweak-editor.js:246` |
1488
1488
  | `d4b3b5556986` | certain | This page's reference docs | `modules/hall-ui/public/page-notes.js:166` |
1489
- | `79e4a934b434` | certain | This place | `modules/hall-ui/public/visor.js:224` |
1489
+ | `79e4a934b434` | certain | This place | `modules/hall-ui/public/visor.js:234` |
1490
1490
  | `5bdcbec770dd` | certain | This project has no slash commands yet. | `modules/hall-ui/public/commands.js:37` |
1491
1491
  | `f53b83bfbe54` | certain | This project has no watch rules yet. | `modules/hall-ui/public/market-watch-rules.js:62` |
1492
1492
  | `e97b2d549f10` | certain | This project is hosted on {…}, and that is where it is taken offline or removed. Both links below open this pr | `modules/hall-ui/public/project-settings.js:412` |
@@ -12,7 +12,7 @@
12
12
  "surfaces": {
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
- "files": 179,
15
+ "files": 180,
16
16
  "strings": 2072
17
17
  },
18
18
  "status-dashboard": {
@@ -5208,7 +5208,7 @@
5208
5208
  "surface": "builders-hall",
5209
5209
  "text": "Close actions",
5210
5210
  "file": "modules/hall-ui/public/visor.js",
5211
- "line": 222,
5211
+ "line": 232,
5212
5212
  "origin": "js-markup",
5213
5213
  "confidence": "certain"
5214
5214
  },
@@ -15738,7 +15738,7 @@
15738
15738
  "surface": "builders-hall",
15739
15739
  "text": "This place",
15740
15740
  "file": "modules/hall-ui/public/visor.js",
15741
- "line": 224,
15741
+ "line": 234,
15742
15742
  "origin": "js-markup",
15743
15743
  "confidence": "certain"
15744
15744
  },
@@ -3430,7 +3430,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
3430
3430
  landed since 1.24.88 with no explicit bump. run 43213545598. (task 1002620)
3431
3431
  1.24.90 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3432
3432
  landed since 1.24.89 with no explicit bump. run 43217068783. (task 1002620)
3433
- 1.24.91 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3434
- landed since 1.24.90 with no explicit bump. run 43220126363. (task 1002620)
3433
+ 1.24.92 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3434
+ landed since 1.24.90 with no explicit bump. run 43296447627. (task 1002620)
3435
+ 1.24.93 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3436
+ landed since 1.24.92 with no explicit bump. run 43299203682. (task 1002620)
3435
3437
  ---------------------------------------------------------------------------
3436
3438
  ```
@@ -414,7 +414,8 @@
414
414
  "modules/hall-ui/public/sky-interaction.js",
415
415
  "modules/hall-ui/public/sky-panel.js",
416
416
  "modules/hall-ui/public/sky-composer.js",
417
- "modules/hall-ui/public/sky-tour.js"
417
+ "modules/hall-ui/public/sky-tour.js",
418
+ "modules/hall-ui/public/sky-visor.js"
418
419
  ],
419
420
  "states_files": [
420
421
  "modules/hall-ui/public/goal-map.states.json"
@@ -1324,7 +1325,8 @@
1324
1325
  "modules/hall-ui/public/sky-interaction.js",
1325
1326
  "modules/hall-ui/public/sky-panel.js",
1326
1327
  "modules/hall-ui/public/sky-composer.js",
1327
- "modules/hall-ui/public/sky-tour.js"
1328
+ "modules/hall-ui/public/sky-tour.js",
1329
+ "modules/hall-ui/public/sky-visor.js"
1328
1330
  ],
1329
1331
  "states_files": [
1330
1332
  "modules/hall-ui/public/thinking.states.json"