Changelog

Every commit, the technical decisions behind it, and what we learned building weave.

Feb 10, 2026
Add resolution hints, weave summary command, and merge summary MCP tool
feature weave-mcp docs

Structured post-merge output for agents. Three connected improvements:

  • Resolution hints: each ConGra conflict type now carries a human-readable hint (e.g. "Logic changed on both sides. Requires understanding intent of each change."). Hints appear as comment lines inside conflict markers and help agents choose resolution strategies.
  • weave summary CLI command: reads a file with weave conflict markers, parses them into structured data, and outputs a summary with entity names, complexity classifications, confidence levels, and hints. Supports --json for machine-readable output.
  • weave_merge_summary MCP tool: 15th MCP tool. Returns the same structured JSON as weave summary --json, letting agents query merge results from their MCP session without regex parsing.
  • parse_weave_conflicts(): new public function in weave-core that parses weave-enhanced conflict markers back into structured ParsedConflict data.

Also fixed the website: updated MCP tool count from 9 to 15 and added the 6 missing tools to the grid.

Key insight

Agents need structured post-merge output, not just conflict markers. A recurring theme from GitHub discussions (claude-code, gitbutler, goose, aider): agents can act on conflicts much faster when they get machine-readable summaries with classification, confidence, and actionable hints. The ConGra taxonomy maps directly to resolution strategies: Text conflicts are auto-resolvable, Syntax conflicts need caller checks, Functional conflicts need intent understanding.

Feb 7, 2026
Add comment bundling, Python class merge, method reordering — v0.1.0 release
feature release research

Three new features, expanded benchmark to 31 scenarios, and first public release:

  • Comment bundling (Mergiraf-inspired): doc comments (JSDoc /** */, Rust ///, JavaDoc) are now bundled with their associated entity during region extraction. Comments travel with their function during merge, and region content comparison supplements structural hash to detect comment-only changes.
  • Python class inner merge: extract_container_wrapper and extract_member_chunks now handle indentation-based containers (class Foo:) alongside brace-delimited ones. Both adding methods to a Python class auto-resolves.
  • Method reordering support: inner entity merge matches members by name, making method reordering within a class transparent to the merge — one agent can reorder while another modifies.

Benchmark: weave 31/31 (100%) vs git 15/31 (48%). 7 new scenarios: method reorder, Python class methods, Rust impl methods, enum modify+add, JSDoc+body, Rust doc comments, Go functions.

v0.1.0 released on Homebrew: brew install ataraxy-labs/tap/weave

+939 -37 4 files (merge.rs, region.rs, bench.rs, integration.rs)
lesson Comment bundling is a simple heuristic (scan backwards for doc comment patterns) but architecturally significant — it prevents doc comments from becoming orphaned "interstitial" content during entity-level merge. The ASE 2024 evaluation paper found that plume-lib's approach of fixing semantic issues post-merge outperformed more complex approaches — keeping it simple works.
Feb 7, 2026
Add decorator-aware merge, Java & C language support, expand benchmark to 24 scenarios
feature perf research

Three major improvements:

  • Decorator-aware merge: commutative merge for decorators/annotations. When both agents add different decorators to the same function (e.g. @cache + @deprecated), weave merges them cleanly. Works for Python decorators, Java annotations, and TypeScript decorators — at both entity and inner-entity (class member) levels.
  • Java & C language support: sem-core now extracts entities from Java (classes, methods, interfaces, enums, fields, constructors) and C (functions, structs, enums, unions, typedefs). 9 supported languages total.
  • Inner entity merge improvements: single-line members (fields, variants) no longer get blank line separators. @-prefixed decorators bundle with their member in inner merge. Single-member containers now go through inner merge (needed for decorator merge on single-method classes).

Benchmark: weave 24/24 (100%) vs git 11/24 (46%). 8 new scenarios: Python decorators, decorator+body changes, TS class decorators, TS interface fields, Rust enum variants, Java methods, Java annotations, C functions. All resolve cleanly.

+500 -20 8 files (merge.rs, bench.rs, integration.rs, sem-core)
Key insight

Decorators and annotations are semantically unordered, like imports — they can be merged commutatively. The split_decorators() approach cleanly separates decorator concerns from body concerns, allowing independent merge strategies. Combined with the inner entity merge for class members, this handles the real-world pattern where one agent adds @Injectable while another adds @Deprecated to the same method.

0f6a925 Feb 7, 2026
Add confidence scoring, weave_diff MCP tool, whitespace-aware merge, and 16-scenario benchmark
feature perf research

Major expansion of the benchmark suite from 7 to 16 scenarios. Results in release mode:

  • weave: 16/16 clean merges (100%) vs git: 8/16 (50%)
  • Weave now resolves 8 additional merges that git cannot, up from 1
  • False conflict reduction: 100% — every git false conflict is auto-resolved

New features:

  • Confidence scoring: MergeStats tracks how each entity was resolved — very_high (one side changed), high (diffy 3-way), medium (inner merge/fallback), conflict
  • weave_diff MCP tool: Entity-level diff between two refs (14th MCP tool)
  • Post-merge parse validation (MergeBot-inspired): Re-parses merged output, warns if syntactically broken
  • Whitespace-aware conflict avoidance: When one side only changes formatting and the other makes semantic changes, takes the content-change side instead of conflicting
  • diff_files() git helper: Lists changed files between two refs

New benchmark scenarios: both add functions at end, both add methods to class, Rust/Python import merging, insert-between-existing, reformat-vs-modify, both add exports

Key Insight

Most "conflicts" in multi-agent workflows are false positives — git reports conflicts because changes are on adjacent lines, not because they're actually incompatible. Entity-level understanding eliminates this entire class of problems. Research shows 10-20% of all git merges produce conflicts (Ghiotto et al. 2019), and our whitespace-aware shortcut handles the common case where one agent's formatter runs while another makes real changes.

10e2e7e Feb 7, 2026
Add merge benchmark suite and nested entity filter
feature perf bugfix

New weave bench command runs 7 merge scenarios comparing weave's entity-level merge against git's line-level merge (via diffy). Results in release mode:

  • weave: 7/7 clean merges (100%) vs git: 6/7 (86%)
  • Weave resolves import conflicts that git cannot (commutative set-based merge)
  • Weave handles class method merges via inner entity merge (methods matched by name, not position)
  • Weave timing: 85–2041us per scenario (AST parsing cost) vs git: 5–14us (raw text diff)

Bug fixed: sem-core was extracting local variables inside class methods (const user) as top-level entities. When two agents' methods both declared const user, this produced a false BothAdded conflict. Added filter_nested_entities() — strips entities whose line range is fully contained within another entity.

Lesson learned

When composing AST-level tools, watch for over-extraction: parsers that extract variables/assignments from inside functions produce nested entities that create false conflicts during merge. The fix is simple — O(n²) containment check on line ranges — but the symptom is subtle: a class merge that works with 3 methods but fails with 4 because the 4th method introduces a variable name collision.

6 files +420 -5
05a7a32 Feb 7, 2026
Add rename detection via structural_hash matching
feature research

Inspired by RefFilter and IntelliMerge: when one branch renames an entity and the other modifies a different entity, detect the rename via sem-core's AST-normalized structural_hash and merge cleanly. Previously this produced false delete+add conflicts.

Builds a rename map (new_id → base_id) before the main merge loop. The merge treats renamed entities as the same entity with a name change — modifications from the other branch apply correctly.

  • Uses structural_hash (AST-normalized, strips comments + whitespace) for matching
  • Guards against false matches: requires the base ID to be absent in the branch
  • Stores resolved entities under both base and renamed IDs for correct reconstruction
Lesson learned

Rename detection in merge is a graph matching problem. structural_hash gives us content-based matching for free — if two entities have the same normalized AST structure but different IDs (names), one was likely renamed. The key guard: only match if the old ID doesn't exist in the branch (otherwise it's a copy, not a rename).

2 files +136 -3
8e0a437 Feb 7, 2026
Add recursive inner entity merge for class members (LastMerge)
feature research

Implements the key insight from LastMerge (arXiv:2507.19687): class members are unordered children. When diffy fails on a container entity (class, impl, trait), chunk the body into method-level blocks, match by name, and merge each independently.

The core multi-agent scenario this resolves: two agents modify different methods in the same class. Git produces a conflict because the changes are in adjacent hunks. Weave now resolves this cleanly.

  • extract_member_chunks(): splits class body by indentation level, names each chunk by method/field signature
  • try_inner_entity_merge(): match-by-name three-way merge on member chunks
  • Handles: both modify different members, one adds + other modifies, member deletion
Lesson learned

sem-core extracts classes as single entities (methods are NOT separate — method_definition isn't in TypeScript's entity_node_types). This means class merges needed a secondary decomposition layer. The indent-based chunking is language-agnostic and works for TS classes, Python classes, Rust impls, and Go structs without extra parser work.

2 files +645 -0
dcdf0ac Feb 7, 2026
Add ConGra conflict taxonomy classification
feature research

Implements the ConGra taxonomy from arXiv:2409.14121: classifies conflicts as Text (T), Syntax (S), Functional (F), or composites (T+S, T+F, S+F, T+S+F).

The classification appears on every EntityConflict, helping agents choose resolution strategies: text-only conflicts are trivially auto-resolvable, syntax conflicts may need type-checking, functional conflicts need careful review.

  • classify_change(): compares two versions, detects text (whitespace/comment), syntax (signature), functional (body) changes
  • classify_conflict(): combines ours+theirs classifications into composite type
  • 8 unit tests covering all taxonomy levels
2 files +270 -8
24f8136 Feb 6, 2026
Add predictive conflict warnings to weave_claim_entity
feature weave-mcp

When an agent claims an entity, the tool now checks the entity dependency graph for related entities claimed by other agents. Returns warnings like: "processData depends on validateInput which is claimed by agent-2".

This predicts merge conflicts before they happen — the first step from reactive conflict resolution to proactive conflict prevention.

1 file +64 -2
da91aea Feb 6, 2026
Add weave_validate_merge MCP tool for semantic risk detection
feature weave-mcp

New tool validates a merge for semantic risks. Finds entities modified in both branches, then uses the entity dependency graph to detect cross-references between them.

Returns warnings like: "processData was modified and references validateInput which was also modified" — cases where the merge is syntactically clean but semantically risky. Weave MCP server now exposes 13 tools total.

2 files +99 -0
c26d043 Feb 6, 2026
Add Sesame-inspired separator preprocessing to fallback merge
feature research

Based on Sesame (arXiv:2407.18888) which achieved 91% spurious conflict reduction. When entity-level merge isn't possible, the line-level fallback now expands syntactic separators ({ } ;) onto separate lines before merging. This gives diffy finer-grained alignment across block boundaries.

String contents are preserved during expansion. Falls back to plain merge if separator-expanded merge still conflicts (for cleaner markers).

Lesson learned

Sesame's insight: line-based merge tools fail when syntactic boundaries don't align with line boundaries. Expanding { and } onto their own lines is a zero-cost preprocessing step that dramatically improves diffy's alignment. Works as a graceful degradation path when AST parsing isn't available.

1 file +159 -18
e786012 Feb 6, 2026
Add post-merge semantic validation
feature weave-core

New validate module detects when auto-merged entities reference other entities that were also modified — a semantic risk even when the merge is syntactically clean. Uses sem-core's entity dependency graph.

Two warning types: DependencyAlsoModified (you call something that changed) and DependentAlsoModified (something that calls you changed). MergeResult now carries a warnings field alongside conflicts.

6 files +340 -0
d4e09f3 Feb 6, 2026
Add entity graph MCP tools: dependencies, dependents, impact analysis
feature weave-mcp

Three new tools expose sem-core's cross-file entity dependency graph:

  • weave_get_dependencies: what does this entity call/reference?
  • weave_get_dependents: who calls/references this entity?
  • weave_impact_analysis: transitive blast radius if an entity changes

Builds the full repo graph on each call using sem-core's two-pass extraction (entities → symbol table → reference edges).

2 files +199 -0
63b3a37 Feb 6, 2026
Add commutative merge for import/use blocks
feature research

Inspired by Mergiraf: treats import-heavy regions as unordered sets instead of ordered sequences. Eliminates the most common false conflict in multi-agent workflows (both agents adding different imports).

Algorithm: compute set differences from base for each branch, merge additions, remove deletions, deduplicate. Supports JS/TS import, Rust use, Python import, C/C++ #include, and require().

3 files +331 -10
0b3a17c Feb 6, 2026
Fix MCP server: discover repo from absolute file paths
bugfix weave-mcp

MCP server failed when launched from outside a git repo. Now uses 3-strategy discovery:

  • Absolute file path → git -C <parent> rev-parse --show-toplevel
  • WEAVE_REPO env var
  • CWD-based discovery (original)

Converts absolute paths to repo-relative internally so tools work with both.

2 files +150 -42
3282c19 Feb 6, 2026
Add changelog page with technical learnings from every commit
docs

Each entry includes commit context, what changed, what broke, and a "lesson learned" box. Covers: lazy MCP init, automerge Transactable, rmcp schemars, cargo install syntax, entity.content vs raw regions, diffy behavior, and Claude Code MCP scoping.

4 files +333 -0
a72158d Feb 6, 2026
Defer repo discovery to first tool call in weave-mcp
bugfix weave-mcp

The MCP server was crashing on startup when launched from outside a git repository. Claude Code starts MCP servers from the user's home directory, which usually isn't a git repo.

The fix: Replaced eager find_repo_root() in main() with lazy initialization via tokio::sync::MappedMutexGuard. The server now starts instantly and only discovers the repo root when a tool is actually called.

  • Used Arc<Mutex<Option<RepoContext>>> for lazy init pattern
  • MutexGuard::map() projects through the Option to return a mapped guard
  • Server responds to MCP handshake immediately — tools fail gracefully with a clear error if no repo is found
Lesson learned

MCP servers must start without assumptions about the working directory. Lazy initialization is critical — defer I/O and environment discovery to the first actual tool call, not server startup. MutexGuard::map(guard, |opt| opt.as_mut().unwrap()) is the idiomatic Rust pattern for projecting a mutex guard through a wrapper type.

2 files +73 -44
3197ae1 Feb 6, 2026
Add Claude Code MCP setup instructions to docs
docs weave-mcp

Documentation only showed Claude Desktop setup (JSON config file). Added the claude mcp add command for Claude Code CLI users.

Key detail: --scope user is required to make the MCP server available across all projects. Without it, the server is scoped to the current project directory and won't appear in /mcp when running Claude Code elsewhere.

Lesson learned

Claude Code has two MCP scopes: project (default, stored in project .claude.json) and user (global, stored in ~/.claude.json). For tools that should work across repos, always use --scope user.

2 files +51 -8
a5d130d Feb 6, 2026
Split docs into multi-page site with learnings blog
docs

Broke the monolithic 799-line index.html into three focused pages:

  • index.html — landing page (hero, comparison, quick start)
  • docs.html — reference (architecture, CRDT, MCP tools, CLI)
  • learn.html — deep dive articles on git vs weave merging and CRDTs

Extracted shared CSS into style.css with article-specific styles for the learn page (blog-style layout with highlight boxes and code examples).

4 files +928 -555
bc29565 Feb 6, 2026
Use git dependency for sem-core instead of local path
bugfix cargo

All 5 Cargo.toml files referenced sem-core via local path (path = "../../../sem/crates/sem-core"). This works for local development but breaks cargo install --git because the relative path doesn't exist on the user's machine.

Fix: Changed all references to sem-core = { git = "https://github.com/Ataraxy-Labs/sem", version = "0.2" }. Cargo resolves the crate from the git repo's workspace automatically.

Lesson learned

When publishing a crate that depends on another workspace crate from a different repo, use git = "..." dependencies, not path = "...". Cargo resolves workspace members from git URLs automatically — just point to the repo root and Cargo finds the crate by name.

6 files +14 -7
821cda0 Feb 6, 2026
Fix cargo install commands (--git and --path can't be combined)
bugfix cargo

Documentation had cargo install --git <url> --path crates/weave-mcp which doesn't work — --git and --path are mutually exclusive flags in Cargo.

Correct syntax: cargo install --git <url> <crate-name>. For a workspace repo, pass the binary crate name as a positional argument. Cargo looks through all workspace members to find the matching [package] name.

Lesson learned

cargo install --git takes the crate name as a positional arg, not via --path. The correct form: cargo install --git https://github.com/org/repo crate-name. Cargo clones the repo, finds the crate in the workspace, and builds + installs it.

1 file +4 -4
49aae1b Feb 6, 2026
Add CRDT entity state (Phase 2) and MCP server (Phase 3)
phase 2 phase 3 major

The largest commit — two new crates adding agent coordination to weave.

weave-crdt: Automerge 0.5 backed entity state. Advisory claims, agent registration, heartbeat-based liveness, stale cleanup, and conflict detection. 20 tests covering all operations.

weave-mcp: MCP server with 9 tools over stdio transport using rmcp 0.14. Wraps all CRDT operations + entity extraction + merge preview into callable agent tools.

Three hard bugs hit during implementation:

  • Automerge 0.5 API: put(), put_object(), delete(), insert() methods on AutoCommit require use automerge::transaction::Transactable; in scope. Without it, the compiler says the methods don't exist — misleading since AutoCommit clearly implements them.
  • rmcp schemars re-export: #[derive(rmcp::schemars::JsonSchema)] doesn't work because derive macros resolve at compile time against the local crate namespace. Fix: add schemars = "1" as a direct dependency and use #[derive(schemars::JsonSchema)] instead.
  • rmcp stdio transport: server.serve(tokio::io::stdin()) fails — stdio transport requires both directions: server.serve((tokio::io::stdin(), tokio::io::stdout())).
Lesson learned

Automerge 0.5: Always import use automerge::transaction::Transactable; when using AutoCommit. The trait provides all mutation methods. rmcp 0.14: Derive macros from re-exported crates (rmcp::schemars) don't work — add the crate as a direct dep. Stdio MCP transport needs a (stdin, stdout) tuple, not just stdin.

25 files +2,904 -83
7954e14 Feb 6, 2026
Add documentation website
docs

Single-page documentation site with dark monospace aesthetic, inspired by the sem docs. Covered all three phases: merge driver algorithm, CRDT state model, and MCP server tools. Later split into multiple pages in a5d130d.

1 file +799 -0
bd5ad1e Feb 6, 2026
Initial implementation: entity-level semantic merge driver for Git
phase 1 major

The foundation — a Cargo workspace with three crates implementing entity-level semantic merge for Git.

weave-core (the algorithm):

  • Parse all three versions (base, ours, theirs) with sem-core + tree-sitter
  • Split files into Entity and Interstitial regions
  • Match entities by stable ID (type + name + parent)
  • Resolve per-entity: only-ours, only-theirs, identical, or 3-way merge via diffy
  • Reconstruct merged file preserving ours-side ordering

weave-driver (git integration):

  • Binary that git calls with %O %A %B %L %P arguments
  • Reads three temp files, calls entity_merge(), writes result to %A
  • Exit code: 0 = clean merge, 1 = has conflicts

weave-cli (user interface):

  • weave setup — configures .gitattributes and git merge driver
  • weave preview <branch> — dry-run merge analysis

Key design decision: sem-core's entity.content strips syntax like export, so we use region content (raw file lines by byte range) for merge output instead of entity content. This preserves the original source exactly.

Lesson learned

sem-core entities vs regions: entity.content is the parsed/normalized body (strips keywords like export). For merge output, always use the raw file content by line range to preserve original syntax exactly. diffy: diffy::merge() works best for non-adjacent changes; overlapping changes within the same entity body still produce conflict markers.

17 files +3,145 -0