Validate
Independently judge one exact subject against the acceptance in its existing
bead or caller source, return one semantic result, and stop. Validate is the
sole verdict.v2 writer when persistence is requested. It never asks the model
to reconstruct Plan or Candidate packets.
Preconditions
- The subject is a nonempty implementation candidate: the manifest lists at
least one entry, and
store-verdict refuses an empty one. Plans, audits,
reviews, and other control artifacts are not completion subjects unless the
caller explicitly requested document review.
- The intent source is available as a caller-owned artifact or runtime-owned
content-addressed snapshot; its acceptance digest is derived automatically.
- The subject manifest still matches the subject.
- Author and validator context IDs are explicit.
- Freshness is explicitly attested with
source: runtime | caller and an
attester identity.
Missing, colliding, or unattested identities produce NOT_PROVEN. This is a
declared trust fact, not cryptographic proof that contexts were isolated.
Cross-model fresh validator (caller-elected)
A caller may request that the fresh validator run on a different model than
the author. Dispatch via the controller-session recipe in
the agent-native model-dispatch recipe (codex-exec and/or ntm,
probed at runtime). Record author and validator model_identity in evidence
refs and freshness attestation notes — do not change verdict.v2 schema. If
the requested validator model has no live adapter, disclose the unsatisfied
diversity request and proceed same-model; never invoke claude -p /
claude --print. Single fresh validator remains the default shape.
Mutating-check quarantine
Before running any acceptance-listed command, classify it as read-only or
subject-mutating. Regen scripts, sync scripts, formatters, and anything with
--force are subject-mutating until proven otherwise. Never run a
subject-mutating check against an uncommitted subject: on 2026-07-15,
scripts/test-ci-deterministic-gates.sh regenerated skills-codex/ from HEAD
mid-validation and destroyed the uncommitted subject, forcing NOT_PROVEN
(verdict b6e759dd...cb6a); only restoring the subject and revalidating in a
fresh context produced the PASS (e9b6cdb8...37b9). If a mutating check is
genuinely required by acceptance, run it against a disposable copy or a
committed subject, never the judged working tree.
Workflow
- Recompute and compare
subject-manifest.v1 using
python3 skills/validate/scripts/validate.py manifest. The helper uses only
filesystem content; Git commit/tree IDs are optional metadata. Derive the
manifest at the start of validation and re-derive it at the end; any
mismatch between the two is subject mutation and returns NOT_PROVEN.
- Confirm the intent-source digest has not changed since implementation. If
the subject changed or complete changed-path coverage cannot be derived,
return
NOT_PROVEN.
- Adjudicate the actual diff, not a declared path list: compare
runtime-derived actual changed paths against the intent's scope classes. A
proven out-of-scope path returns
FAIL; incomplete scope evidence returns
NOT_PROVEN.
- Inspect the exact subject and factual evidence. Reported exit codes are
claims, not evidence: re-execute the claimed proofs that bear on acceptance
(see the freshness rules below for when a digest-bound receipt suffices).
Judge every acceptance criterion and record criterion-level results,
findings, evidence references,
checked, and not_checked.
- Choose exactly one semantic result:
PASS, FAIL, or NOT_PROVEN. Return
it with criterion results, findings, evidence references, checked,
not_checked, the acceptance and subject identities, distinct author and
validator context IDs, and the freshness attestation. PASS requires distinct
identities, explicit freshness, nonempty checked scope, top-level evidence,
and evidence for every criterion.
- Only when the caller requests machine-readable evidence or a declared
downstream consumer requires it, persist canonical
verdict.v2 with
store-verdict --draft <draft.json> --intent-source <resolved-intent> --subject-manifest <manifest.json> --author-context-id <id> --validator-context-id <id> --freshness-source <runtime|caller> --freshness-attester-id <id> --scope-result <PASS|FAIL|NOT_PROVEN>. The
helper snapshots the exact resolved intent under
<workspace>/.agents/ao/intents/sha256/<digest>.intent, then computes and
injects intent and subject digests plus author, validator, and freshness
facts. Identity and changed-path facts come from runtime-derived inputs and
receipts, not model transcription. Storage defaults to
<workspace>/.agents/ao/verdicts/sha256/<digest>.json; callers may provide
verdict_dir.
- Return the semantic result and, when persisted, the artifact path and digest.
Stop.
The digest is SHA-256 over canonical JSON with artifact_digest omitted. Writes
use a same-directory temporary file, flush, fsync, and atomic rename. Identical
existing content is idempotent success; conflicting content is an integrity
failure represented by NOT_PROVEN.
Freshness without duplication
Fresh validation means independent judgment over the exact subject. It does not
require mechanically replaying every author command. Verify intent identity,
scope, evidence digests, and every acceptance criterion; independently rerun
the risk-critical, uncertain, or insufficiently evidenced checks. A
digest-bound deterministic receipt may prove routine facts. Replay an expensive
full suite only when acceptance requires that result or the supplied receipt
cannot establish it.
Boundary
Validate emits no WARN, confidence, disposition, briefing learning, owner,
next action, repair, retry, replan, helper, escalation, tracker, Git, release,
closure, or delivery state. Generic provenance may record a verdict later, but
ledger availability cannot change its validity.
1---2name: validate-23description: "Freshly judge exact subject content against bead or caller acceptance, optionally persist verdict.v2 for a declared consumer, and stop. Triggers: \"validate\", \"independently validate\", \"vibe\"."4---56# Validate78Independently judge one exact subject against the acceptance in its existing9bead or caller source, return one semantic result, and stop. Validate is the10sole `verdict.v2` writer when persistence is requested. It never asks the model11to reconstruct Plan or Candidate packets.1213## Preconditions1415- The subject is a nonempty implementation candidate: the manifest lists at16 least one entry, and `store-verdict` refuses an empty one. Plans, audits,17 reviews, and other control artifacts are not completion subjects unless the18 caller explicitly requested document review.19- The intent source is available as a caller-owned artifact or runtime-owned20 content-addressed snapshot; its acceptance digest is derived automatically.21- The subject manifest still matches the subject.22- Author and validator context IDs are explicit.23- Freshness is explicitly attested with `source: runtime | caller` and an24 attester identity.2526Missing, colliding, or unattested identities produce `NOT_PROVEN`. This is a27declared trust fact, not cryptographic proof that contexts were isolated.2829## Cross-model fresh validator (caller-elected)3031A caller may request that the fresh validator run on a different model than32the author. Dispatch via the controller-session recipe in33the `agent-native` model-dispatch recipe (`codex-exec` and/or `ntm`,34probed at runtime). Record author and validator `model_identity` in evidence35refs and freshness attestation notes — do not change `verdict.v2` schema. If36the requested validator model has no live adapter, disclose the unsatisfied37diversity request and proceed same-model; never invoke `claude -p` /38`claude --print`. Single fresh validator remains the default shape.3940## Mutating-check quarantine4142Before running any acceptance-listed command, classify it as read-only or43subject-mutating. Regen scripts, sync scripts, formatters, and anything with44`--force` are subject-mutating until proven otherwise. Never run a45subject-mutating check against an uncommitted subject: on 2026-07-15,46`scripts/test-ci-deterministic-gates.sh` regenerated `skills-codex/` from HEAD47mid-validation and destroyed the uncommitted subject, forcing `NOT_PROVEN`48(verdict `b6e759dd...cb6a`); only restoring the subject and revalidating in a49fresh context produced the PASS (`e9b6cdb8...37b9`). If a mutating check is50genuinely required by acceptance, run it against a disposable copy or a51committed subject, never the judged working tree.5253## Workflow54551. Recompute and compare `subject-manifest.v1` using56 `python3 skills/validate/scripts/validate.py manifest`. The helper uses only57 filesystem content; Git commit/tree IDs are optional metadata. Derive the58 manifest at the start of validation and re-derive it at the end; any59 mismatch between the two is subject mutation and returns `NOT_PROVEN`.602. Confirm the intent-source digest has not changed since implementation. If61 the subject changed or complete changed-path coverage cannot be derived,62 return `NOT_PROVEN`.633. Adjudicate the actual diff, not a declared path list: compare64 runtime-derived actual changed paths against the intent's scope classes. A65 proven out-of-scope path returns `FAIL`; incomplete scope evidence returns66 `NOT_PROVEN`.674. Inspect the exact subject and factual evidence. Reported exit codes are68 claims, not evidence: re-execute the claimed proofs that bear on acceptance69 (see the freshness rules below for when a digest-bound receipt suffices).70 Judge every acceptance criterion and record criterion-level results,71 findings, evidence references, `checked`, and `not_checked`.725. Choose exactly one semantic result: `PASS`, `FAIL`, or `NOT_PROVEN`. Return73 it with criterion results, findings, evidence references, `checked`,74 `not_checked`, the acceptance and subject identities, distinct author and75 validator context IDs, and the freshness attestation. PASS requires distinct76 identities, explicit freshness, nonempty checked scope, top-level evidence,77 and evidence for every criterion.786. Only when the caller requests machine-readable evidence or a declared79 downstream consumer requires it, persist canonical `verdict.v2` with80 `store-verdict --draft <draft.json> --intent-source <resolved-intent>81 --subject-manifest <manifest.json> --author-context-id <id>82 --validator-context-id <id> --freshness-source <runtime|caller>83 --freshness-attester-id <id> --scope-result <PASS|FAIL|NOT_PROVEN>`. The84 helper snapshots the exact resolved intent under85 `<workspace>/.agents/ao/intents/sha256/<digest>.intent`, then computes and86 injects intent and subject digests plus author, validator, and freshness87 facts. Identity and changed-path facts come from runtime-derived inputs and88 receipts, not model transcription. Storage defaults to89 `<workspace>/.agents/ao/verdicts/sha256/<digest>.json`; callers may provide90 `verdict_dir`.917. Return the semantic result and, when persisted, the artifact path and digest.92 Stop.9394The digest is SHA-256 over canonical JSON with `artifact_digest` omitted. Writes95use a same-directory temporary file, flush, fsync, and atomic rename. Identical96existing content is idempotent success; conflicting content is an integrity97failure represented by `NOT_PROVEN`.9899## Freshness without duplication100101Fresh validation means independent judgment over the exact subject. It does not102require mechanically replaying every author command. Verify intent identity,103scope, evidence digests, and every acceptance criterion; independently rerun104the risk-critical, uncertain, or insufficiently evidenced checks. A105digest-bound deterministic receipt may prove routine facts. Replay an expensive106full suite only when acceptance requires that result or the supplied receipt107cannot establish it.108109## Boundary110111Validate emits no WARN, confidence, disposition, briefing learning, owner,112next action, repair, retry, replan, helper, escalation, tracker, Git, release,113closure, or delivery state. Generic provenance may record a verdict later, but114ledger availability cannot change its validity.