all skills / verify
arsdlc-verify
Run merge-safety gate G3 with recorded full-suite evidence, secrets scan and kind-specific checks, then final security verification for web/API/auth/data/infra changes.
Use when `arsdlc next` reports VERIFY, before a PR or completion claim, or the user says "verify", "is it done", "run the gates", "security audit" or "review website security". No completion claim without fresh evidence; missing proof is IMPLEMENTED-NOT-VERIFIED.
MIT · skills/arsdlc-verify/SKILL.md · read the same way by every supported harness
Install everything, or just this one
npx skills add AnshRoshan/arsdlcnpx skills add AnshRoshan/arsdlc --skill arsdlc-verifyClaude Code: /plugin marketplace add AnshRoshan/arsdlc, then/plugin install arsdlc@arsdlc. Skills work without the CLI; the CLI is what makes done mean something.
Verification is the moment the process either earns trust or destroys it. The output of this skill is evidence files, not sentences.
Iron law
NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE
If you have not run the command in this session and recorded it, you cannot say it passes. Violating the letter of this rule is violating the spirit of it.
The gate function (before any status claim, every time)
- IDENTIFY the command that would prove the claim.
- RUN it, fresh and complete, through
npx arsdlc evidenceso the run is recorded. - READ the entire output: exit code, failure count, skipped count, warnings that are really errors.
- VERIFY the output supports the claim. If not, state the actual status with the evidence file. If yes, state the claim with the evidence file.
- Only then make the claim.
| claim | requires | not sufficient |
|---|---|---|
| tests pass | full-suite run, exit 0, 0 failures, recorded | a previous run, "should pass", the subset you wrote |
| build succeeds | build command exit 0, recorded | linter passing, logs "look fine" |
| bug fixed | the red test now green + full suite green | code changed, assumed fixed |
| a11y ok | axe/pa11y report with 0 serious violations, recorded | "used semantic HTML" |
| migration safe | applied to a copy and rolled back, recorded | "it's just an add column" |
| subagent finished | diff on disk + its evidence files | the subagent said "done" |
What G3 checks (npx arsdlc gate G3 <slug>)
- Secrets scan clean across tracked and non-ignored files (9 detector families; placeholders ignored).
- A run was recorded: at least one
evidence/*.jsonwith a real command and an exit code. - Full suite recorded and green: the latest
fullevidence hasexitCode: 0, unless the repo declares a test policy (below). - Current evidence integrity: recorded checksums and source fingerprints match; legacy records must be re-run.
- All tasks checked off.
Test policy (arsdlc.json → test.gate)
Three states, because "this repo has no runner" and "nobody set one up" are different facts and only one of them is a choice:
| state | G3 requires | when it is true |
|---|---|---|
configured (default) |
a recorded full run, green |
the repo has a test command in plan.md Verification strategy |
none-by-design |
latest full run green, or latest recorded run green if no full run exists; waiver printed | docs site, IaC glue, a spike - a repo that deliberately ships no runner, with the reason in docs/taste.md |
none-yet |
the recorded full run, same as configured |
the honest state when tests simply were not written. It is not an escape hatch; write them |
Set it in arsdlc.json; none-by-design also requires a non-placeholder test.reason. Check with npx arsdlc doctor. Never reach for none-by-design to
make a gate go green: G4's human sign-off is what carries the risk, so say out loud that you are
handing the trade-off to a person.
Procedure
Run the whole suite, not just the tests you wrote:
npx arsdlc evidence <slug> --label full -- <full test command from plan.md Verification strategy>Run the plan's smoke path end to end — the exact commands a stranger would run — and record it as
--label smoke. Unit tests green with a broken entrypoint is the classic fake-green, and the smoke path is what catches it.Run kind-specific verification and record each as evidence with a descriptive label:
kind required extra evidence frontend component tests, visual diff (or screenshots), a11y audit (axe/pa11y), keyboard-only pass backend integration tests, preview/local smoke ( curlagainst a running instance), one negative-auth requestmobile emulator run, store checklist data invariant tests, backfill parity check, row counts before/after ml eval suite against thresholds; evals are tests; adversarial cases infra plan/dry-run, policy check, expand/contract order, destroy plan reviewed docs lint, link check, code samples executed lib API contract tests, semver check, back-compat test against the previous version Static checks the repo already has (typecheck, lint, build): run and record them too; a green suite on code that does not compile is not green.
npx arsdlc scan. Findings block; fix and re-run.npx arsdlc gate G3 <slug>. Paste the output verbatim.Scenario sweep: for every
#### Scenario:in the spec, name the evidence file that exercises it. Missing one? That is a missing test: go back to BUILD via a new task, do not proceed.Write
acceptance.mdrows for each spec scenario, linking the evidence file names (seearsdlc-review).
Worked example (what a real claim looks like)
claim: "the export flow works"
wrong: "I ran the tests earlier and they were green."
right: IDENTIFY → npm test -- export
RUN → npx arsdlc evidence demo --label full -- npm test
READ → exit 0, 84 passed, 0 failed, 0 skipped
CLAIM → "Full suite green: 84 passed (evidence/2026-09-27T10-12-03-full.json).
Smoke path ran: curl -s localhost:3000/export returns 200 CSV
(evidence/...-smoke.json). Re-run: npm test."
The difference is not politeness; the second message can be checked by a stranger and the first cannot.
Honesty protocol
- If a command cannot run (missing runtime, network, credentials), record it anyway with
--label blocked; the exit code and stderr are the evidence. ReportIMPLEMENTED-NOT-VERIFIEDand list exactly what a human must provide (names, never values). - Never edit an evidence file. They are append-only and hashed.
- Never delete, skip, or loosen a failing test to get green. Fix the code, or open a delta if the spec was wrong.
- Flaky test? Record three runs. Three greens are evidence; two out of three is a bug report →
arsdlc-debug. - Words that mean you have not verified: "should", "probably", "seems to", "I believe", "looks good", "Done!" before the command ran. Delete them and run the command.
Final security verification
Before acceptance or a completion claim, classify the change's security surfaces. For web/API/auth/data/infra changes or an explicit security audit, read references/security-verification.md and follow it: all 21 controls, architecture-backed applicability, recorded negative tests, OWASP/provider comparison, fixes and retests. Other changes still need secrets/dependency checks and an evidenced reason for excluded surfaces.
Write docs/features/<slug>/security-review.md; report VERIFIED, FAILED, NOT_APPLICABLE or NOT_VERIFIED with evidence. Failed or applicable unverified controls block a security-ready claim. CLI gate success is separate; the CLI does not automatically assess this report. End the handoff with security results and residual risks.
Hand off
When G3 is green, run npx arsdlc next <slug>; the state moves to ACCEPT. Load arsdlc-review. Prefer a fresh session for the review (segregation of duties); if you must continue, say so.