using-contextd
Using contextd
Prerequisites: contextd MCP Server
This skill REQUIRES the contextd MCP server.
Before using any contextd tools, verify availability:
- Check for
mcp__contextd__*tools (use ToolSearch if needed) - If tools are NOT available:
- Inform user: "contextd MCP server not configured"
- Suggest: "Run
/contextd:initto configure contextd" - Alternative: Use standard Read/Grep/Glob (no cross-session memory)
Error Handling
| Error | Meaning | Fix |
|---|---|---|
Unknown tool: mcp__contextd__* |
MCP not configured | Run /contextd:init |
Connection refused on port 9090 |
Server not running | Run contextd serve |
Tenant not found |
First use | Will auto-create |
Input Validation Errors
contextd v1.5+ enforces strict input validation. Common errors:
| Error | Cause | Fix |
|---|---|---|
invalid project_path: path contains directory traversal |
Path contains ../ |
Use absolute paths or paths within project |
invalid tenant_id: must be lowercase alphanumeric with underscores |
Invalid characters in ID | Use format: my_project, org123 (1-64 chars) |
invalid project_id: must be lowercase alphanumeric with underscores |
Invalid characters in ID | Same as tenant_id format |
invalid include_patterns: contains dangerous characters |
Shell injection chars in glob | Remove ;, |, `, $ from patterns |
invalid patterns: excessive wildcards |
Pattern like *** |
Use standard globs: *, **, *.go |
Pre-Flight Protocol (MANDATORY)
BEFORE any filesystem operation (Read, Grep, Glob), you MUST:
semantic_search(query, project_path: ".")- Semantic code search with auto grep fallbackmemory_search(project_id, query)- Check past learnings and solutions
Skipping this is a protocol violation.
Core Tools
| Category | Tools | Purpose |
|---|---|---|
| Search | semantic_search, repository_search, repository_index |
Code lookup by meaning |
| Memory | memory_search, memory_record, memory_feedback, memory_outcome |
Cross-session learning |
| Checkpoint | checkpoint_save, checkpoint_list, checkpoint_resume |
Context preservation |
| Remediation | remediation_search, remediation_record, troubleshoot_diagnose |
Error pattern tracking |
| Context Folding | branch_create, branch_return, branch_status |
Isolated sub-tasks |
| Reflection | reflect_analyze, reflect_report |
Behavior pattern analysis |
Health Monitoring (HTTP)
contextd exposes HTTP health endpoints for monitoring vectorstore integrity:
| Endpoint | Purpose | Status Codes |
|---|---|---|
GET /health |
Basic health with metadata summary | 200 OK, 503 Degraded |
GET /api/v1/health/metadata |
Detailed per-collection status | 200 OK |
Graceful Degradation (P0): If corrupt collections are detected, contextd quarantines them and continues operating with healthy collections. Check health status to detect degraded state.
Example health check:
curl -s http://localhost:9090/health | jq
# {"status":"ok","metadata":{"status":"healthy","healthy_count":22,"corrupt_count":0}}
Search Priority
| Priority | Tool | When |
|---|---|---|
| 1st | semantic_search |
Auto-selects best method (indexed or grep fallback) |
| 2nd | memory_search |
Have I solved this before? |
| 3rd | Read/Grep/Glob | Fallback for exact matches only |
Path Validation (contextd v1.5+)
All tools accepting project_path validate paths before use:
- No directory traversal: Paths containing
../are rejected - Affected tools:
semantic_search,repository_index,repository_search,reflect_report - Use absolute paths or paths within the current project directory
The Learning Loop
1. SEARCH at task start (MANDATORY)
semantic_search(query, project_path)
memory_search(project_id, query)
2. DO the work
(apply relevant memories)
3. RECORD at completion
memory_record(project_id, title, content, outcome)
4. FEEDBACK when memories helped
memory_feedback(memory_id, helpful)
Key Concepts
Tenant ID: Derived from git remote (e.g., github.com/fyrsmithlabs/contextd -> fyrsmithlabs). Verify with: git remote get-url origin | sed 's|.*github.com[:/]\([^/]*\).*|\1|'
Project ID: Scopes memories. Use repository name (e.g., contextd) or org_repo format for multi-org.
ID Format Requirements (contextd v1.5+)
Both tenant_id and project_id must follow this format:
- Characters: Lowercase alphanumeric and underscores only (
a-z,0-9,_) - Length: 1-64 characters
- Valid:
my_project,contextd,org123,fyrsmithlabs_marketplace - Invalid:
My-Project(uppercase, hyphen),org/repo(slash),project..name(dots)
Confidence: Memories have scores (0-1) that adjust via feedback. Higher = ranks first.
What to Record
Good memories:
- Non-obvious solutions
- Patterns that apply broadly
- Design decisions with rationale (the WHY)
- Mistakes and why they failed
Skip recording:
- Trivial fixes (typos, syntax)
- Project-specific details (put in CLAUDE.md)
Recording Design Decisions
When design involves significant discussion, capture the WHY:
{
"project_id": "contextd",
"title": "ADR: Registry pattern for DI",
"content": "DECISION: Use Registry interface.\nWHY: Idiomatic Go, single mock for tests.\nREJECTED: Passing individual services (constructor bloat).",
"outcome": "success",
"tags": ["adr", "architecture", "design-decision"]
}
Optional: Conversation Indexing
Index past Claude Code sessions to pre-warm contextd:
# Via /init command
/init --conversations
# What it extracts:
# - Error -> fix patterns (remediations)
# - Learnings (memories)
# - User corrections (policies)
Conversations are scrubbed for secrets before processing.
Common Mistakes
| Mistake | Fix |
|---|---|
| Using Read/Grep before contextd | semantic_search FIRST |
| Not searching at task start | Always memory_search first |
| Forgetting to record learnings | memory_record at task completion |
| Re-solving fixed errors | remediation_search when errors occur |
| Context bloat from sub-tasks | Use branch_create for isolation |
Memory Lifecycle
Temporal Decay & Expiration
Memories have a confidence score (0-1) that decays over time without reinforcement:
| Age | Decay Factor | Result |
|---|---|---|
| < 7 days | 1.0 | Full confidence |
| 7-30 days | 0.9 | Slight decay |
| 30-90 days | 0.7 | Moderate decay |
| > 90 days | 0.5 | Significant decay (but never deleted) |
Boost confidence via:
memory_feedback(memory_id, helpful=true)- Resets decay timer- Memory reuse in solutions - Auto-boosted when applied
Expiration policies:
ttl_days: 365- Auto-archive after 1 year without activitynever_expire: true- For ADRs and critical decisions
Memory Types
| Type | Purpose | Default TTL |
|---|---|---|
learning |
General knowledge gained | 180 days |
remediation |
Error -> fix mappings | 365 days |
decision |
ADR/architecture choices | Never |
failure |
What NOT to do | 365 days |
pattern |
Reusable code patterns | 180 days |
policy |
STRICT constraints | Never |
Tag memories with type: tags: ["type:learning", "category:testing"]
Query Expansion & Fuzzy Matching
Automatic Query Expansion
semantic_search and memory_search automatically expand queries:
| Original Query | Expanded To |
|---|---|
| "auth error" | "auth error", "authentication failure", "login issue", "401", "403" |
| "test fails" | "test fails", "test failure", "assertion error", "spec broken" |
| "slow query" | "slow query", "performance", "N+1", "timeout", "latency" |
Disable expansion: expand_query: false
Fuzzy Matching
Handles typos and variations:
{
"query": "authetication",
"fuzzy_threshold": 0.8, // 0-1, higher = stricter
"fuzzy_max_edits": 2 // Levenshtein distance
}
Results include match quality:
exact- Literal matchsemantic- Meaning matchfuzzy- Typo-tolerant match
Hierarchical Namespaces
Structure project IDs for multi-team organizations:
org/team/project/module
Examples:
fyrsmithlabs/platform/contextd/api
fyrsmithlabs/platform/contextd/vectorstore
fyrsmithlabs/marketplace/fs-dev
Search scopes:
fyrsmithlabs/*- All org memoriesfyrsmithlabs/platform/*- All platform teamfyrsmithlabs/platform/contextd- Specific project
Audit Fields
All memory operations record:
| Field | Description | Auto-set |
|---|---|---|
created_by |
Agent/session that created | Yes |
created_at |
ISO timestamp | Yes |
updated_at |
Last modification | Yes |
usage_count |
Times retrieved in searches | Yes |
last_used_at |
Last retrieval timestamp | Yes |
Query audit data:
{
"query": "authentication",
"include_audit": true
}
Claude Code 2.1 Patterns
Background Task Execution
Use run_in_background: true for long-running searches:
Task(
subagent_type: "general-purpose",
prompt: "Search memories for authentication patterns across all projects",
run_in_background: true
)
// Continue other work...
// Later, collect results:
TaskOutput(task_id, block: true)
Task Dependencies with addBlockedBy
Chain dependent memory operations:
task1 = Task(prompt: "Index repository")
task2 = Task(prompt: "Search indexed code", addBlockedBy: [task1.id])
task3 = Task(prompt: "Record findings", addBlockedBy: [task2.id])
PreToolUse Hook Example
Auto-search memories before any Read operation:
{
"hook_type": "PreToolUse",
"tool_name": "Read",
"prompt": "Before reading {{tool_input.file_path}}, search memories for relevant context about this file or module."
}
PostToolUse Hook Example
Auto-record learnings after successful operations:
{
"hook_type": "PostToolUse",
"tool_name": "Edit",
"condition": "tool_output.success == true",
"prompt": "If this edit fixed a bug or implemented a pattern worth remembering, call memory_record."
}
Event-Driven State Sharing
Skills can share state via memory events:
{
"event": "memory_created",
"filter": {"tags": ["type:decision"]},
"notify": ["consensus-review", "self-reflection"]
}
Subscribe to events:
memory_created- New memory recordedmemory_feedback- Feedback givenremediation_recorded- New fix documentedcheckpoint_saved- State preserved