Roles
One person leads (the first operator on the scene until handed over) and keeps a written timeline in UTC: what was seen, what was done, by whom. Nothing is deleted or rebuilt before its evidence is saved (step 3), unless the damage is ongoing.Steps
-
Open a private record. A GitHub security advisory draft on the repository
(
<input I1>, Security, Advisories, New draft) holds the timeline and stays private. Do not discuss details in public issues. -
Decide what is affected, using the threat model’s sections as the checklist:
-
Save evidence before changing anything on an affected node:
Copy the files to the controller with
scp. Docker keeps container logs with thelocaldriver, which rotates; save them early. For the database, the audit log is append-only for the application roles: -
Contain, with the narrowest action that stops the harm. Ingestion keeps running in every
case below unless stated, because the edge does not need the core tier.
End every console session at once (every user signs in again), on the database leader:End every Umami session at once: rotate
umami_user_password_key(secret-rotation.md); a changed password invalidates Umami’s tokens. - Eradicate and recover. Fix the cause (patch per security-patch.md), rebuild compromised servers from OpenTofu and Ansible, restore data if it was changed (point-in-time-restore.md), and bring services back.
- Notify. The platform processes visitor data for its tenants under the DPA template (../compliance/dpa-template.md): it notifies affected tenants without undue delay after becoming aware of a personal data breach affecting their data, with what the tenant needs for its own obligations. Tell SCF. The wording of these statements is pending legal review (input I10).
- Close. Publish the advisory once fixed, with credit to a reporter who wants it (../security/SECURITY.md). Write the timeline, the cause and what changes into the advisory, and update the threat model if a threat was missing.
Exercised
Not yet exercised as a whole. No tabletop or live incident has been run. Parts were rehearsed elsewhere: the patch path on 2026-11-13 (security-patch.md section 7), the tracker revocation on a local gateway on 2026-11-13 (tracker-release.md), operator key revocation throughTestMachineAPI on 2026-11-13
(operator-key-revocation.md), and a rotation of the platform role
passwords on 2026-11-13 (secret-rotation.md). In phase 19 the remaining
steps could not be executed meaningfully on the development stack: evidence collection and
containment act on deployed nodes, which do not exist yet. A tabletop exercise on staging is the
next step.