@ikon85/agent-workflow-kit 0.32.1 → 0.34.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/ask-matt/SKILL.md +4 -3
- package/.agents/skills/audit-skills/SKILL.md +6 -0
- package/.agents/skills/board-to-waves/SKILL.md +6 -2
- package/.agents/skills/code-review/SKILL.md +6 -0
- package/.agents/skills/codebase-design/DESIGN-IT-TWICE.md +11 -1
- package/.agents/skills/codex-adapter-sync/SKILL.md +23 -19
- package/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +6 -0
- package/.agents/skills/improve-codebase-architecture/SKILL.md +10 -1
- package/.agents/skills/kit-update/SKILL.md +13 -0
- package/.agents/skills/orchestrate-wave/SKILL.md +54 -54
- package/.agents/skills/orchestrate-wave/references/builder-contract.md +16 -3
- package/.agents/skills/orchestrate-wave/references/dispatch-subagents.md +91 -0
- package/.agents/skills/orchestrate-wave/references/dispatch-workflow.md +66 -0
- package/.agents/skills/orchestrate-wave/references/report-contracts.md +42 -0
- package/.agents/skills/research/SKILL.md +6 -0
- package/.agents/skills/scale-check/SKILL.md +9 -7
- package/.agents/skills/setup-workflow/SKILL.md +47 -1
- package/.agents/skills/setup-workflow/board-sync.md +7 -2
- package/.agents/skills/setup-workflow/workflow-overview.md +1 -2
- package/.agents/skills/to-issues/SKILL.md +66 -8
- package/.agents/skills/to-waves/SKILL.md +24 -12
- package/.claude/skills/ask-matt/SKILL.md +4 -3
- package/.claude/skills/audit-skills/SKILL.md +6 -0
- package/.claude/skills/board-to-waves/SKILL.md +6 -2
- package/.claude/skills/code-review/SKILL.md +6 -0
- package/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +8 -0
- package/.claude/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +6 -0
- package/.claude/skills/improve-codebase-architecture/SKILL.md +6 -0
- package/.claude/skills/kit-update/SKILL.md +13 -0
- package/.claude/skills/orchestrate-wave/SKILL.md +54 -54
- package/.claude/skills/orchestrate-wave/references/builder-contract.md +16 -3
- package/.claude/skills/orchestrate-wave/references/dispatch-subagents.md +91 -0
- package/.claude/skills/orchestrate-wave/references/dispatch-workflow.md +66 -0
- package/.claude/skills/orchestrate-wave/references/report-contracts.md +42 -0
- package/.claude/skills/research/SKILL.md +6 -0
- package/.claude/skills/scale-check/SKILL.md +9 -7
- package/.claude/skills/setup-workflow/SKILL.md +47 -1
- package/.claude/skills/setup-workflow/board-sync.md +7 -2
- package/.claude/skills/setup-workflow/workflow-overview.md +1 -2
- package/.claude/skills/to-issues/SKILL.md +66 -8
- package/.claude/skills/to-waves/SKILL.md +24 -12
- package/README.md +126 -11
- package/agent-workflow-kit.package.json +291 -39
- package/docs/adr/0002-capability-gated-orchestration.md +70 -0
- package/docs/adr/0005-to-issues-is-the-planning-facade.md +42 -0
- package/docs/adr/0006-routing-knowledge-access-and-policy-are-separate.md +91 -0
- package/docs/agents/skills/local-ci.md +89 -0
- package/docs/agents/wave-anchor-template.md +2 -2
- package/docs/methodology.html +1 -1
- package/docs/methodology.svg +1 -1
- package/docs/workflow.html +2 -2
- package/docs/workflow.png +0 -0
- package/package.json +1 -1
- package/scripts/codex-exec.sh +47 -8
- package/scripts/codex-exec.test.mjs +56 -0
- package/scripts/test_codex_adapter_sync_contract.py +30 -15
- package/scripts/test_orchestrate_wave_contract.py +209 -0
- package/scripts/test_program_planning_contract.py +70 -0
- package/scripts/test_skill_portability_lint.py +54 -0
- package/scripts/test_worktree_setup_base_guard.py +140 -0
- package/scripts/worktree-lifecycle/setup.py +40 -0
- package/src/cli.mjs +109 -2
- package/src/commands/init.mjs +17 -1
- package/src/commands/routing-policy-update.mjs +204 -0
- package/src/commands/update.mjs +22 -0
- package/src/lib/agentSurfaceRegistry.mjs +60 -0
- package/src/lib/bundle.mjs +34 -0
- package/src/lib/capabilityMatrix.mjs +179 -0
- package/src/lib/dispatchReceipt.mjs +162 -0
- package/src/lib/frontendWorkloads.mjs +170 -0
- package/src/lib/reconcileReconReports.mjs +111 -0
- package/src/lib/reportValidator.mjs +186 -0
- package/src/lib/routeDispatcher.mjs +158 -0
- package/src/lib/routingAccessGraph.mjs +105 -0
- package/src/lib/routingAdapters/claude.mjs +62 -0
- package/src/lib/routingAdapters/codex.mjs +136 -0
- package/src/lib/routingCatalog.mjs +123 -0
- package/src/lib/routingEvidenceCache.mjs +222 -0
- package/src/lib/routingIntent.mjs +93 -0
- package/src/lib/routingPolicy.mjs +67 -0
- package/src/lib/routingProfile.mjs +334 -0
- package/src/lib/routingResolver.mjs +176 -0
- package/src/lib/routingSources/artificialAnalysis.mjs +129 -0
- package/src/lib/routingSources/benchlm.mjs +151 -0
- package/src/lib/routingSources/codeArena.mjs +162 -0
- package/src/lib/routingSources/deepswe.mjs +106 -0
- package/src/lib/routingSources/openhands.mjs +102 -0
- package/src/lib/routingSources/openhandsFrontend.mjs +135 -0
- package/src/lib/waveClaim.mjs +134 -0
|
@@ -81,10 +81,10 @@ node scripts/readiness.mjs check --skill orchestrate-wave --json
|
|
|
81
81
|
- **Plan-level error** (integration/verify reveals a wrong LOCKED decision, not a
|
|
82
82
|
slice bug): STOP the wave. No improvised redesign AFK — keep worktrees intact,
|
|
83
83
|
report findings + options.
|
|
84
|
-
- **On ANY wave STOP/abort:** if this run planted the active-wave claim,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
- **On ANY wave STOP/abort:** if this run planted the active-wave claim, release
|
|
85
|
+
it via `releaseWaveClaim` with this run's owner as part of shutdown — it
|
|
86
|
+
refuses a foreign payload. Never delete a claim marker observed during a
|
|
87
|
+
preflight collision. A stale own marker would block a safe retry.
|
|
88
88
|
- **Routing = one axis: how expensive is a wrong result to catch?** Mechanically
|
|
89
89
|
caught (test/screenshot/lint) → default tier at medium/low effort; plausible-but-
|
|
90
90
|
wrong / subtle logic / architecture → top tier at high effort + main-thread
|
|
@@ -95,6 +95,24 @@ node scripts/readiness.mjs check --skill orchestrate-wave --json
|
|
|
95
95
|
first red test). The same axis sets how hard you re-verify. Borderline → default
|
|
96
96
|
tier + re-verify beats blanket top tier.
|
|
97
97
|
|
|
98
|
+
## Orchestration mechanics
|
|
99
|
+
|
|
100
|
+
Pass only host-supplied inventory through `capabilityAdapter.claude` or `.codex`,
|
|
101
|
+
then call the selector. It returns exactly one target; missing or `unknown` evidence
|
|
102
|
+
degrades A → B → C. A model claim is not evidence; do not emulate a missing primitive.
|
|
103
|
+
Before any spawn, resolve the provider-neutral Routing intent through the shared resolver and spawn guard, then use the active Claude or Codex adapter. Codex contributes only its dated host attestation through `routingAdapters/codex.mjs`; it does not create a second catalog, Access graph, or Routing policy. A detected transport is not authorization. The Dispatch receipt must show requested and applied route, model/effort enforcement, environment precedence on mismatch, and catalog/access/policy revisions. AFK blocks unverified, unauthorized, overridden, unenforced, or silently degraded routes; a Codex host without model and effort selectors blocks differentiated AFK before spawn, and unreachable routes follow policy handoff/inherit/block exactly.
|
|
104
|
+
- **Path A:** requires the literal `Workflow` tool, callable and permitted, plus
|
|
105
|
+
individually proven named phases, run identity, runtime output validation,
|
|
106
|
+
journal, and resume. Then read [its recipe](references/dispatch-workflow.md).
|
|
107
|
+
- **Path B:** requires proven native spawn, wait, and aggregate plus effective
|
|
108
|
+
concurrency and thread capacity ≥2. Then read [its recipe](references/dispatch-subagents.md).
|
|
109
|
+
- **Path C:** keep recon and building direct and serial in the main thread. Produce
|
|
110
|
+
the same FILE → SLICES evidence, create each worktree from the integrated base,
|
|
111
|
+
apply the builder contract, validate the result, then continue. Load no reference.
|
|
112
|
+
|
|
113
|
+
Phases 0 and 3–6 always remain in the main thread. Visible fan-out progress may
|
|
114
|
+
replace the ~30-second heartbeat; otherwise the standing heartbeat remains required.
|
|
115
|
+
|
|
98
116
|
## Phase 0 — Setup
|
|
99
117
|
|
|
100
118
|
1. **Read everything**: the anchor body, every sub-issue body (each has a Handoff
|
|
@@ -106,15 +124,15 @@ node scripts/readiness.mjs check --skill orchestrate-wave --json
|
|
|
106
124
|
preflight's single degraded summary is the only warning. Never guess a project
|
|
107
125
|
command, tunnel, login, or verify recipe.
|
|
108
126
|
3. **Preflight — refuse a wave already in flight, otherwise claim it.** Before
|
|
109
|
-
dispatch, inspect
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
127
|
+
dispatch, inspect the two same-machine work signals: **(a)** any slice branch
|
|
128
|
+
ahead of the wave's current base (`git rev-list --count <base>..<slice-branch>`
|
|
129
|
+
> 0); **(b)** uncommitted changes in any slice worktree (`git -C <worktree>
|
|
130
|
+
status --porcelain` non-empty). Acquire the claim itself through `claimWave`
|
|
131
|
+
from `src/lib/waveClaim.mjs`: a compare-and-set on the `wave-active/<anchor>`
|
|
132
|
+
LOCAL annotated tag, so two sessions racing one wave cannot both win. Either
|
|
133
|
+
`acquired: false` or a work signal you did not create means another session
|
|
134
|
+
owns the wave — **STOP**, report the returned `claim.owner` plus the exact
|
|
135
|
+
branch/worktree, touch nothing. Local coordination state — never push the tag.
|
|
118
136
|
4. **Wave worktree**: reuse the planning worktree (never re-create; the handoff
|
|
119
137
|
points there). Bring its branch to current `main`:
|
|
120
138
|
`git -C <wave> merge --ff-only origin/main` (if your repo guards destructive
|
|
@@ -132,17 +150,10 @@ preflight clean + this run's local claim planted · wave branch ff'd to
|
|
|
132
150
|
|
|
133
151
|
## Phase 1 — Disjointness recon (the load-bearing step)
|
|
134
152
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
listing every file that appears in ≥2 slices.
|
|
140
|
-
- Build the **overlap graph**. Identify the **conflict hub** (the slice whose new
|
|
141
|
-
artifacts other slices reuse). **Build the hub first**, merge it, THEN the
|
|
142
|
-
dependents stop conflicting.
|
|
143
|
-
- Cut into **waves of fully file-disjoint slices**. Edited-by-≥2 = serialize across
|
|
144
|
-
waves; only-shared-via-import = safe. A new primitive edited by one slice but
|
|
145
|
-
*consumed* by others is NOT a conflict.
|
|
153
|
+
Phase 1 uses the selected orchestration mechanics. Resolve every named component,
|
|
154
|
+
produce the **FILE → SLICES** table and overlap graph, then build the conflict hub
|
|
155
|
+
before its dependents. Cut fully file-disjoint waves; shared imports are safe, but
|
|
156
|
+
files edited by multiple slices serialize across waves.
|
|
146
157
|
- **Native blocking edges are the frontier authority.** Read the anchor's
|
|
147
158
|
buildable frontier from the tracker's native issue dependencies:
|
|
148
159
|
`python3 scripts/board-sync.py frontier <anchor#>` → `FREI` / `BLOCKED by #…` /
|
|
@@ -151,15 +162,11 @@ Zero merge conflicts later depends entirely on getting this right.
|
|
|
151
162
|
body text or table order alone. The frontier must AGREE with your Phase-1
|
|
152
163
|
dependency order; a contradiction is a plan finding to reconcile before dispatch,
|
|
153
164
|
not a detail.
|
|
154
|
-
- **Reconcile contradictory sub-issue ACs against the plan BEFORE dispatch
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
CONSUME only and never touch it.** Embed verbatim in each dependent's contract:
|
|
160
|
-
"X already exists in `<file>` — do NOT add it, consume only." (Real case: all 14
|
|
161
|
-
sub-issues claimed the same registry adds + 4 contradictions — hub expanded to
|
|
162
|
-
own all 20 keys, batch merged conflict-free.)
|
|
165
|
+
- **Reconcile contradictory sub-issue ACs against the plan BEFORE dispatch.** Safe
|
|
166
|
+
declaration-only registries may be predeclared by one hub; eager/validated
|
|
167
|
+
registries that read targets must serialize helper-owning slices through
|
|
168
|
+
dependency edges, each appending only its own existing artifact after creation.
|
|
169
|
+
Both preserve one owner per shared edit and the no-conflict invariant.
|
|
163
170
|
- **Retirement slices require a valid topological deletion order.** Before
|
|
164
171
|
dispatching slices that delete a legacy cluster, map every to-delete module's
|
|
165
172
|
production importers and build the cluster's internal import graph. Order the
|
|
@@ -168,25 +175,19 @@ Zero merge conflicts later depends entirely on getting this right.
|
|
|
168
175
|
deletions form a cycle, separate each-slice-green steps are impossible: combine
|
|
169
176
|
the whole cycle into ONE atomic slice instead of landing dangling imports.
|
|
170
177
|
|
|
171
|
-
**Done when:** FILE→SLICES table exists ·
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
**Done when:** FILE→SLICES table exists · each shared file has either one
|
|
179
|
+
declaration-only owner with verbatim consume-only dependents, or an explicit serialized
|
|
180
|
+
owner sequence for eager/validated additions where each owner appends only its own existing artifact · disjoint waves cut in dependency order.
|
|
174
181
|
|
|
175
182
|
## Phase 2 — Dispatch one wave in parallel (isolated worktree per implementer)
|
|
176
183
|
|
|
177
|
-
Phase 2
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
yourself — and **(b) tier + effort** (Standing rules → Routing). For each
|
|
185
|
-
delegated slice:
|
|
186
|
-
|
|
187
|
-
- **One worktree per agent** off the wave-branch HEAD, own index so parallel agents
|
|
188
|
-
never share a git index. Use your project's worktree-setup command (`§Setup`),
|
|
189
|
-
else plain `git worktree add <path> -b feat/<anchor>-<slug>`.
|
|
184
|
+
Phase 2 uses the selected orchestration mechanics, repeating with Phase 3 per
|
|
185
|
+
disjoint wave, conflict hub first. Dispatch only `FREI` slices: re-read
|
|
186
|
+
`frontier <anchor#>` before each wave and clear changed edges only via `dep-remove`.
|
|
187
|
+
Before each slice, bind **(a) inline vs delegate** and **(b) tier + effort** under
|
|
188
|
+
Standing rules. Tiny mechanical work may stay inline.
|
|
189
|
+
For Path A/B, create one worktree per agent from wave HEAD, using `§Setup` or
|
|
190
|
+
`git worktree add <path> -b feat/<anchor>-<slug>`.
|
|
190
191
|
- **Build the prompt from [`references/builder-contract.md`](references/builder-contract.md)**
|
|
191
192
|
— fill the slots with the slice's VERBATIM What+AC, plan decision, recon
|
|
192
193
|
file:line map and consume-only lines; never paraphrase (paraphrase drift has
|
|
@@ -201,8 +202,7 @@ package tests + green fast gate (`§Builder Commands`) — or a STOP item you re
|
|
|
201
202
|
|
|
202
203
|
## Phase 3 — Serial integration
|
|
203
204
|
|
|
204
|
-
In the wave worktree
|
|
205
|
-
conflict-free). After EACH wave, on the integrated branch:
|
|
205
|
+
In the wave worktree, `git merge --no-ff <slice-branch>` per slice. After EACH wave:
|
|
206
206
|
|
|
207
207
|
- Typecheck both packages + the **FULL suite** — catches sibling/consumer test
|
|
208
208
|
breaks the agent ownership didn't cover (hardcoded count/tab asserts). Exact
|
|
@@ -307,9 +307,9 @@ written · merge order documented.
|
|
|
307
307
|
your own processes, targeted by the worktree's assigned ports, never blind).
|
|
308
308
|
Remove temp verify scripts (a login helper, DB-check scripts).
|
|
309
309
|
- **Remove only this run's claim marker.** If this run planted
|
|
310
|
-
`wave-active/<anchor>`,
|
|
311
|
-
|
|
312
|
-
|
|
310
|
+
`wave-active/<anchor>`, call `releaseWaveClaim` with this run's owner after
|
|
311
|
+
success or abort; its owner check, not a broad `wave-active/*` pattern,
|
|
312
|
+
authorizes cleanup, and a foreign marker is left untouched.
|
|
313
313
|
- **Before removing any slice worktree, read its `ANNAHMEN.md`** (an assumptions
|
|
314
314
|
log, gitignored at worktree-root) and propagate each build-time assumption marker
|
|
315
315
|
to the sibling issue it carries. A hand-driven multi-PR / migration landing does
|
|
@@ -56,13 +56,26 @@ invocation for each in this prompt so the builder cannot guess a wrong one.
|
|
|
56
56
|
completed command result. Never end your turn while a command is still running.
|
|
57
57
|
|
|
58
58
|
## Report back (concise)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
Return exactly ONE JSON object against the builder report contract — no prose
|
|
60
|
+
around it, no second object. Cover: files touched · decisions taken · test
|
|
61
|
+
results (exact completed command results and exit status) · commit SHA · STOP
|
|
62
|
+
items · what the orchestrator should visually verify.
|
|
62
63
|
```
|
|
63
64
|
|
|
64
65
|
Orchestrator notes:
|
|
65
66
|
|
|
67
|
+
- **The report contract is identical on every orchestration path.** Whether the
|
|
68
|
+
builder was dispatched by a scripted workflow, by native subagents, or run
|
|
69
|
+
directly and serially, it reports the same shape. `src/lib/reportValidator.mjs`
|
|
70
|
+
is the source of truth; [`references/report-contracts.md`](report-contracts.md)
|
|
71
|
+
is its machine-checked mirror for hosts that must inline a schema. Fill the
|
|
72
|
+
report section above with the builder schema from whichever of the two the
|
|
73
|
+
host can reach — never a hand-written variant.
|
|
74
|
+
- **Validation is always the main thread's.** Schema-validate the returned
|
|
75
|
+
object, then call `semanticVerify` with independently collected Git facts. A
|
|
76
|
+
builder's own claim of success is a hypothesis; a payload that does not parse
|
|
77
|
+
or fails either check is a missing report, not a PASS.
|
|
78
|
+
|
|
66
79
|
- `{{CONSUME_ONLY_LINES}}` come from the Phase-1 reconciliation, e.g.
|
|
67
80
|
"X already exists in `<file>` — do NOT add it, consume only."
|
|
68
81
|
- For dependent slices, fill hub artifact paths from the hub agent's report
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Path B — Native subagent dispatch
|
|
2
|
+
|
|
3
|
+
Load this recipe only when the capability selector returns Path B. That result
|
|
4
|
+
requires proven native spawn, wait, and aggregate primitives plus effective
|
|
5
|
+
concurrency and thread capacity ≥2. Route from proven capabilities only, never
|
|
6
|
+
from a surface name, and do not emulate a missing primitive.
|
|
7
|
+
|
|
8
|
+
This recipe is **dormant unless the current host's complete orchestration
|
|
9
|
+
inventory proves Path B.** The dated Codex routing attestation is a separate
|
|
10
|
+
gate: the observed explicit-spawn schema exposes only `task_name`, `message`,
|
|
11
|
+
and `fork_turns`, with no model or effort selector. Therefore
|
|
12
|
+
`routingAdapters/codex.mjs` blocks differentiated AFK before spawn even when
|
|
13
|
+
native start/wait/aggregate evidence is otherwise sufficient for Path B. A
|
|
14
|
+
future host may enable the route only by attesting both orchestration primitives
|
|
15
|
+
and applied model/effort controls; neither is inferred from the surface name.
|
|
16
|
+
|
|
17
|
+
## Main-thread preparation
|
|
18
|
+
|
|
19
|
+
1. Read the canonical `RECON_REPORT_SCHEMA` and `BUILDER_REPORT_SCHEMA` values
|
|
20
|
+
from `src/lib/reportValidator.mjs`. They are the same contract every
|
|
21
|
+
orchestration path reports against.
|
|
22
|
+
2. Embed the relevant schema verbatim in each subagent prompt, together with the
|
|
23
|
+
instruction to return **exactly ONE JSON object** and nothing else — no
|
|
24
|
+
prose, no fences, no second object. The host does not enforce output shape,
|
|
25
|
+
so the contract lives in the prompt and the check lives in the main thread.
|
|
26
|
+
3. Acquire the wave claim and create every worktree from the integrated base
|
|
27
|
+
through `claimWave` in `src/lib/waveClaim.mjs` before any spawn. Claim and
|
|
28
|
+
worktree creation stay serial in the main thread; only the agents fan out.
|
|
29
|
+
|
|
30
|
+
## Round 1 — Recon
|
|
31
|
+
|
|
32
|
+
Spawn **one read-only explorer per slice**, all in one batch so they run
|
|
33
|
+
concurrently, then join them with an **explicit wait** on the spawned set —
|
|
34
|
+
never a sleep, a poll loop, or an implicit continue. Aggregate only after the
|
|
35
|
+
wait returns.
|
|
36
|
+
|
|
37
|
+
Each explorer returns one recon report. Validate every returned payload against
|
|
38
|
+
the recon schema in the main thread: a payload that does not parse, carries
|
|
39
|
+
extra top-level keys, or fails the schema **is not a PASS** — it is a missing
|
|
40
|
+
report. Re-spawn that single explorer with the failure quoted back to it; never
|
|
41
|
+
accept a prose summary in place of the object.
|
|
42
|
+
|
|
43
|
+
## Main-thread reconcile boundary
|
|
44
|
+
|
|
45
|
+
Pass the complete, validated recon set to `reconcileReconReports`. A
|
|
46
|
+
reconciliation failure stops the wave. A successful result is the only boundary
|
|
47
|
+
that permits builders to start; use its overlap graph and dependency edges to
|
|
48
|
+
cut safe dispatch batches. Multiple editors are safe only when dependency
|
|
49
|
+
reachability totally orders them; shared-mutable files still require exactly one
|
|
50
|
+
edit owner.
|
|
51
|
+
|
|
52
|
+
Every orchestration path crosses this same main-thread reconciliation boundary.
|
|
53
|
+
Reconciliation is never delegated to a subagent.
|
|
54
|
+
|
|
55
|
+
## Round 2 — Build
|
|
56
|
+
|
|
57
|
+
For the current reconciled batch, spawn **one builder per slice**, again as one
|
|
58
|
+
concurrent batch joined by an explicit wait. Give each builder the verbatim
|
|
59
|
+
builder contract, its reconciled allowlist, and its required commands. Resolve
|
|
60
|
+
the provider-neutral Routing intent immediately before each spawn. Pass the
|
|
61
|
+
decision through `routeDispatcher.mjs` and the active surface adapter. Claude
|
|
62
|
+
uses its native or explicitly policy-approved transport attestation; Codex uses
|
|
63
|
+
only its dated `routingAdapters/codex.mjs` host attestation. Both must prove
|
|
64
|
+
their requested and applied model and effort controls before invocation.
|
|
65
|
+
Detection alone never authorizes a transport.
|
|
66
|
+
|
|
67
|
+
The spawn guard compares the requested route with the adapter's applied route
|
|
68
|
+
and environment precedence. It emits the shared Dispatch receipt with
|
|
69
|
+
catalog/access/policy revisions. An unverified control, unauthorized transport,
|
|
70
|
+
override mismatch, or unenforced effort blocks AFK before spawn. A genuinely
|
|
71
|
+
unreachable route follows the policy's handoff, inherit, or block result; never
|
|
72
|
+
silently inherit. A host without a proved per-agent selector remains on its
|
|
73
|
+
existing parent-session fallback only when explicit non-AFK policy permits it.
|
|
74
|
+
|
|
75
|
+
Each builder returns exactly one builder report. Validate it against the builder
|
|
76
|
+
schema and then run `semanticVerify` on it in the main thread. A subagent's own
|
|
77
|
+
claim of success is a hypothesis, never the gate.
|
|
78
|
+
|
|
79
|
+
## B1 fan-out is out of scope
|
|
80
|
+
|
|
81
|
+
The **B1** shape — a single fan-out over a work list (`spawn_agents_on_csv`)
|
|
82
|
+
plus a host-enforced per-agent `output_schema` — is explicitly excluded. The
|
|
83
|
+
same spike found the callable spawn schema exposes only `task_name`, `message`,
|
|
84
|
+
and `fork_turns`: no work-list fan-out and no output-schema parameter. This
|
|
85
|
+
recipe therefore documents the **B2** shape only: explicit per-slice spawns
|
|
86
|
+
joined by an explicit wait, with validation owned by the main thread.
|
|
87
|
+
|
|
88
|
+
Re-opening B1 requires its own version-pinned verify spike — tracked as an open
|
|
89
|
+
spike issue on the kit's own tracker — before any recipe or adapter change.
|
|
90
|
+
Never infer the capability from a release note; prove it against the pinned
|
|
91
|
+
runtime first.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Path A — Scripted Workflow dispatch
|
|
2
|
+
|
|
3
|
+
Load this recipe only when the capability selector returns Path A. That result
|
|
4
|
+
requires the literal `Workflow` tool and every required primitive. Route from
|
|
5
|
+
proven capabilities only, never from a surface name, and do not emulate
|
|
6
|
+
Workflow. The current Codex host lacks complete capability evidence and selects
|
|
7
|
+
Path C; a future host selects whichever path its evidence proves.
|
|
8
|
+
|
|
9
|
+
## Main-thread preparation
|
|
10
|
+
|
|
11
|
+
1. Read the canonical `RECON_REPORT_SCHEMA` and `BUILDER_REPORT_SCHEMA` values
|
|
12
|
+
from `src/lib/reportValidator.mjs`.
|
|
13
|
+
2. Serialize each value as an inline schema literal in its generated Workflow
|
|
14
|
+
script. Workflow scripts cannot import modules, so never put an `import()`,
|
|
15
|
+
`require`, `process`, or `fetch` workaround in them.
|
|
16
|
+
3. Build deterministic run arguments. Pass run identity, slice IDs, prompts,
|
|
17
|
+
models, effort levels, and timestamps through `args`; never call
|
|
18
|
+
`Date.now()` or `Math.random()` in a script.
|
|
19
|
+
|
|
20
|
+
## Run 1 — Recon
|
|
21
|
+
|
|
22
|
+
Declare the named recon phase in `meta.phases`. Within it, make one `agent()`
|
|
23
|
+
call per slice, with explicit `model`, `effort`, and `phase` options. Give every
|
|
24
|
+
call the inline recon schema so the Workflow runtime rejects prose or malformed
|
|
25
|
+
output before aggregation.
|
|
26
|
+
|
|
27
|
+
Use the run identity supplied in `args` and retain the Workflow-managed
|
|
28
|
+
`journal.jsonl`. The main thread waits for the Recon run to finish and collects
|
|
29
|
+
its schema-valid reports. It must not dispatch a builder yet.
|
|
30
|
+
|
|
31
|
+
## Main-thread reconcile boundary
|
|
32
|
+
|
|
33
|
+
Pass the complete Recon-run result to `reconcileReconReports`. A reconciliation
|
|
34
|
+
failure stops the wave. A successful result is the only boundary that permits
|
|
35
|
+
the Build run to start; use its overlap graph and dependency edges to cut safe
|
|
36
|
+
dispatch batches. Multiple editors are safe only when dependency reachability
|
|
37
|
+
totally orders them; shared-mutable files still require exactly one edit owner.
|
|
38
|
+
|
|
39
|
+
Every orchestration path, including Paths B and C, must cross this same
|
|
40
|
+
main-thread reconciliation boundary. Reconciliation is not Workflow-script
|
|
41
|
+
logic.
|
|
42
|
+
|
|
43
|
+
## Run 2 — Build
|
|
44
|
+
|
|
45
|
+
Generate a separate Build run with its own named entry in `meta.phases`. For the
|
|
46
|
+
current reconciled batch, make one `agent()` call per slice with explicit
|
|
47
|
+
`model`, `effort`, and `phase` options and the inline builder schema. Preserve
|
|
48
|
+
the reconciled allowlist and required commands in each verbatim builder prompt;
|
|
49
|
+
the main thread still performs `semanticVerify` on every returned report.
|
|
50
|
+
|
|
51
|
+
Before each `agent()` call, resolve its provider-neutral Routing intent and pass
|
|
52
|
+
the decision through the shared spawn guard and active surface adapter. The
|
|
53
|
+
Claude adapter must attest Workflow model/effort precedence in the current
|
|
54
|
+
environment; a future Codex host may use this path only when its dated
|
|
55
|
+
`routingAdapters/codex.mjs` attestation proves the same controls. Create the
|
|
56
|
+
Dispatch receipt before invocation; any requested/applied mismatch, unverified
|
|
57
|
+
control, or unauthorized transport blocks AFK rather than silently degrading.
|
|
58
|
+
|
|
59
|
+
## Resume exactly once
|
|
60
|
+
|
|
61
|
+
Resume an interrupted Recon or Build run with its recorded `resumeFromRunId`
|
|
62
|
+
and the same deterministic `args`. Workflow returns cached results for completed
|
|
63
|
+
agents: accept those results and dispatch only unfinished calls. Never create a
|
|
64
|
+
replacement run for completed work, and never replay a completed builder. This
|
|
65
|
+
makes each builder phase execute exactly once while the retained
|
|
66
|
+
`journal.jsonl` remains the recovery and progress record.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Wave Report Contracts
|
|
2
|
+
|
|
3
|
+
`src/lib/reportValidator.mjs` is the source of truth. The JSON blocks below are
|
|
4
|
+
machine-checked mirrors for hosts that must inline a schema and cannot import the
|
|
5
|
+
module. Do not edit a block without changing the exported constant first.
|
|
6
|
+
|
|
7
|
+
## Recon report
|
|
8
|
+
|
|
9
|
+
Required fields: <!-- fields:recon -->sliceId, plannedFiles, dependencyEdges
|
|
10
|
+
|
|
11
|
+
`plannedFiles[].role` is `edit`, `consume`, or `sharedMutable`.
|
|
12
|
+
`dependencyEdges` records directed slice dependencies as `from`/`to` IDs.
|
|
13
|
+
|
|
14
|
+
<!-- schema:recon:start -->
|
|
15
|
+
```json
|
|
16
|
+
{"type":"object","required":["sliceId","plannedFiles","dependencyEdges"],"additionalProperties":false,"properties":{"sliceId":{"type":"string","pattern":"^[0-9]+$"},"plannedFiles":{"type":"array","items":{"type":"object","required":["path","role"],"additionalProperties":false,"properties":{"path":{"type":"string"},"role":{"type":"string","enum":["edit","consume","sharedMutable"]}}}},"dependencyEdges":{"type":"array","items":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"from":{"type":"string","pattern":"^[0-9]+$"},"to":{"type":"string","pattern":"^[0-9]+$"}}}}}}
|
|
17
|
+
```
|
|
18
|
+
<!-- schema:recon:end -->
|
|
19
|
+
|
|
20
|
+
## Builder report
|
|
21
|
+
|
|
22
|
+
Required fields: <!-- fields:builder -->status, filesTouched, testDecisions, commands, commitSha, stopItems, visualVerify
|
|
23
|
+
|
|
24
|
+
`status` discriminates the `oneOf`: PASS requires a full Git object ID and an
|
|
25
|
+
empty `stopItems`; STOP requires at least one stop item and permits a null SHA.
|
|
26
|
+
Schema validation intentionally accepts nonzero command exits. The orchestrator
|
|
27
|
+
must additionally call `semanticVerify` before accepting PASS.
|
|
28
|
+
|
|
29
|
+
<!-- schema:builder:start -->
|
|
30
|
+
```json
|
|
31
|
+
{"type":"object","required":["status","filesTouched","testDecisions","commands","commitSha","stopItems","visualVerify"],"additionalProperties":false,"properties":{"status":{"type":"string","enum":["pass","stop"]},"filesTouched":{"type":"array","items":{"type":"string"}},"testDecisions":{"type":"array","items":{"type":"string"}},"commands":{"type":"array","items":{"type":"object","required":["command","exitCode","summary"],"additionalProperties":false,"properties":{"command":{"type":"string"},"exitCode":{"type":"integer"},"summary":{"type":"string"}}}},"commitSha":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{40}$|^[0-9a-f]{64}$"},{"type":"null"}]},"stopItems":{"type":"array","items":{"type":"string"}},"visualVerify":{"type":"string"}},"oneOf":[{"required":["status","commitSha","stopItems"],"properties":{"status":{"const":"pass"},"commitSha":{"type":"string","pattern":"^[0-9a-f]{40}$|^[0-9a-f]{64}$"},"stopItems":{"type":"array","maxItems":0}}},{"required":["status","commitSha","stopItems"],"properties":{"status":{"const":"stop"},"commitSha":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{40}$|^[0-9a-f]{64}$"},{"type":"null"}]},"stopItems":{"type":"array","minItems":1}}}]}
|
|
32
|
+
```
|
|
33
|
+
<!-- schema:builder:end -->
|
|
34
|
+
|
|
35
|
+
## Semantic facts
|
|
36
|
+
|
|
37
|
+
Call `semanticVerify(report, { gitFacts, allowlist, requiredCommands })` with
|
|
38
|
+
independently collected Git facts: `objectFormat` (`sha1` or `sha256`), the
|
|
39
|
+
resolved `commitSha`, `baseIsAncestorOfCommit`, and `changedFiles`. The ancestry
|
|
40
|
+
fact means the integration base is an ancestor of the builder commit. The helper
|
|
41
|
+
verifies the full SHA against the repository object format and resolved commit, diff subset,
|
|
42
|
+
required command presence, command exits for PASS, and PASS/STOP exclusivity.
|
|
@@ -3,6 +3,12 @@ name: research
|
|
|
3
3
|
description: Investigate a question against high-trust primary sources and capture the findings as a Markdown file in the repo. Use when the user wants a topic researched, docs or API facts gathered, or reading legwork delegated to a background agent.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
Before dispatch, resolve a provider-neutral Routing intent through
|
|
7
|
+
`src/lib/routeDispatcher.mjs` and require a Dispatch receipt from the shared
|
|
8
|
+
spawn guard. A detected transport is not authorization; AFK dispatch stops
|
|
9
|
+
unless requested/applied route, model/effort enforcement, environment
|
|
10
|
+
precedence, and catalog/access/policy revisions are proved.
|
|
11
|
+
|
|
6
12
|
Spin up a **background agent** to do the research, so you keep working while it reads.
|
|
7
13
|
|
|
8
14
|
Its job:
|
|
@@ -87,8 +87,9 @@ skills — this skill only picks the entry point.
|
|
|
87
87
|
|
|
88
88
|
### Program (≥2 criteria)
|
|
89
89
|
|
|
90
|
-
A multi-wave undertaking: grill it once into a Program-PRD with a wave plan,
|
|
91
|
-
|
|
90
|
+
A multi-wave undertaking: grill it once into a Program-PRD with a wave plan,
|
|
91
|
+
then hand that explicit Program identity to the public Planning facade. The
|
|
92
|
+
facade unfolds the plan onto the board after a chat preview gate.
|
|
92
93
|
|
|
93
94
|
```
|
|
94
95
|
New program: <one-sentence outcome from Q2>.
|
|
@@ -97,10 +98,11 @@ Tripped altitude criteria: <e.g. C1 staged delivery, C2 multiple subsystems, C4
|
|
|
97
98
|
structure-bearing decisions (escalate a single bounded choice to `decision-gate`).
|
|
98
99
|
2. `to-prd` — it auto-detects the program mode from the Wellenplan chapter and writes
|
|
99
100
|
a Program-PRD (native anchor over the waves).
|
|
100
|
-
3. `to-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
3. `to-issues` — its explicit Program identity selects the internal graph path.
|
|
102
|
+
After one complete chat preview, materialize the whole Program with **all
|
|
103
|
+
waves execute-ready by default**: complete slice contracts, buckets,
|
|
104
|
+
dependencies and handoffs. Decision Gates, Verify Spikes and Design-Grill
|
|
105
|
+
waves are explicit planned exceptions; generic late-binding cleanup is not.
|
|
104
106
|
```
|
|
105
107
|
|
|
106
108
|
### Feature (0–1 criteria, or any doubt)
|
|
@@ -134,7 +136,7 @@ Bug: <what's broken — expected vs. actual>.
|
|
|
134
136
|
```
|
|
135
137
|
scale-check: verdict=<Program | Feature | Direct-Slice | Bug>
|
|
136
138
|
criteria tripped=<C1,C2,… | none | n/a (bug/direct)>
|
|
137
|
-
route=<program grill → to-prd → to-
|
|
139
|
+
route=<program grill → to-prd → to-issues (Program mode; all waves execute-ready by default) | grill-with-docs → to-prd → to-issues (Feature mode) | implement | diagnose>
|
|
138
140
|
start-prompt: <the paste-ready block above, filled in>
|
|
139
141
|
```
|
|
140
142
|
|
|
@@ -28,6 +28,7 @@ This is a prompt-driven skill, not a deterministic script. Explore, present what
|
|
|
28
28
|
| `docs/agents/census.md` | optional-census choice, paths, state, and safe disable contract seeded from [census.md](./census.md) (Section A3) |
|
|
29
29
|
| `docs/agents/workflow-capabilities.json` + capability assets | consumer-owned Worktree Lifecycle, Memory Lifecycle, Workflow Advisories, and Safety Guardrails choices (Sections A4–A7) |
|
|
30
30
|
| `.claude/settings.json` | additive activation of the advisory kit-origin Edit/Write hint (Section A8) |
|
|
31
|
+
| user-local routing profile | familiar agent surfaces + switching autonomy (Section A9; never package- or repository-owned) |
|
|
31
32
|
|
|
32
33
|
## Idempotency contract — read before writing anything
|
|
33
34
|
|
|
@@ -60,6 +61,9 @@ Read the current state; don't assume. For every target file, read its first line
|
|
|
60
61
|
- `docs/agents/census.md`, `.census/profile.json`, `.census/active.json` — an existing census choice or consumer-owned census to adopt.
|
|
61
62
|
- `docs/agents/workflow-capabilities.json`, `.claude/settings.json`, `git config --get core.hooksPath` — existing capability choices/profile plus Worktree Lifecycle, Workflow Advisories, Safety Guardrails, and kit-origin hint wiring to adopt.
|
|
62
63
|
- `.memory/active/`, `.memory/archive/`, and `.memory/receipts/` — consumer-owned Memory Lifecycle policies or recovery evidence to adopt without normalization.
|
|
64
|
+
- The Kit routing-profile preflight — adopt a valid user-local choice without
|
|
65
|
+
printing or copying it into the repository. Never infer personal routing
|
|
66
|
+
policy from instruction files, credentials, or package-owned metadata.
|
|
63
67
|
- `gh auth status` (if GitHub) — is `gh` authenticated, and with which scopes?
|
|
64
68
|
|
|
65
69
|
### 2. Section A — Issue tracker
|
|
@@ -280,6 +284,41 @@ This is an additive, idempotent settings edit, not a settings rewrite:
|
|
|
280
284
|
`PreToolUse`, are consumer-owned conflicts: leave the file untouched and
|
|
281
285
|
report the skipped activation. Never replace or normalize them.
|
|
282
286
|
|
|
287
|
+
### 2h. Section A9 — Agent surfaces and switching autonomy
|
|
288
|
+
|
|
289
|
+
> Routing setup asks which familiar agent apps you use and whether the Kit may
|
|
290
|
+
> switch between them. Surface adapters establish providers, transports,
|
|
291
|
+
> selectors, and enforcement capabilities; the default interview never asks
|
|
292
|
+
> the user to describe those technical facts.
|
|
293
|
+
|
|
294
|
+
Read the versioned agent-surface registry and detection result. Show its
|
|
295
|
+
multi-select labels with detected entries preselected; never embed a separate
|
|
296
|
+
list in prompt prose. Then ask only one plain-language autonomy question:
|
|
297
|
+
|
|
298
|
+
- **Switch automatically** — record `automatic`.
|
|
299
|
+
- **Ask before switching** — record `ask`.
|
|
300
|
+
- **Stay in the current app** — record `current-surface-only`.
|
|
301
|
+
|
|
302
|
+
When exactly one surface is selected, skip the autonomy question and use
|
|
303
|
+
`current-surface-only`. Show an activation summary with explicit **Back**,
|
|
304
|
+
**Advanced**, **Approve**, and **Safe current surface** actions. Back revisits
|
|
305
|
+
the simple choices. Advanced is the only flow that may collect model
|
|
306
|
+
preferences or optimization overrides, but those values remain a draft and
|
|
307
|
+
return to the activation summary; Advanced alone never writes. Only a later
|
|
308
|
+
Approve or Safe current surface action activates the draft. Safe current
|
|
309
|
+
surface activates the selection with `current-surface-only`.
|
|
310
|
+
|
|
311
|
+
Store the answer through `src/lib/routingProfile.mjs` in its user-local state
|
|
312
|
+
location, outside the consumer repository and package manifest. Never print
|
|
313
|
+
credentials or derive personal choices from detected transports. A valid
|
|
314
|
+
existing profile is terminal and reports `still valid`; do not prompt again.
|
|
315
|
+
Missing or invalid profiles receive one migration interview. Reconcile a
|
|
316
|
+
materially stale profile, a removed route, or a newly detected meaningful
|
|
317
|
+
surface with a typed delta that names only the changed choice and preserves
|
|
318
|
+
unaffected surfaces, autonomy, and advanced values. Re-read the profile before
|
|
319
|
+
activation and use its fingerprint plus the exclusive profile lock; a
|
|
320
|
+
concurrent user-local change blocks activation and remains byte-preserved.
|
|
321
|
+
|
|
283
322
|
### 3. Section B — Triage labels
|
|
284
323
|
|
|
285
324
|
> When `triage` processes an incoming issue it applies labels (or your tracker's equivalent). It needs strings you've actually configured, or it creates duplicates.
|
|
@@ -309,7 +348,14 @@ Seed `docs/agents/domain.md` from [domain.md](./domain.md).
|
|
|
309
348
|
|
|
310
349
|
**Fallback (the single catch-all — no board / >1 / ambiguous / scope error / read failure):** do **not** auto-create a board (`gh project create` alone cannot provision the Status options + workflow fields a board needs). Write `board-sync.md` with `state=stub`, `mode=github-projects-v2`, and inline **instructions**: which fields the workflow profile needs (a Status single-select with your stage options; optionally a Wave number, a Cluster text, a Spec-Path / Plan-Path text), how to create the board in the GitHub UI / `gh`, and "then run `/setup-workflow` again — it will discover and fill the IDs." Retryable.
|
|
311
350
|
|
|
312
|
-
**Optional — Phase field + saved Views (Program route only):** never
|
|
351
|
+
**Optional — Phase field + saved Views (Program route only):** never
|
|
352
|
+
auto-discovered or auto-created, unlike the fields above — a Phase field's
|
|
353
|
+
option set is plan-specific. If this project plans to use the Program route
|
|
354
|
+
(`scale-check` → `to-issues` with explicit Program identity → internal graph
|
|
355
|
+
validation), point the user at the seeded [board-sync.md](./board-sync.md)'s
|
|
356
|
+
"Optional: the Program route" section for the `gh project field-create`
|
|
357
|
+
command, the optional `fields.phase` / `labels.programType` profile keys, and
|
|
358
|
+
the two saved Views to create by hand.
|
|
313
359
|
|
|
314
360
|
### 6. Section E — Spec-layer seeds (non-interactive)
|
|
315
361
|
|
|
@@ -16,7 +16,7 @@ How the board-managed workflow skills (`to-prd`, `to-issues`, `board-to-waves`,
|
|
|
16
16
|
| Cluster | text | optional | thematic cluster tag |
|
|
17
17
|
| Spec-Path | text | optional | link from an issue to its spec doc |
|
|
18
18
|
| Plan-Path | text | optional | link from an issue to its plan doc |
|
|
19
|
-
| Phase | single-select | optional | groups waves into phases for the Program route (`to-
|
|
19
|
+
| Phase | single-select | optional | groups waves into phases for the Program route (`to-issues` Program mode / internal graph validation) — only needed if this project uses it |
|
|
20
20
|
|
|
21
21
|
## Machine profile (SSOT) — `scripts/board_config.py` reads this
|
|
22
22
|
|
|
@@ -112,7 +112,12 @@ their titles unchanged; set it once to match your board's language.
|
|
|
112
112
|
|
|
113
113
|
## Optional: the Program route (Phase field + saved Views)
|
|
114
114
|
|
|
115
|
-
Skip this section entirely unless this project actually plans to use the Program
|
|
115
|
+
Skip this section entirely unless this project actually plans to use the Program
|
|
116
|
+
route (`scale-check` → `to-issues` with explicit Program identity → internal
|
|
117
|
+
graph validation) — `fields.phase` / `labels.programType` are never
|
|
118
|
+
auto-discovered or auto-created (a Phase field's option set is plan-specific,
|
|
119
|
+
not something `/setup-workflow` can guess), and a profile without them keeps
|
|
120
|
+
loading unchanged.
|
|
116
121
|
|
|
117
122
|
1. **Create the Phase field:** `gh project field-create <number> --owner <owner> --name Phase --data-type SINGLE_SELECT --single-select-options "P1,P2,P3"` (name the options after this project's actual phases).
|
|
118
123
|
2. **Fill `fields.phase`** in the `<!-- board-sync:profile -->` block above with the same `{id, options}` shape as `fields.status` — read both back via `gh project field-list <number> --owner <owner> --format json`.
|
|
@@ -8,8 +8,7 @@ Use this section as the entry-point map for agent-assisted work. The individual
|
|
|
8
8
|
- **A new build whose size is unclear** (a new app, a big cross-cutting feature, an unclear where-to-start): run `scale-check` — a short plain-language dialog that routes it to a program, a feature, a single slice, or a bug, and hands back a paste-ready start prompt.
|
|
9
9
|
- **New capability or unclear change:** start with `grill-with-docs` when the domain language or decisions need sharpening, then publish the agreed shape with `to-prd`.
|
|
10
10
|
- **A slice hinges on an unresolved fact or trade-off before it can be built:** clear it first — a binary yes/no question against real code/runtime/platform with `verify-spike`, a bounded "which option" choice with `decision-gate`.
|
|
11
|
-
- **Existing plan, PRD, or ready issue:** use `to-issues
|
|
12
|
-
- **A Program-PRD with a wave plan:** use `to-waves` to unfold it into named wave stubs + slice leaves on the board, after a chat preview gate that shows the whole plan before any write.
|
|
11
|
+
- **Existing plan, PRD, or ready issue:** use `to-issues`, the single Planning facade. Explicit Feature identity selects tracer-bullet decomposition; explicit Program identity selects the internal graph path and its complete preview before any write.
|
|
13
12
|
- **A backlog of open issues needs clustering into themed waves:** use `board-to-waves`.
|
|
14
13
|
- **A whole wave anchor (file-disjoint slices, specs already locked) to build, verify and land end-to-end — often AFK:** use `orchestrate-wave` — it dispatches implementers per slice, integrates serially, verifies centrally, and lands. (A single slice just goes to `implement`.)
|
|
15
14
|
- **Bugs or requests piling up that you didn't create:** use `triage` to move them into agent-ready issues.
|