@bongos/core 1.19.467 → 1.19.469
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 +86 -36
- package/docs/adr/0225-privacy-suppresses-cross-project-surfaces-only.md +84 -0
- package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +169 -0
- package/docs/adr/README.md +2 -0
- package/docs/copy-inventory.md +5 -10
- package/docs/copy-registry.json +15 -92
- 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/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 +4 -3
- 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_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.469",
|
|
6
|
+
"core_contract": "1.19.469",
|
|
7
|
+
"source_commit": "4ebfd4f9703e666d920948608912e842cf3bbd8a",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-02T14:39:17.041Z",
|
|
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": 1830,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2264,
|
|
20
|
+
"tree_sha256": "5de5a57136ff2ae1d72ee1185ba98ddb524ca2748250f3acef9feba01a967668",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1629,10 +1629,20 @@
|
|
|
1629
1629
|
"mode": "0000644",
|
|
1630
1630
|
"sha256": "717bdc174891ccf5bc8756b25f53eca016d4d6dfaeebec8d12bb2a6bfef56976"
|
|
1631
1631
|
},
|
|
1632
|
+
{
|
|
1633
|
+
"path": "docs/adr/0225-privacy-suppresses-cross-project-surfaces-only.md",
|
|
1634
|
+
"mode": "0000644",
|
|
1635
|
+
"sha256": "f9f3a0b8ebe2d161e17e1c632bbbda71842c9476958294330420f28c6301f7db"
|
|
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
|
+
},
|
|
1632
1642
|
{
|
|
1633
1643
|
"path": "docs/adr/README.md",
|
|
1634
1644
|
"mode": "0000644",
|
|
1635
|
-
"sha256": "
|
|
1645
|
+
"sha256": "4c6f66d10d34f4c1c1e0ab6376868281b87e28a9f3b16ccfb75fafc004dcf8e2"
|
|
1636
1646
|
},
|
|
1637
1647
|
{
|
|
1638
1648
|
"path": "docs/api-reference.md",
|
|
@@ -1667,12 +1677,12 @@
|
|
|
1667
1677
|
{
|
|
1668
1678
|
"path": "docs/copy-inventory.md",
|
|
1669
1679
|
"mode": "0000644",
|
|
1670
|
-
"sha256": "
|
|
1680
|
+
"sha256": "c8fef1f6767e30c55da1c2cc229ad13358468d663e55135c78dae0f2dd19d9ec"
|
|
1671
1681
|
},
|
|
1672
1682
|
{
|
|
1673
1683
|
"path": "docs/copy-registry.json",
|
|
1674
1684
|
"mode": "0000644",
|
|
1675
|
-
"sha256": "
|
|
1685
|
+
"sha256": "fac4ade86832f3b7a047946da16c5c185b5aa2d0cfe784a93de1c70add5882ce"
|
|
1676
1686
|
},
|
|
1677
1687
|
{
|
|
1678
1688
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2112,7 +2122,7 @@
|
|
|
2112
2122
|
{
|
|
2113
2123
|
"path": "docs/file-map.md",
|
|
2114
2124
|
"mode": "0000644",
|
|
2115
|
-
"sha256": "
|
|
2125
|
+
"sha256": "ad3830c5ce7650d78c18dbd03c03c0544cbdc9f0dc018c4e09da1cf5bdf67d21"
|
|
2116
2126
|
},
|
|
2117
2127
|
{
|
|
2118
2128
|
"path": "docs/handoff-template.md",
|
|
@@ -2122,7 +2132,7 @@
|
|
|
2122
2132
|
{
|
|
2123
2133
|
"path": "docs/module-api-changelog.md",
|
|
2124
2134
|
"mode": "0000644",
|
|
2125
|
-
"sha256": "
|
|
2135
|
+
"sha256": "107a6f32f688e387ec1d51d929df4bbadcb897e9993ed647171dc6c0aa4525e9"
|
|
2126
2136
|
},
|
|
2127
2137
|
{
|
|
2128
2138
|
"path": "docs/modules-contract.md",
|
|
@@ -2379,6 +2389,46 @@
|
|
|
2379
2389
|
"mode": "0000644",
|
|
2380
2390
|
"sha256": "b8eb5d248cf36a95c5d72a683d056cea80ded13a9fc79504e4865da91cc01a1a"
|
|
2381
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
|
+
},
|
|
2382
2432
|
{
|
|
2383
2433
|
"path": "migrations/003_pms.sql",
|
|
2384
2434
|
"mode": "0000644",
|
|
@@ -4337,22 +4387,22 @@
|
|
|
4337
4387
|
{
|
|
4338
4388
|
"path": "modules/hall-ui/public/people.css",
|
|
4339
4389
|
"mode": "0000644",
|
|
4340
|
-
"sha256": "
|
|
4390
|
+
"sha256": "2965667df5cf982295fcf2b58135aa84452b9d45c5f082c73bf26ede17736091"
|
|
4341
4391
|
},
|
|
4342
4392
|
{
|
|
4343
4393
|
"path": "modules/hall-ui/public/people.html",
|
|
4344
4394
|
"mode": "0000644",
|
|
4345
|
-
"sha256": "
|
|
4395
|
+
"sha256": "5e5c99eab08f89feb05ab4db5015d6db3a78324777ffad245aa03c91a633032e"
|
|
4346
4396
|
},
|
|
4347
4397
|
{
|
|
4348
4398
|
"path": "modules/hall-ui/public/people.js",
|
|
4349
4399
|
"mode": "0000644",
|
|
4350
|
-
"sha256": "
|
|
4400
|
+
"sha256": "145f767f473b11c222bde97e5de519c9eb0a9be0ddb2f75969d35dff086b3e01"
|
|
4351
4401
|
},
|
|
4352
4402
|
{
|
|
4353
4403
|
"path": "modules/hall-ui/public/people.states.json",
|
|
4354
4404
|
"mode": "0000644",
|
|
4355
|
-
"sha256": "
|
|
4405
|
+
"sha256": "6f7612bf9ef7da53e2f66337921ee30a13f8a28bde61044f9263bc45a8074edc"
|
|
4356
4406
|
},
|
|
4357
4407
|
{
|
|
4358
4408
|
"path": "modules/hall-ui/public/primer.css",
|
|
@@ -4444,16 +4494,6 @@
|
|
|
4444
4494
|
"mode": "0000644",
|
|
4445
4495
|
"sha256": "ae7f02a8145e6e6f98f5428dcb48a1a82caec227af95a8c3a0c32e662af8167b"
|
|
4446
4496
|
},
|
|
4447
|
-
{
|
|
4448
|
-
"path": "modules/hall-ui/public/scouting.html",
|
|
4449
|
-
"mode": "0000644",
|
|
4450
|
-
"sha256": "3eb3f73fe668fdd99031f71e2a761b3d3584873728960f116e45845ad5d12d76"
|
|
4451
|
-
},
|
|
4452
|
-
{
|
|
4453
|
-
"path": "modules/hall-ui/public/scouting.states.json",
|
|
4454
|
-
"mode": "0000644",
|
|
4455
|
-
"sha256": "80efccfcf2963bc360853ded4618f59ca50ee055249e37891310c11dea1c55cf"
|
|
4456
|
-
},
|
|
4457
4497
|
{
|
|
4458
4498
|
"path": "modules/hall-ui/public/sessions.css",
|
|
4459
4499
|
"mode": "0000644",
|
|
@@ -4492,7 +4532,7 @@
|
|
|
4492
4532
|
{
|
|
4493
4533
|
"path": "modules/hall-ui/public/settings.js",
|
|
4494
4534
|
"mode": "0000644",
|
|
4495
|
-
"sha256": "
|
|
4535
|
+
"sha256": "d8dd818d13e8efe11aa6b92870c44499d8510f22df1a3af5fad48d5f9a5c7b9d"
|
|
4496
4536
|
},
|
|
4497
4537
|
{
|
|
4498
4538
|
"path": "modules/hall-ui/public/shell.js",
|
|
@@ -4507,7 +4547,7 @@
|
|
|
4507
4547
|
{
|
|
4508
4548
|
"path": "modules/hall-ui/public/style.css",
|
|
4509
4549
|
"mode": "0000644",
|
|
4510
|
-
"sha256": "
|
|
4550
|
+
"sha256": "06be0a11ea5573e28c6baf25d38e7eb6b7a9f054942dfc0ebc7a2ac125376bba"
|
|
4511
4551
|
},
|
|
4512
4552
|
{
|
|
4513
4553
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -6622,12 +6662,12 @@
|
|
|
6622
6662
|
{
|
|
6623
6663
|
"path": "package-lock.json",
|
|
6624
6664
|
"mode": "0000644",
|
|
6625
|
-
"sha256": "
|
|
6665
|
+
"sha256": "78b081005f7f38ddfd05d2f6f045ea3d9a7a74b43f91985819cc4e4989bca548"
|
|
6626
6666
|
},
|
|
6627
6667
|
{
|
|
6628
6668
|
"path": "package.json",
|
|
6629
6669
|
"mode": "0000644",
|
|
6630
|
-
"sha256": "
|
|
6670
|
+
"sha256": "562c6f06e56963c7e49bc2b2c0d56c76d5129d471805e87732e21f7f58d4dae5"
|
|
6631
6671
|
},
|
|
6632
6672
|
{
|
|
6633
6673
|
"path": "public-docs/index.html",
|
|
@@ -7809,6 +7849,11 @@
|
|
|
7809
7849
|
"mode": "0000755",
|
|
7810
7850
|
"sha256": "dfd5aa72caa26eb2c8cf3063e1b4f51e1f4bcd7fddcdd93d243279c130850628"
|
|
7811
7851
|
},
|
|
7852
|
+
{
|
|
7853
|
+
"path": "scripts/gds/spike-task-map.js",
|
|
7854
|
+
"mode": "0000644",
|
|
7855
|
+
"sha256": "cd09675638143232121d028f2ba55dcdde47c9d8d5d2466f52d09bc2cb650cc9"
|
|
7856
|
+
},
|
|
7812
7857
|
{
|
|
7813
7858
|
"path": "scripts/gds/stale-worktrees.js",
|
|
7814
7859
|
"mode": "0000644",
|
|
@@ -8242,7 +8287,7 @@
|
|
|
8242
8287
|
{
|
|
8243
8288
|
"path": "src/bongos/serve-internal.js",
|
|
8244
8289
|
"mode": "0000644",
|
|
8245
|
-
"sha256": "
|
|
8290
|
+
"sha256": "d914b8304d5de3b325ef5996d30ca47c8ae91db26f561646271f11f77c3c37f0"
|
|
8246
8291
|
},
|
|
8247
8292
|
{
|
|
8248
8293
|
"path": "src/bongos/stealth-gate.js",
|
|
@@ -8277,7 +8322,7 @@
|
|
|
8277
8322
|
{
|
|
8278
8323
|
"path": "src/module-api.js",
|
|
8279
8324
|
"mode": "0000644",
|
|
8280
|
-
"sha256": "
|
|
8325
|
+
"sha256": "e9d0e0cc580123c2f593e84c39889bb08bcc88407ac5cd4ab3a546b6ceaf02a5"
|
|
8281
8326
|
},
|
|
8282
8327
|
{
|
|
8283
8328
|
"path": "src/module-loader/catalog.js",
|
|
@@ -9672,7 +9717,7 @@
|
|
|
9672
9717
|
{
|
|
9673
9718
|
"path": "tests/hall_page_gate_map.mjs",
|
|
9674
9719
|
"mode": "0000644",
|
|
9675
|
-
"sha256": "
|
|
9720
|
+
"sha256": "a66273f4a3e376d0055afb0e41fac308e84eb30b2f468f8e36831f3aad662f98"
|
|
9676
9721
|
},
|
|
9677
9722
|
{
|
|
9678
9723
|
"path": "tests/hall_palette.mjs",
|
|
@@ -9687,7 +9732,7 @@
|
|
|
9687
9732
|
{
|
|
9688
9733
|
"path": "tests/hall_reading_world.mjs",
|
|
9689
9734
|
"mode": "0000644",
|
|
9690
|
-
"sha256": "
|
|
9735
|
+
"sha256": "0639e14742626f0f75400a5dd462418ff4dba9ab9f28aa517a165f63c65046c3"
|
|
9691
9736
|
},
|
|
9692
9737
|
{
|
|
9693
9738
|
"path": "tests/hall_record_world.mjs",
|
|
@@ -9697,7 +9742,7 @@
|
|
|
9697
9742
|
{
|
|
9698
9743
|
"path": "tests/hall_roster_world.mjs",
|
|
9699
9744
|
"mode": "0000644",
|
|
9700
|
-
"sha256": "
|
|
9745
|
+
"sha256": "66ce52ea8ff217a089a420792322bc322fe1e332458779f8c6da6c57f74b4bf2"
|
|
9701
9746
|
},
|
|
9702
9747
|
{
|
|
9703
9748
|
"path": "tests/hall_signout.mjs",
|
|
@@ -11019,6 +11064,11 @@
|
|
|
11019
11064
|
"mode": "0000644",
|
|
11020
11065
|
"sha256": "70228aa4be345cc09664b3b725e30c3a1e0eacf4c39573db1304fb219d3245e7"
|
|
11021
11066
|
},
|
|
11067
|
+
{
|
|
11068
|
+
"path": "tests/spike_task_map.mjs",
|
|
11069
|
+
"mode": "0000644",
|
|
11070
|
+
"sha256": "714d7a3c6d3247bcd4412c12db7a905a4c7a351ed8d835c606a4d43b9d7249b3"
|
|
11071
|
+
},
|
|
11022
11072
|
{
|
|
11023
11073
|
"path": "tests/sso_checkin_identity_spoof.mjs",
|
|
11024
11074
|
"mode": "0000644",
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 0225 — Privacy suppresses cross-project surfaces only: a private builder still appears on their own project's roster
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-09-02
|
|
5
|
+
- **Tasks:** [#1003443](https://cloudbongos.com/builders#/task/1003443) (goal 1000075 — collaboration and the social hall; criterion `community-is-one-builders-page`)
|
|
6
|
+
- **Related:** [ADR 0171](<redacted>.md) (owns `hide_stats` + `profile_state`, fail-closed consent in the READ path) · [`docs/specs/<redacted>.md`](../specs/<redacted>.md) (the spec this amends)
|
|
7
|
+
|
|
8
|
+
## 1. Why this ADR exists
|
|
9
|
+
|
|
10
|
+
The privacy spec is **accepted**, and for one case it defined its two flags
|
|
11
|
+
inconsistently. Found 2026-08-30 while scoping the Builders page:
|
|
12
|
+
|
|
13
|
+
- `hide_stats` suppresses *"everything derived from the **cross-project rollup**"* —
|
|
14
|
+
qualified, so a project's own in-hall leaderboard is plainly out of scope.
|
|
15
|
+
- `account_visibility: private` said *"absent from search, **leaderboards**, sitemap"* —
|
|
16
|
+
**not** qualified, so it read as covering the in-project leaderboard too.
|
|
17
|
+
|
|
18
|
+
Two readers could act on the same accepted spec and build opposite behaviour. Worse,
|
|
19
|
+
PV2 requires *"ONE shared predicate used by every public read: … leaderboards …"*,
|
|
20
|
+
while `modules/economy/credits.js`'s `leaderboard()` is a bare
|
|
21
|
+
`SELECT … FROM builders ORDER BY total_credits DESC` — no join to
|
|
22
|
+
`platform_identity_accounts`, no predicate at all. Read one way that is an unshipped
|
|
23
|
+
PV2 violation sitting in main; read the other way it is correct. Nothing in the
|
|
24
|
+
documents settled which.
|
|
25
|
+
|
|
26
|
+
## 2. The decision
|
|
27
|
+
|
|
28
|
+
**Privacy suppresses CROSS-PROJECT surfaces only.** Owner, 2026-08-30.
|
|
29
|
+
|
|
30
|
+
A builder marked `private` is absent from `/u/<handle>`, platform search, the sitemap,
|
|
31
|
+
Explore-adjacent surfaces and the recruiting reach — every surface that is *about the
|
|
32
|
+
platform*. They still appear on the roster and leaderboard of a project they actually
|
|
33
|
+
build on, because **a project's record of its own work is the project's business**. The
|
|
34
|
+
flag governs how far a builder's identity travels, not whether the work they did for
|
|
35
|
+
you is yours to show.
|
|
36
|
+
|
|
37
|
+
Two things follow, and they are the point of writing this down:
|
|
38
|
+
|
|
39
|
+
- **`credits.leaderboard()` is correct as written and needs no change.** Adding a
|
|
40
|
+
visibility predicate there would be a regression, not a fix — which is exactly what
|
|
41
|
+
a future session reading PV2 literally would have done.
|
|
42
|
+
- **PV2's "every public read … leaderboards" means the cross-project leaderboards.**
|
|
43
|
+
The shared predicate still owns every surface it names; the in-project ledger was
|
|
44
|
+
never one of them.
|
|
45
|
+
|
|
46
|
+
## 3. What changed
|
|
47
|
+
|
|
48
|
+
The spec was amended rather than left to be re-litigated — the ambiguity was in its
|
|
49
|
+
wording, so the wording is the fix (task 1003443):
|
|
50
|
+
|
|
51
|
+
- the D1 `account_visibility` row now says *cross-project* leaderboards, and says
|
|
52
|
+
outright that the flag does not reach a project's own roster;
|
|
53
|
+
- the two `active · private` matrix rows no longer say **"absent everywhere"** — the
|
|
54
|
+
single most misreadable phrase in the file — but "absent from every cross-project
|
|
55
|
+
surface";
|
|
56
|
+
- the `active · public` rows qualify their "leaderboards" the same way, so the matrix
|
|
57
|
+
cannot be read against the table;
|
|
58
|
+
- PV2's own ship-table row is qualified too;
|
|
59
|
+
- and the boundary is stated as the **third rule** under D2, beside "`hide_stats`
|
|
60
|
+
beats everything", because that block is where a reader looks for the rules the
|
|
61
|
+
matrix encodes.
|
|
62
|
+
|
|
63
|
+
## 4. Rejected
|
|
64
|
+
|
|
65
|
+
**Making `private` hide a builder from the projects they build on.** It reads as the
|
|
66
|
+
more privacy-protective option and is the reason the ambiguity was worth an owner
|
|
67
|
+
decision rather than a coin flip. Rejected because it breaks the ledger: a project
|
|
68
|
+
whose roster silently omits contributors cannot show who built it, credits and karma
|
|
69
|
+
would be awarded to someone invisible on the surface that explains them, and the
|
|
70
|
+
in-hall leaderboard would disagree with the task history any builder can already read.
|
|
71
|
+
Privacy about *the platform* does not imply anonymity *inside a project you joined*.
|
|
72
|
+
|
|
73
|
+
**Leaving it as a dated note in the spec.** The task offered this and it is the wrong
|
|
74
|
+
shape: the decision resolves a stated ambiguity in an accepted spec and pins a piece
|
|
75
|
+
of shipped code as deliberately predicate-free. That is an ADR's job — a note in a
|
|
76
|
+
spec is not what a future session greps when it wonders why one leaderboard query has
|
|
77
|
+
no visibility join.
|
|
78
|
+
|
|
79
|
+
## 5. What this does not decide
|
|
80
|
+
|
|
81
|
+
Whether an in-project roster may be made public to the world (a per-project
|
|
82
|
+
visibility question the platform owns — goal 1000058's `platformVisibility`), and
|
|
83
|
+
whether a builder can leave a project's roster entirely. Both are about the
|
|
84
|
+
*project's* surface, not the account flag this ADR scopes.
|
|
@@ -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
|
@@ -311,5 +311,7 @@ This keeps the decision history honest and traceable.
|
|
|
311
311
|
| 0222 | [**The image family under the hero-only rule: plates and hero objects, never screens; the mark is drawn; the board is a contact sheet; the pair and the sidecar are the output contract** ([task 1003328](https://cloudbongos.com/builders#/task/1003328) · goal 1000083). The four image skills of `Leonxlnx/taste-skill` (scanned `dangerous`, ADR 0198) are built around pictures of interfaces: one reference image per section, one app screen per flow step in a phone mockup, an identity board with the brand name rendered in, and a build loop whose truth is the generated image; the panel flagged the eagerness mandate, the image-count rule and the must-invoke-any-tool directive by name, and the owner's rule (2026-08-26/27) forbids the category. Decisions: **D1** the subject is the composition's plate slots and the count is the slot count; variety survives as anchors (field, beside-bleeding, masthead, orb, backdrop; text-left image-right refused), the palette lock is the pack, cross-frame consistency is one family (material, light, lens, ground). **D2** a screen is the surface itself: the mobile skill makes portrait plates for 390 / 320, the flow is the states file rendered by the kit, the bible is `DESIGN.md`, no phone mockup, native declines to `/design`. **D3** the source of truth for UI is the owner's references and the world; `image-to-code` reads them (analysis, extraction spec, faithful translation, drift as the failure mode, the clarity checklist) and the only image it may cause is the hero plate. **D4** the mark is drawn as inline SVG, the colour system is the pack, the type specimen is the faces on a real page, the applications are the kit's renders, the image direction is a hero-object family, the nine-panel board is a contact sheet of real parts. **D5** the output contract is DESIGN.md's pair and sidecar (JPEG dark plate, WebP alpha cutout, `<file>.<ext>.json` beside each, `--plate-*` tokens on `body`) through the instance's art pipeline key, the spend logged, a white ground through the remover, alpha verified with ffmpeg, never a crop. **D6** the worked example is the grove specimen's hero object, not the front door. **D7** the pins: the four declared, each naming the sidecar, "text-free" and the art key; no eagerness / count / per-section / must-invoke directive. Rejected: per-section images for reference only; phone mockups around real shots; a generated logo as a start; the plate on the front door; a shared base skill with wrappers.](<redacted>.md) | ui-design / skills / imagery |
|
|
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
|
+
| 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 |
|
|
314
316
|
|
|
315
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.
|
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
|
+
**1586 strings** across 3 surfaces · 1376 distinct pieces of copy · 1586 certain, 0 heuristic · 151 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` |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 72 | 1143 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 98 |
|
|
15
15
|
| `landing` | `modules/public-landing/public` | 5 | 345 |
|
|
16
16
|
|
|
@@ -46,7 +46,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
46
46
|
| `bd315dd71ea7` | 4x | Built by agents, on Cloud Bongos. | modules/public-landing/public/contact.html:71, modules/public-landing/public/index.html:900, modules/public-landing/public/privacy.html:80 |
|
|
47
47
|
| `512ab32e3bf2` | 4x | Close box | modules/hall-ui/public/box-panel.js:149, modules/hall-ui/public/box-panel.js:163, modules/hall-ui/public/box-panel.js:206 |
|
|
48
48
|
| `c661548d5140` | 4x | Next → | modules/public-landing/public/projects.html:899, modules/public-landing/public/projects.html:932, modules/public-landing/public/projects.html:1002 |
|
|
49
|
-
| `b95918d421ae` | 4x | People — {{worldName}} | modules/hall-ui/public/people.html:6, modules/hall-ui/public/people.html:6, modules/hall-ui/public/scouting.html:6 |
|
|
50
49
|
| `3eb67b892dea` | 4x | Percy Jackson | modules/public-landing/public/index.html:803, modules/public-landing/public/index.html:821, modules/public-landing/public/index.html:827 |
|
|
51
50
|
| `0887725744f2` | 4x | Restricted. | modules/hall-ui/public/gate.js:219, modules/hall-ui/public/government.js:1104, modules/hall-ui/public/harbor.js:337 |
|
|
52
51
|
| `e57ec24e13ef` | 4x | Sign in with GitHub | modules/hall-ui/public/hall-render.js:256, modules/hall-ui/public/hall-render.js:327, modules/hall-ui/public/hall-render.js:396 |
|
|
@@ -76,9 +75,10 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
76
75
|
| `a072071b893c` | 2x | All time | modules/status-ui/public/index.html:286, modules/status-ui/public/index.html:313 |
|
|
77
76
|
| `490b73a0c6e8` | 2x | Approve your Dev Box app — {{worldName}} | modules/hall-ui/public/pair.html:6, modules/hall-ui/public/pair.html:6 |
|
|
78
77
|
| `b2656d0b2402` | 2x | Asked {…} | modules/hall-ui/public/collab.js:41, modules/hall-ui/public/watch.js:315 |
|
|
79
|
-
|
|
|
78
|
+
| `563d29ed86d8` | 2x | Bulk actions | modules/hall-ui/public/goals.html:172, modules/hall-ui/public/work.html:129 |
|
|
79
|
+
| … | | _111 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1143 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -175,7 +175,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
175
175
|
| `da910fee01d7` | certain | Browse goals → | `modules/hall-ui/public/goals.js:83` |
|
|
176
176
|
| `1596210cea76` | certain | Build from your own machine — clone the repository, run the platform locally, and sign in from the terminal. | `modules/hall-ui/public/hall-render.js:691` |
|
|
177
177
|
| `29bd516ad17e` | certain | Builder directory | `modules/hall-ui/public/people.html:37` |
|
|
178
|
-
| `29bd516ad17e` | certain | Builder directory | `modules/hall-ui/public/scouting.html:42` |
|
|
179
178
|
| `08bfcc9198ba` | certain | Builder id | `modules/hall-ui/public/government.html:111` |
|
|
180
179
|
| `a78477a24a48` | certain | Builders' Hall | `modules/hall-ui/public/index.html:12` |
|
|
181
180
|
| `a78477a24a48` | certain | Builders' Hall | `modules/hall-ui/public/index.html:12` |
|
|
@@ -392,7 +391,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
392
391
|
| `1e05b7fe42c8` | certain | Every project you build on across the platform. | `modules/hall-ui/public/my-projects.html:23` |
|
|
393
392
|
| `efafe5ce29ed` | certain | Every task linked to this criterion has shipped — a Metic can confirm it | `modules/hall-ui/public/goals-render.js:641` |
|
|
394
393
|
| `ddebbccd4b37` | certain | Everyone building across hosted projects, ranked by track record. Descriptive only — cross-project numbers nev | `modules/hall-ui/public/people.html:29` |
|
|
395
|
-
| `ddebbccd4b37` | certain | Everyone building across hosted projects, ranked by track record. Descriptive only — cross-project numbers nev | `modules/hall-ui/public/scouting.html:34` |
|
|
396
394
|
| `4750e12477e7` | certain | Everyone is already a member | `modules/hall-ui/public/goals-render.js:963` |
|
|
397
395
|
| `04bbccfe7465` | certain | Everything a new builder needs before claiming their first task. About a ten-minute read. | `modules/hall-ui/public/primer.html:42` |
|
|
398
396
|
| `d629e152f074` | certain | Expires {…} · refreshes on use. | `modules/hall-ui/public/settings.js:983` |
|
|
@@ -520,7 +518,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
520
518
|
| `20d8552e13db` | certain | Loading tasks… | `modules/hall-ui/public/work.html:32` |
|
|
521
519
|
| `a8b3b04b0b4d` | certain | Loading the copy desk… | `modules/hall-ui/public/copy-desk.html:28` |
|
|
522
520
|
| `2bde9c630fd2` | certain | Loading the directory… | `modules/hall-ui/public/people.html:40` |
|
|
523
|
-
| `2bde9c630fd2` | certain | Loading the directory… | `modules/hall-ui/public/scouting.html:45` |
|
|
524
521
|
| `fcd755e8dd30` | certain | Loading the five questions… | `modules/hall-ui/public/ideas.html:84` |
|
|
525
522
|
| `e201b4962858` | certain | Loading the idea | `modules/hall-ui/public/idea.html:43` |
|
|
526
523
|
| `95a5382e5277` | certain | Loading the idea template… | `modules/hall-ui/public/ideas.html:31` |
|
|
@@ -654,8 +651,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
654
651
|
| `adb5130f0d57` | certain | People asking to join. Approve or dismiss each request. | `modules/hall-ui/public/watch.html:62` |
|
|
655
652
|
| `b95918d421ae` | certain | People — {{worldName}} | `modules/hall-ui/public/people.html:6` |
|
|
656
653
|
| `b95918d421ae` | certain | People — {{worldName}} | `modules/hall-ui/public/people.html:6` |
|
|
657
|
-
| `b95918d421ae` | certain | People — {{worldName}} | `modules/hall-ui/public/scouting.html:6` |
|
|
658
|
-
| `b95918d421ae` | certain | People — {{worldName}} | `modules/hall-ui/public/scouting.html:6` |
|
|
659
654
|
| `4a46b478edaf` | certain | Per page | `modules/hall-ui/public/hall-kit.js:71` |
|
|
660
655
|
| `e1e10dc5e357` | certain | Permissions is the Archon administration surface. The Constitution and the Board Room are yours to read. | `modules/hall-ui/public/government.js:1121` |
|
|
661
656
|
| `fcf996d77050` | certain | Pick a rank to see what it may do. The four ladder ranks ship with the platform; a custom rank is yours to sha | `modules/hall-ui/public/government.html:78` |
|