Chapter 7 — Thesis synthesis and reproducibility archive
Lesson map
Lesson 07 published. Map, example, EX039.
flowchart TD
N0["Learning outcomes"]
N1["7.1 One argument, not five papers"]
N2["7.2 What goes in the archive"]
N3["7.3 Detecting silent edits"]
N4["Lab — Hash manifest"]
N5["7.4 Reading the manifest"]
N6["7.5 Release decisions"]
N7["Synthesis"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Worked example"]
EX --> Q["Exercise EX039"]
Logical drawing
flowchart LR
N0["Learning outcomes"]
N1["7.1 One argument, not five papers"]
N2["7.2 What goes in the archive"]
N3["7.3 Detecting silent edits"]
N4["Lab — Hash manifest"]
N5["7.4 Reading the manifest"]
N6["7.5 Release decisions"]
N7["Synthesis"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX039"]
[Learning outcomes]
|
v
[7.1 One argument, not five papers]
|
v
[7.2 What goes in the archive]
|
v
[7.3 Detecting silent edits]
|
v
[Lab — Hash manifest]
|
v
[7.4 Reading the manifest]
|
v
[7.5 Release decisions]
|
v
[Synthesis]
|
v
[Worked example] --> [Exercise EX039]
Learning outcomes
You will (1) synthesise chapters into one argued thesis; (2) build a hashed reproducibility archive that detects silent edits; (3) decide what can and cannot be released from a security study.
7.1 One argument, not five papers
Nadia's thesis must read as a single argument. Her introduction states the claim: in one payments organisation, a cryptographic-misuse checklist with lint reduced confirmed misuse per ten crypto-touching changes over a quarter, at a modest time cost, with the effect concentrated in key-handling. Each chapter then answers one question the claim depends on: whether misuse can be coded reliably, why it matters by the standards' own limits, whether the baseline justified intervention, whether the trial supports the effect and whether it survives critique. Material that answers none of those questions moves to an appendix.
7.2 What goes in the archive
The archive lets an examiner rerun every number without contacting Nadia. It contains the codebook with version history, the registration and addendum, pseudonymised team-level counts, the randomisation and analysis scripts with seeds, the lab programs from this book, the response letter, and a README explaining how to run everything with only a standard Python installation. It excludes diffs, repository names and anything that could identify a Meridian system, as the data agreement requires. The README states this exclusion openly, so readers know which claims rest on data they cannot see.
7.3 Detecting silent edits
An archive is useful only if readers can tell whether it has changed since the thesis was examined. Nadia records a SHA-256 digest, defined in FIPS 180-4, of each file and a single root digest computed over the sorted file digests, and prints the root in the thesis itself. The lab builds such a manifest for three toy files and shows that changing one word in the findings file changes the root completely. A hash manifest proves integrity against accidental or unannounced edits; it does not prove who made the archive, which would need a digital signature such as Ed25519 from RFC 8032.
Lab — Hash manifest
"""SHA-256 manifest for a synthetic reproducibility archive (hashlib only)."""
import hashlib
FILES = {"codebook.md": b"nonce-iv | key-handling | primitive-choice | other\n",
"findings.csv": b"id,team,arm,category\nF001,T03,check,nonce-iv\n",
"analysis.py": b"# permutation test, seed 2026\n"}
def main():
for name, data in sorted(FILES.items()):
print(f"{hashlib.sha256(data).hexdigest()[:16]}... {name}")
whole = hashlib.sha256(b"".join(hashlib.sha256(FILES[k]).digest() for k in sorted(FILES))).hexdigest()
print(f"manifest root {whole[:16]}...")
tampered = dict(FILES, **{"findings.csv": FILES["findings.csv"].replace(b"check", b"usual")})
root2 = hashlib.sha256(b"".join(hashlib.sha256(tampered[k]).digest() for k in sorted(tampered))).hexdigest()
print(f"after one-word edit root {root2[:16]}... match={root2 == whole}")
if __name__ == "__main__":
main()
Run with python3 lab_archive.py. Verified output:
74b6ee0a6c357d2b... analysis.py
dd8ff4efed0b0971... codebook.md
8fb59a60f3904a37... findings.csv
manifest root 4ed0159418d1b231...
after one-word edit root 1fcc81b868bef821... match=False
7.4 Reading the manifest
Each file digest is shown truncated to sixteen hex characters for readability, while the archive stores all sixty-four. The root over the sorted digests is 4ed0159418d1b231, and after a one-word edit that relabels a finding's arm, the root becomes 1fcc81b868bef821 and the match check prints False. Because SHA-256 is designed to be collision resistant, a reader who recomputes the root and finds the published value can be confident the files are those examined. Nadia warns that sorting must be documented; a different file order would produce a different root for identical content.
7.5 Release decisions
Some material cannot be released even with pseudonyms. Nadia applies a release test to each item: could it help someone find or exploit a weakness in a Meridian system that may still exist? Team-level counts and the codebook pass. Example findings pass only as invented paraphrases. The lint rules pass, because they detect patterns already described in public guidance. Auditor notes fail, because they mention internal service names. Meridian's security lead signs the final release list, and the archive's README links to it so readers understand why some evidence is described rather than shown.
Worked example
Nadia writes a one-paragraph thesis claim, assembles the archive with a manifest whose root is printed in the thesis, and records a signed release list explaining each exclusion.
Synthetic note. The three archive files and their digests are invented teaching data; SHA-256 itself is real (FIPS 180-4).
Errors and limits
A digest detects change but cannot say whether the original content was honest. Never publish real key identifiers, even hashed, because low-entropy identifiers can be guessed and matched.
Exercises
- EX039 — Thesis claim. State Nadia's synthesised thesis claim. Rubric: 3 = checklist+lint cut confirmed misuse per ten changes in one firm over a quarter, modest time cost, mainly key-handling;; 2 = effect only;; 1 = universal claim;; 0 = none.
- EX040 — Archive exclusions. What does the archive exclude and why? Rubric: 3 = diffs, repository names, anything identifying Meridian systems, per data agreement;; 2 = partial;; 1 = vague;; 0 = none.
- EX041 — Manifest roots. Report the root before and after the edit. Rubric: 3 = 4ed0159418d1b231 then 1fcc81b868bef821, match False;; 2 = one root;; 1 = "changed";; 0 = none.
- EX042 — Hash versus signature. What does the manifest prove and what does it not? Rubric: 3 = integrity against edits, not authorship; a signature such as Ed25519 (RFC 8032) proves origin;; 2 = one side;; 1 = confused;; 0 = none.
- EX043 — Ordering pitfall. Why must sorting be documented? Rubric: 3 = different file order gives a different root for identical content;; 2 = reproducibility;; 1 = style;; 0 = none.
- EX044 — Release test. State Nadia's release test and one item that fails it. Rubric: 3 = could it help find or exploit a weakness that may still exist; auditor notes fail;; 2 = test only;; 1 = item only;; 0 = none.
Synthesis
A thesis is one claim defended chapter by chapter; a hashed, documented and carefully redacted archive lets others verify it without exposing the partner.
Continue studying — chapter 07 of 08
← Chapter 06 (draft) · Course chapter index · Chapter 08 (draft) →