Concepts
Run the concept-merger reducer subagent over the per-node enrichment sidecars to produce or refresh `lineage/{repo}/concepts.yaml` — the deduplicated concept catalog with cross-axis equivalences and canonicalisation candidates. Anchored on `documentation/docs/main-concepts.md` for the canonical vocabulary. Maintainer-curated entries preserved across refreshes.From its SKILL.md
npx -y skills add opendatadiscovery/odd-team --skill conceptsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.6 KB, ~2.3k tokens by cl100k_base, as published. Nobody here has run it
Concept catalog (DOC-164 slice 6+)
Build or refresh the cross-sidecar concept catalog at lineage/{repo}/concepts.yaml. The catalog clusters every per-node sidecar's concepts block by semantic equivalence, anchors names against the canonical vocabulary in documentation/docs/main-concepts.md, and surfaces canonicalisation candidates for the maintainer to decide on.
This skill is the second reducer in the agentic-code-ontology layer (per adrs/drafts/agentic-code-ontology.md rev 2). The first per-node enrichment slice was /enrich (slice 5). /concepts consumes the sidecars /enrich produced.
Argument forms
| Form | Behaviour |
|---|---|
/concepts [<repo>] | Default. Run concept-merger in incremental mode (per playbooks/reducer-incremental-mode.md) against lineage/{repo}/understanding/ (default repo: odd-platform). Refreshes lineage/{repo}/concepts.yaml by appending+annotating only the sidecars whose node_id is not yet in the prior catalog's processed_node_ids. Preserves any concept entries flagged maintainer_curated: true from a prior version. |
/concepts --full [<repo>] | Forces FULL mode — re-reads every sidecar and regenerates the catalog from scratch. Use when prior catalog is corrupt, prompt_version bumped, or after a schema change. |
/concepts --show [<repo>] | Read-only. Print the existing catalog's summary (concept counts per category, top-N concepts by node-count, canonicalisation candidates list). No subagent invocation; no writes. |
/concepts --diff [<repo>] | Read-only. Compare the existing concepts.yaml to a freshly-generated one (in a temp file) and surface the diff. Useful for previewing what a refresh would change before committing it. |
Incremental input resolution
Before spawning the subagent in default (incremental) mode, the skill computes:
PROCESSED_NODE_IDS— read from priorconcepts.yaml's frontmatterprocessed_node_ids:field. If the field is missing (pre-v0.2 catalog), fall back to--fullfor this run.NEW_SIDECAR_FILES—Glob lineage/{repo}/understanding/*.mdminus the set whose YAML frontmatternode_id:is inPROCESSED_NODE_IDS. Empty set → report "Nothing to refresh (no new sidecars)" and exit without invoking the subagent.PRIOR_HEAD— one line per concept from priorconcepts.yaml, derived viagrep -E '^ - name:'+ per-entrycontributing_fileslength count. Use the compact-head shape fromplaybooks/reducer-incremental-mode.md.CURATED_ENTRIES— verbatim YAML of every concept entry withmaintainer_curated: true, extracted by parsing the prior catalog.
These four values + MODE: incremental get passed to the subagent in place of the legacy EXISTING_CATALOG block.
Prerequisites
lineage/{repo}/understanding/{slug}.mdsidecars exist (i.e./enrichhas been run at least once).documentation/docs/main-concepts.mdis reachable (either local at../documentation/docs/main-concepts.mdor live athttps://docs.opendatadiscovery.org/main-concepts). The skill prefers the local file (faster, no rate limits); WebFetches the live URL only as a fallback.- The
concept-mergersubagent at.claude/agents/concept-merger.mdis loaded.
Protocol
1. Orient
Read these (skip if already loaded this session):
CLAUDE.md— quality baradrs/drafts/agentic-code-ontology.md— the layered ADR + reducer pattern.claude/agents/concept-merger.md— the subagent's system prompt- The active pillar's
cornerstones.md(currentlypillars/documentation/cornerstones.md) — Cornerstone 2 is the canonical-vocabulary discipline this skill upholds
2. Resolve inputs
- Sidecar set:
Globlineage/{repo}/understanding/*.md. Confirm at least one sidecar exists; otherwise report "no sidecars to merge — run/enrichfirst" and exit. - Existing catalog (if any):
lineage/{repo}/concepts.yaml. If present, capture itsmaintainer_curated-flagged entries to pass to the subagent for preservation. - Canonical-vocab source: prefer
../documentation/docs/main-concepts.md(local sibling repo). Fallback: WebFetchhttps://docs.opendatadiscovery.org/main-concepts. Pass the path/content to the subagent. - Substrate state: read
lineage/{repo}/manifest.yaml'slast_scan_commitso the produced catalog can recordgenerated_at_commit.
3. Spawn the concept-merger subagent
Invoke via the Agent tool with subagent_type: concept-merger (after .claude/agents/concept-merger.md is loaded; in this session general-purpose is the fallback). Construct the prompt as:
REPO: <repo>
WORKSPACE_ROOT_ABS: <absolute>
SIDECAR_DIR_ABS: /home/.../lineage/{repo}/understanding/
DOC_MAIN_CONCEPTS_PATH: <absolute path to ../documentation/docs/main-concepts.md, or the live URL if only the URL is reachable>
SUBSTRATE_LAST_SCAN_COMMIT: <from manifest.yaml>
EXISTING_CATALOG: <verbatim content of lineage/{repo}/concepts.yaml if present, else "(none)">
SIDECAR_FILES: <newline-separated list of sidecar paths>
SIDECAR_COUNT: <N>
TARGET_PATH: lineage/{repo}/concepts.yaml
The subagent's tool surface is Read, Glob, Grep, Write per its frontmatter. It writes the catalog and replies with Wrote: ... + Catalog: ....
4. Validate the resulting catalog
After the subagent reports completion:
- Confirm
lineage/{repo}/concepts.yamlexists. - Parse it as YAML (Bash
python -c "import yaml; yaml.safe_load(open('...'))"or skip if no Python available). - Verify the four top-level lists exist:
entities,operations,invariants,audiences. Empty lists are fine; missing keys are an error. - Verify each concept entry has
name,nodes,contributors,evidence. Missing fields = log warning + report. - Verify every
nodesentry references a real node ID — sample-check 5 random entries viajqagainstlineage/{repo}/nodes.jsonl. If a sample finds a fabricated node ID, that's a CRITICAL FAIL — the catalog is unreliable; report + ask the maintainer how to proceed.
5. Report
Concise output:
- Catalog path
- Counts:
<E> entities, <O> operations, <I> invariants, <A> audiences = <N> concepts - Cross-axis concepts: count concepts whose
axes_presenthas ≥2 entries (these are the most valuable — they prove the cross-axis join works) - Top-3 concepts by node-count (which concepts have the most contributing sidecars)
- Canonicalisation candidates count + brief list (one line each)
- Suggested next:
/find-implicit-adrs(slice 8 — adr-archaeologist) once the catalog is reviewed; or/enrich --batch <axis>to grow the sidecar set if cross-axis coverage is weak.
Rules
- Live-URL-only doc rule applies here too. The subagent's prompt requires that when it cites
documentation/docs/main-concepts.md, the citation is from a file Read in this session — not pretraining recall. The skill provides the path/content; the subagent does not invent canonical-vocabulary entries from memory. - Maintainer-curated preservation. If a concept entry in the existing
concepts.yamlis flaggedmaintainer_curated: true, the subagent preserves itsname,description, andnotesverbatim. Thenodes,contributors, andevidencefields may update if new sidecars contribute (they're auto-derived); the maintainer's prose stays. - Don't dedup canonicalisation candidates. Even if a candidate appears similar to an existing entry, surface both. The maintainer is the only judge of canonical-vocabulary changes.
- Reducer doesn't fix sidecar quality. If a sidecar's
conceptsblock is sparse or unclear,concept-mergernotes the contribution but does not "fill in" missing concepts. Sparse sidecars surface as a quality finding for/enrich --node <id>to refresh, not for the reducer to paper over. - Skip auto-write on validation failure. If the subagent's output fails schema validation, the file gets written to
lineage/{repo}/.concepts-staged.yamlinstead and the maintainer reviews before promoting toconcepts.yaml. (Slice-6 MVP: simpler — write directly and report failure.)
Failure modes to surface (not auto-fix)
- Subagent claims a concept appears in node X but X isn't in
nodes.jsonl→ catalog is rejected; maintainer iterates the prompt - Canonical-vocabulary fetch failed (local file missing, WebFetch returned non-200) → catalog uses
canonical_in_docs: unknownfor entries that can't be classified; maintainer re-runs after fixing - More than 30% of entries land in
canonicalisation_candidates→ either the canonical vocab is genuinely undersized (real signal worth maintainer review) OR the sidecars are noisy (refresh/enrichmay help). Surface to maintainer rather than silently emit a low-quality catalog.
Cross-references
- Subagent:
.claude/agents/concept-merger.md - Inputs:
lineage/{repo}/understanding/*.md(per-node sidecars from/enrich) - Output:
lineage/{repo}/concepts.yaml - Canonical-vocab source:
../documentation/docs/main-concepts.md(local) orhttps://docs.opendatadiscovery.org/main-concepts(live) - ADR:
adrs/drafts/agentic-code-ontology.mdrev 2 — agent set table, slice progression - Cornerstone enforced: documentation pillar Cornerstone 2 (vocabulary anchored in
main-concepts.md)
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.