Scaffold gaps
Verdifax is honest about what it cannot yet do. The audit bundle carries
three open scaffold flags on every run today, one per artifact that
returns a placeholder or a declaration rather than a real cryptographic
value or measurement. Runs on the hosted service carry a fourth flag,
hardware attestation, because the hosted service runs without an
attestation agent; deployments with an AMD SEV-SNP attestation agent bind
a verified quote and clear that flag. Proof of temporal execution has
graduated and is real on every Rekor-anchored run (see "Closed gaps"
below).
Each flag is disclosed in the audit bundle itself: the scaffolded
section carries is_scaffold: true, an activated_by note naming what
clears it, and a plain-language note, all emitted by the orchestrator
code and tracked in the project roadmap with a documented closing path.
The hardware-attestation section also lists its tier4_blockers. Running verdifax-verify --show-evidence-summary against
any bundle prints the same category names you see below.
We publish this page because we believe an attestation system that hides its limitations is worth less than one that names them publicly. A buyer or auditor reading a Verdifax audit bundle should know exactly what is real evidence, what is scaffold-grade, and what activates each scaffold value.
What a scaffold gap is
A scaffold value is a placeholder that a step of Verdifax emits when the underlying real implementation is not yet wired. Two examples:
- The zero-knowledge step emits a deterministic transitional hash facade in place of a real STARK proof. The hash is byte-stable and replayable; what it isn't is a zero-knowledge proof a third party can check without trusting the orchestrator.
- Before 2026-07-17, the hardware attestation step emitted a policy-scaffold record declaring the platform was not running on attested silicon. That category has since graduated: runs sealed with a SEV-SNP attestation agent carry a real AMD hardware quote bound inside the run's execution record (see "Closed gaps" below). The hosted api.verdifax.com runs without an agent today, so its runs still carry the honest scaffold; a standing evaluation endpoint, attested.verdifax.com, runs the in-guest configuration on request (see "Closed gaps" below).
Scaffold values are the difference between "we're building something we don't yet have" and "we're hiding what we don't yet have." Verdifax does the first.
How to recognize scaffold values in your bundle
Every artifact in the audit bundle that involves a scaffold value carries
a scaffold field with three keys:
"scaffold": {
"is_scaffold": true,
"activated_by": "phase 7 (live cloud, TPM2 / SEV-SNP)",
"note": "Real attested hardware lands when..."
}
The independent verdifax-verify CLI flags these in its report (the
[scaffold] tag next to each affected artifact) and supports a --strict
mode that fails verification when any scaffold flag is set. High-trust
environments should always use --strict, a passing strict-mode
verification means no value in the bundle carries a scaffold flag.
Today every run carries scaffold flags, so --strict fails every run by
design until the open categories below close.
The three open scaffold categories
The categories below are the artifact paths the verifier reports in its evidence summary. Each category contains one or more named declarations the orchestrator emits about itself; expand a category to see them.
1. Timing declarations, leakage_bundle.scaffold
Why it's scaffold today. The leakage bundle's two booleans, constant-time compliance and no observed timing variance, are design declarations of the deterministic scheduler, not per-run measurements. Per-stage wall-clock timing is measured on every run and sealed separately in the runtime timing section, but these booleans are not derived from it.
What activates the real value. The flag clears when the constant-time booleans are derived from per-run measurement instead of declared.
2. ZK transcript, transcript.scaffold
Why it's scaffold today. The prover decision is made (a transparent, post-quantum-safe STARK system) and the circuit interface trait is committed, but the adapter that lifts our internal R1CS into the prover's trace format is not yet implemented.
What activates the real value. A cryptographer writes the AIR adapter, wires the prover, and validates determinism across three Rust toolchains. After this lands, the production build path produces real STARK proof bytes that any party with the verifier library can check, with no trust in Verdifax required. The detailed engineering plan, including the chosen library (winterfell), the committed integration trait, the proof-system parameters, and the five acceptance gates that must pass before the scaffold flag flips, is documented at /concepts/zk-roadmap/.
What the bundle discloses: the transcript section's
transcript_hash is a domain-tagged SHA-256 over the execution record's
proof.v1 hash, not a real STARK / PLONK / Groth16 proof. The hash is
byte-stable and replayable, but it proves nothing about the computation
beyond what the record's other hashes already bind. The section's
activated_by note reads "phase 6 (real ZK prover, winterfell)".
3. ZK-state-prover binding, zksp_binding.scaffold
What is real today. The Lean 4 development tree is no longer empty.
It carries a kernel-checked proof development (canonical-encoding
determinism and injectivity, hash-layer lifting under an explicit
collision-freedom assumption, policy-gate soundness, budget-halt token
preservation, the manifest-binding theorem, the pipeline-determinism
theorem over the model, and R1CS satisfiability lemmas), built by CI on
every commit with an axiom audit that rejects unproven placeholders and
ad-hoc axioms. Every new audit bundle carries a formal_verification
record referencing that development: repository, pinned commit,
toolchain, theorem list, and audited axiom footprint. The record is
self-consistent (its hash recomputes from its contents) and names its
run (it embeds the bundle's manifest hash); verdifax-verify checks both
and reports the binding under --show-evidence-summary. On successful
runs sealed from run 238 on, the complete-record anchor binds the record
to the public log. On earlier records it is not bound to the public log,
so a party able to rewrite the whole bundle could change it and
recompute its hash. The record's
scope statement says plainly that the theorems are about a Lean model
of the pipeline; byte-format fidelity of the model to the production
Go implementation is roadmap work, disclosed as such.
Why the flag is still scaffold. Two things remain transitional.
First, the manifest's formal_verifier_status success token is still
emitted deterministically by the MockZkspAdapter at runtime, not
derived by invoking the Lean development; the Rust adapter's
frozen-theorem-signature check has not been wired to the populated
tree. Second, the ZK proof bytes themselves are the transitional R1CS
hash facade, not a real STARK proof (see category 2). In the code, the
section's activated_by note ties the flag to the real winterfell
prover; gating the success token on the pinned Lean artifact is further
roadmap work.
What the bundle discloses: the formal_verifier_status field in the
manifest carries the deterministic value SCAFFOLD_R1CS_HASH_FACADE
emitted by the MockZkspAdapter today, not a verdict computed by
invoking the Lean development at runtime. The theorems themselves now exist and are
referenced in every new bundle via the formal_verification record;
determinism is established both empirically (the same manifest fields
always recompute to the same hash, checked in CI) and mathematically at the model level
(pipeline_determinism, manifest_binding). What remains scaffold
is the runtime linkage. The artifact viewer at
verdifax.com/app/artifact/?id=N renders the Formal Verifier Status
row with a SCAFFOLD badge, and verdifax-verify --strict fails on
the same flag, until that linkage is real.
Why we publish this page
Honesty is durable. A claim that is fully verifiable beats a claim that depends on a buyer's trust. When a buyer asks "is your hardware attestation real?", the right answer is not "yes" or "trust us." The right answer is "here is the audit bundle, here is the verified quote you can re-check offline, here are the named scaffolds that remain, here is the closing path for each, here is the strict-mode verifier output." Auditors and regulators respect that answer in a way they do not respect marketing claims.
Closure path matters as much as the gap. Each gap above names the engineering phase that closes it, the documents that specify it, and the type of specialist required. That is structurally different from "we're working on it", it is a documented production roadmap that can itself be audited.
The system enforces its own honesty. The is_scaffold: true flag is
emitted by the orchestrator code, not by marketing. The independent
verifier surfaces it. The PDF audit report displays it. The
scaffold notes above are exactly what an auditor sees in the JSON; they
are not aspirational language, they are what the system says about
itself today.
Reading scaffold flags in your bundle
When you receive a Verdifax audit bundle (via the artifacts endpoint or as a JSON download), look at these specific paths:
transcript.scaffold.is_scaffold
leakage_bundle.scaffold.is_scaffold
hardware_attestation.scaffold.is_scaffold
zksp_binding.scaffold.is_scaffold
pote_proof.scaffold.is_scaffold
Any value of true corresponds to one of the gaps above (with
activated_by and note fields giving you the precise context). Two
of the five are per-run graduated categories, see "Closed gaps" below:
pote_proof reads false on every production run anchored to
Sigstore Rekor, and hardware_attestation reads false on every run
sealed with a verified SEV-SNP quote (check
hardware_attestation.attestation_mode = "sev_snp" and re-verify the
embedded quote yourself). The other three (transcript,
leakage_bundle, zksp_binding) read true on every run today.
When all five read false, every scaffold
gap has closed for that run and the bundle is fully cryptographically
rooted.
For programmatic enforcement in CI:
verdifax-verify --strict --show-evidence-summary bundle.json
This exits non-zero if any scaffold flag is set, regardless of whether
the rest of the bundle's hashes verify correctly. The
--show-evidence-summary flag prints the maturity report and an
explanatory verdict line, so a CI failure carries the reason inline.
Use this combined form as the gate in high-trust environments.
Closed gaps
hardware_attestation.scaffold, graduated 2026-07-17
Hardware attestation is real on its first platform: AMD SEV-SNP.
Runs sealed with the confidential-compute attestation service carry a
genuine SEV-SNP attestation report with
hardware_attestation.attestation_mode = "sev_snp" and the scaffold
flag cleared. Before sealing, the orchestrator verifies three things
and refuses the upgrade unless all pass:
- Certificate chain to the silicon vendor. The report's VLEK endorsement certificate must chain to AMD's Milan root of trust, which is pinned by SHA-256 fingerprint inside the orchestrator binary. A chain terminating anywhere else is rejected.
- Report signature. The report's ECDSA P-384 signature over its full body is verified against the endorsement key from raw bytes.
- Run binding. Since 2026-10-02 the quote is taken before the
run's execution record is built. Its guest-controlled 64-byte
report_datafield must equalsha512("verdifax.sevsnp.report_data.prerecord.v1:" + input_hash + ":" + transport_hash + ":" + execution_control_hash + ":" + program_hash + ":" + kernel_output_ids joined by ":"), every other field of the record, and the record's hardware field is then the SHA-256 of the report, so the quote and the record each bind the other. Runs sealed before 2026-10-02 used the post-run bindingsha512("verdifax.sevsnp.report_data.v1:" + envelope_hash + ":" + aer_hash); the verifier checks each run under the binding it was sealed with.
The full report, endorsement certificate, and AMD chain are embedded
in the bundle (quote_b64, vlek_cert_pem, cert_chain_pem), so any
third party can re-run all three checks offline, forever, without
trusting Verdifax. The audit PDF renders a dedicated "Hardware
Attestation (AMD SEV-SNP)" section with the launch measurement, TCB
values, pinned root fingerprint, and binding recipe.
Honest scope, stated in the artifact itself. Where the workload
ran is recorded per run. In the attestation-service pattern the quote
comes from a separate confidential instance and the artifact declares
ORCHESTRATOR_WORKLOAD_NOT_IN_ENCLAVE. When the orchestrator runs
inside the attested guest, the artifact names it the execution
environment and declares COLOCATION_OPERATOR_DECLARED: the quote
proves the guest and its launch measurement, while the launch
measurement covers the guest firmware rather than the orchestrator
binary, so colocation is the operator's statement. In-guest execution
was demonstrated on 2026-10-03; that run's sealed bundle is public at
https://verdifax.com/evidence/hardware-run-2026-10/runs/3/bundle.json.
Since 2026-10-05 a standing evaluation endpoint,
attested.verdifax.com, runs the same in-guest configuration: it is
kept offline between evaluations, brought online on request, and every
record it seals verifies with the public verifier.
Additional platforms (TPM 2.0, Nitro Enclaves) remain roadmap work
(ADDITIONAL_PLATFORMS_ON_ROADMAP).
Fail-closed, and per-run honesty. With an agent configured, a quote
that cannot be obtained or verified halts the run with no record, and
the orchestrator refuses to start if its agent does not return a
verified quote at boot, so a broken agent is a failed deploy rather
than a silent downgrade. Deployments with no agent configured, which
includes the hosted service today, emit the policy-scaffold record with
is_scaffold: true and the original three declarations
(REAL_TEE_QUOTE_NOT_BOUND, PLATFORM_CERTIFICATE_CHAIN_NOT_VERIFIED,
HARDWARE_BOUND_MODE_NOT_ENABLED_CURRENT_HORIZON). The flag reports
what each individual run actually carried.
Pipeline stages graduated 2026-10-02
These were never bundle scaffold flags, but the audit PDF's maturity table rated them below REAL, and they are now real in every run:
- The execution record is computed with the
aer.v1formula from Verdifax's allowed US patent application, with aproof.v1proof, every preimage field disclosed in the bundle'sexecution_recordsection, and both recomputed by verdifax-verify since v0.5.0. - Transport fixes each route's order with persisted sequential positions and refuses reordering, duplicates and retry mutation.
- Kernels: the six output identifiers come from the kernels themselves; the maturity table rates a run REAL only when its sealed fields show it.
- Program authorization: programs can be registered with a hardware class and allowed routes, and with enforcement on, an unregistered or unsatisfiable program is refused before transport.
pote_proof.scaffold, closed 2026-05-28
The PoteProof artifact carried a scaffold flag in early builds because the orchestrator's transparency-log integration was not yet live. As of 2026-05-28 the Sigstore Rekor adapter has been running in production for some time, and the scaffold-flag rendering logic was reviewed against what the orchestrator actually emits. The conclusion: the activation condition ("future ledger integration with Sigstore/Rekor") had silently already been met. Every production run sealed against the real public log carries a Rekor log index, a signed checkpoint, a Rekor-attested integrated time, and a Merkle inclusion proof, i.e., the textbook material a transparency-log proof of temporal execution is made of.
The builder now clears pote_proof.scaffold.is_scaffold to false
automatically when ledger_backend = "rekor" with a non-empty log
entry id, and surfaces the temporal evidence (ledger_log_id,
integrated_time, signed_entry_timestamp, ledger_checkpoint)
directly on the PoteProof for reviewer visibility. Runs sealed in
mock-ledger mode (dev/test deployments) still carry the scaffold flag
with an updated note that's accurate for those runs.
Engineering record: Task #214 in the project tracker.
When this page changes
Each time a scaffold gap closes, i.e., the orchestrator code is updated to
emit is_scaffold: false for an artifact that used to scaffold, a
new entry will be added to Closed gaps above with the date,
release version, and a link to the engineering record that activated it.
Until that happens for any given gap, you should assume the gap is open and the bundle's strict-mode verification will fail.
