Documentation That Survives the Team That Wrote It
Every engineering team that has ever been through an acquisition, a reorg, or a wave of attrition knows the same experience: you open the wiki, find a doc dated two years ago, and wonder if anything in it is still true. The answer is usually "some of it." Which means all of it is suspect.
Documentation rot is not a writing problem. Engineers who write documentation are not lazy — they write detailed, accurate documents at the moment of creation. The problem is structural. Documentation has no forcing function for updates. Code breaks tests when it goes stale. Documentation just quietly lies.
This post is about building documentation systems that degrade gracefully and surface decay before it causes incidents.
The Three Types of Documentation Engineers Write
Not all documentation rots at the same rate. Understanding the half-life of each type determines how you structure ownership and review cadence.
| Type | Half-Life | Decay Signal | Owner |
|---|---|---|---|
| Runbooks | Weeks to months | Incident where the steps were wrong | On-call rotation |
| Architecture Decision Records (ADRs) | Years | New ADR that supersedes the old one | Team lead or staff engineer |
| How-to guides / tutorials | Months | New engineer fails to follow it successfully | Author or their successor |
| API references | Days to weeks | Client code breaks against it | CI pipeline |
| README files | Months | New engineer cannot bootstrap | First person who tries |
The categories that kill teams are runbooks and how-to guides. ADRs rot slowly and gracefully. API references rot fast but are caught by automation. Runbooks rot silently and are discovered at the worst possible moment.
Living Documentation: What It Actually Means
"Living documentation" has become a buzzword that teams use to mean "we update it sometimes." Real living documentation has three properties:
- It is tested. Every runbook step that can be automated is automated and tested in a staging environment. Every code sample is in a repository where CI runs it.
- It has a named owner. Not a team. A person.
- It has a review trigger. Something in the system forces a review — a date, a deploy, an alert.
The trigger is the missing piece in most documentation systems. Teams set up great initial content but never define the event that causes it to be reviewed.
Ownership Models That Work
The Author-Owns model is the default and it fails at scale. When the author leaves, the document becomes ownerless. Documents with no owner are never updated.
The Team-Owns model sounds better but produces diffusion of responsibility. If everyone owns it, no one feels accountable when it goes stale.
The Role-Owns model is the most durable. The on-call role owns runbooks. The staff engineer owns ADRs for their domain. The newest engineer on the team owns the README and onboarding guide — because they are the most recent person who tested it.
Document ownership should be declared in the document itself and tracked in a structured manifest:
# docs/ownership.yaml
documents:
- path: runbooks/payment-service-restart.md
owner: on-call-payments # role, not person
review_cadence: quarterly
last_reviewed: "2025-09-15"
review_trigger: service_deploy
- path: adr/0023-switch-to-grpc.md
owner: ravinder
review_cadence: on_supersede
last_reviewed: "2025-06-01"
- path: guides/local-development-setup.md
owner: newest_team_member # role
review_cadence: monthly
last_reviewed: "2025-11-10"
review_trigger: onboarding_sessionA script that runs weekly and checks last_reviewed against review_cadence gives you an automated decay signal without any additional tooling.
Decay Metrics You Can Measure
Documentation decay is measurable. These are the metrics worth tracking:
Age since last verified. Not age since last edited. Someone may have edited a date without verifying content. The metric that matters is age since a human verified the steps work.
Failed onboarding events. When a new engineer cannot follow a doc to completion, that is a decay event. Track it explicitly. After every onboarding, ask the new engineer to file a doc bug for every step that required asking for help.
Incident-revealed gaps. When an incident postmortem identifies a runbook that was missing, wrong, or ambiguous, count that. A team with zero such incidents over twelve months either has very good documentation or is not tracking this.
Link rot percentage. Run a link checker against your docs weekly. A document with broken links is a document with decaying context.
# Simple link rot checker using markdown-link-check
find /docs -name "*.md" | xargs -I{} markdown-link-check {} --config .link-check-config.json 2>&1 \
| grep -E "ERROR|dead" | wc -l// .link-check-config.json
{
"ignorePatterns": [
{ "pattern": "^http://localhost" },
{ "pattern": "^http://127.0.0.1" }
],
"timeout": "20s",
"retryOn429": true
}ADRs: Architecture Decisions That Preserve Context
An Architecture Decision Record captures not just what was decided, but why — and what alternatives were considered. This is the knowledge that disappears when an engineer leaves.
The canonical template, adapted for readability:
# ADR-0024: Use Redis for Session Storage
**Status:** Accepted
**Date:** 2025-12-01
**Owner:** ravinder
**Supersedes:** ADR-0009 (in-memory session cache)
## Context
Our API gateway handles 12,000 RPS during peak. Session lookups add ~8ms
on a cold cache using our current PostgreSQL-backed session store. At this
scale, that adds unacceptable P99 tail latency.
## Decision
Store sessions in Redis Cluster with a 24-hour TTL. The gateway reads from
a local Redis replica; writes go to the primary.
## Alternatives Considered
- **Memcached:** Faster per-op but no persistence; a restart loses all sessions.
- **Cassandra:** Handles the scale but operationally complex for a team of 4.
- **JWT stateless tokens:** Eliminates session storage but prevents server-side
revocation — a security requirement we cannot waive.
## Consequences
- Session data survives a single Redis node failure (cluster mode).
- Adds Redis as a required dependency; failure means auth failure.
- Operations team must maintain Redis Cluster; see runbook/redis-cluster.md.
## Review Trigger
Review this decision if peak RPS exceeds 50,000 or if Redis operational
cost exceeds 20% of infrastructure budget.The Review Trigger section is what distinguishes a useful ADR from historical documentation. It tells you when to revisit the decision without requiring anyone to remember it.
Runbooks That Work During Incidents
A runbook is read under stress, at odd hours, by someone who may not be the subject matter expert. Every word is paid for in cognitive load. The structure must be ruthlessly predictable.
## Runbook: Payment Service High Error Rate
**When to use this:** Error rate > 5% for > 3 minutes (alert: payments-error-rate-high)
**Owner:** on-call-payments
**Last verified:** 2025-11-20 by @ravinder
**Escalation:** If steps below do not resolve in 20 minutes, page payments-lead
---
### Step 1: Confirm the error signature
```bash
kubectl logs deployment/payment-service --since=5m \
| jq 'select(.level == "error") | {time, code, upstream}' | tail -20Expected: Errors clustering on a specific upstream (e.g., stripe, postgres).
If no pattern: Go to Step 4 (generic escalation).
Step 2: Check upstream health
kubectl get endpoints payment-service -n production
curl -s https://status.stripe.com/api/v2/status.json | jq '.status.indicator'...
Notice: **Last verified** is a field with a date and a name. No anonymous "last updated" timestamps. The person who verified it is accountable by name.
## Documentation Reviews as a Team Practice
The review trigger makes individual documents self-sustaining. But teams also need a periodic sweep of the entire documentation estate.
**Quarterly doc review:** Schedule two hours per quarter. Pull the `ownership.yaml` report, surface all documents overdue for review, and assign them. This is not a writing session — it is a triage session. Each document gets one of: verified, updated, archived, or deleted.
```mermaid
graph LR
A[Quarterly Doc Review] --> B{Overdue?}
B -->|Yes - steps still valid| C[Update last_reviewed date]
B -->|Yes - steps outdated| D[Update content + date]
B -->|Yes - no longer relevant| E[Archive or delete]
B -->|No| F[Skip]
C --> G[Review complete]
D --> G
E --> G
F --> GNew engineer onboarding as a doc audit. Every new engineer is a free documentation review. Have them execute every onboarding doc step literally, file a bug for anything unclear or broken, and debrief after their first week. This catches decay that insiders no longer notice because they know the workarounds.
Postmortem doc audit. Every postmortem should include a section: "Were there runbooks or docs that should have helped with this incident but did not? Why not?" The answer is a documentation work item.
The Minimum Viable Documentation System
If you are starting from scratch or trying to fix a documentation disaster, this is the minimum viable system:
- One
ownership.yamlfile in the docs root with every document, its owner, its review cadence, and its last-verified date. - A weekly CI job that reports documents overdue for review.
- Every runbook has a "Last verified" field with a date and a name.
- Every ADR has a "Review Trigger" section.
- The newest engineer owns the onboarding guide.
That is five practices. They require no new tooling. They prevent the worst failure modes.
Key Takeaways
- Documentation rots not because engineers are lazy, but because there is no forcing function for updates — add review triggers and ownership to every document.
- Assign documentation ownership to roles, not individuals; role-based ownership survives attrition, individual ownership does not.
- Measure decay with concrete metrics: age since last verified, failed onboarding events, incident-revealed gaps, and link rot percentage.
- ADRs should capture the alternatives considered and include an explicit review trigger condition, not just a timestamp.
- Runbooks must include a "Last verified" field with a name and date; anonymous update timestamps are insufficient accountability.
- Use new engineer onboarding sessions as free documentation audits — they will expose decay that insiders no longer notice.