Repository navigation
If you are on Windows, update. 0.5.1 could delete your node_modules.
npm i -D aztrx-cli@0.5.2
npx playwright install chromium
npx aztrx-cli run --url http://localhost:3000The heal sandbox stopped deleting your node_modules
The sandbox links your repo's node_modules into a throwaway git worktree, and
on Windows that link is a junction. git worktree remove --force recurses
through a junction, so the routine cleanup after every --fix was recursively
deleting the real node_modules. Cleanup now unlinks directory links before git
is handed the worktree.
Found by running the loop rather than reading it — this repo's own
node_modules came back empty. Verified twice over: a regression test that fails
without the fix, and an A/B on a live target where a real heal run empties the
target's node_modules with the fix removed and leaves a sentinel file
untouched with it in place.
The repro now actually reproduces
Running the loop against a real Next.js app, and asking why only one of its
three crashes was being healed, turned up four defects in the middle of the
pipeline. The headline: a recorded trace never said which page it was on.
The walker reaches each crawled route with page.goto, which emitted no action
at all — so a finding on /agents produced a trace of clicks that only mean
anything there. Replayed from the start URL, every one of them resolved to
nothing, the crash was never reached, and a bug that fires on every single click
was reported unreliable 0/3 — which reads as "your bug is flaky" and was in
fact "we did not replay your bug." navigate was already understood by every
consumer of a trace; only the producer was missing.
Three more, each measured rather than reasoned about:
- A replayed navigation now waits before acting. The walker waits 300ms after
its owngoto, so every recorded selector was resolved against a page given
300ms to render. A replay that clicks the instant navigation commits is asking
for something the recording never was. 0ms reproduced 0/3; 300ms reproduced
3/3. Same trace, same app. - A replay no longer stops watching too early. It waited a fixed 300ms after
the last action — exactly a real app's own async delay — so the same trace
flipped between reproducing and not from one run to the next. It now polls and
returns the moment the fingerprint appears: the window is a ceiling, not a
delay. - The free rule fixer no longer mangles spread syntax.
/\.(?=[a-zA-Z_$])/
matches the third dot of...s, so{ ...s, [id]: result.ok }came out as
{ ..?.s, … }and an already-guardedd?.agentsbecamed??.agents. Both are
syntax errors, which the AST gate refused — correctly, but the user saw
rejectedwith nothing to say the rule engine had emitted garbage. Its limit
is documented: it is a regex on a line, not a lexer.
Result on that app: 3 of 3 findings are now proven deterministic 3/3 and
healed with no API key at all — the app where 1 of 3 was healed before.
--repo is checked, not trusted
Commander consumes a <required> option's value even when it looks like a flag,
so aztrx run <url> --repo --fix set the project root to the literal string
--fix. path.resolve turned that into <cwd>/--fix, and the run then
succeeded against a directory it had invented, leaving .aztrx/events.jsonl
and report.html inside — exit code 0, no warning at all. The root must now
exist and be a directory, and a refused path whose last segment is a flag says so
by name.
Documentation that can no longer drift
Every CI snippet in the README pinned @v0.5.2 — a tag that was not on origin,
for a version that was not on npm. Anyone who copied it got a failing job
reporting aztrx did not run (exit code: N), wording chosen so it cannot be
mistaken for a verdict about the app, which meant it read as infrastructure
rather than as a wrong README. Three checks now keep the repo honest: the five
places naming an installable version must agree and may never lead
package.json; every flag in the README's reference must be parseable; every
environment variable it names must be read by the code.
The tarball was verified rather than assumed — packed, installed into a clean
project, and run: --version correct, all five exports resolve, and a page
with a seeded null-deref scanned by the packaged build came back found →
minimized → ✓ deterministic 3/3.
Full diff: v0.5.1...v0.5.2