Progress Report Rubric
Use this procedure for dated reports in ai_docs/progress-reports/YYYY-MM-DD.md.
The primary question is not how many tests exist; it is which real programs
work in each execution mode, and where support drops as users move from the
leading mode to trailing modes.
Non-negotiable evidence rules
- Measure one exact
origin/main SHA in a clean checkout. If main moves and
product code changed, update and rerun affected measurements.
- Run the same app probes through
--strict --verify, record/replay, DBI, and
KVM. Do not substitute old task notes for live results.
- Use only code and artifacts available from main. Unlanded work belongs in a
final footnote, never in the coverage totals.
- Mark unavailable or interrupted measurements honestly.
BLOCKED, NOT RUN,
and INCOMPLETE are not failures, but none count as passes.
- State backend, log level, relaxations, command, exit status, and material
output for every Hermit measurement.
Required report shape
- Snapshot: full SHA, UTC time, host/kernel, PMU policy, toolchain, and
guest binaries used.
- Coverage slope: one compact row per mode showing
passed / probes, the
first unsupported workload class, and the current blocking layer.
- App matrix: one row per identical program/workload, columns for strict
verify, R/R, DBI, and KVM. Include at least a trivial ELF, a file-processing
tool, an interpreter, a concurrent pipeline, and a toolchain frontend.
- Repository health:
cargo test, validate.sh, the working-envelope
vector, focused R/R suite, and live main CI. Preserve incomplete-run status.
- Gaps and next actions: order by the first mode where support drops.
- Unlanded footnote: at most three bullets with links; no unlanded result
may alter a main-branch cell.
Measurement procedure
Freeze main and context
with-proxy git fetch origin main
git switch -c report-YYYY-MM-DD origin/main # in a clean assigned worktree
git rev-parse HEAD
date -u +%Y-%m-%dT%H:%M:%SZ
uname -r
grep -m1 'model name' /proc/cpuinfo
cat /proc/sys/kernel/perf_event_paranoid
rustc --version; cargo --version; cargo nextest --version
cargo build -p hermit
Re-fetch before writing. If only docs moved, record that fact; if product code
moved, rerun the affected cells at the new SHA.
Cross-mode app matrix
Choose a small, stable probe list and keep it identical across modes. A useful
minimum is:
/bin/echo hello
/usr/bin/sha256sum /etc/hostname
/usr/bin/python3 -c 'print(sum(range(100)))'
/bin/bash -c '/bin/echo hello | /usr/bin/wc -c'
/usr/bin/gcc --version
For each probe, run:
./target/debug/hermit run --strict --verify -- PROGRAM ARGS...
./target/debug/hermit record start --verify --record-timeout 90 \
--data-dir "$(mktemp -d /tmp/hermit-report-rr.XXXXXX)" -- PROGRAM ARGS...
./target/debug/hermit run --backend dbi -- PROGRAM ARGS...
./target/debug/hermit run --backend kvm -- PROGRAM ARGS...
If DBI or KVM has a backend-wide preflight failure, run one representative
probe, quote the error, and mark the remaining cells BLOCKED* with one shared
footnote. Do not use a client, SDK, pin, or proof branch that is not supplied by
main. For R/R, distinguish record timeout, replay divergence, output mismatch,
and successful round trip.
Repository health
cargo test 2>&1 | tee /tmp/progress-cargo-test.log
cargo test -p hermit --test record_replay -- --test-threads=1
./validate.sh 2>&1 | tee /tmp/progress-validate.log
ENVELOPE_JSON=/tmp/progress-envelope.json ./validate.sh --envelope-only
with-proxy gh run list -R rrnewton/hermit --branch main --limit 6
Bound commands that can hang and report the bound. Aggregate only completed
test result: lines. If a process is killed or interrupted, name the last
completed step and state that no final summary was produced. The rr_suite
target may exist but have ignored PMU/mount-namespace cases; report executed and
ignored counts separately.
Cell vocabulary
PASS L2: strict verify completed and reported deterministic output.
PASS R/R: record completed, replay completed, and outputs/logs matched.
FAIL: the mode ran the guest and produced a mismatch, divergence, crash, or
nonzero result attributable to that workload.
BLOCKED: a backend-wide dependency or implementation gate prevented guest
execution; quote it once.
NOT RUN: no command was attempted. State why.
Accounting and writing rules
- Use one denominator for the same-app matrix. Broader historical matrices may
be linked as context but must not be added to fresh probe counts.
- Present the support slope explicitly, for example
5/5 -> 4/5 -> blocked -> blocked, then explain the first lost workload.
- Separate product gaps from changing host state, missing privileges, and test
harness interruption. Say
unknown when attribution is not established.
- Never call main green unless the exact-SHA gate completed successfully.
- Do not stage generated logs, recordings,
envelope.json, target/, or
unrelated concurrent changes.
1---2name: progress-rubric3description: Create evidence-based Hermit progress reports from live measurements. Use when gathering, validating, or writing a project progress report.4---56# Progress Report Rubric78Use this procedure for dated reports in `ai_docs/progress-reports/YYYY-MM-DD.md`.9The primary question is not how many tests exist; it is **which real programs10work in each execution mode, and where support drops as users move from the11leading mode to trailing modes**.1213## Non-negotiable evidence rules14151. Measure one exact `origin/main` SHA in a clean checkout. If main moves and16 product code changed, update and rerun affected measurements.172. Run the same app probes through `--strict --verify`, record/replay, DBI, and18 KVM. Do not substitute old task notes for live results.193. Use only code and artifacts available from main. Unlanded work belongs in a20 final footnote, never in the coverage totals.214. Mark unavailable or interrupted measurements honestly. `BLOCKED`, `NOT RUN`,22 and `INCOMPLETE` are not failures, but none count as passes.235. State backend, log level, relaxations, command, exit status, and material24 output for every Hermit measurement.2526## Required report shape27281. **Snapshot**: full SHA, UTC time, host/kernel, PMU policy, toolchain, and29 guest binaries used.302. **Coverage slope**: one compact row per mode showing `passed / probes`, the31 first unsupported workload class, and the current blocking layer.323. **App matrix**: one row per identical program/workload, columns for strict33 verify, R/R, DBI, and KVM. Include at least a trivial ELF, a file-processing34 tool, an interpreter, a concurrent pipeline, and a toolchain frontend.354. **Repository health**: `cargo test`, `validate.sh`, the working-envelope36 vector, focused R/R suite, and live main CI. Preserve incomplete-run status.375. **Gaps and next actions**: order by the first mode where support drops.386. **Unlanded footnote**: at most three bullets with links; no unlanded result39 may alter a main-branch cell.4041## Measurement procedure4243### Freeze main and context4445```bash46with-proxy git fetch origin main47git switch -c report-YYYY-MM-DD origin/main # in a clean assigned worktree48git rev-parse HEAD49date -u +%Y-%m-%dT%H:%M:%SZ50uname -r51grep -m1 'model name' /proc/cpuinfo52cat /proc/sys/kernel/perf_event_paranoid53rustc --version; cargo --version; cargo nextest --version54cargo build -p hermit55```5657Re-fetch before writing. If only docs moved, record that fact; if product code58moved, rerun the affected cells at the new SHA.5960### Cross-mode app matrix6162Choose a small, stable probe list and keep it identical across modes. A useful63minimum is:6465```text66/bin/echo hello67/usr/bin/sha256sum /etc/hostname68/usr/bin/python3 -c 'print(sum(range(100)))'69/bin/bash -c '/bin/echo hello | /usr/bin/wc -c'70/usr/bin/gcc --version71```7273For each probe, run:7475```bash76./target/debug/hermit run --strict --verify -- PROGRAM ARGS...77./target/debug/hermit record start --verify --record-timeout 90 \78 --data-dir "$(mktemp -d /tmp/hermit-report-rr.XXXXXX)" -- PROGRAM ARGS...79./target/debug/hermit run --backend dbi -- PROGRAM ARGS...80./target/debug/hermit run --backend kvm -- PROGRAM ARGS...81```8283If DBI or KVM has a backend-wide preflight failure, run one representative84probe, quote the error, and mark the remaining cells `BLOCKED*` with one shared85footnote. Do not use a client, SDK, pin, or proof branch that is not supplied by86main. For R/R, distinguish record timeout, replay divergence, output mismatch,87and successful round trip.8889### Repository health9091```bash92cargo test 2>&1 | tee /tmp/progress-cargo-test.log93cargo test -p hermit --test record_replay -- --test-threads=194./validate.sh 2>&1 | tee /tmp/progress-validate.log95ENVELOPE_JSON=/tmp/progress-envelope.json ./validate.sh --envelope-only96with-proxy gh run list -R rrnewton/hermit --branch main --limit 697```9899Bound commands that can hang and report the bound. Aggregate only completed100`test result:` lines. If a process is killed or interrupted, name the last101completed step and state that no final summary was produced. The `rr_suite`102target may exist but have ignored PMU/mount-namespace cases; report executed and103ignored counts separately.104105## Cell vocabulary106107- `PASS L2`: strict verify completed and reported deterministic output.108- `PASS R/R`: record completed, replay completed, and outputs/logs matched.109- `FAIL`: the mode ran the guest and produced a mismatch, divergence, crash, or110 nonzero result attributable to that workload.111- `BLOCKED`: a backend-wide dependency or implementation gate prevented guest112 execution; quote it once.113- `NOT RUN`: no command was attempted. State why.114115## Accounting and writing rules116117- Use one denominator for the same-app matrix. Broader historical matrices may118 be linked as context but must not be added to fresh probe counts.119- Present the support slope explicitly, for example `5/5 -> 4/5 -> blocked ->120 blocked`, then explain the first lost workload.121- Separate product gaps from changing host state, missing privileges, and test122 harness interruption. Say `unknown` when attribution is not established.123- Never call main green unless the exact-SHA gate completed successfully.124- Do not stage generated logs, recordings, `envelope.json`, `target/`, or125 unrelated concurrent changes.