Crosscheck is the 2x-maintained, open-source verification gate for completed work.
Its deterministic runtime binds evidence to an exact target and returns PASS,
FAIL, or BLOCKED. Only PASS clears that target. A later change or expired
result requires fresh verification. PASS grants no merge, closure, deployment,
or account-change authority.
Release candidate: 0.3.0-rc.1. The runtime, schemas, approved $crosscheck
skill and four references are packaged for review. Fresh independent QA and
owner release verification remain required. The existing qa-agent plugin and
$independent-verification skill remain unchanged and usable; they do not
automatically enforce the new runtime.
Requires Python 3.11 or later. From this repository checkout:
./scripts/install-runtime.sh .venv-crosscheck
.venv-crosscheck/bin/crosscheck --helpThe installer creates a new isolated environment and refuses to overwrite an
existing one. This repository is the canonical source:
2xgrowthagency/crosscheck, renamed from 2xgrowthagency/independent-qa-agent.
The Python distribution is crosscheck-verifier; no package registry release
has been published. Install the reviewed checkout, not an assumed registry package.
From a reviewed candidate checkout, register that local repository:
codex plugin marketplace add /path/to/reviewed-crosscheck-checkout
codex plugin add crosscheck@independent-qa-agentStart a fresh task and invoke $crosscheck. This installs the instructions;
install the runtime separately using the command above. The marketplace retains
its machine name independent-qa-agent to preserve installed references; its
visible name is Crosscheck. The main-branch marketplace will gain the canonical
plugin only after the owner releases this candidate.
The legacy installation remains qa-agent@independent-qa-agent, invoking
$independent-verification. Existing users can keep it alongside Crosscheck.
./scripts/install-claude-skill.sh /path/to/target-project crosscheckThis copies the approved skill and four references into
.claude/skills/crosscheck/. Start a fresh Claude Code session in that project
and invoke /crosscheck. Runtime installation is separate. The installer
refuses to overwrite existing instructions or copy an incomplete managed package.
Omitting crosscheck retains the legacy default: the unchanged
.claude/skills/independent-verification/ package, invoked with
/independent-verification. Actual harness discovery and invocation are separate
checks from Python entry points and filesystem copying; see the
isolated harness checks.
A trusted fresh verifier collects observations and a current target readback. The runtime checks those inputs; it does not launch an agent, execute producer commands, enforce an operating-system sandbox, or prove that an attestation is true. The harness must provide execution separation and a read-only target.
crosscheck evaluate \
--manifest /path/to/evidence/evidence-manifest.json \
--evidence-root /path/to/evidence \
--current-target /path/to/current-target.json \
--target-root /path/to/read-only-product \
--output /path/to/new-private-report-directoryThe output contains qa-report.md, evidence-manifest.json, and
crosscheck-receipt.json. Keep the original artifact bundle alongside the reports;
manifest artifact paths resolve against --evidence-root. A missing receipt means
an incomplete run. Exit codes are 0 for PASS, 1 for FAIL, and 2 for BLOCKED or an
invalid/unavailable contract. A malformed contract cannot issue a valid receipt.
Before consuming a stored result, run crosscheck verify-receipt with the same
inputs and --receipt /path/to/crosscheck-receipt.json, omitting --output.
It reads qa-report.md beside the receipt, or the exact file specified by
--report. Missing or changed report bytes fail closed. Validated PASS, FAIL and
BLOCKED receipts retain exit codes 0, 1 and 2, respectively; invalid or stale
inputs return BLOCKED with exit 2. Receipt schema 1.1 requires report hashes and
criterion totals; pre-release 1.0 receipts cannot clear this revised gate.
The current-target file must be freshly read by the trusted harness each time.
Never use a comment, old target snapshot or gate_cleared boolean as approval.
The unreleased final-boss CLI remains an alias and still writes
final-boss-receipt.json; Python final_boss imports share the Crosscheck runtime.
Stored Final Boss report/receipt pairs remain readable only when their exact
original bytes, bound target and freshness still validate. New reports and
comments use Crosscheck; exact legacy comment markers are reconciled in place.
See the migration matrix for installed legacy skill identities, which remain unchanged.
The profile policy defines inputs, checks, evidence, failure modes, stop conditions and PASS meaning for code/PR, UI, interactive workflows, documents, data, operations, decisions and QA processes. Multiple criteria can use different profiles in one bound target.
See the contract reference, synthetic screenshot and interaction bundle, PASS/FAIL/BLOCKED comment examples, integration interfaces, and migration matrix.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python tests/validate.py
.venv/bin/python -m unittest discover -s tests -v
.venv/bin/python tests/install_smoke.py
git diff --checkCI checks Python 3.11, 3.12 and 3.14. Optional screenshot recapture uses Playwright
1.58.0 and scripts/capture-demo.py; normal tests replay fixed synthetic bytes
and never launch a browser, access credentials, or call a model.
See contribution and release requirements.
MIT license. Migration behavior derives from John Chan’s public v0.2.1 implementation; private company instructions are not included.