Source: Exercise Quality Control Audit

Date: 2026-04-10 Scope: All 43 exercises in content/ (ch01–ch11) across public repo (VHCosta/c-systems-lab-exercises) and paid bundle (exports/paid/)


Findings

Issue 1 — Solutions leaked into public repo (RESOLVED)

8 exercises in the public repo (VHCosta/c-systems-lab-exercises) contained full reference solutions instead of starter stubs. Several were explicitly labelled “solution” in their file headers.

Affected exercises:

  • ch02/ex2_1 — labelled “solution / verification” in header
  • ch02/ex2_3 — labelled “solution” in header
  • ch03/ex3_3 — fully implemented pointer arithmetic
  • ch05/ex5_1_Static_assert answers baked in
  • ch05/ex5_4 — full bit field register implementation
  • ch06/ex6_2 — full _Generic implementation
  • ch06/ex6_3 — full platform detection (no student work required anyway, but solution file used)
  • ch07/ex7_3 — full fork/fd sharing implementation with three-table diagram

Root cause: The export.sh paid-tier path was copy-overwriting starter stubs with solution files at the same path. When the public export was pushed, solution files were accidentally included.

Resolution:

  1. Correct starter stubs confirmed in content/chNN/exN_M/starter/ for all 8 affected exercises.
  2. export.sh paid path fixed: solutions now go to solutions/ subdir, not flat override.
  3. Public repo git history rewritten as orphan branch (single clean commit) to purge solution history.
  4. Force-pushed to both main and master on VHCosta/c-systems-lab-exercises.

Issue 2 — ch01 exercise numbering gap (RESOLVED)

content/ch01/ contained ex1_1, ex1_2, ex1_4 — no ex1_3. The exercise count (43) matched the plan, confirming ex1_3 was intentionally cut at some point, but the gap in numbering was a scar from that edit.

Resolution:

  • content/ch01/ex1_4/ renamed to content/ch01/ex1_3/
  • meta.json updated: "exercise": 4"exercise": 3
  • prompt.md updated: “Exercise 1.4” → “Exercise 1.3”
  • Public repo updated and pushed (normal commit, no history rewrite needed)

Issue 3 — export.sh paid bundle structure (RESOLVED)

The paid bundle was structurally identical to the public bundle — no solutions/ subfolder, making it unclear to buyers that they received solutions.

Resolution: export.sh paid path now produces:

chNN/exN_M/
  prompt.md
  meta.json
  *.c / *.h         starter stubs
  solutions/        reference solution
    *.c / *.h
  extended/         (where applicable)

Zip step added at end of both export modes: csl-exercises-{version}.zip (public) / csl-solutions-{version}.zip (paid).


Structural Audit — All 43 Exercises

All 43 exercises pass structural checks:

CheckResult
prompt.md present43/43 ✅
meta.json present43/43 ✅
starter/ present43/43 ✅
solution/ present43/43 ✅
Starter has TODO markers42/43 ✅

The one exercise without TODO markers is ch04/ex4_3 — a deliberate bug-hunt exercise. The student’s task is to find and fix three /* BUG: */-annotated memory errors (overflow, use-after-free, leak). No TODO stubs are appropriate for this format.


Compilation Validation

scripts/validate.sh was previously confirmed at 43/43 PASS in a Linux environment. Validation could not be re-run during this audit (no gcc on the Windows host). Re-run on Linux/WSL to re-confirm after the ex1_4→ex1_3 rename.


PDF Spot-Check (2026-04-11)

All 3 PDF tiers built and spot-checked after cover redesign:

TierFilePages
Basecompanion.pdf142 pp
Solutionscompanion-solutions.pdf207 pp
Completecompanion-complete.pdf217 pp

Cover redesigned to match Gumroad cover aesthetic: Space Grotesk Bold, dark background (#0D0D0F), amber accent (#e8b84b), grid lines, pill badges. Static SpaceGrotesk-Bold.ttf added to pdf/fonts/ (variable font not supported by Typst).


Status After Audit

  • Public repo: clean, stubs only, correct numbering — live at VHCosta/c-systems-lab-exercises
  • Paid export script: correct structure, produces zip
  • Content tree: 43 exercises, no gaps, no leaked solutions
  • Product live on Gumroad at vhcosta.gumroad.com/l/c-systems-lab
  • validate.sh was 43/43 PASS pre-rename; re-run on Linux/WSL to confirm post ex1_4→ex1_3