@bongos/core 1.19.791 → 1.19.792
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 +43 -28
- package/.claude/skills/builder-reauth/SKILL.md +5 -3
- package/README.md +1 -1
- package/docs/adr/0206-own-scoped-session-revocation-no-absolute-ceiling.md +2 -0
- package/docs/adr/0294-cli-sessions-do-not-expire.md +56 -0
- package/docs/adr/README.md +1 -0
- package/docs/copy-inventory.md +31 -31
- package/docs/copy-registry.json +41 -41
- package/docs/module-api-changelog.md +2 -0
- package/migrations/core_243_cli_sessions_never_expire.sql +58 -0
- package/modules/hall-ui/public/settings.js +5 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/box-auth-check.js +1 -1
- package/scripts/gds/cli-lib.js +2 -2
- package/scripts/gds/reauth.js +9 -7
- package/scripts/gds/run-unit-tests.js +7 -0
- package/src/bongos/auth-github.js +2 -0
- package/src/bongos/db-kernel.js +29 -11
- package/src/bongos/db.js +33 -24
- package/src/bongos/routes/auth.js +3 -2
- package/src/module-api.js +1 -1
- package/tests/auth_session_expiry_db.mjs +183 -0
- package/tests/auth_session_ttl.mjs +124 -11
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.792",
|
|
6
|
+
"core_contract": "1.19.792",
|
|
7
|
+
"source_commit": "7d0308f082bb516dafaf779e6e8955df07aac1f0",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-17T00:
|
|
9
|
+
"built_at": "2026-09-17T00:25:50.991Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 486,
|
|
13
13
|
"agent_docs_stubbed": 25,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2179,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2690,
|
|
20
|
+
"tree_sha256": "82a4277b3d647e6c4e975f1a9b4c6316a2177aa583ebaba8a37aab51a552694e",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
{
|
|
78
78
|
"path": ".claude/skills/builder-reauth/SKILL.md",
|
|
79
79
|
"mode": "0000644",
|
|
80
|
-
"sha256": "
|
|
80
|
+
"sha256": "41527df350a69c001dd9a1a2d07767338fa216af58bea5a2019c2261d2b69aaa"
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
"path": ".claude/skills/builder-redteam/SKILL.md",
|
|
@@ -337,7 +337,7 @@
|
|
|
337
337
|
{
|
|
338
338
|
"path": "README.md",
|
|
339
339
|
"mode": "0000644",
|
|
340
|
-
"sha256": "
|
|
340
|
+
"sha256": "39267c71403ae6fa77551c88773e6ff744032b6ae2d9bfa002573c0c520a148a"
|
|
341
341
|
},
|
|
342
342
|
{
|
|
343
343
|
"path": "bin/bongos.js",
|
|
@@ -1522,7 +1522,7 @@
|
|
|
1522
1522
|
{
|
|
1523
1523
|
"path": "docs/adr/0206-own-scoped-session-revocation-no-absolute-ceiling.md",
|
|
1524
1524
|
"mode": "0000644",
|
|
1525
|
-
"sha256": "
|
|
1525
|
+
"sha256": "f8654e155205d9566aab8a103b6fbdb6100e23ddba3c74bb417955cef997e0f0"
|
|
1526
1526
|
},
|
|
1527
1527
|
{
|
|
1528
1528
|
"path": "docs/adr/0207-connections-implementation-departures-and-honest-limits.md",
|
|
@@ -1954,10 +1954,15 @@
|
|
|
1954
1954
|
"mode": "0000644",
|
|
1955
1955
|
"sha256": "fb72a972f472cfea4c214dc73c7c5e811670d4eb2bbbc8d397495c8756daa625"
|
|
1956
1956
|
},
|
|
1957
|
+
{
|
|
1958
|
+
"path": "docs/adr/0294-cli-sessions-do-not-expire.md",
|
|
1959
|
+
"mode": "0000644",
|
|
1960
|
+
"sha256": "32d1b4184b6ba494bacb915990f0ba2770535e25c5646c86a2d91d9cc05c93ed"
|
|
1961
|
+
},
|
|
1957
1962
|
{
|
|
1958
1963
|
"path": "docs/adr/README.md",
|
|
1959
1964
|
"mode": "0000644",
|
|
1960
|
-
"sha256": "
|
|
1965
|
+
"sha256": "5659dd04d00f3ac4b3087ec41d24d7eea6f9d3ad349cd68b4405b612c8238feb"
|
|
1961
1966
|
},
|
|
1962
1967
|
{
|
|
1963
1968
|
"path": "docs/api-reference.md",
|
|
@@ -1992,12 +1997,12 @@
|
|
|
1992
1997
|
{
|
|
1993
1998
|
"path": "docs/copy-inventory.md",
|
|
1994
1999
|
"mode": "0000644",
|
|
1995
|
-
"sha256": "
|
|
2000
|
+
"sha256": "ec93785011f13f27444bd8ccfe9fe24da8cd125cd1b440bb974b78ebe1b28533"
|
|
1996
2001
|
},
|
|
1997
2002
|
{
|
|
1998
2003
|
"path": "docs/copy-registry.json",
|
|
1999
2004
|
"mode": "0000644",
|
|
2000
|
-
"sha256": "
|
|
2005
|
+
"sha256": "76dfd0c0caaedc010f832b44a3acef437f7352e86090cc46f7ce1edb15b6f192"
|
|
2001
2006
|
},
|
|
2002
2007
|
{
|
|
2003
2008
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2522,7 +2527,7 @@
|
|
|
2522
2527
|
{
|
|
2523
2528
|
"path": "docs/module-api-changelog.md",
|
|
2524
2529
|
"mode": "0000644",
|
|
2525
|
-
"sha256": "
|
|
2530
|
+
"sha256": "a0c0e1aafc81738b39d52423b76ebbc23bfecd478ddee519c341d25a265a1e93"
|
|
2526
2531
|
},
|
|
2527
2532
|
{
|
|
2528
2533
|
"path": "docs/modules-contract.md",
|
|
@@ -3604,6 +3609,11 @@
|
|
|
3604
3609
|
"mode": "0000644",
|
|
3605
3610
|
"sha256": "e52821124b99bd844c8323f2de0221db3fafd92c0c6e2227838cadf7d987676a"
|
|
3606
3611
|
},
|
|
3612
|
+
{
|
|
3613
|
+
"path": "migrations/core_243_cli_sessions_never_expire.sql",
|
|
3614
|
+
"mode": "0000644",
|
|
3615
|
+
"sha256": "8e3e2db2ab3b7775bddf12f3a7ec3ed74477334b6388487ecd919cd61a62b0ba"
|
|
3616
|
+
},
|
|
3607
3617
|
{
|
|
3608
3618
|
"path": "modules/agents/CLAUDE.md",
|
|
3609
3619
|
"mode": "0000644",
|
|
@@ -5227,7 +5237,7 @@
|
|
|
5227
5237
|
{
|
|
5228
5238
|
"path": "modules/hall-ui/public/settings.js",
|
|
5229
5239
|
"mode": "0000644",
|
|
5230
|
-
"sha256": "
|
|
5240
|
+
"sha256": "fd553ac7c0ca9c74526647388e42afc18fc7c1b9f2cfc70c493f78343ba7c393"
|
|
5231
5241
|
},
|
|
5232
5242
|
{
|
|
5233
5243
|
"path": "modules/hall-ui/public/settings.states.json",
|
|
@@ -7682,12 +7692,12 @@
|
|
|
7682
7692
|
{
|
|
7683
7693
|
"path": "package-lock.json",
|
|
7684
7694
|
"mode": "0000644",
|
|
7685
|
-
"sha256": "
|
|
7695
|
+
"sha256": "a4f7542d3fd24e6d64fc20658f5339458a3ec0e38cccb5b12959b40babedf580"
|
|
7686
7696
|
},
|
|
7687
7697
|
{
|
|
7688
7698
|
"path": "package.json",
|
|
7689
7699
|
"mode": "0000644",
|
|
7690
|
-
"sha256": "
|
|
7700
|
+
"sha256": "fbda0210622f719253cab72cd3ab108ef90efa5d1357c4df20afa076e15add1f"
|
|
7691
7701
|
},
|
|
7692
7702
|
{
|
|
7693
7703
|
"path": "public-docs/index.html",
|
|
@@ -7897,7 +7907,7 @@
|
|
|
7897
7907
|
{
|
|
7898
7908
|
"path": "scripts/gds/box-auth-check.js",
|
|
7899
7909
|
"mode": "0000644",
|
|
7900
|
-
"sha256": "
|
|
7910
|
+
"sha256": "c24c66d306b2904692bddfad0ea3cb023f8532beb3d674a2a81e6fed0eeb9bd5"
|
|
7901
7911
|
},
|
|
7902
7912
|
{
|
|
7903
7913
|
"path": "scripts/gds/box-connect-lib.js",
|
|
@@ -7992,7 +8002,7 @@
|
|
|
7992
8002
|
{
|
|
7993
8003
|
"path": "scripts/gds/cli-lib.js",
|
|
7994
8004
|
"mode": "0000644",
|
|
7995
|
-
"sha256": "
|
|
8005
|
+
"sha256": "88b8d2359743238922d73797807dd2f545b1a68c731d8a4766d7210196ad48fc"
|
|
7996
8006
|
},
|
|
7997
8007
|
{
|
|
7998
8008
|
"path": "scripts/gds/client-baseurl-guard.js",
|
|
@@ -8627,7 +8637,7 @@
|
|
|
8627
8637
|
{
|
|
8628
8638
|
"path": "scripts/gds/reauth.js",
|
|
8629
8639
|
"mode": "0000644",
|
|
8630
|
-
"sha256": "
|
|
8640
|
+
"sha256": "5368ed9a43034b060451e54f21f885c216fab17cf731d7981d2681aeae890507"
|
|
8631
8641
|
},
|
|
8632
8642
|
{
|
|
8633
8643
|
"path": "scripts/gds/recall.js",
|
|
@@ -8702,7 +8712,7 @@
|
|
|
8702
8712
|
{
|
|
8703
8713
|
"path": "scripts/gds/run-unit-tests.js",
|
|
8704
8714
|
"mode": "0000644",
|
|
8705
|
-
"sha256": "
|
|
8715
|
+
"sha256": "c7ea33433208b0835808028fb81853509d97331b919a70314e1a02718e8ca0c0"
|
|
8706
8716
|
},
|
|
8707
8717
|
{
|
|
8708
8718
|
"path": "scripts/gds/sandbox-stage.js",
|
|
@@ -9287,7 +9297,7 @@
|
|
|
9287
9297
|
{
|
|
9288
9298
|
"path": "src/bongos/auth-github.js",
|
|
9289
9299
|
"mode": "0000644",
|
|
9290
|
-
"sha256": "
|
|
9300
|
+
"sha256": "e2afb2d5f5459ed307be4e6e2d57cbd283b97794f8d1a99f4df5673000270681"
|
|
9291
9301
|
},
|
|
9292
9302
|
{
|
|
9293
9303
|
"path": "src/bongos/auth-idp.js",
|
|
@@ -9312,12 +9322,12 @@
|
|
|
9312
9322
|
{
|
|
9313
9323
|
"path": "src/bongos/db-kernel.js",
|
|
9314
9324
|
"mode": "0000644",
|
|
9315
|
-
"sha256": "
|
|
9325
|
+
"sha256": "e9a566e63b95225e3ee15331424af831875f75b5ea977c73f077bb50f46c4c6b"
|
|
9316
9326
|
},
|
|
9317
9327
|
{
|
|
9318
9328
|
"path": "src/bongos/db.js",
|
|
9319
9329
|
"mode": "0000644",
|
|
9320
|
-
"sha256": "
|
|
9330
|
+
"sha256": "7ebe731cacb9d7cb72af9e8310ccefc9d902b9e613c45839bc1555b5bb71cd5a"
|
|
9321
9331
|
},
|
|
9322
9332
|
{
|
|
9323
9333
|
"path": "src/bongos/github-repos.js",
|
|
@@ -9457,7 +9467,7 @@
|
|
|
9457
9467
|
{
|
|
9458
9468
|
"path": "src/bongos/routes/auth.js",
|
|
9459
9469
|
"mode": "0000644",
|
|
9460
|
-
"sha256": "
|
|
9470
|
+
"sha256": "4723bdcca92e442d73517df92463f58d16f0773d4167d8661a75fd9a7a61392d"
|
|
9461
9471
|
},
|
|
9462
9472
|
{
|
|
9463
9473
|
"path": "src/bongos/routes/backup.js",
|
|
@@ -9567,7 +9577,7 @@
|
|
|
9567
9577
|
{
|
|
9568
9578
|
"path": "src/module-api.js",
|
|
9569
9579
|
"mode": "0000644",
|
|
9570
|
-
"sha256": "
|
|
9580
|
+
"sha256": "51bcfd1a4eb31a189085c07cdcc46dd1b9d923c9335021ea3dcb54c6c55e01c6"
|
|
9571
9581
|
},
|
|
9572
9582
|
{
|
|
9573
9583
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9899,10 +9909,15 @@
|
|
|
9899
9909
|
"mode": "0000644",
|
|
9900
9910
|
"sha256": "acbce017f7111b67c556db645de7b88fb5f39829755fa6c9378f300c8fc62a15"
|
|
9901
9911
|
},
|
|
9912
|
+
{
|
|
9913
|
+
"path": "tests/auth_session_expiry_db.mjs",
|
|
9914
|
+
"mode": "0000644",
|
|
9915
|
+
"sha256": "880cbfa0304ab037db980f22471a2b46bcdbad0e7dca57af359402dbb068d6a4"
|
|
9916
|
+
},
|
|
9902
9917
|
{
|
|
9903
9918
|
"path": "tests/auth_session_ttl.mjs",
|
|
9904
9919
|
"mode": "0000644",
|
|
9905
|
-
"sha256": "
|
|
9920
|
+
"sha256": "e4c3309248873ac816ecf9111cc08e4c9e3e6c318a2e925434f1cc490c71b734"
|
|
9906
9921
|
},
|
|
9907
9922
|
{
|
|
9908
9923
|
"path": "tests/auth_web_recovery.mjs",
|
|
@@ -4,11 +4,13 @@ description: >-
|
|
|
4
4
|
Refresh an expired Bongos CLI session the UI-first way — Settings, copy the re-issue one-liner, this runs it. 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".
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
You are refreshing the current builder's Bongos CLI session. CLI bearer tokens
|
|
7
|
+
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.
|
|
8
8
|
|
|
9
|
-
## Why expiry
|
|
9
|
+
## Why there is no expiry (so you can explain it if asked)
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
There used to be a 24h idle TTL, for auth-token hygiene (GDS-V3 criterion **C9**): the CLI token sits in a plaintext file (`~/.config/cloudbongos/bongos-session.json`, mode 0600), so bounding a leaked or abandoned token seemed worth the friction. It wasn't. Because the TTL refreshed on every use, a thief's own traffic kept a stolen token alive indefinitely — the only person a timer ever signed out was the legitimate holder, who had stepped away. [ADR 0294](../../../docs/adr/0294-cli-sessions-do-not-expire.md) removed it.
|
|
12
|
+
|
|
13
|
+
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)).
|
|
12
14
|
|
|
13
15
|
## The flow (guided paste)
|
|
14
16
|
|
package/README.md
CHANGED
|
@@ -73,7 +73,7 @@ We keep secrets (`.env` files, API keys, private keys) out of the repo with two
|
|
|
73
73
|
|
|
74
74
|
## If your CLI starts 401'ing
|
|
75
75
|
|
|
76
|
-
GDS CLI calls (`node scripts/gds/start.js`, `claim.js`, `ship.js`, etc.) authenticate against your instance's GDS host using a session token stored under `~/.config/<configDir
|
|
76
|
+
GDS CLI calls (`node scripts/gds/start.js`, `claim.js`, `ship.js`, etc.) authenticate against your instance's GDS host using a session token stored under `~/.config/<configDir>/` (the neutral core uses `cloudbongos`; an instance may pin its own). CLI sessions do not expire — they last until revoked ([ADR 0294](docs/adr/0294-cli-sessions-do-not-expire.md)) — so a 401 means the token was revoked (by you from Settings → Active sessions, or by an Archon), swept by a rank demotion, or invalidated by an auth-changing deploy.
|
|
77
77
|
|
|
78
78
|
`apiCall` in `scripts/gds/cli-lib.js` detects HTTP 401 and exits with a clear recovery message rather than letting the failure cascade. When you see it:
|
|
79
79
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
- **Task:** task 1003341 (goal 1000045 — public builder profiles + account security, criterion `i-control-my-own-access-and-exposure`)
|
|
7
7
|
- **Interacts with:** [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (the DB enforces; a session is checked fresh per request, never cached), [ADR 0053](0053-scoped-dev-box-session.md) / [ADR 0151](0151-governance-permissions-as-atom-ranks-as-roles.md) §3 (the session-scope registry — scope is capability on the token, orthogonal to rank), migration `035_auth_token_hygiene.sql` (the 24h TTL + refresh-on-use it introduced, and the deliberate backfill grace that came with it).
|
|
8
8
|
|
|
9
|
+
> **Amended by [ADR 0294](0294-cli-sessions-do-not-expire.md) (2026-09-16).** This ADR declined to add an absolute ceiling *on top of* the 24h sliding TTL, and that judgement stands unchanged. What changed afterwards is the sliding TTL itself: ADR 0294 removed it from CLI sessions entirely, on the same reasoning this file states below — refresh-on-use meant the timer only ever fired on the legitimate holder, never on a leak. So where the text below says an idle session expires after 24h, read: CLI sessions do not expire at all, and the own-scoped revoke shipped here is now the only bound on a leaked bearer rather than the faster of two.
|
|
10
|
+
|
|
9
11
|
## Context
|
|
10
12
|
|
|
11
13
|
`db-kernel.js lookupSession` rewrites `expires_at = now() + 24h` on every authenticated request. That is refresh-on-use, and for a session in daily use it means the TTL never arrives: a CLI bearer sitting in `~/.config/otb/gds-session.json` is, in practice, immortal. If it leaks — committed to a repo, left on a shared dev box, copied off a stolen laptop — the holder keeps it alive simply by using it.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# 0294 — CLI sessions do not expire; revocation is the whole remedy
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-09-16
|
|
5
|
+
- **Deciders:** The owner, who asked for the CLI timeout removed entirely after a three-week gap signed him out, and accepted the stated security consequence.
|
|
6
|
+
- **Task:** task 1003956 (goal 1000110 — Working area 2: account creation, management & community)
|
|
7
|
+
- **Interacts with:** [ADR 0206](0206-own-scoped-session-revocation-no-absolute-ceiling.md) (the own-scoped revoke this leans on, and the ceiling it declined to build), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (a session is resolved fresh per request, never cached), migrations `035_auth_token_hygiene.sql` (introduced the TTL) and `core_243_cli_sessions_never_expire.sql` (clears it).
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
A `bongos` sign-in died after 24 hours of not being used. `db-kernel.js createSession` defaulted a null `expiresAt` to `now() + SESSION_TTL_MS`, and `lookupSession` rewrote `expires_at = now() + 24h` on every authenticated request. An actively-used session therefore never lapsed; an idle one did, and the builder came back to `Your Bongos CLI session is no longer valid` blocking every `/builder-*` command until they re-authed through the browser.
|
|
12
|
+
|
|
13
|
+
This is the third time the number has been argued. V3.R38 (task #259, migration 035) set it to 1 hour. V3.R90 (task 1000400) widened it to 24 hours with the note that 1h "kicked builders out over lunch". Each round shortened the nuisance and left the mechanism alone. The owner hit it again on 2026-09-16 after a three-week gap and asked for the timeout gone rather than widened a fourth time.
|
|
14
|
+
|
|
15
|
+
The argument for keeping it was always auth-token hygiene (GDS-V3 criterion C9): the token sits in a plaintext file at mode 0600, so a leaked or abandoned copy should not live forever. **That argument does not survive contact with refresh-on-use.** A leaked token is, by definition, a token somebody is using — and every use rolled the expiry forward another 24 hours. The timer could only ever fire on a session that had gone quiet, which is the legitimate holder stepping away, not the thief. The control was aimed at attackers and landed exclusively on users. ADR 0206 had already written down half of this ("a CLI bearer sitting in the session file is, in practice, immortal"); what it did not do is draw the conclusion that a control which cannot reach its target is not worth its cost.
|
|
16
|
+
|
|
17
|
+
What genuinely bounds a leaked bearer arrived with ADR 0206 itself: `GET /me/sessions`, `POST /me/sessions/revoke`, `POST /me/sessions/revoke-all`, and the hall's "Sign out everywhere" — no rank required, no Archon to find. A person who knows their token leaked gets it dead in one request. That is strictly faster than any TTL, which at best kills it the following day.
|
|
18
|
+
|
|
19
|
+
## Decision
|
|
20
|
+
|
|
21
|
+
**CLI sessions carry no expiry. They last until revoked.**
|
|
22
|
+
|
|
23
|
+
1. `createSession` records `expires_at = NULL` when the caller names no expiry. `lookupSession` already treated NULL as never-expires, so this is a one-line default change rather than new machinery. Every call site that passes `null` is `source: 'cli'` — the CLI device flow, the federated CLI sign-in, the hall's token re-issue, and the dev-box pair.
|
|
24
|
+
2. `lookupSession` still bumps `last_used_at` on every request, but rolls `expires_at` forward **only for a row that already has one**:
|
|
25
|
+
|
|
26
|
+
```sql
|
|
27
|
+
expires_at = CASE WHEN expires_at IS NULL THEN NULL
|
|
28
|
+
ELSE now() + ($2::int * INTERVAL '1 millisecond') END
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Without the `CASE`, the first request after sign-in would mint the very timeout this removes.
|
|
32
|
+
3. Migration `core_243` clears `expires_at` on live, unrevoked `source='cli'` rows, so the change reaches sessions that already exist instead of charging every builder one last forced re-auth on deploy day. This is migration 035's grace inverted, for the same reason 035 gave: do not sign out the people holding sessions when the policy moves.
|
|
33
|
+
|
|
34
|
+
**Browser sessions are untouched.** They pass an explicit 30-day `expiresAt`, so the new default never reaches them, and `core_243`'s `source = 'cli'` filter leaves their rows alone. `SESSION_TTL_MS` survives as the roll-forward window for rows that have an expiry — it is no longer a default.
|
|
35
|
+
|
|
36
|
+
### Rejected
|
|
37
|
+
|
|
38
|
+
- **Widen the TTL again (7 days, 30 days).** The fourth iteration of a mechanism whose first three failed for the same structural reason. Any window loose enough to stop annoying builders is far too loose to bound a leak, and refresh-on-use means it still never fires on the attacker.
|
|
39
|
+
- **Keep the TTL and make re-auth cheaper.** Already tried: ADR-era tasks 1000401 and 1000504 built the one-click hall re-issue and `/builder-reauth` precisely to soften this. The friction got smaller and the interruption stayed. Removing the interruption is what was asked for.
|
|
40
|
+
- **An absolute ceiling on `created_at`.** ADR 0206 rejected it and its reasoning holds unchanged: a cap signs out every dev box and long-running session on a timer, for a threat the revoke answers faster. Nothing here revives it.
|
|
41
|
+
- **Drop `expires_at` from the schema.** The column is load-bearing for web sessions and still honoured by `lookupSession`. Removing it would force browser expiry into some other mechanism for no gain.
|
|
42
|
+
- **A blanket `UPDATE builder_sessions SET expires_at = NULL`.** Would hand browser cookies an immortality nobody decided on — and irreversibly, since `lookupSession` only rolls an expiry it can already see, so a web row cleared by mistake stays cleared. The `source = 'cli'` filter is the safety property of that migration.
|
|
43
|
+
|
|
44
|
+
## Consequences
|
|
45
|
+
|
|
46
|
+
- A builder signs in once and stays signed in. Coming back after a weekend, a holiday, or three weeks costs nothing.
|
|
47
|
+
- **A leaked CLI token is valid until somebody revokes it.** This is the real cost and it was accepted explicitly. In practice it is a smaller change than it sounds: under refresh-on-use a leaked token in active use was already immortal, so what actually changes is the *abandoned* copy — one on a decommissioned laptop or an old dev box — which previously went stale on its own and now does not.
|
|
48
|
+
- The remedy is self-serve and immediate (ADR 0206). The compounding half of that decision now carries more weight: the session list shows `created_at` beside `last_used_at`, so a session nobody recognises is something a person can see and kill. That visibility was a nice-to-have beside a timer; it is now the primary control.
|
|
49
|
+
- Nothing about rank or deactivation changes. `setBuilderRank` still calls `revokeAllSessionsForBuilder` on every demotion, and `requireBuilder` still refuses a deactivated builder on the hot path regardless of a live token. Neither consults `expires_at` — the TTL was never load-bearing for C7.
|
|
50
|
+
- Criterion C9's idle-session hygiene claim is no longer met by a timer, and should be read as met by revocation plus visibility instead.
|
|
51
|
+
|
|
52
|
+
## When to revisit
|
|
53
|
+
|
|
54
|
+
- **Sessions start being issued to principals nobody will notice a leak on** — machine identities, CI runners, embedded devices. ADR 0206 flagged this and it is the strongest argument for a cap; such a principal wants a short, non-sliding expiry set explicitly at creation, which the `expiresAt` parameter already supports without changing this default.
|
|
55
|
+
- **A compliance or hosting requirement names a maximum session age.** Then it belongs on `created_at` as a true ceiling, per ADR 0206, with the grace treatment `core_243` and 035 both gave.
|
|
56
|
+
- **The session list shows long-dead sessions accumulating faster than people prune them.** That is the visibility half failing, and it is now the only half.
|
package/docs/adr/README.md
CHANGED
|
@@ -385,3 +385,4 @@ This keeps the decision history honest and traceable.
|
|
|
385
385
|
| 0291 | [**The accessibility dimension scores the transcript, so it lives in the session evaluator, not the grader panel** ([task 1002516](https://cloudbongos.com/builders#/task/1002516), clause 4 of criterion `accessibility-fluency-profile`). The task and its sibling task 1003937 both point at `modules/grading/`, but a v4 worker is handed `{ task, valueSummary, diff, changedFiles, … }` and **no transcript** — it judges the change a session produced, never how the builder was spoken to while producing it. The transcript lives in `session_records`, so the dimension does too: `modules/sessions/accessibility.js`, a pure scorer over the digest's per-turn detail, scored SERVER-SIDE at upload (a score the uploader could supply is a score nobody can read; and the SessionEnd hook's 6-second watchdog rules out a second round trip for the profile). Three signals, exactly the three the criterion names. **Profile-relative, and a sanctioned signal is not scored at all** — `engineer` waives jargon + framing, `comfortable` waives terminal-first, `mixed` widens rather than waives, and an all-waived session scores `null`, not a number, so a profile-sanctioned reply cannot score low even in principle; `verbosity` is not an input and every rate is per-1000-characters, so brevity is arithmetically incapable of lowering it. Advisory, gating nothing (ADR 0241's shape). The profile crosses the module boundary as DATA — the route resolves the `builder-settings` kernel port, never a sibling require (ADR 0083), with a test as the tripwire against a value rename. Detectors deliberately undercount (word-bounded jargon, after a substring match fired `ORM` on "format"; a click-path table of UIs that actually exist), because a metric that punishes correct work is what the task itself calls actively harmful. Does NOT answer task 1003937, whose copy/voice lens judges a DIFF and still needs the owner on cost, gate-or-advisory, and what standard to judge against.](0291-the-accessibility-dimension-scores-the-transcript-not-the-diff.md) | grading / sessions / accessibility |
|
|
386
386
|
| 0292 | [**Both install paths stay, and vendoring turns out to be the production one** ([task 1003879](https://cloudbongos.com/builders#/task/1003879), goal 1000090 — public-npm **gate 6**, the decision row held back from gate 5's mechanical cleanup because both candidates were large deletions that could as easily be mistakes). Gate 6 framed the **vendored-tarball path** (~124 refs across `upgrade.js`/`init.js`/`provision-repo.js`/`package-core.js`) as insurance for hosts that cannot reach npm, to be weighed against the AGPL self-host promise. Read that way it loses. **That is not what the code does with it:** `provision-repo.js` resolves the core for every wizard-created project as "a tarball built from THIS CHECKOUT, file:-pinned", with `--registry-core` as the opt-out — vendoring is the production provisioning path, not the fallback, and deleting it breaks project creation. `resolveVendorableCoreTarball`'s three-rung ladder (reuse the control plane's own pinned tarball → pack the core it has INSTALLED → rebuild from source) exists to answer one question a registry install cannot express: *what is the control plane actually running?* Rungs 1 and 2 each name the bug they fixed — empty new repos when the runner is itself a consumer (task 1002275), and "the frozen-old-tarball births" (task 1002706). The owner's input — a checkout routinely runs ahead of the registry — holds, though not via `main`: since publish-on-merge, 136 of the last 300 `main` commits are release bumps, releases land every 9–51 min, and `main`'s `CORE_VERSION` equalled the registry `latest` (1.19.785) when this was written. Provisioning does not provision from `main`; it provisions from the control plane's own tree, and an unmerged branch or a deliberately-held pin exists on the registry at NO version, ever. **Supersedes ADR 0134's "vendored is the default until the registry path is proven end-to-end" clause:** the condition is MET twice over — with a token 2026-07-08 (task 2118 / blocker 71) and tokenless since [ADR 0283](0283-the-core-publishes-publicly-because-access-was-never-the-thing-protecting-it.md) (`npm pack @bongos/core` from a clean `HOME` fetches 25.5 MB) — and the default stands anyway, for load-bearing reasons rather than for want of proof. Costs accepted with open eyes: ~124 refs, a second install mode every scaffold/upgrade/provision path must keep straight, a Windows-only test failure ([task 1003839](https://cloudbongos.com/builders#/task/1003839)), `refreshStandaloneCorePin`. **Candidate 2 — `@cloudbongos/cli` — also STAYS, on a NEW justification:** task 1003872 was right that the original reason (reaching the board without a private-registry credential) is gone, so it needs one of its own, and the measurement supplies it — 32 files / 0.5 MB / `undici`, versus the core's 2,611 files / 46.4 MB / `express`+`pg`+`pino`. Collapsing it would make `npx` a 46 MB download dragging in a web server and a Postgres driver to print a task list. **Unpublishing was never on the table** (public at 0.1.3, strangers may have installed it); [ADR 0258](0258-the-public-cli-is-a-generated-client-package-not-the-published-core.md) stands with its *rationale* amended — a deliberately small entry point, no longer a private-core workaround. The one real rot the flip left is rung 2's stale "still-private registry package" clause, a comment. **Gate 6 closes keep/keep, no removal task.** Reopens if provisioning ever stops meaning "match the control plane".](0292-both-install-paths-stay-and-vendoring-is-the-production-one.md) | distribution / provisioning |
|
|
387
387
|
| 0293 | [**The owner's deploy door is an INTENT the control plane drains, not a web tier with a shell** ([task 1003159](https://cloudbongos.com/builders#/task/1003159), goal 1000090). The owner, twice in a month: *"I don't think I can make anything live"*, then *"this is above my paygrade"*. Moving a core pin is gate 3 of the release pipeline and the ONLY act that makes shipped work visible to users — and it was reachable from exactly one place: a shell on the control-plane box holding an ssh key. No route, no hall control. An agent could not close the loop either, because the permission classifier blocks a mutating `sudo -u lars` over ssh BY DESIGN — so the gate had no owner-reachable control AND no agent-reachable one, which is a structural mismatch with a platform whose premise is that agents build and the human holds the gates. Measured cost the day it was written: cloudbongos.com served 1.19.754 while 1.19.757, carrying a shipped fix to the claimable-task feed, sat published and unreachable. **Decision: the door is an INTENT the control-plane runner drains** — the seam [ADR 0111](0111-instance-hosting-provisioning-module.md) already built and that provision/teardown/domain-attach/settings-apply/restart already ride; `enqueueIntent` already carries `requested_by`, so the actor requirement is met by the existing shape rather than bolted on. The web tier gains no sudo, no ssh key, no new capability — it gains the ability to ASK. Rejected: giving the web tier sudo (ADR 0043 makes the control plane a separate privilege domain precisely so compromising the HTTP-reachable process does not hand over the box), and a second bespoke queue (another set of claim/settle/retry semantics to get right, when this one's failure modes are already understood in production). **The control plane is enrolled as a SELF ROW** because `provisioning_intents.instance_id` is NOT NULL and the box has never had one — which is exactly why the door had nothing to point at. That same row puts a teardown button one query away from the platform, so `hosting_shape='control-plane'` is a distinct value every destructive leg can refuse BY NAME, and the rule is an ALLOW-list (`core-upgrade`, `restart`) rather than a deny-list of today's destructive actions: a deny-list would admit tomorrow's by omission, and "permitted by omission" here means the platform deleting itself. A partial unique index makes a second self row impossible. Rejected: a nullable `instance_id` meaning "the control plane" (an implicit encoding that reads as a bug at every later call site and silently widens every query assuming the FK holds). **The target version comes from the published registry, never the request** — not tidiness: the release lane mints a git tag BEFORE the npm publish completes (measured 8–13 minutes on 2026-09-16 against ~100s recorded earlier, learnings 1000263/1000266), so a door trusting "whatever main says" would routinely queue a version that does not exist and die on `npm error notarget`. **Two-step preview-then-confirm**, the owner's own call: auto-rollback already guards the bad-release case, this guards the different one — the wrong button. **Archon-gated server-side, no caching** (ADR 0016), with `core_241` giving the ledger an actor and a source, because a privileged action with an unattributed row is not acceptable and the table carried only a free-text note. **Truth is the BOX's `/version`, not the apex** (the apex sits behind pre-launch basic_auth and its HTML rides a CDN, so an apex read reports a stale answer with total confidence). Self-restart is safe for a stated reason rather than an assumed one: the runner and the web service are DIFFERENT systemd units, and a running process keeps the code it already loaded, so an upgrade rewriting the runner's own files takes effect next tick, never mid-run. Tenant instances ride the same queue and are a filed follow-up. What it does NOT do: make deploys automatic — ADR 0137's three gates stand, and this only gives the third a handle.](0293-the-owners-deploy-door-is-an-intent-the-control-plane-drains.md) | deploy / authority / provisioning |
|
|
388
|
+
| 0294 | [**CLI sessions do not expire; revocation is the whole remedy** ([task 1003956](https://cloudbongos.com/builders#/task/1003956), goal 1000110 — owner request 2026-09-16, after a three-week gap signed him out). A `bongos` sign-in died after 24h idle: `createSession` defaulted a null `expiresAt` to `now()+SESSION_TTL_MS` and `lookupSession` rewrote `expires_at = now()+24h` on every request. **This is the third argument about the number and the first about the mechanism** — V3.R38 ([task #259](https://cloudbongos.com/builders#/task/259), migration 035) set 1h, V3.R90 ([task 1000400](https://cloudbongos.com/builders#/task/1000400)) widened it to 24h because 1h "kicked builders out over lunch", and each round shortened the nuisance while leaving the mechanism alone. The hygiene case for keeping it (criterion C9 — bound a leaked token in the mode-0600 plaintext session file) **does not survive contact with refresh-on-use**: a leaked token is by definition one somebody is using, and every use rolled the expiry forward another day, so the timer could only ever fire on a session gone quiet — the legitimate holder stepping away. The control was aimed at attackers and landed exclusively on users. [ADR 0206](0206-own-scoped-session-revocation-no-absolute-ceiling.md) had already written half of this down ("a CLI bearer in daily use is, in practice, immortal") without drawing the conclusion. Decision: **CLI sessions carry no expiry and last until revoked.** `createSession` records `expires_at = NULL` when the caller names none — every such call site is `source: 'cli'` (device flow, federated sign-in, hall re-issue, dev-box pair) — and `lookupSession` still bumps `last_used_at` but rolls `expires_at` forward only via `CASE WHEN expires_at IS NULL THEN NULL ELSE …`; **without that CASE the first request after sign-in re-mints the very timeout this removes.** Migration `core_243` clears `expires_at` on live unrevoked `source='cli'` rows, so the change reaches existing sessions instead of charging every builder one last forced re-auth on deploy day — migration 035's grace inverted, for the reason 035 gave. **Browser sessions are untouched** (they pass an explicit 30 days, so the new default never reaches them, and the migration's `source='cli'` filter is its whole safety property — `lookupSession` only rolls an expiry it can already see, so a web row cleared by mistake stays cleared forever). `SESSION_TTL_MS` survives as the roll-forward window for rows that have an expiry, no longer as a default. The accepted cost, stated plainly: **a leaked CLI token is valid until revoked** — smaller in practice than it sounds, since under refresh-on-use an actively-used leak was already immortal, so what changes is the *abandoned* copy on a dead laptop. The remedy is ADR 0206's own-scoped revoke, immediate where a TTL is next-day, and that ADR's visibility half (`created_at` beside `last_used_at`) is now the primary control rather than a nice-to-have. Nothing about rank moves: `setBuilderRank` still sweeps on demotion and `requireBuilder` still refuses a deactivated builder on the hot path, neither consulting `expires_at`. Rejected: widening the TTL a fourth time; keeping it and making re-auth cheaper (already built — [task 1000401](https://cloudbongos.com/builders#/task/1000401), [task 1000504](https://cloudbongos.com/builders#/task/1000504) — the friction shrank, the interruption stayed); an absolute `created_at` ceiling (ADR 0206's reasoning holds unchanged); dropping the column (load-bearing for web); a blanket `UPDATE … SET expires_at = NULL`. Revisit for machine principals nobody will notice a leak on, a compliance maximum, or long-dead sessions accumulating faster than people prune them.](0294-cli-sessions-do-not-expire.md) | auth / account security / CLI |
|
package/docs/copy-inventory.md
CHANGED
|
@@ -225,7 +225,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
225
225
|
| `e6982a9ff948` | certain | Charter library | `modules/hall-ui/public/government.js:799` |
|
|
226
226
|
| `f8725cf3ba62` | certain | Checking dependency order… | `modules/hall-ui/public/work.js:853` |
|
|
227
227
|
| `7a41b18c0de8` | certain | Checking for conflicts… | `modules/hall-ui/public/work.js:832` |
|
|
228
|
-
| `aa3ba7d28a76` | certain | Checking your key… | `modules/hall-ui/public/settings.js:
|
|
228
|
+
| `aa3ba7d28a76` | certain | Checking your key… | `modules/hall-ui/public/settings.js:1073` |
|
|
229
229
|
| `b3d0e2af5176` | certain | Choose a goal first. | `modules/hall-ui/public/task.js:663` |
|
|
230
230
|
| `1c6b0e3ffc0e` | certain | Choose a setup | `modules/hall-ui/public/hall-render.js:779` |
|
|
231
231
|
| `6c88cdf417f1` | certain | Choose which sound plays for each build event — one when Claude waits for your input, another when a task ship | `modules/hall-ui/public/settings.html:350` |
|
|
@@ -291,7 +291,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
291
291
|
| `b9e53fbd90e6` | certain | Could not change standing: {…} | `modules/hall-ui/public/watch.js:886` |
|
|
292
292
|
| `1ef1efc15b6c` | certain | Could not change that just now. | `modules/hall-ui/public/goals-render.js:1235` |
|
|
293
293
|
| `78e18ea59b9f` | certain | Could not close: {…} | `modules/hall-ui/public/harbor.js:136` |
|
|
294
|
-
| `c3f99e7c6e6b` | certain | Could not copy automatically — select and copy manually. ({…}) | `modules/hall-ui/public/settings.js:
|
|
294
|
+
| `c3f99e7c6e6b` | certain | Could not copy automatically — select and copy manually. ({…}) | `modules/hall-ui/public/settings.js:952` |
|
|
295
295
|
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/goals-page.js:374` |
|
|
296
296
|
| `e3fd1febf63d` | certain | Could not copy to the clipboard. Try again. | `modules/hall-ui/public/work.js:614` |
|
|
297
297
|
| `487e0b39ac8f` | certain | Could not copy — select and copy by hand. | `modules/hall-ui/public/box-panel.js:413` |
|
|
@@ -313,23 +313,23 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
313
313
|
| `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:565` |
|
|
314
314
|
| `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
|
|
315
315
|
| `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1357` |
|
|
316
|
-
| `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:
|
|
316
|
+
| `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:1332` |
|
|
317
317
|
| `2a9fb4046bc4` | certain | Could not load your rank. Return to the hall and try again. | `modules/hall-ui/public/ranks.js:196` |
|
|
318
318
|
| `9d533e811dec` | certain | Could not load your sessions: {…} | `modules/hall-ui/public/settings-sessions.js:114` |
|
|
319
|
-
| `64f9d51f0fa2` | certain | Could not load your settings. | `modules/hall-ui/public/settings.js:
|
|
319
|
+
| `64f9d51f0fa2` | certain | Could not load your settings. | `modules/hall-ui/public/settings.js:1335` |
|
|
320
320
|
| `de244c45d916` | certain | Could not load {…} | `modules/hall-ui/public/task.js:700` |
|
|
321
321
|
| `2366356926b4` | certain | Could not mark the primer just now. Try again. | `modules/hall-ui/public/primer.js:260` |
|
|
322
322
|
| `753987b5da13` | certain | Could not reach the submit endpoint. | `modules/hall-ui/public/modules.js:297` |
|
|
323
323
|
| `6f500726f0ac` | certain | Could not read the report: {…} | `modules/hall-ui/public/watch.js:640` |
|
|
324
|
-
| `8b470cebf53d` | certain | Could not remove your key. Try again. | `modules/hall-ui/public/settings.js:
|
|
325
|
-
| `4cf6bc8b377b` | certain | Could not remove. Try again. | `modules/hall-ui/public/settings.js:
|
|
324
|
+
| `8b470cebf53d` | certain | Could not remove your key. Try again. | `modules/hall-ui/public/settings.js:1153` |
|
|
325
|
+
| `4cf6bc8b377b` | certain | Could not remove. Try again. | `modules/hall-ui/public/settings.js:1152` |
|
|
326
326
|
| `7a778d188e87` | certain | Could not remove: {…} | `modules/hall-ui/public/government.js:369` |
|
|
327
327
|
| `bb5a7753e62b` | certain | Could not reset: {…} | `modules/hall-ui/public/government.js:301` |
|
|
328
328
|
| `b526ee0b8c48` | certain | Could not save just now. Try again. | `modules/hall-ui/public/builders.js:464` |
|
|
329
329
|
| `41a351aea8d4` | certain | Could not save the volume. Try again. | `modules/hall-ui/public/settings.js:221` |
|
|
330
330
|
| `5305186a4154` | certain | Could not save your choice. Try again. | `modules/hall-ui/public/settings.js:104` |
|
|
331
331
|
| `cfe6c5ceb3ef` | certain | Could not save your interaction profile. Try again. | `modules/hall-ui/public/settings-interaction.js:97` |
|
|
332
|
-
| `ea4fb30debd0` | certain | Could not save your key. Try again. | `modules/hall-ui/public/settings.js:
|
|
332
|
+
| `ea4fb30debd0` | certain | Could not save your key. Try again. | `modules/hall-ui/public/settings.js:1097` |
|
|
333
333
|
| `ef609f2c0cb3` | certain | Could not save your name. Try again. | `modules/hall-ui/public/settings.js:795` |
|
|
334
334
|
| `59ecd5c52f59` | certain | Could not save your preference. Try again. | `modules/hall-ui/public/builders.js:361` |
|
|
335
335
|
| `59ecd5c52f59` | certain | Could not save your preference. Try again. | `modules/hall-ui/public/settings.js:715` |
|
|
@@ -345,10 +345,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
345
345
|
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:615` |
|
|
346
346
|
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:714` |
|
|
347
347
|
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:794` |
|
|
348
|
-
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:
|
|
348
|
+
| `8c234d5c8bd4` | certain | Could not save. Try again. | `modules/hall-ui/public/settings.js:1096` |
|
|
349
349
|
| `31c6e3fd754b` | certain | Could not send the request just now. | `modules/hall-ui/public/goals-render.js:1250` |
|
|
350
|
-
| `1f4d9a989606` | certain | Could not set up key storage. Try again. | `modules/hall-ui/public/settings.js:
|
|
351
|
-
| `e65b392144ac` | certain | Could not set up storage. Try again. | `modules/hall-ui/public/settings.js:
|
|
350
|
+
| `1f4d9a989606` | certain | Could not set up key storage. Try again. | `modules/hall-ui/public/settings.js:1133` |
|
|
351
|
+
| `e65b392144ac` | certain | Could not set up storage. Try again. | `modules/hall-ui/public/settings.js:1132` |
|
|
352
352
|
| `d4601887a058` | certain | Could not sign out everywhere: {…} | `modules/hall-ui/public/settings-sessions.js:102` |
|
|
353
353
|
| `b1602d01f4bb` | certain | Could not unblock: {…} | `modules/hall-ui/public/harbor.js:187` |
|
|
354
354
|
| `3db890b074a7` | certain | Could not update visibility just now. | `modules/hall-ui/public/goals-render.js:1219` |
|
|
@@ -424,7 +424,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
424
424
|
| `04bbccfe7465` | certain | Everything a new builder needs before claiming their first task. About a ten-minute read. | `modules/hall-ui/public/primer.html:42` |
|
|
425
425
|
| `647513e4838a` | certain | Everything this builder has shipped. Seen one craft at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:108` |
|
|
426
426
|
| `efdb46f76b02` | certain | Everything this instance can run: what the core ships, what this project built, and who keeps each one true as | `modules/hall-ui/public/modules.html:32` |
|
|
427
|
-
| `d629e152f074` | certain | Expires {…} · refreshes on use. | `modules/hall-ui/public/settings.js:939` |
|
|
428
427
|
| `de62f4cc7d2e` | certain | File a bug or idea | `modules/hall-ui/public/ideas.html:59` |
|
|
429
428
|
| `0f166311ff3f` | certain | File it | `modules/hall-ui/public/ideas.html:96` |
|
|
430
429
|
| `0c4632f983db` | certain | File the change | `modules/hall-ui/public/copy-desk.html:173` |
|
|
@@ -448,7 +447,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
448
447
|
| `6149e9ca69f7` | certain | Fleet summary | `modules/hall-ui/public/harbor.html:44` |
|
|
449
448
|
| `617f13fa3fdb` | certain | Flip the switch. | `modules/hall-ui/public/hall-render.js:779` |
|
|
450
449
|
| `42cee5cb3584` | certain | Fold this idea into # | `modules/hall-ui/public/task-detail.js:473` |
|
|
451
|
-
| `647bcfcfdb03` | certain | Fresh CLI token issued. Paste it in your terminal: | `modules/hall-ui/public/settings.js:
|
|
450
|
+
| `647bcfcfdb03` | certain | Fresh CLI token issued. Paste it in your terminal: | `modules/hall-ui/public/settings.js:932` |
|
|
452
451
|
| `55c71d76a94c` | certain | From creation to production — and the exact step where {{currency}} are awarded (at | `modules/hall-ui/public/diagrams.html:52` |
|
|
453
452
|
| `d32c5e058d1e` | certain | From the system | `modules/hall-ui/public/hall-render.js:658` |
|
|
454
453
|
| `fc6fdfa639a7` | certain | Full log | `modules/hall-ui/public/task.js:440` |
|
|
@@ -457,7 +456,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
457
456
|
| `c93912bbad76` | certain | Gathering the reviews and flagged copy that wait for you. | `modules/hall-ui/public/studio.html:46` |
|
|
458
457
|
| `4638e024f0af` | certain | Generated from the code on the last deploy · | `modules/hall-ui/public/atlas.js:431` |
|
|
459
458
|
| `3c1a5d27ef0b` | certain | Generated from the code on the last deploy. | `modules/hall-ui/public/atlas.js:431` |
|
|
460
|
-
| `2ae2114b61db` | certain | Get a free key ↗ | `modules/hall-ui/public/settings.js:
|
|
459
|
+
| `2ae2114b61db` | certain | Get a free key ↗ | `modules/hall-ui/public/settings.js:976` |
|
|
461
460
|
| `4794a991de3d` | certain | Getting started | `modules/hall-ui/public/hall-widgets.js:59` |
|
|
462
461
|
| `a28b1a567f1a` | certain | GitHub username | `modules/hall-ui/public/hall-render.js:294` |
|
|
463
462
|
| `8e52f0649662` | certain | Give the category a label. | `modules/hall-ui/public/project-settings.js:189` |
|
|
@@ -518,7 +517,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
518
517
|
| `ef224c9de7c8` | certain | Ideas — {{worldName}} | `modules/hall-ui/public/ideas.html:6` |
|
|
519
518
|
| `9e9f8a44276b` | certain | Identity vouched | `modules/hall-ui/public/watch.js:373` |
|
|
520
519
|
| `7d6a7de7a69e` | certain | If the {…} has invited you, sign in with GitHub and you're in. If not, ask them for an invite — this project d | `modules/hall-ui/public/hall-render.js:286` |
|
|
521
|
-
| `b6c47d4ee42c` | certain | Image key removed. | `modules/hall-ui/public/settings.js:
|
|
520
|
+
| `b6c47d4ee42c` | certain | Image key removed. | `modules/hall-ui/public/settings.js:1149` |
|
|
522
521
|
| `783853467d52` | certain | Image-generation key | `modules/hall-ui/public/settings.html:184` |
|
|
523
522
|
| `5c2e2bcbd5fb` | certain | In Progress | `modules/hall-ui/public/work.html:95` |
|
|
524
523
|
| `75cfcdd41661` | certain | In this primer | `modules/hall-ui/public/primer.html:58` |
|
|
@@ -545,16 +544,16 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
545
544
|
| `bc779353aa0c` | certain | Karma — peer recognition and approvals, a separate counter from {…}. | `modules/hall-ui/public/profile.js:94` |
|
|
546
545
|
| `de0e1590667f` | certain | Keep all {…} {…} — they are the values the code drops in, and the change cannot land without them. | `modules/hall-ui/public/copy-desk.js:442` |
|
|
547
546
|
| `32d25ef2182d` | certain | Keep box | `modules/hall-ui/public/box-panel.js:164` |
|
|
548
|
-
| `fbe40b5818a3` | certain | Key removed. | `modules/hall-ui/public/settings.js:
|
|
549
|
-
| `93c17262bacf` | certain | Key storage is being set up by an Archon — check back shortly. {…} | `modules/hall-ui/public/settings.js:
|
|
550
|
-
| `2a3c9e501f8e` | certain | Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the | `modules/hall-ui/public/settings.js:
|
|
547
|
+
| `fbe40b5818a3` | certain | Key removed. | `modules/hall-ui/public/settings.js:1148` |
|
|
548
|
+
| `93c17262bacf` | certain | Key storage is being set up by an Archon — check back shortly. {…} | `modules/hall-ui/public/settings.js:1027` |
|
|
549
|
+
| `2a3c9e501f8e` | certain | Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the | `modules/hall-ui/public/settings.js:1023` |
|
|
551
550
|
| `7d6eaa8d4514` | certain | Kinds of work shipped | `modules/hall-ui/public/hall-render.js:1194` |
|
|
552
551
|
| `81f62e066dbf` | certain | Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed). | `modules/hall-ui/public/builders.js:595` |
|
|
553
552
|
| `35a15eb0a117` | certain | Last 30 days | `modules/hall-ui/public/hall-widgets.js:129` |
|
|
554
553
|
| `9be8b839eff8` | certain | Last 7 days | `modules/hall-ui/public/hall-widgets.js:129` |
|
|
555
554
|
| `59f0bc78a28f` | certain | Last 90 days | `modules/hall-ui/public/hall-widgets.js:130` |
|
|
556
555
|
| `13bae4dfb28e` | certain | Last claimed by | `modules/hall-ui/public/task.js:546` |
|
|
557
|
-
| `1526a7ae8c85` | certain | Latest version: v{…}. | `modules/hall-ui/public/settings.js:
|
|
556
|
+
| `1526a7ae8c85` | certain | Latest version: v{…}. | `modules/hall-ui/public/settings.js:1421` |
|
|
558
557
|
| `7c9b7a89353b` | certain | Leave goal | `modules/hall-ui/public/goals-render.js:931` |
|
|
559
558
|
| `f192ff6563f9` | certain | Leave your GitHub username and an Archon will let you in. No coding needed to start — once you're approved, si | `modules/hall-ui/public/hall-render.js:294` |
|
|
560
559
|
| `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:204` |
|
|
@@ -629,7 +628,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
629
628
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/builders.js:480` |
|
|
630
629
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/profile.js:144` |
|
|
631
630
|
| `479c1a45f39d` | certain | No backlog tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:1120` |
|
|
632
|
-
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:
|
|
631
|
+
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:1340` |
|
|
633
632
|
| `6d6fd2314248` | certain | No cross-project activity reported yet. | `modules/hall-ui/public/profile.js:323` |
|
|
634
633
|
| `b1ada579483c` | certain | No custom ranks yet | `modules/hall-ui/public/government.js:358` |
|
|
635
634
|
| `6e2d2e11f84a` | certain | No description. | `modules/hall-ui/public/idea.js:122` |
|
|
@@ -714,8 +713,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
714
713
|
| `5ded44da0cc5` | certain | Override requests | `modules/hall-ui/public/watch.html:143` |
|
|
715
714
|
| `15a49bf15007` | certain | Page {…} of {…} | `modules/hall-ui/public/hall-kit.js:112` |
|
|
716
715
|
| `8595b0aa76a0` | certain | Pair Claude Desktop | `modules/hall-ui/public/settings.html:242` |
|
|
717
|
-
| `cf68a394cfa5` | certain | Paste command copied. | `modules/hall-ui/public/settings.js:
|
|
718
|
-
| `a495649d1f82` | certain | Paste your key first. | `modules/hall-ui/public/settings.js:
|
|
716
|
+
| `cf68a394cfa5` | certain | Paste command copied. | `modules/hall-ui/public/settings.js:951` |
|
|
717
|
+
| `a495649d1f82` | certain | Paste your key first. | `modules/hall-ui/public/settings.js:1072` |
|
|
719
718
|
| `542f801cc77f` | certain | Path-based estimate from declared files. Glob-aware detection with claim collisions — and lead resolution acti | `modules/hall-ui/public/goals-render.js:582` |
|
|
720
719
|
| `54fa47e421a5` | certain | Peer recognition | `modules/hall-ui/public/hall-widgets.js:168` |
|
|
721
720
|
| `47d609ece51c` | certain | Pending invitations | `modules/hall-ui/public/goals-render.js:1290` |
|
|
@@ -761,7 +760,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
761
760
|
| `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
|
|
762
761
|
| `6824ec470f99` | certain | Ranks — {{worldName}} | `modules/hall-ui/public/ranks.html:6` |
|
|
763
762
|
| `e60039795803` | certain | Re-issue CLI token | `modules/hall-ui/public/settings.html:151` |
|
|
764
|
-
| `101a51902f53` | certain | Re-issue failed: {…} | `modules/hall-ui/public/settings.js:
|
|
763
|
+
| `101a51902f53` | certain | Re-issue failed: {…} | `modules/hall-ui/public/settings.js:956` |
|
|
765
764
|
| `fae2f90927bd` | certain | Read an idea, then decide. An objection needs a reason and the section it faults. | `modules/hall-ui/public/board-room.html:51` |
|
|
766
765
|
| `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/drachmae.js:148` |
|
|
767
766
|
| `b03e17693dcd` | certain | Read it as a table | `modules/hall-ui/public/watch.js:1167` |
|
|
@@ -790,7 +789,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
790
789
|
| `c49f9b9f8864` | certain | Remake or tweak | `modules/hall-ui/public/studio.js:182` |
|
|
791
790
|
| `9c74a2572f4d` | certain | Remote control (recommended) | `modules/hall-ui/public/hall-render.js:779` |
|
|
792
791
|
| `65e3399a8fbf` | certain | Remove filter | `modules/hall-ui/public/hall-kit.js:311` |
|
|
793
|
-
| `dacd113fb3b2` | certain | Remove your image-generation key? Art generation will stop until you add one again. | `modules/hall-ui/public/settings.js:
|
|
792
|
+
| `dacd113fb3b2` | certain | Remove your image-generation key? Art generation will stop until you add one again. | `modules/hall-ui/public/settings.js:1140` |
|
|
794
793
|
| `20882d6ffdd0` | certain | Removed {…} from builder {…}. | `modules/hall-ui/public/government.js:365` |
|
|
795
794
|
| `9f4e519ea3e2` | certain | Repo Atlas | `modules/hall-ui/public/atlas.html:18` |
|
|
796
795
|
| `9f4e519ea3e2` | certain | Repo Atlas | `modules/hall-ui/public/atlas.html:18` |
|
|
@@ -824,7 +823,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
824
823
|
| `f7ed4ba07178` | certain | Roadmap — {{worldName}} | `modules/hall-ui/public/roadmap.html:6` |
|
|
825
824
|
| `f7ed4ba07178` | certain | Roadmap — {{worldName}} | `modules/hall-ui/public/roadmap.html:6` |
|
|
826
825
|
| `b6596905f845` | certain | Said more than once | `modules/hall-ui/public/copy-desk.html:56` |
|
|
827
|
-
| `0c79b504aebe` | certain | Save key | `modules/hall-ui/public/settings.js:
|
|
826
|
+
| `0c79b504aebe` | certain | Save key | `modules/hall-ui/public/settings.js:1008` |
|
|
828
827
|
| `72f24fcbe9e0` | certain | Saves the moment you choose; applies from your next session. | `modules/hall-ui/public/settings.html:305` |
|
|
829
828
|
| `e8e4e49fe8f4` | certain | Saves when you press Save; shows everywhere at once. | `modules/hall-ui/public/settings.html:88` |
|
|
830
829
|
| `42cbc20a6ec8` | certain | Saves when you press Save; your next | `modules/hall-ui/public/settings.html:136` |
|
|
@@ -853,9 +852,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
853
852
|
| `55e0a34bafed` | certain | Session log{…} | `modules/hall-ui/public/task.js:444` |
|
|
854
853
|
| `cccb362bd6da` | certain | Sessions — {{worldName}} | `modules/hall-ui/public/sessions.html:6` |
|
|
855
854
|
| `cccb362bd6da` | certain | Sessions — {{worldName}} | `modules/hall-ui/public/sessions.html:6` |
|
|
856
|
-
| `b823d9a37a35` | certain | Set up key storage | `modules/hall-ui/public/settings.js:
|
|
855
|
+
| `b823d9a37a35` | certain | Set up key storage | `modules/hall-ui/public/settings.js:1024` |
|
|
857
856
|
| `84f31c3c3797` | certain | Set up your machine / get the code | `modules/hall-ui/public/hall-render.js:846` |
|
|
858
|
-
| `f639250de42f` | certain | Setting up key storage… | `modules/hall-ui/public/settings.js:
|
|
857
|
+
| `f639250de42f` | certain | Setting up key storage… | `modules/hall-ui/public/settings.js:1108` |
|
|
859
858
|
| `44bd6c3a2471` | certain | Setting up your box… (about a minute) | `modules/hall-ui/public/box-panel.js:298` |
|
|
860
859
|
| `65509721fe12` | certain | Setting up… | `modules/hall-ui/public/box-panel.js:352` |
|
|
861
860
|
| `62c3ea026095` | certain | Settings sections | `modules/hall-ui/public/settings.html:51` |
|
|
@@ -1105,9 +1104,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1105
1104
|
| `4ca77de13df4` | certain | Your dev box is stopped — turn it back on below. | `modules/hall-ui/public/box-panel.js:332` |
|
|
1106
1105
|
| `909b0b7c6ffa` | certain | Your display name | `modules/hall-ui/public/settings.html:84` |
|
|
1107
1106
|
| `51cae49539b5` | certain | Your files are kept | `modules/hall-ui/public/box-panel.js:323` |
|
|
1108
|
-
| `a47f15b6a33c` | certain | Your image-generation key settings could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings.js:
|
|
1107
|
+
| `a47f15b6a33c` | certain | Your image-generation key settings could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings.js:1175` |
|
|
1109
1108
|
| `00fb37fd5adf` | certain | Your interaction profile could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings-interaction.js:122` |
|
|
1110
|
-
| `51fd6f1ecb2f` | certain | Your key | `modules/hall-ui/public/settings.js:
|
|
1109
|
+
| `51fd6f1ecb2f` | certain | Your key | `modules/hall-ui/public/settings.js:1004` |
|
|
1111
1110
|
| `20d453b11ae5` | certain | Your name | `modules/hall-ui/public/hall-render.js:294` |
|
|
1112
1111
|
| `6dadadffa36e` | certain | Your name cannot be blank. | `modules/hall-ui/public/settings.js:764` |
|
|
1113
1112
|
| `bd77210a8c90` | certain | Your name must be {…} characters or fewer. | `modules/hall-ui/public/settings.js:769` |
|
|
@@ -1115,7 +1114,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1115
1114
|
| `5e0ec4cd1cfe` | certain | Your own row carries no controls. Nobody can change their own rank or standing — that guard is what stops the | `modules/hall-ui/public/watch.js:835` |
|
|
1116
1115
|
| `8fc605026acf` | certain | Your pending join {…}: {…} — awaiting approval. | `modules/hall-ui/public/goal-inbox.js:88` |
|
|
1117
1116
|
| `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:788` |
|
|
1118
|
-
| `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:
|
|
1117
|
+
| `e91418db3962` | certain | Your preferences, {…}. | `modules/hall-ui/public/settings.js:1349` |
|
|
1119
1118
|
| `b6dceaace783` | certain | Your profile page setting applies now — private already answers "not found" everywhere your profile is read. R | `modules/hall-ui/public/settings.html:119` |
|
|
1120
1119
|
| `f39746e3d66b` | certain | Your rendering preference could not be loaded. Reload the page to try again. | `modules/hall-ui/public/settings-render.js:133` |
|
|
1121
1120
|
| `b2dfd7120052` | certain | Your request is sent ✓ | `modules/hall-ui/public/hall-render.js:391` |
|
|
@@ -1236,7 +1235,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1236
1235
|
| `7b85e6494596` | certain | opens a new tab | `modules/hall-ui/public/palette.js:190` |
|
|
1237
1236
|
| `c38db02adb61` | certain | or above | `modules/hall-ui/public/government.js:564` |
|
|
1238
1237
|
| `66f7e9c2dde0` | certain | or right-click — plain Ctrl+V will not paste here. Claude takes over the terminal with its own interface once | `modules/hall-ui/public/hall-render.js:779` |
|
|
1239
|
-
| `884948925fcb` | certain | paste command | `modules/hall-ui/public/settings.js:
|
|
1238
|
+
| `884948925fcb` | certain | paste command | `modules/hall-ui/public/settings.js:934` |
|
|
1240
1239
|
| `25d2c940e672` | certain | paste it into your terminal — bypasses Device Flow. | `modules/hall-ui/public/settings.html:152` |
|
|
1241
1240
|
| `2fb1dad96280` | certain | pending, on the People tab | `modules/hall-ui/public/watch.html:46` |
|
|
1242
1241
|
| `3b22c5af029b` | certain | rank or above, or that it is your own. | `modules/hall-ui/public/copy-desk.html:47` |
|
|
@@ -1334,8 +1333,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1334
1333
|
| `8186b562553a` | certain | {…} {…} waiting | `modules/hall-ui/public/work.js:407` |
|
|
1335
1334
|
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/watch.js:474` |
|
|
1336
1335
|
| `0d4016a5531c` | certain | {…} {…}{…} | `modules/hall-ui/public/work.js:249` |
|
|
1337
|
-
| `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:
|
|
1336
|
+
| `b3757ba3bb46` | certain | {…} · Stored encrypted; never shown again after saving. | `modules/hall-ui/public/settings.js:1010` |
|
|
1338
1337
|
| `94445e6ed5e8` | certain | {…} · code | `modules/hall-ui/public/pair.js:53` |
|
|
1338
|
+
| `a6e4ed98fbea` | certain | {…} · revoke it any time under Active sessions. | `modules/hall-ui/public/settings.js:942` |
|
|
1339
1339
|
| `d73256fbc395` | certain | {…} · who votes, and how it {…} | `modules/hall-ui/public/board-room.js:357` |
|
|
1340
1340
|
| `cab2a4296aec` | certain | {…} · {…} · {…}{…} | `modules/hall-ui/public/goal-inbox.js:326` |
|
|
1341
1341
|
| `d9b4ae2db0f4` | certain | {…} — read from the box itself, {…}. | `modules/hall-ui/public/deploy.js:115` |
|