From 51ec50a17eebd8addd457e5382f5e41a09eb2051 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Mon, 21 Sep 2026 22:25:18 +1000 Subject: [PATCH] chore: release v0.29.2 Patch: the ml exercise-rule scope sentence (#317) that v0.29.1's failed gate called for, carrying the editor's round-3 answers (#315) that v0.29.1 never delivered. No source change in this commit; dist-action/ rebuilds byte-identical. Co-Authored-By: Claude Fable 5.1 --- .dev/STATE.md | 5 +++++ .dev/log/2026-09-21-v0291-gate-scenario17.md | 4 +++- 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 9894c66..c4b33fe 100644 --- a/.dev/STATE.md +++ b/.dev/STATE.md @@ -7,6 +7,11 @@ Roadmap detail lives in the work-plan tracker **#257**, not here (PLAN.md predat ## In flight +- **v0.29.2 release cut 2026-09-21** (payload #317 `62504c1`, on top of #315 `cd41558`) — patch: + the scope sentence on the `ml` exercise rule that v0.29.1's failed gate called for, carrying + with it the editor's round-3 answers that v0.29.1 never delivered. §4a gate status is + recorded on the release PR; scenario 17 on the `.ml` lane is the one to read first. After the + floating tags move, round 4 (`numpy`, lecture-python-programming.ml#23) is regenerated at `@v0`. - **v0.29.1 is tagged but NOT released (2026-09-21)** — its §4a gate came back 83/84: scenario 17 on the `.ml` lane failed twice (the model wrapped a plain `## Exercises` list in `{exercise-start}`; structural parity refused the file). `v0` = `v0.29` = `a6fda54` (v0.29.0) diff --git a/.dev/log/2026-09-21-v0291-gate-scenario17.md b/.dev/log/2026-09-21-v0291-gate-scenario17.md index 9961d89..39eee5e 100644 --- a/.dev/log/2026-09-21-v0291-gate-scenario17.md +++ b/.dev/log/2026-09-21-v0291-gate-scenario17.md @@ -21,4 +21,6 @@ The first six draws per arm read 1/6 against 5/6 and looked like a clean regress **Lessons**: (1) a single-draw gate cannot see a 40% defect — it passed three releases; scenario-level retries or N draws on the new-document scenarios are worth a look under #260 / W1. (2) Six draws per arm was not enough either: it gave the right direction and the wrong story. (3) A rule that names directives primes the model to emit them; say "already in the source" wherever a rule lists markup. -**Next**: PR → merge → **v0.29.2** (v0.29.1 stays a tag that was never released; the CHANGELOG says so) → §4a gate on the new tag → floating tags → smoke → release → regenerate round 4 at `@v0`. +**Merged, release cut.** #317 merged as `62504c1` (Copilot: two release-status wording comments — STATE entries reworded, CHANGELOG marks 0.29.1 `[YANKED]` with a note, `cc7c6ab`); release PR for v0.29.2 opened on `release-v0.29.2`. + +**Next (as written before the merge)**: PR → merge → **v0.29.2** (v0.29.1 stays a tag that was never released; the CHANGELOG says so) → §4a gate on the new tag → floating tags → smoke → release → regenerate round 4 at `@v0`. diff --git a/CHANGELOG.md b/CHANGELOG.md index 78c4e17..afd5304 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.29.2] - 2026-09-21 + ### Fixed - **`ml`: the exercise-verbatim rule no longer primes the model to invent exercise directives** (caught by v0.29.1's §4a gate, which is why v0.29.1 was tagged but never released: no floating tag moved, no GitHub release). Harness scenario 17 (`new-document-toc`) failed twice on the `.ml` lane — the fixture writes its exercises as a plain `## Exercises` heading and a numbered list, the model wrapped them in `{exercise-start}` … `{exercise-end}`, and the structural-parity guard correctly refused the file (directives 3 → 5), leaving the sync PR with a `_toc.yml` entry for a lecture it did not deliver. Measured on that fixture, twelve draws per arm: **5/12 refused at v0.29.0** — the defect is latent since the rule arrived in v0.28.0, and four gates passed it on single lucky draws — **11/12 at v0.29.1** (the #315 rules aggravate it; crossing rules and glossary puts it in the rules), and **0/24** once the rule says it concerns only directives the source already contains. Behaviour is otherwise unchanged: a plain exercises section keeps its English text, as the editor's ruling requires, and its source structure. diff --git a/package-lock.json b/package-lock.json index 3191e1c..6c53d56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "action-translation", - "version": "0.29.1", + "version": "0.29.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "action-translation", - "version": "0.29.1", + "version": "0.29.2", "license": "MIT", "dependencies": { "@actions/core": "^2.0.3", diff --git a/package.json b/package.json index 2f611b7..725ef61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "action-translation", - "version": "0.29.1", + "version": "0.29.2", "private": true, "type": "module", "description": "GitHub Action to sync and review translations across repositories",