Skip to content

Incident Response Plan

Organization: Strategic Habits Consulting, LLC (DBA Gevell) Plan owner: Larry Anglin, CTO Review cycle: Annually, with a tabletop exercise (Β§11), and after every SEV1/SEV2 incident Related: Business Continuity Plan, Disaster Recovery Plan (same folder)

1. Purpose and scope

This plan sets out how Gevell detects, handles, communicates and learns from security incidents and major service incidents. It covers:

  • Customer data: documents, account data, metadata.
  • Production systems: Cloudflare, AWS, Supabase, the EC2 processing instances, GitHub, Stripe, Resend.
  • The AI features, which run on Anthropic Claude through AWS Bedrock.

Security incident: any event that threatens, or actually harms, the confidentiality, integrity or availability of customer data or production systems. Data breach: a confirmed unauthorized acquisition of, or access to, customer data.

2. Roles

Gevell has two people. One person may hold several roles.

RoleWhoResponsibilities
Incident Commander (IC) / Technical LeadLarry Anglin (CTO). The only person with production accessDeclares incidents and sets severity. Carries out containment, eradication and recovery. Preserves evidence. Decides whether an event is a breach
Communications LeadLaura Hopkins (Chief Accessibility Officer). No production accessDrafts and sends customer notifications (content approved by the IC). Is the single point of contact for affected institutions. Keeps the communications log
ScribeLaura, when available; otherwise the ICKeeps the incident timeline (who, what, when)
Backup Technical ResponderDesignated. Known to Larry and Laura; not named in this documentActs as IC through the break-glass procedure (BCP Β§5) if Larry is unavailable
External supportProvider support teams; outside counsel as neededNo IR retainer is in place. Forensic help would be engaged ad hoc

3. Severity levels

LevelDefinitionExamplesResponse targetCustomer comms
SEV1: CriticalConfirmed or strongly suspected compromise of customer data, or a full outage of core serviceUnauthorized access to R2 documents or the database. Leaked Supabase service-role key. Ransomware on a processing instance. Cross-tenant data exposure. All conversions downStart within 1 h, 24/7. Continuous work until containedYes. See Β§6
SEV2: HighCredible threat to customer data with no confirmed access, or a major partial outageLeaked lower-privilege credential. Exploitable vulnerability in production. Malware detected on upload and blocked, but with a pattern of attempts. Major feature (e.g., sign-in) down for more than 1 h. AI provider sending data outside the zero-data-retention pathStart within 4 hStatus page for outages. Direct notice if customer data may be involved
SEV3: MediumLimited impact. Contained, or no customer data at riskSingle-customer job failures from a bug. Denial-of-service or abuse attempt blocked by controls. Spend-guardrail trip. Non-critical dependency outageNext business dayAffected customer only, if needed
SEV4: LowMinor. InformationalPhishing email received and not acted on. Low-severity dependency advisory. Failed login noiseWithin 5 business daysNone

Severity can be raised or lowered as facts emerge. When unsure, pick the higher level.

4. Detection sources (in place)

  • Health-monitor daemons that probe the production APIs every 60 s and alert by email and Telegram after 3 failures.
  • Application alert rules (error rate, fatal errors, missing heartbeat), with logs in Amazon CloudWatch Logs, and status.gevell.com, which checks every production endpoint each minute.
  • AWS GuardDuty threat detection and AWS CloudTrail on the AWS account, with alerts to the CTO.
  • AWS CloudWatch alarms: dead-letter-queue messages, queue backlog, API 5xx spikes.
  • Bedrock spend guardrail and budget alerts. The AI kill switch trips automatically at the caps.
  • Malware scanning of uploads (AWS GuardDuty for S3).
  • Backup-status staleness alerts. Nightly security audit email (npm audit, .env files in git).
  • Dependabot, CI dependency audit, Supabase security advisors.
  • External reports to security@gevell.com, customer support, and provider abuse notices.

5. Response phases

For every incident at SEV2 or above, open an incident record: a private GitHub issue labeled incident, or a dated file in a restricted location if GitHub itself is affected. The timeline is kept there.

PhaseKey actionsOutput
1. DetectReceive the alert or report. Acknowledge it. Write down the time first seenTimestamped entry
2. TriageIs it real? What systems and data are involved? Which customers? Assign severity. Is customer data possibly affected? If yes, start the evidence clock (Β§8)Severity, initial scope
3. ContainStop the harm without destroying evidence. Options: revoke or rotate the credential; block the IP or account; disable the feature; trip the AI kill switch (Β§9); revoke the Cloudflare Tunnel token and isolate the processing instance (security-group swap, ASG standby); scale the queue consumers to 0; put a frontend into maintenanceHarm stopped. Actions logged
4. EradicateRemove the cause: patch the vulnerability, remove malware or rebuild the host from clean sources (DR Β§5.6), rotate all possibly exposed secrets (the secrets inventory and rotation runbook), close the misconfigurationRoot cause removed
5. RecoverRestore service and data (DR plan). Monitor closely for recurrence (at least 72 h of heightened watch for SEV1). Confirm integrity before re-enabling any disabled featuresService restored, verified
6. NotifyAssess breach status. Notify customers per Β§6 and keep a log of all notices. Update the status page for outagesNotifications sent and logged
7. Post-incident reviewHold a blameless review within 10 business days for SEV1/SEV2 (Β§10). Record actions as GitHub issues with owners and datesReview document, action items

6. Customer notification

6.1 Timelines

  • Confirmed breach of customer data: we notify affected customers within 72 hours of confirming the breach.
  • Contracts take precedence. If a customer agreement (including a data security or FERPA addendum) sets a shorter window or different trigger, such as notice of a suspected incident, that term governs for that customer. The IC checks for any such terms at triage for every affected institution.
  • Early notice. When we have reasonable belief that an institution’s data is involved but have not confirmed it, we aim to send an initial heads-up within 24 hours. This lets the institution meet its own reporting duties. Many Texas public institutions have short internal and state reporting timelines.
  • Role split. The customer institution controls its data (the FERPA β€œschool official” model). We notify the institution. Unless the contract says otherwise, the institution decides on notice to individuals and regulators, and we support it with the facts it needs.

6.2 Contents of a notification

  1. What happened, in plain language, and when (discovered, and the estimated window of exposure).
  2. What data was involved (types of data and documents, and how many records, if known) and which accounts or tenants.
  3. What we have done to contain it and prevent recurrence.
  4. What the customer should do, if anything (for example, rotate API keys, review users).
  5. Whether law enforcement was notified or has asked for a delay.
  6. The contact person (Laura for coordination, Larry for technical detail), and security@gevell.com.
  7. When the next update will come. Updates follow as material facts change, and a final summary is sent after the post-incident review.

Notices go by direct email to the customer’s named security or business contacts. They do not go only through the product’s email system.

7. Communications discipline

  • Only the IC and the Communications Lead speak about an incident outside the company.
  • Do not speculate. State what is confirmed and what is still under investigation.
  • Do not put customer data or secrets in chat, Telegram, status posts or tickets.

8. Evidence preservation

Collect evidence before rebuilding or deleting anything, where safe to do so.

SourceHow to preserveNormal retention (why it matters)
Processing instances (EC2)EBS snapshot before termination, plus docker ps, container logs, /var/log, and running processes and network connections via SSM Session ManagerInstance storage is lost on termination
Application logs (Amazon CloudWatch Logs, processing host and API)Export the incident time rangePer log-group retention
AWS CloudTrail, CloudWatch Logs (Lambda)Export or copy to a dedicated evidence bucketPer configuration (verify, see Actions)
Cloudflare audit log, access and WAF eventsExportPlan-dependent
Supabase logs (auth, API, Postgres)Export from the dashboardPlan-dependent, short
GitHub audit logExportPer GitHub plan
Application audit tables (admin_audit_log, cost_ledger, job tables)SQL exportDurable
Stripe eventsExportStripe-retained
  • Store evidence in a restricted, access-logged location separate from the affected system.
  • Record a SHA-256 hash of each file, and who collected it and when (chain-of-custody note in the incident record).
  • Keep incident evidence for at least 1 year, or longer if litigation or a contract requires it.

9. AI incident handling

AI incidents include:

  • Runaway cost or looping.
  • Prompt-injection effects.
  • Customer data sent to a model path outside zero-data retention.
  • Harmful or clearly wrong output at scale (for example, systematically wrong alt text).
  • A provider-side incident at AWS Bedrock or Anthropic.
  1. Kill switch (in place). Disable Bedrock-backed PDF conversions immediately. Use the admin dashboard (AI Controls β†’ Disable AI, with a reason) or, if the API is down, a direct Supabase SQL update. See the AI kill-switch runbook. Queued jobs are held (paused_budget), not lost. Each action is written to admin_audit_log. The guardrail also trips automatically at spend caps.
  2. For AI paths the kill switch does not cover, disable the specific feature through its flag or route, or revoke the model credentials.
  3. Triage as for any incident. If customer data went to a non-approved AI path, treat it as a potential breach (Β§6).
  4. Re-enable only after completing the checklist in the kill-switch runbook (root cause fixed, spend reviewed, abuse blocked).

10. Post-incident review

Required for SEV1 and SEV2, and optional for SEV3. The review is blameless and held within 10 business days.

Post-incident review template

Incident ID / title:
Severity (initial β†’ final):
Date/time detected: Date/time contained: Date/time resolved:
IC: Comms lead: Scribe:
Summary (3–5 sentences):
Customer impact (customers, data types, records, duration):
Timeline (UTC):
- hh:mm event / action / who
Root cause:
Contributing factors:
Detection β€” how was it found? How could it be found sooner?
What went well:
What went poorly:
Notifications sent (to whom, when, channel):
Breach determination (Y/N, rationale):
Evidence collected (location, hashes):
Action items:
| # | Action | Owner | Due | GitHub issue |
Plan changes needed (IR/DR/BCP):

11. Annual tabletop exercise

Frequency: Once every 12 months. It may be held together with the BCP tabletop. Participants: Larry, Laura and the backup technical responder. Duration: 1–2 hours.

Status: no IR tabletop has been performed and recorded yet.

  1. Pick a scenario (rotate each year):
    • A leaked Supabase service-role key found in a public paste.
    • Ransomware on a processing instance.
    • An institution reports that it can see another institution’s document.
    • AI output routed to a non-zero-retention provider.
    • A suspicious Cloudflare login while Larry is travelling.
  2. Walk through phases 1–7 against the clock. Draft the actual customer notice using Β§6.2.
  3. Confirm that the contacts in Β§12 are current and that the kill switch and evidence export steps still work (dry run where safe).
  4. Record the results. Turn every gap into an action with an owner and date.

Tabletop log (template)

DateScenarioParticipantsTime to contain (simulated)Notice drafted within 72 h (Y/N)Gaps foundActions (owner, due)Plan updated (Y/N)
YYYY-MM-DD

12. Contact list

ContactDetails
Security reports (external)security@gevell.com
Incident CommanderLarry Anglin, larry@gevell.com
Communications LeadLaura Hopkins, laura@gevell.com
Backup Technical ResponderDesignated. Known to Larry and Laura; not named in this document
Legal counselIn the offline contact list
AWSAWS Support Center (console β†’ Support). Abuse reports: abuse@amazonaws.com
CloudflareDashboard β†’ Support
SupabaseDashboard β†’ Support / support@supabase.com
StripeDashboard β†’ Support
Resendsupport@resend.com
GitHubsupport.github.com
Backblazehelp.backblaze.com
Law enforcement (if required)FBI IC3 (ic3.gov), or the local FBI field office (fbi.gov/contact-us/field-offices)

Phone numbers, provider account identifiers and legal counsel details are kept in an offline contact list held by Larry and Laura, not in this document.

Keep a printed or offline copy of this list. It must be usable when email or GitHub is unavailable.

Actions required before this plan is true

#ActionOwner
IR-1Formally adopt this plan (sign and date) and brief Laura on her roleLarry
IR-2Keep the offline contact list current: phone numbers, provider account identifiers, legal counsel and the backup technical responder. Both Larry and Laura hold a copyLarry + Laura
IR-3Confirm security@gevell.com exists, is monitored, and is routed to both Larry and LauraLarry
IR-4Brief the backup technical responder (designated 2026-09-23) on this plan and their roleLarry
IR-5Create the incident issue label and a private location for incident records and evidence (access-logged storage)Larry
IR-6Verify that audit-log sources are enabled and retained long enough for investigation: AWS CloudTrail (90 days minimum), Lambda log-group retention, Cloudflare audit logs, Supabase log retention on the current planLarry
IR-7Review customer contracts and addenda for notification windows shorter than 72 hours. Keep a per-customer list the IC can check at triageLaura
IR-8Run and record the first annual tabletop exercise (Β§11)Larry + Laura
IR-9List which AI features the kill switch does not cover, and document how to disable each oneLarry
IR-10Identify a forensic or IR firm that could be engaged on short notice (no retainer), and record the contact in Β§12Larry