Skip to content

fix: gauntlet watch scope and cli hardening - #83

Merged
codecaaron merged 3 commits into
mainfrom
fix/gauntlet-watch-scope-and-cli-hardening
Aug 11, 2026
Merged

fix: gauntlet watch scope and cli hardening#83
codecaaron merged 3 commits into
mainfrom
fix/gauntlet-watch-scope-and-cli-hardening

Conversation

@codecaaron

Copy link
Copy Markdown
Owner

No description provided.

codecaaron and others added 3 commits August 11, 2026 17:30
…lures name their trigger

Two halves of CI flake runs 369/374 (a spurious extra compilation in the
differential P0/N0 probes, same SHA green on rerun):

Evidence: the count assertions shipped no usable evidence — vitest's
inline preview truncates nested objects. Ride full JSON turn evidence on
the assertion message, and capture compiler.hooks.invalid (the watcher
names the file that fired each turn) plus removedFiles per record.

Fix: a diag-branch stress run (30x under deliberate /tmp churn on
ubuntu) reproduced the flake and named the trigger — watchpack reports
the project's DIRECTORY existence deps changed (invalid=<root>/src,
modified=[<root>/src, <root>]) with nothing written inside the project
when the OS tmpdir churns, which is the parallel unit tier's steady
state on CI. runWatchSession now composes a watch-time ignore over the
plugin's epoch entry: paths outside the project root and directory
paths inside it are scoped out; project FILES (every probe's real
trigger) and deliberate external watch surfaces (external-ingestion's
kit tree, passed as watchRoots) stay watched. Webpack's config schema
rejects function-shaped ignored, so the scope lives in watch() options,
mirroring how Next drives the compiler.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two hardening fixes from the post-landing CLI review, test-first:

Asset prune (HIGH): publishArtifacts pruned EVERY file in
<outDir>/assets/ the new generation did not record — with a user-chosen
outDir (the lock-conflict remediation advertises --out-dir) a zero-asset
publish cleared a user-owned assets/ wholesale, exit 0. The prune is now
scoped to names the outDir's previous commit record actually published.

Config value gate: assertKnownOptionKeys validated keys and mode but no
other value types, so a string 'false' for strict/minify ENABLED what
the config read as disabling, a bare-string exclude became zero
patterns, and a bare-string extensions became a Set of characters.
Primitive shape gates now throw AnimusConfigError for every driver,
fatal even in warn mode (type-invalid values are never inert). The CLI
additionally gates its own cli.outDir namespace value, so a numeric
outDir is a config error (exit 2), not a TypeError classified as an
extraction failure (exit 1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@codecaaron codecaaron changed the title Fix/gauntlet watch scope and cli hardening fix: gauntlet watch scope and cli hardening Aug 11, 2026
@codecaaron
codecaaron merged commit d92f34e into main Aug 11, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant