V-AC Feasibility
Pre-implementation gate proving every runtime-command V-AC (docker exec / curl / kubectl / systemctl / live DB query) can actually PASS before /dr-do.
Overview
A verification-AC (V-AC) can be written, reviewed, and cite the correct AC number, yet be impossible to satisfy under any correct implementation — because the runtime command it relies on tests something the runtime semantics never expose. This gate arms when a plan's Validation Checklist contains any V-AC whose verification is a runtime command: docker exec/kubectl exec, curl/wget/Playwright against a running service, systemctl/journalctl state or log assertions, redis-cli/psql/mongosh live-query assertions, or any assertion over a running process's environment/memory/in-flight state. Static V-AC (test -f, grep against a file, lint/unit exit codes) do not need this gate — they are deterministic against the working tree.
The Failure This Gate Prevents
Motivating incident: an AC asserting "env var X is set to Y on the running service" was verified by docker exec <container> printenv X. But printenv reads the shell's environment, not the value a running Node process holds after process.env[X] = Y was set in code. The assertion could never pass, no matter how correct the implementation — yet it survived plan review because the reviewer matched the AC number and the command shape without executing it against a real (or skeleton) runtime. Verbatim AC↔V-AC mirroring and semantic-match review are necessary but not sufficient: a V-AC must also be feasible, and feasibility is a property of runtime semantics, not of text.
The Contract
For every runtime-command V-AC, the plan must demonstrate — before locking it into the Validation Checklist — that the command can return the PASS result when the implementation is correct. Acceptable evidence, in order of preference:
- Dry-run against a real runtime. Execute the command against the running dev/staging/test service (or a stubbed skeleton standing in for the final one) and confirm it produces an observable, correct result under a deliberately-correct fixture. Quote the result inline in the plan.
- Semantic proof of the observation path. When no runtime is reachable at plan time, name the exact mechanism through which the asserted value becomes observable — e.g. "the value is logged via the application logger and asserted with
journalctl -u <unit> | grep", or "the value is exposed on/healthzJSON and asserted withcurl … | jq". A command whose observation path cannot be named is presumed infeasible. - Re-scope to a feasible assertion. If neither holds, replace the V-AC with one that is observable — the log line, HTTP response field, or persisted side-effect instead of the in-process value the runtime never exposes.
Common Infeasible Patterns
docker exec C printenv Xfor a value set viaprocess.env[X]=Yin code —printenvreads the shell env, not the live process's mutated env. Replacement: assert the app log line or a/confighealth field that echoes X.curl <url>before the service binds the port/route exists — unmapped route returns 404 regardless of correctness. Replacement: grep the router for the real path first, then assert the mapped route.kubectl exec … cat /proc/1/environfor a runtime-mutated var —/proc/1/environis the launch env, frozen at exec time. Replacement: expose the value through an app endpoint or structured log.systemctl show -p Environmentfor an app-set variable — shows unit-declared env, not values set inside the process. Replacement: assert via the app's own observability surface.
Output
Record the feasibility verdict inline in the plan next to each runtime-command V-AC, so a reviewer replays it without re-querying:
V-AC-N — feasible (dry-run: <command> → <observed PASS result>)V-AC-N — feasible (observation path: <named mechanism>)V-AC-N — infeasible as written → re-scoped to <new assertion>
A runtime-command V-AC with no feasibility annotation is a planning defect: fix the plan (prove or re-scope) before transitioning to /dr-do. Catching an infeasible V-AC at plan time costs one dry-run or one grep; catching it at /dr-do or /dr-verify costs a full pipeline cycle plus a V-gate reformulation.