ai-team-library/claude/skills/vdd/SKILL.md
# Skill: VDD (Verification-Driven Development) Gate ## Description Runs the programmatic VDD gate for a bean: parses the bean's `## Acceptance Criteria` section, dispatches each criterion's evidence type to the matching runner (test, lint, file, file-contains, or manual), aggregates the results into a pass/fail verdict, and writes a structured markdown report at `ai/outputs/tech-qa/vdd-<NNN>.md` (zero-padded NNN). This is the machine-checkable counterpart to the prose VDD policy in `ai/contex
npx skillsauth add beekeeper-lab/foundry ai-team-library/claude/skills/vddInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Runs the programmatic VDD gate for a bean: parses the bean's
## Acceptance Criteria section, dispatches each criterion's evidence
type to the matching runner (test, lint, file, file-contains, or
manual), aggregates the results into a pass/fail verdict, and writes
a structured markdown report at
ai/outputs/tech-qa/vdd-<NNN>.md (zero-padded NNN).
This is the machine-checkable counterpart to the prose VDD policy in
ai/context/vdd-policy.md. The policy still governs what counts as
evidence; this skill enforces it programmatically so /merge-bean can
refuse beans whose acceptance criteria are unverified.
/vdd slash command./merge-bean as a pre-merge gate.| Input | Type | Required | Description |
|-------|------|----------|-------------|
| bean_id | String | Yes | Bean identifier (BEAN-277 or just 277) |
| --manual | Enum | No | pending (default) or pass — see Aggregate Verdict |
| --repo-root | Path | No | Repo root override (default: cwd) |
277 → BEAN-277).ai/beans/BEAN-NNN-<slug>/ by globbing for BEAN-NNN-*.
3, error message names the bean.bean.md. If absent, the same error path applies.## Acceptance Criteria heading (case-insensitive).
Stop at the next ## heading.^- \[[ xX]\] \(([a-z-]+):([^)]+)\) (.+)$, capture:
kind — the evidence type (test, lint, file, file-contains).target — the raw target string after the :.text — the human-readable criterion text.^- \[[ xX]\] (.+)$ (no
prefix) are recorded as manual criteria.EMPTY and exit code 2.
/merge-bean interprets EMPTY as a hard failure — a bean with no
acceptance criteria cannot pass the gate.For each criterion, dispatch by kind:
| Kind | Runner | Pass condition |
|------|--------|----------------|
| test | subprocess.run(["uv","run","pytest","-q",target], cwd=repo_root) | exit code 0 |
| lint | subprocess.run(["uv","run","ruff","check",target], cwd=repo_root) | exit code 0 |
| file | Path(repo_root).glob(target) | at least one match |
| file-contains | split target on :: → <glob>::<substring>; glob then read each file | substring present in any matched file |
| (none) | record as MANUAL | n/a — see Aggregate Verdict |
All subprocess calls use argument lists, never shell strings — no
shell metacharacter interpolation is possible. On failure, the runner
captures the last few lines of stderr/stdout into the report's details
column for quick diagnosis.
| Verdict | Condition | Exit code |
|---------|-----------|-----------|
| PASS | all results are PASS, no manual items | 0 |
| FAIL | any result is FAIL | 1 |
| PARTIAL | all programmatic results pass but at least one manual item remains | 1 |
| EMPTY | no checklist items found | 2 |
--manual=pass upgrades PARTIAL to PASS. Use this after Tech-QA
has manually confirmed the unprefixed criteria; the merge gate still
requires the upgraded run to be on disk.
ai/outputs/tech-qa/vdd-<NNN>.md with:
# VDD Report — BEAN-NNNEMPTY verdict, include a one-line note.| Output | Type | Description |
|--------|------|-------------|
| report | Markdown file | ai/outputs/tech-qa/vdd-<NNN>.md |
| stdout | Text | Report path and aggregate verdict |
| exit_code | Int | See Phase 4 table |
subprocess with a shell string — all
external commands are passed as argument lists.## Acceptance Criteria section produces an EMPTY
verdict and a non-zero exit so the merge gate refuses.PASS without
human interaction.PARTIAL (or PASS
with --manual=pass), never an unjustified PASS.| Error | Cause | Resolution |
|-------|-------|------------|
| BeanNotFound | No directory matches BEAN-NNN-* | Verify the bean ID |
| BeanMissingAC | Bean has no AC section or it is empty | Add criteria; exit 2 makes /merge-bean refuse |
| UnknownKind | Prefix is not in the recognized set | Fix the prefix; the criterion is reported as FAIL |
| MalformedFileContains | file-contains: target lacks the :: separator | Fix the target |
| RunnerNonZero | pytest/ruff returned non-zero | Investigate the failing command; the report's details column shows the tail of stderr |
ai/beans/BEAN-NNN-<slug>/bean.mduv available on PATH (used to invoke pytest / ruff for
test: and lint: criteria)foundry_app.services.vdd (the runtime executor)The skill can be invoked two ways from a generated project:
uv run foundry-cli vdd <bean-id> — wires through
foundry_app/cli.py and dispatches to foundry_app.services.vdd.python3 -m foundry_app.services.vdd <bean-id> — calls
main() directly. Useful when invoking from a hook or a script
that does not have uv resolved yet.Both paths accept the same --manual and --repo-root flags.
Authors annotate each acceptance-criterion checklist item with an evidence-type prefix in parentheses immediately after the checkbox:
- [ ] (test:tests/test_foo.py::test_bar) Foo behaves correctly
- [ ] (lint:foundry_app/) Lint clean for foundry_app
- [ ] (file:ai/outputs/tech-qa/vdd-277.md) VDD report exists
- [ ] (file-contains:ai/context/vdd-policy.md::criterion-prefix) Policy mentions the prefix
- [ ] Manual: spot-check the wizard's persona-list scroll behavior
Backward-compatible: criteria without a prefix become MANUAL items.
The aggregate verdict flags them as PARTIAL so reviewers know human
sign-off is still required.
tools
# Skill: Spawn Task ## Description Dispatches a single specialist persona to execute a single task with only that task's context. Auto-detects the runtime environment and chooses one of two execution paths: - **In tmux** (`$TMUX` set): spawn a worker in a git worktree using a child tmux window. Process-isolated, parallelizable, durable across the calling session's lifetime. Same pattern as `/spawn-bean` but at task granularity. - **Not in tmux**: invoke the `Agent` tool with `subagent_typ
development
# Skill: Orchestration Report ## Description Aggregates the per-bean **Orchestration Telemetry** blocks (BEAN-278) across recent Done beans and produces a markdown report that answers the architecture-aware-evaluation question: **is the orchestration paying for itself?** Distinct from `/telemetry-report` (which aggregates raw cost, duration, and tokens); this skill aggregates the orchestration-quality metrics layered on top — bounces, persona activations, contract violations, escape-hatch usag
development
# Skill: Health Check ## Description Runs all health checks defined in `ai/context/health-checks.md` and produces a table-format report. Can be called standalone or by other skills (e.g., `/long-run`). ## Trigger - Invoked by the `/health-check` slash command. - Called programmatically by `/long-run` at the start of each cycle. ## Inputs | Input | Type | Required | Description | |-------|------|----------|-------------| | health_checks | Markdown file | Yes | `ai/context/health-checks.md`
tools
# Skill: Validate Repo ## Description Runs a comprehensive health check against a generated project or any repo that follows the Foundry structure. Verifies folder expectations, required files, template completeness, broken internal links, and stack-specific tooling (lint, test, build commands). Produces a pass/fail checklist with actionable remediation for every finding. This skill works on any project regardless of stack because it adapts its checks based on the composition spec. ## Trigger