@bongos/core 1.19.819 → 1.19.821

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.bongos-core.json +77 -42
  2. package/.claude/skills/builder-end/SKILL.md +1 -1
  3. package/clients/bongos-client/index.d.ts +1 -1
  4. package/docs/adr/0021-per-builder-skill-model-preferences.md +1 -1
  5. package/docs/adr/0024-multi-agent-system-architecture.md +1 -1
  6. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +1 -1
  7. package/docs/adr/0028-honest-llm-spend-accounting.md +1 -1
  8. package/docs/adr/0035-builder-onboarding-three-paths.md +1 -1
  9. package/docs/adr/0055-server-mediated-branch-publish.md +1 -1
  10. package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +1 -1
  11. package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +1 -1
  12. package/docs/adr/0060-gds-retrieval-layer.md +1 -1
  13. package/docs/adr/0070-deterministic-session-card-delivery.md +1 -1
  14. package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +1 -1
  15. package/docs/adr/0081-tool-agnostic-design-layer.md +2 -2
  16. package/docs/adr/0086-goal-scoped-work-hierarchy.md +4 -4
  17. package/docs/adr/0117-api-versioning-and-deprecation-policy.md +1 -1
  18. package/docs/api/openapi.json +4 -2
  19. package/docs/copy-inventory.md +23 -18
  20. package/docs/copy-registry.json +76 -31
  21. package/docs/module-api-changelog.md +5 -1
  22. package/docs/recipes/multi-builder-merge.md +2 -2
  23. package/docs/recipes/search-index-ingestion.md +2 -2
  24. package/migrations/core_246_session_type.sql +49 -0
  25. package/modules/hall-ui/public/sessions.css +19 -0
  26. package/modules/hall-ui/public/sessions.html +16 -1
  27. package/modules/hall-ui/public/sessions.js +135 -6
  28. package/modules/sessions/db.js +92 -6
  29. package/modules/sessions/routes/sessions.js +18 -1
  30. package/modules/sessions/session-type.js +132 -0
  31. package/package-lock.json +2 -2
  32. package/package.json +1 -1
  33. package/scripts/gds/backfill-session-types.js +87 -0
  34. package/scripts/gds/fitness.js +12 -1
  35. package/scripts/gds/home-isolation-guard.js +126 -0
  36. package/scripts/gds/ship-merge.js +5 -1
  37. package/scripts/gds/ship-regen.js +29 -0
  38. package/src/module-api.js +1 -1
  39. package/tests/cli_package.mjs +18 -2
  40. package/tests/hall_roster_world.mjs +10 -5
  41. package/tests/home_isolation_guard.mjs +95 -0
  42. package/tests/session_type.mjs +215 -0
  43. package/tests/ship_regen_copy_inventory.mjs +69 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Date:** 2026-07-04
4
4
  **Status:** Accepted (policy; R05 of goal 36).
5
- **Context:** [task 1992](https://builders.example.com#/task/1992) (BONGOS-V1, goal 36 "Robust, versioned, easy-to-call public API", criterion `api-versioning`). This is the **policy**; the mount + aliasing that implements it is R06 ([task 1993](https://builders.example.com#/task/1993)). Builds on the API-prefix chokepoint ([`src/gds/api-prefix.js`](../../src/gds/api-prefix.js), task 1918/1919), the self-describing OpenAPI + hosted `/docs` ([ADR 0109](0109-self-describing-openapi-and-hosted-docs.md)), and the docs-discovery contract ([ADR 0114](0114-instance-docs-discovery-contract.md)).
5
+ **Context:** [task 1992](https://builders.example.com#/task/1992) (BONGOS-V1, goal 36 "Robust, versioned, easy-to-call public API", criterion `api-versioning`). This is the **policy**; the mount + aliasing that implements it is R06 ([task 1993](https://builders.example.com#/task/1993)). Builds on the API-prefix chokepoint ([`src/bongos/api-prefix.js`](../../src/bongos/api-prefix.js), task 1918/1919), the self-describing OpenAPI + hosted `/docs` ([ADR 0109](0109-self-describing-openapi-and-hosted-docs.md)), and the docs-discovery contract ([ADR 0114](0114-instance-docs-discovery-contract.md)).
6
6
 
7
7
  ## Problem
8
8
 
@@ -19804,7 +19804,8 @@
19804
19804
  "total": {},
19805
19805
  "totals": {},
19806
19806
  "limit": {},
19807
- "offset": {}
19807
+ "offset": {},
19808
+ "session_types": {}
19808
19809
  },
19809
19810
  "required": [
19810
19811
  "sessions",
@@ -19812,7 +19813,8 @@
19812
19813
  "total",
19813
19814
  "totals",
19814
19815
  "limit",
19815
- "offset"
19816
+ "offset",
19817
+ "session_types"
19816
19818
  ]
19817
19819
  },
19818
19820
  "GetSpecialitiesIdDocumentsResponse": {
@@ -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
- **1863 strings** across 3 surfaces · 1617 distinct pieces of copy · 1863 certain, 0 heuristic · 170 shown in more than one place.
7
+ **1868 strings** across 3 surfaces · 1622 distinct pieces of copy · 1868 certain, 0 heuristic · 170 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` | 86 | 1373 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 86 | 1378 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 5 | 390 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `3e5a62bc4887` | 2x | A GitHub username is needed. | modules/hall-ui/public/hall-render.js:377, modules/hall-ui/public/watch.js:311 |
79
79
  | … | | _130 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1373 strings
81
+ ## `builders-hall` — 1378 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -157,6 +157,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
157
157
  | `ff67fba11965` | certain | Admitted into {…} mid-build | `modules/hall-ui/public/goals-render.js:873` |
158
158
  | `8b736e365191` | certain | All builders | `modules/hall-ui/public/hall-render.js:1145` |
159
159
  | `b5e03617b319` | certain | All goals | `modules/hall-ui/public/goals.html:53` |
160
+ | `e08d410571e9` | certain | All kinds | `modules/hall-ui/public/sessions.js:286` |
160
161
  | `9c34bccb06ef` | certain | All open asks | `modules/hall-ui/public/collab.html:64` |
161
162
  | `bea7817e57a4` | certain | All surfaces | `modules/hall-ui/public/copy-desk.js:301` |
162
163
  | `627c683a5e5d` | certain | All time | `modules/hall-ui/public/hall-widgets.js:130` |
@@ -319,8 +320,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
319
320
  | `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:644` |
320
321
  | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:318` |
321
322
  | `8a4b590fa1a0` | certain | Could not load requests. | `modules/hall-ui/public/collab.js:458` |
322
- | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:275` |
323
- | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:313` |
323
+ | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:399` |
324
+ | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:437` |
324
325
  | `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:626` |
325
326
  | `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:790` |
326
327
  | `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:244` |
@@ -368,7 +369,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
368
369
  | `b1602d01f4bb` | certain | Could not unblock: {…} | `modules/hall-ui/public/harbor.js:187` |
369
370
  | `3db890b074a7` | certain | Could not update visibility just now. | `modules/hall-ui/public/goals-render.js:1332` |
370
371
  | `112d12b24879` | certain | Could not verify your access. Go back and try again. | `modules/hall-ui/public/watch.js:1356` |
371
- | `6bd74fd20311` | certain | Could not verify your access. Try again. | `modules/hall-ui/public/sessions.js:312` |
372
+ | `6bd74fd20311` | certain | Could not verify your access. Try again. | `modules/hall-ui/public/sessions.js:436` |
372
373
  | `278e8281c82f` | certain | Could not vote: {…} | `modules/hall-ui/public/board-room.js:304` |
373
374
  | `a48e9f098392` | certain | Could not {…} just now. | `modules/hall-ui/public/goals-render.js:1318` |
374
375
  | `cb09ee26014f` | certain | Could not {…}: {…} | `modules/hall-ui/public/government.js:314` |
@@ -449,6 +450,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
449
450
  | `077cf99f49f6` | certain | File this idea | `modules/hall-ui/public/ideas.html:141` |
450
451
  | `a7bdd4706975` | certain | Filed as task {…} — this review is closed against it. | `modules/hall-ui/public/studio.js:446` |
451
452
  | `6430ee350486` | certain | Filed to the inbox. | `modules/hall-ui/public/ideas.js:478` |
453
+ | `e8dd9a8f3a7e` | certain | Filter sessions by kind | `modules/hall-ui/public/sessions.html:67` |
452
454
  | `1def0e7c716e` | certain | Find something to flag | `modules/hall-ui/public/copy-desk.html:64` |
453
455
  | `1109aec05482` | certain | First install | `modules/hall-ui/public/hall-render.js:846` |
454
456
  | `eab4f9da9037` | certain | First open: your computer warns about an unknown developer — expected (we haven't bought the signing certifica | `modules/hall-ui/public/settings.html:231` |
@@ -513,7 +515,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
513
515
  | `0bae5deb899d` | certain | How readily Claude opens a | `modules/hall-ui/public/settings.html:342` |
514
516
  | `63dbe9873b4e` | certain | How replies are pitched for you — the vocabulary assumed, how much hand-holding local tooling gets, how long a | `modules/hall-ui/public/settings.html:261` |
515
517
  | `868cf6930d64` | certain | How task estimates compare with the time work actually took. | `modules/hall-ui/public/watch.html:156` |
516
- | `6fad68f727e2` | certain | How the session read to this builder, scored against their own interaction profile. Advisory — it gates nothin | `modules/hall-ui/public/sessions.html:63` |
518
+ | `6fad68f727e2` | certain | How the session read to this builder, scored against their own interaction profile. Advisory — it gates nothin | `modules/hall-ui/public/sessions.html:78` |
517
519
  | `81fa43a51f8f` | certain | How the system works | `modules/hall-ui/public/diagrams.html:32` |
518
520
  | `06cb721a03e1` | certain | How the system works — {{worldName}} | `modules/hall-ui/public/diagrams.html:6` |
519
521
  | `06cb721a03e1` | certain | How the system works — {{worldName}} | `modules/hall-ui/public/diagrams.html:6` |
@@ -628,7 +630,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
628
630
  | `9af4b7a3a36f` | certain | Module truth | `modules/hall-ui/public/atlas.html:48` |
629
631
  | `319e9db996ea` | certain | Modules — {{worldName}} | `modules/hall-ui/public/modules.html:6` |
630
632
  | `319e9db996ea` | certain | Modules — {{worldName}} | `modules/hall-ui/public/modules.html:6` |
631
- | `1ae18e58fead` | certain | Most recent first. Each load of this page is itself recorded in the audit log. | `modules/hall-ui/public/sessions.js:228` |
633
+ | `1ae18e58fead` | certain | Most recent first. Each load of this page is itself recorded in the audit log. | `modules/hall-ui/public/sessions.js:340` |
632
634
  | `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` |
633
635
  | `e52ae74f0052` | certain | Move to goal | `modules/hall-ui/public/task.js:577` |
634
636
  | `e77d5f3beaef` | certain | Move to {…} | `modules/hall-ui/public/deploy.js:103` |
@@ -669,13 +671,14 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
669
671
  | `9f73b3f3dad0` | certain | No rank floor — any builder can claim this task | `modules/hall-ui/public/task-lib.js:62` |
670
672
  | `3fd0c6fcb92e` | certain | No request and no invite needed. Sign in with GitHub, and a step-by-step guide takes you the rest of the way. | `modules/hall-ui/public/hall-render.js:277` |
671
673
  | `9fb9f766450d` | certain | No sections yet | `modules/hall-ui/public/primer.js:131` |
672
- | `bef9fe43ba84` | certain | No sessions recorded yet. They land here as builders ship and end sessions. | `modules/hall-ui/public/sessions.js:109` |
674
+ | `bef9fe43ba84` | certain | No sessions recorded yet. They land here as builders ship and end sessions. | `modules/hall-ui/public/sessions.js:146` |
673
675
  | `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:169` |
674
676
  | `e30ff7d92be7` | certain | No tasks are in progress right now. | `modules/hall-ui/public/work.js:223` |
675
677
  | `712b64d8273f` | certain | No tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:414` |
676
678
  | `78f78d1d1e1f` | certain | No version is in flight right now. | `modules/hall-ui/public/roadmap.js:417` |
677
679
  | `c9800f8b6bc8` | certain | No versions declared yet. | `modules/hall-ui/public/roadmap.js:435` |
678
680
  | `4654849396a3` | certain | No work reviewed yet. | `modules/hall-ui/public/hall-widgets.js:150` |
681
+ | `086665af6208` | certain | No {…} sessions recorded. Choose another kind to widen the ledger. | `modules/hall-ui/public/sessions.js:145` |
679
682
  | `1967d2176f2e` | certain | Nobody has an open ask right now. | `modules/hall-ui/public/collab.html:68` |
680
683
  | `b54cb5ce7f73` | certain | Nobody is waiting on you. Requests reach you by craft — | `modules/hall-ui/public/collab.html:46` |
681
684
  | `91c409a4aea5` | certain | Nobody vouched for this name — anyone can file a request naming anyone. Confirm who is asking before you admit | `modules/hall-ui/public/watch.js:374` |
@@ -683,10 +686,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
683
686
  | `361b353ded5e` | certain | Not enough shipped work yet to chart. | `modules/hall-ui/public/hall-widgets.js:184` |
684
687
  | `90230572d017` | certain | Not found | `modules/hall-ui/public/task.js:966` |
685
688
  | `8226c979db4d` | certain | Not now | `modules/hall-ui/public/collab.js:365` |
686
- | `5ffcdc1a0176` | certain | Not scored — this builder’s own profile waived every signal, or the session predates this measure. | `modules/hall-ui/public/sessions.js:67` |
689
+ | `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` |
687
690
  | `61250b49a90b` | certain | Not scored. | `modules/hall-ui/public/idea.js:84` |
688
691
  | `8d6afe6def47` | certain | Not signed in | `modules/hall-ui/public/settings.html:40` |
689
692
  | `a290f6c14df9` | certain | Not taking requests | `modules/hall-ui/public/goals-render.js:939` |
693
+ | `20bb29015a84` | certain | Not yet classified. | `modules/hall-ui/public/sessions.js:72` |
690
694
  | `571b9b22dbda` | certain | Not yet ready — blocked by dependencies or awaiting promotion. These become claimable when their blockers ship | `modules/hall-ui/public/work.html:110` |
691
695
  | `0c59d118db9b` | certain | Note (optional) | `modules/hall-ui/public/task-detail.js:476` |
692
696
  | `9ca8cd37cac2` | certain | Note (optional) — why you're asking | `modules/hall-ui/public/goals-render.js:1205` |
@@ -754,7 +758,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
754
758
  | `6bc03d97457b` | certain | Pick a priority first. | `modules/hall-ui/public/task.js:868` |
755
759
  | `fcf996d77050` | certain | Pick a rank to see what it may do. The four ladder ranks ship with the platform; a custom rank is yours to sha | `modules/hall-ui/public/government.html:76` |
756
760
  | `45378ea261f6` | certain | Pick one… | `modules/hall-ui/public/settings.html:299` |
757
- | `25815a34d246` | certain | Plain speech | `modules/hall-ui/public/sessions.html:63` |
761
+ | `25815a34d246` | certain | Plain speech | `modules/hall-ui/public/sessions.html:78` |
758
762
  | `2ec5f77eb6f0` | certain | Preferred disciplines | `modules/hall-ui/public/settings.html:126` |
759
763
  | `f03d68e60416` | certain | Preferred work | `modules/hall-ui/public/hall-render.js:580` |
760
764
  | `ed8edd684547` | certain | Preferred work: | `modules/hall-ui/public/hall-render.js:531` |
@@ -1014,8 +1018,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1014
1018
  | `38ce5d68c182` | certain | The roster | `modules/hall-ui/public/roster.html:36` |
1015
1019
  | `dd6a926b8137` | certain | The same sentence, in several places. Sometimes that is right and the answer is to dismiss it; sometimes it is | `modules/hall-ui/public/copy-desk.html:57` |
1016
1020
  | `cd4ceb6e7e48` | certain | The seeded plan | `modules/hall-ui/public/roadmap.js:214` |
1017
- | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:274` |
1018
- | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:326` |
1021
+ | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:398` |
1022
+ | `d01d36a596b0` | certain | The session log could not be loaded. Try again. | `modules/hall-ui/public/sessions.js:450` |
1019
1023
  | `e48a9b77d91b` | certain | The session log opens from a higher rank. | `modules/hall-ui/public/sessions.html:41` |
1020
1024
  | `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:799` |
1021
1025
  | `6360a5988f26` | certain | The shape and health of the codebase. | `modules/hall-ui/public/watch.html:112` |
@@ -1072,7 +1076,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1072
1076
  | `82367d2122af` | certain | To paste the sign-in code: | `modules/hall-ui/public/hall-render.js:779` |
1073
1077
  | `f158ed1c24a2` | certain | Toggle fullscreen | `modules/hall-ui/public/diagram-viewer.js:101` |
1074
1078
  | `7dfdc26f9f79` | certain | Tokens refresh on use; re-issuing never signs you out anywhere else. | `modules/hall-ui/public/settings.html:155` |
1075
- | `8f38bbae750b` | certain | Tool errors | `modules/hall-ui/public/sessions.html:61` |
1079
+ | `8f38bbae750b` | certain | Tool errors | `modules/hall-ui/public/sessions.html:76` |
1076
1080
  | `77db3684aba9` | certain | Tracked for transparency — not charged in the early stage. | `modules/hall-ui/public/box-panel.js:237` |
1077
1081
  | `becc35640e42` | certain | Trained on | `modules/hall-ui/public/settings-specialities.js:80` |
1078
1082
  | `1a64679fbb42` | certain | Typo or grammar | `modules/hall-ui/public/copy-desk.html:94` |
@@ -1110,6 +1114,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1110
1114
  | `00dc1f0f83e1` | certain | What kind of wrong? | `modules/hall-ui/public/copy-desk.html:87` |
1111
1115
  | `9a85f2c19b48` | certain | What should it say? | `modules/hall-ui/public/copy-desk.html:156` |
1112
1116
  | `2dd116d2d817` | certain | What the current wording gets wrong, and what yours does about it. | `modules/hall-ui/public/copy-desk.html:166` |
1117
+ | `e179870922a3` | certain | What the session did, derived from its own transcript: whether it wrote files, used tools, and how many prompt | `modules/hall-ui/public/sessions.html:74` |
1113
1118
  | `5f2b989bbf6a` | certain | What this builder has done, seen one craft at a time. | `modules/hall-ui/public/profile.html:134` |
1114
1119
  | `32d675a2b022` | certain | What this rank is for (optional) | `modules/hall-ui/public/government.html:90` |
1115
1120
  | `04b3ff4c4f4c` | certain | What users can see | `modules/hall-ui/public/deploy.html:35` |
@@ -1368,8 +1373,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1368
1373
  | `c5623d60015d` | certain | {…} Your standing is {…}. | `modules/hall-ui/public/hall-render.js:858` |
1369
1374
  | `a91e1e702d4d` | certain | {…} achieved, {…} in progress, {…} not started of {…} goals | `modules/hall-ui/public/roadmap.js:80` |
1370
1375
  | `a65d371b5cb3` | certain | {…} and above can enable or disable a module | `modules/hall-ui/public/modules.js:130` |
1371
- | `98b1c674fc37` | certain | {…} and up | `modules/hall-ui/public/sessions.js:149` |
1372
- | `111b71a9acaf` | certain | {…} and up. | `modules/hall-ui/public/sessions.js:147` |
1376
+ | `98b1c674fc37` | certain | {…} and up | `modules/hall-ui/public/sessions.js:187` |
1377
+ | `111b71a9acaf` | certain | {…} and up. | `modules/hall-ui/public/sessions.js:185` |
1373
1378
  | `0da0e247ff0f` | certain | {…} asking to connect | `modules/hall-ui/public/profile-connections.js:136` |
1374
1379
  | `788ff11f1135` | certain | {…} awarded | `modules/hall-ui/public/task.js:478` |
1375
1380
  | `9d160147b34a` | certain | {…} criteria · since {…} | `modules/hall-ui/public/roadmap.js:160` |
@@ -1389,12 +1394,11 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1389
1394
  | `275f3565c78b` | certain | {…} reset to its default {…} permissions. | `modules/hall-ui/public/government.js:297` |
1390
1395
  | `33afba17ee0f` | certain | {…} seeded | `modules/hall-ui/public/roadmap.js:214` |
1391
1396
  | `732b4c935e36` | certain | {…} sessions | `modules/hall-ui/public/task.js:486` |
1392
- | `3d76dce19c4a` | certain | {…} session{…} across {…} builder{…}. | `modules/hall-ui/public/sessions.js:226` |
1393
1397
  | `e08fa22622f0` | certain | {…} shipped, {…} confirmed, {…} completed, {…} remaining of {…} | `modules/hall-ui/public/roadmap.js:74` |
1394
1398
  | `e08fa22622f0` | certain | {…} shipped, {…} confirmed, {…} completed, {…} remaining of {…} | `modules/hall-ui/public/roadmap.js:305` |
1395
1399
  | `ad27ae9f5433` | certain | {…} tasks · {…} | `modules/hall-ui/public/roadmap.js:431` |
1396
1400
  | `a15c35192be9` | certain | {…} to claim | `modules/hall-ui/public/goals-render.js:393` |
1397
- | `955499559f0a` | certain | {…} tokens | `modules/hall-ui/public/sessions.js:132` |
1401
+ | `955499559f0a` | certain | {…} tokens | `modules/hall-ui/public/sessions.js:170` |
1398
1402
  | `8e28c14b106d` | certain | {…} total | `modules/hall-ui/public/roadmap.js:127` |
1399
1403
  | `1a8a6267e490` | certain | {…} unfinished task{…} — say what happens to each | `modules/hall-ui/public/goals-render.js:1006` |
1400
1404
  | `44e2f95586e4` | certain | {…} will be able to open dev boxes again. | `modules/hall-ui/public/harbor.js:177` |
@@ -1418,6 +1422,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1418
1422
  | `8e8c7da4f7f5` | certain | {…}criteria met · awaiting review | `modules/hall-ui/public/goals-render.js:155` |
1419
1423
  | `1e275ee0299c` | certain | {…}s only | `modules/hall-ui/public/government.js:896` |
1420
1424
  | `499916045b19` | certain | {…}{…} asks to join | `modules/hall-ui/public/goal-inbox.js:69` |
1425
+ | `97e27ab169ae` | certain | {…}{…} session{…} across {…} builder{…}. | `modules/hall-ui/public/sessions.js:338` |
1421
1426
  | `3d74668f69e5` | certain | {…}{…} · {…} | `modules/hall-ui/public/task.js:649` |
1422
1427
  | `9588652a7aff` | certain | · follows your profile setting | `modules/hall-ui/public/settings.js:568` |
1423
1428
  | `4a5ff4f662df` | certain | — ${…} of ${…} this month ({…}%). {…} | `modules/hall-ui/public/hall-render.js:471` |
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1863,
7
- "unique_ids": 1617,
8
- "certain": 1863,
6
+ "strings": 1868,
7
+ "unique_ids": 1622,
8
+ "certain": 1868,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 170
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 86,
16
- "strings": 1373
16
+ "strings": 1378
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -730,8 +730,8 @@
730
730
  "text": "Could not load sessions.",
731
731
  "occurrences": 2,
732
732
  "at": [
733
- "modules/hall-ui/public/sessions.js:275",
734
- "modules/hall-ui/public/sessions.js:313"
733
+ "modules/hall-ui/public/sessions.js:399",
734
+ "modules/hall-ui/public/sessions.js:437"
735
735
  ]
736
736
  },
737
737
  {
@@ -1480,8 +1480,8 @@
1480
1480
  "text": "The session log could not be loaded. Try again.",
1481
1481
  "occurrences": 2,
1482
1482
  "at": [
1483
- "modules/hall-ui/public/sessions.js:274",
1484
- "modules/hall-ui/public/sessions.js:326"
1483
+ "modules/hall-ui/public/sessions.js:398",
1484
+ "modules/hall-ui/public/sessions.js:450"
1485
1485
  ]
1486
1486
  },
1487
1487
  {
@@ -2491,6 +2491,15 @@
2491
2491
  "origin": "html-text",
2492
2492
  "confidence": "certain"
2493
2493
  },
2494
+ {
2495
+ "id": "e08d410571e9",
2496
+ "surface": "builders-hall",
2497
+ "text": "All kinds",
2498
+ "file": "modules/hall-ui/public/sessions.js",
2499
+ "line": 286,
2500
+ "origin": "js-markup",
2501
+ "confidence": "certain"
2502
+ },
2494
2503
  {
2495
2504
  "id": "9c34bccb06ef",
2496
2505
  "surface": "builders-hall",
@@ -3954,7 +3963,7 @@
3954
3963
  "surface": "builders-hall",
3955
3964
  "text": "Could not load sessions.",
3956
3965
  "file": "modules/hall-ui/public/sessions.js",
3957
- "line": 275,
3966
+ "line": 399,
3958
3967
  "origin": "js-notice",
3959
3968
  "confidence": "certain"
3960
3969
  },
@@ -3963,7 +3972,7 @@
3963
3972
  "surface": "builders-hall",
3964
3973
  "text": "Could not load sessions.",
3965
3974
  "file": "modules/hall-ui/public/sessions.js",
3966
- "line": 313,
3975
+ "line": 437,
3967
3976
  "origin": "js-notice",
3968
3977
  "confidence": "certain"
3969
3978
  },
@@ -4395,7 +4404,7 @@
4395
4404
  "surface": "builders-hall",
4396
4405
  "text": "Could not verify your access. Try again.",
4397
4406
  "file": "modules/hall-ui/public/sessions.js",
4398
- "line": 312,
4407
+ "line": 436,
4399
4408
  "origin": "js-text-assign",
4400
4409
  "confidence": "certain"
4401
4410
  },
@@ -5119,6 +5128,15 @@
5119
5128
  "origin": "js-text-assign",
5120
5129
  "confidence": "certain"
5121
5130
  },
5131
+ {
5132
+ "id": "e8dd9a8f3a7e",
5133
+ "surface": "builders-hall",
5134
+ "text": "Filter sessions by kind",
5135
+ "file": "modules/hall-ui/public/sessions.html",
5136
+ "line": 67,
5137
+ "origin": "html-attr:aria-label",
5138
+ "confidence": "certain"
5139
+ },
5122
5140
  {
5123
5141
  "id": "1def0e7c716e",
5124
5142
  "surface": "builders-hall",
@@ -5700,7 +5718,7 @@
5700
5718
  "surface": "builders-hall",
5701
5719
  "text": "How the session read to this builder, scored against their own interaction profile. Advisory — it gates nothing.",
5702
5720
  "file": "modules/hall-ui/public/sessions.html",
5703
- "line": 63,
5721
+ "line": 78,
5704
5722
  "origin": "html-attr:title",
5705
5723
  "confidence": "certain"
5706
5724
  },
@@ -6735,7 +6753,7 @@
6735
6753
  "surface": "builders-hall",
6736
6754
  "text": "Most recent first. Each load of this page is itself recorded in the audit log.",
6737
6755
  "file": "modules/hall-ui/public/sessions.js",
6738
- "line": 228,
6756
+ "line": 340,
6739
6757
  "origin": "js-text-assign",
6740
6758
  "confidence": "certain"
6741
6759
  },
@@ -7104,7 +7122,7 @@
7104
7122
  "surface": "builders-hall",
7105
7123
  "text": "No sessions recorded yet. They land here as builders ship and end sessions.",
7106
7124
  "file": "modules/hall-ui/public/sessions.js",
7107
- "line": 109,
7125
+ "line": 146,
7108
7126
  "origin": "js-markup",
7109
7127
  "confidence": "certain"
7110
7128
  },
@@ -7162,6 +7180,15 @@
7162
7180
  "origin": "js-markup",
7163
7181
  "confidence": "certain"
7164
7182
  },
7183
+ {
7184
+ "id": "086665af6208",
7185
+ "surface": "builders-hall",
7186
+ "text": "No {…} sessions recorded. Choose another kind to widen the ledger.",
7187
+ "file": "modules/hall-ui/public/sessions.js",
7188
+ "line": 145,
7189
+ "origin": "js-markup",
7190
+ "confidence": "certain"
7191
+ },
7165
7192
  {
7166
7193
  "id": "1967d2176f2e",
7167
7194
  "surface": "builders-hall",
@@ -7230,7 +7257,7 @@
7230
7257
  "surface": "builders-hall",
7231
7258
  "text": "Not scored — this builder’s own profile waived every signal, or the session predates this measure.",
7232
7259
  "file": "modules/hall-ui/public/sessions.js",
7233
- "line": 67,
7260
+ "line": 100,
7234
7261
  "origin": "js-markup",
7235
7262
  "confidence": "certain"
7236
7263
  },
@@ -7261,6 +7288,15 @@
7261
7288
  "origin": "js-markup",
7262
7289
  "confidence": "certain"
7263
7290
  },
7291
+ {
7292
+ "id": "20bb29015a84",
7293
+ "surface": "builders-hall",
7294
+ "text": "Not yet classified.",
7295
+ "file": "modules/hall-ui/public/sessions.js",
7296
+ "line": 72,
7297
+ "origin": "js-markup",
7298
+ "confidence": "certain"
7299
+ },
7264
7300
  {
7265
7301
  "id": "571b9b22dbda",
7266
7302
  "surface": "builders-hall",
@@ -7869,7 +7905,7 @@
7869
7905
  "surface": "builders-hall",
7870
7906
  "text": "Plain speech",
7871
7907
  "file": "modules/hall-ui/public/sessions.html",
7872
- "line": 63,
7908
+ "line": 78,
7873
7909
  "origin": "html-text",
7874
7910
  "confidence": "certain"
7875
7911
  },
@@ -10209,7 +10245,7 @@
10209
10245
  "surface": "builders-hall",
10210
10246
  "text": "The session log could not be loaded. Try again.",
10211
10247
  "file": "modules/hall-ui/public/sessions.js",
10212
- "line": 274,
10248
+ "line": 398,
10213
10249
  "origin": "js-text-assign",
10214
10250
  "confidence": "certain"
10215
10251
  },
@@ -10218,7 +10254,7 @@
10218
10254
  "surface": "builders-hall",
10219
10255
  "text": "The session log could not be loaded. Try again.",
10220
10256
  "file": "modules/hall-ui/public/sessions.js",
10221
- "line": 326,
10257
+ "line": 450,
10222
10258
  "origin": "js-text-assign",
10223
10259
  "confidence": "certain"
10224
10260
  },
@@ -10731,7 +10767,7 @@
10731
10767
  "surface": "builders-hall",
10732
10768
  "text": "Tool errors",
10733
10769
  "file": "modules/hall-ui/public/sessions.html",
10734
- "line": 61,
10770
+ "line": 76,
10735
10771
  "origin": "html-text",
10736
10772
  "confidence": "certain"
10737
10773
  },
@@ -11068,6 +11104,15 @@
11068
11104
  "origin": "html-attr:placeholder",
11069
11105
  "confidence": "certain"
11070
11106
  },
11107
+ {
11108
+ "id": "e179870922a3",
11109
+ "surface": "builders-hall",
11110
+ "text": "What the session did, derived from its own transcript: whether it wrote files, used tools, and how many prompts a person actually sent.",
11111
+ "file": "modules/hall-ui/public/sessions.html",
11112
+ "line": 74,
11113
+ "origin": "html-attr:title",
11114
+ "confidence": "certain"
11115
+ },
11071
11116
  {
11072
11117
  "id": "5f2b989bbf6a",
11073
11118
  "surface": "builders-hall",
@@ -13395,7 +13440,7 @@
13395
13440
  "surface": "builders-hall",
13396
13441
  "text": "{…} and up",
13397
13442
  "file": "modules/hall-ui/public/sessions.js",
13398
- "line": 149,
13443
+ "line": 187,
13399
13444
  "origin": "js-text-assign",
13400
13445
  "confidence": "certain"
13401
13446
  },
@@ -13404,7 +13449,7 @@
13404
13449
  "surface": "builders-hall",
13405
13450
  "text": "{…} and up.",
13406
13451
  "file": "modules/hall-ui/public/sessions.js",
13407
- "line": 147,
13452
+ "line": 185,
13408
13453
  "origin": "js-text-assign",
13409
13454
  "confidence": "certain"
13410
13455
  },
@@ -13579,15 +13624,6 @@
13579
13624
  "origin": "js-markup",
13580
13625
  "confidence": "certain"
13581
13626
  },
13582
- {
13583
- "id": "3d76dce19c4a",
13584
- "surface": "builders-hall",
13585
- "text": "{…} session{…} across {…} builder{…}.",
13586
- "file": "modules/hall-ui/public/sessions.js",
13587
- "line": 226,
13588
- "origin": "js-text-assign",
13589
- "confidence": "certain"
13590
- },
13591
13627
  {
13592
13628
  "id": "e08fa22622f0",
13593
13629
  "surface": "builders-hall",
@@ -13629,7 +13665,7 @@
13629
13665
  "surface": "builders-hall",
13630
13666
  "text": "{…} tokens",
13631
13667
  "file": "modules/hall-ui/public/sessions.js",
13632
- "line": 132,
13668
+ "line": 170,
13633
13669
  "origin": "js-markup",
13634
13670
  "confidence": "certain"
13635
13671
  },
@@ -13840,6 +13876,15 @@
13840
13876
  "origin": "js-markup",
13841
13877
  "confidence": "certain"
13842
13878
  },
13879
+ {
13880
+ "id": "97e27ab169ae",
13881
+ "surface": "builders-hall",
13882
+ "text": "{…}{…} session{…} across {…} builder{…}.",
13883
+ "file": "modules/hall-ui/public/sessions.js",
13884
+ "line": 338,
13885
+ "origin": "js-text-assign",
13886
+ "confidence": "certain"
13887
+ },
13843
13888
  {
13844
13889
  "id": "3d74668f69e5",
13845
13890
  "surface": "builders-hall",
@@ -2111,6 +2111,10 @@ is load-bearing: the script throws rather than guess if it is missing, and
2111
2111
  1.19.818 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2112
2112
  landed since 1.19.817 with no explicit bump. run 35201213516. (task 1002620)
2113
2113
  1.19.819 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2114
- landed since 1.19.818 with no explicit bump. run 35205615659. (task 1002620)
2114
+ landed since 1.19.818 with no explicit bump. run 35206448426. (task 1002620)
2115
+ 1.19.820 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2116
+ landed since 1.19.819 with no explicit bump. run 35209838815. (task 1002620)
2117
+ 1.19.821 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
2118
+ landed since 1.19.820 with no explicit bump. run 35212866365. (task 1002620)
2115
2119
  ---------------------------------------------------------------------------
2116
2120
  ```
@@ -14,7 +14,7 @@ This recipe is the audit deliverable for [#269](https://example.com/builders#/ta
14
14
  - **Claim side is already deterministic.** `claimTask()` runs in a single transaction with `SELECT … FOR UPDATE` on the task row, a touches-overlap check, and the `uniq_active_claim_per_task` partial unique index. A lost race surfaces as `ALREADY_CLAIMED` (Postgres `23505`), never as corruption. No change needed.
15
15
  - **Merge side is the risk, and it has ONE shared resource:** the single `main` worktree (`REPO_ROOT`) on the build machine. Every ship's auto-merge and every `/merge-mode` run checks out `main`, fetches, merges, pushes, and deploys *there*.
16
16
  - **[#462](https://example.com/builders#/task/462) (criterion C4)** added a lockfile so two concurrent **ships** couldn't collide — but the lock lived *inside* `ship.js`, so `/merge-mode` (which mutates the same tree by hand) never took it. That left two races open: **ship-vs-merge-mode** and **merge-mode-vs-merge-mode**.
17
- - **[#269](https://example.com/builders#/task/269) (this task)** extracts the lock into [`src/bongos/merge-lock.js`](../../src/bongos/merge-lock.js) and has **both** surfaces acquire the **same** mutex. `/merge-mode` takes it via the [`scripts/gds/merge-lock.js`](../../scripts/gds/merge-lock.js) CLI before it touches `main`, and releases it after deploy.
17
+ - **[#269](https://example.com/builders#/task/269) (this task)** extracts the lock into [`modules/lifecycle/merge-lock.js`](../../modules/lifecycle/merge-lock.js) and has **both** surfaces acquire the **same** mutex. `/merge-mode` takes it via the [`scripts/gds/merge-lock.js`](../../scripts/gds/merge-lock.js) CLI before it touches `main`, and releases it after deploy.
18
18
 
19
19
  ---
20
20
 
@@ -48,7 +48,7 @@ This recipe is the audit deliverable for [#269](https://example.com/builders#/ta
48
48
 
49
49
  ## The mutex, precisely
50
50
 
51
- [`src/bongos/merge-lock.js`](../../src/bongos/merge-lock.js) is a portable, advisory file lock at `<REPO_ROOT>/.git/otb-automerge.lock`. **Not `flock(2)`** — ships run on macOS over an iCloud-synced filesystem where `flock` is unreliable, and the manual `/merge-mode` holder is a short-lived CLI process with no long-lived owner.
51
+ [`modules/lifecycle/merge-lock.js`](../../modules/lifecycle/merge-lock.js) is a portable, advisory file lock at `<REPO_ROOT>/.git/otb-automerge.lock`. **Not `flock(2)`** — ships run on macOS over an iCloud-synced filesystem where `flock` is unreliable, and the manual `/merge-mode` holder is a short-lived CLI process with no long-lived owner.
52
52
 
53
53
  Lockfile format (3 lines): `pid` · `epoch-ms timestamp` · `mode` (`auto` | `manual`).
54
54
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  How the `search_chunks` index (the recall layer, [ADR 0060](../adr/0060-gds-retrieval-layer.md)) gets populated from repo markdown, and how to operate it. Read before touching `scripts/gds/search-ingest-md.js` or the deploy hook.
4
4
 
5
- > The query side is [`src/bongos/search.js`](../../src/bongos/search.js) + [`POST /api/gds/search`](../../src/bongos/routes/search.js) ([#949](https://example.com/builders#/task/949)); rank/owner scoping + its isolation suite are [#950](https://example.com/builders#/task/950). Ingestion has two halves: **repo markdown** (this recipe's first sections — [#947](https://example.com/builders#/task/947), the deploy hook) and **DB prose** (the [DB-prose nightly](#db-prose-nightly-timer) section below — [#948](https://example.com/builders#/task/948), a systemd timer).
5
+ > The query side is [`modules/memory/search.js`](../../modules/memory/search.js) + [`POST /api/gds/search`](../../modules/memory/routes/search.js) ([#949](https://example.com/builders#/task/949)); rank/owner scoping + its isolation suite are [#950](https://example.com/builders#/task/950). Ingestion has two halves: **repo markdown** (this recipe's first sections — [#947](https://example.com/builders#/task/947), the deploy hook) and **DB prose** (the [DB-prose nightly](#db-prose-nightly-timer) section below — [#948](https://example.com/builders#/task/948), a systemd timer).
6
6
 
7
7
  ## What it does
8
8
 
9
- `node scripts/gds/search-ingest-md.js` walks the repo's markdown (~226 files), chunks each file via the heading-aware chunker ([`src/bongos/search-chunker.js`](../../src/bongos/search-chunker.js)), and upserts the chunks into `search_chunks`:
9
+ `node scripts/gds/search-ingest-md.js` walks the repo's markdown (~226 files), chunks each file via the heading-aware chunker ([`modules/memory/search-chunker.js`](../../modules/memory/search-chunker.js)), and upserts the chunks into `search_chunks`:
10
10
 
11
11
  - **Delta-driven.** Each chunk's `content_hash` (sha256 of its body) is the change key. The upsert's `ON CONFLICT … DO UPDATE … WHERE content_hash IS DISTINCT FROM EXCLUDED.content_hash` makes an unchanged chunk a **no-op** (no row rewrite). A re-run over an unchanged tree writes nothing.
12
12
  - **Prunes shrinkage.** If a file loses sections, chunks beyond the new count are deleted; if a file is removed from the tree entirely, all its chunks are deleted (`source_kind='doc' AND source_ref NOT IN (present)`).
@@ -0,0 +1,49 @@
1
+ -- core_246_session_type.sql — WHAT EACH SESSION WAS (task 1003975, idea 1001033).
2
+ --
3
+ -- The session ledger could say whether a session shipped a task and nothing else,
4
+ -- so the 54% of the corpus with an empty task_ids read as an undifferentiated
5
+ -- column of dashes. This column holds the verdict of modules/sessions/session-type.js
6
+ -- — a pure, deterministic read of the digest the session already uploaded (its
7
+ -- prompt count and which tools it called), computed once at upload rather than on
8
+ -- every query, because the write-tool signal lives in the `detail` jsonb and
9
+ -- scanning it per request would put a jsonb walk on the ledger's hot path.
10
+ --
11
+ -- WHY IT IS HERE AND NOT IN modules/sessions/migrations/. The sessions module's
12
+ -- own CLAUDE.md says a new session migration belongs in the module — but that
13
+ -- holds only for a table the module OWNS. `session_records` predates the module
14
+ -- system and lives in core, and ADR 0083 §Decision #5 (enforced by fitness.js,
15
+ -- "module migrations additive + namespaced") lets a module migration touch only
16
+ -- its own `sessions_`-prefixed tables. A module migration adding this column was
17
+ -- written first and the gate refused it, correctly. The rule wins; the module doc
18
+ -- has been narrowed to say so.
19
+ --
20
+ -- NULLABLE ON PURPOSE, and there is no DEFAULT. Three reasons:
21
+ -- * Every row that predates this migration is legitimately unclassified until
22
+ -- the backfill (scripts/gds/backfill-session-types.js) runs. A DEFAULT would
23
+ -- assert a type for 4,595 rows nobody measured.
24
+ -- * The upload path fills it, but an older CLI posting the current body shape
25
+ -- must keep working — the column is derived server-side from what the body
26
+ -- already carries, never sent by the client, so no pinned core is broken.
27
+ -- * NULL is distinguishable from 'unknown'. NULL means "not yet classified";
28
+ -- 'unknown' means "classified, and the digest did not decide". Collapsing the
29
+ -- two would make the backfill's own progress unreadable.
30
+ --
31
+ -- NO CHECK CONSTRAINT against the type list. The closed set lives in
32
+ -- session-type.js, which the route filter and the ledger both validate against;
33
+ -- duplicating it here would give the vocabulary a second home that a deploy can
34
+ -- leave behind. The values are written by one function, never by a client.
35
+
36
+ ALTER TABLE session_records
37
+ ADD COLUMN IF NOT EXISTS session_type text;
38
+
39
+ COMMENT ON COLUMN session_records.session_type IS
40
+ 'Derived shape of the session (build / automated / exploration / conversation / unknown) '
41
+ 'from modules/sessions/session-type.js. NULL = not yet classified, which is not the same '
42
+ 'as ''unknown''. Never client-supplied.';
43
+
44
+ -- Partial index: the ledger filters BY a type, never FOR the unclassified, so the
45
+ -- NULL rows are dead weight in the index. Drops with the backlog as the backfill
46
+ -- runs, which is the opposite of what a full index would do.
47
+ CREATE INDEX IF NOT EXISTS idx_session_records_type
48
+ ON session_records (session_type, uploaded_at DESC)
49
+ WHERE session_type IS NOT NULL;
@@ -17,3 +17,22 @@
17
17
  /* The task ids: chips that are doors (the family's a.fact-chip hover). */
18
18
  .ledger-tasks { display: inline-flex; flex-wrap: wrap; gap: 6px; }
19
19
  .ledger-tasks .fact-chip { text-decoration: none; }
20
+ /* task 1003975 — the kind filter row. Right-aligned above the ledger so it sits
21
+ over the column it acts on without stealing the lede's line; it reuses the
22
+ pager's .pager__perpage label+select so the page has ONE control grammar. */
23
+ .ledger-filters { display: flex; justify-content: flex-end; margin: 0 0 var(--sp-sm); }
24
+ /* The control itself: the same label+select proportions as the pager's per-page
25
+ picker, so the page reads as one grammar — but its OWN class, because the
26
+ hall_audit guard treats any .pager* markup outside the kit as a second pager,
27
+ and borrowing that family is exactly how one starts. */
28
+ .ledger-filter {
29
+ display: inline-flex; align-items: center; gap: 6px;
30
+ font-size: 12px; color: var(--ink-faint);
31
+ }
32
+ .ledger-filter select { height: 30px; padding: 2px 8px; font-size: 13px; }
33
+ /* The kind cell: a quiet fact, not a chip. The ledger already spends its colour
34
+ on the two warnings (tool errors, plain speech), and a third coloured token
35
+ per row would make the warnings stop reading as warnings. Deliberately NO
36
+ white-space: nowrap — task 1003470 removed the blanket nowrap that broke this
37
+ table on a phone, and "Automated run" is short enough to wrap harmlessly. */
38
+ .ledger-kind { color: var(--ink-soft); }