Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .dev/STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ Roadmap detail lives in [PLAN.md](PLAN.md), not here.

## Recently landed

- **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,
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
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

---

Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
Loading