Skip to content

Production checklist

Use this checklist before shipping a workflow backed by ProveKit. It is intentionally conservative, ProveKit is still under active development and main may change proof, key, recursive-verifier, or API formats between commits.

  • Choose the branch or release. Use v1 for the current stable interface; use main only for early-adopter work.
  • Record the Git commit, Cargo.lock, and rust-toolchain.toml used to generate artifacts.
  • Record exact CLI commands, feature flags, and the prepare --hash value.
  • Rebuild from a clean checkout in CI before trusting a new artifact set.

For every generated artifact, store the path, checksum, source commit, generating command, and owner.

ArtifactRequired provenance
.pkpCircuit source, hash, commit, generating command.
.pkvSame generation record as the matching .pkp.
proof.np or JSON proofMatching .pkp, input file, public inputs, commit.
params_for_recursive_verifierMatching .pkv and proof.
r1cs.jsonMatching .pkv and recursive-verifier export command.
Groth16 pk / vkSetup ceremony or development-only generation record.

Do not mix artifacts generated from different branches, commits, hash choices, circuits, or verifier/proof pairs.

Add a CI job that runs the exact deployment path:

Terminal window
mkdir -p artifacts
cargo run --release --bin provekit-cli -- prepare \
. \
--pkp artifacts/app.pkp \
--pkv artifacts/app.pkv
cargo run --release --bin provekit-cli -- prove \
--prover artifacts/app.pkp \
--input Prover.toml \
--out artifacts/proof.np
cargo run --release --bin provekit-cli -- verify \
--verifier artifacts/app.pkv \
--proof artifacts/proof.np
cargo run --release --bin provekit-cli -- show-inputs --hex \
artifacts/app.pkv \
artifacts/proof.np

If recursive verification is part of the product, add the export step and verify the Go/gnark path with the exact generated files:

Terminal window
cargo run --release --bin provekit-cli -- generate-gnark-inputs \
artifacts/app.pkv \
artifacts/proof.np \
--params artifacts/params_for_recursive_verifier \
--r1cs artifacts/r1cs.json
  • Decide who is allowed to generate .pkp and .pkv files.
  • Decide where proofs are generated and where they are verified.
  • Treat public input encoding as an API contract; test it with show-inputs.
  • Keep private witnesses, prover keys, and generated proofs out of logs unless explicitly approved.
  • Document whether verification depends on the local CLI, embedded Rust, WASM, FFI, the verifier server, or the recursive verifier.
  • Reload or clone verifier state when verifying multiple proofs in one process.
  • Expose hash, compiler, and backend choices in configuration.
  • Add regression tests that confirm mismatched key/proof pairs are rejected.
  • Call initPanicHook() and initThreadPool() before proving when using threaded builds.
  • Create a new Prover for each proof, proveBytes() / proveJs() consume the prover.
  • Validate witness maps before calling proveBytes() or proveJs().
  • Load .pkp and .pkv artifacts from authenticated, integrity-checked sources.
  • Call pk_init() once before proving.
  • Configure the custom allocator or mmap memory before initialization.
  • Free every returned PKBuf with pk_free_buf().
  • Test low-memory and cancellation behavior on target devices.
  • Restrict artifact URL sources or proxy them through trusted storage.
  • Tune VERIFIER_MAX_REQUEST_SIZE, VERIFIER_REQUEST_TIMEOUT, VERIFIER_TIMEOUT_SECONDS, and VERIFIER_SEMAPHORE_LIMIT for real proof sizes.
  • Monitor /health, request IDs, verification latency, timeout rate, and invalid-proof rate.
  • Decide how long downloaded artifacts remain in VERIFIER_ARTIFACTS_DIR.
  • Manage Groth16 proving and verifying keys explicitly for production.
  • Treat development-time key generation as unsafe unless release-specific setup guidance says otherwise.
  • Re-run the recursive export after changing the proof, verifier key, branch, circuit, or hash configuration.

Before launch, capture evidence for each check:

CheckEvidence to retain
Build reproducibilityClean-checkout build logs and artifact checksums.
Local verificationverify success output and the command line used.
Public inputsshow-inputs --hex output reviewed by the application owner.
Negative testsProof/key mismatch or corrupted proof is rejected.
PerformanceProving and verification time and memory for expected circuit sizes.
RecoveryProcedure for regenerating and rolling back artifacts.
ObservabilityLogs and metrics that identify request ID, artifact version, and failure class.

Pause deployment if any of these are true:

  • Artifact provenance is unknown or spans multiple branches or commits.
  • verify fails locally for a proof the service plans to accept.
  • Recursive-verifier params or r1cs.json were not regenerated with the current .pkv and proof.
  • Public input ordering is undocumented.
  • Verifier-server artifact URLs can be controlled by untrusted clients without filtering.
  • FFI buffers are not freed, or allocator setup happens after pk_init().
  • Browser proving reuses a consumed WASM Prover instance.
  • The deployment depends on main behavior without a migration or rollback plan.