--- name: vc-test-coverage-plan description: "Use when creating a test plan for a blast radius. Assigns all 4 tiers (fully-automated, hybrid, agent-probe, known-gap) with exact commands, what each proves, and gap resolution options." argument-hint: "[blast radius description or plan file path]" trigger_keywords: test coverage plan, test tiers, blast radius coverage, gap resolution, TDD plan layer: contract metadata: author: vibecode-pro-max-kit version: "1.0.0" --- # vc-test-coverage-plan > **Output style:** Follow `process/development-protocols/communication-standards.md` — answer-first, plain language, no unexplained jargon, TL;DR on long responses. Generate a TDD-first full test plan per blast radius area. Assigns all 4 test tiers with exact commands, what each proves, what it does NOT prove, and explicit resolution options for every gap. ## Boundary vs vc-feasibility-test This skill is **POST-decision**: the design is already chosen and you are assigning coverage tiers across a known blast radius. If instead an approach cannot be decided *because* a runtime/library/external mechanism is unverified — that is a PRE-decision question and belongs to `vc-feasibility-test` (a one-shot empirical probe producing a VIABLE/NOT-VIABLE/INCONCLUSIVE VERDICT), run before SPEC/INNOVATE locks. Do not use test tiers to answer "does this mechanism work at all?". ## When To Invoke - **PLAN phase** — populate the Verification Evidence section of a new plan - **VALIDATE Section III** — generate the full test plan after V2 fan-out, before writing the validate-contract - **EXECUTE phase** — as test gates at the end of each plan section and as a regression suite after all sections complete ## Context Discovery (MANDATORY FIRST — do this before anything else) This skill MUST NOT infer tiers, commands, or runners from training data. Before reading the plan or naming a single area: 1. Invoke `vc-context-discovery` to load the relevant context group files. 2. Read `process/context/tests/all-tests.md` **and follow its downstream routing chain** to the relevant deeper test docs (`tests/container-e2e.md`, `tests/browser-automation.md`, `tests/live-e2e.md`, etc.). The entry point is a router, not full knowledge — reading only the router and skipping the chain is insufficient. 3. Discover the existing test files inside the blast radius (real runners + real commands + real fixtures — not guesses). **Hard stop (mirrors `vc-plan-agent` TIER_ASSIGNMENTS_BLOCKED):** if the `all-tests.md` routing chain was not loaded, or existing blast-radius test files were not discovered, STOP and emit `TIER_ASSIGNMENTS_BLOCKED` — report BLOCKED with "Test context chain not loaded; returning to RESEARCH to load all-tests.md and discover existing test files. Do not generate tier assignments from training data." Do NOT proceed to the waterfall. Every `Command / Steps` cell below must be an exact command sourced from the loaded test context, never an inferred placeholder. ## Test Tier Decision Waterfall For each area in the plan's blast radius, assign a tier using this waterfall: 1. **Fully-automated** — if a deterministic command exists that exercises the area end-to-end without human judgment. Must be runnable in CI without setup beyond env vars. Examples: `pnpm test`, `bun test`, `node validate-script.mjs`, grep checks. 2. **Hybrid** — if the test requires a precondition (running container, live DB, specific env) that is not always available in CI, but the test itself is deterministic once set up. Record the precondition explicitly. Examples: container E2E tests, DB migration checks. 3. **Agent probe** — if the area requires judgment that cannot be mechanically asserted. Describe the probe scenario and what the agent should judge. Examples: UI visual regression, prose quality, API response plausibility. 4. **Known gap** — if no test exists and none can be added within the blast radius of this plan. Document the gap explicitly. Do not use this tier to avoid writing tests. ## High-Risk Classes These classes always require at least a hybrid test gate (no known-gap allowed without explicit documented rationale): - auth or identity flows - billing, payments, or credit accounting - schema/data migrations or destructive writes - public API or external contract changes - deploy/runtime/container/proxy/gateway behavior - permission, secret, or trust-boundary logic Required table format for high-risk class areas: | Area | High-risk class | Minimum tier | Gap rationale if known-gap accepted | |---|---|---|---| | [e.g. Auth/identity flow] | auth/identity | Hybrid | [If known-gap: must state why hybrid is impossible and what alternative coverage exists] | | [e.g. Billing credit deduction] | billing/credits | Hybrid | — | ## Hybrid Failure Resolution Priority When a hybrid test fails during or after EXECUTE: 1. **Fix now** — if the failure is in the blast radius of the current plan and the fix is small. Fix, re-run the hybrid gate, confirm green, then continue. 2. **New phase plan** — if the failure requires work that is outside the current phase scope but has a clear fix. Create a follow-up phase plan and document the gap. 3. **Update existing phases** — if the failure is in a phase that is still active and the fix can be absorbed without scope expansion. Route the fix back to that phase. 4. **Backlog note** — if the failure is in a known-gap area, the fix is non-trivial, and deferral is acceptable. Write a backlog artifact. Do not silently absorb it. ## Per-Area Test Plan Output Format Produce one block per area in the blast radius. Area = package, service, or logical surface (e.g. `packages/api` — new route, `packages/ui` — UI component). **Area: [package/service name]** | Tier | Scenario | Command / Steps | What it proves | What it does NOT prove | |---|---|---|---|---| | Fully-automated | [e.g. Route returns 200 with correct shape] | `[exact command]` exits 0 | [Specific outcome proved] | [Explicit gap] | | Fully-automated | [e.g. Route returns 401 on missing token] | Same suite, auth-rejection case | [Specific outcome proved] | [Explicit gap] | | Hybrid | [e.g. Integration with real DB] | `[exact command]` — precondition: [what must be running/set] | [Specific outcome proved] | [Explicit gap] | | Agent probe | [e.g. Visual or behavioral judgment] | [Step-by-step scenario for the agent] | [What the agent judges] | [What cannot be automated] | | Known-gap | [e.g. Load behavior under concurrent requests] | — | — | Cannot be tested within this plan's scope | Rules: - Include a row for every tier that applies. Omit a tier row only if the tier genuinely does not apply — do not omit to avoid work. - Known-gap rows must have `—` in the Command/Steps column and a brief reason in the "What it does NOT prove" column. - Fully-automated commands must be exact and runnable — do not use placeholder `[command]` in a real output. ## Gap Resolution Options Format After the per-area table, list every gap with four resolution choices: | Gap | Resolution options | |---|---| | [Gap 1 description] | A) [Write new test — estimated effort]. B) [Set up infra — what and how]. C) [Accept as known-gap — rationale]. D) [Backlog artifact — what to create]. | | [Gap 2 description] | A) [Option]. B) [Option]. C) [Option]. D) [Option]. | Resolution option rules: - **A — Write new test**: state file location and estimated effort (e.g. "30 min, new file `packages/api/src/__tests__/route-shape.test.ts`"). - **B — Set up infra**: name what infra is needed and how (e.g. "seed DB fixture via `pnpm db:seed:test`"). - **C — Accept as known-gap**: rationale is required — never blank. High-risk class gaps need especially strong rationale. - **D — Backlog artifact**: state what to create and where (e.g. "`prod-migration-smoke-test_NOTE_[date].md` in `process/features/development-process/backlog/`"). ## Missing Test Areas Format Areas with no coverage possible at any tier within this plan's scope: | Area | Why untestable in this plan | Resolution chosen | |---|---|---| | [e.g. Production migration path] | Requires prod-like Postgres; outside phase scope | Backlog: [artifact name] | | [e.g. Token expiry mid-session] | Requires Clerk test tenant with configurable JWT TTL | Backlog: [artifact name] | | [e.g. Cross-instance isolation] | Requires 2+ live running instances | Deferred to [program/phase name] | ## Execution Protocol 0. **Run Context Discovery (MANDATORY FIRST) above** — load the `all-tests.md` routing chain and discover existing blast-radius test files. If not loaded, emit `TIER_ASSIGNMENTS_BLOCKED` and STOP; do not continue. 1. Read the plan file at the provided path (or parse the blast radius description if no path given). 2. Extract the blast radius areas from the plan + the loaded test context — never infer commands/runners from training data. 3. For each area, run the Test Tier Decision Waterfall. 4. Flag any area that matches a High-Risk Class — enforce hybrid minimum. 5. Produce the per-area test plan block (5-column table + gap resolution table). 6. Produce the missing test areas table. 7. If invoked during VALIDATE (Section III), embed output directly into the validate menu under "III. Test Coverage Plan" — do not write a separate file. 8. If invoked during PLAN or EXECUTE, output directly in chat for the caller to copy into the plan file. ## TDD Stub Output Requirement For every **Fully-automated tier row** in the per-area output table, append immediately after that row's 5-column entry an inline failing test skeleton in plain text: ``` Failing stub: test("should [behavior from Scenario column]", () => { throw new Error("NOT IMPLEMENTED — TDD stub for: [behavior]") }) ``` Rules for the stub: - The stub is destined for the validate-contract's Test Gates section, to be consumed by execute-agent as the red-first starting point (Mode A hard gate). It is **NOT** an on-disk `.test.ts` file — do not write it to disk during VALIDATE or PLAN phase. - The stub content must match the Scenario cell verbatim so execute-agent can find it by scenario name. - **Hybrid / Agent-Probe / Known-Gap tiers do NOT receive stubs.** A literal red E2E or container test is too costly to mandate; hybrid stubs are advisory only. Clarification note: `vc-test-coverage-plan` retains its exhaustive behavior-inventory framing — "each row is a behavior to COVER, not a test to write upfront." The stubs make the coverage intent machine-executable at EXECUTE time, not upfront test implementation. The four tier words (Fully-automated / Hybrid / Agent-Probe / Known-Gap) remain verbatim; this requirement is additive to the per-area output format. ## Absorption Note This skill absorbs `vc-test-tier-selector` if that skill existed. If `vc-test-tier-selector` still exists on disk as a separate folder under `.claude/skills/`, treat this skill as its canonical replacement and note the duplication in the phase report. Do not route new work to `vc-test-tier-selector`.