Chapter 27 — Deployment and validation
Lesson map
Lesson 27 published. Map, example, EX079.
flowchart TD
N0["Learning outcomes"]
N1["27.1 Validation is a test of the fix"]
N2["Lab I — retest status"]
N3["27.2 Three statuses"]
N4["27.3 Same custody"]
N5["27.4 Risk acceptance"]
N6["27.5 Partial fixes"]
N7["Synthesis"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Worked example"]
EX --> Q["Exercise EX079"]
Logical drawing
flowchart LR
N0["Learning outcomes"]
N1["27.1 Validation is a test of the fix"]
N2["Lab I — retest status"]
N3["27.2 Three statuses"]
N4["27.3 Same custody"]
N5["27.4 Risk acceptance"]
N6["27.5 Partial fixes"]
N7["Synthesis"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX079"]
[Learning outcomes]
|
v
[27.1 Validation is a test of the fix]
|
v
[Lab I — retest status]
|
v
[27.2 Three statuses]
|
v
[27.3 Same custody]
|
v
[27.4 Risk acceptance]
|
v
[27.5 Partial fixes]
|
v
[Synthesis]
|
v
[Worked example] --> [Exercise EX079]
Learning outcomes
You will (1) decide VALIDATED, REOPENED or NOT RETESTED from retest observations; (2) refuse to mark a finding closed on a verbal "we fixed it"; (3) record validation evidence under the same custody rules; (4) feed failures back into the risk tracker.
27.1 Validation is a test of the fix
Remediation validation asks whether the agreed fix removed the problem under the same scope and method constraints. It is not a brand-new engagement, and it is not a rubber stamp.
For ENG-712 the retest uses the same scope list and method cards as the original engagement. Using the visit to probe the excluded fare-payment hosts would be a safety failure, however convenient it might seem. The lab's three status labels keep the language honest by making testers say exactly what was checked and what was not.
Lab I — retest status
"""Lab I (ch 27): decide remediation-validation status from synthetic retest observations."""
retests = [
("F-01", "shared admin account", True, True),
("F-07", "ex-contractor VPN accounts", True, False),
("F-09", "plaintext password on wiki", False, None),
]
for fid, title, fix_claimed, check_passed in retests:
if not fix_claimed:
status = "NOT RETESTED - no fix declared"
elif check_passed:
status = "VALIDATED"
else:
status = "REOPENED"
print(f"{fid} {status:30} {title}")
Run with python3 lab_retest.py. Verified output:
F-01 VALIDATED shared admin account
F-07 REOPENED ex-contractor VPN accounts
F-09 NOT RETESTED - no fix declared plaintext password on wiki
27.2 Three statuses
VALIDATED: fix claimed and the check passed. REOPENED: fix claimed but the check failed. NOT RETESTED: no fix declared, so no check yet. Closing a ticket without one of the first two (or an explicit risk acceptance) is a process defect.
The lab output gives one example of each: F-01 VALIDATED, F-07 REOPENED and F-09 NOT RETESTED. Words such as resolved or mostly fixed are rewritten into one of the three labels before the report goes to the CISO. An explicit risk acceptance is the only other way a ticket can close, and it is recorded separately.
27.3 Same custody
Retest evidence — a new configuration export, a new log excerpt — gets hashed and filed like the original. "Looks fine on my screen" is not evidence.
For F-01 the new evidence is filed as E-101 with its own digest, next to the original discovery evidence in the same vault layout. A peer who opens the finding can then compare the before and after files directly. An agreement on a screen share that the setting looks fine leaves nothing that can be verified later.
27.4 Risk acceptance
Sometimes an owner accepts a residual risk with a named approver and a review date. That is a legitimate close path; silence is not.
An acceptance in the tracker needs two fields to be valid: the name of the person accepting the risk and a review date. Priya's team turns each review date into a calendar reminder two weeks before it falls due. An acceptance with either field empty is reopened, because nobody can be held to a decision that has no owner.
27.5 Partial fixes
Sometimes an owner fixes two of three accounts and asks to close the ticket. Priya's rule is to validate what was claimed, reopen or split the finding for what remains, and never let a partial fix erase the whole issue. The tracker should show residual work, not a green checkbox that hides it.
The worked example shows why: F-07 reopened because ex-contractor accounts could still authenticate after a claimed fix, so closing it on the owner's word would have hidden live access. A child ticket split off for any remaining account keeps the parent finding identifier so an examiner can follow the history.
Worked example
Three findings enter retest. F-01 validates. F-07 reopens because ex-contractor accounts still authenticate. F-09 was never declared fixed. Priya updates the tracker: F-01 closed with evidence E-101; F-07 severity remains high and due date resets; F-09 stays open awaiting a fix claim.
Synthetic case. The three retest outcomes are invented.
Errors and limits
Retesting only the happy path and ignoring alternate entry points can falsely validate. Stay inside the original scope unless a new agreement says otherwise.
Exercises
- EX079 — Lab statuses. Quote the three statuses the lab prints. Rubric: 3 = VALIDATED, REOPENED, NOT RETESTED - no fix declared; 2 = two; 1 = one; 0 = none.
- EX080 — Verbal close. An owner says F-07 is fixed but refuses a retest window. What status and next step? Rubric: 3 = remains open / not validated; escalate; no close without check or formal acceptance; 2 = keep open; 1 = close on verbal; 0 = none.
- EX081 — Acceptance fields. Name three fields a risk-acceptance record needs. Rubric: 3 = three of approver/reason/review date/residual risk statement/scope; 2 = two; 1 = one; 0 = none.
Synthesis
No fix claim, no retest; no evidence, no close; acceptance is explicit or it did not happen.
Continue studying — chapter 27 of 30
← Chapter 26 (draft) · Course chapter index · Chapter 28 (draft) →