vinta-ai-workflows 0.2.0-alpha2 → 0.2.0-alpha4

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 (33) hide show
  1. package/CHANGELOG.md +199 -0
  2. package/README.md +5 -2
  3. package/package.json +7 -1
  4. package/schemas/README.md +1 -0
  5. package/schemas/ai-models.v1.schema.json +87 -0
  6. package/schemas/vinta-ai-workflows-config.v1.schema.json +20 -1
  7. package/skills/vinta-analyze-codebase/SKILL.md +1 -1
  8. package/skills/vinta-bootstrap-ai-tools/SKILL.md +19 -9
  9. package/skills/vinta-derive-skills/SKILL.md +98 -47
  10. package/skills/vinta-derive-skills/resources/foundation-skills/deslop-comments/SKILL.md +148 -0
  11. package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +24 -27
  12. package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/resources/ai-models.yaml +98 -0
  13. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/SKILL.md +89 -0
  14. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/scripts/claude-worktree-write-guard.py +118 -0
  15. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/scripts/gen-claude-sandbox-settings.sh +167 -0
  16. package/skills/vinta-derive-skills/resources/foundation-skills/prepare-worktree/scripts/sandbox-run.sh +106 -0
  17. package/skills/vinta-derive-skills/resources/foundation-skills/thermo-nuclear-code-quality-review/SKILL.md +129 -0
  18. package/skills/vinta-derive-skills/resources/plan-execution/README.md +42 -0
  19. package/skills/vinta-derive-skills/resources/{implement-plan-template-modular-substitutions.md → plan-execution/partials/commit-strategy/modular.md} +38 -70
  20. package/skills/vinta-derive-skills/resources/plan-execution/partials/commit-strategy/stacked.md +46 -0
  21. package/skills/vinta-derive-skills/resources/plan-execution/partials/implementer-prompt.md +78 -0
  22. package/skills/vinta-derive-skills/resources/plan-execution/partials/model-pick.md +19 -0
  23. package/skills/vinta-derive-skills/resources/plan-execution/partials/pr-context.md +61 -0
  24. package/skills/vinta-derive-skills/resources/plan-execution/partials/review-layers.md +50 -0
  25. package/skills/vinta-derive-skills/resources/plan-execution/partials/worktree-seam.md +68 -0
  26. package/skills/vinta-derive-skills/resources/{amend-plan-template.md → plan-execution/shell/amend-plan-template.md} +48 -42
  27. package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-phase-template.md +47 -0
  28. package/skills/vinta-derive-skills/resources/plan-execution/shell/implement-plan-template.md +186 -0
  29. package/skills/vinta-derive-skills/resources/plan-execution/shell/integrate-phase-template.md +30 -0
  30. package/skills/vinta-derive-skills/resources/plan-execution/shell/review-phase-template.md +25 -0
  31. package/skills/vinta-derive-skills/resources/systematic-debugging-template.md +7 -3
  32. package/skills/vinta-update-project-skills/SKILL.md +1 -1
  33. package/skills/vinta-derive-skills/resources/implement-plan-template.md +0 -416
package/CHANGELOG.md CHANGED
@@ -7,6 +7,205 @@ 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
+ <!-- pre-release: 0.2.0-alpha4 on 2026-07-08 -->
11
+
12
+ ### Added
13
+
14
+ - **`implement-plan` outer-gate test scope is now configurable — and defaults
15
+ to the quick path.** Each phase's outer gate still always runs the repo-wide
16
+ type/build gate, but for tests it now runs **only the scoped suite** covering
17
+ the apps/files that phase touched by default, instead of the whole repo suite
18
+ every phase (new tests still pass individually in the inner loop). This
19
+ **flips the previous default** (full suite every phase → scoped) to make
20
+ multi-phase plans materially faster. Opt back into the full suite per run via
21
+ the new Step 0 question (d), or set the default in
22
+ `.vinta-ai-workflows.yaml` under
23
+ `run_options.implement-plan.full_test_suite: true`. New config field
24
+ (`run_options.implement-plan.full_test_suite`, boolean, default `false`);
25
+ threaded from the conductor into `implement-phase` (outer-gate marker in the
26
+ implementer prompt) and `review-phase` (Layer 1 verifies whichever gate the
27
+ flag selects); recorded in `TRACKING_{plan-id}.md` `run_options`.
28
+
29
+ - **`deslop-comments` foundation skill — Simple-English comment cleanup, now
30
+ part of the review flow.** Rewrites comments + doc blocks touched during a
31
+ task into Simple English (strips AI-slop vocabulary and negative framing;
32
+ comment-only — no renames, no behavior change). Ships at
33
+ [skills/vinta-derive-skills/resources/foundation-skills/deslop-comments/SKILL.md](skills/vinta-derive-skills/resources/foundation-skills/deslop-comments/SKILL.md).
34
+ Wired as an **always-ship** bucket-A skill (new
35
+ `foundation_skills.deslop-comments` enum, added to the derive-skills bucket-A
36
+ table + always-on note, the bootstrap always-copy-verbatim list + outputs
37
+ tree + Step 0.5 YAML, and both foundation-shape replace lists) because
38
+ `review-phase` now depends on it: **Layer 2 gains a comment-hygiene check**
39
+ and the **fix loop dispatches a `fixer` to run `deslop-comments`** on the
40
+ phase's touched files for any comment-slop finding. Also invokable
41
+ standalone ("deslop these comments"). **Consumers**: re-sync to pick up the
42
+ skill and the `review-phase` comment-hygiene step.
43
+
44
+ - **`thermo-nuclear-code-quality-review` foundation skill — opt-in deep
45
+ structural-maintainability audit.** A deliberately harsh, on-demand review
46
+ of a diff (abstraction quality, giant files, spaghetti-condition growth)
47
+ that hunts for "code-judo" reframes collapsing whole branches / helpers /
48
+ modes / layers rather than polishing them. Copy-verbatim foundation skill
49
+ (bucket A), read-only — it reports findings and hands each fix to the
50
+ `fixer` agent. Ships at
51
+ [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).
52
+ Wired as **opt-in / ask-first**: new `foundation_skills.thermo-nuclear-code-quality-review`
53
+ enum in `schemas/vinta-ai-workflows-config.v1.schema.json`, a new
54
+ question 6 in the bootstrap **Optional foundation skills** interview, and
55
+ the derive-skills bucket-A + foundation-shape lists. The `review-phase`
56
+ Layer 3 reviewer now applies a **condensed structural-simplification lens**
57
+ on every phase and escalates to this full audit only when a phase touches
58
+ core architecture, crosses ~1,000 lines, or surfaces a structural smell too
59
+ big to resolve inline — the deep pass never auto-runs on every diff.
60
+ **Consumers**: re-sync; the bootstrap now asks one more optional-skill
61
+ question, and `review-phase` gains the escalation hook.
62
+
63
+ - **`prepare-worktree` — write-guard for *in-process* subagent runtimes
64
+ (claude-code's Task tool).** `sandbox-run.sh` confines a *process*, so it
65
+ only works when the harness spawns subagents as subprocesses (`codex exec`,
66
+ a `claude -p` child). Claude Code runs subagents in-process — same OS
67
+ process, same tool pipeline, no child command to wrap — so a new
68
+ harness-config guard covers it instead. Two bundled scripts:
69
+ `prepare-worktree/scripts/claude-worktree-write-guard.py` (a `PreToolUse`
70
+ hook that fires for the orchestrator **and** every in-process Task subagent,
71
+ blocking the file-editing tools — `Edit`/`Write`/`MultiEdit`/`NotebookEdit`
72
+ — from writing outside the worktree; filesystem-only, no network impact) and
73
+ `prepare-worktree/scripts/gen-claude-sandbox-settings.sh` (generates the
74
+ worktree's `.claude/settings.json` wiring that hook, and optionally
75
+ Claude Code's **native** OS sandbox via `sandbox.filesystem.denyWrite`/
76
+ `allowWrite` under `--os-sandbox` to also block Bash-issued writes — noting
77
+ the native sandbox forces network isolation, so registry + git-remote hosts
78
+ must be allow-listed via `--allow-domain`). Same deny-main/allow-rest model
79
+ as `sandbox-run.sh`. Step 5.5 of `prepare-worktree` gains an *In-process
80
+ runtimes (claude-code)* subsection; `implement-plan` §1c makes the
81
+ previously hand-wavy "in-process runtime" branch concrete. **Consumers**:
82
+ re-sync `prepare-worktree` + `implement-plan` — the two new scripts ship
83
+ with the foundation-skill dir.
84
+
85
+ ### Fixed
86
+
87
+ - **`prepare-worktree/scripts/sandbox-run.sh` — two correctness bugs.**
88
+ (1) The macOS profile temp file used `mktemp -t vinta-sandbox`, which fails
89
+ with "too few X's in template" under GNU `mktemp` (present on any machine
90
+ with coreutils on `PATH`, including many macOS setups) — the whole sandbox
91
+ path errored out; now uses an explicit `…/vinta-sandbox.XXXXXX` template
92
+ portable across BSD + GNU `mktemp`. (2) Callers must now pass
93
+ `--allow <main>/.git`: git worktrees write every commit into the main repo's
94
+ `.git` (`.git/worktrees/<name>/index.lock`, shared objects/refs), so a
95
+ deny-main that omits it made the subagent's own `git commit` fail with
96
+ `Operation not permitted`. `implement-plan` §1c's documented invocation +
97
+ checklist + rules are updated to include `<main>/.git` in the allow-set.
98
+
99
+ ### Changed
100
+
101
+ - **`implement-plan` / `amend-plan` decomposed into a modular "plan-execution
102
+ unit" of deterministic sub-skills.** The single ~440-line
103
+ `implement-plan-template.md` (and its `implement-plan-template-modular-substitutions.md`
104
+ sister file) are replaced by a thin **conductor** plus three co-shipped
105
+ single-purpose sub-skills, all rendered from
106
+ [skills/vinta-derive-skills/resources/plan-execution/](skills/vinta-derive-skills/resources/plan-execution/)
107
+ (`shell/` templates that `<!-- include -->` shared `partials/`):
108
+ - `implement-plan` — conductor: parse → classify → resolve one `WORKROOT`
109
+ → per-phase loop (dispatch) → track → report.
110
+ - `implement-phase` — compose prompt + pick model + spawn the implementer.
111
+ - `review-phase` — the three-layer review + fix loop, now shared by
112
+ `implement-plan`, `amend-plan`, **and** `systematic-debugging` (one review
113
+ implementation instead of three).
114
+ - `integrate-phase` — push + open PR via context file, rendered
115
+ commit-strategy-resolved.
116
+ The scattered runtime `if use_worktree` branches collapse into a single
117
+ `WORKROOT` / `BASE_BRANCH` / `SANDBOX_TIER` seam the conductor resolves once
118
+ and passes to every sub-skill as data; only two local, data-driven checks
119
+ remain (the sandbox spawn-wrap in `implement-phase`, the stray-write
120
+ backstop in `review-phase`). Under `commit_strategy = ask`, the former
121
+ dual-rendered branch/commit/PR bodies become **two** rendered
122
+ `integrate-phase-stacked` / `integrate-phase-modular` skills the conductor
123
+ dispatches by name — no more both-paths-in-one-file. `amend-plan` reuses
124
+ `review-phase` verbatim + the shared inner/outer verification loop, and
125
+ picks up the same `WORKROOT` uniformity, while keeping its own
126
+ history-rewriting topology. **Consumers**: re-sync — the target now gets
127
+ five plan-execution SKILL.md files (`implement-plan`, `implement-phase`,
128
+ `review-phase`, `integrate-phase` [or the two `ask` variants], `amend-plan`)
129
+ instead of two. The three new sub-skills are a co-shipped unit: always
130
+ generated with `implement-plan`, not individually opt-in (no new
131
+ `foundation_skills` enum entry, no new interview question). Runtime
132
+ behavior is unchanged; the decomposition is for reviewability + determinism.
133
+
134
+ <!-- pre-release: 0.2.0-alpha3 on 2026-06-23 -->
135
+
136
+ ### Added
137
+
138
+ - **`plan-feature` AI model tier table extracted to a data resource +
139
+ nightly freshness job.** The per-tier model recommendations that used to
140
+ be hard-coded in `plan-feature/SKILL.md` now live in
141
+ `plan-feature/resources/ai-models.yaml` (ships verbatim with the skill;
142
+ schema: `schemas/ai-models.v1.schema.json`). The SKILL.md body keeps the
143
+ *tier-selection rubric* (stable judgement) and points at the resource for
144
+ concrete model IDs, so the prose no longer goes stale. A source-side
145
+ nightly GitHub Action (`.github/workflows/check-ai-models.yml`, runner
146
+ `scripts/check-ai-models.mjs`) checks the cited IDs against a **free,
147
+ no-key model aggregator** (models.dev, LiteLLM JSON as fallback) — no
148
+ vendor API keys required — flags IDs that disappear or that a newer
149
+ same-family model has superseded, and on drift has an LLM propose an
150
+ updated table that it opens as a reviewable PR (the optional LLM step is
151
+ the only one that uses a key). **Consumers**: re-sync the
152
+ `plan-feature` skill to pick up a refreshed table; the resource's
153
+ `last_verified` date signals how current it is.
154
+
155
+ - **`prepare-worktree` — OS-level filesystem sandbox that *prevents*
156
+ stray main-checkout writes (harness-agnostic).** The prompt instruction
157
+ "stay in the worktree" is cooperative only; a smaller phase subagent can
158
+ resolve a path back to the main checkout and silently write there. A new
159
+ bundled script `prepare-worktree/scripts/sandbox-run.sh` confines the
160
+ *process* (not the agent tool) at the kernel layer — `sandbox-exec` on
161
+ macOS, `bwrap` (bubblewrap) on Linux — using a **deny-main, allow-rest**
162
+ model: the whole filesystem stays writable except the main checkout, with
163
+ the worktree (nested under it) and `.vinta-ai-workflows` punched back to
164
+ writable, so package managers / caches / `$HOME` behave normally and no
165
+ per-stack allowlist tuning is needed. A stray main-checkout write fails
166
+ with `Operation not permitted` / `EROFS` regardless of which harness
167
+ (claude-code, Codex, …) issued it. `prepare-worktree` adds a capability
168
+ probe + a `sandbox` block in its summary YAML recording the achieved tier
169
+ (`enforced` / `none`); `implement-plan` wraps each subprocess subagent
170
+ spawn in the script when `sandbox_tier = enforced`, threads the tier
171
+ through tracking + the re-running-mid-plan resume path, and downgrades its
172
+ existing Layer 1 stray-write check from sole defense to a backstop. On
173
+ machines without a sandbox tool (`tier = none`) the script runs the
174
+ command unsandboxed with a loud warning and the Layer 1 check remains the
175
+ guard. Escape hatch: `VINTA_SANDBOX=off`. **Consumers**: re-sync
176
+ `prepare-worktree` + `implement-plan` to pick up the guard; the whole
177
+ `prepare-worktree/` dir now ships (SKILL.md + `scripts/sandbox-run.sh`),
178
+ so re-run the foundation-skill copy, not just the SKILL.md.
179
+
180
+ ### Changed
181
+
182
+ - **`plan-feature` — per-phase PR-size target raised from ~100–300 LoC to
183
+ up to 1500 LoC** (tests included). The old "reviewer reads the diff in
184
+ 30 minutes / ~100–300 LoC" guidance forced excessive phase splitting:
185
+ trivial use-cases became standalone PRs and the phase count ballooned
186
+ past what a reviewer wants to track. The new ceiling — "reviewer reads
187
+ ≤1500 LoC and understands the phase in isolation" — keeps phases
188
+ MR-sized and single-concern while letting a coherent unit of work land
189
+ in one PR. Pairs with the new **Phase granularity** Step 0 choice
190
+ below: bundled phases also cap at 1500 LoC. Plan-shape checklist
191
+ updated to match.
192
+
193
+ - **`plan-feature` — "one use-case per phase" is now a Step 0 choice, not
194
+ a hard mandate.** Added a **Phase granularity** question to the Scope
195
+ group (default: one use-case per phase). The rule, its apply-even-when
196
+ list, and the checklist item now branch on the answer — opting into
197
+ bundling lets closely-related use-cases share a phase as long as each
198
+ phase stays MR-sized, single-concern, and independently mergeable.
199
+
200
+ - **E2E content is stripped from no-e2e projects.** `create-qa-use-cases`
201
+ now ships **only when `add-e2e-test` is enabled** (it seeds e2e specs),
202
+ and `plan-feature`'s Playwright / `QA_USE_CASES.md` / `pr-screenshots/`
203
+ sections are wrapped in `<!-- e2e:start/end -->` markers that
204
+ `vinta-derive-skills` strips when `add-e2e-test` is disabled. The
205
+ bootstrap `add-e2e-test` answer now also sets
206
+ `foundation_skills.create-qa-use-cases`. Result: projects marked as
207
+ having no e2e tests get foundation skills with zero e2e references.
208
+
10
209
  <!-- pre-release: 0.2.0-alpha2 on 2026-06-13 -->
11
210
 
12
211
  ### Changed
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,11 +1,17 @@
1
1
  {
2
2
  "name": "vinta-ai-workflows",
3
- "version": "0.2.0-alpha2",
3
+ "version": "0.2.0-alpha4",
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": {
7
7
  "vinta-ai-workflows": "./vinta-ai-workflows.mjs"
8
8
  },
9
+ "scripts": {
10
+ "check-ai-models": "node scripts/check-ai-models.mjs"
11
+ },
12
+ "devDependencies": {
13
+ "yaml": "^2.4.0"
14
+ },
9
15
  "files": [
10
16
  "vinta-ai-workflows.mjs",
11
17
  "skills",
package/schemas/README.md CHANGED
@@ -11,6 +11,7 @@ JSON Schema (Draft 2020-12) contracts for every YAML file the vinta-ai-workflows
11
11
  | PR-context frontmatter | top-of-file YAML in `.vinta-ai-workflows/prs-context/{feature-kebab}/phase-{phase.id}.md` | [`prs-context-frontmatter.v1.schema.json`](prs-context-frontmatter.v1.schema.json) | `implement-plan` / `amend-plan` | `open-pr.sh` |
12
12
  | PR-context inline comments | YAML inside the ` ```yaml ... ``` ` fence under `# Comments` of the same file | [`prs-context-comments.v1.schema.json`](prs-context-comments.v1.schema.json) | `implement-plan` / `amend-plan` | `open-pr.sh` |
13
13
  | MCP preflight cache | `.vinta-ai-workflows/cache.yaml` (gitignored — per-developer-machine state) | [`mcp-preflight-cache.v1.schema.json`](mcp-preflight-cache.v1.schema.json) | rendered `systematic-debugging` SKILL.md (writes during Phase 0) | rendered `systematic-debugging` SKILL.md (reads at Phase 0 start) |
14
+ | AI model tier table | `ai-tools/skills/plan-feature/resources/ai-models.yaml` (shipped verbatim with the `plan-feature` foundation skill; source: `skills/vinta-derive-skills/resources/foundation-skills/plan-feature/resources/ai-models.yaml`) | [`ai-models.v1.schema.json`](ai-models.v1.schema.json) | nightly `check-ai-models` job ([`scripts/check-ai-models.mjs`](../scripts/check-ai-models.mjs)) → auto-PR | `plan-feature` (per-phase model suggestion) |
14
15
 
15
16
  ## Versioning rules
16
17
 
@@ -0,0 +1,87 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/vintasoftware/vinta-ai-workflows/schemas/ai-models.v1.schema.json",
4
+ "title": "AI model tier table",
5
+ "description": "Per-tier AI model recommendations consumed by the plan-feature skill and maintained by the nightly check-ai-models job. Source of truth for concrete model IDs; the SKILL.md body carries only selection guidance.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema_version", "last_verified", "source", "tiers"],
9
+ "properties": {
10
+ "schema_version": {
11
+ "const": 1,
12
+ "description": "Matches the v1 suffix on this schema filename."
13
+ },
14
+ "last_verified": {
15
+ "type": "string",
16
+ "format": "date",
17
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
18
+ "description": "Date every model id below was last confirmed to still exist against the aggregator."
19
+ },
20
+ "source": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["primary"],
24
+ "description": "Free, no-key model-list aggregators the checker queries. Vendors tracked are derived from the `models` keys under `tiers`.",
25
+ "properties": {
26
+ "primary": {
27
+ "type": "string",
28
+ "format": "uri",
29
+ "description": "Primary aggregator JSON (e.g. models.dev/api.json), vendor-keyed with a `.models` map per provider."
30
+ },
31
+ "fallback": {
32
+ "type": "string",
33
+ "format": "uri",
34
+ "description": "Fallback aggregator JSON used when the primary is unreachable (e.g. LiteLLM price/context JSON)."
35
+ }
36
+ }
37
+ },
38
+ "tiers": {
39
+ "type": "array",
40
+ "minItems": 1,
41
+ "items": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["tier", "label", "use_for", "models"],
45
+ "properties": {
46
+ "tier": {
47
+ "type": "integer",
48
+ "minimum": 1,
49
+ "description": "Tier number, cheapest/fastest (1) → architectural/hard."
50
+ },
51
+ "label": {
52
+ "type": "string",
53
+ "description": "Short tier name."
54
+ },
55
+ "use_for": {
56
+ "type": "string",
57
+ "description": "When to reach for this tier."
58
+ },
59
+ "models": {
60
+ "type": "object",
61
+ "description": "Vendor key → ordered list of recommended models for this tier. Keys should match entries in the top-level `vendors` map.",
62
+ "minProperties": 1,
63
+ "additionalProperties": {
64
+ "type": "array",
65
+ "minItems": 1,
66
+ "items": {
67
+ "type": "object",
68
+ "additionalProperties": false,
69
+ "required": ["id"],
70
+ "properties": {
71
+ "id": {
72
+ "type": "string",
73
+ "description": "Vendor model id as it appears in the vendor's model-list API."
74
+ },
75
+ "note": {
76
+ "type": "string",
77
+ "description": "Optional caveat (fallback, variant, when-to-step-up)."
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
@@ -188,7 +188,11 @@
188
188
  "properties": {
189
189
  "plan-feature": { "type": "string", "enum": ["enabled", "disabled"] },
190
190
  "create-spec": { "type": "string", "enum": ["enabled", "disabled"] },
191
- "create-qa-use-cases": { "type": "string", "enum": ["enabled", "disabled"] },
191
+ "create-qa-use-cases": {
192
+ "description": "Bootstrap `QA_USE_CASES.md` from the active spec/plan. Coupled to `add-e2e-test`: QA use-cases seed e2e specs, so ship (and set `enabled`) only when `add-e2e-test` is `enabled`. When `add-e2e-test` is `disabled`, set this `disabled` too — derive-skills won't ship the skill and strips the e2e regions from `plan-feature`.",
193
+ "type": "string",
194
+ "enum": ["enabled", "disabled"]
195
+ },
192
196
  "implement-plan": { "type": "string", "enum": ["enabled", "disabled"] },
193
197
  "amend-plan": { "type": "string", "enum": ["enabled", "disabled"] },
194
198
  "open-pr-from-context": { "type": "string", "enum": ["enabled", "disabled"] },
@@ -208,6 +212,16 @@
208
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.",
209
213
  "type": "string",
210
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"]
211
225
  }
212
226
  }
213
227
  },
@@ -246,6 +260,11 @@
246
260
  "properties": {
247
261
  "pause_between_phases": { "type": "boolean", "default": false },
248
262
  "generate_inline_comments": { "type": "boolean", "default": false },
263
+ "full_test_suite": {
264
+ "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.",
265
+ "type": "boolean",
266
+ "default": false
267
+ },
249
268
  "use_worktree": {
250
269
  "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.",
251
270
  "type": "boolean",
@@ -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,9 +83,9 @@ 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
+ Six skills are part of the foundation set but aren't always needed. Ask explicitly:
87
87
 
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.
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`.
90
90
  3. **`systematic-debugging`** — should agents follow a root-cause-first debugging flow that mandates pulling evidence from the project's observability MCP servers before proposing any fix? `AskUserQuestion` options: `Yes — enable`, `No — skip`. Recommend enabling whenever any observability MCP server is wired up — the skill bakes the project's real test / lint / build commands into the rendered checklist and instructs the agent to discover available calls on those servers at runtime (so it stays correct even as MCP servers add or rename tools).
91
91
  4. **`add-one-off-script`** — does the project ever need one-off operational scripts (backfills, cleanups, ad-hoc data fixes) that mutate production data outside the regular migration / ETL / cron path? `AskUserQuestion` options: `Yes — enable`, `No — skip`. Recommend `Yes` for any project with a relational DB or large user dataset; the bundled `BaseOneOffScript` template enforces the safety contract (dry-run by default, idempotent re-runs, batched DB ops, streamed reads, segmented CSV backups capped at 1M cells per file with one set of files per affected table, interruption-safe signal handlers, console + filesystem + S3 logs that survive an interruption). Skip for read-only projects or projects whose only writes go through a migration tool.
@@ -112,7 +112,9 @@ 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
+ If the user answers "No" to any of the six, 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.
116
118
 
117
119
  ### E. Existing AI artifacts (per-artifact disposition)
118
120
 
@@ -132,7 +134,7 @@ For each artifact, read it (frontmatter + body), then ask the user via `AskUserQ
132
134
  - `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
135
  - `Drop` — delete (rare; usually the user wants to migrate).
134
136
 
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.
137
+ 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`) 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
138
 
137
139
  - **Sub-agents** (each under any vendor `agents/` dir):
138
140
  - `Migrate to ai-tools/agents/<name>.yaml` — converts vendor-specific format → canonical YAML; `setup-ai-tools.mjs` re-emits per-vendor copies.
@@ -250,6 +252,8 @@ foundation_skills:
250
252
  systematic-debugging: <Optional foundation skills → systematic-debugging answer → enabled | disabled>
251
253
  add-one-off-script: <Optional foundation skills → add-one-off-script answer → enabled | disabled>
252
254
  prepare-worktree: <Optional foundation skills → prepare-worktree answer → enabled | disabled>
255
+ thermo-nuclear-code-quality-review: <Optional foundation skills → thermo-nuclear-code-quality-review answer → enabled | disabled>
256
+ deslop-comments: enabled # always ships — review-phase Layer 2 comment-hygiene + fix loop depend on it
253
257
 
254
258
  foundation_agents:
255
259
  implementer: enabled
@@ -263,6 +267,7 @@ run_options:
263
267
  implement-plan:
264
268
  pause_between_phases: false
265
269
  generate_inline_comments: false
270
+ full_test_suite: false # default: each phase's outer gate runs scoped tests only; set true to run the full suite every phase
266
271
  use_worktree: <Optional foundation skills → prepare-worktree follow-up → default for Step 0 question (c); false unless team opted in>
267
272
  amend-plan:
268
273
  blast_radius_signal_threshold: 2
@@ -340,8 +345,12 @@ ai-tools/
340
345
  │ ├── plan-feature/SKILL.md ← always (copied verbatim from derive-skills resources)
341
346
  │ ├── create-spec/SKILL.md ← always (copied verbatim)
342
347
  │ ├── 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)
348
+ │ ├── deslop-comments/SKILL.md ← always (copied verbatim; review-phase Layer 2 comment-hygiene + fix loop depend on it)
349
+ │ ├── implement-plan/SKILL.md ← always (conductor; generated from template, project-specific)
350
+ │ ├── implement-phase/SKILL.md ← always (plan-execution unit; co-shipped with implement-plan)
351
+ │ ├── review-phase/SKILL.md ← always (plan-execution unit; shared by implement-plan / amend-plan / systematic-debugging)
352
+ │ ├── integrate-phase/SKILL.md ← always (plan-execution unit; push + PR. Under commit_strategy=ask: integrate-phase-stacked/ + integrate-phase-modular/ instead)
353
+ │ ├── amend-plan/SKILL.md ← always (conductor; generated from template, project-specific)
345
354
  │ ├── add-e2e-test/SKILL.md ← optional — only if user opts in
346
355
  │ ├── add-env-var/SKILL.md ← optional — only if user opts in
347
356
  │ ├── systematic-debugging/SKILL.md ← optional — only if user opts in (template-rendered)
@@ -351,6 +360,7 @@ ai-tools/
351
360
  │ │ ├── one_off_script_base.py
352
361
  │ │ └── one_off_script_base.ts
353
362
  │ ├── prepare-worktree/SKILL.md ← optional — only if user opts in (verbatim copy; project-agnostic body, defaults under skills.prepare-worktree.*)
363
+ │ ├── 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
364
  │ ├── 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
365
  │ ├── 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
366
  │ └── <stack-specific skills>/SKILL.md ← only if user supplied templates
@@ -379,9 +389,9 @@ Plus the symlinks + per-vendor generated files, set up by the install step.
379
389
 
380
390
  Foundation skills break into three buckets — see [vinta-derive-skills](../vinta-derive-skills/SKILL.md) for the full mechanics:
381
391
 
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.
392
+ - **Always copy verbatim**: `plan-feature`, `create-spec`, `create-qa-use-cases`, `deslop-comments`. 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.
393
+ - **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.
394
+ - **Optional, ask first**: `add-e2e-test`, `add-env-var`, `systematic-debugging`, `add-one-off-script`, `prepare-worktree`, `thermo-nuclear-code-quality-review`. 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.
385
395
 
386
396
  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
397