@ikon85/agent-workflow-kit 0.27.1 → 0.28.0

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 (57) hide show
  1. package/.agents/skills/ask-matt/SKILL.md +2 -2
  2. package/.agents/skills/grill-me/SKILL.md +1 -1
  3. package/.agents/skills/grill-with-docs/SKILL.md +1 -1
  4. package/.agents/skills/kit-update/SKILL.md +12 -0
  5. package/.agents/skills/orchestrate-wave/SKILL.md +68 -21
  6. package/.agents/skills/orchestrate-wave/references/builder-contract.md +6 -4
  7. package/.agents/skills/retro/SKILL.md +24 -1
  8. package/.agents/skills/scale-check/SKILL.md +2 -2
  9. package/.agents/skills/setup-workflow/SKILL.md +44 -1
  10. package/.agents/skills/setup-workflow/workflow-overview.md +5 -5
  11. package/.agents/skills/tdd/SKILL.md +68 -14
  12. package/.agents/skills/to-issues/SKILL.md +2 -2
  13. package/.agents/skills/verify-spike/SKILL.md +1 -1
  14. package/.agents/skills/wrapup/SKILL.md +14 -2
  15. package/.claude/hooks/drift-guard.py +5 -2
  16. package/.claude/hooks/kit-origin-edit-hint.py +64 -0
  17. package/.claude/skills/ask-matt/SKILL.md +2 -2
  18. package/.claude/skills/grill-me/SKILL.md +1 -1
  19. package/.claude/skills/grill-with-docs/SKILL.md +1 -1
  20. package/.claude/skills/kit-update/SKILL.md +12 -0
  21. package/.claude/skills/orchestrate-wave/SKILL.md +68 -21
  22. package/.claude/skills/orchestrate-wave/references/builder-contract.md +6 -4
  23. package/.claude/skills/retro/SKILL.md +23 -0
  24. package/.claude/skills/scale-check/SKILL.md +2 -2
  25. package/.claude/skills/setup-workflow/SKILL.md +44 -1
  26. package/.claude/skills/setup-workflow/workflow-overview.md +5 -5
  27. package/.claude/skills/skill-manifest.json +1 -1
  28. package/.claude/skills/tdd/SKILL.md +68 -14
  29. package/.claude/skills/to-issues/SKILL.md +2 -2
  30. package/.claude/skills/verify-spike/SKILL.md +1 -1
  31. package/.claude/skills/wrapup/SKILL.md +14 -2
  32. package/README.md +47 -7
  33. package/agent-workflow-kit.package.json +49 -33
  34. package/docs/adr/0001-consumer-divergence-policy.md +49 -0
  35. package/docs/agents/wave-anchor-template.md +1 -1
  36. package/package.json +1 -1
  37. package/scripts/board-sync.py +184 -5
  38. package/scripts/pr-body-check.py +34 -6
  39. package/scripts/pr_body_e2e.py +83 -0
  40. package/scripts/test_board_sync.py +208 -0
  41. package/scripts/test_census_backstop.py +56 -3
  42. package/scripts/test_orchestrate_wave_contract.py +116 -0
  43. package/scripts/test_pr_body_check.py +245 -0
  44. package/scripts/test_retro_wrapup_contract.py +111 -0
  45. package/scripts/test_tdd_contract.py +78 -0
  46. package/src/cli.mjs +44 -8
  47. package/src/commands/diff.mjs +5 -2
  48. package/src/commands/init.mjs +12 -0
  49. package/src/commands/own.mjs +16 -0
  50. package/src/commands/uninstall.mjs +8 -1
  51. package/src/commands/update.mjs +37 -9
  52. package/src/lib/bundle.mjs +4 -0
  53. package/src/lib/consumerPath.mjs +30 -0
  54. package/src/lib/manifest.mjs +18 -0
  55. package/src/lib/ownedDiff.mjs +88 -0
  56. package/src/lib/updateCandidate.mjs +14 -0
  57. package/src/lib/updateReconcile.mjs +45 -6
@@ -17,7 +17,7 @@ This is the "Verify First" rule with a runnable harness behind it: when you cann
17
17
  | "Which of these options, given these trade-offs?" / "I need to research this before I can choose." (bounded, sub-grill) | `decision-gate` |
18
18
  | "Does this design / state model / UI feel right?" (open-ended) | `prototype` |
19
19
  | "Why is this broken / slow?" (root-cause of a known defect) | `diagnose` |
20
- | "Build this behaviour, test-first." (new feature/fix) | `tdd` |
20
+ | "Build this behaviour, test-first." (new feature/fix) | `implement` |
21
21
 
22
22
  If the question is really "what should this be", it is not a verify-spike — those are open, not yes/no.
23
23
 
@@ -39,9 +39,21 @@ Hard stop (the only pure precondition): not in a feature worktree / on `main`
39
39
 
40
40
  ### 2 · Retro gate (blocking, optional retro-exit — before anything is committed)
41
41
  One reminder, not a merge confirmation:
42
- > "Already ran a retro? **(a)** yes / continue → landing now. **(b)** you want one first → clean abort here, run `/retro`, then `/wrapup` again — repo-file patches then travel in this PR."
42
+ > "Already ran a retro? **(a)** yes / continue → landing now. **(b)** you want one first → the retro starts now; afterwards, invoke `/wrapup` again — repo-file patches then travel in this PR."
43
43
 
44
- (b) → exit cleanly, touch nothing (a skill can't pause/resume another skill). **Never auto-run `/retro`.** The answer materializes as the mandatory `**Retro:**` PR-body line in step 4 — that's recording, not a second question. Why the gate lives here: in a foreign project this is the only portable retro touchpoint; a project-local "offer retro before PR" convention usually answers it already.
44
+ (b) → **invoke the `retro` skill immediately in this run.** Retro is
45
+ model-invocable and non-deploying, and every mutation still has its own approval
46
+ gate. After retro finishes, **land nothing in this run**. Require a **fresh
47
+ explicit `/wrapup` invocation** because retro may have changed the exact diff
48
+ that the next merge authorization covers.
49
+
50
+ General chaining rule: automatically chain only into a **model-invocable**,
51
+ **non-deploying** workflow. If the named target is user-only, deploys, or
52
+ depends on an external action, **return control to the user** and **state the
53
+ reason**. A forward chain never carries wrapup's merge/deploy authorization
54
+ into another run.
55
+
56
+ The answer materializes as the mandatory `**Retro:**` PR-body line in step 4 — that's recording, not a second question. Why the gate lives here: in a foreign project this is the only portable retro touchpoint; a project-local "offer retro before PR" convention usually answers it already.
45
57
 
46
58
  ### 3 · Commit (only if the tree is dirty)
47
59
  Judgment first, then the guarded commit:
package/README.md CHANGED
@@ -215,7 +215,7 @@ with a wave plan, and `to-waves` unfolds it into named waves after you approve
215
215
  a full preview in chat — zero board writes until you say yes. **Bottom-up:**
216
216
  `board-to-waves` clusters loose issues into a wave candidate, which earns a
217
217
  real number only when you promote it. Either road lands in the *identical*
218
- wave anchor plus slice sub-issues, built through the same `tdd` → `wrapup` →
218
+ wave anchor plus slice sub-issues, built through the same `implement` → `wrapup` →
219
219
  `retro` spine as every other wave.
220
220
 
221
221
  When the slices are file-disjoint and their specs are locked, **`orchestrate-wave`**
@@ -223,7 +223,7 @@ lands the whole anchor end-to-end — often AFK: it dispatches an implementer pe
223
223
  slice into its own worktree, integrates serially, verifies centrally, and lands
224
224
  the wave. It's the execute-and-land node of the wave ladder (`scale-check` →
225
225
  `to-waves` / `board-to-waves` → `orchestrate-wave`); a single slice still just
226
- goes to `tdd`.
226
+ goes to `implement`.
227
227
 
228
228
  ![The Program-to-Phase-to-Wave-to-Slice altitude ladder, and the two routes — a planned top-down Program route and a grown bottom-up board route — that both fund the same Wave-and-Slices build spine.](docs/methodology.svg)
229
229
 
@@ -320,16 +320,56 @@ npx github:iKon85/agent-workflow-kit uninstall # remove kit-installed files
320
320
  - a file you **didn't** touch fast-forwards to the new version;
321
321
  - a file you **did** edit is kept — the incoming version is backed up with a
322
322
  timestamp and a diff is printed, never silently overwritten;
323
+ - a file you intentionally fork can be detached with
324
+ `npx github:iKon85/agent-workflow-kit own <path>` and returned to kit ownership
325
+ with `npx github:iKon85/agent-workflow-kit disown <path>`; owned files are
326
+ skipped by updates even after the package stops shipping them;
323
327
  - a file removed upstream is offered for deletion (a hook still referenced by your
324
328
  `settings.json` is kept regardless);
325
- - new skills are added.
326
-
327
- `uninstall` removes what the kit installed and retains anything you edited or
328
- still reference. Flags: `--force` (overwrite pre-existing files on `init`),
329
- `--yes` / `-y` (non-interactive).
329
+ - a new kit path that already exists locally is reported as a collision: choose
330
+ either to keep the existing file as consumer-owned or replace it with kit bytes;
331
+ - new skills without a local collision are added.
332
+
333
+ Ownership survives repeated `init`, including `init --force`: consumer-owned
334
+ files are never overwritten. `uninstall` preserves consumer-owned files on disk
335
+ but detaches them from the manifest, ending ownership tracking; it also retains
336
+ anything edited or still referenced. The manifest remains only when other
337
+ retained entries still require it.
338
+
339
+ Use `diff --owned` to inspect owned paths without changing them. Each path is
340
+ reported as `changed-upstream`, `removed-upstream`, `missing-locally`,
341
+ `identical`, or `unsafe-path`; binary files report only size and hashes.
342
+ Containment and file type are revalidated when read.
343
+
344
+ Ownership commands are designed for a single-user CLI workflow and are not
345
+ concurrency-safe. Do not run manifest-mutating commands concurrently. Flags:
346
+ `--force` (overwrite pre-existing untracked files on `init`), `--yes` / `-y`
347
+ (accept non-interactive update decisions).
330
348
 
331
349
  ## Release notes
332
350
 
351
+ ### 0.28.0
352
+
353
+ - added: `.claude/hooks/kit-origin-edit-hint.py`
354
+ - added: `scripts/pr_body_e2e.py`
355
+ - changed: `.agents/skills/kit-update/SKILL.md`
356
+ - changed: `.agents/skills/orchestrate-wave/SKILL.md`
357
+ - changed: `.agents/skills/orchestrate-wave/references/builder-contract.md`
358
+ - changed: `.agents/skills/retro/SKILL.md`
359
+ - changed: `.agents/skills/setup-workflow/SKILL.md`
360
+ - changed: `.agents/skills/tdd/SKILL.md`
361
+ - changed: `.agents/skills/wrapup/SKILL.md`
362
+ - changed: `.claude/hooks/drift-guard.py`
363
+ - changed: `.claude/skills/kit-update/SKILL.md`
364
+ - changed: `.claude/skills/orchestrate-wave/SKILL.md`
365
+ - changed: `.claude/skills/orchestrate-wave/references/builder-contract.md`
366
+ - changed: `.claude/skills/retro/SKILL.md`
367
+ - changed: `.claude/skills/setup-workflow/SKILL.md`
368
+ - changed: `.claude/skills/tdd/SKILL.md`
369
+ - changed: `.claude/skills/wrapup/SKILL.md`
370
+ - changed: `scripts/board-sync.py`
371
+ - changed: `scripts/pr-body-check.py`
372
+
333
373
  ### 0.27.1
334
374
 
335
375
  - changed: `scripts/release-parity.mjs`
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitVersion": "0.27.1",
2
+ "kitVersion": "0.28.0",
3
3
  "files": [
4
4
  {
5
5
  "path": ".agents/skills/ask-matt/SKILL.md",
@@ -7,7 +7,7 @@
7
7
  "ownerSkill": "ask-matt",
8
8
  "surface": "codex",
9
9
  "installRole": "consumer",
10
- "sha256": "23997067d90e7a14c49b0bf2000a1f042cca0db8f45197dac7a8e3a8316bfed9",
10
+ "sha256": "0e17025bf5f0c8363cc36031697b544d97978b3d3bbe4ebf39770fa878802a5e",
11
11
  "mode": 420,
12
12
  "origin": "kit"
13
13
  },
@@ -207,7 +207,7 @@
207
207
  "ownerSkill": "grill-me",
208
208
  "surface": "codex",
209
209
  "installRole": "consumer",
210
- "sha256": "132cb0e6bf3e1b5b71575f4d2707880c7ffb844ccfa2c71a80270f891d04b724",
210
+ "sha256": "b9bda1641e1246f1975f4f1b85f25d1165597a48d9d5c8953284bcaa0168c584",
211
211
  "mode": 420,
212
212
  "origin": "kit"
213
213
  },
@@ -247,7 +247,7 @@
247
247
  "ownerSkill": "grill-with-docs",
248
248
  "surface": "codex",
249
249
  "installRole": "consumer",
250
- "sha256": "06a68913f904ce9bb1b21c86f146a6738b401da07eb57fb3c97a4eec00b58de6",
250
+ "sha256": "8d483c475b8c3ab8cad381bb34dff46261f2fdbae5597bef96d4930b721e49f8",
251
251
  "mode": 420,
252
252
  "origin": "kit"
253
253
  },
@@ -377,7 +377,7 @@
377
377
  "ownerSkill": "kit-update",
378
378
  "surface": "codex",
379
379
  "installRole": "consumer",
380
- "sha256": "dbf2c0f696bd0ce45c5c2a315d40a3bbb99635e4ab384c788ac59f799fbf43de",
380
+ "sha256": "1ec44ea1c4ab0c74febaf54e99d61122e9153c4820ef923287db7954738b5a99",
381
381
  "mode": 420,
382
382
  "origin": "kit"
383
383
  },
@@ -407,7 +407,7 @@
407
407
  "ownerSkill": "orchestrate-wave",
408
408
  "surface": "codex",
409
409
  "installRole": "consumer",
410
- "sha256": "8d4d919ebcf55bd0e22bea1512e1e23753925062d4b72fcbd22e7d711e12661e",
410
+ "sha256": "a3c3dc04411372f509b07e67f82217eb9656933f7ce5101beb5c123c2272d0bb",
411
411
  "mode": 420,
412
412
  "origin": "kit"
413
413
  },
@@ -417,7 +417,7 @@
417
417
  "ownerSkill": "orchestrate-wave",
418
418
  "surface": "codex",
419
419
  "installRole": "consumer",
420
- "sha256": "ea6e2613cd76101ff15b4f231a8e2f34e3d728c2dfd83f9f5310edcadf9b1feb",
420
+ "sha256": "39c0dd4d6f7663ab9a3602aab2869a881497604ca12f53f6ba0ca7debb0a4157",
421
421
  "mode": 420,
422
422
  "origin": "kit"
423
423
  },
@@ -517,7 +517,7 @@
517
517
  "ownerSkill": "retro",
518
518
  "surface": "codex",
519
519
  "installRole": "consumer",
520
- "sha256": "37f296e39469012802a5a0e5e35a61b0a89d18ca5888279c08ef15d8e3657ea8",
520
+ "sha256": "28bb50de62a05d06cd0ccf6c07a75ff213462016f689b6c3cabaa7b7b2a11112",
521
521
  "mode": 420,
522
522
  "origin": "kit"
523
523
  },
@@ -527,7 +527,7 @@
527
527
  "ownerSkill": "scale-check",
528
528
  "surface": "codex",
529
529
  "installRole": "consumer",
530
- "sha256": "80f8d5b4b811afd0bce4546d18170eed8a79ae2ee872b40563814374ea2ad1c2",
530
+ "sha256": "314c9b5c2ae701e670e9826432131cb597394e4e72aa2f24ec100d1c169b8134",
531
531
  "mode": 420,
532
532
  "origin": "kit"
533
533
  },
@@ -647,7 +647,7 @@
647
647
  "ownerSkill": "setup-workflow",
648
648
  "surface": "codex",
649
649
  "installRole": "consumer",
650
- "sha256": "e4cac2f46ac5f16e9a1473b38a64979a7d767ccdc834a2540d20c733305ea2e7",
650
+ "sha256": "44b5d8e4cbc15be187678ac42e7ce222553878e57ac7b11cf429deddba7656c5",
651
651
  "mode": 420,
652
652
  "origin": "kit"
653
653
  },
@@ -707,7 +707,7 @@
707
707
  "ownerSkill": "setup-workflow",
708
708
  "surface": "codex",
709
709
  "installRole": "consumer",
710
- "sha256": "bc4db6413135ad9056cc63691cb823a9b198ad47538f292b37fcbb915477a716",
710
+ "sha256": "e690b4901867163ba1853036ae935324e8790cbb7090833027d477e1a6eb2412",
711
711
  "mode": 420,
712
712
  "origin": "kit"
713
713
  },
@@ -787,7 +787,7 @@
787
787
  "ownerSkill": "tdd",
788
788
  "surface": "codex",
789
789
  "installRole": "consumer",
790
- "sha256": "e1790de4327805363be5d7a9de8109b7d90b77806ff6e6af00576bbfe0950d96",
790
+ "sha256": "a00253af6aae672bc27a4b2b24c73619cd8dd5b862902c266d0cbc41f1f19570",
791
791
  "mode": 420,
792
792
  "origin": "kit"
793
793
  },
@@ -817,7 +817,7 @@
817
817
  "ownerSkill": "to-issues",
818
818
  "surface": "codex",
819
819
  "installRole": "consumer",
820
- "sha256": "3fdd05150f428cf8098e4dd12f67cbc7ebe17fa9ab315e456fd0df70e5c9925d",
820
+ "sha256": "ed0acff1d04f04b55b9350e360c8249d1e4dbd44fd445909f11703361746e931",
821
821
  "mode": 420,
822
822
  "origin": "kit"
823
823
  },
@@ -927,7 +927,7 @@
927
927
  "ownerSkill": "verify-spike",
928
928
  "surface": "codex",
929
929
  "installRole": "consumer",
930
- "sha256": "c3ca2dfa2f609c4b89e6665b883126620769f352e78b8bf22342840f10fb0b1e",
930
+ "sha256": "44d6d94ad751ed54828aada2431867b766c285a5b8074d8af9e38c7f1b576d8b",
931
931
  "mode": 420,
932
932
  "origin": "kit"
933
933
  },
@@ -957,7 +957,7 @@
957
957
  "ownerSkill": "wrapup",
958
958
  "surface": "codex",
959
959
  "installRole": "consumer",
960
- "sha256": "6fc171c51ab508816726d9ada7f05cfc59f85a92a04008da453052adb64a9cb0",
960
+ "sha256": "69cf375285a8c793e3b55e70047bf114ec12ab529a705127da0730ca42db238e",
961
961
  "mode": 420,
962
962
  "origin": "kit"
963
963
  },
@@ -1047,7 +1047,7 @@
1047
1047
  "path": ".claude/hooks/drift-guard.py",
1048
1048
  "kind": "hook",
1049
1049
  "installRole": "consumer",
1050
- "sha256": "8a031ff04b7aa11ac7c4713de10634e1d1521ca9fbb82fc458a86f78f6d7d1cf",
1050
+ "sha256": "a248eb3697522b8804fd7d68d1fe3e95613a71829464501c8c7fa4c09d229a64",
1051
1051
  "mode": 493,
1052
1052
  "origin": "kit"
1053
1053
  },
@@ -1083,6 +1083,14 @@
1083
1083
  "mode": 493,
1084
1084
  "origin": "kit"
1085
1085
  },
1086
+ {
1087
+ "path": ".claude/hooks/kit-origin-edit-hint.py",
1088
+ "kind": "hook",
1089
+ "installRole": "consumer",
1090
+ "sha256": "43e9b9597213c03f7da862602f81e6d6addd3a87e7b20cd52a6a2908b3e90f03",
1091
+ "mode": 493,
1092
+ "origin": "kit"
1093
+ },
1086
1094
  {
1087
1095
  "path": ".claude/hooks/loc-offender-forewarn.py",
1088
1096
  "kind": "hook",
@@ -1161,7 +1169,7 @@
1161
1169
  "ownerSkill": "ask-matt",
1162
1170
  "surface": "claude",
1163
1171
  "installRole": "consumer",
1164
- "sha256": "931ccbc6645adcb02f585061aaf32655ddc1ae547ebb131b6956e8fe227376aa",
1172
+ "sha256": "acee6d16c4f77ba121eafc697706bceb9910fbf7d688683a1c3bfce8ab25bc11",
1165
1173
  "mode": 420,
1166
1174
  "origin": "kit"
1167
1175
  },
@@ -1441,7 +1449,7 @@
1441
1449
  "ownerSkill": "grill-me",
1442
1450
  "surface": "claude",
1443
1451
  "installRole": "consumer",
1444
- "sha256": "01e95acd6abb396c4f4c3ec7980b79f81bbee22d45247e96f1fe130fea3f5dbe",
1452
+ "sha256": "79215b74440492cd03d4578047bdd5b85472c4d635a7b9329d242b416a340b6f",
1445
1453
  "mode": 420,
1446
1454
  "origin": "kit"
1447
1455
  },
@@ -1521,7 +1529,7 @@
1521
1529
  "ownerSkill": "grill-with-docs",
1522
1530
  "surface": "claude",
1523
1531
  "installRole": "consumer",
1524
- "sha256": "6250d2e64ba1248bbd40dd0c7018ab432eda4010ebc34f6c9eccefd514a1f22b",
1532
+ "sha256": "3b2d33cbe41f7463edbf9f30c1c3c62eeaa77dc87d82b2c6b0c6ce01734f3ad3",
1525
1533
  "mode": 420,
1526
1534
  "origin": "kit"
1527
1535
  },
@@ -1651,7 +1659,7 @@
1651
1659
  "ownerSkill": "kit-update",
1652
1660
  "surface": "claude",
1653
1661
  "installRole": "consumer",
1654
- "sha256": "dbf2c0f696bd0ce45c5c2a315d40a3bbb99635e4ab384c788ac59f799fbf43de",
1662
+ "sha256": "1ec44ea1c4ab0c74febaf54e99d61122e9153c4820ef923287db7954738b5a99",
1655
1663
  "mode": 420,
1656
1664
  "origin": "kit"
1657
1665
  },
@@ -1681,7 +1689,7 @@
1681
1689
  "ownerSkill": "orchestrate-wave",
1682
1690
  "surface": "claude",
1683
1691
  "installRole": "consumer",
1684
- "sha256": "8d4d919ebcf55bd0e22bea1512e1e23753925062d4b72fcbd22e7d711e12661e",
1692
+ "sha256": "a3c3dc04411372f509b07e67f82217eb9656933f7ce5101beb5c123c2272d0bb",
1685
1693
  "mode": 420,
1686
1694
  "origin": "kit"
1687
1695
  },
@@ -1691,7 +1699,7 @@
1691
1699
  "ownerSkill": "orchestrate-wave",
1692
1700
  "surface": "claude",
1693
1701
  "installRole": "consumer",
1694
- "sha256": "5014069f36d333b672a49c994932f0a3487b6784fadc8626c76a9b3c138231be",
1702
+ "sha256": "20a972d7c13f059b1fda4daaeb77da777c898620bf9ec6bf6dd19c31b7e41d90",
1695
1703
  "mode": 420,
1696
1704
  "origin": "kit"
1697
1705
  },
@@ -1791,7 +1799,7 @@
1791
1799
  "ownerSkill": "retro",
1792
1800
  "surface": "claude",
1793
1801
  "installRole": "consumer",
1794
- "sha256": "e566a6d25c4ba0651b7aa7d09b563065a8aeab34c2c029bd64b124e7d75808ac",
1802
+ "sha256": "bacd42a03978c1647370fb481db9fa5a0b97282b9f5ed2192267e3c6f86b4989",
1795
1803
  "mode": 420,
1796
1804
  "origin": "kit"
1797
1805
  },
@@ -1801,7 +1809,7 @@
1801
1809
  "ownerSkill": "scale-check",
1802
1810
  "surface": "claude",
1803
1811
  "installRole": "consumer",
1804
- "sha256": "80f8d5b4b811afd0bce4546d18170eed8a79ae2ee872b40563814374ea2ad1c2",
1812
+ "sha256": "314c9b5c2ae701e670e9826432131cb597394e4e72aa2f24ec100d1c169b8134",
1805
1813
  "mode": 420,
1806
1814
  "origin": "kit"
1807
1815
  },
@@ -1941,7 +1949,7 @@
1941
1949
  "ownerSkill": "setup-workflow",
1942
1950
  "surface": "claude",
1943
1951
  "installRole": "consumer",
1944
- "sha256": "e4cac2f46ac5f16e9a1473b38a64979a7d767ccdc834a2540d20c733305ea2e7",
1952
+ "sha256": "44b5d8e4cbc15be187678ac42e7ce222553878e57ac7b11cf429deddba7656c5",
1945
1953
  "mode": 420,
1946
1954
  "origin": "kit"
1947
1955
  },
@@ -2001,7 +2009,7 @@
2001
2009
  "ownerSkill": "setup-workflow",
2002
2010
  "surface": "claude",
2003
2011
  "installRole": "consumer",
2004
- "sha256": "bc4db6413135ad9056cc63691cb823a9b198ad47538f292b37fcbb915477a716",
2012
+ "sha256": "e690b4901867163ba1853036ae935324e8790cbb7090833027d477e1a6eb2412",
2005
2013
  "mode": 420,
2006
2014
  "origin": "kit"
2007
2015
  },
@@ -2081,7 +2089,7 @@
2081
2089
  "ownerSkill": "tdd",
2082
2090
  "surface": "claude",
2083
2091
  "installRole": "consumer",
2084
- "sha256": "a59118ebbd8a4769d2c83987100df4e6b8d7417ec8f5d2d877cd56871de333c5",
2092
+ "sha256": "f981bc5f3cde8f2fd57ec8b11d42af3de06c242fdc803c7a514c0d9f42455b50",
2085
2093
  "mode": 420,
2086
2094
  "origin": "kit"
2087
2095
  },
@@ -2111,7 +2119,7 @@
2111
2119
  "ownerSkill": "to-issues",
2112
2120
  "surface": "claude",
2113
2121
  "installRole": "consumer",
2114
- "sha256": "5874d4b2d4999bd32a0a90c955467fc4e58e230295cd6ee21936fa30456bda6e",
2122
+ "sha256": "29795b85ec699433ec88cfd1b48c8996160eda307974056f19d66226d9541f09",
2115
2123
  "mode": 420,
2116
2124
  "origin": "kit"
2117
2125
  },
@@ -2221,7 +2229,7 @@
2221
2229
  "ownerSkill": "verify-spike",
2222
2230
  "surface": "claude",
2223
2231
  "installRole": "consumer",
2224
- "sha256": "fa6e0a651065ecb98b4b01fc1f1a22c2f391bd6abf2e34f69e43b1053f8ce105",
2232
+ "sha256": "72caaf97909efcf8e56fdd4c2bb25db10749d172077e38f0beac1a07ab7cb611",
2225
2233
  "mode": 420,
2226
2234
  "origin": "kit"
2227
2235
  },
@@ -2251,7 +2259,7 @@
2251
2259
  "ownerSkill": "wrapup",
2252
2260
  "surface": "claude",
2253
2261
  "installRole": "consumer",
2254
- "sha256": "1340ed2344982ccc26393b5e1d89614ac959de890a7513e14823758fc4694093",
2262
+ "sha256": "eece58a858c826f8690a1443bc125e7550e6224ffccf909c06b9796d51e245e7",
2255
2263
  "mode": 420,
2256
2264
  "origin": "kit"
2257
2265
  },
@@ -2323,7 +2331,7 @@
2323
2331
  "path": "docs/agents/wave-anchor-template.md",
2324
2332
  "kind": "template",
2325
2333
  "installRole": "consumer",
2326
- "sha256": "9576f4b0c96f0188f155d98605feefac75a8acf22a0d4364abe4d0eb6f9abf62",
2334
+ "sha256": "09a7c9378c5cba4d5c4d9f7e1e39041e60bbcaa3fea38731a2841bf0c5f0ceda",
2327
2335
  "mode": 420,
2328
2336
  "origin": "kit"
2329
2337
  },
@@ -2355,7 +2363,7 @@
2355
2363
  "path": "scripts/board-sync.py",
2356
2364
  "kind": "script",
2357
2365
  "installRole": "consumer",
2358
- "sha256": "4cf206abfec87578863c99f11e00c99a2048f4f8776cbcb38a23c69e73e37c16",
2366
+ "sha256": "64444f57456b9032f427650fe110a1f0a03924cfe0ec7293b03bdf0ab9eefa67",
2359
2367
  "mode": 493,
2360
2368
  "origin": "kit"
2361
2369
  },
@@ -2479,11 +2487,19 @@
2479
2487
  "mode": 420,
2480
2488
  "origin": "kit"
2481
2489
  },
2490
+ {
2491
+ "path": "scripts/pr_body_e2e.py",
2492
+ "kind": "script",
2493
+ "installRole": "consumer",
2494
+ "sha256": "3141521a127644de6d5abec86716d13ae1427ba2f8a8877cbfb9ed88f6095b38",
2495
+ "mode": 420,
2496
+ "origin": "kit"
2497
+ },
2482
2498
  {
2483
2499
  "path": "scripts/pr-body-check.py",
2484
2500
  "kind": "script",
2485
2501
  "installRole": "consumer",
2486
- "sha256": "fd4fe050c4db485e07d7ff25fa4a029c8b05c96a58ab432ae6d4120b72f11581",
2502
+ "sha256": "864dad50be7904cf0c1d70956352c70d2195a350a5a6875de6b866c494f16612",
2487
2503
  "mode": 493,
2488
2504
  "origin": "kit"
2489
2505
  },
@@ -0,0 +1,49 @@
1
+ # Consumer divergence policy: clean shipped files, owned exceptions, upstream route as a question
2
+
3
+ Status: accepted (2026-07-18, issue #130)
4
+
5
+ Since the consumer-source cutover the kit is SSOT for shipped files, but
6
+ consumers keep learning: edits made directly on a shipped file in a consumer
7
+ silently fork it, and every subsequent `kit-update` reports a permanent
8
+ conflict (observed: 6 recurring conflicts in testreporter on 0.27.1).
9
+
10
+ We decided on a three-part policy:
11
+
12
+ 1. **Clean shipped files.** A kit-shipped file in a consumer carries no
13
+ project-specific content — including no project issue references in
14
+ comments. Generic improvements are ported upstream (reference-free,
15
+ English) and return via `kit-update`; project-specific needs live in
16
+ consumer-native files or consumer-owned paths.
17
+ 2. **Consumer-owned paths as the marked exception.** A consumer may claim a
18
+ genuinely forking file via `own <path>` (manifest `origin: 'consumer'`).
19
+ The reconciler then skips it entirely: no overwrite, no conflict report, no
20
+ deletion prompt. The cost — forgoing all future kit improvements to that
21
+ file — is deliberate and made visible on demand via `diff --owned`, never
22
+ as warning noise in normal updates.
23
+ 3. **Upstream route as a question.** When a shipped file is about to be
24
+ edited in a consumer (retro finding or direct edit), the shipped rule asks
25
+ the user whether the change should go upstream as a kit issue
26
+ (`gh issue create --repo iKon85/agent-workflow-kit`, lightweight: title +
27
+ short body). It never assumes the user is the kit maintainer and never
28
+ files automatically.
29
+
30
+ ## Considered options
31
+
32
+ - **`own` for mixed scripts too** (e.g. `scripts/board-sync.py` with both
33
+ generic timeout fixes and project issue-reference comments): rejected —
34
+ owning the kit's most active script means no upstream fix ever reaches it
35
+ again.
36
+ - **Accepting perpetual conflicts**: rejected — that is exactly the noise
37
+ this policy removes; conflict reports must stay meaningful.
38
+ - **Routing rule in the maintainer's global config or a standalone
39
+ convention doc**: rejected — the rule must ship with the kit (retro skill,
40
+ kit-update skill, enforcement hook) so it reaches every consumer,
41
+ versioned, including consumers not run by the maintainer.
42
+
43
+ ## Consequences
44
+
45
+ - Consumers lose the habit of annotating shipped scripts with their own
46
+ issue numbers; provenance for shipped files lives in the kit's history.
47
+ - The reconciler gains an `own`/`disown` surface and a `consumerOwned`
48
+ report bucket; owned files fall permanently behind the kit unless
49
+ explicitly disowned after a peek.
@@ -55,7 +55,7 @@ Order (WSJF-lite): visible + low-risk first → logic/backend → cleanup. Depen
55
55
 
56
56
  Status legend: ⬜ open · 🔄 in progress · ✅ merged #<PR>. **Every slice = one sub-issue** (`#<sub>`). **The volatile Status column is generated by `board-sync.py anchor-sync <anchor#>` from the board** (between the `<!-- slice-table:start/end -->` markers; `wrapup` Step 5e.1 calls it on merge) — monotone (never flips a `✅`/`🔄` back), drift-free idempotent; **stable plan columns (Slice/Gate/refs) stay hand-maintained** and survive verbatim. It appends missing sub-issue rows (gen-b split). **Don't delete the markers** — without them `anchor-sync` can't locate the table (the first run locates it via the `Status`+`Sub-Issue` header row and sets the markers itself). The native "Sub-issues progress" rollup is the secondary %-view. *(Slimmed in: Branch is derivable from the `feat/<#>-<slug>` convention, the model recommendation lives in the leaf's handoff, Backend? carried no navigation value — legacy anchors that still have those columns keep working, `anchor-sync` matches columns by header name and refreshes Branch/Blocked-by only where the column exists.)*
57
57
 
58
- **Gate legend (retro):** `—` AFK build (`/tdd`) · 🧭 design grill (`grill-with-docs-codex`, ADR) · 🔬 verify spike (read-only fact question) · 📐 trade-off/research (read-only, below grill threshold) · 📝 review note (not a build slice). A gate slice (🧭/🔬/📐) sits **before** its dependent build slice (gate-before-build) and blocks it.
58
+ **Gate legend (retro):** `—` AFK build (`/implement`) · 🧭 design grill (`grill-with-docs-codex`, ADR) · 🔬 verify spike (read-only fact question) · 📐 trade-off/research (read-only, below grill threshold) · 📝 review note (not a build slice). A gate slice (🧭/🔬/📐) sits **before** its dependent build slice (gate-before-build) and blocks it.
59
59
 
60
60
  **Closing conditions:** <Issue #x → after which slices> · <…> · Anchor #<self> → all slices merged + native sub-issues 100%.
61
61
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikon85/agent-workflow-kit",
3
- "version": "0.27.1",
3
+ "version": "0.28.0",
4
4
  "description": "Portable AI-agent workflow skills (plan → execute → land → learn) for Claude Code & Codex — grilling, TDD, diagnosis, two-axis code review, cross-model Codex review, design & domain-modeling, plus a skill router (ask-matt). npx init/update/diff/uninstall.",
5
5
  "type": "module",
6
6
  "bin": {