@bongos/core 1.21.23 → 1.21.24

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,11 +2,11 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.21.23",
6
- "core_contract": "1.21.23",
7
- "source_commit": "f64122d4f1adcb5f3c257835b4301b05200aea99",
5
+ "core_version": "1.21.24",
6
+ "core_contract": "1.21.24",
7
+ "source_commit": "9ed14f470c9244d95d36c136ddb7ab5353ce8578",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-02T23:41:43.161Z",
9
+ "built_at": "2026-10-03T00:06:14.383Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 580,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 3506,
20
- "tree_sha256": "e0ca2d50b9d20d431d51a3b2cbed4ac46ba5ce5616d4131e41a5faf5b9971a02",
20
+ "tree_sha256": "7a3a980adf2820c753d32bc3dcba9eb7b3b6471b6bf0a46db4a45b583fe2b888",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -2322,12 +2322,12 @@
2322
2322
  {
2323
2323
  "path": "docs/copy-inventory.md",
2324
2324
  "mode": "0000644",
2325
- "sha256": "4ecea29a9a211bf187b0d85902f0468a279874db099be1fa424c702ba841467b"
2325
+ "sha256": "8f16c6df711e4e45e9c4db1fb4d0d8757be6c00f96df042b8d6a308ae1f1424f"
2326
2326
  },
2327
2327
  {
2328
2328
  "path": "docs/copy-registry.json",
2329
2329
  "mode": "0000644",
2330
- "sha256": "ec2a19f9cae63dd3ad99863f42b709c6c5f286ab9453dc3dc0ab39a45405fde1"
2330
+ "sha256": "66d0aabce16c2d1b3399f2199a2c0e04d19f610850ed38ec46e331e246489c77"
2331
2331
  },
2332
2332
  {
2333
2333
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2832,7 +2832,7 @@
2832
2832
  {
2833
2833
  "path": "docs/module-api-changelog.md",
2834
2834
  "mode": "0000644",
2835
- "sha256": "3c028d52441ba14d4136e262787e4a712f7236433f3bc036297daaa21872d37d"
2835
+ "sha256": "92dde1422bdcca1dce6e857c712af4a8474a9140424681225445428783035bf8"
2836
2836
  },
2837
2837
  {
2838
2838
  "path": "docs/modules-contract.md",
@@ -2922,7 +2922,7 @@
2922
2922
  {
2923
2923
  "path": "docs/page-readings.json",
2924
2924
  "mode": "0000644",
2925
- "sha256": "6a4e5984a318aeff9b598b9eb9f886762b9b69fde5f68876bcf42b34970ea303"
2925
+ "sha256": "13200d52016c387c01d6b49e78c07772aff53cf5e9de2fdb311ce5e1f08b8aa6"
2926
2926
  },
2927
2927
  {
2928
2928
  "path": "docs/project-context.template.md",
@@ -6037,17 +6037,17 @@
6037
6037
  {
6038
6038
  "path": "modules/hall-ui/public/sessions.css",
6039
6039
  "mode": "0000644",
6040
- "sha256": "33d03e1b23898e5bdefdee514ab09fa4ab92c236bce82250b4402b1a6e463a5e"
6040
+ "sha256": "08e162c86cd6fe6023766e3e459b5dca22b0fda1c7337dd127b6915784f03bc4"
6041
6041
  },
6042
6042
  {
6043
6043
  "path": "modules/hall-ui/public/sessions.html",
6044
6044
  "mode": "0000644",
6045
- "sha256": "609236afe6a3b0e38bb3e9f1966f06da154443409bc2eb6704b407affe9aab18"
6045
+ "sha256": "cce421ecd1d5fabb3bb2ecc51dd0a12c4c2c5ded60b89005a318e786799e231b"
6046
6046
  },
6047
6047
  {
6048
6048
  "path": "modules/hall-ui/public/sessions.js",
6049
6049
  "mode": "0000644",
6050
- "sha256": "c5069163675001d8249948769ddcf42f125eb18fd62891a8a8052b26bb83013e"
6050
+ "sha256": "eb505bde6be51438a60c9499afb5d3065aa82e2ad535b39137de75ccb65258f0"
6051
6051
  },
6052
6052
  {
6053
6053
  "path": "modules/hall-ui/public/sessions.states.json",
@@ -9327,7 +9327,7 @@
9327
9327
  {
9328
9328
  "path": "modules/sessions/db.js",
9329
9329
  "mode": "0000644",
9330
- "sha256": "60497d24ad5ba22ae0ccbaac0e3423fee47681362ef34b172208976dcdea278f"
9330
+ "sha256": "cf990093eefcc688c412bb57749c3c3986b2e752f3727b2d6c2b3b8e4ffd1091"
9331
9331
  },
9332
9332
  {
9333
9333
  "path": "modules/sessions/module.json",
@@ -9787,12 +9787,12 @@
9787
9787
  {
9788
9788
  "path": "package-lock.json",
9789
9789
  "mode": "0000644",
9790
- "sha256": "3798aac2c3863fc70391cfb595fc4be3e78a41ca452d640500d2732cf5b70abd"
9790
+ "sha256": "0d93e33c8e66223f3566f9f89fc3b2f22d81942b74bdae8e8ab5db7c057c8f66"
9791
9791
  },
9792
9792
  {
9793
9793
  "path": "package.json",
9794
9794
  "mode": "0000644",
9795
- "sha256": "fbfcd69470e00a78565fc6a4b63edc0235db91658db24ade04fd739fb45196f5"
9795
+ "sha256": "ee3839fcdf18e5fd982b6a2d1f3bc55459125e13f27bfe19aef411556ef7006b"
9796
9796
  },
9797
9797
  {
9798
9798
  "path": "public-docs/index.html",
@@ -9812,7 +9812,7 @@
9812
9812
  {
9813
9813
  "path": "release-notes.json",
9814
9814
  "mode": "0000644",
9815
- "sha256": "51e0173eb20c0fb610d289d29a71713c660718ff2ca21366028798a362ca1ee1"
9815
+ "sha256": "83458aeed8dc40040956f48a6670b30cea746cfbfcc62f6baf3db3201f537bf8"
9816
9816
  },
9817
9817
  {
9818
9818
  "path": "scripts/bongos-mcp.js",
@@ -12037,7 +12037,7 @@
12037
12037
  {
12038
12038
  "path": "src/module-api.js",
12039
12039
  "mode": "0000644",
12040
- "sha256": "281f296e6a2f0779317d4b5ae4f0328b894122b03fbf4f019b2367e565d0dbfc"
12040
+ "sha256": "278f3e5cee7b2d4b784aa79cdef9fe7570cc5bede2208dbe8c54f16095dba7f9"
12041
12041
  },
12042
12042
  {
12043
12043
  "path": "src/module-loader/catalog.js",
@@ -14382,7 +14382,7 @@
14382
14382
  {
14383
14383
  "path": "tests/hall_sessions_ledger.mjs",
14384
14384
  "mode": "0000644",
14385
- "sha256": "81b570e6fe9809b761e9ff65f13462f1847a15326082639d2b6e072705f69127"
14385
+ "sha256": "3bb991e31865110a033cc0abe9ad06543cb088d13418bb97cdbbcabb55758b33"
14386
14386
  },
14387
14387
  {
14388
14388
  "path": "tests/hall_settings_world.mjs",
@@ -16632,7 +16632,7 @@
16632
16632
  {
16633
16633
  "path": "tests/session_transcript.mjs",
16634
16634
  "mode": "0000644",
16635
- "sha256": "3251bcd8617d859de931c430faf189d3ddd3de3b6645cd1b4a7c2b88390f19d0"
16635
+ "sha256": "537216dc6168bc34b5e7b7ff6f28d0c1c433149b7ea150da7ab5326a54860c66"
16636
16636
  },
16637
16637
  {
16638
16638
  "path": "tests/session_type.mjs",
@@ -4,13 +4,13 @@
4
4
  > Deterministic on a given tree — regenerate and commit rather than hand-editing.
5
5
  > Machine-readable twin: [`copy-registry.json`](copy-registry.json).
6
6
 
7
- **2421 strings** across 3 surfaces · 2092 distinct pieces of copy · 2421 certain, 0 heuristic · 222 shown in more than one place.
7
+ **2429 strings** across 3 surfaces · 2100 distinct pieces of copy · 2429 certain, 0 heuristic · 222 shown in more than one place.
8
8
 
9
9
  ## Surfaces
10
10
 
11
11
  | surface | lives at | files | strings |
12
12
  |---|---|---|---|
13
- | `builders-hall` | `modules/hall-ui/public` | 128 | 1757 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 128 | 1765 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 6 | 564 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `a061df49e6cb` | 3x | Skip to content | modules/public-landing/public/account.html:88, modules/public-landing/public/index.html:650, modules/public-landing/public/projects.html:667 |
79
79
  | … | | _182 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1757 strings
81
+ ## `builders-hall` — 1765 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -154,7 +154,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
154
154
  | `ff67fba11965` | certain | Admitted into {…} mid-build | `modules/hall-ui/public/goals-render.js:908` |
155
155
  | `8b736e365191` | certain | All builders | `modules/hall-ui/public/hall-render.js:1181` |
156
156
  | `b5e03617b319` | certain | All goals | `modules/hall-ui/public/goals.html:48` |
157
- | `e08d410571e9` | certain | All kinds | `modules/hall-ui/public/sessions.js:286` |
157
+ | `e08d410571e9` | certain | All kinds | `modules/hall-ui/public/sessions.js:391` |
158
158
  | `9c34bccb06ef` | certain | All open asks | `modules/hall-ui/public/collab.html:79` |
159
159
  | `bea7817e57a4` | certain | All surfaces | `modules/hall-ui/public/copy-desk.js:301` |
160
160
  | `627c683a5e5d` | certain | All time | `modules/hall-ui/public/hall-widgets.js:161` |
@@ -281,6 +281,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
281
281
  | `70f6a704d504` | certain | Close it | `modules/hall-ui/public/copy-desk.html:140` |
282
282
  | `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
283
283
  | `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:209` |
284
+ | `e6f1842afde1` | certain | Close transcript | `modules/hall-ui/public/sessions.html:99` |
284
285
  | `3d148e19e03a` | certain | Closed. | `modules/hall-ui/public/copy-desk.js:510` |
285
286
  | `2654dc3ded21` | certain | Closing is a judgement too — say what you decided, so the next person does not re-litigate it. | `modules/hall-ui/public/copy-desk.js:495` |
286
287
  | `e5548861ad79` | certain | Coach the grader | `modules/hall-ui/public/studio.js:211` |
@@ -338,8 +339,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
338
339
  | `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:1018` |
339
340
  | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:328` |
340
341
  | `9912c3835136` | certain | Could not load requests — reload to try again. | `modules/hall-ui/public/collab.js:845` |
341
- | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:399` |
342
- | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:437` |
342
+ | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:504` |
343
+ | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:542` |
343
344
  | `a2f2e8babef5` | certain | Could not load that page. Try again. | `modules/hall-ui/public/blockers.js:276` |
344
345
  | `9d8192ac9098` | certain | Could not load the earnings. | `modules/hall-ui/public/profile-charts.js:546` |
345
346
  | `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:1000` |
@@ -347,6 +348,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
347
348
  | `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:458` |
348
349
  | `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:885` |
349
350
  | `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
351
+ | `e84dc5bd8f56` | certain | Could not load the transcript. | `modules/hall-ui/public/sessions.js:252` |
350
352
  | `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1351` |
351
353
  | `df4c2f78a3f6` | certain | Could not load this project’s skills — {…} | `modules/hall-ui/public/settings-specialities.js:311` |
352
354
  | `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:1196` |
@@ -391,7 +393,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
391
393
  | `d4601887a058` | certain | Could not sign out everywhere: {…} | `modules/hall-ui/public/settings-sessions.js:102` |
392
394
  | `3db890b074a7` | certain | Could not update visibility just now. | `modules/hall-ui/public/goals-render.js:1371` |
393
395
  | `112d12b24879` | certain | Could not verify your access. Go back and try again. | `modules/hall-ui/public/watch.js:1350` |
394
- | `6bd74fd20311` | certain | Could not verify your access. Try again. | `modules/hall-ui/public/sessions.js:436` |
396
+ | `6bd74fd20311` | certain | Could not verify your access. Try again. | `modules/hall-ui/public/sessions.js:541` |
395
397
  | `278e8281c82f` | certain | Could not vote: {…} | `modules/hall-ui/public/board-room.js:405` |
396
398
  | `a48e9f098392` | certain | Could not {…} just now. | `modules/hall-ui/public/goals-render.js:1357` |
397
399
  | `cb09ee26014f` | certain | Could not {…}: {…} | `modules/hall-ui/public/government.js:314` |
@@ -659,6 +661,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
659
661
  | `a53e0cde7ff7` | certain | Link first — your rank role is set the moment you join. | `modules/hall-ui/public/settings.js:723` |
660
662
  | `64e85f1691f9` | certain | Link your Discord account and you're added to the {{worldName}} server with your rank role already set — no in | `modules/hall-ui/public/settings.html:64` |
661
663
  | `9a31cf5fe05b` | certain | Linking opens Discord's consent screen; unlinking applies at once. | `modules/hall-ui/public/settings.html:69` |
664
+ | `3b49f0fcd19c` | certain | Load more turns | `modules/hall-ui/public/sessions.html:101` |
662
665
  | `daf84bba41b1` | certain | Loading goals… | `modules/hall-ui/public/goals.html:36` |
663
666
  | `93ceeaa4e226` | certain | Loading idea | `modules/hall-ui/public/idea.html:30` |
664
667
  | `2b5826012538` | certain | Loading profile… | `modules/hall-ui/public/profile.html:35` |
@@ -708,7 +711,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
708
711
  | `319e9db996ea` | certain | Modules — {{worldName}} | `modules/hall-ui/public/modules.html:6` |
709
712
  | `319e9db996ea` | certain | Modules — {{worldName}} | `modules/hall-ui/public/modules.html:6` |
710
713
  | `9dacaf382dc8` | certain | More ways to open the page | `modules/hall-ui/public/tweak-editor.html:59` |
711
- | `1ae18e58fead` | certain | Most recent first. Each load of this page is itself recorded in the audit log. | `modules/hall-ui/public/sessions.js:340` |
714
+ | `46fea78f33c6` | certain | Most recent first. Each load of this page is itself recorded in the audit log, and so is every transcript {…} | `modules/hall-ui/public/sessions.js:445` |
712
715
  | `f14a91b3f625` | certain | Most recent first. Each row is one recorded work session; every id on it opens its record. | `modules/hall-ui/public/sessions.html:56` |
713
716
  | `e52ae74f0052` | certain | Move to goal | `modules/hall-ui/public/task.js:562` |
714
717
  | `e77d5f3beaef` | certain | Move to {…} | `modules/hall-ui/public/deploy.js:564` |
@@ -762,7 +765,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
762
765
  | `2947c1ddea9a` | certain | No running box to deploy. | `modules/hall-ui/public/deploy.js:703` |
763
766
  | `b67c628da0c1` | certain | No screen to record: this is signed off without a video | `modules/hall-ui/public/criterion-uat-ui.js:64` |
764
767
  | `9fb9f766450d` | certain | No sections yet | `modules/hall-ui/public/primer.js:130` |
765
- | `bef9fe43ba84` | certain | No sessions recorded yet. They land here as builders ship and end sessions. | `modules/hall-ui/public/sessions.js:146` |
768
+ | `bef9fe43ba84` | certain | No sessions recorded yet. They land here as builders ship and end sessions. | `modules/hall-ui/public/sessions.js:149` |
766
769
  | `084748fd85b4` | certain | No shipped work is recorded between core {…} and {…}. | `modules/hall-ui/public/deploy.js:544` |
767
770
  | `4485497d87bb` | certain | No specialities yet. Create one below — it takes a name and a craft, and you can train it afterwards. | `modules/hall-ui/public/settings-specialities.js:416` |
768
771
  | `545dc44ad427` | certain | No task in this goal depends on another task in this goal. | `modules/hall-ui/public/goal-forest-render.js:126` |
@@ -774,7 +777,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
774
777
  | `4654849396a3` | certain | No work reviewed yet. | `modules/hall-ui/public/hall-widgets.js:181` |
775
778
  | `9cf1c752b65d` | certain | No works shipped yet — the works charts draw once the first one lands. | `modules/hall-ui/public/profile-charts.js:574` |
776
779
  | `9dbe1981055c` | certain | No {…} render is attached to this page. | `modules/hall-ui/public/approval-queue.js:134` |
777
- | `086665af6208` | certain | No {…} sessions recorded. Choose another kind to widen the ledger. | `modules/hall-ui/public/sessions.js:145` |
780
+ | `086665af6208` | certain | No {…} sessions recorded. Choose another kind to widen the ledger. | `modules/hall-ui/public/sessions.js:148` |
778
781
  | `730a248e7888` | certain | No {…} {…} render; showing {…} {…}. | `modules/hall-ui/public/approval-queue.js:139` |
779
782
  | `1967d2176f2e` | certain | Nobody has an open ask right now. | `modules/hall-ui/public/collab.html:84` |
780
783
  | `c65c9f5c02e3` | certain | Nobody is waiting on you. Requests reach you by role — | `modules/hall-ui/public/collab.html:54` |
@@ -787,11 +790,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
787
790
  | `361b353ded5e` | certain | Not enough shipped work yet to chart. | `modules/hall-ui/public/hall-widgets.js:215` |
788
791
  | `90230572d017` | certain | Not found | `modules/hall-ui/public/task.js:1009` |
789
792
  | `8226c979db4d` | certain | Not now | `modules/hall-ui/public/collab.js:668` |
790
- | `5ffcdc1a0176` | certain | Not scored — this builder’s own profile waived every signal, or the session predates this measure. | `modules/hall-ui/public/sessions.js:100` |
793
+ | `5ffcdc1a0176` | certain | Not scored — this builder’s own profile waived every signal, or the session predates this measure. | `modules/hall-ui/public/sessions.js:103` |
791
794
  | `61250b49a90b` | certain | Not scored. | `modules/hall-ui/public/idea.js:84` |
792
795
  | `8d6afe6def47` | certain | Not signed in | `modules/hall-ui/public/settings.html:43` |
793
796
  | `a290f6c14df9` | certain | Not taking requests | `modules/hall-ui/public/goals-render.js:975` |
794
- | `20bb29015a84` | certain | Not yet classified. | `modules/hall-ui/public/sessions.js:72` |
797
+ | `20bb29015a84` | certain | Not yet classified. | `modules/hall-ui/public/sessions.js:75` |
795
798
  | `571b9b22dbda` | certain | Not yet ready — blocked by dependencies or awaiting promotion. These become claimable when their blockers ship | `modules/hall-ui/public/work.html:130` |
796
799
  | `0c59d118db9b` | certain | Note (optional) | `modules/hall-ui/public/task-detail.js:564` |
797
800
  | `9ca8cd37cac2` | certain | Note (optional) — why you're asking | `modules/hall-ui/public/goals-render.js:1244` |
@@ -911,6 +914,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
911
914
  | `e5c292c8b361` | certain | Provides (seams) | `modules/hall-ui/public/atlas.js:288` |
912
915
  | `93b836382ec7` | certain | Put it to the board again | `modules/hall-ui/public/genesis-home.js:205` |
913
916
  | `4de232a05888` | certain | Raise after | `modules/hall-ui/public/project-settings.js:113` |
917
+ | `1a4c7be3abb0` | certain | Ran {…} | `modules/hall-ui/public/sessions.js:204` |
914
918
  | `0608f71f78fe` | certain | Rank is earned by shipping work. The founding mark is for good: it is numbered in the order people joined whil | `modules/hall-ui/public/ranks.html:47` |
915
919
  | `b9c6def6b120` | certain | Rank set to {…}. | `modules/hall-ui/public/watch.js:883` |
916
920
  | `ff50a1395cbc` | certain | Rank: {…} | `modules/hall-ui/public/profile.js:50` |
@@ -1032,6 +1036,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1032
1036
  | `64a1f055129e` | certain | Session card richness | `modules/hall-ui/public/settings-render.js:83` |
1033
1037
  | `d14e8e9acaff` | certain | Session ended. | `modules/hall-ui/public/settings-sessions.js:81` |
1034
1038
  | `55e0a34bafed` | certain | Session log{…} | `modules/hall-ui/public/task.js:468` |
1039
+ | `174feec3f108` | certain | Session {…} — loading… | `modules/hall-ui/public/sessions.js:263` |
1040
+ | `292cafff00c3` | certain | Session {…} — showing {…} of {…} turns.{…} | `modules/hall-ui/public/sessions.js:248` |
1041
+ | `5e15e4f600fd` | certain | Session {…}. | `modules/hall-ui/public/sessions.js:233` |
1035
1042
  | `cccb362bd6da` | certain | Sessions — {{worldName}} | `modules/hall-ui/public/sessions.html:6` |
1036
1043
  | `cccb362bd6da` | certain | Sessions — {{worldName}} | `modules/hall-ui/public/sessions.html:6` |
1037
1044
  | `c11213056bab` | certain | Set priority | `modules/hall-ui/public/task.js:592` |
@@ -1208,8 +1215,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1208
1215
  | `314a635412fe` | certain | The same sky, as a list (L) | `modules/hall-ui/public/thinking.html:80` |
1209
1216
  | `ec849c59d583` | certain | The same work from any terminal, outside Claude Code. Run | `modules/hall-ui/public/commands.html:45` |
1210
1217
  | `cd4ceb6e7e48` | certain | The seeded plan | `modules/hall-ui/public/roadmap.js:207` |
1211
- | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:398` |
1212
- | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:450` |
1218
+ | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:503` |
1219
+ | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:558` |
1213
1220
  | `e48a9b77d91b` | certain | The session log opens from a higher rank. | `modules/hall-ui/public/sessions.html:41` |
1214
1221
  | `af664a644b13` | certain | The seven government structures, for getting a team up to speed before deciding when to flip a switch. | `modules/hall-ui/public/government.js:809` |
1215
1222
  | `6360a5988f26` | certain | The shape and health of the codebase. | `modules/hall-ui/public/watch.html:105` |
@@ -1240,6 +1247,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1240
1247
  | `d51b954e0aa9` | certain | The words you changed | `modules/hall-ui/public/approval-queue.js:198` |
1241
1248
  | `bcdbded93d4e` | certain | The work board failed to load. Reload to try again. | `modules/hall-ui/public/work.js:1185` |
1242
1249
  | `25794c439321` | certain | Then copy the project onto your machine and run the one-shot bootstrap (it checks your setup, installs depende | `modules/hall-ui/public/hall-render.js:833` |
1250
+ | `383018c7df70` | certain | There is no transcript you can read for this session. | `modules/hall-ui/public/sessions.js:234` |
1243
1251
  | `d6b9826f1bd3` | certain | These words are the studio page itself. Take the page, type over them here, and submit it from the editor when | `modules/hall-ui/public/studio.html:100` |
1244
1252
  | `775a73b066e3` | certain | These words come from the skill’s own description, which was written for Claude to recognise rather than for y | `modules/hall-ui/public/settings-specialities.js:128` |
1245
1253
  | `a0140098c0e0` | certain | They already have an invitation or a join-request pending on this goal. | `modules/hall-ui/public/goals-render.js:1312` |
@@ -1735,8 +1743,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1735
1743
  | `c5623d60015d` | certain | {…} Your standing is {…}. | `modules/hall-ui/public/hall-render.js:845` |
1736
1744
  | `a91e1e702d4d` | certain | {…} achieved, {…} in progress, {…} not started of {…} goals | `modules/hall-ui/public/roadmap.js:73` |
1737
1745
  | `a65d371b5cb3` | certain | {…} and above can enable or disable a module | `modules/hall-ui/public/modules.js:140` |
1738
- | `98b1c674fc37` | certain | {…} and up | `modules/hall-ui/public/sessions.js:187` |
1739
- | `111b71a9acaf` | certain | {…} and up. | `modules/hall-ui/public/sessions.js:185` |
1746
+ | `98b1c674fc37` | certain | {…} and up | `modules/hall-ui/public/sessions.js:289` |
1747
+ | `111b71a9acaf` | certain | {…} and up. | `modules/hall-ui/public/sessions.js:287` |
1740
1748
  | `56b00d773232` | certain | {…} and {…} | `modules/hall-ui/public/profile-nudge.js:77` |
1741
1749
  | `0da0e247ff0f` | certain | {…} asking to connect | `modules/hall-ui/public/profile-connections.js:145` |
1742
1750
  | `788ff11f1135` | certain | {…} awarded | `modules/hall-ui/public/task.js:459` |
@@ -1767,7 +1775,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1767
1775
  | `e08fa22622f0` | certain | {…} shipped, {…} confirmed, {…} completed, {…} remaining of {…} | `modules/hall-ui/public/roadmap.js:298` |
1768
1776
  | `5d79bba0d667` | certain | {…} task {…} on live work — {…}. Sequence them before two builders collide. | `modules/hall-ui/public/goal-inbox.js:112` |
1769
1777
  | `ad27ae9f5433` | certain | {…} tasks · {…} | `modules/hall-ui/public/roadmap.js:423` |
1770
- | `955499559f0a` | certain | {…} tokens | `modules/hall-ui/public/sessions.js:170` |
1778
+ | `955499559f0a` | certain | {…} tokens | `modules/hall-ui/public/sessions.js:173` |
1771
1779
  | `8e28c14b106d` | certain | {…} total | `modules/hall-ui/public/roadmap.js:120` |
1772
1780
  | `1a8a6267e490` | certain | {…} unfinished task{…} — say what happens to each | `modules/hall-ui/public/goals-render.js:1042` |
1773
1781
  | `3ad8f32dd43b` | certain | {…} you have sent | `modules/hall-ui/public/profile-connections.js:146` |
@@ -1793,7 +1801,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1793
1801
  | `8e8c7da4f7f5` | certain | {…}criteria met · awaiting review | `modules/hall-ui/public/goals-render.js:166` |
1794
1802
  | `1e275ee0299c` | certain | {…}s only | `modules/hall-ui/public/government.js:1030` |
1795
1803
  | `499916045b19` | certain | {…}{…} asks to join | `modules/hall-ui/public/goal-inbox.js:69` |
1796
- | `97e27ab169ae` | certain | {…}{…} session{…} across {…} builder{…}. | `modules/hall-ui/public/sessions.js:338` |
1804
+ | `97e27ab169ae` | certain | {…}{…} session{…} across {…} builder{…}. | `modules/hall-ui/public/sessions.js:443` |
1797
1805
  | `3d74668f69e5` | certain | {…}{…} · {…} | `modules/hall-ui/public/task.js:639` |
1798
1806
  | `7f79bedecf60` | certain | {…}{…} — open it to see what went | `modules/hall-ui/public/goal-inbox.js:374` |
1799
1807
  | `1026fd5f68b7` | certain | · version | `modules/hall-ui/public/modules.js:388` |
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 2421,
7
- "unique_ids": 2092,
8
- "certain": 2421,
6
+ "strings": 2429,
7
+ "unique_ids": 2100,
8
+ "certain": 2429,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 222
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 128,
16
- "strings": 1757
16
+ "strings": 1765
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -961,8 +961,8 @@
961
961
  "text": "Could not load sessions.",
962
962
  "occurrences": 2,
963
963
  "at": [
964
- "modules/hall-ui/public/sessions.js:399",
965
- "modules/hall-ui/public/sessions.js:437"
964
+ "modules/hall-ui/public/sessions.js:504",
965
+ "modules/hall-ui/public/sessions.js:542"
966
966
  ]
967
967
  },
968
968
  {
@@ -1811,8 +1811,8 @@
1811
1811
  "text": "The session log could not be loaded. Try again.",
1812
1812
  "occurrences": 2,
1813
1813
  "at": [
1814
- "modules/hall-ui/public/sessions.js:398",
1815
- "modules/hall-ui/public/sessions.js:450"
1814
+ "modules/hall-ui/public/sessions.js:503",
1815
+ "modules/hall-ui/public/sessions.js:558"
1816
1816
  ]
1817
1817
  },
1818
1818
  {
@@ -3020,7 +3020,7 @@
3020
3020
  "surface": "builders-hall",
3021
3021
  "text": "All kinds",
3022
3022
  "file": "modules/hall-ui/public/sessions.js",
3023
- "line": 286,
3023
+ "line": 391,
3024
3024
  "origin": "js-markup",
3025
3025
  "confidence": "certain"
3026
3026
  },
@@ -4158,6 +4158,15 @@
4158
4158
  "origin": "js-markup",
4159
4159
  "confidence": "certain"
4160
4160
  },
4161
+ {
4162
+ "id": "e6f1842afde1",
4163
+ "surface": "builders-hall",
4164
+ "text": "Close transcript",
4165
+ "file": "modules/hall-ui/public/sessions.html",
4166
+ "line": 99,
4167
+ "origin": "html-text",
4168
+ "confidence": "certain"
4169
+ },
4161
4170
  {
4162
4171
  "id": "3d148e19e03a",
4163
4172
  "surface": "builders-hall",
@@ -4676,7 +4685,7 @@
4676
4685
  "surface": "builders-hall",
4677
4686
  "text": "Could not load sessions.",
4678
4687
  "file": "modules/hall-ui/public/sessions.js",
4679
- "line": 399,
4688
+ "line": 504,
4680
4689
  "origin": "js-notice",
4681
4690
  "confidence": "certain"
4682
4691
  },
@@ -4685,7 +4694,7 @@
4685
4694
  "surface": "builders-hall",
4686
4695
  "text": "Could not load sessions.",
4687
4696
  "file": "modules/hall-ui/public/sessions.js",
4688
- "line": 437,
4697
+ "line": 542,
4689
4698
  "origin": "js-notice",
4690
4699
  "confidence": "certain"
4691
4700
  },
@@ -4752,6 +4761,15 @@
4752
4761
  "origin": "js-notice",
4753
4762
  "confidence": "certain"
4754
4763
  },
4764
+ {
4765
+ "id": "e84dc5bd8f56",
4766
+ "surface": "builders-hall",
4767
+ "text": "Could not load the transcript.",
4768
+ "file": "modules/hall-ui/public/sessions.js",
4769
+ "line": 252,
4770
+ "origin": "js-notice",
4771
+ "confidence": "certain"
4772
+ },
4755
4773
  {
4756
4774
  "id": "2878778cf9f3",
4757
4775
  "surface": "builders-hall",
@@ -5153,7 +5171,7 @@
5153
5171
  "surface": "builders-hall",
5154
5172
  "text": "Could not verify your access. Try again.",
5155
5173
  "file": "modules/hall-ui/public/sessions.js",
5156
- "line": 436,
5174
+ "line": 541,
5157
5175
  "origin": "js-text-assign",
5158
5176
  "confidence": "certain"
5159
5177
  },
@@ -7560,6 +7578,15 @@
7560
7578
  "origin": "html-text",
7561
7579
  "confidence": "certain"
7562
7580
  },
7581
+ {
7582
+ "id": "3b49f0fcd19c",
7583
+ "surface": "builders-hall",
7584
+ "text": "Load more turns",
7585
+ "file": "modules/hall-ui/public/sessions.html",
7586
+ "line": 101,
7587
+ "origin": "html-text",
7588
+ "confidence": "certain"
7589
+ },
7563
7590
  {
7564
7591
  "id": "daf84bba41b1",
7565
7592
  "surface": "builders-hall",
@@ -8002,11 +8029,11 @@
8002
8029
  "confidence": "certain"
8003
8030
  },
8004
8031
  {
8005
- "id": "1ae18e58fead",
8032
+ "id": "46fea78f33c6",
8006
8033
  "surface": "builders-hall",
8007
- "text": "Most recent first. Each load of this page is itself recorded in the audit log.",
8034
+ "text": "Most recent first. Each load of this page is itself recorded in the audit log, and so is every transcript {…} opens.",
8008
8035
  "file": "modules/hall-ui/public/sessions.js",
8009
- "line": 340,
8036
+ "line": 445,
8010
8037
  "origin": "js-text-assign",
8011
8038
  "confidence": "certain"
8012
8039
  },
@@ -8492,7 +8519,7 @@
8492
8519
  "surface": "builders-hall",
8493
8520
  "text": "No sessions recorded yet. They land here as builders ship and end sessions.",
8494
8521
  "file": "modules/hall-ui/public/sessions.js",
8495
- "line": 146,
8522
+ "line": 149,
8496
8523
  "origin": "js-markup",
8497
8524
  "confidence": "certain"
8498
8525
  },
@@ -8600,7 +8627,7 @@
8600
8627
  "surface": "builders-hall",
8601
8628
  "text": "No {…} sessions recorded. Choose another kind to widen the ledger.",
8602
8629
  "file": "modules/hall-ui/public/sessions.js",
8603
- "line": 145,
8630
+ "line": 148,
8604
8631
  "origin": "js-markup",
8605
8632
  "confidence": "certain"
8606
8633
  },
@@ -8717,7 +8744,7 @@
8717
8744
  "surface": "builders-hall",
8718
8745
  "text": "Not scored — this builder’s own profile waived every signal, or the session predates this measure.",
8719
8746
  "file": "modules/hall-ui/public/sessions.js",
8720
- "line": 100,
8747
+ "line": 103,
8721
8748
  "origin": "js-markup",
8722
8749
  "confidence": "certain"
8723
8750
  },
@@ -8753,7 +8780,7 @@
8753
8780
  "surface": "builders-hall",
8754
8781
  "text": "Not yet classified.",
8755
8782
  "file": "modules/hall-ui/public/sessions.js",
8756
- "line": 72,
8783
+ "line": 75,
8757
8784
  "origin": "js-markup",
8758
8785
  "confidence": "certain"
8759
8786
  },
@@ -9828,6 +9855,15 @@
9828
9855
  "origin": "js-markup",
9829
9856
  "confidence": "certain"
9830
9857
  },
9858
+ {
9859
+ "id": "1a4c7be3abb0",
9860
+ "surface": "builders-hall",
9861
+ "text": "Ran {…}",
9862
+ "file": "modules/hall-ui/public/sessions.js",
9863
+ "line": 204,
9864
+ "origin": "js-markup",
9865
+ "confidence": "certain"
9866
+ },
9831
9867
  {
9832
9868
  "id": "0608f71f78fe",
9833
9869
  "surface": "builders-hall",
@@ -10917,6 +10953,33 @@
10917
10953
  "origin": "js-markup",
10918
10954
  "confidence": "certain"
10919
10955
  },
10956
+ {
10957
+ "id": "174feec3f108",
10958
+ "surface": "builders-hall",
10959
+ "text": "Session {…} — loading…",
10960
+ "file": "modules/hall-ui/public/sessions.js",
10961
+ "line": 263,
10962
+ "origin": "js-text-assign",
10963
+ "confidence": "certain"
10964
+ },
10965
+ {
10966
+ "id": "292cafff00c3",
10967
+ "surface": "builders-hall",
10968
+ "text": "Session {…} — showing {…} of {…} turns.{…}",
10969
+ "file": "modules/hall-ui/public/sessions.js",
10970
+ "line": 248,
10971
+ "origin": "js-text-assign",
10972
+ "confidence": "certain"
10973
+ },
10974
+ {
10975
+ "id": "5e15e4f600fd",
10976
+ "surface": "builders-hall",
10977
+ "text": "Session {…}.",
10978
+ "file": "modules/hall-ui/public/sessions.js",
10979
+ "line": 233,
10980
+ "origin": "js-text-assign",
10981
+ "confidence": "certain"
10982
+ },
10920
10983
  {
10921
10984
  "id": "cccb362bd6da",
10922
10985
  "surface": "builders-hall",
@@ -12506,7 +12569,7 @@
12506
12569
  "surface": "builders-hall",
12507
12570
  "text": "The session log could not be loaded. Try again.",
12508
12571
  "file": "modules/hall-ui/public/sessions.js",
12509
- "line": 398,
12572
+ "line": 503,
12510
12573
  "origin": "js-text-assign",
12511
12574
  "confidence": "certain"
12512
12575
  },
@@ -12515,7 +12578,7 @@
12515
12578
  "surface": "builders-hall",
12516
12579
  "text": "The session log could not be loaded. Try again.",
12517
12580
  "file": "modules/hall-ui/public/sessions.js",
12518
- "line": 450,
12581
+ "line": 558,
12519
12582
  "origin": "js-text-assign",
12520
12583
  "confidence": "certain"
12521
12584
  },
@@ -12789,6 +12852,15 @@
12789
12852
  "origin": "js-markup",
12790
12853
  "confidence": "certain"
12791
12854
  },
12855
+ {
12856
+ "id": "383018c7df70",
12857
+ "surface": "builders-hall",
12858
+ "text": "There is no transcript you can read for this session.",
12859
+ "file": "modules/hall-ui/public/sessions.js",
12860
+ "line": 234,
12861
+ "origin": "js-markup",
12862
+ "confidence": "certain"
12863
+ },
12792
12864
  {
12793
12865
  "id": "d6b9826f1bd3",
12794
12866
  "surface": "builders-hall",
@@ -17249,7 +17321,7 @@
17249
17321
  "surface": "builders-hall",
17250
17322
  "text": "{…} and up",
17251
17323
  "file": "modules/hall-ui/public/sessions.js",
17252
- "line": 187,
17324
+ "line": 289,
17253
17325
  "origin": "js-text-assign",
17254
17326
  "confidence": "certain"
17255
17327
  },
@@ -17258,7 +17330,7 @@
17258
17330
  "surface": "builders-hall",
17259
17331
  "text": "{…} and up.",
17260
17332
  "file": "modules/hall-ui/public/sessions.js",
17261
- "line": 185,
17333
+ "line": 287,
17262
17334
  "origin": "js-text-assign",
17263
17335
  "confidence": "certain"
17264
17336
  },
@@ -17537,7 +17609,7 @@
17537
17609
  "surface": "builders-hall",
17538
17610
  "text": "{…} tokens",
17539
17611
  "file": "modules/hall-ui/public/sessions.js",
17540
- "line": 170,
17612
+ "line": 173,
17541
17613
  "origin": "js-markup",
17542
17614
  "confidence": "certain"
17543
17615
  },
@@ -17771,7 +17843,7 @@
17771
17843
  "surface": "builders-hall",
17772
17844
  "text": "{…}{…} session{…} across {…} builder{…}.",
17773
17845
  "file": "modules/hall-ui/public/sessions.js",
17774
- "line": 338,
17846
+ "line": 443,
17775
17847
  "origin": "js-text-assign",
17776
17848
  "confidence": "certain"
17777
17849
  },
@@ -2873,5 +2873,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
2873
2873
  landed since 1.21.21 with no explicit bump. run 37072549675. (task 1002620)
2874
2874
  1.21.23 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2875
2875
  landed since 1.21.22 with no explicit bump. run 37078725783. (task 1002620)
2876
+ 1.21.24 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2877
+ landed since 1.21.23 with no explicit bump. run 37080562697. (task 1002620)
2876
2878
  ---------------------------------------------------------------------------
2877
2879
  ```
@@ -5,7 +5,7 @@
5
5
  "adr": "0341 D3",
6
6
  "reread": "node scripts/gds/page-reader.js --stale",
7
7
  "how": ["Generated by node scripts/gds/page-reader.js (BV2.TW04, task 1004315; ADR 0341 D3). Do not hand-edit.","One entry per page of docs/page-inventory.json. Lines are in page order: the default state first, and a line only another state shows sits where that state shows it, with its state named.","placement: placed = a docs/copy-registry.json row renders it (file, line, string_id); shared = shell text every page of the surface carries (top bar, sidebar, footer), with its row when the registry has one; unplaced = the registry cannot place it (a rewrite becomes an engineer task, ADR 0341 D4).","text keeps {…} where the registry row has a hole, or where a value the page read from its API was filled in. A string that is only such data is counted under omitted.data, not listed.","reading_hash is over the non-shared lines (key, section, text); files_hash is over the page's inventory files. --check compares files_hash only and never opens a browser.","Rendered through the hall-preview harness (hall) and the ui-design kit stub (landing, status), at 1280x800 with the clock pinned, so a reading is the fixture world's page."],
8
- "counts": {"pages":42,"lines":4615,"placed":1496,"shared":259,"unplaced":2860,"omitted_data":2601},
8
+ "counts": {"pages":42,"lines":4615,"placed":1497,"shared":259,"unplaced":2859,"omitted_data":2601},
9
9
  "pages": [
10
10
  {
11
11
  "id": "builders:atlas",
@@ -2581,18 +2581,18 @@
2581
2581
  "surface": "builders",
2582
2582
  "title": "Sessions",
2583
2583
  "states_read": ["ledger","out"],
2584
- "files_hash": "c319c384b3bef271",
2585
- "reading_hash": "b8315ec3484a1431",
2586
- "counts": {"lines":54,"placed":15,"shared":5,"unplaced":34},
2584
+ "files_hash": "3f28950291e7ce7d",
2585
+ "reading_hash": "3b6b8302ad0ce893",
2586
+ "counts": {"lines":54,"placed":16,"shared":5,"unplaced":33},
2587
2587
  "omitted": {"data":16},
2588
2588
  "notes": [],
2589
2589
  "lines": [
2590
- {"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":932,"string_id":"87cee78ca134"},
2590
+ {"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":884,"string_id":"87cee78ca134"},
2591
2591
  {"key":"L0002","section":"top bar","text":"Sessions","placement":"shared"},
2592
2592
  {"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":495,"string_id":"eba610d25523"},
2593
2593
  {"key":"L0004","section":"top bar","text":"Ctrl K","placement":"shared"},
2594
2594
  {"key":"L0005","section":"Sessions","text":"Sessions","placement":"unplaced","occurrences":2},
2595
- {"key":"L0006","section":"Sessions","text":"{…}{…} session{…} across {…} builder{…}.","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":338,"string_id":"97e27ab169ae"},
2595
+ {"key":"L0006","section":"Sessions","text":"{…}{…} session{…} across {…} builder{…}.","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":443,"string_id":"97e27ab169ae"},
2596
2596
  {"key":"L0007","section":"Sessions","text":"Builders","placement":"unplaced"},
2597
2597
  {"key":"L0008","section":"Sessions","text":"Tokens","placement":"unplaced"},
2598
2598
  {"key":"L0009","section":"Sessions","text":"48.2M","placement":"unplaced"},
@@ -2602,13 +2602,13 @@
2602
2602
  {"key":"L0013","section":"Recorded sessions","text":"Recorded sessions","placement":"placed","file":"modules/hall-ui/public/sessions.html","line":55,"string_id":"dba9d3f3af13"},
2603
2603
  {"key":"L0014","section":"Recorded sessions","text":"Most recent first. Each row is one recorded work session; every id on it opens its record.","placement":"placed","file":"modules/hall-ui/public/sessions.html","line":56,"string_id":"f14a91b3f625"},
2604
2604
  {"key":"L0015","section":"Recorded sessions","text":"Kind","placement":"unplaced","occurrences":2},
2605
- {"key":"L0016","section":"Recorded sessions","text":"All kinds","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":286,"string_id":"e08d410571e9"},
2605
+ {"key":"L0016","section":"Recorded sessions","text":"All kinds","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":391,"string_id":"e08d410571e9"},
2606
2606
  {"key":"L0017","section":"Recorded sessions","text":"Build","placement":"unplaced","occurrences":2},
2607
2607
  {"key":"L0018","section":"Recorded sessions","text":"Automated run","placement":"unplaced","occurrences":4},
2608
2608
  {"key":"L0019","section":"Recorded sessions","text":"Exploring","placement":"unplaced","occurrences":2},
2609
2609
  {"key":"L0020","section":"Recorded sessions","text":"Conversation","placement":"unplaced"},
2610
2610
  {"key":"L0021","section":"Recorded sessions","text":"Unclear","placement":"unplaced"},
2611
- {"key":"L0022","section":"Recorded sessions","text":"Session","placement":"unplaced"},
2611
+ {"key":"L0022","section":"Recorded sessions","text":"Session","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":233,"string_id":"5e15e4f600fd"},
2612
2612
  {"key":"L0023","section":"Recorded sessions","text":"Builder","placement":"unplaced"},
2613
2613
  {"key":"L0024","section":"Recorded sessions","text":"Tasks","placement":"unplaced"},
2614
2614
  {"key":"L0025","section":"Recorded sessions","text":"Earned","placement":"unplaced"},
@@ -2639,7 +2639,7 @@
2639
2639
  {"key":"L0050","section":"Recorded sessions","text":"‹ Prev","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"de8fa5223aee"},
2640
2640
  {"key":"L0051","section":"Recorded sessions","text":"Page {…} of {…}","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":112,"string_id":"15a49bf15007"},
2641
2641
  {"key":"L0052","section":"Recorded sessions","text":"Next ›","placement":"placed","file":"modules/hall-ui/public/hall-kit.js","line":74,"string_id":"f52ba261d930"},
2642
- {"key":"L0053","section":"Recorded sessions","text":"Most recent first. Each load of this page is itself recorded in the audit log.","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":340,"string_id":"1ae18e58fead"},
2642
+ {"key":"L0053","section":"Recorded sessions","text":"Most recent first. Each load of this page is itself recorded in the audit log, and so is every transcript {…} opens.","placement":"placed","file":"modules/hall-ui/public/sessions.js","line":445,"string_id":"46fea78f33c6"},
2643
2643
  {"key":"L0054","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":471,"string_id":"1883ad7f07fc"}
2644
2644
  ]
2645
2645
  },
@@ -36,3 +36,19 @@
36
36
  white-space: nowrap — task 1003470 removed the blanket nowrap that broke this
37
37
  table on a phone, and "Automated run" is short enough to wrap harmlessly. */
38
38
  .ledger-kind { color: var(--ink-soft); }
39
+
40
+ /* task 1002830 — the transcript reader. Prose first: a conversation is read, not
41
+ scanned, so turns are a plain stack with the speaker as a quiet label rather than
42
+ a table. Tool calls and results are folded (<details>) because they are the bulk
43
+ of a transcript and the least interesting part of the story. pre-wrap keeps the
44
+ builder's own line breaks; overflow-wrap stops a long path pushing the card wide. */
45
+ .ledger-read { margin-left: 8px; font-size: 12px; }
46
+ .transcript { display: flex; flex-direction: column; gap: var(--sp-sm); }
47
+ .turn { border-left: 3px solid var(--rule); padding: 4px 0 4px 12px; }
48
+ .turn--user { border-left-color: var(--accent-ink); }
49
+ .turn__who { font-size: 12px; color: var(--ink-faint); margin: 0 0 2px; }
50
+ .turn__text { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
51
+ .turn details { margin-top: 4px; font-size: 13px; color: var(--ink-soft); }
52
+ .turn pre { margin: 4px 0 0; white-space: pre-wrap; overflow-wrap: anywhere; font-family: var(--font-mono); font-size: 12px; }
53
+ .turn__err { color: var(--danger); }
54
+ .transcript__note { color: var(--ink-faint); font-size: 13px; }
@@ -88,6 +88,18 @@
88
88
  <div id="sessions-pager-mount"></div>
89
89
  <p class="ledger__note" id="ledger-foot"></p>
90
90
  </section>
91
+
92
+ <!-- task 1002830: the narrative. Opened from a row's Read door; the SAME page
93
+ and the same gate as the ledger above (ADR 0051 — no second page). The
94
+ server decides who may read a transcript and records an administrator's
95
+ cross-builder read BEFORE serving it; this panel only displays. -->
96
+ <section class="scroll" id="transcript-scroll" aria-labelledby="transcript-h" hidden>
97
+ <h2 id="transcript-h" class="scroll__h">Transcript</h2>
98
+ <p class="scroll__lede" id="transcript-sub"></p>
99
+ <p><button type="button" class="btn" id="transcript-close">Close transcript</button></p>
100
+ <div id="transcript-body" class="transcript"></div>
101
+ <p><button type="button" class="btn" id="transcript-more" hidden>Load more turns</button></p>
102
+ </section>
91
103
  </main>
92
104
 
93
105
  <footer class="app-foot" id="app-foot"></footer>
@@ -110,6 +122,6 @@
110
122
  sessions.js, which reads window.OTBKit at boot. -->
111
123
  <script src="/builders/hall-kit.js"></script>
112
124
  <script src="/builders/brand-apply.js?v=2026-06-19-r56"></script>
113
- <script src="/builders/sessions.js?v=2026-08-28-kitpager"></script>
125
+ <script src="/builders/sessions.js?v=2026-10-02-transcript"></script>
114
126
  </body>
115
127
  </html>
@@ -8,7 +8,10 @@
8
8
  // returns; it is not the authority. On a 401 it redirects into the web sign-in
9
9
  // flow, like the other hall pages. Redesigned in task 1003470 (goal 1000081):
10
10
  // the totals on the shell's top strip, the ledger without its nowrap + wrapper
11
- // pair, every id on a row a door, the floor named from the pack.
11
+ // pair, every id on a row a door, the floor named from the pack. Task 1002830 added
12
+ // the narrative: a row's Read door opens the session's full transcript (ADR 0051)
13
+ // on THIS page, under the same gate — the owner or an Archon, the latter audited
14
+ // by the server before it serves a word.
12
15
 
13
16
  (() => {
14
17
  'use strict';
@@ -159,7 +162,7 @@
159
162
  const errs = num(s.tool_errors);
160
163
  return (
161
164
  '<tr>' +
162
- `<td><span class="ov-mono" title="${escapeHtml(s.session_id)}">${escapeHtml(shortSid(s.session_id))}</span></td>` +
165
+ `<td><span class="ov-mono" title="${escapeHtml(s.session_id)}">${escapeHtml(shortSid(s.session_id))}</span>${readDoor(s)}</td>` +
163
166
  `<td>${whoHtml}` +
164
167
  (s.rank ? ` <span class="ledger-rank">${escapeHtml(rankLabel(s.rank))}</span>` : '') +
165
168
  '</td>' +
@@ -178,6 +181,105 @@
178
181
  .join('');
179
182
  }
180
183
 
184
+ // ---- the transcript reader (task 1002830, ADR 0051) -----------------------
185
+
186
+ // A Read door only where there is something to read AND the server will serve it.
187
+ function canRead(s) {
188
+ if (!s.has_transcript || !viewer) return false;
189
+ return viewer.rank === 'archon' || String(s.builder_id) === String(viewer.id);
190
+ }
191
+ function readDoor(s) {
192
+ return canRead(s)
193
+ ? ` <button type="button" class="btn ledger-read" data-read="${escapeHtml(String(s.id))}" data-sid="${escapeHtml(shortSid(s.session_id))}">Read</button>`
194
+ : '';
195
+ }
196
+
197
+ // One turn as markup. EVERY string goes through escapeHtml — the stored text is
198
+ // scrubbed of secrets, not of markup, and it is arbitrary builder + tool output.
199
+ function turnHtml(t) {
200
+ const user = t.role === 'user';
201
+ let html = `<div class="turn turn--${user ? 'user' : 'assistant'}"><p class="turn__who">${user ? 'Builder' : 'Claude'}${t.ts ? ' · ' + escapeHtml(fmtDate(t.ts)) : ''}</p>`;
202
+ if (t.text) html += `<p class="turn__text">${escapeHtml(t.text)}</p>`;
203
+ for (const c of Array.isArray(t.tool_calls) ? t.tool_calls : []) {
204
+ html += `<details><summary>Ran ${escapeHtml(String(c.name || 'a tool'))}</summary><pre>${escapeHtml(c.input || '')}</pre></details>`;
205
+ }
206
+ for (const r of Array.isArray(t.tool_results) ? t.tool_results : []) {
207
+ html += `<details><summary${r.is_error ? ' class="turn__err"' : ''}>${r.is_error ? 'Tool error' : 'Tool result'}</summary><pre>${escapeHtml(r.text || '')}</pre></details>`;
208
+ }
209
+ return html + '</div>';
210
+ }
211
+
212
+ // `seq` is the open-reader generation: Read on another row while a fetch is in
213
+ // flight bumps it, and the older fetch then drops its answer instead of painting
214
+ // one session's turns into another's panel (the same idiom as `inFlight` above).
215
+ const reader = { id: null, sid: '', offset: 0, total: 0, busy: false, seq: 0 };
216
+
217
+ async function loadTranscript(reset) {
218
+ if (reader.id == null) return;
219
+ // Load-more while a page is already loading is a no-op; opening a DIFFERENT
220
+ // session is not (openTranscript bumps seq and clears busy).
221
+ if (reader.busy && !reset) return;
222
+ const seq = reader.seq;
223
+ const id = reader.id;
224
+ const sid = reader.sid;
225
+ reader.busy = true;
226
+ const more = $('#transcript-more');
227
+ more.disabled = true;
228
+ try {
229
+ const res = await api.request('GET', `${API}/sessions/${encodeURIComponent(reader.id)}/transcript?offset=${reset ? 0 : reader.offset}`);
230
+ if (seq !== reader.seq) return;
231
+ if (res.status === 401) { window.location.assign(`${API}/auth/web/start`); return; }
232
+ if (res.status === 404) {
233
+ $('#transcript-sub').textContent = `Session ${sid}.`;
234
+ $('#transcript-body').innerHTML = '<p class="transcript__note">There is no transcript you can read for this session.</p>';
235
+ more.hidden = true;
236
+ return;
237
+ }
238
+ if (!res.ok) throw new Error(`transcript → ${res.status}`);
239
+ const tr = res.data && res.data.transcript;
240
+ const turns = (tr && Array.isArray(tr.turns)) ? tr.turns : [];
241
+ reader.total = num(tr && tr.turn_count);
242
+ const body = $('#transcript-body');
243
+ if (reset) body.innerHTML = '';
244
+ body.insertAdjacentHTML('beforeend', turns.map(turnHtml).join(''));
245
+ reader.offset += turns.length;
246
+ more.hidden = !(turns.length > 0 && reader.offset < reader.total);
247
+ const trunc = tr && tr.truncated ? ' The middle of this very long session was left out when it was recorded.' : '';
248
+ $('#transcript-sub').textContent =
249
+ `Session ${sid} — showing ${fmtInt(reader.offset)} of ${fmtInt(reader.total)} turns.${trunc}`;
250
+ } catch (err) {
251
+ console.error('[sessions] failed to load transcript', err);
252
+ toast('Could not load the transcript.');
253
+ } finally {
254
+ if (seq === reader.seq) { reader.busy = false; more.disabled = false; }
255
+ }
256
+ }
257
+
258
+ function openTranscript(id, sid) {
259
+ reader.seq += 1; reader.busy = false;
260
+ reader.id = id; reader.sid = sid; reader.offset = 0; reader.total = 0;
261
+ $('#transcript-scroll').hidden = false;
262
+ $('#transcript-body').innerHTML = '';
263
+ $('#transcript-sub').textContent = `Session ${sid} — loading…`;
264
+ $('#transcript-more').hidden = true;
265
+ $('#transcript-scroll').scrollIntoView({ behavior: 'smooth', block: 'start' });
266
+ loadTranscript(true);
267
+ }
268
+
269
+ function wireReader() {
270
+ $('#sessions-body').addEventListener('click', (e) => {
271
+ const b = e.target.closest && e.target.closest('[data-read]');
272
+ if (b) openTranscript(b.getAttribute('data-read'), b.getAttribute('data-sid'));
273
+ });
274
+ $('#transcript-more').addEventListener('click', () => loadTranscript(false));
275
+ $('#transcript-close').addEventListener('click', () => {
276
+ reader.seq += 1; reader.busy = false;
277
+ reader.id = null;
278
+ $('#transcript-scroll').hidden = true;
279
+ $('#transcript-body').innerHTML = '';
280
+ });
281
+ }
282
+
181
283
  // The floor is written from the pack's rank label (ADR 0157: metic and up),
182
284
  // never a hardcoded rank name — the page used to say "Archons only".
183
285
  function showSealed(message) {
@@ -243,6 +345,9 @@
243
345
  } catch { /* no-op: the filter still works for this visit */ }
244
346
  }
245
347
  let loading = false;
348
+ // The viewer, kept so a row only offers Read where the server will answer: a
349
+ // transcript is the owner's, or an Archon's (audited). Cosmetic — the route is the wall.
350
+ let viewer = null;
246
351
  // Two clicks can be in flight at once; only the newest may paint (the profile
247
352
  // activity-log idiom, task 1003281).
248
353
  let inFlight = 0;
@@ -338,7 +443,7 @@
338
443
  $('#ledger-sub').textContent =
339
444
  `${fmtInt(totals.total)}${scope} session${num(totals.total) === 1 ? '' : 's'} across ${fmtInt(totals.builders)} builder${num(totals.builders) === 1 ? '' : 's'}.`;
340
445
  $('#ledger-foot').textContent =
341
- 'Most recent first. Each load of this page is itself recorded in the audit log.';
446
+ `Most recent first. Each load of this page is itself recorded in the audit log, and so is every transcript ${rankLabel('archon')} opens.`;
342
447
  return clamped;
343
448
  }
344
449
 
@@ -445,6 +550,9 @@
445
550
  return;
446
551
  }
447
552
 
553
+ viewer = { id: builder.id, rank: builder.rank };
554
+ wireReader();
555
+
448
556
  if (!kit) {
449
557
  console.error('[sessions] OTBKit did not load — the pager cannot be built');
450
558
  $('#ledger-sub').textContent = 'The session log could not be loaded. Try again.';
@@ -585,6 +585,10 @@ const SESSION_SUMMARY_COLS = `
585
585
  -- here means the row predates the classifier and the backfill has not reached
586
586
  -- it, which the ledger renders as a dash rather than claiming a verdict.
587
587
  sr.session_type,
588
+ -- ADR 0051 / task 1002830: whether a full transcript is stored, so the ledger only
589
+ -- offers a Read door where there is something behind it (rows that predate
590
+ -- transcript capture have none, and a door to a 404 is worse than no door).
591
+ EXISTS (SELECT 1 FROM session_transcripts st WHERE st.session_id = sr.session_id) AS has_transcript,
588
592
  sr.uploaded_at`;
589
593
 
590
594
  // searchSessions — cross-builder search over the corpus, filtered by session
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.23",
3
+ "version": "1.21.24",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.21.23",
9
+ "version": "1.21.24",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.21.23",
3
+ "version": "1.21.24",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
@@ -8894,5 +8894,11 @@
8894
8894
  "id": "1004477",
8895
8895
  "text": "Every page in the builders hall now goes back the same way: one Back button in the top bar. Task and idea pages used to draw their own back links, and the tweak editor had its own too. Opened from a goal, a task now shows \"Bac"
8896
8896
  }
8897
+ ],
8898
+ "1.21.24": [
8899
+ {
8900
+ "id": "1002830",
8901
+ "text": "Sessions now has a Read button on each row that opens the full conversation for that session. Only the session's owner or an administrator can read it, and administrator reads are logged."
8902
+ }
8897
8903
  ]
8898
8904
  }
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.21.23'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.21.24'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -92,3 +92,43 @@ test('the accessibility column is headed in plain language, not "Accessibility"'
92
92
  assert.match(thead, /Plain speech/, 'the column is headed "Plain speech"');
93
93
  assert.ok(!/>Accessibility</.test(thead), 'and does not collide with the zoom control\'s word');
94
94
  });
95
+
96
+ // ---- task 1002830: the transcript reader on the Sessions page (ADR 0051) ----
97
+ // Same technique as above: slice the shipped source (canRead/readDoor/turnHtml)
98
+ // and run it, so these exercise the real text.
99
+ function readerFns(viewer) {
100
+ const from = JS.indexOf(' function canRead(s)');
101
+ const to = JS.indexOf(' const reader = {');
102
+ assert.ok(from > 0 && to > from, 'the reader helpers are still where the slice expects them');
103
+ const src = JS.slice(from, to);
104
+ const escapeHtml = (v) => String(v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
105
+ return new Function('escapeHtml', 'shortSid', 'fmtDate', 'V',
106
+ `let viewer = V;\n${src}\nreturn { canRead, readDoor, turnHtml };`)(escapeHtml, (s) => String(s).slice(0, 8), (d) => String(d), viewer);
107
+ }
108
+
109
+ test('a Read door appears only for a stored transcript the viewer may read', () => {
110
+ const owner = readerFns({ id: 7, rank: 'metic' });
111
+ assert.ok(owner.readDoor({ id: 1, session_id: 'abcdefgh1', builder_id: 7, has_transcript: true }).includes('data-read="1"'), 'own session');
112
+ assert.equal(owner.readDoor({ id: 2, session_id: 's', builder_id: 8, has_transcript: true }), '', "a Metic gets no door to someone else's transcript");
113
+ assert.equal(owner.readDoor({ id: 3, session_id: 's', builder_id: 7, has_transcript: false }), '', 'no stored transcript, no door');
114
+ const archon = readerFns({ id: 1, rank: 'archon' });
115
+ assert.ok(archon.readDoor({ id: 2, session_id: 's', builder_id: 8, has_transcript: true }).includes('data-read="2"'), 'an Archon may read any');
116
+ assert.equal(readerFns(null).readDoor({ id: 2, builder_id: 8, has_transcript: true }), '', 'no viewer, no door');
117
+ });
118
+
119
+ test('transcript text is escaped — stored content is arbitrary builder + tool output', () => {
120
+ const { turnHtml } = readerFns({ id: 1, rank: 'archon' });
121
+ const html = turnHtml({
122
+ role: 'assistant', text: '<img src=x onerror=alert(1)>',
123
+ tool_calls: [{ name: '<b>Bash</b>', input: '<script>x</script>' }],
124
+ tool_results: [{ text: '"><svg onload=1>', is_error: true }],
125
+ });
126
+ assert.ok(!/<img|<script|<svg|<b>/i.test(html), 'no raw markup survives');
127
+ assert.match(html, /&lt;img/);
128
+ assert.match(html, /turn__err/, 'an error result is marked');
129
+ });
130
+
131
+ test('the transcript panel lives on the SAME page, under the ledger (no second page)', () => {
132
+ assert.match(HTML, /id="transcript-scroll"/);
133
+ assert.match(JS, /\/sessions\/\$\{encodeURIComponent\(reader\.id\)\}\/transcript/);
134
+ });
@@ -264,6 +264,11 @@ await t('read pages in SQL and clamps offset/limit', async () => {
264
264
  await db.getSessionTranscript(5, {});
265
265
  assert.deepEqual(captured[0].params, [5, 0, 500]);
266
266
  });
267
+ await t('the ledger columns carry has_transcript from session_transcripts', async () => {
268
+ captured.length = 0;
269
+ await db.listSessionsByBuilder(7, 5);
270
+ assert.ok(captured[0].sql.replace(/\s+/g, ' ').includes('EXISTS (SELECT 1 FROM session_transcripts st WHERE st.session_id = sr.session_id) AS has_transcript'));
271
+ });
267
272
  pool.query = origQuery;
268
273
 
269
274
  Object.assign(auth, { requireBuilder: orig.requireBuilder, insertAuditLog: orig.insertAuditLog });