@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.
- package/.agents/skills/kit-release/SKILL.md +26 -5
- package/.agents/skills/kit-update/SKILL.md +52 -0
- package/.agents/skills/scale-check/SKILL.md +5 -3
- package/.agents/skills/setup-workflow/workflow-overview.md +1 -0
- package/.agents/skills/to-issues/SKILL.md +29 -0
- package/.agents/skills/to-waves/SKILL.md +60 -21
- package/.claude/skills/kit-release/SKILL.md +26 -5
- package/.claude/skills/kit-update/SKILL.md +52 -0
- package/.claude/skills/scale-check/SKILL.md +5 -3
- package/.claude/skills/setup-workflow/workflow-overview.md +1 -0
- package/.claude/skills/skill-manifest.json +10 -0
- package/.claude/skills/to-issues/SKILL.md +29 -0
- package/.claude/skills/to-waves/SKILL.md +60 -21
- package/README.md +20 -0
- package/agent-workflow-kit.package.json +43 -11
- package/package.json +3 -2
- package/scripts/build-kit.test.mjs +1 -0
- package/scripts/kit-release.test.mjs +10 -0
- package/scripts/release-parity.mjs +52 -0
- package/scripts/release-parity.test.mjs +53 -0
- package/scripts/release-state.mjs +172 -0
- package/scripts/release-state.test.mjs +106 -0
- package/scripts/test_program_planning_contract.py +63 -0
- package/src/cli.mjs +29 -4
- package/src/commands/update.mjs +110 -76
- package/src/lib/bundle.mjs +5 -0
- package/src/lib/updateCandidate.mjs +101 -0
- package/src/lib/updateReconcile.mjs +89 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kit-release
|
|
3
|
-
description: "Prepare a verified release PR for agent-workflow-kit
|
|
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
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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` —
|
|
101
|
-
|
|
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: "
|
|
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
|
-
**
|
|
12
|
-
`scale-check → grill → to-prd (program mode) → to-waves
|
|
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
|
-
|
|
75
|
-
|
|
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).
|
|
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. **
|
|
91
|
-
|
|
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,
|
|
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. **
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
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
|
-
**
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
|
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
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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` —
|
|
101
|
-
|
|
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)
|