@bongos/core 1.19.459 → 1.19.461
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 +65 -35
- package/.claude/skills/design/SKILL.md +10 -3
- package/docs/adr/0220-an-in-house-rebuilt-skill-is-a-first-party-skill.md +46 -0
- package/docs/adr/README.md +1 -0
- package/docs/copy-inventory.md +52 -61
- package/docs/copy-registry.json +92 -203
- package/docs/file-map.md +1 -1
- package/docs/module-api-changelog.md +4 -0
- package/modules/hall-ui/public/collab-lib.js +40 -4
- package/modules/hall-ui/public/collab.css +18 -34
- package/modules/hall-ui/public/collab.html +17 -17
- package/modules/hall-ui/public/collab.js +75 -39
- package/modules/hall-ui/public/collab.states.json +2 -2
- package/modules/hall-ui/public/copy-desk.css +64 -109
- package/modules/hall-ui/public/copy-desk.html +76 -69
- package/modules/hall-ui/public/copy-desk.js +175 -80
- package/modules/hall-ui/public/copy-desk.states.json +59 -2
- package/modules/hall-ui/public/oversight.css +11 -2
- package/modules/lifecycle/help-requests.js +18 -8
- package/modules/ui-design/module.json +1 -1
- package/modules/ui-design/skills/PREAMBLE.md +3 -3
- package/modules/ui-design/skills/README.md +13 -0
- package/modules/ui-design/skills/design-taste-frontend/SKILL.md +136 -0
- package/modules/ui-design/skills/design-taste-frontend-v1/SKILL.md +125 -0
- package/modules/ui-design/skills/high-end-visual-design/SKILL.md +128 -0
- package/modules/ui-design/skills/redesign-existing-projects/SKILL.md +120 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/docs-entropy.js +5 -1
- package/src/module-api.js +1 -1
- package/tests/collab_page.mjs +13 -7
- package/tests/docs_entropy.mjs +29 -1
- package/tests/hall_collab_world.mjs +214 -0
- package/tests/ui_design_skills.mjs +99 -9
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.461",
|
|
6
|
+
"core_contract": "1.19.461",
|
|
7
|
+
"source_commit": "c90f2d3b84966cebe03459eff83dddb8f458c871",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-01T23:39:44.285Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 380,
|
|
13
13
|
"agent_docs_stubbed": 24,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1816,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2220,
|
|
20
|
+
"tree_sha256": "4c595d2e8e84883925a96367ebdcb500c59ca83987e4b0ef21fc52bfcf20ef08",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
{
|
|
128
128
|
"path": ".claude/skills/design/SKILL.md",
|
|
129
129
|
"mode": "0000644",
|
|
130
|
-
"sha256": "
|
|
130
|
+
"sha256": "ced60ba6ce3e6b8295e3fa9986234f6bb9be8cd4a941ce801af47591928cb270"
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
"path": ".claude/skills/dev/SKILL.md",
|
|
@@ -1604,10 +1604,15 @@
|
|
|
1604
1604
|
"mode": "0000644",
|
|
1605
1605
|
"sha256": "9ae416852dc8112a2cea4837e4a25b29338dbddecee0903830bcf5132645274d"
|
|
1606
1606
|
},
|
|
1607
|
+
{
|
|
1608
|
+
"path": "docs/adr/0220-an-in-house-rebuilt-skill-is-a-first-party-skill.md",
|
|
1609
|
+
"mode": "0000644",
|
|
1610
|
+
"sha256": "8e121001f8ff3f854c5efe461aabb17dc4f81e49ca262b2cadf4717c49b11bb0"
|
|
1611
|
+
},
|
|
1607
1612
|
{
|
|
1608
1613
|
"path": "docs/adr/README.md",
|
|
1609
1614
|
"mode": "0000644",
|
|
1610
|
-
"sha256": "
|
|
1615
|
+
"sha256": "441c2773abced552c433f5c54a52fd4924e674c304360c9c3c6d962fedb33fc3"
|
|
1611
1616
|
},
|
|
1612
1617
|
{
|
|
1613
1618
|
"path": "docs/api-reference.md",
|
|
@@ -1642,12 +1647,12 @@
|
|
|
1642
1647
|
{
|
|
1643
1648
|
"path": "docs/copy-inventory.md",
|
|
1644
1649
|
"mode": "0000644",
|
|
1645
|
-
"sha256": "
|
|
1650
|
+
"sha256": "3822b771bb29b4bdaaf073937c7c6447bb2aa51163585a8d596872031cb5d216"
|
|
1646
1651
|
},
|
|
1647
1652
|
{
|
|
1648
1653
|
"path": "docs/copy-registry.json",
|
|
1649
1654
|
"mode": "0000644",
|
|
1650
|
-
"sha256": "
|
|
1655
|
+
"sha256": "feae1d0fdd7a6bd14a076eb7ce36fe1b70a41d3a2883e2df5536f7529238d4dc"
|
|
1651
1656
|
},
|
|
1652
1657
|
{
|
|
1653
1658
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2087,7 +2092,7 @@
|
|
|
2087
2092
|
{
|
|
2088
2093
|
"path": "docs/file-map.md",
|
|
2089
2094
|
"mode": "0000644",
|
|
2090
|
-
"sha256": "
|
|
2095
|
+
"sha256": "2164f82effe472df69ccf7c05787060ea6d108c4dfa3e74064a6f23623eb018b"
|
|
2091
2096
|
},
|
|
2092
2097
|
{
|
|
2093
2098
|
"path": "docs/handoff-template.md",
|
|
@@ -2097,7 +2102,7 @@
|
|
|
2097
2102
|
{
|
|
2098
2103
|
"path": "docs/module-api-changelog.md",
|
|
2099
2104
|
"mode": "0000644",
|
|
2100
|
-
"sha256": "
|
|
2105
|
+
"sha256": "0ebc5de06d0b5454d8509fbd60ad81f7107414610a1afb8cc363c3cf7a0473be"
|
|
2101
2106
|
},
|
|
2102
2107
|
{
|
|
2103
2108
|
"path": "docs/modules-contract.md",
|
|
@@ -3957,47 +3962,47 @@
|
|
|
3957
3962
|
{
|
|
3958
3963
|
"path": "modules/hall-ui/public/collab-lib.js",
|
|
3959
3964
|
"mode": "0000644",
|
|
3960
|
-
"sha256": "
|
|
3965
|
+
"sha256": "e92bc2c42efc40d1d9f0feed680e4363a6698bb82fcceab119765fcdea0a26f5"
|
|
3961
3966
|
},
|
|
3962
3967
|
{
|
|
3963
3968
|
"path": "modules/hall-ui/public/collab.css",
|
|
3964
3969
|
"mode": "0000644",
|
|
3965
|
-
"sha256": "
|
|
3970
|
+
"sha256": "b82d7f13cf07cc15b675c1182417f477886e5096aa43b0b4f4f363e3ec0ef63e"
|
|
3966
3971
|
},
|
|
3967
3972
|
{
|
|
3968
3973
|
"path": "modules/hall-ui/public/collab.html",
|
|
3969
3974
|
"mode": "0000644",
|
|
3970
|
-
"sha256": "
|
|
3975
|
+
"sha256": "419bf4214152f1f0ae2b147f9f244fc7ecc1a3e1b8147f1608cf5430277819fb"
|
|
3971
3976
|
},
|
|
3972
3977
|
{
|
|
3973
3978
|
"path": "modules/hall-ui/public/collab.js",
|
|
3974
3979
|
"mode": "0000644",
|
|
3975
|
-
"sha256": "
|
|
3980
|
+
"sha256": "d5be9280400c4a8d7ad11245f9b06625fa248dcf1ae4f07c52dd5e7f3748f5e3"
|
|
3976
3981
|
},
|
|
3977
3982
|
{
|
|
3978
3983
|
"path": "modules/hall-ui/public/collab.states.json",
|
|
3979
3984
|
"mode": "0000644",
|
|
3980
|
-
"sha256": "
|
|
3985
|
+
"sha256": "861a5e18178bd4b9517800cbabe818bd45179aea54ce45f56fd8d1a562cb71b5"
|
|
3981
3986
|
},
|
|
3982
3987
|
{
|
|
3983
3988
|
"path": "modules/hall-ui/public/copy-desk.css",
|
|
3984
3989
|
"mode": "0000644",
|
|
3985
|
-
"sha256": "
|
|
3990
|
+
"sha256": "93221e477392f2a9fc131b53ba66a7c41b4dc2fc6fab6ce796c0d072a58a0d29"
|
|
3986
3991
|
},
|
|
3987
3992
|
{
|
|
3988
3993
|
"path": "modules/hall-ui/public/copy-desk.html",
|
|
3989
3994
|
"mode": "0000644",
|
|
3990
|
-
"sha256": "
|
|
3995
|
+
"sha256": "fb2aa38810c78e6285268588b1f9c2f3dc705683557f820606a3f392af2f805d"
|
|
3991
3996
|
},
|
|
3992
3997
|
{
|
|
3993
3998
|
"path": "modules/hall-ui/public/copy-desk.js",
|
|
3994
3999
|
"mode": "0000644",
|
|
3995
|
-
"sha256": "
|
|
4000
|
+
"sha256": "c39d18bc798ff6a084092a63b3d684079720c8864bd42c2f631d602bfe78e570"
|
|
3996
4001
|
},
|
|
3997
4002
|
{
|
|
3998
4003
|
"path": "modules/hall-ui/public/copy-desk.states.json",
|
|
3999
4004
|
"mode": "0000644",
|
|
4000
|
-
"sha256": "
|
|
4005
|
+
"sha256": "fb39c8d4ecdf3f36ac74560df924400237573a9be483e9e3b6163153d7d5c8b1"
|
|
4001
4006
|
},
|
|
4002
4007
|
{
|
|
4003
4008
|
"path": "modules/hall-ui/public/copy-on-click.js",
|
|
@@ -4287,7 +4292,7 @@
|
|
|
4287
4292
|
{
|
|
4288
4293
|
"path": "modules/hall-ui/public/oversight.css",
|
|
4289
4294
|
"mode": "0000644",
|
|
4290
|
-
"sha256": "
|
|
4295
|
+
"sha256": "7c6c29c37950665c90606b846afb6381628d2ab4c362be604bcf359831525051"
|
|
4291
4296
|
},
|
|
4292
4297
|
{
|
|
4293
4298
|
"path": "modules/hall-ui/public/pair.css",
|
|
@@ -4792,7 +4797,7 @@
|
|
|
4792
4797
|
{
|
|
4793
4798
|
"path": "modules/lifecycle/help-requests.js",
|
|
4794
4799
|
"mode": "0000644",
|
|
4795
|
-
"sha256": "
|
|
4800
|
+
"sha256": "7c8b80be5e27dfed4a547ad6a7df414e40a5044d78358446c7d845c839079128"
|
|
4796
4801
|
},
|
|
4797
4802
|
{
|
|
4798
4803
|
"path": "modules/lifecycle/hierarchy.js",
|
|
@@ -6337,7 +6342,7 @@
|
|
|
6337
6342
|
{
|
|
6338
6343
|
"path": "modules/ui-design/module.json",
|
|
6339
6344
|
"mode": "0000644",
|
|
6340
|
-
"sha256": "
|
|
6345
|
+
"sha256": "31e80de5f689a2bdaf5eb0ebbb31cc96de99b2e1fe31b0eba9d7f9515d07f0a5"
|
|
6341
6346
|
},
|
|
6342
6347
|
{
|
|
6343
6348
|
"path": "modules/ui-design/scripts/design-sync.js",
|
|
@@ -6357,18 +6362,38 @@
|
|
|
6357
6362
|
{
|
|
6358
6363
|
"path": "modules/ui-design/skills/PREAMBLE.md",
|
|
6359
6364
|
"mode": "0000644",
|
|
6360
|
-
"sha256": "
|
|
6365
|
+
"sha256": "ecb2539b28bb7dfce1554d6b2416afc91cb1d548c9aca6cd5f7e86e0cd1c7549"
|
|
6361
6366
|
},
|
|
6362
6367
|
{
|
|
6363
6368
|
"path": "modules/ui-design/skills/README.md",
|
|
6364
6369
|
"mode": "0000644",
|
|
6365
|
-
"sha256": "
|
|
6370
|
+
"sha256": "018332aa1b1dae06abfecdd96b64cdd0f99132be1c925b2a77484e69865c83f3"
|
|
6371
|
+
},
|
|
6372
|
+
{
|
|
6373
|
+
"path": "modules/ui-design/skills/design-taste-frontend-v1/SKILL.md",
|
|
6374
|
+
"mode": "0000644",
|
|
6375
|
+
"sha256": "5e461056c3e6fa4775cc6734b55bf6d5c050f01e0ee7a52378a9f4ab5501da28"
|
|
6376
|
+
},
|
|
6377
|
+
{
|
|
6378
|
+
"path": "modules/ui-design/skills/design-taste-frontend/SKILL.md",
|
|
6379
|
+
"mode": "0000644",
|
|
6380
|
+
"sha256": "ee07bdde8e388b2863431673390d4bff74ee1296920ebcb07b529060eb7f8959"
|
|
6381
|
+
},
|
|
6382
|
+
{
|
|
6383
|
+
"path": "modules/ui-design/skills/high-end-visual-design/SKILL.md",
|
|
6384
|
+
"mode": "0000644",
|
|
6385
|
+
"sha256": "eeb33e0a2d0a227d23b67c5e6d32c5757d8d5d7249a1a6d0fe3c67d8bd95fc91"
|
|
6366
6386
|
},
|
|
6367
6387
|
{
|
|
6368
6388
|
"path": "modules/ui-design/skills/policy.json",
|
|
6369
6389
|
"mode": "0000644",
|
|
6370
6390
|
"sha256": "f73cb4ce230ffbd940a4aa00742f5d09e736a8f70402c155d1933618e70392d7"
|
|
6371
6391
|
},
|
|
6392
|
+
{
|
|
6393
|
+
"path": "modules/ui-design/skills/redesign-existing-projects/SKILL.md",
|
|
6394
|
+
"mode": "0000644",
|
|
6395
|
+
"sha256": "22e8f7ea0d206b3f4b2243b986a4dcd10df4ba0198aa063e76ef4d2788fec55d"
|
|
6396
|
+
},
|
|
6372
6397
|
{
|
|
6373
6398
|
"path": "modules/ui-design/styles/README.md",
|
|
6374
6399
|
"mode": "0000644",
|
|
@@ -6437,12 +6462,12 @@
|
|
|
6437
6462
|
{
|
|
6438
6463
|
"path": "package-lock.json",
|
|
6439
6464
|
"mode": "0000644",
|
|
6440
|
-
"sha256": "
|
|
6465
|
+
"sha256": "3ca799f0609f1ad2e4bfea78e7bba57f976b6df4df4cefad5e0229e3f5e2a8ab"
|
|
6441
6466
|
},
|
|
6442
6467
|
{
|
|
6443
6468
|
"path": "package.json",
|
|
6444
6469
|
"mode": "0000644",
|
|
6445
|
-
"sha256": "
|
|
6470
|
+
"sha256": "8ea4badf28d81545fe9d546df94c49da9980c78650f8a7fdc13a8b907168787c"
|
|
6446
6471
|
},
|
|
6447
6472
|
{
|
|
6448
6473
|
"path": "public-docs/index.html",
|
|
@@ -6817,7 +6842,7 @@
|
|
|
6817
6842
|
{
|
|
6818
6843
|
"path": "scripts/gds/docs-entropy.js",
|
|
6819
6844
|
"mode": "0000644",
|
|
6820
|
-
"sha256": "
|
|
6845
|
+
"sha256": "a4357b36e7e005895021f55db27f83d40e7fded3534ed9ee3d50162945e2cea7"
|
|
6821
6846
|
},
|
|
6822
6847
|
{
|
|
6823
6848
|
"path": "scripts/gds/doctor.js",
|
|
@@ -8092,7 +8117,7 @@
|
|
|
8092
8117
|
{
|
|
8093
8118
|
"path": "src/module-api.js",
|
|
8094
8119
|
"mode": "0000644",
|
|
8095
|
-
"sha256": "
|
|
8120
|
+
"sha256": "2f2268d16d20bc3ae5c531c9bab8faae7a323a0517c4b9692dc7d10fd3fd5d26"
|
|
8096
8121
|
},
|
|
8097
8122
|
{
|
|
8098
8123
|
"path": "src/module-loader/catalog.js",
|
|
@@ -8662,7 +8687,7 @@
|
|
|
8662
8687
|
{
|
|
8663
8688
|
"path": "tests/collab_page.mjs",
|
|
8664
8689
|
"mode": "0000644",
|
|
8665
|
-
"sha256": "
|
|
8690
|
+
"sha256": "5b2872cd852218e4af5c6002318a1f72c677c417bcc43bf47a9fa8e23edb14f2"
|
|
8666
8691
|
},
|
|
8667
8692
|
{
|
|
8668
8693
|
"path": "tests/conductor.mjs",
|
|
@@ -8952,7 +8977,7 @@
|
|
|
8952
8977
|
{
|
|
8953
8978
|
"path": "tests/docs_entropy.mjs",
|
|
8954
8979
|
"mode": "0000644",
|
|
8955
|
-
"sha256": "
|
|
8980
|
+
"sha256": "0dda5513bb550dbcf24c8016e01db07100eefec3abe14fc65d5bc06a1e57e026"
|
|
8956
8981
|
},
|
|
8957
8982
|
{
|
|
8958
8983
|
"path": "tests/docs_openapi_route.mjs",
|
|
@@ -9464,6 +9489,11 @@
|
|
|
9464
9489
|
"mode": "0000644",
|
|
9465
9490
|
"sha256": "bb66cec6b745cd6e50efd8828d05a75aa68fbc50ed43d8a49988c1246bfd3324"
|
|
9466
9491
|
},
|
|
9492
|
+
{
|
|
9493
|
+
"path": "tests/hall_collab_world.mjs",
|
|
9494
|
+
"mode": "0000644",
|
|
9495
|
+
"sha256": "b477954a1c691c367e566ddaa7f3c7c877e6ac61670c1d817da4dbff9b5efbff"
|
|
9496
|
+
},
|
|
9467
9497
|
{
|
|
9468
9498
|
"path": "tests/hall_error_envelope.mjs",
|
|
9469
9499
|
"mode": "0000644",
|
|
@@ -11002,7 +11032,7 @@
|
|
|
11002
11032
|
{
|
|
11003
11033
|
"path": "tests/ui_design_skills.mjs",
|
|
11004
11034
|
"mode": "0000644",
|
|
11005
|
-
"sha256": "
|
|
11035
|
+
"sha256": "73a4c7e6b29f2703b866f3241a459fd0c4a57b7b606f0058905306b624134b1b"
|
|
11006
11036
|
},
|
|
11007
11037
|
{
|
|
11008
11038
|
"path": "tests/ui_design_styles.mjs",
|
|
@@ -55,11 +55,18 @@ Generated code uses the `--dt-*` variables; adapters write only `src/ui/<surface
|
|
|
55
55
|
- **Figma** (`/figma-design-sync`): push the current state so a designer never opens a stale file; land their edit back as committed code. Canvas art that won't translate becomes an asset, never forced into code.
|
|
56
56
|
- Both are adapters against `modules/ui-design/docs/design-contract.md`; a third tool is a third adapter, not a new integration.
|
|
57
57
|
|
|
58
|
-
## The vetted skills (the ui-design module's `skills/`)
|
|
58
|
+
## The vetted skills and the in-house rebuilds (the ui-design module's `skills/`)
|
|
59
59
|
|
|
60
|
-
Third-party design skills reach a builder only through the module's vendoring policy ([`modules/ui-design/skills/README.md`](../../../modules/ui-design/skills/README.md), ADR 0198): scanned with `/scan-before-install` and reduced to `clean` or `caution`, a licence on the allowlist, a `PROVENANCE.md` sidecar, and the PLATFORM PREAMBLE that reads the instance's world before any taste rule. A
|
|
60
|
+
Third-party design skills reach a builder only through the module's vendoring policy ([`modules/ui-design/skills/README.md`](../../../modules/ui-design/skills/README.md), ADR 0198): scanned with `/scan-before-install` and reduced to `clean` or `caution`, a licence on the allowlist, a `PROVENANCE.md` sidecar, and the PLATFORM PREAMBLE that reads the instance's world before any taste rule. A skill the module ships is listed here by name, one line each, whether vendored or rebuilt in-house; a name that is not listed is not the module's, whatever a builder's own `~/.claude/skills` carries.
|
|
61
61
|
|
|
62
|
-
- *None vendored (2026-08-28).* Both origins scanned for the scoped set — `pbakaus/impeccable`, and the eleven `Leonxlnx/taste-skill` skills (`
|
|
62
|
+
- *None vendored (2026-08-28).* Both origins scanned for the scoped set — `pbakaus/impeccable`, and the eleven `Leonxlnx/taste-skill` skills (`minimalist-ui`, `industrial-brutalist-ui`, `gpt-taste`, `stitch-design-taste`, `image-to-code`, `imagegen-frontend-web`, `imagegen-frontend-mobile`, `brandkit`, and the four below) — reduced to `dangerous` at the scanner's deterministic floor and landed as rebuild specs (GDS tasks). The roster, the verdicts and the way to land one are in the README; vendoring one anyway is an owner override recorded in an ADR, not a session's call.
|
|
63
|
+
|
|
64
|
+
**Rebuilt in-house from the specs** ([ADR 0220](../../../docs/adr/<redacted>.md), task 1003325): first-party skills at `modules/ui-design/skills/<name>/`, each opening with the same preamble, each naming its spec and what changed in translation. They run INSIDE the loop above: the world first, the style library as the palette source for a variant, images as hero plates only, every motion rule inside the Kill Switch, the kit as the pre-flight.
|
|
65
|
+
|
|
66
|
+
- **design-taste-frontend** — the default taste skill for a landing page, a portfolio or a marketing surface: the brief read in one line, three dials from presets, one world locked for the page, hero and layout discipline, rationed decoration, a pre-flight the kit measures. Declines dashboards, tables, wizards and editors.
|
|
67
|
+
- **design-taste-frontend-v1** — the earlier generation, kept distinct: a fixed baseline triple adapted in conversation, stack conventions for a served surface, the layout bans, full interaction cycles, the named vocabulary of premium patterns and the tile-grid archetypes.
|
|
68
|
+
- **high-end-visual-design** — the agency-build polish pass: one texture archetype (the library's looks) and one layout archetype per project, the nested container anatomy where the world allows a container, the pill with its nested arrow disc, the spatial rhythm, choreography and scroll entry inside the Kill Switch.
|
|
69
|
+
- **redesign-existing-projects** — the in-place upgrade: scan the stack, diagnose against the seven-group audit with the instance's world as the answer key, fix in impact-per-risk order, one group per commit; keeps the stack, never migrates frameworks, `probe.js` green before and after.
|
|
63
70
|
|
|
64
71
|
**Prerequisite, not vendored:** the **playwright plugin** (`claude plugin install playwright@claude-plugins-official`) is the LIVE browser-driving loop, where the kit in Step 2 is the headless one. Install it on the machine that runs a design session; the module never installs anything.
|
|
65
72
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# ADR 0220 — An in-house rebuilt skill is a first-party skill: it lands at `skills/<name>/`, opens with the same preamble, carries a "Rebuilt from" section instead of a sidecar, and is counted
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted (2026-09-01)
|
|
4
|
+
- **Task:** [task 1003325](https://cloudbongos.com/builders#/task/1003325) (goal 1000083 — the ui-design module as a platform capability; the first of the rebuild-spec tasks [ADR 0198](<redacted>.md) filed)
|
|
5
|
+
- **Owner intent (2026-08-28):** every builder, on every instance, can produce good-looking, functional UIs in line with that instance's world. The taste skills that produced Cloud Bongos's world were to become part of the module; the scan said they could not be copied, so they are rebuilt.
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
ADR 0198 landed both scanned origins as rebuild specs and left the roster empty. Task 1003325 is the first rebuild: the **taste core** — `design-taste-frontend` (the default), `design-taste-frontend-v1` (the preserved earlier generation), `high-end-visual-design` and `redesign-existing-projects` — from the REBUILD-SPEC in the task body, which was derived from the origin's documentation only. Three things the policy did not say:
|
|
10
|
+
|
|
11
|
+
1. **Where a rebuild lives and what it carries.** ADR 0198 §5 said a skill the module *authors* lives at `skills/<name>/` and is counted; it did not say what replaces the `PROVENANCE.md` sidecar (a rebuild has no pinned commit of its own bytes, no upstream licence text, and no scan verdict that applies to it), nor how the materialiser treats a dir with no sidecar.
|
|
12
|
+
2. **Whether the preamble fits.** `PREAMBLE.md` was written for vendored copies: it said "this skill is vendored" and "the rules below are the upstream skill's, unchanged", both false for a rebuild. The test pins every copy byte-identical to the source, so the fix had to be in the source.
|
|
13
|
+
3. **Whether five byte-identical copies are debt.** `docs-entropy.js` counts a paragraph of 120+ characters that appears verbatim in two or more tracked files, and `fitness-ratchets.js` fails the build when that count exceeds its baseline (6). The preamble is one paragraph, intentionally identical in every skill and in `PREAMBLE.md`; four rebuilds would have tripped the ratchet on the policy working as designed.
|
|
14
|
+
|
|
15
|
+
And a fourth, which is the substance: what "inside the world" means when a taste skill written for any site is rebuilt for a platform whose surfaces read only the fifteen-token contract, whose motion must die under a media query, and whose owner confines image generation to hero plates.
|
|
16
|
+
|
|
17
|
+
## Decision
|
|
18
|
+
|
|
19
|
+
1. **Home, declaration, materialisation.** A rebuilt skill is `modules/ui-design/skills/<name>/SKILL.md`, declared in `module.json` `contributes.skills`, and reaches a builder through `claude-materialize.js` step 1b exactly as a vendored one does: `moduleSkillSources` resolves the own dir first and applies `vendoredSkillGate` only to `vendor/`, so a rebuild needs no sidecar to land and cannot be refused by one. It is **first-party code**: no `vendor/` segment, so the line, duplication and doc ratchets count it. A `rebuilt/` segment exempt like `vendor/` was rejected because the whole point is that these are ours.
|
|
20
|
+
2. **One preamble, worded for both origins; provenance in a section, not a sidecar.** `PREAMBLE.md` now says the skill "ships with the module (vendored from a scanned origin, or rebuilt in-house from a spec)" and closes with "a vendored copy carries a `PROVENANCE.md` … an in-house rebuild names its rebuild spec and its ADR in the section right after this block". The block stays byte-identical everywhere (`tests/ui_design_skills.mjs` pins every own and vendored copy against the source). A rebuild's provenance is its **`## Rebuilt from`** section, first after the block: the origin repository and commit the *spec* was derived from (documentation only), the licence, the scan verdict and date, the spec task, the statement that **no upstream bytes were consulted or copied**, this ADR, and **what changed in translation** — so a reader can see where the rebuild deliberately departs from the documented behaviour. No `PROVENANCE.md`, no `LICENSE`: an in-house skill claims no upstream, and the test refuses both on an own dir.
|
|
21
|
+
3. **The translation rules** (what every rebuilt taste skill does with the upstream's opinions):
|
|
22
|
+
- The palette is the pack; **variants come from the style library** (`modules/ui-design/styles/`, ADR 0219), rendered with `--style <name>` on the kit; a look is adopted by the owner through `config/branding.json`, never by a page.
|
|
23
|
+
- The "foundation" or "design system" is the instance's `DESIGN.md`; a third-party design system named in a brief becomes an approximation labelled as such in a comment, and this skill installs nothing — a dependency is a task decision.
|
|
24
|
+
- **Imagery is hero plates and hero objects by token, and never a step.** The upstream's "generate assets first, placeholder photography second, labelled empty slots last" becomes "a slot with no plate is not a slot"; a screenshot faked from divs stays banned.
|
|
25
|
+
- **Every motion rule lives inside the Kill Switch.** Springs, magnetic hover, shared-element transitions and pointer-tracked borders need script and are named **not available** rather than kept; staggers come from an `--i` custom property in the markup; scroll entry prefers `animation-timeline` behind `@supports` and otherwise one observer-added class over a rest frame that is complete without it.
|
|
26
|
+
- The upstream's bans (the long dash, decorative labels, three equal cards, the purple-blue gradient) are **defaults an instance's `DESIGN.md` overrides**; where the world calls for something the audit would flag (the chrome world's pure-black dark, its flat hairline bands), **the world is the answer key** and the row is not a defect.
|
|
27
|
+
- Stack conventions are restated for a served platform surface (static markup, one sheet, `createElement` DOM, script only for live data), and the kit's renders are every skill's pre-flight.
|
|
28
|
+
4. **`docs-entropy.js` skips a paragraph that opens with the preamble's BEGIN marker**, beside the generated-block skip it already had, for the same reason: the duplication is the policy, not drift. The skip is narrow (the marker string) and calibrated in `tests/docs_entropy.mjs` against a duplicated plain paragraph that is still flagged.
|
|
29
|
+
5. **v1 is a distinct skill, not a version stamp.** The spec preserves the earlier generation "under its own install name so projects pinned to its exact behaviour keep working". Rebuilt, that means two files that differ in content — v1 carries the fixed baseline triple, the stack conventions, the pattern vocabulary and the tile-grid archetypes; v2 carries the brief read, the presets and the pre-flight — and a task that names neither gets the default.
|
|
30
|
+
6. **The pins** (`tests/ui_design_skills.mjs`): every own skill's frontmatter names its dir and carries a description; the preamble is first after the frontmatter, byte-identical, exactly once; the `## Rebuilt from` section names a task, ADR 0198 and "no upstream bytes"; the body names the style library and "hero plates" and contains no image mandate; no sidecar or licence text; `/design`, the skills README and the module `CLAUDE.md` list every own skill; the four skills of this task exist and are declared.
|
|
31
|
+
|
|
32
|
+
## Consequences
|
|
33
|
+
|
|
34
|
+
- **The roster is no longer empty.** Four in-house skills ship with the module and land in every instance's `.claude/skills/` where it is on. The core checkout itself still does not see module-owned skills (the materialiser's self-copy guard); task 1003330 is that step.
|
|
35
|
+
- **A builder whose `~/.claude/skills` carries the upstream under the same names** has a collision by design: the module's names are the roster's, and the materialised project-level copy is the one an instance ships. The upstream copies are that builder's own and are not read by any task here.
|
|
36
|
+
- **The scan verdict stands.** Nothing here vendors, overrides or re-scans; the rebuild specs for the impeccable method (task 1003326), the image family (1003328), the detector (1003329) and the four looks (1003327) follow this shape.
|
|
37
|
+
- **The doc ratchet now has a second intentional-duplication marker.** A third would be a sign to generalise the skip; two is not.
|
|
38
|
+
|
|
39
|
+
## Rejected
|
|
40
|
+
|
|
41
|
+
- **A `PROVENANCE.md` on a rebuild** with the spec's origin as its commit: the sidecar's fields assert a copy of those bytes under that licence and verdict, which is exactly what a rebuild is not; `vendoredSkillGate` would also have to learn a third verdict.
|
|
42
|
+
- **A second preamble for rebuilds.** Two blocks means two things to keep byte-identical and a test that has to know which is which; one block worded for both is one pin.
|
|
43
|
+
- **A `rebuilt/` dir segment exempt from the ratchets like `vendor/`.** These are our lines; counting them is the point.
|
|
44
|
+
- **Vendoring the four anyway** (ADR 0198 "what the owner can decide next"): an owner override recorded in an ADR, not a session's call, and not taken.
|
|
45
|
+
- **Folding v1 into v2 with a "v1 mode" flag.** The spec's reason for v1 is that it does not move when v2 does.
|
|
46
|
+
- **Raising `doc_duplicate_prose`'s baseline** to absorb the preamble copies: raising a baseline to pass CI is out of policy, and the duplication is not debt.
|
package/docs/adr/README.md
CHANGED
|
@@ -306,5 +306,6 @@ This keeps the decision history honest and traceable.
|
|
|
306
306
|
| 0217 | [**Rank gates INVITING, not VIEWING: the owner’s answers to the account-security review’s five blockers** ([task 1003358](https://cloudbongos.com/builders#/task/1003358) · goal 1000045; answers blockers 1000121/1000122/1000123/1000124/1000126). The 2026-08-29 account-security batch shipped fourteen tasks and deliberately refused five audience/consent questions. Four turned out to be the same question, and one answer reframed the rest. Decisions: **D1** the governing line — *rank gates the ability to INVITE; it does not gate the ability to VIEW*. Seeing what someone built across projects is not privileged (the T&C already promises that data is public by consent, to search engines included); reaching out to them costs them something, and that is where a floor belongs. So `membership_kind` is **NOT** widened — `membershipKind()` stays FIRST_ADMIN-only, the federated wire contract is unchanged, the My Projects owned/building split keeps its meaning, the cross-version window never opens, and task 1003350 is **abandoned**. A **per-project INVITE rank floor defaulting to archon** replaces it (task 1003362), set by that project’s own archons — strictly better than a founder requesting a platform-side `project.curate` grant per teammate. Viewing gains no gate, on a new cross-project achievements page that per the owner **lives on cloudbongos.com, not the hall variant** (task 1003363) — so `public-landing/` inside the apex-only region, not `modules/hall-ui/`. The risk to hold as it is built: public consented profile data and a PRIVATE account’s recruiter sliver are different material, and the sliver must not ride along — not as a row, a facet count, or a search-result absence that reveals presence. **D2** the sliver keeps its **archon floor** (blocker 1000126), and ADR 0215 D4’s defensive hold becomes a positive agreement: the invite floor also defaults to archon, and the C5 tension dissolves because C5 was about browsing. Whoever builds 1003362 must check whether it IS the console wave’s `project.recruit` atom before shipping a rival knob. **D3** the consent pair — `/terms` said acceptance is recorded “by signing in here” but the stamp is reachable only via `/sso/authorize`, which a CHILD PROJECT reaches, so a hub-only builder was never stamped and (NULL `terms_accepted_at` → `isAccountActive` false) was invisible everywhere, permanently, under no-backfill. Owner took **both halves**: correct the sentence now (task 1003353) and **capture at the hub’s own sign-in** next (task 1003361), through the `platform-identity.hub` seam so child instances see no change. On grandfathering the owner chose **B — grandfather** (task 1003360) against the recommendation, having been shown that it records a consent which did not happen; the ledger does not absorb that silently, so a grandfathered acceptance is **marked** (queryably distinct from a sign-in, via a recorded source not a magic timestamp) and `/terms` **says so**. ADR 0213’s honest property is not “every acceptance was a sign-in” but **the record never claims more than what happened**, and that survives. **D4** `/access-requests/status` **collapses** to `admitted` + one `status` of `member`|`invited`|`not_admitted` (task 1003359, the fix ADR 0209 already named). It does **not** close the oracle and must not claim to — `admitted:true` still means member-or-invited; the 1003339 limiter is what reduces enumeration, and collapsing narrows what leaks about **applicants**. The cost is paid in the same change: `login.js` is the ONLY place telling a declined applicant they were declined, so its 30-minute timeout copy is rewritten to be honest rather than promising an approval that is never coming. ⚠ Also: report 1000027 (the live SSO check-in identity hole) marked **fixed**, held open until now so the ledger would not claim a fix while the hole still served; `verifyHubAssertion`’s purpose-confusion weakness filed as report **1000028** (medium, latent — zero call sites, becomes an admission bypass the moment ADR 0201 D2.1’s vouch is minted, so the fix must land BEFORE the feature that arms it). **New invariant:** any gate added to a viewing surface, or any recruiting/invite surface below the archon floor, contradicts this ADR and needs one that supersedes it.](<redacted>.md) | platform identity / privacy / permissions |
|
|
307
307
|
| 0218 | [**The apex-root web surface: a module may own the front door, and says so with a flag, not an empty prefix** ([task 1003322](https://cloudbongos.com/builders#/task/1003322) · goal 1000080 — the last of the five tasks scoped with the owner on 2026-08-28). Carves the repo-root `public-landing/` into `modules/public-landing/`, the THIRD web-surface module after status-UI (BV1.R84) and hall-UI (BV1.R85) and the first that is not a subdomain. The obstacle: `moduleWebSurfaces()`'s whole routing vocabulary was a Host-header PREFIX, and the apex root is not a prefix of anything — it is whatever is left once the subdomains are taken. So a surface now names where it answers in exactly one of two ways, `{ host: "status.", dir }` or `{ apexRoot: true, dir }`, never both and never neither. **`host: ""` is rejected on purpose:** the routers match with `host.startsWith(s.host)` and every string starts with `""`, so an empty prefix would answer on `builders.`/`status.` too AND make `isModuleSurfaceHost()` true for every request — the predicate eleven `/builders` guards use to step aside — silently un-serving the hall. A boolean cannot be mistaken for a prefix. The landing keeps its DEDICATED serving block (the hall precedent): the apex-only strip, the branding stamp, the `?v=` content stamp and the six routes are untouched; only `LANDING_DIR` changes, from a hardcoded path to a lookup through the loader, resolved by the `apexRoot` PREDICATE so neither `platform-server.js` nor `serve-internal.js` names a module key (ADR 0083 §Decision #4). Disabling the module removes the front door outright and the apex answers the game-less 404 tail — the module contract's "disable without breaking anything" in its most literal form. At most one apex-root surface: the first discovered wins and a second is logged. Also: the BV1.R76 host-identity gate learned that an **apex-only region is exempt** — the server deletes it on every non-hub instance, so it cannot make a child render the hub's brand, which is the failure that gate names. Evidence: the five apex pages hashed as served, before and after, differ by exactly the same 22 bytes — `"public-landing":true,`, the module's own `window.__MODULES__` entry — and are otherwise identical; the 106 moved files hash identically on disk.](<redacted>.md) |
|
|
308
308
|
| 0219 | [**A look is a branding pack: the style library ships looks as `theme.ui` overlays, never as sheets** ([task 1003323](https://cloudbongos.com/builders#/task/1003323) · goal 1000083). The owner scoped "varying ui styles" for the ui-design module; the shape was decided by three facts: every served sheet already reads only the contract and is measured by a suite that resolves its own expressions under the pack (ADR 0196), the pack is one-mode (light values; dark is each sheet's black tier), and the world round's candidate token layers were sheets, not packs. Decisions: **D1** a look is `modules/ui-design/styles/<name>/` = `pack.json` (the `theme.ui` overlay, exactly the thirteen colours + the two font stacks and their links) + `DESIGN.md` (the derived recipes in the root DESIGN.md's frontmatter shape, thirteen in lockstep with the pack) + `mock.html` (a specimen with no `:root`, served through the stub with the pack spliced in), never a fork of a sheet; a sixteenth token is a contract change. **D2** `chrome-world` is canonical and pinned byte-for-byte to the neutral pack; its DESIGN.md points at the root one. **D3** the alternates `expedition` (natgeo-editorial) and `grove` (organic-cards) are ported by retuning the thirteen against the three sheets' own pair lists in both modes until every pair clears AA (the grove's sage lifted and its inks deepened for the hub's status vocabulary and the hall's chips); dark under both is the sheets' black. **D4** the picker rides `GDS_BRANDING_FILE`, the fixed knob `src/branding.js` already has: `STYLE=<name>` on the stub, `--style` on render/probe, `--pack <name>` on contrast/check-mock; no core change. **D5** the three token suites take `UI_DESIGN_PACK` and their drift tests keep measuring against the neutral pack; `tests/ui_design_styles.mjs` runs them once per alternate and proves the knob live with a pack that must fail. **D6** an instance adopts a look by copying `theme` into `config/branding.json`; what stays the platform's whichever look is on: the dark ground, the hall's verification vocabulary, every sheet's derived tier, the floors. Rejected: sheets per look beside world.css; a dark tier in the contract; a picker that writes the host boundary.](<redacted>.md) | ui-design / branding contract |
|
|
309
|
+
| 0220 | [**An in-house rebuilt skill is a first-party skill: it lands at `skills/<name>/`, opens with the same preamble, carries a "Rebuilt from" section instead of a sidecar, and is counted** ([task 1003325](https://cloudbongos.com/builders#/task/1003325) · goal 1000083). ADR 0198 landed both scanned origins as rebuild specs and left the roster empty; this is the first rebuild — the taste core: `design-taste-frontend`, `design-taste-frontend-v1`, `high-end-visual-design`, `redesign-existing-projects` — and the policy had not said where a rebuild lives, what replaces `PROVENANCE.md`, whether a preamble written for vendored copies still fits, or whether five byte-identical copies of it trip the doc-entropy ratchet (they would have: baseline 6). Decisions: **D1** a rebuild is `modules/ui-design/skills/<name>/SKILL.md`, declared in `module.json`, materialised by step 1b's own-dir branch (no sidecar gate), first-party and counted by every ratchet — no `rebuilt/` exemption like `vendor/`, because these are our lines. **D2** one preamble worded for both origins ("vendored from a scanned origin, or rebuilt in-house from a spec"), still byte-identical everywhere; a rebuild's provenance is its `## Rebuilt from` section first after the block: the origin the SPEC was derived from (documentation only), the verdict, the spec task, "no upstream bytes consulted or copied", this ADR, and what changed in translation; no `PROVENANCE.md`, no `LICENSE`. **D3** the translation rules for every rebuilt taste skill: the palette is the pack and variants come from the style library (ADR 0219); the design system is the instance's `DESIGN.md`; imagery is hero plates and hero objects by token and never a step; every motion rule lives inside the Kill Switch (springs, magnetic hover, pointer-tracked borders are named *not available*); the upstream's bans are defaults an instance's `DESIGN.md` overrides, and where the world calls for what an audit would flag, the world is the answer key. **D4** `docs-entropy.js` skips a paragraph opening with the preamble marker beside its generated-block skip, calibrated against a plain duplicate that is still flagged. **D5** v1 is a distinct skill differing in content (the fixed triple, the stack conventions, the pattern vocabulary, the tile-grid archetypes), not a version stamp. **D6** the pins in `tests/ui_design_skills.mjs`: frontmatter name = dir, preamble first and once, the section's task link + ADR 0198 + "no upstream bytes", the style library and "hero plates" named, no image mandate, no sidecar, every door lists the four. Rejected: a sidecar with the spec's commit; a second preamble; a `rebuilt/` segment; vendoring anyway (an owner override, not taken); folding v1 into v2; raising the doc baseline.](<redacted>.md) | ui-design / skills |
|
|
309
310
|
|
|
310
311
|
> ⚠️ **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.
|