Search, capture, and query the claude-code-plugins knowledge graph. Use when asked to "capture this", "add this to the graph", "what do we know about X", "update the graph", "check the graph for X", or when a decision, pattern, or non-obvious fact surfaces mid-session that's worth recording. Also: "log an observation", "what patterns do we have about skill triggering", "any decisions on the knowledge-commons plugin", "what do we know about the commit-creator agent".
The graph lives at knowledge/, with the atlas at knowledge/principium.md. This skill defines how
notes in it are shaped — /process and /promote write through these conventions, and direct captures
land here too. You are the graph's primary writer; a human approves what gets written by reading the plan
before it lands, and browses the result directly in Obsidian. There is no
validator standing between a bad plan and the graph — the conventions below, plus that approval, are what
keep it healthy.
The structure here — which maps exist, how they're organized — isn't fixed by this file. It emerges from what actually gets written, the same way the rest of this skill is expected to drift as real runs show where a convention or a judgment call was off.
A compact restatement of the graph's structural contract. The full version lives in the knowledge-commons
plugin at
/Users/derek-personal/.claude/plugins/cache/ddehart-plugins/knowledge-commons/0.1.7/references/graph-conventions.md;
everything a writing session needs day to day is here.
Navigation. Every note carries genitor: "[[parent-map]]" in its frontmatter, pointing at the map that
indexes it, and gets an entry in that map, alphabetically. The atlas (principium.md) links to maps; maps
link to notes. Nothing should exist in the graph that isn't reachable by following links down from the
atlas.
Maps are the index. An attractor map entry is annotated, not bare —
- [[title]] — the "so what" in one clause — so reading an attractor map top to bottom is reading the
distilled corpus, not a table of contents.
Frontmatter contract.
genitor: "[[map-title]]".observation) also carry tags:, date:, and supports: — a list of wikilinks to the
attractor(s) the note bears on.pattern, decision) carry genitor: and tags: only. They don't supports:
anything; they're what gets supported./promote) add domain: — the source graph's name, a
plain string, never a link or a path.Naming. A note's title is its filename: a descriptive, lowercase natural-language phrase (the filename
is the link target), not a type-prefixed slug.
An observation's title states what happened or was found; an attractor's title states the claim
itself, in a form you could agree or disagree with.
Tags vs. fields. tags: are loose and thematic, for browsing — apply conservatively, they don't drive
structure. genitor:, supports:, and domain: are structural fields: they're what atlas-to-map-to-note
reachability and evidence-to-attractor linkage actually run on. Don't ask a tag to do a field's job.
Judgment calls, not rules a checker enforces. The discipline is the same one that keeps any commonplace book alive: think before writing, and prefer improving what's there over adding to it.
genitor: and no map entry might as well not
exist — it won't surface in a query and won't get maintained.The one rule that matters more than the others: every observation note must support at least one
attractor — both in its own frontmatter (supports:) and as a line in that attractor's ## evidence
section. This convention is what keeps evidence connected to its distillations instead of accumulating as
an unlinked pile. Everything else on this list is a judgment call; this one is close to load-bearing.
(This graph's capture-when-unclear bar can leave an observation temporarily unattached — that is a
deliberate, flagged exception for a future run to cluster, not license to skip the link permanently.)
sources/, keyed
on a canonical source: (session:{uuid}, a URL). A transcript is too large to sit in a note, so its
source note carries an archive: pointer into knowledge/sources/raw/, where the rendered transcript
is committed; a docs page is small enough to inline verbatim. Carries the processed: stamp that makes
/process re-runs resume instead of redoing, and raw: unavailable where a transcript has been pruned.chronicle, the dated entries in docs/chronicle/, written by
meta-claude:session-chronicle. A chronicle entry distils one session for a human reader. That
first clause used to be the reason this graph declared no synthesis tier — "a chronicle entry is
already a session-level synthesis, so evidence comes straight from the source" — and it inverts itself:
being a synthesis of the session is exactly what makes it this pipeline's output, not its input.
It is a sibling of the atomic evidence, not an intermediate the evidence passes through: /process
makes the chronicle and the observations from the same transcript, side by side, and observations are
extracted from the transcript rather than through the entry. The entry links back to its source note
and the source note links to it. These are pre-existing project artifacts adopted into the tier at the
path they already occupy — outside knowledge/, and without this graph's genitor:/tags:
frontmatter, which the tier tolerates because the link direction that matters lives on the source note.observation, stored in observations/. Atomic, provenanced notes; each one supports at
least one attractor.pattern (open — a recurring shape, accumulating evidence about how plugins & skills
should be built, no verdict), decision (settled — a design choice with its reasoning), and question
(open — something this graph doesn't yet know, holding evidence until it graduates). Each carries a "so
what." A question differs from a pattern in what it claims: a pattern asserts a shape recurs and needs
evidence to say so; a question asserts nothing beyond "worth watching" and may have no evidence yet.
A question graduates into a decision when it settles, or a pattern when what it reveals recurs.plugin and skill, stored in entities/. Notes for the named nouns worth a name in
this graph. Retrieved by lookup, never by association — but they may accumulate curated context and a
dated interaction log; "lookup" describes how they're found, not how thin they must stay.reference, stored in reference/. Unbounded lookup facts (Claude Code feature
behaviors, format specs); never an association surface.Working one session (e.g. session:5912a7cc-0cd3-44cb-829f-fe1130ef07c6):
/process's preserve step wrote it before inspection, with the
canonical source: (session:{uuid}, never a path) in frontmatter, an archive: pointer into
knowledge/sources/raw/, and an entry in maps/sources.md. It is the ledger /process stamps.
If you are here without one, preservation was skipped; go back rather than writing notes with no
provenance.observations/, atomic, one paragraph, with frontmatter naming the
attractor(s) it supports. If nothing existing fits, either flag it in the plan as a candidate for a new
pattern / decision, or — under this graph's capture-when-unclear bar — record it and mark it
unattached for a future run to cluster.## evidence section with the new observation, and its map entry's
gloss in maps/patterns.md or maps/decisions.md if the new evidence changes the "so what."entities/, add a lookup-only entity note and list it
under the right heading (Plugins / Skills) in maps/entities.md.maps/observations.md in alphabetical position.Example note from an entry:
# observations/reverting the validator left graph health on approval plus conventions.md
---
genitor: "[[observations]]"
tags: [architecture, refinement]
date: 2026-07-15
supports: ["[[prose conventions plus human approval can replace a validator]]"]
---
The knowledge-commons build reverted its executable validator, write transactions, and lifecycle
machinery after the reference implementation showed those failure modes don't occur under a
human-in-the-loop workflow. Graph health rests on two things instead: an LLM writing to prose conventions,
and a human approving every plan.When it's unclear whether something clears the bar, lean toward capturing — a note that turns out thin costs one skipped line at the next plan review; a dropped observation is invisible, and by the time its absence is noticed the chronicle's context has moved on. Record it, mark it unattached if it doesn't yet fit an attractor, and let a future run prune or cluster it.
Two failure modes to watch for, both of which capture-when-unclear makes easier to trip:
Durable: why a plugin design worked or failed, a pattern across sessions, a design decision and the reasoning behind it, curated context about a plugin or skill. Operational: this PR's status, a specific issue's tier label, a task to do next, session logistics — those live in GitHub Issues, Todoist, or the chronicle itself, not here. The test: would this fact still matter to a future unrelated session, or is it only true until the next commit overwrites it?
Never capture: private content from other domains — chronicles may reference wellstead, aiwyn, or client specifics; this graph lives in a public plugin repo, so only plugin-craft lessons belong here, and those only in generalized form with the other domain's particulars stripped. Also never: secrets, tokens, or credentials that appear in a chronicle, and personal or sensitive data (addresses, identifiers, anything with a privacy or legal sensitivity). When a genuinely useful lesson is entangled with off-limits material, capture the lesson and drop the material — never the reverse.
observation titles state the finding, not the method: "reverting the validator left graph health on
approval plus conventions," not "validator revert notes." Attractor titles state the generalization as a
claim you could argue with: pattern — "prose conventions plus human approval can replace a validator";
decision — "knowledge-commons ships at the weight of the system it generalizes."
At the start of a session that will touch this graph, read knowledge/changelog.md (current month) and the
atlas — the fastest way to pick up where the graph left off without re-deriving something already settled.
At the end of a session, report a change summary — one line per item, grouped as created / updated / map
changes / corrections — and append a changelog entry: what changed, what was decided and by whom, what was
learned, and any open questions the session surfaced but didn't resolve. The current month's entries live
directly in knowledge/changelog.md; at the first session of a new month, move the prior month's entries
to knowledge/changelog/YYYY-MM.md before appending.
Capture — turning something into a note:
See "Extraction Workflow: session" above for how this graph turns a session into notes end to end.
Query — "what do we know about X":
Evolve — restructuring the graph itself:
maps/entities.md are the likeliest first candidates).Outside an explicit /process run or a direct request to capture something, this skill can still speak up
mid-session. Suggest a capture when:
Domain-specific triggers worth watching for: a plugin or skill's behavior gets pinned down authoritatively
(worth a line in that entity's note); a version bump is traced to a specific defect (candidate decision
or pattern evidence); a convention in one plugin is deliberately mirrored or rejected in another (a
cross-plugin pattern).
Don't suggest for operational detail, for something already captured, or for a fact that's trivially re-derivable from its source — the bar for interrupting mid-session is higher than the bar for capturing once asked.
Keep the offer to one line: "Worth capturing as [title] under [map]?" If declined, drop it — don't re-raise the same suggestion.
24e103e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.