Wiki Curate — Read-only Audit
Reads the vault wiki and produces a triage report. Never writes. Detects four classes of issue: overlap clusters (fragmentation), tag gaps (untagged concepts + orphan/near-duplicate tags), write-only concepts (zero backrefs from the corpus), and anatomy/lifecycle issues (drafts awaiting curation + curated pages that regressed the concept anatomy). Companion to
wiki-grow(which adds new concepts) andwiki-merge(which collapses overlap clusters).
When to Use
- After a
wiki-growrun, to check what the new stubs introduced. - Before deciding which concepts to refine or merge.
- Monthly, to keep the wiki's signal-to-noise ratio high.
When NOT to Use
- For project knowledge folders — those are audited via
knowledge-lint. - For atlas topics — that's
atlas-audit. - For mechanical edits — this skill never writes. Use
wiki-mergeto collapse overlap clusters and the planned tag-inference pass inwiki-growto backfill missing tags.
Architecture
scripts/wiki-curate-scan.py
├─ reads: ~/vault/concepts/*.md
│ ~/vault/atlas/<theme>/*.md (for backref counts)
│ ~/vault/books/<slug>/*.md (for backref counts)
│ <research-root>/<theme>/<proj>/CLAUDE.md (for backref counts)
└─ writes: /tmp/wiki-curate-report.md
/tmp/wiki-curate.json
The skill is invoked by running the Python orchestrator. No Claude dispatch — the audit is pure deterministic analysis.
What it checks
A. Overlap clusters (the headline feature)
Concept slugs are tokenised (kebab parts, stopwords removed, trailing
s stripped for crude singularisation). Any token shared by ≥2
concept slugs forms a cluster.
Within each cluster, the canonical winner is suggested by:
- Human-curated (
auto_generated: false) beats auto-generated. - Longer body beats shorter.
- Alphabetically earliest slug breaks ties.
Pair-level title-Jaccard ≥ 0.40 is flagged as 🔥 high confidence (distinct from "shared keyword" — the slugs are substantively similar).
Example output from a recent run:
### `goodhart` (size 3)
- `goodhart-resistance` — auto, 3533 chars
- `goodhart-taxonomy` — auto, 3902 chars
- `goodharts-law` — curated, 3111 chars ← canonical (suggested)
Suggested action: wiki-merge goodharts-law goodhart-taxonomy goodhart-resistance
B. Tag coverage
- Untagged concepts — frontmatter has no
tags:field. Filters on/concepts?tag=Xwon't surface them. - Orphan tags — used by exactly one concept. Either expand or retire.
- Near-duplicate tags — pairs differing only by case / hyphen /
trailing
s(e.g.mlvsmachine-learning,modelvsmodels).
C. Backref health
For each concept, count:
- Incoming wikilinks —
[[slug]]references from atlas topic bodies, book chapters, and project CLAUDE.md files. - Corpus mentions — case-insensitive whole-word slug occurrences in the same corpus.
Concepts with both counts zero are flagged as write-only — they don't surface anywhere. Two remedies:
- Insert
[[slug]]references in the atlas topics that should reference the concept (mechanism A from this session — body wikilinks auto-surface as chips on the topic page). - Add the slug to
~/vault/concepts/.denylistand delete the file — accept the concept isn't carrying weight.
D. Anatomy & lifecycle
The status: frontmatter field is the lifecycle axis: draft
(no guarantees, may be project-voiced) → curated (conforms to the
concept anatomy). Status is read from frontmatter with the same
fallback as atlas-workspace (auto_generated: true → draft, else
curated) so pages predating the field classify correctly. The
anatomy is defined in packages/atlas-vault/schema.md → "Concept
File Schema":
## In one line— required definition block (machine-anchored).## In my portfolio— the boundary below which project-voiced prose ("the project", "this paper", "we propose", …) is allowed.
Two lists are reported:
- Drafts awaiting curation — every
status: draftconcept, with a ✓/— table showing which anatomy pieces already exist (In one line,In my portfolio) and how many project-voice phrases sit above the boundary. Higher counts mean more restructuring to do. - Curated pages violating the anatomy — pages marked
curatedthat regressed: missing theIn one linedefinition, or project-voice prose above theIn my portfolioboundary (including a portfolio section under a non-canonical heading). These are the priority fix — a curated page is supposed to conform.
The curation action itself is a Claude-driven restructuring edit (this skill is read-only); see the triage workflow below.
Output
/tmp/wiki-curate-report.md with three sections (A/B/C) and a
suggested triage order. Stdout from the script:
Concepts: 14 (6 curated, 8 draft)
Overlap clusters: 0
Drafts awaiting curation: 8
Curated pages violating anatomy: 1
Untagged: 8/14
Write-only (no backrefs): 0
Report: /tmp/wiki-curate-report.md
JSON: /tmp/wiki-curate.json
The JSON sidecar feeds the planned wiki-merge skill so it can
read the suggested winner/fold-in lists without re-running the
detection.
Modes
| Mode | Invocation | Behaviour |
|---|---|---|
| Default | wiki-curate (or uv run python scripts/wiki-curate-scan.py) |
Run all three audits, write report + JSON, print summary to stdout. Read-only. |
There's no --autonomous flag here — the skill is already pure-read
and idempotent. Future cron integration: chained after the Saturday
06:45 wiki-grow run, the audit can land in
log/audits/wiki-curate-YYYY-MM-DD.md for a weekly health snapshot.
Triage workflow
After running:
- Section D regressions first — any curated page flagged as
violating the anatomy is a bug: it claims
curatedbut doesn't conform. Fix in place (add## In one line, or rename/add the## In my portfoliosection and move project-voiced prose under it). - Section A — every overlap cluster fragments knowledge. Pick a
canonical winner (often the suggestion) and run
wiki-merge <winner> <fold-in-slugs>to collapse. Re-runwiki-curateto confirm the cluster is gone. - Section D drafts — curate each
draftto the anatomy:- Extract a 2-4 sentence project-agnostic definition into
## In one line. - Keep the cited, stable knowledge in encyclopedia voice.
- Move all project-voiced prose under
## In my portfolio. - Verify
references:keys are canonical Paperpile keys (rekey hand-minted lookalikes). - Flip
status: draft→status: curatedin frontmatter and setlast_updated.
- Extract a 2-4 sentence project-agnostic definition into
- Section B — untagged concepts won't surface in the tag filter.
Until the planned
wiki-growtag-inference pass lands, add tags manually for the auto-promoted stubs you care about. - Section C — write-only concepts. Decide per-concept: link from a topic, denylist, or accept.
Cross-References
| Skill | Relationship |
|---|---|
wiki-grow |
Writes the auto-promoted concepts this skill audits. |
wiki-merge |
Acts on the overlap clusters this skill finds (planned — not yet built). |
compile-knowledge |
Upstream of wiki-grow; produces the project knowledge articles that get promoted. |
atlas-audit |
Audits atlas topics; complementary lens. |
knowledge-lint |
Audits per-project knowledge folders; complementary lens. |