@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 +15 -15
- package/docs/copy-inventory.md +34 -23
- package/docs/copy-registry.json +136 -36
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/ideas.css +5 -0
- package/modules/hall-ui/public/ideas.html +57 -0
- package/modules/hall-ui/public/ideas.js +173 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/idea_spark_hall.mjs +136 -2
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.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
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:
|
|
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": "
|
|
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": "
|
|
1720
|
+
"sha256": "3fba042999dcbdaa39e07ed2216b157ad6eddff21aed26532efdf64944f999ba"
|
|
1721
1721
|
},
|
|
1722
1722
|
{
|
|
1723
1723
|
"path": "docs/copy-registry.json",
|
|
1724
1724
|
"mode": "0000644",
|
|
1725
|
-
"sha256": "
|
|
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": "
|
|
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": "
|
|
4745
|
+
"sha256": "4da2ff00354a825d32f2f55e3db5f1d18a112ddc9d1056220e73683766b952b3"
|
|
4746
4746
|
},
|
|
4747
4747
|
{
|
|
4748
4748
|
"path": "modules/hall-ui/public/ideas.html",
|
|
4749
4749
|
"mode": "0000644",
|
|
4750
|
-
"sha256": "
|
|
4750
|
+
"sha256": "78c92c2d5468cc2b88662a005af756148293817967f51b06c527fbaba8cb74fa"
|
|
4751
4751
|
},
|
|
4752
4752
|
{
|
|
4753
4753
|
"path": "modules/hall-ui/public/ideas.js",
|
|
4754
4754
|
"mode": "0000644",
|
|
4755
|
-
"sha256": "
|
|
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": "
|
|
7215
|
+
"sha256": "38c8a713cccd40594f0d5016517d008c3dd0970517a7b8da6545ac404d48ed79"
|
|
7216
7216
|
},
|
|
7217
7217
|
{
|
|
7218
7218
|
"path": "package.json",
|
|
7219
7219
|
"mode": "0000644",
|
|
7220
|
-
"sha256": "
|
|
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": "
|
|
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": "
|
|
10490
|
+
"sha256": "ce3e1272e2356707cda86a37010fa5902f132a0d8a7bab48bc00a4432af00933"
|
|
10491
10491
|
},
|
|
10492
10492
|
{
|
|
10493
10493
|
"path": "tests/idea_spark_mark.mjs",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -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
|
-
**
|
|
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 |
|
|
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` —
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
350
|
-
| `11b8266d6aab` | certain | Developing a Big Idea Spark | `modules/hall-ui/public/ideas.html:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"generator": "scripts/gds/copy-inventory.js",
|
|
4
4
|
"goal": 1000074,
|
|
5
5
|
"counts": {
|
|
6
|
-
"strings":
|
|
7
|
-
"unique_ids":
|
|
8
|
-
"certain":
|
|
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":
|
|
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:
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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);
|