@bongos/core 1.19.468 → 1.19.470
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 +94 -44
- package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +169 -0
- package/docs/adr/README.md +1 -0
- package/docs/copy-inventory.md +42 -50
- package/docs/copy-registry.json +167 -271
- package/docs/file-map.md +5 -1
- package/docs/module-api-changelog.md +4 -0
- package/docs/research/task-network-map/a-every-task-p2.png +0 -0
- package/docs/research/task-network-map/a-every-task-p40.png +0 -0
- package/docs/research/task-network-map/b-dependency-forest-p2.png +0 -0
- package/docs/research/task-network-map/b-dependency-forest-p40.png +0 -0
- package/docs/research/task-network-map/c-goals-p2.png +0 -0
- package/docs/research/task-network-map/c-goals-p40.png +0 -0
- package/docs/research/task-network-map/d-joined-by-goal.png +0 -0
- package/docs/research/task-network-map-readability.md +191 -0
- package/modules/hall-ui/public/atlas.css +96 -88
- package/modules/hall-ui/public/atlas.html +43 -20
- package/modules/hall-ui/public/atlas.js +118 -20
- package/modules/hall-ui/public/atlas.states.json +52 -1
- package/modules/hall-ui/public/modules.css +67 -86
- package/modules/hall-ui/public/modules.html +46 -35
- package/modules/hall-ui/public/modules.js +195 -103
- package/modules/hall-ui/public/modules.states.json +48 -1
- package/modules/hall-ui/public/people.css +3 -2
- package/modules/hall-ui/public/people.html +2 -2
- package/modules/hall-ui/public/people.js +5 -4
- package/modules/hall-ui/public/people.states.json +1 -1
- package/modules/hall-ui/public/settings.js +1 -1
- package/modules/hall-ui/public/style.css +12 -11
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/spike-task-map.js +730 -0
- package/src/bongos/serve-internal.js +20 -8
- package/src/module-api.js +1 -1
- package/tests/hall_catalog_world.mjs +181 -0
- package/tests/hall_page_gate_map.mjs +4 -2
- package/tests/hall_reading_world.mjs +2 -2
- package/tests/hall_roster_world.mjs +40 -12
- package/tests/spike_task_map.mjs +0 -0
- package/modules/hall-ui/public/scouting.html +0 -69
- package/modules/hall-ui/public/scouting.states.json +0 -59
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.470",
|
|
6
|
+
"core_contract": "1.19.470",
|
|
7
|
+
"source_commit": "dd9b08fd3b05ca54600d1cd9beaa771be0d8568d",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-02T14:
|
|
9
|
+
"built_at": "2026-09-02T14:48:18.482Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 410,
|
|
13
13
|
"agent_docs_stubbed": 24,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1831,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2265,
|
|
20
|
+
"tree_sha256": "669cadea9cb3ee85a8d995e4fd24179814f5b8475b753e228d71446493c85800",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1634,10 +1634,15 @@
|
|
|
1634
1634
|
"mode": "0000644",
|
|
1635
1635
|
"sha256": "f9f3a0b8ebe2d161e17e1c632bbbda71842c9476958294330420f28c6301f7db"
|
|
1636
1636
|
},
|
|
1637
|
+
{
|
|
1638
|
+
"path": "docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md",
|
|
1639
|
+
"mode": "0000644",
|
|
1640
|
+
"sha256": "19a6e49700fa63ef781c3fa9b96d868785995c4037b078543b354e45c6db823f"
|
|
1641
|
+
},
|
|
1637
1642
|
{
|
|
1638
1643
|
"path": "docs/adr/README.md",
|
|
1639
1644
|
"mode": "0000644",
|
|
1640
|
-
"sha256": "
|
|
1645
|
+
"sha256": "4c6f66d10d34f4c1c1e0ab6376868281b87e28a9f3b16ccfb75fafc004dcf8e2"
|
|
1641
1646
|
},
|
|
1642
1647
|
{
|
|
1643
1648
|
"path": "docs/api-reference.md",
|
|
@@ -1672,12 +1677,12 @@
|
|
|
1672
1677
|
{
|
|
1673
1678
|
"path": "docs/copy-inventory.md",
|
|
1674
1679
|
"mode": "0000644",
|
|
1675
|
-
"sha256": "
|
|
1680
|
+
"sha256": "7726b8ee862ebd75d1a95fafa9a5fb13993b4ad79bacba17f6e401e950082be4"
|
|
1676
1681
|
},
|
|
1677
1682
|
{
|
|
1678
1683
|
"path": "docs/copy-registry.json",
|
|
1679
1684
|
"mode": "0000644",
|
|
1680
|
-
"sha256": "
|
|
1685
|
+
"sha256": "34b21e7e0c7135f4a20cc821174fc2e05ccfee4aa3691855197aa3356356e308"
|
|
1681
1686
|
},
|
|
1682
1687
|
{
|
|
1683
1688
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2117,7 +2122,7 @@
|
|
|
2117
2122
|
{
|
|
2118
2123
|
"path": "docs/file-map.md",
|
|
2119
2124
|
"mode": "0000644",
|
|
2120
|
-
"sha256": "
|
|
2125
|
+
"sha256": "ad3830c5ce7650d78c18dbd03c03c0544cbdc9f0dc018c4e09da1cf5bdf67d21"
|
|
2121
2126
|
},
|
|
2122
2127
|
{
|
|
2123
2128
|
"path": "docs/handoff-template.md",
|
|
@@ -2127,7 +2132,7 @@
|
|
|
2127
2132
|
{
|
|
2128
2133
|
"path": "docs/module-api-changelog.md",
|
|
2129
2134
|
"mode": "0000644",
|
|
2130
|
-
"sha256": "
|
|
2135
|
+
"sha256": "8149596860cbbf60448d12ec3c229ee62cd7eb63524235a3464f68cb260b3c15"
|
|
2131
2136
|
},
|
|
2132
2137
|
{
|
|
2133
2138
|
"path": "docs/modules-contract.md",
|
|
@@ -2384,6 +2389,46 @@
|
|
|
2384
2389
|
"mode": "0000644",
|
|
2385
2390
|
"sha256": "b8eb5d248cf36a95c5d72a683d056cea80ded13a9fc79504e4865da91cc01a1a"
|
|
2386
2391
|
},
|
|
2392
|
+
{
|
|
2393
|
+
"path": "docs/research/task-network-map-readability.md",
|
|
2394
|
+
"mode": "0000644",
|
|
2395
|
+
"sha256": "335d8013fce50dd8e6905fffa02017714442bb19ce8a95e00706a4d99c4243b9"
|
|
2396
|
+
},
|
|
2397
|
+
{
|
|
2398
|
+
"path": "docs/research/task-network-map/a-every-task-p2.png",
|
|
2399
|
+
"mode": "0000644",
|
|
2400
|
+
"sha256": "a8244dc72e654510116b6862a9d45df4236f98d22122cf7f7cb10ad556ee205d"
|
|
2401
|
+
},
|
|
2402
|
+
{
|
|
2403
|
+
"path": "docs/research/task-network-map/a-every-task-p40.png",
|
|
2404
|
+
"mode": "0000644",
|
|
2405
|
+
"sha256": "a6a3e4bde72c2786318dc40d1dc2ebe211931d6270eed9d805ad501cafb2cefc"
|
|
2406
|
+
},
|
|
2407
|
+
{
|
|
2408
|
+
"path": "docs/research/task-network-map/b-dependency-forest-p2.png",
|
|
2409
|
+
"mode": "0000644",
|
|
2410
|
+
"sha256": "ba46c265ce9d63dd861f51e5abccf908fbfccc85da5e54a0c0bcefa233b71099"
|
|
2411
|
+
},
|
|
2412
|
+
{
|
|
2413
|
+
"path": "docs/research/task-network-map/b-dependency-forest-p40.png",
|
|
2414
|
+
"mode": "0000644",
|
|
2415
|
+
"sha256": "9e80f7462576cf5d6e7e5b8cca4d119c014bb3a1b7424f046077e7ef5bb4473c"
|
|
2416
|
+
},
|
|
2417
|
+
{
|
|
2418
|
+
"path": "docs/research/task-network-map/c-goals-p2.png",
|
|
2419
|
+
"mode": "0000644",
|
|
2420
|
+
"sha256": "86d66eaf7c215548f8372e264b031519e72b3492992c0daefd7fd38f409b759e"
|
|
2421
|
+
},
|
|
2422
|
+
{
|
|
2423
|
+
"path": "docs/research/task-network-map/c-goals-p40.png",
|
|
2424
|
+
"mode": "0000644",
|
|
2425
|
+
"sha256": "daa6b17253f3c55e5ca40536aa2b26730b935d50b502b2589478755da56fd5f2"
|
|
2426
|
+
},
|
|
2427
|
+
{
|
|
2428
|
+
"path": "docs/research/task-network-map/d-joined-by-goal.png",
|
|
2429
|
+
"mode": "0000644",
|
|
2430
|
+
"sha256": "df987e84d3a031c680d8248fcc2be649277c475a8e315a4df04f46b7709d8dd6"
|
|
2431
|
+
},
|
|
2387
2432
|
{
|
|
2388
2433
|
"path": "migrations/003_pms.sql",
|
|
2389
2434
|
"mode": "0000644",
|
|
@@ -3947,22 +3992,22 @@
|
|
|
3947
3992
|
{
|
|
3948
3993
|
"path": "modules/hall-ui/public/atlas.css",
|
|
3949
3994
|
"mode": "0000644",
|
|
3950
|
-
"sha256": "
|
|
3995
|
+
"sha256": "135d4554ff853a52ce5536fe8e3a39864055301457afd3d30eb726686df7795a"
|
|
3951
3996
|
},
|
|
3952
3997
|
{
|
|
3953
3998
|
"path": "modules/hall-ui/public/atlas.html",
|
|
3954
3999
|
"mode": "0000644",
|
|
3955
|
-
"sha256": "
|
|
4000
|
+
"sha256": "5be54f6e574fd171cfccad405e006873ff110206777c95bd6f482befe0e9c600"
|
|
3956
4001
|
},
|
|
3957
4002
|
{
|
|
3958
4003
|
"path": "modules/hall-ui/public/atlas.js",
|
|
3959
4004
|
"mode": "0000644",
|
|
3960
|
-
"sha256": "
|
|
4005
|
+
"sha256": "c94e2c4f04cdaaff36185f5e6b572c0716185cc615c03ccd4dbef63ca9f14577"
|
|
3961
4006
|
},
|
|
3962
4007
|
{
|
|
3963
4008
|
"path": "modules/hall-ui/public/atlas.states.json",
|
|
3964
4009
|
"mode": "0000644",
|
|
3965
|
-
"sha256": "
|
|
4010
|
+
"sha256": "cad620c960fb6bb8533d40a1e1e9b841b998b30ff073dabaca8623ee183d142c"
|
|
3966
4011
|
},
|
|
3967
4012
|
{
|
|
3968
4013
|
"path": "modules/hall-ui/public/box-panel.js",
|
|
@@ -4277,22 +4322,22 @@
|
|
|
4277
4322
|
{
|
|
4278
4323
|
"path": "modules/hall-ui/public/modules.css",
|
|
4279
4324
|
"mode": "0000644",
|
|
4280
|
-
"sha256": "
|
|
4325
|
+
"sha256": "9a00c3965acc3defb8d711950ee9a15e941bbd9cc005a48babfa9b0f31a5068d"
|
|
4281
4326
|
},
|
|
4282
4327
|
{
|
|
4283
4328
|
"path": "modules/hall-ui/public/modules.html",
|
|
4284
4329
|
"mode": "0000644",
|
|
4285
|
-
"sha256": "
|
|
4330
|
+
"sha256": "493de4531267d2b0b0ce268cc5998e33d54481442af619771f05dc27182e6f18"
|
|
4286
4331
|
},
|
|
4287
4332
|
{
|
|
4288
4333
|
"path": "modules/hall-ui/public/modules.js",
|
|
4289
4334
|
"mode": "0000644",
|
|
4290
|
-
"sha256": "
|
|
4335
|
+
"sha256": "b2f8498403c739fb39e2391da13e3df3fdcbc52b4365f1c1faf7cfd83e602ff5"
|
|
4291
4336
|
},
|
|
4292
4337
|
{
|
|
4293
4338
|
"path": "modules/hall-ui/public/modules.states.json",
|
|
4294
4339
|
"mode": "0000644",
|
|
4295
|
-
"sha256": "
|
|
4340
|
+
"sha256": "80931a71335a98bdc435d37a2feaeae039e933db69d50d37307e66a252d5d285"
|
|
4296
4341
|
},
|
|
4297
4342
|
{
|
|
4298
4343
|
"path": "modules/hall-ui/public/my-projects.css",
|
|
@@ -4342,22 +4387,22 @@
|
|
|
4342
4387
|
{
|
|
4343
4388
|
"path": "modules/hall-ui/public/people.css",
|
|
4344
4389
|
"mode": "0000644",
|
|
4345
|
-
"sha256": "
|
|
4390
|
+
"sha256": "2965667df5cf982295fcf2b58135aa84452b9d45c5f082c73bf26ede17736091"
|
|
4346
4391
|
},
|
|
4347
4392
|
{
|
|
4348
4393
|
"path": "modules/hall-ui/public/people.html",
|
|
4349
4394
|
"mode": "0000644",
|
|
4350
|
-
"sha256": "
|
|
4395
|
+
"sha256": "5e5c99eab08f89feb05ab4db5015d6db3a78324777ffad245aa03c91a633032e"
|
|
4351
4396
|
},
|
|
4352
4397
|
{
|
|
4353
4398
|
"path": "modules/hall-ui/public/people.js",
|
|
4354
4399
|
"mode": "0000644",
|
|
4355
|
-
"sha256": "
|
|
4400
|
+
"sha256": "145f767f473b11c222bde97e5de519c9eb0a9be0ddb2f75969d35dff086b3e01"
|
|
4356
4401
|
},
|
|
4357
4402
|
{
|
|
4358
4403
|
"path": "modules/hall-ui/public/people.states.json",
|
|
4359
4404
|
"mode": "0000644",
|
|
4360
|
-
"sha256": "
|
|
4405
|
+
"sha256": "6f7612bf9ef7da53e2f66337921ee30a13f8a28bde61044f9263bc45a8074edc"
|
|
4361
4406
|
},
|
|
4362
4407
|
{
|
|
4363
4408
|
"path": "modules/hall-ui/public/primer.css",
|
|
@@ -4449,16 +4494,6 @@
|
|
|
4449
4494
|
"mode": "0000644",
|
|
4450
4495
|
"sha256": "ae7f02a8145e6e6f98f5428dcb48a1a82caec227af95a8c3a0c32e662af8167b"
|
|
4451
4496
|
},
|
|
4452
|
-
{
|
|
4453
|
-
"path": "modules/hall-ui/public/scouting.html",
|
|
4454
|
-
"mode": "0000644",
|
|
4455
|
-
"sha256": "3eb3f73fe668fdd99031f71e2a761b3d3584873728960f116e45845ad5d12d76"
|
|
4456
|
-
},
|
|
4457
|
-
{
|
|
4458
|
-
"path": "modules/hall-ui/public/scouting.states.json",
|
|
4459
|
-
"mode": "0000644",
|
|
4460
|
-
"sha256": "80efccfcf2963bc360853ded4618f59ca50ee055249e37891310c11dea1c55cf"
|
|
4461
|
-
},
|
|
4462
4497
|
{
|
|
4463
4498
|
"path": "modules/hall-ui/public/sessions.css",
|
|
4464
4499
|
"mode": "0000644",
|
|
@@ -4497,7 +4532,7 @@
|
|
|
4497
4532
|
{
|
|
4498
4533
|
"path": "modules/hall-ui/public/settings.js",
|
|
4499
4534
|
"mode": "0000644",
|
|
4500
|
-
"sha256": "
|
|
4535
|
+
"sha256": "d8dd818d13e8efe11aa6b92870c44499d8510f22df1a3af5fad48d5f9a5c7b9d"
|
|
4501
4536
|
},
|
|
4502
4537
|
{
|
|
4503
4538
|
"path": "modules/hall-ui/public/shell.js",
|
|
@@ -4512,7 +4547,7 @@
|
|
|
4512
4547
|
{
|
|
4513
4548
|
"path": "modules/hall-ui/public/style.css",
|
|
4514
4549
|
"mode": "0000644",
|
|
4515
|
-
"sha256": "
|
|
4550
|
+
"sha256": "9bb44b2d5ad45342ebee328430c793d0e48ce921362e87501002a5c73fbe71c9"
|
|
4516
4551
|
},
|
|
4517
4552
|
{
|
|
4518
4553
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -6627,12 +6662,12 @@
|
|
|
6627
6662
|
{
|
|
6628
6663
|
"path": "package-lock.json",
|
|
6629
6664
|
"mode": "0000644",
|
|
6630
|
-
"sha256": "
|
|
6665
|
+
"sha256": "d31730b3e97acb3c865e52501b03d403acfb927f3107e3f605323e17945e0bf0"
|
|
6631
6666
|
},
|
|
6632
6667
|
{
|
|
6633
6668
|
"path": "package.json",
|
|
6634
6669
|
"mode": "0000644",
|
|
6635
|
-
"sha256": "
|
|
6670
|
+
"sha256": "533ce05335a427241e42414979e9c01c7c7df1f446959ffe2a70beae4f8089a7"
|
|
6636
6671
|
},
|
|
6637
6672
|
{
|
|
6638
6673
|
"path": "public-docs/index.html",
|
|
@@ -7814,6 +7849,11 @@
|
|
|
7814
7849
|
"mode": "0000755",
|
|
7815
7850
|
"sha256": "dfd5aa72caa26eb2c8cf3063e1b4f51e1f4bcd7fddcdd93d243279c130850628"
|
|
7816
7851
|
},
|
|
7852
|
+
{
|
|
7853
|
+
"path": "scripts/gds/spike-task-map.js",
|
|
7854
|
+
"mode": "0000644",
|
|
7855
|
+
"sha256": "cd09675638143232121d028f2ba55dcdde47c9d8d5d2466f52d09bc2cb650cc9"
|
|
7856
|
+
},
|
|
7817
7857
|
{
|
|
7818
7858
|
"path": "scripts/gds/stale-worktrees.js",
|
|
7819
7859
|
"mode": "0000644",
|
|
@@ -8247,7 +8287,7 @@
|
|
|
8247
8287
|
{
|
|
8248
8288
|
"path": "src/bongos/serve-internal.js",
|
|
8249
8289
|
"mode": "0000644",
|
|
8250
|
-
"sha256": "
|
|
8290
|
+
"sha256": "d914b8304d5de3b325ef5996d30ca47c8ae91db26f561646271f11f77c3c37f0"
|
|
8251
8291
|
},
|
|
8252
8292
|
{
|
|
8253
8293
|
"path": "src/bongos/stealth-gate.js",
|
|
@@ -8282,7 +8322,7 @@
|
|
|
8282
8322
|
{
|
|
8283
8323
|
"path": "src/module-api.js",
|
|
8284
8324
|
"mode": "0000644",
|
|
8285
|
-
"sha256": "
|
|
8325
|
+
"sha256": "a5108ff620f06bbc05b7db97722319170c3fe6d5ce379524fe53b03ad0a137fb"
|
|
8286
8326
|
},
|
|
8287
8327
|
{
|
|
8288
8328
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9654,6 +9694,11 @@
|
|
|
9654
9694
|
"mode": "0000644",
|
|
9655
9695
|
"sha256": "bb66cec6b745cd6e50efd8828d05a75aa68fbc50ed43d8a49988c1246bfd3324"
|
|
9656
9696
|
},
|
|
9697
|
+
{
|
|
9698
|
+
"path": "tests/hall_catalog_world.mjs",
|
|
9699
|
+
"mode": "0000644",
|
|
9700
|
+
"sha256": "79c8759cbb0d17477139acae6e0057caa70021ff0edfeba9c419c14ad729a1ac"
|
|
9701
|
+
},
|
|
9657
9702
|
{
|
|
9658
9703
|
"path": "tests/hall_collab_world.mjs",
|
|
9659
9704
|
"mode": "0000644",
|
|
@@ -9677,7 +9722,7 @@
|
|
|
9677
9722
|
{
|
|
9678
9723
|
"path": "tests/hall_page_gate_map.mjs",
|
|
9679
9724
|
"mode": "0000644",
|
|
9680
|
-
"sha256": "
|
|
9725
|
+
"sha256": "a66273f4a3e376d0055afb0e41fac308e84eb30b2f468f8e36831f3aad662f98"
|
|
9681
9726
|
},
|
|
9682
9727
|
{
|
|
9683
9728
|
"path": "tests/hall_palette.mjs",
|
|
@@ -9692,7 +9737,7 @@
|
|
|
9692
9737
|
{
|
|
9693
9738
|
"path": "tests/hall_reading_world.mjs",
|
|
9694
9739
|
"mode": "0000644",
|
|
9695
|
-
"sha256": "
|
|
9740
|
+
"sha256": "0639e14742626f0f75400a5dd462418ff4dba9ab9f28aa517a165f63c65046c3"
|
|
9696
9741
|
},
|
|
9697
9742
|
{
|
|
9698
9743
|
"path": "tests/hall_record_world.mjs",
|
|
@@ -9702,7 +9747,7 @@
|
|
|
9702
9747
|
{
|
|
9703
9748
|
"path": "tests/hall_roster_world.mjs",
|
|
9704
9749
|
"mode": "0000644",
|
|
9705
|
-
"sha256": "
|
|
9750
|
+
"sha256": "66ce52ea8ff217a089a420792322bc322fe1e332458779f8c6da6c57f74b4bf2"
|
|
9706
9751
|
},
|
|
9707
9752
|
{
|
|
9708
9753
|
"path": "tests/hall_signout.mjs",
|
|
@@ -11024,6 +11069,11 @@
|
|
|
11024
11069
|
"mode": "0000644",
|
|
11025
11070
|
"sha256": "70228aa4be345cc09664b3b725e30c3a1e0eacf4c39573db1304fb219d3245e7"
|
|
11026
11071
|
},
|
|
11072
|
+
{
|
|
11073
|
+
"path": "tests/spike_task_map.mjs",
|
|
11074
|
+
"mode": "0000644",
|
|
11075
|
+
"sha256": "714d7a3c6d3247bcd4412c12db7a905a4c7a351ed8d835c606a4d43b9d7249b3"
|
|
11076
|
+
},
|
|
11027
11077
|
{
|
|
11028
11078
|
"path": "tests/sso_checkin_identity_spoof.mjs",
|
|
11029
11079
|
"mode": "0000644",
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# 0227 — A task network map is refused; the goal graph is the map, and search answers findability
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-09-02
|
|
5
|
+
- **Tasks:** [#1003282](https://cloudbongos.com/builders#/task/1003282)
|
|
6
|
+
- **Goal:** [#1000072](https://cloudbongos.com/builders#/goal/1000072) — Human legibility, criterion `legibility-project-map`, which gates itself on this spike.
|
|
7
|
+
- **Evidence:** [`docs/research/task-network-map-readability.md`](../research/task-network-map-readability.md) and the figures in [`docs/research/task-network-map/`](../research/task-network-map/), rendered by [`scripts/gds/spike-task-map.js`](../../scripts/gds/spike-task-map.js).
|
|
8
|
+
- **Sibling goal:** [#1000027](https://cloudbongos.com/builders#/goal/1000027) — Findability, "the grep path" (ADR 0095, ADR 0060).
|
|
9
|
+
|
|
10
|
+
## 1. The decision
|
|
11
|
+
|
|
12
|
+
**No whole-corpus task map, at any dependency density.** The measured verdict holds
|
|
13
|
+
across a swept range (p=2% to p=40% of tasks carrying a dependency): a node-link view of
|
|
14
|
+
~1,357 tasks is confetti, not structure, and the obvious fix — drawing it denser — draws
|
|
15
|
+
forty goals badly while claiming to show a thousand tasks. A confident picture of nothing
|
|
16
|
+
is the opposite of legibility, which is the goal this criterion serves.
|
|
17
|
+
|
|
18
|
+
What is readable is **the ~40-node goal graph as the entry point**, with a **per-goal
|
|
19
|
+
dependency forest as the drill-down**, queried when a goal is opened rather than zoomed
|
|
20
|
+
out of a global map.
|
|
21
|
+
|
|
22
|
+
**This is a negative result, and it is the deliverable.** The criterion said so in
|
|
23
|
+
advance: a network view that becomes unreadable at 1,300 tasks is not a solution, and the
|
|
24
|
+
spike's output is an ADR plus a task list, not a prototype.
|
|
25
|
+
|
|
26
|
+
## 2. What the edges are, and which already exist in the DB
|
|
27
|
+
|
|
28
|
+
Every edge a map could draw is already stored. None needs a new table.
|
|
29
|
+
|
|
30
|
+
| Edge | Storage | Notes |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| task → task dependency | `task_dependencies` (migration 020) | The load-bearing one; gates claims (`409 DEPS_NOT_SHIPPED`, ADR 0015). This is view B. |
|
|
33
|
+
| task → subtask | `tasks.parent_task_id` | Tree, not graph. Cheap. |
|
|
34
|
+
| task → goal | `tasks.goal_id` → `goals` | The aggregation key for view C's node weights. |
|
|
35
|
+
| task → criterion → goal | `task_criteria` → `done_when_criteria` | The done-when rollup `/status` already walks (ADR 0025). |
|
|
36
|
+
| idea → task (promotion) | `idea_inbox.promoted_to_task_id` → `tasks` | Triage lineage, forward direction. |
|
|
37
|
+
| idea → idea (merge) | `idea_inbox.merged_into_idea_id` (`migrations/<redacted>.sql`) | The merge target; chain-free by CHECK constraint. |
|
|
38
|
+
| task → version | `tasks.version_id` → `versions` | Membership, not connection — a filter, never an edge to draw. |
|
|
39
|
+
|
|
40
|
+
The triage-lineage edges (the last three) are the ones the owner's question actually
|
|
41
|
+
reaches for — what became of the thing I was brainstorming — and they form **short
|
|
42
|
+
chains, not a network**. That distinction drives §4.
|
|
43
|
+
|
|
44
|
+
## 3. How it survives the number
|
|
45
|
+
|
|
46
|
+
- **View C is aggregated at the query.** One `goalRollups` query plus a cross-goal
|
|
47
|
+
dependency count. ~40 nodes; the payload is bytes.
|
|
48
|
+
- **View B is lazy and scoped.** A separate small query per opened goal. It covers 3–40%
|
|
49
|
+
of the corpus and never 100% — and the tasks it omits are precisely those with nothing
|
|
50
|
+
to connect them to, so the omission is the finding rather than a gap.
|
|
51
|
+
- **Views A (every task) and D (densified) are never drawn** — not as a default, not
|
|
52
|
+
behind an "advanced" toggle.
|
|
53
|
+
- **Density is measured before anything is built.** Two numbers decide the shape: the
|
|
54
|
+
share of tasks carrying a dependency, and the share of dependencies crossing a goal
|
|
55
|
+
boundary. If cross-goal dependencies are near zero, view C is forty disconnected dots
|
|
56
|
+
and the honest deliverable is a grid of goal cards — which the hall's Goals page
|
|
57
|
+
already is. **That outcome would mean the right amount of new map is none**, and it is
|
|
58
|
+
why the first task in §6 is a measurement, not a build.
|
|
59
|
+
|
|
60
|
+
## 4. Findability (goal 1000027) answers the owner's question more cheaply than a map
|
|
61
|
+
|
|
62
|
+
Read first, as the criterion required. Goal 1000027 is the grep path: a repo navigated by
|
|
63
|
+
literal search, with meaning written into the source (ADR 0095), plus the rank-scoped
|
|
64
|
+
lexical search over repo docs and indexed DB prose that `/recall` serves (ADR 0060).
|
|
65
|
+
|
|
66
|
+
The owner's question splits in two, and only one half is a map:
|
|
67
|
+
|
|
68
|
+
- **Find what I was brainstorming.** This is search, and it already exists. `/recall`
|
|
69
|
+
plus the lineage columns in §2 answers it end to end: find the idea, follow
|
|
70
|
+
`promoted_to_task_id` / `merged_into_idea_id` to what became of it. What is missing is
|
|
71
|
+
not a picture but a **lineage trail** — one thing and its ancestry, rendered as an
|
|
72
|
+
ordered list. That is a text surface, cheap, accessible for free, and it does not
|
|
73
|
+
degrade at 1,357 rows because it never shows more than one chain.
|
|
74
|
+
- **See the shape of the portfolio.** Search cannot answer this, and this is the only
|
|
75
|
+
half a graph earns. It is view C, and it is about ~40 goals — not about tasks.
|
|
76
|
+
|
|
77
|
+
**Therefore the lineage trail outranks the map.** It is the cheaper answer to the question
|
|
78
|
+
actually asked, and it is sequenced first in §6. A whole-corpus picture was never the
|
|
79
|
+
cheap way to find a thing.
|
|
80
|
+
|
|
81
|
+
## 5. Accessibility and the no-sideways-scroll rule
|
|
82
|
+
|
|
83
|
+
Whatever ships lands in the hall, so it inherits the hall's rules, and a node-link graph
|
|
84
|
+
is the hardest surface to make accessible.
|
|
85
|
+
|
|
86
|
+
1. **The table is the primary surface; the graph is the enhancement.** Every graph view
|
|
87
|
+
ships with a semantic equivalent (goal name, task count, category, dependency count) —
|
|
88
|
+
not an `aria-label` bolted onto an SVG blob, and not a "view as table" toggle that
|
|
89
|
+
hides the accessible path behind a click. A keyboard-only or screen-reader user gets
|
|
90
|
+
the same facts by default.
|
|
91
|
+
2. **No sideways scroll on the page.** A graph that cannot fit the width scrolls inside
|
|
92
|
+
its own `overflow-x: auto` container; the page body never scrolls horizontally.
|
|
93
|
+
3. **Colour is never the only channel.** View C encodes category as colour; category must
|
|
94
|
+
also be text on the node or in the row, since the ADR 0192 category set is not
|
|
95
|
+
colour-distinguishable at forty nodes.
|
|
96
|
+
4. **The lineage trail has none of these problems**, which is a further reason it is
|
|
97
|
+
sequenced first.
|
|
98
|
+
|
|
99
|
+
## 6. The ranked task list
|
|
100
|
+
|
|
101
|
+
Ranked, and deliberately front-loaded with the cheap text surfaces so the graph is built
|
|
102
|
+
only if the measurement says it would carry anything.
|
|
103
|
+
|
|
104
|
+
1. **Measure the real density** — [#1003477](https://cloudbongos.com/builders#/task/1003477) — against the live DB (`--from`), recording the two
|
|
105
|
+
numbers from §3. Gates items 3 and 4; may cancel them outright.
|
|
106
|
+
2. **The lineage trail** — [#1003478](https://cloudbongos.com/builders#/task/1003478) — an idea's ancestry and what became of it, as an ordered text
|
|
107
|
+
surface on the existing search path (§4). Independent of the graph, and the answer to
|
|
108
|
+
the owner's actual question.
|
|
109
|
+
3. **The goal graph (view C)** — [#1003479](https://cloudbongos.com/builders#/task/1003479) — ~40 nodes, cross-goal dependency edges, task-count
|
|
110
|
+
weight, category as colour *and* text, table equivalent shipped with it. Only if
|
|
111
|
+
item 1 finds cross-goal edges.
|
|
112
|
+
4. **The per-goal dependency forest (view B)** — [#1003480](https://cloudbongos.com/builders#/task/1003480) — the drill-down, queried per goal. Only
|
|
113
|
+
if item 1 finds a meaningful share of tasks carrying dependencies.
|
|
114
|
+
|
|
115
|
+
## 7. What was rejected
|
|
116
|
+
|
|
117
|
+
- **The task graph, zoomed out (view A).** A thousand dots whose positions are noise.
|
|
118
|
+
- **Densifying to make it look structured (view D).** Forty dots presented as a thousand;
|
|
119
|
+
it invites belief in structure that is not there.
|
|
120
|
+
- **A prototype as this spike's output.** The criterion forbade it. `spike-task-map.js` is
|
|
121
|
+
a measuring instrument that renders figures from a synthetic sweep — it ships as
|
|
122
|
+
evidence under `docs/research/`, is wired to no route and no page, and nothing in the
|
|
123
|
+
hall imports it.
|
|
124
|
+
- **Building the map before measuring.** The two numbers in §3 can cancel items 3 and 4,
|
|
125
|
+
and discovering that after building would be the expensive order.
|
|
126
|
+
|
|
127
|
+
## 8. The honest limit
|
|
128
|
+
|
|
129
|
+
**The measured corpus is synthetic.** The live DB was unreachable from the environment the
|
|
130
|
+
harness ran in, so it sweeps a plausible range instead of observing one truth. The sweep
|
|
131
|
+
is what makes the *verdict* robust — every conclusion above holds from p=2% to p=40% —
|
|
132
|
+
but the specific numbers are model output, not observation, and the ~40 goal count and the
|
|
133
|
+
85% within-goal edge preference are modelled from the repo's own record. This is exactly
|
|
134
|
+
why item 1 of §6 is a measurement against the real DB and why it gates the rest. A
|
|
135
|
+
negative result that saves building an unreadable graph is a successful spike; a negative
|
|
136
|
+
result that also names the one query that could overturn it is a finished one.
|
|
137
|
+
|
|
138
|
+
## 9. Conceded: the harness over-built for the question
|
|
139
|
+
|
|
140
|
+
The adversarial review of this work made a point worth keeping rather than arguing with,
|
|
141
|
+
so it is recorded here instead of in a session log that nobody re-reads.
|
|
142
|
+
|
|
143
|
+
**The verdict above rests on arithmetic, not on the renderer.** The two load-bearing
|
|
144
|
+
findings — the share of nodes with degree 0, and the ink budget (screen area ÷ nodes
|
|
145
|
+
against a minimum dot pitch and label width) — are division. They need no force
|
|
146
|
+
simulation and no PNG. Yet `spike-task-map.js` carries a Barnes-Hut layout and a
|
|
147
|
+
hand-rolled PNG encoder (CRC32, zlib framing, canvas primitives), and the write-up itself
|
|
148
|
+
concedes that in view A "every dot's location is an accident of the seed". Building an
|
|
149
|
+
accurate physics simulation to place points whose positions are then declared
|
|
150
|
+
meaningless is disproportionate to a decision document.
|
|
151
|
+
|
|
152
|
+
**What the renderer does still earn:** the figures are what make overplotting legible to
|
|
153
|
+
a human reader, which a table of `marks` counts genuinely does not do — and item 1 of §6
|
|
154
|
+
re-runs this same harness against the live DB, so it is the instrument that closes the
|
|
155
|
+
spike, not dead weight. That is why it is kept rather than deleted.
|
|
156
|
+
|
|
157
|
+
**What was fixed rather than argued:** the encoder had no test coverage at all, which is
|
|
158
|
+
the sharper version of the same criticism — the figures are cited as evidence, so a
|
|
159
|
+
stride, CRC or alpha-blend bug would have corrupted the evidence *silently*. `crc32`,
|
|
160
|
+
`chunk`, `writePng`, `canvas`, `goalColor` and `render` are now exported and pinned by
|
|
161
|
+
`tests/spike_task_map.mjs` (canonical CRC-32 vectors plus a cross-check against
|
|
162
|
+
`zlib.crc32`, chunk framing, stride correctness, out-of-bounds clipping, alpha blending,
|
|
163
|
+
disc radius, line endpoints, and a full inflate-and-locate round trip). The stride
|
|
164
|
+
assertion was mutation-tested: changing `y * w` to `y * h` fails two tests.
|
|
165
|
+
|
|
166
|
+
**The transferable rule:** *a spike may build only what its verdict actually rests on;
|
|
167
|
+
anything further is a prototype wearing a harness's name.* Had the arithmetic been run
|
|
168
|
+
first, the figures would have been a nice-to-have and the physics would never have been
|
|
169
|
+
written.
|
package/docs/adr/README.md
CHANGED
|
@@ -312,5 +312,6 @@ This keeps the decision history honest and traceable.
|
|
|
312
312
|
| 0223 | [**The anti-pattern detector is two tiers inside the kit: mechanical floors fail, craft tells warn, a false positive is waived in the file with its reason, and nothing new is installed** ([task 1003329](https://cloudbongos.com/builders#/task/1003329) · goal 1000083). The [detector] group of impeccable's rebuild spec (about sixty rules, a CLI plus a browser bundle wired to hooks, per-project ignores, in-file waivers, "a clean scan is a floor and never proof") lands as RULES in the kit that already exists, per the task body: no second tool, no bundle, no hook. Decisions: **D1** `kit/tells.js` carries the static rules and `check-mock.js` runs them after the platform rules and taste bans; `lib.js`'s `factsInPage` collects the computed-value twins as `tells` and `render.js` prints them as `~ tell:` lines per render, recorded in `report.json`, never counted as problems. Two tiers: floors FAIL (a bounce easing; a card nested in a card) and tells WARN (the icon-heading-text grid, hero metrics, section numbering, a kicker above the h1, a side stripe, a hard offset shadow, a coloured halo, decorative blur, a default typeface, a wide measure, a long headline, the same entrance everywhere, a geometric mask on a plate, glyphs as icons, a rainbow gradient, the browser surfaces nobody themed, proportional numerals, tiny type; rendered: measure, tiny text, numerals in cells, headline lines, an overshooting curve). **D2** the world decides which tells are floors: a kicker above the h1 is a FAIL where the instance's `DESIGN.md` bans the eyebrow (a new `eyebrow` taste key), a WARN elsewhere. **D3** a false positive is waived in the file with its reason (`kit-ignore: <rule prefix> (reason)` → a WAIVE row), `--raw` runs with none, `--no-tells` runs the platform rules only, `--json` prints rows with `fails` / `warns` counts; no per-project ignore config. **D4** not ported: the purple-to-blue tell (a literal colour already fails; hue is unresolvable under the fifteen), an injected overlay, the screenshot sampler (`contrast.js --url` is that pass), a cascade resolver (the browser is the resolver), native code, every hook. **D5** the pins: a clean fixture passes every rule, every rule class trips at its tier with the case count equal to the rule count, the promotion, the waiver / raw / json paths through the real CLI, `craftTells` as warnings; the hub mock and the three specimens still pass, `/projects` and the grove specimen still render ALL CLEAN. Rejected: a second CLI; every tell as a floor (the kit as the taste and the instance as the exception); a project-wide ignore config; an edit-time hook.](0223-the-detector-is-two-tiers-in-the-kit.md) | ui-design / kit |
|
|
313
313
|
| 0224 | [**Module-owned skills reach the core checkout as untracked, self-ignored copies with a manifest: the self-copy guard stays, the dev path is a flag, and the file map skips what the module documents** ([task 1003330](https://cloudbongos.com/builders#/task/1003330) · goal 1000083). `materializeClaude`'s self-copy guard is right (a core copying itself is a no-op at best), but Claude Code discovers only `.claude/skills/` at the project root, so a builder IN the core checkout could not invoke any of the nine ui-design skills written there. Decisions: **D1** `node scripts/gds/claude-materialize.js --module-skills-only [--dry-run] [--clean]` calls `materializeModuleSkillsIntoCore`: the same roster, gate and slug rule as step 1b, verbatim copies (no bongosify: the checkout runs `node scripts/gds/…`), a core-owned name kept, a disabled module's excluded; the guard untouched. **D2** untracked and self-ignored: a generated `.claude/skills/.module-skills.json` manifest and a `.gitignore` that ignores itself, the manifest and every materialised dir; each run removes what the last manifest named then lands the current set (byte-identical on repeat; a dropped declaration disappears); `--clean` stops after the removal. **D3** `gen-file-map.js` and `tests/file_map.mjs` skip materialised names by the manifest (a module skill is documented by its module's README, not by the notes sidecar). **D4** init from a checkout that carries the copies still lands them through step 1b, transformed, and never the dotfiles. **D5** pinned end to end in `tests/claude_materialize.mjs`. Rejected: dropping the guard; committing the copies; symlinks or junctions; notes for dirs not in the repository.](<redacted>.md) | materialiser / skills |
|
|
314
314
|
| 0225 | [**Privacy suppresses cross-project surfaces only: a private builder still appears on their own project's roster** ([task 1003443](https://cloudbongos.com/builders#/task/1003443) · goal 1000075). The accepted privacy spec defined its two flags inconsistently for one case: `hide_stats` suppresses "everything derived from the CROSS-PROJECT rollup" (qualified, so an in-project leaderboard is out of scope) while `account_visibility: private` said "absent from search, LEADERBOARDS, sitemap" (unqualified, so it read as covering the in-project one too) — and PV2 demands "ONE shared predicate used by every public read: … leaderboards …" while `modules/economy/credits.js`'s `leaderboard()` is a bare `SELECT … FROM builders` with no join and no predicate. Read one way that is an unshipped PV2 violation in main; read the other it is correct, and nothing settled which. **Owner decision (2026-08-30): privacy suppresses CROSS-PROJECT surfaces only.** A `private` builder is absent from `/u/<handle>`, platform search, the sitemap, Explore and the recruiting reach, and still appears on the roster of a project they build on — a project's record of its own work is the project's business. Two consequences are the point of recording it: `credits.leaderboard()` is **correct as written** (adding a predicate there would be a regression, not a fix — exactly what a literal PV2 reading would have done), and PV2's "leaderboards" means the cross-project ones. The spec was amended rather than annotated: the D1 row and both `active · public` matrix rows now say *cross-project*, the two `active · private` rows drop "absent everywhere" (the file's most misreadable phrase) for "absent from every cross-project surface", PV2's ship-table row is qualified, and the boundary lands as the **third rule** under D2 beside "`hide_stats` beats everything". Rejected: making `private` hide a builder from projects they build on (it reads as more protective and breaks the ledger — a roster that omits contributors cannot show who built the thing, and credits would accrue to someone invisible on the surface explaining them); and leaving it as a dated spec note (it pins shipped code as deliberately predicate-free, which is an ADR's job).](<redacted>.md) | privacy / spec |
|
|
315
|
+
| 0227 | [**A task network map is refused; the goal graph is the map, and search answers findability** ([task 1003282](https://cloudbongos.com/builders#/task/1003282) · goal 1000072, criterion `legibility-project-map`, which gates itself on this spike). Measured across a swept density range (p=2%–40% of tasks carrying a dependency): a node-link view of ~1,357 tasks is confetti, not structure, and densifying it draws forty goals badly while claiming to show a thousand tasks — a confident picture of nothing is the opposite of the legibility this goal serves. Decision: NO whole-corpus task map at any density; the readable surface is the ~40-node GOAL graph as the entry point with a per-goal DEPENDENCY FOREST as the drill-down, queried when a goal is opened rather than zoomed out of a global map. Every edge a map could draw already exists in the DB and none needs a new table — `task_dependencies` (020), `tasks.parent_task_id`, `tasks.goal_id`, `task_criteria`→`done_when_criteria`, `idea_inbox.promoted_to_task_id`, `idea_inbox.merged_into_idea_id` (`core_195`), `tasks.version_id` (membership, never an edge). **Findability (goal 1000027) answers the owner’s question more cheaply than a map**: the ask splits into “find what I was brainstorming”, which `/recall` (ADR 0060) plus the two lineage columns already answers end to end and which wants a text LINEAGE TRAIL — one thing and its ancestry — not a picture; and “see the shape of the portfolio”, the only half a graph earns, which is about ~40 goals and not about tasks. So the trail outranks the map and is sequenced first. Accessibility: the TABLE is the primary surface and the graph the enhancement (not an `aria-label` on an SVG blob, not a toggle hiding the accessible path), no sideways scroll on the page (the graph scrolls inside its own container), and category is text as well as colour since the ADR 0192 set is not colour-distinguishable at forty nodes. Ranked list: (1) measure the real density against the live DB — it GATES and may cancel the rest, (2) the lineage trail, (3) the goal graph, (4) the per-goal forest. Rejected: view A (every task); view D (densified); a prototype as the output (the criterion forbade it — `spike-task-map.js` is a measuring instrument under `docs/research/`, wired to no route); and building before measuring. Honest limit: the corpus is SYNTHETIC (the live DB was unreachable), so the verdict is robust across the sweep but the specific numbers are model output — which is why item 1 is a measurement against the real DB.](<redacted>.md) | GDS / legibility + hall |
|
|
315
316
|
|
|
316
317
|
> ⚠️ **Numbering collisions are now machine-enforced, not narrated.** Twenty numbers are shared by two ADRs each — assigned in parallel sessions before anything checked. The files keep their filenames (renumbering would break every existing citation, and a number once assigned is never reused), and this table disambiguates each pair as `NNNN-a` / `NNNN-b`. The authoritative list is `LEGACY_DUPLICATE_ADRS` in [`scripts/gds/adr-namespace.js`](../../scripts/gds/adr-namespace.js), frozen by exact filename: a **new** collision — or a third file joining a legacy number, or a rename of either half — hard-fails the `unit` CI gate, as does an index row that points at no file or an ADR with no row. The list may only shrink. This paragraph used to narrate the collisions one by one and had fallen eight behind reality; see [ADR 0195](<redacted>.md) for why the check exists and why the pairs are grandfathered rather than renumbered.
|