Every document filename now mirrors its lifecycle state with a status suffix (e.g., .draft.md, .wip.md, .accepted.md). No more bare .md for tracked document types. Also renamed all from_str methods to parse to avoid FromStr trait confusion, introduced StagingDeploymentParams struct, and fixed all 19 clippy warnings across the codebase. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
15 KiB
Spike: Context Injection Mechanisms from coherence-mcp
| Date | 2026-01-25 |
| Time-box | 2 hours |
| Status | Complete |
| Outcome | 7 mechanisms designed; 4 implemented, 3 ready for RFC |
Question
How does coherence-mcp inject functionality into Claude Code sessions without relying on files in ~/.claude/? How can we bring these capabilities into Blue?
Investigation
Explored coherence-mcp codebase focusing on:
- Installer module and hook setup
- MCP server resource/prompt capabilities
- Bootstrap and worktree context patterns
- Session lifecycle management
Findings
1. MCP Server Registration (Already in Blue ✅)
Installation modifies ~/.claude.json to register the MCP server.
Status: Blue already does this via install.sh.
2. Session Hooks (Now Implemented ✅)
coherence-mcp installs hooks to ~/.claude/hooks.json.
Implementation: install.sh now configures hooks automatically:
jq --arg blue_root "$BLUE_ROOT" \
'.hooks.SessionStart.command = ($blue_root + "/hooks/session-start") |
.hooks.SessionEnd.command = ($blue_root + "/target/release/blue session-end") |
.hooks.PreToolUse.command = ($blue_root + "/target/release/blue session-heartbeat") |
.hooks.PreToolUse.match = "blue_*"' \
"$HOOKS_FILE"
| Hook | Command | Purpose |
|---|---|---|
SessionStart |
blue/hooks/session-start |
Inject knowledge + register session |
SessionEnd |
blue session-end |
Clean up session record |
PreToolUse |
blue session-heartbeat |
Keep session alive (match: blue_*) |
3. Knowledge Injection via Hook (Now Implemented ✅)
New mechanism not in original coherence-mcp: Private knowledge documents injected via SessionStart hook.
Architecture:
Any Repo (cwd) Blue Repo (fixed location)
┌─────────────────┐ ┌─────────────────────────────┐
│ fungal-image- │ │ /path/to/blue │
│ analysis/ │ │ │
│ │ SessionStart │ hooks/session-start ────────┤
│ │ ────────────→ │ knowledge/alignment-measure │
│ │ │ knowledge/... (future) │
│ │ ←─────────── │ │
│ │ stdout │ │
└─────────────────┘ (injected) └─────────────────────────────┘
How it works:
- Hook script reads from
blue/knowledge/*.md - Outputs content wrapped in
<blue-knowledge>tags - Claude Code captures stdout as
<system-reminder> - Content injected into Claude's context for that session
Files created:
hooks/session-start- Shell script that injects knowledgeknowledge/alignment-measure.md- ALIGNMENT scoring framework
Phase progression:
| Phase | Source | Command |
|---|---|---|
| Now | blue/knowledge/*.md |
cat in hook script |
| Future | ~/.blue/knowledge.db |
blue knowledge get --decrypt |
4. MCP Resources for Autocomplete (Not Yet Implemented ❌)
coherence-mcp exposes documents as MCP resources for @ autocomplete.
Blue should expose:
blue://rfc/{title} # RFC documents
blue://rfc/{title}/plan # RFC plan documents
blue://spike/{title} # Spike investigations
blue://adr/{number} # Architecture Decision Records
blue://prd/{title} # Product Requirements Documents
blue://pattern/{name} # Pattern specifications
blue://dialogue/{title} # Alignment dialogues
blue://contract/{name} # Component contracts (.blue/contracts/)
blue://knowledge/{name} # Private knowledge docs
Gap: Blue has no MCP resource implementation yet.
Priority: Medium - would improve discoverability and allow @blue://rfc/... references.
5. Bootstrap Pattern (No Longer Needed ✅)
Each coherence-mcp project includes a bootstrap context file.
Original gap: Blue had CLAUDE.md but only in the Blue repo itself.
Solution: Replaced by injection mechanism:
- Global knowledge: Injected from
blue/knowledge/*.md - Project workflow: Injected from
.blue/workflow.md(if exists in project) - Team visibility:
.blue/workflow.mdis committed to git
Projects can create .blue/workflow.md with project-specific guidance:
# Project Workflow
This project uses feature branches off `main`.
RFCs should reference the product roadmap in `/docs/roadmap.md`.
Run `npm test` before committing.
This file gets injected via SessionStart hook automatically.
Workflow Creation Assistance:
Two mechanisms help users create .blue/workflow.md:
-
Hint in
blue_status: When workflow.md is missing, status returns:{ "hint": "No .blue/workflow.md found. Ask me to help set up project workflow." } -
Knowledge injection:
knowledge/workflow-creation.mdteaches Claude how to:- Analyze project structure (Cargo.toml, package.json, etc.)
- Ask clarifying questions (branching, CI, test requirements)
- Generate customized workflow.md via Write tool
No dedicated MCP tool needed - Claude handles creation conversationally.
6. Worktree Context Injection (Design Updated ✅)
coherence-mcp injects CLAUDE.md files into worktrees.
Blue approach: Use knowledge injection instead of CLAUDE.md files.
When SessionStart detects we're in a worktree (.blue/worktree.json exists), inject:
- RFC title and summary
- Current phase
- Success criteria
- Linked documents
# In hooks/session-start
if [ -f ".blue/worktree.json" ]; then
# Extract RFC info and inject as context
"$BLUE_ROOT/target/release/blue" worktree-context
fi
Advantages over CLAUDE.md:
- No file clutter in worktrees
- Context stays fresh (read from RFC, not static file)
- Consistent with other injection patterns
- RFC changes automatically reflected
7. Activity Detection (Design Updated ✅)
coherence-mcp tracks activity levels via heartbeat.
Status: Blue has session tracking and heartbeat via PreToolUse hook.
Hybrid Approach (recommended):
┌─────────────────────────────────────────────────────────────┐
│ Activity Detection │
│ │
│ Primary: Heartbeat │
│ ├── PreToolUse hook → blue session-heartbeat │
│ ├── Detects worktree → links to RFC │
│ └── Updates session.last_heartbeat + rfc.last_activity │
│ │
│ Fallback: Git (when no recent heartbeat) │
│ ├── Check worktree for uncommitted changes │
│ └── Check branch for recent commits │
└─────────────────────────────────────────────────────────────┘
Activity Levels:
| Level | Condition | Icon |
|---|---|---|
| ACTIVE | Heartbeat <5 min | 🟢 |
| RECENT | Activity <30 min | 🟡 |
| STALE | No activity >24h | 🟠 |
| CHANGES | Uncommitted changes (git fallback) | 🔵 |
Tool Integration:
| Tool | Behavior |
|---|---|
blue_status |
Shows activity level per RFC |
blue_next |
Skips ACTIVE RFCs, prioritizes STALE |
blue_worktree_create |
Warns if RFC already active elsewhere |
Implementation:
- Schema: Add
last_activity TEXTto RFCs table - Heartbeat: Detect worktree via
.blue/worktree.json, update linked RFC - Activity function: Calculate level from timestamps, git fallback
- Integration: Update
blue_status/blue_nextto show/use activity levels
Implementation Summary
Completed
| Item | Files | Description |
|---|---|---|
| Session Hooks | install.sh |
Auto-configures ~/.claude/hooks.json |
| Global Knowledge Injection | hooks/session-start |
Injects knowledge/*.md on SessionStart |
| Project Workflow Injection | hooks/session-start |
Injects .blue/workflow.md from current project |
| ALIGNMENT Framework | knowledge/alignment-measure.md |
Scoring guidance for Claude |
| Workflow Creation Guide | knowledge/workflow-creation.md |
Teaches Claude to help create workflow.md |
| Bootstrap Pattern | (superseded) | Replaced by injection - no separate template needed |
| Worktree Context Design | (in spike) | Use injection instead of CLAUDE.md files |
| Activity Detection Design | (in spike) | Hybrid: heartbeat + git fallback |
| Branch/Worktree Naming | (in spike) | Configurable prefix, default feature/ |
Remaining Implementation
| Item | Priority | Notes |
|---|---|---|
| MCP Resources | Medium | blue:// autocomplete for RFCs, PRDs, patterns, dialogues, contracts, plans |
| Worktree Context Injection | Medium | blue worktree-context command |
| Activity Detection | Medium | Hybrid heartbeat + git fallback, update status/next |
| Branch/Worktree Naming | Medium | Configurable prefix (default feature/), context enforcement |
blue_status workflow hint |
Low | Hint when .blue/workflow.md missing |
| Encrypted Storage | Future | SQLite with AES-256-GCM |
Updated Gap Analysis
| Mechanism | coherence-mcp | Blue | Status |
|---|---|---|---|
| MCP Server Registration | ✅ | ✅ | Done |
| Session Hooks | ✅ | ✅ | Implemented |
| Global Knowledge Injection | ❌ | ✅ | New in Blue |
| Project Workflow Injection | ❌ | ✅ | New in Blue (.blue/workflow.md) |
| MCP Resources | ✅ | ❌ | Not yet |
| Bootstrap Pattern | ✅ | ✅ | Superseded by injection |
| Worktree Context | ✅ (CLAUDE.md) | ✅ (injection) | Designed |
| Activity Detection | ✅ | ✅ | Designed (hybrid: heartbeat + git fallback) |
Remaining RFCs
RFC 0016: MCP Resources
Implement in crates/blue-mcp/src/server.rs:
// In initialize response
"capabilities": { "resources": {} }
// New handlers
"resources/list" => handle_resources_list()
"resources/read" => handle_resources_read(uri)
Resources to expose:
| URI Pattern | Description |
|---|---|
blue://rfc/{title} |
RFC documents |
blue://rfc/{title}/plan |
RFC plan documents |
blue://spike/{title} |
Spike investigations |
blue://adr/{number} |
Architecture Decision Records |
blue://prd/{title} |
Product Requirements Documents |
blue://pattern/{name} |
Pattern specifications |
blue://dialogue/{title} |
Alignment dialogues |
blue://contract/{name} |
Component contracts (.blue/contracts/) |
blue://knowledge/{name} |
Private knowledge docs |
Autocomplete example:
@blue://rfc/alignment-dialogue-architecture
@blue://pattern/alignment-dialogue
@blue://prd/semantic-index
Implementation:
fn handle_resources_list(&self) -> Result<Vec<Resource>> {
let mut resources = vec![];
// RFCs
for rfc in self.state.rfcs()? {
resources.push(Resource {
uri: format!("blue://rfc/{}", rfc.slug()),
name: rfc.title.clone(),
mime_type: Some("text/markdown".into()),
});
if rfc.has_plan() {
resources.push(Resource {
uri: format!("blue://rfc/{}/plan", rfc.slug()),
name: format!("{} (Plan)", rfc.title),
mime_type: Some("text/markdown".into()),
});
}
}
// PRDs, patterns, dialogues, etc.
// ...
Ok(resources)
}
RFC 0017: Encrypted Knowledge Storage (Future)
Migrate from plaintext knowledge/*.md to encrypted SQLite:
CREATE TABLE knowledge (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
content_encrypted BLOB, -- AES-256-GCM
content_hash TEXT, -- SHA-256 integrity
created_at TEXT,
updated_at TEXT
);
Access via:
blue knowledge get alignment-measure --decrypt
Hook would call this instead of cat:
# Phase 2: Encrypted storage
"$BLUE_ROOT/target/release/blue" knowledge get alignment-measure --decrypt
Conclusion
Blue now exceeds coherence-mcp for context injection:
| Feature | coherence-mcp | Blue |
|---|---|---|
| Session hooks | ✅ | ✅ |
| Activity tracking | ✅ | ✅ (hybrid design) |
| Global knowledge injection | ❌ | ✅ |
| Project workflow injection | ❌ | ✅ |
| Worktree context | ✅ (CLAUDE.md) | ✅ (injection design) |
| Bootstrap pattern | ✅ (manual) | ✅ (superseded by injection) |
What Blue adds:
- Private knowledge docs injected from
blue/knowledge/(not in~/.claude/) - Project-specific workflow from
.blue/workflow.md(committed to git, auto-injected) - Worktree context via injection (no CLAUDE.md clutter)
- Workflow creation assistance via injected knowledge
- Hybrid activity detection (heartbeat + git fallback)
Path to encryption:
- Currently:
knowledge/*.mdin blue repo (plaintext) - Future:
~/.blue/knowledge.db(encrypted SQLite) - Hook command changes from
cattoblue knowledge get --decrypt
8. Branch/Worktree Naming Convention (Design Added ✅)
Coherence-MCP enforced feature/{title} branches and .worktrees/feature/{title} paths.
Blue currently uses {stripped-name} with no prefix.
Design: Configurable prefix with feature/ default.
# .blue/config.yaml (or .blue/blue.toml)
[worktree]
branch_prefix = "feature/" # default
Behavior:
- Branch:
{prefix}{stripped-name}→feature/my-rfc-title - Worktree:
~/.blue/worktrees/{prefix}{stripped-name} - Each repo defines its own prefix (no realm-level override)
- Default:
feature/if not specified
Context Enforcement (from coherence-mcp):
// Prevent modifying RFC from wrong branch
if let Some(prefix) = &config.branch_prefix {
if current_branch.starts_with(prefix) {
let current_rfc = current_branch.strip_prefix(prefix).unwrap();
if current_rfc != rfc_title {
return Err("Cannot modify RFC from different feature branch");
}
}
}
Migration: Existing worktrees without prefix continue to work; new ones use configured prefix.
Next Steps
Create RFCs for remaining implementation:
| RFC | Scope |
|---|---|
| RFC 0016 | MCP Resources (blue://rfc/*, blue://prd/*, etc.) |
| RFC 0017 | Worktree Context Injection (blue worktree-context) |
| RFC 0018 | Activity Detection (hybrid heartbeat + git) |
| RFC 0019 | Branch/Worktree Naming Convention (configurable prefix) |
| RFC 0020 | Encrypted Knowledge Storage (future) |
Spike complete. All 7 injection mechanisms from coherence-mcp have been analyzed and designed for Blue.
"The best documentation is the documentation that appears when you need it."
— Blue
"The best documentation is the documentation that appears when you need it."
— Blue