@bongos/core 1.19.289 → 1.19.291
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 +25 -20
- package/.claude/skills/idea-triage/SKILL.md +32 -2
- package/docs/copy-inventory.md +15 -13
- package/docs/copy-registry.json +32 -14
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +8 -0
- package/modules/hall-ui/public/task-detail.js +75 -0
- package/package-lock.json +121 -2
- package/package.json +3 -2
- package/scripts/gds/package-core.js +7 -4
- package/scripts/gds/triage.js +98 -7
- package/src/module-api.js +5 -1
- package/tests/cutover_codemod.mjs +1 -1
- package/tests/package_core.mjs +6 -6
- package/tests/promote_goal_id.mjs +316 -0
- package/tests/pruned_lockfile_integrity.mjs +2 -2
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.291",
|
|
6
|
+
"core_contract": "1.19.291",
|
|
7
|
+
"source_commit": "c05eeaf6f713e548b9a30460ce153d4388041ebc",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-22T15:00:29.764Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 320,
|
|
13
13
|
"agent_docs_stubbed": 22,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1389,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1731,
|
|
20
|
+
"tree_sha256": "d46fa302ab0b4aba74a3c947cfc01de0cf9bc482d5fec65df8ea2c518b29153b",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
{
|
|
173
173
|
"path": ".claude/skills/idea-triage/SKILL.md",
|
|
174
174
|
"mode": "0000644",
|
|
175
|
-
"sha256": "
|
|
175
|
+
"sha256": "c74c93659c4576b32d829ebb2774feb8771125b31b677e070841f4cc25ed0232"
|
|
176
176
|
},
|
|
177
177
|
{
|
|
178
178
|
"path": ".claude/skills/ideate/SKILL.md",
|
|
@@ -1437,12 +1437,12 @@
|
|
|
1437
1437
|
{
|
|
1438
1438
|
"path": "docs/copy-inventory.md",
|
|
1439
1439
|
"mode": "0000644",
|
|
1440
|
-
"sha256": "
|
|
1440
|
+
"sha256": "8cb5bb088aae803e6889571712cc4439fc870c88e104b1bb81dbd5fd1f9b9bd3"
|
|
1441
1441
|
},
|
|
1442
1442
|
{
|
|
1443
1443
|
"path": "docs/copy-registry.json",
|
|
1444
1444
|
"mode": "0000644",
|
|
1445
|
-
"sha256": "
|
|
1445
|
+
"sha256": "18599cab2b3de43e33513c20cfaa241d3fe0545b861a27942d7f63d11f646750"
|
|
1446
1446
|
},
|
|
1447
1447
|
{
|
|
1448
1448
|
"path": "docs/design-contract.md",
|
|
@@ -2797,7 +2797,7 @@
|
|
|
2797
2797
|
{
|
|
2798
2798
|
"path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
|
|
2799
2799
|
"mode": "0000644",
|
|
2800
|
-
"sha256": "
|
|
2800
|
+
"sha256": "7faac7fc48e714c76c2b19feaaf9c730b2c9b10ab71ddc5697c21497d02f10ef"
|
|
2801
2801
|
},
|
|
2802
2802
|
{
|
|
2803
2803
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -3632,7 +3632,7 @@
|
|
|
3632
3632
|
{
|
|
3633
3633
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
3634
3634
|
"mode": "0000644",
|
|
3635
|
-
"sha256": "
|
|
3635
|
+
"sha256": "e2c0702ec2eaa2c2d63de4d181f6118295a28e743f0df52722e5e717c3e96b72"
|
|
3636
3636
|
},
|
|
3637
3637
|
{
|
|
3638
3638
|
"path": "modules/hall-ui/public/task-lib.js",
|
|
@@ -4522,12 +4522,12 @@
|
|
|
4522
4522
|
{
|
|
4523
4523
|
"path": "package-lock.json",
|
|
4524
4524
|
"mode": "0000644",
|
|
4525
|
-
"sha256": "
|
|
4525
|
+
"sha256": "7dc929fd01010d29e076564007cdb27b3cfecbf5b2f318f1b045a742d405ab04"
|
|
4526
4526
|
},
|
|
4527
4527
|
{
|
|
4528
4528
|
"path": "package.json",
|
|
4529
4529
|
"mode": "0000644",
|
|
4530
|
-
"sha256": "
|
|
4530
|
+
"sha256": "ccb290e054afd40d91c5058a10cbaae6c3d7c7d18a4afdad65f593825ee1ec4c"
|
|
4531
4531
|
},
|
|
4532
4532
|
{
|
|
4533
4533
|
"path": "public-docs/index.html",
|
|
@@ -5437,7 +5437,7 @@
|
|
|
5437
5437
|
{
|
|
5438
5438
|
"path": "scripts/gds/package-core.js",
|
|
5439
5439
|
"mode": "0000644",
|
|
5440
|
-
"sha256": "
|
|
5440
|
+
"sha256": "2fe4490f873e02e2ade253ff8e63ec70c555ea08b01ab27856deee8af2eb93dc"
|
|
5441
5441
|
},
|
|
5442
5442
|
{
|
|
5443
5443
|
"path": "scripts/gds/paste-token.js",
|
|
@@ -5782,7 +5782,7 @@
|
|
|
5782
5782
|
{
|
|
5783
5783
|
"path": "scripts/gds/triage.js",
|
|
5784
5784
|
"mode": "0000644",
|
|
5785
|
-
"sha256": "
|
|
5785
|
+
"sha256": "1c43db4e69ff4966addd91314638b3b2a0c3f7c91f832f09e4a162e5fd0789aa"
|
|
5786
5786
|
},
|
|
5787
5787
|
{
|
|
5788
5788
|
"path": "scripts/gds/update-channel.js",
|
|
@@ -6172,7 +6172,7 @@
|
|
|
6172
6172
|
{
|
|
6173
6173
|
"path": "src/module-api.js",
|
|
6174
6174
|
"mode": "0000644",
|
|
6175
|
-
"sha256": "
|
|
6175
|
+
"sha256": "4699911082270a5de6b6692df442c0901c6153e2eef39139fdd2118bd5cb4869"
|
|
6176
6176
|
},
|
|
6177
6177
|
{
|
|
6178
6178
|
"path": "src/module-loader/catalog.js",
|
|
@@ -6792,7 +6792,7 @@
|
|
|
6792
6792
|
{
|
|
6793
6793
|
"path": "tests/cutover_codemod.mjs",
|
|
6794
6794
|
"mode": "0000644",
|
|
6795
|
-
"sha256": "
|
|
6795
|
+
"sha256": "827dbb19b8be01a5658b3079620ab977af211a7aaf5b7f82a488bb9715d720fb"
|
|
6796
6796
|
},
|
|
6797
6797
|
{
|
|
6798
6798
|
"path": "tests/dead_deps.mjs",
|
|
@@ -7872,7 +7872,7 @@
|
|
|
7872
7872
|
{
|
|
7873
7873
|
"path": "tests/package_core.mjs",
|
|
7874
7874
|
"mode": "0000644",
|
|
7875
|
-
"sha256": "
|
|
7875
|
+
"sha256": "9bdebe777e63bb2269e528a7ee19194a73610ab9226f59a18fec6fbe18c7a98e"
|
|
7876
7876
|
},
|
|
7877
7877
|
{
|
|
7878
7878
|
"path": "tests/parallel-load.mjs",
|
|
@@ -7964,6 +7964,11 @@
|
|
|
7964
7964
|
"mode": "0000644",
|
|
7965
7965
|
"sha256": "211aa868b86a2b663f5525c3d2ddfa406498d608363d28c0786219d3c0b6e249"
|
|
7966
7966
|
},
|
|
7967
|
+
{
|
|
7968
|
+
"path": "tests/promote_goal_id.mjs",
|
|
7969
|
+
"mode": "0000644",
|
|
7970
|
+
"sha256": "24471b652054a82e985b86fdbbe2dc281114cf9829aed6c9b91348217e7f2460"
|
|
7971
|
+
},
|
|
7967
7972
|
{
|
|
7968
7973
|
"path": "tests/prose_edits.mjs",
|
|
7969
7974
|
"mode": "0000644",
|
|
@@ -8022,7 +8027,7 @@
|
|
|
8022
8027
|
{
|
|
8023
8028
|
"path": "tests/pruned_lockfile_integrity.mjs",
|
|
8024
8029
|
"mode": "0000644",
|
|
8025
|
-
"sha256": "
|
|
8030
|
+
"sha256": "7c24744feee780786c82ac2ed76779e22ccde35e0c4c7ab5894ca4c4bce4bd90"
|
|
8026
8031
|
},
|
|
8027
8032
|
{
|
|
8028
8033
|
"path": "tests/public_landing_projects.mjs",
|
|
@@ -1,10 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: idea-triage
|
|
3
|
-
description: Daily walk through the Bongos idea_inbox —
|
|
3
|
+
description: Daily walk through the Bongos idea_inbox, which since task 1003071 holds only HOMELESS work — bugs and goal-bound captures now route to a task at filing time and never reach the inbox. For each open idea, prompt to promote (→ task, naming a goal), discard, or merge with another idea. Triggers when the user says "/idea-triage", "triage ideas", "review the inbox", "walk the idea inbox", or runs as a scheduled daily task. Metic+ rank only (Metic and Archon; not Xenos).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
You are running the daily idea-triage session for Example. Open ideas in the Bongos `idea_inbox` table get walked one-at-a-time and verdicted, so the inbox doesn't accumulate stale entries.
|
|
7
7
|
|
|
8
|
+
## The inbox is HOMELESS-ONLY now (task 1003071 / R13, goal 1000071)
|
|
9
|
+
|
|
10
|
+
**What changed.** Since R01 (task 1003065) a bug or goal-bound capture ROUTES at
|
|
11
|
+
filing time — it becomes a task in its goal, in one transaction, and never appears
|
|
12
|
+
here. The inbox is therefore no longer "everything anyone filed"; it holds only
|
|
13
|
+
**work with no home yet**. Expect it to be smaller, and read what IS in it as
|
|
14
|
+
work that genuinely needs a decision rather than a queue to clear.
|
|
15
|
+
|
|
16
|
+
**Two consequences for how you run this skill:**
|
|
17
|
+
|
|
18
|
+
1. **Every promote names a goal.** The promote step now asks for one, defaulted
|
|
19
|
+
for you, and `-` opts out explicitly. Take the default unless you disagree with
|
|
20
|
+
it. Opting out is legal but rarely right: a promote with no goal is **not**
|
|
21
|
+
goal-less — the server files it under the version's catch-all `<version> —
|
|
22
|
+
general` goal — and that bucket carries no done-when criteria, so since
|
|
23
|
+
[ADR 0183](../../../docs/adr/<redacted>.md) made criteria
|
|
24
|
+
close themselves off LINKED tasks, work parked there can never advance
|
|
25
|
+
anything. The general bucket used to be the silent default; it is now a choice
|
|
26
|
+
you type.
|
|
27
|
+
2. **The default is inherited, not guessed, when a hint exists.** Precedence is
|
|
28
|
+
the stored `suggested_goal_id` (written at capture precisely so triage inherits
|
|
29
|
+
the guess) FIRST, then the R07 suggester (`GET /goals/suggestions`). When the
|
|
30
|
+
suggester supplies it you are shown the score and the matched terms — check
|
|
31
|
+
them: token overlap can match an incidental word, so a low score with one
|
|
32
|
+
matched term is weak evidence, not a recommendation.
|
|
33
|
+
|
|
34
|
+
**If an idea should have routed at filing and didn't**, that is worth noticing
|
|
35
|
+
rather than just promoting past: it usually means the filer named no goal, and the
|
|
36
|
+
capture-time suggester (R08/R09/R11 surfaces) is where the fix belongs.
|
|
37
|
+
|
|
8
38
|
> **This skill is no longer the only way to triage.** Since task 1002447 a Metic+ builder can promote, discard and merge from the **hall** — the Home "Needs your attention" card's idea rows each carry a *Triage* verb that opens the record overlay, where all three forms live. No Claude session involved. What this skill adds over the hall is the **parallel development pass** (Step 1.5) — an idea fleshed out into open questions/risks before the verdict — so reach for it when the queue needs judgment, and use the hall when it just needs clearing.
|
|
9
39
|
|
|
10
40
|
## Rank gate — Metic+ only
|
|
@@ -70,7 +100,7 @@ node scripts/gds/triage.js --development "${TMPDIR:-/tmp}/otb-idea-development.j
|
|
|
70
100
|
|
|
71
101
|
`triage.js` prints each idea's developed block above its verdict prompt. It never *generates* the analysis (that's this skill's subagent fan-out) — it only displays what the cache holds, and runs exactly as before when no cache is present.
|
|
72
102
|
|
|
73
|
-
> **Not in this cut (follow-up leg).** The next step is to let the Archon push the developed `open_questions` *back to the submitter* — a round-trip in the Discord `#ideas` thread / DM before promotion — so the submitter says how they'd want it integrated. That needs the Discord bot interaction + idea↔thread linking (idea
|
|
103
|
+
> **Not in this cut (follow-up leg).** The next step is to let the Archon push the developed `open_questions` *back to the submitter* — a round-trip in the Discord `#ideas` thread / DM before promotion — so the submitter says how they'd want it integrated. That needs the Discord bot interaction + idea↔thread linking (idea `#216` / [ADR 0033](../../../docs/adr/<redacted>.md)) and is tracked separately. For now the open questions are answered by the Archon in-session.
|
|
74
104
|
|
|
75
105
|
**Step 2 — walk the list, idea by idea.**
|
|
76
106
|
|
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
|
+
**1339 strings** across 3 surfaces · 1188 distinct pieces of copy · 1339 certain, 0 heuristic · 121 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` | 61 |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 61 | 1055 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 98 |
|
|
15
15
|
| `landing` | `public-landing` | 2 | 186 |
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `7775fec0fa85` | 2x | Could not load sessions. | modules/hall-ui/public/sessions.js:168, modules/hall-ui/public/sessions.js:207 |
|
|
79
79
|
| … | | _81 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1055 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -326,7 +326,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
326
326
|
| `7f600651bbf1` | certain | Couldn’t load your projects right now. | `modules/hall-ui/public/my-projects.js:115` |
|
|
327
327
|
| `38827a954f3b` | certain | Create a custom rank first. | `modules/hall-ui/public/government.js:397` |
|
|
328
328
|
| `dd8ead7adc9a` | certain | Create rank | `modules/hall-ui/public/government.html:62` |
|
|
329
|
-
| `d7beb841395e` | certain | Create task | `modules/hall-ui/public/task-detail.js:
|
|
329
|
+
| `d7beb841395e` | certain | Create task | `modules/hall-ui/public/task-detail.js:354` |
|
|
330
330
|
| `533f24219487` | certain | Create your | `modules/hall-ui/public/builders.js:984` |
|
|
331
331
|
| `e91a4d2e3e1c` | certain | Created rank {…}. | `modules/hall-ui/public/government.js:380` |
|
|
332
332
|
| `5968d13a9dbe` | certain | Criteria met — awaiting review | `modules/hall-ui/public/goals-page.js:341` |
|
|
@@ -364,7 +364,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
364
364
|
| `854a21d2eb39` | certain | Eight achievements recognize sustained contribution. Earned ones are highlighted; the rest show what’s left to | `modules/hall-ui/public/hall-widgets.js:197` |
|
|
365
365
|
| `58d381535285` | certain | Engagement reports | `modules/hall-ui/public/watch.html:120` |
|
|
366
366
|
| `35d1ae09a6b3` | certain | Enter a project URL. | `modules/hall-ui/public/my-projects.js:122` |
|
|
367
|
-
| `bd7a40639a1c` | certain | Estimate (min) | `modules/hall-ui/public/task-detail.js:
|
|
367
|
+
| `bd7a40639a1c` | certain | Estimate (min) | `modules/hall-ui/public/task-detail.js:349` |
|
|
368
368
|
| `c15d1f0ddfb6` | certain | Estimation accuracy | `modules/hall-ui/public/watch.html:133` |
|
|
369
369
|
| `44f928d13699` | certain | Event sounds | `modules/hall-ui/public/settings.html:282` |
|
|
370
370
|
| `8690c6424585` | certain | Every builder in {{worldName}} — rank, {{currency}}, karma, and active claims. | `modules/hall-ui/public/watch.html:61` |
|
|
@@ -387,7 +387,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
387
387
|
| `b9267033b1f1` | certain | Flag this copy | `modules/hall-ui/public/copy-desk.html:87` |
|
|
388
388
|
| `448d00771dc8` | certain | Flagged. It is in the queue. | `modules/hall-ui/public/copy-desk.js:281` |
|
|
389
389
|
| `617f13fa3fdb` | certain | Flip the switch. | `modules/hall-ui/public/builders.js:984` |
|
|
390
|
-
| `42cee5cb3584` | certain | Fold this idea into # | `modules/hall-ui/public/task-detail.js:
|
|
390
|
+
| `42cee5cb3584` | certain | Fold this idea into # | `modules/hall-ui/public/task-detail.js:444` |
|
|
391
391
|
| `647bcfcfdb03` | certain | Fresh CLI token issued. Paste it in your terminal: | `modules/hall-ui/public/settings.js:885` |
|
|
392
392
|
| `55c71d76a94c` | certain | From creation to production — and the exact step where {{currency}} are awarded (at | `modules/hall-ui/public/diagrams.html:61` |
|
|
393
393
|
| `a025080147a1` | certain | Full Idea | `modules/hall-ui/public/government.js:669` |
|
|
@@ -490,7 +490,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
490
490
|
| `0f9f86c556a2` | certain | Loading the primer… | `modules/hall-ui/public/primer.html:55` |
|
|
491
491
|
| `ceec2218efe3` | certain | Loading the roadmap… | `modules/hall-ui/public/roadmap.html:24` |
|
|
492
492
|
| `ceec2218efe3` | certain | Loading the roadmap… | `modules/hall-ui/public/roadmap.html:29` |
|
|
493
|
-
| `d28d321e8a1e` | certain | Loading versions… | `modules/hall-ui/public/task-detail.js:
|
|
493
|
+
| `d28d321e8a1e` | certain | Loading versions… | `modules/hall-ui/public/task-detail.js:307` |
|
|
494
494
|
| `3c43f157035e` | certain | Loading your goals… | `modules/hall-ui/public/goals.js:95` |
|
|
495
495
|
| `7a239a17afc8` | certain | Loading your preferences… | `modules/hall-ui/public/settings.html:26` |
|
|
496
496
|
| `04df1bd30129` | certain | Loading your rank… | `modules/hall-ui/public/ranks.html:23` |
|
|
@@ -564,7 +564,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
564
564
|
| `2c19f41704b9` | certain | Not yet available — {{worldName}} | `modules/hall-ui/public/not-ready.html:6` |
|
|
565
565
|
| `2c19f41704b9` | certain | Not yet available — {{worldName}} | `modules/hall-ui/public/not-ready.html:6` |
|
|
566
566
|
| `571b9b22dbda` | certain | Not yet ready — blocked by dependencies or awaiting promotion. These become claimable when their blockers ship | `modules/hall-ui/public/work.html:87` |
|
|
567
|
-
| `0c59d118db9b` | certain | Note (optional) | `modules/hall-ui/public/task-detail.js:
|
|
567
|
+
| `0c59d118db9b` | certain | Note (optional) | `modules/hall-ui/public/task-detail.js:447` |
|
|
568
568
|
| `95f8f8a4b288` | certain | Nothing flagged here. That is either good news or an unread queue — the duplicates below are the cheapest plac | `modules/hall-ui/public/copy-desk.js:172` |
|
|
569
569
|
| `fec5d78497e8` | certain | Nothing in the backlog right now. | `modules/hall-ui/public/work.js:953` |
|
|
570
570
|
| `18ce0723be0d` | certain | Nothing is waiting — no held changes need your approval. | `modules/hall-ui/public/gate.js:188` |
|
|
@@ -642,7 +642,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
642
642
|
| `26e6c9879035` | certain | Reading the diagrams | `modules/hall-ui/public/diagrams.html:48` |
|
|
643
643
|
| `81cd2cdf954d` | certain | Reading the request… | `modules/hall-ui/public/pair.html:23` |
|
|
644
644
|
| `5b581cca590f` | certain | Ready — tasks to do | `modules/hall-ui/public/work.html:53` |
|
|
645
|
-
| `9ea556e7b78b` | certain | Reason (optional) | `modules/hall-ui/public/task-detail.js:
|
|
645
|
+
| `9ea556e7b78b` | certain | Reason (optional) | `modules/hall-ui/public/task-detail.js:498` |
|
|
646
646
|
| `7df3fd4ebf41` | certain | Reason (shown to the builder) | `modules/hall-ui/public/harbor.js:146` |
|
|
647
647
|
| `06cbba1440b1` | certain | Rebase owed — new claims paused | `modules/hall-ui/public/builders.js:752` |
|
|
648
648
|
| `58fb6fe4b47e` | certain | Recent history could not be loaded right now. | `modules/hall-ui/public/work.js:1052` |
|
|
@@ -974,7 +974,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
974
974
|
| `06aab18fc3b5` | certain | holds the repo. Follow the numbered path to see how a credential-less box gets its work to prod. This is the l | `modules/hall-ui/public/diagrams.html:83` |
|
|
975
975
|
| `17ab8db79e1f` | certain | holds the worker, the code, and your local memory; the | `modules/hall-ui/public/diagrams.html:83` |
|
|
976
976
|
| `7d5cbe3d81e4` | certain | how long a vote stays open | `modules/hall-ui/public/government.html:40` |
|
|
977
|
-
| `dacb901c4f10` | certain | idea number | `modules/hall-ui/public/task-detail.js:
|
|
977
|
+
| `dacb901c4f10` | certain | idea number | `modules/hall-ui/public/task-detail.js:445` |
|
|
978
978
|
| `b2b399fdd6a4` | certain | in progress | `modules/hall-ui/public/goals-page.js:423` |
|
|
979
979
|
| `b2b399fdd6a4` | certain | in progress | `modules/hall-ui/public/roadmap.js:108` |
|
|
980
980
|
| `b2b399fdd6a4` | certain | in progress | `modules/hall-ui/public/roadmap.js:194` |
|
|
@@ -987,6 +987,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
987
987
|
| `c767b3e07826` | certain | is only the screen; the | `modules/hall-ui/public/diagrams.html:83` |
|
|
988
988
|
| `aa530bd15088` | certain | itself). The registry stays the single source of truth for what the hall shows; a fitness check (scripts/gds/f | `modules/hall-ui/public/index.html:44` |
|
|
989
989
|
| `d46875348b9c` | certain | ladder · read-only | `modules/hall-ui/public/government.js:116` |
|
|
990
|
+
| `2ce7738b1eb0` | certain | loading goals… | `modules/hall-ui/public/task-detail.js:371` |
|
|
990
991
|
| `8c22f0ee5edb` | certain | looked at | `modules/hall-ui/public/copy-desk.js:114` |
|
|
991
992
|
| `754bdec368ed` | certain | lowest credits | `modules/hall-ui/public/hall-widgets.js:136` |
|
|
992
993
|
| `cffba8409070` | certain | manage its visibility in Settings → Cross-project record | `modules/hall-ui/public/profile.js:200` |
|
|
@@ -1053,8 +1054,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1053
1054
|
| `1651cb1876f5` | certain | who sits on the board | `modules/hall-ui/public/government.html:40` |
|
|
1054
1055
|
| `4109de2e0bb9` | certain | whole surface | `modules/hall-ui/public/copy-desk.js:88` |
|
|
1055
1056
|
| `4109de2e0bb9` | certain | whole surface | `modules/hall-ui/public/copy-desk.js:251` |
|
|
1056
|
-
| `143f77e2b782` | certain | why these are the same | `modules/hall-ui/public/task-detail.js:
|
|
1057
|
-
| `ec7c228cb4ce` | certain | why this isn’t worth doing | `modules/hall-ui/public/task-detail.js:
|
|
1057
|
+
| `143f77e2b782` | certain | why these are the same | `modules/hall-ui/public/task-detail.js:448` |
|
|
1058
|
+
| `ec7c228cb4ce` | certain | why this isn’t worth doing | `modules/hall-ui/public/task-detail.js:499` |
|
|
1058
1059
|
| `66d979d0db89` | certain | your vote | `modules/hall-ui/public/government.js:691` |
|
|
1059
1060
|
| `7e2f2aac0645` | certain | {…} You always see your own numbers here. | `modules/hall-ui/public/settings.js:580` |
|
|
1060
1061
|
| `43b99dd1b755` | certain | {…} You can also ask in Discord #support. | `modules/hall-ui/public/box-panel.js:358` |
|
|
@@ -1104,6 +1105,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1104
1105
|
| `cbd220dd9184` | certain | — a later push must be re-approved. | `modules/hall-ui/public/gate.js:87` |
|
|
1105
1106
|
| `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:1692` |
|
|
1106
1107
|
| `729d4ce22b99` | certain | — any — | `modules/hall-ui/public/hall-widgets.js:132` |
|
|
1108
|
+
| `9ac518dfa95e` | certain | — none (the version's general bucket) — | `modules/hall-ui/public/task-detail.js:302` |
|
|
1107
1109
|
| `da9962dc1729` | certain | — or open any diagram fullscreen. | `modules/hall-ui/public/diagrams.html:42` |
|
|
1108
1110
|
| `d4ff85363f89` | certain | — so if Claude Desktop then says | `modules/hall-ui/public/box-panel.js:160` |
|
|
1109
1111
|
| `e5c5e94152b3` | certain | — that's all the tooling you need up front. | `modules/hall-ui/public/builders.js:1051` |
|
|
@@ -1122,7 +1124,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1122
1124
|
| `7926e30955d2` | certain | ← Back to goal | `modules/hall-ui/public/goals.html:163` |
|
|
1123
1125
|
| `7926e30955d2` | certain | ← Back to goal | `modules/hall-ui/public/goals.html:175` |
|
|
1124
1126
|
| `1e7cf7b1e64e` | certain | ← Newer | `modules/hall-ui/public/sessions.html:56` |
|
|
1125
|
-
| `2180e0ecf138` | certain | → no idea # | `modules/hall-ui/public/task-detail.js:
|
|
1127
|
+
| `2180e0ecf138` | certain | → no idea # | `modules/hall-ui/public/task-detail.js:466` |
|
|
1126
1128
|
| `d5d76f1c0dfe` | certain | ○ reserved | `modules/hall-ui/public/diagrams.html:53` |
|
|
1127
1129
|
| `97b0773e72a5` | certain | ● LIVE | `modules/hall-ui/public/diagrams.html:51` |
|
|
1128
1130
|
| `1375334c77f6` | certain | ⚠ This box is running | `modules/hall-ui/public/box-panel.js:202` |
|
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": 1339,
|
|
7
|
+
"unique_ids": 1188,
|
|
8
|
+
"certain": 1339,
|
|
9
9
|
"heuristic": 0,
|
|
10
10
|
"duplicate_ids": 121
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"builders-hall": {
|
|
14
14
|
"at": "modules/hall-ui/public",
|
|
15
15
|
"files": 61,
|
|
16
|
-
"strings":
|
|
16
|
+
"strings": 1055
|
|
17
17
|
},
|
|
18
18
|
"status-dashboard": {
|
|
19
19
|
"at": "modules/status-ui/public",
|
|
@@ -3481,7 +3481,7 @@
|
|
|
3481
3481
|
"surface": "builders-hall",
|
|
3482
3482
|
"text": "Create task",
|
|
3483
3483
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
3484
|
-
"line":
|
|
3484
|
+
"line": 354,
|
|
3485
3485
|
"origin": "js-markup",
|
|
3486
3486
|
"confidence": "certain"
|
|
3487
3487
|
},
|
|
@@ -3823,7 +3823,7 @@
|
|
|
3823
3823
|
"surface": "builders-hall",
|
|
3824
3824
|
"text": "Estimate (min)",
|
|
3825
3825
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
3826
|
-
"line":
|
|
3826
|
+
"line": 349,
|
|
3827
3827
|
"origin": "js-markup",
|
|
3828
3828
|
"confidence": "certain"
|
|
3829
3829
|
},
|
|
@@ -4030,7 +4030,7 @@
|
|
|
4030
4030
|
"surface": "builders-hall",
|
|
4031
4031
|
"text": "Fold this idea into #",
|
|
4032
4032
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
4033
|
-
"line":
|
|
4033
|
+
"line": 444,
|
|
4034
4034
|
"origin": "js-markup",
|
|
4035
4035
|
"confidence": "certain"
|
|
4036
4036
|
},
|
|
@@ -4957,7 +4957,7 @@
|
|
|
4957
4957
|
"surface": "builders-hall",
|
|
4958
4958
|
"text": "Loading versions…",
|
|
4959
4959
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
4960
|
-
"line":
|
|
4960
|
+
"line": 307,
|
|
4961
4961
|
"origin": "js-markup",
|
|
4962
4962
|
"confidence": "certain"
|
|
4963
4963
|
},
|
|
@@ -5623,7 +5623,7 @@
|
|
|
5623
5623
|
"surface": "builders-hall",
|
|
5624
5624
|
"text": "Note (optional)",
|
|
5625
5625
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
5626
|
-
"line":
|
|
5626
|
+
"line": 447,
|
|
5627
5627
|
"origin": "js-markup",
|
|
5628
5628
|
"confidence": "certain"
|
|
5629
5629
|
},
|
|
@@ -6325,7 +6325,7 @@
|
|
|
6325
6325
|
"surface": "builders-hall",
|
|
6326
6326
|
"text": "Reason (optional)",
|
|
6327
6327
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
6328
|
-
"line":
|
|
6328
|
+
"line": 498,
|
|
6329
6329
|
"origin": "js-markup",
|
|
6330
6330
|
"confidence": "certain"
|
|
6331
6331
|
},
|
|
@@ -9313,7 +9313,7 @@
|
|
|
9313
9313
|
"surface": "builders-hall",
|
|
9314
9314
|
"text": "idea number",
|
|
9315
9315
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
9316
|
-
"line":
|
|
9316
|
+
"line": 445,
|
|
9317
9317
|
"origin": "js-markup",
|
|
9318
9318
|
"confidence": "certain"
|
|
9319
9319
|
},
|
|
@@ -9425,6 +9425,15 @@
|
|
|
9425
9425
|
"origin": "js-markup",
|
|
9426
9426
|
"confidence": "certain"
|
|
9427
9427
|
},
|
|
9428
|
+
{
|
|
9429
|
+
"id": "2ce7738b1eb0",
|
|
9430
|
+
"surface": "builders-hall",
|
|
9431
|
+
"text": "loading goals…",
|
|
9432
|
+
"file": "modules/hall-ui/public/task-detail.js",
|
|
9433
|
+
"line": 371,
|
|
9434
|
+
"origin": "js-markup",
|
|
9435
|
+
"confidence": "certain"
|
|
9436
|
+
},
|
|
9428
9437
|
{
|
|
9429
9438
|
"id": "8c22f0ee5edb",
|
|
9430
9439
|
"surface": "builders-hall",
|
|
@@ -10024,7 +10033,7 @@
|
|
|
10024
10033
|
"surface": "builders-hall",
|
|
10025
10034
|
"text": "why these are the same",
|
|
10026
10035
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
10027
|
-
"line":
|
|
10036
|
+
"line": 448,
|
|
10028
10037
|
"origin": "js-markup",
|
|
10029
10038
|
"confidence": "certain"
|
|
10030
10039
|
},
|
|
@@ -10033,7 +10042,7 @@
|
|
|
10033
10042
|
"surface": "builders-hall",
|
|
10034
10043
|
"text": "why this isn’t worth doing",
|
|
10035
10044
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
10036
|
-
"line":
|
|
10045
|
+
"line": 499,
|
|
10037
10046
|
"origin": "js-markup",
|
|
10038
10047
|
"confidence": "certain"
|
|
10039
10048
|
},
|
|
@@ -10478,6 +10487,15 @@
|
|
|
10478
10487
|
"origin": "js-markup",
|
|
10479
10488
|
"confidence": "certain"
|
|
10480
10489
|
},
|
|
10490
|
+
{
|
|
10491
|
+
"id": "9ac518dfa95e",
|
|
10492
|
+
"surface": "builders-hall",
|
|
10493
|
+
"text": "— none (the version's general bucket) —",
|
|
10494
|
+
"file": "modules/hall-ui/public/task-detail.js",
|
|
10495
|
+
"line": 302,
|
|
10496
|
+
"origin": "js-markup",
|
|
10497
|
+
"confidence": "certain"
|
|
10498
|
+
},
|
|
10481
10499
|
{
|
|
10482
10500
|
"id": "da9962dc1729",
|
|
10483
10501
|
"surface": "builders-hall",
|
|
@@ -10645,7 +10663,7 @@
|
|
|
10645
10663
|
"surface": "builders-hall",
|
|
10646
10664
|
"text": "→ no idea #",
|
|
10647
10665
|
"file": "modules/hall-ui/public/task-detail.js",
|
|
10648
|
-
"line":
|
|
10666
|
+
"line": 466,
|
|
10649
10667
|
"origin": "js-text-assign",
|
|
10650
10668
|
"confidence": "certain"
|
|
10651
10669
|
},
|
|
@@ -278,6 +278,8 @@ function createClient(opts = {}) {
|
|
|
278
278
|
postDiscordChannelsReconcile: (args) => request("POST", "/discord/channels/reconcile", { hasBody: true }, args),
|
|
279
279
|
},
|
|
280
280
|
"doneWhen": {
|
|
281
|
+
// PATCH /done-when/{criterionId} — rank: metic+archon — PATCH /done-when/:criterionId
|
|
282
|
+
patchDoneWhenCriterionId: (args) => request("PATCH", "/done-when/{criterionId}", { hasBody: true }, args),
|
|
281
283
|
// POST /done-when/{criterionId}/satisfy — rank: metic+archon — POST /done-when/:criterionId/satisfy
|
|
282
284
|
postDoneWhenCriterionIdSatisfy: (args) => request("POST", "/done-when/{criterionId}/satisfy", { hasBody: true }, args),
|
|
283
285
|
// POST /done-when/{criterionId}/unsatisfy — rank: metic+archon — POST /done-when/:criterionId/unsatisfy
|
|
@@ -308,6 +310,8 @@ function createClient(opts = {}) {
|
|
|
308
310
|
postGoals: (args) => request("POST", "/goals", { hasBody: true }, args),
|
|
309
311
|
// GET /goals/{id} — rank: any-builder — GET /goals/:id
|
|
310
312
|
getGoalsId: (args) => request("GET", "/goals/{id}", { hasBody: false }, args),
|
|
313
|
+
// PATCH /goals/{id} — rank: any-builder — PATCH /goals/:id
|
|
314
|
+
patchGoalsId: (args) => request("PATCH", "/goals/{id}", { hasBody: true }, args),
|
|
311
315
|
// POST /goals/{id}/archive — rank: metic+archon — POST /goals/:id/archive
|
|
312
316
|
postGoalsIdArchive: (args) => request("POST", "/goals/{id}/archive", { hasBody: true }, args),
|
|
313
317
|
// GET /goals/{id}/conflicts — rank: any-builder — GET /goals/:id/conflicts
|
|
@@ -350,6 +354,8 @@ function createClient(opts = {}) {
|
|
|
350
354
|
getGoalsInbox: (args) => request("GET", "/goals/inbox", { hasBody: false }, args),
|
|
351
355
|
// POST /goals/reorder — rank: metic+archon — POST /goals/reorder
|
|
352
356
|
postGoalsReorder: (args) => request("POST", "/goals/reorder", { hasBody: true }, args),
|
|
357
|
+
// GET /goals/suggestions — rank: any-builder — GET /goals/suggestions
|
|
358
|
+
getGoalsSuggestions: (args) => request("GET", "/goals/suggestions", { hasBody: false }, args),
|
|
353
359
|
},
|
|
354
360
|
"government": {
|
|
355
361
|
// GET /government/assignments — rank: archon — GET /government/assignments
|
|
@@ -396,6 +402,8 @@ function createClient(opts = {}) {
|
|
|
396
402
|
getInboxId: (args) => request("GET", "/inbox/{id}", { hasBody: false }, args),
|
|
397
403
|
// PATCH /inbox/{id} — rank: metic+archon — PATCH /inbox/:id
|
|
398
404
|
patchInboxId: (args) => request("PATCH", "/inbox/{id}", { hasBody: true }, args),
|
|
405
|
+
// PATCH /inbox/{id}/body — rank: any-builder — PATCH /inbox/:id/body
|
|
406
|
+
patchInboxIdBody: (args) => request("PATCH", "/inbox/{id}/body", { hasBody: true }, args),
|
|
399
407
|
// POST /inbox/{id}/ratify — rank: metic+archon — POST /inbox/:id/ratify
|
|
400
408
|
postInboxIdRatify: (args) => request("POST", "/inbox/{id}/ratify", { hasBody: true }, args),
|
|
401
409
|
// POST /inbox/{id}/resubmit — rank: any-builder — POST /inbox/:id/resubmit
|
|
@@ -254,6 +254,55 @@
|
|
|
254
254
|
+ '</div>';
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
+
// task 1003071 (R13) — the goal picker's options, same precedence as the CLI
|
|
258
|
+
// triage path: the STORED hint (idea.suggested_goal_id, written by
|
|
259
|
+
// inbox.captureIdea precisely so triage inherits the guess) wins; the R07
|
|
260
|
+
// suggester only fills in when there is no hint. Returns option HTML.
|
|
261
|
+
async function goalOptionsFor(versionId) {
|
|
262
|
+
// Number() so a junk stored value cannot reach the DOM as value="NaN" and
|
|
263
|
+
// then be POSTed as a goal id.
|
|
264
|
+
var raw = Number(idea.suggested_goal_id);
|
|
265
|
+
var hint = Number.isFinite(raw) && raw > 0 ? raw : null;
|
|
266
|
+
var suggestions = [];
|
|
267
|
+
// The suggester is a convenience, so an outage degrades to "no suggestions"
|
|
268
|
+
// and must not stop a triage verdict — the hint and the opt-out below are
|
|
269
|
+
// both still reachable without it.
|
|
270
|
+
try {
|
|
271
|
+
var q = '?version=' + encodeURIComponent(versionId)
|
|
272
|
+
+ '&title=' + encodeURIComponent(idea.title || '')
|
|
273
|
+
+ '&body=' + encodeURIComponent(String(idea.body_md || '').slice(0, 2000))
|
|
274
|
+
+ '&limit=5';
|
|
275
|
+
// softAuth: a cosmetic suggestion list must not navigate the builder away
|
|
276
|
+
// from a half-filled promote form. The submit re-auths if the session died.
|
|
277
|
+
var res = await getJSON(API + '/goals/suggestions' + q, { softAuth: true });
|
|
278
|
+
suggestions = (res && res.suggestions) || [];
|
|
279
|
+
} catch (_) { suggestions = []; }
|
|
280
|
+
var opts = [];
|
|
281
|
+
var seen = {};
|
|
282
|
+
if (hint != null) {
|
|
283
|
+
seen[hint] = true;
|
|
284
|
+
opts.push('<option value="' + hint + '" selected>goal ' + hint + ' — carried from the filing</option>');
|
|
285
|
+
}
|
|
286
|
+
suggestions.forEach(function (g, i) {
|
|
287
|
+
if (seen[g.id]) return;
|
|
288
|
+
seen[g.id] = true;
|
|
289
|
+
var why = (g.matched_terms || []).join(', ');
|
|
290
|
+
// The score + matched terms are shown on purpose: token overlap can match
|
|
291
|
+
// an incidental word, so the operator judges the suggestion rather than
|
|
292
|
+
// trusting it (task 1003062's stated limit).
|
|
293
|
+
opts.push('<option value="' + esc(String(g.id)) + '"' + (hint == null && i === 0 ? ' selected' : '') + '>'
|
|
294
|
+
+ esc(String(g.id)) + ' — ' + esc(g.title || '') + (why ? ' (matched: ' + esc(why) + ')' : '') + '</option>');
|
|
295
|
+
});
|
|
296
|
+
// Always offer the opt-out, and make it the fallback when nothing was found.
|
|
297
|
+
// Sending no goal_id does not create a goal-less task — db.createTask files
|
|
298
|
+
// it under the version's catch-all "general" goal — so the label names where
|
|
299
|
+
// it actually lands. That bucket carries no done-when criteria, which is why
|
|
300
|
+
// it should be a choice rather than the silent default it used to be.
|
|
301
|
+
opts.push('<option value=""' + (opts.length === 0 ? ' selected' : '')
|
|
302
|
+
+ '>— none (the version\'s general bucket) —</option>');
|
|
303
|
+
return opts.join('');
|
|
304
|
+
}
|
|
305
|
+
|
|
257
306
|
async function renderPromote() {
|
|
258
307
|
box.innerHTML = '<p class="deeplink-card__note">Loading versions…</p>';
|
|
259
308
|
// Both dead ends offer the way back through the same delegated [data-go]
|
|
@@ -283,6 +332,10 @@
|
|
|
283
332
|
// CHECKed 1-5, so clamp rather than let an out-of-range value match no
|
|
284
333
|
// option and leave the browser silently defaulting to P1.
|
|
285
334
|
var pri = Math.min(5, Math.max(1, Number(idea.suggested_priority) || 3));
|
|
335
|
+
// Fetched for the PREFERRED version; the change listener below re-fetches,
|
|
336
|
+
// because goals belong to a version and showing another version's goals
|
|
337
|
+
// would offer a home the server would reject.
|
|
338
|
+
var goalOptions = await goalOptionsFor(preferred);
|
|
286
339
|
var priOptions = [1, 2, 3, 4, 5].map(function (p) {
|
|
287
340
|
return '<option value="' + p + '"' + (p === pri ? ' selected' : '') + '>P' + p + '</option>';
|
|
288
341
|
}).join('');
|
|
@@ -291,6 +344,7 @@
|
|
|
291
344
|
+ '<label class="td-field td-field--wide"><span>Title</span>'
|
|
292
345
|
+ '<input type="text" name="title" maxlength="' + TITLE_MAX + '" required value="' + esc(idea.title || '') + '"></label>'
|
|
293
346
|
+ '<label class="td-field td-field--wide"><span>Version</span><select name="version">' + options + '</select></label>'
|
|
347
|
+
+ '<label class="td-field td-field--wide"><span>Goal</span><select name="goal" data-goal-select>' + goalOptions + '</select></label>'
|
|
294
348
|
+ '<label class="td-field"><span>Priority</span><select name="priority">' + priOptions + '</select></label>'
|
|
295
349
|
+ '<label class="td-field"><span>Estimate (min)</span>'
|
|
296
350
|
+ '<input type="number" name="est" min="0" max="100000" step="5" placeholder="—"></label>'
|
|
@@ -304,6 +358,23 @@
|
|
|
304
358
|
ev.preventDefault();
|
|
305
359
|
submitPromote(ev.target);
|
|
306
360
|
});
|
|
361
|
+
// Re-fetch the goal list when the version changes (task 1003071). Two quick
|
|
362
|
+
// changes race — the fetches can resolve out of order — so only the newest
|
|
363
|
+
// request is allowed to write, and only it re-enables the control.
|
|
364
|
+
var vsel = box.querySelector('select[name="version"]');
|
|
365
|
+
var gsel = box.querySelector('[data-goal-select]');
|
|
366
|
+
if (vsel && gsel) {
|
|
367
|
+
var goalFetch = 0;
|
|
368
|
+
vsel.addEventListener('change', async function () {
|
|
369
|
+
var mine = ++goalFetch;
|
|
370
|
+
gsel.disabled = true;
|
|
371
|
+
gsel.innerHTML = '<option value="">loading goals…</option>';
|
|
372
|
+
var html = await goalOptionsFor(vsel.value);
|
|
373
|
+
if (mine !== goalFetch) return;
|
|
374
|
+
gsel.innerHTML = html;
|
|
375
|
+
gsel.disabled = false;
|
|
376
|
+
});
|
|
377
|
+
}
|
|
307
378
|
}
|
|
308
379
|
|
|
309
380
|
async function submitPromote(form) {
|
|
@@ -325,6 +396,10 @@
|
|
|
325
396
|
source: 'idea_inbox',
|
|
326
397
|
source_ref: 'idea:' + idea.id,
|
|
327
398
|
};
|
|
399
|
+
// task 1003071 (R13): the whole point — a triaged promotion NAMES its goal.
|
|
400
|
+
// Empty means the operator chose the version's general bucket, which the
|
|
401
|
+
// server applies itself when goal_id is absent.
|
|
402
|
+
if (form.goal && form.goal.value !== '') payload.goal_id = Number(form.goal.value);
|
|
328
403
|
if (form.est.value !== '') payload.est_minutes = Number(form.est.value);
|
|
329
404
|
if (form.credits.value !== '') payload.credits_reward = Number(form.credits.value);
|
|
330
405
|
// 'criterion-proposal' is an idea-only kind; everything else is shared with
|