Skip to content
Back to skills

Plan Validation Checks

ASecurity

Author /validate's check manifest for one EPIC — the toolchain plan the run_checks orchestrator executes. Detects the product's stack(s) from the slice's architecture lens tech picks plus the repository's own manifests (package.json, pom.xml, *.csproj, migrations), then resolves each stack to its tooling — build, test runner, linter, scanner, dependency audit — as KB-GROUNDED choices via kb-search; anything the KB does not cover becomes a recorded KB-learning-gap proposal, never a silent pick...

  • 3 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 10, 2026
testingpythonjavabashsqlnodefrontendsecurity

Security analysis

A100/100

Scanned September 10, 2026

npx -y skills add kapilvirenahuja/garura --skill plan-validation-checks --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Plan Validation Checks?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Plan Validation Checks
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kapilvirenahuja-plan-validation-checks/badge)](https://www.skillsdirectory.com/skills/kapilvirenahuja-plan-validation-checks)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: plan-validation-checks
description: Author /validate's check manifest for one EPIC — the toolchain plan the run_checks orchestrator executes. Detects the product's stack(s) from the slice's architecture lens tech picks plus the repository's own manifests (package.json, pom.xml, *.csproj, migrations), then resolves each stack to its tooling — build, test runner, linter, scanner, dependency audit — as KB-GROUNDED choices via kb-search; anything the KB does not cover becomes a recorded KB-learning-gap proposal, never a silent pick. Scopes the regression checks to the resolved blast radius (recorded change claims, narrowing per fix round) and maps the slice's quality-lens gates and the profile's benchmarks to concrete checks. Emits checks.yaml (one entry per check: runner class, tool, command, install hint, class) + a choices manifest for the grounding gate. Plans only — runs nothing, writes no model file. The planning work for the /validate play.
version: 0.1.0
user-invocable: false
model: best
allowed-tools: Read, Write, Bash, Glob, Grep
---

# plan-validation-checks

Turns one built epic into the **check manifest** /validate executes: which checks run,
with which tools, against which scope. The plan is the seam between judgment and
mechanics — everything downstream (run_checks.py, the runners, the gates, the verdict)
is deterministic, so every judgment call lands HERE, grounded.

Three sources decide the plan:

- **The stack(s).** The slice's architecture lens names the tech picks; the repository
  confirms them (a `package.json`, a `pom.xml`, a `*.csproj`, a migrations folder). One
  product can carry several stacks — each gets its checks. A stack the arch lens names
  but the repo doesn't show (or vice versa) is flagged in the plan's notes, not silently
  resolved.
- **The bars.** The slice's quality-lens gates each map to a concrete check (the gate's
  id becomes the check_id, or the gate names its check). The profile's benchmarks tell
  the plan which measures must come back (coverage, vulnerabilities, scores) so the
  right tools run with the right flags — green is the entry, the profile floor is the
  bar (`technology/validation-floor-profile-benchmarks`).
- **The scope.** The blast-radius file (from resolve_blast_scope.py) bounds the
  regression checks — scoped, never full-suite by default, narrowing per fix round
  (`architecture/regression-by-blast-radius`).

**Every tool choice grounds in the KB, never in taste.** Search the shelves via
kb-search (the one-shot-cleanliness learning names the standing scanners: SonarQube,
Snyk-class dependency audit, PageSpeed, a11y). An uncovered choice — a stack with no
recorded tooling stance — becomes a KB-learning-gap proposal the play surfaces; the
plan still names the tool it proposes, marked `grounds: proposal`.

Security checks are CODE-LEVEL only: static analysis, lint, dependency scanning —
never penetration-style probing of running systems.

## Inputs

| Field | Required | Description |
|-------|----------|-------------|
| `epic_file` | yes | The epic record (read-only) — context.systems, acceptance. |
| `quality_lens` | yes | The slice's quality lens (read-only) — the gates to map. |
| `profile_path` | yes | The product profile (read-only) — the benchmarks/floors. |
| `arch_lens` | yes | The slice's architecture lens (read-only) — the tech picks. |
| `scope_file` | yes | The resolved blast-radius scope (scope.json). |
| `repo_root` | yes | The product repository root — stack detection, read-only. |
| `round` | yes | Which validate round this is (scoped re-run planning). |
| `kb_search` | yes | Path to kb-search's `scripts/kb_search.py`. |
| `kb_root` | yes | The `knowledge/` dir for resolvable learning ids. |
| `out_dir` | yes | Output folder under STM for the manifest + choices + proposals. |

## Procedure

1. **Detect the stacks.** Read the arch lens's tech picks; confirm against the repo
   (Glob for `package.json`, `pom.xml`, `build.gradle`, `*.csproj`, `*.sln`,
   migration/SQL dirs, lockfiles). Record each detected stack and any
   lens-vs-repo mismatch in `notes`.

2. **Search the KB.** `python3 {kb_search} index`, then `get` the verification
   learnings (`technology/validation-floor-profile-benchmarks`,
   `architecture/regression-by-blast-radius`,
   `technology/delivery-one-shot-cleanliness`) plus any stack-tooling learnings whose
   conditions match. Ground every tool pick; write a gap proposal under
   `{out_dir}/proposals/` for any stack the shelves don't cover.

3. **Plan the checks.** One entry per check into `checks.yaml`:

   ```yaml
   checks:
     - check_id: tests-node          # quality-gate ids keep the gate's id
       runner: node                  # node|java|dotnet|frontend|sql|lint|sonar
       tool: npm
       tool_bins: [npm]
       command: "npm test -- --coverage"
       class: tests                  # tests|coverage|lint|scan|build|audit|gate
       install: ""                   # how to ensure the tool, when known
       timeout: 1800
   notes: []
   ```

   Cover, per stack: build/compile, the epic's tests, the scoped regression set (use
   the scope file — name the scoped test paths/filters in the command), lint/static
   analysis, dependency audit, and the scanners the bars demand (a coverage benchmark
   forces a coverage-reporting test command; a sonar gate forces the sonar runner).
   Every quality-lens gate maps to exactly one check_id. On round > 1, plan only
   what the prior report's findings and the narrowed scope require (`--only` set).

4. **Write the choices manifest** (`{out_dir}/check-choices.yaml`) — one entry per tool
   pick and per scoping decision, each grounded in a KB learning id or a proposal path,
   so the play's grounding gate is mechanical:

   ```yaml
   validate:
     choices:
       - aspect: "tooling:node-tests"
         value: "npm test with coverage"
         grounds: [{source_type: kb, source: "technology/delivery-one-shot-cleanliness"}]
       - aspect: "scope:regression"
         value: "scoped to scope.json round 2"
         grounds: [{source_type: kb, source: "architecture/regression-by-blast-radius"}]
   ```

## Output

```
{out_dir}/
  checks.yaml            # the toolchain manifest run_checks.py executes
  check-choices.yaml     # every judgment grounded — the grounding gate's input
  proposals/<gap>.yaml   # any KB-learning-gap proposal
```

## Boundaries

### NEVER
- Run a check, install a tool, or touch the repository — plan only; run_checks.py
  and the runners execute.
- Pick a tool on taste — every pick grounds in a KB learning or a recorded proposal.
- Plan a penetration-style or remote-probing check — code-level only.
- Plan full-suite regression when a scope file bounds it — scoped, narrowing per round.
- Leave a quality-lens gate or a profile benchmark unmapped — every bar gets its check,
  or the gap is named in `notes` (an unmeasured bar will fail the gates check, honestly).
- Write the product model, the epic, or anything outside `out_dir`.

### ALWAYS
- One check_id per quality-lens gate, keeping the gate's id.
- Make benchmark-carrying checks emit their measures (coverage flags, audit JSON).
- Record lens-vs-repo stack mismatches in `notes`.
- Return paths, not contents.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.