{"slug": "nowreck-v0-12-0-provider-consolidation-scan-caching", "title": "NoWreck v0.12.0 — Provider Consolidation + Scan Caching", "summary": "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.", "body_md": "**NoWreck v0.12.0 — Provider Consolidation + Scan Caching**\n\n**Deterministic AI Verifier** — v0.12.0\n\nNoWreck 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.\n\n``` bash\n$ nowreck fix \"Add email validation to auth.py\"\n\n  Summary\n  ────────────────────\n  ● 3 claims total\n  ● 2 confirmed\n  ● 1 contradicted\n\n  CONFIRMED\n  ─────────\n  ✓ ADD_FUNCTION validate_email → auth.py  (conf: 100%)\n    Evidence: Function 'validate_email' was added in auth.py\n\n  CONTRADICTED\n  ────────────\n  ✗ CALLS_FUNCTION validate_email → auth.py  (conf: 100%)\n    Evidence: Function 'validate_email' was added in auth.py\n```\n\nRelease date: August 2026\n\nPrevious release: v0.11.1 (Bugfix Release)\n\nFocus: Two infrastructure improvements — consolidate provider resolution\n\ninto a single function and add file-level scan caching for large repositories.\n\nWhat's new in v0.12.0\n\n**Provider consolidation ✅**\n\nProvider detection was split between two independent functions —\n\n_auth_header() in provider.py and detect_adapter() in adapters.py —\n\nboth doing URL-matching independently. A new provider required updating both,\n\nand they had to agree.\n\nNow a single resolve_provider(base_url, override) function returns both\n\nthe adapter and the auth header type in one call:\n\nModelProvider._default_http_call()\n\n│\n\n└── resolve_provider(base_url, provider) → ProviderInfo\n\nSingle URL matching in adapters.py:\n\n\"api.anthropic.com\" → (AnthropicAdapter, x-api-key)\n\n\"generativelanguage.googleapis.com\" → (GeminiAdapter, x-goog-api-key)\n\nelse → (OpenAIAdapter, Authorization: Bearer)\n\nOne call. One URL match. Adapter and auth header always agree.\n\nNew: ProviderInfo dataclass, resolve_provider() function.\n\nRemoved: _auth_header() standalone function (replaced by _auth_header_from_type()).\n\nDeprecated: detect_adapter() (still works, delegates to resolve_provider()).\n\n**Scan caching ✅**\n\nEvery nowreck fix run re-scans every file in the repository from scratch.\n\nFor a repository with 500+ source files, this means 500+ parse operations\n\nper run.\n\nNow RepositoryScanner.scan() caches per-file results in .nowreck/cache/.\n\nOn subsequent runs, only files that actually changed are re-parsed:\n\nRepositoryScanner.scan()\n\n→ ScanCache.get(file_path, mtime, size, content_hash)\n\n→ If hit: use cached result (no parse needed)\n\n→ If miss: parse, then cache result\n\n→ ScanCache.save() (atomic write to .nowreck/cache/scan_cache.json)\n\nCache key: (path, mtime, size, content_hash) — MD5 of file contents\n\ncatches same-size rewrites within the same filesystem timestamp quantum.\n\nCache format:\n\n```\nPython files: source text stored; ast.Module reconstructed via ast.parse() on load\nJS/TS/Rust/Go files: symbol lists stored directly\n```\n\nInvalidation: mtime, size, content hash, or version mismatch → re-parse.\n\nVersion bump forces full re-parse. Cache is gitignored by .nowreck/.\n\nNew: ScanCache, CacheEntry, file_content_hash() in scanner/scan_cache.py.\n\nModified: RepositoryScanner.scan() integrates cache transparently.\n\nNew: Symbol.to_dict() / Symbol.from_dict() for JSON round-tripping.", "url": "https://wpnews.pro/news/nowreck-v0-12-0-provider-consolidation-scan-caching", "canonical_source": "https://dev.to/astralxvoid/nowreck-v0120-provider-consolidation-scan-caching-49ne", "published_at": "2026-08-28 14:00:34+00:00", "updated_at": "2026-08-28 14:20:30.775013+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["NoWreck", "Anthropic", "Gemini", "OpenAI"], "alternates": {"html": "https://wpnews.pro/news/nowreck-v0-12-0-provider-consolidation-scan-caching", "markdown": "https://wpnews.pro/news/nowreck-v0-12-0-provider-consolidation-scan-caching.md", "text": "https://wpnews.pro/news/nowreck-v0-12-0-provider-consolidation-scan-caching.txt", "jsonld": "https://wpnews.pro/news/nowreck-v0-12-0-provider-consolidation-scan-caching.jsonld"}}