Repository navigation
v0.23.0
Bundles the three issues that had to land before shadow-mode calibration could start. All three were validated on the test-translation-sync harness before release.
Fixed
Glossary resolution on the CLI path (#149 → #150) — forward and init resolved glossary candidates only against process.cwd(). The built-in glossaries ship inside this package and no edition repository carries one, so a resync launched from the target repo — the natural place to run it — translated with no glossary at all, and logged nothing either way, so it was indistinguishable from a run that applied one. Resolution is now package-relative with the precedence --glossary → repo-local → built-in, every outcome is reported, and an unusable explicit glossary fails the run instead of silently falling back. forward --glossary <path> added; it previously had no override at all.
Review mode ignored glossary-path (#146 → #151) — a repo with a custom glossary had its translation produced against one terminology and judged against another. That mattered more after v0.22.0 made terminology a gating category. Fixing it surfaced a deeper defect the issue did not describe: the shared loader tried the built-in glossary first and treated the custom path as a fallback, so glossary-path was silently dead in all three modes for every language that ships a glossary — the whole estate. A custom glossary is now an override, and a path that cannot be read or parsed fails the run.
Changed
Diff-check provenance (#148 → #152) — the four diffChecks gate the auto-merge recommendation absolutely, but they were all model output, so a confidently wrong boolean was indistinguishable from a genuine structural failure. structurePreserved and headingMapCorrect are now computed from ground truth the engine already holds; scopeCorrect and positionCorrect remain model-asserted, are tagged in a new optional diffCheckSources field, and gate through a minor/diff-check finding instead of the boolean.
Routing is unchanged — a failed check still routes to editor either way. The gain is that shadow-mode calibration can report the two precisions separately rather than blending model opinion into measured fact.
Deliberately not addressed: positionCorrect — the check that produced the false gate this issue was filed for — is still model-driven. Deterministic change attribution across a translated document would replace model false-gates with engine false-gates that look authoritative and are harder to spot. It is made visible rather than fixed, and the measurement that would justify doing it properly now exists.
Upgrade notes
No behavioural change for existing users. No edition sets glossary-path, auto-merge-mode still defaults to off, and schemaVersion stays 1 — diffCheckSources is a pure optional field addition. Blocks written before this release simply lack it; absence means treat every check as gating, since those checks were model-derived but also gated absolutely.
The one change that could newly gate a healthy PR is the deterministic headingMapCorrect. It was verified against the live estate rather than reasoned about: of 249 production files with sections, 248 carry a heading map. The single exception was a genuine gap, since fixed. Fleet-wide blast radius on upgrade: zero.
Consumers of the verdict block should read docs/user/metadata-contract.md for diffCheckSources semantics.