- 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>
- blue init now creates .blue/ directory and SQLite database
- Added --force flag to reinitialize existing projects
- Prints helpful output showing created paths
- Idempotent: running twice shows "already initialized" message
Phase 1 of RFC 0061 (CLI Database Parity).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- install.sh: Add xattr/codesign fix after cp on macOS
- install.sh: Add portable timeout verification using perl
- INSTALL.md: Recommend cargo install --path as primary method
- INSTALL.md: Document macOS signature issue and fix
- blue doctor: Detect com.apple.provenance xattr with fix hint
- blue doctor: Verify code signature with codesign --verify
- blue doctor: 3-second liveness timeout for hanging binaries
Fixes dyld hang at _dyld_start when copied binaries have stale
signatures after Homebrew library updates.
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>
- Remove context_brief from MCP return (Judge constructs from data)
- Add three expert sources: retained, pool, created
- Consolidate duplicate blue_dialogue_round_context sections
- Add step 0 (EVOLVE PANEL) to round workflow
- Fix step numbering and loop target in workflow
- Clarify Judge registers rounds even on convergence
- Fix "experts register" → Judge registers on their behalf
- Change "collide" to "overlap" for local IDs
- Add defaults section (panel size, 100% convergence)
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>
The hook was blocking because `timeout` is a GNU coreutil only
available via homebrew on macOS. Replaced with bash's built-in
`read -t 2` which is portable and doesn't require PATH setup.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds unified installation management for Claude Code integration:
blue install - Install hooks, skills, MCP server
blue uninstall - Remove Blue from Claude Code
blue doctor - Check installation health
Components managed:
- Hooks: session-start.sh (PATH), guard-write.sh (guard)
- Skills: Symlinks to ~/.claude/skills/
- MCP Server: Configuration in ~/.claude.json
Features:
- --hooks-only, --skills-only, --mcp-only flags
- --force to overwrite existing files
- Managed files tagged with "# Managed by: blue install"
- Idempotent - safe to run repeatedly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Now covers unified `blue install` that manages:
- Hooks (SessionStart + PreToolUse)
- Skills (symlinks to ~/.claude/skills/)
- MCP Server (configuration in ~/.claude.json)
Also adds `blue uninstall` and `blue doctor` for health checks.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Proposes `blue hooks` subcommand for managing Claude Code hooks:
blue hooks install - Install all Blue hooks
blue hooks uninstall - Remove Blue hooks
blue hooks status - Show current hook status
blue hooks check - Verify hooks work correctly
Benefits: one-command setup, portable, idempotent, reversible.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added SessionStart hook that adds $CLAUDE_PROJECT_DIR/target/release
to PATH via CLAUDE_ENV_FILE. This makes `blue` available by name in
all subsequent hooks.
- .claude/hooks/session-start.sh: Sets PATH on session start
- .claude/hooks/guard-write.sh: Now uses `blue` instead of full path
- .claude/settings.json: Added SessionStart hook
Requires Claude Code restart to take effect.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Problem: Claude Code hooks run in minimal environment without PATH.
Commands by name hang; only full paths work.
Solution: Use $CLAUDE_PROJECT_DIR for portable binary resolution:
"$CLAUDE_PROJECT_DIR/target/release/blue" guard --path="$FILE_PATH"
This is documented Claude Code behavior - hooks don't inherit shell
initialization for security reasons.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Guard now runs synchronously before tokio runtime initialization:
- Added maybe_handle_guard_sync() pre-main check
- Added run_guard_sync() with full guard logic
- Added is_in_allowlist_sync() and is_source_code_path_sync()
- main() now checks for guard before calling tokio_main()
This eliminates tokio overhead for guard invocations and provides
correct architecture (pre-init gates don't depend on post-init infra).
Note: PATH-based command lookup still hangs in Claude Code's hook
environment - this is a Claude Code issue, not Blue. The hook still
requires full binary path as workaround.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Emerged from alignment dialogue with 5 experts (unanimous convergence).
Problem: guard command runs async within tokio::main, causing hangs
when invoked from Claude Code hooks.
Solution: Run guard synchronously before tokio runtime initialization.
Pre-init gates should not depend on post-init infrastructure.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The original hook syntax `blue guard --path="$TOOL_INPUT:file_path"`
didn't work - Claude Code doesn't support that variable interpolation.
Created guard-write.sh that:
- Reads JSON from stdin using jq (Claude Code's recommended pattern)
- Extracts file_path from tool_input
- Calls blue guard with full path to target/release binary
- Closes stdin with </dev/null to prevent hanging
The full binary path is a workaround for an issue where PATH-based
command lookup hangs in Claude Code's hook subprocess environment.
A proper fix (making guard synchronous before tokio::main) is tracked
in RFC 0049.
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>
Establishes mandatory standards for Mermaid diagrams in Blue documents:
- Neutral theme required for dark/light mode compatibility
- Leaf node counting for LR flow warnings (>3 nodes)
- Plain text for architecture labels (no emoji color injection)
- Shape semantics advisory for new diagrams
- Auto-fix for theme declaration only (colors require manual review)
Includes alignment dialogue with 10/10 tensions resolved across 3 rounds.
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 0014: Workflow Enforcement Parity - conversational hints over JSON
- RFC 0015: Cert-Manager with Let's Encrypt for TLS on K3s cluster
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>