From 785472a1463be9d063068c82993f000706ee3793 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Tue, 1 Sep 2026 16:27:21 +1000 Subject: [PATCH] chore: release v0.27.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CHANGELOG: promote [Unreleased] to [0.27.0] - 2026-09-01 and add the entries the other merges since v0.26.0 lacked (#293 prompt caching, #285 tool-review-injection, #278 runReview extraction, #275 harness editors block). Version 0.26.0 → 0.27.0; dist-action rebuilt; STATE.md records the cut and moves W1 (#259) to v0.28.0. Co-Authored-By: Claude Fable 5 --- .dev/STATE.md | 9 ++++++++- CHANGELOG.md | 10 +++++++++- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.dev/STATE.md b/.dev/STATE.md index b9c0eab..e43f457 100644 --- a/.dev/STATE.md +++ b/.dev/STATE.md @@ -7,6 +7,13 @@ Roadmap detail lives in the work-plan tracker **#257**, not here (PLAN.md predat ## In flight +- **v0.27.0 release cut 2026-09-01** — headline: the second inline native-review round + encoded (ml glossary v0.4.0 + rules 18 → 24 + the first deterministic ml lints, #297; + regeneration-checked in the same PR, decision record + `D-2026-09-01-ml-exercise-statements-stay-english`), plus prompt caching on every + translator call (#293), `tool-review-injection/` (#285), the `runReview` extraction + (#278, #169 slice 1) and the harness editors block (#275). W1 (#259) did not make it + and now targets v0.28.0. §4a gate status is recorded on the release PR. - **v0.26.0 release cut 2026-08-17** — headline: the first inline native-review round encoded (ml glossary v0.3.0 + 18-rule set, #272; regeneration-verified, #273), plus verdict provenance (#247), config-preserving writers (#243), newline-terminated @@ -39,7 +46,7 @@ Roadmap detail lives in the work-plan tracker **#257**, not here (PLAN.md predat and the test source repo carries only the zh-cn sync workflow until the next unscoped harness run. - **W1 (#259) is the next P0** — declared-vs-delivered assertion + TOC structured merge, - now targeting **v0.27.0** (v0.26.0 shipped 2026-08-17 as the ml round-1 release). + now targeting **v0.28.0** (v0.27.0 cut 2026-09-01 as the ml round-2 + prompt-caching release, without W1; v0.26.0 shipped 2026-08-17 as the ml round-1 release). Fully unblocked; the one gate is #169 first or alongside. Scope grew 2026-08-19: a stale-resync detection box (#276 guard — code cells modulo localized comments/docstrings) and the both-directions rule on the assertion (`files[]` diff --git a/CHANGELOG.md b/CHANGELOG.md index ff146fe..2220193 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [0.27.0] - 2026-09-01 ### Added - **Malayalam: the second inline native-review round is encoded — ml glossary v0.4.0 (+16 terms), the rule set grown 18 → 24, and the first deterministic ml lints** (#296, #189 Phase 2 round 2): the editor of record reviewed `functions` on lecture-python-programming.ml#7 — 118 committable suggestion blocks on 118 of 123 Malayalam prose lines, all applied and every one dispositioned in QuantEcon/project-translation `reports/2026-09-01-ml-functions-review-disposition.md`. The headline is that the round-1 rules held (no recurrence of below-deixis, ordinal, light-verb, `-യുടെ` or suffixed-English flags), so this change encodes the *new* classes the round surfaced, most of them deterministic: terminal punctuation (a colon on every paragraph that introduces a code cell, list or equation, a full stop on every other — 26 flags, regardless of the English source's punctuation); sentence-initial capitalisation of a retained-English word (`Functions-നെ`, `Built-in`, `Return statement` — 14); the hortative teacher's voice (`നമുക്ക് … -ആം`, never the plain future `നമ്മൾ … -ും` — 12); consistent accusative `-നെ` on light-verb objects with no additive `-ഉം` on list items (15); the fixed renderings he corrected on every occurrence ("a given" → `തന്നിരിക്കുന്ന`, "consider" → `നോക്കാം`, spelling `കുറച്ചുകൂടി` — 10); the sandwich-sentence rule (state a claim interrupted by code cells once, before the first cell); three more sentence-initial connectives kept English ("In particular", "Obviously", "Basically"); worked examples for the pointer sentences the model missed three times; and the maintainer's 2026-09-01 ruling that exercise statements with probabilistic or mathematical content stay English, hybrid sentences included (decision record `.dev/decisions/D-2026-09-01-ml-exercise-statements-stay-english.md`). Glossary: the ordinary words the editor kept moving back to English (`useful` ×4 — never ഉപയോഗപ്രദമായ — `provide`, `exist`, `automatically`, `create`, `improve`, `full`, `stage`, `answer`, `successive`), the `line`/`lines` pin the #273 regeneration flagged as a 14× variance regression, and four everyday words he moved the other way (`straightforward` → എളുപ്പം, `contrived` → കൃത്രിമം, `limited` → പരിമിതി, `facilitate` → സഹായിക്കുക). `experiments/ml-benchmark/scripts/ml_metrics.py` gains the round's lints as a LINT bucket (never FAIL): terminal punctuation, lowercase-Latin-initial sentences, a banned-renderings list drawn from the rules, and a future-hortative watch — string checks that sidestep #240 and #229, calibrated so the editor's reviewed text is clean (seed 24/19/16/6 → reviewed 1/1/2/1, the residuals being forms he himself kept) and the pre-review seed lights up. Held for the editor's answers on lecture-python-programming.ml#12: "For example" as a discourse rule and glossary pins for `already`, `name`, `example(s)`, `work`. ml-scoped only; no other language's rules move. +- **Prompt caching on every translator API call** (#292, #293): each translator prompt is split into a stable block (static rules + language `additionalRules` + rendered glossary — byte-identical across a run) carrying `cache_control: {type: 'ephemeral'}`, and a volatile block (`customInstructions` + document content). Repeat calls in a run read the 10–12K-token prefix at the cached rate. All five builders are covered (section update, section resync, new section, full document, document resync); `customInstructions` moves to the head of the volatile block so the cacheable prefix is not broken. Semantics: per-result `tokensUsed` and the `input-tokens` output now exclude cached tokens — total prompt size is `input + cache-creation + cache-read`, as `action.yml` states. CLI triage/eval prompts are deliberately not cached (their rubric is under the 1024-token minimum) and the reviewer breakpoint is deferred. +- **`tool-review-injection/` — certify the reviewer by injected-defect catch rate** (#285, QuantEcon/project-translation#28): the review-mode half of the per-mode eval harness. Field observation cannot bound the auto-merge gate's precision (~1.2 eligible PRs/week means a ≤1% bound takes ~4.6 years), so this manufactures the positive class — defects injected into clean translations, reviewed, scored against the gate re-implemented in `lib.mjs`. First run (140 reviews of 45 zh-cn fixtures): M0-core catch rate 72%, 24 of 36 non-catches detected but filed below the gate, both negative controls false-flagged, routing flipped on 3 of 5 identical clean re-reviews. Analysis in QuantEcon/project-translation `reports/2026-08-20-m0-reviewer-certification.md`. + +### Changed +- **`runReview` extracted from `src/index.ts` into `src/action/review.ts` and tested** (#278, #169 slice 1 — the W1 gate): the first slice of splitting the 1,579-line Action entry point that no test could import. Semantics-preserving by construction — the set of `core.setOutput` calls in the bundle is identical before and after, `action.yml`'s entry contract is untouched, and `import.meta.url` resolves through the same esbuild banner (so `../glossary` still resolves to the repo-root `glossary/`). The architecture module map gains the new modules. + +### Fixed +- **E2E harness targets carry a `.translate/config.yml` again, with the production `editors:` block** (#275, QuantEcon/project-translation#24): the #202 reset deleted `.translate/` on every target reset and nothing re-created it, so the harness had been running with no translate config at all. The reset now lays the config down per target (block-style YAML, `primary:` first — the only form the parser reads and the shape `writeConfig`'s unknown-key merge preserves). ## [0.26.0] - 2026-08-17 diff --git a/package-lock.json b/package-lock.json index 1568f98..c13b665 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "action-translation", - "version": "0.26.0", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "action-translation", - "version": "0.26.0", + "version": "0.27.0", "license": "MIT", "dependencies": { "@actions/core": "^2.0.3", diff --git a/package.json b/package.json index 51e0e48..9237a4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "action-translation", - "version": "0.26.0", + "version": "0.27.0", "private": true, "type": "module", "description": "GitHub Action to sync and review translations across repositories",