diff --git a/AGENTS.md b/AGENTS.md index 0c87dda..a864cb1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -213,8 +213,8 @@ If that path is not inside this repository, prefix commands with `PYTHONPATH=src - `src/verifier/runtime/` — `public_cli.py` (every CLI entry point) and `demo.py`. - `src/verifier/specifications/` — byte-identical copies of normative spec files. - `receipts/schema/` — receipt JSON Schemas. `standard/schemas/` — strict non-receipt - mechanism schemas. `examples/` — runnable specimens. -- `experiments/` — non-normative studies with profile manifests, explicit horizons, + mechanism schemas. `examples/` — supported runnable specimens. +- `experiments/` — non-normative roadmap-steering studies with profile manifests, explicit horizons, and blockers. - `src/verifier/experimental_workflow/` — optional workflow/profile interchange; it records allocation but never grants a VSTD verdict from repository state. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f918290..746c86a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,7 @@ are useful contributions. | Reference implementation | `src/verifier/` | Tests for the exact implemented proposition and failure boundary | | Command-line behavior | `src/verifier/runtime/public_cli.py` | Generated reference, installed-wheel smoke, and machine-readable output tests | | Ecosystem adapter or application profile | `src/verifier/interoperability/` or an explicitly experimental profile | Accepted upstream versions, native-verifier boundary, information-loss declaration, trust roots, and substitution/replay/scope-widening tests | -| Non-normative research | `experiments/` | Experiment manifest, fixtures, unresolved horizons, and generated index | +| Non-normative roadmap-steering research | `experiments/` | Experiment manifest, fixtures, unresolved horizons, and generated index | | Explanatory documentation | `docs/` | Local-link, acronym, presentation, and semantic-drift review | The authority order is: diff --git a/README.md b/README.md index 3aafbad..c2c6ca8 100644 --- a/README.md +++ b/README.md @@ -14,30 +14,28 @@ > **Acronyms used below:** identifier (ID); reduced instruction set computer (RISC). -VSTD is a verification-domain language and Python reference implementation for packaging -bounded computational claims with their evidence, checking mechanisms, limits, -refutation conditions, provenance, and reproducibility information. It does **not** +VSTD is a verification-domain language and Python reference implementation for turning a +bare computational result into an inspectable package: **the exact claim, artifact, +evidence, checking mechanism, limits, and conditions that could overturn it**. It does **not** replace native domain verifiers, proof systems, signatures, identity systems, -transparency logs, or provenance formats, and it never strengthens their results merely -by translating or storing them. +transparency logs, or provenance formats. + +The shortest useful description is: + +```text +result + exact claim + evidence + mechanism + bounds + provenance + refutation route +``` VSTD evaluates bounded validity propositions about computational processes represented by software and evidence-bearing artifacts. It does not decide whether an actor is good, bad, -reputable, or trustworthy; identity and reputation alone contribute no verdict weight. - -It addresses a practical review problem: a final answer or green check rarely says -exactly what was checked, which evidence was used, where the conclusion stops, or what -would overturn it. VSTD carries those boundaries with the result. - -**Current boundary:** implemented reference paths cover receipts, generic computation -capture, provenance graphs, verification geometry, accelerator evidence, grounded -certificate checking, evidence-bound VSTD-4/VSTD-5 assessment, evidence-bound Graph -ratings, replayable additive Graph lifecycle/assurance propagation, reproduction, exact-byte artifact -freezing, finite self-closing seals, copy-on-write thawing, and a flagship adversarial demo. -Compatibility candidate paths remain `NOT_ESTABLISHED`; evidence-bound paths rerun exact -registered mechanisms and preserve their evidence, trust roots, bounds, and limitations. -No real external witness or independent implementation is claimed. See [current maturity](#current-maturity) and -[claims and limits](docs/CLAIMS_AND_LIMITS.md). +reputable, or trustworthy, and translating or storing a result never strengthens it. + +**Current boundary:** the repository contains usable reference paths for receipts, generic +run capture, provenance Graphs, bounded certificate checking, artifact freezing and +sealing, reproduction, and evidence-bound assessment. Some compatibility paths remain +`NOT_ESTABLISHED`, and no real external witness, independent implementation, accreditation, +or external adoption is claimed. See [current maturity](#current-maturity) and +[claims and limits](docs/CLAIMS_AND_LIMITS.md) for the exact surface-by-surface boundary. [Normative specifications](standard/LADDER.md) · [60-second quickstart](docs/QUICKSTART.md) · @@ -72,6 +70,58 @@ external adoption, independent implementation, or general artificial intelligenc safety. Use `vstd demo --json` for JavaScript Object Notation (JSON) output or `vstd demo --emit-specimens PATH` to inspect the generated files. +## The 90-second mental model + +A normal tool may report `PASS`. VSTD asks what that word is allowed to mean: + +```text +claim ──checked against──> evidence + │ │ + └── bounded by ─────────────┤ + v + named mechanism + │ + v + PASS / FAIL / UNKNOWN + + limits + provenance + + refutation conditions +``` + +The native verifier still performs the domain work. VSTD records the exact boundary of +that work so another person or program can inspect, replay, challenge, or reject it without +silently receiving a stronger claim. + +VSTD has two independent axes: + +- **Object profiles** describe what is established about one computational claim. +- **Graph profiles** describe what is established about a bounded collection of artifacts + and transformations. + +| Profile | One claim asks… | A collection asks… | +|---:|---|---| +| 1 | What was claimed and recorded? | What artifacts and lineage were recorded? | +| 2 | What exact surface was checked? | What bounded collection surface was checked? | +| 3 | What execution substrate is evidenced? | Which provenance paths have substrate evidence? | +| 4 | How can the result be refuted? | Which transformations are refutable? | +| 5 | Was an independent witness actually evidenced? | Is corroboration evidenced across the network? | + +Three rules prevent most misreadings: + +1. Each profile answers a different question and needs its own evidence. +2. A later-profile result cannot repair missing evidence for an earlier profile. +3. `UNKNOWN` is a correct result when the mechanism, evidence, or bound is insufficient. + +Choose the smallest useful starting point: + +| Goal | Start here | +|---|---| +| See defensive behavior immediately | Run [`vstd demo`](#30-60-second-demonstration) | +| Capture and reproduce one command | [Generic computation](#capture-a-generic-computation) | +| Preserve and seal exact artifact bytes | [Artifact control](#freeze-seal-verify-and-thaw-an-artifact) | +| Understand the formal profile composition | [Normative Ladder](standard/LADDER.md) | +| Integrate or independently review the code | [Architecture map](docs/ARCHITECTURE.md) | +| Challenge an overclaim or ambiguous rule | [Issue forms](https://github.com/TimeLordRaps/verifier/issues/new/choose) | + ## What a result means VSTD result terms remain tied to one exact proposition, mechanism, evidence set, and @@ -90,9 +140,21 @@ proposition and observation boundary being part of the checked claim. ## Current maturity -This is the canonical repository status table. “Implemented” applies only to the named -reference surface; it does not imply adoption, external interoperability, certification, -or a second implementation. +Use this summary before opening the exact matrix: + +| Category | Current meaning | +|---|---| +| Usable reference paths | Receipts, generic run capture and reproduction, Graph recording, grounded-certificate checks, evidence-bound assessment, and artifact freeze/seal/thaw mechanisms are implemented within their documented bounds. | +| Mechanism-dependent paths | VSTD-4, VSTD-5, and Graph profiles above recorded lineage establish results only when their exact registered mechanisms rerun successfully over bound evidence. | +| Compatibility candidates | Candidate depth/profile calculations remain `NOT_ESTABLISHED`; caller-supplied references or ratings cannot create conformance. | +| Experimental integrations | The workflow and Supply Chain Integrity, Transparency, and Trust (SCITT) profiles remain non-normative and grant no VSTD verdict from platform state alone. | +| Not claimed | Accreditation, consensus-standard status, external adoption, a second implementation, a real independent witness, or third-party security review. | + +
+Exact surface-by-surface matrix for reviewers and integrators + +“Implemented” applies only to the named reference surface. It does not imply adoption, +external interoperability, certification, or a second implementation. | Surface | Normative status | Reference implementation | Evidence binding | Conformance status | Missing mechanism or evidence | |---|---|---|---|---|---| @@ -113,6 +175,8 @@ or a second implementation. | zero-identity/zero-knowledge (ZIZK) artifact-first TRUST | Governing VSTD architecture in `standard/LADDER.md` section 1.1; not a separate numbered profile | Hash-chained event serialization and offline replay, evidence-bound forward TRUST, typed ROT, challenge projection, reverse RUST, structural concentration, conflict resolution, explicit localization, and bounded diagnostic attribution | Exact Graph topology, proposition bindings, embedded evidence bytes, mechanisms, trust roots, bounds, and immutable history | Implemented reference mechanism; no universal support score or actor trust | Domain-specific transfer/localization mechanisms, independent cross-implementation replay, complete trichotomy derivation, and maturation of optional proof backends | | RISC Zero proof-carrying reference mechanism | Bounded non-normative mechanism example under the governing ZIZK architecture | Pinned prover/verifier source plus a tracked real receipt, public envelope, self-test result, and network-offline command that requires the tracked guest build and recorded proof to share one image identifier | Authenticates one fixed hidden-witness predicate and expected image identifier; it does not establish the witness's external truth | Native proof verified; no VSTD receipt mapping | Independent build host, external audit, complete VSTD trichotomy predicate, and additional proof backends | +
+ The authoritative implementation-to-specification map is [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). Normative meaning remains under [standard/](standard/). @@ -137,75 +201,66 @@ design rule is: Verifier Standard object and Graph numbered profiles, each requiring separate evidence for its closure coordinate -VSTD is a verification complex of named closure coordinates and evidence-bearing -relations. Specification numbers select cumulative profiles, not software revisions, -interchangeable layers, or scalar assurance levels. The object axis evaluates one -computational claim; the Graph axis evaluates a bounded collection and its recorded -transformations. +The five profile numbers are cumulative verification questions, not software versions, +interchangeable layers, or assurance scores. The object axis evaluates one claim; the +Graph axis evaluates a bounded collection and its recorded transformations. -| Profile number | Object closure coordinate | Graph closure coordinate | -|---:|---|---| -| 1 | Claim mechanics | Recorded lineage | -| 2 | Verification surface | Bounded collection surface | -| 3 | Substrate accountability | Accountable provenance closure | -| 4 | Refutability | Refutable transformation closure | -| 5 | Witness corroboration | Corroborated verification network | +A typical object traversal is: + +```text +VSTD-1 claim record + → VSTD-2 bounded verification surface + → VSTD-3 execution-substrate evidence + → VSTD-4 portable refutation boundary + → VSTD-5 evidence-bound witness corroboration +``` A later-profile result does **not** supply, imply, upgrade, or repair a prerequisite -coordinate. Object profile depth requires separate passing evidence for every required -coordinate. - -As an operational traversal, an implementation may capture a run through VSTD-1, map -profiler or domain observations through adjacent adapters into a VSTD-2 surface, bind the -execution substrate through VSTD-3, make the result portably refutable through VSTD-4, and -record independently evidenced witness corroboration through VSTD-5. This traversal does -not collapse the named coordinates. VSTD-Graph is the orthogonal collection axis: a bounded Graph result -may be materialized as a content-addressed artifact and enter a later verification loop only -with its source graph, selected surface, mechanism, lineage, losses, limitations, conflicts, -and current admissibility preserved. The compatibility `graph_level` result remains a -`NOT_ESTABLISHED` candidate. `establish_graph_level` can establish only profile 1–5 after -every required rating mechanism is rerun from exact evidence bound to the exact Graph, -member set, collection, and claim. Profile zero remains `NOT_ESTABLISHED`. +coordinate. Object profile depth `N` requires separate passing evidence for every required +coordinate from 1 through `N`. + +VSTD-Graph is orthogonal. It records artifacts, transformations, conflicts, lifecycle +changes, and deduplicated reachability across a bounded collection. The compatibility +`graph_level` calculation remains a `NOT_ESTABLISHED` candidate. Evidence-bound Graph +establishment must rerun every required rating mechanism over evidence bound to the exact +Graph, member set, collection, and claim. Profile zero never becomes established conformance. + +### Artifact support and diagnostic traversal The formal names **TRUST**, **ROT**, and **RUST** are semantic terms, not acronyms, actor -ratings, scalar scores, numbered-profile verdicts, or references to the Rust programming language. -They serialize only as typed events in `VSTD-GRAPH-ASSURANCE-1`. -TRUST is mechanism-earned artifact support moving forward edge by edge through checked -development, with each event binding one exact transformation, its inputs and output, the -historical Graph digest, and any prerequisite TRUST events; -ROT is typed, time-indexed degradation of current admissibility without rewriting -historical evidence; RUST is the inverse-TRUST diagnostic mechanic moving backward from a -descendant deviation through historically recorded contributing ancestry. Current -revocation or conflict can remove a route from current TRUST without erasing that diagnostic -history. This memetic propagation does not by itself prove guilt, responsibility, falsehood, -causal localization, or automatic ancestor falsification. The reference runtime requires a separate passing localization -mechanism bound to one exact passing RUST event and descendant-deviation proposition before -it can emit a bounded -`BLAME` or `GUILT`. BLAME establishes bounded responsibility or material contribution; -GUILT is not its opposite, but the stronger combined result that additionally establishes -an exact violated obligation. Neither result concerns actor character. See [the governing -architecture](standard/LADDER.md#11-artifact-first-causal-provenance-orientation). - -`VSTD-GRAPH-ASSURANCE-1` carries the immutable historical Graph, exact event bindings, -embedded evidence bytes, event hash chain, and derived current-view digest. -`recheck_assurance_log` rehashes the evidence, reruns each exact registered mechanism, and -rejects any event or current view that does not reproduce. Conflict adjudication and current -admissibility are separate: a selected status affects the current artifact or transformation -state, while resolving an arbitrary predicate cannot silently restore TRUST. No general -non-status admissibility-effect mechanism is currently implemented, so that route remains -blocked. - -This is VSTD's **ZIZK artifact-first TRUST architecture**, not an optional research -profile. Zero identity means zero identity-derived verdict weight, not anonymity or the -absence of identifiers. Zero knowledge means zero unevidenced knowledge is presumed: a -proposition remains `UNKNOWN` until a named mechanism earns a bounded result. When a -witness must remain confidential, cryptographic zero knowledge can enclose that -architectural rule by binding the exact program, predicate, public commitments, output, -proof parameters, and verifier without attaching TRUST to the prover's identity. Only a -named proof system can earn that privacy property; a digest or hidden input cannot. The -runnable -[RISC Zero reference mechanism](examples/zizk_artifact_first/) is one bounded backend, -while its proof system and unfinished transfer mechanics remain mechanism-specific. +ratings, scalar scores, numbered-profile verdicts, or references to the Rust programming +language: + +- TRUST is mechanism-earned artifact support moving forward through one exactly checked + transformation. +- ROT is typed, time-indexed degradation of current admissibility without rewriting + historical evidence. +- RUST is the inverse-TRUST diagnostic mechanic moving backward from a descendant deviation + toward recorded contributing ancestors. + +RUST identifies where reassessment should look; it does not by itself establish falsehood, +causal localization, responsibility, BLAME, or GUILT. A separately registered localization +mechanism must earn BLAME, and GUILT additionally requires an exact violated obligation. +Neither result evaluates actor character. The replayable `VSTD-GRAPH-ASSURANCE-1` event log +binds its historical Graph, evidence, mechanisms, event chain, and derived current view. + +### Zero identity and zero unevidenced knowledge + +The zero-identity/zero-knowledge (ZIZK) artifact-first orientation is **Governing VSTD +architecture**, not an optional research profile. Zero identity means zero identity-derived verdict weight, +not anonymity. Architectural zero knowledge means zero unevidenced knowledge is presumed: +unsupported propositions remain `UNKNOWN`. + +When a witness must remain confidential, cryptographic zero knowledge can enclose that +boundary only through a named proof system that binds the exact program, predicate, public +commitments, output, parameters, and verifier without attaching TRUST to the prover's identity. +A digest, encrypted file, or omitted input is not a zero-knowledge proof. The +[RISC Zero reference mechanism](examples/zizk_artifact_first/) is one bounded optional +backend under this governing architecture. + +For exact ownership, dispatch paths, schemas, compatibility surfaces, and unimplemented +horizons, use the [architecture map](docs/ARCHITECTURE.md) and +[normative Ladder](standard/LADDER.md). ## Install and use diff --git a/examples/zizk_artifact_first/risc0/Cargo.lock b/examples/zizk_artifact_first/risc0/Cargo.lock index 6490386..2c929e6 100644 --- a/examples/zizk_artifact_first/risc0/Cargo.lock +++ b/examples/zizk_artifact_first/risc0/Cargo.lock @@ -255,7 +255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -1667,7 +1667,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] @@ -1994,9 +1994,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -2470,7 +2470,7 @@ checksum = "f5e99bff0393163bb25029a6af25d3d8d202ba5b5438a74d1bd8789f5c822970" dependencies = [ "borsh", "proptest", - "rand 0.8.5", + "rand 0.8.6", "rand 0.9.5", "ruint-macro", "serde_core", @@ -3230,7 +3230,7 @@ name = "vstd-zk-host" version = "0.1.0" dependencies = [ "hex", - "rand 0.8.5", + "rand 0.8.6", "risc0-zkvm", "rmp-serde", "serde", diff --git a/examples/zizk_artifact_first/risc0/THREAT_MODEL.md b/examples/zizk_artifact_first/risc0/THREAT_MODEL.md index 8cfba7a..c37aa71 100644 --- a/examples/zizk_artifact_first/risc0/THREAT_MODEL.md +++ b/examples/zizk_artifact_first/risc0/THREAT_MODEL.md @@ -1,6 +1,8 @@ # Threat model -> **Acronyms:** Executable and Linkable Format (ELF); identifier (ID); JavaScript Object Notation (JSON); +> **Acronyms:** American National Standards Institute (ANSI); +> Common Vulnerabilities and Exposures (CVE); Executable and Linkable Format (ELF); +> GitHub Security Advisory (GHSA); identifier (ID); JavaScript Object Notation (JSON); > reduced instruction set computer (RISC); Secure Hash Algorithm 256-bit (SHA-256); > scalable transparent argument of knowledge (STARK); zero-identity/zero-knowledge (ZIZK); > zero-knowledge virtual machine (zkVM). @@ -90,6 +92,22 @@ audit every transitive crate, compiler binary, installer, or build host. Two cle under the same recorded Windows Subsystem for Linux 2 environment reproduced the image ID; a build on another trusted host and an independent implementation remain unavailable. +The host pins `rand` 0.8.6, the first patched 0.8 release for +[`GHSA-cq8v-f236-94qc`](https://github.com/advisories/GHSA-cq8v-f236-94qc). +The locked RISC Zero 3.0.6 dependency graph also contains `tracing-subscriber` 0.2.25 +through `ark-relations`. That crate is affected by +[`GHSA-xwfj-jgwm-7wp5` / `CVE-2025-58160`](https://github.com/advisories/GHSA-xwfj-jgwm-7wp5) +only when its terminal-formatting path emits attacker-controlled ANSI escape sequences. +Both committed lock files compile it without the formatting feature: its resolved package +block depends only on `tracing-core`. The repository's host and guest sources do not +initialize a formatting subscriber. The vulnerable terminal-output mechanism is therefore +absent from this exact example even though the transitive package version remains present. + +This boundary expires if the dependency features, RISC Zero version, lock files, or Rust +sources change. Enabling terminal formatting requires upgrading to a fixed dependency graph +and regenerating or revalidating the recorded proof coordinate; a prior alert dismissal +must not be carried forward by package name alone. + ### Semantic overreach A prover selects the private bytes and candidate tag. The proof does not show that those diff --git a/examples/zizk_artifact_first/risc0/host/Cargo.toml b/examples/zizk_artifact_first/risc0/host/Cargo.toml index a93f508..66812f4 100644 --- a/examples/zizk_artifact_first/risc0/host/Cargo.toml +++ b/examples/zizk_artifact_first/risc0/host/Cargo.toml @@ -6,7 +6,7 @@ publish = false [dependencies] hex = "=0.4.3" -rand = "=0.8.5" +rand = "=0.8.6" risc0-zkvm = { version = "=3.0.6", features = ["disable-dev-mode"] } rmp-serde = "=1.3.0" serde = { version = "=1.0.228", features = ["derive"] } diff --git a/scripts/check_presentation.py b/scripts/check_presentation.py index dfa567e..1de8e58 100644 --- a/scripts/check_presentation.py +++ b/scripts/check_presentation.py @@ -322,8 +322,11 @@ def maturity_table_violations(readme: str) -> list[str]: errors: list[str] = [] if header not in section: errors.append("README.md maturity table does not expose all six required fields") + table = section + else: + table = section.split(header, 1)[1] rows: dict[str, list[str]] = {} - for line in section.splitlines(): + for line in table.splitlines(): if not line.startswith("|") or line.startswith("|---"): continue cells = [cell.strip() for cell in line.strip().strip("|").split("|")] @@ -371,6 +374,7 @@ def check_claim_boundaries(errors: list[str]) -> None: "VSTD is a verification-domain language and Python reference implementation", "does **not**\nreplace native domain verifiers", "## 30–60 second demonstration", + "## The 90-second mental model", "## What a result means", "## Current maturity", "## Why VSTD exists", @@ -395,6 +399,7 @@ def check_claim_boundaries(errors: list[str]) -> None: expected_order = ( "VSTD is a verification-domain language", "## 30–60 second demonstration", + "## The 90-second mental model", "## What a result means", "## Current maturity", "## Why VSTD exists", diff --git a/tests/test_experimental_workflow_profile.py b/tests/test_experimental_workflow_profile.py index e55ecb8..1b1d820 100644 --- a/tests/test_experimental_workflow_profile.py +++ b/tests/test_experimental_workflow_profile.py @@ -35,6 +35,11 @@ ) +def test_non_normative_experiments_remain_outside_supported_examples() -> None: + assert (ROOT / "experiments" / "INDEX.md").is_file() + assert not (ROOT / "examples" / "experimental_profiles").exists() + + def _example_payload() -> dict[str, object]: return json.loads(EXPERIMENT_MANIFEST.read_text(encoding="utf-8")) diff --git a/tests/test_presentation_surface.py b/tests/test_presentation_surface.py index 5a629af..b1ac0f5 100644 --- a/tests/test_presentation_surface.py +++ b/tests/test_presentation_surface.py @@ -116,6 +116,11 @@ def test_maturity_table_requires_each_major_surface_and_explicit_conformance() - readme = (ROOT / "README.md").read_text(encoding="utf-8") assert module.maturity_table_violations(readme) == [] + assert "## The 90-second mental model" in readme + assert "Exact surface-by-surface matrix for reviewers and integrators" in readme + assert readme.index("## The 90-second mental model") < readme.index( + "## Current maturity" + ) combined = readme.replace("| VSTD-Graph-3 |", "| VSTD-Graph-2 |", 1) errors = module.maturity_table_violations(combined) diff --git a/tests/test_zizk_artifact_first.py b/tests/test_zizk_artifact_first.py index cc2ae72..b171d29 100644 --- a/tests/test_zizk_artifact_first.py +++ b/tests/test_zizk_artifact_first.py @@ -5,6 +5,7 @@ import hashlib import json from pathlib import Path +import re import subprocess @@ -23,11 +24,37 @@ def test_zero_knowledge_mechanism_is_optional_and_pinned() -> None: assert 'version = "=3.0.6"' in host_manifest assert 'features = ["disable-dev-mode"]' in host_manifest + assert 'rand = "=0.8.6"' in host_manifest assert 'version = "=3.0.6"' in guest_manifest assert 'version = "=3.0.6"' in methods_manifest assert "zizk" not in (ROOT / "pyproject.toml").read_text(encoding="utf-8").lower() +def test_pinned_security_advisory_boundaries_are_current() -> None: + locks = ( + MECHANISM / "Cargo.lock", + MECHANISM / "methods" / "guest" / "Cargo.lock", + ) + workspace_lock = locks[0].read_text(encoding="utf-8") + assert 'name = "rand"\nversion = "0.8.5"' not in workspace_lock + assert 'name = "rand"\nversion = "0.8.6"' in workspace_lock + + for path in locks: + text = path.read_text(encoding="utf-8") + match = re.search( + r'\[\[package\]\]\nname = "tracing-subscriber"\nversion = "0\.2\.25"' + r'.*?(?=\n\[\[package\]\]|\Z)', + text, + flags=re.DOTALL, + ) + assert match is not None + assert 'dependencies = [\n "tracing-core",\n]' in match.group(0) + + threat_model = (MECHANISM / "THREAT_MODEL.md").read_text(encoding="utf-8") + assert "vulnerable terminal-output mechanism is therefore" in threat_model + assert "absent from this exact example" in threat_model + + def test_zero_knowledge_claim_boundary_is_explicit() -> None: boundary = (MECHANISM / "CLAIM_BOUNDARY.md").read_text(encoding="utf-8") assert "does not prove" in boundary