DEV Community

AstralXVoid
AstralXVoid

Posted on

NoWreck v0.16.0 — Verifiable Body Edits + Method Call Detection

*NoWreck v0.16.0 *

GitHub logo AstralXVoid / NoWreck

A CLI tool that verifies AI coding assistant claims against actual structural changes — catching hallucinated functions, fake calls, and missed modifications before they ship.

NoWreck

Deterministic AI Verifier — v0.16.0

tom
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 ChatGPT Image Sep 3, 2026, 09_45_07 PM
$ 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

What it catches

  • Hallucinated functions or classes — a claim that something was added when it isn't there
  • Fake internal API calls — a claim…






Release date: September 2026

Previous release: v0.15.0 (PyPI Publishing)

Focus: Claim "I modified X" and have it verified — structural body-diff

hashes (CHANGED_FUNCTION / CHANGED_CLASS), member/attribute call

detection across all five languages, Python async indexing, and four

pre-existing bug fixes (Part B).

What's new in v0.16.0

CHANGED_FUNCTION / CHANGED_CLASS — verifiable body edits ✅

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

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

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
Enter fullscreen mode Exit fullscreen mode

Method / attribute call detection ✅

CALLS_FUNCTION now captures member chains in every language:

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__())
Enter fullscreen mode Exit fullscreen mode

Python async def is now indexed ✅

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

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.
Enter fullscreen mode Exit fullscreen mode

Verification

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).
Enter fullscreen mode Exit fullscreen mode

Top comments (0)