@bongos/core 1.21.173 → 1.21.175

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 (38) hide show
  1. package/.bongos-core.json +65 -40
  2. package/docs/copy-inventory.md +56 -62
  3. package/docs/copy-registry.json +91 -156
  4. package/docs/module-api-changelog.md +4 -0
  5. package/docs/page-inventory.json +5 -0
  6. package/docs/page-readings.json +64 -61
  7. package/modules/copy-desk/routes/copy-desk.js +4 -4
  8. package/modules/hall-ui/public/blockers.html +2 -0
  9. package/modules/hall-ui/public/blockers.js +13 -0
  10. package/modules/hall-ui/public/board-room.css +5 -0
  11. package/modules/hall-ui/public/board-room.html +1 -0
  12. package/modules/hall-ui/public/board-room.js +2 -2
  13. package/modules/hall-ui/public/city-decide.js +36 -2
  14. package/modules/hall-ui/public/city.css +8 -2
  15. package/modules/hall-ui/public/city.html +5 -5
  16. package/modules/hall-ui/public/goal-inbox.js +69 -86
  17. package/modules/hall-ui/public/hall-ask.css +57 -0
  18. package/modules/hall-ui/public/hall-ask.js +50 -0
  19. package/modules/hall-ui/public/index.html +3 -0
  20. package/modules/hall-ui/records/hall-ask-card.md +24 -0
  21. package/modules/lifecycle/artist-review-goal.js +103 -0
  22. package/modules/lifecycle/db-tasks.js +17 -1
  23. package/modules/lifecycle/db-versions.js +5 -1
  24. package/modules/lifecycle/page-tweak-claim.js +3 -3
  25. package/modules/lifecycle/page-tweak-write.js +12 -4
  26. package/package-lock.json +2 -2
  27. package/package.json +1 -1
  28. package/release-notes.json +16 -0
  29. package/src/module-api.js +1 -1
  30. package/tests/artist_review_goal.mjs +119 -0
  31. package/tests/blockers_hall.mjs +3 -1
  32. package/tests/copy_desk_page_claim.mjs +6 -1
  33. package/tests/copy_desk_page_submit.mjs +1 -1
  34. package/tests/fixtures/page-ledger.mjs +13 -0
  35. package/tests/hall_city_rewording.mjs +11 -0
  36. package/tests/home_attention_cards.mjs +2 -0
  37. package/tests/rot_inbox.mjs +10 -7
  38. package/tests/task_goal_required.mjs +12 -2
@@ -87,6 +87,7 @@
87
87
  "files": [
88
88
  "modules/hall-ui/public/blockers.html",
89
89
  "modules/hall-ui/public/style.css",
90
+ "modules/hall-ui/public/hall-ask.css",
90
91
  "modules/hall-ui/public/oversight.css",
91
92
  "modules/hall-ui/public/shell-trail.js",
92
93
  "modules/hall-ui/public/craft-mode.js",
@@ -97,6 +98,7 @@
97
98
  "modules/hall-ui/public/hall-kit.js",
98
99
  "modules/hall-ui/public/task-detail.js",
99
100
  "modules/hall-ui/public/blockers-lib.js",
101
+ "modules/hall-ui/public/hall-ask.js",
100
102
  "modules/hall-ui/public/blockers.js"
101
103
  ],
102
104
  "states_files": [],
@@ -115,6 +117,7 @@
115
117
  "files": [
116
118
  "modules/hall-ui/public/board-room.html",
117
119
  "modules/hall-ui/public/style.css",
120
+ "modules/hall-ui/public/hall-ask.css",
118
121
  "modules/hall-ui/public/oversight.css",
119
122
  "modules/hall-ui/public/board-room.css",
120
123
  "modules/hall-ui/public/shell-trail.js",
@@ -578,6 +581,7 @@
578
581
  "files": [
579
582
  "modules/hall-ui/public/index.html",
580
583
  "modules/hall-ui/public/style.css",
584
+ "modules/hall-ui/public/hall-ask.css",
581
585
  "modules/hall-ui/public/dom-utils.js",
582
586
  "modules/hall-ui/public/task-detail.js",
583
587
  "modules/hall-ui/public/brand-apply.js",
@@ -591,6 +595,7 @@
591
595
  "modules/hall-ui/public/hall-widgets.js",
592
596
  "modules/hall-ui/public/genesis-home.js",
593
597
  "modules/hall-ui/public/goals.js",
598
+ "modules/hall-ui/public/hall-ask.js",
594
599
  "modules/hall-ui/public/blockers-lib.js",
595
600
  "modules/hall-ui/public/goal-inbox.js",
596
601
  "modules/hall-ui/public/hall-render.js",
@@ -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":46,"lines":5404,"placed":1697,"shared":399,"unplaced":3308,"omitted_data":3498},
8
+ "counts": {"pages":46,"lines":5407,"placed":1698,"shared":399,"unplaced":3310,"omitted_data":3498},
9
9
  "pages": [
10
10
  {
11
11
  "id": "builders:atlas",
@@ -50,9 +50,9 @@
50
50
  "surface": "builders",
51
51
  "title": "Blockers",
52
52
  "states_read": ["default"],
53
- "files_hash": "f5bf3c2244e3fbdd",
54
- "reading_hash": "2b3fd98b7ba1bff6",
55
- "counts": {"lines":28,"placed":12,"shared":8,"unplaced":8},
53
+ "files_hash": "6bbb72d61775d17b",
54
+ "reading_hash": "4fcc4d52c13cf804",
55
+ "counts": {"lines":30,"placed":12,"shared":8,"unplaced":10},
56
56
  "omitted": {"data":9},
57
57
  "notes": [],
58
58
  "lines": [
@@ -64,26 +64,28 @@
64
64
  {"key":"L0006","section":"top bar","text":"Artistry","placement":"shared"},
65
65
  {"key":"L0007","section":"top bar","text":"Ideating","placement":"shared"},
66
66
  {"key":"L0008","section":"Blockers","text":"Blockers","placement":"unplaced"},
67
- {"key":"L0009","section":"Blockers","text":"A credential, a purchase, a product call, etc. gated at the owner level. Any tasks awaiting the same block will unblock automatically on resolution.","placement":"placed","file":"modules/hall-ui/public/blockers.html","line":26,"string_id":"715edae2bf8d"},
68
- {"key":"L0010","section":"Open {…}","text":"Open blockers","placement":"placed","file":"modules/hall-ui/public/blockers.html","line":36,"string_id":"ade0e39c65e9"},
69
- {"key":"L0011","section":"Open {…}","text":"+ File blocker","placement":"placed","file":"modules/hall-ui/public/blockers.js","line":303,"string_id":"32e5b4833f55"},
70
- {"key":"L0012","section":"Open {…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9"},
71
- {"key":"L0013","section":"Open {…}","text":"Filed {…} · Blocking nothing yet","placement":"unplaced","occurrences":3},
72
- {"key":"L0014","section":"Open {…}","text":"Resolve","placement":"unplaced","occurrences":9},
73
- {"key":"L0015","section":"Open {…}","text":"Link a task","placement":"placed","file":"modules/hall-ui/public/blockers.js","line":148,"string_id":"b8ba1fa4457c","occurrences":9},
74
- {"key":"L0016","section":"Open {…}","text":"Filed {…} · Blocking 1 {…}:","placement":"unplaced","occurrences":6},
75
- {"key":"L0017","section":"Open {…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232"},
76
- {"key":"L0018","section":"Open {…}","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5"},
77
- {"key":"L0019","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":520,"string_id":"1883ad7f07fc"},
78
- {"key":"L0020","section":"Open {…}","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":674,"string_id":"fd1903586e8e"},
79
- {"key":"L0021","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":675,"string_id":"60853319f290"},
80
- {"key":"L0022","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":676,"string_id":"4f87d5b17b54"},
81
- {"key":"L0023","section":"What are you doing now?","text":"Building","placement":"unplaced"},
82
- {"key":"L0024","section":"What are you doing now?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
83
- {"key":"L0025","section":"What are you doing now?","text":"Artistry","placement":"unplaced"},
84
- {"key":"L0026","section":"What are you doing now?","text":"Ideating","placement":"unplaced"},
85
- {"key":"L0027","section":"What are you doing now?","text":"Turn thoughts into ideas.","placement":"unplaced"},
86
- {"key":"L0028","section":"What are you doing now?","text":"Ask me again next session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":679,"string_id":"fa86bf403775"}
67
+ {"key":"L0009","section":"Blockers","text":"A credential, a purchase, a product call, etc. gated at the owner level. Any tasks awaiting the same block will unblock automatically on resolution.","placement":"placed","file":"modules/hall-ui/public/blockers.html","line":27,"string_id":"715edae2bf8d"},
68
+ {"key":"L0010","section":"Open {…}","text":"Open blockers","placement":"placed","file":"modules/hall-ui/public/blockers.html","line":37,"string_id":"ade0e39c65e9"},
69
+ {"key":"L0011","section":"Open {…}","text":"+ File blocker","placement":"placed","file":"modules/hall-ui/public/blockers.js","line":316,"string_id":"32e5b4833f55"},
70
+ {"key":"L0012","section":"Open {…}","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","occurrences":10},
71
+ {"key":"L0013","section":"Open {…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9"},
72
+ {"key":"L0014","section":"Open {…}","text":"Filed {…} · Blocking nothing yet","placement":"unplaced","occurrences":3},
73
+ {"key":"L0015","section":"Open {…}","text":"Resolve it","placement":"unplaced","occurrences":9},
74
+ {"key":"L0016","section":"Open {…}","text":"Say what settled it","placement":"unplaced","occurrences":9},
75
+ {"key":"L0017","section":"Open {…}","text":"Link a task","placement":"placed","file":"modules/hall-ui/public/blockers.js","line":161,"string_id":"b8ba1fa4457c","occurrences":9},
76
+ {"key":"L0018","section":"Open {…}","text":"Name the {…} it holds up","placement":"unplaced","occurrences":9},
77
+ {"key":"L0019","section":"Open {…}","text":"Filed {…} · Blocking 1 {…}:","placement":"unplaced","occurrences":6},
78
+ {"key":"L0020","section":"Open {…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232"},
79
+ {"key":"L0021","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":520,"string_id":"1883ad7f07fc"},
80
+ {"key":"L0022","section":"Open {…}","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":674,"string_id":"fd1903586e8e"},
81
+ {"key":"L0023","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":675,"string_id":"60853319f290"},
82
+ {"key":"L0024","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":676,"string_id":"4f87d5b17b54"},
83
+ {"key":"L0025","section":"What are you doing now?","text":"Building","placement":"unplaced"},
84
+ {"key":"L0026","section":"What are you doing now?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
85
+ {"key":"L0027","section":"What are you doing now?","text":"Artistry","placement":"unplaced"},
86
+ {"key":"L0028","section":"What are you doing now?","text":"Ideating","placement":"unplaced"},
87
+ {"key":"L0029","section":"What are you doing now?","text":"Turn thoughts into ideas.","placement":"unplaced"},
88
+ {"key":"L0030","section":"What are you doing now?","text":"Ask me again next session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":679,"string_id":"fa86bf403775"}
87
89
  ]
88
90
  },
89
91
  {
@@ -91,22 +93,22 @@
91
93
  "surface": "builders",
92
94
  "title": "Board Room",
93
95
  "states_read": ["room","out","sitting-meta","objection-form"],
94
- "files_hash": "33d6388010313047",
96
+ "files_hash": "8c30d46056493f66",
95
97
  "reading_hash": "bb827082275d1b73",
96
98
  "counts": {"lines":41,"placed":19,"shared":8,"unplaced":14},
97
99
  "omitted": {"data":11},
98
100
  "notes": ["sitting-meta: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood","objection-form: an action failed (page.click: Timeout 6000ms exceeded.); read as it stood"],
99
101
  "lines": [
100
102
  {"key":"L0001","section":"skip link","text":"Skip to content","placement":"shared","file":"modules/hall-ui/public/shell.js","line":872,"string_id":"87cee78ca134"},
101
- {"key":"L0002","section":"top bar","text":"Board Room","placement":"shared","file":"modules/hall-ui/public/board-room.html","line":19,"string_id":"118026595c16"},
103
+ {"key":"L0002","section":"top bar","text":"Board Room","placement":"shared","file":"modules/hall-ui/public/board-room.html","line":20,"string_id":"118026595c16"},
102
104
  {"key":"L0003","section":"top bar","text":"Jump to…","placement":"shared","file":"modules/hall-ui/public/shell.js","line":544,"string_id":"eba610d25523"},
103
105
  {"key":"L0004","section":"top bar","text":"Ctrl K","placement":"shared"},
104
106
  {"key":"L0005","section":"top bar","text":"Building","placement":"shared"},
105
107
  {"key":"L0006","section":"top bar","text":"Artistry","placement":"shared"},
106
108
  {"key":"L0007","section":"top bar","text":"Ideating","placement":"shared"},
107
- {"key":"L0008","section":"Board Room","text":"Board Room","placement":"placed","file":"modules/hall-ui/public/board-room.html","line":19,"string_id":"118026595c16"},
109
+ {"key":"L0008","section":"Board Room","text":"Board Room","placement":"placed","file":"modules/hall-ui/public/board-room.html","line":20,"string_id":"118026595c16"},
108
110
  {"key":"L0009","section":"Board Room","text":"Nothing is before the {…}.","placement":"unplaced"},
109
- {"key":"L0010","section":"Board Room","text":"Read an idea, then decide. An objection needs a reason and the section it faults.","placement":"placed","file":"modules/hall-ui/public/board-room.html","line":51,"string_id":"fae2f90927bd"},
111
+ {"key":"L0010","section":"Board Room","text":"Read an idea, then decide. An objection needs a reason and the section it faults.","placement":"placed","file":"modules/hall-ui/public/board-room.html","line":52,"string_id":"fae2f90927bd"},
110
112
  {"key":"L0011","section":"Board Room","text":"Nothing is before the {…}. When a Full Idea clears the completeness grade, its window opens here.","placement":"unplaced"},
111
113
  {"key":"L0012","section":"Board Room","text":"Closed sittings","placement":"unplaced"},
112
114
  {"key":"L0013","section":"{…} project{…}","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5","occurrences":2},
@@ -145,9 +147,9 @@
145
147
  "surface": "builders",
146
148
  "title": "The city",
147
149
  "states_read": ["city","fullscreen","switched","focus","pins","living","card","card-ask"],
148
- "files_hash": "793c4d2505f9afb1",
149
- "reading_hash": "e6b8d4e8f991a975",
150
- "counts": {"lines":42,"placed":9,"shared":8,"unplaced":25},
150
+ "files_hash": "1e4c5ab40907996d",
151
+ "reading_hash": "77470c4eb3047a05",
152
+ "counts": {"lines":43,"placed":10,"shared":8,"unplaced":25},
151
153
  "omitted": {"data":17},
152
154
  "notes": [],
153
155
  "lines": [
@@ -165,34 +167,35 @@
165
167
  {"key":"L0012","section":"page top","text":"Total 1 /","placement":"unplaced","state":"card-ask"},
166
168
  {"key":"L0013","section":"page top","text":"Yours 1","placement":"unplaced","state":"card-ask"},
167
169
  {"key":"L0014","section":"{…}","text":"I'd {…} $2350. {…}","placement":"unplaced","state":"card-ask"},
168
- {"key":"L0015","section":"{…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"card-ask","occurrences":2},
169
- {"key":"L0016","section":"{…}","text":"my pick","placement":"unplaced","state":"card-ask"},
170
- {"key":"L0017","section":"{…}","text":"{…} it","placement":"unplaced","state":"card-ask"},
171
- {"key":"L0018","section":"{…}","text":"esc","placement":"unplaced","state":"card-ask"},
172
- {"key":"L0019","section":"{…}","text":"{…} 37 in a row","placement":"unplaced","state":"card-ask"},
173
- {"key":"L0020","section":"page top","text":"Total 9 /","placement":"unplaced","state":"card"},
174
- {"key":"L0021","section":"page top","text":"Yours 9","placement":"unplaced","state":"card"},
175
- {"key":"L0022","section":"{…} of {…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"card","occurrences":2},
176
- {"key":"L0023","section":"{…} of {…}","text":"It holds work until someone decides.","placement":"unplaced","state":"card"},
177
- {"key":"L0024","section":"{…} of {…}","text":"Tab · ↑ ↓ items ← → buildings","placement":"unplaced","state":"card"},
178
- {"key":"L0025","section":"{…} of {…}","text":"{…} all 9","placement":"unplaced","state":"card"},
179
- {"key":"L0026","section":"{…} of {…}","text":"esc","placement":"unplaced","state":"card"},
180
- {"key":"L0027","section":"{…} of {…}","text":"{…} 37 in a row","placement":"unplaced","state":"card"},
181
- {"key":"L0028","section":"page top","text":"{…} 37 in a row","placement":"unplaced"},
182
- {"key":"L0029","section":"37 to do · 5 {…} working","text":"37 to do · 5 {…} working","placement":"unplaced"},
183
- {"key":"L0030","section":"37 to do · 5 {…} working","text":"Archived:","placement":"unplaced"},
184
- {"key":"L0031","section":"37 to do · 5 {…} working","text":"Street","placement":"unplaced"},
185
- {"key":"L0032","section":"37 to do · 5 {…} working","text":"Building Level Views","placement":"placed","file":"modules/hall-ui/public/city.html","line":103,"string_id":"5df2aa54f042"},
186
- {"key":"L0033","section":"37 to do · 5 {…} working","text":"Full screen — press Esc, or the button in the corner, to bring the bars back.","placement":"placed","file":"modules/hall-ui/public/shell.js","line":595,"string_id":"11fc0483c149","state":"fullscreen"},
187
- {"key":"L0034","section":"37 to do · 5 {…} working","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":674,"string_id":"fd1903586e8e"},
188
- {"key":"L0035","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":675,"string_id":"60853319f290"},
189
- {"key":"L0036","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":676,"string_id":"4f87d5b17b54"},
190
- {"key":"L0037","section":"What are you doing now?","text":"Building","placement":"unplaced"},
191
- {"key":"L0038","section":"What are you doing now?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
192
- {"key":"L0039","section":"What are you doing now?","text":"Artistry","placement":"unplaced"},
193
- {"key":"L0040","section":"What are you doing now?","text":"Ideating","placement":"unplaced"},
194
- {"key":"L0041","section":"What are you doing now?","text":"Turn thoughts into {…}.","placement":"unplaced"},
195
- {"key":"L0042","section":"What are you doing now?","text":"Ask me again next session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":679,"string_id":"fa86bf403775"}
170
+ {"key":"L0015","section":"{…}","text":"Full text","placement":"placed","file":"modules/hall-ui/public/city-decide.js","line":253,"string_id":"7537fe1f3792","state":"card-ask"},
171
+ {"key":"L0016","section":"{…}","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","state":"card-ask","occurrences":2},
172
+ {"key":"L0017","section":"{…}","text":"my pick","placement":"unplaced","state":"card-ask"},
173
+ {"key":"L0018","section":"{…}","text":"{…} it","placement":"unplaced","state":"card-ask"},
174
+ {"key":"L0019","section":"{…}","text":"esc","placement":"unplaced","state":"card-ask"},
175
+ {"key":"L0020","section":"{…}","text":"{…} 37 in a row","placement":"unplaced","state":"card-ask"},
176
+ {"key":"L0021","section":"page top","text":"Total 9 /","placement":"unplaced","state":"card"},
177
+ {"key":"L0022","section":"page top","text":"Yours 9","placement":"unplaced","state":"card"},
178
+ {"key":"L0023","section":"{…} of {…}","text":"{…} of {…}","placement":"placed","file":"modules/hall-ui/public/sky-panel.js","line":120,"string_id":"73c1372b43d9","state":"card","occurrences":2},
179
+ {"key":"L0024","section":"{…} of {…}","text":"It holds work until someone decides.","placement":"unplaced","state":"card"},
180
+ {"key":"L0025","section":"{…} of {…}","text":"Tab · ↑ ↓ items ← → buildings","placement":"unplaced","state":"card"},
181
+ {"key":"L0026","section":"{…} of {…}","text":"{…} all 9","placement":"unplaced","state":"card"},
182
+ {"key":"L0027","section":"{…} of {…}","text":"esc","placement":"unplaced","state":"card"},
183
+ {"key":"L0028","section":"{…} of {…}","text":"{…} 37 in a row","placement":"unplaced","state":"card"},
184
+ {"key":"L0029","section":"page top","text":"{…} 37 in a row","placement":"unplaced"},
185
+ {"key":"L0030","section":"37 to do · 5 {…} working","text":"37 to do · 5 {…} working","placement":"unplaced"},
186
+ {"key":"L0031","section":"37 to do · 5 {…} working","text":"Archived:","placement":"unplaced"},
187
+ {"key":"L0032","section":"37 to do · 5 {…} working","text":"Street","placement":"unplaced"},
188
+ {"key":"L0033","section":"37 to do · 5 {…} working","text":"Building Level Views","placement":"placed","file":"modules/hall-ui/public/city.html","line":103,"string_id":"5df2aa54f042"},
189
+ {"key":"L0034","section":"37 to do · 5 {…} working","text":"Full screen — press Esc, or the button in the corner, to bring the bars back.","placement":"placed","file":"modules/hall-ui/public/shell.js","line":595,"string_id":"11fc0483c149","state":"fullscreen"},
190
+ {"key":"L0035","section":"37 to do · 5 {…} working","text":"Builders hall · this session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":674,"string_id":"fd1903586e8e"},
191
+ {"key":"L0036","section":"What are you doing now?","text":"What are you doing now?","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":675,"string_id":"60853319f290"},
192
+ {"key":"L0037","section":"What are you doing now?","text":"Pick one. You can switch any time from the top bar.","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":676,"string_id":"4f87d5b17b54"},
193
+ {"key":"L0038","section":"What are you doing now?","text":"Building","placement":"unplaced"},
194
+ {"key":"L0039","section":"What are you doing now?","text":"{…} and {…}","placement":"placed","file":"modules/hall-ui/public/profile-nudge.js","line":77,"string_id":"56b00d773232","occurrences":3},
195
+ {"key":"L0040","section":"What are you doing now?","text":"Artistry","placement":"unplaced"},
196
+ {"key":"L0041","section":"What are you doing now?","text":"Ideating","placement":"unplaced"},
197
+ {"key":"L0042","section":"What are you doing now?","text":"Turn thoughts into {…}.","placement":"unplaced"},
198
+ {"key":"L0043","section":"What are you doing now?","text":"Ask me again next session","placement":"placed","file":"modules/hall-ui/public/craft-mode.js","line":679,"string_id":"fa86bf403775"}
196
199
  ]
197
200
  },
198
201
  {
@@ -1439,7 +1442,7 @@
1439
1442
  "surface": "builders",
1440
1443
  "title": "Builders' Hall",
1441
1444
  "states_read": ["home","standing","standing-karma","out","founding","genesis","decide","demo"],
1442
- "files_hash": "e32eb071e46bec38",
1445
+ "files_hash": "59b17bf6a34ffe16",
1443
1446
  "reading_hash": "42dbab4f3948fe66",
1444
1447
  "counts": {"lines":117,"placed":63,"shared":10,"unplaced":44},
1445
1448
  "omitted": {"data":101},
@@ -1474,7 +1477,7 @@
1474
1477
  {"key":"L0027","section":"Goals","text":"Goals","placement":"unplaced"},
1475
1478
  {"key":"L0028","section":"Goals","text":"You haven’t joined any open goals.","placement":"placed","file":"modules/hall-ui/public/goals.js","line":100,"string_id":"044387a6f90c"},
1476
1479
  {"key":"L0029","section":"Goals","text":"Browse goals →","placement":"placed","file":"modules/hall-ui/public/goals.js","line":100,"string_id":"da910fee01d7"},
1477
- {"key":"L0030","section":"Needs your attention13","text":"Needs your attention","placement":"placed","file":"modules/hall-ui/public/goal-inbox.js","line":597,"string_id":"7def635421ea"},
1480
+ {"key":"L0030","section":"Needs your attention13","text":"Needs your attention","placement":"placed","file":"modules/hall-ui/public/goal-inbox.js","line":580,"string_id":"7def635421ea"},
1478
1481
  {"key":"L0031","section":"Needs your attention13","text":"From the system","placement":"placed","file":"modules/hall-ui/public/hall-render.js","line":721,"string_id":"d32c5e058d1e"},
1479
1482
  {"key":"L0032","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":895,"string_id":"e181637c5a5e"},
1480
1483
  {"key":"L0033","section":"Needs your attention13","text":"{…} project{…}","placement":"placed","file":"modules/hall-ui/public/fleet.js","line":39,"string_id":"771bef3d31b5"},
@@ -690,10 +690,10 @@ module.exports = function buildCopyDeskRouter() {
690
690
  const body = proposals.proposalTaskBody(patch);
691
691
  const task = await lifecycle.createTask({
692
692
  versionId: building.id,
693
- // BV1.R11 (task 1003598): no goal to name until the per-version maintenance
694
- // goal exists (task 1003605, R18). Declared out loud rather than relying on
695
- // a silent default — see createTask.
696
- allowCatchAll: true,
693
+ // task 1004819: a copy proposal is studio work, so it lands in the version's
694
+ // artist review goal (created on first use; the catch-all only when the
695
+ // version cannot take one) — see createTask.
696
+ artistReview: true,
697
697
  title: proposals.proposalTaskTitle(patch),
698
698
  description: flagRef
699
699
  ? `${body}\n\nRaised from copy-desk flag ${flagRef}.`
@@ -9,6 +9,7 @@
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
12
+ <link rel="stylesheet" href="/builders/hall-ask.css">
12
13
  <!-- task 1003455: the row shape (title + facts) is the oversight family's,
13
14
  the same archetype collab/copy-desk/watch/gate already ride. -->
14
15
  <link rel="stylesheet" href="/builders/oversight.css">
@@ -65,6 +66,7 @@
65
66
  for the "blocking N tasks" facts line, but not the overlay's own render. -->
66
67
  <script src="/builders/task-detail.js?v=2026-07-03-taskdetail"></script>
67
68
  <script src="/builders/blockers-lib.js"></script>
69
+ <script src="/builders/hall-ask.js"></script>
68
70
  <script src="/builders/blockers.js"></script>
69
71
  </body>
70
72
  </html>
@@ -142,6 +142,19 @@
142
142
  + '<button type="submit" class="td-btn td-btn--primary" data-submit>Link</button>'
143
143
  + '<button type="button" class="td-btn" data-row-cancel>Cancel</button>'
144
144
  + '</div><p class="td-action-note" data-err></p></form></div>';
145
+ } else if (window.OTBAsk) {
146
+ // task 1004820: a closed row a reviewer can act on is the city's ask card
147
+ return window.OTBAsk.html({
148
+ attrs: { 'data-id': id },
149
+ where: 'Waiting on the project owner',
150
+ q: b.title || ('Blocker ' + id), qHref: blockerHref(id),
151
+ saidHtml: facts.noteHtml + '<div class="ov-row__facts">' + facts.factsHtml + '</div>',
152
+ row: true,
153
+ opts: [
154
+ { label: 'Resolve it', result: 'Say what settled it', rec: true, attrs: { 'data-resolve-open': id } },
155
+ { label: 'Link a task', result: 'Name the task it holds up', attrs: { 'data-link-open': id } },
156
+ ],
157
+ });
145
158
  } else {
146
159
  right = '<div class="ov-row__right"><div class="ov-row__actions">'
147
160
  + '<button type="button" class="btn-ghost" data-resolve-open="' + kit.esc(id) + '">Resolve</button>'
@@ -76,3 +76,8 @@
76
76
  .gov-vote__sections { display: flex; flex-wrap: wrap; gap: 6px 16px; }
77
77
  .gov-vote__section { display: inline-flex; align-items: center; gap: 8px; min-height: 24px; font-size: 13px; color: var(--ink); cursor: pointer; }
78
78
  .gov-vote__section input { width: 16px; height: 16px; margin: 0; }
79
+ /* task 1004820: the vote's two answers are the city's ask-card chips */
80
+ .gov-vote > .hask__opt { flex: 1 1 220px; width: auto; }
81
+ .gov-vote__no { flex: 1 1 220px; }
82
+ .gov-vote__no > summary.hask__opt { list-style: none; }
83
+ .gov-vote__no > summary.hask__opt::-webkit-details-marker { display: none; }
@@ -9,6 +9,7 @@
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
12
+ <link rel="stylesheet" href="/builders/hall-ask.css">
12
13
  <link rel="stylesheet" href="/builders/oversight.css">
13
14
  <!-- The room's own sheet: the sitting card and the ballot controls moved here
14
15
  out of government.css with the room (ADR 0266), so neither page carries the
@@ -378,9 +378,9 @@
378
378
  : '';
379
379
  return `<div class="gov-vote" data-item="${escapeHtml(item.id)}">
380
380
  ${ownNote}
381
- <button type="button" class="btn-accent" data-vote="yes">Vote yes</button>
381
+ <button type="button" class="hask__opt hask__opt--rec" data-vote="yes"><span class="hask__label">Vote yes</span><span class="hask__result">It counts toward passing</span></button>
382
382
  <details class="gov-vote__no">
383
- <summary class="btn-ghost">Object…</summary>
383
+ <summary class="hask__opt"><span class="hask__label">Object</span><span class="hask__result">It goes back to its author with your reason</span></summary>
384
384
  <p class="gov-grid-note">This sends the idea back to its author. Say why, and which section.</p>
385
385
  <textarea data-vote-reason placeholder="Why — the reason the author will act on" maxlength="5000" rows="3"></textarea>
386
386
  <div class="gov-vote__sections">${sections}</div>
@@ -46,7 +46,7 @@
46
46
  if (choice && choice.options && choice.options.length) {
47
47
  var bare = a.key === 'decide' || a.key === 'answer';
48
48
  choice.options.forEach(function (o) {
49
- opts.push({ key: a.key + ':' + str(o.key), label: bare ? str(o.label) : str(a.label) + ': ' + str(o.label), result: '', act: a.key, rec: false, plan: plan(o.input), off: false, why: '' });
49
+ opts.push({ key: a.key + ':' + str(o.key), label: (function (w) { return bare ? w : str(a.label) + ': ' + w; }(str(o.input && o.input.label) || str(o.label))), result: '', act: a.key, rec: false, plan: plan(o.input), off: false, why: '' });
50
50
  });
51
51
  } else {
52
52
  opts.push({ key: a.key, label: str(a.label), result: '', act: a.key, rec: false, plan: plan({}), off: false, why: '' });
@@ -221,10 +221,44 @@
221
221
  return b;
222
222
  }
223
223
 
224
+ function matterOf(docket, id) {
225
+ var ms = docket && Array.isArray(docket.matters) ? docket.matters : [];
226
+ for (var i = 0; i < ms.length; i++) if (ms[i] && ms[i].id === id) return ms[i];
227
+ return null;
228
+ }
229
+ // The matter's whole text, when it says more than the card already shows.
230
+ function fullText(matter, shown) {
231
+ if (!matter) return '';
232
+ var parts = [];
233
+ var title = str(matter.title).trim();
234
+ if (title && title !== str(shown.question).trim()) parts.push(title);
235
+ var detail = str((matter.ask && matter.ask.detail) || matter.detail).trim();
236
+ if (detail && detail !== title) parts.push(detail);
237
+ return parts.join('\n\n');
238
+ }
239
+
224
240
  // The deck's card, answerable; a typed answer gets its own box and send.
225
241
  function drawCard(doc, K, cv, on, o) {
226
242
  var shown = answerable(cv);
243
+ var matter = matterOf(on.docket && on.docket(), cv.id);
244
+ // the question in full: a matter with no stored card is titled by its own words, cut to fit the deck
245
+ if (matter && /…$/.test(str(shown.question)) && matter.title) shown.question = str(matter.title).trim();
227
246
  var art = K.drawAsk(doc, shown, on, o);
247
+ // and everything else it says, one tap away rather than cut
248
+ var full = fullText(matter, shown);
249
+ if (full) {
250
+ var more = doc.createElement('details');
251
+ more.className = 'ask-full';
252
+ var sum = doc.createElement('summary');
253
+ sum.textContent = 'Full text';
254
+ more.appendChild(sum);
255
+ var body = doc.createElement('p');
256
+ body.className = 'ask-full__text';
257
+ body.textContent = full;
258
+ more.appendChild(body);
259
+ var opts = art.querySelector ? art.querySelector('.ask__opts') : null;
260
+ if (opts && typeof art.insertBefore === 'function') art.insertBefore(more, opts); else art.appendChild(more);
261
+ }
228
262
  // the crab: open this one in Claude to help decide it
229
263
  var q = art.querySelector ? art.querySelector('.ask__q') : null;
230
264
  if (q && q.parentNode && typeof q.parentNode.insertBefore === 'function') {
@@ -638,5 +672,5 @@
638
672
  return { open: open, close: close, render: render, isOpen: function () { return st.open; } };
639
673
  }
640
674
 
641
- window.GovCityDecide = { make: make, answerable: answerable, drawCard: drawCard, flash: flash, armKey: armKey, rewordingIds: rewordingIds, rewordingCount: rewordingCount, withoutReworded: withoutReworded, paintArmed: paintArmed, promptOf: promptOf, CLAUDE_URL: CLAUDE_URL };
675
+ window.GovCityDecide = { make: make, answerable: answerable, drawCard: drawCard, flash: flash, fullText: fullText, armKey: armKey, rewordingIds: rewordingIds, rewordingCount: rewordingCount, withoutReworded: withoutReworded, paintArmed: paintArmed, promptOf: promptOf, CLAUDE_URL: CLAUDE_URL };
642
676
  }());
@@ -394,8 +394,8 @@ html[data-fullscreen="on"] .city-top { right: 184px; }
394
394
  .swb__row { display: flex; align-items: center; gap: 10px; min-height: 40px; border-top: 1px solid var(--rule-soft); padding-top: 6px; }
395
395
  .swb__row:first-of-type { border-top: 0; padding-top: 0; }
396
396
  .swb__label { flex: 1; min-width: 0; display: flex; flex-direction: column; }
397
- .swb__name { font-size: 14px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
398
- .swb__fact { font-size: 12px; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
397
+ .swb__name { font-size: 14px; line-height: 1.35; color: var(--ink); overflow-wrap: anywhere; }
398
+ .swb__fact { font-size: 12px; color: var(--ink-soft); overflow-wrap: anywhere; }
399
399
  .swb__toggle { flex: none; position: relative; display: inline-flex; align-items: center; width: 64px; height: 30px; padding: 0 8px; box-sizing: border-box; border-radius: 999px; border: 1px solid var(--gov-chip-edge); background: var(--gov-chip-pick); color: var(--ink-soft); font-family: var(--font-body); font-size: 11.5px; cursor: pointer; transition: background 160ms ease; }
400
400
  .swb__knob { position: absolute; top: 3px; left: 3px; width: 22px; height: 22px; border-radius: 50%; background: var(--ink-soft); transition: left 160ms ease, background 160ms ease; }
401
401
  .swb__state { margin-left: auto; }
@@ -451,3 +451,9 @@ html[data-fullscreen="on"] .city-top { right: 184px; }
451
451
  .ask-reword__go:focus-visible, .ask-reword__no:focus-visible, .ask-reword__note:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
452
452
  /* only drawn when something is out for a rewrite; a quiet footnote to the counts */
453
453
  .city-card__rewording, .decide__rewording { display: block; margin-top: 1px; font-size: 10.5px; color: var(--ink-faint); text-align: right; }
454
+
455
+ /* a card's whole text, one tap away instead of cut (city-decide.js) */
456
+ .ask-full { font-size: 12.5px; color: var(--ink-soft); }
457
+ .ask-full summary { display: inline-flex; align-items: center; min-height: 24px; cursor: pointer; color: var(--ink); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--gov-chip-edge-pick); }
458
+ .ask-full__text { margin: 6px 0 0; max-height: 240px; overflow-y: auto; white-space: pre-wrap; line-height: 1.5; overflow-wrap: anywhere; }
459
+ .ask-full summary:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
@@ -12,7 +12,7 @@
12
12
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet).
13
13
  The prototype carried its own Google Fonts link for the same two faces. -->
14
14
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
15
- <link rel="stylesheet" href="/builders/city.css?v=2026-10-23-decide11">
15
+ <link rel="stylesheet" href="/builders/city.css?v=2026-10-23-decide12">
16
16
  <!-- the ask card in the glass language, shared with the street's deck (task 1004702) -->
17
17
  <link rel="stylesheet" href="/builders/street-deck.css?v=2026-10-17-tidy">
18
18
  </head>
@@ -115,14 +115,14 @@
115
115
  <!-- a building's card answers its first ask in place through the deck's own
116
116
  route (task 1004702): the desk rows (street-desk.js over the street's kit)
117
117
  and the deck's card and sender (street-deck.js) -->
118
- <script src="/builders/hall-kit.js?v=2026-10-23-decide11"></script>
118
+ <script src="/builders/hall-kit.js?v=2026-10-23-decide12"></script>
119
119
  <script src="/builders/street-draw.js?v=2026-10-09-living3"></script>
120
120
  <script src="/builders/street-card.js?v=2026-10-04-record1"></script>
121
121
  <script src="/builders/street-inside.js?v=2026-10-09-living3"></script>
122
122
  <script src="/builders/street-desk.js?v=2026-10-04-record1"></script>
123
123
  <script src="/builders/street-deck.js?v=2026-10-13-glass1"></script>
124
- <script src="/builders/city-decide.js?v=2026-10-23-decide11"></script>
125
- <script src="/builders/city-switchboard.js?v=2026-10-23-board4"></script>
126
- <script src="/builders/city.js?v=2026-10-23-decide11"></script>
124
+ <script src="/builders/city-decide.js?v=2026-10-23-decide12"></script>
125
+ <script src="/builders/city-switchboard.js?v=2026-10-23-board5"></script>
126
+ <script src="/builders/city.js?v=2026-10-23-decide12"></script>
127
127
  </body>
128
128
  </html>