@bongos/core 1.24.91 → 1.24.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/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.92",
6
+ "core_contract": "1.24.92",
7
+ "source_commit": "5c483e2ab47fc0cca7356e60e6cc00e055dba066",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-11-12T12:41:58.407Z",
9
+ "built_at": "2026-11-12T20:04:52.110Z",
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": 3965,
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": 4648,
20
+ "tree_sha256": "4efb5396f6e0daf17115f129bef70f7f252a5ba802e08886aa949d036aab5353",
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": "daec3c74bc27e603c5ded55ed72be5e4c82cd31efc5b9363a7755eb91b97f56c"
2521
2521
  },
2522
2522
  {
2523
2523
  "path": "docs/copy-registry.json",
2524
2524
  "mode": "0000644",
2525
- "sha256": "611c4618f066d69b80124ad51138927337aa64401fe566eddbd5f2f7f329591d"
2525
+ "sha256": "2a1347d59793c3b152b0179523fbcff57a5edacb3ac043bfad321d50d38f7bc4"
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": "88e6ca24e358d295f74a7dd741f610062d3f44043b617d5a06c83f55164090d7"
3041
3041
  },
3042
3042
  {
3043
3043
  "path": "docs/modules-contract.md",
@@ -3122,7 +3122,7 @@
3122
3122
  {
3123
3123
  "path": "docs/page-readings.json",
3124
3124
  "mode": "0000644",
3125
- "sha256": "e793384169510479355b6d08b5d937d3d3b907a244c37bb2af6f03d1615d57bb"
3125
+ "sha256": "46fa6c491c705c13c961d1efbe3453ca2afd1d56f0b230f6024435f6b605f072"
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": "3ad52ec95501913a0a4bbb8378c33e3e1f8459d4b233b96c88db012d1f68a66b"
6236
6236
  },
6237
6237
  {
6238
6238
  "path": "modules/hall-ui/public/city.states.json",
@@ -7442,7 +7442,7 @@
7442
7442
  {
7443
7443
  "path": "modules/hall-ui/public/visor.js",
7444
7444
  "mode": "0000644",
7445
- "sha256": "7c3dec2c81435516e15a35d4245557215c84d809f76ac9b49f95529a935518ec"
7445
+ "sha256": "862ab2d430e0fc42bed3e757af5a07e672022803f098c3acc7582a62592f5ac1"
7446
7446
  },
7447
7447
  {
7448
7448
  "path": "modules/hall-ui/public/vote-control.js",
@@ -7752,7 +7752,7 @@
7752
7752
  {
7753
7753
  "path": "modules/hall-ui/records/visor.md",
7754
7754
  "mode": "0000644",
7755
- "sha256": "515c6e31880265d11477e723fd0307d49409b6c04d5e53aa6579ef809c88269b"
7755
+ "sha256": "a8d42170b6a0b27e8f75f3866c936c72f06c35a8ef44ae2bc7d034c213736d26"
7756
7756
  },
7757
7757
  {
7758
7758
  "path": "modules/hall-ui/records/welcome-tower.md",
@@ -12102,12 +12102,12 @@
12102
12102
  {
12103
12103
  "path": "package-lock.json",
12104
12104
  "mode": "0000644",
12105
- "sha256": "ab7441e6cc38edc40acce9d7090d25016f42420246eaf6ed7e2f37eab0200024"
12105
+ "sha256": "0991d22207637a766189c9d741ee4e8c166d315554259886978355b181da37be"
12106
12106
  },
12107
12107
  {
12108
12108
  "path": "package.json",
12109
12109
  "mode": "0000644",
12110
- "sha256": "eb582572ac4dd9fa60fe3275a450b9aa4599edc45600a1f8bf066e15d9a341b3"
12110
+ "sha256": "1de1dbdb758d263abd1d822870f785231ec5f9dae3e115345741911f5c325a17"
12111
12111
  },
12112
12112
  {
12113
12113
  "path": "public-docs/index.html",
@@ -12127,7 +12127,7 @@
12127
12127
  {
12128
12128
  "path": "release-notes.json",
12129
12129
  "mode": "0000644",
12130
- "sha256": "c44e40bf773cc25fdb58b9bae2081fb6fa18132e915649a6acf05a18a74412d6"
12130
+ "sha256": "28d81c1f519f6dcfdf35231190bf317d97a1920e15930f92a98fafcc20e47027"
12131
12131
  },
12132
12132
  {
12133
12133
  "path": "scripts/bongos/CLAUDE.md",
@@ -12417,7 +12417,7 @@
12417
12417
  {
12418
12418
  "path": "scripts/bongos/cli-lib.js",
12419
12419
  "mode": "0000644",
12420
- "sha256": "7f00d2ce761ee775341e21cce68e64b8346f2f2c4bcd5cd41b16b9e8404f926e"
12420
+ "sha256": "49a35fbc1523b75e922ed79ff473e833a8cae915d46d36981b8993eb522571be"
12421
12421
  },
12422
12422
  {
12423
12423
  "path": "scripts/bongos/client-baseurl-guard.js",
@@ -12937,7 +12937,7 @@
12937
12937
  {
12938
12938
  "path": "scripts/bongos/login.js",
12939
12939
  "mode": "0000644",
12940
- "sha256": "0a13005b8a73dd31b46bdb6f7762f483654e85e060f37eb8e78d9a6088f7245c"
12940
+ "sha256": "c6e9232bae6700d8e4bebfd11796b00ee850ae78da5ae689dcc109366bb46600"
12941
12941
  },
12942
12942
  {
12943
12943
  "path": "scripts/bongos/main-audit.js",
@@ -13127,7 +13127,7 @@
13127
13127
  {
13128
13128
  "path": "scripts/bongos/plain-cards.js",
13129
13129
  "mode": "0000644",
13130
- "sha256": "2fc62830cab07c3536eeb531429de39b1726657e5fd6862b9bf3b6d76e93e56d"
13130
+ "sha256": "755fdb4f7596c114a888fbdaf540e82bccd184b6ae7b4bf01d8163b3f0b9ed0e"
13131
13131
  },
13132
13132
  {
13133
13133
  "path": "scripts/bongos/portability-smoke-art.sh",
@@ -13292,7 +13292,7 @@
13292
13292
  {
13293
13293
  "path": "scripts/bongos/reauth.js",
13294
13294
  "mode": "0000644",
13295
- "sha256": "2e790186eebf403037e61a499bd865a9ebdfb8fe6e9958d95a4cd078f7b521fa"
13295
+ "sha256": "5d62a84e7f2e35ab6fa37c5fd7b37bd9baf48b7bc984591a01c8850665746f88"
13296
13296
  },
13297
13297
  {
13298
13298
  "path": "scripts/bongos/recall.js",
@@ -15912,7 +15912,7 @@
15912
15912
  {
15913
15913
  "path": "src/bongos/routes/auth-google.js",
15914
15914
  "mode": "0000644",
15915
- "sha256": "f7531eefb5d958f4924aff1e0e1bf8bf258f82cc676d7bdb0f26e6235a181ae4"
15915
+ "sha256": "7d42cf2a68ebf6d852cc63fdfb8774867221b880025669d5f9a29ac20f26bd9d"
15916
15916
  },
15917
15917
  {
15918
15918
  "path": "src/bongos/routes/auth-link.js",
@@ -15922,7 +15922,7 @@
15922
15922
  {
15923
15923
  "path": "src/bongos/routes/auth.js",
15924
15924
  "mode": "0000644",
15925
- "sha256": "5dac69f518fb0933f111d3df4dfc400e1573ffd2849abe7599ed16bd0ab63d58"
15925
+ "sha256": "438f7feeb87eb85b4aaca2bf20e0304d95822a8e77c92f9c2a042a90dd0bb03d"
15926
15926
  },
15927
15927
  {
15928
15928
  "path": "src/bongos/routes/backup.js",
@@ -16062,7 +16062,7 @@
16062
16062
  {
16063
16063
  "path": "src/bongos/sign-in-pages.js",
16064
16064
  "mode": "0000644",
16065
- "sha256": "cfd8a09da90e8f2a176e94c960736bbb295c216a1d6bf1f8027f7f0ce1ceacc8"
16065
+ "sha256": "8f93a2b576e4f2b2bdaf8feec2a8c6c4b23f31be4c071f119a4ca56f39e5fa6c"
16066
16066
  },
16067
16067
  {
16068
16068
  "path": "src/bongos/software-update.js",
@@ -16132,7 +16132,7 @@
16132
16132
  {
16133
16133
  "path": "src/module-api.js",
16134
16134
  "mode": "0000644",
16135
- "sha256": "95d86d1e9db626680711ac8e0f79e6458c5e20b0af7343640c6cf0d4e5e6cadd"
16135
+ "sha256": "d01b0c8ee350427a447cb9f10713e5abbf76d49f57702e7dee8942a8c2de39e1"
16136
16136
  },
16137
16137
  {
16138
16138
  "path": "src/module-loader/catalog.js",
@@ -17174,6 +17174,11 @@
17174
17174
  "mode": "0000644",
17175
17175
  "sha256": "79c57041a871f9700682ac96cebf5d07fe393cc274b5549e8659cad34f44cee1"
17176
17176
  },
17177
+ {
17178
+ "path": "tests/cli_reauth_browser.mjs",
17179
+ "mode": "0000644",
17180
+ "sha256": "758964ef9d4d5d1921162aab1e86a4fb07fe7347aca5866391c8dd33ce67d94d"
17181
+ },
17177
17182
  {
17178
17183
  "path": "tests/cli_sessions.mjs",
17179
17184
  "mode": "0000644",
@@ -19027,7 +19032,7 @@
19027
19032
  {
19028
19033
  "path": "tests/hall_city.mjs",
19029
19034
  "mode": "0000644",
19030
- "sha256": "781ad77857a1c04165bdd98d033a0776f036feff0752a49b033a4a1bc8179f13"
19035
+ "sha256": "5483169cd2c06f4782662148aa8bd7381db888c6c2052f63b92582d8c80677ac"
19031
19036
  },
19032
19037
  {
19033
19038
  "path": "tests/hall_city_card_words.mjs",
@@ -19037,7 +19042,7 @@
19037
19042
  {
19038
19043
  "path": "tests/hall_city_living.mjs",
19039
19044
  "mode": "0000644",
19040
- "sha256": "1b6744e38a44f486978a1f3ecf275fa260a6d79b0779242fdd4827980b14593d"
19045
+ "sha256": "a8d7ef26e5f647dac6fb03d3759968585ef0146a03de6c8e2897c0943c6db1ee"
19041
19046
  },
19042
19047
  {
19043
19048
  "path": "tests/hall_city_rewording.mjs",
@@ -19387,7 +19392,7 @@
19387
19392
  {
19388
19393
  "path": "tests/hall_visor.mjs",
19389
19394
  "mode": "0000644",
19390
- "sha256": "055de4ac3afe4e7883be6cb462e00879bafc4c7593186ae7d728dbd5ee13f6f6"
19395
+ "sha256": "059033debd304e748ec9b79b127ff3c188b474d7e81570c8cbe8dea9a8cec1b6"
19391
19396
  },
19392
19397
  {
19393
19398
  "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. |
@@ -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` |
@@ -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,7 @@ 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
3435
  ---------------------------------------------------------------------------
3436
3436
  ```
@@ -283,7 +283,7 @@
283
283
  "surface": "builders",
284
284
  "title": "The city",
285
285
  "states_read": ["city","fullscreen","focus","pins","living","card","card-ask"],
286
- "files_hash": "43c2a3f5444895d6",
286
+ "files_hash": "2b261787034bce4e",
287
287
  "reading_hash": "277096d903879a57",
288
288
  "counts": {"lines":26,"placed":9,"shared":6,"unplaced":11},
289
289
  "omitted": {"data":7},
@@ -613,7 +613,7 @@
613
613
  "surface": "builders",
614
614
  "title": "The sky",
615
615
  "states_read": ["tour","sky","wells","ledger","full","full-back","out"],
616
- "files_hash": "ca4e9b0498d510b8",
616
+ "files_hash": "0e5090070ad1a630",
617
617
  "reading_hash": "4a879397a84631e3",
618
618
  "counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
619
619
  "omitted": {"data":10},
@@ -954,8 +954,8 @@
954
954
  "surface": "builders",
955
955
  "title": "Builders' Hall",
956
956
  "states_read": ["home","out","founding","genesis","decide","demo"],
957
- "files_hash": "0091ac704ef9996f",
958
- "reading_hash": "67b29854aad1bffe",
957
+ "files_hash": "8f04eab06feba493",
958
+ "reading_hash": "42901560779fc4d1",
959
959
  "counts": {"lines":32,"placed":12,"shared":8,"unplaced":12},
960
960
  "omitted": {"data":5},
961
961
  "notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
@@ -977,7 +977,7 @@
977
977
  {"key":"L0015","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":320,"string_id":"e181637c5a5e"},
978
978
  {"key":"L0016","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
979
979
  {"key":"L0017","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":514,"string_id":"1883ad7f07fc"},
980
- {"key":"L0018","section":"Needs your attention13","text":"core 1.24.89","placement":"unplaced"},
980
+ {"key":"L0018","section":"Needs your attention13","text":"core 1.24.90","placement":"unplaced"},
981
981
  {"key":"L0019","section":"Needs your attention13","text":"Skip","placement":"unplaced"},
982
982
  {"key":"L0020","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":183,"string_id":"fef59346ffee"},
983
983
  {"key":"L0021","section":"Needs your attention13","text":"cloudbongos.com","placement":"unplaced"},
@@ -3159,7 +3159,7 @@
3159
3159
  "surface": "builders",
3160
3160
  "title": "Your thinking",
3161
3161
  "states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
3162
- "files_hash": "3e3d0ce3f938dfc4",
3162
+ "files_hash": "5b659820f85a7141",
3163
3163
  "reading_hash": "b73f848b46b0f9b8",
3164
3164
  "counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
3165
3165
  "omitted": {"data":10},
@@ -88,8 +88,12 @@ html:has(body[data-page="city"]) { height: 100%; }
88
88
  the home above and below measures from the stage instead of the window. */
89
89
  .city-main { position: fixed; top: var(--topbar-h, 56px); left: var(--sidebar-w-rail, 64px); right: 0; bottom: 0; max-width: none; margin: 0; contain: layout paint; z-index: 1; }
90
90
  html[data-fullscreen="on"] .city-main { top: 0; left: 0; }
91
- /* tasks 1005148 and 1005195: with the visor up (game mode), the door rises clear of its foot row, whose one button is centred too. */
92
- html.visor-on .city-door { bottom: 150px; }
91
+ /* tasks 1005148, 1005195 and 1005209: with the visor up (game mode), the door (now its line alone) rises clear of the
92
+ foot row, whose one button is centred too, even when the key hints wrap onto a second line. */
93
+ html.visor-on .city-door { bottom: 224px; }
94
+ /* task 1005209 (ADR 0403): with the visor up the door's button and the archived links are the
95
+ visor's (D on the glass, the rest in its Actions sheet), so the scene carries none of its own. */
96
+ html.visor-on .city-start, html.visor-on .city-archived { display: none; }
93
97
  @media (max-width: 768px) { .city-main { left: 0; } }
94
98
  /* The full-screen switch floats top right over the stage, where the sun/moon
95
99
  switch sits; the strip steps in by the button's width so nothing sits under it.