Releases: IronAdamant/Chisel
v0.11.0 — Phase 15/16 MCP gap closures (file locks, record_result visibility, uniform risk warnings, working_tree coupling)
v0.11.0 — Phase 15/16 MCP gap closures for LLM agents
Added
- File lock integration: Advisory locks (
acquire_file_locketc.) are now visible inanalyze/update(active_file_locks,locked_files_sample) andrisk_map/triage(locked_byon files +active_locks/lock_claimsin_meta). Fully wired to the main DB and working-tree flows. - Observable
record_result:suggest_testsnow returnsfailure_rateandfailure_booston every item so the effect of recording flaky tests is directly visible. - Uniform risk detection:
_metainrisk_mapandtriagenow includesuniform_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
couplingsupportsworking_tree=true: On-disk static import extraction for untracked files → immediate non-zeroimport_coupling/import_partners(huge win during active refactoring).stale_testsnow acceptsworking_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
Fixes 5 issues surfaced by external MCP testing in chisel_open.md, plus a substantial new feature for dynamic plugin loaders.
Bug fixes
suggest_testssymbol-collision — the name-only edge fallback (tier 4) leaked across files, so a baredispatch()call edged to every file defining adispatchsymbol. Now scoped to files the test actually imports. EliminatesloadPlugin/dispatch/listFunctionsreproductions.diff_impactstale_dbover-trigger — tracked diff files are now filtered by indexed code extensions, so.md/.json/.dbedits no longer flag stale_db.- Cycle false-positives —
_find_circular_dependencieswas being fed undirected neighbors which collapsed bow-tie DAGs into giant fake cycles. Newget_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_mapproximity adjustment uses hard edges only — soft edges don't understatecoverage_gap.- Fan-out cap of 50 files per dynamic-require dep — pattern still surfaces via
unknown_require_countandhidden_risk_factoreven when edges aren't emitted.
New regex: _JS_REQUIRE_PATH_JOIN_RE captures require(path.join(__dirname, '<dir>', var)) — previously invisible.
Agent UX
suggest_testsschema now documents source confidence ranking:hybrid > direct > import_graph > co_change > static_require > working_tree > fallback.dispatch_toolappends awarn_eval_usednext-step whensuggest_testsis queried on a JS/TS file containingeval(...)ornew 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
Fixed
Resolved 29 ruff errors that were blocking the CI matrix. No behavior changes.
chisel/engine.py: MovedJobCancelledErrorclass andloggerassignment below the import block (was triggering 12× E402). Removed unusedStaticImportIndeximport (F401). Removed unusedlang = self.mapper.detect_framework(tf)local (F841).chisel/mcp_server.py: Removed unusedfrom socketserver import ThreadingMixIn(F401).examples/extractors/lsp_symbol_extractor.py: Removed unusedimport uuid(F401).examples/extractors/swift_syntax_extractor.py: Added# noqa: F403 / F405on the star import and the symbols it provides (intentional — optional third-party dep).tests/test_language_frameworks.py: Removed unusedimport 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
Fixed
- Silent exception swallowing:
engine._load_shard_confignow logs a warning when.chisel/shards.tomlfails to parse instead of silently returning an empty config.storage._execute/_executemanyemit a warning whenSQLITE_BUSYpersists past the retry cap (in addition to existing debug logs).static_test_imports.StaticImportIndexdebug-logs the path and error when an untracked test file can't be read, instead of silently skipping.
_try_auto_updaterace 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_updateskip reasons surfaced to agents: Whenauto_update=Trueis skipped (bg job running or >50 files changed), the response includes an explicitauto_update_skip_reasonfield and a reason-specific hint. Applied tosuggest_testsanddiff_impactstale-DB envelopes;test_gapslogs a warning.risk_mapandtriagealready exposed this via_meta.
Changed
- Documentation parity sweep: Tool count (
22/24→26= 20 functional + 6 file-lock), CLI subcommand count (17/18→28), and SQLite table count (10/13→17) corrected across CLAUDE.md, README.md, CONTRIBUTING.md, ARCHITECTURE.md, COMPLETE_PROJECT_DOCUMENTATION.md, andwiki-local/spec-project.md. ARCHITECTURE.md tool table gainedoptimize_storageandcancel_joband fixed the file-lock tool names (acquire_lock→acquire_file_lock, etc.) to matchschemas.py.
v0.9.0 — Monorepo SQLite sharding, auto-fallback, chisel run
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. analyzeauto-fallback to background job: Withforce=Trueon repos with >300 code files,analyzeautomatically queues a background job and returns{status: \"auto_queued\", job_id: ..., kind: \"analyze\"}to avoid MCP timeouts.exclude_new_file_boostparameter:risk_mapandtriageacceptexclude_new_file_boost=Trueto suppress the 0.5 new-file boost for stable long-term audits.auto_updateparameter for read-only tools:diff_impact,suggest_tests,risk_map,test_gaps, andtriageacceptauto_update=True— Chisel does a lightweight inlineupdate()if the DB is stale. Capped at 50 changed files; skipped when a bg job is running.chisel runCLI subcommand:chisel run -- <test-command>runs tests and callsrecord_resultfor 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, plusdocs/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
Fixed
- Version sync:
chisel.__version__was out of sync withpyproject.tomlin the 0.8.2 release, causing CI failures. Realigned to 0.8.3.
v0.8.2 — optimize_storage, job cancellation, framework fixtures
Highlights
Added
optimize_storageMCP tool: RunsPRAGMA optimizeand conditionalVACUUMwhen 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 adirectoryparameter and aggregates suggestions for all code files under that path. - Background job cancellation & events:
cancel_jobtool,cancel_requested_atflag,JobCancelledError, and ajob_eventstable.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_mapworking_treeparameter: includes untracked code files in risk scoring with anew_file_boostof 0.5 so new files surface.test_gapsworking-tree elevation: gaps from untracked files sort to the top of the list.suggest_tests/diff_impactdirectory-aware stem matching: same-directory tests strongly preferred over fuzzy substring matches.diff_impactstale-DB detection: returns{status: \"stale_db\", ...}when changed files aren't in the DB.suggest_testsauto-fallback: self-healing for newly tracked/created files with no edges.start_job/job_statusprogress tracking: jobs reportprogress_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_updaterecommendstart_jobfor 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_mapdefaults: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(restoredwith self._conn as conn:wrappers). risk_mapcrash withworking_tree=true(KeyError: 'heuristic').suggest_tests/diff_impacttimeouts under working-tree load (StaticImportIndexcaching).storage.pyread-only transaction error on SELECT queries.
See CHANGELOG.md for the full list.
v0.8.1 — working-tree output caps & diff_impact stem matching
Fixed
suggest_testsworking-tree output cap: Added_WORKING_TREE_SUGGEST_LIMIT = 30so results don't explode in large projects with many untracked files.diff_impactstem-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 withpyproject.toml.
v0.8.0 — Dynamic require detection & shadow graph
Highlights
- Variable taint tracking for JS/TS:
const/let/var X = './path'assignments resolverequire(variable)calls — known vars upgrade totainted_import(confidence=1.0); unknown staydynamic_import(confidence=0.3). shadow_graphinstats:tool_stats()returns totals for call/import/dynamic/eval/tainted edges plusunknown_shadow_ratio.- Per-file dynamic risk fields in
risk_map:shadow_edge_count,dynamic_edge_count,unknown_require_count,hidden_risk_factor. coverage_depthadded to risk formula (6th component):min(distinct_covering_tests/5, 1.0)with weight 0.10.test_instabilityweight 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_mapreweighting now correctly handles 6 components (was 5) when 3+ are uniform.
See CHANGELOG.md for the full list.
chisel-test-impact 0.7.0
Highlights
- Static test discovery: When DB test edges are missing,
suggest_testsscans test files forrequire/importpaths (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: Structuredgit_errorwitherror,cwd, and hints when git is unavailable.- LLM contract:
chisel/llm_contract.py,docs/LLM_CONTRACT.md, schema trust notes, improvednext_stepsforcoupling(dict response) andsuggest_tests.
Install: pip install chisel-test-impact==0.7.0
Stdlib-only core; see docs/ZERO_DEPS.md and docs/LLM_CONTRACT.md.