NoWreck v0.12.0 — Provider Consolidation + Scan Caching NoWreck v0.12.0, a deterministic structural verifier for AI-generated code-change claims, introduces provider consolidation and file-level scan caching. The update unifies provider resolution into a single function and adds caching to speed up scans of large repositories. NoWreck v0.12.0 — Provider Consolidation + Scan Caching Deterministic AI Verifier — v0.12.0 NoWreck is a deterministic structural verifier for AI-generated code-change claims. When an AI describes a code change, NoWreck compares the claims against structural evidence derived by its own scanners — the verifier never asks another AI for an opinion. Where the evidence comes from depends on the mode: in Pre/Post and Claims modes, from actual before/after repository snapshots; in Prompt Mode, from the model's own proposed diff. bash $ nowreck fix "Add email validation to auth.py" Summary ──────────────────── ● 3 claims total ● 2 confirmed ● 1 contradicted CONFIRMED ───────── ✓ ADD FUNCTION validate email → auth.py conf: 100% Evidence: Function 'validate email' was added in auth.py CONTRADICTED ──────────── ✗ CALLS FUNCTION validate email → auth.py conf: 100% Evidence: Function 'validate email' was added in auth.py Release date: August 2026 Previous release: v0.11.1 Bugfix Release Focus: Two infrastructure improvements — consolidate provider resolution into a single function and add file-level scan caching for large repositories. What's new in v0.12.0 Provider consolidation ✅ Provider detection was split between two independent functions — auth header in provider.py and detect adapter in adapters.py — both doing URL-matching independently. A new provider required updating both, and they had to agree. Now a single resolve provider base url, override function returns both the adapter and the auth header type in one call: ModelProvider. default http call │ └── resolve provider base url, provider → ProviderInfo Single URL matching in adapters.py: "api.anthropic.com" → AnthropicAdapter, x-api-key "generativelanguage.googleapis.com" → GeminiAdapter, x-goog-api-key else → OpenAIAdapter, Authorization: Bearer One call. One URL match. Adapter and auth header always agree. New: ProviderInfo dataclass, resolve provider function. Removed: auth header standalone function replaced by auth header from type . Deprecated: detect adapter still works, delegates to resolve provider . Scan caching ✅ Every nowreck fix run re-scans every file in the repository from scratch. For a repository with 500+ source files, this means 500+ parse operations per run. Now RepositoryScanner.scan caches per-file results in .nowreck/cache/. On subsequent runs, only files that actually changed are re-parsed: RepositoryScanner.scan → ScanCache.get file path, mtime, size, content hash → If hit: use cached result no parse needed → If miss: parse, then cache result → ScanCache.save atomic write to .nowreck/cache/scan cache.json Cache key: path, mtime, size, content hash — MD5 of file contents catches same-size rewrites within the same filesystem timestamp quantum. Cache format: Python files: source text stored; ast.Module reconstructed via ast.parse on load JS/TS/Rust/Go files: symbol lists stored directly Invalidation: mtime, size, content hash, or version mismatch → re-parse. Version bump forces full re-parse. Cache is gitignored by .nowreck/. New: ScanCache, CacheEntry, file content hash in scanner/scan cache.py. Modified: RepositoryScanner.scan integrates cache transparently. New: Symbol.to dict / Symbol.from dict for JSON round-tripping.