Releases: jmcentire/pact
v0.14.1 — Fix CI test failures
Fixes
- CI: Skip Gemini backend tests when
google-genaiis not installed (pytest.importorskip) - Tests: Update
test_idempotentto correctly reflect archive-then-rewrite behavior introduced in v0.11.0 (re-runningpact initarchives existing artifacts, not skip-if-exists)
v0.14.0 — Architectural Assessment + Refactors
What's New
pact assess — Architectural Assessment Command
New CLI command that performs mechanical analysis of any Python codebase for structural friction. No LLM required, no project setup needed.
pact assess src/myproject/ # Markdown report
pact assess src/myproject/ --json # Machine-readable outputDetects five categories:
- Hub dependencies — modules with high fan-in (many dependents)
- Shallow modules — interface complexity rivals implementation
- Tight coupling — mutual imports, circular dependency clusters (Tarjan's SCC)
- Scattered logic — same intra-project import in many files
- Test coverage gaps — source modules without test files
Architecture Refactors
- Health policy extraction —
health_policy()consolidates 7 scattered health check sites into a single decision function - Test harness consolidation —
_run_test_subprocess()eliminates 4x duplicated subprocess boilerplate across Python/TS/Rust runners - ResolvedConfig —
resolve_all()pre-computes all config resolution at startup
Documentation
- CAPABILITIES.md — AI-friendly capability inventory with quick selector, decision guide, and per-command details
- README, CLAUDE.md, and docs site updated
Stats
- 2073 tests (48 net new)
- +1767 lines, -169 lines across 16 files
v0.13.1 — Adopt resilience
- Catch Anthropic 500/APIStatusError — skip module, continue
- Catch BudgetExceeded gracefully — save progress, exit cleanly
- Re-run to resume from where you left off
v0.13.0 — TypeScript/Effect-TS Support
Summary
- TypeScript/Effect-TS extraction:
pact adoptnow understands Effect.gen, pipe, Layer, Context.Tag, Data.TaggedError, Schema, plus standard TS functions/classes/interfaces/types --include/--excludeCLI flags: Scope adopt to subdirectories, file lists, or stdin pipes- Resumable adopt: Re-running picks up where it left off — skips modules with existing contracts+tests
- API stall resilience: Stalled modules are skipped instead of crashing the entire run
- Vitest smoke tests: TypeScript projects get Vitest-based smoke test generation
- 42 new tests, 2025+ total passing
Breaking Changes
None.
Install
pip install pact-agents==0.13.0v0.12.0: Kindex Integration
What's New
Optional kindex integration — cross-session context enrichment via the kindex knowledge graph. Degrades gracefully when kindex is not installed.
Features
- First-run prompt: offers to index the codebase during
pact init, saves preference to.kin/config - Context fetch: loads kindex graph context during project initialization
- Artifact publishing: publishes tasks, decomposition trees, decisions, and contracts to kindex after
pact run/pact daemoncompletes - Graceful degradation: all kindex functions are silent no-ops when kindex is unavailable
.kin/config support
auto_index: true # or false to skip
name: my-project # used for context search topicFull Changelog
v0.11.0: Artifact Archival
What's New
Artifact archival — previous project artifacts are automatically preserved when reinitializing.
Features
pact initarchives existing artifacts into.pact/archive/<slug>/before writing fresh templates- Slug derived from file content (task title, YAML name keys)
ProjectManager.load_previous_context()returns most recent archived session's artifactsProjectManager.archive_existing()available for programmatic use- CLI shows archive info and lists previous sessions during init
Changed
init()always writes fresh templates (previously skipped if files existed)- Archives: task.md, sops.md, pact.yaml, design.md, plus generated metadata (tasks.json, TASKS.md, etc.)
Full Changelog
v0.10.2: Fix decompose state loss, remove hard phase timeout
Fixes
Decompose state loss on interruption
tree.json was only saved after the entire component loop completed. If the decompose phase was interrupted (timeout, crash, rate limit), in-memory contract assignments were lost — tree.json showed "contract": null for all components even though contract files existed on disk.
Fix: Save tree.json incrementally after each component's contract and tests are written.
Hard wall-clock phase timeout removed
The default 1800s phase timeout killed phases based on elapsed time, not progress. A 12-component decomposition with contracts + tests + Goodhart tests legitimately takes longer than 30 minutes. Complexity determines duration, not a fixed clock.
Fix: Default to no hard timeout (autonomous_timeout: 0). Stall detection (no API progress) is the correct approach for detecting stuck phases. Hard timeout still available via autonomous_timeout config for users who want it.
v0.10.1
Changes
- Fix JSON coercion for malformed LLM tool outputs —
_coerce_fieldsnow attempts common repairs (trailing commas, single quotes) whenjson.loadsfails on strings that look like JSON. Fixespact adoptcrashes where the LLM returns slightly malformed JSON arrays in tool_use blocks. - Async contracts, retrospective phase, diff-based drift detection, tiered eval (from v0.10.0, previously unreleased)
- Preflight phase with red lines and contingencies
- Preflight alignment with signet-eval MCP tools
v0.9.0: Complete type coherence
Type registry + enforcement + reconciliation. Zero cross-component type divergence on Exemplar test project.
v0.8.4: Pre-validation reconciliation
Re-enforces registry on all contracts before validation. Reconciles non-registry types across components.