◇ OpenCyber Academy
Doctoral research · Chapter 7 · English

Chapter 7 — Thesis synthesis and reproducibility archive

Open, free learning for anyone who wants to protect people and technology. No account is required to read this text or its worked answers.

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

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) →