@bongos/core 1.21.108 → 1.21.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.21.108",
6
- "core_contract": "1.21.108",
7
- "source_commit": "4744afee212fe2a5c5bac890ee578bbaae7e3c5b",
5
+ "core_version": "1.21.110",
6
+ "core_contract": "1.21.110",
7
+ "source_commit": "4df16a5c3d2eee37ad6572bb1be32a106bea9fd1",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-10-09T16:36:02.296Z",
9
+ "built_at": "2026-10-09T17:01:53.765Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 592,
13
13
  "agent_docs_stubbed": 28,
14
- "functional_verbatim": 3027,
14
+ "functional_verbatim": 3034,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 3648,
20
- "tree_sha256": "62c2521f5de99bd666286fed934e1c0e7269d9b22a9953b772b54b1fa3a738e2",
19
+ "file_count": 3655,
20
+ "tree_sha256": "b5f9cc8c8673642d60dd789484f12cf32347f5ebad634f319e34770a77620c72",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -152,7 +152,7 @@
152
152
  {
153
153
  "path": ".claude/skills/goal-create/SKILL.md",
154
154
  "mode": "0000644",
155
- "sha256": "5fb0e00c6d6d8f1d1cc87136dd0a42cfc9379ffc55b8b5bdbbd736541e50c299"
155
+ "sha256": "11f9e820c5e37818de14b701945f8606562572c4381ba90ded31364005edf0fb"
156
156
  },
157
157
  {
158
158
  "path": ".claude/skills/goal-review/SKILL.md",
@@ -207,7 +207,7 @@
207
207
  {
208
208
  "path": ".claude/skills/planning-session/SKILL.md",
209
209
  "mode": "0000644",
210
- "sha256": "07383a95bda58d86c833d963c421a9792b5fb879fa7fc75aba7b18b318e59b6e"
210
+ "sha256": "0d3ad6a9a7f3d0ee4bbdc0a8539705bdc5e9ab492151f3886120c15e102758a6"
211
211
  },
212
212
  {
213
213
  "path": ".claude/skills/priority-session/SKILL.md",
@@ -2357,12 +2357,12 @@
2357
2357
  {
2358
2358
  "path": "docs/copy-inventory.md",
2359
2359
  "mode": "0000644",
2360
- "sha256": "1d38789dcf8ea53dfc188e72896d346c1324494ab9f80aec4fc2aeef3907766e"
2360
+ "sha256": "1fb4f9a78241bcfc0aa998f66bb96cab2e63b1a07c82f3ed54307728b9a3a856"
2361
2361
  },
2362
2362
  {
2363
2363
  "path": "docs/copy-registry.json",
2364
2364
  "mode": "0000644",
2365
- "sha256": "a93000df72e34c83bdf0ab43817a754f7db6f4d7dcdd6f436422426a2cc57a1f"
2365
+ "sha256": "70ca4ad9a7a6dfcbb294c3b4e0f4f80f779ac9b89b24e845c5c602e287df528c"
2366
2366
  },
2367
2367
  {
2368
2368
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2872,7 +2872,7 @@
2872
2872
  {
2873
2873
  "path": "docs/module-api-changelog.md",
2874
2874
  "mode": "0000644",
2875
- "sha256": "591ca6f09789a658cec2c0442d76fff5b80c3af4c620fb6b197499aa276d21fc"
2875
+ "sha256": "0ee9660d1757ad8c73fd71e37250ff001b89a9ca894f8e75a01fc97e5db4e759"
2876
2876
  },
2877
2877
  {
2878
2878
  "path": "docs/modules-contract.md",
@@ -2962,7 +2962,7 @@
2962
2962
  {
2963
2963
  "path": "docs/page-readings.json",
2964
2964
  "mode": "0000644",
2965
- "sha256": "b23bcbca4f4689129a3c589c867c7f9b6191ca855d9b458f34155f41531f47ce"
2965
+ "sha256": "c052d5258d274ab5a04793af96b52751f3233a7772b8406a2242a365ecce88d6"
2966
2966
  },
2967
2967
  {
2968
2968
  "path": "docs/project-context.template.md",
@@ -4432,7 +4432,7 @@
4432
4432
  {
4433
4433
  "path": "modules/copy-desk/skills/tweak/SKILL.md",
4434
4434
  "mode": "0000644",
4435
- "sha256": "21c1447d883837a53caf2b0cd34fda2f557422b97d91464832fa279b95ca8ed1"
4435
+ "sha256": "c5f631d9490fdb2a6bfa68a5e8a206aefd24c29a30d826c90344eb3f325a0e41"
4436
4436
  },
4437
4437
  {
4438
4438
  "path": "modules/copy-desk/tests/copy_docx.mjs",
@@ -5557,7 +5557,17 @@
5557
5557
  {
5558
5558
  "path": "modules/hall-ui/public/craft-mode.js",
5559
5559
  "mode": "0000644",
5560
- "sha256": "d0eb466ce91917bda3ecb01450feb53b2741bec8b581c8f8d5f4245006cf8bfc"
5560
+ "sha256": "ad340a50871425731439ca84abbbe28de067216e1d2e267559800d331560a023"
5561
+ },
5562
+ {
5563
+ "path": "modules/hall-ui/public/craft-review.css",
5564
+ "mode": "0000644",
5565
+ "sha256": "2b720902eb865e9abda43e26b523f81daf3413fb67d14c0fe1e74b48cbbbf1cf"
5566
+ },
5567
+ {
5568
+ "path": "modules/hall-ui/public/craft-review.js",
5569
+ "mode": "0000644",
5570
+ "sha256": "2da84dcf050187748e80a49636b4048e982a43b3b913e64f23f8d00d9500f92f"
5561
5571
  },
5562
5572
  {
5563
5573
  "path": "modules/hall-ui/public/criterion-uat-ui.js",
@@ -6352,7 +6362,7 @@
6352
6362
  {
6353
6363
  "path": "modules/hall-ui/public/style.css",
6354
6364
  "mode": "0000644",
6355
- "sha256": "ed3c2a242d279e61bfe11e8c4218f72fac2227ced9b5bdc1211b21e2720d860f"
6365
+ "sha256": "9626e3d3781ae6b0b137105d04628a599723b50808d35f9ceaf99221d40b113c"
6356
6366
  },
6357
6367
  {
6358
6368
  "path": "modules/hall-ui/public/task-detail.js",
@@ -6512,7 +6522,7 @@
6512
6522
  {
6513
6523
  "path": "modules/hall-ui/records/craft-mode.md",
6514
6524
  "mode": "0000644",
6515
- "sha256": "1d4499e1dde2b7f4d88e621a47b164e913ab99878ccf73c7d3398f231cf70bfe"
6525
+ "sha256": "3978525f0e27fced2e88642d285f389427bee552aa61740ecdb57cc0fdafe9e4"
6516
6526
  },
6517
6527
  {
6518
6528
  "path": "modules/hall-ui/records/filter-views.md",
@@ -6829,6 +6839,11 @@
6829
6839
  "mode": "0000644",
6830
6840
  "sha256": "e7c7db8a6faf50f3b75cb26ac33caa8357c462293e64318212ace69b0b654507"
6831
6841
  },
6842
+ {
6843
+ "path": "modules/lifecycle/autopickup-files.js",
6844
+ "mode": "0000644",
6845
+ "sha256": "a6caa4c76fbaeab89e861019609274b79062dac6b7d07bb0d0202cddedc6147f"
6846
+ },
6832
6847
  {
6833
6848
  "path": "modules/lifecycle/autopickup.js",
6834
6849
  "mode": "0000644",
@@ -6952,7 +6967,7 @@
6952
6967
  {
6953
6968
  "path": "modules/lifecycle/db-ship.js",
6954
6969
  "mode": "0000644",
6955
- "sha256": "982d65a4e74063ba914a48ace9e95b595bd1540ea27b1c9f47a842c82f8c9ff6"
6970
+ "sha256": "831ad96d2bd970d3b0828ba39339c596149a90be4aeef25e261ac328f0c9043e"
6956
6971
  },
6957
6972
  {
6958
6973
  "path": "modules/lifecycle/db-tasks.js",
@@ -7417,7 +7432,7 @@
7417
7432
  {
7418
7433
  "path": "modules/lifecycle/routes/tasks.js",
7419
7434
  "mode": "0000644",
7420
- "sha256": "1ced2b26ca9ce2e755e7ac1ce5b56130785041119a9373e3290250ee4b790ff4"
7435
+ "sha256": "d6ee7c06be0c26423a88dd7e3e92537563cd4a3a110728ea7607f594bd8fe151"
7421
7436
  },
7422
7437
  {
7423
7438
  "path": "modules/lifecycle/routes/version-route-authz.js",
@@ -10157,12 +10172,12 @@
10157
10172
  {
10158
10173
  "path": "package-lock.json",
10159
10174
  "mode": "0000644",
10160
- "sha256": "6a7262e960db14a5a541c0735d0f41d9e5f436e0c434a6fd77dd01e177e6fb34"
10175
+ "sha256": "e8c0e689fad7269139da1c9dd103cd1ea1c3058cffeda9799a45dcb9a79851e0"
10161
10176
  },
10162
10177
  {
10163
10178
  "path": "package.json",
10164
10179
  "mode": "0000644",
10165
- "sha256": "bd46dfa1e2c3169155d64d561b31e229137c85c66271ac2f0003ab47bedffdcd"
10180
+ "sha256": "e7ea8bae12ce6058d01dfc32e6c52c39b69d4ca1285f1246bec58b862fe190cf"
10166
10181
  },
10167
10182
  {
10168
10183
  "path": "public-docs/index.html",
@@ -10182,7 +10197,7 @@
10182
10197
  {
10183
10198
  "path": "release-notes.json",
10184
10199
  "mode": "0000644",
10185
- "sha256": "71cdec4456ab1476dce44818b9d3f10cee7c0a8a8d67ad70c1adfc96debcf47b"
10200
+ "sha256": "c78d78610bcdd0f13313e14da1dfabfb88480bc4edd1c501b6dd4d778a79766b"
10186
10201
  },
10187
10202
  {
10188
10203
  "path": "scripts/cron/style_guide_audit.sh",
@@ -10537,7 +10552,7 @@
10537
10552
  {
10538
10553
  "path": "scripts/gds/copy-apply.js",
10539
10554
  "mode": "0000644",
10540
- "sha256": "8c51a0f5e714202a26bbb23b717e9ae77ecc3708376c9319b76bb3372f280800"
10555
+ "sha256": "02486308ff472de00169f256816edd98e40441dcab41a72ab36409a2c9da0a6f"
10541
10556
  },
10542
10557
  {
10543
10558
  "path": "scripts/gds/copy-inventory.js",
@@ -11864,6 +11879,11 @@
11864
11879
  "mode": "0000644",
11865
11880
  "sha256": "cc6e8640376ada7ceff6a896007b3257c8ea4d943a900eae28433cd41bdd139d"
11866
11881
  },
11882
+ {
11883
+ "path": "scripts/gds/tweak-halt.js",
11884
+ "mode": "0000644",
11885
+ "sha256": "df5fa45f622f59d7867295afc559d334807a31e732b16a1c869305d3033fb9a3"
11886
+ },
11867
11887
  {
11868
11888
  "path": "scripts/gds/tweak-renders.js",
11869
11889
  "mode": "0000644",
@@ -11982,7 +12002,7 @@
11982
12002
  {
11983
12003
  "path": "scripts/hall-preview/server.js",
11984
12004
  "mode": "0000644",
11985
- "sha256": "73f90a45a8dbe04de03bdca1ad42f61c6dfe6e75982c3df8f311c8f1fa9eeed9"
12005
+ "sha256": "5819bcbb67a9940a05ee7d874d29edbad366d2bdae64f40d0f9d5a4ea8e32376"
11986
12006
  },
11987
12007
  {
11988
12008
  "path": "scripts/hall-preview/task-visual.js",
@@ -12457,7 +12477,7 @@
12457
12477
  {
12458
12478
  "path": "src/module-api.js",
12459
12479
  "mode": "0000644",
12460
- "sha256": "f208a278069baf39f28e39ddc85193af5cda7d17095dfe1edbbb89f2e7568350"
12480
+ "sha256": "a6eddfed735bb10f8d6e43b148e56c100c177cc6f98313f142401d7649ff18f1"
12461
12481
  },
12462
12482
  {
12463
12483
  "path": "src/module-loader/catalog.js",
@@ -13534,6 +13554,11 @@
13534
13554
  "mode": "0000644",
13535
13555
  "sha256": "4c7c2de3e7e6e5157b2e16da06ef8fbb4e7e1360d34c3649007fb3a9debe8e9c"
13536
13556
  },
13557
+ {
13558
+ "path": "tests/craft_review_mode.mjs",
13559
+ "mode": "0000644",
13560
+ "sha256": "0e350eb3d5c1edd79bb854880dc326cc4fb47e59512e5c6f16e99d9e3623db6c"
13561
+ },
13537
13562
  {
13538
13563
  "path": "tests/credential_presence.mjs",
13539
13564
  "mode": "0000644",
@@ -14894,6 +14919,11 @@
14894
14919
  "mode": "0000644",
14895
14920
  "sha256": "14e0bfda70dac75dc29bd784739ade11fe2cb986214bd0a1e8859f398b52dafb"
14896
14921
  },
14922
+ {
14923
+ "path": "tests/hall_preview_encoded_paths.mjs",
14924
+ "mode": "0000644",
14925
+ "sha256": "a4a0141c0743557d2344e2fbb0c573112b6c787e41332fdd04d5b656b17b65ba"
14926
+ },
14897
14927
  {
14898
14928
  "path": "tests/hall_preview_governor_fixtures.mjs",
14899
14929
  "mode": "0000644",
@@ -16162,7 +16192,7 @@
16162
16192
  {
16163
16193
  "path": "tests/page_notes_panel.mjs",
16164
16194
  "mode": "0000644",
16165
- "sha256": "0be8365d3f45e42d98817aef289ab95880fc4c0ff0101ed98ea4a0722d432426"
16195
+ "sha256": "56b4940c7b0757a0f7601b511eabbc98b81b9691e1b78ab5319a2243b399f01d"
16166
16196
  },
16167
16197
  {
16168
16198
  "path": "tests/page_reader.mjs",
@@ -16252,7 +16282,7 @@
16252
16282
  {
16253
16283
  "path": "tests/planning_session_skill.mjs",
16254
16284
  "mode": "0000644",
16255
- "sha256": "05bf5a11c0cb334d5da1b14f976f9e8ed8459ffec609f418c752ad72d87b7345"
16285
+ "sha256": "5fa3820f0c2a9b718cc3bcb513264ffae24c25c91d1a7039f0459a2befb36a6b"
16256
16286
  },
16257
16287
  {
16258
16288
  "path": "tests/platform_boot.mjs",
@@ -17952,13 +17982,18 @@
17952
17982
  {
17953
17983
  "path": "tests/tweak_batch_apply.mjs",
17954
17984
  "mode": "0000644",
17955
- "sha256": "c9ee80f594f60ca39c8c706490dc69c3acc8ad053e2084feb1d2415caf6b0288"
17985
+ "sha256": "db9ec48449abd88929a0b40df203e63b510318b4db0ddfaab6fce547f23dce0a"
17956
17986
  },
17957
17987
  {
17958
17988
  "path": "tests/tweak_replaces_artist_review.mjs",
17959
17989
  "mode": "0000644",
17960
17990
  "sha256": "16e4eb3977e7b5c2f09a402740b92ebb376a91199766034fa93f6ef34833b8a2"
17961
17991
  },
17992
+ {
17993
+ "path": "tests/tweak_unattended.mjs",
17994
+ "mode": "0000644",
17995
+ "sha256": "004e0fff732ebda78788ad64405b8f69afb64bdd5fb03263510ceb50a1efe10b"
17996
+ },
17962
17997
  {
17963
17998
  "path": "tests/ui_design_kit.mjs",
17964
17999
  "mode": "0000644",
@@ -12,7 +12,7 @@ cost: >-
12
12
 
13
13
  You are running the **goal-create** session for this Cloud Bongos instance. You produce **one goal**: a title, a scope wall, two to four done-when criteria, and a handful of seed tasks — written to Bongos in one sitting.
14
14
 
15
- > **Not `/planning-session`, not `/goal-review`.** `/planning-session` scopes a whole **version**: 5–9 criteria, a written spec under `docs/specs/`, a multi-round interview, a seed script, a migration. This skill produces **one goal**, with no spec file and no migration. `/goal-review` is the other end of the same lifecycle — it *confirms* criteria and auto-achieves goals. If the ask is "plan the next version", stop and run `/planning-session` instead.
15
+ > **Not `/planning-session`, not `/goal-review`.** `/planning-session` scopes a whole **version**: 5–9 criteria, a written spec under `docs/specs/`, a multi-round interview, a seed script, a migration. This skill produces **one goal**, with no spec file and no migration. `/goal-review` is the other end of the same lifecycle — it *confirms* criteria and auto-achieves goals. If the ask is "plan the next version", stop and run `/planning-session` instead. **The same goes for a big design-driven ask** — the owner has a design in mind (a mockup, a named model, "it should feel like…") and it would take several tasks to build: route it to `/planning-session` before seeding anything, because only there is each criterion tied to the agreed design and each task told where that design lives (task 1004675). Seeding it here skips that binding, and the grader — which never reads the design — cannot notice the build drifting from it.
16
16
 
17
17
  ## Rank gate — Metic+ only
18
18
 
@@ -21,6 +21,7 @@ The first planning session — V3 Planning Session #1, 2026-05-12 — is the tem
21
21
  - The user says "let's plan V4" / "plan the next version" / "open a planning session"
22
22
  - A version is in `status='planning'` and needs scope locked before tasks start landing in earnest
23
23
  - A previous planning session left proposals in `idea_inbox` tagged `kind='criterion-proposal'` that need ratification
24
+ - **A big design-driven ask arrives — route it here BEFORE any task is seeded (task 1004675).** The tell: the owner has a design in mind (a mockup, a named model, "it should feel like…"), and the work would span several tasks. Seeding those tasks straight from chat — through `/goal-create`, `/idea-triage`, or a hand-written `POST /tasks` — skips the spec, the interview and the design binding in Phase 2, which is exactly how a build drifts from what was agreed. A single small task, or a goal whose shape is already settled and has no design to honour, does not need this.
24
25
 
25
26
  **Run an ideation pass first when the goal's SHAPE is not yet settled.** An ideator session (the [Ideator pack](../../../docs/packs/ideator.md)) inverts this skill's stance: there the human drives and you are the sounding board, so *their* framing sets the shape of the thing. Carry its output into Phase 1 and the Phase-4 interview is left with genuine residue instead of first-pass design.
26
27
 
@@ -106,12 +107,14 @@ This is where the user sees what they're shaping. Do not skip this — criteria
106
107
 
107
108
  **A row WITHOUT the pointer still needs its description read**, because the marker only exists from the day someone used merge instead of abandon-with-a-note, and the older rows are exactly the ones a rescope trips over. **Verify against the repo, not the row.** On 2026-08-16 a session read task 1003005 ("Rename modules/governance to modules/government") as `abandoned` and nearly put a false edge in a new goal's graph — the folder move had shipped under task 1003004, and only the prose said so. One `git log` over the paths the task named would have settled it.
108
109
 
109
- ### Phase 1.5 — Map the mechanism (process-change sessions only) — task 1003075
110
+ ### Phase 1.5 — Map the mechanism (the default whenever an existing surface is touched) — task 1003075, task 1004675
110
111
 
111
- **Run this phase when the session is scoped to CHANGING how an existing mechanism already works** (a redesign, not a net-new feature with nothing live to replace) — skip it for a purely additive version with no prior mechanism in play. The precedent is the 2026-08-17 idea-routing session (goal 1000071): a subagent mapping the LIVE capture→triage→promote path before Phase 2 turned "route bugs to goals" into the capture-time-promotion design and resolved the bugs-vs-features question almost by itself — the session's own retro named it the highest-value step, and until now the skill only implied it.
112
+ **Run this phase by default for any session that touches an existing surface** — a process-change redesign, an extension of a live feature, a new view over data that already exists. **Skipping it is the thing that needs a stated reason**, written into the spec's *Design decisions*: e.g. "purely additive, no live mechanism in play — nothing to map". Do not skip it because the owner arrived with a confident model; that is exactly the case where an unmapped assumption costs the most.
113
+
114
+ The precedent is the 2026-08-17 idea-routing session (goal 1000071): a subagent mapping the LIVE capture→triage→promote path before Phase 2 turned "route bugs to goals" into the capture-time-promotion design and resolved the bugs-vs-features question almost by itself — the session's own retro named it the highest-value step. The 2026-09-19 ideator-surface session (meta task 1004076) was the second in a row: mapping moved the scope three times before any criterion was written — the owner's "size = karma" was not computable (karma rows carry no task or idea key), task parentage could not carry a descent (one level, no cross-version parents), and nothing recorded that shipped work was later removed, so half the design rested on a signal that did not exist.
112
115
 
113
116
  1. **Input.** Name the subsystem(s) the version is about to change, and the entry points you already know (a route file, a CLI script, a module's public function) as the subagent's starting point.
114
- 2. **Spawn a read-only mapping subagent** (`Explore` or `general-purpose`, `model: sonnet` or higher per CLAUDE.md's subagent routing — this feeds a design decision, not plumbing) with a prompt asking it to trace the CURRENT live mechanism end-to-end: every entry point that touches it, the chokepoint(s) data already funnels through, and any function/route already doing part of what the new design needs. Ask for file:line references, not prose summaries — the output has to be citable in the spec.
117
+ 2. **Spawn a read-only mapping subagent** (`Explore` or `general-purpose`, `model: sonnet` or higher per CLAUDE.md's subagent routing — this feeds a design decision, not plumbing) with a prompt asking it to trace the CURRENT live mechanism end-to-end: every entry point that touches it, the chokepoint(s) data already funnels through, and any function/route already doing part of what the new design needs. Ask for file:line references, not prose summaries — the output has to be citable in the spec. **Always ask it one standard question as well: "Name any quantity this design assumes is computable, and say whether it actually is — which table or column carries it, or why nothing does."**
115
118
  3. **Output artifact — the mechanics map.** A short structured list: each chokepoint or reusable function/route, with a file:line and a one-line note on what it does today. Write it down (in the session, or straight into the spec draft) rather than letting it live only in the subagent's reply.
116
119
  4. **Consumed by:**
117
120
  - **Phase 2 (Criteria)** — a chokepoint the map surfaces (e.g. "every capture vector funnels through one function") often turns directly into a criterion, or reframes one that would otherwise be written as a task list.
@@ -129,6 +132,12 @@ For each criterion:
129
132
 
130
133
  **Apply the strength test BEFORE presenting each criterion.** A criterion passes the test if it plausibly anchors at least 5 tasks across multiple `kind` values (feature + bug + infra, not just feature). If it only anchors 1-3 specific tasks, or reads like an implementation step, rewrite it as the resulting outcome before showing it to the user.
131
134
 
135
+ **Tie every criterion to the agreed design — outcomes alone let the build stray (task 1004675).** An outcome criterion is right, but it is only half the job. The grader reads the **task description and the diff**; it does **not** read `docs/specs/`. So an outcome criterion ("a thought is never lost") plus a vague task ("make the outcome persist") can be satisfied by a build that has nothing to do with the design the owner agreed, and nothing in the pipeline objects — the spec is the design of record and sits outside the loop that judges the work. The owner caught this in the 2026-09-19 ideator-surface session: "none of this criteria is easily indicative of the initial scope and designs we made". Close the gap three ways:
136
+
137
+ 1. **Split the settled design into MODEL and RENDERING.** The model is the durable decision — the named states, the independent channels, the rules (that session: five named states, two independent channels, a decay rule). It goes **into the criterion text**. The rendering — how it is drawn (that session: as a sky) — stays in the spec, free to change. A criterion that names the rendering breaks the day the look changes; a criterion that omits the model lets any build pass.
138
+ 2. **Give each criterion a proof whose scenario a wrong build fails.** Not "the page renders" but "a thought that caused 180 credits of work, since removed, displays at full size and zero brightness". Write that scenario into the proof task's **description** (Phase 3), because the description is where the grader actually looks.
139
+ 3. **Cite the design of record in every task description, and make sure the builder can open it.** Name the spec path (`docs/specs/<ver>-<goal-slug>.md`, committed in Phase 5) and the section the task implements. A private artifact link or a chat-only mockup as the design of record is decorative — whoever builds cannot open it.
140
+
132
141
  **Number every criterion** (`1.`, `2.`, …) in the presented list. The user will reference them by number when editing — e.g. "edit 4, remove 5, add a new one about X" — so they don't have to copy/paste the criterion titles.
133
142
 
134
143
  **Ask "what's missing?" before finalizing.** Once you've presented N criteria and worked through edits, explicitly prompt: "What concerns you that I haven't named? What's missing from this list?"
@@ -179,9 +188,9 @@ Don't tunnel-vision. Surface lateral options the user might not have thought of:
179
188
 
180
189
  **Proactively propose needs-exploration tasks** for any criterion where the implementation path isn't clear. Don't wait for the user to flag it. Frame them as "this one needs an architecture pass first — output an ADR + sub-task list before we build."
181
190
 
182
- **For each criterion, explicitly propose a proof-task** — the single live demonstration that proves the criterion is met. Examples: "Builder #2 onboards in ≤2h" for an onboarding criterion, "five concurrent builders shipping without collisions on staging" for a parallel-safety criterion. Without a proof-task, the criterion may technically ship without anyone knowing it works.
191
+ **For each criterion, explicitly propose a proof-task** — the single live demonstration that proves the criterion is met. Examples: "Builder #2 onboards in ≤2h" for an onboarding criterion, "five concurrent builders shipping without collisions on staging" for a parallel-safety criterion. Without a proof-task, the criterion may technically ship without anyone knowing it works. **The proof's scenario must be one a wrong build fails** — state the concrete input and the exact observable result the agreed MODEL implies (Phase 2), so a build that ignored the design cannot pass it.
183
192
 
184
- **Encourage short task descriptions with cross-refs.** Each task's description should focus on done-when + touches; reference dependency tasks by their R## rather than restating context. Long standalone descriptions are content-debt at scale (80 tasks × 200 words = a lot of redundant context).
193
+ **Encourage short task descriptions with cross-refs.** Each task's description should focus on done-when + touches; reference dependency tasks by their R## rather than restating context. **But every description cites the design of record** — the spec path and section it implements (Phase 2, "Tie every criterion to the agreed design") — because the grader never opens the spec on its own. Long standalone descriptions are content-debt at scale (80 tasks × 200 words = a lot of redundant context).
185
194
 
186
195
  > **`touches[]` is an advisory hint, not a hard fence ([ADR 0049](../../../docs/adr/0049-split-parallel-safety-contract.md)).** Parallel-safety is a *split contract*: for interactive single-human work, `git merge` is the authoritative collision detector and the claim-time overlap signal only warns; only the autonomous `--parallel` runner treats footprint overlap as a hard gate. So don't agonize over predicting every file at planning time — a rough blast-radius is enough, and a wrong prediction is no longer ship-blocking. (Step 7/8 — task [#882](https://example.com/builders#/task/882) — makes the per-task `touches` field optional and backfills it from the committed diff at ship.)
187
196
 
@@ -213,6 +222,8 @@ Tell the user the spec is written and where, then move straight to the interview
213
222
 
214
223
  **Ask only NON-OBVIOUS questions.** A question earns its place only if: the spec is genuinely underspecified on it, reasonable experts would disagree, AND the answer changes what gets built or how it's broken into tasks. Span dimensions across rounds — **data model & schema, API surface & contracts, UI/UX & information architecture, permissions/authz, privacy/consent, performance & scale, failure modes & edge cases, migration/rollout/backfill, naming the user will see, and scope boundaries.**
215
224
 
225
+ **Naming questions: show the options side by side before recommending one (task 1004675).** A name the user will see — a page, a state, a role, a button — is a question where a lone recommendation anchors the owner before they have compared anything. Lay out three or four candidates together, each with a one-line note on how it reads to the person who will see it, and only then say which you would pick and why. In an AskUserQuestion round, that means each candidate is its own option (use the option `preview` for the side-by-side), with your pick listed first and marked recommended — never one name with "or something else?".
226
+
216
227
  **Do NOT ask** anything answerable by reading the codebase, anything the criteria already settle, yes/no rubber-stamps, or "do you want it to be good?" filler. If you catch yourself about to ask something with one obvious answer, decide it yourself and record it in *Design decisions* instead.
217
228
 
218
229
  > **This interview is the deliberate exception to the usual "decide implementation details yourself" default (see Tone, and CLAUDE.md §2).** The owner has explicitly asked to be consulted in depth here — so probe technical implementation, UX, tradeoffs, and concerns, not just outcomes.
@@ -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
- **2633 strings** across 3 surfaces · 2236 distinct pieces of copy · 2633 certain, 0 heuristic · 235 shown in more than one place.
7
+ **2637 strings** across 3 surfaces · 2240 distinct pieces of copy · 2637 certain, 0 heuristic · 235 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` | 134 | 1860 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 135 | 1864 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 8 | 673 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `f6f68ba322be` | 3x | Open {…} | modules/hall-ui/public/goal-inbox.js:53, modules/hall-ui/public/goal-inbox.js:69, modules/hall-ui/public/goals.js:67 |
79
79
  | … | | _195 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1860 strings
81
+ ## `builders-hall` — 1864 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -187,12 +187,12 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
187
187
  | `d9dd46194f35` | certain | Argue from mechanism, not vibes. Always name the assumption a number rests on. | `modules/hall-ui/public/settings.html:270` |
188
188
  | `4d3b1bcae3eb` | certain | Artist Review Status | `modules/hall-ui/public/studio.html:131` |
189
189
  | `c05047322118` | certain | Artist review | `modules/hall-ui/public/paintbrush.js:148` |
190
- | `4a9385eeab33` | certain | Artists start on Artistry. | `modules/hall-ui/public/craft-mode.js:487` |
190
+ | `4a9385eeab33` | certain | Artists start on Artistry. | `modules/hall-ui/public/craft-mode.js:736` |
191
191
  | `5fcfdf8975cf` | certain | As configuration: | `modules/hall-ui/public/government.js:998` |
192
192
  | `01a0f29ff406` | certain | As first filed | `modules/hall-ui/public/idea.js:467` |
193
193
  | `1ac8ed08e067` | certain | Ask for this upgrade | `modules/hall-ui/public/settings-software-update.js:102` |
194
194
  | `1ac8ed08e067` | certain | Ask for this upgrade | `modules/hall-ui/public/settings-software-update.js:236` |
195
- | `fa86bf403775` | certain | Ask me again next session | `modules/hall-ui/public/craft-mode.js:486` |
195
+ | `fa86bf403775` | certain | Ask me again next session | `modules/hall-ui/public/craft-mode.js:735` |
196
196
  | `9b02ba5e6d23` | certain | Asked of others | `modules/hall-ui/public/collab.html:131` |
197
197
  | `688cc6dd38ee` | certain | Asked of you | `modules/hall-ui/public/collab.html:48` |
198
198
  | `688cc6dd38ee` | certain | Asked of you | `modules/hall-ui/public/collab.html:122` |
@@ -231,7 +231,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
231
231
  | `da910fee01d7` | certain | Browse goals → | `modules/hall-ui/public/goals.js:83` |
232
232
  | `25b4ab94728a` | certain | Build from your own machine — get a copy of the project, sign in once, then work in Claude. | `modules/hall-ui/public/hall-render.js:810` |
233
233
  | `08bfcc9198ba` | certain | Builder id | `modules/hall-ui/public/government.html:109` |
234
- | `fd1903586e8e` | certain | Builders hall · this session | `modules/hall-ui/public/craft-mode.js:481` |
234
+ | `fd1903586e8e` | certain | Builders hall · this session | `modules/hall-ui/public/craft-mode.js:730` |
235
235
  | `306bc316184d` | certain | Builders you may know | `modules/hall-ui/public/profile-connections.js:158` |
236
236
  | `60b248791dc3` | certain | Builders — {{worldName}} | `modules/hall-ui/public/roster.html:6` |
237
237
  | `60b248791dc3` | certain | Builders — {{worldName}} | `modules/hall-ui/public/roster.html:6` |
@@ -277,7 +277,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
277
277
  | `6bf684ebc1c3` | certain | Choose the skills for {…} | `modules/hall-ui/public/settings-specialities.js:180` |
278
278
  | `2b504633779f` | certain | Choose which goals your own runner works while you are away. You can only choose from the goals the project al | `modules/hall-ui/public/settings.html:182` |
279
279
  | `6c88cdf417f1` | certain | Choose which sound plays for each build event — one when Claude waits for your input, another when a task ship | `modules/hall-ui/public/settings.html:403` |
280
- | `f7d8c25af75d` | certain | Choose your mode | `modules/hall-ui/public/craft-mode.js:400` |
280
+ | `f7d8c25af75d` | certain | Choose your mode | `modules/hall-ui/public/craft-mode.js:649` |
281
281
  | `b7d5648b66db` | certain | Claim it | `modules/hall-ui/public/task.js:714` |
282
282
  | `b7d5648b66db` | certain | Claim it | `modules/hall-ui/public/task.js:843` |
283
283
  | `c10806b50c61` | certain | Claim task {…} | `modules/hall-ui/public/builders.js:973` |
@@ -295,7 +295,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
295
295
  | `d12a2fb5730d` | certain | Close this flag | `modules/hall-ui/public/copy-desk.html:116` |
296
296
  | `9b9c2abeae90` | certain | Close this stage | `modules/hall-ui/public/genesis-home.js:220` |
297
297
  | `e6f1842afde1` | certain | Close transcript | `modules/hall-ui/public/sessions.html:99` |
298
- | `29e8c5e30095` | certain | Close without choosing | `modules/hall-ui/public/craft-mode.js:479` |
298
+ | `29e8c5e30095` | certain | Close without choosing | `modules/hall-ui/public/craft-mode.js:728` |
299
299
  | `3d148e19e03a` | certain | Closed. | `modules/hall-ui/public/copy-desk.js:510` |
300
300
  | `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` |
301
301
  | `e5548861ad79` | certain | Coach the grader | `modules/hall-ui/public/studio.js:211` |
@@ -920,7 +920,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
920
920
  | `3ce534eb733f` | certain | Pick Auto or Manual. | `modules/hall-ui/public/project-settings.js:198` |
921
921
  | `6bc03d97457b` | certain | Pick a priority first. | `modules/hall-ui/public/task.js:900` |
922
922
  | `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` |
923
- | `4f87d5b17b54` | certain | Pick one. You can switch any time from the top bar. | `modules/hall-ui/public/craft-mode.js:483` |
923
+ | `4f87d5b17b54` | certain | Pick one. You can switch any time from the top bar. | `modules/hall-ui/public/craft-mode.js:732` |
924
924
  | `45378ea261f6` | certain | Pick one… | `modules/hall-ui/public/settings.html:257` |
925
925
  | `25815a34d246` | certain | Plain speech | `modules/hall-ui/public/sessions.html:78` |
926
926
  | `727ef20b71df` | certain | Plan with Claude | `modules/hall-ui/public/goals-render.js:965` |
@@ -1036,6 +1036,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1036
1036
  | `deafad2284f4` | certain | Retire this task… | `modules/hall-ui/public/task.js:799` |
1037
1037
  | `908a0d5d0685` | certain | Review how it judged this work, and teach it what good looked like. | `modules/hall-ui/public/studio.js:211` |
1038
1038
  | `f9e58942b121` | certain | Review how this page looks too? | `modules/hall-ui/public/paintbrush.js:180` |
1039
+ | `3a3cce04a536` | certain | Review mode | `modules/hall-ui/public/craft-mode.js:418` |
1040
+ | `82f542b587f2` | certain | Review mode: see the hall as another mode | `modules/hall-ui/public/craft-mode.js:511` |
1039
1041
  | `f1b2b158c3b1` | certain | Review quality | `modules/hall-ui/public/watch.html:85` |
1040
1042
  | `4e062d4f8d69` | certain | Reviews by builder | `modules/hall-ui/public/watch.html:78` |
1041
1043
  | `5c233879ce4e` | certain | Reviews from before Tweak Mode | `modules/hall-ui/public/studio.html:165` |
@@ -1165,6 +1167,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1165
1167
  | `92f87ca38190` | certain | Still splitting. It will appear in this page's docs when it is done. | `modules/hall-ui/public/page-notes.js:255` |
1166
1168
  | `490a3cbb8c1c` | certain | Still working on core {…}. It keeps going without this page — reload to see where it got to. | `modules/hall-ui/public/deploy.js:764` |
1167
1169
  | `752ee4373182` | certain | Stop editing | `modules/hall-ui/public/paintbrush.js:147` |
1170
+ | `c358b0abfdfb` | certain | Stop reviewing | `modules/hall-ui/public/craft-mode.js:428` |
1168
1171
  | `9a4ced1afb6c` | certain | Stop waiting on task {…} | `modules/hall-ui/public/task.js:250` |
1169
1172
  | `b0861c874a2f` | certain | Stopped using it. | `modules/hall-ui/public/settings-specialities.js:457` |
1170
1173
  | `6c6544f5c011` | certain | Stored encrypted; never shown again after saving — only its last four digits. | `modules/hall-ui/public/settings.html:207` |
@@ -1419,7 +1422,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1419
1422
  | `c1fcfa9b48c2` | certain | Watch — {{worldName}} | `modules/hall-ui/public/watch.html:6` |
1420
1423
  | `0658f0358ffd` | certain | Welcome back, {…}. | `modules/hall-ui/public/hall-render.js:600` |
1421
1424
  | `04ef2f1bc4c4` | certain | Welcome, {…}. Claim and release tasks and follow work in progress — no terminal needed. | `modules/hall-ui/public/work.js:941` |
1422
- | `60853319f290` | certain | What are you doing now? | `modules/hall-ui/public/craft-mode.js:482` |
1425
+ | `60853319f290` | certain | What are you doing now? | `modules/hall-ui/public/craft-mode.js:731` |
1423
1426
  | `d6bae87dc29b` | certain | What builders will see | `modules/hall-ui/public/government.html:86` |
1424
1427
  | `c077272746d4` | certain | What could this page become? | `modules/hall-ui/public/lightbulb.js:74` |
1425
1428
  | `f3d93a872a38` | certain | What counts | `modules/hall-ui/public/drachmae.js:107` |
@@ -1484,6 +1487,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1484
1487
  | `52e5fe3c6075` | certain | Write a Full Idea | `modules/hall-ui/public/ideas.html:145` |
1485
1488
  | `ad1e1ab1ecac` | certain | Write a reply… | `modules/hall-ui/public/collab.js:175` |
1486
1489
  | `a79ca1e2463b` | certain | Write another | `modules/hall-ui/public/page-notes.js:166` |
1490
+ | `22893267beca` | certain | Write feedback on this page | `modules/hall-ui/public/craft-mode.js:417` |
1487
1491
  | `08f28ecf123f` | certain | Write more | `modules/hall-ui/public/lightbulb.js:108` |
1488
1492
  | `47f61e576454` | certain | Write the wording you want instead. | `modules/hall-ui/public/copy-desk.js:436` |
1489
1493
  | `da6de9f79bcc` | certain | Write what this page made you think of. Each separate point becomes its own idea. | `modules/hall-ui/public/lightbulb.js:83` |
@@ -3,17 +3,17 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 2633,
7
- "unique_ids": 2236,
8
- "certain": 2633,
6
+ "strings": 2637,
7
+ "unique_ids": 2240,
8
+ "certain": 2637,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 235
11
11
  },
12
12
  "surfaces": {
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
- "files": 134,
16
- "strings": 1860
15
+ "files": 135,
16
+ "strings": 1864
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -3502,7 +3502,7 @@
3502
3502
  "surface": "builders-hall",
3503
3503
  "text": "Artists start on Artistry.",
3504
3504
  "file": "modules/hall-ui/public/craft-mode.js",
3505
- "line": 487,
3505
+ "line": 736,
3506
3506
  "origin": "js-markup",
3507
3507
  "confidence": "certain"
3508
3508
  },
@@ -3547,7 +3547,7 @@
3547
3547
  "surface": "builders-hall",
3548
3548
  "text": "Ask me again next session",
3549
3549
  "file": "modules/hall-ui/public/craft-mode.js",
3550
- "line": 486,
3550
+ "line": 735,
3551
3551
  "origin": "js-markup",
3552
3552
  "confidence": "certain"
3553
3553
  },
@@ -3898,7 +3898,7 @@
3898
3898
  "surface": "builders-hall",
3899
3899
  "text": "Builders hall · this session",
3900
3900
  "file": "modules/hall-ui/public/craft-mode.js",
3901
- "line": 481,
3901
+ "line": 730,
3902
3902
  "origin": "js-markup",
3903
3903
  "confidence": "certain"
3904
3904
  },
@@ -4312,7 +4312,7 @@
4312
4312
  "surface": "builders-hall",
4313
4313
  "text": "Choose your mode",
4314
4314
  "file": "modules/hall-ui/public/craft-mode.js",
4315
- "line": 400,
4315
+ "line": 649,
4316
4316
  "origin": "js-markup",
4317
4317
  "confidence": "certain"
4318
4318
  },
@@ -4474,7 +4474,7 @@
4474
4474
  "surface": "builders-hall",
4475
4475
  "text": "Close without choosing",
4476
4476
  "file": "modules/hall-ui/public/craft-mode.js",
4477
- "line": 479,
4477
+ "line": 728,
4478
4478
  "origin": "js-markup",
4479
4479
  "confidence": "certain"
4480
4480
  },
@@ -10099,7 +10099,7 @@
10099
10099
  "surface": "builders-hall",
10100
10100
  "text": "Pick one. You can switch any time from the top bar.",
10101
10101
  "file": "modules/hall-ui/public/craft-mode.js",
10102
- "line": 483,
10102
+ "line": 732,
10103
10103
  "origin": "js-markup",
10104
10104
  "confidence": "certain"
10105
10105
  },
@@ -11138,6 +11138,24 @@
11138
11138
  "origin": "js-markup",
11139
11139
  "confidence": "certain"
11140
11140
  },
11141
+ {
11142
+ "id": "3a3cce04a536",
11143
+ "surface": "builders-hall",
11144
+ "text": "Review mode",
11145
+ "file": "modules/hall-ui/public/craft-mode.js",
11146
+ "line": 418,
11147
+ "origin": "js-markup",
11148
+ "confidence": "certain"
11149
+ },
11150
+ {
11151
+ "id": "82f542b587f2",
11152
+ "surface": "builders-hall",
11153
+ "text": "Review mode: see the hall as another mode",
11154
+ "file": "modules/hall-ui/public/craft-mode.js",
11155
+ "line": 511,
11156
+ "origin": "js-text-assign",
11157
+ "confidence": "certain"
11158
+ },
11141
11159
  {
11142
11160
  "id": "f1b2b158c3b1",
11143
11161
  "surface": "builders-hall",
@@ -12299,6 +12317,15 @@
12299
12317
  "origin": "js-markup",
12300
12318
  "confidence": "certain"
12301
12319
  },
12320
+ {
12321
+ "id": "c358b0abfdfb",
12322
+ "surface": "builders-hall",
12323
+ "text": "Stop reviewing",
12324
+ "file": "modules/hall-ui/public/craft-mode.js",
12325
+ "line": 428,
12326
+ "origin": "js-markup",
12327
+ "confidence": "certain"
12328
+ },
12302
12329
  {
12303
12330
  "id": "9a4ced1afb6c",
12304
12331
  "surface": "builders-hall",
@@ -14590,7 +14617,7 @@
14590
14617
  "surface": "builders-hall",
14591
14618
  "text": "What are you doing now?",
14592
14619
  "file": "modules/hall-ui/public/craft-mode.js",
14593
- "line": 482,
14620
+ "line": 731,
14594
14621
  "origin": "js-markup",
14595
14622
  "confidence": "certain"
14596
14623
  },
@@ -15170,6 +15197,15 @@
15170
15197
  "origin": "js-markup",
15171
15198
  "confidence": "certain"
15172
15199
  },
15200
+ {
15201
+ "id": "22893267beca",
15202
+ "surface": "builders-hall",
15203
+ "text": "Write feedback on this page",
15204
+ "file": "modules/hall-ui/public/craft-mode.js",
15205
+ "line": 417,
15206
+ "origin": "js-markup",
15207
+ "confidence": "certain"
15208
+ },
15173
15209
  {
15174
15210
  "id": "08f28ecf123f",
15175
15211
  "surface": "builders-hall",
@@ -3053,5 +3053,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
3053
3053
  landed since 1.21.106 with no explicit bump. run 37957919746. (task 1002620)
3054
3054
  1.21.108 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3055
3055
  landed since 1.21.107 with no explicit bump. run 37960186494. (task 1002620)
3056
+ 1.21.109 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3057
+ landed since 1.21.108 with no explicit bump. run 37962089344. (task 1002620)
3058
+ 1.21.110 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
3059
+ landed since 1.21.109 with no explicit bump. run 37963285770. (task 1002620)
3056
3060
  ---------------------------------------------------------------------------
3057
3061
  ```