Generated from the same controlled README shipped in the offline package. Source SHA-256: 1fc3c41f82163ae86eaf61a193a1fad2246e72135298f0f857cd0fcc1ee9c187.
Linked course weeks: W14–W15
Expected effort for the full assignment: 6 hours
Core path: inert synthetic cases, offline, deterministic, Python standard library only
Research question
What can fail, who can be harmed, and what blocks release?
Learning objectives
You will learn to:
- identify assets, actors, components, and trust boundaries before listing attacks;
- connect prevention, detection, response, stop, and rollback controls to testable abuse cases;
- preserve control escapes and residual risk rather than converting them into assurances;
- make a release decision from a predeclared high-risk blocking rule;
- distinguish law, mandatory national standard, international standard, voluntary framework, and internal policy; and
- write a governance memo that records applicability uncertainty and refresh dates.
data/system_model.json: synthetic system scope, authorization, assets, actors, components, and trust boundaries.
data/abuse_cases.csv: six inert scenario classes following ../shared/schemas/risk-case.schema.json. No executable prompt, exploit, credential, payload, or target endpoint is included.
data/controls.csv: one accountable control per case with prevention, detection, response, stop, rollback, owner, and test threshold.
data/test_results.csv: one frozen result per case: blocked, detected, or escaped, with residual severity and likelihood.
data/governance_crosswalk.csv: source identity, status label, jurisdiction, as-of date, applicability note, and claim ceiling.
../shared/fixtures/governance_risk_vocabulary.json: frozen severity/likelihood scores, outcomes, force labels, and release-decision vocabulary.
The crosswalk is an as-of teaching record, not legal advice, certification, or a declaration that a source applies to a project. Status refresh and qualified applicability review remain release gates.
Run
python3 scripts/review_risk.py \
--system data/system_model.json \
--cases data/abuse_cases.csv \
--controls data/controls.csv \
--results data/test_results.csv \
--governance data/governance_crosswalk.csv \
--vocabulary ../shared/fixtures/governance_risk_vocabulary.json \
--output /tmp/geo-l07
The bundled fixture intentionally includes an escaped accessibility/attribution case with high residual risk. Correct behavior is a successful audit whose release decision is BLOCKED.
Output contract
Table from the controlled L07 lab handout| Artifact | Contract |
|---|
threat_model.json | normalized scope, assets, actors, components, and trust boundaries |
abuse_case_results.csv | initial and residual risk, control outcome, evidence, and release-block flag |
control_coverage.csv | prevention/detection/response/rollback completeness by control |
governance_status_audit.csv | status labels and applicability boundaries without force collapse |
release_decision.json | BLOCKED, CONDITIONAL, or ELIGIBLE_FOR_HUMAN_REVIEW; never a safety guarantee |
governance_memo.md | generated review summary and explicit legal/standards caveat |
incident_rollback_playbook.md | stop, response, owner, and rollback sequence |
run_manifest.json | hashes and release-block threshold |
Full assignment procedure
- Freeze the system/data-flow diagram, assets, actors, affected parties, and trust boundaries.
- Select at least five synthetic abuse cases spanning evidence integrity, instruction/content separation, privacy, accessibility, status labeling, and dependency/duplicate risk.
- Never test a live target; replace sensitive mechanics with inert scenario classes.
- Map each case to prevention, detection, response, owner, stop, and rollback evidence.
- Execute authorized local tests and retain failures/escapes.
- Score residual severity and likelihood after—not before—observing control evidence.
- Audit each governance source's legal/standards status, applicability, as-of date, and claim ceiling.
- Block release on an escaped high/critical case, unresolved authorization, or inaccurate status label.
Low-compute and no-network route
All cases and results are frozen CSV/JSON. The reviewer performs schema, join, risk-score, status-vocabulary, and release-gate checks without executing any adversarial input, using a model, opening a browser, or contacting a target.
Negative results and interpretation
BLOCKED is a valid and expected result when a high-risk control escapes.
- Detection after exposure is not equivalent to prevention.
- A passed synthetic case does not cover unknown attacks, different configurations, or future drift.
- Residual risk is not zero risk; a control list is not implementation evidence.
- Voluntary guidance is not law, an international standard is not automatic certification, and a mandatory standard still requires scope/applicability analysis.
Safety and stop conditions
No live poisoning, evasion, credential use, harmful-payload release, unauthorized scanning, or third-party testing is permitted. Stop on target ambiguity, personal data, unreviewed harmful detail, unsafe output persistence, status uncertainty, accessibility harm, or failed rollback.
Acceptance
python3 scripts/review_risk.py --system data/system_model.json --cases data/abuse_cases.csv --controls data/controls.csv --results data/test_results.csv --governance data/governance_crosswalk.csv --vocabulary ../shared/fixtures/governance_risk_vocabulary.json --output /tmp/geo-l07
python3 -c 'import json; d=json.load(open("/tmp/geo-l07/release_decision.json")); assert d["audit_status"] == "PASS" and d["release_decision"] == "BLOCKED"'
See RUBRIC.md.