*NoWreck v0.16.0 *
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
$ 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
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__())
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.
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).

Top comments (0)