Checkpoints and recovery
Every ZIP has a sensor-monitor/ top folder and a CHECKPOINT.md. Extract into a
new exercise folder, change to that top folder, and read its README. Earlier
snapshots contain earlier implementations; CP05–08 have no threshold, hysteresis,
or command-parser source. CP00 is an inspection packet without learner history.
| Checkpoint | Starts | Contents and applicable verification |
|---|---|---|
| CP00 | Chapters 1–4 | Source/reference excerpts and clearly synthetic log; annotate claims |
| CP01 | Chapters 5–7 | Minimal firmware and host report, setup, dependencies, ignores; replay/build; two demonstration commits |
| CP02 | Chapters 8–9 | CP01 plus project brief and sourced hardware facts; check links/source applicability |
| CP03 | Chapter 10 | Working AGENTS.md; fresh-session bounded edit and actual replay/build receipt |
| CP04 | Chapters 11–12 | Datasheet skill and interface plan; relevant/unrelated/incomplete behavior requests |
| CP05 | Chapter 13 | Synthetic adapter and shared normal/fault policy; replay/build |
| CP06 | Chapter 14 | Diagnosable fixture exercise and separate fault snapshots; preserve reproducer and diagnosis |
| CP07 | Chapter 15 | Basic normal/fault host tests and evidence guidance; test/replay/build |
| CP08 | Chapter 16 | Firmware-review skill and repository-only handoff; basic tests and real fresh-session receipt |
| CP09 | Chapters 17–18 | Final threshold/hysteresis/commands, complete tests and release source; full verification and fresh checkout |
Prepared history is in sensor-monitor-history.bundle; ZIPs cannot substitute
for the graph. The bundle contains only the generic Course Engineer demonstration
identity and its manufactured teaching history. It contains no authoring commits
or remote credentials. To practice without overwriting earlier work:
git clone .\sensor-monitor-history.bundle chapter-07
Set-Location .\chapter-07
git switch -c my-practice CP01
git log --oneline -3
CP00 through CP09 are stable content tags. Create your own branch from a tag;
do not edit a detached tag accidentally. To resolve a deliberate conflict, use a
new clone, switch to a new branch from origin/practice-conflict-left, then merge
origin/practice-conflict-right. Both changed the same README line. Inspect the
conflict, choose a coherent sentence, remove markers, stage the resolved README,
and commit. git merge --abort returns to the pre-merge state while the merge is
in progress. Inspect status before any recovery command.
| Fault checkpoint | Starting stage | Diagnosis key and recovery |
|---|---|---|
| FAULT-stale | CP07 normal/fault solution, also usable after CP06 | poll no longer expires a current sample; at 4001 ms the 1000 ms reading remains current. Restore the guard and run basic tests/replay |
| FAULT-fixture | CP06 | 26C violates numeric grammar at line 3. Correct only the fixture; malformed input is not a sensor fault |
| FAULT-hysteresis | CP09 capstone | < misses exact clear equality at 27.0 °C. Restore <=, run full tests and cross-build |
| FAULT-command | CP09 capstone | Removing complete-token validation accepts a malformed numeric suffix. Restore the guard and rerun parser tests/cross-build |
For committed-error practice, use a separate clone and
git switch -c recover-hysteresis FAULT-hysteresis, inspect git show HEAD, then
git revert --no-edit HEAD. The new commit restores the preceding solution
without rewriting history. Re-run native tests and the firmware build. For an
uncommitted change, inspect git diff before git restore -- path/to/file; that
discards the selected unsaved edit. Use separate exercise folders for these two
different operations.
Authoring export command (Python 3 and Git):
python3 scripts/export_checkpoints.py --output exports/release-01
The exporter refuses an existing destination. It creates a fresh isolated Git
repository below ignored build/, uses a fixed generic identity/date, and writes
deterministic ZIP entries plus source/artifact hashes. It never commits in the
authoring repository. Regenerate into a new folder after changing final source;
do not silently replace an already distributed release hash.