skill-sources/reduce/SKILL.md
Extract structured knowledge from source material. Comprehensive extraction is the default — every insight that serves the domain gets extracted. For domain-relevant sources, skip rate must be below 10%. Zero extraction from a domain-relevant source is a BUG. Triggers on "/reduce", "/reduce [file]", "extract insights", "mine this", "process this".
npx skillsauth add agenticnotetaking/arscontexta reduceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read these files to configure domain-specific behavior:
ops/derivation-manifest.md — vocabulary mapping, extraction categories, platform hints
vocabulary.notes for the notes folder namevocabulary.inbox for the inbox folder namevocabulary.note for the note type name in outputvocabulary.note_plural for the plural formvocabulary.reduce for the process verb in outputvocabulary.cmd_reflect for the next-phase command namevocabulary.cmd_reweave for the backward-pass command namevocabulary.cmd_verify for the verification command namevocabulary.extraction_categories for domain-specific extraction tablevocabulary.topic_map for MOC/topic map referencesvocabulary.topic_maps for plural formops/config.yaml — processing depth, pipeline chaining, selectivity
processing.depth: deep | standard | quickprocessing.chaining: manual | suggested | automaticprocessing.extraction.selectivity: strict | moderate | permissiveops/queue/queue.json — current task queue (for handoff mode)
If these files don't exist (pre-init invocation or standalone use), use universal defaults:
notes/inbox/You are the extraction engine. Raw source material enters. Structured, atomic {vocabulary.note_plural} exit. Everything between is your judgment — and that judgment must err toward extraction, not rejection.
| Concept | What It Means | Example | |---------|---------------|---------| | Having knowledge | The vault contains information | "We store notes in folders" | | Articulated reasoning | The vault explains WHY something works as a traversable {vocabulary.note} | "folder structure mirrors cognitive chunking because..." |
Having knowledge is not the same as articulating it. Even if information is embedded in the system, the vault may lack the externalized reasoning explaining WHY it works. That reasoning is what you extract.
For domain-relevant sources, COMPREHENSIVE EXTRACTION is the default. This means:
Extract ALL core {vocabulary.note_plural} — direct assertions about the domain that can stand alone as atomic propositions.
Extract ALL evidence and validations — if source confirms an approach, that confirmation IS the {vocabulary.note}. Evidence is extractable even when the conclusion is already known, because the reasoning path matters.
Extract ALL patterns and methods — techniques, workflows, practices. Named patterns are referenceable. Unnamed intuitions are not.
Extract ALL tensions — contradictions, trade-offs, conflicts. These are wisdom, not problems.
Extract ALL enrichments — if source adds detail to existing {vocabulary.note_plural}, create enrichment tasks. Near-duplicates almost always add value.
"We already know this" means we NEED the articulation, not that we should skip it.
"Would a future session benefit from this reasoning being a retrievable {vocabulary.note}?"
If YES -> extract to appropriate category If NO -> verify it is truly off-topic before skipping
For domain-relevant sources: skip rate < 10%. Zero extraction = BUG.
Target: $ARGUMENTS
Parse immediately:
--handoff: output RALPH HANDOFF block + task entries at endExecute these steps:
mcp__qmd__vector_search with query "[claim as sentence]", collection="{vocabulary.notes_collection}", limit=5qmd vsearch "[claim as sentence]" --collection {vocabulary.notes_collection} -n 5--handoff in target: create per-claim task files, update queue, output RALPH HANDOFF blockSTART NOW. Reference below explains methodology — use to guide, not as output.
When you encounter friction, surprises, methodology insights, process gaps, or contradictions — capture IMMEDIATELY:
| Observation | Action |
|-------------|--------|
| Any observation | Create atomic note in ops/observations/ with prose-sentence title |
| Tension: content contradicts existing {vocabulary.note} | Create atomic note in ops/tensions/ with prose-sentence title |
The handoff Learnings section summarizes what you ALREADY logged during processing.
Extract composable {vocabulary.note_plural} from source material into {vocabulary.notes}/.
Extract the REASONING behind what works, not just observations about what works.
This is the extraction phase of the pipeline. You receive raw content and extract insights that serve the vault's domain. The mission is building externalized, retrievable reasoning — a graph of atomic propositions that can be traversed, connected, and built upon.
THE CORE DISTINCTION:
| Concept | Example | What to Extract | |---------|---------|-----------------| | We DO this | "We tag notes with topics" | — (not sufficient) | | We explain WHY | "topic tagging enables cross-domain navigation because..." | This |
The vault is not just an implementation. It is the articulated argument for WHY the implementation works.
THE EXTRACTION QUESTION:
If YES -> extract to appropriate category (even if "we already know this") If NO -> skip (RARE for domain-relevant sources — verify it is truly off-topic)
THE RULE: Implementation without articulation is incomplete. If we DO something but lack a {vocabulary.note} explaining WHY it works, that articulation needs extraction.
{DOMAIN:extraction_categories}
The structural invariant: Every domain's extraction has these universal categories regardless of domain:
| Category | What to Find | Output Type | Gate Required? | |----------|--------------|-------------|----------------| | Core domain {vocabulary.note_plural} | Direct assertions about {vocabulary.domain} | {vocabulary.note} | NO | | Patterns | Recurring structures across sources | {vocabulary.note} | NO | | Comparisons | How different approaches compare, X vs Y, trade-offs | {vocabulary.note} | NO | | Tensions | Contradictions, conflicts, unresolved trade-offs | tension note | NO | | Anti-patterns | What breaks, what to avoid, failure modes | problem note | NO | | Enrichments | Content that adds detail to existing {vocabulary.note_plural} | enrichment task | NO | | Open questions | Unresolved questions worth tracking | {vocabulary.note} (open) | NO | | Implementation ideas | Techniques, workflows, features to build | methodology note | NO | | Validations | Evidence confirming an approach works | {vocabulary.note} | NO | | Off-topic general content | Insight unrelated to {vocabulary.domain} | apply selectivity gate | YES |
IMPORTANT: Categories 1-9 bypass the selectivity gate. They extract directly to the appropriate output type. The selectivity gate exists ONLY for filtering off-topic content from general sources.
Hunt for these signals in every source:
Core domain signals:
Comparison signals:
Tension signals:
Anti-pattern signals:
Enrichment signals:
Implementation signals:
Validation signals:
For EVERY candidate, ask: "Does this serve {vocabulary.domain}?"
For domain-relevant sources: almost everything is YES. The gate barely applies. Skip rate < 10%.
CRITICAL: This gate exists to filter OUT content that does not serve {vocabulary.domain}. It applies ONLY to standard claims from GENERAL (off-topic) sources.
Do NOT use gate to reject:
For STANDARD claims from general sources, verify all four criteria pass:
The claim is understandable without source context. Someone reading this {vocabulary.note} cold can grasp what it argues without needing to know where it came from.
Fail: "the author's third point about methodology" Pass: "explicit structure beats implicit convention"
This {vocabulary.note} would be linked FROM elsewhere. {vocabulary.note_plural} function as APIs. If you cannot imagine writing since [[this claim]]... in another {vocabulary.note}, it is not composable.
Fail: a summary of someone's argument Pass: a claim you could invoke while building your own argument
Not already captured in the vault. Semantic duplicate check AND existing {vocabulary.note_plural} scan both clear.
Fail: semantically equivalent to an existing {vocabulary.note} Pass: genuinely new angle not yet articulated
Relates to existing thinking in the vault. Isolated insights that do not connect to anything are orphans. They rot.
Fail: interesting observation about unrelated domain Pass: extends, contradicts, or deepens existing {vocabulary.note_plural}
If ANY criterion fails: do not extract.
Before reading the source, understand what already exists:
# Get descriptions from existing notes
for f in {vocabulary.notes}/*.md; do
[[ -f "$f" ]] && echo "=== $(basename "$f" .md) ===" && rg "^description:" "$f" -A 0
done
Scan descriptions to understand current {vocabulary.note_plural}. This prevents duplicate extraction and helps identify connection points and enrichment opportunities.
Read the ENTIRE source. Understand what it contains, what it argues, what domain it serves.
Planning the extraction:
Explicit signal phrases to hunt:
Implicit signals (the best insights often hide in):
What you are hunting:
STOP. Before ANY filtering, determine the category of each candidate.
This is the critical step that prevents over-rejection. Categorize FIRST, then route to the appropriate extraction path.
| Category | How to Identify | Route To | |----------|-----------------|----------| | Core domain {vocabulary.note} | Direct assertion about {vocabulary.domain} | -> {vocabulary.note} (SKIP selectivity gate) | | Implementation idea | Describes a feature, tool, system, or workflow to build | -> methodology note (SKIP selectivity gate) | | Tension/challenge | Describes a conflict, risk, or trade-off | -> tension note (SKIP selectivity gate) | | Validation | Evidence confirming an approach works | -> {vocabulary.note} (SKIP selectivity gate) | | Near-duplicate | Semantic search finds related vault {vocabulary.note} | -> evaluate for enrichment task | | Off-topic claim | General insight not about {vocabulary.domain} | -> apply selectivity gate |
CRITICAL: Implementation ideas, tensions, validations, and domain {vocabulary.note_plural} do NOT need to pass the 4-criterion selectivity gate. The gate is for off-topic filtering ONLY.
Why this matters: The selectivity gate was designed for filtering general insights. But implementation ideas ("build a trails feature"), tensions ("optimization vs readability trade-off"), and validations ("research confirms our approach") are DIFFERENT output types that serve different purposes. Applying the selectivity gate to them is a category error.
For each candidate, run duplicate detection:
mcp__qmd__vector_search query="[proposed claim as sentence]" collection="{vocabulary.notes_collection}" limit=5
If MCP is unavailable, run:
qmd vsearch "[proposed claim as sentence]" --collection {vocabulary.notes_collection} -n 5
If qmd CLI is unavailable, fall back to keyword grep duplicate checks.
Why vector_search (vector semantic) instead of keyword search: Duplicate detection is where keyword search fails hardest. A claim about "friction in systems" will not find "resistance to change" via keyword matching even though they may be semantic duplicates. Vector search (~5s) catches same-concept-different-words duplicates that keyword search misses entirely. For a batch of 30-50 candidates, this adds ~3 minutes total — worth it to catch duplicates early rather than discovering them during {vocabulary.cmd_reflect}.
Scores are signals, not decisions. For ANY result with a relevant title or snippet:
The Enrichment Judgment (DEFAULT TO ENRICHMENT):
| Situation | Action | |-----------|--------| | Exact text already exists | SKIP (truly identical — RARE) | | Same claim, different words, source adds nothing | SKIP (verify by re-reading existing {vocabulary.note}) | | Same claim, source has MORE detail/examples/framing | -> ENRICHMENT TASK (update existing {vocabulary.note}) | | Same topic, DIFFERENT claim | -> EXTRACT as new {vocabulary.note}, flag for cross-linking | | Related mechanism, different scope | -> EXTRACT as new {vocabulary.note}, flag for cross-linking |
DEFAULT TO ENRICHMENT. If source mentions the same topic, it almost certainly adds something. Truly identical content is RARE.
MANDATORY protocol when semantic search finds overlap:
Near-duplicates are opportunities, not rejections. Creating enrichment tasks is CORRECT behavior. If you are skipping near-duplicates without enrichment tasks, you are probably wrong.
Every extracted candidate gets classified:
Classification affects downstream handling but does NOT affect whether to extract. Both open and closed candidates get extracted.
Report what you found by category. Include counts:
Extraction scan complete.
SUMMARY:
- {vocabulary.note_plural}: N
- implementation ideas: N
- tensions: N
- enrichment tasks: N
- validations: N
- open questions: N
- skipped: N
- TOTAL OUTPUTS: N
---
CLAIMS ({vocabulary.note_plural}):
1. [claim as sentence] — connects to [[existing note]]
2. [claim as sentence] — extends [[existing note]]
...
IMPLEMENTATION IDEAS (methodology notes):
1. [feature/pattern] — what it enables, why it matters
...
TENSIONS (tension notes):
1. [X vs Y] — the conflict, why it matters
...
ENRICHMENT TASKS (update existing {vocabulary.note_plural}):
1. [[existing note]] — source adds [what is missing]
...
SKIPPED (truly nothing to add):
- [description] — why nothing extractable
Wait for user approval before creating files. Never auto-extract.
For each approved {vocabulary.note}:
a. Craft the title
The title IS the claim. Express the concept in exactly the words that capture it.
Test: "this {vocabulary.note} argues that [title]"
Good: "explicit structure beats implicit convention for agent navigation" Good: "small differences compound through repeated selection" Bad: "context management strategies" (topic label, not a claim)
b. Write the {vocabulary.note}
---
description: [~150 chars elaborating the claim, adds info beyond title]
type: [claim | methodology | problem | learning | tension]
created: YYYY-MM-DD
[domain-specific fields from derivation-manifest]
---
# [prose-as-title proposition]
[Body: 150-400 words showing reasoning]
Use connective words: because, but, therefore, which means, however.
Acknowledge uncertainty where appropriate.
Consider the strongest counterargument.
Show the path to the conclusion, not just the conclusion.
---
Source: [[source filename]]
Relevant Notes:
- [[related claim]] — [why it relates: extends, contradicts, builds on]
Topics:
- [[relevant {vocabulary.topic_map}]]
c. Verify before writing
d. Create the file
Write to: {vocabulary.notes}/[title].md
For sources exceeding 2500 lines: chunk processing is MANDATORY.
Context degrades as it fills. A single-pass extraction of a 3000-line source will miss insights in the later sections because your attention has degraded by the time you reach them. Chunking ensures each section gets fresh attention.
| Source Size | Chunk Count | Chunk Size | Rationale | |-------------|------------|------------|-----------| | 2500-4000 lines | 3-4 chunks | 700-1200 lines | Standard chunking | | 4000-6000 lines | 4-5 chunks | 800-1200 lines | Balanced attention | | 6000+ lines | 5+ chunks | 1000-1500 lines | Prevent context overflow |
Chunk boundaries: Split at natural section breaks (headings, topic transitions). Never split mid-paragraph or mid-argument. A chunk should be a coherent unit of content.
| Depth (from config) | Chunking Behavior | |---------------------|-------------------| | deep | Fresh context per chunk (spawn subagent per chunk if platform supports). Maximum quality. | | standard | Process chunks sequentially in current session. Reset orientation between chunks. | | quick | Larger chunks (1500-2000 lines). Fewer, faster passes. |
When processing in chunks:
The anti-pattern: Processing chunk 3 and extracting a duplicate of something already extracted in chunk 1 because you lost track. Maintain the running list.
When source content adds value to an EXISTING {vocabulary.note} rather than creating a new one, create an enrichment task instead.
| Signal | Action | |--------|--------| | Source has better examples for an existing {vocabulary.note} | Enrichment: add examples | | Source has deeper framing or context | Enrichment: strengthen reasoning | | Source has citations or evidence | Enrichment: add evidence base | | Source has a different angle on the same claim | Enrichment: add perspective | | Source has concrete implementation details | Enrichment: add actionable specifics |
Each enrichment task specifies:
The enrichment default: When in doubt between "new {vocabulary.note}" and "enrichment to existing {vocabulary.note}", lean toward enrichment. The existing {vocabulary.note} already has connections, {vocabulary.topic_map} placement, and integration. Adding to it compounds existing value.
If you catch yourself doing ANY of these, STOP IMMEDIATELY and recalibrate:
"validates existing approach" as skip reason
"already captured in system config" as skip reason
"we already do this" as skip reason
"obvious" or "well known" as skip reason
Treating near-duplicates as skips instead of enrichments
Before skipping ANYTHING, ask: "Would a future session benefit from this being a retrievable {vocabulary.note}?"
If YES -> extract (even if "we already know this") If NO -> verify it is truly off-topic or literally identical to existing content
STOP before outputting results. Count your outputs by category:
{vocabulary.note_plural} extracted: ?
implementation ideas: ?
tensions: ?
enrichment tasks: ?
validations: ?
open questions: ?
truly skipped: ?
TOTAL: ?
Expected yields by source size:
| Source Size | Expected Outputs | Skip Rate | |-------------|------------------|-----------| | ~100 lines | 5-10 outputs | varies by relevance | | ~350 lines | 15-30 outputs | < 10% for domain-relevant | | ~500+ lines | 25-50+ outputs | < 10% for domain-relevant | | ~1000+ lines | 40-70 outputs | < 5% for domain-relevant |
Zero extraction from a domain-relevant source is a BUG.
If your total outputs are significantly below these ranges, you are over-filtering.
Processing selectivity adapts based on ops/config.yaml:
| Selectivity (config) | Gate Behavior | Skip Rate Target | |----------------------|---------------|-----------------| | strict | 4-criterion gate applies to ALL claims including domain-relevant | Higher skip rate acceptable | | moderate (default) | Gate applies only to off-topic content. Domain-relevant bypasses gate | < 10% for domain sources | | permissive | Gate barely applies. Extract nearly everything, heavy enrichment | < 5% overall |
Strict mode is for mature vaults where noise reduction matters more than coverage. Permissive mode is for new vaults building initial density. Moderate is the default — comprehensive extraction for domain content, selective for off-topic.
Go back through candidates you marked as "duplicate" or "rejected":
Did any "duplicates" have source content that enriches existing {vocabulary.note_plural}?
Did any "rejected" items describe features to build?
Did any "rejected" items describe conflicts or challenges?
Did any "rejected" items provide evidence for existing approaches?
Did any "rejected" items suggest questions worth investigating?
Do not proceed with handoff until low yield is investigated.
Titles are claims that work as prose when linked:
since [[explicit structure beats implicit convention]], the question becomes...
the insight is that [[small differences compound through repeated selection]]
because [[capture speed beats filing precision]], we separate the two...
The claim test: "this {vocabulary.note} argues that [title]"
| Example | Passes? | |---------|---------| | quality requires active judgment | yes: "argues that quality requires active judgment" | | knowledge management | no: "argues that knowledge management" (incomplete) | | small differences compound through selection | yes: "argues that small differences compound through selection" | | tools for thought | no: "argues that tools for thought" (incomplete) |
One field. ~150 characters. Must add NEW information beyond the title — scope, mechanism, or implication.
Bad (restates title): "quality is important in knowledge work" Good (adds mechanism + implication): "when creation becomes trivial, maintaining signal-to-noise becomes the primary challenge — selection IS the work"
The description is progressive disclosure: title says WHAT the claim is, description says WHY it matters or HOW it works. If the description just rephrases the title, it wastes context and provides no filter value.
Show reasoning. Use connective words. Acknowledge uncertainty.
Bad:
Quality matters. When creation is easy, curation becomes the work.
Good:
The easy part is capture. We bookmark things, save screenshots, clip articles we never open again. The hard part is doing something with it all. Automation makes this worse because generation is now trivial — anyone can produce endless content. So the constraint shifts from production to selection. Since [[structure without processing provides no value]], the question becomes: who does the selecting?
Characteristics:
Headings serve navigation, not decoration. Use when agents would benefit from grepping the outline.
Always use headings for:
Use prose without headings for:
---
Source: [[source filename]]
Relevant Notes:
- [[related claim]] — extends this by adding the temporal dimension
Topics:
- [[relevant {vocabulary.topic_map}]]
The relationship context explains WHY to follow the link:
Before finalizing ANY {vocabulary.note}, verify:
1. Standalone Sense If you link to this {vocabulary.note} from another context, will it make sense without reading three other {vocabulary.note_plural} first?
2. Specificity Could someone disagree with this claim? Vague {vocabulary.note_plural} cannot be built on.
3. Clean Linking Would linking to this {vocabulary.note} drag unrelated content along? If yes, the {vocabulary.note} covers too much.
When to skip: content does not pass all four selectivity criteria (off-topic content only) When to split: multiple distinct claims in one extraction When to sharpen: claim too vague, title is label not statement
When the source file contains provenance metadata (source_type, research_prompt, research_server, generated), preserve the chain:
If source has source_type in frontmatter, this is research-generated content — handle with extra care for attribution.
Provenance fields to preserve:
| Field | Purpose | |-------|---------| | source_type | How this content was generated | | research_prompt | The query or directive that produced this content | | research_server | Which research tool was used | | generated | When the research was produced |
The research_prompt is the most critical field — it captures the intellectual context that shaped what was returned. Knowing "I searched for X because I was exploring Y" is part of the knowledge graph.
Source: 300-line research document directly relevant to {vocabulary.domain}
Scan found: ~45 items across sections
Extraction results:
Total: 30 outputs, 3 skipped (~9% skip rate)
Source: 100-line article with partial relevance to {vocabulary.domain}
Extraction results:
Total: 5 outputs, 5 skipped (50% skip rate — acceptable for general source)
Never auto-extract. Always present findings and wait for user approval.
When in doubt, extract. For domain-relevant sources, err toward capturing. Implementation ideas, tensions, validations, open questions, and near-duplicates all have value — they become different output types, not rejections.
The principle: the goal is to capture everything relevant to {vocabulary.domain}. For domain-relevant sources, that is MOST of the content. The selectivity gate exists for OFF-TOPIC filtering, not for rejecting on-mission content that happens to have a different form.
Remember:
For domain-relevant sources: skip rate < 10%. Zero extraction = BUG.
When invoked with --handoff, this skill handles queue management for orchestrated execution. This includes creating per-claim task files and updating the task queue.
Detection: Check if $ARGUMENTS contains --handoff.
After extraction, for EACH claim, create a task file in ops/queue/:
Filename: {source}-NNN.md where:
next_claim_start in the extract task fileExample: If article-name.md task has next_claim_start: 010, claims are:
article-name-010.md, article-name-011.md, etc.Why unique names: Claim filenames must be unique across the entire vault. Claim numbers are global and never reused across batches. The pattern {source}-NNN.md ensures every claim file is uniquely identifiable even after archiving.
Structure:
---
claim: "[the claim as a sentence]"
classification: closed | open
source_task: [source-basename]
semantic_neighbor: "[related note title]" | null
---
# Claim NNN: [claim title]
Source: [[source filename]] (lines NNN-NNN)
## Reduce Notes
Extracted from [source_task]. This is a [CLOSED/OPEN] claim.
Rationale: [why this claim was extracted, what it contributes]
Semantic neighbor: [if found, explain why DISTINCT not DUPLICATE]
---
## Create
(to be filled by create phase)
## {vocabulary.cmd_reflect}
(to be filled by {vocabulary.cmd_reflect} phase)
## {vocabulary.cmd_reweave}
(to be filled by {vocabulary.cmd_reweave} phase)
## {vocabulary.cmd_verify}
(to be filled by {vocabulary.cmd_verify} phase)
For each ENRICHMENT detected, create a task file in ops/queue/:
Filename: {source}-EEE.md where:
Example: If claims are 010-015, enrichments start at 016.
Why unique names: Enrichments share the numbering system with claims. Both use the global next_claim_start counter. This ensures every task file is uniquely identifiable across the entire vault.
Structure:
---
type: enrichment
target_note: "[[existing note title]]"
source_task: [source-basename]
addition: "what to add from source"
source_lines: "NNN-NNN"
---
# Enrichment EEE: [[existing note title]]
Source: [[source filename]] (lines NNN-NNN)
## Reduce Notes
Enrichment for [[existing note title]]. Source adds [what it adds].
Rationale: [why this enriches rather than duplicates]
---
## Enrich
(to be filled by enrich phase)
## {vocabulary.cmd_reflect}
(to be filled by {vocabulary.cmd_reflect} phase)
## {vocabulary.cmd_reweave}
(to be filled by {vocabulary.cmd_reweave} phase)
## {vocabulary.cmd_verify}
(to be filled by {vocabulary.cmd_verify} phase)
After creating task files, update ops/queue/queue.json:
"status": "done" with completion timestamp{
"id": "claim-NNN",
"type": "claim",
"status": "pending",
"target": "[claim title]",
"classification": "closed|open",
"batch": "[source-basename]",
"file": "[source-basename]-NNN.md",
"created": "[ISO timestamp]",
"current_phase": "create",
"completed_phases": []
}
{
"id": "enrich-EEE",
"type": "enrichment",
"status": "pending",
"target": "[existing note title]",
"source_detail": "[what to add]",
"batch": "[source-basename]",
"file": "[source-basename]-EEE.md",
"created": "[ISO timestamp]",
"current_phase": "enrich",
"completed_phases": []
}
Critical queue rules:
current_phase and completed_phasestype is "claim" or "enrichment" — these are the task's single queue entries"file" pointing to its uniquely-named task file"batch" identifying which source batch it belongs toclaim-NNN or enrich-EEE format with the global claim numbercurrent_phase starts at "create" for claims, "enrich" for enrichmentsnext_claim_start value in the extract task file (set by /seed)After creating files and updating queue, output:
=== RALPH HANDOFF: reduce ===
Target: [source file]
Work Done:
- Extracted N claims from [source]
- Created claim files: {source}-NNN.md through {source}-NNN.md
- Created M enrichment files: {source}-EEE.md through {source}-EEE.md (if any)
- Duplicates skipped: [list or "none"]
- Semantic neighbors flagged for cross-linking: [list or "none"]
Files Modified:
- ops/queue/{source}-NNN.md (claim files)
- ops/queue/{source}-EEE.md (enrichment files, if any)
- ops/queue/queue.json (N claim tasks + M enrichment tasks, 1 entry each)
Learnings:
- [Friction]: [description] | NONE
- [Surprise]: [description] | NONE
- [Methodology]: [description] | NONE
- [Process gap]: [description] | NONE
Queue Updates:
- Mark: {source} done
- Create: claim-NNN entries (1 per claim, current_phase: "create")
- Create: enrich-EEE entries (1 per enrichment, current_phase: "enrich", if any)
=== END HANDOFF ===
Critical: The handoff mode adds queue management ON TOP of the standard reduce workflow. Do the full extraction workflow first, then create task files, update queue, and output handoff.
When running interactively (NOT via orchestrator), YOU must execute the queue updates. The orchestrator parses the handoff block and handles this automatically, but interactive sessions do not.
After completing extraction, update the queue:
# Get timestamp
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Mark extract task done (replace TASK_ID with actual task ID)
jq '(.tasks[] | select(.id=="TASK_ID")).status = "done" | (.tasks[] | select(.id=="TASK_ID")).completed = "'"$TIMESTAMP"'"' 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.
When processing content, route to the correct skill:
| Task Type | Required Skill | Why | |-----------|---------------|-----| | New content to process | /{vocabulary.reduce} | Extraction requires quality gates | | {vocabulary.note} just created | /{vocabulary.cmd_reflect} | New {vocabulary.note_plural} need connections | | After connecting | /{vocabulary.cmd_reweave} | Old {vocabulary.note_plural} need updating | | Quality check | /{vocabulary.cmd_verify} | Combined verification gate | | System health | /health | Systematic diagnostics |
After extraction completes, output the next step based on ops/config.yaml pipeline chaining mode:
ops/queue/queue.json with current_phase: "create" and completed_phases: []The chaining output uses domain-native command names from the derivation manifest.
tools
Apply plugin knowledge base updates to an existing generated system. Consults the Ars Contexta research graph for methodology improvements, proposes skill upgrades with research justification. Never auto-implements. Triggers on "/upgrade", "upgrade skills", "check for improvements", "update methodology".
documentation
Interactive walkthrough for new users. Learn by doing — each step creates real content in your vault. Three tracks (researcher, manager, personal) with a universal learning arc. Triggers on "/tutorial", "walk me through", "how do I use this".
testing
Scaffold a complete knowledge system. Detects platform, conducts conversation, derives configuration, generates everything. Validates against 15 kernel primitives. Triggers on "/setup", "/setup --advanced", "set up my knowledge system", "create my vault".
testing
Re-derive your knowledge system from first principles when structural drift accumulates. Analyzes dimension incoherence, vocabulary mismatch, boundary dissolution, and template divergence. Preserves all content while restructuring architecture.