Chapter 18 — Supervised technical project
Lesson map
Lesson 18 published. Map, example, EX071.
flowchart TD
N0["Learning outcomes and connection"]
N1["18.1 Choosing a project"]
N2["18.2 Phases"]
N3["18.3 Sealing evidence"]
N4["18.5 Assessment rubric for the project"]
N5["18.6 Continuing practice"]
N6["Chapter synthesis"]
N7["Chapter 1: EX001–EX004"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Worked example"]
EX --> Q["Exercise EX071"]
Logical drawing
flowchart LR
N0["Learning outcomes and connection"]
N1["18.1 Choosing a project"]
N2["18.2 Phases"]
N3["18.3 Sealing evidence"]
N4["18.5 Assessment rubric for the project"]
N5["18.6 Continuing practice"]
N6["Chapter synthesis"]
N7["Chapter 1: EX001–EX004"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX071"]
[Learning outcomes and connection]
|
v
[18.1 Choosing a project]
|
v
[18.2 Phases]
|
v
[18.3 Sealing evidence]
|
v
[18.5 Assessment rubric for the project]
|
v
[18.6 Continuing practice]
|
v
[Chapter synthesis]
|
v
[Chapter 1: EX001–EX004]
|
v
[Worked example] --> [Exercise EX071]
Learning outcomes and connection
After this chapter you should be able to:
- plan and execute a bounded technical project in a critical environment under supervision: scope, baseline, change, verification, troubleshooting log and handover;
- assemble a project evidence package and seal it with a manifest of SHA-256 digests and a separately recorded seal;
- detect any later change to sealed evidence, and explain what a seal does and does not prove;
- present the project for assessment against a rubric and state its open items honestly.
This chapter closes the course. It uses everything before it on one realistic task, and its output is what an employer or assessor would ask to see: not a claim of competence, but evidence of it.
18.1 Choosing a project
A good supervised project is narrow, valuable and checkable. Examples drawn from this book: harden the corporate-to-control-centre conduit and verify it (Chapters 10–11); close the station-router bypass across all stations (Chapter 13); deploy drift detection on the control-centre servers (Chapter 14); build and test the detection pipeline against a replayed, sanitized capture (Chapter 17). Every project needs a supervisor (here L. Ferreira) and an authorizer who owns the affected systems (here A. Mensah for Kestrel Water).
Agree the supervisor, the owner who signs the scope and the success criteria before day one. Pick one conduit or one class of host, not the whole programme. Write the open items you expect to leave, so honesty about limits is planned rather than improvised at assessment.
18.2 Phases
- Scope (Chapter 5): purpose, systems, actions, window, people, stops, evidence handling — signed.
- Baseline: configuration exports and digests before anything changes (Chapter 14); current test results (Chapter 11).
- Change: under a change record with rollback (Chapter 10).
- Verification: positive and negative tests, every requirement verified, failed or untested.
- Troubleshooting log throughout, with the four labels (Chapter 13).
- Handover: as-built record, work instructions, open items with owners (Chapter 16).
- Evidence package: everything above, sealed.
Do not skip baseline digests even when the change seems small; without them you cannot prove what changed. Keep the troubleshooting log open for the whole window, including interruptions and false starts. The evidence package is last, after handover documents exist to put in it.
18.3 Sealing evidence
A manifest lists each artefact with its SHA-256 digest (FIPS 180-4). The seal is the digest of the manifest itself. Record the seal outside the package — in the change record, an email to the supervisor, the assessment form — because anyone who can edit the package can also edit a manifest stored inside it. Later, re-computing the artefacts' digests shows whether anything has changed; re-computing the manifest's digest and comparing with the externally recorded seal shows whether the manifest has been altered.
What a seal proves: the artefacts are byte-for-byte what they were when sealed. What it does not prove: that they were true, complete or created when they claim. Those depend on how they were collected (Chapter 5) and on independent records (firewall logs on the collector, change tickets in their own system). For stronger guarantees, organizations use signatures with keys held by a separate party or trusted time-stamping; the principle is the same.
18.4 Worked example: the KW-04 conduit project (synthetic)
R. Kaur's project removed the broad corporate rule R4 on fw-01 (CHG-2215), verified the result, and investigated the KW-09 event on the way. The evidence package is sealed and then, a week later, re-verified.
Lab 18 (save as lab18.py, run with python3 lab18.py):
# Lab 18 - seal and re-verify a project evidence package (offline, standard library only)
# Synthetic artefacts from the supervised project; written only inside a temporary directory.
import hashlib, pathlib, tempfile
artefacts = {
"01-scope.md": "Scope: KW-04 conduit hardening; authorized by A. Mensah (Kestrel Water) 2026-10-05.\n",
"02-before-fw.txt": "R4 allow 10.30.0.0/16 10.20.0.0/24 tcp any\n",
"03-after-fw.txt": "R4 removed CHG-2215\n",
"04-tests.csv": "test,result\nT4,pass\nT5,pass\nT9,pass\n",
"05-troubleshooting-log.md": "07:05Z KW-09 missing; H4 consistent; RTU config preserved as E-17.\n",
}
with tempfile.TemporaryDirectory() as tmp:
d = pathlib.Path(tmp)
for n, t in artefacts.items(): (d / n).write_text(t)
lines = [f"{hashlib.sha256((d / n).read_bytes()).hexdigest()} {n}" for n in sorted(artefacts)]
(d / "MANIFEST.sha256").write_text("\n".join(lines) + "\n")
seal = hashlib.sha256((d / "MANIFEST.sha256").read_bytes()).hexdigest()
print("manifest:")
for l in lines: print(" ", l[:16] + "...", l.split(" ")[1])
print("seal (record this outside the package):", seal[:24])
(d / "04-tests.csv").write_text("test,result\nT4,pass\nT5,pass\nT9,pass\nT10,pass\n") # later edit
for l in (d / "MANIFEST.sha256").read_text().splitlines():
h, n = l.split(" ")
ok = hashlib.sha256((d / n).read_bytes()).hexdigest() == h
print(f"verify {n:<26} {'OK' if ok else 'MISMATCH'}")
Expected output (Python 3.13.5):
manifest:
72d8be01e70067c7... 01-scope.md
8d52d15a3e02b7f8... 02-before-fw.txt
2cd59665641b4779... 03-after-fw.txt
d6eccc2e2ac61ecb... 04-tests.csv
6d2525605f11521c... 05-troubleshooting-log.md
seal (record this outside the package): 062b9a1fd700dd0eac04b3a8
verify 01-scope.md OK
verify 02-before-fw.txt OK
verify 03-after-fw.txt OK
verify 04-tests.csv MISMATCH
verify 05-troubleshooting-log.md OK
Four artefacts verify; 04-tests.csv does not. Someone added a T10 line after sealing. It may be an honest later test — but it must be added as a new, separately dated artefact with its own entry, not by editing a sealed file. The assessor asks R. Kaur to restore the sealed version from the archive (its digest must match the manifest), and to submit T10 as 06-tests-addendum.csv in a new, re-sealed package version, with both seals recorded.
18.5 Assessment rubric for the project
| Criterion | 3 (meets the technical outcome) | 1 |
|---|---|---|
| Scope and authorization | Signed scope with owner, window and stops | Verbal approval |
| Technical correctness | Change achieves requirements; no collateral damage | Partial or harmful |
| Verification | All requirements verified or explicitly open, positive and negative tests with evidence | Pass counts only |
| Troubleshooting | Hypotheses, predictions, eliminations, preservation | Narrative |
| Documentation | Executable work instructions, as-built record, no secrets | Notes from memory |
| Evidence | Manifest, external seal, verification run | Folder of screenshots |
| Honesty about limits | Open items with owners; blind spots stated | "All done" |
18.6 Continuing practice
After the course, keep three habits: verify before you report, preserve before you change, and correct clocks before you order events. Keep labs contained, and never test real infrastructure without written authorization from its owner. Revisit standards and guidance when they change; every source in this book is dated October 2026.
Turn the course work into a portfolio: scoped plans, lab outputs with their Python versions, troubleshooting logs and the sealed package from this chapter, each seal recorded outside its package. When you move to a new Python version, re-run the labs and compare outputs; a difference is a finding to explain, not to hide. Seek supervised work where you can repeat the whole cycle — scope, baseline, change, verification, handover — on a real system with its owner's signature, and ask your supervisor to score it against the 18.5 rubric.
18.7 Common errors and limits
- Projects too broad to verify.
- Seals stored inside the package.
- Editing sealed artefacts instead of adding new ones.
- Reporting only successes.
- Lab 18 uses in-memory text and a temporary directory; real packages include binary exports and large captures, which hash the same way but need storage with access control.
Checks that catch these errors:
- Before day one, write each requirement as a test with an expected result; if a requirement cannot be tested inside the window, narrow the scope.
- Record the seal in at least one place the package's editors cannot change, such as the change record (CHG-2215) or an email to the supervisor.
- Before handover, re-run the manifest verification; resolve any MISMATCH by restoring the sealed file and adding a dated addendum (EX071), never by re-sealing over version 1.
- List failed and untested requirements in the handover with owners, as EX072 does.
Exercises — chapter 18
EX069 — Project scope. Objective: define a supervised project. Inputs: choose one project from 18.1. Steps: write the scope, requirements (testable) and the list of artefacts the evidence package will contain. Expected evidence: one-page plan. Rubric: 3 = all scope elements, at least four testable requirements with positive and negative tests, artefacts mapped to phases, supervisor and authorizer named; 2 = one gap; 1 = generic; 0 = none.
EX070 — Verify a seal. Objective: use the seal correctly. Inputs: Lab 18. Steps: modify the program to also re-compute the manifest's digest at the end and compare it with the recorded seal; then also edit MANIFEST.sha256 to match the tampered tests file and show what the seal comparison reports. Expected evidence: code and outputs for both cases. Rubric: 3 = first case: seal matches (manifest untouched) while one artefact mismatches; second case: all artefacts "OK" against the edited manifest, but the seal comparison fails — explains why the seal must be stored outside; 2 = one case; 1 = attempted; 0 = none.
EX071 — Handle the late addition. Objective: manage evidence changes. Inputs: the T10 edit. Steps: write the procedure the assessor described, step by step, including what is recorded where. Expected evidence: procedure. Rubric: 3 = restore sealed original from archive and check its digest; add addendum as new artefact with date and collector; produce a new manifest version and seal; record both seals externally with reason; never overwrite version 1; 2 = missing external record; 1 = "edit and reseal"; 0 = none.
EX072 — Self-assessment. Objective: apply the rubric honestly. Inputs: R. Kaur's project as described in this chapter and Chapters 10–13. Steps: score each rubric criterion with one sentence of evidence and list the open items. Expected evidence: scored table and open items. Rubric: 3 = scores justified from the text (for example verification limited by REQ-4 until R6 is removed; evidence criterion reduced by the post-seal edit until corrected), open items include R6, KW-04 router bypass across other stations, REQ-6 coverage, and the KW-09 incident outcome, each with owner; 2 = scores without evidence; 1 = all 3s; 0 = none.
Chapter synthesis
A supervised project shows technical competence as evidence: a signed scope, a baseline, a controlled change, verification of every requirement, a troubleshooting log, executable documentation and a sealed package. A seal proves that evidence has not changed since sealing, if it is recorded outside the package; it does not prove the evidence was true. State what is open, who owns it, and what you could not see.
Continue studying — chapter 18 of 18
← Chapter 17 · Course chapter index · Next course via chapter index →
This is the final chapter of this course; the index links the next course in the full study path.