Exercise Answers¶
Page Maps¶
graph LR
family["Reproducible Research"]
program["Deep Dive Make"]
section["Migration Governance Tool Boundaries"]
page["Exercise Answers"]
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 after you have written your own answers. The value is in comparing reasoning, not in copying sentences.
The answers below are reference-quality examples. Your own repository and target names will vary. What should stay stable is the reasoning shape:
- start from observable behavior
- classify the finding before recommending a repair
- preserve proof while changing contracts or boundaries
Answer 1: Write a first-pass build review¶
A strong answer does not try to solve everything. It makes the current system legible.
Example answer shape:
| Review section | Strong answer example |
|---|---|
| public targets | "all builds the default outputs, release packages and uploads, and prepare-release appears to be an accidental semi-public helper because CI calls it directly." |
| trusted outputs | "dist/report.tar.gz is treated as trusted, but both release and publish appear to regenerate inputs on the way there." |
| hidden inputs | "Environment variables choose report mode, but the graph does not model them explicitly." |
| pressure finding | "make -j8 release occasionally leaves partial files in dist/, which suggests publication is not atomic." |
| risk classes | "Top risks are contract drift, multi-writer output behavior, and boundary confusion between local packaging and remote publication." |
Why this is strong:
- it names behavior instead of insulting structure
- it uses evidence or likely evidence
- it ends with classified findings that can guide migration
Weak answers usually say only "the Makefile is messy" or "we should use a different tool."
Answer 2: Sequence a safe migration¶
A strong migration answer changes one boundary and preserves one proof route.
Example:
- current contract: "
releasecurrently means build, validate, package, and publish." - first boundary move: "split local package production into
distand keep publication separate." - preserved proof: "record the current release layout with
find dist -type f | sortbefore changing the packaging route." - retirement condition: "the old
releaseimplementation can disappear oncedistproduces the same declared artifact set andpublishconsumes only that artifact set."
Why this is strong:
- the first change is narrow
- the answer does not remove evidence before the new route is trusted
- retirement is based on proof, not optimism
Answer 3: Write a governance note that could actually be enforced¶
A strong answer is short and operational.
Example:
Public targets are all, test, selftest, dist, publish, clean, and help.
Changes to public target names or meanings require maintainer review and docs updates.
CI may call only public targets.
New include files require a one-sentence responsibility statement.
New macros must state whether they compute text, define rules, or both.
Proof routes such as selftest and release audits may not be removed without a documented replacement.
Why this is strong:
- another maintainer could apply it in review
- it protects both contracts and proof surfaces
- it addresses the common drift points directly
Weak governance notes use language like "try to keep things simple" because nobody can enforce that.
Answer 4: Diagnose one recurring antipattern¶
Choose one pattern and name the first honest recovery move.
Example:
- antipattern: multi-writer outputs
- confirming signals:
- "
build/report.htmlchanges when bothallandreleaserun" - "packaging routes invoke the same generator that ordinary build routes invoke"
- first repair: "assign one rule or route as the sole writer of
build/report.htmland make packaging depend on that published output instead of regenerating it" - why this helps: "it restores output ownership and makes incremental behavior easier to reason about"
The key is to explain why the repair restores truth or ownership clarity, not just why it looks cleaner.
Answer 5: Make the tool-boundary argument¶
A strong answer focuses on ownership fit.
Example:
- concern: remote publication
- judgment: "Make should not remain the full owner"
- argument: "Make is still a good owner for producing the local artifact and checksum, but remote publication depends on authentication, approval, and remote state that Make cannot model honestly. A dedicated service should own publication policy and status."
- handoff artifact: "
dist/report.tar.gzplus its checksum and metadata manifest" - proving the boundary works: "the build can produce and verify the local artifact without talking to the remote system, and publication errors are reported by the owning service rather than hidden inside packaging behavior"
Why this is strong:
- it does not replace Make out of fashion
- it keeps Make where it is still honest
- it defines the handoff surface explicitly
What all five answers have in common¶
The best answers in this module usually do five things:
- they describe current behavior before prescribing a redesign
- they classify findings in terms of truth, contract, or boundary
- they keep evidence alive during migration
- they write rules other maintainers could really use
- they justify tool boundaries by modeling fit and ownership
If your answers do those five things, you are using Module 10 the right way.