@bongos/core 1.19.637 → 1.19.639

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 (40) hide show
  1. package/.bongos-core.json +80 -50
  2. package/.claude/skills/builder-sequence/SKILL.md +2 -2
  3. package/.claude/skills/design/SKILL.md +2 -2
  4. package/docs/adr/0274-one-kernel-three-role-packs.md +55 -0
  5. package/docs/adr/0275-one-source-for-a-written-role-responsibility.md +50 -0
  6. package/docs/adr/README.md +2 -0
  7. package/docs/copy-inventory.md +24 -23
  8. package/docs/copy-registry.json +39 -30
  9. package/docs/file-map.md +8 -4
  10. package/docs/module-api-changelog.md +4 -0
  11. package/docs/onboarding/slash-commands.md +2 -2
  12. package/docs/packs/artist.md +82 -0
  13. package/docs/packs/engineer.md +117 -0
  14. package/docs/packs/ideator.md +135 -0
  15. package/modules/grading/grader-prompt.js +14 -0
  16. package/modules/hall-ui/public/profile.css +17 -0
  17. package/modules/hall-ui/public/profile.js +25 -1
  18. package/modules/lifecycle/ship-card.js +19 -3
  19. package/package-lock.json +2 -2
  20. package/package.json +1 -1
  21. package/scripts/gds/claim.js +21 -9
  22. package/scripts/gds/discipline-modes.json +8 -8
  23. package/scripts/gds/fitness.js +10 -0
  24. package/scripts/gds/gen-role-responsibilities.js +134 -0
  25. package/scripts/gds/publish-manifest.js +9 -0
  26. package/scripts/gds/role-pack-guard.js +142 -0
  27. package/src/module-api.js +30 -1
  28. package/src/modules.js +12 -1
  29. package/src/role-responsibilities.js +80 -0
  30. package/tests/edit_hints.mjs +1 -1
  31. package/tests/fitness.mjs +96 -0
  32. package/tests/idea_ideate_full.mjs +10 -4
  33. package/tests/module-scope-map.mjs +4 -3
  34. package/tests/module_api.mjs +1 -0
  35. package/tests/publish_manifest.mjs +2 -1
  36. package/tests/role_responsibilities.mjs +187 -0
  37. package/tests/ship_card.mjs +18 -4
  38. package/.claude/skills/dev/SKILL.md +0 -49
  39. package/.claude/skills/ideate/SKILL.md +0 -164
  40. package/.claude/skills/paint/SKILL.md +0 -71
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.637",
6
- "core_contract": "1.19.637",
7
- "source_commit": "1c08a67a41a3bf7de85545460f6803cf6c68982d",
5
+ "core_version": "1.19.639",
6
+ "core_contract": "1.19.639",
7
+ "source_commit": "01a3b3c69f079cd730ec88a36b12d3bf30562abd",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-10T04:22:04.368Z",
9
+ "built_at": "2026-09-10T16:31:46.801Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 468,
12
+ "docs_redacted": 470,
13
13
  "agent_docs_stubbed": 24,
14
- "functional_verbatim": 2100,
14
+ "functional_verbatim": 2104,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2592,
20
- "tree_sha256": "09c8365d205c14a4ae13cab5ab9eb561213f4e38cc9126033a3942e5dda81e3f",
19
+ "file_count": 2598,
20
+ "tree_sha256": "03b9b58d7185ba54ca84475a26d2b95870ba16c25ab83697ea91aadf90959e1d",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/backlog-review/SKILL.md",
@@ -97,7 +97,7 @@
97
97
  {
98
98
  "path": ".claude/skills/builder-sequence/SKILL.md",
99
99
  "mode": "0000644",
100
- "sha256": "87a255974f2fe1010bda566f461b08fb68e26aa571ee48e692f5ca9413525a47"
100
+ "sha256": "7fedadce191a9992c246d86b5853e6d2b196088bd2d944c6166624e240d5df55"
101
101
  },
102
102
  {
103
103
  "path": ".claude/skills/builder-setup/SKILL.md",
@@ -137,12 +137,7 @@
137
137
  {
138
138
  "path": ".claude/skills/design/SKILL.md",
139
139
  "mode": "0000644",
140
- "sha256": "f58b813ac63b22f8bbbdc076434866309f6220434412a3aa723af8dff847c38e"
141
- },
142
- {
143
- "path": ".claude/skills/dev/SKILL.md",
144
- "mode": "0000644",
145
- "sha256": "d0a8ba3e029784a7c8f08a990ae953720fa39b9a86b9d78e1b731bbe7d72e981"
140
+ "sha256": "6bddf6fda20ec0453af5612a96ff333fbdb140cc1a069a445ce09a439e19720a"
146
141
  },
147
142
  {
148
143
  "path": ".claude/skills/feedback/SKILL.md",
@@ -189,11 +184,6 @@
189
184
  "mode": "0000644",
190
185
  "sha256": "348bb6e8d27610848fb5f31b672c2c762f56cfb17141f7abe1a8dee0b5030bdd"
191
186
  },
192
- {
193
- "path": ".claude/skills/ideate/SKILL.md",
194
- "mode": "0000644",
195
- "sha256": "e4279d87f1f4bad8566bb69ea82278bde3a725a3879f972ad3cb34bb2cef9de5"
196
- },
197
187
  {
198
188
  "path": ".claude/skills/merge-mode/SKILL.md",
199
189
  "mode": "0000644",
@@ -229,11 +219,6 @@
229
219
  "mode": "0000644",
230
220
  "sha256": "53bfcf6c531c0aeefc1696b470ba6a746f4490501ab092766f42c501f06d453d"
231
221
  },
232
- {
233
- "path": ".claude/skills/paint/SKILL.md",
234
- "mode": "0000644",
235
- "sha256": "05a42301ac128a9a7abe3aa93158a9005af5b45afed623e8bc8cb92380d09fb3"
236
- },
237
222
  {
238
223
  "path": ".claude/skills/planning-session/SKILL.md",
239
224
  "mode": "0000644",
@@ -1889,10 +1874,20 @@
1889
1874
  "mode": "0000644",
1890
1875
  "sha256": "2fd3191d95758b5be0f84dd050cfa0244707c0c86646eaa9dd843216e754ff07"
1891
1876
  },
1877
+ {
1878
+ "path": "docs/adr/0274-one-kernel-three-role-packs.md",
1879
+ "mode": "0000644",
1880
+ "sha256": "0dad96decb62fe911ab644dad16e70a0ffe2482dfe12bcec9f2dd6329733b97d"
1881
+ },
1882
+ {
1883
+ "path": "docs/adr/0275-one-source-for-a-written-role-responsibility.md",
1884
+ "mode": "0000644",
1885
+ "sha256": "3c74137149d48fb08f4d4e865d16b21197f017d39465217dc50f4aa735307e80"
1886
+ },
1892
1887
  {
1893
1888
  "path": "docs/adr/README.md",
1894
1889
  "mode": "0000644",
1895
- "sha256": "eeb226dcbb35f522095d294952379ea8647df9f8f5048eb1754eb112e9b687af"
1890
+ "sha256": "b26332010b617b0ef5a981fe8e1e30df66e145d25c9f0b0ae5d59cb398972d10"
1896
1891
  },
1897
1892
  {
1898
1893
  "path": "docs/api-reference.md",
@@ -1927,12 +1922,12 @@
1927
1922
  {
1928
1923
  "path": "docs/copy-inventory.md",
1929
1924
  "mode": "0000644",
1930
- "sha256": "cc0e6bc28171104675ec8c4cfba69eaad07475b973cd36b3634b14dce94c7a5e"
1925
+ "sha256": "f65ce51b3d412f794bf3778d002e18a58d08925f2fd8eb0480152105c407f225"
1931
1926
  },
1932
1927
  {
1933
1928
  "path": "docs/copy-registry.json",
1934
1929
  "mode": "0000644",
1935
- "sha256": "28b19e15641338500a9251ce50bfa8e63ec8eac4fd3ea627c29f1c00c0c9a39c"
1930
+ "sha256": "8506914c63a2fa17b19dda0fb56dbd0e8c12f4710c94d95741c33bf7731e944a"
1936
1931
  },
1937
1932
  {
1938
1933
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2767,7 +2762,7 @@
2767
2762
  {
2768
2763
  "path": "docs/file-map.md",
2769
2764
  "mode": "0000644",
2770
- "sha256": "0cec3b144d8cca893b49c1d08bdacf37220dc1b670fd771656dda659bae16edc"
2765
+ "sha256": "cb99e968645b768fe425af7c6be53f38b5f52e6185f179cee471da9c2f818c45"
2771
2766
  },
2772
2767
  {
2773
2768
  "path": "docs/handoff-template.md",
@@ -2777,7 +2772,7 @@
2777
2772
  {
2778
2773
  "path": "docs/module-api-changelog.md",
2779
2774
  "mode": "0000644",
2780
- "sha256": "3e80809a3e33883a21335d5380c6bf9358d98f09ac1ccf6322c864bbbaa06892"
2775
+ "sha256": "352910d55c713789e1ff42c1adf06d47097296419000ceeb7a794b25dca46d38"
2781
2776
  },
2782
2777
  {
2783
2778
  "path": "docs/modules-contract.md",
@@ -2847,7 +2842,22 @@
2847
2842
  {
2848
2843
  "path": "docs/onboarding/slash-commands.md",
2849
2844
  "mode": "0000644",
2850
- "sha256": "8e8d5c7d0843faa2dc550a640676a824c9be319c751cf1a1cb19eaebeb86b153"
2845
+ "sha256": "174c90095ed45bf107852c017493fdd0fa3f07bdf8fbe69c09ebf77bc00747f2"
2846
+ },
2847
+ {
2848
+ "path": "docs/packs/artist.md",
2849
+ "mode": "0000644",
2850
+ "sha256": "9df84ab3113b861e29ce6ef62d7540394e683edae155168167f8702ffdb8cef6"
2851
+ },
2852
+ {
2853
+ "path": "docs/packs/engineer.md",
2854
+ "mode": "0000644",
2855
+ "sha256": "87ecb718bbac689f52e3bc640f900e738f7b79015f2ca2157c56a86d748f322c"
2856
+ },
2857
+ {
2858
+ "path": "docs/packs/ideator.md",
2859
+ "mode": "0000644",
2860
+ "sha256": "72ea3a488d28add39788e8d0be043ce62323a063d740bd0b189cb5f10ecc4c6d"
2851
2861
  },
2852
2862
  {
2853
2863
  "path": "docs/project-context.template.md",
@@ -4637,7 +4647,7 @@
4637
4647
  {
4638
4648
  "path": "modules/grading/grader-prompt.js",
4639
4649
  "mode": "0000644",
4640
- "sha256": "a2facb7de1293722b0b085a24dd4658f8205d88dd0fbebcd6d85aa634ffdc78b"
4650
+ "sha256": "6eda45aa3b849bc9e54bfc2636f26b41f2a12f9470bbb61d99f4bcc2bc06722f"
4641
4651
  },
4642
4652
  {
4643
4653
  "path": "modules/grading/grader-rubric.json",
@@ -5212,7 +5222,7 @@
5212
5222
  {
5213
5223
  "path": "modules/hall-ui/public/profile.css",
5214
5224
  "mode": "0000644",
5215
- "sha256": "1243e933c4ff11e491bac6f1791f269cc80722d6bdceeae7e5dbc1dda5c91324"
5225
+ "sha256": "00324b1682f02e426b3ae009c441f288e4e6d224240479c63d8e180d0394e5a7"
5216
5226
  },
5217
5227
  {
5218
5228
  "path": "modules/hall-ui/public/profile.html",
@@ -5222,7 +5232,7 @@
5222
5232
  {
5223
5233
  "path": "modules/hall-ui/public/profile.js",
5224
5234
  "mode": "0000644",
5225
- "sha256": "6922889598ea4c179c32cff98891a1f86d02c9eb8c1732c403f3b93ce3daceb3"
5235
+ "sha256": "f6666fc07a1790e80cbe04d4a30f42a7faf7b2ad2ebcd4070f156606517518d3"
5226
5236
  },
5227
5237
  {
5228
5238
  "path": "modules/hall-ui/public/profile.states.json",
@@ -5912,7 +5922,7 @@
5912
5922
  {
5913
5923
  "path": "modules/lifecycle/ship-card.js",
5914
5924
  "mode": "0000644",
5915
- "sha256": "2b6121aacc015dd7edd4eb1acb3ca9cf5f1a0adf62cd6dbe3f92d342717f88a4"
5925
+ "sha256": "c0e5a079c586e689d569d764526be5d99808262c9773ef17902e2416047494ab"
5916
5926
  },
5917
5927
  {
5918
5928
  "path": "modules/lifecycle/ship-preflight.js",
@@ -7707,12 +7717,12 @@
7707
7717
  {
7708
7718
  "path": "package-lock.json",
7709
7719
  "mode": "0000644",
7710
- "sha256": "262eabcdc5a5a052871db03a5a334721de892e4d927f4c069787ad763d675686"
7720
+ "sha256": "8764369ffd2116e5dba8ddb06c801c496e68275a450528ad0bde450fa251bb89"
7711
7721
  },
7712
7722
  {
7713
7723
  "path": "package.json",
7714
7724
  "mode": "0000644",
7715
- "sha256": "e62905214d126629233cda9c9bbb2d57e3b45771899b66139237607269e190fb"
7725
+ "sha256": "c6f51339c4fe0264cc3b5a2feb1fb25f4d1a50460fa51413ae47a184255c1c07"
7716
7726
  },
7717
7727
  {
7718
7728
  "path": "public-docs/index.html",
@@ -7957,7 +7967,7 @@
7957
7967
  {
7958
7968
  "path": "scripts/gds/claim.js",
7959
7969
  "mode": "0000644",
7960
- "sha256": "d925dfa3831cb3bd16b2ff1761344bd4bedf7d916613fffd9dc5d9574244f525"
7970
+ "sha256": "07603f4750d2be31e1399d61df6d1bad0dbcd62ef4784077c9030b7c091d648e"
7961
7971
  },
7962
7972
  {
7963
7973
  "path": "scripts/gds/classify-discipline.js",
@@ -8087,7 +8097,7 @@
8087
8097
  {
8088
8098
  "path": "scripts/gds/discipline-modes.json",
8089
8099
  "mode": "0000644",
8090
- "sha256": "c0c1849145999ef02f3022b22e718da8bb4fb680020124d115423f2f868834d1"
8100
+ "sha256": "a62a714209198f02ca4f964ecfd1211dd3712b946f049843a7ec921b5907f1d0"
8091
8101
  },
8092
8102
  {
8093
8103
  "path": "scripts/gds/discord-channels.js",
@@ -8172,7 +8182,7 @@
8172
8182
  {
8173
8183
  "path": "scripts/gds/fitness.js",
8174
8184
  "mode": "0000644",
8175
- "sha256": "610d76cee575fa1a87f2ff7bb84f5576f3c4a8cf2e727e6c372d76ebf9a0a340"
8185
+ "sha256": "3593c992b397333ee85f11dc2ea6325c3c96a2d1e5b813204da32c34c493b236"
8176
8186
  },
8177
8187
  {
8178
8188
  "path": "scripts/gds/gate-review.js",
@@ -8244,6 +8254,11 @@
8244
8254
  "mode": "0000644",
8245
8255
  "sha256": "b224041e4f6f71a581cfdaf8f2c0eb45b983b166b86bbeb23f9f80b209454936"
8246
8256
  },
8257
+ {
8258
+ "path": "scripts/gds/gen-role-responsibilities.js",
8259
+ "mode": "0000644",
8260
+ "sha256": "87ca0ef984dd2caa2ad6e176d4d6faedd82515c33f49ebb35f63229217c5e2e0"
8261
+ },
8247
8262
  {
8248
8263
  "path": "scripts/gds/gen-session-index.js",
8249
8264
  "mode": "0000644",
@@ -8527,7 +8542,7 @@
8527
8542
  {
8528
8543
  "path": "scripts/gds/publish-manifest.js",
8529
8544
  "mode": "0000644",
8530
- "sha256": "08c85bcb004f5a1b408a1cefcb7e47757ea42f364a29629793bd0b76771e46d2"
8545
+ "sha256": "722fba8fbec20b32627304defc05533d9f4f8688b2f094ed554e82dfa9dabe1e"
8531
8546
  },
8532
8547
  {
8533
8548
  "path": "scripts/gds/pulse.js",
@@ -8604,6 +8619,11 @@
8604
8619
  "mode": "0000644",
8605
8620
  "sha256": "084fa5c4da1e755fa0edde5ec770e5151a9f66a247bca222bc7a2366ccf61748"
8606
8621
  },
8622
+ {
8623
+ "path": "scripts/gds/role-pack-guard.js",
8624
+ "mode": "0000644",
8625
+ "sha256": "7ac55428d01852cd169bd5cb319af306a8f7798489fa89780921f4119c2f552f"
8626
+ },
8607
8627
  {
8608
8628
  "path": "scripts/gds/route-shadow-guard.js",
8609
8629
  "mode": "0000644",
@@ -9457,7 +9477,7 @@
9457
9477
  {
9458
9478
  "path": "src/module-api.js",
9459
9479
  "mode": "0000644",
9460
- "sha256": "b15a7de69ca6e8cd7c57b50dab455d6ec44a40336895c78738ad0f8ec8a25a10"
9480
+ "sha256": "4b836d646ba65252f11dea1b5dd4872e44835b94247bba3f7cb9e98b05742b54"
9461
9481
  },
9462
9482
  {
9463
9483
  "path": "src/module-loader/catalog.js",
@@ -9492,13 +9512,18 @@
9492
9512
  {
9493
9513
  "path": "src/modules.js",
9494
9514
  "mode": "0000644",
9495
- "sha256": "fa0cd5ae0450512802dca281f92385de95dfee7ca24cb711af0985a588a72cc0"
9515
+ "sha256": "dff7e5ff44a647d514dac9935453620aff12de6842f50521e80eca6c1f531571"
9496
9516
  },
9497
9517
  {
9498
9518
  "path": "src/platform-server.js",
9499
9519
  "mode": "0000644",
9500
9520
  "sha256": "4ba8c3b2e17c2faa38a872fe679e0dc7d032e79e05eb7277d76736201311dcdd"
9501
9521
  },
9522
+ {
9523
+ "path": "src/role-responsibilities.js",
9524
+ "mode": "0000644",
9525
+ "sha256": "fef8870d5f9f76f0bf8eb7bc0bb7b99badf27263fc05b00d933e19d043f54967"
9526
+ },
9502
9527
  {
9503
9528
  "path": "src/stale-timer.js",
9504
9529
  "mode": "0000644",
@@ -10422,7 +10447,7 @@
10422
10447
  {
10423
10448
  "path": "tests/edit_hints.mjs",
10424
10449
  "mode": "0000644",
10425
- "sha256": "1139ea32e7f723d97ac63dd2c862896945b69970ac5edbe0368fb427ff0fe3b2"
10450
+ "sha256": "bf15f163f4c07063c10f477168f9f45a2216070d56e7720ba3e60e17a95f221d"
10426
10451
  },
10427
10452
  {
10428
10453
  "path": "tests/effective_visibility_predicate.mjs",
@@ -10487,7 +10512,7 @@
10487
10512
  {
10488
10513
  "path": "tests/fitness.mjs",
10489
10514
  "mode": "0000644",
10490
- "sha256": "2208a1e4d3df3ce712c4e4dbc7908d20520833375a2c07c3da5d37252dd56b7a"
10515
+ "sha256": "163a9dd1851a44c38acb1210fbd7078561f9f8fd5fc54cae92734383384e83a7"
10491
10516
  },
10492
10517
  {
10493
10518
  "path": "tests/fitness_gds_ratchet.mjs",
@@ -11202,7 +11227,7 @@
11202
11227
  {
11203
11228
  "path": "tests/idea_ideate_full.mjs",
11204
11229
  "mode": "0000644",
11205
- "sha256": "5000ed6a7b1a24eced0f070e556af354c8fa9c7937f43c7b932a3ca29f8a5f35"
11230
+ "sha256": "af36a9663bca5653d525ded5adc73a78bf507bc5400672e3ee69985e93f37174"
11206
11231
  },
11207
11232
  {
11208
11233
  "path": "tests/idea_quick_guard.mjs",
@@ -11557,12 +11582,12 @@
11557
11582
  {
11558
11583
  "path": "tests/module-scope-map.mjs",
11559
11584
  "mode": "0000644",
11560
- "sha256": "470ccf8f8d5f30ce613f01db7dca4ceda00163b5df16a8a0a4ec84a947eba083"
11585
+ "sha256": "bd6fa3e2a2045af4d62a3097aeb38a5e191c7e954de4b0486de035bb3dc032ba"
11561
11586
  },
11562
11587
  {
11563
11588
  "path": "tests/module_api.mjs",
11564
11589
  "mode": "0000644",
11565
- "sha256": "cc6fb31e06f0b2accf46f1595f9548492698c88ff56c4d9f4f43c86fce6816a3"
11590
+ "sha256": "79b699129e16c31d3b3088e1e00d71f0d7f5b11e4b5d3627d4a2a32f8bc0ef79"
11566
11591
  },
11567
11592
  {
11568
11593
  "path": "tests/module_api_lazy.mjs",
@@ -12072,7 +12097,7 @@
12072
12097
  {
12073
12098
  "path": "tests/publish_manifest.mjs",
12074
12099
  "mode": "0000644",
12075
- "sha256": "5eca5f50f200166ce0fd7e40a57e18fffb135139fe558d0dda34064d426814dc"
12100
+ "sha256": "b6f9f357277902082dde8578531059e59ae9fdbd9c2194ea72fb0a71405d5ea2"
12076
12101
  },
12077
12102
  {
12078
12103
  "path": "tests/publish_reconciler.mjs",
@@ -12194,6 +12219,11 @@
12194
12219
  "mode": "0000644",
12195
12220
  "sha256": "34bb386f994042067d9efa33e9b8840b0764bd4046541ccff9f1c7e4723fadf0"
12196
12221
  },
12222
+ {
12223
+ "path": "tests/role_responsibilities.mjs",
12224
+ "mode": "0000644",
12225
+ "sha256": "9c8ecadb5ffdd9dc8a7632d432f40364fde9ab21c390cbb4530005b990601c87"
12226
+ },
12197
12227
  {
12198
12228
  "path": "tests/rot_inbox.mjs",
12199
12229
  "mode": "0000644",
@@ -12482,7 +12512,7 @@
12482
12512
  {
12483
12513
  "path": "tests/ship_card.mjs",
12484
12514
  "mode": "0000644",
12485
- "sha256": "692c96f61a6d75568c927aa754707c5860effe63fe31c476e3eb82b6d066c9b6"
12515
+ "sha256": "c55dddec249ec936a1278f1d48edea1adf15003cc454a8bfb9b1b891160be865"
12486
12516
  },
12487
12517
  {
12488
12518
  "path": "tests/ship_card_injection.mjs",
@@ -6,7 +6,7 @@ description: >-
6
6
 
7
7
  You are running a **chain**: several dependency-linked tasks, one after another, from a single kickoff. Two-thirds of the open backlog sits behind a predecessor, and shipping a task auto-promotes its dependents `backlog`→`ready` — but nothing picks the newly-unblocked task up. That gap is what this skill closes.
8
8
 
9
- This skill owns the **loop and the halt discipline**. It does not re-derive how to claim, build, or ship — `/builder-claim`, `/dev`, and `/builder-ship` own those, and you defer to them each pass.
9
+ This skill owns the **loop and the halt discipline**. It does not re-derive how to claim, build, or ship — `/builder-claim`, the claimed task's role pack (docs/packs/), and `/builder-ship` own those, and you defer to them each pass.
10
10
 
11
11
  ## The one rule
12
12
 
@@ -32,7 +32,7 @@ This skill owns the **loop and the halt discipline**. It does not re-derive how
32
32
 
33
33
  3. **Claim it** — `/builder-claim <id>`, or `node scripts/gds/claim.js <id>`.
34
34
 
35
- 4. **Build it** — follow `/dev`. Stay strictly inside the task's `touches[]`. Everything the normal task loop requires still applies: read the acceptance criteria, work test-first, commit before shipping.
35
+ 4. **Build it** — follow the claimed task's role pack (`docs/packs/engineer.md` for engineer work). Stay strictly inside the task's `touches[]`. Everything the normal task loop requires still applies: read the acceptance criteria, work test-first, commit before shipping.
36
36
 
37
37
  5. **Ship it** — `/builder-ship`. The task must reach `shipped`, not stall at `completed` or `confirmed`. A ship that does not land has not unblocked anything, so the chain cannot advance; treat it as a halt (see `ship_failed` below).
38
38
 
@@ -4,7 +4,7 @@ description: >-
4
4
  The UI design session — the operating playbook for ui-discipline work (layouts, pages, components, design systems, the hall / status / landing surfaces) on any Cloud Bongos instance. Show-first like /paint and world-first: the branding pack and DESIGN.md are read before any taste rule. Triggers: "/design", "design this page", "let's work on the UI", or a claimed ui task routing here.
5
5
  ---
6
6
 
7
- You are running a **UI design session**. Two things make it different from `/dev`: the work is judged **by looking at it** (so every step ends in a rendered screen, not a paragraph), and it is done **inside a world that is not yours** — the instance's, which you read first and never override. The `ui-design` module's [CLAUDE.md](../../../modules/ui-design/CLAUDE.md) is the reference; this file is the loop.
7
+ You are running a **UI design session**. Two things make it different from the Engineer pack (`docs/packs/engineer.md`): the work is judged **by looking at it** (so every step ends in a rendered screen, not a paragraph), and it is done **inside a world that is not yours** — the instance's, which you read first and never override. The `ui-design` module's [CLAUDE.md](../../../modules/ui-design/CLAUDE.md) is the reference; this file is the loop.
8
8
 
9
9
  ## Step 0 — the tools, then the mode
10
10
 
@@ -103,4 +103,4 @@ A look that is not listed here is not in the library. Adding one is the README's
103
103
  ## How sessions reach this skill
104
104
 
105
105
  - **Standalone:** invoke `/design` to have the loop in front of you.
106
- - **From a claim:** a `ui`-discipline task makes `claim.js` print the `/design` directive from `scripts/gds/discipline-modes.json` — one carrier, one lookup, the same map `/dev`, `/paint` and `/ideate` ride.
106
+ - **From a claim:** a `ui`-discipline task makes `claim.js` print the `/design` directive from `scripts/gds/discipline-modes.json` — one carrier, one lookup, the same registry the three core crafts ride to their role packs under `docs/packs/` (task 1002990).
@@ -0,0 +1,55 @@
1
+ # ADR 0274 — One kernel, three role packs: the always-loaded instructions stop being an engineer's
2
+
3
+ **Date:** 2026-09-10
4
+ **Context:** BONGOS-V2, goal [1000095](https://cloudbongos.com/builders#/goal/1000095) (Working area 6 — Governor / Builder / Artist / Ideator experience), criterion `wa6-kernel-and-packs`, task [1002990](https://cloudbongos.com/builders#/task/1002990). Builds on [ADR 0061](<redacted>.md) (the CLAUDE.md context budget), [ADR 0062](<redacted>.md) §7 (the core ↔ host split), [ADR 0272](<redacted>.md) (a craft is an identity, not a toolchain) and [ADR 0271](<redacted>.md) (which predicted this move: *"when declaration lands the contract MOVES into the Ideator pack"*). Its dependency, task 1002989, widened the module map to cover the methodology surfaces so this work had a wall to stand in.
5
+ **Status:** Accepted.
6
+
7
+ ## Problem
8
+
9
+ The root `CLAUDE.md` loads **in full, every session, for every craft** — and it was an engineer's document. 250 lines and 32,422 characters of claim-before-working, worktree-per-claim, `DEPS_NOT_SHIPPED`, doc-comments, `touches[]`, generated-artifact hygiene, `/merge-mode`. An ideator who came to think about an idea, and an artist who came to look at something, each paid the full token cost of a build pipeline they were not going to run, and read it as instructions addressed to them.
10
+
11
+ That is a correctness problem before it is a budget one. The file said, as its hard rule, *"every change is backed by a claimed Bongos task, no exceptions"* — while the same goal's criterion `wa6-drift-stops-the-session` says an ideator is *"pointed at ideation (which needs no claim)."* The kernel and the criterion disagreed, and the kernel is what every session actually read.
12
+
13
+ Meanwhile the craft-specific material that *did* exist lived in three slash-command skills — `/dev`, `/ideate`, `/paint`. A skill is the wrong carrier for a role's operating playbook for two reasons. Its `description` is resident in every session's skill listing whatever craft is running (the listing measured 27,022 chars against a ~8,000 budget, and `dev`/`ideate`/`paint` were three of the twenty over-length entries). And it must be *invoked* — a session that never types the slash command works from the kernel alone, which is the engineer's document again.
14
+
15
+ ## Decision
16
+
17
+ **One role-neutral kernel plus one pack per craft, bound by a registry that CI checks.**
18
+
19
+ 1. **`CLAUDE.md` is the kernel.** What Cloud Bongos is, the lifecycle in plain terms, the money, the trust boundary, the identity split, the content charter, and the navigation index. The test for a line is now two-part: *would removing it cause a mistake?* **and** *is it true for every craft?* A line that is only true for engineers moves out. Result: 250 → 216 lines, 32,422 → 22,572 chars, which clears the `fitness.js` character target it had been over.
20
+
21
+ 2. **Three packs under `docs/packs/`** — `engineer.md`, `artist.md`, `ideator.md`. **On the name:** task 1002990's own title says *"the Builder pack"*, and this ADR does not. The criterion it implements names the three crafts *Engineer, Artist, Ideator*; `CORE_DISCIPLINES` is `['engineer','artist','ideator']` (ADR 0272); and `tasks.discipline` stores `engineer`. "Builder" is the person who holds a claim in any craft — an artist is a builder too — so naming one craft's pack after it would collide with the word the rank ladder and the whole hall already use. The pack is keyed by the discipline it is bound to, because that key is what the registry looks up. The Engineer pack inherits today's methodology verbatim in substance (the loop, the working rules, the session protocol, the daily cadence, subagent routing) plus what `/dev` carried. The Ideator pack absorbs `/ideate` and writes down the two grades the criterion names: a quick idea stays **one line**, and after one is filed Claude **asks** whether to develop it into a Full Idea — five questions drawn out of the conversation, in the ideator's own words, scored on completeness. The Artist pack absorbs `/paint` and generalises it off the pixel-art pipeline (ADR 0272: the craft is core, the pipeline is an optional host module): show-first, **as little interpretation as possible** — take the brief literally, you are their hands and not their art director — and **arrive precalculated**, with the look already loaded and the options already rendered, because a session that opens with intake questions is a form.
22
+
23
+ 3. **`/dev`, `/ideate` and `/paint` are deleted.** The skill listing drops to 25,624 chars and 17 over-length descriptions.
24
+
25
+ 4. **`scripts/gds/discipline-modes.json` becomes the role registry.** A core craft names a `pack` (a file to *read*); a module-contributed discipline may still name a `skill` (a command to *invoke*), which is how `ui` → `/design` survives unchanged, as ADR 0272 requires. `claim.js` prints whichever the entry carries, with the right verb.
26
+
27
+ 5. **`scripts/gds/role-pack-guard.js` hard-fails CI** when an entry names a pack that is not in the tree, when an entry names neither pointer, when fewer than three crafts carry a pack, or when a pack exceeds its character budget (16,000 hard / 13,000 target, ratcheted just above the packs as authored).
28
+
29
+ ### Why the guard is hard when the runtime is fail-open
30
+
31
+ `claim.js` must never break a granted claim, so its registry read swallows everything. That means a pack path pointing at nothing degrades to **silence**: the builder is told their craft's label and nothing else, and the playbook that carries everything the kernel deliberately dropped never loads. The role is hollow and no error says so. CI is therefore the only place that failure can be caught — which is exactly what the criterion asks for when it says *"CI budgets each pack."*
32
+
33
+ ### Why `docs/packs/` and not `.claude/packs/`
34
+
35
+ Three reasons, in order of weight. `docs/` is already owned by the `methodology` key in `module-scope-map.js`, so the packs sit inside a wall that exists; a new top-level path would resolve to **no** key, and the scope map's own comment records what that costs — a missing key is an empty wall, and `goal-scope-check` then denies every member-authored task (the 1002690 / 1002736 / 1003124 precedent). Second, a pack must not be a skill: skills are listed in every session regardless of craft, which is the cost this ADR is removing. Third, `docs/` resolves from the core package the same way `discipline-modes.json` does, so a scaffolded instance reads the registry and the pack it names from one place with no materialisation step.
36
+
37
+ `docs/` is default-deny in the publish manifest, so `docs/packs/` is registered explicitly. The registry line and the allowlist line are only ever added or removed together — a core that shipped the registry without the packs would print, on every claim on every instance, a path that resolves to nothing: precisely the silent failure the guard exists to make loud.
38
+
39
+ ## Consequences
40
+
41
+ - **The ledger rule survives the split, and gets more honest.** The kernel keeps it in role-neutral form — *a change to project state is recorded in Bongos before it is made* — and each pack says what recording means for that craft. The engineer holds a claim; the ideator files the idea; the artist claims the work or records the review. The no-loopholes paragraph moves to the Engineer pack intact, where it is true.
42
+ - **The ship card had to move with the claim.** `modules/lifecycle/ship-card.js` routed a claimed task's "Open the work" button to `/dev`, `/paint` or `/ideate`. Left alone it would have shipped a button firing a command that no longer exists — the same divergence task 1003487 fixed in the other direction. It now points at the pack, and `tests/ship_card.mjs` asserts no core craft is routed to a slash command.
43
+ - **The ship card duplicates the registry, and a test is the shared source it cannot have.** `ship-card.js` is a module and may not require a core script across the boundary, which is why it and `claim.js` have always carried the map twice — and task 1003487 was exactly that duplication drifting. Rather than pretend the duplication away, `tests/fitness.mjs` now walks the registry entry for entry and asserts the card agrees, so a pack rename fails a test instead of shipping a hall button that opens nothing.
44
+ - **`tests/idea_ideate_full.mjs` moved with its subject.** Its thirteen assertions pinned the Full-Idea contract in `/ideate`'s prose — the same-route rule, the never-invent rule and its reason, the five-questions-are-not-restated rule. Repointing it at `docs/packs/ideator.md` is what stops the split from deleting a guard along with the file it guarded; all thirteen pass against the pack unchanged.
45
+ - **The line target is not yet met.** The kernel is 216 lines against a ~200 target — a `fitness.js` warning, not a failure, and the same warning it carried before at 250. The character target, which is the real per-session cost, is now cleared. Tightening the line count is the context-budget cluster's work (tasks 1003620, 1003687, 1003688), which the goal's audit sequenced explicitly behind this one.
46
+ - **Governor is deliberately absent.** Three packs, not four, until the owner decides. The guard's floor is `>= 3`, so adding a fourth is additive and removing a third is a failure.
47
+ - **What this unblocks.** Task 1002991 (serve composed session context from the server) and 1002992 (inject role context at start and claim) now have something to compose and inject: today the pointer is printed and read, and those tasks replace the reading with injection. Task 1003732 authors the three responsibility statements into the packs' reserved seams — the Artist pack names its own, unwritten, rather than inventing it.
48
+
49
+ ## Rejected
50
+
51
+ - **Keeping the three skills and adding packs beside them.** Two homes for one craft's playbook is how they drift, and it keeps the skill-listing cost the split exists to remove.
52
+ - **Packs as skills under `.claude/skills/packs/`.** Every session pays for every pack's description — the exact failure being fixed.
53
+ - **A fourth Governor pack "while we're in here."** The criterion defers it by name, and inventing a role's operating playbook without its owner is how the un-owned areas in this goal's audit came about.
54
+ - **Duplicating the safety rules into all three packs.** The charter forbids duplication for a reason: three copies drift and the kernel becomes the one nobody trusts. Safety stays in the kernel; craft stays in the pack.
55
+ - **Leaving `checkRolePacks` advisory, like the doc-comment check.** That check is advisory because a blocking doc-comment gate buys filler prose. This one gates a *resolvable path*, which is a fact and not a judgement, and the runtime cannot report it.
@@ -0,0 +1,50 @@
1
+ # ADR 0275 — A role's written responsibility has one source, and the pack's copy is generated
2
+
3
+ **Date:** 2026-09-10
4
+ **Context:** BONGOS-V2, goal [1000095](https://cloudbongos.com/builders#/goal/1000095) (Working area 6), criterion `wa6-written-responsibilities`, task [1003732](https://cloudbongos.com/builders#/task/1003732). Depends on [ADR 0274](<redacted>.md) (the kernel/pack split, which reserved the seam this fills) and [ADR 0272](<redacted>.md) (`CORE_DISCIPLINES`). The three sentences were fixed by the area owner on 2026-09-08.
5
+ **Status:** Accepted.
6
+
7
+ ## Problem
8
+
9
+ The criterion is one sentence: *"Each role's responsibilities are written down, and that text is what the pack teaches and the grader judges by. One source, shown on the profile, injected into the pack, referenced by grading."* Before this task the statements existed only inside the criterion record — nowhere in the tree.
10
+
11
+ The interesting half is **why one source, and not three good copies.** Three consumers need the same words: the hall profile shows a person what they are answerable for, the role pack instructs their session, and the grader judges the result. If each holds its own copy, the copies drift — and the drift has a specific, unfair shape. The project can show a builder one standard on their profile, teach a session a second, and grade the shipped work against a third. Someone is then judged by a rule they were never shown. That is the failure mode; a typo is not.
12
+
13
+ ## Decision
14
+
15
+ **One source at `src/role-responsibilities.js`, three consumers, and the one copy that *can* drift is generated and CI-gated.**
16
+
17
+ 1. **The source** is a frozen map of `discipline → the owner's sentence`, verbatim, with provenance. It imports nothing.
18
+
19
+ 2. **The hall reads it through the projection that already exists.** `clientModules()` gains `responsibilities`, scoped to the disciplines the instance offers. That projection is already injected into every served page as `window.__MODULES__`, so the profile renders the statement with no new route, no fetch, and no second copy.
20
+
21
+ 3. **The grader reads it through the doorway.** `module-api` exposes `responsibilityFor()`; `grader-prompt.js` states the craft's standard in the prompt and says plainly that it is the project's written standard, not the grader's preference.
22
+
23
+ 4. **The packs carry a GENERATED block.** `scripts/gds/gen-role-responsibilities.js` writes it between markers; `role-pack-guard.js` fails CI when it drifts.
24
+
25
+ ### Why the pack's copy is the one that needs a gate
26
+
27
+ The profile and the grader read the source at runtime and *cannot* drift — they have no copy to go stale. A markdown pack cannot require a JS module, so its copy is the only one that can. It is also the worst one to lose: the pack is what a session is actually instructed by. So the promise "one source" is enforced exactly where it is falsifiable, and asserted nowhere it is free.
28
+
29
+ The generator reads the **role registry** for its targets rather than hardcoding three filenames, so a renamed pack or a fourth craft (Governor, when the owner decides) is picked up with no edit to it.
30
+
31
+ ### Why the statement is on the kernel roster
32
+
33
+ `src/modules.js` is a `KERNEL_FILES` file and may import only the kernel, so the source joins that roster. It earns the place: two separate modules consume the same sentences, modules never import each other, and the file imports nothing — so holding it to the kernel rule costs nothing.
34
+
35
+ ## Consequences
36
+
37
+ - **`fitness.js` needed an exemption for the owner's own prose.** The ideator's statement opens *"Make good ideas"*, and `ideas` is a module key — so the no-module-keys-in-the-kernel scan flagged an English word as a module reference. Paraphrasing to satisfy a scanner is exactly what this task forbids, so the file is exempted with that reason written down. Its import *direction* is still guarded.
38
+ - **`fitness.js` was one line from its size budget, which changed the design for the better.** Registering the pack-block freshness inside `checkGeneratedArtifactsFresh` pushed the file past the 1,500-line ratchet. Rather than raise the baseline — which the check explicitly forbids — the assertion moved into `role-pack-guard.js`, which already owns the packs. One check now answers "are the packs correct": they resolve, they fit their budget, and they carry the current statement.
39
+ - **The generator matches each pack's own line ending.** The packs are `.md`: CRLF on a Windows checkout, LF in CI. A generator that always wrote `\n` would make the committed bytes platform-dependent and the freshness gate red on one checkout and green on the other, for a file nobody touched.
40
+ - **A craft with no statement renders nothing, everywhere.** `ui` is module-contributed (ADR 0272) and Governor is deferred (ADR 0274). Every consumer treats absence as a legitimate answer — no empty quote on the profile, no line in the grader prompt. A grader told "this role has no written standard" would supply its own, which is the invention this ADR exists to prevent.
41
+ - **The profile's avatar needed realigning.** The head grid is `align-items: center`, which read fine while the identity column was three short lines; the responsibility block made it tall enough that the avatar floated beside the middle of the prose instead of beside the name. Pinned to the top row. Verified in both themes in the hall preview.
42
+ - **A test enforces "no second copy" directly.** `tests/role_responsibilities.mjs` sweeps `src/`, `scripts/`, `modules/`, `tests/` and `docs/packs/` for any file repeating a statement outside the source, its generated blocks and the test's own fixture. That is the criterion's actual content, so it is asserted rather than described.
43
+
44
+ ## Rejected
45
+
46
+ - **Three hand-written paragraphs, one per pack.** The thing the criterion forbids, and the drift would be invisible.
47
+ - **A new route (`GET /role-responsibilities`) for the hall.** A fetch, a loading state and a failure mode, for static text already riding a rail that reaches every page.
48
+ - **Storing the statements in the DB.** They are not live state — they are the project's own written standard, versioned with the code that teaches and enforces them. A DB row would put the text outside code review, which is the opposite of what "written down" is for here.
49
+ - **Letting the grader compose its own description of a craft from the discipline name.** That is the invented standard the whole task removes.
50
+ - **Raising `oversized_file_count` to let `fitness.js` grow.** The ratchet says never raise the baseline to pass, and the constraint produced a better home for the check.
@@ -365,3 +365,5 @@ This keeps the decision history honest and traceable.
365
365
  | 0271 | [**The ideator surface is two halves: Bongos owns the prose, the harness owns the chrome** ([task 1003506](https://cloudbongos.com/builders#/task/1003506) · goal 1000095 — *Working area 6, Governor / Builder / Artist / Ideator experience*, criterion `wa6-kernel-and-packs`; owner idea 1000732, 2026-08-16). The ask — *no need for an ideator to see all the text and technical work, or the inner Bongos logic* — is two problems in one sentence. **The PROSE half ships here**, through three seams that already existed: a `machinery` field on `interaction-prefs` (per-PERSON, default `show`, riding the live Conductor injection rail — advisory 8, which means task [#1002514](https://cloudbongos.com/builders#/task/1002514)’s claim that `contractFor()` has zero consumers is STALE); the `ideator` directive in `discipline-modes.json` (per-ROLE, the file whose own docs say *to give a discipline its own experience later, add an entry here*); and a new surface section in `/ideate`, which the directive names as the only home of the experience. Default `show` means no existing builder changes. **The CHROME half is the harness’s and is deferred to a spike, not declared impossible** — this record was nearly written on the wrong assumption that config cannot reach it. Two real levers exist: **A**, shipped client defaults (`/focus` renders *only your last prompt, a one-line tool-call summary, and the final response*; `alwaysThinkingEnabled:false` stops thinking being generated; `showTurnDuration`/`spinnerTipsEnabled`/`statusLine` trim chrome) — but `/focus` is fullscreen-only (research preview), `viewMode`’s committability is UNVERIFIED, and thinking suppression is per-model; and **B**, an app-owned surface over `claude -p --output-format stream-json`, whose documented streaming-UI pattern (working indicator on a `tool_use` block, render on `result`) IS the ask, is model-independent, and is the recorded bias. **Bypass is REJECTED** despite the idea proposing it, on three grounds ending in a technical one: the least technical role is the worst audience for removing confirmations; the prompt was never the gate ([ADR 0016](<redacted>.md) — rank is checked server-side, and sub-Metic protected-path globs already narrow an ideator); and a project **cannot** ship it — `defaultMode: bypassPermissions` in `.claude/settings.json` silently does not take effect and starts the session in Manual. Rejected also: a hall ROOM on the Studio’s precedent (goal 1000074’s *a place, not a form*) — right for an artist, wrong here, because the ideator’s complaint is about the Claude session’s surface, which the hall does not render; and waiting on per-session declared role, whose dependency is softer than filed since `discipline` + the claim-time fork already carry the craft axis. When declaration lands the contract MOVES into the Ideator pack with nothing undone.](<redacted>.md) | roles / ideator experience / session surface |
366
366
  | 0273 | [**The hall nav can gate on a permission, and the Board Room leaves Government** ([task 1003744](https://cloudbongos.com/builders#/task/1003744) · goal 1000111 — *Working area 7, Government*, criterion `wa7-government`; owner decision 2026-09-09). `shell.js` `gateAllows()` resolved six gate keys and every one was a RANK, so a nav item whose page is gated on an ATOM had to borrow the nearest rank floor and hope the two agreed. [ADR 0266](<redacted>.md) ended that: the Board Room page asks `board.vote.cast`, which floors at XENOS deliberately (`board.js` — the floor is low *so that widening the board works*), while its nav item read the Government group's metic floor; the carve filed the gap rather than guessing at it. Latent today because the constitution seats `rank:archon`, live the moment an instance widens membership below Metic — the exact act [ADR 0175](<redacted>.md) §6 exists to make a CONFIG change — at which point those members reach the room by URL and by the `board_votes` deep link with no sidebar entry. **Decision: a `perm:<atom>` gate key, answered by the SERVER.** `NAV_PERMISSION_ATOMS` in `routes/me.js` is a frozen allowlist of the atoms a nav item may gate on; `/me` resolves each through the `government` port and returns `permissions: { atom: boolean }`; `gateAllows` reads that map and never re-derives it (the social-mode precedent — a page that decided for itself could disagree with the rest of the hall); the Board Room item declares the SAME key `requireBoardVotePage` checks, so the two cannot drift. An ALLOWLIST rather than the full resolved set, because the full set is the shape of the instance's governance and a cosmetic sidebar has no business shipping it on every page load. `permissions: null` (government off, port missing, resolver threw) means *cannot say*, not *holds nothing*, and HIDES the link — `default: false` and OFF-is-the-fallback, applied. Cosmetic throughout ([ADR 0016](<redacted>.md)): the page gate and each route's `requirePermission` are the wall. **The placement was the owner's call, and the reason this task existed:** gating honestly while leaving the item in the Government group would put a WIDER item under a narrower head, so a newcomer board member would see a group labelled "Government" holding one link — more authority than they hold. Declined; the item MOVES to the unlabeled project group after Tasks, because a sitting is work the project does, not a monitoring surface. Government's audience, head and floor are unchanged and it is rank surface throughout again. Also rejected: widening the Government head to show whenever any item inside is visible, and a single-item "Board" group. `tests/hall_nav.mjs` gained the MISSING HALF of its group invariant — it checked only that a head is never wider than its items, never that an item is wider than its own head (an orphan link under a hidden label, exactly the declined arrangement) — and `GATE_WIDTH` learned `government`, which had been `undefined` so every comparison against that group passed vacuously. The harness `/me` fixture carries `permissions`, or the item would be permanently invisible in `scripts/hall-preview`. **Not done:** no other item re-gated — `people` still reads `government` for `project.curate`.](<redacted>.md) | hall nav / permissions / government |
367
367
  | 0272 | [**A craft is an identity, not a toolchain: `artist` becomes core** ([task 1003719](https://cloudbongos.com/builders#/task/1003719) · goal 1000111 — *Government*). Reported from Discord on 2026-08-15 as "cant save preferences of role types in account page"; reproduced live 2026-09-09: `GET /me` returns `preferred_disciplines: ["artist","ideator"]` and `PATCH /me/disciplines` with that SAME array returns `422 invalid_discipline {bad:["artist"]}` — the API handing a builder a value and refusing to accept it back. **Cause:** `updateBuilderDisciplines` validates against `enabledDisciplines()`, and R59 (task 1198) put `artist` in the module half on the reasoning that the craft existed to make the game pixel art, so it rode `art-pipeline`. **That gate had stopped existing** — art-pipeline was never converted to a discovered module, there is no `modules/art-pipeline/module.json`, and so NOTHING declared `contributes.disciplines: ["artist"]`. Measured on a FULL repo checkout with the pipeline present on disk: `["engineer","ideator","ui"]`. The craft was offered by no instance in any configuration, and is unreachable by construction on a published core anyway, since [ADR 0098](<redacted>.md) excludes `modules/art-pipeline/` for a hard copyright reason (ripped reference maps). Meanwhile it stayed first-class everywhere else: the `builders.preferred_disciplines` CHECK (086/176), `tasks.discipline`, and the help-request craft roster all accept it — so a TASK could be an artist task and a PERSON could not be an artist. **The tests were green because they skipped:** the artist assertion sat behind `if (!EFFECTIVE["art-pipeline"]) return;`, always false, so the only real leg never ran. **Decision:** `artist` joins `CORE_DISCIPLINES` → `["engineer","artist","ideator"]` (migration 176 enum order); modules still contribute their own (ui-design → ui). A craft names WHO A BUILDER IS, not which toolchain ships — an instance can have artists without a pixel-art pipeline, and binding the identity to one optional module was the category error. The new invariant, pinned with no skip guard over the widest module set: anything the DB CHECK will store, some instance shape must offer. Rejected: enabling art-pipeline (impossible — absent from the package, and enabling an absent module throws at boot); writing the missing manifest (works only in a full checkout); an instance-declared discipline list (leaves the core CHECK describing a craft core cannot offer, and does not fix the vanilla case); stripping unofferable crafts from stored rows (deletes a builder stated identity to make a validator mistake look consistent). No migration — the rows were always CHECK-valid; only the validator disagreed.](<redacted>.md) | crafts / instance composition |
368
+ | 0274 | [**One kernel, three role packs: the always-loaded instructions stop being an engineer's** ([task 1002990](https://cloudbongos.com/builders#/task/1002990) · goal 1000095 — *Working area 6, Governor / Builder / Artist / Ideator experience*, criterion `wa6-kernel-and-packs`). The root `CLAUDE.md` loads in full every session for every craft, and it was an engineer's document: 250 lines / 32,422 chars of claim-before-working, worktree-per-claim, `DEPS_NOT_SHIPPED`, `touches[]` and `/merge-mode`. An ideator and an artist each paid the full token cost of a pipeline they were not going to run and read it as instructions addressed to them — and it CONTRADICTED the same goal's `wa6-drift-stops-the-session`, which says ideation *"needs no claim"*, while the kernel's hard rule said every change is backed by one. The craft-specific half lived in three SKILLS (`/dev`, `/ideate`, `/paint`), the wrong carrier twice over: a skill's description is resident in every session's listing whatever craft is running (27,022 chars against a ~8,000 budget, three of them over-length), and a skill must be INVOKED — a session that never types the command works from the kernel alone, which is the engineer's document again. **Decision: a role-neutral kernel plus one pack per craft under `docs/packs/`, bound by a registry CI checks.** The kernel keeps what is true for every craft (the lifecycle, the money, the trust boundary, the identity split, the charter, navigation) and drops to 216 lines / 22,572 chars, clearing the character target it had been over; the per-line test gains a second half — *is it true for every craft?* The Engineer pack inherits today's methodology; the Ideator pack absorbs `/ideate` and writes down the two grades the criterion names (a quick idea stays ONE LINE, then Claude ASKS whether to develop it into a Full Idea — five questions drawn out of the conversation, in the ideator's own words, scored on completeness); the Artist pack absorbs `/paint`, generalised off the pixel-art pipeline per [ADR 0272](<redacted>.md) — show-first, as little interpretation as possible, and ARRIVE PRECALCULATED, because a session that opens with intake questions is a form. The three skills are deleted. `scripts/gds/discipline-modes.json` becomes the ROLE REGISTRY: a core craft names a `pack` (a file to read), a module-contributed discipline may still name a `skill` (`ui` → `/design`, unchanged as ADR 0272 requires), and `claim.js` prints whichever with the right verb. **`scripts/gds/role-pack-guard.js` HARD-FAILS CI** on a pack path that resolves to nothing, an entry with neither pointer, fewer than three packs, or a pack over budget (16,000 hard / 13,000 target) — hard precisely BECAUSE `claim.js` fails open: a broken path degrades to silence, the role is hollow, and no error says so, so CI is the only gate ("CI budgets each pack"). `docs/packs/` over `.claude/packs/` because `docs/` is already owned by the `methodology` scope key — a new top-level path resolves to NO key, and the scope map's own comment records the cost (a missing key is an empty wall, and goal-scope-check then denies every member-authored task); it is registered explicitly in the default-deny publish allowlist, in lockstep with the registry, or a released core would print an unresolvable pack path on every claim. `ship-card.js` moved with the claim (it would have shipped an "Open the work" button firing a deleted command — the 1003487 divergence in reverse) and `tests/idea_ideate_full.mjs` moved with its subject, its thirteen Full-Idea assertions passing against the pack unchanged. Governor is deliberately DEFERRED — three packs, not four, until the owner decides; the guard floors at three. Rejected: keeping the skills beside the packs (two homes drift, and the listing cost stays); packs AS skills (the exact failure being fixed); duplicating the safety rules into all three packs (the charter forbids it — three copies drift and the kernel becomes the one nobody trusts); leaving the guard advisory like the doc-comment check (that one gates a judgement, this one gates a resolvable path). **Not done:** the kernel is 216 lines against a ~200 target — still a warning, as it was at 250; the line count is the context-budget cluster's work (tasks 1003620/1003687/1003688), which the goal's audit sequenced behind this one.](<redacted>.md) | methodology / roles / context budget |
369
+ | 0275 | [**A role's written responsibility has one source, and the pack's copy is generated** ([task 1003732](https://cloudbongos.com/builders#/task/1003732) · goal 1000095 — *Working area 6*, criterion `wa6-written-responsibilities`; statements fixed by the area owner 2026-09-08). The criterion is one sentence — *"one source, shown on the profile, injected into the pack, referenced by grading"* — and before this task the three statements existed only in the criterion record, nowhere in the tree. The interesting half is why ONE source and not three good copies: if each consumer holds its own, they drift, and the drift has a specific unfair shape — the project shows a builder one standard on their profile, teaches their session a second, and grades the shipped work against a third, so someone is judged by a rule they were never shown. **Decision: a frozen map at `src/role-responsibilities.js` (verbatim owner text, imports nothing), read by three consumers, with the one copy that CAN drift generated and CI-gated.** The hall reads it through `clientModules()` — already injected into every served page as `window.__MODULES__` and already carrying the discipline roster the statements are keyed by, so the profile renders with no new route, no fetch and no copy. The grader reads `responsibilityFor()` through the module doorway and states the standard in the prompt as the project's, not its own. The PACKS get a generated block: markdown cannot require a JS module, so their copy is the only one that can go stale — and it is the worst to lose, being what a session is actually instructed by. `gen-role-responsibilities.js` writes it from the ROLE REGISTRY (so a renamed pack, or Governor when the owner decides, needs no edit), and `role-pack-guard.js` fails CI on drift. Three consequences worth the record. (1) `fitness.js` needed an EXEMPTION for the owner's own prose: the ideator's statement opens "Make good ideas" and `ideas` is a module key, so the no-module-keys scan flagged an English word — paraphrasing to satisfy a scanner is precisely what the task forbids, so the reason is written down and the file's import DIRECTION is still guarded. (2) Registering the freshness check inside `checkGeneratedArtifactsFresh` pushed `fitness.js` one line past its 1,500-line ratchet; rather than raise the baseline (which the check forbids in its own message) the assertion MOVED into `role-pack-guard.js`, which already owns the packs — one check now answers "are the packs correct". (3) The generator matches each pack's own line ending, because `.md` checks out CRLF on Windows and LF in CI, and a generator that always wrote `\n` would make the gate red on one checkout and green on the other for a file nobody touched. A craft with no statement (`ui`, module-contributed per [ADR 0272](<redacted>.md); Governor, deferred per [ADR 0274](<redacted>.md)) renders NOTHING everywhere — no empty quote, no grader line — because a grader told a role has no written standard would supply its own. The profile's avatar was repinned to the top row (the head grid is `align-items:center`, fine for three short lines, wrong once the block made the column tall); verified in both themes in the hall preview. `tests/role_responsibilities.mjs` asserts the criterion's actual content by sweeping `src/`, `scripts/`, `modules/`, `tests/` and `docs/packs/` for any second copy. Rejected: three hand-written paragraphs (the drift would be invisible); a dedicated route for the hall (a fetch and a failure mode for static text already on a rail); storing the statements in the DB (not live state — a row puts the project's written standard outside code review); letting the grader describe a craft from its name (the invented standard this removes); raising `oversized_file_count` to let `fitness.js` grow.](<redacted>.md) | roles / grading / generated artifacts |