Skip to content

Releases: jmcentire/pact

v0.14.1 — Fix CI test failures

09 Apr 04:44

Choose a tag to compare

Fixes

  • CI: Skip Gemini backend tests when google-genai is not installed (pytest.importorskip)
  • Tests: Update test_idempotent to correctly reflect archive-then-rewrite behavior introduced in v0.11.0 (re-running pact init archives existing artifacts, not skip-if-exists)

v0.14.0 — Architectural Assessment + Refactors

08 Apr 20:55
0141ab4

Choose a tag to compare

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 output

Detects 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 extractionhealth_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
  • ResolvedConfigresolve_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

31 Mar 19:49

Choose a tag to compare

  • 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

31 Mar 10:46

Choose a tag to compare

Summary

  • TypeScript/Effect-TS extraction: pact adopt now understands Effect.gen, pipe, Layer, Context.Tag, Data.TaggedError, Schema, plus standard TS functions/classes/interfaces/types
  • --include/--exclude CLI 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.0

v0.12.0: Kindex Integration

27 Mar 07:00

Choose a tag to compare

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 daemon completes
  • 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 topic

Full Changelog

v0.11.0...v0.12.0

v0.11.0: Artifact Archival

27 Mar 06:35

Choose a tag to compare

What's New

Artifact archival — previous project artifacts are automatically preserved when reinitializing.

Features

  • pact init archives 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 artifacts
  • ProjectManager.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...v0.11.0

v0.10.2: Fix decompose state loss, remove hard phase timeout

23 Mar 07:48

Choose a tag to compare

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

23 Mar 02:23

Choose a tag to compare

Changes

  • Fix JSON coercion for malformed LLM tool outputs_coerce_fields now attempts common repairs (trailing commas, single quotes) when json.loads fails on strings that look like JSON. Fixes pact adopt crashes 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

22 Mar 03:18

Choose a tag to compare

Type registry + enforcement + reconciliation. Zero cross-component type divergence on Exemplar test project.

v0.8.4: Pre-validation reconciliation

22 Mar 03:13

Choose a tag to compare

Re-enforces registry on all contracts before validation. Reconciles non-registry types across components.