Find connections between notes and update MOCs. Requires semantic judgment to identify genuine relationships. Use after /reduce creates notes, when exploring connections, or when a topic needs synthesis. Triggers on "/reflect", "/reflect [note]", "find connections", "update MOCs", "connect these notes".
Read these files to configure domain-specific behavior:
ops/derivation-manifest.md — vocabulary mapping, platform hints
vocabulary.notes for the notes folder namevocabulary.note / vocabulary.note_plural for note type referencesvocabulary.reflect for the process verb in outputvocabulary.topic_map / vocabulary.topic_map_plural for MOC referencesvocabulary.cmd_reweave for the next-phase suggestionvocabulary.inbox for the inbox folder nameops/config.yaml — processing depth, pipeline chaining
processing.depth: deep | standard | quickprocessing.chaining: manual | suggested | automaticIf these files don't exist, use universal defaults.
Processing depth adaptation:
| Depth | Connection Behavior |
|---|---|
| deep | Full dual discovery (MOC + semantic search). Evaluate every candidate. Multiple passes. Synthesis opportunity detection. Bidirectional link evaluation for all connections. |
| standard | Dual discovery with top 5-10 candidates. Standard evaluation. Bidirectional check for strong connections only. |
| quick | Single pass — either MOC or semantic search. Accept obvious connections only. Skip synthesis detection. |
Target: $ARGUMENTS
Parse immediately:
[[note name]] or note name: find connections for that {vocabulary.note}--handoff: output RALPH HANDOFF block at endExecute these steps:
description field: verify no restatement of title, no subject echo, answers "so what?"--handoff in target: output RALPH HANDOFF blockSTART NOW. Reference below explains methodology — use to guide, not as output.
Find connections, weave the knowledge graph, update {vocabulary.topic_map_plural}. This is the forward-connection phase of the processing pipeline.
The network IS the knowledge.
Individual {vocabulary.note_plural} are less valuable than their relationships. A {vocabulary.note} with fifteen incoming links is an intersection of fifteen lines of thought. Connections create compound value as the vault grows.
This is not keyword matching. This is semantic judgment — understanding what {vocabulary.note_plural} MEAN to determine how they relate. A {vocabulary.note} about "friction in systems" might deeply connect to "verification approaches" even though they share no words. You are building a traversable knowledge graph, not tagging documents.
Quality over speed. Explicit over vague.
Every connection must pass the articulation test: can you say WHY these {vocabulary.note_plural} connect? "Related" is not a relationship. "Extends X by adding Y" or "contradicts X because Z" is a relationship.
Bad connections pollute the graph. They create noise that makes real connections harder to find. When uncertain, do not connect.
Check for recent additions:
Focus on connecting a specific {vocabulary.note}:
Synthesize an area:
External loop mode for /ralph:
Before searching, verify the topic map index is current. This is self-healing: if {vocabulary.note_plural} were created outside the pipeline (manual edits, other skills), reflect catches the drift before searching.
ops/cache/topic-map-index.json exists and is recent (< 24 hours):
if [[ ! -f ops/cache/topic-map-index.json ]] || [[ -n "$(find ops/cache/topic-map-index.json -mmin +1440 2>/dev/null)" ]]; then
node ops/scripts/topic-map-index.mjs
fi
file_count=$(ls -1 {vocabulary.notes}/*.md 2>/dev/null | wc -l | tr -d ' ')
node ops/scripts/topic-map-index.mjs
Run this check before proceeding. If stale, regenerate and continue. If current, proceed immediately.
Connection discovery: Use node ops/scripts/vault-search.mjs --mode find-related --note "note title" to find structurally related notes via topic map co-membership and cross-refs. Supplement with rg -il "key-term" notes/ for content-based discovery.
[... remaining reflect content truncated for space - full content preserved in file ...]
When invoked with --handoff, output this structured format at the END of the session. This enables external loops (/ralph) to parse results and update the task queue.
Detection: Check if $ARGUMENTS contains --handoff. If yes, append this block after completing normal workflow.
Handoff format:
=== RALPH HANDOFF: {vocabulary.reflect} ===
Target: [[note name]]
Work Done:
- Discovery: {vocabulary.topic_map} [[moc-name]], query "[query]" (MCP|bash|grep-only), grep "[term]"
- Connections added: N (articulation test: PASS)
- {vocabulary.topic_map} updates: [[moc-name]] Core Ideas section
- Synthesis opportunities: [count or NONE]
Files Modified:
- {vocabulary.notes}/[note name].md (inline links added)
- {vocabulary.notes}/[moc-name].md (Core Ideas updated)
- [task file path] ({vocabulary.reflect} section)
Learnings:
- [Friction]: [description] | NONE
- [Surprise]: [description] | NONE
- [Methodology]: [description] | NONE
- [Process gap]: [description] | NONE
Queue Updates:
- Advance phase: {vocabulary.reflect} -> {vocabulary.reweave}
- Reweave candidates (if any pass filter): [[note]] | NONE (filtered: hub/tension/recent)
=== END HANDOFF ===
When running in handoff mode via /ralph, the prompt includes the task file path. After completing the workflow, update the ## {vocabulary.reflect} section of that task file with:
Critical: The handoff block is OUTPUT, not a replacement for the workflow. Do the full reflect workflow first, update task file, then format results as handoff.
When running interactively (NOT via /ralph), YOU must advance the phase in the queue. /ralph handles this automatically, but interactive sessions do not.
After completing the workflow, advance the phase:
# get timestamp
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# advance phase (current_phase -> next, append to completed_phases)
jq '(.tasks[] | select(.id=="TASK_ID")).current_phase = "{vocabulary.reweave}" |
(.tasks[] | select(.id=="TASK_ID")).completed_phases += ["{vocabulary.reflect}"]' \
ops/queue/queue.json > tmp.json && mv tmp.json ops/queue/queue.json
The handoff block's "Queue Updates" section is not just output — it is your own todo list when running interactively.
After connection finding completes, output the next step based on ops/config.yaml pipeline.chaining mode:
current_phase: "{vocabulary.reweave}"The chaining output uses domain-native command names from the derivation manifest.