From f56c20ab200bb894993ad8f796c5616430c04582 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Thu, 16 Jul 2026 15:58:20 +1000 Subject: [PATCH 1/2] chore: release v0.17.0 Promote [Unreleased] to [0.17.0]: the typography-erosion fixes (#99 closes #97: sync path now applies deterministic typography; #100: typography-insensitive heading matching with exact-first + ambiguity guard, forward-resync typesetting, headingmap/apply.mjs ping-pong, role-stripped key lookups, subsection-merge consistency) and the concurrent-review dedup (#98). Bump package.json/package-lock, copilot-instructions version + test counts (43 suites); record the release and the estate-pin follow-up in .dev/STATE; refresh the release-notes scratch file. Co-Authored-By: Claude Opus 4.8 (1M context) --- .dev/STATE.md | 7 +++++++ .github/copilot-instructions.md | 2 +- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.dev/STATE.md b/.dev/STATE.md index 4d21d470..667c34b1 100644 --- a/.dev/STATE.md +++ b/.dev/STATE.md @@ -17,6 +17,13 @@ Roadmap detail lives in [PLAN.md](PLAN.md), not here. ## Recently landed +- **v0.17.0 released** (2026-07-16) — typography-erosion day: #99 wired `applyTypography` + into the sync path (issue #97: every fr sync stripped the seed's NBSP; numba.md 27→14 in + one merge, restored by .fr#9 backfill), #100 made heading matching typography-insensitive + (`normalizeHeadingForMatch`, exact-first + ambiguity guard; also forward-resync typesetting, + headingmap/apply.mjs ping-pong, role-stripped key lookups, the deleted `[0.16.1]` CHANGELOG + header). #98 fixed duplicate review comments under concurrent runs. Estate pins still on + v0.16.1 — bumping them is the natural next step. - **Estate upgraded to v0.16.1** — all 9 pins across 4 repos (lecture-python-programming#575, .zh-cn#69, .fa#132, .fr#5). First time the estate is on one version; it spanned v0.13.0–v0.16.0 that morning. **zh-cn and fa now translate with Sonnet 5.** Deployment diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 0476d60d..8afec3f8 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -9,7 +9,7 @@ - **Review Mode**: Runs in TARGET repo, posts quality review comments on translation PRs - **Rebase Mode**: Runs in TARGET repo, rebases conflicted translation PRs when a sibling PR is merged -**Current Version**: v0.16.1 | **Tests**: 1,000+ (40 suites; exact count in CI) | **Glossary**: 357 terms (zh-cn, fa, fr) +**Current Version**: v0.17.0 | **Tests**: 1,100+ (43 suites; exact count in CI) | **Glossary**: 357 terms (zh-cn, fa, fr) --- diff --git a/CHANGELOG.md b/CHANGELOG.md index a157b84a..fddcd381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.17.0] - 2026-07-16 + ### Fixed - **Heading matching tolerates typography drift instead of relying on byte equality** (#97 follow-up): matching a frontmatter heading-map value to its body heading was an exact string compare, and typography makes the two sides legitimately diverge — `applyTypography` masks role spans while `stripMystRoles` exposes their display text (so a map value can carry an NBSP its body heading structurally cannot), `apply.mjs` typesets map values independently, and human edits touch one side only. On a mismatch the sync drops unchanged sections from the output or retranslates modified ones from English, discarding human edits. Comparisons now canonicalize both sides: strip `#` markers and MyST roles, fold NBSP/narrow-NBSP, collapse whitespace runs, and drop spaces before `; : ! ?` — every shape the French transform produces, including the zero-gap case where `Quoi?!` gains an NBSP from nothing. Exact matches are tried first and a normalized match is accepted only when unique, so raw-distinct headings that canonicalize identically keep their old positional pairing instead of first-match landing on the wrong section. Written map values stay exactly as typeset — only comparisons normalize. Verified over the full French edition: all 401 real headings now match under every typography variant (one diverged before). Also closes a pre-existing hole the audit surfaced: the body side of the compare never stripped MyST roles while map values always did, so the corpus's role-wrapped headings (`## {index}` + backticked text) could never match by heading map and survived on the positional fallback alone. - **Role-stripped keys are used everywhere heading-map keys are looked up**: the CLI validator (`section-matcher.ts`) and subsection merging (`mergeSubsectionsWithTargetTranslations`) built lookup keys from raw source headings while keys are stored role-stripped, so role-wrapped headings silently skipped validation or missed their subsection map entries. diff --git a/package-lock.json b/package-lock.json index 310a683d..158eceaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "action-translation", - "version": "0.16.1", + "version": "0.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "action-translation", - "version": "0.16.1", + "version": "0.17.0", "license": "MIT", "dependencies": { "@actions/core": "^1.10.1", diff --git a/package.json b/package.json index fcad1dad..322a7c94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "action-translation", - "version": "0.16.1", + "version": "0.17.0", "private": true, "type": "module", "description": "GitHub Action to sync and review translations across repositories", From a6d1eeb261b6d682540b8514eadbb4050dec393e Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Thu, 16 Jul 2026 16:01:26 +1000 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20STATE.md=20=E2=80=94=20don't=20cla?= =?UTF-8?q?im=20v0.17.0=20released=20before=20the=20tag=20exists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses Copilot review on #101: the release entry now says the tag and GitHub release land on merge of this PR, so the note is accurate whether read before or after. Co-Authored-By: Claude Opus 4.8 (1M context) --- .dev/STATE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dev/STATE.md b/.dev/STATE.md index 667c34b1..a0026067 100644 --- a/.dev/STATE.md +++ b/.dev/STATE.md @@ -17,7 +17,8 @@ Roadmap detail lives in [PLAN.md](PLAN.md), not here. ## Recently landed -- **v0.17.0 released** (2026-07-16) — typography-erosion day: #99 wired `applyTypography` +- **v0.17.0** (2026-07-16; tagged + published on merge of #101) — typography-erosion day: + #99 wired `applyTypography` into the sync path (issue #97: every fr sync stripped the seed's NBSP; numba.md 27→14 in one merge, restored by .fr#9 backfill), #100 made heading matching typography-insensitive (`normalizeHeadingForMatch`, exact-first + ambiguity guard; also forward-resync typesetting,