@ikon85/agent-workflow-kit 0.38.0 → 0.40.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.
- package/.agents/skills/grill-me/SKILL.md +1 -1
- package/.agents/skills/grill-with-docs/SKILL.md +1 -1
- package/.agents/skills/kit-update/SKILL.md +33 -1
- package/.agents/skills/orchestrate-wave/SKILL.md +4 -4
- package/.agents/skills/setup-workflow/SKILL.md +84 -3
- package/.agents/skills/setup-workflow/board-sync.md +6 -2
- package/.agents/skills/setup-workflow/workflow-advisories.md +34 -0
- package/.agents/skills/setup-workflow/worktree-lifecycle.md +54 -3
- package/.agents/skills/wrapup/SKILL.md +24 -0
- package/.claude/hooks/drift-guard.py +212 -21
- package/.claude/skills/grill-me/SKILL.md +1 -1
- package/.claude/skills/grill-with-docs/SKILL.md +1 -1
- package/.claude/skills/kit-update/SKILL.md +33 -1
- package/.claude/skills/orchestrate-wave/SKILL.md +4 -4
- package/.claude/skills/setup-workflow/SKILL.md +84 -3
- package/.claude/skills/setup-workflow/board-sync.md +6 -2
- package/.claude/skills/setup-workflow/workflow-advisories.md +34 -0
- package/.claude/skills/setup-workflow/worktree-lifecycle.md +54 -3
- package/.claude/skills/wrapup/SKILL.md +24 -0
- package/README.md +62 -0
- package/agent-workflow-kit.package.json +57 -25
- package/docs/adr/0008-planning-ignore-rules-are-offered-never-installed.md +84 -0
- package/package.json +1 -1
- package/scripts/board_bootstrap.py +367 -0
- package/scripts/kit-update-pr.mjs +20 -7
- package/scripts/kit-update-pr.test.mjs +29 -0
- package/scripts/profile_globs.py +347 -0
- package/scripts/test_board_bootstrap.py +348 -0
- package/scripts/test_drift_guard_diagnostics.py +295 -0
- package/scripts/test_profile_globs.py +280 -0
- package/scripts/test_skill_setup_workflow_seeds.py +87 -0
- package/scripts/test_worktree_ignore_seed.py +320 -0
- package/scripts/test_worktree_wrapup_contract.py +588 -0
- package/scripts/workflow-advisories/core.py +29 -4
- package/scripts/worktree-lifecycle/README.md +53 -4
- package/scripts/worktree-lifecycle/core.py +211 -60
- package/scripts/worktree-lifecycle/ignore_seed.py +226 -0
- package/scripts/worktree-lifecycle/plan-artifacts.json +37 -0
- package/scripts/wrapup-land.py +179 -34
- package/src/cli.mjs +32 -1
- package/src/commands/update.mjs +30 -21
- package/src/consumer-migrations.json +19 -0
- package/src/lib/bundle.mjs +16 -0
- package/src/lib/consumerMigrations.mjs +161 -0
|
@@ -82,12 +82,34 @@ The exact kit-owned commands are:
|
|
|
82
82
|
Preserve unrelated settings, hook groups, profile sections, and unknown keys.
|
|
83
83
|
Repeated reconciliation with the same choice is byte-identical.
|
|
84
84
|
|
|
85
|
+
## Planning-artifact ignore rules (offered, never installed)
|
|
86
|
+
|
|
87
|
+
The planning artefacts the shipped skills write live in the worktree, but
|
|
88
|
+
`.gitignore` is a consumer file the kit does not own: `init` and `update` never
|
|
89
|
+
touch it. Setup may therefore only **offer** the rules, from Section A11, using
|
|
90
|
+
`python3 scripts/worktree-lifecycle/ignore_seed.py`. The kit-owned declaration
|
|
91
|
+
of which artefacts those are is `scripts/worktree-lifecycle/plan-artifacts.json`.
|
|
92
|
+
|
|
93
|
+
| State | Setup action |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `append` | Show the exact marker block, then ask. |
|
|
96
|
+
| approve | Run `ignore_seed.py apply` once: it appends that one block, append-only. |
|
|
97
|
+
| decline | Write nothing; a later rerun offers it again. |
|
|
98
|
+
| already ignored | Report `nothing to do`; ask nothing and write nothing. |
|
|
99
|
+
| re-run after approval | Byte-identical no-op; never a second block. |
|
|
100
|
+
| consumer-edited block | `blocked` — report the uncovered artefacts and leave the file untouched. |
|
|
101
|
+
|
|
102
|
+
The seeder never rewrites, reorders, or removes an existing line, and a tracked
|
|
103
|
+
artefact is reported rather than untracked for the consumer. Only this explicit,
|
|
104
|
+
approved step may write `.gitignore`.
|
|
105
|
+
|
|
85
106
|
## Scratch classification and sweep
|
|
86
107
|
|
|
87
108
|
Reconcile an explicit `scratchPatterns` array when enabling a new profile.
|
|
88
109
|
Derive its glob values from the consumer's ignored planning artefacts; an empty
|
|
89
110
|
array is valid. Existing values are consumer-owned and remain byte-identical on
|
|
90
|
-
adoption or rerun. Core never supplies filename defaults
|
|
111
|
+
adoption or rerun. Core never supplies filename defaults — the offered ignore
|
|
112
|
+
rules above are what give that derivation something real to read.
|
|
91
113
|
|
|
92
114
|
Also reconcile an explicit
|
|
93
115
|
`wrapup.landingGeneratedArtifactPatterns` array. Derive candidates from the
|
|
@@ -99,11 +121,40 @@ If an existing enabled profile lacks the key, report one actionable setup
|
|
|
99
121
|
decision and leave the project layer unchanged until the consumer confirms the
|
|
100
122
|
derived list.
|
|
101
123
|
|
|
102
|
-
|
|
103
|
-
|
|
124
|
+
## Profile glob dialect
|
|
125
|
+
|
|
126
|
+
Every consumer-profile glob in this kit — Worktree Lifecycle and Workflow
|
|
127
|
+
Advisories alike — is matched by the one shared dialect in
|
|
128
|
+
`scripts/profile_globs.py`. There is no second matcher and no per-capability
|
|
129
|
+
variant:
|
|
130
|
+
|
|
131
|
+
- `*` matches any run of characters inside one path segment, never `/`.
|
|
132
|
+
- `?` matches exactly one character inside one path segment.
|
|
133
|
+
- `[seq]` and `[!seq]` are per-segment character classes; `/` is always a
|
|
134
|
+
separator and never a class member.
|
|
135
|
+
- `**` as a complete segment matches zero or more segments, so a leading `**/`
|
|
136
|
+
also matches the repository root and `dir/**` also matches `dir` itself.
|
|
137
|
+
- Matching is always case-sensitive, on every host filesystem.
|
|
138
|
+
- A pattern must match the whole repository-relative path.
|
|
139
|
+
|
|
104
140
|
Thus `**/__pycache__/**` covers root and nested caches, while `dist-kit/*` does
|
|
105
141
|
not cover `dist-kit/a/b`.
|
|
106
142
|
|
|
143
|
+
When adopting an existing profile, or after any kit update, review it before
|
|
144
|
+
trusting its patterns:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
python3 scripts/profile_globs.py docs/agents/workflow-capabilities.json
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The check names every pattern whose match set narrows or widens against that
|
|
151
|
+
key's legacy matcher, prints the concrete witness path that proves the
|
|
152
|
+
difference, and marks the keys that carry deletion authority. Exit code 1 means
|
|
153
|
+
at least one pattern needs review. Report the named patterns and let the
|
|
154
|
+
consumer rewrite them; never migrate a pattern automatically and never treat a
|
|
155
|
+
widened deletion-authority pattern as an accepted default. The check reads the
|
|
156
|
+
profile and never edits it.
|
|
157
|
+
|
|
107
158
|
The shipped read-only inventory is
|
|
108
159
|
`python3 scripts/worktree-lifecycle/cleanup.py sweep`. The same profile powers
|
|
109
160
|
its branch issue extraction and scratch-only cleanup verdicts.
|
|
@@ -127,6 +127,30 @@ matching path; classify or move those blockers first. Do not use relinquish for
|
|
|
127
127
|
an exact unchanged frozen attempt: a normal retry validates that evidence and
|
|
128
128
|
resumes deterministically.
|
|
129
129
|
|
|
130
|
+
An attempt journaled under the superseded v1 contract is **legacy, not
|
|
131
|
+
corruption**. The STOP says so explicitly and names the same
|
|
132
|
+
`--abandon-unfinished-attempt` archive route; archival stays valid for a v1 and
|
|
133
|
+
a v2 receipt even without a creation baseline or a local main profile, and no
|
|
134
|
+
generated or consumer file is deleted or claimed on that route.
|
|
135
|
+
|
|
136
|
+
If canonical `origin/main` changed its scratch or generator policy *after* the
|
|
137
|
+
attempt started, the PR can merge and cleanup then STOPs with `worktree cleanup
|
|
138
|
+
policy differs from merged canonical origin/main`. That STOP stays fail-closed
|
|
139
|
+
and names its one supported route out:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
python3 scripts/wrapup-land.py land --branch "<branch>" --recover-canonical-cleanup
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
This resumes the teardown of an **already-merged** worktree only. It never reads
|
|
146
|
+
the stale worktree candidate policy: it re-reads the merged canonical policy,
|
|
147
|
+
requires the branch to already be an ancestor of canonical `origin/main`, and
|
|
148
|
+
revalidates each frozen landing identity against that canonical policy before
|
|
149
|
+
the ordinary shared assessment and removal run. Evidence the canonical policy no
|
|
150
|
+
longer names, a changed identity, and any pre-existing or foreign file are hard
|
|
151
|
+
STOPs that delete nothing. Re-running after a successful teardown is a no-op.
|
|
152
|
+
The flag is mutually exclusive with `--abandon-unfinished-attempt`.
|
|
153
|
+
|
|
130
154
|
### 6 · Post-merge (agent)
|
|
131
155
|
- **Sibling propagation:** for each `drift_markers` entry in the land report, append the note to the target issue's `vor_bau` section + re-stamp its `plan_revision`. Log-based markers → **write directly, then show what was written where** (mandatory report — visibility moved from a pre-gate into the report, decision 2026-07-06); fallback candidates the user hasn't confirmed yet → confirm first. Program context widens the target set to unbuilt wave-stubs/leaves and the Program-PRD itself — same append-only mechanism. **Exception:** appends to the Program-PRD or unbuilt wave-stubs do **not** re-stamp `plan_revision` — that stays reserved for structural wave-plan edits via the `to-waves` escalation path; a mere drift note must not stale-block published stubs.
|
|
132
156
|
- **Anchor close:** report says `anchor_complete: true` → `gh issue close <anchor> -c "Wave complete — all slices merged via PR #<pr>."` and verify board status Done. The guard keeps anchors away from every auto-close — this verified close is the only close path; without it the anchor stays silently open after the last slice. **Then re-run the upward propagation**: the land-time `program-sync` ran BEFORE this close, so on a wave-completing slice the Wellenplan still shows 🔄 and the Phasen-Gate stays unchecked — after the board shows Done, run `python3 scripts/board-sync.py program-sync <program-prd#>` once more (the report's `program_sync.program` names it; skip when the report says the parent is not a program). Board auto-rules can lag the close (Close→Done race) — verify Done first, that's what the token reads.
|
package/README.md
CHANGED
|
@@ -434,6 +434,12 @@ Until the explicit policy is committed, `wrapup-land` fails closed before
|
|
|
434
434
|
landing instead of assuming that no generated artifact is eligible for
|
|
435
435
|
session-owned cleanup.
|
|
436
436
|
|
|
437
|
+
You do not have to remember this note. `kit-update` carries a versioned
|
|
438
|
+
registry of required consumer migrations and names any outstanding one in its
|
|
439
|
+
preview and in its terminal report — interactively, under `--yes`, as JSON via
|
|
440
|
+
`update --json`, and in the automated update pull request. It reports the
|
|
441
|
+
decision you still owe; it never writes a cleanup policy for you.
|
|
442
|
+
|
|
437
443
|
### 0.33.0 — capability-gated orchestration
|
|
438
444
|
|
|
439
445
|
`kit-update` reconciles this release for you. These notes matter only if you
|
|
@@ -463,6 +469,62 @@ the old way. Decision record:
|
|
|
463
469
|
|
|
464
470
|
## Release notes
|
|
465
471
|
|
|
472
|
+
### 0.40.0 — planning ignore rules are offered, never installed
|
|
473
|
+
|
|
474
|
+
Nothing in this release requires a consumer action. `kit-update` reconciles it.
|
|
475
|
+
|
|
476
|
+
Several skills used to state as fact that `PLAN.md`, `PLAN-REVIEW-LOG.md` and
|
|
477
|
+
`ANNAHMEN.md` are gitignored and live on disk only. In your repository that was
|
|
478
|
+
simply untrue: neither `init` nor `update` has ever touched your `.gitignore`,
|
|
479
|
+
and no installed file added those rules — so planning worktrees looked
|
|
480
|
+
permanently dirty, cleanup refused to remove them, and a plan document could be
|
|
481
|
+
committed by accident.
|
|
482
|
+
|
|
483
|
+
- **The prose is honest now.** The affected skills say the artifacts are
|
|
484
|
+
*expected* to be ignored and name who can add the rule, instead of asserting
|
|
485
|
+
an installed guarantee.
|
|
486
|
+
- **`/setup-workflow` offers the rules.** It previews the exact lines, asks
|
|
487
|
+
first, and appends one idempotent marker block. Declining changes nothing; a
|
|
488
|
+
re-run is a byte-identical no-op; a block you edited yourself is reported, not
|
|
489
|
+
repaired; an artifact already tracked by git is reported separately, because
|
|
490
|
+
an ignore rule cannot untrack it.
|
|
491
|
+
- **`.gitignore` stays yours.** It has no manifest entry, no baseline hash and
|
|
492
|
+
no three-way reconcile — a file the kit cannot reconcile is one it must not
|
|
493
|
+
write uninvited. Ordinary `update` reconciliation never reaches the seeder.
|
|
494
|
+
Decision record:
|
|
495
|
+
[`docs/adr/0008-planning-ignore-rules-are-offered-never-installed.md`](docs/adr/0008-planning-ignore-rules-are-offered-never-installed.md).
|
|
496
|
+
|
|
497
|
+
### 0.39.0 — self-explaining guards, one glob dialect, a board you can create
|
|
498
|
+
|
|
499
|
+
Nothing in this release requires a consumer action. `kit-update` reconciles it.
|
|
500
|
+
|
|
501
|
+
- **`kit-update` tells you what you still owe.** A versioned registry of
|
|
502
|
+
required consumer migrations is evaluated against your repository and named in
|
|
503
|
+
the preview and in the terminal report — interactively, under `--yes`, as JSON
|
|
504
|
+
via `update --json`, and in the automated update pull request. It reports a
|
|
505
|
+
decision you owe; it never writes a cleanup policy for you.
|
|
506
|
+
- **`setup-workflow` can create the GitHub-Projects board.** When your tracker
|
|
507
|
+
is GitHub and no board exists, setup now *offers* to provision one — Status
|
|
508
|
+
with its stage options plus the workflow fields — and writes the board profile
|
|
509
|
+
from a read-back of what was actually created. It asks first, and a decline
|
|
510
|
+
leaves the previous stub path byte-unchanged.
|
|
511
|
+
- **One repository-relative glob dialect.** Worktree Lifecycle and Workflow
|
|
512
|
+
Advisories now match consumer profile globs through the same matcher, so an
|
|
513
|
+
advisory and a deletion decision can never disagree about which paths a
|
|
514
|
+
pattern selects. A review command classifies your installed patterns and
|
|
515
|
+
reports, with a concrete witness path, any whose match set narrows or widens.
|
|
516
|
+
- **A merged worktree is never stranded.** A landing attempt that started before
|
|
517
|
+
canonical cleanup policy changed now has a supported recovery route, and a
|
|
518
|
+
landing journal written by the previous contract version is classified as
|
|
519
|
+
legacy rather than as corruption — with the exact safe command named in the
|
|
520
|
+
stop. Both routes revalidate frozen evidence against canonical policy and
|
|
521
|
+
delete strictly less than the ordinary path.
|
|
522
|
+
- **Guards say what happened and where.** A drift-blocked handoff now names the
|
|
523
|
+
checkout it evaluated (and says so explicitly when your working directory is a
|
|
524
|
+
sibling worktree of the same repository), a census status reports *what*
|
|
525
|
+
drifted rather than only *that* something did, and a handoff anchored on an
|
|
526
|
+
issue link no longer adopts an issue from a foreign repository.
|
|
527
|
+
|
|
466
528
|
### 0.38.0
|
|
467
529
|
|
|
468
530
|
- added: `docs/adr/0007-session-teardown-requires-provenance-bound-ownership.md`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"kitVersion": "0.
|
|
2
|
+
"kitVersion": "0.40.0",
|
|
3
3
|
"files": [
|
|
4
4
|
{
|
|
5
5
|
"path": ".agents/skills/ask-matt/SKILL.md",
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
"ownerSkill": "grill-me",
|
|
208
208
|
"surface": "codex",
|
|
209
209
|
"installRole": "consumer",
|
|
210
|
-
"sha256": "
|
|
210
|
+
"sha256": "b13087563adda186f62aa6206a9233034310ff2458535362246294a45e03079f",
|
|
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": "
|
|
250
|
+
"sha256": "93694d55fe8d164c4c0e0eef27529bd1211acdaddc18224a921c2b0f3b5a10ed",
|
|
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": "
|
|
380
|
+
"sha256": "15d265be0c2b3b73c32f786644d271fffb4b269cf8e3c624c61296fe838dda9e",
|
|
381
381
|
"mode": 420,
|
|
382
382
|
"origin": "kit"
|
|
383
383
|
},
|
|
@@ -447,7 +447,7 @@
|
|
|
447
447
|
"ownerSkill": "orchestrate-wave",
|
|
448
448
|
"surface": "codex",
|
|
449
449
|
"installRole": "consumer",
|
|
450
|
-
"sha256": "
|
|
450
|
+
"sha256": "fab4fb2f4d6fee820c9b7a737fa955a5ea2cd398987246bd7a04c5fba2c75b26",
|
|
451
451
|
"mode": 420,
|
|
452
452
|
"origin": "kit"
|
|
453
453
|
},
|
|
@@ -587,7 +587,7 @@
|
|
|
587
587
|
"ownerSkill": "setup-workflow",
|
|
588
588
|
"surface": "codex",
|
|
589
589
|
"installRole": "consumer",
|
|
590
|
-
"sha256": "
|
|
590
|
+
"sha256": "c6855a479c030f93be30f6fb65b36b8ca317251f9627fd3f6f0f994d9a8b64fb",
|
|
591
591
|
"mode": 420,
|
|
592
592
|
"origin": "kit"
|
|
593
593
|
},
|
|
@@ -687,7 +687,7 @@
|
|
|
687
687
|
"ownerSkill": "setup-workflow",
|
|
688
688
|
"surface": "codex",
|
|
689
689
|
"installRole": "consumer",
|
|
690
|
-
"sha256": "
|
|
690
|
+
"sha256": "29c61411aa42a3f456b3f27fdd15552654b64ef2d72b321bc9c9e11229745626",
|
|
691
691
|
"mode": 420,
|
|
692
692
|
"origin": "kit"
|
|
693
693
|
},
|
|
@@ -737,7 +737,7 @@
|
|
|
737
737
|
"ownerSkill": "setup-workflow",
|
|
738
738
|
"surface": "codex",
|
|
739
739
|
"installRole": "consumer",
|
|
740
|
-
"sha256": "
|
|
740
|
+
"sha256": "6ff4ad3980f0802b3b041e051d86fb4df7a65884c7ded98ff878e2cd584d80f1",
|
|
741
741
|
"mode": 420,
|
|
742
742
|
"origin": "kit"
|
|
743
743
|
},
|
|
@@ -757,7 +757,7 @@
|
|
|
757
757
|
"ownerSkill": "setup-workflow",
|
|
758
758
|
"surface": "codex",
|
|
759
759
|
"installRole": "consumer",
|
|
760
|
-
"sha256": "
|
|
760
|
+
"sha256": "f9fb7ef6d4f4e1ed603a5a480d8f97508fd6c99def8194c7ba0a95c62fd3c743",
|
|
761
761
|
"mode": 420,
|
|
762
762
|
"origin": "kit"
|
|
763
763
|
},
|
|
@@ -997,7 +997,7 @@
|
|
|
997
997
|
"ownerSkill": "wrapup",
|
|
998
998
|
"surface": "codex",
|
|
999
999
|
"installRole": "consumer",
|
|
1000
|
-
"sha256": "
|
|
1000
|
+
"sha256": "de5d451d23b019498104bd8e0ebcbf3385f37aad822496bdb0c47d7021de8761",
|
|
1001
1001
|
"mode": 420,
|
|
1002
1002
|
"origin": "kit"
|
|
1003
1003
|
},
|
|
@@ -1087,7 +1087,7 @@
|
|
|
1087
1087
|
"path": ".claude/hooks/drift-guard.py",
|
|
1088
1088
|
"kind": "hook",
|
|
1089
1089
|
"installRole": "consumer",
|
|
1090
|
-
"sha256": "
|
|
1090
|
+
"sha256": "1480bd322d988a546ed589a2420796b38bbf0f52300598a1dd9aa9ddbeb3ea1d",
|
|
1091
1091
|
"mode": 493,
|
|
1092
1092
|
"origin": "kit"
|
|
1093
1093
|
},
|
|
@@ -1489,7 +1489,7 @@
|
|
|
1489
1489
|
"ownerSkill": "grill-me",
|
|
1490
1490
|
"surface": "claude",
|
|
1491
1491
|
"installRole": "consumer",
|
|
1492
|
-
"sha256": "
|
|
1492
|
+
"sha256": "a63331339ed4e018d770face4e7cfe483225ce758a4a1302f39a50239e8187e1",
|
|
1493
1493
|
"mode": 420,
|
|
1494
1494
|
"origin": "kit"
|
|
1495
1495
|
},
|
|
@@ -1569,7 +1569,7 @@
|
|
|
1569
1569
|
"ownerSkill": "grill-with-docs",
|
|
1570
1570
|
"surface": "claude",
|
|
1571
1571
|
"installRole": "consumer",
|
|
1572
|
-
"sha256": "
|
|
1572
|
+
"sha256": "0cb1b41fc6bde94d3e71f3377cbb15b9d7a9a4089df66f591fc907dc19b6c1b5",
|
|
1573
1573
|
"mode": 420,
|
|
1574
1574
|
"origin": "kit"
|
|
1575
1575
|
},
|
|
@@ -1699,7 +1699,7 @@
|
|
|
1699
1699
|
"ownerSkill": "kit-update",
|
|
1700
1700
|
"surface": "claude",
|
|
1701
1701
|
"installRole": "consumer",
|
|
1702
|
-
"sha256": "
|
|
1702
|
+
"sha256": "15d265be0c2b3b73c32f786644d271fffb4b269cf8e3c624c61296fe838dda9e",
|
|
1703
1703
|
"mode": 420,
|
|
1704
1704
|
"origin": "kit"
|
|
1705
1705
|
},
|
|
@@ -1769,7 +1769,7 @@
|
|
|
1769
1769
|
"ownerSkill": "orchestrate-wave",
|
|
1770
1770
|
"surface": "claude",
|
|
1771
1771
|
"installRole": "consumer",
|
|
1772
|
-
"sha256": "
|
|
1772
|
+
"sha256": "fab4fb2f4d6fee820c9b7a737fa955a5ea2cd398987246bd7a04c5fba2c75b26",
|
|
1773
1773
|
"mode": 420,
|
|
1774
1774
|
"origin": "kit"
|
|
1775
1775
|
},
|
|
@@ -1929,7 +1929,7 @@
|
|
|
1929
1929
|
"ownerSkill": "setup-workflow",
|
|
1930
1930
|
"surface": "claude",
|
|
1931
1931
|
"installRole": "consumer",
|
|
1932
|
-
"sha256": "
|
|
1932
|
+
"sha256": "c6855a479c030f93be30f6fb65b36b8ca317251f9627fd3f6f0f994d9a8b64fb",
|
|
1933
1933
|
"mode": 420,
|
|
1934
1934
|
"origin": "kit"
|
|
1935
1935
|
},
|
|
@@ -2029,7 +2029,7 @@
|
|
|
2029
2029
|
"ownerSkill": "setup-workflow",
|
|
2030
2030
|
"surface": "claude",
|
|
2031
2031
|
"installRole": "consumer",
|
|
2032
|
-
"sha256": "
|
|
2032
|
+
"sha256": "29c61411aa42a3f456b3f27fdd15552654b64ef2d72b321bc9c9e11229745626",
|
|
2033
2033
|
"mode": 420,
|
|
2034
2034
|
"origin": "kit"
|
|
2035
2035
|
},
|
|
@@ -2079,7 +2079,7 @@
|
|
|
2079
2079
|
"ownerSkill": "setup-workflow",
|
|
2080
2080
|
"surface": "claude",
|
|
2081
2081
|
"installRole": "consumer",
|
|
2082
|
-
"sha256": "
|
|
2082
|
+
"sha256": "6ff4ad3980f0802b3b041e051d86fb4df7a65884c7ded98ff878e2cd584d80f1",
|
|
2083
2083
|
"mode": 420,
|
|
2084
2084
|
"origin": "kit"
|
|
2085
2085
|
},
|
|
@@ -2099,7 +2099,7 @@
|
|
|
2099
2099
|
"ownerSkill": "setup-workflow",
|
|
2100
2100
|
"surface": "claude",
|
|
2101
2101
|
"installRole": "consumer",
|
|
2102
|
-
"sha256": "
|
|
2102
|
+
"sha256": "f9fb7ef6d4f4e1ed603a5a480d8f97508fd6c99def8194c7ba0a95c62fd3c743",
|
|
2103
2103
|
"mode": 420,
|
|
2104
2104
|
"origin": "kit"
|
|
2105
2105
|
},
|
|
@@ -2347,7 +2347,7 @@
|
|
|
2347
2347
|
"ownerSkill": "wrapup",
|
|
2348
2348
|
"surface": "claude",
|
|
2349
2349
|
"installRole": "consumer",
|
|
2350
|
-
"sha256": "
|
|
2350
|
+
"sha256": "de5d451d23b019498104bd8e0ebcbf3385f37aad822496bdb0c47d7021de8761",
|
|
2351
2351
|
"mode": 420,
|
|
2352
2352
|
"origin": "kit"
|
|
2353
2353
|
},
|
|
@@ -2431,6 +2431,14 @@
|
|
|
2431
2431
|
"mode": 420,
|
|
2432
2432
|
"origin": "kit"
|
|
2433
2433
|
},
|
|
2434
|
+
{
|
|
2435
|
+
"path": "scripts/board_bootstrap.py",
|
|
2436
|
+
"kind": "script",
|
|
2437
|
+
"installRole": "consumer",
|
|
2438
|
+
"sha256": "52f4bc89fb078bb9a8735481488bc60d2be438c5c8175555195ac84775e40bfb",
|
|
2439
|
+
"mode": 493,
|
|
2440
|
+
"origin": "kit"
|
|
2441
|
+
},
|
|
2434
2442
|
{
|
|
2435
2443
|
"path": "scripts/board_config.py",
|
|
2436
2444
|
"kind": "script",
|
|
@@ -2555,7 +2563,7 @@
|
|
|
2555
2563
|
"path": "scripts/kit-update-pr.mjs",
|
|
2556
2564
|
"kind": "script",
|
|
2557
2565
|
"installRole": "consumer",
|
|
2558
|
-
"sha256": "
|
|
2566
|
+
"sha256": "17084eede8601d7cf7dd9da85f7738d618111797933a362c93627058fbd335d4",
|
|
2559
2567
|
"mode": 493,
|
|
2560
2568
|
"origin": "kit"
|
|
2561
2569
|
},
|
|
@@ -2623,6 +2631,14 @@
|
|
|
2623
2631
|
"mode": 493,
|
|
2624
2632
|
"origin": "kit"
|
|
2625
2633
|
},
|
|
2634
|
+
{
|
|
2635
|
+
"path": "scripts/profile_globs.py",
|
|
2636
|
+
"kind": "script",
|
|
2637
|
+
"installRole": "consumer",
|
|
2638
|
+
"sha256": "dd11f6e2513eb43813242ace8f4ea00e10b0fa33f4e13fd125afa4a654d61eff",
|
|
2639
|
+
"mode": 493,
|
|
2640
|
+
"origin": "kit"
|
|
2641
|
+
},
|
|
2626
2642
|
{
|
|
2627
2643
|
"path": "scripts/program_graph_parse.py",
|
|
2628
2644
|
"kind": "script",
|
|
@@ -2771,7 +2787,7 @@
|
|
|
2771
2787
|
"path": "scripts/workflow-advisories/core.py",
|
|
2772
2788
|
"kind": "script",
|
|
2773
2789
|
"installRole": "consumer",
|
|
2774
|
-
"sha256": "
|
|
2790
|
+
"sha256": "fcc13d24944a9b1534529e62cc1437617e394f6fe3402647c17cee4ea96aade5",
|
|
2775
2791
|
"mode": 420,
|
|
2776
2792
|
"origin": "kit"
|
|
2777
2793
|
},
|
|
@@ -2795,7 +2811,23 @@
|
|
|
2795
2811
|
"path": "scripts/worktree-lifecycle/core.py",
|
|
2796
2812
|
"kind": "script",
|
|
2797
2813
|
"installRole": "consumer",
|
|
2798
|
-
"sha256": "
|
|
2814
|
+
"sha256": "50c60de1e0238fa1f5cd627f67e57ca4f378275136691411487f36d7fda580dd",
|
|
2815
|
+
"mode": 420,
|
|
2816
|
+
"origin": "kit"
|
|
2817
|
+
},
|
|
2818
|
+
{
|
|
2819
|
+
"path": "scripts/worktree-lifecycle/ignore_seed.py",
|
|
2820
|
+
"kind": "script",
|
|
2821
|
+
"installRole": "consumer",
|
|
2822
|
+
"sha256": "defd667ed94301cffb0f08e0a910873c246be267cb458adf40f5e7b2109ae4d0",
|
|
2823
|
+
"mode": 493,
|
|
2824
|
+
"origin": "kit"
|
|
2825
|
+
},
|
|
2826
|
+
{
|
|
2827
|
+
"path": "scripts/worktree-lifecycle/plan-artifacts.json",
|
|
2828
|
+
"kind": "doc",
|
|
2829
|
+
"installRole": "consumer",
|
|
2830
|
+
"sha256": "fe7f805ca9c698f9d77bdda4372f6f5a516b1e60c46ae732a94de184cb0ce3b4",
|
|
2799
2831
|
"mode": 420,
|
|
2800
2832
|
"origin": "kit"
|
|
2801
2833
|
},
|
|
@@ -2811,7 +2843,7 @@
|
|
|
2811
2843
|
"path": "scripts/worktree-lifecycle/README.md",
|
|
2812
2844
|
"kind": "doc",
|
|
2813
2845
|
"installRole": "consumer",
|
|
2814
|
-
"sha256": "
|
|
2846
|
+
"sha256": "0dbba4a87d41171f3fce22a4842eecd2a989ea6a5ddf44832d7b2aed9feb4226",
|
|
2815
2847
|
"mode": 420,
|
|
2816
2848
|
"origin": "kit"
|
|
2817
2849
|
},
|
|
@@ -2835,7 +2867,7 @@
|
|
|
2835
2867
|
"path": "scripts/wrapup-land.py",
|
|
2836
2868
|
"kind": "script",
|
|
2837
2869
|
"installRole": "consumer",
|
|
2838
|
-
"sha256": "
|
|
2870
|
+
"sha256": "476012558bb786070ce47458c6f0734ff110d5d957af72e13b20d49a37a03592",
|
|
2839
2871
|
"mode": 493,
|
|
2840
2872
|
"origin": "kit"
|
|
2841
2873
|
},
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Planning ignore rules are offered, never installed
|
|
2
|
+
|
|
3
|
+
Status: accepted (2026-07-26, #255)
|
|
4
|
+
|
|
5
|
+
The shipped planning skills write `PLAN.md`, `PLAN-REVIEW-LOG.md`, and
|
|
6
|
+
`ANNAHMEN.md` into a session worktree, and several of them told the agent those
|
|
7
|
+
files were gitignored and lived on disk only. In a consumer repository that was
|
|
8
|
+
simply untrue: `init` and `update` never touch `.gitignore`, and no installed
|
|
9
|
+
file adds the rules. The consequence mirrors what this repository fixed for
|
|
10
|
+
itself in #254 — every planning worktree reports a permanently dirty tree, the
|
|
11
|
+
shipped Worktree Lifecycle cleanup refuses to remove it, genuinely unlanded work
|
|
12
|
+
becomes indistinguishable from plan scratch, and a consumer who never notices
|
|
13
|
+
can commit a plan doc into their history that the prose implied could not be
|
|
14
|
+
committed.
|
|
15
|
+
|
|
16
|
+
The constraint is the consumer contract. Consumer-owned files are written once
|
|
17
|
+
and never overwritten by ordinary reconciliation, and `.gitignore` is stronger
|
|
18
|
+
still: the kit does not own it at all and has no manifest entry, no baseline
|
|
19
|
+
hash, and no three-way reconcile for it. A file the kit cannot reconcile is a
|
|
20
|
+
file the kit must not write uninvited.
|
|
21
|
+
|
|
22
|
+
We decided to close the gap from both ends:
|
|
23
|
+
|
|
24
|
+
1. **`/setup-workflow` offers the rules as an explicit, previewed, approved
|
|
25
|
+
step.** Section A11 previews with
|
|
26
|
+
`python3 scripts/worktree-lifecycle/ignore_seed.py preview`, shows the exact
|
|
27
|
+
lines verbatim, asks, and only an approval runs `apply`. The write is
|
|
28
|
+
append-only inside one idempotent marker block. It never rewrites, reorders,
|
|
29
|
+
or removes an existing line; a re-run is a byte-identical no-op; a decline
|
|
30
|
+
changes nothing; a repository that already ignores the artefacts reports
|
|
31
|
+
`nothing to do`; and a marker block the consumer has since edited is
|
|
32
|
+
`blocked`, never repaired. Nothing in `init` or `update` can reach the
|
|
33
|
+
seeder.
|
|
34
|
+
2. **Shipped skill prose states the assumption instead of asserting the fact.**
|
|
35
|
+
A skill now says these artefacts are *expected* to be ignored and names
|
|
36
|
+
`/setup-workflow` as the thing that can make it true, rather than claiming
|
|
37
|
+
the kit already did. The claim is pinned by a census lint over both skill
|
|
38
|
+
trees, so the assertion cannot silently return.
|
|
39
|
+
|
|
40
|
+
This is the same shape the kit shipped for the GitHub-Projects board in 0.39.0
|
|
41
|
+
(#24): offer, preview, obtain an explicit yes, never write an outward or
|
|
42
|
+
consumer-owned artefact silently.
|
|
43
|
+
|
|
44
|
+
Which artefacts the offer covers is a kit-owned fact — the kit knows which files
|
|
45
|
+
its own skills write — declared once in
|
|
46
|
+
`scripts/worktree-lifecycle/plan-artifacts.json`. That is deliberately not the
|
|
47
|
+
consumer's `worktreeLifecycle.scratchPatterns`, which is derived *from* the
|
|
48
|
+
consumer's ignored planning artefacts and would otherwise be circular: before
|
|
49
|
+
this decision there was nothing ignored for it to be derived from.
|
|
50
|
+
|
|
51
|
+
## Considered options
|
|
52
|
+
|
|
53
|
+
- **Append-only seed at `init`:** rejected. It respects append-only mechanics
|
|
54
|
+
but still writes a file the kit does not own, uninvited, on first install —
|
|
55
|
+
the one action the consumer contract exists to prevent.
|
|
56
|
+
- **Readiness capability only:** rejected. Reporting the gap and letting the
|
|
57
|
+
affected skills degrade honestly leaves the friction in place and fixes
|
|
58
|
+
nothing for the consumer who wants the promise to hold.
|
|
59
|
+
- **Prose-only fix:** rejected as insufficient on its own. It removes the false
|
|
60
|
+
claim but leaves every consumer with dirty planning worktrees and a cleanup
|
|
61
|
+
that refuses to run. It is kept as one half of the decision, not the whole.
|
|
62
|
+
- **Deriving the rules from `worktreeLifecycle.scratchPatterns`:** rejected as
|
|
63
|
+
circular, and because that array is consumer-owned deletion-adjacent policy
|
|
64
|
+
that Core never supplies defaults for.
|
|
65
|
+
- **Untracking an already-committed artefact:** rejected. An ignore rule cannot
|
|
66
|
+
untrack a tracked file, and running `git rm` on consumer history is far past
|
|
67
|
+
what a setup step may do. The seeder reports the tracked artefact and stops.
|
|
68
|
+
|
|
69
|
+
## Consequences
|
|
70
|
+
|
|
71
|
+
- A consumer who runs `/setup-workflow` and approves gets the guarantee the
|
|
72
|
+
skills describe; a consumer who declines keeps a byte-identical `.gitignore`
|
|
73
|
+
and loses nothing but the convenience.
|
|
74
|
+
- The never-overwrite contract is untouched: the only write is an append behind
|
|
75
|
+
an explicit yes, and `update` reconciliation still never touches
|
|
76
|
+
`.gitignore`.
|
|
77
|
+
- The offer reaches only consumers who run setup again. That is accepted: it is
|
|
78
|
+
the price of not writing an unowned file, and re-running `/setup-workflow` is
|
|
79
|
+
already the documented way to pick up a new project-layer capability.
|
|
80
|
+
- After an approval, `scratchPatterns` derivation finally has real ignored
|
|
81
|
+
planning artefacts to read, so the Worktree Lifecycle scratch classification
|
|
82
|
+
stops being vacuous in a fresh consumer repository.
|
|
83
|
+
- A consumer who edits or deletes the marker block owns the outcome; the kit
|
|
84
|
+
reports and stops rather than restoring its own block.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ikon85/agent-workflow-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.40.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": {
|