v0.3.0
⚠️ Breaking change
claim_files's MCP response field granted has been renamed to accepted, and a new has_conflicts boolean was added alongside the existing conflicts array (#52). This is public MCP wire surface, not just an internal Rust API -- any external tool or agent integration that parses the old granted field needs to update to accepted. The rename exists because granted: true was actively misleading given leases are advisory, not exclusive: a caller reading {granted: true, conflicts: [...]} was very likely to assume it held the file exclusively, when the claim was recorded either way.
Highlights
pact coord-status— a new subcommand that surfaces the coordination layer's current state (every active lease, per-agent pending message counts) instead of it being a black box.spawn-many --agent— a default agent for tasks without an explicit<agent>:prefix, fixing the inconsistency betweenspawnandspawn-many's CLI surfaces.merge-all --unionsafety check — rejects a union merge that would silently produce broken JS/TS (duplicatemodule.exports/export default, redeclared bindings) instead of reporting false success.- PidLock PID-reuse fix — a lock holder's PID being recycled by an unrelated process after it died no longer makes an abandoned lock look permanently held.
- UTF-8 BOM handling — package.json merges and workspace meta files now tolerate (and, for package.json, preserve) a leading BOM, a common default from PowerShell's
Out-File/Set-Content -Encoding utf8. - Streamed output is much quieter by default — Copilot's noisiest event types (tool-call deltas, background task changes, skills-loaded events) are suppressed unless
--verboseis passed. - A rolling
edgeprerelease (rebuilt on every push tomain) is also available for testing unreleased work between tags: https://github.com/zekariasasaminew/pact/releases/tag/edge
What's Changed
- Reduce inline comments, extract design rationale to DESIGN.md by @zekariasasaminew in #22
- Bump workspace version to 0.2.0 by @zekariasasaminew in #23
- Reject --union merges that produce duplicate module.exports/export default or a redeclared binding by @zekariasasaminew in #40
- Exclude the caller's own broadcasts from check_messages by @zekariasasaminew in #41
- Skip generating a lockfile when the source repo has none by @zekariasasaminew in #42
- Distinguish merge-all's partial-success exit code from a hard failure by @zekariasasaminew in #44
- Only warn on coord status once it's settled, not on the transient pending value by @zekariasasaminew in #45
- Preserve package.json key order and indent width across a merge by @zekariasasaminew in #46
- Reject out-of-range TTLs in claim_files instead of silently accepting them by @zekariasasaminew in #47
- Deduplicate lease rows on repeat claim_files calls instead of accumulating by @zekariasasaminew in #48
- Release files by glob overlap, not just exact pattern-string match by @zekariasasaminew in #49
- Set isError: true on all four coord MCP tools' failure paths by @zekariasasaminew in #50
- Document that spawn/spawn-many don't commit and merge-all does by @zekariasasaminew in #51
- Rename claim_files' granted field to accepted, add has_conflicts by @zekariasasaminew in #52
- Add --agent to spawn-many as a default for tasks without a prefix by @zekariasasaminew in #53
- Suppress known-noisy streamed event types by default, add --verbose by @zekariasasaminew in #54
- Merge feat/merge-all: recover DESIGN.md and comment-reduction pass by @zekariasasaminew in #55
- Add a rolling edge release, rebuilt on every push to main by @zekariasasaminew in #56
- Strip a leading UTF-8 BOM before parsing conflicted JSON stages by @zekariasasaminew in #60
- Suppress assistant.tool_call_delta, the dominant remaining stream noise by @zekariasasaminew in #61
- Fix spawn-many overlap warning double-counting shared tasks by @zekariasasaminew in #62
- Add --version/-V to the top-level CLI by @zekariasasaminew in #63
- Add pact coord-status: surface active leases and pending messages by @zekariasasaminew in #68
- Make Windows support a deliberate positioning point in the README by @zekariasasaminew in #69
- Fix PidLock treating a reused PID as still holding the lock by @zekariasasaminew in #74
- Calibrate the tagline: coordination is advisory, not enforced by @zekariasasaminew in #75
- Document expand_glob's per-call tree-walk cost as a known scaling limit by @zekariasasaminew in #76
- Trim tokio's full feature to what's actually used by @zekariasasaminew in #77
- Tolerate a UTF-8 BOM in workspace meta JSON files by @zekariasasaminew in #81
- Preserve a UTF-8 BOM through package.json conflict resolution by @zekariasasaminew in #82
- Suppress session.skills_loaded in default streamed event output by @zekariasasaminew in #83
- Bump workspace version to 0.3.0 by @zekariasasaminew in #88
Full Changelog: v0.2.0...v0.3.0