@bongos/core 1.19.636 → 1.19.638

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.bongos-core.json 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.636",
6
- "core_contract": "1.19.636",
7
- "source_commit": "7e7d5caa1a0c5ff310bdab82a7679fd56e2f71d7",
5
+ "core_version": "1.19.638",
6
+ "core_contract": "1.19.638",
7
+ "source_commit": "723e9b7fc7cb39a1fffb3474441e7d7fb4a9c5b0",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-10T03:45:41.270Z",
9
+ "built_at": "2026-09-10T04:53:40.693Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 468,
12
+ "docs_redacted": 469,
13
13
  "agent_docs_stubbed": 24,
14
- "functional_verbatim": 2100,
14
+ "functional_verbatim": 2101,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2592,
20
- "tree_sha256": "abf5929f41b5c8b538294d87d01632069ad0371e2e2eed440b97a9727a33d426",
19
+ "file_count": 2594,
20
+ "tree_sha256": "337913098795a0534647f0c7d09cb30af3744abd76412a735bb4601433b124c8",
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,15 @@
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
+ },
1892
1882
  {
1893
1883
  "path": "docs/adr/README.md",
1894
1884
  "mode": "0000644",
1895
- "sha256": "eeb226dcbb35f522095d294952379ea8647df9f8f5048eb1754eb112e9b687af"
1885
+ "sha256": "c62aaf29b37052be529f9a9d1a844af63d59b8bd864f49df816443d3ed1fd679"
1896
1886
  },
1897
1887
  {
1898
1888
  "path": "docs/api-reference.md",
@@ -2767,7 +2757,7 @@
2767
2757
  {
2768
2758
  "path": "docs/file-map.md",
2769
2759
  "mode": "0000644",
2770
- "sha256": "0cec3b144d8cca893b49c1d08bdacf37220dc1b670fd771656dda659bae16edc"
2760
+ "sha256": "acb9e6949bcdd928e6c9b09d6c0ab0d45a065bab8f97e323b9f7554138bece47"
2771
2761
  },
2772
2762
  {
2773
2763
  "path": "docs/handoff-template.md",
@@ -2777,7 +2767,7 @@
2777
2767
  {
2778
2768
  "path": "docs/module-api-changelog.md",
2779
2769
  "mode": "0000644",
2780
- "sha256": "74c46d5efae11f3adc3f0cb79bec6757e0f7bb820e7f77c1f66cd6fc083a503c"
2770
+ "sha256": "d6ec97aa92f3776d80dd7f0e78b3f4428b356fc7ec327b0132514ab48564dd56"
2781
2771
  },
2782
2772
  {
2783
2773
  "path": "docs/modules-contract.md",
@@ -2847,7 +2837,22 @@
2847
2837
  {
2848
2838
  "path": "docs/onboarding/slash-commands.md",
2849
2839
  "mode": "0000644",
2850
- "sha256": "8e8d5c7d0843faa2dc550a640676a824c9be319c751cf1a1cb19eaebeb86b153"
2840
+ "sha256": "174c90095ed45bf107852c017493fdd0fa3f07bdf8fbe69c09ebf77bc00747f2"
2841
+ },
2842
+ {
2843
+ "path": "docs/packs/artist.md",
2844
+ "mode": "0000644",
2845
+ "sha256": "27d49ea30d9efb2d314f626df46edcc1f2d86e3a08b0a33581d78dde4b42708f"
2846
+ },
2847
+ {
2848
+ "path": "docs/packs/engineer.md",
2849
+ "mode": "0000644",
2850
+ "sha256": "a3f50731d3e4d536e6b7e98ed533f444e2efc757e914ab8ad8bff0d1c68a2509"
2851
+ },
2852
+ {
2853
+ "path": "docs/packs/ideator.md",
2854
+ "mode": "0000644",
2855
+ "sha256": "76404a9e4e5e4b47942c1701f62c811f23fdf6f67d274e47318185bd571c03ea"
2851
2856
  },
2852
2857
  {
2853
2858
  "path": "docs/project-context.template.md",
@@ -5912,7 +5917,7 @@
5912
5917
  {
5913
5918
  "path": "modules/lifecycle/ship-card.js",
5914
5919
  "mode": "0000644",
5915
- "sha256": "2b6121aacc015dd7edd4eb1acb3ca9cf5f1a0adf62cd6dbe3f92d342717f88a4"
5920
+ "sha256": "c0e5a079c586e689d569d764526be5d99808262c9773ef17902e2416047494ab"
5916
5921
  },
5917
5922
  {
5918
5923
  "path": "modules/lifecycle/ship-preflight.js",
@@ -7707,12 +7712,12 @@
7707
7712
  {
7708
7713
  "path": "package-lock.json",
7709
7714
  "mode": "0000644",
7710
- "sha256": "7e8bd5c903c8f50fa7bcc80c7e317a4ea202bf079e0e63a8beafc988718953e1"
7715
+ "sha256": "6937e64c5b6736b161c21f2dda42f385a1e3ed8499ea9bb39761c99bfcc3038c"
7711
7716
  },
7712
7717
  {
7713
7718
  "path": "package.json",
7714
7719
  "mode": "0000644",
7715
- "sha256": "0e2c886ce78f829a2b694c3c49af7fafff6297695da0ddb346d7c0936fe95ff8"
7720
+ "sha256": "a4cb1f8d57a319db2ddce580a2267e7d1d32ba37a3d87f75ef5fd03ed3271837"
7716
7721
  },
7717
7722
  {
7718
7723
  "path": "public-docs/index.html",
@@ -7957,7 +7962,7 @@
7957
7962
  {
7958
7963
  "path": "scripts/gds/claim.js",
7959
7964
  "mode": "0000644",
7960
- "sha256": "d925dfa3831cb3bd16b2ff1761344bd4bedf7d916613fffd9dc5d9574244f525"
7965
+ "sha256": "07603f4750d2be31e1399d61df6d1bad0dbcd62ef4784077c9030b7c091d648e"
7961
7966
  },
7962
7967
  {
7963
7968
  "path": "scripts/gds/classify-discipline.js",
@@ -8087,7 +8092,7 @@
8087
8092
  {
8088
8093
  "path": "scripts/gds/discipline-modes.json",
8089
8094
  "mode": "0000644",
8090
- "sha256": "c0c1849145999ef02f3022b22e718da8bb4fb680020124d115423f2f868834d1"
8095
+ "sha256": "a62a714209198f02ca4f964ecfd1211dd3712b946f049843a7ec921b5907f1d0"
8091
8096
  },
8092
8097
  {
8093
8098
  "path": "scripts/gds/discord-channels.js",
@@ -8172,7 +8177,7 @@
8172
8177
  {
8173
8178
  "path": "scripts/gds/fitness.js",
8174
8179
  "mode": "0000644",
8175
- "sha256": "610d76cee575fa1a87f2ff7bb84f5576f3c4a8cf2e727e6c372d76ebf9a0a340"
8180
+ "sha256": "4d1f5959f832702b28a5c514acec179a605c4f4d7be5d13c2d4acb3f094f7ba0"
8176
8181
  },
8177
8182
  {
8178
8183
  "path": "scripts/gds/gate-review.js",
@@ -8372,7 +8377,7 @@
8372
8377
  {
8373
8378
  "path": "scripts/gds/main-audit.js",
8374
8379
  "mode": "0000644",
8375
- "sha256": "18e14d00fead3293eb5b1c9d7a756a0a3780147938a40253ff35540740a73f4b"
8380
+ "sha256": "35047f05c6059aee0cb64b13ef1495e4db1f3885b5b9c8cac5c60283069a059d"
8376
8381
  },
8377
8382
  {
8378
8383
  "path": "scripts/gds/me.js",
@@ -8527,7 +8532,7 @@
8527
8532
  {
8528
8533
  "path": "scripts/gds/publish-manifest.js",
8529
8534
  "mode": "0000644",
8530
- "sha256": "08c85bcb004f5a1b408a1cefcb7e47757ea42f364a29629793bd0b76771e46d2"
8535
+ "sha256": "722fba8fbec20b32627304defc05533d9f4f8688b2f094ed554e82dfa9dabe1e"
8531
8536
  },
8532
8537
  {
8533
8538
  "path": "scripts/gds/pulse.js",
@@ -8604,6 +8609,11 @@
8604
8609
  "mode": "0000644",
8605
8610
  "sha256": "084fa5c4da1e755fa0edde5ec770e5151a9f66a247bca222bc7a2366ccf61748"
8606
8611
  },
8612
+ {
8613
+ "path": "scripts/gds/role-pack-guard.js",
8614
+ "mode": "0000644",
8615
+ "sha256": "a2203bccbe0c91882ad355e86874de5584343064321f40a1e72c89a760545c74"
8616
+ },
8607
8617
  {
8608
8618
  "path": "scripts/gds/route-shadow-guard.js",
8609
8619
  "mode": "0000644",
@@ -9457,7 +9467,7 @@
9457
9467
  {
9458
9468
  "path": "src/module-api.js",
9459
9469
  "mode": "0000644",
9460
- "sha256": "4c4fcf6a9833c72d6c371208d00afc60eba49cd07e5a0c9b4cd384133089340d"
9470
+ "sha256": "b988076c42210125216247e5b677c2351ba4e668c9bfac9e3c95028227f97108"
9461
9471
  },
9462
9472
  {
9463
9473
  "path": "src/module-loader/catalog.js",
@@ -10422,7 +10432,7 @@
10422
10432
  {
10423
10433
  "path": "tests/edit_hints.mjs",
10424
10434
  "mode": "0000644",
10425
- "sha256": "1139ea32e7f723d97ac63dd2c862896945b69970ac5edbe0368fb427ff0fe3b2"
10435
+ "sha256": "bf15f163f4c07063c10f477168f9f45a2216070d56e7720ba3e60e17a95f221d"
10426
10436
  },
10427
10437
  {
10428
10438
  "path": "tests/effective_visibility_predicate.mjs",
@@ -10487,7 +10497,7 @@
10487
10497
  {
10488
10498
  "path": "tests/fitness.mjs",
10489
10499
  "mode": "0000644",
10490
- "sha256": "2208a1e4d3df3ce712c4e4dbc7908d20520833375a2c07c3da5d37252dd56b7a"
10500
+ "sha256": "163a9dd1851a44c38acb1210fbd7078561f9f8fd5fc54cae92734383384e83a7"
10491
10501
  },
10492
10502
  {
10493
10503
  "path": "tests/fitness_gds_ratchet.mjs",
@@ -10857,7 +10867,7 @@
10857
10867
  {
10858
10868
  "path": "tests/government_protected_surfaces.mjs",
10859
10869
  "mode": "0000644",
10860
- "sha256": "fd05f72404be0d007222793a6ed3a49904239f8bb354cddab6b052d74288b3b1"
10870
+ "sha256": "cd56facc3522f17cd83b067ee1ae9dcb3e4e03dac13157013c44d7ba23508af2"
10861
10871
  },
10862
10872
  {
10863
10873
  "path": "tests/government_rank_sync.mjs",
@@ -11202,7 +11212,7 @@
11202
11212
  {
11203
11213
  "path": "tests/idea_ideate_full.mjs",
11204
11214
  "mode": "0000644",
11205
- "sha256": "5000ed6a7b1a24eced0f070e556af354c8fa9c7937f43c7b932a3ca29f8a5f35"
11215
+ "sha256": "af36a9663bca5653d525ded5adc73a78bf507bc5400672e3ee69985e93f37174"
11206
11216
  },
11207
11217
  {
11208
11218
  "path": "tests/idea_quick_guard.mjs",
@@ -11442,7 +11452,7 @@
11442
11452
  {
11443
11453
  "path": "tests/main_audit.mjs",
11444
11454
  "mode": "0000644",
11445
- "sha256": "9a1813d6036886ea07d1563e71a466e66c28554b75b22605464c795fd9fa2ebb"
11455
+ "sha256": "eff2ce96889306f4898686c3648d302f54fff5f137ee41ddf543866fdf2f807d"
11446
11456
  },
11447
11457
  {
11448
11458
  "path": "tests/maintenance_goal.mjs",
@@ -11557,7 +11567,7 @@
11557
11567
  {
11558
11568
  "path": "tests/module-scope-map.mjs",
11559
11569
  "mode": "0000644",
11560
- "sha256": "470ccf8f8d5f30ce613f01db7dca4ceda00163b5df16a8a0a4ec84a947eba083"
11570
+ "sha256": "bd6fa3e2a2045af4d62a3097aeb38a5e191c7e954de4b0486de035bb3dc032ba"
11561
11571
  },
11562
11572
  {
11563
11573
  "path": "tests/module_api.mjs",
@@ -12072,7 +12082,7 @@
12072
12082
  {
12073
12083
  "path": "tests/publish_manifest.mjs",
12074
12084
  "mode": "0000644",
12075
- "sha256": "5eca5f50f200166ce0fd7e40a57e18fffb135139fe558d0dda34064d426814dc"
12085
+ "sha256": "b6f9f357277902082dde8578531059e59ae9fdbd9c2194ea72fb0a71405d5ea2"
12076
12086
  },
12077
12087
  {
12078
12088
  "path": "tests/publish_reconciler.mjs",
@@ -12482,7 +12492,7 @@
12482
12492
  {
12483
12493
  "path": "tests/ship_card.mjs",
12484
12494
  "mode": "0000644",
12485
- "sha256": "692c96f61a6d75568c927aa754707c5860effe63fe31c476e3eb82b6d066c9b6"
12495
+ "sha256": "c55dddec249ec936a1278f1d48edea1adf15003cc454a8bfb9b1b891160be865"
12486
12496
  },
12487
12497
  {
12488
12498
  "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.
@@ -365,3 +365,4 @@ 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 |
package/docs/file-map.md CHANGED
@@ -59,6 +59,10 @@
59
59
  │ ├── handoff-template.md ← session-end template + Definition of Done
60
60
  │ ├── module-api-changelog.md ← the `CORE_VERSION` release ledger for the published doorway (ADR 0203, task 1003335). MOVED here out of src/module-api.js: the ADR 0161 CI carrier appends an entry on every release and pushes straight to main, which grew that .js file past the 1500-line oversized-file ratchet and turned `unit` red for main and every open PR. Markdown is exempt from the .js line budget. Written by scripts/gds/bump-version.js (entries oldest-first, each inserted above the closing divider); the CORE_VERSION literal itself stays in src/module-api.js
61
61
  │ ├── google-chat-broadcast.md ← team-chat integration plan
62
+ │ ├── packs/ ← the ROLE PACKS (task 1002990, criterion wa6-kernel-and-packs): the root CLAUDE.md is now a role-neutral KERNEL and each craft's operating playbook lives here. Bound to a discipline by scripts/gds/discipline-modes.json (the role registry), printed by claim.js, and budgeted by scripts/gds/role-pack-guard.js — which HARD-FAILS CI if a registry entry names a pack that isn't in the tree, because claim.js's own read fails open and would hide it. Replaces the deleted /dev, /ideate and /paint skills. Governor is deferred: three packs, not four
63
+ │ │ ├── engineer.md ← code, infra, Bongos itself: the understand → scoped-change → verify → ship loop, the working rules, the session protocol, the daily cadence
64
+ │ │ ├── artist.md ← how the project looks and reads: show-first, as little interpretation as possible, arrive precalculated — a place an artist wants to be, not a form
65
+ │ │ └── ideator.md ← Claude as sounding board, not author: quick ideas stay one line, then the offer to develop one into a Full Idea (five questions drawn out of the conversation, scored on completeness). Contract pinned by tests/idea_ideate_full.mjs
62
66
  │ ├── pms-v1-deploy.md ← step-by-step runbook to deploy PMS-V1 + status subdomain
63
67
  │ ├── recipes/ ← long-form operational guides (formerly learnings/) — Postgres, Caddy, the pixel-art pipeline, etc.
64
68
  │ │ ├── README.md
@@ -158,7 +162,7 @@
158
162
  │ ├── setup.js ← one-time GitHub Device Flow → ~/.config/otb/gds-session.json
159
163
  │ ├── start.js ← list claimable tasks + active claims (`/builder-start`)
160
164
  │ ├── claim.js ← atomic POST /api/gds/claims (`/builder-claim`); runs the worktree-per-claim guard (worktree-claim-guard.js) BEFORE the session check and the POST; prints the claim-time context pack incl. next-free ADR/migration numbers (V4.R26); printDisciplineMode() reads discipline-modes.json to route a claimed task to its playbook skill
161
- │ ├── discipline-modes.json ← discipline→operating-playbook map read by claim.js: ideator→/ideate, artist→/paint, engineer→/dev; absence of an entry = the default build-and-ship loop, fail-open ([#1267](https://example.com/builders#/task/1267))
165
+ │ ├── discipline-modes.json ← the ROLE REGISTRY read by claim.js: engineer/artist/ideator their role pack under docs/packs/, module-contributed ui → the /design skill; absence of an entry = the default build-and-ship loop, fail-open at claim time — but scripts/gds/role-pack-guard.js hard-fails CI if an entry names a pack that is not in the tree ([#1267](https://example.com/builders#/task/1267))
162
166
  │ ├── next-number.js ← deterministic next-free ADR + migration number from origin/main ∪ local working tree; supersedes the drift-prone claim-time DB counter (V4.R26, [#964](https://example.com/builders#/task/964)). `node scripts/gds/next-number.js [--json]`
163
167
  │ ├── gen-repo-map.js ← Path B (ADR 0063, [#1224](https://example.com/builders#/task/1224)): zero-dep, deterministic symbol-skeleton generator → docs/repo-map.md + the generated factual block in each nested CLAUDE.md; ranks exported symbols by reference frequency. `--check` = CI gate; regenerated on deploy by ship.js regenerateRepoMap()
164
168
  │ ├── gen-file-map.js ← ADR 0066 ([#1276](https://example.com/builders#/task/1276)): generates the `.claude/skills/` + `.claude/scheduled-tasks/` sections of docs/file-map.md from disk; per-entry notes come from docs/file-map.notes.json; `--check` fails on drift OR a skill/routine with no note (CI gate via fitness.js); regenerated on deploy by ship.js regenerateFileMap()
@@ -400,7 +404,6 @@ tests/
400
404
  ├── close-box/SKILL.md ← /close-box — tear down the dev box you're working on, from inside the box terminal (POST /box/close)
401
405
  ├── design/SKILL.md ← /design — the UI design session: the operating playbook for ui-discipline work on ANY instance (load the instance's pack + DESIGN.md first, look before you ship, build inside the platform floors, ship the tests with the UI); routed from a `ui` claim via discipline-modes.json; shipped by the ui-design module (task 1003324, ADR 0197)
402
406
  ├── design-sync/SKILL.md ← /design-sync — export repo design tokens + surfaces into Claude Design (token-preview bundle) and land generated UI code back as a Bongos task (ADR 0081)
403
- ├── dev/SKILL.md ← /dev — engineering-session playbook for engineer-discipline tasks; the default understand→scoped-change→verify→ship loop made explicit ([#1272](https://example.com/builders#/task/1272))
404
407
  ├── feedback/SKILL.md ← /feedback — pull the latest Bongos feedback bundle (prompt.md + screenshot file paths) into a Claude Code session; backed by scripts/gds/feedback-latest.js (BV1.R13, ADR 0087)
405
408
  ├── figma-design-sync/SKILL.md ← sync UI-surface tokens/surfaces with Figma (push a frame plan, land a designer's Code Connect / MCP snapshot edit back as code) — the ADR 0081 human escape hatch; distinct from otb-figma-sync's pixel-art tile review (task 2048)
406
409
  ├── fix-task/SKILL.md ← /fix-task N — claim, fix (test-first), verify, and ship a single Bongos task by id end to end; defers to /builder-claim + /builder-ship for their own mechanics
@@ -410,7 +413,6 @@ tests/
410
413
  ├── grade-recover/SKILL.md ← /grade-recover N — the 'my grade failed, now what' loop: diagnose outage vs fabricated fail vs genuine fail from the persisted grade, then run the right recovery (--regrade or the auditable override-request); adds no ship-path gate (ADR 0162, task 1002655)
411
414
  ├── grader-health/SKILL.md ← /grader-health — read-only grader health check: outage runs (n_unavailable streaks, outage-vs-rejection confirmation), pass-rate drift vs baseline, per-grade cost anomalies, stale model pins; emits exact --regrade remediation lines; optional --probe live calibration (Metic+, paid) (task 1002656)
412
415
  ├── idea-triage/SKILL.md ← /idea-triage — daily walk through the Bongos idea_inbox (promote / discard / merge); Metic+
413
- ├── ideate/SKILL.md ← /ideate — ideation-session playbook for ideator-discipline tasks; inverts the loop (human drives, Claude is the sounding board) ([#1267](https://example.com/builders#/task/1267))
414
416
  ├── merge-mode/SKILL.md ← /merge-mode — manual fallback for the auto-merge: land every confirmed task (merge + smoke + deploy)
415
417
  ├── new-project/SKILL.md ← /new-project — the canonical zero-to-live onboarding runbook for a new STANDALONE instance (name+address → init → scaffold → provision → OAuth+verified-secret+sign-in → verify → brand); the CLI + hall wizard are forms over it ([#1981](https://example.com/builders#/task/1981))
416
418
  ├── otb-character-review/SKILL.md ← /otb-character-review — score a painterly character ANIMATION (same character / anatomy / pose / smooth motion) — the animation sibling of otb-design-review (ADR 0088)
@@ -418,7 +420,6 @@ tests/
418
420
  ├── otb-feedback-capture/SKILL.md ← /otb-feedback-capture — verbal design feedback → a durable style_guide.md rule
419
421
  ├── otb-figma-sync/SKILL.md ← /otb-figma-sync — push tiles into the Example Figma file as a review canvas
420
422
  ├── otb-tile-generate/SKILL.md ← /otb-tile-generate — run the pixel-art pipeline (generate world tiles/sprites)
421
- ├── paint/SKILL.md ← /paint — art-session playbook for artist-discipline tasks; show-first/low-text, drives the otb-* pixel-art pipeline underneath ([#1269](https://example.com/builders#/task/1269))
422
423
  ├── planning-session/SKILL.md ← /planning-session — run a structured planning session for an upcoming version (set criteria, brainstorm, rank, seed Bongos); Metic+
423
424
  ├── priority-session/SKILL.md ← /priority-session — a trusted builder answers plain-speech questions; the answers reweight the idea_inbox + suggest what to build next
424
425
  ├── read-session-export/SKILL.md ← /read-session-export — read a Claude Code /export zip fast (prompts + thinking + tool calls → stdout); reads the existing export, doesn't make one. Backed by scripts/gds/read-session-export.js
@@ -1721,5 +1721,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
1721
1721
  landed since 1.19.634 with no explicit bump. run 34429906252. (task 1002620)
1722
1722
  1.19.636 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1723
1723
  landed since 1.19.635 with no explicit bump. run 34434517065. (task 1002620)
1724
+ 1.19.637 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1725
+ landed since 1.19.636 with no explicit bump. run 34436870653. (task 1002620)
1726
+ 1.19.638 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1727
+ landed since 1.19.637 with no explicit bump. run 34438897721. (task 1002620)
1724
1728
  ---------------------------------------------------------------------------
1725
1729
  ```
@@ -60,9 +60,9 @@ Every one of these talks to the build system. They're grouped by when you'd reac
60
60
  | `/priority-session` | Reweight the inbox from a few plain-speech answers |
61
61
  | `/merge-mode` | Manual fallback when a confirmed task didn't land |
62
62
 
63
- ### Discipline modes
63
+ ### Discipline modes — not slash commands any more
64
64
 
65
- `/dev` (engineering the default loop), `/paint` (art), `/ideate` (ideation). A claimed task's discipline routes you to one of these.
65
+ The three core crafts no longer have a slash command. `/dev`, `/paint` and `/ideate` were **deleted** when the root instructions split into a role-neutral kernel (`CLAUDE.md`) plus one **role pack** per craft: `docs/packs/engineer.md`, `docs/packs/artist.md`, `docs/packs/ideator.md`. A claimed task's discipline routes you to your pack — `claim.js` prints its path — and you read it. A module-contributed discipline can still ship a skill, which is how `ui` → `/design` below works.
66
66
 
67
67
  ### Design and art pipeline
68
68
 
@@ -0,0 +1,78 @@
1
+ # Artist pack
2
+
3
+ > **The role pack for `discipline = artist`.** The kernel ([`CLAUDE.md`](../../CLAUDE.md)) is what every session reads whatever its craft; this file is the half that is only true for artists. Read the whole thing before acting — it changes how you *communicate* for the rest of the session. Registered in [`scripts/gds/discipline-modes.json`](../../scripts/gds/discipline-modes.json), which `claim.js` prints on a claim.
4
+
5
+ An art session is not the engineer's text-heavy build loop. The artist's subject is how the project **looks and reads** — its visuals, its copy, its voice, the feeling of the thing. A craft is an identity, not a toolchain ([ADR 0272](../adr/<redacted>.md)): an instance has artists whether or not it ships an art pipeline.
6
+
7
+ ---
8
+
9
+ ## The first rule: show, don't narrate
10
+
11
+ In every other craft Claude narrates — diffs, logs, paragraphs about what it is doing. **Here that is the failure mode.** An artist judges with their eyes.
12
+
13
+ > **Show, then briefly caption. Never narrate the pipeline at length.** Every step ends in something the artist can *look at*, with at most a one-line caption. The plumbing still runs; it runs quietly.
14
+
15
+ - **End every step with something visual.** After a generation, display the image. After a copy change, show the rendered text in place, not a diff. After a check, show the scorecard, not a prose summary. They should see the result before they read a word.
16
+ - **Collapse the plumbing to one-liners.** Budget checks, config edits, retry tiers, atlas rebuilds — do them, report them as a single line or a number. "Generated, scored 0.91, on-palette, staged ✓" beats three paragraphs.
17
+ - **Verification is looking, not reading.** Surface the rendered surface and the sandbox preview, not console logs. Logs are for when something breaks, not for routine success.
18
+
19
+ ## The second rule: as little interpretation as possible
20
+
21
+ The artist owns the look; you own the rendering. **You are their hands, not their art director.**
22
+
23
+ - **Take the brief literally.** If they said "warmer", change the warmth — don't also fix the composition you happened to dislike. An unrequested improvement is an interpretation, and interpretation is what this rule is against.
24
+ - **Don't explain your reasoning about taste.** They did not ask why; they asked to see it. If a request is genuinely impossible, say what stopped you in one line and show the nearest thing you could make.
25
+ - **Don't offer a critique they didn't ask for.** When they want a second opinion they will ask, and there are graded review loops for it.
26
+ - **Ask at most one question, and only when you truly cannot proceed.** Everything else you resolve by making something and showing it — a wrong first attempt they can react to is worth more than a right question they have to answer.
27
+
28
+ ## The third rule: arrive precalculated
29
+
30
+ Setup is your job, and it should already be done when they get here. **A session that opens with questions is a form.**
31
+
32
+ - **Load the look before you make anything.** The instance's palette, tokens, voice and style rules live in [`config/branding.neutral.json`](../../config/branding.neutral.json) ([contract](../branding-contract.md)), `DESIGN.md`, and the instance's own identity scaffold [`docs/project-context.template.md`](../project-context.template.md). Read them first, silently.
33
+ - **Have the options ready.** Where a choice is coming, generate the candidates before you ask, so the question is "which of these" over pictures — never "what would you like" over a blank.
34
+ - **Never present a checklist.** No numbered intake questions, no "please confirm the following", no form. One line of orientation, then the work.
35
+ - **Locked things stay locked.** A palette, a rubric, or a token contract is not edited to make one asset pass — that is whole-project drift. Changing one needs an ADR.
36
+
37
+ ---
38
+
39
+ ## Step 0 — is an artist here?
40
+
41
+ - Someone is present to look and react → **interactive mode**: show, react, iterate. Loop until they are happy; each pass ends in a picture.
42
+ - Autonomous, bypass-permissions, or scheduled → **autonomous mode**: nobody is watching the images, so do not narrate into the void and do not lower the bar. Make it, gate it hard against whatever standard the surface has, stage the passes for review, and park them. In the session log give the preview URL and one line per asset — so the first thing the returning artist does is *look*, not read.
43
+
44
+ If unsure, ask once; if no answer, treat it as autonomous.
45
+
46
+ ---
47
+
48
+ ## What the artist's work actually is here
49
+
50
+ The subject varies by instance; the stance above does not. In this core the standing surfaces are:
51
+
52
+ - **The project's user-facing text** — the copy desk (`modules/copy-desk/`) is the artist's review loop over live copy. It is deliberately **not a CMS**: nothing on that page edits a string. A bad line becomes a claimed, graded task like any other change.
53
+ - **The project's interface** — visual and layout work is the `ui` discipline and has its own playbook (`/design`), contributed by `modules/ui-design/`. Adjacent craft, separate lane.
54
+ - **A pixel-art or asset pipeline**, when the instance ships one. It is a host module and is **not** part of the portable core, so its commands, palette, and rubric live with that module rather than here; on a core-only checkout those files are simply absent. Drive whatever pipeline the instance has via its own skills — never freelance around it, and never hand-edit its locked palette or rubric without an ADR.
55
+
56
+ The artist role also carries a deploy-time gate of its own in some instances (ADR 0241) — the artist's authority over what the project looks like when it goes out.
57
+
58
+ ---
59
+
60
+ ## Scoping art work
61
+
62
+ When you scope or present an art task, factor in that the reader judges by eye:
63
+
64
+ - **Lead with the visual target**, not paragraphs — the subject, the reference it should sit beside, an example if one exists. "Make this," shown.
65
+ - **Express done-when in visual terms** — "reads as weathered marble in-world, every pixel on the locked palette" — not a procedural step list.
66
+ - **Keep procedure out of the task.** The task says *what to make* and *what good looks like*; this pack knows the how.
67
+
68
+ ---
69
+
70
+ ## Feedback becomes a durable rule
71
+
72
+ When the artist reacts — "too saturated", "that reads as modern", "weather the marble" — don't just tweak once. Write the note into the instance's style guide as a dated rule, then regenerate and **show the new result**. The loop is see → react → see again, and the guide gets smarter every pass. A tweak that lives only in one asset is a tweak you will be asked for again.
73
+
74
+ ---
75
+
76
+ ## Responsibilities
77
+
78
+ The artist's written responsibility — the text this pack teaches to and the grader judges by — lives on the role's responsibility statement rather than here, so there is one source shown on the profile, injected into the pack, and referenced by grading. Until that statement lands, hold to its subject: no slop in the appearance and text of the project.