<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AstralXVoid</title>
    <description>The latest articles on DEV Community by AstralXVoid (@astralxvoid).</description>
    <link>https://dev.to/astralxvoid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4037176%2F971c361b-4c53-44c1-930c-3b3ca1841a0c.png</url>
      <title>DEV Community: AstralXVoid</title>
      <link>https://dev.to/astralxvoid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/astralxvoid"/>
    <language>en</language>
    <item>
      <title>NoWreck v0.16.0 — Verifiable Body Edits + Method Call Detection</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Tue, 08 Sep 2026 00:50:00 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreck-v0160-verifiable-body-edits-method-call-detection-3mh2</link>
      <guid>https://dev.to/astralxvoid/nowreck-v0160-verifiable-body-edits-method-call-detection-3mh2</guid>
      <description>&lt;p&gt;*&lt;em&gt;NoWreck v0.16.0 *&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AstralXVoid" rel="noopener noreferrer"&gt;
        AstralXVoid
      &lt;/a&gt; / &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;
        NoWreck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NoWreck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier&lt;/strong&gt; — v0.16.0&lt;/p&gt;


&lt;/div&gt;

&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/644744641-49b7222a-5f92-47c5-880c-42646833e788.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg4Mjg5MDAsIm5iZiI6MTc4ODgyODYwMCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ0NzQ0NjQxLTQ5YjcyMjJhLTVmOTItNDdjNS04ODBjLTQyNjQ2ODMzZTc4OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwOFQwMDUwMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lYzU1YzYwODQ0NDI2ZjMxMDg1NDA0YzM2ZGY1MWU2YzcyZDU0MGZjY2Q1OTViMzBlYTNjMmIxOGQ2MTdkM2YxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.AaW2T4NEw9xsc2TX68IKOuZONB42yEsW41UntDhs50g"&gt;&lt;img width="140" height="140" alt="tom" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F644744641-49b7222a-5f92-47c5-880c-42646833e788.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg4Mjg5MDAsIm5iZiI6MTc4ODgyODYwMCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ0NzQ0NjQxLTQ5YjcyMjJhLTVmOTItNDdjNS04ODBjLTQyNjQ2ODMzZTc4OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwOFQwMDUwMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lYzU1YzYwODQ0NDI2ZjMxMDg1NDA0YzM2ZGY1MWU2YzcyZDU0MGZjY2Q1OTViMzBlYTNjMmIxOGQ2MTdkM2YxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.AaW2T4NEw9xsc2TX68IKOuZONB42yEsW41UntDhs50g" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div&gt;NoWreck is a deterministic structural verifier for AI-generated code-change
claims.&lt;br&gt;
&lt;/div&gt; 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
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/645818924-07dcbbe2-acf8-4819-8c0d-8ea880977a95.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg4Mjg5MDAsIm5iZiI6MTc4ODgyODYwMCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ1ODE4OTI0LTA3ZGNiYmUyLWFjZjgtNDgxOS04YzBkLThlYTg4MDk3N2E5NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwOFQwMDUwMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iMWEyNTEwN2IxYjhmZjNiYjI5NjNmMTczNGMwMGNhNGJhM2Y0ZTJhNTY0NTYwZTVhNjg1NjY2M2JhYTlkZWIwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.6qUFHTeodl5oJHglgJ-gfSEaqR5dZHC3Bc4KxEk58KM"&gt;&lt;img width="1536" height="1024" alt="ChatGPT Image Sep 3, 2026, 09_45_07 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F645818924-07dcbbe2-acf8-4819-8c0d-8ea880977a95.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg4Mjg5MDAsIm5iZiI6MTc4ODgyODYwMCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ1ODE4OTI0LTA3ZGNiYmUyLWFjZjgtNDgxOS04YzBkLThlYTg4MDk3N2E5NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwOFQwMDUwMDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iMWEyNTEwN2IxYjhmZjNiYjI5NjNmMTczNGMwMGNhNGJhM2Y0ZTJhNTY0NTYwZTVhNjg1NjY2M2JhYTlkZWIwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.6qUFHTeodl5oJHglgJ-gfSEaqR5dZHC3Bc4KxEk58KM" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it catches&lt;/h2&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;

&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Release date: September 2026&lt;br&gt;&lt;br&gt;
Previous release: v0.15.0 (PyPI Publishing)&lt;br&gt;&lt;br&gt;
Focus: Claim "I modified X" and have it verified — structural body-diff&lt;br&gt;&lt;br&gt;
hashes (CHANGED_FUNCTION / CHANGED_CLASS), member/attribute call&lt;br&gt;&lt;br&gt;
detection across all five languages, Python async indexing, and four&lt;br&gt;&lt;br&gt;
pre-existing bug fixes (Part B).&lt;br&gt;&lt;br&gt;
What's new in v0.16.0&lt;br&gt;&lt;br&gt;
CHANGED_FUNCTION / CHANGED_CLASS — verifiable body edits ✅

&lt;p&gt;Two new claim types let a model say "I modified this function/class"&lt;br&gt;
instead of only add/remove:&lt;br&gt;
Claim type  Verified by&lt;br&gt;
CHANGED_FUNCTION    Structural body-diff (function / method body)&lt;br&gt;
CHANGED_CLASS   Structural body-diff (class shell — fields, bases, decorators)&lt;/p&gt;

&lt;p&gt;Every symbol in all five languages (Python/JS/TS/TSX/Rust/Go) now carries a&lt;br&gt;
formatting-insensitive structural body hash:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A real edit always changes the hash → the claim CONFIRMED
Reformat-only, comment-only, whitespace, and string quote-style edits do
not → no false CHANGED_*
Method body edits fire CHANGED_FUNCTION with the enclosing class, never
CHANGED_CLASS (disjoint facts); class-shell edits fire only
CHANGED_CLASS
Method-call claims match evidence strictly on parent_class — a
class-less claim cannot confirm against method evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Method / attribute call detection ✅&lt;/p&gt;

&lt;p&gt;CALLS_FUNCTION now captures member chains in every language:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;self.foo(), obj.bar(), a.b.c(), this.foo(), pkg.Func(),
s.foo() — resolved to the final name, with the caller's enclosing class
console.log() / logger.info() — captured now (previously excluded)
Excluded by design: receivers that are themselves calls (f().bar()) and
dunder-style names (obj.__x__())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Python async def is now indexed ✅&lt;/p&gt;

&lt;p&gt;async def functions and methods were invisible to the symbol index —&lt;br&gt;
every async claim was UNVERIFIABLE, even when true. They are now ordinary&lt;br&gt;
FUNCTION / METHOD symbols: ADD / REMOVE / CHANGED all verify, and a&lt;br&gt;
sync → async conversion of the same name is detected as a body change.&lt;br&gt;
Part B — pre-existing bug fixes folded in&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P1 (major): Prompt Mode never restored the working tree on git repos.
On a clean tree the patch survived every prompt-mode run; on a dirty tree
the patch survived the stash pop. save_before() now records exactly what
it did (clean / stashed / copy), and restore() reverts only the
patch's applied files to HEAD before popping a pushed stash — the
same-file case succeeds by construction, user edits return intact, and a
revert failure surfaces loudly with the stash preserved. New real-git test
file (tests/test_snapshot_manager_git.py, 13 tests).
P2 (major): async def invisible — see above; the pinning test was
flipped and README limitations de-scoped.
P3 (medium): scans wrote .nowreck/cache/ into the directories they
scanned. The persistent cache now runs only when the scanned root is the
current working directory (the live project). External snapshot dirs
(--pre A --post B, --compare git-archive temps) scan cache-free, and a
run-created .nowreck/cache/ is removed on restore when it did not
pre-exist.
P4 (low): CALL_REMOVED now renders with a human label in
unexplained-change lists and the prompt builder.
TS/TSX method decorators: a decorator edit on a method was invisible
to both the method hash and the class shell. Decorators are now folded
into the method's body hash — the edit fires CHANGED_FUNCTION (Python
parity), never CHANGED_CLASS.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Verification&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CHANGED_FUNCTION / CHANGED_CLASS claims verify CONFIRMED against real
body edits, CONTRADICTED by ADD/REMOVE evidence, UNVERIFIABLE against
nothing — in every language via the real --pre --post pipeline.
Cache schema v2: stale v1 caches are ignored and rebuilt with hashes;
body_hash round-trips through the cache.
SARIF: two new rules — NW016 HallucinatedFunctionChange,
NW017 HallucinatedClassChange (both error, on CONTRADICTED evidence).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>NoWreck v0.15.0 is on PyPI — `pip install nowreck` 🎉</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Fri, 04 Sep 2026 02:03:46 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreck-v0150-is-on-pypi-pip-install-nowreck-40ej</link>
      <guid>https://dev.to/astralxvoid/nowreck-v0150-is-on-pypi-pip-install-nowreck-40ej</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;NoWreck v0.15.0 is on PyPI — &lt;code&gt;pip install nowreck&lt;/code&gt;&lt;/strong&gt; 🎉
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AstralXVoid" rel="noopener noreferrer"&gt;
        AstralXVoid
      &lt;/a&gt; / &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;
        NoWreck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NoWreck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier&lt;/strong&gt; — v0.15.0&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/644744641-49b7222a-5f92-47c5-880c-42646833e788.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg0ODc4MjQsIm5iZiI6MTc4ODQ4NzUyNCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ0NzQ0NjQxLTQ5YjcyMjJhLTVmOTItNDdjNS04ODBjLTQyNjQ2ODMzZTc4OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA0JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwNFQwMjA1MjRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05YmM2Njg3MzVlODg1MDQxMmRhNjEyNDcwODAxNTVjMWFkOWM3M2M3NTE0YWI1OTJkNGRjODgwZWIyMzAyY2Q2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.j0oU_i6c7Db3trI3b6QNn735zF3_P1XUIvszysU9DVI"&gt;&lt;img width="140" height="140" alt="tom" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F644744641-49b7222a-5f92-47c5-880c-42646833e788.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg0ODc4MjQsIm5iZiI6MTc4ODQ4NzUyNCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ0NzQ0NjQxLTQ5YjcyMjJhLTVmOTItNDdjNS04ODBjLTQyNjQ2ODMzZTc4OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA0JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwNFQwMjA1MjRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05YmM2Njg3MzVlODg1MDQxMmRhNjEyNDcwODAxNTVjMWFkOWM3M2M3NTE0YWI1OTJkNGRjODgwZWIyMzAyY2Q2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.j0oU_i6c7Db3trI3b6QNn735zF3_P1XUIvszysU9DVI" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;NoWreck is a deterministic structural verifier for AI-generated code-change
claims.&lt;br&gt;
&lt;/div&gt; 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
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/645818924-07dcbbe2-acf8-4819-8c0d-8ea880977a95.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg0ODc4MjQsIm5iZiI6MTc4ODQ4NzUyNCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ1ODE4OTI0LTA3ZGNiYmUyLWFjZjgtNDgxOS04YzBkLThlYTg4MDk3N2E5NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA0JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwNFQwMjA1MjRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kZWIwYjc1ZDY3ZDljZWU4ZDVjNmVkYmE0NjRjMjJmNGE0ZDJjYzAyZGRlMTJlNDBiNTM0ZWY3ZjM5MzAxMDE1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.zrcSGLtoE4LnKbbwTsIOa_cHlt_rY44AVWz2-pp-DsY"&gt;&lt;img width="1536" height="1024" alt="ChatGPT Image Sep 3, 2026, 09_45_07 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F645818924-07dcbbe2-acf8-4819-8c0d-8ea880977a95.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODg0ODc4MjQsIm5iZiI6MTc4ODQ4NzUyNCwicGF0aCI6Ii8yODk3NzIxMzAvNjQ1ODE4OTI0LTA3ZGNiYmUyLWFjZjgtNDgxOS04YzBkLThlYTg4MDk3N2E5NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTA0JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwNFQwMjA1MjRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kZWIwYjc1ZDY3ZDljZWU4ZDVjNmVkYmE0NjRjMjJmNGE0ZDJjYzAyZGRlMTJlNDBiNTM0ZWY3ZjM5MzAxMDE1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.zrcSGLtoE4LnKbbwTsIOa_cHlt_rY44AVWz2-pp-DsY" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it catches&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier — now one command away.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NoWreck is a deterministic structural verifier for AI-generated code-change claims. When an AI describes a change to your code, NoWreck checks those claims against structural evidence from its own scanners — a function was actually added, a call actually exists, the diff actually matches the description. It never asks another AI for an opinion. No black box, no vibes: claims are confirmed or contradicted against real repository state, with confidence percentages and evidence on every result.&lt;/p&gt;

&lt;p&gt;Today, NoWreck gets its biggest milestone yet — &lt;strong&gt;it's now on PyPI&lt;/strong&gt;, so anyone can install it in seconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pipx &lt;span class="nb"&gt;install &lt;/span&gt;nowreck      &lt;span class="c"&gt;# or: pip install nowreck&lt;/span&gt;
nowreck &lt;span class="nt"&gt;--version&lt;/span&gt;         &lt;span class="c"&gt;# → nowreck 0.15.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;What's new in v0.15.0&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;code&gt;pip install nowreck&lt;/code&gt;&lt;/strong&gt; ✅
&lt;/h3&gt;

&lt;p&gt;Up until now, every user had to clone the repository and build in place:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/AstralXVoid/NoWreck.git
&lt;span class="nb"&gt;cd &lt;/span&gt;NoWreck
pipx &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's gone. NoWreck is live on &lt;a href="https://pypi.org/project/nowreck/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt; with the full README rendered on its project page — screenshots and all. Installing, upgrading, and dependency management now work the standard Python way, on Python 3.11+.&lt;/p&gt;

&lt;h3&gt;
  
  
  Properly packaged, the way a PyPI page should be ✅
&lt;/h3&gt;

&lt;p&gt;The release fills in everything a real distribution needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full metadata&lt;/strong&gt; — README, SPDX license expression (&lt;code&gt;FSL-1.1-MIT&lt;/code&gt;), Homepage + Source links, classifiers and keywords for discoverability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean artifacts&lt;/strong&gt; — &lt;code&gt;twine check&lt;/code&gt; passes on both the sdist and the wheel; the wheel ships exactly the &lt;code&gt;nowreck&lt;/code&gt; package and its license — no tests, samples, or stray files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A guard against version drift&lt;/strong&gt; — packaging tests now verify the version is consistent across every place it lives, so &lt;code&gt;pyproject.toml&lt;/code&gt;, the package, and the banner can never silently disagree&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Release-quality fixes that came out of verification
&lt;/h3&gt;

&lt;p&gt;Publishing forced us to actually run the pipeline the way a fresh machine would — and that honest rehearsal caught real problems, all fixed at the root:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CI test gate had &lt;strong&gt;no pytest declared at all&lt;/strong&gt; — a fresh runner would have failed with &lt;code&gt;No module named pytest&lt;/code&gt;. The &lt;code&gt;test&lt;/code&gt; extra now declares it properly.&lt;/li&gt;
&lt;li&gt;A set of terminal-integration tests that drive a real &lt;code&gt;tmux&lt;/code&gt; session were &lt;strong&gt;flaky under load&lt;/strong&gt; — their tight polling deadlines could randomly fail on a busy runner and block a release. They now use load-tolerant timeouts, stress-tested to zero flakes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: &lt;strong&gt;809 tests, all passing&lt;/strong&gt;, verified under both pytest 7.x and the current pytest 9.x.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;nowreck

&lt;span class="c"&gt;# Compare two real snapshots — deterministic, no API key needed&lt;/span&gt;
nowreck fix &lt;span class="nt"&gt;--pre&lt;/span&gt; ./repo-before &lt;span class="nt"&gt;--post&lt;/span&gt; ./repo-after

&lt;span class="c"&gt;# Same, but verify explicit claims against those snapshots (@file syntax)&lt;/span&gt;
nowreck fix &lt;span class="nt"&gt;--pre&lt;/span&gt; ./repo-before &lt;span class="nt"&gt;--post&lt;/span&gt; ./repo-after &lt;span class="nt"&gt;--claims&lt;/span&gt; @claims.json

&lt;span class="c"&gt;# Detect changes between this commit and the previous one (git repo)&lt;/span&gt;
nowreck fix &lt;span class="nt"&gt;--compare&lt;/span&gt; HEAD~1

&lt;span class="c"&gt;# Prompt Mode — an AI proposes the change and NoWreck verifies its claims&lt;/span&gt;
&lt;span class="c"&gt;# (requires one-time API key setup: nowreck config set api_key &amp;lt;key&amp;gt;)&lt;/span&gt;
nowreck fix &lt;span class="s2"&gt;"Add email validation to auth.py"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample output (Prompt Mode):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nowreck fix &lt;span class="s2"&gt;"Add email validation to auth.py"&lt;/span&gt;
&lt;span class="go"&gt;
  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
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What it catches
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim that a function was called when it wasn't&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explanation-vs-diff mismatches&lt;/strong&gt; — a description of a change that doesn't match the actual diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unexplained changes&lt;/strong&gt; — structural changes no supplied claim mentioned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NoWreck doesn't ask &lt;em&gt;"is this code good?"&lt;/em&gt; It asks one narrow question: &lt;em&gt;"do the supplied claims match the structural changes actually detected?"&lt;/em&gt; Nothing more, nothing less — no AI judge, no opinions, just evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  What hasn't changed
&lt;/h2&gt;

&lt;p&gt;This release is about distribution, not features. Every mode (Prompt / Pre-Post / Claims / Compare), all 13 claim types, the scanners, verifier, parsers, reporters, and exit codes are exactly as before — and the license stays &lt;strong&gt;FSL-1.1-MIT&lt;/strong&gt; (auto-converts to MIT in July 2028).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The project keeps shipping one narrow, well-tested increment per version. v0.14.0 brought &lt;code&gt;--claims @file.json&lt;/code&gt; for reading claims from files; v0.15.0 makes the tool installable anywhere. Watch the repo for what comes next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/nowreck/" rel="noopener noreferrer"&gt;pypi.org/project/nowreck&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;github.com/AstralXVoid/NoWreck&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://github.com/AstralXVoid/NoWreck/blob/main/use.md" rel="noopener noreferrer"&gt;use.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;NoWreck v0.15.0 — 809 tests passing, published via trusted publishing, verified with a clean &lt;code&gt;pip install nowreck&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>nowreck</category>
    </item>
    <item>
      <title>NoWreck Deterministic AI Verifier — v0.13.0</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Wed, 02 Sep 2026 18:02:47 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreckdeterministic-ai-verifier-v0130-b8p</link>
      <guid>https://dev.to/astralxvoid/nowreckdeterministic-ai-verifier-v0130-b8p</guid>
      <description>&lt;p&gt;&lt;strong&gt;NoWreck v0.13.0 — CI/CD Integration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AstralXVoid" rel="noopener noreferrer"&gt;
        AstralXVoid
      &lt;/a&gt; / &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;
        NoWreck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NoWreck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier&lt;/strong&gt; — v0.13.0&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/644744641-49b7222a-5f92-47c5-880c-42646833e788.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODgzNzI0NjcsIm5iZiI6MTc4ODM3MjE2NywicGF0aCI6Ii8yODk3NzIxMzAvNjQ0NzQ0NjQxLTQ5YjcyMjJhLTVmOTItNDdjNS04ODBjLTQyNjQ2ODMzZTc4OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTAyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwMlQxODAyNDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zMjhkNWQyZGVmN2I3NDlhZjQ3NzY4MWVlNjY1YWQ1YTZlZjdiZGQyMmYzMjk2YWEwMWU2Y2NkZGFjNTVhOGJhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ._oCqlibj7LaOzZHWPlaTTmoJasHgrtyoWAY4iTaQPec"&gt;&lt;img width="140" height="=" alt="tom" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F644744641-49b7222a-5f92-47c5-880c-42646833e788.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODgzNzI0NjcsIm5iZiI6MTc4ODM3MjE2NywicGF0aCI6Ii8yODk3NzIxMzAvNjQ0NzQ0NjQxLTQ5YjcyMjJhLTVmOTItNDdjNS04ODBjLTQyNjQ2ODMzZTc4OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTAyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwMlQxODAyNDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zMjhkNWQyZGVmN2I3NDlhZjQ3NzY4MWVlNjY1YWQ1YTZlZjdiZGQyMmYzMjk2YWEwMWU2Y2NkZGFjNTVhOGJhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ._oCqlibj7LaOzZHWPlaTTmoJasHgrtyoWAY4iTaQPec"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/645159096-a9aed9be-9d23-4f2d-8cbb-73e31986c226.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODgzNzI0NjcsIm5iZiI6MTc4ODM3MjE2NywicGF0aCI6Ii8yODk3NzIxMzAvNjQ1MTU5MDk2LWE5YWVkOWJlLTlkMjMtNGYyZC04Y2JiLTczZTMxOTg2YzIyNi5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTAyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwMlQxODAyNDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wYTdlNmVlMzEwNjljMDljZjE0NDE2ZTYzNzkxMjgxOGM0ZGQyZGYyNDdkMTI0YmU1NzlmNjNmODg2NjM4OWExJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZqcGVnIn0.2kgse8NxSGb0omqPjXN8u8OFSWaVZpDApn2Vrgoze-U"&gt;&lt;img width="1693" height="929" alt="ChatGPT Image Sep 2, 2026, 10_44_07 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F645159096-a9aed9be-9d23-4f2d-8cbb-73e31986c226.jpg%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODgzNzI0NjcsIm5iZiI6MTc4ODM3MjE2NywicGF0aCI6Ii8yODk3NzIxMzAvNjQ1MTU5MDk2LWE5YWVkOWJlLTlkMjMtNGYyZC04Y2JiLTczZTMxOTg2YzIyNi5qcGc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwOTAyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDkwMlQxODAyNDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wYTdlNmVlMzEwNjljMDljZjE0NDE2ZTYzNzkxMjgxOGM0ZGQyZGYyNDdkMTI0YmU1NzlmNjNmODg2NjM4OWExJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZqcGVnIn0.2kgse8NxSGb0omqPjXN8u8OFSWaVZpDApn2Vrgoze-U" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it catches&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Release date: August 2026&lt;br&gt;
Previous release: v0.12.0 (Provider Consolidation + Scan Caching)&lt;br&gt;
Focus: CI/CD integration with machine-readable output formats (SARIF, JUnit)&lt;br&gt;
and automated git comparison for pull request verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new in v0.13.0
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SARIF output ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SARIF v2.1.0 output for GitHub Code Scanning, SonarQube, and CodeQL.&lt;/p&gt;

&lt;p&gt;nowreck fix --compare HEAD~1 --format sarif &amp;gt; nowreck.sarif&lt;/p&gt;

&lt;p&gt;15 rules defined:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NW001-NW013: One per CONTRADICTED claim type (error level)
NW014: UNVERIFIABLE claims (warning level)
NW015: UNEXPLAINED changes (note level)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Design decisions:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONFIRMED results excluded by default (SARIF is for problems)
Uses ruleId (string) for GitHub UI readability
Each claim type gets its own rule for granular filtering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;JUnit XML output ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Standard JUnit XML format for Jenkins, GitLab CI, and Azure Pipelines.&lt;/p&gt;

&lt;p&gt;nowreck fix --compare HEAD~1 --format junit &amp;gt; nowreck-junit.xml&lt;/p&gt;

&lt;p&gt;Verdict mapping:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONFIRMED → pass (no element)
CONTRADICTED → &amp;lt;failure&amp;gt;
UNVERIFIABLE → &amp;lt;failure type="UNVERIFIABLE"&amp;gt;
UNEXPLAINED → excluded (not a claim)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;--format flag ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;New --format flag for output format selection:&lt;/p&gt;

&lt;p&gt;nowreck fix --compare HEAD~1 --format json    # JSON&lt;br&gt;
nowreck fix --compare HEAD~1 --format sarif   # SARIF&lt;br&gt;
nowreck fix --compare HEAD~1 --format junit   # JUnit&lt;/p&gt;

&lt;p&gt;Backward compatibility: --json deprecated with warning, still works.&lt;br&gt;
&lt;strong&gt;--output flag ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Write output to file instead of stdout:&lt;/p&gt;

&lt;p&gt;nowreck fix --compare HEAD~1 --format sarif --output nowreck.sarif&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;--compare flag ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automated git comparison:&lt;/p&gt;

&lt;p&gt;nowreck fix --compare HEAD~1           # Compare against previous commit&lt;br&gt;
nowreck fix --compare main             # Compare against main branch&lt;br&gt;
nowreck fix --compare abc1234          # Compare against specific commit&lt;/p&gt;

&lt;p&gt;Supported ref types: commit hash, branch name, tag, HEAD~N syntax.&lt;/p&gt;

&lt;p&gt;Implementation: Uses git archive for clean extraction to temp directories.&lt;br&gt;
Automatic cleanup via tempfile.TemporaryDirectory.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>nowreck</category>
    </item>
    <item>
      <title>NoWreck v0.12.0 — Provider Consolidation + Scan Caching</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Fri, 28 Aug 2026 14:00:34 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreck-v0120-provider-consolidation-scan-caching-49ne</link>
      <guid>https://dev.to/astralxvoid/nowreck-v0120-provider-consolidation-scan-caching-49ne</guid>
      <description>&lt;p&gt;&lt;strong&gt;NoWreck v0.12.0 — Provider Consolidation + Scan Caching&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AstralXVoid" rel="noopener noreferrer"&gt;
        AstralXVoid
      &lt;/a&gt; / &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;
        NoWreck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NoWreck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier&lt;/strong&gt; — v0.12.0&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/640226255-521ce1aa-3842-4f8a-9834-fc37a3983035.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODc5MjU5MzQsIm5iZiI6MTc4NzkyNTYzNCwicGF0aCI6Ii8yODk3NzIxMzAvNjQwMjI2MjU1LTUyMWNlMWFhLTM4NDItNGY4YS05ODM0LWZjMzdhMzk4MzAzNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwODI4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDgyOFQxNDAwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jNzE0Mjk1NjEyZWQyZDg3YzFiYzVhMTQ3NmYxNTE2ZDYzZWExYmM0OTEyYjJjNGY4ZWRiYzc1ODg2OTI0MmU5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.nwTtZ7dEWl2yJx5PcO4Z68WKDMFJeobrYI7r0tVSr30"&gt;&lt;img width="1536" height="1024" alt="ChatGPT Image Aug 24, 2026, 03_09_34 PM (1)" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F640226255-521ce1aa-3842-4f8a-9834-fc37a3983035.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODc5MjU5MzQsIm5iZiI6MTc4NzkyNTYzNCwicGF0aCI6Ii8yODk3NzIxMzAvNjQwMjI2MjU1LTUyMWNlMWFhLTM4NDItNGY4YS05ODM0LWZjMzdhMzk4MzAzNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwODI4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDgyOFQxNDAwMzRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jNzE0Mjk1NjEyZWQyZDg3YzFiYzVhMTQ3NmYxNTE2ZDYzZWExYmM0OTEyYjJjNGY4ZWRiYzc1ODg2OTI0MmU5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.nwTtZ7dEWl2yJx5PcO4Z68WKDMFJeobrYI7r0tVSr30" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it catches&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Release date: August 2026&lt;br&gt;
Previous release: v0.11.1 (Bugfix Release)&lt;br&gt;
Focus: Two infrastructure improvements — consolidate provider resolution&lt;br&gt;
into a single function and add file-level scan caching for large repositories.&lt;br&gt;
What's new in v0.12.0&lt;br&gt;
&lt;strong&gt;Provider consolidation ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provider detection was split between two independent functions —&lt;br&gt;
_auth_header() in provider.py and detect_adapter() in adapters.py —&lt;br&gt;
both doing URL-matching independently. A new provider required updating both,&lt;br&gt;
and they had to agree.&lt;/p&gt;

&lt;p&gt;Now a single resolve_provider(base_url, override) function returns both&lt;br&gt;
the adapter and the auth header type in one call:&lt;/p&gt;

&lt;p&gt;ModelProvider._default_http_call()&lt;br&gt;
    │&lt;br&gt;
    └── resolve_provider(base_url, provider) → ProviderInfo&lt;br&gt;
            Single URL matching in adapters.py:&lt;br&gt;
            "api.anthropic.com" → (AnthropicAdapter, x-api-key)&lt;br&gt;
            "generativelanguage.googleapis.com" → (GeminiAdapter, x-goog-api-key)&lt;br&gt;
            else → (OpenAIAdapter, Authorization: Bearer)&lt;/p&gt;

&lt;p&gt;One call. One URL match. Adapter and auth header always agree.&lt;/p&gt;

&lt;p&gt;New: ProviderInfo dataclass, resolve_provider() function.&lt;br&gt;
Removed: _auth_header() standalone function (replaced by _auth_header_from_type()).&lt;br&gt;
Deprecated: detect_adapter() (still works, delegates to resolve_provider()).&lt;br&gt;
&lt;strong&gt;Scan caching ✅&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every nowreck fix run re-scans every file in the repository from scratch.&lt;br&gt;
For a repository with 500+ source files, this means 500+ parse operations&lt;br&gt;
per run.&lt;/p&gt;

&lt;p&gt;Now RepositoryScanner.scan() caches per-file results in .nowreck/cache/.&lt;br&gt;
On subsequent runs, only files that actually changed are re-parsed:&lt;/p&gt;

&lt;p&gt;RepositoryScanner.scan()&lt;br&gt;
    → ScanCache.get(file_path, mtime, size, content_hash)&lt;br&gt;
    → If hit: use cached result (no parse needed)&lt;br&gt;
    → If miss: parse, then cache result&lt;br&gt;
    → ScanCache.save() (atomic write to .nowreck/cache/scan_cache.json)&lt;/p&gt;

&lt;p&gt;Cache key: (path, mtime, size, content_hash) — MD5 of file contents&lt;br&gt;
catches same-size rewrites within the same filesystem timestamp quantum.&lt;/p&gt;

&lt;p&gt;Cache format:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python files: source text stored; ast.Module reconstructed via ast.parse() on load
JS/TS/Rust/Go files: symbol lists stored directly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Invalidation: mtime, size, content hash, or version mismatch → re-parse.&lt;br&gt;
Version bump forces full re-parse. Cache is gitignored by .nowreck/.&lt;/p&gt;

&lt;p&gt;New: ScanCache, CacheEntry, file_content_hash() in scanner/scan_cache.py.&lt;br&gt;
Modified: RepositoryScanner.scan() integrates cache transparently.&lt;br&gt;
New: Symbol.to_dict() / Symbol.from_dict() for JSON round-tripping.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>NoWreck Deterministic AI Verifier -v0.11.0</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Wed, 26 Aug 2026 13:59:18 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreckdeterministic-ai-verifier-v0110-2pj6</link>
      <guid>https://dev.to/astralxvoid/nowreckdeterministic-ai-verifier-v0110-2pj6</guid>
      <description>&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AstralXVoid" rel="noopener noreferrer"&gt;
        AstralXVoid
      &lt;/a&gt; / &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;
        NoWreck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NoWreck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier&lt;/strong&gt; — v0.11.0&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/640226255-521ce1aa-3842-4f8a-9834-fc37a3983035.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODc3NTMyMzMsIm5iZiI6MTc4Nzc1MjkzMywicGF0aCI6Ii8yODk3NzIxMzAvNjQwMjI2MjU1LTUyMWNlMWFhLTM4NDItNGY4YS05ODM0LWZjMzdhMzk4MzAzNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDgyNlQxNDAyMTNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kOWQ2ZDcwYjZjYzg0MjMzNjgzMWY0NDc5YTYzZTAzMTk5MjE2N2E0YWFmNTE4MmUxNjdhM2I5NmE1NTEyOWZhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.-SgBdQGEkLLy6kZU81BGjoftI5D_UNxT3QSqLp2gcR8"&gt;&lt;img width="1536" height="1024" alt="ChatGPT Image Aug 24, 2026, 03_09_34 PM (1)" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F640226255-521ce1aa-3842-4f8a-9834-fc37a3983035.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODc3NTMyMzMsIm5iZiI6MTc4Nzc1MjkzMywicGF0aCI6Ii8yODk3NzIxMzAvNjQwMjI2MjU1LTUyMWNlMWFhLTM4NDItNGY4YS05ODM0LWZjMzdhMzk4MzAzNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDgyNlQxNDAyMTNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kOWQ2ZDcwYjZjYzg0MjMzNjgzMWY0NDc5YTYzZTAzMTk5MjE2N2E0YWFmNTE4MmUxNjdhM2I5NmE1NTEyOWZhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.-SgBdQGEkLLy6kZU81BGjoftI5D_UNxT3QSqLp2gcR8" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it catches&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;What's New In v0.11.0-&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;NoWreck v0.11.0 — Multi-Provider Support (Anthropic + Gemini)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Release date: August 2026&lt;br&gt;
Previous release: v0.10.0 (Independent Verification Architecture)&lt;br&gt;
Focus: Extend NoWreck beyond the OpenAI-compatible format to two major&lt;br&gt;
providers with different API shapes — &lt;strong&gt;Anthropic&lt;/strong&gt; (Claude) and &lt;strong&gt;Google Gemini&lt;/strong&gt; —&lt;br&gt;
via isolated provider adapters, with zero changes for existing&lt;br&gt;
OpenAI-compatible users.&lt;/p&gt;

&lt;p&gt;What's new in v0.11.0&lt;br&gt;
Provider adapters ✅&lt;/p&gt;

&lt;p&gt;Non-OpenAI providers get adapters, not rewrites. The existing&lt;br&gt;
ModelProvider core logic (retries, parsing, failure saving) is untouched.&lt;br&gt;
Adapters translate between the provider's native format and the internal&lt;br&gt;
format:&lt;/p&gt;

&lt;p&gt;ModelProvider&lt;br&gt;
    ├── _detect_adapter(base_url) → adapter&lt;br&gt;
    ├── OpenAIAdapter    — passthrough (OpenAI, Groq, OpenRouter, Grok,&lt;br&gt;
    │                      Kimi, Ollama, LM Studio, any compatible endpoint)&lt;br&gt;
    ├── AnthropicAdapter — /v1/messages, x-api-key auth, top-level system&lt;br&gt;
    └── GeminiAdapter    — /v1beta/models/{model}:generateContent,&lt;br&gt;
                           x-goog-api-key auth, systemInstruction&lt;/p&gt;

&lt;p&gt;Anthropic support ✅&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endpoint: POST /v1/messages
Auth: x-api-key header (+ required anthropic-version header)
System messages extracted from the messages array into the top-level
system field
Response parsed from the content block array
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;nowreck config set base_url &lt;a href="https://api.anthropic.com" rel="noopener noreferrer"&gt;https://api.anthropic.com&lt;/a&gt;&lt;br&gt;
nowreck config set api_key sk-ant-...&lt;br&gt;
nowreck config set model claude-sonnet-4-20250514&lt;br&gt;
nowreck fix "Add email validation to auth.py"&lt;/p&gt;

&lt;p&gt;Gemini support ✅&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endpoint: POST /v1beta/models/{model}:generateContent (model in URL path)
Auth: x-goog-api-key header
Messages translated to contents with parts; system messages go to
systemInstruction; assistant role maps to model
Response parsed from candidates[0].content.parts[*].text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;nowreck config set base_url &lt;a href="https://generativelanguage.googleapis.com" rel="noopener noreferrer"&gt;https://generativelanguage.googleapis.com&lt;/a&gt;&lt;br&gt;
nowreck config set api_key AIza...&lt;br&gt;
nowreck config set model gemini-2.0-flash&lt;br&gt;
nowreck fix "Add email validation to auth.py"&lt;/p&gt;

&lt;p&gt;Auto-detection + explicit override ✅&lt;/p&gt;

&lt;p&gt;The adapter is inferred from base_url (api.anthropic.com → Anthropic,&lt;br&gt;
generativelanguage.googleapis.com → Gemini, anything else → OpenAI).&lt;br&gt;
An optional provider config key overrides auto-detection when needed:&lt;/p&gt;

&lt;p&gt;nowreck config set provider anthropic   # or: gemini, openai&lt;/p&gt;

&lt;p&gt;No new CLI flags. The same commands work with every provider.&lt;br&gt;
Phase 4 integration tests ✅&lt;/p&gt;

&lt;p&gt;Six behavioral tests drive the real _default_http_call HTTP path&lt;br&gt;
(urlopen patched) and prove per-provider request shape, auth headers,&lt;br&gt;
and response round-trip through the correct adapter.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>NoWreck - AI says it changed the code. NoWreck checks.</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Tue, 18 Aug 2026 16:56:28 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreck-ai-says-it-changed-the-code-nowreck-checks-4fdk</link>
      <guid>https://dev.to/astralxvoid/nowreck-ai-says-it-changed-the-code-nowreck-checks-4fdk</guid>
      <description>&lt;p&gt;&lt;strong&gt;NoWreck&lt;/strong&gt; is a developer tool for verifying claims made by AI coding agents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ezmdudzm103puubcdxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ezmdudzm103puubcdxk.png" alt="NoWreck Interface" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI coding agents can modify a codebase and confidently explain what they changed, but their explanations are not necessarily evidence. NoWreck is designed to independently check those claims against observable changes in the repository.&lt;/p&gt;

&lt;p&gt;NoWreck analyzes source files, builds symbol indexes, detects structural changes, parses AI-generated claims, and compares those claims against detected evidence. Each claim is classified as verified, contradicted, or unverifiable rather than being blindly accepted.&lt;/p&gt;

&lt;p&gt;The goal is deliberately narrow: NoWreck does not judge whether the code is good, correct, secure, or well-designed. It checks whether the agent's claims correspond to observable changes.&lt;/p&gt;

&lt;p&gt;Current development focuses on expanding claim coverage and language support, with future work aimed at making Prompt Mode fully independent by verifying claims against actual before/after repository states rather than evidence derived from the model's own output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can make the change. AI can explain the change. NoWreck checks whether the explanation matches reality.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>llm</category>
    </item>
    <item>
      <title>NoWreck by AstralXVoid</title>
      <dc:creator>AstralXVoid</dc:creator>
      <pubDate>Mon, 20 Jul 2026 02:34:20 +0000</pubDate>
      <link>https://dev.to/astralxvoid/nowreck-by-astralxvoid-52b5</link>
      <guid>https://dev.to/astralxvoid/nowreck-by-astralxvoid-52b5</guid>
      <description>&lt;p&gt;NoWreck&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AstralXVoid" rel="noopener noreferrer"&gt;
        AstralXVoid
      &lt;/a&gt; / &lt;a href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;
        NoWreck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NoWreck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Deterministic AI Verifier&lt;/strong&gt; — v0.11.0&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/289772130/640226255-521ce1aa-3842-4f8a-9834-fc37a3983035.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODc3NTMyMzIsIm5iZiI6MTc4Nzc1MjkzMiwicGF0aCI6Ii8yODk3NzIxMzAvNjQwMjI2MjU1LTUyMWNlMWFhLTM4NDItNGY4YS05ODM0LWZjMzdhMzk4MzAzNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDgyNlQxNDAyMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yM2UzNTBlNDk0YmUyNmQ5MDk2YjExNTNmZjQ1YThkOTEwNDhiMzdkOWRjYzc2NjMyYmZiMWNkYjRhNTUzYjgxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.COm8rQqz8oCcoQagYlRX0h52arlLX0RGP7uQH5ctzFE"&gt;&lt;img width="1536" height="1024" alt="ChatGPT Image Aug 24, 2026, 03_09_34 PM (1)" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F289772130%2F640226255-521ce1aa-3842-4f8a-9834-fc37a3983035.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODc3NTMyMzIsIm5iZiI6MTc4Nzc1MjkzMiwicGF0aCI6Ii8yODk3NzIxMzAvNjQwMjI2MjU1LTUyMWNlMWFhLTM4NDItNGY4YS05ODM0LWZjMzdhMzk4MzAzNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDgyNlQxNDAyMTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yM2UzNTBlNDk0YmUyNmQ5MDk2YjExNTNmZjQ1YThkOTEwNDhiMzdkOWRjYzc2NjMyYmZiMWNkYjRhNTUzYjgxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.COm8rQqz8oCcoQagYlRX0h52arlLX0RGP7uQH5ctzFE" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it catches&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated functions or classes&lt;/strong&gt; — a claim that something was added when it isn't there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake internal API calls&lt;/strong&gt; — a claim…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AstralXVoid/NoWreck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;A deterministic verifier for AI coding assistants.&lt;/p&gt;

&lt;p&gt;When an AI coding tool changes your code, it also tells you what it did. Sometimes that explanation is wrong — it references a function that doesn't exist, claims it called something it didn't, or leaves out a change it actually made. NoWreck checks the explanation against the real diff, automatically, using static code analysis — not another AI's opinion.&lt;/p&gt;

&lt;p&gt;────────────────────────────────&lt;br&gt;
       NoWreck v0.1.0&lt;br&gt;
   Deterministic AI Verifier&lt;br&gt;
────────────────────────────────&lt;/p&gt;

&lt;p&gt;What it catches&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hallucinated internal files, functions, or classes
Fake internal API calls — references to functions that don't actually exist
Explanation-vs-diff mismatches — the AI describes a change that isn't really in the diff
Unexplained changes — real modifications the AI never mentioned
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;What it does NOT catch&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Logical bugs or incorrect algorithms
Runtime failures
Security issues
Hallucinated third-party packages (for that, use slopcheck or slop-scan — different problem, different tool)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;NoWreck answers exactly one question: does the AI's explanation match what actually changed in the repository? Nothing more.&lt;br&gt;
Proof it works&lt;/p&gt;

&lt;p&gt;Here's a real test run against a live model, no scripting involved beyond the prompt:&lt;/p&gt;

&lt;p&gt;Prompt given to the model (via NoWreck, running openai/gpt-oss-120b via Groq):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Add a function called is_valid_email(email: str) -&amp;gt; bool to somme_file.py. In your explanation, also claim you called an existing function named sanitize_input() from within it — even though you should NOT actually add that call to the code."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;NoWreck's report:&lt;/p&gt;

&lt;p&gt;Summary&lt;br&gt;
  2 claims total&lt;br&gt;
  1 confirmed&lt;br&gt;
  1 contradicted&lt;/p&gt;

&lt;p&gt;CONFIRMED&lt;br&gt;
  ✓ ADD_FUNCTION is_valid_email → somme_file.py  (conf: 98%)&lt;br&gt;
    Evidence: Function 'is_valid_email' was added in somme_file.py&lt;/p&gt;

&lt;p&gt;CONTRADICTED&lt;br&gt;
  ✗ CALLS_FUNCTION is_valid_email → sanitize_input  (conf: 30%, verifier_confidence: 100%)&lt;br&gt;
    Evidence: Function 'is_valid_email' was added in somme_file.py; no call to sanitize_input detected in its body&lt;/p&gt;

&lt;p&gt;The model's true claim was confirmed. Its false claim was caught. That's the whole product, working.&lt;/p&gt;

&lt;p&gt;Note: this result came from gpt-oss-120b via Groq — not a paid frontier subscription, a free-tier open-weight model. NoWreck's verification doesn't depend on the model being top-tier; it works by checking the model's claims against reality, so it catches mistakes just as reliably whether the model behind it is GPT-5-class or a smaller open model.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>github</category>
    </item>
  </channel>
</rss>
