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 @@ -13,6 +13,14 @@ Roadmap detail lives in [PLAN.md](PLAN.md), not here.

## Recently landed

- **v0.20.0** (2026-07-21) — #128 closed #119 + #65: structural parity guard on every write
path (directive shapes byte-equal or presence-matched by class; anchors exact). Calibrated
empirically: byte-equal draft over 211 real pairs → 362 false positives in 3 classes
(contents/index titles, prf:* titles, code-cell kernel tags) → calibrated guard passes
200/211, remainder pending-drift artifacts. Found live damage during calibration: sympy.fr
dropped (sympy)= anchor (restored, .fr#16). First wave after this may loudly fail files
with pre-existing anchor damage — that is the guard working the backlog. Next P0 item:
round-trip invariant (#94 Phase 2); nested-directive coverage belongs there.
- **v0.19.0** (2026-07-21) — #124 closed #123: `rebase-stale-siblings` (default off) refreshes
non-overlapping sibling PRs during waves via update-branch — no re-translation, message-gated
422s. **Harness-validated pre-release** under the harness-first policy: pinned workflow to the
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.19.0 | **Tests**: 1,153+ (49 suites; exact count in CI) | **Glossary**: 357 terms (zh-cn, fa, fr)
**Current Version**: v0.20.0 | **Tests**: 1,173+ (50 suites; exact count in CI) | **Glossary**: 357 terms (zh-cn, fa, fr)

---

Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.20.0] - 2026-07-21

### Added
- **Structural parity guard on every write path** (#119, #65 — first item of the #120 P0 plan): the silent-corruption class (#118, #119, #65) is structural MyST mutated by a path that should have passed it through verbatim, with the run reporting success every time — eight instances to date, every one discovered weeks later on a downstream strict build. Sync (markdown and renamed-file handlers) and forward resync (post-finalization, checking exactly the bytes that would be written) now extract the structural tokens — top-level fenced-directive openings and `(label)=` target anchors — from source and output, and **fail the file loudly on divergence**. Directive name sequences must match (#118's fence-wrap collapses the sequence and fails on count); structural arguments (`{raw}` format, `{include}`/`{figure}` paths, `{solution}`'s exercise label) must match byte-for-byte (#119's defect); flexible arguments — `{admonition}`/`{prf:*}` titles, `{contents}`/`{index}` display text, `{code-cell}`'s edition-pinned kernel tag — need only presence to match, though a dropped argument still fails; anchor sequences must match exactly, with multiset-diff diagnostics that name dropped or surplus labels (#65). The rules were **calibrated against the real corpus**: a byte-equal-everything draft dry-run over all 211 source/target lecture pairs across five editions produced 362 false positives in exactly the three flexible-arg classes, and the calibrated guard passes 200/211 (the rest are pending-drift artifacts of current-vs-current comparison, which the guard never performs in situ). The dry-run also found live production damage — `sympy.fr` had dropped its `(sympy)=` anchor, restored in lecture-python-programming.fr#16. **Operational note**: files whose *historical* translations already dropped anchors will fail their next sync until repaired — loud by design; resync is the repair tool. Scanning is a top-level stateful fence walk (nested directives are #94 Phase 2's round-trip territory); the guard lives in `src/structural-parity.ts` per the rule that guards go in modules Jest can load.

### Fixed
- Docs and template comments name the CLI invocation correctly as `translate forward --github` (#127) — the bare `forward --github` is not a runnable command.

## [0.19.0] - 2026-07-21

### Added
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.19.0",
"version": "0.20.0",
"private": true,
"type": "module",
"description": "GitHub Action to sync and review translations across repositories",
Expand Down
Loading