mirror of
https://github.com/saymrwulf/proof-aware-crypto-tooling-agent.git
synced 2026-09-04 20:03:40 +00:00
The notebooks now carry the same didactic contract as the companion book
(the "ratchet rule", stated in the course map): every load-bearing idea
runs twice - napkin scale, then real scale - and every pair is EXECUTABLE
in the notebook, not narrated.
- Lecture 1: the truth boundary updated to the proven four-tier apex,
with the what-is-still-NOT-proven list (SHA-512, parsers, signing,
wallets) given equal weight.
- Lecture 2: napkin/real scoring pair - a two-certificate toy card
scored in your head, then the shipped sixteen-certificate R4 fixture
through the same function, residual blockers and per-tier boundary
axioms printed.
- Lecture 6: new split-view section. A runnable equivocation drill:
pin a two-leaf view, grow it honestly with a consistency proof, then
present a forged same-size root and watch the pin store name the
attack. Real-scale pointers to --sth-store, log-consistency,
log-audit, and the freshness policy; a new exercise asks students to
construct the lie a size-only anchor check would miss.
- Lecture 7: the wallet gate now swings BOTH ways on real evidence -
a partial card denied at R3, the shipped R4 card allowed - both
runnable.
- Lecture 8 capstone: "design R4" became "audit R4": read the shipped
card like an auditor, then design the R5 discharge plan (parser
specs, verified SHA-512, signing-side, per-fork production-path
mapping).
- NEW Lecture 9, "Eat Your Own Dogfood": the honest coverage ledger of
the proven-path verifier; a napkin PEM decode (the fixed 12-byte
Ed25519 SPKI prefix, read with your eyes) paired with the mechanical
extraction; live backend dispatch; the fail-closed
--require-verified-verifier policy; and the hybrid-PQC section -
proven-classical Ed25519 plus a required-but-honest ML-DSA slot
("blockers get fixed; placeholders get trusted").
Every code cell of the changed notebooks was executed end-to-end before
committing (outputs stripped per house rules). 49/49 tests green with
the notebook inventory updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
|
|
EXPECTED_NOTEBOOKS = [
|
|
"00_course_map.ipynb",
|
|
"01_threat_model_and_truth_boundary.ipynb",
|
|
"02_claim_cards_and_risk_model.ipynb",
|
|
"03_lean_replay_and_axiom_audit.ipynb",
|
|
"04_proof_hygiene_and_boundaries.ipynb",
|
|
"05_third_party_attestation_provider.ipynb",
|
|
"06_merkle_transparency_logs.ipynb",
|
|
"07_agent_consequences.ipynb",
|
|
"08_capstone_research_program.ipynb",
|
|
"09_dogfood_verified_crypto.ipynb",
|
|
]
|
|
|
|
|
|
def test_curriculum_notebooks_are_valid_and_output_free():
|
|
root = Path(__file__).resolve().parents[1]
|
|
notebook_dir = root / "notebooks"
|
|
assert sorted(path.name for path in notebook_dir.glob("*.ipynb")) == EXPECTED_NOTEBOOKS
|
|
for name in EXPECTED_NOTEBOOKS:
|
|
notebook = json.loads((notebook_dir / name).read_text(encoding="utf-8"))
|
|
assert notebook["nbformat"] == 4
|
|
assert notebook["nbformat_minor"] >= 5
|
|
assert notebook["cells"]
|
|
combined = "\n".join(
|
|
"".join(cell.get("source", []))
|
|
for cell in notebook["cells"]
|
|
if cell.get("cell_type") == "markdown"
|
|
)
|
|
assert "Learning Objectives" in combined
|
|
if name != "00_course_map.ipynb":
|
|
assert "Exercises" in combined
|
|
assert "# Lecture" in combined
|
|
for cell in notebook["cells"]:
|
|
if cell.get("cell_type") == "code":
|
|
assert cell.get("execution_count") is None
|
|
assert cell.get("outputs") == []
|
|
|
|
|
|
def test_notebook_readme_points_to_course_map():
|
|
readme = (Path(__file__).resolve().parents[1] / "notebooks" / "README.md").read_text(encoding="utf-8")
|
|
assert "00_course_map.ipynb" in readme
|
|
assert "zero-to-hero" in readme
|