vinta-ai-workflows 0.2.0-alpha3 → 0.2.0-alpha5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/README.md +5 -2
  3. package/package.json +1 -1
  4. package/schemas/vinta-ai-workflows-config.v1.schema.json +57 -0
  5. package/skills/vinta-analyze-codebase/SKILL.md +1 -1
  6. package/skills/vinta-bootstrap-ai-tools/SKILL.md +37 -8
  7. package/skills/vinta-derive-skills/SKILL.md +92 -39
  8. package/skills/vinta-derive-skills/resources/foundation-skills/deslop-comments/SKILL.md +148 -0
  9. package/skills/vinta-derive-skills/resources/foundation-skills/handoff/SKILL.md +100 -0
  10. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/SKILL.md +39 -4
  11. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/scripts/claude-worktree-write-guard.py +118 -0
  12. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/scripts/gen-claude-sandbox-settings.sh +167 -0
  13. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/scripts/sandbox-run.sh +3 -1
  14. package/skills/vinta-derive-skills/resources/foundation-skills/thermo-nuclear-code-quality-review/SKILL.md +129 -0
  15. package/skills/vinta-derive-skills/resources/handoff-to-client-template.md +107 -0
  16. package/skills/vinta-derive-skills/resources/plan-execution/README.md +42 -0
  17. package/skills/vinta-derive-skills/resources/{implement-plan-template-modular-substitutions.md → plan-execution/partials/commit-strategy/modular.md} +38 -70
  18. package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/stacked.md +46 -0
  19. package/skills/vinta-derive-skills/resources/plan-execution/partials/implementer-prompt.md +78 -0
  20. package/skills/vinta-derive-skills/resources/plan-execution/partials/model-pick.md +19 -0
  21. package/skills/vinta-derive-skills/resources/plan-execution/partials/pr-context.md +61 -0
  22. package/skills/vinta-derive-skills/resources/plan-execution/partials/review-layers.md +50 -0
  23. package/skills/vinta-derive-skills/resources/plan-execution/partials/worktree-seam.md +68 -0
  24. package/skills/vinta-derive-skills/resources/{amend-plan-template.md → plan-execution/shell/amend-plan-template.md} +48 -42
  25. package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-phase-template.md +47 -0
  26. package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-plan-template.md +186 -0
  27. package/skills/vinta-derive-skills/resources/plan-execution/shell/integrate-phase-template.md +30 -0
  28. package/skills/vinta-derive-skills/resources/plan-execution/shell/review-phase-template.md +25 -0
  29. package/skills/vinta-derive-skills/resources/systematic-debugging-template.md +7 -3
  30. package/skills/vinta-update-project-skills/SKILL.md +1 -1
  31. package/skills/vinta-derive-skills/resources/implement-plan-template.md +0 -436
package/CHANGELOG.md CHANGED
@@ -7,6 +7,168 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ## [0.2.0] — YYYY-MM-DD
9
9
 
10
+ ### Added
11
+
12
+ <!-- pre-release: 0.2.0-alpha5 on 2026-07-13 -->
13
+
14
+ - **`handoff` foundation skill — session-continuation handoff docs between
15
+ agents.** Write mode captures the current task (goal, verified-vs-unverified
16
+ state, decisions + rejected alternatives, landmines, single concrete next
17
+ step) into `.vinta-ai-workflows/handoffs/{date}-{slug}.md`, gathering state
18
+ from the repo — never from memory; resume mode reads a handoff, verifies its
19
+ claims against the repo before trusting them, and continues from the doc's
20
+ next step. Ships at
21
+ [skills/vinta-derive-skills/resources/foundation-skills/handoff/SKILL.md](skills/vinta-derive-skills/resources/foundation-skills/handoff/SKILL.md).
22
+ Wired as an **always-ship** bucket-A skill: new
23
+ `foundation_skills.handoff` enum entry (schema), derive-skills bucket-A
24
+ table + always-ships note, bootstrap always-copy-verbatim list + outputs
25
+ tree + Step 0.5 YAML (`handoff: enabled`), and both foundation-shape
26
+ replace lists. No bootstrap interview question — it always ships.
27
+
28
+ - **`handoff-to-client` foundation skill — API-change handoff docs for
29
+ API-only repos (opt-in, template-rendered).** Generates a self-contained
30
+ markdown document for the client teams consuming the repo's API: every
31
+ endpoint/operation added / changed / deprecated / removed on the current
32
+ branch vs the default branch, with request/response shapes derived from the
33
+ code (or a regenerated API spec), auth/error changes, breaking-change flags
34
+ judged from the strictest plausible client, one realistic example per
35
+ operation, and per-platform migration notes. Template at
36
+ [skills/vinta-derive-skills/resources/handoff-to-client-template.md](skills/vinta-derive-skills/resources/handoff-to-client-template.md)
37
+ (bucket B + C). New schema fields: `foundation_skills.handoff-to-client`
38
+ enum entry and the `skills.handoff-to-client` config block
39
+ (`client_platforms` — required non-empty array, `api_style`,
40
+ `api_spec_path`, `output_dir` — default
41
+ `.vinta-ai-workflows/client-handoffs`). New template placeholders
42
+ `{{API_STYLE}}`, `{{CLIENT_PLATFORMS_LIST}}`, `{{CLIENT_HANDOFF_DIR}}`,
43
+ `{{API_SPEC_BLOCK}}` documented in the derive-skills placeholder table.
44
+ Bootstrap gains **Optional foundation skills question 7** (asked only when
45
+ the inventory suggests an API-only repo) plus a four-part config follow-up;
46
+ Step 0.5 YAML, outputs tree, optional-bucket lists, and both
47
+ foundation-shape replace lists updated. **Consumers**: API-only projects
48
+ re-sync + answer the new interview question to enable it.
49
+
50
+ <!-- pre-release: 0.2.0-alpha4 on 2026-07-08 -->
51
+
52
+ - **`implement-plan` outer-gate test scope is now configurable — and defaults
53
+ to the quick path.** Each phase's outer gate still always runs the repo-wide
54
+ type/build gate, but for tests it now runs **only the scoped suite** covering
55
+ the apps/files that phase touched by default, instead of the whole repo suite
56
+ every phase (new tests still pass individually in the inner loop). This
57
+ **flips the previous default** (full suite every phase → scoped) to make
58
+ multi-phase plans materially faster. Opt back into the full suite per run via
59
+ the new Step 0 question (d), or set the default in
60
+ `.vinta-ai-workflows.yaml` under
61
+ `run_options.implement-plan.full_test_suite: true`. New config field
62
+ (`run_options.implement-plan.full_test_suite`, boolean, default `false`);
63
+ threaded from the conductor into `implement-phase` (outer-gate marker in the
64
+ implementer prompt) and `review-phase` (Layer 1 verifies whichever gate the
65
+ flag selects); recorded in `TRACKING_{plan-id}.md` `run_options`.
66
+
67
+ - **`deslop-comments` foundation skill — Simple-English comment cleanup, now
68
+ part of the review flow.** Rewrites comments + doc blocks touched during a
69
+ task into Simple English (strips AI-slop vocabulary and negative framing;
70
+ comment-only — no renames, no behavior change). Ships at
71
+ [skills/vinta-derive-skills/resources/foundation-skills/deslop-comments/SKILL.md](skills/vinta-derive-skills/resources/foundation-skills/deslop-comments/SKILL.md).
72
+ Wired as an **always-ship** bucket-A skill (new
73
+ `foundation_skills.deslop-comments` enum, added to the derive-skills bucket-A
74
+ table + always-on note, the bootstrap always-copy-verbatim list + outputs
75
+ tree + Step 0.5 YAML, and both foundation-shape replace lists) because
76
+ `review-phase` now depends on it: **Layer 2 gains a comment-hygiene check**
77
+ and the **fix loop dispatches a `fixer` to run `deslop-comments`** on the
78
+ phase's touched files for any comment-slop finding. Also invokable
79
+ standalone ("deslop these comments"). **Consumers**: re-sync to pick up the
80
+ skill and the `review-phase` comment-hygiene step.
81
+
82
+ - **`thermo-nuclear-code-quality-review` foundation skill — opt-in deep
83
+ structural-maintainability audit.** A deliberately harsh, on-demand review
84
+ of a diff (abstraction quality, giant files, spaghetti-condition growth)
85
+ that hunts for "code-judo" reframes collapsing whole branches / helpers /
86
+ modes / layers rather than polishing them. Copy-verbatim foundation skill
87
+ (bucket A), read-only — it reports findings and hands each fix to the
88
+ `fixer` agent. Ships at
89
+ [skills/vinta-derive-skills/resources/foundation-skills/thermo-nuclear-code-quality-review/SKILL.md](skills/vinta-derive-skills/resources/foundation-skills/thermo-nuclear-code-quality-review/SKILL.md).
90
+ Wired as **opt-in / ask-first**: new `foundation_skills.thermo-nuclear-code-quality-review`
91
+ enum in `schemas/vinta-ai-workflows-config.v1.schema.json`, a new
92
+ question 6 in the bootstrap **Optional foundation skills** interview, and
93
+ the derive-skills bucket-A + foundation-shape lists. The `review-phase`
94
+ Layer 3 reviewer now applies a **condensed structural-simplification lens**
95
+ on every phase and escalates to this full audit only when a phase touches
96
+ core architecture, crosses ~1,000 lines, or surfaces a structural smell too
97
+ big to resolve inline — the deep pass never auto-runs on every diff.
98
+ **Consumers**: re-sync; the bootstrap now asks one more optional-skill
99
+ question, and `review-phase` gains the escalation hook.
100
+
101
+ - **`prepare-worktree` — write-guard for *in-process* subagent runtimes
102
+ (claude-code's Task tool).** `sandbox-run.sh` confines a *process*, so it
103
+ only works when the harness spawns subagents as subprocesses (`codex exec`,
104
+ a `claude -p` child). Claude Code runs subagents in-process — same OS
105
+ process, same tool pipeline, no child command to wrap — so a new
106
+ harness-config guard covers it instead. Two bundled scripts:
107
+ `prepare-worktree/scripts/claude-worktree-write-guard.py` (a `PreToolUse`
108
+ hook that fires for the orchestrator **and** every in-process Task subagent,
109
+ blocking the file-editing tools — `Edit`/`Write`/`MultiEdit`/`NotebookEdit`
110
+ — from writing outside the worktree; filesystem-only, no network impact) and
111
+ `prepare-worktree/scripts/gen-claude-sandbox-settings.sh` (generates the
112
+ worktree's `.claude/settings.json` wiring that hook, and optionally
113
+ Claude Code's **native** OS sandbox via `sandbox.filesystem.denyWrite`/
114
+ `allowWrite` under `--os-sandbox` to also block Bash-issued writes — noting
115
+ the native sandbox forces network isolation, so registry + git-remote hosts
116
+ must be allow-listed via `--allow-domain`). Same deny-main/allow-rest model
117
+ as `sandbox-run.sh`. Step 5.5 of `prepare-worktree` gains an *In-process
118
+ runtimes (claude-code)* subsection; `implement-plan` §1c makes the
119
+ previously hand-wavy "in-process runtime" branch concrete. **Consumers**:
120
+ re-sync `prepare-worktree` + `implement-plan` — the two new scripts ship
121
+ with the foundation-skill dir.
122
+
123
+ ### Fixed
124
+
125
+ - **`prepare-worktree/scripts/sandbox-run.sh` — two correctness bugs.**
126
+ (1) The macOS profile temp file used `mktemp -t vinta-sandbox`, which fails
127
+ with "too few X's in template" under GNU `mktemp` (present on any machine
128
+ with coreutils on `PATH`, including many macOS setups) — the whole sandbox
129
+ path errored out; now uses an explicit `…/vinta-sandbox.XXXXXX` template
130
+ portable across BSD + GNU `mktemp`. (2) Callers must now pass
131
+ `--allow <main>/.git`: git worktrees write every commit into the main repo's
132
+ `.git` (`.git/worktrees/<name>/index.lock`, shared objects/refs), so a
133
+ deny-main that omits it made the subagent's own `git commit` fail with
134
+ `Operation not permitted`. `implement-plan` §1c's documented invocation +
135
+ checklist + rules are updated to include `<main>/.git` in the allow-set.
136
+
137
+ ### Changed
138
+
139
+ - **`implement-plan` / `amend-plan` decomposed into a modular "plan-execution
140
+ unit" of deterministic sub-skills.** The single ~440-line
141
+ `implement-plan-template.md` (and its `implement-plan-template-modular-substitutions.md`
142
+ sister file) are replaced by a thin **conductor** plus three co-shipped
143
+ single-purpose sub-skills, all rendered from
144
+ [skills/vinta-derive-skills/resources/plan-execution/](skills/vinta-derive-skills/resources/plan-execution/)
145
+ (`shell/` templates that `<!-- include -->` shared `partials/`):
146
+ - `implement-plan` — conductor: parse → classify → resolve one `WORKROOT`
147
+ → per-phase loop (dispatch) → track → report.
148
+ - `implement-phase` — compose prompt + pick model + spawn the implementer.
149
+ - `review-phase` — the three-layer review + fix loop, now shared by
150
+ `implement-plan`, `amend-plan`, **and** `systematic-debugging` (one review
151
+ implementation instead of three).
152
+ - `integrate-phase` — push + open PR via context file, rendered
153
+ commit-strategy-resolved.
154
+ The scattered runtime `if use_worktree` branches collapse into a single
155
+ `WORKROOT` / `BASE_BRANCH` / `SANDBOX_TIER` seam the conductor resolves once
156
+ and passes to every sub-skill as data; only two local, data-driven checks
157
+ remain (the sandbox spawn-wrap in `implement-phase`, the stray-write
158
+ backstop in `review-phase`). Under `commit_strategy = ask`, the former
159
+ dual-rendered branch/commit/PR bodies become **two** rendered
160
+ `integrate-phase-stacked` / `integrate-phase-modular` skills the conductor
161
+ dispatches by name — no more both-paths-in-one-file. `amend-plan` reuses
162
+ `review-phase` verbatim + the shared inner/outer verification loop, and
163
+ picks up the same `WORKROOT` uniformity, while keeping its own
164
+ history-rewriting topology. **Consumers**: re-sync — the target now gets
165
+ five plan-execution SKILL.md files (`implement-plan`, `implement-phase`,
166
+ `review-phase`, `integrate-phase` [or the two `ask` variants], `amend-plan`)
167
+ instead of two. The three new sub-skills are a co-shipped unit: always
168
+ generated with `implement-plan`, not individually opt-in (no new
169
+ `foundation_skills` enum entry, no new interview question). Runtime
170
+ behavior is unchanged; the decomposition is for reviewability + determinism.
171
+
10
172
  <!-- pre-release: 0.2.0-alpha3 on 2026-06-23 -->
11
173
 
12
174
  ### Added
package/README.md CHANGED
@@ -222,8 +222,11 @@ Land at `ai-tools/skills/<name>/SKILL.md`. Always-on unless flagged optional.
222
222
  | [`plan-feature`](skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md) | always | Phased delivery plan from the matching spec → `ai-plans/YYYY-MM-DD-FEATURE_NAME_PLAN.md`. |
223
223
  | [`create-qa-use-cases`](skills/vinta-derive-skills/resources/foundation-skills/create-qa-use-cases/SKILL.md) | always | Bootstrap `QA_USE_CASES.md` from the active spec / plan. Called by `plan-feature` when missing. |
224
224
  | [`open-pr-from-context`](skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/SKILL.md) | always | Publish a `.vinta-ai-workflows/prs-context/<feature>/<phase>.md` file as a real PR + inline comments via `gh` / `glab`. Bundles [`open-pr.sh`](skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/scripts/open-pr.sh). |
225
- | `implement-plan` | always (generated) | Phase-by-phase plan execution. Generated from a template with project commands + branch / PR / co-author policy. |
226
- | `amend-plan` | always (generated) | History-rewriting companion to `implement-plan` — revises in-flight plans, amends prior-phase commits, force-pushes, rebases stacked downstream branches. |
225
+ | `implement-plan` | always (generated) | Phase-by-phase plan execution. Thin **conductor**: parses the plan, resolves one `WORKROOT`, and runs a fixed pipeline per phase (`implement-phase` → `review-phase` → `integrate-phase`), tracking + reporting. Generated from a template with project commands + branch / PR / co-author policy. |
226
+ | `implement-phase` | always (unit) | Plan-execution sub-skill co-shipped with `implement-plan`: compose the implementer prompt, pick the model, spawn one implementer subagent for a single phase. |
227
+ | `review-phase` | always (unit) | Plan-execution sub-skill: the three-layer review (mechanical / plan-compliance / independent reviewer) + fix loop. Shared by `implement-plan`, `amend-plan`, and `systematic-debugging`. |
228
+ | `integrate-phase` | always (unit) | Plan-execution sub-skill: push the reviewed phase along the project's commit strategy + open the PR via context file. Under `commit_strategy = ask`, ships as `integrate-phase-stacked` + `integrate-phase-modular`. |
229
+ | `amend-plan` | always (generated) | History-rewriting companion to `implement-plan` — revises in-flight plans, amends prior-phase commits, force-pushes, rebases stacked downstream branches. Reuses `review-phase` + `implement-phase`'s shared prompt loop. |
227
230
  | `systematic-debugging` | **opt-in** | Root-cause-first debugging with project-specific repro commands + MCP evidence-gathering (error tracking, traces, logs, metrics, alerts). Renders from a catalogue of observability MCP servers the user declares. |
228
231
  | `add-e2e-test` | **opt-in** | Add an e2e test. Body covers e2e framework, page-object pattern, auth/storage-state, seed helpers, tenant scoping, screenshot conventions. |
229
232
  | `add-env-var` | **opt-in** | Propagate a new env var through every layer (`.env.example`, build tool envPrefix, build cache hash, app config, AGENTS.md, CI, deploy injection). |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vinta-ai-workflows",
3
- "version": "0.2.0-alpha3",
3
+ "version": "0.2.0-alpha5",
4
4
  "description": "Bootstrap AI tooling (AGENTS.md, skills, sub-agents) across Claude Code, Codex, Cursor, and VS Code + GitHub Copilot.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -212,6 +212,26 @@
212
212
  "description": "Provision a fully-runnable git worktree for parallel feature work — symlinks dep dirs, copies env files, forks dev / test DBs, namespaces docker-compose project + network, drops a summary YAML for mechanical teardown. Copy-verbatim foundation skill (bucket A). When `enabled`, project-level defaults (worktree root, deps strategy, compose network strategy) live under `skills.prepare-worktree`. Consumed by `implement-plan` when its Step 0 question (c) opts in — the orchestrator runs `prepare-worktree` once at the start of a plan run and threads the worktree path through every subagent's prompt so phases all stack inside the same isolated checkout.",
213
213
  "type": "string",
214
214
  "enum": ["enabled", "disabled"]
215
+ },
216
+ "thermo-nuclear-code-quality-review": {
217
+ "description": "Opt-in deep structural-maintainability audit of a diff — abstraction quality, giant files, spaghetti-condition growth — harsher than the standard per-phase review. Copy-verbatim foundation skill (bucket A). Read-only; hands each fix to the `fixer` agent. Invoked deliberately by the user, or escalated from the `review-phase` Layer 3 structural-simplification lens; never auto-run on every diff.",
218
+ "type": "string",
219
+ "enum": ["enabled", "disabled"]
220
+ },
221
+ "deslop-comments": {
222
+ "description": "Rewrite comments and doc blocks touched during the current task into Simple English — strip AI-slop vocabulary and negative framing, comment-only (no renames, no behavior change). Copy-verbatim foundation skill (bucket A), always shipped: the `review-phase` Layer 2 comment-hygiene check and fix loop depend on it. Set `disabled` only if a project deliberately opts out of the review flow's comment-hygiene step.",
223
+ "type": "string",
224
+ "enum": ["enabled", "disabled"]
225
+ },
226
+ "handoff": {
227
+ "description": "Write or consume a session-continuation handoff document under `.vinta-ai-workflows/handoffs/` so a fresh agent session (or a different agent / teammate) can resume in-flight work without re-deriving context. Copy-verbatim foundation skill (bucket A), always shipped — its body is fully project-agnostic. Set `disabled` only if a project deliberately opts out.",
228
+ "type": "string",
229
+ "enum": ["enabled", "disabled"]
230
+ },
231
+ "handoff-to-client": {
232
+ "description": "Generate a markdown API-change handoff document for client teams consuming an API-only repo — endpoints added/changed/deprecated/removed on the current branch vs the default branch, with request/response shapes, breaking-change flags, and per-platform migration notes. Template-rendered (bucket B) from `vinta-derive-skills/resources/handoff-to-client-template.md` and opt-in (bucket C) — only ships when the bootstrap interview confirms an API-only repo with separate client codebases. When `enabled`, project-level configuration lives under `skills.handoff-to-client` (client platforms, API style, spec path, output dir).",
233
+ "type": "string",
234
+ "enum": ["enabled", "disabled"]
215
235
  }
216
236
  }
217
237
  },
@@ -250,6 +270,11 @@
250
270
  "properties": {
251
271
  "pause_between_phases": { "type": "boolean", "default": false },
252
272
  "generate_inline_comments": { "type": "boolean", "default": false },
273
+ "full_test_suite": {
274
+ "description": "Default answer to Step 0 question (d) — what each phase's outer gate runs for tests. False (default) = quick path: the outer gate runs only the scoped test suite covering the apps/files the phase touched (new tests still pass individually in the inner loop). True = run the full repo test suite in every phase's outer gate, guarding against regressions in untouched code at the cost of slower phases. The repo-wide type/build gate runs every phase either way. Per-run prompt still asks; this is the suggested default shown.",
275
+ "type": "boolean",
276
+ "default": false
277
+ },
253
278
  "use_worktree": {
254
279
  "description": "Default answer to Step 0 question (c) — whether `implement-plan` should provision an isolated git worktree (via `prepare-worktree`) and run every phase's subagent inside it. False = run in the current checkout. True = create one shared worktree at the start of the plan run; all phase branches stack inside it. Per-run prompt still asks; this is the suggested default shown.",
255
280
  "type": "boolean",
@@ -303,6 +328,38 @@
303
328
  }
304
329
  }
305
330
  },
331
+ "handoff-to-client": {
332
+ "description": "Configuration for the `handoff-to-client` foundation skill. Required when `foundation_skills.handoff-to-client` is `enabled`; ignored otherwise. Rendered into the skill body at derive time.",
333
+ "type": "object",
334
+ "required": ["client_platforms"],
335
+ "additionalProperties": false,
336
+ "properties": {
337
+ "client_platforms": {
338
+ "description": "Free-form list of the client codebases/platforms that consume this repo's API, as the team names them (e.g. `iOS (Swift)`, `Android (Kotlin)`, `web SPA (React)`, `partner integrations`). Rendered into the skill's audience line and per-operation migration-notes instruction. Must be non-empty — an API-only repo with no named consumers has no handoff audience.",
339
+ "type": "array",
340
+ "items": { "type": "string", "minLength": 1 },
341
+ "uniqueItems": true,
342
+ "minItems": 1
343
+ },
344
+ "api_style": {
345
+ "description": "The API paradigm, free-form (e.g. `REST`, `GraphQL`, `gRPC`, `REST + webhooks`). Drives how the rendered skill names operations (method+path vs query/mutation vs service/rpc).",
346
+ "type": "string",
347
+ "minLength": 1,
348
+ "default": "REST"
349
+ },
350
+ "api_spec_path": {
351
+ "description": "Repo-relative path to a machine-readable API spec (OpenAPI file, GraphQL schema, proto dir) plus, ideally, the command that regenerates it — e.g. `docs/openapi.yaml (regenerate: make openapi)`. When set, the rendered skill diffs the regenerated spec between base and branch as its primary change-enumeration source. Omit when no spec exists; the skill then works from route/serializer code alone.",
352
+ "type": "string",
353
+ "minLength": 1
354
+ },
355
+ "output_dir": {
356
+ "description": "Directory where generated client-handoff documents land, repo-relative.",
357
+ "type": "string",
358
+ "minLength": 1,
359
+ "default": ".vinta-ai-workflows/client-handoffs"
360
+ }
361
+ }
362
+ },
306
363
  "prepare-worktree": {
307
364
  "description": "Configuration for the `prepare-worktree` foundation skill. Optional when `foundation_skills.prepare-worktree` is `enabled` — every field has a sensible default. Consumed by the skill at runtime to bias the per-worktree symlink-vs-copy-vs-fork decisions.",
308
365
  "type": "object",
@@ -155,7 +155,7 @@ This is a load-bearing input for the rest of the bootstrap flow — surface ever
155
155
  For each skill, also classify:
156
156
 
157
157
  - `vinta-managed` — directory name starts with `vinta-` (installed by `vinta-ai-workflows`; can be left alone or refreshed via that CLI).
158
- - `foundation-shape` — name matches the Vinta foundation set (`plan-feature`, `create-spec`, `create-qa-use-cases`, `implement-plan`, `add-e2e-test`, `add-env-var`).
158
+ - `foundation-shape` — name matches the Vinta foundation set (`plan-feature`, `create-spec`, `create-qa-use-cases`, `implement-plan`, `implement-phase`, `review-phase`, `integrate-phase`, `amend-plan`, `add-e2e-test`, `add-env-var`). `implement-phase` / `review-phase` / `integrate-phase` are the plan-execution sub-skills co-shipped with `implement-plan`.
159
159
  - `project-custom` — anything else; written by the team.
160
160
 
161
161
  **Sub-agents** — list every agent file with its name + description:
@@ -83,7 +83,7 @@ These bleed across sub-skills, so capture once now:
83
83
 
84
84
  ### D. Optional foundation skills
85
85
 
86
- Five skills are part of the foundation set but aren't always needed. Ask explicitly:
86
+ Seven skills are part of the foundation set but aren't always needed. Ask explicitly:
87
87
 
88
88
  1. **`add-e2e-test`** — does the project have e2e tests (Playwright / Cypress / similar) or plan to add them? `AskUserQuestion` options: `Yes — already has them`, `Yes — planning to add`, `No — skip`. If yes, [vinta-derive-skills](../vinta-derive-skills/SKILL.md)'s **Optional — ask the user** bucket follows up to ask whether the user has a template or wants to draft from scratch. **This answer also governs `create-qa-use-cases` and the e2e content inside `plan-feature`**: on `No — skip`, set `foundation_skills.create-qa-use-cases: disabled` too — derive-skills won't ship `create-qa-use-cases` and strips `plan-feature`'s `<!-- e2e:start/end -->` regions so no-e2e projects carry zero Playwright / `QA_USE_CASES.md` / `pr-screenshots/` references. On either `Yes`, set both `add-e2e-test` and `create-qa-use-cases` to `enabled`.
89
89
  2. **`add-env-var`** — does the project have a non-trivial env-var propagation flow (multiple files / build configs / CI updates per new var) or a single `.env` file is enough? `AskUserQuestion` options: `Yes — non-trivial flow`, `No — single .env is enough`. Skip if `No`.
@@ -112,7 +112,17 @@ Five skills are part of the foundation set but aren't always needed. Ask explici
112
112
  - Do **not** seed the cache file at bootstrap. The first debug run preflights all configured servers and writes the file then. An empty / missing `.vinta-ai-workflows/cache.yaml` is a valid initial state.
113
113
  - Mention to the user how to refresh: delete the file to re-preflight everything, or edit one entry's `status` to `dirty` to refresh that one server. Token rotated → cache will catch the auth error on the next call and flip the entry to `dirty` automatically.
114
114
 
115
- If the user answers "No" to any of the five, that skill won't ship. If the user answers "Yes" to `add-e2e-test` / `add-env-var` but doesn't have a template, derive-skills drafts one via interview. `systematic-debugging` is always template-rendered — no per-project drafting interview, just the MCP-server inventory above. `add-one-off-script` is copied verbatim from [vinta-derive-skills/resources/foundation-skills/add-one-off-script/](../vinta-derive-skills/resources/foundation-skills/add-one-off-script/) — its body is project-agnostic; the per-project variability lives in the `skills.add-one-off-script.*` config block above and in env vars consumed at runtime. `prepare-worktree` is also copied verbatim from [vinta-derive-skills/resources/foundation-skills/prepare-worktree/](../vinta-derive-skills/resources/foundation-skills/prepare-worktree/) — same pattern: project-agnostic body, per-project defaults under `skills.prepare-worktree.*`.
115
+ 6. **`thermo-nuclear-code-quality-review`** — does the team want an opt-in, deliberately harsh structural-maintainability audit available on demand (abstraction quality, giant files, spaghetti-condition growth), separate from the standard per-phase review? `AskUserQuestion` options: `Yes — enable`, `No — skip`. Recommend `Yes` for long-lived codebases where structural drift is a real cost, or teams that already run deep quality passes before merging large work. It ships as a user-invoked skill and is also the escalation target for the `review-phase` Layer 3 structural-simplification lens; it is never auto-run on every diff. No follow-up config — the body is project-agnostic.
116
+
117
+ 7. **`handoff-to-client`** — is this an API-only repo whose consumers live in separate client codebases (mobile apps, SPAs, partner integrations) that need API changes documented for them? Ask **only when the inventory suggests an API-only shape** — backend framework with no co-located frontend app (no SPA package, no templates-rendered UI beyond an admin). `AskUserQuestion` options: `Yes — enable`, `No — skip`. Skip the question entirely (set `disabled`) for full-stack repos and monorepos that contain their own clients — there the API diff is visible to the client code in the same PR. When enabled, agents can generate a markdown API-change handoff document (endpoints added / changed / deprecated / removed vs the default branch, request/response shapes, breaking-change flags, per-platform migration notes) for client implementers who cannot read this repo.
118
+
119
+ **Follow-up only when `handoff-to-client` = Yes — client-handoff config.** Four short questions land under `skills.handoff-to-client.*`:
120
+ - **Client platforms.** Open prose → free-form string array, e.g. `iOS (Swift)`, `Android (Kotlin)`, `web SPA (React)`, `partner integrations`. Required, non-empty — this is the document's audience and drives the per-operation migration-notes sections.
121
+ - **API style.** `AskUserQuestion`: `REST`, `GraphQL`, `gRPC`, other (free-form). Auto-pick from the inventory when unambiguous (e.g. DRF routers → REST, graphene/strawberry → GraphQL); ask only when mixed.
122
+ - **API spec path.** Open prose. Repo-relative path to a machine-readable spec (OpenAPI file, GraphQL schema, proto dir) plus the command that regenerates it, if one exists (e.g. `docs/openapi.yaml (regenerate: make openapi)`). Cross-check the inventory for spec files the user forgot. Empty is fine — the rendered skill then enumerates changes from route/serializer code alone.
123
+ - **Output dir.** Default `.vinta-ai-workflows/client-handoffs`. Override if the team wants handoffs committed (e.g. `docs/api-changes/`) — note that the default lives under the gitignored `.vinta-ai-workflows/`, so docs there must be shared manually.
124
+
125
+ If the user answers "No" to any of the seven, that skill won't ship. If the user answers "Yes" to `add-e2e-test` / `add-env-var` but doesn't have a template, derive-skills drafts one via interview. `systematic-debugging` is always template-rendered — no per-project drafting interview, just the MCP-server inventory above. `add-one-off-script` is copied verbatim from [vinta-derive-skills/resources/foundation-skills/add-one-off-script/](../vinta-derive-skills/resources/foundation-skills/add-one-off-script/) — its body is project-agnostic; the per-project variability lives in the `skills.add-one-off-script.*` config block above and in env vars consumed at runtime. `prepare-worktree` is also copied verbatim from [vinta-derive-skills/resources/foundation-skills/prepare-worktree/](../vinta-derive-skills/resources/foundation-skills/prepare-worktree/) — same pattern: project-agnostic body, per-project defaults under `skills.prepare-worktree.*`. `thermo-nuclear-code-quality-review` is copied verbatim from [vinta-derive-skills/resources/foundation-skills/thermo-nuclear-code-quality-review/](../vinta-derive-skills/resources/foundation-skills/thermo-nuclear-code-quality-review/) with no follow-up config — its body is fully project-agnostic. `handoff-to-client` is always template-rendered from [vinta-derive-skills/resources/handoff-to-client-template.md](../vinta-derive-skills/resources/handoff-to-client-template.md) — no per-project drafting interview, just the client-handoff config follow-up above.
116
126
 
117
127
  ### E. Existing AI artifacts (per-artifact disposition)
118
128
 
@@ -132,7 +142,7 @@ For each artifact, read it (frontmatter + body), then ask the user via `AskUserQ
132
142
  - `Keep in current vendor path, don't touch` — leaves it where it is. AGENTS.md may reference it; downstream skill setup won't manage it.
133
143
  - `Drop` — delete (rare; usually the user wants to migrate).
134
144
 
135
- Foundation-shape skills (name matches `plan-feature`, `create-spec`, `create-qa-use-cases`, `implement-plan`, `add-e2e-test`, `add-env-var`, `add-one-off-script`, `prepare-worktree`) get an extra option: `Replace with Vinta foundation version` — overwrites with the canonical foundation content, preserving the user's name. Useful when the existing version is stale.
145
+ Foundation-shape skills (name matches `plan-feature`, `create-spec`, `create-qa-use-cases`, `implement-plan`, `implement-phase`, `review-phase`, `integrate-phase`, `amend-plan`, `add-e2e-test`, `add-env-var`, `add-one-off-script`, `prepare-worktree`, `thermo-nuclear-code-quality-review`, `deslop-comments`, `handoff`, `handoff-to-client`) get an extra option: `Replace with Vinta foundation version` — overwrites with the canonical foundation content, preserving the user's name. Useful when the existing version is stale. (`implement-phase` / `review-phase` / `integrate-phase` are the plan-execution sub-skills co-shipped with `implement-plan`; replace them as a unit.)
136
146
 
137
147
  - **Sub-agents** (each under any vendor `agents/` dir):
138
148
  - `Migrate to ai-tools/agents/<name>.yaml` — converts vendor-specific format → canonical YAML; `setup-ai-tools.mjs` re-emits per-vendor copies.
@@ -250,6 +260,10 @@ foundation_skills:
250
260
  systematic-debugging: <Optional foundation skills → systematic-debugging answer → enabled | disabled>
251
261
  add-one-off-script: <Optional foundation skills → add-one-off-script answer → enabled | disabled>
252
262
  prepare-worktree: <Optional foundation skills → prepare-worktree answer → enabled | disabled>
263
+ thermo-nuclear-code-quality-review: <Optional foundation skills → thermo-nuclear-code-quality-review answer → enabled | disabled>
264
+ deslop-comments: enabled # always ships — review-phase Layer 2 comment-hygiene + fix loop depend on it
265
+ handoff: enabled # always ships — project-agnostic session-continuation handoff docs
266
+ handoff-to-client: <Optional foundation skills → handoff-to-client answer → enabled | disabled; only asked for API-only repos>
253
267
 
254
268
  foundation_agents:
255
269
  implementer: enabled
@@ -263,6 +277,7 @@ run_options:
263
277
  implement-plan:
264
278
  pause_between_phases: false
265
279
  generate_inline_comments: false
280
+ full_test_suite: false # default: each phase's outer gate runs scoped tests only; set true to run the full suite every phase
266
281
  use_worktree: <Optional foundation skills → prepare-worktree follow-up → default for Step 0 question (c); false unless team opted in>
267
282
  amend-plan:
268
283
  blast_radius_signal_threshold: 2
@@ -272,6 +287,13 @@ skills:
272
287
  systematic-debugging:
273
288
  observability_mcp_servers: <systematic-debugging follow-up — free-form array of MCP server identifiers, e.g. [sentry, datadog, our-internal-traces]>
274
289
 
290
+ # Only emit this block when foundation_skills.handoff-to-client = enabled.
291
+ handoff-to-client:
292
+ client_platforms: <handoff-to-client follow-up — free-form array, e.g. [iOS (Swift), Android (Kotlin), web SPA (React)]>
293
+ api_style: <handoff-to-client follow-up — REST | GraphQL | gRPC | free-form>
294
+ api_spec_path: <handoff-to-client follow-up — repo-relative spec path + regen command; omit when none>
295
+ output_dir: .vinta-ai-workflows/client-handoffs
296
+
275
297
  # Only emit this block when foundation_skills.prepare-worktree = enabled.
276
298
  prepare-worktree:
277
299
  worktree_root: <prepare-worktree follow-up — `.claude/worktrees` | `../<repo>-wt-`>
@@ -340,17 +362,24 @@ ai-tools/
340
362
  │ ├── plan-feature/SKILL.md ← always (copied verbatim from derive-skills resources)
341
363
  │ ├── create-spec/SKILL.md ← always (copied verbatim)
342
364
  │ ├── create-qa-use-cases/SKILL.md ← always (copied verbatim)
343
- │ ├── implement-plan/SKILL.md ← always (generated from template, project-specific)
344
- │ ├── amend-plan/SKILL.md ← always (generated from template, project-specific)
365
+ │ ├── deslop-comments/SKILL.md ← always (copied verbatim; review-phase Layer 2 comment-hygiene + fix loop depend on it)
366
+ │ ├── handoff/SKILL.md ← always (copied verbatim; session-continuation handoff docs under .vinta-ai-workflows/handoffs/)
367
+ │ ├── implement-plan/SKILL.md ← always (conductor; generated from template, project-specific)
368
+ │ ├── implement-phase/SKILL.md ← always (plan-execution unit; co-shipped with implement-plan)
369
+ │ ├── review-phase/SKILL.md ← always (plan-execution unit; shared by implement-plan / amend-plan / systematic-debugging)
370
+ │ ├── integrate-phase/SKILL.md ← always (plan-execution unit; push + PR. Under commit_strategy=ask: integrate-phase-stacked/ + integrate-phase-modular/ instead)
371
+ │ ├── amend-plan/SKILL.md ← always (conductor; generated from template, project-specific)
345
372
  │ ├── add-e2e-test/SKILL.md ← optional — only if user opts in
346
373
  │ ├── add-env-var/SKILL.md ← optional — only if user opts in
347
374
  │ ├── systematic-debugging/SKILL.md ← optional — only if user opts in (template-rendered)
375
+ │ ├── handoff-to-client/SKILL.md ← optional — only for API-only repos, if user opts in (template-rendered; config under skills.handoff-to-client.*)
348
376
  │ ├── add-one-off-script/ ← optional — only if user opts in (verbatim copy + bundled BaseOneOffScript + LocalRuntime templates)
349
377
  │ │ ├── SKILL.md
350
378
  │ │ └── resources/
351
379
  │ │ ├── one_off_script_base.py
352
380
  │ │ └── one_off_script_base.ts
353
381
  │ ├── prepare-worktree/SKILL.md ← optional — only if user opts in (verbatim copy; project-agnostic body, defaults under skills.prepare-worktree.*)
382
+ │ ├── thermo-nuclear-code-quality-review/SKILL.md ← optional — only if user opts in (verbatim copy; deep structural-maintainability audit, escalation target for review-phase Layer 3)
354
383
  │ ├── run-one-off-script-django/ ← optional sister skill — only when stack matches + user supplies template (authors Jupyter notebook / mgmt command runner + JupyterRuntime / DjangoMgmtRuntime adapter in the per-script folder)
355
384
  │ ├── run-one-off-script-medplum/ ← optional sister skill — only when stack matches + user supplies template (authors Medplum bot + MedplumBotRuntime adapter in the per-script folder)
356
385
  │ └── <stack-specific skills>/SKILL.md ← only if user supplied templates
@@ -379,9 +408,9 @@ Plus the symlinks + per-vendor generated files, set up by the install step.
379
408
 
380
409
  Foundation skills break into three buckets — see [vinta-derive-skills](../vinta-derive-skills/SKILL.md) for the full mechanics:
381
410
 
382
- - **Always copy verbatim**: `plan-feature`, `create-spec`, `create-qa-use-cases`. Bundled with the bootstrap skill set; project-agnostic enough to ship as-is (with light path scrubs).
383
- - **Always generate**: `implement-plan`, `amend-plan`. Bodies have too much project-specific content (test commands, branch convention, PR + co-author policy, agent dispatch) — generated from parameterized templates using interview answers + inventory.
384
- - **Optional, ask first**: `add-e2e-test`, `add-env-var`, `systematic-debugging`, `add-one-off-script`, `prepare-worktree`. Skipped by default; orchestrator asks via `AskUserQuestion` whether the project has the relevant flow at all. `add-e2e-test` / `add-env-var`: if yes + user has a template → copy + adapt; if yes + no template → draft from scratch via interview; if no → don't ship. `systematic-debugging`: if yes → render the bundled template plus the per-tool MCP catalogue blocks for the observability tools selected in its follow-up; if no → don't ship. `add-one-off-script`: if yes → copy the bundled SKILL.md verbatim plus the language-specific `BaseOneOffScript` template (`one_off_script_base.py` / `one_off_script_base.ts`) chosen via its follow-up; if no → don't ship. `prepare-worktree`: if yes → copy the bundled SKILL.md verbatim, populate `skills.prepare-worktree.*` defaults from its follow-ups, and (when the user opted in via the worktree-default follow-up) flip `run_options.implement-plan.use_worktree` to `true` so `implement-plan`'s Step 0 question (c) defaults to yes; if no → don't ship.
411
+ - **Always copy verbatim**: `plan-feature`, `create-spec`, `create-qa-use-cases`, `deslop-comments`, `handoff`. Bundled with the bootstrap skill set; project-agnostic enough to ship as-is (with light path scrubs). `deslop-comments` always ships because `review-phase`'s Layer 2 comment-hygiene check + fix loop dispatch it. `handoff` always ships because its session-continuation body is fully project-agnostic.
412
+ - **Always generate**: the plan-execution unit — `implement-plan` (conductor) + its co-shipped sub-skills `implement-phase` / `review-phase` / `integrate-phase`, plus `amend-plan` (conductor). Bodies have too much project-specific content (test commands, branch convention, PR + co-author policy, agent dispatch) — generated from parameterized templates + shared partials using interview answers + inventory. The sub-skills are not independently opt-in; they always ship with the conductors.
413
+ - **Optional, ask first**: `add-e2e-test`, `add-env-var`, `systematic-debugging`, `add-one-off-script`, `prepare-worktree`, `thermo-nuclear-code-quality-review`, `handoff-to-client`. Skipped by default; orchestrator asks via `AskUserQuestion` whether the project has the relevant flow at all. `add-e2e-test` / `add-env-var`: if yes + user has a template → copy + adapt; if yes + no template → draft from scratch via interview; if no → don't ship. `systematic-debugging`: if yes → render the bundled template plus the per-tool MCP catalogue blocks for the observability tools selected in its follow-up; if no → don't ship. `add-one-off-script`: if yes → copy the bundled SKILL.md verbatim plus the language-specific `BaseOneOffScript` template (`one_off_script_base.py` / `one_off_script_base.ts`) chosen via its follow-up; if no → don't ship. `prepare-worktree`: if yes → copy the bundled SKILL.md verbatim, populate `skills.prepare-worktree.*` defaults from its follow-ups, and (when the user opted in via the worktree-default follow-up) flip `run_options.implement-plan.use_worktree` to `true` so `implement-plan`'s Step 0 question (c) defaults to yes; if no → don't ship. `thermo-nuclear-code-quality-review`: if yes → copy the bundled SKILL.md verbatim (no follow-up config); if no → don't ship. `handoff-to-client`: asked only for API-only repos; if yes → render the bundled template using `skills.handoff-to-client.*` (client platforms, API style, spec path, output dir) from its follow-ups; if no → don't ship.
385
414
 
386
415
  Stack-specific skills + agents land in the target only when the user provides templates for them. If they don't have templates yet, the orchestrator records the detected stacks + skill categories as a TODO list the user can address later via [vinta-derive-skills](../vinta-derive-skills/SKILL.md) / [vinta-derive-subagents](../vinta-derive-subagents/SKILL.md) standalone runs.
387
416