@bongos/core 1.19.497 → 1.19.498

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.bongos-core.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.497",
6
- "core_contract": "1.19.497",
7
- "source_commit": "bf45af5a1f1eec74cd1874122859dc080089c05a",
5
+ "core_version": "1.19.498",
6
+ "core_contract": "1.19.498",
7
+ "source_commit": "20beae21ee5af0c6929954f91c2a8acaf23aaa67",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-03T14:32:26.849Z",
9
+ "built_at": "2026-09-03T14:46:19.020Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 425,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 2391,
20
- "tree_sha256": "67e051875f76680b3d27cda283e5e08a9c11db6376a802acacb54f7302f563de",
20
+ "tree_sha256": "a822992243dff9dbc60fd91bf31adbef6c64477f3a30367b06dfeb5aca77e74a",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -1717,12 +1717,12 @@
1717
1717
  {
1718
1718
  "path": "docs/copy-inventory.md",
1719
1719
  "mode": "0000644",
1720
- "sha256": "74ad09a790fbd48b9b00c58a0bf72e681d6ab6a91cb1fbba3ab6ed6317096103"
1720
+ "sha256": "3fba042999dcbdaa39e07ed2216b157ad6eddff21aed26532efdf64944f999ba"
1721
1721
  },
1722
1722
  {
1723
1723
  "path": "docs/copy-registry.json",
1724
1724
  "mode": "0000644",
1725
- "sha256": "1145ea8e9d7d2e75f4f8f705bbf0c430707323a1847beaf17dbeb2b40f8e5d08"
1725
+ "sha256": "32b64d401bebadcc935bf2e514660f954af1d1633eaa8bf046a40eab9924392e"
1726
1726
  },
1727
1727
  {
1728
1728
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2567,7 +2567,7 @@
2567
2567
  {
2568
2568
  "path": "docs/module-api-changelog.md",
2569
2569
  "mode": "0000644",
2570
- "sha256": "3cb8fa3073eb0267e89c03769b76768f987364ea39babf5c48e747fcbc451e20"
2570
+ "sha256": "8fdf08a8b150af9c3fe543fca4265a81b71fcf42d79baf733865432305204914"
2571
2571
  },
2572
2572
  {
2573
2573
  "path": "docs/modules-contract.md",
@@ -4742,17 +4742,17 @@
4742
4742
  {
4743
4743
  "path": "modules/hall-ui/public/ideas.css",
4744
4744
  "mode": "0000644",
4745
- "sha256": "3df460e0a852f5c7ea88c752995e38cebea32ad5b0c510a85b097c0046bcf952"
4745
+ "sha256": "4da2ff00354a825d32f2f55e3db5f1d18a112ddc9d1056220e73683766b952b3"
4746
4746
  },
4747
4747
  {
4748
4748
  "path": "modules/hall-ui/public/ideas.html",
4749
4749
  "mode": "0000644",
4750
- "sha256": "e6b3ad29a39d11fb2a44134a2091a21991cb06787d096b3602f701ab4c4ab138"
4750
+ "sha256": "78c92c2d5468cc2b88662a005af756148293817967f51b06c527fbaba8cb74fa"
4751
4751
  },
4752
4752
  {
4753
4753
  "path": "modules/hall-ui/public/ideas.js",
4754
4754
  "mode": "0000644",
4755
- "sha256": "96796c1d7192ed2f6c4ac2ef185ade5e6001ecb828feb1b99a123a457bfdc8bf"
4755
+ "sha256": "e7c788887e118e7a47b57001968a8247a170239a339a43ed7d643536c7d804d1"
4756
4756
  },
4757
4757
  {
4758
4758
  "path": "modules/hall-ui/public/ideas.states.json",
@@ -7212,12 +7212,12 @@
7212
7212
  {
7213
7213
  "path": "package-lock.json",
7214
7214
  "mode": "0000644",
7215
- "sha256": "a8be69cad17da8ff07ccbe4b355249b614906702a0b414694c290c0fb77e94c4"
7215
+ "sha256": "38c8a713cccd40594f0d5016517d008c3dd0970517a7b8da6545ac404d48ed79"
7216
7216
  },
7217
7217
  {
7218
7218
  "path": "package.json",
7219
7219
  "mode": "0000644",
7220
- "sha256": "8978a8297898e1684c36706d547067cac6b91cf3739fffeb107dd1944a68c01e"
7220
+ "sha256": "3438a4f78cb41fa0c933447857c76b4a125edf7398de92d3a466ffefc96adbd7"
7221
7221
  },
7222
7222
  {
7223
7223
  "path": "public-docs/index.html",
@@ -8887,7 +8887,7 @@
8887
8887
  {
8888
8888
  "path": "src/module-api.js",
8889
8889
  "mode": "0000644",
8890
- "sha256": "29f8180a3086a48ac95dd64384e33790cc6f034beff4c3e132f31df90fe5fc28"
8890
+ "sha256": "164ce624de92bffcb36ceb3f8fb75edfd2bce5fe981166ba653aafdcdf726e0b"
8891
8891
  },
8892
8892
  {
8893
8893
  "path": "src/module-loader/catalog.js",
@@ -10487,7 +10487,7 @@
10487
10487
  {
10488
10488
  "path": "tests/idea_spark_hall.mjs",
10489
10489
  "mode": "0000644",
10490
- "sha256": "eb7aa0e83ae2ff84686cce3400583049214d5d73bad1a8fc2240cddedf87c1b2"
10490
+ "sha256": "ce3e1272e2356707cda86a37010fa5902f132a0d8a7bab48bc00a4432af00933"
10491
10491
  },
10492
10492
  {
10493
10493
  "path": "tests/idea_spark_mark.mjs",
@@ -4,13 +4,13 @@
4
4
  > Deterministic on a given tree — regenerate and commit rather than hand-editing.
5
5
  > Machine-readable twin: [`copy-registry.json`](copy-registry.json).
6
6
 
7
- **1615 strings** across 3 surfaces · 1406 distinct pieces of copy · 1615 certain, 0 heuristic · 150 shown in more than one place.
7
+ **1626 strings** across 3 surfaces · 1416 distinct pieces of copy · 1626 certain, 0 heuristic · 150 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` | 73 | 1172 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 73 | 1183 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 98 |
15
15
  | `landing` | `modules/public-landing/public` | 5 | 345 |
16
16
 
@@ -41,6 +41,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
41
41
  | `afe83bbbd0d4` | 5x | A non-profit, capture-resistant commons. | modules/public-landing/public/contact.html:71, modules/public-landing/public/index.html:900, modules/public-landing/public/privacy.html:80 |
42
42
  | `cbfdd6ac4ec8` | 5x | Open source (AGPL-3.0) | modules/public-landing/public/contact.html:71, modules/public-landing/public/index.html:900, modules/public-landing/public/privacy.html:80 |
43
43
  | `0fbe47b01d2c` | 5x | Reading the project… | modules/public-landing/public/projects.html:672, modules/public-landing/public/projects.html:700, modules/public-landing/public/projects.html:765 |
44
+ | `4d8ee7d68974` | 5x | task {…} | modules/hall-ui/public/gate.js:142, modules/hall-ui/public/hall-render.js:599, modules/hall-ui/public/idea.js:207 |
44
45
  | `5df2baabf82e` | 5x | ← Back | modules/public-landing/public/projects.html:898, modules/public-landing/public/projects.html:929, modules/public-landing/public/projects.html:1001 |
45
46
  | `08afb1257b71` | 4x | Back to home | modules/hall-ui/public/drachmae.html:87, modules/hall-ui/public/not-ready.html:38, modules/hall-ui/public/primer.html:90 |
46
47
  | `90a128c97eae` | 4x | Builders' hall | modules/public-landing/public/index.html:906, modules/public-landing/public/projects.html:516, modules/public-landing/public/projects.html:516 |
@@ -54,7 +55,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
54
55
  | `eff70e59d12e` | 4x | Task {…} | modules/hall-ui/public/task.js:454, modules/hall-ui/public/task.js:463, modules/hall-ui/public/task.js:691 |
55
56
  | `9a685b01e2c6` | 4x | This page opens at a higher rank. | modules/hall-ui/public/gate.html:37, modules/hall-ui/public/government.html:37, modules/hall-ui/public/harbor.html:37 |
56
57
  | `b31fc908c962` | 4x | You claimed #{…}. Open a terminal to start work. | modules/hall-ui/public/goals-page.js:418, modules/hall-ui/public/goals-page.js:515, modules/hall-ui/public/work.js:853 |
57
- | `4d8ee7d68974` | 4x | task {…} | modules/hall-ui/public/gate.js:142, modules/hall-ui/public/hall-render.js:599, modules/hall-ui/public/idea.js:207 |
58
58
  | `1de02052abf2` | 3x | Available from the {…} rank up. | modules/hall-ui/public/gate.js:222, modules/hall-ui/public/government.js:1107, modules/hall-ui/public/harbor.js:340 |
59
59
  | `a78477a24a48` | 3x | Builders' Hall | modules/hall-ui/public/index.html:12, modules/hall-ui/public/index.html:12, modules/hall-ui/public/index.html:45 |
60
60
  | `12ee050d0180` | 3x | Copy desk | modules/hall-ui/public/copy-desk.html:15, modules/hall-ui/public/copy-desk.html:15, modules/hall-ui/public/copy-desk.html:27 |
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `563d29ed86d8` | 2x | Bulk actions | modules/hall-ui/public/goals.html:172, modules/hall-ui/public/work.html:129 |
79
79
  | … | | _110 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1172 strings
81
+ ## `builders-hall` — 1183 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -112,7 +112,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
112
112
  | `f1dec47e42d1` | certain | 4 · The complete architecture | `modules/hall-ui/public/diagrams.html:73` |
113
113
  | `477235450d2b` | certain | 5 · Versioning | `modules/hall-ui/public/diagrams.html:82` |
114
114
  | `353fff36068f` | certain | ; a later push must be re-approved. | `modules/hall-ui/public/gate.js:94` |
115
- | `8ffdf4995e81` | certain | A Full Idea answers five questions, so that someone else can deliver against it without having to interview yo | `modules/hall-ui/public/ideas.html:53` |
115
+ | `8ffdf4995e81` | certain | A Full Idea answers five questions, so that someone else can deliver against it without having to interview yo | `modules/hall-ui/public/ideas.html:107` |
116
116
  | `3e5a62bc4887` | certain | A GitHub username is needed. | `modules/hall-ui/public/hall-render.js:361` |
117
117
  | `3e5a62bc4887` | certain | A GitHub username is needed. | `modules/hall-ui/public/watch.js:279` |
118
118
  | `2c23271d5d71` | certain | A device is asking to act as you | `modules/hall-ui/public/pair.html:32` |
@@ -122,6 +122,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
122
122
  | `2e17d7e236d9` | certain | A module built here can be submitted upstream for review, so it can join the shared catalog with your name and | `modules/hall-ui/public/modules.html:71` |
123
123
  | `a07c7b335a66` | certain | A protected-scope goal requires a Metic+ member. | `modules/hall-ui/public/goals-render.js:999` |
124
124
  | `5723baf26b2d` | certain | A quick idea is a thought filed fast. It is not an unfinished Full Idea — only its author can offer it up for | `modules/hall-ui/public/idea.js:260` |
125
+ | `23dc5028183a` | certain | A quick report — title, what's going on, and where it belongs. Pick a goal and it lands there as a task the mo | `modules/hall-ui/public/ideas.html:60` |
125
126
  | `eff6b977b1d2` | certain | A self-drawing map of the codebase: what each module is, and what depends on it. Redrawn from the code on ever | `modules/hall-ui/public/atlas.html:31` |
126
127
  | `6359b5afbc6b` | certain | A short path to finding your feet. Tick the steps you’ve done; the rest are tracked for you. | `modules/hall-ui/public/hall-widgets.js:60` |
127
128
  | `58f7f6f0d8bd` | certain | A small app for your menu bar (Mac) or system tray (Windows): one switch to start and stop your dev box, with | `modules/hall-ui/public/settings.html:217` |
@@ -143,7 +144,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
143
144
  | `b38c01691857` | certain | All your work → | `modules/hall-ui/public/hall-widgets.js:110` |
144
145
  | `e99cc5d37404` | certain | Already a member? | `modules/hall-ui/public/hall-render.js:330` |
145
146
  | `69f0ca4a4d84` | certain | Analytics scope | `modules/hall-ui/public/hall-render.js:1130` |
146
- | `14bdceaac078` | certain | Answer the five questions and this spark becomes a Full Idea. | `modules/hall-ui/public/ideas.js:423` |
147
+ | `14bdceaac078` | certain | Answer the five questions and this spark becomes a Full Idea. | `modules/hall-ui/public/ideas.js:586` |
147
148
  | `52ed0e2e3470` | certain | Any rank | `modules/hall-ui/public/task-lib.js:62` |
148
149
  | `c89833aa985a` | certain | Approval failed — try again. | `modules/hall-ui/public/pair.js:92` |
149
150
  | `0832ba017c90` | certain | Approve & re-run | `modules/hall-ui/public/gate.js:107` |
@@ -174,6 +175,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
174
175
  | `f6bb75b08e98` | certain | Back to {…} | `modules/hall-ui/public/task.js:188` |
175
176
  | `f6bb75b08e98` | certain | Back to {…} | `modules/hall-ui/public/task.js:197` |
176
177
  | `e49da8610a21` | certain | Block lifted. | `modules/hall-ui/public/harbor.js:182` |
178
+ | `f0576990e9fc` | certain | Blocker resolution | `modules/hall-ui/public/ideas.html:81` |
177
179
  | `118026595c16` | certain | Board Room | `modules/hall-ui/public/government.html:65` |
178
180
  | `da910fee01d7` | certain | Browse goals → | `modules/hall-ui/public/goals.js:83` |
179
181
  | `1596210cea76` | certain | Build from your own machine — clone the repository, run the platform locally, and sign in from the terminal. | `modules/hall-ui/public/hall-render.js:785` |
@@ -279,15 +281,15 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
279
281
  | `01f0308c66e0` | certain | Could not invite that builder just now. | `modules/hall-ui/public/goals-render.js:1002` |
280
282
  | `71da00d47492` | certain | Could not invite: {…} | `modules/hall-ui/public/watch.js:289` |
281
283
  | `90691bceaf68` | certain | Could not load | `modules/hall-ui/public/task.js:710` |
282
- | `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:456` |
284
+ | `589a4cfc5442` | certain | Could not load idea {…}. | `modules/hall-ui/public/ideas.js:629` |
283
285
  | `192c893fc64e` | certain | Could not load modules. | `modules/hall-ui/public/modules.js:318` |
284
286
  | `8a4b590fa1a0` | certain | Could not load requests. | `modules/hall-ui/public/collab.js:173` |
285
287
  | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:187` |
286
288
  | `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:226` |
287
- | `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:438` |
289
+ | `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:611` |
288
290
  | `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:759` |
289
291
  | `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:244` |
290
- | `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:387` |
292
+ | `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:550` |
291
293
  | `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
292
294
  | `2878778cf9f3` | certain | Could not load this page. | `modules/hall-ui/public/watch.js:1011` |
293
295
  | `4b0c8d94541c` | certain | Could not load your account. Reload the page to try again. | `modules/hall-ui/public/settings.js:1376` |
@@ -332,7 +334,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
332
334
  | `278e8281c82f` | certain | Could not vote: {…} | `modules/hall-ui/public/government.js:990` |
333
335
  | `a48e9f098392` | certain | Could not {…} just now. | `modules/hall-ui/public/goals-render.js:1018` |
334
336
  | `cb09ee26014f` | certain | Could not {…}: {…} | `modules/hall-ui/public/government.js:321` |
335
- | `28ec06f6060a` | certain | Counted, not judged: each question is worth the same, and earns its share in proportion to how much real text | `modules/hall-ui/public/ideas.html:113` |
337
+ | `28ec06f6060a` | certain | Counted, not judged: each question is worth the same, and earns its share in proportion to how much real text | `modules/hall-ui/public/ideas.html:167` |
336
338
  | `38827a954f3b` | certain | Create a custom rank first. | `modules/hall-ui/public/government.js:466` |
337
339
  | `dd8ead7adc9a` | certain | Create rank | `modules/hall-ui/public/government.html:94` |
338
340
  | `d7beb841395e` | certain | Create task | `modules/hall-ui/public/task-detail.js:367` |
@@ -346,12 +348,12 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
346
348
  | `8cac6be8afdf` | certain | Dev box app | `modules/hall-ui/public/settings.html:216` |
347
349
  | `d784d7a258ec` | certain | Dev boxes | `modules/hall-ui/public/harbor.html:47` |
348
350
  | `9c37356c3a04` | certain | Dev-box costs | `modules/hall-ui/public/watch.html:94` |
349
- | `0a4fe7150971` | certain | Develop this idea | `modules/hall-ui/public/ideas.js:422` |
350
- | `11b8266d6aab` | certain | Developing a Big Idea Spark | `modules/hall-ui/public/ideas.html:65` |
351
+ | `0a4fe7150971` | certain | Develop this idea | `modules/hall-ui/public/ideas.js:585` |
352
+ | `11b8266d6aab` | certain | Developing a Big Idea Spark | `modules/hall-ui/public/ideas.html:119` |
351
353
  | `457f4967541b` | certain | Device pairing | `modules/hall-ui/public/pair.html:16` |
352
354
  | `457f4967541b` | certain | Device pairing | `modules/hall-ui/public/pair.html:16` |
353
355
  | `433beff4d202` | certain | Device · dev box · memory · server (authority + prod) · GitHub — and the full box→production ship flow. | `modules/hall-ui/public/diagrams.html:77` |
354
- | `65322ac89221` | certain | Discard draft | `modules/hall-ui/public/ideas.html:91` |
356
+ | `65322ac89221` | certain | Discard draft | `modules/hall-ui/public/ideas.html:145` |
355
357
  | `0f685daf1bd5` | certain | Discord connected ✓ | `modules/hall-ui/public/settings.js:920` |
356
358
  | `d8017b5ca98f` | certain | Discord unlinked. | `modules/hall-ui/public/settings.js:939` |
357
359
  | `f3e09453374f` | certain | Dismissed — looked at, leaving it as it is | `modules/hall-ui/public/copy-desk.html:123` |
@@ -368,7 +370,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
368
370
  | `9c728558d6e7` | certain | Drachmae & karma | `modules/hall-ui/public/drachmae.html:37` |
369
371
  | `9d9cc4ef8557` | certain | Drachmae & karma — {{worldName}} | `modules/hall-ui/public/drachmae.html:6` |
370
372
  | `9d9cc4ef8557` | certain | Drachmae & karma — {{worldName}} | `modules/hall-ui/public/drachmae.html:6` |
371
- | `2f8d0404039e` | certain | Draft discarded. | `modules/hall-ui/public/ideas.js:347` |
373
+ | `2f8d0404039e` | certain | Draft discarded. | `modules/hall-ui/public/ideas.js:361` |
372
374
  | `d59beed97d58` | certain | Drag to pan, scroll to zoom | `modules/hall-ui/public/diagrams.html:33` |
373
375
  | `67f09099c2d3` | certain | Duplicate — should be said once, in one place | `modules/hall-ui/public/copy-desk.html:93` |
374
376
  | `db7f370c0d38` | certain | Each builder’s dev box at a glance. | `modules/hall-ui/public/harbor.js:361` |
@@ -396,9 +398,12 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
396
398
  | `647513e4838a` | certain | Everything this builder has shipped. Seen one craft at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:108` |
397
399
  | `efdb46f76b02` | certain | Everything this instance can run: what the core ships, what this project built, and who keeps each one true as | `modules/hall-ui/public/modules.html:32` |
398
400
  | `d629e152f074` | certain | Expires {…} · refreshes on use. | `modules/hall-ui/public/settings.js:992` |
401
+ | `de62f4cc7d2e` | certain | File a bug or idea | `modules/hall-ui/public/ideas.html:59` |
402
+ | `0f166311ff3f` | certain | File it | `modules/hall-ui/public/ideas.html:99` |
399
403
  | `0c4632f983db` | certain | File the change | `modules/hall-ui/public/copy-desk.html:173` |
400
404
  | `536a7e99640a` | certain | File the flag | `modules/hall-ui/public/copy-desk.html:108` |
401
- | `077cf99f49f6` | certain | File this idea | `modules/hall-ui/public/ideas.html:90` |
405
+ | `077cf99f49f6` | certain | File this idea | `modules/hall-ui/public/ideas.html:144` |
406
+ | `6430ee350486` | certain | Filed to the inbox. | `modules/hall-ui/public/ideas.js:478` |
402
407
  | `1def0e7c716e` | certain | Find something to flag | `modules/hall-ui/public/copy-desk.html:64` |
403
408
  | `1109aec05482` | certain | First install | `modules/hall-ui/public/hall-render.js:811` |
404
409
  | `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` |
@@ -407,7 +412,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
407
412
  | `86ef86c5c647` | certain | Fit to view | `modules/hall-ui/public/diagram-viewer.js:97` |
408
413
  | `86ef86c5c647` | certain | Fit to view | `modules/hall-ui/public/diagram-viewer.js:100` |
409
414
  | `78107a76a755` | certain | Five diagrams that show, at a glance, how work flows through {{worldName}}'s development system. | `modules/hall-ui/public/diagrams.html:33` |
410
- | `18ab1be9d3ad` | certain | Five questions, and a score that counts how much of each you actually answered. | `modules/hall-ui/public/ideas.js:448` |
415
+ | `18ab1be9d3ad` | certain | Five questions, and a score that counts how much of each you actually answered. | `modules/hall-ui/public/ideas.js:621` |
411
416
  | `b9267033b1f1` | certain | Flag this copy | `modules/hall-ui/public/copy-desk.html:83` |
412
417
  | `82149b1deacd` | certain | Flag this… | `modules/hall-ui/public/copy-desk.js:164` |
413
418
  | `448d00771dc8` | certain | Flagged. It is in the queue. | `modules/hall-ui/public/copy-desk.js:391` |
@@ -508,6 +513,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
508
513
  | `59f0bc78a28f` | certain | Last 90 days | `modules/hall-ui/public/hall-widgets.js:130` |
509
514
  | `13bae4dfb28e` | certain | Last claimed by | `modules/hall-ui/public/task.js:549` |
510
515
  | `1526a7ae8c85` | certain | Latest version: v{…}. | `modules/hall-ui/public/settings.js:1462` |
516
+ | `19ad2430937d` | certain | Learning capture | `modules/hall-ui/public/ideas.html:78` |
511
517
  | `7c9b7a89353b` | certain | Leave goal | `modules/hall-ui/public/goals-render.js:840` |
512
518
  | `f192ff6563f9` | certain | Leave your GitHub username and an Archon will let you in. No coding needed to start — once you're approved, si | `modules/hall-ui/public/hall-render.js:278` |
513
519
  | `43660902bf79` | certain | Link copied. | `modules/hall-ui/public/drachmae.js:200` |
@@ -524,7 +530,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
524
530
  | `217f64ef8667` | certain | Loading the catalog… | `modules/hall-ui/public/modules.html:59` |
525
531
  | `a8b3b04b0b4d` | certain | Loading the copy desk… | `modules/hall-ui/public/copy-desk.html:28` |
526
532
  | `2bde9c630fd2` | certain | Loading the directory… | `modules/hall-ui/public/people.html:40` |
527
- | `fcd755e8dd30` | certain | Loading the five questions… | `modules/hall-ui/public/ideas.html:84` |
533
+ | `fcd755e8dd30` | certain | Loading the five questions… | `modules/hall-ui/public/ideas.html:138` |
528
534
  | `e201b4962858` | certain | Loading the idea | `modules/hall-ui/public/idea.html:43` |
529
535
  | `95a5382e5277` | certain | Loading the idea template… | `modules/hall-ui/public/ideas.html:31` |
530
536
  | `9972fc9b4727` | certain | Loading the map… | `modules/hall-ui/public/atlas.html:51` |
@@ -575,6 +581,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
575
581
  | `6e2d2e11f84a` | certain | No description. | `modules/hall-ui/public/idea.js:122` |
576
582
  | `881d06b5e79f` | certain | No done-when criteria yet | `modules/hall-ui/public/goals-render.js:149` |
577
583
  | `93c00cb1423a` | certain | No goal | `modules/hall-ui/public/work.js:523` |
584
+ | `d10dca462260` | certain | No goal (homeless) | `modules/hall-ui/public/ideas.js:382` |
578
585
  | `fbb887a9b678` | certain | No goal has criteria met yet — work is in the task queue. | `modules/hall-ui/public/roadmap.js:116` |
579
586
  | `6771a8966ec3` | certain | No goals declared yet — this version is tracked by its {…} done-when criteria. | `modules/hall-ui/public/roadmap.js:94` |
580
587
  | `abc64639b134` | certain | No goals seeded yet. | `modules/hall-ui/public/roadmap.js:192` |
@@ -606,7 +613,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
606
613
  | `cd652d04d616` | certain | Nothing changes yet. This files a task carrying your wording; whoever claims it lands the diff, and it ships g | `modules/hall-ui/public/copy-desk.html:168` |
607
614
  | `fec5d78497e8` | certain | Nothing in the backlog right now. | `modules/hall-ui/public/work.js:1055` |
608
615
  | `2c6e0dfbd781` | certain | Nothing is waiting on you. Requests reach you by your craft — set yours in | `modules/hall-ui/public/collab.html:44` |
609
- | `2ec0fbb20a42` | certain | Nothing is waiting. A spark appears here when its author offers a quick idea up for development. | `modules/hall-ui/public/ideas.js:365` |
616
+ | `2ec0fbb20a42` | certain | Nothing is waiting. A spark appears here when its author offers a quick idea up for development. | `modules/hall-ui/public/ideas.js:528` |
610
617
  | `ad9a17a8a5eb` | certain | Nothing shipped yet. | `modules/hall-ui/public/profile.js:213` |
611
618
  | `ad9a17a8a5eb` | certain | Nothing shipped yet. | `modules/hall-ui/public/work.js:1016` |
612
619
  | `f326632f2013` | certain | Nothing to submit — every module here ships with the core. | `modules/hall-ui/public/modules.js:258` |
@@ -617,7 +624,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
617
624
  | `ea1f179dd878` | certain | On this page | `modules/hall-ui/public/drachmae.html:51` |
618
625
  | `ea1f179dd878` | certain | On this page | `modules/hall-ui/public/drachmae.html:56` |
619
626
  | `c9454da07fc7` | certain | One click, and the app can act as you. | `modules/hall-ui/public/pair.js:52` |
620
- | `d5f0b7156024` | certain | One line. This is what the idea is called everywhere else. | `modules/hall-ui/public/ideas.html:73` |
627
+ | `d5f0b7156024` | certain | One line. This is what the idea is called everywhere else. | `modules/hall-ui/public/ideas.html:127` |
621
628
  | `0bc1d1470e22` | certain | Only an open goal can be managed. | `modules/hall-ui/public/goals-render.js:1031` |
622
629
  | `0bc1d1470e22` | certain | Only an open goal can be managed. | `modules/hall-ui/public/goals-render.js:1047` |
623
630
  | `fa818ee444b4` | certain | Only this goal's owner or a manager (or an Archon) may do this. | `modules/hall-ui/public/goals-render.js:1030` |
@@ -783,7 +790,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
783
790
  | `0c0a50ba1666` | certain | Shipped {…}{…}, {…}. | `modules/hall-ui/public/task.js:584` |
784
791
  | `14d32a35c15f` | certain | Show my cross-project record | `modules/hall-ui/public/settings.js:584` |
785
792
  | `dc0f9fe50a65` | certain | Show the setup guide again | `modules/hall-ui/public/index.html:64` |
786
- | `2af4c0f2b4b9` | certain | Showing {…} of {…}. | `modules/hall-ui/public/ideas.js:369` |
793
+ | `2af4c0f2b4b9` | certain | Showing {…} of {…}. | `modules/hall-ui/public/ideas.js:532` |
787
794
  | `838b17fa8d93` | certain | Shown on your public profile — it helps others know what you work on. | `modules/hall-ui/public/profile-nudge.js:69` |
788
795
  | `9bea6404e6e1` | certain | Sign in | `modules/hall-ui/public/profile.js:179` |
789
796
  | `9bea6404e6e1` | certain | Sign in | `modules/hall-ui/public/settings.html:42` |
@@ -814,6 +821,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
814
821
  | `efe530c0e3a7` | certain | Still open | `modules/hall-ui/public/profile.js:382` |
815
822
  | `4e09b7f4288b` | certain | Stops and deletes your box. Provision a fresh one anytime. | `modules/hall-ui/public/box-panel.js:150` |
816
823
  | `6c6544f5c011` | certain | Stored encrypted; never shown again after saving — only its last four digits. | `modules/hall-ui/public/settings.html:193` |
824
+ | `f79e1fb8ebd4` | certain | Suggested as you type; leave it on "no goal" and it waits for triage. | `modules/hall-ui/public/ideas.html:91` |
817
825
  | `1e40f33483eb` | certain | Switch theme | `modules/hall-ui/public/shell.js:350` |
818
826
  | `93fa2e97dd35` | certain | System default for this skill | `modules/hall-ui/public/settings.js:74` |
819
827
  | `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1024` |
@@ -969,7 +977,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
969
977
  | `986514f35589` | certain | Work board | `modules/hall-ui/public/work.html:31` |
970
978
  | `520d139df9eb` | certain | Work is complete but the version is held — no tasks are being claimed here right now. | `modules/hall-ui/public/roadmap.js:223` |
971
979
  | `0e6b8e8f26cc` | certain | Works completed | `modules/hall-ui/public/profile.html:140` |
972
- | `52e5fe3c6075` | certain | Write a Full Idea | `modules/hall-ui/public/ideas.html:52` |
980
+ | `52e5fe3c6075` | certain | Write a Full Idea | `modules/hall-ui/public/ideas.html:106` |
973
981
  | `7664f4373d1f` | certain | Write one | `modules/hall-ui/public/idea.js:258` |
974
982
  | `47f61e576454` | certain | Write the wording you want instead. | `modules/hall-ui/public/copy-desk.js:436` |
975
983
  | `c368b56ecf40` | certain | Xenos builders start with a focused set of pages — ship your first | `modules/hall-ui/public/not-ready.html:31` |
@@ -1068,7 +1076,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1068
1076
  | `7d5cbe3d81e4` | certain | how long a vote stays open | `modules/hall-ui/public/government.html:55` |
1069
1077
  | `dacb901c4f10` | certain | idea number | `modules/hall-ui/public/task-detail.js:458` |
1070
1078
  | `7df22e74c87a` | certain | idea {…} | `modules/hall-ui/public/idea.js:210` |
1071
- | `7df22e74c87a` | certain | idea {…} | `modules/hall-ui/public/ideas.js:334` |
1079
+ | `7df22e74c87a` | certain | idea {…} | `modules/hall-ui/public/ideas.js:348` |
1072
1080
  | `2123a62d69e3` | certain | if this stays empty. | `modules/hall-ui/public/collab.html:45` |
1073
1081
  | `b2b399fdd6a4` | certain | in progress | `modules/hall-ui/public/roadmap.js:108` |
1074
1082
  | `b2b399fdd6a4` | certain | in progress | `modules/hall-ui/public/roadmap.js:194` |
@@ -1124,6 +1132,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1124
1132
  | `80ddf28baee7` | certain | rank-key (kebab-case) | `modules/hall-ui/public/government.html:84` |
1125
1133
  | `f83f0a9d6b6a` | certain | recorded, on the Operations tab | `modules/hall-ui/public/watch.html:49` |
1126
1134
  | `26da1df6fd4a` | certain | reflects it. | `modules/hall-ui/public/settings.html:136` |
1135
+ | `d4bb81532896` | certain | repro steps, context, anything that helps… | `modules/hall-ui/public/ideas.html:87` |
1127
1136
  | `594962dc9ec3` | certain | s into the view containers below (falling back to | `modules/hall-ui/public/index.html:52` |
1128
1137
  | `2a42549b34ae` | certain | said, when flagged: | `modules/hall-ui/public/copy-desk.js:124` |
1129
1138
  | `9bec9eb4829e` | certain | scope: {…} | `modules/hall-ui/public/goals-render.js:774` |
@@ -1138,6 +1147,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1138
1147
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/gate.js:142` |
1139
1148
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/hall-render.js:599` |
1140
1149
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/idea.js:207` |
1150
+ | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/ideas.js:476` |
1141
1151
  | `4d8ee7d68974` | certain | task {…} | `modules/hall-ui/public/watch.js:936` |
1142
1152
  | `a41659dc2bee` | certain | tasks remaining | `modules/hall-ui/public/roadmap.js:273` |
1143
1153
  | `bd3402efa59e` | certain | task{…} shipped | `modules/hall-ui/public/goals-render.js:737` |
@@ -1159,8 +1169,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1159
1169
  | `007b28a56031` | certain | view diff | `modules/hall-ui/public/gate.js:145` |
1160
1170
  | `35be9e0923da` | certain | walks the whole path in plain language. | `modules/hall-ui/public/hall-render.js:811` |
1161
1171
  | `17705daf7b85` | certain | what counts as passing | `modules/hall-ui/public/government.html:55` |
1162
- | `b1c5eaa20a9d` | certain | what the idea is, in one line | `modules/hall-ui/public/ideas.html:76` |
1172
+ | `b1c5eaa20a9d` | certain | what the idea is, in one line | `modules/hall-ui/public/ideas.html:130` |
1163
1173
  | `e72c90163726` | certain | what's blocking | `modules/hall-ui/public/goals-render.js:161` |
1174
+ | `81f05d9b2bbf` | certain | what's wrong, or what you'd like to see | `modules/hall-ui/public/ideas.html:69` |
1164
1175
  | `1651cb1876f5` | certain | who sits on the board | `modules/hall-ui/public/government.html:55` |
1165
1176
  | `143f77e2b782` | certain | why these are the same | `modules/hall-ui/public/task-detail.js:461` |
1166
1177
  | `ec7c228cb4ce` | certain | why this isn’t worth doing | `modules/hall-ui/public/task-detail.js:512` |
@@ -3,9 +3,9 @@
3
3
  "generator": "scripts/gds/copy-inventory.js",
4
4
  "goal": 1000074,
5
5
  "counts": {
6
- "strings": 1615,
7
- "unique_ids": 1406,
8
- "certain": 1615,
6
+ "strings": 1626,
7
+ "unique_ids": 1416,
8
+ "certain": 1626,
9
9
  "heuristic": 0,
10
10
  "duplicate_ids": 150
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "builders-hall": {
14
14
  "at": "modules/hall-ui/public",
15
15
  "files": 73,
16
- "strings": 1172
16
+ "strings": 1183
17
17
  },
18
18
  "status-dashboard": {
19
19
  "at": "modules/status-ui/public",
@@ -107,6 +107,19 @@
107
107
  "modules/public-landing/public/projects.html:794"
108
108
  ]
109
109
  },
110
+ {
111
+ "id": "4d8ee7d68974",
112
+ "surface": "builders-hall",
113
+ "text": "task {…}",
114
+ "occurrences": 5,
115
+ "at": [
116
+ "modules/hall-ui/public/gate.js:142",
117
+ "modules/hall-ui/public/hall-render.js:599",
118
+ "modules/hall-ui/public/idea.js:207",
119
+ "modules/hall-ui/public/ideas.js:476",
120
+ "modules/hall-ui/public/watch.js:936"
121
+ ]
122
+ },
110
123
  {
111
124
  "id": "5df2baabf82e",
112
125
  "surface": "landing",
@@ -264,18 +277,6 @@
264
277
  "modules/hall-ui/public/work.js:923"
265
278
  ]
266
279
  },
267
- {
268
- "id": "4d8ee7d68974",
269
- "surface": "builders-hall",
270
- "text": "task {…}",
271
- "occurrences": 4,
272
- "at": [
273
- "modules/hall-ui/public/gate.js:142",
274
- "modules/hall-ui/public/hall-render.js:599",
275
- "modules/hall-ui/public/idea.js:207",
276
- "modules/hall-ui/public/watch.js:936"
277
- ]
278
- },
279
280
  {
280
281
  "id": "1de02052abf2",
281
282
  "surface": "builders-hall",
@@ -1384,7 +1385,7 @@
1384
1385
  "occurrences": 2,
1385
1386
  "at": [
1386
1387
  "modules/hall-ui/public/idea.js:210",
1387
- "modules/hall-ui/public/ideas.js:334"
1388
+ "modules/hall-ui/public/ideas.js:348"
1388
1389
  ]
1389
1390
  },
1390
1391
  {
@@ -1874,7 +1875,7 @@
1874
1875
  "surface": "builders-hall",
1875
1876
  "text": "A Full Idea answers five questions, so that someone else can deliver against it without having to interview you first. Open to every role — the score below is the only filter, and it counts substance, not who you are.",
1876
1877
  "file": "modules/hall-ui/public/ideas.html",
1877
- "line": 53,
1878
+ "line": 107,
1878
1879
  "origin": "html-text",
1879
1880
  "confidence": "certain"
1880
1881
  },
@@ -1959,6 +1960,15 @@
1959
1960
  "origin": "js-markup",
1960
1961
  "confidence": "certain"
1961
1962
  },
1963
+ {
1964
+ "id": "23dc5028183a",
1965
+ "surface": "builders-hall",
1966
+ "text": "A quick report — title, what's going on, and where it belongs. Pick a goal and it lands there as a task the moment you file; leave it on \"no goal\" and it waits in the inbox for triage.",
1967
+ "file": "modules/hall-ui/public/ideas.html",
1968
+ "line": 60,
1969
+ "origin": "html-text",
1970
+ "confidence": "certain"
1971
+ },
1962
1972
  {
1963
1973
  "id": "eff6b977b1d2",
1964
1974
  "surface": "builders-hall",
@@ -2153,7 +2163,7 @@
2153
2163
  "surface": "builders-hall",
2154
2164
  "text": "Answer the five questions and this spark becomes a Full Idea.",
2155
2165
  "file": "modules/hall-ui/public/ideas.js",
2156
- "line": 423,
2166
+ "line": 586,
2157
2167
  "origin": "js-text-assign",
2158
2168
  "confidence": "certain"
2159
2169
  },
@@ -2427,6 +2437,15 @@
2427
2437
  "origin": "js-notice",
2428
2438
  "confidence": "certain"
2429
2439
  },
2440
+ {
2441
+ "id": "f0576990e9fc",
2442
+ "surface": "builders-hall",
2443
+ "text": "Blocker resolution",
2444
+ "file": "modules/hall-ui/public/ideas.html",
2445
+ "line": 81,
2446
+ "origin": "html-text",
2447
+ "confidence": "certain"
2448
+ },
2430
2449
  {
2431
2450
  "id": "118026595c16",
2432
2451
  "surface": "builders-hall",
@@ -3377,7 +3396,7 @@
3377
3396
  "surface": "builders-hall",
3378
3397
  "text": "Could not load idea {…}.",
3379
3398
  "file": "modules/hall-ui/public/ideas.js",
3380
- "line": 456,
3399
+ "line": 629,
3381
3400
  "origin": "js-text-assign",
3382
3401
  "confidence": "certain"
3383
3402
  },
@@ -3422,7 +3441,7 @@
3422
3441
  "surface": "builders-hall",
3423
3442
  "text": "Could not load the idea template. Reload, or file from the terminal with capture.js.",
3424
3443
  "file": "modules/hall-ui/public/ideas.js",
3425
- "line": 438,
3444
+ "line": 611,
3426
3445
  "origin": "js-text-assign",
3427
3446
  "confidence": "certain"
3428
3447
  },
@@ -3449,7 +3468,7 @@
3449
3468
  "surface": "builders-hall",
3450
3469
  "text": "Could not load the queue just now.",
3451
3470
  "file": "modules/hall-ui/public/ideas.js",
3452
- "line": 387,
3471
+ "line": 550,
3453
3472
  "origin": "js-markup",
3454
3473
  "confidence": "certain"
3455
3474
  },
@@ -3854,7 +3873,7 @@
3854
3873
  "surface": "builders-hall",
3855
3874
  "text": "Counted, not judged: each question is worth the same, and earns its share in proportion to how much real text it carries. Whitespace and padding score nothing.",
3856
3875
  "file": "modules/hall-ui/public/ideas.html",
3857
- "line": 113,
3876
+ "line": 167,
3858
3877
  "origin": "html-text",
3859
3878
  "confidence": "certain"
3860
3879
  },
@@ -3980,7 +3999,7 @@
3980
3999
  "surface": "builders-hall",
3981
4000
  "text": "Develop this idea",
3982
4001
  "file": "modules/hall-ui/public/ideas.js",
3983
- "line": 422,
4002
+ "line": 585,
3984
4003
  "origin": "js-text-assign",
3985
4004
  "confidence": "certain"
3986
4005
  },
@@ -3989,7 +4008,7 @@
3989
4008
  "surface": "builders-hall",
3990
4009
  "text": "Developing a Big Idea Spark",
3991
4010
  "file": "modules/hall-ui/public/ideas.html",
3992
- "line": 65,
4011
+ "line": 119,
3993
4012
  "origin": "html-text",
3994
4013
  "confidence": "certain"
3995
4014
  },
@@ -4025,7 +4044,7 @@
4025
4044
  "surface": "builders-hall",
4026
4045
  "text": "Discard draft",
4027
4046
  "file": "modules/hall-ui/public/ideas.html",
4028
- "line": 91,
4047
+ "line": 145,
4029
4048
  "origin": "html-text",
4030
4049
  "confidence": "certain"
4031
4050
  },
@@ -4178,7 +4197,7 @@
4178
4197
  "surface": "builders-hall",
4179
4198
  "text": "Draft discarded.",
4180
4199
  "file": "modules/hall-ui/public/ideas.js",
4181
- "line": 347,
4200
+ "line": 361,
4182
4201
  "origin": "js-notice",
4183
4202
  "confidence": "certain"
4184
4203
  },
@@ -4425,6 +4444,24 @@
4425
4444
  "origin": "js-markup",
4426
4445
  "confidence": "certain"
4427
4446
  },
4447
+ {
4448
+ "id": "de62f4cc7d2e",
4449
+ "surface": "builders-hall",
4450
+ "text": "File a bug or idea",
4451
+ "file": "modules/hall-ui/public/ideas.html",
4452
+ "line": 59,
4453
+ "origin": "html-text",
4454
+ "confidence": "certain"
4455
+ },
4456
+ {
4457
+ "id": "0f166311ff3f",
4458
+ "surface": "builders-hall",
4459
+ "text": "File it",
4460
+ "file": "modules/hall-ui/public/ideas.html",
4461
+ "line": 99,
4462
+ "origin": "html-text",
4463
+ "confidence": "certain"
4464
+ },
4428
4465
  {
4429
4466
  "id": "0c4632f983db",
4430
4467
  "surface": "builders-hall",
@@ -4448,10 +4485,19 @@
4448
4485
  "surface": "builders-hall",
4449
4486
  "text": "File this idea",
4450
4487
  "file": "modules/hall-ui/public/ideas.html",
4451
- "line": 90,
4488
+ "line": 144,
4452
4489
  "origin": "html-text",
4453
4490
  "confidence": "certain"
4454
4491
  },
4492
+ {
4493
+ "id": "6430ee350486",
4494
+ "surface": "builders-hall",
4495
+ "text": "Filed to the inbox.",
4496
+ "file": "modules/hall-ui/public/ideas.js",
4497
+ "line": 478,
4498
+ "origin": "js-text-assign",
4499
+ "confidence": "certain"
4500
+ },
4455
4501
  {
4456
4502
  "id": "1def0e7c716e",
4457
4503
  "surface": "builders-hall",
@@ -4529,7 +4575,7 @@
4529
4575
  "surface": "builders-hall",
4530
4576
  "text": "Five questions, and a score that counts how much of each you actually answered.",
4531
4577
  "file": "modules/hall-ui/public/ideas.js",
4532
- "line": 448,
4578
+ "line": 621,
4533
4579
  "origin": "js-text-assign",
4534
4580
  "confidence": "certain"
4535
4581
  },
@@ -5433,6 +5479,15 @@
5433
5479
  "origin": "js-text-assign",
5434
5480
  "confidence": "certain"
5435
5481
  },
5482
+ {
5483
+ "id": "19ad2430937d",
5484
+ "surface": "builders-hall",
5485
+ "text": "Learning capture",
5486
+ "file": "modules/hall-ui/public/ideas.html",
5487
+ "line": 78,
5488
+ "origin": "html-text",
5489
+ "confidence": "certain"
5490
+ },
5436
5491
  {
5437
5492
  "id": "7c9b7a89353b",
5438
5493
  "surface": "builders-hall",
@@ -5582,7 +5637,7 @@
5582
5637
  "surface": "builders-hall",
5583
5638
  "text": "Loading the five questions…",
5584
5639
  "file": "modules/hall-ui/public/ideas.html",
5585
- "line": 84,
5640
+ "line": 138,
5586
5641
  "origin": "html-text",
5587
5642
  "confidence": "certain"
5588
5643
  },
@@ -6036,6 +6091,15 @@
6036
6091
  "origin": "js-text-assign",
6037
6092
  "confidence": "certain"
6038
6093
  },
6094
+ {
6095
+ "id": "d10dca462260",
6096
+ "surface": "builders-hall",
6097
+ "text": "No goal (homeless)",
6098
+ "file": "modules/hall-ui/public/ideas.js",
6099
+ "line": 382,
6100
+ "origin": "js-markup",
6101
+ "confidence": "certain"
6102
+ },
6039
6103
  {
6040
6104
  "id": "fbb887a9b678",
6041
6105
  "surface": "builders-hall",
@@ -6320,7 +6384,7 @@
6320
6384
  "surface": "builders-hall",
6321
6385
  "text": "Nothing is waiting. A spark appears here when its author offers a quick idea up for development.",
6322
6386
  "file": "modules/hall-ui/public/ideas.js",
6323
- "line": 365,
6387
+ "line": 528,
6324
6388
  "origin": "js-markup",
6325
6389
  "confidence": "certain"
6326
6390
  },
@@ -6419,7 +6483,7 @@
6419
6483
  "surface": "builders-hall",
6420
6484
  "text": "One line. This is what the idea is called everywhere else.",
6421
6485
  "file": "modules/hall-ui/public/ideas.html",
6422
- "line": 73,
6486
+ "line": 127,
6423
6487
  "origin": "html-text",
6424
6488
  "confidence": "certain"
6425
6489
  },
@@ -7913,7 +7977,7 @@
7913
7977
  "surface": "builders-hall",
7914
7978
  "text": "Showing {…} of {…}.",
7915
7979
  "file": "modules/hall-ui/public/ideas.js",
7916
- "line": 369,
7980
+ "line": 532,
7917
7981
  "origin": "js-markup",
7918
7982
  "confidence": "certain"
7919
7983
  },
@@ -8187,6 +8251,15 @@
8187
8251
  "origin": "html-text",
8188
8252
  "confidence": "certain"
8189
8253
  },
8254
+ {
8255
+ "id": "f79e1fb8ebd4",
8256
+ "surface": "builders-hall",
8257
+ "text": "Suggested as you type; leave it on \"no goal\" and it waits for triage.",
8258
+ "file": "modules/hall-ui/public/ideas.html",
8259
+ "line": 91,
8260
+ "origin": "html-text",
8261
+ "confidence": "certain"
8262
+ },
8190
8263
  {
8191
8264
  "id": "1e40f33483eb",
8192
8265
  "surface": "builders-hall",
@@ -9587,7 +9660,7 @@
9587
9660
  "surface": "builders-hall",
9588
9661
  "text": "Write a Full Idea",
9589
9662
  "file": "modules/hall-ui/public/ideas.html",
9590
- "line": 52,
9663
+ "line": 106,
9591
9664
  "origin": "html-text",
9592
9665
  "confidence": "certain"
9593
9666
  },
@@ -10478,7 +10551,7 @@
10478
10551
  "surface": "builders-hall",
10479
10552
  "text": "idea {…}",
10480
10553
  "file": "modules/hall-ui/public/ideas.js",
10481
- "line": 334,
10554
+ "line": 348,
10482
10555
  "origin": "js-markup",
10483
10556
  "confidence": "certain"
10484
10557
  },
@@ -10977,6 +11050,15 @@
10977
11050
  "origin": "html-text",
10978
11051
  "confidence": "certain"
10979
11052
  },
11053
+ {
11054
+ "id": "d4bb81532896",
11055
+ "surface": "builders-hall",
11056
+ "text": "repro steps, context, anything that helps…",
11057
+ "file": "modules/hall-ui/public/ideas.html",
11058
+ "line": 87,
11059
+ "origin": "html-attr:placeholder",
11060
+ "confidence": "certain"
11061
+ },
10980
11062
  {
10981
11063
  "id": "594962dc9ec3",
10982
11064
  "surface": "builders-hall",
@@ -11103,6 +11185,15 @@
11103
11185
  "origin": "js-markup",
11104
11186
  "confidence": "certain"
11105
11187
  },
11188
+ {
11189
+ "id": "4d8ee7d68974",
11190
+ "surface": "builders-hall",
11191
+ "text": "task {…}",
11192
+ "file": "modules/hall-ui/public/ideas.js",
11193
+ "line": 476,
11194
+ "origin": "js-markup",
11195
+ "confidence": "certain"
11196
+ },
11106
11197
  {
11107
11198
  "id": "4d8ee7d68974",
11108
11199
  "surface": "builders-hall",
@@ -11297,7 +11388,7 @@
11297
11388
  "surface": "builders-hall",
11298
11389
  "text": "what the idea is, in one line",
11299
11390
  "file": "modules/hall-ui/public/ideas.html",
11300
- "line": 76,
11391
+ "line": 130,
11301
11392
  "origin": "html-attr:placeholder",
11302
11393
  "confidence": "certain"
11303
11394
  },
@@ -11310,6 +11401,15 @@
11310
11401
  "origin": "js-markup",
11311
11402
  "confidence": "certain"
11312
11403
  },
11404
+ {
11405
+ "id": "81f05d9b2bbf",
11406
+ "surface": "builders-hall",
11407
+ "text": "what's wrong, or what you'd like to see",
11408
+ "file": "modules/hall-ui/public/ideas.html",
11409
+ "line": 69,
11410
+ "origin": "html-attr:placeholder",
11411
+ "confidence": "certain"
11412
+ },
11313
11413
  {
11314
11414
  "id": "1651cb1876f5",
11315
11415
  "surface": "builders-hall",
@@ -1431,5 +1431,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
1431
1431
  landed since 1.19.495 with no explicit bump. run 33766363834. (task 1002620)
1432
1432
  1.19.497 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1433
1433
  landed since 1.19.496 with no explicit bump. run 33767382661. (task 1002620)
1434
+ 1.19.498 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1435
+ landed since 1.19.497 with no explicit bump. run 33768753719. (task 1002620)
1434
1436
  ---------------------------------------------------------------------------
1435
1437
  ```
@@ -74,6 +74,11 @@
74
74
  .fi-err { margin: var(--sp-sm) 0 0; max-width: var(--measure); font-size: 14px; line-height: 1.5; color: var(--danger); }
75
75
  .fi-err[data-visible="0"] { display: none; }
76
76
 
77
+ /* The quick-filing form's outcome line (task 1003069 / R08) — a routed capture
78
+ names the task it landed in, so its link takes the world's 24px row recipe. */
79
+ .fi-result { margin: var(--sp-sm) 0 0; max-width: var(--measure); font-size: 14px; line-height: 1.5; color: var(--ink-soft); }
80
+ .fi-result a { display: inline-block; min-height: 24px; padding: 3px 0; line-height: 18px; box-sizing: border-box; color: inherit; }
81
+
77
82
  .fi-actions { display: flex; flex-wrap: wrap; gap: 10px 12px; align-items: center; margin-top: var(--sp-md); }
78
83
  .fi-draft { font-size: 12.5px; color: var(--ink-faint); }
79
84
 
@@ -47,6 +47,60 @@
47
47
  <div id="fi-queue"><p class="fi-note">Loading…</p></div>
48
48
  </section>
49
49
 
50
+ <!-- Quick filing (task 1003069 / R08, goal 1000071 "Idea routing") —
51
+ the hall's first bug/idea report, separate from the Full Idea
52
+ composer below: title + kind + optional body + a goal picker fed
53
+ by the R07 suggester. A routed capture must never carry
54
+ grade='full' (routing.js NEVER_ROUTE_GRADE), so this cannot share
55
+ a submit with the form below it. Hidden while developing a spark
56
+ (?develop=<id>) — that surface always turns someone else's
57
+ existing thought into a Full Idea, never a fresh quick report. -->
58
+ <section class="scroll" id="fq-compose-scroll" aria-labelledby="fq-compose-h">
59
+ <h2 id="fq-compose-h" class="scroll__h">File a bug or idea</h2>
60
+ <p class="scroll__lede">
61
+ A quick report — title, what's going on, and where it belongs. Pick a goal
62
+ and it lands there as a task the moment you file; leave it on "no goal" and
63
+ it waits in the inbox for triage.
64
+ </p>
65
+
66
+ <form id="fq-form" novalidate>
67
+ <label class="fi-label" for="fq-title">Title</label>
68
+ <input type="text" id="fq-title" class="fi-input" maxlength="200" autocomplete="off"
69
+ placeholder="what's wrong, or what you'd like to see">
70
+
71
+ <label class="fi-label" for="fq-kind">Kind</label>
72
+ <select id="fq-kind" class="fi-input">
73
+ <option value="bug" selected>Bug</option>
74
+ <option value="feature">Feature</option>
75
+ <option value="infra">Infra</option>
76
+ <option value="refactor">Refactor</option>
77
+ <option value="spike">Spike</option>
78
+ <option value="learning-capture">Learning capture</option>
79
+ <option value="cleanup">Cleanup</option>
80
+ <option value="decision">Decision</option>
81
+ <option value="blocker-resolution">Blocker resolution</option>
82
+ <option value="unclassified">Unclassified</option>
83
+ </select>
84
+
85
+ <label class="fi-label" for="fq-body">Details <span class="fi-hint">(optional)</span></label>
86
+ <textarea id="fq-body" class="fi-text" rows="4"
87
+ placeholder="repro steps, context, anything that helps…"></textarea>
88
+
89
+ <label class="fi-label" for="fq-goal">
90
+ Goal
91
+ <span class="fi-hint">Suggested as you type; leave it on "no goal" and it waits for triage.</span>
92
+ </label>
93
+ <select id="fq-goal" class="fi-input"></select>
94
+
95
+ <p class="fi-err" id="fq-err" role="alert"></p>
96
+ <p class="fi-result" id="fq-result" role="status" aria-live="polite"></p>
97
+
98
+ <div class="fi-actions">
99
+ <button type="submit" class="btn" id="fq-submit">File it</button>
100
+ </div>
101
+ </form>
102
+ </section>
103
+
50
104
  <!-- The composer. The idea detail view lives on its own page (R153). -->
51
105
  <section class="scroll" id="fi-compose-scroll" aria-labelledby="fi-compose-h">
52
106
  <h2 id="fi-compose-h" class="scroll__h">Write a Full Idea</h2>
@@ -121,6 +175,9 @@
121
175
  <script src="/builders/shell.js?v=2026-07-02-shell1"></script>
122
176
  <script src="/builders/palette.js" defer></script>
123
177
  <script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
178
+ <!-- task 1003069 (R08) — the quick-filing form's routed result links a task
179
+ through window.OTBTaskDetail.href(); guarded if this ever loads without it. -->
180
+ <script src="/builders/task-detail.js?v=2026-07-03-taskdetail2" defer></script>
124
181
  <script src="/builders/ideas.js?v=2026-08-22-r154"></script>
125
182
  </body>
126
183
  </html>
@@ -75,6 +75,20 @@
75
75
  let draftTimer = null;
76
76
  let filing = false;
77
77
 
78
+ // QUICK FILING (task 1003069 / R08, goal 1000071 "Idea routing"). A second,
79
+ // independent capture path on this page: title + kind + optional body + a
80
+ // goal picker fed by the R07 suggester (GET /goals/suggestions). It lives
81
+ // beside the Full Idea form above rather than inside it — a routed capture
82
+ // must never carry grade='full' (routing.js NEVER_ROUTE_GRADE), so the two
83
+ // cannot share one submit. Quick-mode only: hidden while developing a spark.
84
+ const QUICK_SUGGEST_DEBOUNCE_MS = 300;
85
+ let buildingVersionIds = []; // fetched once — the suggester is scoped per version
86
+ let allOpenGoals = []; // the picker's "browse everything" half
87
+ let allGoalsById = new Map(); // for naming the goal a routed capture landed in
88
+ let goalTouchedByUser = false; // once the builder picks, stop clobbering it with fresh suggestions
89
+ let quickSuggestTimer = null;
90
+ let quickFiling = false;
91
+
78
92
  // ---------------------------------------------------------------------------
79
93
  // draft persistence
80
94
  // ---------------------------------------------------------------------------
@@ -347,6 +361,155 @@
347
361
  toast('Draft discarded.');
348
362
  }
349
363
 
364
+ // ---------------------------------------------------------------------------
365
+ // quick filing — kind + goal picker (task 1003069 / R08)
366
+ // ---------------------------------------------------------------------------
367
+
368
+ const fqTitleEl = () => $('#fq-title');
369
+ const fqKindEl = () => $('#fq-kind');
370
+ const fqBodyEl = () => $('#fq-body');
371
+ const fqGoalEl = () => $('#fq-goal');
372
+
373
+ // The picker's options: "no goal" first (the default — a filer never has to
374
+ // know the goal map, C5), then whatever the suggester found, then every open
375
+ // goal it didn't. Suggested ids are excluded from the second list rather than
376
+ // shown twice.
377
+ function renderGoalOptions(suggested) {
378
+ const sel = fqGoalEl();
379
+ const suggestedIds = new Set((suggested || []).map((g) => String(g.id)));
380
+ const rest = allOpenGoals.filter((g) => !suggestedIds.has(String(g.id)));
381
+ const optionHtml = (g, why) => `<option value="${escapeHtml(String(g.id))}">${escapeHtml(g.title || `goal ${g.id}`)}${why ? ` — matched: ${escapeHtml(why)}` : ''}</option>`;
382
+ let html = `<option value="" selected>No goal (homeless)</option>`;
383
+ if (suggested && suggested.length) {
384
+ html += `<optgroup label="Suggested">${suggested.map((g) => optionHtml(g, (g.matched_terms || []).join(', '))).join('')}</optgroup>`;
385
+ }
386
+ html += `<optgroup label="All open goals">${rest.map((g) => optionHtml(g)).join('')}</optgroup>`;
387
+ sel.innerHTML = html;
388
+ }
389
+
390
+ // The suggester is ranked per version (GET /goals/suggestions requires one),
391
+ // so a filer whose instance has more than one version building gets both
392
+ // consulted and merged by score. An outage — or no building version at all —
393
+ // degrades to "no suggestions"; the homeless option and the full goal list
394
+ // are still there either way (goal-suggest.js's own fail-open contract).
395
+ async function refreshGoalSuggestions() {
396
+ if (goalTouchedByUser) return; // never yank a manual pick out from under someone
397
+ const title = fqTitleEl().value.trim();
398
+ if (!title || !buildingVersionIds.length) { renderGoalOptions([]); return; }
399
+ const kind = fqKindEl().value;
400
+ try {
401
+ const results = await Promise.all(buildingVersionIds.map((versionId) => api.goals.getGoalsSuggestions({
402
+ query: { version: versionId, title, kind, limit: 5 },
403
+ })));
404
+ const byId = new Map();
405
+ for (const r of results) {
406
+ if (!r.ok || !r.data || !Array.isArray(r.data.suggestions)) continue;
407
+ for (const g of r.data.suggestions) {
408
+ const prev = byId.get(String(g.id));
409
+ if (!prev || g.score > prev.score) byId.set(String(g.id), g);
410
+ }
411
+ }
412
+ const merged = Array.from(byId.values()).sort((a, b) => b.score - a.score).slice(0, 5);
413
+ renderGoalOptions(merged);
414
+ } catch (_) {
415
+ renderGoalOptions([]);
416
+ }
417
+ }
418
+
419
+ function onQuickTitleEdit() {
420
+ clearTimeout(quickSuggestTimer);
421
+ quickSuggestTimer = setTimeout(refreshGoalSuggestions, QUICK_SUGGEST_DEBOUNCE_MS);
422
+ }
423
+
424
+ function showQuickErr(msg) {
425
+ $('#fq-err').textContent = msg || '';
426
+ }
427
+
428
+ // The server names why a routed capture was refused (task 1003066's landing
429
+ // gate) or names the refusal code when it doesn't — read it, never re-derive
430
+ // the landing matrix here (routing.js stays the one place that decides).
431
+ function explainQuickFiling(status, data) {
432
+ const err = data && data.error;
433
+ const code = err && (typeof err === 'object' ? err.code : err);
434
+ const details = (err && typeof err === 'object' && err.details) || {};
435
+ if (details.reason) return `Not filed — ${details.reason}`;
436
+ if (code) return `Not filed — ${code}.`;
437
+ if (status === 401 || status === 403) return 'Not filed — your session may have expired. Reload and try again.';
438
+ return `Not filed (${status}). Nothing was saved — try again.`;
439
+ }
440
+
441
+ async function fileQuick(ev) {
442
+ ev.preventDefault();
443
+ if (quickFiling) return;
444
+ const title = fqTitleEl().value.trim();
445
+ showQuickErr('');
446
+ $('#fq-result').innerHTML = '';
447
+ if (!title) { showQuickErr('Not filed — a title is required.'); return; }
448
+ quickFiling = true;
449
+ $('#fq-submit').disabled = true;
450
+
451
+ const goalId = fqGoalEl().value;
452
+ const body = { title, body_md: fqBodyEl().value, kind: fqKindEl().value };
453
+ if (goalId) body.goal_id = Number(goalId);
454
+
455
+ const r = await api.inbox.postInbox({ body });
456
+ quickFiling = false;
457
+ $('#fq-submit').disabled = false;
458
+
459
+ if (!r.ok) {
460
+ showQuickErr(explainQuickFiling(r.status, r.data));
461
+ return;
462
+ }
463
+
464
+ // The routing verdict travels on idea.routing; a routed capture also
465
+ // carries the task it became at the top level (routed_task) — see
466
+ // routes/inbox.js. Not routed (no goal picked, or the matrix declined
467
+ // one) is exactly today's inbox behaviour.
468
+ const routedTask = r.data && r.data.routed_task;
469
+ const routing = r.data && r.data.idea && r.data.idea.routing;
470
+ if (routedTask && routedTask.id && routing && routing.routed) {
471
+ const href = window.OTBTaskDetail && typeof window.OTBTaskDetail.href === 'function'
472
+ ? window.OTBTaskDetail.href(routedTask.id)
473
+ : `/task/${encodeURIComponent(routedTask.id)}`;
474
+ const goal = allGoalsById.get(String(routing.goal_id));
475
+ const goalName = goal ? goal.title : `goal ${routing.goal_id}`;
476
+ $('#fq-result').innerHTML = `Filed as <a href="${href}">task ${escapeHtml(String(routedTask.id))}</a> under ${escapeHtml(goalName)}.`;
477
+ } else {
478
+ $('#fq-result').textContent = 'Filed to the inbox.';
479
+ }
480
+
481
+ fqTitleEl().value = '';
482
+ fqBodyEl().value = '';
483
+ fqKindEl().value = 'bug';
484
+ goalTouchedByUser = false;
485
+ renderGoalOptions([]);
486
+ }
487
+
488
+ async function bootQuickComposer() {
489
+ fqKindEl().value = 'bug';
490
+ renderGoalOptions([]);
491
+ fqTitleEl().addEventListener('input', onQuickTitleEdit);
492
+ fqKindEl().addEventListener('change', onQuickTitleEdit);
493
+ fqGoalEl().addEventListener('change', () => { goalTouchedByUser = true; });
494
+ $('#fq-form').addEventListener('submit', fileQuick);
495
+
496
+ try {
497
+ const [versionsRes, goalsRes] = await Promise.all([
498
+ api.versions.getVersions({}),
499
+ api.goals.getGoals({ query: { status: 'open' } }),
500
+ ]);
501
+ buildingVersionIds = (versionsRes.ok && versionsRes.data && Array.isArray(versionsRes.data.versions))
502
+ ? versionsRes.data.versions.filter((v) => v.status === 'building').map((v) => v.id)
503
+ : [];
504
+ allOpenGoals = (goalsRes.ok && goalsRes.data && Array.isArray(goalsRes.data.goals)) ? goalsRes.data.goals : [];
505
+ allGoalsById = new Map(allOpenGoals.map((g) => [String(g.id), g]));
506
+ renderGoalOptions([]);
507
+ } catch (_) {
508
+ // The picker degrades to "homeless only" — filing itself never depends
509
+ // on this read succeeding.
510
+ }
511
+ }
512
+
350
513
  // ---------------------------------------------------------------------------
351
514
  // boot
352
515
  // ---------------------------------------------------------------------------
@@ -433,6 +596,16 @@
433
596
  // A surface that does not depend on the failure must not be hostage to it.
434
597
  loadQueue();
435
598
 
599
+ // Quick filing (R08) is a THIRD independent surface on this page, offered
600
+ // only outside develop mode — developing a spark always produces a Full
601
+ // Idea, never a fresh quick report (see the section's own header comment).
602
+ if (DEVELOP_ID) {
603
+ const scroll = $('#fq-compose-scroll');
604
+ if (scroll) scroll.hidden = true;
605
+ } else {
606
+ bootQuickComposer();
607
+ }
608
+
436
609
  const r = await api.inbox.getInboxTemplate({});
437
610
  if (!r.ok || !r.data || !r.data.template) {
438
611
  $('#fi-sub').textContent = 'Could not load the idea template. Reload, or file from the terminal with capture.js.';
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.497",
3
+ "version": "1.19.498",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.497",
9
+ "version": "1.19.498",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.497",
3
+ "version": "1.19.498",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
package/src/module-api.js CHANGED
@@ -45,7 +45,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
45
45
  // there. scripts/gds/bump-version.js still rewrites the literal below; it appends
46
46
  // the entry to that file. Look for a version's history there, not here.
47
47
  // ---------------------------------------------------------------------------
48
- const CORE_VERSION = '1.19.497'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
48
+ const CORE_VERSION = '1.19.498'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
49
49
 
50
50
  // A namespaced logger so a module's log lines are attributable + consistent.
51
51
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -48,7 +48,19 @@ const QUEUE = [
48
48
  { id: '78', title: 'A shared changelog', status: 'open', grade: 'spark', captured_at: '2026-07-30T00:00:00Z', filed_by_login: null },
49
49
  ];
50
50
 
51
- function boot({ search = '', sparks = QUEUE, count = null, idea = SPARK, ideaOk = true, store = {} } = {}) {
51
+ // task 1003069 (R08, goal 1000071) — the quick filing form's fixtures: one
52
+ // building version and two open goals, so the suggester + full-list halves of
53
+ // the picker both have something real to render against.
54
+ const VERSIONS = [{ id: 'BV1', status: 'building' }];
55
+ const GOALS = [
56
+ { id: '77', title: 'Goal Seventy Seven', version_id: 'BV1' },
57
+ { id: '88', title: 'Another goal', version_id: 'BV1' },
58
+ ];
59
+
60
+ function boot({
61
+ search = '', sparks = QUEUE, count = null, idea = SPARK, ideaOk = true, store = {},
62
+ versions = VERSIONS, goals = GOALS, suggestions = [],
63
+ } = {}) {
52
64
  const els = new Map();
53
65
  const makeEl = () => ({
54
66
  dataset: {}, style: {}, textContent: '', value: '', hidden: false, disabled: false,
@@ -77,9 +89,36 @@ function boot({ search = '', sparks = QUEUE, count = null, idea = SPARK, ideaOk
77
89
  getInboxSparks: async () => { calls.push(['sparks', null]); return { status: 200, ok: true, data: { sparks, count: count == null ? sparks.length : count } }; },
78
90
  getInboxId: async (a) => { calls.push(['idea', a]); return { status: ideaOk ? 200 : 404, ok: ideaOk, data: ideaOk ? { idea } : null }; },
79
91
  postInboxScore: async (a) => { calls.push(['score', a]); return { status: 200, ok: true, data: { score: 60, fields: TEMPLATE.fields.map((f) => ({ key: f.key, substance: 24, floor: 40, ratio: 0.6 })) } }; },
80
- postInbox: async (a) => { calls.push(['capture', a]); return { status: 201, ok: true, data: { idea: { id: '900', grade: 'full', completeness_score: 80 } } }; },
92
+ // task 1003069 (R08) — a quick capture that named a goal comes back
93
+ // ROUTED (the shape captureIdea/routeIdeaToGoal actually returns:
94
+ // idea.routing + a top-level routed_task); one with no goal_id is a
95
+ // quick capture that stayed homeless; anything else is the existing
96
+ // Full Idea fixture the earlier tests in this file already assert on.
97
+ postInbox: async (a) => {
98
+ calls.push(['capture', a]);
99
+ if (a.body && a.body.goal_id != null) {
100
+ return { status: 201, ok: true, data: {
101
+ idea: { id: '910', routing: { routed: true, goal_id: a.body.goal_id, status: 'ready' } },
102
+ routed_task: { id: '5555', goal_id: a.body.goal_id },
103
+ } };
104
+ }
105
+ if (a.body && a.body.kind && !('grade' in a.body)) {
106
+ return { status: 201, ok: true, data: { idea: { id: '911', routing: { routed: false, reason: 'no_goal' } } } };
107
+ }
108
+ return { status: 201, ok: true, data: { idea: { id: '900', grade: 'full', completeness_score: 80 } } };
109
+ },
81
110
  postInboxIdDevelop: async (a) => { calls.push(['develop', a]); return { status: 200, ok: true, data: { idea: { ...idea, grade: 'full', completeness_score: 80, ideator_credit: 5 } } }; },
82
111
  },
112
+ // task 1003069 (R08) — the quick-filing goal picker's reads: the building
113
+ // versions (to scope the suggester) and the open goal list (the picker's
114
+ // browse-all half). Overridable per test via boot({ versions, goals, suggestions }).
115
+ versions: {
116
+ getVersions: async () => { calls.push(['versions', null]); return { status: 200, ok: true, data: { versions } }; },
117
+ },
118
+ goals: {
119
+ getGoals: async () => { calls.push(['goals', null]); return { status: 200, ok: true, data: { goals } }; },
120
+ getGoalsSuggestions: async (a) => { calls.push(['suggest', a]); return { status: 200, ok: true, data: { suggestions } }; },
121
+ },
83
122
  };
84
123
 
85
124
  const toasts = [];
@@ -111,6 +150,7 @@ function boot({ search = '', sparks = QUEUE, count = null, idea = SPARK, ideaOk
111
150
  queueHtml: () => el('fi-queue').innerHTML,
112
151
  fill: () => { for (const f of TEMPLATE.fields) el(`fi-f-${f.key}`).value = `an answer for ${f.key} long enough to count`; },
113
152
  submit: () => el('fi-form')._handlers.submit({ preventDefault() {} }),
153
+ submitQuick: () => el('fq-form')._handlers.submit({ preventDefault() {} }),
114
154
  };
115
155
  }
116
156
 
@@ -196,6 +236,10 @@ await test('filing in develop mode calls the DEVELOP route with no title and no
196
236
  assert.ok(call[1].body.field_values, 'it carries the five answers');
197
237
  assert.ok(!('title' in call[1].body), 'and no title');
198
238
  assert.ok(!('grade' in call[1].body), 'and no grade');
239
+ // task 1003069 (R08) — routing is a QUICK-mode-only affordance; developing a
240
+ // spark always produces a Full Idea (routing.js NEVER_ROUTE_GRADE), so this
241
+ // path must never carry a goal_id even if one happened to be in view.
242
+ assert.ok(!('goal_id' in call[1].body), 'and no goal_id — develop mode never routes');
199
243
  assert.ok(!r.calls.some((c) => c[0] === 'capture'), 'and never files a second idea');
200
244
  });
201
245
 
@@ -259,5 +303,95 @@ await test('the plain composer is unaffected — develop mode is never entered',
259
303
  assert.equal(call[1].body.title, 'a new idea');
260
304
  });
261
305
 
306
+ // --- quick filing: kind + goal picker (task 1003069 / R08, goal 1000071) ---
307
+ //
308
+ // A second, independent capture path on this same page: title + kind +
309
+ // optional body + a goal picker fed by the R07 suggester. It exists beside the
310
+ // Full Idea form rather than inside it — a routed capture must never carry
311
+ // grade='full' (routing.js NEVER_ROUTE_GRADE) — so quick and full cannot share
312
+ // one submit, and it is offered only outside develop mode (developing a spark
313
+ // always produces a Full Idea from someone else's thought, never a fresh
314
+ // lightweight report).
315
+
316
+ await test('the quick-filing section is offered in plain mode and hidden while developing a spark', async () => {
317
+ const plain = boot();
318
+ await settle(); await settle();
319
+ assert.equal(plain.el('fq-compose-scroll').hidden, false);
320
+
321
+ const developing = boot({ search: '?develop=77' });
322
+ await settle(); await settle(); await settle();
323
+ assert.equal(developing.el('fq-compose-scroll').hidden, true);
324
+ });
325
+
326
+ await test('typing a title debounces a call to the goal suggester, scoped to the building version and the kind control', async () => {
327
+ const r = boot({ suggestions: [{ id: '77', title: 'Goal Seventy Seven', score: 4, matched_terms: ['goal'] }] });
328
+ await settle(); await settle();
329
+ r.el('fq-title').value = 'a goal seventy seven problem';
330
+ r.el('fq-title')._handlers.input();
331
+ await new Promise((res) => setTimeout(res, 400));
332
+ const call = r.calls.find((c) => c[0] === 'suggest');
333
+ assert.ok(call, 'the suggester was called');
334
+ assert.equal(call[1].query.version, 'BV1');
335
+ assert.equal(call[1].query.title, 'a goal seventy seven problem');
336
+ assert.equal(call[1].query.kind, 'bug', 'the kind control feeds the suggester too');
337
+ const html = r.el('fq-goal').innerHTML;
338
+ assert.match(html, /No goal \(homeless\)/);
339
+ assert.match(html, /Suggested/);
340
+ assert.match(html, /Goal Seventy Seven/);
341
+ assert.match(html, /Another goal/, 'the full open-goal list is still offered below the suggestion');
342
+ });
343
+
344
+ await test('an empty title refuses locally, without hitting the network', async () => {
345
+ const r = boot();
346
+ await settle(); await settle();
347
+ await r.submitQuick();
348
+ await settle();
349
+ assert.ok(!r.calls.some((c) => c[0] === 'capture'), 'no request was made');
350
+ assert.match(r.el('fq-err').textContent, /title is required/);
351
+ });
352
+
353
+ await test('submitting with no goal picked sends no goal_id — an unrouted response says it went to the inbox', async () => {
354
+ const r = boot();
355
+ await settle(); await settle();
356
+ r.el('fq-title').value = 'a quiet feature idea';
357
+ await r.submitQuick();
358
+ await settle();
359
+ const call = r.calls.find((c) => c[0] === 'capture');
360
+ assert.ok(call, 'POST /inbox was called');
361
+ assert.equal(call[1].body.kind, 'bug', 'bug is the default kind');
362
+ assert.ok(!('goal_id' in call[1].body), 'homeless sends no goal_id at all');
363
+ assert.ok(!('grade' in call[1].body), 'a quick capture carries no grade either');
364
+ assert.equal(r.el('fq-result').textContent, 'Filed to the inbox.');
365
+ });
366
+
367
+ await test('submitting with a goal picked sends goal_id as a NUMBER, and a routed response renders the task link', async () => {
368
+ const r = boot();
369
+ await settle(); await settle();
370
+ r.el('fq-title').value = 'the widget is broken';
371
+ r.el('fq-kind').value = 'bug';
372
+ r.el('fq-goal').value = '77';
373
+ r.el('fq-goal')._handlers.change();
374
+ await r.submitQuick();
375
+ await settle();
376
+ const call = r.calls.find((c) => c[0] === 'capture');
377
+ assert.ok(call);
378
+ assert.equal(call[1].body.goal_id, 77, 'sent as a number — the option carries a string value');
379
+ const html = r.el('fq-result').innerHTML;
380
+ assert.match(html, /task 5555/);
381
+ assert.match(html, /href="\/task\/5555"/);
382
+ assert.match(html, /Goal Seventy Seven/, 'names the goal the task landed in');
383
+ });
384
+
385
+ await test('the kind control travels with the filing', async () => {
386
+ const r = boot();
387
+ await settle(); await settle();
388
+ r.el('fq-title').value = 'clean up the queue module';
389
+ r.el('fq-kind').value = 'refactor';
390
+ await r.submitQuick();
391
+ await settle();
392
+ const call = r.calls.find((c) => c[0] === 'capture');
393
+ assert.equal(call[1].body.kind, 'refactor');
394
+ });
395
+
262
396
  console.log(`\nidea_spark_hall: ${passed} passed, ${failed} failed`);
263
397
  if (failed > 0) process.exit(1);