@bongos/core 1.19.462 → 1.19.464

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.
Files changed (42) hide show
  1. package/.bongos-core.json +92 -42
  2. package/.claude/skills/design/SKILL.md +5 -1
  3. package/docs/adr/0222-the-image-family-under-the-hero-only-rule.md +36 -0
  4. package/docs/adr/README.md +1 -0
  5. package/docs/copy-inventory.md +122 -125
  6. package/docs/copy-registry.json +306 -322
  7. package/docs/file-map.md +2 -2
  8. package/docs/module-api-changelog.md +4 -0
  9. package/modules/hall-ui/public/goals-lib.js +10 -6
  10. package/modules/hall-ui/public/goals-page.js +27 -12
  11. package/modules/hall-ui/public/goals-render.js +83 -52
  12. package/modules/hall-ui/public/goals.css +129 -120
  13. package/modules/hall-ui/public/goals.html +29 -11
  14. package/modules/hall-ui/public/goals.states.json +71 -3
  15. package/modules/hall-ui/public/people.css +27 -0
  16. package/modules/hall-ui/public/people.html +15 -7
  17. package/modules/hall-ui/public/people.js +111 -22
  18. package/modules/hall-ui/public/people.states.json +31 -1
  19. package/modules/hall-ui/public/scouting.html +30 -17
  20. package/modules/hall-ui/public/scouting.states.json +7 -2
  21. package/modules/hall-ui/public/sessions.css +18 -15
  22. package/modules/hall-ui/public/sessions.html +27 -22
  23. package/modules/hall-ui/public/sessions.js +32 -13
  24. package/modules/hall-ui/public/sessions.states.json +3 -2
  25. package/modules/ui-design/module.json +1 -1
  26. package/modules/ui-design/skills/README.md +6 -2
  27. package/modules/ui-design/skills/brandkit/SKILL.md +62 -0
  28. package/modules/ui-design/skills/image-to-code/SKILL.md +66 -0
  29. package/modules/ui-design/skills/imagegen-frontend-mobile/SKILL.md +62 -0
  30. package/modules/ui-design/skills/imagegen-frontend-web/SKILL.md +83 -0
  31. package/modules/ui-design/styles/grove/DESIGN.md +1 -1
  32. package/modules/ui-design/styles/grove/assets/grove-pod-cut.webp +0 -0
  33. package/modules/ui-design/styles/grove/assets/grove-pod-cut.webp.json +12 -0
  34. package/modules/ui-design/styles/grove/assets/grove-pod.jpg +0 -0
  35. package/modules/ui-design/styles/grove/assets/grove-pod.jpg.json +12 -0
  36. package/modules/ui-design/styles/grove/mock.html +15 -1
  37. package/package-lock.json +2 -2
  38. package/package.json +1 -1
  39. package/src/module-api.js +1 -1
  40. package/tests/hall_roster_world.mjs +287 -0
  41. package/tests/ui_design_skills.mjs +52 -0
  42. package/modules/hall-ui/public/scouting.js +0 -73
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.462",
6
- "core_contract": "1.19.462",
7
- "source_commit": "5a6c95f3a72c1ce7545fae6790a64a9350e51421",
5
+ "core_version": "1.19.464",
6
+ "core_contract": "1.19.464",
7
+ "source_commit": "ee6e86603d465d87cccb18bc7a53b4e732dd3ec6",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-02T00:41:58.939Z",
9
+ "built_at": "2026-09-02T01:17:20.251Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 400,
12
+ "docs_redacted": 405,
13
13
  "agent_docs_stubbed": 24,
14
- "functional_verbatim": 1816,
14
+ "functional_verbatim": 1821,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2240,
20
- "tree_sha256": "5374e542955404a28c6fca59d1b6a97bb38c97bf041d54ee23d33fc042b2c1d8",
19
+ "file_count": 2250,
20
+ "tree_sha256": "0a8510092c669d2326c912c5d43bee468ee9474b55d62c40984bc017f03dcba4",
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": "c1ed5d4eaffffde255ac3308490d86f0235b9ab66a9349684652bb3eae82ae57"
130
+ "sha256": "bbb135d166a4e17b6059506f794c47c27740a063a068f1ea28c62a0aee7728b0"
131
131
  },
132
132
  {
133
133
  "path": ".claude/skills/dev/SKILL.md",
@@ -1614,10 +1614,15 @@
1614
1614
  "mode": "0000644",
1615
1615
  "sha256": "aed01aaa88a3deb1fbf15a1183f07954db0c7867272e7c6bd9dd0b74327c6c34"
1616
1616
  },
1617
+ {
1618
+ "path": "docs/adr/0222-the-image-family-under-the-hero-only-rule.md",
1619
+ "mode": "0000644",
1620
+ "sha256": "29a762aef81944134084fd1c4d36ef3e27fcf8c3ab5a1ef0e724bcb6d8d29a67"
1621
+ },
1617
1622
  {
1618
1623
  "path": "docs/adr/README.md",
1619
1624
  "mode": "0000644",
1620
- "sha256": "f27631d3aa68cf8855420f62c4de01dd0c817d3b014e738fa1579bf92bfa16a3"
1625
+ "sha256": "f3bf966757af821e04a58fc8f1504bac9d93a055a3160f69bb542b8a6631ef5a"
1621
1626
  },
1622
1627
  {
1623
1628
  "path": "docs/api-reference.md",
@@ -1652,12 +1657,12 @@
1652
1657
  {
1653
1658
  "path": "docs/copy-inventory.md",
1654
1659
  "mode": "0000644",
1655
- "sha256": "3822b771bb29b4bdaaf073937c7c6447bb2aa51163585a8d596872031cb5d216"
1660
+ "sha256": "c90d1a197950bc627f1a44ae32a476703029be688997aa7ad5e00ba4e4f8a692"
1656
1661
  },
1657
1662
  {
1658
1663
  "path": "docs/copy-registry.json",
1659
1664
  "mode": "0000644",
1660
- "sha256": "feae1d0fdd7a6bd14a076eb7ce36fe1b70a41d3a2883e2df5536f7529238d4dc"
1665
+ "sha256": "5a86bf71ba2d6f83943464ee676241bec655892c52c4d5742cb259971a66a591"
1661
1666
  },
1662
1667
  {
1663
1668
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2097,7 +2102,7 @@
2097
2102
  {
2098
2103
  "path": "docs/file-map.md",
2099
2104
  "mode": "0000644",
2100
- "sha256": "dfa54c74d708e6e1375c57eb28cbe638ac5396cbbb42aad438801a47e886f72a"
2105
+ "sha256": "8224dda275200da6c94e0096c7dd7f4b88d5e57e76bb602bcf8ff325515ec991"
2101
2106
  },
2102
2107
  {
2103
2108
  "path": "docs/handoff-template.md",
@@ -2107,7 +2112,7 @@
2107
2112
  {
2108
2113
  "path": "docs/module-api-changelog.md",
2109
2114
  "mode": "0000644",
2110
- "sha256": "6dcd4c63eea2f0929fb8523047a2c91ef718040f5df303e2f9fe80adae51b400"
2115
+ "sha256": "3754b5edbe630ddb0e12f4f5c749eec704aaa7d5dd2be8b04f1680f77df387e8"
2111
2116
  },
2112
2117
  {
2113
2118
  "path": "docs/modules-contract.md",
@@ -4112,27 +4117,27 @@
4112
4117
  {
4113
4118
  "path": "modules/hall-ui/public/goals-lib.js",
4114
4119
  "mode": "0000644",
4115
- "sha256": "ece309bc16902777636cda98a6b500eec1faa5b3f164626d2a29f2437863d885"
4120
+ "sha256": "943bb6fa906e2e864c40db2366032edf19030941c4fcc49522ad886138f30d32"
4116
4121
  },
4117
4122
  {
4118
4123
  "path": "modules/hall-ui/public/goals-page.js",
4119
4124
  "mode": "0000644",
4120
- "sha256": "3f401db6c8dbba4137f1c022e6abddacca6ccf20dfb3ba32eab590893b3e22e9"
4125
+ "sha256": "aed3d6f14dc40d4ff6b07f186bc34e6d96f6ba158250b0447fc71514f6bc4980"
4121
4126
  },
4122
4127
  {
4123
4128
  "path": "modules/hall-ui/public/goals-render.js",
4124
4129
  "mode": "0000644",
4125
- "sha256": "ec5f21225ede43b581f096000ad090119c7370f5ced6ddfe47fda2c2b0a12ecb"
4130
+ "sha256": "6c3ad030507152756dd84c0c06080a3a073a62943bc300cb44b202da5554c5a1"
4126
4131
  },
4127
4132
  {
4128
4133
  "path": "modules/hall-ui/public/goals.css",
4129
4134
  "mode": "0000644",
4130
- "sha256": "67063bf8fb74cd4cbffe731356b61ef25073f29273a5fac04da28b9b1b649af6"
4135
+ "sha256": "cdf23538a1fcd121af3159bdd928c6823aa02f10912143a5af64327724eaff58"
4131
4136
  },
4132
4137
  {
4133
4138
  "path": "modules/hall-ui/public/goals.html",
4134
4139
  "mode": "0000644",
4135
- "sha256": "dd0300ff311dae0342688270b4ed3d83643ad8dbdfcfd54a126c534be25c1983"
4140
+ "sha256": "ecbd2c50f6dc00f9243417f27ed40603498cd7a8178e6701a1151d9188baff2c"
4136
4141
  },
4137
4142
  {
4138
4143
  "path": "modules/hall-ui/public/goals.js",
@@ -4142,7 +4147,7 @@
4142
4147
  {
4143
4148
  "path": "modules/hall-ui/public/goals.states.json",
4144
4149
  "mode": "0000644",
4145
- "sha256": "d140a8134491ed4b37edf3205e5e9098c9697c24313959392f1a22828eb5cc7d"
4150
+ "sha256": "8e955be7fb6aef55b6aac0c586b27963f032bab9bec743b56a5987b6276cc8d3"
4146
4151
  },
4147
4152
  {
4148
4153
  "path": "modules/hall-ui/public/government.css",
@@ -4319,20 +4324,25 @@
4319
4324
  "mode": "0000644",
4320
4325
  "sha256": "f6b2dc3a7ee452ff7121fbc0245bd554c692f6d8be1dc6285d0fa0eab2d6aed6"
4321
4326
  },
4327
+ {
4328
+ "path": "modules/hall-ui/public/people.css",
4329
+ "mode": "0000644",
4330
+ "sha256": "b3462a0363dec36994e3760f3382cbd810c9ca3b6dc0bc8ae4ba29131ce4adf8"
4331
+ },
4322
4332
  {
4323
4333
  "path": "modules/hall-ui/public/people.html",
4324
4334
  "mode": "0000644",
4325
- "sha256": "97316f402c5427723d558caf40033fa0e104b7fa62130c17dd28ed5786cb3aec"
4335
+ "sha256": "8990aff8d4ffbad5fc81dc747aa3cda14c61aba24db52ad97cf025c0e87c1709"
4326
4336
  },
4327
4337
  {
4328
4338
  "path": "modules/hall-ui/public/people.js",
4329
4339
  "mode": "0000644",
4330
- "sha256": "7e0e2f091fb8c286220bbd5f790497ab54c78e569f59519a00fa5739d11bd451"
4340
+ "sha256": "3945369a9afe93b377ec5297f5bbd3b67cb3a702efa60e388c2a9e81b502cd3c"
4331
4341
  },
4332
4342
  {
4333
4343
  "path": "modules/hall-ui/public/people.states.json",
4334
4344
  "mode": "0000644",
4335
- "sha256": "33d2b1b28f3175c0d5bea36cfcbb55da3a3b7eabdcc58c2bc7f66c3894075712"
4345
+ "sha256": "9c38735e4f4489d7de5bf15e175b2d39f936e7a0788ab169d343b0e83c038b3b"
4336
4346
  },
4337
4347
  {
4338
4348
  "path": "modules/hall-ui/public/primer.css",
@@ -4427,37 +4437,32 @@
4427
4437
  {
4428
4438
  "path": "modules/hall-ui/public/scouting.html",
4429
4439
  "mode": "0000644",
4430
- "sha256": "fde609683fc8ecc8a230d6e11ddba085f845e3a01ce76e1c45c0497cd020cf5a"
4431
- },
4432
- {
4433
- "path": "modules/hall-ui/public/scouting.js",
4434
- "mode": "0000644",
4435
- "sha256": "0109d6715ba097f2c4329fc01d7e2378a09be728d4cc829354cad3c5af1d8e89"
4440
+ "sha256": "3eb3f73fe668fdd99031f71e2a761b3d3584873728960f116e45845ad5d12d76"
4436
4441
  },
4437
4442
  {
4438
4443
  "path": "modules/hall-ui/public/scouting.states.json",
4439
4444
  "mode": "0000644",
4440
- "sha256": "8559bee71d1c7a7495dff32bda2dde1fb119fa2e92ff6729dd75f9944875dfa3"
4445
+ "sha256": "80efccfcf2963bc360853ded4618f59ca50ee055249e37891310c11dea1c55cf"
4441
4446
  },
4442
4447
  {
4443
4448
  "path": "modules/hall-ui/public/sessions.css",
4444
4449
  "mode": "0000644",
4445
- "sha256": "9dedaaae8d27de55271ae26d1562d686fa14e5bcf57b679c53cce5a4adb9d086"
4450
+ "sha256": "a76ccf7d6dabbc0a13135247d2169b59ff5b67c98148626988ee8a9e214a9d8f"
4446
4451
  },
4447
4452
  {
4448
4453
  "path": "modules/hall-ui/public/sessions.html",
4449
4454
  "mode": "0000644",
4450
- "sha256": "0bb3eebecd62980b7008ab7d0f10fb4e6c75fdeca896c9133242e8c2557ac4cd"
4455
+ "sha256": "cb5a4b2ece4f73cc2ccc29577cd5c724314260b8e7cf6790981ee06866fd4145"
4451
4456
  },
4452
4457
  {
4453
4458
  "path": "modules/hall-ui/public/sessions.js",
4454
4459
  "mode": "0000644",
4455
- "sha256": "e99046a2c0e2cb6ce9f05711ddbe6ed9d2e7536086dca16496ef0e5e8cb9a041"
4460
+ "sha256": "6cc6ea120acd76bc42901adaa57f89f98f87eadfc2088ce4f6ccaa20106347ce"
4456
4461
  },
4457
4462
  {
4458
4463
  "path": "modules/hall-ui/public/sessions.states.json",
4459
4464
  "mode": "0000644",
4460
- "sha256": "cc7928257991f5c7c4fdbfb0ce7f790ed9f0951f6ec3eeedc6ba90b122a798c8"
4465
+ "sha256": "8d50d0553d02d4cc0655c2bdf7d92710082daae6ea9bb0f150154c12c0abdeb5"
4461
4466
  },
4462
4467
  {
4463
4468
  "path": "modules/hall-ui/public/settings-sessions.js",
@@ -6347,7 +6352,7 @@
6347
6352
  {
6348
6353
  "path": "modules/ui-design/module.json",
6349
6354
  "mode": "0000644",
6350
- "sha256": "1b7e099867d2ecb1f752652a8e765fd421f87786847d0fe39527f2aa320b5167"
6355
+ "sha256": "0f88b29039e01fb908e4351d3fdac8198206782a0afdbf5156da6e02ad312d26"
6351
6356
  },
6352
6357
  {
6353
6358
  "path": "modules/ui-design/scripts/design-sync.js",
@@ -6372,7 +6377,12 @@
6372
6377
  {
6373
6378
  "path": "modules/ui-design/skills/README.md",
6374
6379
  "mode": "0000644",
6375
- "sha256": "29d570739f8b22fa030631ae623a78c2676d4dcd8f94bbf40674617b8414a7da"
6380
+ "sha256": "084b2a7757d7b6422683ac371f6448c563d2613c4c0061f077d27a335d1df2f0"
6381
+ },
6382
+ {
6383
+ "path": "modules/ui-design/skills/brandkit/SKILL.md",
6384
+ "mode": "0000644",
6385
+ "sha256": "7b5cd9e896dcdb79a4386c863a03c628b6187fe81a0380ac50ea5dabc91fa468"
6376
6386
  },
6377
6387
  {
6378
6388
  "path": "modules/ui-design/skills/design-taste-frontend-v1/SKILL.md",
@@ -6389,6 +6399,21 @@
6389
6399
  "mode": "0000644",
6390
6400
  "sha256": "eeb33e0a2d0a227d23b67c5e6d32c5757d8d5d7249a1a6d0fe3c67d8bd95fc91"
6391
6401
  },
6402
+ {
6403
+ "path": "modules/ui-design/skills/image-to-code/SKILL.md",
6404
+ "mode": "0000644",
6405
+ "sha256": "9c07a2328416874d69897bada333f955a93ef165eb128f073fb3bf40baef2d1e"
6406
+ },
6407
+ {
6408
+ "path": "modules/ui-design/skills/imagegen-frontend-mobile/SKILL.md",
6409
+ "mode": "0000644",
6410
+ "sha256": "664f64d1f16afb10d3027fcd7dc50031e0f090f75cf5ee72258adc78e2e2ff73"
6411
+ },
6412
+ {
6413
+ "path": "modules/ui-design/skills/imagegen-frontend-web/SKILL.md",
6414
+ "mode": "0000644",
6415
+ "sha256": "75586cc997b927c7ca5ef7f3be574f4d81bd9238b01c9b66b1a5f8c587acaa14"
6416
+ },
6392
6417
  {
6393
6418
  "path": "modules/ui-design/skills/impeccable/SKILL.md",
6394
6419
  "mode": "0000644",
@@ -6542,12 +6567,32 @@
6542
6567
  {
6543
6568
  "path": "modules/ui-design/styles/grove/DESIGN.md",
6544
6569
  "mode": "0000644",
6545
- "sha256": "f88f3ff4b0475767f63d4665bdb07caeb36550e3bd8a6c66aebc7fdc1b657887"
6570
+ "sha256": "85da78fc0333ec15f59c45aa3e07c363832e72924acbf7518661d4cf76e56fc8"
6571
+ },
6572
+ {
6573
+ "path": "modules/ui-design/styles/grove/assets/grove-pod-cut.webp",
6574
+ "mode": "0000644",
6575
+ "sha256": "4479bf93fff0d067e435699b31197eed45aa2ff40effd737c0d0a58810ca64f9"
6576
+ },
6577
+ {
6578
+ "path": "modules/ui-design/styles/grove/assets/grove-pod-cut.webp.json",
6579
+ "mode": "0000644",
6580
+ "sha256": "c529d5fbe89908ac0e273020a3d82fe961c8591d1d2ff5396dd811a90a6f21ac"
6581
+ },
6582
+ {
6583
+ "path": "modules/ui-design/styles/grove/assets/grove-pod.jpg",
6584
+ "mode": "0000644",
6585
+ "sha256": "c1804e737f57b32f2d6e4a8a45e20fc5f3667b9d8082967811f3da153c3c8f78"
6586
+ },
6587
+ {
6588
+ "path": "modules/ui-design/styles/grove/assets/grove-pod.jpg.json",
6589
+ "mode": "0000644",
6590
+ "sha256": "b4dfeca544f49d97425a3a44f8170ce35b35ba1d105f4a5cfd69ea92d0cab67e"
6546
6591
  },
6547
6592
  {
6548
6593
  "path": "modules/ui-design/styles/grove/mock.html",
6549
6594
  "mode": "0000644",
6550
- "sha256": "ee2fdbe6a16ff00be4986e8c30a3d0fb37a8a077ad83a039610b22f2d20ce835"
6595
+ "sha256": "0cca9a34bc828c30067b1007be0aaa1751e3a6b31ced65dd43e1ecdd1e6bfaf8"
6551
6596
  },
6552
6597
  {
6553
6598
  "path": "modules/ui-design/styles/grove/mock.states.json",
@@ -6562,12 +6607,12 @@
6562
6607
  {
6563
6608
  "path": "package-lock.json",
6564
6609
  "mode": "0000644",
6565
- "sha256": "cc48f9622b76910048e8eddee004dd0fa872e622a03e72c6e578c3aa9d3f3a01"
6610
+ "sha256": "732ce8cbd9c2edfa91b96651f2267647929359f7374f36054766c037fcaef5c2"
6566
6611
  },
6567
6612
  {
6568
6613
  "path": "package.json",
6569
6614
  "mode": "0000644",
6570
- "sha256": "dd5a515d9dffdd6839d708e4d16aae0b441ddb99358a21cd665d586dc7d22552"
6615
+ "sha256": "a2e4a17551cc6ef235ebbb842898b99b596b006eac1176aafdbedddbc8f96c0b"
6571
6616
  },
6572
6617
  {
6573
6618
  "path": "public-docs/index.html",
@@ -8217,7 +8262,7 @@
8217
8262
  {
8218
8263
  "path": "src/module-api.js",
8219
8264
  "mode": "0000644",
8220
- "sha256": "f2fccddc6dcaed3d8e767e6937db4c9f3aa6a3f3d6114bd1a89bbc2094bffdce"
8265
+ "sha256": "95f84943307e1c1f0062ae9eb0420d5a649c62d9b461fb46e7a4a154bcde6c6d"
8221
8266
  },
8222
8267
  {
8223
8268
  "path": "src/module-loader/catalog.js",
@@ -9634,6 +9679,11 @@
9634
9679
  "mode": "0000644",
9635
9680
  "sha256": "09a7aadf345c75208af035a0f6fad1ecfe10ff056b025d885361647d4e8127b9"
9636
9681
  },
9682
+ {
9683
+ "path": "tests/hall_roster_world.mjs",
9684
+ "mode": "0000644",
9685
+ "sha256": "1791571b220385664394e77546cdf7359147c3f3d32b56938290bec4294c6020"
9686
+ },
9637
9687
  {
9638
9688
  "path": "tests/hall_signout.mjs",
9639
9689
  "mode": "0000644",
@@ -11132,7 +11182,7 @@
11132
11182
  {
11133
11183
  "path": "tests/ui_design_skills.mjs",
11134
11184
  "mode": "0000644",
11135
- "sha256": "391f6e8c5ff83e4c3c1e2148aed74c3346200efabc59657ac99820cfcfdac1ac"
11185
+ "sha256": "155aa8b197f52ec73d3654ac8cb15134998e4de81fbbf37e8d7e423efebb94b1"
11136
11186
  },
11137
11187
  {
11138
11188
  "path": "tests/ui_design_styles.mjs",
@@ -61,13 +61,17 @@ Third-party design skills reach a builder only through the module's vendoring po
61
61
 
62
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
63
 
64
- **Rebuilt in-house from the specs** ([ADR 0220](../../../docs/adr/<redacted>.md), task 1003325; [ADR 0221](../../../docs/adr/<redacted>.md), task 1003326): 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.
64
+ **Rebuilt in-house from the specs** ([ADR 0220](../../../docs/adr/<redacted>.md), task 1003325; [ADR 0221](../../../docs/adr/<redacted>.md), task 1003326; [ADR 0222](../../../docs/adr/<redacted>.md), task 1003328): 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
65
 
66
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
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
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
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.
70
70
  - **impeccable** — the design-craft method as one skill with sub-commands: `impeccable <sub-command> <target>` loads exactly one of eighteen playbooks (shape, critique, audit, polish, harden, onboard, animate, colorize, typeset, layout, adapt, distill, clarify, optimize, document, extract, bolder, quieter); no argument prints a menu from live project signals and never auto-runs; a bare description is routed to the closest playbook; carries the craft floor (loaded right before UI is edited, never recited) and the bounded finish (build, one kit round, one batch of fixes, at most one confirming round, stop; a read-only reviewer that answers with one of four words). No hooks, no bypass agent, no telemetry, no live server: the live loop is the playwright plugin below and the headless loop is the kit; the detector is task 1003329; native mobile declines to this loop.
71
+ - **imagegen-frontend-web** — the plate-making skill under the hero-only rule: text-free hero plates, hero objects, backdrops and orbs for the slots a composition already has (the count is the slot count, committed out loud), a composition anchor per plate that is not text-left image-right, one material / light / lens across the family, the pack as the palette lock, the instance's art pipeline key, and the pair-and-sidecar output contract (a black-ground JPEG for dark, an alpha WebP cutout for light, a `<file>.json` beside each). Never a section image, a comp or a screen; writes no page code.
72
+ - **imagegen-frontend-mobile** — the same, for the 390 and 320 compositions: portrait mastheads and fields clear of the regions a phone reserves, the first view held to one focal point, a scrim under any text over a plate. A screen is the surface's states file rendered by the kit; no phone mockups, no flows of screens; a native app target declines to this loop.
73
+ - **image-to-code** — the analyse-then-implement loop with the owner's references and the instance's world as the source of truth: a structured per-image analysis, the extraction spec, a faithful translation with drift named as the failure mode, the hero and clutter rules, a clarity checklist the kit measures. The only image it may cause is the hero plate, through imagegen-frontend-web.
74
+ - **brandkit** — the identity-system method with the strategy inferred first, the logo standard and the five concept methods; the mark is drawn as inline SVG, the colour system is the pack, the type specimen is the pack's faces on a real page, the applications are the platform's surfaces rendered by the kit, the image direction is a hero-object family, and the nine-panel board is a contact sheet of those real parts. Never a generated logo, board or mockup.
71
75
 
72
76
  **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.
73
77
 
@@ -0,0 +1,36 @@
1
+ # ADR 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
2
+
3
+ - **Status:** Accepted (2026-09-02)
4
+ - **Task:** [task 1003328](https://cloudbongos.com/builders#/task/1003328) (goal 1000083 — the ui-design module as a platform capability; the third rebuild-spec task after [ADR 0220](<redacted>.md) and [ADR 0221](<redacted>.md))
5
+ - **Owner intent (2026-08-28):** "a simple port, with ONE rewrite the upstream never had: the owner's rule that image generation is for text-free hero plates and hero objects only; UI is rebuilt from templates and the instance's world, never painted."
6
+
7
+ ## Context
8
+
9
+ The four image skills of `Leonxlnx/taste-skill` (`image-to-code`, `imagegen-frontend-web`, `imagegen-frontend-mobile`, `brandkit`) scanned `dangerous` with the rest of that origin ([ADR 0198](<redacted>.md)); their REBUILD-SPEC groups sit in the body of task 1003325. All four are built around generating **pictures of interfaces**: one design-reference image per section, one app screen per flow step inside a phone mockup, an identity board with the brand name and labels rendered into the image, and a build loop whose source of truth is the generated image. The panel flagged the eagerness mandate, the "do not be lazy with image count" rule and the must-invoke-any-image-tool directive by name. The owner's rule (2026-08-26, reaffirmed 2026-08-27, recorded in the preamble's item 4 and in the chrome world's materials table) forbids the whole category: an image with letters, a comp, a screen or a frame around one is not a hero plate.
10
+
11
+ A port that kept the method and changed only the subject had to answer what each skill *makes* when it may not make a picture of a screen.
12
+
13
+ ## Decision
14
+
15
+ 1. **The subject of every skill is the composition's plate slots, and the count is the slot count.** `imagegen-frontend-web` produces hero plates, hero objects, atmosphere backdrops and orbs for slots a surface already has (named by its `DESIGN.md`, a brief or a taste skill), commits to the list out loud, and never exceeds it; "one image per section" becomes "a plate with no slot is the floating blob the audit rejects". The composition-variety rules survive as **anchors** (field, beside-bleeding, masthead, orb, backdrop; the text-left image-right default refused by name), the palette lock becomes the pack, and cross-frame consistency becomes **one family**: one material, one key light, one lens, one ground across a surface.
16
+ 2. **A screen is the surface itself.** `imagegen-frontend-mobile` keeps the first-view rule, the mobile realities and the scrim rule, applied to portrait plates for the 390 and 320 compositions; the flow of screens is the states file rendered by the kit, the design bible is the instance's `DESIGN.md`, the phone mockup does not exist, and a native app target declines to `/design` (the same decline as `impeccable adapt`).
17
+ 3. **The source of truth for UI is the owner's references and the world, not a generated image.** `image-to-code` keeps its structured analysis, its extraction spec, its faithful-translation rule, its drift bans, its hero and clutter rules and its clarity checklist, reading the references; the one image it may cause is the hero plate, through `imagegen-frontend-web`. The "generate first, then analyse" order becomes read, extract, plate, implement.
18
+ 4. **The mark is drawn; the board is a contact sheet.** `brandkit` keeps the strategy inference, the logo standard, the five concept methods, the rhythm and the reference rule; the mark lands as inline SVG with a construction comment, the colour system as the branding pack, the type specimen as the pack's faces on a real page, the applications as the platform's surfaces rendered by the kit, the image direction as a hero-object family, and the nine-panel board as a contact sheet assembled from those real parts, a review artifact under the claim's scratch or `docs/design/`, never a generation and never under a surface's assets.
19
+ 5. **The output contract is DESIGN.md's pair and sidecar, and the key is the instance's.** What ships is the black-ground plate as JPEG for dark and the alpha cutout as WebP for light, at production size, with a `<file>.<ext>.json` sidecar beside every file (kind, model, aspect ratio, resolution, generated, round, the exact prompt, source, encoded, use), and `--plate-<name>` / `--plate-<name>-cut` tokens on `body` with root-absolute `url()`. Generation goes through the instance's art pipeline (the builder's own key at the hall's `/builders/settings#art-key` or the instance's shared key), never a credential a skill carries; the spend is logged with `cost.js` under the claim; a white ground (the model's one-in-six case) goes through the pipeline's background remover, and alpha is verified with `ffmpeg alphaextract` before a file is called a cutout. A plate is never a crop of an earlier plate.
20
+ 6. **The worked example lives in the style library's specimen, not on the front door.** The grove look's `DESIGN.md` said "this look brings none"; its specimen now carries one hero object (`styles/grove/assets/grove-pod.jpg` + `grove-pod-cut.webp`, sidecars beside them, tokens on the mock's `body`, the masthead anchor) as the proof that the skill, the pair convention and the kit's `--style` path agree, and the sentence now says so. A plate on the live front door would have been either dead weight or a design change to a surface the owner reviews; the specimen is the module's own.
21
+ 7. **The pins** (`tests/ui_design_skills.mjs`): the four exist and are declared; each names the sidecar, "text-free" and the art pipeline key in its own rules; none contains the eagerness mandate, an image-count mandate, a one-image-per-section or per-screen rule, or a must-invoke-any-image-tool directive (the ADR 0220 own-skill pins already refuse a step that mandates generating an image); `imagegen-frontend-mobile` and `brandkit` name what they will not generate. The grove specimen's plate is pinned by the existing style-library suite (the mock under the platform rules with `--pack grove`) and by the sidecar's presence beside each raster.
22
+
23
+ ## Consequences
24
+
25
+ - **Nine in-house skills ship with the module**; `/design`, the README, the module `CLAUDE.md` and `docs/file-map.md` name all nine. The core checkout still does not see them (task 1003330).
26
+ - **The style library now has one look with an asset.** The README's "a look brings no plates" default holds for the other two; a look's plates, where its owner adds them, follow this ADR's contract.
27
+ - **Three credits of the builder's own image key were spent on the worked example** (one 2k generation, one background removal), logged as art cost under the task.
28
+ - **`imagegen-frontend-mobile` is the thinnest skill of the family** by design: most of what its upstream did is the kit at 390. If an instance ever ships a native surface, the native playbooks are a new decision, not a widening of this one.
29
+
30
+ ## Rejected
31
+
32
+ - **Keeping "one image per section" for reference-only use** ("we will not ship them"): a generated section image is still a painted UI, still costs credits, and still drifts; the owner's objection was to the practice, not to the shipping.
33
+ - **Phone mockups as long as the screen inside is real** (a kit shot composited into a device frame): a frame around a screenshot is decoration the world does not have, and the shot is the evidence already.
34
+ - **A generated logo "as a starting point"**: a raster mark cannot scale, cannot be constructed, and would be reproduced from whatever the model had seen; the standard the upstream itself set (scalable, balanced, constructible) is met by drawing.
35
+ - **Landing the worked-example plate on the front door**: dead weight if unused, an owner-facing design change if used.
36
+ - **A shared `imagegen` base skill with three thin wrappers**: three files that differ only in aspect and slot are not a family; the mobile and web skills differ in what they refuse.
@@ -308,5 +308,6 @@ This keeps the decision history honest and traceable.
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
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 |
310
310
  | 0221 | [**The impeccable method is one skill with sub-command playbooks: one preamble, one playbook per request, the three homes are the instance's own files, and the origin's mechanisms are dropped rather than disabled** ([task 1003326](https://cloudbongos.com/builders#/task/1003326) · goal 1000083). `pbakaus/impeccable` scanned `dangerous` (ADR 0198: hooks written into five harness configs, a child agent with permissions bypassed, an instruction override, a live-server credential in page source, an unverified remote bundle, default-on telemetry), so its method is rebuilt from the spec. ADR 0220 fixed where a rebuild lives; it had not said how a family of sub-commands lands, what the origin's three persisted homes become, or what to do with the six spec areas whose substance is the condemned mechanism. Decisions: **D1** one skill at `skills/impeccable/`: `SKILL.md` (invocation, the menu from live signals, session setup, the three homes, the routing table, the craft floor, the bounded finish, what is not here) plus `reference/<sub-command>.md`, eighteen playbooks, exactly one loaded per request (the spec's own entry rule); the preamble pinned once in `SKILL.md` and governing every playbook; the materialiser's tree copy ships `reference/` unchanged. **D2** the three homes are the instance's files (product truth = `docs/project-context.template.md` + the pack's identity; the visual system = the root `DESIGN.md` and a look's; the brief = the task's body + a fixed brief block in the ship notes); the skill creates none, `shape` proposes diffs, `document` drafts on the claim's branch with the refresh / overwrite / merge choice. **D3** dropped, not disabled, each with a destination: hooks → none (the ship gate is the sweep, the pre-flight is the kit); the bypass agent → an ordinary read-only subagent via the Agent tool; telemetry, the remote bundle, the credential → none; the live loop → the playwright plugin driving the kit's stub, variants as states, accept = commit, discard = checkout, nothing injected; the detector → task 1003329; the asset producer → the hero-plates rule and task 1003328; native → declines to `/design`; `init`/`doctor`/`pin`/installer → the materialiser is the install. **D4** the finish is the kit in bounded rounds (build, one batched inspection, one batch of fixes, at most one confirming round, stop, one budget) and the reviewer answers with one of `clean` / `recapture` / `defects` / `contradicted` after an evidence check and its own mock inventory. **D5** the craft floor is mechanics loaded late and never recited, translated for a world that may be hairlines by rule. **D6** the pins: sixteen routed playbooks, no orphan, no preamble copy in a playbook, and nothing in the tree directing a bypass, a hook write, a settings edit, telemetry, a remote download, a credential or an override. Rejected: eighteen skills; one inline file; a hooks-lite opt-in; an elevated reviewer; a `doctor`; the native playbooks.](<redacted>.md) | ui-design / skills |
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 |
311
312
 
312
313
  > ⚠️ **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.