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:
-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