@ikon85/agent-workflow-kit 0.27.1 → 0.29.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 (79) hide show
  1. package/.agents/skills/ask-matt/SKILL.md +2 -2
  2. package/.agents/skills/board-to-waves/SKILL.md +13 -3
  3. package/.agents/skills/grill-me/SKILL.md +1 -1
  4. package/.agents/skills/grill-with-docs/SKILL.md +1 -1
  5. package/.agents/skills/kit-update/SKILL.md +12 -0
  6. package/.agents/skills/orchestrate-wave/SKILL.md +68 -21
  7. package/.agents/skills/orchestrate-wave/references/builder-contract.md +6 -4
  8. package/.agents/skills/retro/SKILL.md +24 -1
  9. package/.agents/skills/scale-check/SKILL.md +2 -2
  10. package/.agents/skills/setup-workflow/SKILL.md +44 -1
  11. package/.agents/skills/setup-workflow/workflow-overview.md +5 -5
  12. package/.agents/skills/tdd/SKILL.md +68 -14
  13. package/.agents/skills/to-issues/SKILL.md +104 -29
  14. package/.agents/skills/to-prd/SKILL.md +13 -3
  15. package/.agents/skills/to-waves/SKILL.md +16 -4
  16. package/.agents/skills/verify-spike/SKILL.md +1 -1
  17. package/.agents/skills/wrapup/SKILL.md +14 -3
  18. package/.claude/hooks/drift-guard.py +5 -2
  19. package/.claude/hooks/kit-origin-edit-hint.py +64 -0
  20. package/.claude/skills/ask-matt/SKILL.md +2 -2
  21. package/.claude/skills/board-to-waves/SKILL.md +13 -3
  22. package/.claude/skills/codex-build/SKILL.md +69 -23
  23. package/.claude/skills/codex-review/SKILL.md +47 -37
  24. package/.claude/skills/grill-me/SKILL.md +1 -1
  25. package/.claude/skills/grill-me-codex/SKILL.md +45 -34
  26. package/.claude/skills/grill-with-docs/SKILL.md +1 -1
  27. package/.claude/skills/grill-with-docs-codex/SKILL.md +46 -34
  28. package/.claude/skills/kit-update/SKILL.md +12 -0
  29. package/.claude/skills/orchestrate-wave/SKILL.md +68 -21
  30. package/.claude/skills/orchestrate-wave/references/builder-contract.md +6 -4
  31. package/.claude/skills/retro/SKILL.md +23 -0
  32. package/.claude/skills/scale-check/SKILL.md +2 -2
  33. package/.claude/skills/setup-workflow/SKILL.md +44 -1
  34. package/.claude/skills/setup-workflow/workflow-overview.md +5 -5
  35. package/.claude/skills/skill-manifest.json +1 -1
  36. package/.claude/skills/tdd/SKILL.md +68 -14
  37. package/.claude/skills/to-issues/SKILL.md +104 -29
  38. package/.claude/skills/to-prd/SKILL.md +13 -3
  39. package/.claude/skills/to-waves/SKILL.md +16 -4
  40. package/.claude/skills/verify-spike/SKILL.md +1 -1
  41. package/.claude/skills/wrapup/SKILL.md +14 -3
  42. package/README.md +70 -7
  43. package/agent-workflow-kit.package.json +99 -43
  44. package/docs/adr/0001-consumer-divergence-policy.md +49 -0
  45. package/docs/agents/wave-anchor-template.md +1 -1
  46. package/docs/research/wave-152-consumer-acceptance.md +98 -0
  47. package/package.json +1 -1
  48. package/scripts/board-sync.py +187 -12
  49. package/scripts/build-kit.test.mjs +42 -1
  50. package/scripts/codex-exec-scenarios/fake-codex.mjs +152 -0
  51. package/scripts/codex-exec.sh +566 -0
  52. package/scripts/codex-exec.test.mjs +815 -0
  53. package/scripts/codex_proc.py +602 -0
  54. package/scripts/find-by-marker.py +68 -0
  55. package/scripts/marker_lib.py +88 -0
  56. package/scripts/pr-body-check.py +34 -6
  57. package/scripts/pr_body_e2e.py +83 -0
  58. package/scripts/render-anchor.py +111 -0
  59. package/scripts/test_board_sync.py +208 -0
  60. package/scripts/test_census_backstop.py +56 -3
  61. package/scripts/test_marker_lib.py +154 -0
  62. package/scripts/test_orchestrate_wave_contract.py +116 -0
  63. package/scripts/test_pr_body_check.py +245 -0
  64. package/scripts/test_render_anchor.py +267 -0
  65. package/scripts/test_retro_wrapup_contract.py +117 -0
  66. package/scripts/test_skill_codex_exec_lifecycle.py +123 -0
  67. package/scripts/test_tdd_contract.py +78 -0
  68. package/src/cli.mjs +44 -8
  69. package/src/commands/diff.mjs +5 -2
  70. package/src/commands/init.mjs +12 -0
  71. package/src/commands/own.mjs +16 -0
  72. package/src/commands/uninstall.mjs +8 -1
  73. package/src/commands/update.mjs +37 -9
  74. package/src/lib/bundle.mjs +14 -0
  75. package/src/lib/consumerPath.mjs +30 -0
  76. package/src/lib/manifest.mjs +18 -0
  77. package/src/lib/ownedDiff.mjs +88 -0
  78. package/src/lib/updateCandidate.mjs +14 -0
  79. package/src/lib/updateReconcile.mjs +45 -6
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,79 @@ 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.29.0
352
+
353
+ - added: `scripts/codex-exec.sh`
354
+ - added: `scripts/codex_proc.py`
355
+ - added: `scripts/find-by-marker.py`
356
+ - added: `scripts/marker_lib.py`
357
+ - added: `scripts/render-anchor.py`
358
+ - changed: `.agents/skills/board-to-waves/SKILL.md`
359
+ - changed: `.agents/skills/to-issues/SKILL.md`
360
+ - changed: `.agents/skills/to-prd/SKILL.md`
361
+ - changed: `.agents/skills/to-waves/SKILL.md`
362
+ - changed: `.agents/skills/wrapup/SKILL.md`
363
+ - changed: `.claude/skills/board-to-waves/SKILL.md`
364
+ - changed: `.claude/skills/codex-build/SKILL.md`
365
+ - changed: `.claude/skills/codex-review/SKILL.md`
366
+ - changed: `.claude/skills/grill-me-codex/SKILL.md`
367
+ - changed: `.claude/skills/grill-with-docs-codex/SKILL.md`
368
+ - changed: `.claude/skills/to-issues/SKILL.md`
369
+ - changed: `.claude/skills/to-prd/SKILL.md`
370
+ - changed: `.claude/skills/to-waves/SKILL.md`
371
+ - changed: `.claude/skills/wrapup/SKILL.md`
372
+ - changed: `scripts/board-sync.py`
373
+
374
+ ### 0.28.0
375
+
376
+ - added: `.claude/hooks/kit-origin-edit-hint.py`
377
+ - added: `scripts/pr_body_e2e.py`
378
+ - changed: `.agents/skills/kit-update/SKILL.md`
379
+ - changed: `.agents/skills/orchestrate-wave/SKILL.md`
380
+ - changed: `.agents/skills/orchestrate-wave/references/builder-contract.md`
381
+ - changed: `.agents/skills/retro/SKILL.md`
382
+ - changed: `.agents/skills/setup-workflow/SKILL.md`
383
+ - changed: `.agents/skills/tdd/SKILL.md`
384
+ - changed: `.agents/skills/wrapup/SKILL.md`
385
+ - changed: `.claude/hooks/drift-guard.py`
386
+ - changed: `.claude/skills/kit-update/SKILL.md`
387
+ - changed: `.claude/skills/orchestrate-wave/SKILL.md`
388
+ - changed: `.claude/skills/orchestrate-wave/references/builder-contract.md`
389
+ - changed: `.claude/skills/retro/SKILL.md`
390
+ - changed: `.claude/skills/setup-workflow/SKILL.md`
391
+ - changed: `.claude/skills/tdd/SKILL.md`
392
+ - changed: `.claude/skills/wrapup/SKILL.md`
393
+ - changed: `scripts/board-sync.py`
394
+ - changed: `scripts/pr-body-check.py`
395
+
333
396
  ### 0.27.1
334
397
 
335
398
  - changed: `scripts/release-parity.mjs`
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitVersion": "0.27.1",
2
+ "kitVersion": "0.29.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
  },
@@ -37,7 +37,7 @@
37
37
  "ownerSkill": "board-to-waves",
38
38
  "surface": "codex",
39
39
  "installRole": "consumer",
40
- "sha256": "1e145fd3da4426aa210169d9a47c5558588ee7317cbeb4ae8d0852c2cd672943",
40
+ "sha256": "aaa326544b53b43635f1f212ac3bd18a368e9440c41de748c4eccc911bc615bb",
41
41
  "mode": 420,
42
42
  "origin": "kit"
43
43
  },
@@ -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": "2fc271cda4d1b46b82ac32a9e8aa04cf4349bbac0ea31133ee03458d2c6c2b13",
821
821
  "mode": 420,
822
822
  "origin": "kit"
823
823
  },
@@ -847,7 +847,7 @@
847
847
  "ownerSkill": "to-prd",
848
848
  "surface": "codex",
849
849
  "installRole": "consumer",
850
- "sha256": "0c7c556dfae2641a452ba5874e2e977b3e6f33d941b40be93b5009cb1d959ff8",
850
+ "sha256": "33c5229fcdae4309c2a5c7ea28c60b8708be276960c628f906a6da5a4450cbbb",
851
851
  "mode": 420,
852
852
  "origin": "kit"
853
853
  },
@@ -867,7 +867,7 @@
867
867
  "ownerSkill": "to-waves",
868
868
  "surface": "codex",
869
869
  "installRole": "consumer",
870
- "sha256": "5ac4fd5d26d6ea2327fc50ad4bcc8f3d8c80186afb976410d8c3e8f3c21d896e",
870
+ "sha256": "8bed0af37f81f0160079c316f26815f220e1eb3e47359a723262f6fe37978ea0",
871
871
  "mode": 420,
872
872
  "origin": "kit"
873
873
  },
@@ -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": "0b973d9531514f4400e107858ff0070c522d5e542c47123473667ca8337627fd",
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
  },
@@ -1191,7 +1199,7 @@
1191
1199
  "ownerSkill": "board-to-waves",
1192
1200
  "surface": "claude",
1193
1201
  "installRole": "consumer",
1194
- "sha256": "28c47d10f7508cadf5056c66a62d5891dfb61733a30ae517be24dd766c7996dd",
1202
+ "sha256": "1433f500d64adfd0365c0ec74366075fd54e053846c95aafa5ee6773a5fb2ea4",
1195
1203
  "mode": 420,
1196
1204
  "origin": "kit"
1197
1205
  },
@@ -1261,7 +1269,7 @@
1261
1269
  "ownerSkill": "codex-build",
1262
1270
  "surface": "claude",
1263
1271
  "installRole": "consumer",
1264
- "sha256": "5f546bfc08b37a829ccb16faab497a69146a7bc4118578b1fe080356f471a5a2",
1272
+ "sha256": "ddf64d487b8bbfd8cbd0cc5cf8eaff81fb46576f201fe29ad20d48f9e5055e13",
1265
1273
  "mode": 420,
1266
1274
  "origin": "kit"
1267
1275
  },
@@ -1281,7 +1289,7 @@
1281
1289
  "ownerSkill": "codex-review",
1282
1290
  "surface": "claude",
1283
1291
  "installRole": "consumer",
1284
- "sha256": "77ee99adbbd69cd21bb431e8aa0457dd8c55f5ab7c0ca4af120c91b77af68de3",
1292
+ "sha256": "053da37cb29396d613383f90b0abf3e6ce6279c22a062921dcf50348ca30fd95",
1285
1293
  "mode": 420,
1286
1294
  "origin": "kit"
1287
1295
  },
@@ -1421,7 +1429,7 @@
1421
1429
  "ownerSkill": "grill-me-codex",
1422
1430
  "surface": "claude",
1423
1431
  "installRole": "consumer",
1424
- "sha256": "ab73dd6b147e05837082db5d5ab68ab118e51e59767a717c8b7a0262cfbd07b5",
1432
+ "sha256": "77e0254e203232909898f868bb803aaff15dcc0c62515d9366b1dfda79fa249f",
1425
1433
  "mode": 420,
1426
1434
  "origin": "kit"
1427
1435
  },
@@ -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
  },
@@ -1481,7 +1489,7 @@
1481
1489
  "ownerSkill": "grill-with-docs-codex",
1482
1490
  "surface": "claude",
1483
1491
  "installRole": "consumer",
1484
- "sha256": "5c7635bf31a3dc575762793ae80dfe7a26498aedcf7f1ce0513822ea1ebdb100",
1492
+ "sha256": "095d6aa09d88d07178677fb02a7e5c830d22fc60fe517bddfd283856c3dd2264",
1485
1493
  "mode": 420,
1486
1494
  "origin": "kit"
1487
1495
  },
@@ -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": "c53523f2b7b4023ea33cb25903d7b7a018041ac135fa11777f64fa4bebfcba11",
2115
2123
  "mode": 420,
2116
2124
  "origin": "kit"
2117
2125
  },
@@ -2141,7 +2149,7 @@
2141
2149
  "ownerSkill": "to-prd",
2142
2150
  "surface": "claude",
2143
2151
  "installRole": "consumer",
2144
- "sha256": "38352d6e792114cc6c2352c34af841033ccaf06cf34e9ccab1bc76b51a0ca4a1",
2152
+ "sha256": "9fd7582508fb33cbca2ce945a628b43b502fe942a83d3a16ff495f7c42e59109",
2145
2153
  "mode": 420,
2146
2154
  "origin": "kit"
2147
2155
  },
@@ -2161,7 +2169,7 @@
2161
2169
  "ownerSkill": "to-waves",
2162
2170
  "surface": "claude",
2163
2171
  "installRole": "consumer",
2164
- "sha256": "5ac4fd5d26d6ea2327fc50ad4bcc8f3d8c80186afb976410d8c3e8f3c21d896e",
2172
+ "sha256": "8bed0af37f81f0160079c316f26815f220e1eb3e47359a723262f6fe37978ea0",
2165
2173
  "mode": 420,
2166
2174
  "origin": "kit"
2167
2175
  },
@@ -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": "7b3266caaf53d0eadae2e16617fbf89fa170c50aaa9a916023c37afb41f05a79",
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": "d0c4cd8f05c619e5d24f26796eb759467f3ae97b154f12e9526a3017fd5b1eb9",
2359
2367
  "mode": 493,
2360
2368
  "origin": "kit"
2361
2369
  },
@@ -2407,6 +2415,22 @@
2407
2415
  "mode": 420,
2408
2416
  "origin": "kit"
2409
2417
  },
2418
+ {
2419
+ "path": "scripts/codex_proc.py",
2420
+ "kind": "script",
2421
+ "installRole": "consumer",
2422
+ "sha256": "39b00b516b69dd80c34525241991b7a57d37f701d833e92a98d373be86191e05",
2423
+ "mode": 420,
2424
+ "origin": "kit"
2425
+ },
2426
+ {
2427
+ "path": "scripts/codex-exec.sh",
2428
+ "kind": "script",
2429
+ "installRole": "consumer",
2430
+ "sha256": "c5d60648cb09343996efc98614dbd0c78b18672891bf466e5a8c5aba359d5df8",
2431
+ "mode": 493,
2432
+ "origin": "kit"
2433
+ },
2410
2434
  {
2411
2435
  "path": "scripts/execute-ready-check.py",
2412
2436
  "kind": "script",
@@ -2415,6 +2439,14 @@
2415
2439
  "mode": 493,
2416
2440
  "origin": "kit"
2417
2441
  },
2442
+ {
2443
+ "path": "scripts/find-by-marker.py",
2444
+ "kind": "script",
2445
+ "installRole": "consumer",
2446
+ "sha256": "afaec50d8214dc3d89d28fbcb20faa9f997fc58158593618fcc80fb800b367ea",
2447
+ "mode": 493,
2448
+ "origin": "kit"
2449
+ },
2418
2450
  {
2419
2451
  "path": "scripts/issue_deps.py",
2420
2452
  "kind": "script",
@@ -2455,6 +2487,14 @@
2455
2487
  "mode": 493,
2456
2488
  "origin": "kit"
2457
2489
  },
2490
+ {
2491
+ "path": "scripts/marker_lib.py",
2492
+ "kind": "script",
2493
+ "installRole": "consumer",
2494
+ "sha256": "015a22041ee7a66609123c1944e915a869f208789914811674c0c350e07a7b11",
2495
+ "mode": 420,
2496
+ "origin": "kit"
2497
+ },
2458
2498
  {
2459
2499
  "path": "scripts/memory-lifecycle/index.mjs",
2460
2500
  "kind": "script",
@@ -2479,11 +2519,19 @@
2479
2519
  "mode": 420,
2480
2520
  "origin": "kit"
2481
2521
  },
2522
+ {
2523
+ "path": "scripts/pr_body_e2e.py",
2524
+ "kind": "script",
2525
+ "installRole": "consumer",
2526
+ "sha256": "3141521a127644de6d5abec86716d13ae1427ba2f8a8877cbfb9ed88f6095b38",
2527
+ "mode": 420,
2528
+ "origin": "kit"
2529
+ },
2482
2530
  {
2483
2531
  "path": "scripts/pr-body-check.py",
2484
2532
  "kind": "script",
2485
2533
  "installRole": "consumer",
2486
- "sha256": "fd4fe050c4db485e07d7ff25fa4a029c8b05c96a58ab432ae6d4120b72f11581",
2534
+ "sha256": "864dad50be7904cf0c1d70956352c70d2195a350a5a6875de6b866c494f16612",
2487
2535
  "mode": 493,
2488
2536
  "origin": "kit"
2489
2537
  },
@@ -2551,6 +2599,14 @@
2551
2599
  "mode": 420,
2552
2600
  "origin": "kit"
2553
2601
  },
2602
+ {
2603
+ "path": "scripts/render-anchor.py",
2604
+ "kind": "script",
2605
+ "installRole": "consumer",
2606
+ "sha256": "c16ca661662c35761ec1d39f6ae946319a198a0ea39892fcce484288d319fb16",
2607
+ "mode": 493,
2608
+ "origin": "kit"
2609
+ },
2554
2610
  {
2555
2611
  "path": "scripts/safety-guardrails/core.py",
2556
2612
  "kind": "script",
@@ -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