vc-feasibility-test
withkynam/vibecode-pro-max-kit/.claude/skills/vc-feasibility-test/SKILL.md
Use when a SPEC, INNOVATE, or VALIDATE (Layer 2) approach hinges on an unverified runtime/library/external mechanism: run a probe from the 8-family taxonomy and produce a VIABLE/NOT-VIABLE/INCONCLUSIVE VERDICT artifact.
Skill1.1k starsChanged 3 months ago
---
name: vc-feasibility-test
description: "Use when a SPEC, INNOVATE, or VALIDATE (Layer 2) approach hinges on an unverified runtime/library/external mechanism: run a probe from the 8-family taxonomy and produce a VIABLE/NOT-VIABLE/INCONCLUSIVE VERDICT artifact."
argument-hint: "[hypothesis] [task-folder] [probe-family]"
trigger_keywords: feasibility, spike, verify assumption, probe mechanism, empirical check, unverified mechanism, does this work, runtime quirk, api shape check
layer: contract
metadata:
author: vibecode-pro-max-kit
version: "2.0.0"
---
# vc-feasibility-test
> **Output style:** Follow `process/development-protocols/communication-standards.md` — answer-first, plain language, no unexplained jargon, TL;DR on long responses.
One-shot empirical probe skill. Used when SPEC or INNOVATE encounters an approach
hinging on an unverified external/runtime/library mechanism — the question is
**"does this mechanism actually work the way the design assumes?"**, asked
**before** the decision locks.
## Boundary vs vc-test-coverage-plan
These two skills are complementary and must not be confused:
- **`vc-feasibility-test` (this skill) = PRE-decision.** "Does the mechanism work at
all?" Run *before* SPEC/INNOVATE locks an approach, when the answer is unknown.
Output: a one-shot VERDICT artifact.
- **`vc-test-coverage-plan` = POST-plan.** "How do I cover this blast radius across
the 4 test tiers?" Run *after* a plan exists, when the design is already chosen.
Output: a per-area tier table.
If the approach is already decided and you are assigning test tiers → use
`vc-test-coverage-plan`. If you cannot decide *because* a mechanism is unverified →
use this skill first.
## When To Invoke
- When vc-spec-agent, vc-innovate-agent, or a vc-validate-agent Layer 2 dimension agent emits `VC-FEASIBILITY-PROBE-NEEDED`
- When a mechanism cannot be verified from source code alone
- One-shot: not an iterative loop (use vc-autoresearch for iteration)
## Skill Executor
Always executed by vc-debugger (via the `VC-FEASIBILITY-PROBE-NEEDED` signal routing
in orchestration.md). SPEC, INNOVATE, and VALIDATE Layer 2 agents do not run probes themselves.
## Probe-Method Taxonomy (pick one family)
Every probe belongs to one of these 8 families. Name the chosen family in the VERDICT.
Each family has a default cost/safety class (see next section) — the probe inherits it.
| # | Family | What it probes | Typical method | Default cost class |
|---|---|---|---|---|
| 1 | **Local process / Node script** | pure library/runtime behavior in isolation | run a `.mjs`/Bun script, regex/parse check, call the lib fn directly | cheap-local |
| 2 | **Unit/integration test harness** | behavior under the project's own test runner | `pnpm --filter … test` (Vitest) or `bun test` on a scratch case | cheap-local |
| 3 | **tRPC / Prisma / DB query** | route shape, query behavior, index/constraint semantics | hit a tRPC route or run a Prisma/raw-SQL query against a test DB | needs-container *(only if it needs the live app DB)* / else cheap-local |
| 4 | **External API shape capture** | real response shape/behavior of a 3rd-party API | one live request to OpenRouter / Stripe / Composio / Clerk / Bright Data | **needs-live-provider** |
| 5 | **Container exec / internal-port curl** | in-container service behavior, proxy injection, file-server, supervisord | `docker exec … curl http://localhost:{port}` on a **disposable** container | **needs-container** |
| 6 | **Browser / CDP capture** | anti-detect quirks, CDP events, SPA nav, popup behavior | Playwright/CDP client, `page.on(...)`, snapshot | needs-browser |
| 7 | **WS / SSE handshake & timing** | gateway WS framing, SSE delivery/reconnect, JSONL shape | raw `ws`/`EventSource` client + frame/timing capture | needs-container *(if against in-container service)* / else cheap-local |
| 8 | **Cloudflare worker runtime** | KV staleness, step-replay/idempotency, edge JWT verify | `wrangler dev` + curl, deploy a throwaway worker | needs-cf |
If none of the 8 fit, the question is probably not a feasibility probe — reconsider
whether `vc-research-agent` (unknown *context*) or `vc-test-coverage-plan` (known
design) is the right tool instead.
## Probe Cost / Safety Class (MANDATORY GATE)
Every VERDICT declares one cost class. The class governs whether the probe may run
unattended or needs explicit opt-in. **A probe that cannot be run within its safety
gate produces an `INCONCLUSIVE` verdict — it is never silently skipped or faked.**
| Cost class | Safety gate | If gate not met |
|---|---|---|
| **cheap-local** | none — run freely (local script, test harness, parse check) | n/a |
| **needs-container** | use a **disposable** container only. NEVER `docker exec` the shared dev container (`app-*`) or shared Postgres. Disposable live-E2E containers need the disposable-cleanup env gate enabled. | verdict `INCONCLUSIVE`, note "no disposable container available" |
| **needs-live-provider** | requires explicit **double opt-in** from the user before any billed/live 3rd-party call (OpenRouter, Stripe, Composio, Bright Data, Clerk). Default local mode is BYOK Mistral. | verdict `INCONCLUSIVE`, note "live-provider opt-in not granted" |
| **needs-browser** | a browser/CDP session must be available; never drive a shared user session | verdict `INCONCLUSIVE`, note "no browser session available" |
| **needs-cf** | a `wrangler dev`/throwaway-worker sandbox; never touch a deployed production worker | verdict `INCONCLUSIVE`, note "no CF sandbox available" |
The emitted `VC-FEASIBILITY-PROBE-NEEDED` signal SHOULD carry the anticipated cost
class so the orchestrator can resolve the opt-in gate before dispatching vc-debugger
(see orchestration.md §VC-FEASIBILITY-PROBE-NEEDED Signal Routing).
## Probe Execution Steps
1. Read the hypothesis from the `VC-FEASIBILITY-PROBE-NEEDED` signal
2. Pick the probe **family** (1–8) and its **cost class**
3. Confirm the safety gate for that cost class is met. If not → write an
`INCONCLUSIVE` verdict with the gate-not-met reason and stop. Do NOT escalate
to a higher-cost probe or run against a shared resource.
4. Design the minimal probe within that family
5. Run the probe empirically — capture actual output, not expected output
6. Analyze the evidence: does it confirm or refute the hypothesis?
7. Assign a verdict: `VIABLE` | `NOT-VIABLE` | `INCONCLUSIVE`
8. Write the VERDICT artifact to the active task folder
## VERDICT Artifact Format
Filename: `{slug}_FEASIBILITY_{dd-mm-yy}.md`
Location: same active task folder as the SPEC/plan that triggered the probe
**Required frontmatter fields (MUST be present — validated by `validate-feasibility-verdict.mjs`):**
```yaml
---
slug: [task-slug]
date: YYYY-MM-DD
verdict: VIABLE | NOT-VIABLE | INCONCLUSIVE
originating-phase: spec | innovate | pvl
---
```
The `originating-phase:` field is REQUIRED. Valid values:
- `spec` — probe triggered by vc-spec-agent ([SP3])
- `innovate` — probe triggered by vc-innovate-agent ([I2.5])
- `pvl` — probe triggered by vc-validate-agent Layer 2 ([V2-PROBE])
Required sections (MUST be present — validated by `validate-feasibility-verdict.mjs`):
### Hypothesis
One-sentence statement of what is being tested.
### Mechanism Under Test
The specific external, runtime, or library behavior being probed.
### Probe Family
One of the 8 families above (e.g. `5 — Container exec / internal-port curl`).
### Probe Cost Class
One of: `cheap-local` | `needs-container` | `needs-live-provider` | `needs-browser` | `needs-cf`.
State whether the safety gate was met.
### Probe Method
The exact command(s) or steps run to test the hypothesis.
### Evidence Captured
The raw output from the probe (trimmed to relevant lines). For an `INCONCLUSIVE`
gate-not-met verdict, state explicitly that the probe was not run and why.
### Verdict
One of: `VIABLE` | `NOT-VIABLE` | `INCONCLUSIVE`
### Resulting Design Constraint
The "action consequence" of the probe, split into three explicit parts:
- **What this licenses:** what the approach is now allowed to depend on.
- **What this forbids:** what the approach must NOT depend on.
- **What remains uncertain (known-gap):** what the probe did not settle and must be
treated as an open risk (for `INCONCLUSIVE`, this is the main content).
## Completion Signal
After writing the VERDICT artifact, emit:
```
VC-FEASIBILITY-VERDICT-READY: [verdict keyword] — [full path to VERDICT file]
```
Example:
```
VC-FEASIBILITY-VERDICT-READY: NOT-VIABLE — process/features/model-selector/active/model-selector_10-06-26/model-selector_FEASIBILITY_10-06-26.md
```
## Re-spawn Handoff
The orchestrator reads the VERDICT artifact and extracts a `Prior Feasibility:` summary.
Format passed to the re-spawned agent:
```
Prior Feasibility: [hypothesis] — verdict: [VIABLE|NOT-VIABLE|INCONCLUSIVE] — licenses: [one line] — forbids: [one line] — uncertain: [one line]
```
Example:
```
Prior Feasibility: Does the gateway forward params.provider.sort? — verdict: NOT-VIABLE — licenses: nothing new — forbids: any approach depending on params.provider.sort being forwarded (the layer strips it) — uncertain: whether a different forwarding field survives
```
The re-spawned SPEC, INNOVATE, or VALIDATE agent reads this block and uses the verdict to lock or reject the approach. When `originating-phase: pvl`, the re-spawned vc-validate-agent resumes from V1 and records resolved probes in a `## Feasibility Probes Resolved` subsection of the validate-contract (omitted when no probe ran).
Discussion
Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.
Posts are public.Sign in to post
No one has posted yet. Be the first.

