CalculatorX Developers
Calculator Verification Protocol
A public, versioned protocol for verifying CalculatorX calculators with reproducible evidence. Proposed — not Stable.
Proposed CVP 1.0 — not Stable.
A public, versioned protocol for verifying CalculatorX computational tools with reproducible evidence.
| Layer | Answers |
|---|---|
| Evidence | What evidence exists for a calculator? |
| CVP (this page) | Which rules make that evidence sufficient? |
| Trust Summary | How do humans read the evaluation result? |
Trust Summary is the human-readable result of CVP verification — not a separate trust system.
Trust architecture
CVP Specification
↓
Verification Runner
↓
Evidence Manifest ──→ Attestation ──→ Production binding
↓
┌────┴────┐
Trust Summary Evidence JSON / API / MCP
(humans) (agents)
What does CVP Verified mean?
CVP Verified is CalculatorX machine verification against the public CVP protocol for a declared version and assurance profile. Evidence (Manifest, tests, digest, production attestation) is inspectable.
It does not mean third-party certification, laboratory accreditation, or an independent audit — unless that is explicitly stated. It does not mean every possible input has been enumerated. It means the declared model passed the required controls as specified, with published evidence.
Core (pure math / unitless transforms) is that machine-verification profile: algebraic model, independent O2 expected values, golden / boundary / invalid-input cases, declared partition coverage, contracts, cross-interface consistency, and production attestation. Domain expert review is optional; when it has not been performed, that absence is disclosed.
While Proposed, UI MUST show the CVP protocol version (including -proposed) plus the assurance profile in the badge (e.g. CVP VERIFIED · CVP protocol 1.0.0-proposed · Engineering assurance), not bare CVP VERIFIED. Do not emit a bare Proposed 1.0.0 token next to Calculation 1.1.1 — that collides with calculation versions. The assurance token is the CVP profile, not a calculator input mode. When a Manifest declares verified_scope, the badge and Trust card SHOULD show that scope as a claim field (example: Verified scope: Basic RSS/WCA).
What cross-interface PASS means
CVP-IFACE-01 compares equivalent semantic inputs across published surfaces: crawlable UI (SSR) query-result HTML, REST, and MCP. MCP invokes the same calc API handler as REST — it is not a second independent runtime.
PASS means those surfaces agreed on the recorded samples. It does not prove a live browser session, client hydration, cache switching, or end-to-end UI interaction. Those remain outside Core interface evidence unless a separate check is explicitly recorded.
Core controls (summary)
CVP evaluates objective evidence across:
- Formula / model provenance
- Independent reference (
reference_scope: model · expected values · numerical behavior) - Golden, boundary, and invalid-input tests
- Numerical policy (no post-hoc tolerance fit)
- Input / mode coverage
- Semantic contracts
- Cross-interface consistency (when multiple surfaces exist)
- Artifact integrity
- Production attestation
- Stochastic / Monte Carlo contract (when the IUT is RNG-driven): RNG + seed + sampler, seeded O2, analytic vs sampling layers, semantic partitions, sampling CI
Normative MUST / SHOULD language lives only in the specification.
Assurance profiles
| Profile | Typical use |
|---|---|
core |
Pure math / unitless transforms |
engineering |
Physical models with units and assumptions |
numerical |
Iterative / approximate / high-precision algorithms |
Random / Monte Carlo calculators keep their assurance profile (engineering or numerical) and additionally satisfy the stochastic contract: RNG + seed + sampler, a seeded stochastic O2, analytic vs sampling layers, semantic partitions, and sampling CI when yield is published. Gold standard: Monte Carlo Tolerance Analysis.
CVP vs Review policy
| Signal | Role |
|---|---|
| CVP | Computational verification status from Evidence Manifest |
| Review policy / Domain Expert Review | Supplemental human / domain assurance — does not by itself determine CVP conformance |
Short-term both coexist. Long-term, CalculatorX trust claims migrate to the CVP evidence model.
Reproducing O3 reference tables
Calculators that declare O3 (mpmath high-precision, or MPFR only when that backend is recorded) expected values publish the generator, table, hashes, and the tabulated vectors — not only the pass/fail summary. The same reproduce contract covers math and engineering pilots.
Math example — math.cos
| Item | Location |
|---|---|
| Public reproduce page | /evidence/math.cos/reproduce |
| Reproduce JSON | /evidence/math.cos/reproduce.json |
| Public table | /developers/cvp/reproduce/math-o3-tables.json |
| Public generator | /developers/cvp/reproduce/generate-math-o3.py |
| Workspace generator | scripts/lib/cvp/oracles/generate-math-o3.py |
| Re-run command | python3 scripts/lib/cvp/oracles/generate-math-o3.py |
| Pack re-run | npm run cvp:run -- --capability math.cos |
Engineering example — electrical.rf.antenna_length
Antenna Length (1.0.3, verification revision 2026-09-11.o3-cov) is the public engineering O3 template: element-fraction model (O1) plus V8-independent mpmath table (O3).
| Item | Location |
|---|---|
| Public reproduce page | /evidence/electrical.rf.antenna_length/reproduce |
| Reproduce JSON | /evidence/electrical.rf.antenna_length/reproduce.json |
| Public table | /developers/cvp/reproduce/antenna-length-o3-tables.json |
| Public generator | /developers/cvp/reproduce/generate-antenna-length-o3.py |
| Workspace generator | scripts/lib/cvp/oracles/generate-antenna-length-o3.py |
| Re-run command | python3 scripts/lib/cvp/oracles/generate-antenna-length-o3.py |
| Pack re-run | npm run cvp:run -- --capability electrical.rf.antenna_length |
| Immutable Manifest | /evidence/electrical.rf.antenna_length/1.0.3/2026-09-11.o3-cov.cvp.json |
Shared reproduce fields and CLI
Manifest fields: generator_id, seed, table_sha256, reproduce, claim_scope, links.reproduce.
Each reproduce vector lists inputs, expected_f64 / expected_decimal, the last IUT actual, and ULP error. Re-running the generator without changing seed or inputs should reproduce the table digest.
A third party can re-check a published package without the CalculatorX engine:
npm run cvp:verify -- public/evidence/math.cos
npm run cvp:verify -- public/evidence/electrical.rf.antenna_length
# or: node scripts/run-cvp.mjs verify --package <dir|reproduce.json|pack.zip>
That CLI hashes the O3 table and/or re-runs the public O2 checker. It is not a hosted runner (runner.calculatorx.com) and does not prove a live browser session.
Claim scope: O3 PASS means the published tabulated vectors met the a-priori ULP policy. It does not mean every real input (huge angles, unlisted zeros, or unlisted antenna geometries) meets the same bound.
Versions: calculator.version is the calculation algorithm; protocol.version is CVP; verification_revision is the evidence batch. Adding CVP controls does not by itself bump the calculation version. Antenna Length stays 1.0.3 while evidence revision 2026-09-11.o3-cov evolves independently.
Digest names (do not interchange)
Agents often see several SHA-256 values labeled loosely as “evidence digest.” They hash different subjects:
| Interop name | Field | Scope |
|---|---|---|
cvp_core_sha256 / cvp_evidence_digest |
Manifest artifacts.cvp_core_sha256 (= evidence_digest) |
CVP verification fingerprint v2 (immutable core) |
artifact_evidence_sha256 |
Evidence release_integrity.digests.evidence_core_sha256 |
Canonical Evidence core (Trust freshness) |
evidence_catalog_digest |
Manifest artifacts.attested_catalog_sha256 / report attested_catalog_digest |
Capability catalog integrity |
Core vs Overlay: attestation status, CURRENT/STALE, timestamps, and Evidence tests.contract counts are Trust Overlay — they MUST NOT change cvp_core_sha256. Immutable pins are write-once for a given core digest.
Also distinguish display fields:
| Field | Meaning |
|---|---|
verification_status |
Suite obligations only (VERIFIED / FAILED / …) |
production_freshness |
Attestation bind of cvp_core_sha256 (CURRENT / STALE / ABSENT) |
overall_trust |
Machine overall (VERIFIED / VERIFIED_STALE / VERIFIED_UNATTESTED / …) |
status |
Composite Trust projection (suite + freshness). VERIFIED requires CURRENT. |
Production Attestation binds cvp_core_sha256, not the overlay revision label and not live CURRENT/STALE fields. Immutable pins are write-once for a given core digest; latest.cvp.json may carry overlay updates.
Manifests SHOULD expose artifacts.digest_registry with digest_scope, digest_algorithm, and canonicalization. Spec: CVP §11.1.
Production attestation
CVP-PROD-01 binds to the site-wide report at /.well-known/calculatorx-production-attestation.json. The calculator Manifest attestation field is a projection of that report onto the capability — not a second independent signature.
Distinguish two layers:
| Layer | Meaning |
|---|---|
Site-wide artifact checks (status=pass, is_current=true) |
Published HTML / schema / evidence digests matched when the report was written |
| Per-calculator CVP Production CURRENT | Requires CVP Manifest VERIFIED and Manifest attestation CURRENT |
A site-wide pass does not by itself authorize Calculator / Capability / Evidence Trust rows to show Production CURRENT, and MUST NOT paint CVP VERIFIED when the Manifest is STALE. Trust surfaces share one final CVP status; local artifact PASS must not independently invent VERIFIED/CURRENT.
calculator-html-cvp-projection is a full Trust Projection equality check, not a badge-only check. Advertised Calculator / Capability / Evidence fields (revision, verified_scope, deferred_scope, coverage N/N, suite counts, digest) MUST match the Manifest. A VERIFIED badge with an old scope-honesty revision is a fail. Share URLs that are a primary UX (for example Tolerance Stack-up ?mode=rss&tol1=…) are probed in addition to the canonical calculator page.
Inside the production report, also distinguish probe snapshot from final CVP status:
| Field | Meaning |
|---|---|
snapshot_status / items[] |
Probe-time checks. Immediately after the digest-stamp attest (before cvp:run + Trust HTML redeploy), CVP surface rows may still say STALE. After the closing attest (post-CVP deploy), these should agree with live VERIFIED. |
cvp_probe_status |
Index of those probe-time CVP statuses. |
current_cvp_status |
Final publish gate per capability. Updated when cvp:run binds Manifest attestation to CURRENT; does not rewrite items or mint a new attestation_id until the next --write. |
Auditors should prefer a closed deploy (npm run deploy:pages) where the final --write re-probes after VERIFIED is live, so items / cvp_probe_status / current_cvp_status tell one story. If reading an in-flight report, gate on Manifest attestation.status=CURRENT and current_cvp_status, not a lone historical STALE string in an older probe detail.
Site-wide status: stale is not a calculator veto. The top-level report is a snapshot of every attested capability. One STALE capability (or a digest drift) sets status=stale and is_current=false even when 9776/9776 probe items PASS and electrical.apparent_power is VERIFIED + CURRENT. Read these fields instead of treating the first stale token as site-wide failure:
| Field | Meaning |
|---|---|
snapshot_status |
Artifact probe result (pass / fail) |
stale_capability_count / cvp.stale |
How many capabilities are live CVP STALE |
verified_current_capability_count / cvp.current |
How many are live VERIFIED + CURRENT |
stale_reason |
Why the top-level status is stale, including which ids |
current_cvp_status.{capability_id} |
The calculator gate |
After Evidence or Manifest regeneration: digest-stamp with attest:production --write, bind with cvp:run, deploy Trust HTML, then attest again so attested_evidence_digest matches current_evidence_digest and probe rows are not left STALE while Manifest is VERIFIED. A Manifest MUST NOT show CURRENT while the site-wide report is fail for the same evidence set. CVP-PROD-01 MUST FAIL when the bound report status=fail; do not record an unconditional PASS whose notes quote a production FAIL. Site-wide status=stale with snapshot_status=pass does not by itself demote a capability whose current_cvp_status is VERIFIED + CURRENT.
Trust Production copy MUST distinguish the bound snapshot from the live site-wide report when they disagree, including timestamps:
| Token | Meaning |
|---|---|
| Bound attestation PASS @ T1 | This calculator's last production bind / snapshot |
| Site-wide CVP health: N CURRENT · K require re-attestation @ T_live | Live origin report: this calculator may be CURRENT while other capabilities need re-attestation |
Do not label baked SSR clocks as Live. Immutable Manifest overlay notes MAY retain the bind-time Live site report phrasing as historical context; Trust HTML MUST not present that bind-time clock as the current site report.
Do not write CVP-PROD-01 notes that say site report pass when the live top-level status is stale. Auditors should see both clocks, not a collapsed CURRENT badge that contradicts the open site report.
Protocol status
| Item | Value |
|---|---|
| Version | 1.0.0-proposed |
| Document status | Proposed (not Stable) |
| Normative text | /developers/cvp/spec/1.0 |
| Evidence Manifest schema | /developers/cvp/schema · JSON |
| Errata ledger | /developers/cvp/errata (history only) |
| Engineering pilots | electrical.amps_to_volts, electrical.adc.snr, electrical.rf.antenna_length (engineering O3 template) → /evidence/{capability_id}/{version}.cvp.json |
| Math graph pilots | math.arcsin, math.arccos, math.arctan, math.sin, math.cos, math.tan, math.log, math.ln, math.square_root, math.root, math.exponent, math.antilog (core + URL→result→graph) |
| Math engineering graph | math.exponential_growth (engineering + URL→result→graph; constant-rate model, not a unitless core identity) |
| Math core (profile only) | arithmetic, fractions, scientific notation, quadratic, percentage / percent change — core, no Live-graph integration claim |
Stable readiness (internal) requires a production-grade Runner across heterogeneous calculators without special exemptions, Trust Summary fully derived from the same Manifest, and formal JSON canonicalization before signed manifests.