Use when an already-running 02-DOCS/ wiki needs gardening judgment — what is worth capturing (default: nothing), where a loose note belongs, whether to split a bloated article or merge near-duplicates, how to link orphans back in, and what retires to _archive (never delete). NOT building or sweeping the wiki engine itself (that is `harness`).
npx skills add https://github.com/ericrisco/rsc-harness --skill knowledge-ops
*The engine is already running. harness built the 02-DOCS/ wiki and owns its automation — the inbox sweep, deterministic lint, scoring, gap detection, the self-improve loop — and changing that machinery or filling the wiki in bulk stays with it. Yours are the four judgments automation deliberately leaves to a human: what is worth capturing, how it should be shaped, how it connects, and what should retire. You are the gardener, not the machinery.*
02-DOCS/wiki/ exists. If there is no wiki, stop and say: "Run harness to build the 02-DOCS/ wiki first, then come back to garden it." Why: this skill operates an existing engine; it never creates one. See ../harness/SKILL.md.wiki/harness/user-profile.md to set your verbosity (the harness accompaniment dial, L0–L3). Why: a non-technical owner wants decisions narrated; an expert wants terse diffs.wiki/index.md and wiki/scores.json before any edit. Why: you garden from the map and the score signal, never blind. scores.json tells you what is bloated, orphaned, or stale.If wiki/log.md shows a Maintenance Pass ran in the last few minutes, let it finish — do not race the automation.
Every gardening request is one of four operations. Identify which before you act.
| Operation | You are doing this when… | Primary signal | Writes to |
|-----------|--------------------------|----------------|-----------|
| Capture | A note/source needs a decision: keep, where, at what altitude | new content in inbox//raw/ or a loose user note | raw/ and/or wiki/<topic>/<article>.md |
| Structure | An article is bloated, mistitled, or duplicated | length, a non-singular Overview, near-duplicate titles | wiki/<topic>/, _archive/ |
| Link | Pages are unreachable or under-connected | scores.json orphan_penalty (=5), low inbound count | ## See Also in articles, index.md |
| Prune | Answers are stale, articles superseded, conflicts unresolved, gaps bloated | freshness, conflict annotations, old [FILLED] gaps | _archive/, log.md, gaps.md |
Whichever you do, record a line in wiki/log.md under the reserved-file rule in Safety rails below. The exact entry shapes per operation live in references/gardening-playbook.md.
Default is NO. Capture only what a future reader or agent will need *and* cannot cheaply re-derive. Why: the wiki is a compounding *model*, not a dump — the Karpathy chaos→knowledge paradigm has the LLM write and the human read, so every page must earn its keep.
Walk the altitude ladder, lowest rung first; stop at the first that fits:
raw/ only — a source worth keeping but not worth a synthesized article yet. It stays immutable in raw/<topic>/, no wiki/ page.../harness/references/wiki-article-template.md): YAML frontmatter with a non-empty type:, the OKF-recommended title/description/tags/timestamp, and standard markdown links — never wikilinks. The reserved index.md stays frontmatter-free.Worked examples for each rung are in references/gardening-playbook.md.
Topic choice. Reuse an existing topic before inventing one, and keep wiki/ exactly one level of subdirs deep (the protocol's rule).
wiki/payments/stripe/webhooks/retries.md (four levels deep).wiki/payments/stripe-webhook-retries.md (existing payments/ topic, one level).Split an article when any of these is true:
## Overview cannot be written as one honest paragraph.Why: one article = one thesis keeps scoring, linking, and retrieval meaningful. After a split, fix > Sources: and > Raw: on both halves and repair ## See Also so they reference each other. Recipe in the playbook.
Merge near-duplicates into the higher-scored page; fold the loser's unique content in, then archive the loser to wiki/<topic>/_archive/<loser>__YYYY-MM-DD.md and redirect every inbound link to the survivor. Why: never lose history, never keep two competing truths.
Title. A title is the article's address — make it a specific noun phrase, not a label.
Notes on stuff.md, Misc.md, Stripe.md.stripe-webhook-retry-policy.md, refund-sla-and-escalation.md.Every article earns ≥1 inbound link or is a conscious leaf you can justify. Why: an orphan is dead knowledge — nothing reaches it, so it scores orphan_penalty = 5 and never improves.
scores.json as your worklist: sort by lowest score / orphan penalty, fix those first.## See Also is bidirectional — if A links B, B links A....]]). An OKF consumer follows markdown links; it cannot follow [[...]]. If you find a [[...]] link while gardening, convert it. Same-topic link: [Refund SLA. Cross-topic link: [OAuth setup. Why: the protocol's relative-link convention; ./ is same-topic, ../ crosses one topic boundary, matching the one-level layout. See ../harness/references/wiki-protocol.md "## Conventions".wiki/index.md references it so the map stays complete.Prune is archival, never rm. A superseded article moves to wiki/<topic>/_archive/<article>__YYYY-MM-DD.md; you do not delete it. Why: the safety rails forbid destructive loss, and _archive/ is gitignored from compaction so it stays out of the way without vanishing.
> ⚠ Stale — superseded YYYY-MM-DD note rather than rewriting history.[FILLED YYYY-MM-DD] gaps older than 90 days may be compacted, and only via a single marker prepended to log.md — a gap gets a [FILLED] stamp, never a deletion.wiki/log.md.A full worked prune session (stale + superseded + conflict + gap compaction, all logged) is in references/gardening-playbook.md.
Inherited from ../harness/references/wiki-protocol.md — do not override them; each one guards against a loss you cannot undo.
wiki/<topic>/_archive/<article>__YYYY-MM-DD.md.wiki/log.md, the OKF reserved change-log: new entries are prepended at the top (newest first), ISO 8601 dates. gaps.md is the append-only one — new entries go at the bottom. Past entries in either are immutable: a gap gets a [FILLED YYYY-MM-DD] stamp, nothing is ever edited out or deleted.timestamp is < 24h ago without explicit user say-so. Why: it is likely still being worked. (timestamp is the OKF last-meaningful-edit field, ISO 8601 — see ../harness/references/wiki-protocol.md "## Conventions".)| Anti-pattern | Why it is wrong | Do instead |
|--------------|-----------------|------------|
| Capturing everything "to be safe" | The wiki rots into a dump; the model stops being a model | Raise the bar; default to discard or raw/-only |
| rm-ing a superseded article | Loses history the rails protect | Archive to _archive/<article>__YYYY-MM-DD.md |
| Auto-picking a winner in a contradiction | Silent data corruption; you guessed | Flag it; let the human arbitrate |
| Re-running harness to fix a broken link | Wrong tool — the Maintenance Pass already auto-fixes links | Repair ## See Also by hand; let automation handle the rest |
| Nesting wiki/a/b/c.md | Breaks the one-level topic rule | Flatten to wiki/<topic>/<article>.md |
| Editing a past log.md / gaps.md entry | Breaks the immutable audit trail | Add a new entry — prepend to log.md (newest first), append to gaps.md |
| Splitting on length alone | Two halves of one thesis are worse than one page | Split on thesis count, not line count |
| Creating a new topic for a one-off note | Topic sprawl; reuse beats create | File under the nearest existing topic |
Route elsewhere when the request is not gardening an existing wiki:
| Request | Route to |
|---------|----------|
| Build/bootstrap the wiki, run an inbox sweep, scaffold 01-TOOLS, generate root CLAUDE.md | harness (../harness/SKILL.md) — it owns the engine |
| Turn a meeting transcript into a recap with action items + owners | meeting-notes (../meeting-notes/SKILL.md) |
| Author a decision record (ADR) with alternatives, status, review cadence | decision-records (../decision-records/SKILL.md) — you may *file* one; that skill *authors* the discipline |
| Document a repeatable procedure step by step | sop-builder (../sop-builder/SKILL.md) |
| First-pass walkthrough of an unfamiliar codebase | codebase-onboarding (../codebase-onboarding/SKILL.md) |
| Run a literature / source-gathering research project | research-ops (../research-ops/SKILL.md) |
Take ericrisco/knowledge-ops from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.