@@ -12,23 +12,93 @@ on-disk format is a major version bump and is called out under **Breaking**.
1212
1313## [ Unreleased]
1414
15+ ## [ 2.0.0] - 2026-08-02
16+
17+ Retrigger is rebuilt on three toolchains that agree with each other — C for the
18+ hash, Rust for the watcher and daemon, JavaScript for the bundler plugins — and
19+ the thing being released is that an install works somewhere other than the
20+ machine it was built on.
21+
1522### Breaking
1623
24+ - ** Hash output has changed.** The C engine now computes the real XXH3-64
25+ algorithm; the previous engine called itself XXH3 but matched no published
26+ vector and produced a different digest per SIMD path. Every digest this
27+ project has ever emitted is therefore invalid as a cache key, which is what
28+ makes this a major version rather than a fix.
1729- The Zig system layer between Rust and the kernel has been removed. The watcher
18- is native Rust now, and ` zig ` is no longer a build dependency.
30+ is native Rust over ` notify ` , and ` zig ` is no longer a build dependency.
31+ - The gRPC and IPC surfaces and the ` src-js ` modules are removed.
32+ - The daemon configuration schema has changed.
33+
34+ ### Added
35+
36+ - A pure-JavaScript fallback engine, so ` require('@retrigger/core') ` never
37+ throws. With no native binary present the package still watches and still
38+ hashes, held to the addon's behaviour by a parity suite both engines run.
39+ - Prebuilt platform packages for musl (` linux-x64-musl ` , ` linux-arm64-musl ` ),
40+ built and executed inside Alpine rather than cross-compiled, so an Alpine
41+ install resolves a native binary instead of silently degrading.
42+ - ` Retrigger#hasContentChanged ` , the content oracle the bundler plugins share.
43+ - ` rtr_hash_force_level ` , so one machine can prove every SIMD path agrees.
44+ - Layered adversarial, property, and fuzz suites across all three languages,
45+ with bounded seeded tiers in the PR gate and storms, fault injection, and
46+ fuzzing behind ` test-chaos ` / ` test-fuzz ` and a manual campaign workflow.
47+ - Project documentation and repository policy: ` LICENSE ` , ` CONTRIBUTING.md ` ,
48+ ` CODE_OF_CONDUCT.md ` , this changelog, a security policy, issue templates,
49+ ` CODEOWNERS ` , and Dependabot.
1950
2051### Changed
2152
22- - The C hash engine is the real XXH3-64 algorithm as specified by xxHash, so
23- correctness is checked against published reference vectors rather than against
24- the engine's own output. The scalar, NEON, SSE2, AVX2, and AVX-512 paths are
25- required to be bit-identical, and ` rtr_hash_force_level ` exists so a single
26- machine can prove it.
53+ - Correctness of the hash is checked against published reference vectors rather
54+ than against the engine's own output. The scalar, NEON, SSE2, AVX2, and
55+ AVX-512 paths are required to be bit-identical.
2756- SIMD selection is a runtime ` cpuid ` /` xgetbv ` decision. Nothing in the library
2857 is compiled with ` -march=native ` , so a binary built on one machine runs on
2958 another instead of trapping on an illegal instruction.
3059- ` rtr_hash_file ` streams a file in bounded chunks, keeping peak memory
3160 independent of file size.
61+ - macOS event kinds are re-derived from the file system before delivery, because
62+ FSEvents reports a union of flags rather than a sequence of operations.
63+ - The daemon is rebuilt over the same two crates the Node addon uses.
64+ - The burst-coalescing window widened from 120ms to 500ms; at 120ms the tail of
65+ a burst routinely opened a second window, which measured machine load rather
66+ than coalescing.
67+
68+ ### Fixed
69+
70+ - ** Installing produced a working native package.** 1.0.4 published a root
71+ package whose ` optionalDependencies ` named eight platform packages that were
72+ never published, so every install resolved no native binary and quietly fell
73+ back. The release now publishes the platform packages and then installs the
74+ result from the registry on every supported OS, failing if the native engine
75+ is not the one that loads.
76+ - Linux delivered no events at all — the old Zig watcher never armed its inotify
77+ thread — and the paths that did arrive were corrupt, because ` FileEvent ` used
78+ a fat pointer where Rust read a thin one.
79+ - The webpack plugin no longer watches above the project root. Node's resolver
80+ probes for ` package.json ` and ` node_modules ` in every directory up to the
81+ filesystem root, and registering the parent of each miss put a watch on ` / ` ,
82+ the home directory, and ` /tmp ` — so an idle dev server rebuilt continuously.
83+ - The Vite plugin keeps the roots that exist when one cannot be watched, rather
84+ than disabling itself over a single typo in ` watchPaths ` , and a start that
85+ fails after creating the engine now closes it instead of leaking the handle.
86+ - Vite's own chokidar is gated through the shared content oracle. It previously
87+ reported every write unconditionally, so a save that changed no bytes still
88+ reloaded the browser and a genuine edit was invalidated twice.
89+ - Watcher options coming from a config file are normalized. A capacity of ` 0 `
90+ produced a watcher that started, reported every counter healthy, and delivered
91+ nothing; a ` null ` left by a trailing comma in an exclude list made the native
92+ engine reject the whole list and cost the caller their watcher.
93+ - Retained watcher state is bounded, drains are coalesced to one microtask per
94+ burst, and the content hasher reuses its read buffer.
95+ - A reconciler spawn failure raises a rescan signal instead of silently
96+ accepting the create/write loss window.
97+ - The ` lib/ ` sources the package ships were being published to npm while ignored
98+ by git, so the tarball contained code absent from the repository.
99+ - The workspace repository URL pointed at an account that does not exist, and
100+ ` retrigger-system ` declared no license, repository, or ` rust-version ` , which
101+ would have made it unpublishable.
32102
33103## [ 1.0.4] - 2025-10-04
34104
@@ -39,5 +109,6 @@ for everything else.
39109
40110Releases before this one predate the changelog; ` git log ` is the record.
41111
42- [ unreleased ] : https://github.com/GriffinCanCode/Retrigger/compare/v1.0.4...HEAD
112+ [ unreleased ] : https://github.com/GriffinCanCode/Retrigger/compare/v2.0.0...HEAD
113+ [ 2.0.0 ] : https://github.com/GriffinCanCode/Retrigger/compare/v1.0.4...v2.0.0
43114[ 1.0.4 ] : https://github.com/GriffinCanCode/Retrigger/releases/tag/v1.0.4
0 commit comments