@bongos/core 1.21.107 → 1.21.109
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 +43 -38
- package/.claude/skills/goal-create/SKILL.md +9 -4
- package/.claude/skills/idea-triage/SKILL.md +1 -1
- package/.claude/skills/planning-session/SKILL.md +22 -9
- package/docs/copy-inventory.md +25 -19
- package/docs/copy-registry.json +92 -37
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +189 -188
- package/modules/copy-desk/docx.js +27 -7
- package/modules/copy-desk/page-status.js +3 -1
- package/modules/copy-desk/pages.js +44 -5
- package/modules/copy-desk/routes/copy-desk.js +4 -3
- package/modules/copy-desk/tests/copy_docx.mjs +38 -0
- package/modules/copy-desk/tests/copy_page_draft.mjs +79 -0
- package/modules/hall-ui/public/paintbrush.js +152 -12
- package/modules/hall-ui/public/studio.js +3 -1
- package/modules/hall-ui/public/style.css +16 -0
- package/modules/hall-ui/public/tweak-editor-lib.js +24 -12
- package/modules/hall-ui/records/craft-mode.md +5 -0
- package/modules/hall-ui/records/tweak-editor.md +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +20 -0
- package/scripts/gds/seed-bv2-ideator-surface-tasks.js +12 -21
- package/scripts/gds/seed-verify-criteria.js +73 -18
- package/scripts/hall-preview/server.js +12 -1
- package/src/module-api.js +1 -1
- package/tests/copy_desk_page_submit.mjs +36 -0
- package/tests/hall_preview_encoded_paths.mjs +81 -0
- package/tests/hall_tweak_editor.mjs +19 -3
- package/tests/paintbrush.mjs +151 -2
- package/tests/planning_session_skill.mjs +102 -4
- package/tests/seed_verify_criteria.mjs +130 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.109",
|
|
6
|
+
"core_contract": "1.21.109",
|
|
7
|
+
"source_commit": "99f3c48f4295f02d3a12c5f222ca33ca04453406",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-09T16:
|
|
9
|
+
"built_at": "2026-10-09T16:52:03.016Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 592,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 3028,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3649,
|
|
20
|
+
"tree_sha256": "92bfdb3234394f28d268e4115634d136414a6c4b45fab928376b1ee741b62fcc",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
{
|
|
153
153
|
"path": ".claude/skills/goal-create/SKILL.md",
|
|
154
154
|
"mode": "0000644",
|
|
155
|
-
"sha256": "
|
|
155
|
+
"sha256": "11f9e820c5e37818de14b701945f8606562572c4381ba90ded31364005edf0fb"
|
|
156
156
|
},
|
|
157
157
|
{
|
|
158
158
|
"path": ".claude/skills/goal-review/SKILL.md",
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
{
|
|
188
188
|
"path": ".claude/skills/idea-triage/SKILL.md",
|
|
189
189
|
"mode": "0000644",
|
|
190
|
-
"sha256": "
|
|
190
|
+
"sha256": "c5698c6c3dbfed91186afde9297a165445269e9c9862f2b5c1908a0e2d6df5a1"
|
|
191
191
|
},
|
|
192
192
|
{
|
|
193
193
|
"path": ".claude/skills/merge-mode/SKILL.md",
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
{
|
|
208
208
|
"path": ".claude/skills/planning-session/SKILL.md",
|
|
209
209
|
"mode": "0000644",
|
|
210
|
-
"sha256": "
|
|
210
|
+
"sha256": "0d3ad6a9a7f3d0ee4bbdc0a8539705bdc5e9ab492151f3886120c15e102758a6"
|
|
211
211
|
},
|
|
212
212
|
{
|
|
213
213
|
"path": ".claude/skills/priority-session/SKILL.md",
|
|
@@ -2357,12 +2357,12 @@
|
|
|
2357
2357
|
{
|
|
2358
2358
|
"path": "docs/copy-inventory.md",
|
|
2359
2359
|
"mode": "0000644",
|
|
2360
|
-
"sha256": "
|
|
2360
|
+
"sha256": "1d38789dcf8ea53dfc188e72896d346c1324494ab9f80aec4fc2aeef3907766e"
|
|
2361
2361
|
},
|
|
2362
2362
|
{
|
|
2363
2363
|
"path": "docs/copy-registry.json",
|
|
2364
2364
|
"mode": "0000644",
|
|
2365
|
-
"sha256": "
|
|
2365
|
+
"sha256": "a93000df72e34c83bdf0ab43817a754f7db6f4d7dcdd6f436422426a2cc57a1f"
|
|
2366
2366
|
},
|
|
2367
2367
|
{
|
|
2368
2368
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2872,7 +2872,7 @@
|
|
|
2872
2872
|
{
|
|
2873
2873
|
"path": "docs/module-api-changelog.md",
|
|
2874
2874
|
"mode": "0000644",
|
|
2875
|
-
"sha256": "
|
|
2875
|
+
"sha256": "a35307c4313c8d7e32ad065d3713213ecb0a99990d5996f1e1221a0ea05b24fa"
|
|
2876
2876
|
},
|
|
2877
2877
|
{
|
|
2878
2878
|
"path": "docs/modules-contract.md",
|
|
@@ -2962,7 +2962,7 @@
|
|
|
2962
2962
|
{
|
|
2963
2963
|
"path": "docs/page-readings.json",
|
|
2964
2964
|
"mode": "0000644",
|
|
2965
|
-
"sha256": "
|
|
2965
|
+
"sha256": "b23bcbca4f4689129a3c589c867c7f9b6191ca855d9b458f34155f41531f47ce"
|
|
2966
2966
|
},
|
|
2967
2967
|
{
|
|
2968
2968
|
"path": "docs/project-context.template.md",
|
|
@@ -4367,7 +4367,7 @@
|
|
|
4367
4367
|
{
|
|
4368
4368
|
"path": "modules/copy-desk/docx.js",
|
|
4369
4369
|
"mode": "0000644",
|
|
4370
|
-
"sha256": "
|
|
4370
|
+
"sha256": "06457c960bbb0e498990a6886a50c80df834c0829c2259023bdfa350e95ef18b"
|
|
4371
4371
|
},
|
|
4372
4372
|
{
|
|
4373
4373
|
"path": "modules/copy-desk/flags.js",
|
|
@@ -4402,12 +4402,12 @@
|
|
|
4402
4402
|
{
|
|
4403
4403
|
"path": "modules/copy-desk/page-status.js",
|
|
4404
4404
|
"mode": "0000644",
|
|
4405
|
-
"sha256": "
|
|
4405
|
+
"sha256": "b963858bb03b92e283ecc3fe7eae02caafeeac873edc1ff464dbc886695712b5"
|
|
4406
4406
|
},
|
|
4407
4407
|
{
|
|
4408
4408
|
"path": "modules/copy-desk/pages.js",
|
|
4409
4409
|
"mode": "0000644",
|
|
4410
|
-
"sha256": "
|
|
4410
|
+
"sha256": "412dbbf26ccdaa3034f013ecace5e79fdb2adcdb2e0ab72148a2587329dc85b3"
|
|
4411
4411
|
},
|
|
4412
4412
|
{
|
|
4413
4413
|
"path": "modules/copy-desk/proposals.js",
|
|
@@ -4427,7 +4427,7 @@
|
|
|
4427
4427
|
{
|
|
4428
4428
|
"path": "modules/copy-desk/routes/copy-desk.js",
|
|
4429
4429
|
"mode": "0000644",
|
|
4430
|
-
"sha256": "
|
|
4430
|
+
"sha256": "ad80a629d5f65dd9d0f01d5bb144a7eac6cff907ee00906a79b9f364c014b51d"
|
|
4431
4431
|
},
|
|
4432
4432
|
{
|
|
4433
4433
|
"path": "modules/copy-desk/skills/tweak/SKILL.md",
|
|
@@ -4437,7 +4437,7 @@
|
|
|
4437
4437
|
{
|
|
4438
4438
|
"path": "modules/copy-desk/tests/copy_docx.mjs",
|
|
4439
4439
|
"mode": "0000644",
|
|
4440
|
-
"sha256": "
|
|
4440
|
+
"sha256": "8fbbf4fb118eb0d2422a3073cb7b5bffcfbf41e308ac293b0e8770cf349f2e50"
|
|
4441
4441
|
},
|
|
4442
4442
|
{
|
|
4443
4443
|
"path": "modules/copy-desk/tests/copy_flags.mjs",
|
|
@@ -4452,7 +4452,7 @@
|
|
|
4452
4452
|
{
|
|
4453
4453
|
"path": "modules/copy-desk/tests/copy_page_draft.mjs",
|
|
4454
4454
|
"mode": "0000644",
|
|
4455
|
-
"sha256": "
|
|
4455
|
+
"sha256": "7dfd56688ebd3611b88dacd35da58bc34db9329670937a7da1d64b4e19a9d979"
|
|
4456
4456
|
},
|
|
4457
4457
|
{
|
|
4458
4458
|
"path": "modules/copy-desk/tests/copy_page_next.mjs",
|
|
@@ -5977,7 +5977,7 @@
|
|
|
5977
5977
|
{
|
|
5978
5978
|
"path": "modules/hall-ui/public/paintbrush.js",
|
|
5979
5979
|
"mode": "0000644",
|
|
5980
|
-
"sha256": "
|
|
5980
|
+
"sha256": "6b55647a30b321705a5ef932bdc68175262c0e891d9239615617aa8a9c3d5c99"
|
|
5981
5981
|
},
|
|
5982
5982
|
{
|
|
5983
5983
|
"path": "modules/hall-ui/public/palette.js",
|
|
@@ -6342,7 +6342,7 @@
|
|
|
6342
6342
|
{
|
|
6343
6343
|
"path": "modules/hall-ui/public/studio.js",
|
|
6344
6344
|
"mode": "0000644",
|
|
6345
|
-
"sha256": "
|
|
6345
|
+
"sha256": "3b3ce62f0d41d21be2cf073f03f8d3e860fb025d1b1a286589405df9b233106e"
|
|
6346
6346
|
},
|
|
6347
6347
|
{
|
|
6348
6348
|
"path": "modules/hall-ui/public/studio.states.json",
|
|
@@ -6352,7 +6352,7 @@
|
|
|
6352
6352
|
{
|
|
6353
6353
|
"path": "modules/hall-ui/public/style.css",
|
|
6354
6354
|
"mode": "0000644",
|
|
6355
|
-
"sha256": "
|
|
6355
|
+
"sha256": "ed3c2a242d279e61bfe11e8c4218f72fac2227ced9b5bdc1211b21e2720d860f"
|
|
6356
6356
|
},
|
|
6357
6357
|
{
|
|
6358
6358
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -6412,7 +6412,7 @@
|
|
|
6412
6412
|
{
|
|
6413
6413
|
"path": "modules/hall-ui/public/tweak-editor-lib.js",
|
|
6414
6414
|
"mode": "0000644",
|
|
6415
|
-
"sha256": "
|
|
6415
|
+
"sha256": "2edf90d8c1664bdc774d2af9758d5e504621d244a35194e8b8d1a367bf85f244"
|
|
6416
6416
|
},
|
|
6417
6417
|
{
|
|
6418
6418
|
"path": "modules/hall-ui/public/tweak-editor.css",
|
|
@@ -6512,7 +6512,7 @@
|
|
|
6512
6512
|
{
|
|
6513
6513
|
"path": "modules/hall-ui/records/craft-mode.md",
|
|
6514
6514
|
"mode": "0000644",
|
|
6515
|
-
"sha256": "
|
|
6515
|
+
"sha256": "1d4499e1dde2b7f4d88e621a47b164e913ab99878ccf73c7d3398f231cf70bfe"
|
|
6516
6516
|
},
|
|
6517
6517
|
{
|
|
6518
6518
|
"path": "modules/hall-ui/records/filter-views.md",
|
|
@@ -6607,7 +6607,7 @@
|
|
|
6607
6607
|
{
|
|
6608
6608
|
"path": "modules/hall-ui/records/tweak-editor.md",
|
|
6609
6609
|
"mode": "0000644",
|
|
6610
|
-
"sha256": "
|
|
6610
|
+
"sha256": "0f991a75a272d533911072acb4cc87d618c352eb39b4d14307257db041b66ec3"
|
|
6611
6611
|
},
|
|
6612
6612
|
{
|
|
6613
6613
|
"path": "modules/ideas/CLAUDE.md",
|
|
@@ -10157,12 +10157,12 @@
|
|
|
10157
10157
|
{
|
|
10158
10158
|
"path": "package-lock.json",
|
|
10159
10159
|
"mode": "0000644",
|
|
10160
|
-
"sha256": "
|
|
10160
|
+
"sha256": "b52f46812f60f0c96bead621c93cd5d916561ab4f37ea94ce28e7c46198ba985"
|
|
10161
10161
|
},
|
|
10162
10162
|
{
|
|
10163
10163
|
"path": "package.json",
|
|
10164
10164
|
"mode": "0000644",
|
|
10165
|
-
"sha256": "
|
|
10165
|
+
"sha256": "9c36d2b1a974a7a7ef2af11f87f498e6fc26f4d6b40056952514db8252689769"
|
|
10166
10166
|
},
|
|
10167
10167
|
{
|
|
10168
10168
|
"path": "public-docs/index.html",
|
|
@@ -10182,7 +10182,7 @@
|
|
|
10182
10182
|
{
|
|
10183
10183
|
"path": "release-notes.json",
|
|
10184
10184
|
"mode": "0000644",
|
|
10185
|
-
"sha256": "
|
|
10185
|
+
"sha256": "3dbd02da56539f0d9fa96b2bc3ec5c586bde41a3242f2d1d86cc0fd644fb8592"
|
|
10186
10186
|
},
|
|
10187
10187
|
{
|
|
10188
10188
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -11532,7 +11532,7 @@
|
|
|
11532
11532
|
{
|
|
11533
11533
|
"path": "scripts/gds/seed-bv2-ideator-surface-tasks.js",
|
|
11534
11534
|
"mode": "0000644",
|
|
11535
|
-
"sha256": "
|
|
11535
|
+
"sha256": "e85983f4c59b88674758ea6dc3b074ddbb900c86734038989dfea6b53b46a18d"
|
|
11536
11536
|
},
|
|
11537
11537
|
{
|
|
11538
11538
|
"path": "scripts/gds/seed-bv2-tweak-mode-tasks.js",
|
|
@@ -11592,7 +11592,7 @@
|
|
|
11592
11592
|
{
|
|
11593
11593
|
"path": "scripts/gds/seed-verify-criteria.js",
|
|
11594
11594
|
"mode": "0000644",
|
|
11595
|
-
"sha256": "
|
|
11595
|
+
"sha256": "d6300f04b48fcb3abfe1c7b102a3f3180b0afd7eb0bac44b31d503514611542e"
|
|
11596
11596
|
},
|
|
11597
11597
|
{
|
|
11598
11598
|
"path": "scripts/gds/sequence.js",
|
|
@@ -11982,7 +11982,7 @@
|
|
|
11982
11982
|
{
|
|
11983
11983
|
"path": "scripts/hall-preview/server.js",
|
|
11984
11984
|
"mode": "0000644",
|
|
11985
|
-
"sha256": "
|
|
11985
|
+
"sha256": "5819bcbb67a9940a05ee7d874d29edbad366d2bdae64f40d0f9d5a4ea8e32376"
|
|
11986
11986
|
},
|
|
11987
11987
|
{
|
|
11988
11988
|
"path": "scripts/hall-preview/task-visual.js",
|
|
@@ -12457,7 +12457,7 @@
|
|
|
12457
12457
|
{
|
|
12458
12458
|
"path": "src/module-api.js",
|
|
12459
12459
|
"mode": "0000644",
|
|
12460
|
-
"sha256": "
|
|
12460
|
+
"sha256": "d741e7462f49f3e622275d1901613d0e716de10361aa9e8ee1bc0b195fe134df"
|
|
12461
12461
|
},
|
|
12462
12462
|
{
|
|
12463
12463
|
"path": "src/module-loader/catalog.js",
|
|
@@ -13437,7 +13437,7 @@
|
|
|
13437
13437
|
{
|
|
13438
13438
|
"path": "tests/copy_desk_page_submit.mjs",
|
|
13439
13439
|
"mode": "0000644",
|
|
13440
|
-
"sha256": "
|
|
13440
|
+
"sha256": "5c1267b5426a49b453039cd4e02a9d5acda823dde58a4116398d44a644e69653"
|
|
13441
13441
|
},
|
|
13442
13442
|
{
|
|
13443
13443
|
"path": "tests/copy_inventory.mjs",
|
|
@@ -14894,6 +14894,11 @@
|
|
|
14894
14894
|
"mode": "0000644",
|
|
14895
14895
|
"sha256": "14e0bfda70dac75dc29bd784739ade11fe2cb986214bd0a1e8859f398b52dafb"
|
|
14896
14896
|
},
|
|
14897
|
+
{
|
|
14898
|
+
"path": "tests/hall_preview_encoded_paths.mjs",
|
|
14899
|
+
"mode": "0000644",
|
|
14900
|
+
"sha256": "a4a0141c0743557d2344e2fbb0c573112b6c787e41332fdd04d5b656b17b65ba"
|
|
14901
|
+
},
|
|
14897
14902
|
{
|
|
14898
14903
|
"path": "tests/hall_preview_governor_fixtures.mjs",
|
|
14899
14904
|
"mode": "0000644",
|
|
@@ -15007,7 +15012,7 @@
|
|
|
15007
15012
|
{
|
|
15008
15013
|
"path": "tests/hall_tweak_editor.mjs",
|
|
15009
15014
|
"mode": "0000644",
|
|
15010
|
-
"sha256": "
|
|
15015
|
+
"sha256": "98adbded73abf08ac1a0267f38e668c0bcccc55c35c90161f480754ed8d43a22"
|
|
15011
15016
|
},
|
|
15012
15017
|
{
|
|
15013
15018
|
"path": "tests/handle_machinery.mjs",
|
|
@@ -16182,7 +16187,7 @@
|
|
|
16182
16187
|
{
|
|
16183
16188
|
"path": "tests/paintbrush.mjs",
|
|
16184
16189
|
"mode": "0000644",
|
|
16185
|
-
"sha256": "
|
|
16190
|
+
"sha256": "0d5f6cfcdd842e90a0b258e49b12d722ddf9df186d741846ac8d3c964bfd448a"
|
|
16186
16191
|
},
|
|
16187
16192
|
{
|
|
16188
16193
|
"path": "tests/parallel-load.mjs",
|
|
@@ -16252,7 +16257,7 @@
|
|
|
16252
16257
|
{
|
|
16253
16258
|
"path": "tests/planning_session_skill.mjs",
|
|
16254
16259
|
"mode": "0000644",
|
|
16255
|
-
"sha256": "
|
|
16260
|
+
"sha256": "5fa3820f0c2a9b718cc3bcb513264ffae24c25c91d1a7039f0459a2befb36a6b"
|
|
16256
16261
|
},
|
|
16257
16262
|
{
|
|
16258
16263
|
"path": "tests/platform_boot.mjs",
|
|
@@ -17177,7 +17182,7 @@
|
|
|
17177
17182
|
{
|
|
17178
17183
|
"path": "tests/seed_verify_criteria.mjs",
|
|
17179
17184
|
"mode": "0000644",
|
|
17180
|
-
"sha256": "
|
|
17185
|
+
"sha256": "b23270ac3c7d530a781337e49c0871cbd4ba6fde584774ef65435527edca48de"
|
|
17181
17186
|
},
|
|
17182
17187
|
{
|
|
17183
17188
|
"path": "tests/sequence.mjs",
|
|
@@ -12,7 +12,7 @@ cost: >-
|
|
|
12
12
|
|
|
13
13
|
You are running the **goal-create** session for this Cloud Bongos instance. You produce **one goal**: a title, a scope wall, two to four done-when criteria, and a handful of seed tasks — written to Bongos in one sitting.
|
|
14
14
|
|
|
15
|
-
> **Not `/planning-session`, not `/goal-review`.** `/planning-session` scopes a whole **version**: 5–9 criteria, a written spec under `docs/specs/`, a multi-round interview, a seed script, a migration. This skill produces **one goal**, with no spec file and no migration. `/goal-review` is the other end of the same lifecycle — it *confirms* criteria and auto-achieves goals. If the ask is "plan the next version", stop and run `/planning-session` instead.
|
|
15
|
+
> **Not `/planning-session`, not `/goal-review`.** `/planning-session` scopes a whole **version**: 5–9 criteria, a written spec under `docs/specs/`, a multi-round interview, a seed script, a migration. This skill produces **one goal**, with no spec file and no migration. `/goal-review` is the other end of the same lifecycle — it *confirms* criteria and auto-achieves goals. If the ask is "plan the next version", stop and run `/planning-session` instead. **The same goes for a big design-driven ask** — the owner has a design in mind (a mockup, a named model, "it should feel like…") and it would take several tasks to build: route it to `/planning-session` before seeding anything, because only there is each criterion tied to the agreed design and each task told where that design lives (task 1004675). Seeding it here skips that binding, and the grader — which never reads the design — cannot notice the build drifting from it.
|
|
16
16
|
|
|
17
17
|
## Rank gate — Metic+ only
|
|
18
18
|
|
|
@@ -124,9 +124,14 @@ node scripts/gds/api.js POST /api/bongos/tasks --body-file <path-to-task.json>
|
|
|
124
124
|
# 5d — dependency edges, only where a real gate exists.
|
|
125
125
|
node scripts/gds/api.js POST /api/bongos/tasks/<id>/dependencies --body '{"depends_on_task_id":<id>}' # ids only
|
|
126
126
|
|
|
127
|
-
# 5e — promote
|
|
128
|
-
#
|
|
129
|
-
#
|
|
127
|
+
# 5e — check, then promote only what is still waiting. POST /tasks answers 'backlog',
|
|
128
|
+
# but the reconciler's backlog sweep moves a task with no unshipped dependency to
|
|
129
|
+
# 'ready' within about a minute (task 1003932), so most are already there. Re-read
|
|
130
|
+
# the statuses; promote only a non-spike still at 'backlog' (an already-ready one
|
|
131
|
+
# answers 409 cannot_promote). 'ready' is not 'claimable': the claim-time
|
|
132
|
+
# dependency gate refuses a task whose dependency is unshipped, whatever its status
|
|
133
|
+
# (task 1004668). Leave spikes in backlog.
|
|
134
|
+
node scripts/gds/api.js GET "/api/bongos/tasks?goal_id=<gid>"
|
|
130
135
|
node scripts/gds/api.js POST /api/bongos/tasks/<id>/promote
|
|
131
136
|
|
|
132
137
|
# 6 — verify + report.
|
|
@@ -223,7 +223,7 @@ at the triage end, where the judgement is.)
|
|
|
223
223
|
|
|
224
224
|
**Promote → pick the tier (BV1.R64 / ADR 0086).** An idea no longer only becomes a *task* — it can promote into any tier of the work hierarchy: a **goal** (a whole module-scoped workspace), a **criterion** (a new done-when test), or a **task** (a single unit of work). Choose by the idea's size: a broad objective → goal; a "we should also require X to be done" → criterion; a concrete piece of work → task. Frame the choice to the user in those terms, then create the right record and mark the idea promoted.
|
|
225
225
|
|
|
226
|
-
- **Promote → task** (the common case). Ask for version, title, est_minutes, priority, credits_reward (`touches[]` optional — [ADR 0049](../../../docs/adr/0049-split-parallel-safety-contract.md)). `POST /api/bongos/tasks`
|
|
226
|
+
- **Promote → task** (the common case). Ask for version, title, est_minutes, priority, credits_reward (`touches[]` optional — [ADR 0049](../../../docs/adr/0049-split-parallel-safety-contract.md)). `POST /api/bongos/tasks` answers `backlog`, but a new task with no unshipped dependency and no open blocker is **auto-promoted to `ready` within about a minute** by the reconciler's backlog sweep (task 1003932) — so do not tell the owner it is waiting for their go. **Re-read its status after creating** (`GET /tasks/<id>`) and `POST /tasks/:id/promote` (Metic+) only the ones still at `backlog`; promoting one already at `ready` answers `409 cannot_promote` (task 1004668: all 15 tasks from one triage hit that). **Pass `goal_id` on the create** so the task lands in a real goal rather than the version's `"<version> — general"` catch-all — `POST /tasks` has accepted it since task 1763, and the 201 now returns a `goal_advisory` when the task ends up with no proper home. If no existing goal fits, run [`/goal-create`](../goal-create/SKILL.md) instead of filing it loose.
|
|
227
227
|
|
|
228
228
|
```
|
|
229
229
|
# 1. Create the task (--body-file avoids shell-quoting the touches[]/description).
|
|
@@ -21,6 +21,7 @@ The first planning session — V3 Planning Session #1, 2026-05-12 — is the tem
|
|
|
21
21
|
- The user says "let's plan V4" / "plan the next version" / "open a planning session"
|
|
22
22
|
- A version is in `status='planning'` and needs scope locked before tasks start landing in earnest
|
|
23
23
|
- A previous planning session left proposals in `idea_inbox` tagged `kind='criterion-proposal'` that need ratification
|
|
24
|
+
- **A big design-driven ask arrives — route it here BEFORE any task is seeded (task 1004675).** The tell: the owner has a design in mind (a mockup, a named model, "it should feel like…"), and the work would span several tasks. Seeding those tasks straight from chat — through `/goal-create`, `/idea-triage`, or a hand-written `POST /tasks` — skips the spec, the interview and the design binding in Phase 2, which is exactly how a build drifts from what was agreed. A single small task, or a goal whose shape is already settled and has no design to honour, does not need this.
|
|
24
25
|
|
|
25
26
|
**Run an ideation pass first when the goal's SHAPE is not yet settled.** An ideator session (the [Ideator pack](../../../docs/packs/ideator.md)) inverts this skill's stance: there the human drives and you are the sounding board, so *their* framing sets the shape of the thing. Carry its output into Phase 1 and the Phase-4 interview is left with genuine residue instead of first-pass design.
|
|
26
27
|
|
|
@@ -106,12 +107,14 @@ This is where the user sees what they're shaping. Do not skip this — criteria
|
|
|
106
107
|
|
|
107
108
|
**A row WITHOUT the pointer still needs its description read**, because the marker only exists from the day someone used merge instead of abandon-with-a-note, and the older rows are exactly the ones a rescope trips over. **Verify against the repo, not the row.** On 2026-08-16 a session read task 1003005 ("Rename modules/governance to modules/government") as `abandoned` and nearly put a false edge in a new goal's graph — the folder move had shipped under task 1003004, and only the prose said so. One `git log` over the paths the task named would have settled it.
|
|
108
109
|
|
|
109
|
-
### Phase 1.5 — Map the mechanism (
|
|
110
|
+
### Phase 1.5 — Map the mechanism (the default whenever an existing surface is touched) — task 1003075, task 1004675
|
|
110
111
|
|
|
111
|
-
**Run this phase
|
|
112
|
+
**Run this phase by default for any session that touches an existing surface** — a process-change redesign, an extension of a live feature, a new view over data that already exists. **Skipping it is the thing that needs a stated reason**, written into the spec's *Design decisions*: e.g. "purely additive, no live mechanism in play — nothing to map". Do not skip it because the owner arrived with a confident model; that is exactly the case where an unmapped assumption costs the most.
|
|
113
|
+
|
|
114
|
+
The precedent is the 2026-08-17 idea-routing session (goal 1000071): a subagent mapping the LIVE capture→triage→promote path before Phase 2 turned "route bugs to goals" into the capture-time-promotion design and resolved the bugs-vs-features question almost by itself — the session's own retro named it the highest-value step. The 2026-09-19 ideator-surface session (meta task 1004076) was the second in a row: mapping moved the scope three times before any criterion was written — the owner's "size = karma" was not computable (karma rows carry no task or idea key), task parentage could not carry a descent (one level, no cross-version parents), and nothing recorded that shipped work was later removed, so half the design rested on a signal that did not exist.
|
|
112
115
|
|
|
113
116
|
1. **Input.** Name the subsystem(s) the version is about to change, and the entry points you already know (a route file, a CLI script, a module's public function) as the subagent's starting point.
|
|
114
|
-
2. **Spawn a read-only mapping subagent** (`Explore` or `general-purpose`, `model: sonnet` or higher per CLAUDE.md's subagent routing — this feeds a design decision, not plumbing) with a prompt asking it to trace the CURRENT live mechanism end-to-end: every entry point that touches it, the chokepoint(s) data already funnels through, and any function/route already doing part of what the new design needs. Ask for file:line references, not prose summaries — the output has to be citable in the spec.
|
|
117
|
+
2. **Spawn a read-only mapping subagent** (`Explore` or `general-purpose`, `model: sonnet` or higher per CLAUDE.md's subagent routing — this feeds a design decision, not plumbing) with a prompt asking it to trace the CURRENT live mechanism end-to-end: every entry point that touches it, the chokepoint(s) data already funnels through, and any function/route already doing part of what the new design needs. Ask for file:line references, not prose summaries — the output has to be citable in the spec. **Always ask it one standard question as well: "Name any quantity this design assumes is computable, and say whether it actually is — which table or column carries it, or why nothing does."**
|
|
115
118
|
3. **Output artifact — the mechanics map.** A short structured list: each chokepoint or reusable function/route, with a file:line and a one-line note on what it does today. Write it down (in the session, or straight into the spec draft) rather than letting it live only in the subagent's reply.
|
|
116
119
|
4. **Consumed by:**
|
|
117
120
|
- **Phase 2 (Criteria)** — a chokepoint the map surfaces (e.g. "every capture vector funnels through one function") often turns directly into a criterion, or reframes one that would otherwise be written as a task list.
|
|
@@ -129,6 +132,12 @@ For each criterion:
|
|
|
129
132
|
|
|
130
133
|
**Apply the strength test BEFORE presenting each criterion.** A criterion passes the test if it plausibly anchors at least 5 tasks across multiple `kind` values (feature + bug + infra, not just feature). If it only anchors 1-3 specific tasks, or reads like an implementation step, rewrite it as the resulting outcome before showing it to the user.
|
|
131
134
|
|
|
135
|
+
**Tie every criterion to the agreed design — outcomes alone let the build stray (task 1004675).** An outcome criterion is right, but it is only half the job. The grader reads the **task description and the diff**; it does **not** read `docs/specs/`. So an outcome criterion ("a thought is never lost") plus a vague task ("make the outcome persist") can be satisfied by a build that has nothing to do with the design the owner agreed, and nothing in the pipeline objects — the spec is the design of record and sits outside the loop that judges the work. The owner caught this in the 2026-09-19 ideator-surface session: "none of this criteria is easily indicative of the initial scope and designs we made". Close the gap three ways:
|
|
136
|
+
|
|
137
|
+
1. **Split the settled design into MODEL and RENDERING.** The model is the durable decision — the named states, the independent channels, the rules (that session: five named states, two independent channels, a decay rule). It goes **into the criterion text**. The rendering — how it is drawn (that session: as a sky) — stays in the spec, free to change. A criterion that names the rendering breaks the day the look changes; a criterion that omits the model lets any build pass.
|
|
138
|
+
2. **Give each criterion a proof whose scenario a wrong build fails.** Not "the page renders" but "a thought that caused 180 credits of work, since removed, displays at full size and zero brightness". Write that scenario into the proof task's **description** (Phase 3), because the description is where the grader actually looks.
|
|
139
|
+
3. **Cite the design of record in every task description, and make sure the builder can open it.** Name the spec path (`docs/specs/<ver>-<goal-slug>.md`, committed in Phase 5) and the section the task implements. A private artifact link or a chat-only mockup as the design of record is decorative — whoever builds cannot open it.
|
|
140
|
+
|
|
132
141
|
**Number every criterion** (`1.`, `2.`, …) in the presented list. The user will reference them by number when editing — e.g. "edit 4, remove 5, add a new one about X" — so they don't have to copy/paste the criterion titles.
|
|
133
142
|
|
|
134
143
|
**Ask "what's missing?" before finalizing.** Once you've presented N criteria and worked through edits, explicitly prompt: "What concerns you that I haven't named? What's missing from this list?"
|
|
@@ -179,9 +188,9 @@ Don't tunnel-vision. Surface lateral options the user might not have thought of:
|
|
|
179
188
|
|
|
180
189
|
**Proactively propose needs-exploration tasks** for any criterion where the implementation path isn't clear. Don't wait for the user to flag it. Frame them as "this one needs an architecture pass first — output an ADR + sub-task list before we build."
|
|
181
190
|
|
|
182
|
-
**For each criterion, explicitly propose a proof-task** — the single live demonstration that proves the criterion is met. Examples: "Builder #2 onboards in ≤2h" for an onboarding criterion, "five concurrent builders shipping without collisions on staging" for a parallel-safety criterion. Without a proof-task, the criterion may technically ship without anyone knowing it works.
|
|
191
|
+
**For each criterion, explicitly propose a proof-task** — the single live demonstration that proves the criterion is met. Examples: "Builder #2 onboards in ≤2h" for an onboarding criterion, "five concurrent builders shipping without collisions on staging" for a parallel-safety criterion. Without a proof-task, the criterion may technically ship without anyone knowing it works. **The proof's scenario must be one a wrong build fails** — state the concrete input and the exact observable result the agreed MODEL implies (Phase 2), so a build that ignored the design cannot pass it.
|
|
183
192
|
|
|
184
|
-
**Encourage short task descriptions with cross-refs.** Each task's description should focus on done-when + touches; reference dependency tasks by their R## rather than restating context. Long standalone descriptions are content-debt at scale (80 tasks × 200 words = a lot of redundant context).
|
|
193
|
+
**Encourage short task descriptions with cross-refs.** Each task's description should focus on done-when + touches; reference dependency tasks by their R## rather than restating context. **But every description cites the design of record** — the spec path and section it implements (Phase 2, "Tie every criterion to the agreed design") — because the grader never opens the spec on its own. Long standalone descriptions are content-debt at scale (80 tasks × 200 words = a lot of redundant context).
|
|
185
194
|
|
|
186
195
|
> **`touches[]` is an advisory hint, not a hard fence ([ADR 0049](../../../docs/adr/0049-split-parallel-safety-contract.md)).** Parallel-safety is a *split contract*: for interactive single-human work, `git merge` is the authoritative collision detector and the claim-time overlap signal only warns; only the autonomous `--parallel` runner treats footprint overlap as a hard gate. So don't agonize over predicting every file at planning time — a rough blast-radius is enough, and a wrong prediction is no longer ship-blocking. (Step 7/8 — task [#882](https://example.com/builders#/task/882) — makes the per-task `touches` field optional and backfills it from the committed diff at ship.)
|
|
187
196
|
|
|
@@ -213,6 +222,8 @@ Tell the user the spec is written and where, then move straight to the interview
|
|
|
213
222
|
|
|
214
223
|
**Ask only NON-OBVIOUS questions.** A question earns its place only if: the spec is genuinely underspecified on it, reasonable experts would disagree, AND the answer changes what gets built or how it's broken into tasks. Span dimensions across rounds — **data model & schema, API surface & contracts, UI/UX & information architecture, permissions/authz, privacy/consent, performance & scale, failure modes & edge cases, migration/rollout/backfill, naming the user will see, and scope boundaries.**
|
|
215
224
|
|
|
225
|
+
**Naming questions: show the options side by side before recommending one (task 1004675).** A name the user will see — a page, a state, a role, a button — is a question where a lone recommendation anchors the owner before they have compared anything. Lay out three or four candidates together, each with a one-line note on how it reads to the person who will see it, and only then say which you would pick and why. In an AskUserQuestion round, that means each candidate is its own option (use the option `preview` for the side-by-side), with your pick listed first and marked recommended — never one name with "or something else?".
|
|
226
|
+
|
|
216
227
|
**Do NOT ask** anything answerable by reading the codebase, anything the criteria already settle, yes/no rubber-stamps, or "do you want it to be good?" filler. If you catch yourself about to ask something with one obvious answer, decide it yourself and record it in *Design decisions* instead.
|
|
217
228
|
|
|
218
229
|
> **This interview is the deliberate exception to the usual "decide implementation details yourself" default (see Tone, and CLAUDE.md §2).** The owner has explicitly asked to be consulted in depth here — so probe technical implementation, UX, tradeoffs, and concerns, not just outcomes.
|
|
@@ -301,13 +312,15 @@ Once the spec is finalized (Phase 4), **read `docs/specs/<ver>-<goal-slug>.md` a
|
|
|
301
312
|
|
|
302
313
|
> **Seeding contract — validated on goal 1000045 (2026-07-16):** proof-tasks use `kind='verify'` (a deliverable that IS a verification; can't be prematurely confirmed), spikes `kind='spike'`; `POST /tasks` accepts `criterion_ids` + `goal_id` inline and disciplines include `ui`; there is **no `promoted_idea_id`** field on `POST /tasks` — mark a promoted idea via `PATCH /inbox/:id`; **descoping a criterion has no API** (done-when is create/satisfy/unsatisfy only) — remove the row via a direct DB delete (`ssh … "sudo -u postgres psql -d <db> -c \"DELETE FROM done_when_criteria WHERE id=…\""`) under the meta-task claim, capturing the SQL in its notes; and a seed script **must throttle + honor `429` `retry_after`** (per-IP rate limit) — add a base delay between calls and back off on 429, or a large seed dies halfway. A completed reference seed: `scripts/gds/<redacted>.js`.
|
|
303
314
|
>
|
|
304
|
-
> **Every seed script verifies its own criterion links — fail loudly on any mismatch, zero included (task 1003076, retro on goal 1000071).** The goal-1000071 seeder linked all 15 tasks to the WRONG criteria (a positional `"Cn"` token resolved against the whole VERSION's criterion order, not the goal's — learning 1000188) and still printed success; only a manual `GET /goals` rollup caught it, after the fact. Every seed script's `main()` must end by tallying the `criterion_ids` it actually POSTed per task, then calling `verifySeedCriteriaLinks` from [`scripts/gds/seed-verify-criteria.js`](../../../scripts/gds/seed-verify-criteria.js) — it fetches `GET /api/bongos/goals/<id>`, diffs the returned `criteria[].linked_tasks` against that plan, and `exit(1)`s with a loud per-criterion diff on any mismatch (see `expectedCriterionCounts` + `verifySeedCriteriaLinks`). Reference implementation: `scripts/gds/<redacted>.js`. This is a script-level check, independent of whatever caused the mislink — it catches the *symptom* (a criterion silently under- or over-linked) whichever bug produces it.
|
|
315
|
+
> **Every seed script verifies its own criterion links — fail loudly on any mismatch, zero included (task 1003076, retro on goal 1000071).** The goal-1000071 seeder linked all 15 tasks to the WRONG criteria (a positional `"Cn"` token resolved against the whole VERSION's criterion order, not the goal's — learning 1000188) and still printed success; only a manual `GET /goals` rollup caught it, after the fact. Every seed script's `main()` must end by tallying the `criterion_ids` it actually POSTed per task, then calling `verifySeedCriteriaLinks` from [`scripts/gds/seed-verify-criteria.js`](../../../scripts/gds/seed-verify-criteria.js) — it fetches `GET /api/bongos/goals/<id>`, diffs the returned `criteria[].linked_tasks` against that plan, and `exit(1)`s with a loud per-criterion diff on any mismatch (see `expectedCriterionCounts` + `verifySeedCriteriaLinks`). Reference implementation: `scripts/gds/<redacted>.js`. **Seeding into a goal that already has linked tasks?** Call `baselineSeedCriteria` BEFORE the first write and pass its result as `baseline` to the verify (task 1004668; reference: `scripts/gds/<redacted>.js`) — the check then covers every criterion on the goal, pre-existing counts included, and still catches a stray link on one the seed never meant to touch. With a baseline, tally only the tasks this run CREATED — skip any create that answers `idempotent: true`, since a re-run's replayed task is already inside the baseline and counting it again expects its links twice. Without a baseline only the plan's own criteria are checked. This is a script-level check, independent of whatever caused the mislink — it catches the *symptom* (a criterion silently under- or over-linked) whichever bug produces it.
|
|
305
316
|
|
|
306
317
|
4. **Apply the migration** (commit + push + deploy, or direct psql via SSH for hot-fix style).
|
|
307
318
|
|
|
308
319
|
5. **Run the seed script.** Verify exit code 0 — the seed's own final step (the Seeding contract's `verifySeedCriteriaLinks` call, above) already fails loudly if any criterion's linked task count doesn't match the plan, so a 0 exit means the links landed correctly, not just that the POSTs didn't error. Also spot-check totals via `GET /api/bongos/public/progress` and `GET /api/bongos/versions/<ver>/done-when`.
|
|
309
320
|
|
|
310
|
-
6. **Promote the zero-dep layer to `ready` — scoped to the tasks you just seeded
|
|
321
|
+
6. **Promote the zero-dep layer to `ready` — scoped to the tasks you just seeded, and only what is still at `backlog`.** Do **not** assume the seed landed at `backlog`: read the seeded rows' statuses and report them (task 1004668). `POST /tasks` answers `backlog`, but the reconciler's backlog sweep (`PROMOTABLE_BACKLOG_WHERE` in `modules/lifecycle/db-tasks.js`, task 1003932) promotes any task with no unmet dependency and no open blocker within about a minute — seeding 27 tasks into goal 1000095 found 24 already at `ready`, spikes included, and the promote below had almost nothing to do. A zero-dep task the sweep has not reached yet is the only thing this step is for.
|
|
322
|
+
|
|
323
|
+
**`ready` is not "claimable".** The sweep can reach a task before the seed wires its dependency edges (the seed creates every task first, then the edges), so a task that should wait can read `ready`. The **claim-time dependency gate** (`DEPS_NOT_SHIPPED`) is the enforcement, not the status — it refuses a claim while any dependency is unshipped, whatever the row says. Check the edges landed (`GET /api/bongos/goals/<id>` → `dependencies`), not the statuses.
|
|
311
324
|
|
|
312
325
|
**Scope this to your own seed, and never to the whole version** (task 1001438). `version_id + status='backlog' + kind<>'spike' + no dep edge` also describes rows that are sitting at `backlog` **on purpose**, and promoting those is a silent, unlogged override of another subsystem's decision:
|
|
313
326
|
- **cascade-filed tasks** — `cascade.js` files generated work at `backlog`, **never** `ready`, as one of its four pinned properties (`modules/lifecycle/CLAUDE.md`; task 1003549). A cascade task has no dependency edge, so an unscoped promote flips exactly the rows that guarantee says it never will.
|
|
@@ -328,7 +341,7 @@ Once the spec is finalized (Phase 4), **read `docs/specs/<ver>-<goal-slug>.md` a
|
|
|
328
341
|
AND id NOT IN (SELECT task_id FROM task_dependencies);
|
|
329
342
|
```
|
|
330
343
|
|
|
331
|
-
The count
|
|
344
|
+
The count is the zero-dep tasks the sweep has not promoted yet — often zero, which is not an error. It can never exceed the zero-dep tasks your seed just created; if it does, your `source_ref` prefix is catching an earlier seed — narrow it (or fall back to the explicit list, `AND id = ANY('{<seeded ids>}')`) before writing anything. Then re-run it as the UPDATE:
|
|
332
345
|
|
|
333
346
|
```sql
|
|
334
347
|
UPDATE tasks
|
|
@@ -342,7 +355,7 @@ Once the spec is finalized (Phase 4), **read `docs/specs/<ver>-<goal-slug>.md` a
|
|
|
342
355
|
RETURNING id, title, priority, kind;
|
|
343
356
|
```
|
|
344
357
|
|
|
345
|
-
Capture the `RETURNING` rows — the max `priority`
|
|
358
|
+
Capture the `RETURNING` rows, plus the seeded rows the sweep had already promoted — the max `priority` across both is the input for step 7. Spikes are intentionally excluded; they never auto-promote (kind='spike' convention, [ADR 0015](../../../docs/adr/0015-task-dependencies-and-auto-promotion.md)).
|
|
346
359
|
|
|
347
360
|
7. **Surface higher-priority spikes still in backlog.** Spikes don't auto-flow because their output reshapes downstream work — that's a feature, not a bug. But the planning session just decided the priority order, so a high-priority spike sitting unstarted while lower-priority non-spike work flows to `ready` is a coordination smell worth one explicit mention. Query:
|
|
348
361
|
|