Anti-Pattern Atlas¶
Page Maps¶
graph LR
family["Reproducible Research"]
program["Deep Dive Make"]
section["Reference"]
page["Anti-Pattern Atlas"]
capstone["Capstone evidence"]
family --> program --> section --> page
page -.applies in.-> capstone
flowchart LR
orient["Orient on the page map"] --> read["Read the main claim and examples"]
read --> inspect["Inspect the related code, proof, or capstone surface"]
inspect --> verify["Run or review the verification path"]
verify --> apply["Apply the idea back to the module and capstone"]
Use this page when you recognize the smell before you recognize the lesson. A good atlas turns "this build feels wrong" into a smaller statement about hidden state, missing edges, unsafe publication, or ownership drift.
Symptom-led lookup¶
| Symptom | Likely failure class | Ask this next | First route |
|---|---|---|---|
-j breaks a target that looks fine in serial mode |
shared mutable output or a missing dependency edge | which file is written by more than one recipe, or consumed before publication is complete | make incident-audit |
| a touched file does not trigger a rebuild | hidden input or dishonest stamp boundary | which input changed meaning without appearing in the prerequisite graph | make selftest |
| everything rebuilds and no one can explain why | unstable discovery, broad stamps, or variable precedence drift | which target changed its meaning, flags, or discovered inputs | make profile-audit |
| a generated file exists, but downstream users stay stale | generated output modeled as a side effect instead of a declared edge | where should the generated file appear in the graph, and who owns it | make proof |
| release outputs look correct, but no one can say why they are trustworthy | publication contract is weaker than the build contract | which bundle or manifest proves what was published | make inspect |
the top-level Makefile keeps absorbing every concern |
ownership collapsed across build layers | which rule belongs in Makefile and which belongs in mk/*.mk |
make walkthrough |
Recurring failure classes¶
| Failure class | Why it matters | Where the course teaches the repair |
|---|---|---|
| phony ordering used instead of real file edges | it hides truth about what causes work | Modules 01-02, repro/06-order-only-misuse.mk |
| stamps used to hide meaningful state | it trades explicit inputs for wishful thinking | Modules 05-06, mk/stamps.mk |
| recursive or fragmented ownership by default | it makes the graph harder to reason about than the product | Modules 05 and 07, ARCHITECTURE.md |
| generated files treated as incidental | it breaks rebuild truth and downstream causality | Module 06, repro/04-generated-header.mk |
| shared temp files or append-only outputs | schedule changes start changing meaning | Modules 02 and 09, repro/01-shared-log.mk, repro/05-mkdir-race.mk |
| variable precedence left as folklore | a machine with different environment values tells a different story | Module 04, show, show-e, and profile-audit |
| publication done directly to final paths | partial artifacts become visible as if they were finished | Module 08, mk/macros.mk and the top-level recipes |
| observability bolted on after failure | incident review loses the evidence needed to explain cause | Module 09, trace-count, selftest-report, and audit bundles |
Repair order¶
When you identify a likely anti-pattern, use this sequence:
- name the failure class in one sentence
- point to the output, edge, or boundary that is lying
- choose the smallest capstone route that demonstrates the same defect or claim
- repair the model before polishing the implementation
That order keeps the fix anchored to build truth instead of style preferences.
Companion pages¶
Use these with the atlas:
self-review-prompts.mdfor debugging order under pressuremodule-dependency-map.mdfor where the idea is taught in sequencecapstone-map.mdfor module-aware capstone routingrepro-catalog.mdfor the curated failure pack