@ikon85/agent-workflow-kit 0.10.0 → 0.12.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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: kit-release
3
- description: "Prepare a verified release PR for agent-workflow-kit with an explicit Semver confirmation, regenerated manifest, full tests, and pack audit, then delegate landing to wrapup."
3
+ description: "Prepare a verified release PR for agent-workflow-kit, delegate landing to wrapup, then monitor the trusted post-merge publishing flow through npm/GitHub parity."
4
4
  ---
5
5
 
6
6
  # Kit Release
@@ -42,10 +42,31 @@ merge, registry publishing, tags, or release creation.
42
42
  `scripts/wrapup-land.py` exclusively own commit, push, PR creation, merge,
43
43
  and cleanup. Do not reproduce those operations here.
44
44
 
45
- 5. After merge, the release is not complete until the repository's configured
46
- publishing flow has produced the matching registry package and GitHub
47
- tag/release and verified their parity. If that flow is not configured, stop
48
- and report the missing post-merge capability; never publish ad hoc.
45
+ 5. After merge, monitor the `release.yml` workflow and inspect its externally
46
+ reconstructable state:
47
+
48
+ ```sh
49
+ gh run list --workflow release.yml --limit 1
50
+ npm run release:status
51
+ ```
52
+
53
+ `awaiting-npm` means the trusted workflow has not published yet;
54
+ `awaiting-github` means npm readback passed and a safe rerun will skip npm
55
+ publish and resume at GitHub; `released` means local, npm, and the GitHub
56
+ release asset have identical version, manifest hash, and tarball integrity.
57
+ The release is complete only at `released`.
58
+
59
+ The registry identity is **`@ikon85/agent-workflow-kit`**. The unscoped
60
+ `agent-workflow-kit` package is owned by another publisher and must never be
61
+ queried, published, or treated as this repository's release.
62
+
63
+ Before the first real release, the npm package must name this repository's
64
+ exact `.github/workflows/release.yml` as its GitHub Trusted Publisher. If it
65
+ does not exist yet, stop for a separately confirmed one-time bootstrap
66
+ publish; npm only permits trust configuration for an existing package. That
67
+ bootstrap creates the scoped package but does not replace the first real
68
+ OIDC/provenance release. Never request, store, or substitute an npm token,
69
+ and never publish or create a release ad hoc beyond that explicit bootstrap.
49
70
 
50
71
  ## Guard contract
51
72
 
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: kit-update
3
+ description: "Preview and transactionally apply a parity-verified agent-workflow-kit release without overwriting local modifications or auto-resolving conflicts."
4
+ ---
5
+
6
+ # Kit Update
7
+
8
+ Update an installed consumer only from the public scoped package
9
+ `@ikon85/agent-workflow-kit`. The unscoped `agent-workflow-kit` package belongs
10
+ to another publisher and is never a valid update source. Existing installs from
11
+ `npx github:iKon85/agent-workflow-kit` remain valid, but updates must use the
12
+ scoped npm release so the shared release-parity checker can prove that npm and
13
+ the matching GitHub release contain the same artifact.
14
+
15
+ ## Workflow
16
+
17
+ 1. Preview the delta without writing:
18
+
19
+ ```sh
20
+ npx @ikon85/agent-workflow-kit@latest diff
21
+ ```
22
+
23
+ Review the named added, updated, locally modified, removed, and conflicting
24
+ paths. Do not reinterpret a local modification as permission to overwrite it.
25
+
26
+ 2. Apply the update:
27
+
28
+ ```sh
29
+ npx @ikon85/agent-workflow-kit@latest update
30
+ ```
31
+
32
+ The command checks npm/GitHub release parity before staging. It prepares a
33
+ complete candidate outside the consumer, runs the consumer's existing
34
+ `npm test` command there, and activates only a verified candidate. A staging
35
+ or verification failure leaves the installed tree byte-identical.
36
+
37
+ 3. Read the terminal report. `aktuell` proves a second run found no upstream
38
+ delta. A conflict report names and counts every category and leaves every
39
+ consumer file untouched. Follow its recommendation and resolve each named
40
+ conflict manually; never auto-merge, delete a local edit, or silently choose
41
+ the incoming copy.
42
+
43
+ 4. If a candidate is interrupted, discard its reported stage directory or
44
+ resume the transaction through the update API's `resumeFrom` option. Do not
45
+ copy staged files into the consumer by hand.
46
+
47
+ ## State contract
48
+
49
+ The update API reports `checking -> preview/awaiting_decision -> staging ->
50
+ verifying -> applied | conflicted | failed | aborted`. `conflicted`, `failed`,
51
+ and `aborted` never authorize partial activation. The existing manifest,
52
+ three-way diff, and atomic-write seams remain the source of truth.
@@ -97,8 +97,10 @@ Tripped altitude criteria: <e.g. C1 staged delivery, C2 multiple subsystems, C4
97
97
  structure-bearing decisions (escalate a single bounded choice to `decision-gate`).
98
98
  2. `to-prd` — it auto-detects the program mode from the Wellenplan chapter and writes
99
99
  a Program-PRD (native anchor over the waves).
100
- 3. `to-waves` — unfold the wave plan into named wave stubs + slice leaves after the
101
- chat preview gate (nothing is written to the board until you approve it).
100
+ 3. `to-waves` — after one complete chat preview, materialize the whole Program with
101
+ **all waves execute-ready by default**: complete slice contracts, buckets,
102
+ dependencies and handoffs. Decision Gates, Verify Spikes and Design-Grill waves
103
+ are explicit planned exceptions; generic late-binding cleanup is not.
102
104
  ```
103
105
 
104
106
  ### Feature (0–1 criteria, or any doubt)
@@ -132,7 +134,7 @@ Bug: <what's broken — expected vs. actual>.
132
134
  ```
133
135
  scale-check: verdict=<Program | Feature | Direct-Slice | Bug>
134
136
  criteria tripped=<C1,C2,… | none | n/a (bug/direct)>
135
- route=<program grill → to-prd → to-waves | grill-with-docs → to-prd → to-issues | tdd | diagnose>
137
+ route=<program grill → to-prd → to-waves (all waves execute-ready by default) | grill-with-docs → to-prd → to-issues | tdd | diagnose>
136
138
  start-prompt: <the paste-ready block above, filled in>
137
139
  ```
138
140
 
@@ -19,6 +19,7 @@ Use this section as the entry-point map for agent-assisted work. The individual
19
19
  - **Implementation slice:** use `tdd` for one behavior at a time: RED, GREEN, then refactor.
20
20
  - **Finished slice:** use `wrapup` to prepare the branch, PR, and cleanup steps your repo expects.
21
21
  - **Kit release:** use `kit-release` to derive the shipped delta, confirm Semver, regenerate the manifest, run all gates, and then hand landing to `wrapup`.
22
+ - **Kit update:** use `kit-update` to preview and transactionally apply a parity-verified scoped release without overwriting local modifications.
22
23
  - **A huge, foggy effort, too big for one session:** use `wayfinder` — it charts it as a shared map of investigation tickets, resolving one per session.
23
24
 
24
25
  ## Routing Rule
@@ -98,6 +98,14 @@ Ask the user:
98
98
 
99
99
  Iterate until the user approves the breakdown.
100
100
 
101
+ **Program batch handoff.** When `to-waves` invokes this skill for a Stufe-1p stub,
102
+ the complete Program preview has already shown and approved every wave's slice
103
+ contract. Reuse that approval when this pass preserves the approved cut: do not
104
+ pause again merely because the internal pipeline crossed a skill boundary. Run
105
+ the normal contract in full — maturity is not a reduced mode — and reconcile the
106
+ stub's existing leaves instead of duplicating them. A new structural choice or a
107
+ newly discovered gate invalidates the inherited approval and returns to §4.
108
+
101
109
  ### 5. Publish — promote-or-atomic (contract)
102
110
 
103
111
  **Cluster/Wave discriminator (identical wording — `to-prd` §2 / `to-issues` §5):** `type:cluster` (label) always stops. A Wave number also stops, **unless** the target carries the `wave-stub` label — a Wave-stamped `wave-stub` issue is a **Stufe-1p Program-stub** (`to-waves`-published, native parent = a Program-PRD) and remains a **valid target**. A Wave-stamped issue **without** `wave-stub` (an already-assigned leaf, or a drifted item) is still a hard stop.
@@ -193,6 +201,21 @@ python3 scripts/board-sync.py dep-add --issue <blocked#> --blocked-by <blocker#>
193
201
 
194
202
  The Draft-PRD stays the executable leaf. Edit its body: **remove** `<!-- prd: awaiting-decomposition -->`, keep `type:*`+`priority:*` (**no** `type:cluster`/Wave, **no** `Welle N` title prefix), stamp the leaf `plan_revision`, add the `## Handoff Start Command`. The single PR `closes #<prd#>`.
195
203
 
204
+ **Program-batch atomic exception.** A Stufe-1p stub already represents one named
205
+ wave under a Program-PRD. When its approved cut contains exactly one slice, keep
206
+ the stub itself as the atomic executable wave leaf: preserve its existing Wave and Phase,
207
+ `Welle N — …` title, native Program parent, and source marker; write the complete
208
+ atomic contract and bucket, then remove only `wave-stub`. Do not erase Program
209
+ navigation by applying the ordinary Wave-less atomic normalization.
210
+
211
+ On a delta re-run, a legacy or interrupted preliminary child may already be linked
212
+ under that atomic stub. Lift any still-relevant content into the stub, unlink the
213
+ child with `board-sync.py unlink`, and close it with the mapping comment
214
+ `superseded by atomic wave leaf #<stub>`. Scan both `children-of` and the Program's
215
+ `program-leaf-source` markers: the **matching source marker remains discoverable after unlink**.
216
+ Resume idempotently — unlink only when still linked; close only when still open;
217
+ an already completed step is a no-op. The final atomic wave has no child set.
218
+
196
219
  Then set the bucket via the helper — the leaf already exists, so the workflow-label write goes through `board-sync.py add --bucket` (§5a forbids a bare `gh issue edit --add-label ready-for-agent`):
197
220
 
198
221
  ```bash
@@ -215,6 +238,12 @@ Every child **and** the atomic leaf sits in **exactly one** bucket:
215
238
 
216
239
  Status alone cannot discriminate (both are `Spec`) — the **label** does. The helper's `--hitl` flag rejects a `ready-for-agent` label mechanically. Authority = `scripts/execute-ready-check.py` (`parse_bucket`) — the checker wins on a mismatch.
217
240
 
241
+ **A mandatory human or external setup action is never AFK.** Cut it as a HITL gate
242
+ slice (or an explicitly named planning wave), place it before the dependent build
243
+ slice, and set the native blocked-by edge. Never hide a maintainer configuration,
244
+ credentialless console action, approval, or design response inside a leaf carrying
245
+ `ready-for-agent`, even when the remaining code work could run unattended.
246
+
218
247
  **Gate slices (🔬/📐) are AFK.** A `🔬` Verify-Spike or `📐` Trade-off/Research gate slice is **read-only** (a fact question, or a bounded trade-off + read-only research) — an agent can run it solo, so it carries `ready-for-agent` like any other AFK slice; the **native blocked-by edge** on its dependent build slice (set at publish, §5a step 5) is what protects the gate-before-build ordering (§3b/§4), not the HITL bucket. Only a `🧭` Design-Grill gate slice is HITL (it needs the human in the grill). A gate slice's **placement** — which altitude/layer it lands on — follows `decision-gate`'s placement rule (owned there, referenced here).
219
248
 
220
249
  #### 5d. Issue body template (each child / atomic leaf)
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  name: to-waves
3
3
  disable-model-invocation: true
4
- description: "Unfold a Program-PRD's wave plan onto the board parse + graph-validate it, show the complete Wellenplan as a chat preview before ANY board write, then after approval publish named wave stubs (native parent = the PRD) + slice leaves (native parent = their stub) with Wave and Phase stamped in one batch, and report a counted completion. Idempotent + crash-recoverable on re-run; adopts referenced existing issues instead of duplicating them. Use on a Program-PRD, the native anchor over several waves. NOT for a single-wave feature (to-issues) and NOT for clustering a backlog (board-to-waves)."
4
+ description: "Turn a Program-PRD's wave plan into fully planned, execute-ready wave anchors and slice leaves after one complete chat preview. Validates the graph, publishes every wave, runs the to-prd/spec-self-critique/to-issues maturity contract for each wave, models unresolved work as explicit gates, and audits counted readiness. Idempotent and crash-recoverable. Use on a Program-PRD over several waves. NOT for a single-wave feature (to-issues) or backlog clustering (board-to-waves)."
5
5
  ---
6
6
 
7
7
  # to-waves — Unfold a Program-PRD's wave plan onto the board
8
8
 
9
9
  Takes a **Program-PRD** — the native Sub-Issue anchor over a multi-wave program
10
10
  (Programm → Phase → Welle → Slice) — and turns its `## Wellenplan` chapter into
11
- **named wave stubs + slice leaves** on the board. Pipeline position:
12
- `scale-check → grill → to-prd (program mode) → to-waves per wave: to-issues`.
11
+ **fully planned wave anchors + slice leaves** on the board. Pipeline position:
12
+ `scale-check → grill → to-prd (program mode) → to-waves`, with the per-wave
13
+ `to-prd → spec-self-critique → to-issues` maturity pass owned inside this run.
13
14
  The **grill and to-prd sit upstream**; to-waves runs once the Program-PRD exists.
14
15
  It **never invents structure** — it only unfolds what the plan already decided.
15
16
 
@@ -70,28 +71,39 @@ Show:
70
71
  - The **publish plan**: how many stubs + leaves will be created, which referenced
71
72
  existing issues will be **adopted** (§4) rather than created, and which
72
73
  Wave/Phase stamps will be applied.
74
+ - The complete per-wave issue contracts that will be materialized: outcome,
75
+ Blast-Radius, acceptance criteria, AFK/HITL bucket, native dependencies, and
76
+ self-contained handoff. A placeholder is not preview-complete.
73
77
 
74
- Then ask for approval. Only on an explicit "yes" proceed to §4/§5. On "no", stop —
75
- no writes happened.
78
+ This complete Program preview is the **single user approval** for the default
79
+ planning run. Only on an explicit "yes" proceed to §4/§5/§7; when a later
80
+ per-wave maturity pass reproduces the approved cut, **do not ask for another per-wave approval**.
81
+ Ask again only when new evidence changes structure or exposes
82
+ a genuinely undecided gate. On "no", stop — no writes happened.
76
83
 
77
84
  ## 4. Publish — the fixed order
78
85
 
79
86
  After approval, publish in **exactly this order** (issue CREATES stay sequential so
80
87
  the numbering is deterministic; only the field stamps are batched):
81
88
 
82
- 1. **Wave stubs — Stufe 1p.** One per Wellenplan row, native parent = the PRD.
89
+ 1. **Wave stubs — transient Stufe 1p.** One per Wellenplan row, native parent = the PRD.
83
90
  Title `Welle <N> — <Name>`; created with the `wave-stub` label and Status Spec.
84
91
  Body = the Stufe-1p stub template (named header, the program idempotency marker,
85
- the revision marker — see §6). Not yet Wave/Phase-stamped (that is step 4).
92
+ the revision marker — see §6). This is a crash-recovery checkpoint inside the
93
+ run, never its successful terminal state. Not yet Wave/Phase-stamped (step 4).
86
94
  ```bash
87
95
  python3 scripts/board-sync.py create --title "Welle <N> — <Name>" \
88
96
  --body-file <stub.md> --wave-stub --status-role spec
89
97
  ```
90
- 2. **Slice leaves.** One per slice under each wave, native parent = its stub. Created
91
- with the spec-role status and **no** `ready-for-agent` (a leaf is not buildable until its
98
+ 2. **Preliminary slice leaves for multi-slice waves.** Create one per slice under
99
+ each wave whose approved cut contains ≥2 slices, native parent = its stub. For
100
+ an exactly-one-slice wave, **do not create a preliminary child**: keep that
101
+ slice's metadata on the stub so step 6 can turn the stub itself into the atomic
102
+ executable wave leaf without a duplicate identity. Preliminary children use
103
+ the spec-role status and **no** `ready-for-agent` (a leaf is not buildable until its
92
104
  wave is promoted — the ordering guard stays unambiguous). Body = the slice's
93
105
  `## Slices` section carried forward per `SLICE-METADATA-FORMAT.md` (metadata block +
94
- the outcome/placeholder skeleton, sharpened only at promotion). **Title carries the
106
+ the outcome/placeholder skeleton, finalized in step 6). **Title carries the
95
107
  navigation prefix** `Welle <N> / Slice <local-id> — <title>` — the local-id
96
108
  (`1a`, `1b`, …) encodes the build order, so the sub-issue LIST is navigable by title
97
109
  alone (same convention as `to-issues`' promoted children, `Welle N / Slice X — <outcome>`).
@@ -131,10 +143,22 @@ the numbering is deterministic; only the field stamps are batched):
131
143
  ```bash
132
144
  python3 scripts/board-sync.py program-sync <prd#>
133
145
  ```
134
- 6. **Counted completion report + program view link.** Report `X von Y` for each part
135
- (stubs created, leaves created, issues adopted, field stamps set) and link the
136
- program board view. Completeness is **counted, never claimed** the numbers come
137
- from the create outputs + the `stamp-batch` response, not from memory.
146
+ 6. **Mature every wave.** For each stub in dependency order, run the approved
147
+ Program batch handoff: `to-prd` Mode B writes the per-wave Draft-PRD,
148
+ `spec-self-critique` hardens it, and `to-issues` promotes/atomizes it while
149
+ reusing the preliminary leaves. The pass writes complete issue bodies, final
150
+ AFK/HITL buckets, handoffs, native dependencies, `plan_revision`, and removes
151
+ `wave-stub`. It inherits the §3 approval when the cut is unchanged.
152
+ 7. **Audit every wave.** Run `execute-ready-check.py --mode audit` on every promoted
153
+ anchor or atomic wave leaf. Any incomplete placeholder, incoherent revision,
154
+ missing bucket, or child-set mismatch blocks successful completion. **Program completion gate:**
155
+ Although `to-issues` uses audit mode as an informational handoff check, **do not count that wave as matured** or report
156
+ Program success until its audit findings are clean.
157
+ 8. **Counted completion report + program view link.** Report `X von Y` for each part
158
+ (stubs created, leaves adopted/created, field stamps set, waves matured, waves
159
+ execute-ready) and link the program board view. Completeness is **counted, never
160
+ claimed** — the numbers come from the commands, including the exact line
161
+ `X von Y Wellen ausführungsreif`.
138
162
 
139
163
  ## 5. Adopt path — referenced existing issues
140
164
 
@@ -176,6 +200,10 @@ A re-run of to-waves on the same program is **delta-apply** and doubles as
176
200
  report as **orphaned** (do not auto-close — closing is the abort convention, §8).
177
201
  Cross-check the native children (`children-of <prd#>` and each stub) against the
178
202
  plan so both origins are covered.
203
+ - **Atomic supersession exception.** A marked preliminary leaf whose local-id maps
204
+ to the one slice now carried by its atomic stub is not a generic orphan. Route it
205
+ to `to-issues` §5b cleanup whether it is still linked or was already unlinked by
206
+ an interrupted run. Search-by-marker is the durable recovery identity.
179
207
  - **Crash recovery.** Because create is search-before-create, `link` is idempotent,
180
208
  and `stamp-batch` field-sets are idempotent, re-running the whole publish after an
181
209
  abort resumes cleanly — already-created issues match, missing ones are created,
@@ -191,7 +219,7 @@ A re-run of to-waves on the same program is **delta-apply** and doubles as
191
219
  (the same sanctioned body-write `to-prd` Mode B uses). The mechanism that renews
192
220
  coherence is the same one the revision broke — it self-repairs.
193
221
 
194
- ## 7. Program-grill agenda + the per-wave-start content pass
222
+ ## 7. Program completion contract
195
223
 
196
224
  to-waves also carries the **program-grill agenda** as a reference chapter — the
197
225
  checklist a program grill (upstream) should cover so the wave plan does not rest on
@@ -211,12 +239,22 @@ open switches:
211
239
  single bounded choice to `decision-gate` — not deferred into the plan as an open
212
240
  task.
213
241
 
214
- **The per-wave-start content pass** is where slice content is sharpened — deliberately
215
- **just-in-time (Late Binding)**, never ex ante on spec. When a wave is promoted:
216
- `to-prd` (Mode B, into the wave stub) + `spec-self-critique` are **mandatory**, and
217
- the depth ladder is **raised for a high-stakes wave** (a design-grill or a
218
- `decision-gate` before slicing). This is what folds in any drift propagated since the
219
- plan was first written.
242
+ **Default postcondition:** every published wave is fully planned and passes the
243
+ shared execute-ready audit before this run reports success. Stufe 1p is an
244
+ internal recovery state, not the result presented to the user. **Late Binding is not the default**
245
+ for unfinished issue prose or missing buckets.
246
+
247
+ Uncertainty is planned, not hidden. A bounded trade-off becomes an explicit
248
+ **Decision Gate**, a factual unknown becomes a **Verify Spike**, and an unresolved
249
+ structure seam becomes a HITL **Design-Grill** slice (or an explicitly named
250
+ planning wave). Place that gate before its dependent build slice and write the
251
+ native blocking edge. The gate issue itself still receives a complete contract and
252
+ handoff; the dependent work is blocked, not vaguely under-planned.
253
+
254
+ A mandatory human or external setup action follows the same rule: model it as a
255
+ HITL predecessor, never bury it inside a `ready-for-agent` build leaf. If later
256
+ drift invalidates an already planned wave, use the revision/escalation path in §8;
257
+ do not pre-emptively leave every future wave incomplete.
220
258
 
221
259
  ## 8. Close protection, abort convention, escalation path
222
260
 
@@ -255,6 +293,7 @@ python3 scripts/board-sync.py program-sync <prd#>
255
293
  to-waves: prd=#<n> preview=<approved|rejected>
256
294
  created=<stubs X von Y, leaves X von Y> adopted=<#a #b … | none>
257
295
  stamped=<N von M Wave/Phase> phase=<stamped | skipped (profile lacks fields.phase)>
296
+ matured=<X von Y> execute-ready=<X von Y Wellen ausführungsreif>
258
297
  revision=r<N> renewed-markers=<count | none> orphaned=<#… | none>
259
298
  graph=<ok | blocking: …> program-view=<url>
260
299
  ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: kit-release
3
- description: "Prepare a verified release PR for agent-workflow-kit with an explicit Semver confirmation, regenerated manifest, full tests, and pack audit, then delegate landing to wrapup."
3
+ description: "Prepare a verified release PR for agent-workflow-kit, delegate landing to wrapup, then monitor the trusted post-merge publishing flow through npm/GitHub parity."
4
4
  ---
5
5
 
6
6
  # Kit Release
@@ -42,10 +42,31 @@ merge, registry publishing, tags, or release creation.
42
42
  `scripts/wrapup-land.py` exclusively own commit, push, PR creation, merge,
43
43
  and cleanup. Do not reproduce those operations here.
44
44
 
45
- 5. After merge, the release is not complete until the repository's configured
46
- publishing flow has produced the matching registry package and GitHub
47
- tag/release and verified their parity. If that flow is not configured, stop
48
- and report the missing post-merge capability; never publish ad hoc.
45
+ 5. After merge, monitor the `release.yml` workflow and inspect its externally
46
+ reconstructable state:
47
+
48
+ ```sh
49
+ gh run list --workflow release.yml --limit 1
50
+ npm run release:status
51
+ ```
52
+
53
+ `awaiting-npm` means the trusted workflow has not published yet;
54
+ `awaiting-github` means npm readback passed and a safe rerun will skip npm
55
+ publish and resume at GitHub; `released` means local, npm, and the GitHub
56
+ release asset have identical version, manifest hash, and tarball integrity.
57
+ The release is complete only at `released`.
58
+
59
+ The registry identity is **`@ikon85/agent-workflow-kit`**. The unscoped
60
+ `agent-workflow-kit` package is owned by another publisher and must never be
61
+ queried, published, or treated as this repository's release.
62
+
63
+ Before the first real release, the npm package must name this repository's
64
+ exact `.github/workflows/release.yml` as its GitHub Trusted Publisher. If it
65
+ does not exist yet, stop for a separately confirmed one-time bootstrap
66
+ publish; npm only permits trust configuration for an existing package. That
67
+ bootstrap creates the scoped package but does not replace the first real
68
+ OIDC/provenance release. Never request, store, or substitute an npm token,
69
+ and never publish or create a release ad hoc beyond that explicit bootstrap.
49
70
 
50
71
  ## Guard contract
51
72
 
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: kit-update
3
+ description: "Preview and transactionally apply a parity-verified agent-workflow-kit release without overwriting local modifications or auto-resolving conflicts."
4
+ ---
5
+
6
+ # Kit Update
7
+
8
+ Update an installed consumer only from the public scoped package
9
+ `@ikon85/agent-workflow-kit`. The unscoped `agent-workflow-kit` package belongs
10
+ to another publisher and is never a valid update source. Existing installs from
11
+ `npx github:iKon85/agent-workflow-kit` remain valid, but updates must use the
12
+ scoped npm release so the shared release-parity checker can prove that npm and
13
+ the matching GitHub release contain the same artifact.
14
+
15
+ ## Workflow
16
+
17
+ 1. Preview the delta without writing:
18
+
19
+ ```sh
20
+ npx @ikon85/agent-workflow-kit@latest diff
21
+ ```
22
+
23
+ Review the named added, updated, locally modified, removed, and conflicting
24
+ paths. Do not reinterpret a local modification as permission to overwrite it.
25
+
26
+ 2. Apply the update:
27
+
28
+ ```sh
29
+ npx @ikon85/agent-workflow-kit@latest update
30
+ ```
31
+
32
+ The command checks npm/GitHub release parity before staging. It prepares a
33
+ complete candidate outside the consumer, runs the consumer's existing
34
+ `npm test` command there, and activates only a verified candidate. A staging
35
+ or verification failure leaves the installed tree byte-identical.
36
+
37
+ 3. Read the terminal report. `aktuell` proves a second run found no upstream
38
+ delta. A conflict report names and counts every category and leaves every
39
+ consumer file untouched. Follow its recommendation and resolve each named
40
+ conflict manually; never auto-merge, delete a local edit, or silently choose
41
+ the incoming copy.
42
+
43
+ 4. If a candidate is interrupted, discard its reported stage directory or
44
+ resume the transaction through the update API's `resumeFrom` option. Do not
45
+ copy staged files into the consumer by hand.
46
+
47
+ ## State contract
48
+
49
+ The update API reports `checking -> preview/awaiting_decision -> staging ->
50
+ verifying -> applied | conflicted | failed | aborted`. `conflicted`, `failed`,
51
+ and `aborted` never authorize partial activation. The existing manifest,
52
+ three-way diff, and atomic-write seams remain the source of truth.
@@ -97,8 +97,10 @@ Tripped altitude criteria: <e.g. C1 staged delivery, C2 multiple subsystems, C4
97
97
  structure-bearing decisions (escalate a single bounded choice to `decision-gate`).
98
98
  2. `to-prd` — it auto-detects the program mode from the Wellenplan chapter and writes
99
99
  a Program-PRD (native anchor over the waves).
100
- 3. `to-waves` — unfold the wave plan into named wave stubs + slice leaves after the
101
- chat preview gate (nothing is written to the board until you approve it).
100
+ 3. `to-waves` — after one complete chat preview, materialize the whole Program with
101
+ **all waves execute-ready by default**: complete slice contracts, buckets,
102
+ dependencies and handoffs. Decision Gates, Verify Spikes and Design-Grill waves
103
+ are explicit planned exceptions; generic late-binding cleanup is not.
102
104
  ```
103
105
 
104
106
  ### Feature (0–1 criteria, or any doubt)
@@ -132,7 +134,7 @@ Bug: <what's broken — expected vs. actual>.
132
134
  ```
133
135
  scale-check: verdict=<Program | Feature | Direct-Slice | Bug>
134
136
  criteria tripped=<C1,C2,… | none | n/a (bug/direct)>
135
- route=<program grill → to-prd → to-waves | grill-with-docs → to-prd → to-issues | tdd | diagnose>
137
+ route=<program grill → to-prd → to-waves (all waves execute-ready by default) | grill-with-docs → to-prd → to-issues | tdd | diagnose>
136
138
  start-prompt: <the paste-ready block above, filled in>
137
139
  ```
138
140
 
@@ -19,6 +19,7 @@ Use this section as the entry-point map for agent-assisted work. The individual
19
19
  - **Implementation slice:** use `tdd` for one behavior at a time: RED, GREEN, then refactor.
20
20
  - **Finished slice:** use `wrapup` to prepare the branch, PR, and cleanup steps your repo expects.
21
21
  - **Kit release:** use `kit-release` to derive the shipped delta, confirm Semver, regenerate the manifest, run all gates, and then hand landing to `wrapup`.
22
+ - **Kit update:** use `kit-update` to preview and transactionally apply a parity-verified scoped release without overwriting local modifications.
22
23
  - **A huge, foggy effort, too big for one session:** use `wayfinder` — it charts it as a shared map of investigation tickets, resolving one per session.
23
24
 
24
25
  ## Routing Rule
@@ -384,6 +384,16 @@
384
384
  "codex"
385
385
  ],
386
386
  "provenance": "own"
387
+ },
388
+ "kit-update": {
389
+ "class": "generic",
390
+ "publish": true,
391
+ "entryPoint": true,
392
+ "surfaces": [
393
+ "claude",
394
+ "codex"
395
+ ],
396
+ "provenance": "own"
387
397
  }
388
398
  }
389
399
  }
@@ -98,6 +98,14 @@ Ask the user:
98
98
 
99
99
  Iterate until the user approves the breakdown.
100
100
 
101
+ **Program batch handoff.** When `to-waves` invokes this skill for a Stufe-1p stub,
102
+ the complete Program preview has already shown and approved every wave's slice
103
+ contract. Reuse that approval when this pass preserves the approved cut: do not
104
+ pause again merely because the internal pipeline crossed a skill boundary. Run
105
+ the normal contract in full — maturity is not a reduced mode — and reconcile the
106
+ stub's existing leaves instead of duplicating them. A new structural choice or a
107
+ newly discovered gate invalidates the inherited approval and returns to §4.
108
+
101
109
  ### 5. Publish — promote-or-atomic (contract)
102
110
 
103
111
  **Cluster/Wave discriminator (identical wording — `to-prd` §2 / `to-issues` §5):** `type:cluster` (label) always stops. A Wave number also stops, **unless** the target carries the `wave-stub` label — a Wave-stamped `wave-stub` issue is a **Stufe-1p Program-stub** (`to-waves`-published, native parent = a Program-PRD) and remains a **valid target**. A Wave-stamped issue **without** `wave-stub` (an already-assigned leaf, or a drifted item) is still a hard stop.
@@ -193,6 +201,21 @@ python3 scripts/board-sync.py dep-add --issue <blocked#> --blocked-by <blocker#>
193
201
 
194
202
  The Draft-PRD stays the executable leaf. Edit its body: **remove** `<!-- prd: awaiting-decomposition -->`, keep `type:*`+`priority:*` (**no** `type:cluster`/Wave, **no** `Welle N` title prefix), stamp the leaf `plan_revision`, add the `## Handoff Start Command`. The single PR `closes #<prd#>`.
195
203
 
204
+ **Program-batch atomic exception.** A Stufe-1p stub already represents one named
205
+ wave under a Program-PRD. When its approved cut contains exactly one slice, keep
206
+ the stub itself as the atomic executable wave leaf: preserve its existing Wave and Phase,
207
+ `Welle N — …` title, native Program parent, and source marker; write the complete
208
+ atomic contract and bucket, then remove only `wave-stub`. Do not erase Program
209
+ navigation by applying the ordinary Wave-less atomic normalization.
210
+
211
+ On a delta re-run, a legacy or interrupted preliminary child may already be linked
212
+ under that atomic stub. Lift any still-relevant content into the stub, unlink the
213
+ child with `board-sync.py unlink`, and close it with the mapping comment
214
+ `superseded by atomic wave leaf #<stub>`. Scan both `children-of` and the Program's
215
+ `program-leaf-source` markers: the **matching source marker remains discoverable after unlink**.
216
+ Resume idempotently — unlink only when still linked; close only when still open;
217
+ an already completed step is a no-op. The final atomic wave has no child set.
218
+
196
219
  Then set the bucket via the helper — the leaf already exists, so the workflow-label write goes through `board-sync.py add --bucket` (§5a forbids a bare `gh issue edit --add-label ready-for-agent`):
197
220
 
198
221
  ```bash
@@ -215,6 +238,12 @@ Every child **and** the atomic leaf sits in **exactly one** bucket:
215
238
 
216
239
  Status alone cannot discriminate (both are `Spec`) — the **label** does. The helper's `--hitl` flag rejects a `ready-for-agent` label mechanically. Authority = `scripts/execute-ready-check.py` (`parse_bucket`) — the checker wins on a mismatch.
217
240
 
241
+ **A mandatory human or external setup action is never AFK.** Cut it as a HITL gate
242
+ slice (or an explicitly named planning wave), place it before the dependent build
243
+ slice, and set the native blocked-by edge. Never hide a maintainer configuration,
244
+ credentialless console action, approval, or design response inside a leaf carrying
245
+ `ready-for-agent`, even when the remaining code work could run unattended.
246
+
218
247
  **Gate slices (🔬/📐) are AFK.** A `🔬` Verify-Spike or `📐` Trade-off/Research gate slice is **read-only** (a fact question, or a bounded trade-off + read-only research) — an agent can run it solo, so it carries `ready-for-agent` like any other AFK slice; the **native blocked-by edge** on its dependent build slice (set at publish, §5a step 5) is what protects the gate-before-build ordering (§3b/§4), not the HITL bucket. Only a `🧭` Design-Grill gate slice is HITL (it needs the human in the grill). A gate slice's **placement** — which altitude/layer it lands on — follows `decision-gate`'s placement rule (owned there, referenced here).
219
248
 
220
249
  #### 5d. Issue body template (each child / atomic leaf)