Skip to content

Commit afaf7c7

Browse files
docs: cut the 2.0.0 changelog
The Unreleased section covered the C engine and the Zig removal and nothing else, while nineteen commits and a major version had accumulated behind it. Written from the log rather than from memory, and led by the breaking change that actually costs consumers something: hash output moved, so every digest this project has emitted is invalid as a cache key. The platform-package failure gets its own entry under Fixed -- from a user's side "1.0.4 silently ran the JavaScript engine everywhere" is the most consequential thing this release repairs.
1 parent e289f55 commit afaf7c7

1 file changed

Lines changed: 78 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 78 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

40110
Releases 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

Comments
 (0)