Samples

What you receive from us, in the form you receive it.

Five documents, shortened and anonymised, in the exact formats our customers get. Customer names, hosts and amounts are changed; the events and the numbers are realistic for a seed-stage company.

Incident report INC-2026-031: nightly database backup silently failing

Customer A · Severity 2 (no customer-facing impact, recovery point degraded) · Opened 2026-09-14 06:12 UTC · Closed 2026-09-14 07:40 UTC · Owner: named engineer, reviewed by on-call lead

Summary

The nightly PostgreSQL dump that is pulled from the database host to off-site storage failed for three consecutive nights after an SSH key rotation. Nothing was lost. For three days the newest restorable backup was up to 72 hours old instead of 24. The alert that caught it was the backup-age check, not the job itself, which is the real finding.

Timeline (UTC)

09-11 02:30Change CR-2026-118 executed as planned: quarterly rotation of SSH keys on all customer hosts. Checklist completed, all services verified.
09-11 04:30Backup puller on the storage host runs on schedule, exits 255: Permission denied (publickey). The job has no failure alert of its own.
09-12 04:30Same failure.
09-13 04:30Same failure.
09-14 06:12Backup-age check fires: newest dump older than 72 h. Pages the on-call engineer.
09-14 06:20Acknowledged. Customer informed in the shared channel that backups are being investigated, no action needed from them.
09-14 06:35Root cause found: the puller's key was rotated out with the others, but the puller runs on the storage host, which was not in the rotation inventory, so its new public key was never installed on the database host.
09-14 06:50Change CR-2026-131 written (install the puller's new key, run the job once by hand, verify). Second engineer reviewed. Customer confirmed in writing at 06:58.
09-14 07:05Key installed. Manual run completes: 4.1 GB dump, checksum matches.
09-14 07:25Dump restored into a scratch database and row counts compared with production for the three largest tables. Match.
09-14 07:40This report sent to the customer. Incident closed.

Impact

No data loss and no downtime. Recovery point objective of 24 h was not met for three days (actual: up to 72 h). Had the database failed on 09-13, up to two days of writes would have been lost.

Root cause

A process gap, not a technical fault. The rotation checklist listed hosts, not credentials and their consumers. A credential whose consumer lives outside the customer's own hosts was invisible to it. The job's silence made a one-night problem a three-night problem.

What changes so it does not recur

  1. Every scheduled job now alerts on its first failure, not only when its output goes stale. Done 09-14, all customers.
  2. Backup-age threshold lowered from 72 h to 30 h. Done 09-14, all customers.
  3. Credential inventory rewritten per credential with its consumer host and the service that uses it, so rotation starts from consumers, not from hosts. Done 09-16.
  4. Rotation checklist (RB-021) now ends with a forced run of every backup and sync job that uses a rotated key. Done 09-16.

Runbook entry RB-044 added. Verified by on-call lead 2026-09-16.

Change request CR-2026-142: raise memory limit of the inference container

Customer C · Risk: low · Window: 2026-10-06 22:00–22:30 UTC · Requested by customer · Written by named engineer · Reviewed by second engineer · Status: closed, verified

Request, as received

Our inference API restarted about 70 times on Sunday and latency spiked each time. Can you look at it today? (customer CTO, shared channel, 10-06 09:14)

Findings

The container runs a 7B model server with an 8 GB memory limit. Sunday's traffic included long prompts; at a context of 8192 tokens resident memory reaches about 9.4 GB and the kernel kills the process. The service restarts automatically, which is why nobody noticed before Monday. 71 kills in the log between 10-05 03:10 and 10-05 21:48.

Plan

  1. Raise the container memory limit from 8 GB to 14 GB. The host has 52 GB free; no other service is affected.
  2. Set the model server's context size explicitly to 8192 so memory use is bounded and predictable, instead of growing with the longest request.
  3. Add an alert on container restarts: more than 2 in 10 minutes pages the on-call engineer.
  4. Restart the container once. Expected interruption: about 40 seconds while the model loads; the load balancer returns 503 for that window.

Rollback: set the limit back to 8 GB and restart. Nothing else is changed. Not in this change: moving the service to a second container for zero-downtime restarts; proposed separately as CR-2026-143.

Review

Checked the numbers against the kill log: anon-rss at kill was 9.3 to 9.9 GB, so 14 GB leaves headroom. Confirm after restart that the model loads on the GPU, not on the CPU fallback; last month's driver update changed the default on one host. Otherwise approved. (second engineer, 10-06 11:02)

Customer confirmation

Confirmed, go ahead in the 22:00 window. (customer CTO, 10-06 11:30)

Execution log (UTC)

22:00:12  limit 8G -> 14G applied to container inference-01
22:00:40  server config: ctx-size=8192 set, checked into customer's infra repo, commit 4e1f2a9
22:01:05  restart issued
22:01:47  health check green, model on GPU 0 (confirmed via device query), 14.9 GB VRAM in use
22:02:30  restart alert rule deployed, test-fired, page received
22:03:00  ten test requests at ctx 8192: p50 410 ms, p95 890 ms, no restarts
22:25:00  25 minutes of production traffic, zero restarts, resident memory steady at 9.6 GB

Verification and close

No restarts in the following 48 h (checked 10-08 22:00). Change closed. Customer informed with this log attached.

Monthly cost review: AWS bill for September 2026

Customer B · Bill reviewed: $11,840 (September) · Prepared 2026-10-03 · Recommendations ranked by saving per unit of risk

Where the money goes

Line itemSeptNote
EC2, 3 × g5.2xlarge on-demand, 24/7$5,230Inference and one training box. All three on-demand.
EBS gp3, 12 TB plus 4.8 TB of snapshots$1,0902.1 TB of volumes are unattached since July.
S3 storage and egress$1,420Egress is mostly model downloads to the EC2 boxes.
RDS db.r6g.xlarge, Multi-AZ$780Correctly sized. Multi-AZ is right for production.
NAT gateway, data processing$640Traffic to S3 and ECR goes through NAT.
CloudWatch logs$410Debug-level logging from the inference service, never read.
EKS control plane, second cluster$73Cluster "staging-old" has had no workloads since May.
Everything else$2,197Load balancers, Route 53, support plan, small services.

Recommended, in order

ChangeSaving / monthRisk
1. Put two of the three g5 instances on a one-year no-upfront compute savings plan. They have run 24/7 for five months and will for the next twelve.$1,650Low. Commitment is the only cost.
2. Delete the 2.1 TB of unattached volumes and snapshots older than 90 days after a written list is confirmed by you; move cold datasets to S3 Infrequent Access.$520Low with confirmation; we never delete storage without a written list approved.
3. Add VPC gateway endpoints for S3 and ECR so that traffic bypasses the NAT gateway.$480Low. One route-table change, reversible.
4. Drop the inference service's log level to info and set a 30-day retention on log groups.$310None.
5. Delete the empty "staging-old" cluster.$73None.
Total$3,03326% of the bill.

Not recommended

Moving RDS to a single availability zone would save $390 a month and is not worth the exposure for a production database. Spot instances for inference would save more than the savings plan but would cause interruptions your API cannot absorb today.

If the inference boxes moved to our servers

The two inference instances cost $3,490 a month on demand. The equivalent on our hardware, managed, is $3,400 a month for two dedicated GPUs with more memory each, and the NAT and egress lines shrink with them. The saving is small; the gain is the named engineer, which is why we recommend doing items 1 to 5 first and deciding on the move with real numbers in November.

Next step

Items 3, 4 and 5 need only your written confirmation and are done the same day. Items 1 and 2 need the attached lists signed off. All five are reversible except the deletions in item 2.

Onboarding checklist: first fourteen days

Applies to every new customer · Read-only until day 6 · Nothing is changed before the first restore test
DayWhat happensYou receive
1Kick-off in writing: your shared channel is opened, your named engineer introduces themselves, the access request is sent. Read-only access only.Access request listing exactly what is needed and why.
2–3Inventory: every host, service, database, queue, bucket, DNS record, certificate, scheduled job and credential, with its owner and purpose.The inventory document, which becomes the shared source of truth.
4Backup audit: what is backed up, where, how old the newest copy is, whether anyone has ever restored it.Backup report, with every gap marked.
5Monitoring audit and first alert rules: host, service and job alerts routed to our on-call.List of alerts and who is paged for each.
6First change request: the one fix from the audits that matters most, usually a missing backup or a silent job. Reviewed, confirmed by you in writing, executed in a window you choose.The change request, log and verification.
7First restore test: a backup restored into a scratch environment and checked against production.Restore report with timing: this is your real recovery time.
8–10Runbooks written for your stack: how to deploy, roll back, restart each service, rotate each credential, and what to do at 3 a.m. for the five most likely failures.Runbooks in your repository, reviewed by you.
11–12Access tightened: individual keys, bastion with session recording, write access tied to change tickets, old shared credentials rotated out.Access model document, access log available on request.
13Cost review of your current bill.Cost review in the format above.
14On-call handover: our rotation takes the pager. Fourteen-day summary.Summary of everything found, fixed and still open, with a plan for the open items.

Monthly summary: October 2026

Customer C · Managed infrastructure, in your cloud · Sent 2026-11-01 · Two pages, this is page one

In one paragraph

A quiet month after the inference fix. One incident, no customer-facing downtime. Five changes, all confirmed and verified. Cloud spend down 9% on September. The open item that matters is the single point of failure in the message queue, which we propose to remove in November.

Availability

ServiceAvailabilityNotes
Public API100.00%No customer-facing incidents.
Inference service99.97%One planned restart, 40 s, in CR-2026-142.
Background workers99.85%INC-2026-038, 65 min degraded, see below.

Incidents

INC-2026-038, 10-19, severity 3. Worker queue backed up for 65 minutes after the queue broker's disk filled with retained messages. Caught by the disk alert at 80%, not by a customer. Fixed by purging a dead-letter queue nobody consumed and setting a retention limit. Report sent 10-19. Runbook RB-051 added.

Changes

CR-142Inference container memory limit and restart alertverified
CR-143Second inference container behind the load balancer for zero-downtime restartsverified
CR-147VPC endpoints for S3 and ECR, NAT traffic reduced 70%verified
CR-149Log retention 30 days, inference log level infoverified
CR-151Queue broker retention limit and dead-letter consumerverified

Spend

ItemSeptOct
Cloud bill$11,840$10,760
Lumcells$1,200$1,200

Open items and November plan

  1. Queue broker is a single instance on one disk. Proposal CR-2026-155: two-node cluster, half a day, one planned failover test. Needs your written go-ahead.
  2. Savings plan for two instances (item 1 of the September cost review) still awaits your sign-off. $1,650 a month from the day it is signed.
  3. Quarterly restore test due 11-14; we will schedule it in the channel.

Every document above is written by the engineer who owns the account and checked by a second person before it is sent. If you want to see how your own stack would look in these formats, request a quote and say so.