Skip to content

Releases: IronAdamant/Chisel

v0.11.0 — Phase 15/16 MCP gap closures (file locks, record_result visibility, uniform risk warnings, working_tree coupling)

15 May 04:07

Choose a tag to compare

v0.11.0 — Phase 15/16 MCP gap closures for LLM agents

Added

  • File lock integration: Advisory locks (acquire_file_lock etc.) are now visible in analyze/update (active_file_locks, locked_files_sample) and risk_map/triage (locked_by on files + active_locks/lock_claims in _meta). Fully wired to the main DB and working-tree flows.
  • Observable record_result: suggest_tests now returns failure_rate and failure_boost on every item so the effect of recording flaky tests is directly visible.
  • Uniform risk detection: _meta in risk_map and triage now includes uniform_risk_groups, max_identical_risk_files, and warnings when multiple files share identical risk scores (the exact gap reported by the Phase 15 CrossMCP probes).

Changed

  • coupling supports working_tree=true: On-disk static import extraction for untracked files → immediate non-zero import_coupling / import_partners (huge win during active refactoring).
  • stale_tests now accepts working_tree (MCP parity).
  • Job system robustness: Guard against thread launch failures after the in-progress flag is set (reduces "background thread not returning" errors).

Fixed

  • Multiple surfaces for parallel-agent + heavy working-tree scenarios, as stress-tested by the full 25-tool Phase 15 validation matrix in RecipeLab_alt (ChiselJobLockFlakinessOrchestrator, 200+ file moves, BaseImporter, RouteLoader split, etc.).

Grok Build edited this iteration while closing the chisel_open.md findings (renamed to chisel_closed.md).

Full details: CHANGELOG.md

v0.10.0 — Dynamic-require edges, symbol-collision fix, cycle SCC

29 Apr 10:30

Choose a tag to compare

Fixes 5 issues surfaced by external MCP testing in chisel_open.md, plus a substantial new feature for dynamic plugin loaders.

Bug fixes

  • suggest_tests symbol-collision — the name-only edge fallback (tier 4) leaked across files, so a bare dispatch() call edged to every file defining a dispatch symbol. Now scoped to files the test actually imports. Eliminates loadPlugin / dispatch / listFunctions reproductions.
  • diff_impact stale_db over-trigger — tracked diff files are now filtered by indexed code extensions, so .md / .json / .db edits no longer flag stale_db.
  • Cycle false-positives_find_circular_dependencies was being fed undirected neighbors which collapsed bow-tie DAGs into giant fake cycles. New get_imported_files_batch (directed, hard edges only) used for cycle detection.

New feature: dynamic-require edge resolution

require() patterns the static parser can partially see are now first-class import edges, scaled by confidence:

  • Hard imports (import / from … import) → confidence 1.0
  • Tainted imports (const P = './x'; require(P)) → confidence 1.0 (variable taint already resolved)
  • Dynamic imports (template literal, string concat, path.join(__dirname, 'plugins', name)) → confidence 0.2–0.4

Schema migration: import_edges gains a confidence REAL NOT NULL DEFAULT 1.0 column (existing rows default to 1.0, fully backward compatible).

The closure traversal in get_impacted_tests accumulates _IMPORT_HOP_DECAY × edge_confidence per hop, so tests of dynamically-loaded plugins now surface — at proportionally lower relevance and tagged via dynamic require() in the reason text.

Safety guards:

  • Cycle detection uses min_confidence=1.0 — soft edges can't create false cycles.
  • risk_map proximity adjustment uses hard edges only — soft edges don't understate coverage_gap.
  • Fan-out cap of 50 files per dynamic-require dep — pattern still surfaces via unknown_require_count and hidden_risk_factor even when edges aren't emitted.

New regex: _JS_REQUIRE_PATH_JOIN_RE captures require(path.join(__dirname, '<dir>', var)) — previously invisible.

Agent UX

  • suggest_tests schema now documents source confidence ranking: hybrid > direct > import_graph > co_change > static_require > working_tree > fallback.
  • dispatch_tool appends a warn_eval_used next-step when suggest_tests is queried on a JS/TS file containing eval(...) or new Function(...) — agents now see when the import graph is necessarily incomplete for that file.

Tests

795 passed (was 777 before this release). +18 regression tests covering symbol collision, diff_impact extension filter, directed-SCC cycle detection, dynamic-require resolution (5 forms), fan-out cap, proximity-vs-soft-edges, and eval-warning surfacing.

v0.9.2 — CI lint fixes

17 Apr 01:58

Choose a tag to compare

Fixed

Resolved 29 ruff errors that were blocking the CI matrix. No behavior changes.

  • chisel/engine.py: Moved JobCancelledError class and logger assignment below the import block (was triggering 12× E402). Removed unused StaticImportIndex import (F401). Removed unused lang = self.mapper.detect_framework(tf) local (F841).
  • chisel/mcp_server.py: Removed unused from socketserver import ThreadingMixIn (F401).
  • examples/extractors/lsp_symbol_extractor.py: Removed unused import uuid (F401).
  • examples/extractors/swift_syntax_extractor.py: Added # noqa: F403 / F405 on the star import and the symbols it provides (intentional — optional third-party dep).
  • tests/test_language_frameworks.py: Removed unused import os (F401).

ruff check . now passes; 777 tests pass locally.

Install

```bash
pip install chisel-test-impact==0.9.2
```

v0.9.1 — silent-swallow logging, auto_update hints, doc parity

17 Apr 01:58

Choose a tag to compare

Fixed

  • Silent exception swallowing:
    • engine._load_shard_config now logs a warning when .chisel/shards.toml fails to parse instead of silently returning an empty config.
    • storage._execute / _executemany emit a warning when SQLITE_BUSY persists past the retry cap (in addition to existing debug logs).
    • static_test_imports.StaticImportIndex debug-logs the path and error when an untracked test file can't be read, instead of silently skipping.
  • _try_auto_update race window: _scan_code_files() now runs inside the exclusive lock held by _try_auto_update, so concurrent writers can't add files between the scan and the hash-based change check.
  • auto_update skip reasons surfaced to agents: When auto_update=True is skipped (bg job running or >50 files changed), the response includes an explicit auto_update_skip_reason field and a reason-specific hint. Applied to suggest_tests and diff_impact stale-DB envelopes; test_gaps logs a warning. risk_map and triage already exposed this via _meta.

Changed

  • Documentation parity sweep: Tool count (22/2426 = 20 functional + 6 file-lock), CLI subcommand count (17/1828), and SQLite table count (10/1317) corrected across CLAUDE.md, README.md, CONTRIBUTING.md, ARCHITECTURE.md, COMPLETE_PROJECT_DOCUMENTATION.md, and wiki-local/spec-project.md. ARCHITECTURE.md tool table gained optimize_storage and cancel_job and fixed the file-lock tool names (acquire_lockacquire_file_lock, etc.) to match schemas.py.

v0.9.0 — Monorepo SQLite sharding, auto-fallback, chisel run

17 Apr 01:58

Choose a tag to compare

Highlights

Added

  • Monorepo SQLite sharding: Large repos can shard analysis data across multiple SQLite databases. Set CHISEL_SHARDS=frontend,backend (or create .chisel/shards.toml) to split data by top-level directory. All query tools auto-aggregate; write tools route to the correct shard by file path.
  • analyze auto-fallback to background job: With force=True on repos with >300 code files, analyze automatically queues a background job and returns {status: \"auto_queued\", job_id: ..., kind: \"analyze\"} to avoid MCP timeouts.
  • exclude_new_file_boost parameter: risk_map and triage accept exclude_new_file_boost=True to suppress the 0.5 new-file boost for stable long-term audits.
  • auto_update parameter for read-only tools: diff_impact, suggest_tests, risk_map, test_gaps, and triage accept auto_update=True — Chisel does a lightweight inline update() if the DB is stale. Capped at 50 changed files; skipped when a bg job is running.
  • chisel run CLI subcommand: chisel run -- <test-command> runs tests and calls record_result for each detected test. Supports pytest and Jest out of the box; Go and Rust scaffolded.
  • Extractor plugin examples: examples/extractors/tree_sitter_js_extractor.py, swift_syntax_extractor.py, lsp_symbol_extractor.py, plus docs/EXTRACTOR_ECOSYSTEM.md.

Changed

  • Documentation: README, docs/LLM_CONTRACT.md, docs/AGENT_PLAYBOOK.md, docs/CUSTOM_EXTRACTORS.md, and ARCHITECTURE updated for sharding, auto-fallback, and the extractor ecosystem.

See CHANGELOG.md for the full list.

v0.8.3 — version sync fix

17 Apr 01:57

Choose a tag to compare

Fixed

  • Version sync: chisel.__version__ was out of sync with pyproject.toml in the 0.8.2 release, causing CI failures. Realigned to 0.8.3.

v0.8.2 — optimize_storage, job cancellation, framework fixtures

17 Apr 01:57

Choose a tag to compare

Highlights

Added

  • optimize_storage MCP tool: Runs PRAGMA optimize and conditional VACUUM when the WAL grows large.
  • Incremental import graph rebuilds: _rebuild_import_edges() now only rebuilds edges for changed files — O(all_files)O(changed_files). Keeps 1k+ file monorepo updates under 3 seconds.
  • Directory-scoped suggest_tests: accepts a directory parameter and aggregates suggestions for all code files under that path.
  • Background job cancellation & events: cancel_job tool, cancel_requested_at flag, JobCancelledError, and a job_events table. analyze()/update() check for cancellation at phase boundaries.
  • Framework fixture test suite (tests/test_language_frameworks.py): C#, Java, Rust, Swift, and Go module-aware import resolution.
  • risk_map working_tree parameter: includes untracked code files in risk scoring with a new_file_boost of 0.5 so new files surface.
  • test_gaps working-tree elevation: gaps from untracked files sort to the top of the list.
  • suggest_tests/diff_impact directory-aware stem matching: same-directory tests strongly preferred over fuzzy substring matches.
  • diff_impact stale-DB detection: returns {status: \"stale_db\", ...} when changed files aren't in the DB.
  • suggest_tests auto-fallback: self-healing for newly tracked/created files with no edges.
  • start_job/job_status progress tracking: jobs report progress_pct (0–100).
  • Heuristic edge backfill during analyze/update: filename-based edges auto-created for test files with no DB edges.
  • Project fingerprint: stored in meta.project_fingerprint; warns on cross-project DB reuse.
  • MCP timeout hints: tool_analyze/tool_update recommend start_job for large repos.

Changed

  • Risk formula: new_file_boost (0.0/0.5) added. Files with no history and no tests score ~0.75 instead of ~0.25.
  • Coupling formula: import-graph coupling is now first-class — max(cochange, import, 0.5*cochange + 0.5*import).
  • risk_map defaults: coverage_mode=\"line\", proximity_adjustment=True.
  • Single-author co-change threshold halving: solo-dev commit patterns now surface coupling signal.
  • Coverage gap granularity: 4 → 20 quantization steps (0.05 increments).
  • Risk reweighting threshold: triggers on 2+ uniform components or any zero-valued uniform component.

Fixed

  • SQLite concurrency stability in storage.py (restored with self._conn as conn: wrappers).
  • risk_map crash with working_tree=true (KeyError: 'heuristic').
  • suggest_tests/diff_impact timeouts under working-tree load (StaticImportIndex caching).
  • storage.py read-only transaction error on SELECT queries.

See CHANGELOG.md for the full list.

v0.8.1 — working-tree output caps & diff_impact stem matching

17 Apr 01:57

Choose a tag to compare

Fixed

  • suggest_tests working-tree output cap: Added _WORKING_TREE_SUGGEST_LIMIT = 30 so results don't explode in large projects with many untracked files.
  • diff_impact stem-matching fallback: Untracked/changed files with no DB edges now fall back to stem-matching instead of returning empty results.
  • Version sync: chisel.__version__ realigned with pyproject.toml.

v0.8.0 — Dynamic require detection & shadow graph

17 Apr 01:57

Choose a tag to compare

Highlights

  • Variable taint tracking for JS/TS: const/let/var X = './path' assignments resolve require(variable) calls — known vars upgrade to tainted_import (confidence=1.0); unknown stay dynamic_import (confidence=0.3).
  • shadow_graph in stats: tool_stats() returns totals for call/import/dynamic/eval/tainted edges plus unknown_shadow_ratio.
  • Per-file dynamic risk fields in risk_map: shadow_edge_count, dynamic_edge_count, unknown_require_count, hidden_risk_factor.
  • coverage_depth added to risk formula (6th component): min(distinct_covering_tests/5, 1.0) with weight 0.10. test_instability weight reduced 0.10 → 0.05.
  • hidden_risk_factor: additive 0–0.15 from dynamic/eval edge density, computed separately from the 6-component reweighting.
  • Confidence-weighted edges: weight = proximity * sqrt(confidence) so low-confidence requires contribute proportionally less to impact scores.

Fixed

  • risk_map reweighting now correctly handles 6 components (was 5) when 3+ are uniform.

See CHANGELOG.md for the full list.

chisel-test-impact 0.7.0

27 Mar 10:30

Choose a tag to compare

Highlights

  • Static test discovery: When DB test edges are missing, suggest_tests scans test files for require/import paths (merged with git/DB impact as hybrid when both agree).
  • Working tree: Untracked test files and git-untracked source paths participate in static resolution when working_tree=true.
  • Go: Import path resolution for static edges (with existing JS/TS/Python heuristics via import_graph).
  • diff_impact: Structured git_error with error, cwd, and hints when git is unavailable.
  • LLM contract: chisel/llm_contract.py, docs/LLM_CONTRACT.md, schema trust notes, improved next_steps for coupling (dict response) and suggest_tests.

Install: pip install chisel-test-impact==0.7.0

Stdlib-only core; see docs/ZERO_DEPS.md and docs/LLM_CONTRACT.md.