Ant Colony · Research Report

Institutions Never Die: 64–78% of Documents at Three Top Open-Source Organizations Are Orphans

Data date 2026-09-12 · Metric: link graph (inbound links) · ~8 min read

🌐 Language: English 中文
An antique card catalog cabinet in a quiet archive room with only one drawer pulled open, a stack of old folders on the floor — most files are never opened again, which is what "institutions never die" looks like

Kubernetes, CNCF and GitLab — three of the best-governed organizations on the planet — have policy/documentation repositories where 64–78% of all documents are orphans (no other document links to them). In Kubernetes' 652 enhancement proposals, only 3% are explicitly marked as withdrawn/replaced/superseded. The other 97% remain permanently parked in "in use / in review", with a median of 6.5 years since last update.

The root cause of organizational dysfunction isn't that there are too many policies. It's that policies never die.

68%
CNCF TOC orphan rate
598 documents
64%
Kubernetes community
964 documents
78%
GitLab Handbook
4,717 documents
3%
of Kubernetes' 652 KEPs
explicitly marked dead

1. The symptom everyone recognizes, nobody measures

Industry commentary keeps producing a version of the same quote: companies spend hundreds of thousands of dollars building a knowledge base and end up with a pile of pages nobody wants to open.

(That one is a secondary, industry-metric statement, not our data. Every first-hand number in this article is in sections 3 and 8 — and all of them are reproducible.)

It's predictable. Writing a policy has an owner and a reward (it looks like management). Deleting a policy has risk (What if we need it later? Who signs off?). So policies only accumulate — until nobody reads them.

The cost shows up elsewhere. The primary source here is McKinsey Global Institute's The Social Economy (2012): knowledge workers spent roughly 19% of the workweek (≈7.6 hours) searching for and gathering information, and another 28% on email. The search time isn't the worst part — the fact that what they find may already be obsolete is. And in 2026 there's a new reader: AI agents will scale stale assumptions faster and further than any human could.

A small demonstration of metric discipline: this fact circulates online as "employees spend 1.8 hours every day searching for information." That version came from several rounds of retelling — it back-converts to 9.3 hours/week, which doesn't match the report's 19%. We cite the primary source: 19% per week. That drift is itself a miniature version of the problem this article is about.

Everyone can say "nobody reads these docs." Almost nobody can put a number on it. Without a number you can't prioritize, you can't verify a fix, and you can't argue with "I'm sure the docs are still useful."

So we built the number.

2. Method: turn "unused" into a ratio using the link graph

Object — every Markdown document in a repository (code and images excluded).

Referenced — at least one other document links to it (relative path, repo-absolute path, wikilink, or static-site reference).

Orphanzero inbound links.

Orphan rate — orphan documents ÷ all documents.

Three discipline rules we had to write down the hard way:

1. "Orphan" ≠ "useless." It means exactly one thing: no other document uses it as an entry point. A page that is hit daily by a search engine but never linked from another doc is still an orphan here. The metric understates value; that's deliberate — it's a conservative proxy.

2. Never mix metrics. The same directory yields opposite conclusions depending on the metric. From our own docs/: under a runtime read metric (117 files) only 13% were never opened — looks healthy; under a link graph metric (the 65 markdown files in it) 98% are orphans — looks rotten. Both numbers are correct: they answer different questions ("did anyone open it?" vs "does any document point to it?") — and they cover different subsets. Averaging different metrics manufactures false certainty.

3. The metric must match the corpus shape. This is where we made our worst mistakes:

Corpus shapeLink graphRuntime readsNote
Link-based (Confluence / Notion / hand-written links)✅ recommendedneeds access logslowest bar; this article's metric
Site-generated (Hugo / Docusaurus)invalidnavigation and index pages are machine-generated, so inter-doc links are meaningless — it's how we voided an 8,215-document sample
Auto-injected (AGENTS.md / CLAUDE.md / MEMORY.md)must be excluded, otherwise "100% referenced" is an artifact
Code-based (verifiable anchors)use anchor-existence instead: "does the reference still point at something real?"

Three metric incidents worth naming, because they shaped the table above:

That became a hard rule: if the corpus shape doesn't match the metric, the sample is void and does not count. A reproducible wrong metric is far more dangerous than a correct intuition, because it survives review.

An antique brass balance scale on a dark oak desk, a stack of folders weighing down one pan and a single thin folder on the other — dead weight sits on the large files
Dead weight = orphan bytes ÷ total corpus bytes. Orphans skew large (review reports, assessments, meeting-note archives), so removing them frees far more space than the raw count suggests.

3. Evidence: same metric, three organizations, all above 50%

All sampled from public repositories, 598 to 4,717 documents, one identical metric.

Table 1 — Orphan rate across three organizations (whole-corpus link graph)

SampleDocumentsOrphan rateDead weight (bytes)
CNCF TOC (foundation governance docs)59868%82%
Kubernetes community (SIG & contributor docs)96464%65%
GitLab Handbook (a real company's policy corpus)4,71778%73%

"Dead weight" is orphan bytes ÷ total corpus bytes. It matters more than the count: orphans skew large (review reports, assessment documents, meeting-note archives), so removing them frees far more space than the raw ratio suggests.

Table 2 — Kubernetes KEPs: status never dies

KEPs are the best sample of the bunch because each one carries machine-readable status (provisional / implementable / implemented / withdrawn / replaced / superseded…). All 652 of them:

MetricValue
Zombie drafts (status "in review", untouched > 2 years)26% (87/333)
Fossilized policies (status "implemented", untouched > 5 years)30% (87/294)
Touched within the last year1% (9/652)
Median time since last update6.5 years
Explicitly marked withdrawn / replaced3% (21/652)
→ Remaining97%, parked forever in "in use / in review"

One conclusion we killed ourselves: we hypothesized that withdrawn proposals would show lower reference rates. Measured: 81% zero-reference for withdrawn states vs 77% for active states — a 4-point gap, i.e. noise. Not enough to support a causal claim, so it isn't in our conclusions. What carries information is the status × time table above.

Table 3 — Inside a single organization, a 76-point spread

Averages mislead. We computed the link graph over the whole Kubernetes community corpus, then grouped by directory:

GroupDocumentsOrphan rate
mentoring / contributors / sig-node41 / 98 / 2920% / 28% / 28% (living policy layer)
communication4547% (but 82% of bytes are dead weight)
elections / archive / events180 / 66 / 9971% / 86% / 96% (archival layer)

The conclusion is not "the corpus is 75% rotten." It is: reference rates must be stratified by directory type first.

Archival layers (events, archives, meeting-note archives) are structurally high-orphan — their job is to record, not to be referenced. Mixing them into an average with the living policy layer produces a meaningless number, and it leads to the wrong action: archive the whole layer, don't "fix" it item by item.

Methodological correction: grouping must happen on the whole-corpus graph. Our first version ran the script per subdirectory, which systematically inflated the orphan rate (92% measured vs 75% true) because subdirectories lose inbound links from other directories. That error nearly produced the conclusion "SIG culture is dead."

A stack of aging folders with a thin layer of dust beside a vintage brass alarm clock — the status says active, time says six and a half years
Status fields are maintained by humans. Time doesn't lie — that is exactly what the status–time contradiction rate measures.

4. Mechanism: status fields are maintained by humans. Time doesn't lie.

KEPs are already good at this — they have status fields, replacement relations, and a process. But every status field has one fatal precondition: a human has to update it.

When a proposal ships, the author updates the status to implemented (that's a win). When a proposal is abandoned, who goes back and marks it withdrawn? That's admitting failure, following a process, and getting someone to approve it. Nobody.

So the status field stays on the optimistic side forever: 73% parked in "in use / in review", only 3% formally declared dead.

Status is not a trustworthy signal. Time is. Crossing the two gives a sharper metric than the orphan rate:

Status–time contradiction rate = the share of documents whose stated status is "active" while they have measurably stopped evolving.

On the KEP sample: 26% + 30% (zombie drafts + fossilized policies). What makes it useful: it never requires judging whether a document's content is correct — only whether its status claim still holds. The latter is computable.

The same logic applies inside companies. The most common problem in a policy library isn't a wrong policy. It's a policy nobody follows anymore that still says "current."

5. What to do: "main area + archive area + automatic decay"

We're publishing the spec and the findings, not the implementation — because the hard part was never the code. The hard part is being allowed to let a policy die.

1. Two-zone structure

This is the single most important design decision: the demotion must be reversible, traceable, and lossless. Otherwise nobody will ever run it.

On a wooden shelf, an open tray holding a few tidy folders on the left and a closed labelled archive box on the right — the main area keeps only what is current; everything else moves to the archive
The main area keeps only what is current; demoted entries move into the archive verbatim — demotion is not deletion, it is lowering default visibility.

2. Stable IDs + status fields

One stable ID per entry (for cross-zone references and dedup), plus time and status fields. An entry without an ID can't be referenced, and therefore can't be decayed automatically.

3. Decay criteria (our current values, all tunable)

CriterionRule
Protection windowcreated ≤ 14 days → never demoted (new things are protected first)
Doubtful windowincomplete and untouched > 45 days → doubtful (moved to archive, recoverable)
Completed→ demotion candidate
P0 / skeleton / institutional memorynever demoted (headers, contracts, design rationale)
Planning-horizon protectionsection titled "(a–b months)" → protected while untouched ≤ b×30 days, expires automatically
No creation datetreated as missing metadata, stays in main area, waits for a timestamp backfill (we don't guess)

Two of these were bought with real mistakes:

"Untouched" ≠ "stale." A blanket git-timestamp rule marks every 3–24-month roadmap item as expired — it isn't due yet. The fix is to treat the horizon in the section title as its protection window, with automatic expiry.

Prose inherits the fate of its section. If every entry in a section gets demoted, its explanatory prose follows. But prose-only sections (tables, contracts, meeting notes) are permanent — they're institutional memory, not to-dos.

These thresholds are not universal. 14/45 days are values we calibrated on our own corpus, and a different corpus requires recalibration — we did it once already: for a bug-archive document of the same "to-do" shape, 90 days fit better (its entries naturally live longer). Copying someone else's threshold is treating their experience as your fact.

4. Move, never delete. Idempotent. Index is derived.

5. Stratify before you act

Back to Table 3: classify directories first, then decide the treatment.

A single brass key hanging from a small hook on a warm wooden wall panel, a folded linen cloth and a closed notebook below — some things have to stay with people
Memory can be externalized. Authority, accountability, unverifiable judgment, systemic bias and audit requirements cannot.

6. Boundary conditions: five things you cannot externalize

This approach isn't universal. Our conclusion: memory can be externalized; these five cannot — they aren't memory problems.

Cannot be externalizedWhy
AuthorityWho gets to decide what is a political question. A system can execute rules; it must never own them
AccountabilityWhen something goes wrong a human must own it; "the system decided" is not a defense
Unverifiable judgmentPolicies are full of "as appropriate / reasonable / when necessary" — without a cheap verifier, automated aggregation degrades into averaging
Systemic biasOrganizational bias gets amplified N×, invisibly
Audit requirementsAnonymous automatic traces aren't attributable → you need stable IDs and human sign-off

Put simply: this mechanism solves an attention problem, not an authority problem. It reduces the human attention spent maintaining policy. It does not make decisions for people.

7. We ran it on ourselves

Same metric, applied to the documentation we maintain ourselves (117 docs, plus a 53-file notes vault):

SampleSizeZero-reference rateDead weight
Engineering docs11712%170 KB
Notes vault5313%26 KB

Far better than the three public samples (smaller corpora, newer), yet 170 KB is still reclaimable — and those orphan documents are being re-read by every AI session.

Which is the point: every organization should run this once, and it takes a week.

Overhead flat-lay on a warm wooden desk: a sheet of paper with empty tick boxes, a wooden pen, a cup of tea, a small potted plant, soft morning light
Your first move: rank policies by last-referenced time and measure the share never triggered by a single reference in 90 days.

Your first action (within one week)

Rank your existing policies/documents by last-referenced time, and compute:

"Share of policies never triggered by a single reference in 90 days"

If it's > 50%, the "policies never die" problem is real and quantifiable in your organization.

No system to deploy, no process to change — a read-only script and an exported link table. Get the number first, then decide whether to fix it.

8. Reproducing this (all data from public repositories)

Metric definition (anyone can reimplement in ~30 lines):

  1. Walk every .md in the corpus (skip .git, node_modules, etc., skip files > 500 KB).
  2. Extract links from each file: Markdown ](target), [[wikilink]], static-site refs {{< ref "path" >}}.
  3. Resolve relative / repo-absolute targets to corpus objects; self-links don't count.
  4. Count inbound links per object: 0 inbound → orphan.
  5. Orphan rate = orphans ÷ total; dead weight = orphan bytes ÷ total bytes.
  6. For grouped stats, compute the graph over the whole corpus first, then group (otherwise you systematically overestimate).

Sources and sample sizes

SampleSourceSizeShape
CNCF TOCgithub.com/cncf/toc598link-based
Kubernetes communitygithub.com/kubernetes/community964link-based
GitLab Handbookgitlab.com/gitlab-com/content-sites/handbook4,717link-based (87% of files contain links)
Kubernetes KEPsgithub.com/kubernetes/enhancements652proposal type (carries status)
~~Kubernetes website~~8,215site-generated: metric invalid, sample voided

Data date: 2026-09-12. All public repositories, snapshotted that day; the numbers hold for that snapshot (these corpora change daily).

We're publishing the metric, the criteria, and the findings; the measurement scripts are out of scope for this release. The metric definition above is complete enough to recompute or refute our numbers independently. A conclusion that can't be recomputed isn't a conclusion.

Closing

We measured three of the best-governed organizations in open source with one ruler. What we found isn't "they manage badly." It's a structural defect shared by every organization:

Policies have owners who create them. Policies have no owner who kills them.

Ant colonies solved this long ago: pheromones evaporate automatically, so what remains is what's still in use. Human organizations never built that half. Which is why every knowledge base, every SOP, every process document converges on the same end state: it only grows, until nobody reads it.

The fix isn't another Knowledge Management Standard. It's giving policy a death mechanism:

Demote, don't delete: invisible by default, recoverable on demand. Let time and references decide, not human memory and courage.

If your corpus measures > 50%, send us the number — and your metric. We want to know how this ratio is distributed across real organizations, and valid counterarguments go into the next revision.

All data reproducible; metric and criteria published in full. Run the same measurement on your own corpus — and if you find a hole in our metric, tell us: valid counterarguments go into the next revision.

Contact: [TBD]

All data comes from public repositories snapshotted on 2026-09-12; the metric and criteria are published in full. Cover illustration is AI-generated.