| name | knowledge-wiki-synthesis |
| description | Scan the wiki for cross-cutting connections, implicit relationships, contradictions, and gaps across concepts and summaries, then write synthesis concept files. Use when the user wants to discover non-obvious connections, synthesize the knowledge base, or run a reflection pass after adding new content. |
Knowledge Wiki Synthesis
Discover non-obvious connections across the wiki and write synthesis concept files. Uses a two-phase process: a cheap index-scan to find candidates, then a targeted deep-read to synthesize each one.
Steps
1. Establish the working directory
The knowledge base root is the Git repository root. Run git rev-parse --show-toplevel and store the result as KNOWLEDGE_PATH.
Use KNOWLEDGE_PATH for all subsequent steps.
2. Find recently updated summaries
Run:
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-state.mjs find-unprocessed-summaries knowledge-wiki-synthesis
This outputs a JSON array of summary file paths (relative to KNOWLEDGE_PATH) whose summarized_at is newer than the last time this skill ran. On the first run (no prior state), it returns all summary files.
Store this list as RECENT_SUMMARIES. These paths are used as a priority signal in step 4 — candidates that involve at least one recent summary are ranked higher. They are not an exclusive filter; older summaries and concepts are still considered.
3. Load the concept list
Run:
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-index.mjs read-concepts > /tmp/wiki-concepts.md
Then read /tmp/wiki-concepts.md in full using the Read tool, using offset and limit to page through it if the file exceeds the Read tool's line limit. Do not pipe through head or any other truncating command — the concept list may be thousands of lines, and truncating it means missing potential synthesis candidates.
Each line is one concept entry in the form:
- [[Wiki/Concepts/{slug}|{Display Name}]] — {one-line description}
4. Discover connection candidates
Using only the one-line descriptions from step 3, identify 3–5 strong connection candidates. Look for:
| Type | What to look for |
|---|
cross-cutting | A theme that appears across multiple unrelated summaries or concepts |
relationship | Two or more concepts that seem deeply related but are not explicitly linked |
contradiction | Two summaries or concepts that appear to take opposing positions on the same topic |
gap | A theme strongly implied by multiple entries but with no dedicated concept article |
Priority: Rank higher any candidate that involves at least one entry from RECENT_SUMMARIES. If RECENT_SUMMARIES is empty (no summaries have been updated since the last run), use your judgment across the whole index.
Deduplication: Before proposing a candidate, check whether a concept file already exists at {KNOWLEDGE_PATH}/Wiki/Concepts/{proposed-slug}.md. Skip any candidate whose synthesis concept already exists.
For each candidate, record internally:
type: cross-cutting | relationship | contradiction | gap
concepts: [slug-a, slug-b, ...]
hypothesis: one sentence describing the connection
files_to_read: [full paths to concept and summary files — prioritize RECENT_SUMMARIES entries and their neighbors]
proposed_slug: lowercase-kebab-case slug for the new concept file
proposed_title: correctly-cased human-readable title
If fewer than 2 strong candidates are found, print:
Nothing strong enough to synthesize yet. Run again after adding more content.
And stop.
5. Process each candidate
For each candidate from step 4, run the following sub-steps in order.
5a. Read relevant articles
Read each file listed in files_to_read using the Read tool. If any file references additional concepts or summaries that seem directly relevant to the hypothesis, read those too. Maximum 8 files total per candidate.
5b. Evaluate synthesis quality
Assess whether the evidence from the files actually supports the hypothesis:
- Strong evidence (2+ files directly support the connection) → proceed to 5c and 5d
- Weak evidence (only superficial overlap) → note as skipped, do not write a file, continue to next candidate
5c. Create the synthesis concept file
-
Run:
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-concept.mjs create "{proposed_slug}" "{proposed_title}" --type Synthesis --icon notepad
This creates Wiki/Concepts/{proposed_slug}.md. The command prints the file path.
-
Read the file using the Read tool, then edit it to add:
- Article body — insert between
# {proposed_title} and ## Sources: 3–5 paragraphs of synthesis in American English. Explain the connection, relationship, contradiction, or gap clearly.
- For connections: what do these concepts share, and why does it matter?
- For relationships: how are they related, and what does understanding the relationship reveal?
- For contradictions: what are the opposing positions, and what might explain the disagreement?
- For gaps: what is the missing concept, and what would an article about it say?
Write as a standalone reference — the reader has not read the source articles.
tags: [] — replace with relevant lowercase English tags. Use judgement; do not blindly copy all tags from the connected concepts.
-
For each concept this synthesis draws from, add it to the Connected Concepts section (idempotent):
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-concept.mjs insert-connected-concept "{proposed_slug}" "{linked-slug}" "{Display Name}"
-
For each source consulted, add its link (idempotent):
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-concept.mjs insert-source "{proposed_slug}" "{summary-path-without-md}"
where {summary-path-without-md} is the summary file path with .md stripped, e.g. Wiki/Summaries/Posts/foo.summary.
5d. Update backlinks in connected concept files
For each {linked-slug} / {Display Name} pair added via insert-connected-concept in step 5c.3, back-link that concept's own file to the synthesis:
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-concept.mjs insert-connected-concept "{linked-slug}" "{proposed_slug}" "{proposed_title}"
This appends - [[Wiki/Concepts/{proposed_slug}|{proposed_title}]] to the ## Connected Concepts section of each connected concept file, creating the section before ## Sources if it does not exist. The operation is idempotent.
5e. Update the index
Run:
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-index.mjs upsert-concept "{proposed_slug}" "{proposed_title}" "{one-line English description}"
6. Update state
Run:
node {KNOWLEDGE_PATH}/scripts/wiki/wiki-state.mjs set-last-run knowledge-wiki-synthesis
7. Print summary
Synthesized {N} concept(s) from {M} candidate(s):
✓ Created: {proposed_slug} — {proposed_title}
Type: {cross-cutting | relationship | contradiction | gap}
Connects: {slug-a}, {slug-b}, ...
✗ Skipped: {hypothesis} (weak evidence)
Files consulted: {list}
Suggested follow-up ingestion:
- {topic} — referenced in {synthesis-slug} but no summary exists yet
Omit the "Suggested follow-up ingestion" section if there are no gaps.