Project 33 is judged on evidence: what builds, what reproduces, what was measured, and what is honestly marked as not measured. Every check below names its scope. “Build passed” is not “design works”.
| CI establishes | CI cannot establish |
|---|---|
| Firmware compiles for both boards | That any firmware behavior happens on hardware |
| Python tests pass (a JUnit record is attached to the CI review packet) | That a mechanism deploys or locks |
| Every committed model output regenerates from source and matches by value | That a model’s formulation or inputs are valid |
| Requirements are evaluated from committed values, labeled with their evidence class | That a requirement is met physically |
| Records are internally consistent; generated docs and figures are current | Timing, stiffness, servo authority, drift, current draw |
| Interlocks are present in source, pinned by tests | That interlocks behave correctly on hardware, or operational safety |
Run from the repository root:
python tools/generate_protocol.py --check # protocol JSON, firmware header, and PROTOCOL.md agree
python tools/check_markdown_links.py # local Markdown targets exist
python tools/review_figures.py --check # review figures match the tested geometry code
python -m evidence check # record consistency, review freshness, stale generated docs
python -m pytest tests Firmware/tests -q # regression and adversarial tests
python -m evidence reproduce # regenerate model outputs and compare values (needs requirements-evidence.txt)
What the tests cover:
tests/test_evidence_adversarial.py, tests/test_evidence_review.py).nan, and no rocket-side text can trigger the launcher’s READY/IGNITED substring matches.The documentation checker uses only the Python standard library and runs offline.
It supports inline links/images and single-line reference definitions, relative
paths, root paths (including the site’s /33/ prefix), URL-encoded filenames,
angle-bracket paths with spaces, optional quoted titles, and one level of nested
parentheses in destinations. Code fences, inline code, indented code, and generated
directories (.git, .venv, venv, node_modules, TestSessions, __pycache__,
.pio, and build) are skipped. It checks target existence, not heading anchors, external
URLs, HTML links, Liquid templates, or unresolved reference labels. A missing
target prints file:line: missing local target: path and exits with status 1.
Use --root PATH to check a different documentation tree.
pio run -d Firmware/Rocket
pio run -d Firmware/Launcher
GitHub Actions runs these on every push and pull request. A successful build is compile-level evidence only.
Every capture goes through the session workflow in BENCH_SESSIONS.md: declare, passport, human acceptance, then citation. Until then it is a raw session, not evidence.
| Test | Evidence to save | Related record |
|---|---|---|
| Deploy-output timing | External logic-analyzer capture of GPIO 33 against a trigger reference | P-001, R-C2-JITTER |
| Gyro drift, stationary | Session with periodic dumplog, rocket-clock LOG rows |
P-003 |
| Torsion spring rate | Torque-angle table with instrument and calibration | P-002, R-C6-SPRING-RATE |
| Servo centering | Photo/video plus center angles used | — |
| PID comparison | Session CSV, pid-comparison.md, graph.png, identical fixture motion across runs |
— |
| Launcher arming and aborts | Session showing READY, ABORT: rows, LED/buzzer video |
Safety gates G-01 to G-03 |
| Command rejection | CMD_REJECT:dashboard_launch_disabled, CMD_REJECT:ignite_not_armed rows |
G-04, G-09, G-13 |
| Onboard log dump | LOG_START, LOG,..., LOG_END rows; audit reports the dump complete |
— |
| Dry CG | Balance-point measurement of the inert airframe | PRED-C5-DRY-CG |
| CAD assembly renders | Exports listed in CAD_ASSEMBLIES.md | D-005 |