- handlers/rfc.rs: Add handle_create, handle_get, handle_list,
handle_update_status, handle_plan as standalone functions
- handlers/status.rs: New module with handle_status, handle_next
- handlers/worktree.rs: Already had standalone functions
- handlers/mod.rs: Export status module
These standalone functions can be called by both MCP server and CLI,
avoiding code duplication (RFC 0061 architecture).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixes convergence discipline with four core changes:
1. Velocity redefined: velocity = open_tensions + new_perspectives
(work remaining, not score delta)
2. Unanimous convergence: 100% of experts must signal [MOVE:CONVERGE]
3. Both conditions required: velocity=0 AND converge=100%
4. Dialogues persist: stored in .blue/dialogues/<ISO>-<name>/
Database schema updates:
- Added score component columns (W/C/T/R breakdown)
- Added convergence tracking columns
- Created alignment_convergence_signals table
- Created alignment_scoreboard view
MCP tool updates:
- round_register accepts new metrics
- round_context returns convergence status
- verdict_register gates on convergence criteria
- dialogue_create outputs to .blue/dialogues/
- dialogue_export includes full scoreboard
Judge protocol updated with new scoreboard format and max_rounds=10.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added:
- Performance indices on all entity tables for fast dialogue lookups
- test_output_directory_isolation: Unique IDs ensure separate output dirs
- test_performance_many_perspectives: 100 perspectives queried under 100ms
- test_indices_exist: Verify all performance indices created
- test_no_orphaned_entities: Refs connect valid entities
All pending tests complete. RFC 0051 fully implemented.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
12 tests covering:
- Dialogue ID generation with collision handling
- Display ID format (P0001, T0105, R0215)
- Display ID parsing
- Dialogue creation and retrieval
- Expert registration and scoring
- Perspective, tension, recommendation registration
- Tension lifecycle (open → addressed → resolved)
- Cross-reference registration
- Verdict registration with dialogue status update
- Full workflow integration test
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
RFC 0051 accepted and initial implementation:
- Added alignment_dialogues, alignment_experts, alignment_rounds tables
- Added alignment_perspectives, alignment_tensions with event tracking
- Added alignment_recommendations, alignment_evidence, alignment_claims
- Added alignment_refs table for cross-entity references
- Added alignment_verdicts table for final/interim/minority verdicts
- Created alignment_db.rs module with database operations
- Created alignment-expert skill with marker syntax reference
Schema version bumped from 8 to 9.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Judge-driven panel evolution for alignment dialogues:
- Add `Graduated` as default rotation mode
- New `blue_dialogue_evolve_panel` tool for panel specification
- Panel sampling is now a suggestion (`suggested_panel`) not mandate
- Judge can override Round 0 panel before spawning agents
- Fresh experts (pool/created) get automatic context briefs
- Support for on-demand expert creation with focus areas
- Track panel history with source counts (retained/pool/created)
Key workflow changes:
- Phase 1: Review suggested panel, override if needed
- Phase 2+: Evolve panel based on dialogue dynamics
- `expert_source` param in round_prompt for context brief generation
Updates skill documentation with graduated rotation guidelines and
7 key rules including "REVIEW THE SUGGESTED PANEL".
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Git worktree names are stored in .git/worktrees/<name> and cannot
contain slashes. The code was using branch names like "feature/slug"
or "rfc/name" as worktree names, which git2 rejects silently.
Now the worktree name is derived from the path's directory name (the
slug), which is always a simple identifier without slashes.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Extends lint.rs with Mermaid block validation:
- Neutral theme declaration check (Error, auto-fixable)
- Custom fill color detection (Error, requires manual fix)
- LR flow >3 leaf nodes warning (Advisory)
- Leaf node counting algorithm (excludes subgraphs/style/comments)
Adds 15 test cases covering all lint scenarios.
Also fixes dialogue.rs test assertions to match template text.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add plan_cache table to base SCHEMA so fresh databases have it
(was only created via migration, causing "no such table" errors)
- Change worktree branch naming from `{title}` to `feature/{slug}`
- Add slugify() to handle titles with spaces like "Minimal Job Submission"
- Update cleanup handler to use same naming convention
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add 'resolved' outcome for spikes where a fix is applied during investigation.
Requires fix_summary parameter describing what was fixed. File renames to .resolved.md.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Judge spawned expert agents with run_in_background: true, which caused
the Judge's turn to end immediately after spawning. Users had to manually
type "proceed" to resume scoring and convergence. Removing the flag keeps
parallel execution (multiple Task calls in one message) while blocking
until all agents return summaries, so the Judge auto-proceeds through
rounds without intervention.
Also includes RFC 0033 round-scoped file architecture updates: coerce_bool
for MCP string booleans, mandatory agent return summaries, token budget
documentation, and write-artifacts workflow step.
Spike: alignment-dialogue-halts-after-expert-completion
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace JSONL extraction pipeline with direct file writes: alignment-expert
agents write perspectives to /tmp/blue-dialogue/{slug}/round-{n}/{name}.md,
and the Judge reads those files directly after Task completion.
Changes:
- alignment-expert.md: add Write tool
- dialogue.rs: create output_dir, pass to build_judge_protocol
- Add name_lowercase field to agent JSON for filename generation
- Add WRITE YOUR OUTPUT section to agent prompt template
- Update Judge instructions with mkdir + Read tool workflow
- Add output_dir to returned protocol JSON
- New test: test_build_judge_protocol_output_paths
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- Fix "Round 0" → "Round 1" for opening arguments in alignment dialogues
- Convert spike titles to kebab-case for consistent filenames
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Alignment dialogues now use custom `alignment-expert` subagents with
max_turns: 10, tool restrictions (Read/Grep/Glob), and hard 400-word
output limits. Judge protocol injects as prose via RFC 0023. Moved
Blue voice patterns from CLAUDE.md to MCP server instructions field
for cross-repo portability.
Includes RFCs 0017-0026, spikes, and alignment dialogues from
2026-01-25/26 sessions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Separate mcp_root from cwd so tool-arg overrides don't clobber the
session-level root from initialize. Fallback chain matches RFC spec:
cwd → mcp_root → walk tree → fail with guidance. Error messages now
include attempted paths and actionable fix suggestions. Added --debug
flag to MCP server for file-based DEBUG logging.
Phase 2 finding: Claude Code v2.1.19 declares roots capability but
sends no roots array. Walk-up is the primary detection path.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add slug-based document lookup so kebab-case queries ("filesystem-authority")
match titles ("Filesystem Authority") via deslugification. Implement
next_number_with_fs() that scans both DB and filesystem directory, taking
max(db, fs) + 1 to prevent numbering collisions when files exist outside
the index. Update all 7 callers across MCP handlers. Add blue.db to
.gitignore since it is a derived index. Includes 9 new tests covering
slug matching, filesystem-aware numbering, and collision regression.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Plan files (.plan.md) are now the authoritative source for RFC task
tracking, with SQLite as a derived cache rebuilt on read.
Changes:
- Add plan.rs with PlanFile parsing/generation
- Add schema v7 migration for plan_cache table
- Modify handle_rfc_plan to write .plan.md files
- Modify handle_rfc_task_complete to update .plan.md
- Implement rebuild-on-read for stale cache detection
- Add RFC header validation (table vs inline format)
- Extend blue_lint with headers check and --fix support
Also includes spike investigating Claude Code task integration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace redundant closures with function references
- Use next_back() instead of last() for DoubleEndedIterator
- Fix test_parse_index_response_invalid to use actually invalid YAML
(previous test string was valid YAML - a plain string with braces)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
RFC 0012 was implemented with Option B (MCP orchestrates via Ollama)
instead of Option A (Claude orchestrates via Task tool). This caused:
- No parallel agents spawned
- Fake Ollama responses instead of real deliberation
- Inline JSON instead of .dialogue.md files
Fix by removing blue_alignment_play tool entirely. Claude now
orchestrates alignment dialogues directly using Task tool per ADR 0014.
Also:
- Add pub mod resources for RFC 0016/0017 (was missing)
- Update lib.rs threading for spawn_blocking
- Add .blue/worktrees/ to gitignore
- Update database schema
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
After creating a worktree, detect the project type and suggest
the appropriate install command:
- Node.js: bun/pnpm/yarn/npm based on lock file
- Python: uv/poetry/pip based on lock file
- Rust: cargo build
- Go: go mod download
- Generic: Makefile
Custom scripts/setup-worktree.sh takes precedence over auto-detection.
Ported from coherence-mcp.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add blue_alignment_play MCP tool for multi-expert deliberation:
- Core alignment module with Expert, Round, ExpertResponse types
- Panel templates: Infrastructure, Product, ML, Governance, General
- Ollama integration for running expert rounds until convergence
- Dialogue markdown generation with SQLite tracking
- RFC linking support
Also removes dead code (ADR 0010: No Dead Code).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Completes RFC 0013 git forge integration:
- Add BlueConfig struct for .blue/config.yaml persistence
- Add detect_forge_type_cached() and create_forge_cached() functions
that cache detected forge type to avoid repeated API probing
- Update handle_pr_merge to use native forge API instead of gh CLI
- Add force parameter for skipping precondition checks when gh unavailable
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add forge module with Forge trait for unified PR operations
- Implement GitHubForge with REST API client
- Implement ForgejoForge with REST API client (works with Gitea too)
- Add git URL parsing to extract host, owner, repo from remotes
- Add auto-detection of forge type from remote URLs
- Update blue_pr_create to use native forge API instead of gh CLI
- Support GITHUB_TOKEN and FORGEJO_TOKEN environment variables
The forge abstraction allows Blue to create PRs on both GitHub and
Forgejo/Gitea instances without requiring external CLI tools.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update blue_worktree_create description with workflow context
- Fix blue_next to use MCP tool syntax instead of CLI syntax
- Update generate_hint() to name tools explicitly
- Add next_action field when RFC status becomes accepted
- Add warning when RFC goes in-progress without worktree
- Update pr_create and rfc_complete descriptions with workflow context
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The stop_sequences contained "```" which caused the model to stop
immediately after outputting "```yaml", truncating the entire response.
Also wrap blocking indexer operations in spawn_blocking to avoid
runtime conflicts with reqwest::blocking::Client.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements the AI-powered indexing component of RFC 0010:
- Add indexer module with LlmProvider abstraction
- Integrate qwen2.5:3b via Ollama for local file analysis
- Extract summaries, relationships, and symbols from source files
- Support partial indexing for files >1000 lines
- Wire indexer to all CLI index commands (--all, --diff, --file, --refresh)
The indexer generates structured YAML output with:
- One-sentence file summaries
- Relationship descriptions for semantic search
- Symbol-level indexing with line numbers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds the foundation for AI-maintained semantic file indexing:
Schema (v4 migration):
- file_index table with summary, relationships, prompt_version
- symbol_index table with name, kind, line numbers, description
- FTS5 virtual tables for full-text search
CLI commands (blue index):
- --all: Bootstrap full index
- --diff: Index staged files (for pre-commit hook)
- --file: Single file indexing
- --refresh: Re-index stale entries
- --install-hook: Install git pre-commit hook
- status: Show index freshness
MCP tools:
- blue_index_status: Get index stats
- blue_index_search: FTS5 search across files/symbols
- blue_index_impact: Analyze change blast radius
- blue_index_file: Store AI-generated index data
- blue_index_realm: List all indexed files
Remaining work: Ollama integration for actual AI indexing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
RFC 0008: Status updates now sync to markdown files, not just DB
RFC 0009: Add Audit as first-class document type, rename blue_audit to
blue_health_check to avoid naming collision
Also includes:
- Update RFC 0005 with Ollama auto-detection and bundled Goose support
- Mark RFCs 0001-0006 as Implemented
- Add spikes documenting investigations
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add build.rs to download Ollama at build time for target platform
- Add SHA256 verification infrastructure (currently skipped for external installs)
- Improve bundled_binary_path() to check additional standard locations
- Support BLUE_OLLAMA_PATH and BLUE_SKIP_OLLAMA_DOWNLOAD env vars
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements fallback: Ollama → API → Keywords
- Add KeywordLlm provider (always available, keyword-based matching)
- Add LlmManager for managing provider fallback chain
- Add blue_llm_providers tool to show chain status
- Keywords provider uses Jaccard similarity for text matching
The system now gracefully degrades when LLM providers are unavailable:
1. Try local Ollama first (best quality)
2. Fall back to API if configured (ANTHROPIC_API_KEY/OPENAI_API_KEY)
3. Fall back to keyword matching (always works, basic functionality)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tests require running Ollama server (run with --ignored):
- integration_health_check: Verify server is healthy
- integration_list_models: List installed models
- integration_generate: Test text generation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
RFC 0002 (runbook-action-lookup):
- Add action metadata storage to runbooks
- Implement blue_runbook_lookup with word-based matching
- Add blue_runbook_actions to list all actions
RFC 0004 (adr-adherence):
- Add blue_adr_list, blue_adr_get, blue_adr_relevant, blue_adr_audit
- Implement keyword-based relevance matching with stem-like prefixes
- Add adr:N query support in blue_search
RFC 0005 (local-llm-integration):
- Create blue-ollama crate for embedded Ollama server management
- Add LlmProvider trait and MockLlm in blue-core
- Implement OllamaLlm with HTTP client for model operations
- Add MCP tools: blue_llm_start/stop/status, blue_model_pull/list/remove/warmup
- Support BLUE_OLLAMA_PATH env var for air-gapped builds
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Simplify Blue's directory structure to use per-repo .blue/ folders
instead of centralized ~/.blue/repos/<project>/ structure.
Changes:
- Refactor BlueHome struct with simplified per-repo paths
- Update detect_blue() to find git root and create .blue/ there
- Add migration logic from old .blue/repos/<project>/docs/ structure
- Auto-create .blue/ on first command (no 'blue init' required)
- Update all handlers to use new flat path structure
- Handle edge case: no git repo uses current directory
Structure: repo/.blue/{docs/, worktrees/, blue.db, config.yaml}
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- RFC handler now writes markdown to .blue/repos/<project>/docs/rfcs/
- Sets file_path in document store for tracking
- Returns file path in response
- Remove unused get_current_session function
- Rename realm tools to use blue_ prefix for consistency
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>