v0.22.0 shipped reviewer verdict v2 (#144) and @v0 has moved, so every edition now runs it. The released artifact was smoke-tested by driving the built bundle against a harness PR — it emitted a complete 17-field block with engineVersion: 0.22.0 — but nothing has yet run through the real GitHub Actions path, because no edition had an open translation PR at release time.
A local bundle run cannot exercise the things most likely to break in production: @v0 resolution inside a workflow, the deployed workflow config and its label filter, the estate's secrets, or comment rendering as GitHub actually displays it. This issue is the reminder to close that gap once real PRs exist, and to analyse the first batch rather than glancing at one.
This program has now been caught twice by treating one step as implying the next — #131's fix was released but silently skipped review on every CLI resync PR for days, and the v0.22.0 release PR merged without anyone cutting the tag. Shipped is not the same as working.
What will produce the first real PRs
Sync runs in the source repo when a PR merges there. Currently wired:
| Source repo |
Editions it syncs to |
lecture-python-programming |
zh-cn, fa, fr |
lecture-python-intro |
zh-cn |
lecture-python.myst |
none yet — myst#979 still open |
So the first organic verdict-v2 review will come from a merge into lecture-python-programming or lecture-python-intro. CLI resync PRs (translate forward --github) are a second, distinct shape worth covering — see below.
What to check on the first real sync PR
The review ran at all. The job triggers, is not skipped, and posts a comment. This is the #131 failure mode: a label filter that does not match means the workflow completes green having done nothing.
The block is present and parseable. A translation-review-verdict HTML comment at the end of the review comment, valid JSON, all 17 fields, schemaVersion: 1.
engineVersion reads 0.22.0, not unknown. If it reads unknown the ESM resolution path is being taken — getEngineVersion() relies on __dirname, which does not exist under "type": "module". Harmless to the gate but it degrades a contract field, and src/cli/translate-state.ts's getToolVersion() already has ESM-safe fallbacks to copy.
reviewedHeadSha equals the PR head. The whole supersession design rests on this binding.
autoMergeMode is off and wouldAutoMerge is absent. No edition has opted into shadow yet; if the field appears, something is enabling it unintentionally.
The comment renders cleanly. Findings are now rendered from structured objects with severity and category labels instead of prose strings — this is the first time real model output flows through that rendering path in production.
What to analyse across the first batch (~10 PRs)
Beyond "it works", the first batch is the earliest real data on the question Stage 4 exists to answer:
- What fraction would qualify for auto-merge, and what gates the rest? Collect
recommendation and recommendationReasons across the batch. All six harness runs recommended editor, and an auditor argued the gate may approximately never fire, because the prompt defines minor as "correct but awkward" while a minor finding in accuracy or terminology gates absolutely. If the eligible rate is near zero, the fix is to sharpen the prompt's severity definitions — not to lower the floors, which are provisional placeholders rather than policy.
- Are the findings well-formed in practice? How often does
findingsMalformed gate, how often is file attributed on multi-file PRs, and do severities look consistently applied.
- Do the diff checks behave?
headingMapCorrect failed on most harness fixtures, but those carry a legacy heading-map key — production editions should not, so a high failure rate there would indicate something real.
- Comment size. Observed 4.8–7.2 KB on the harness against GitHub's 65,536-char cap; worth confirming production stays well clear.
Also still unproven: the #131 path
Separately from verdict v2, the #131 fix shipped in v0.21.0 and no CLI resync PR has been opened anywhere in the fleet since, so "resync PRs receive AI review" remains unobserved in production. The next resync wave is its first real test. Worth checking in the same pass, since a resync PR also exercises the reviewer's getSourceAtCommit path rather than the source-PR-diff path.
Done when
A handful of real sync PRs (and at least one CLI resync PR) have been inspected against the checklist above, the results recorded on QuantEcon/project-translation#15, and either the shadow rollout proceeds or a prompt/severity adjustment is raised off the back of the numbers.
Context: program plan and Stage 1 delivery notes in QuantEcon/project-translation (PROJECT-PLAN-HUMAN-REVIEWS.md); handover QuantEcon/project-translation#16; contract spec docs/user/metadata-contract.md.
v0.22.0 shipped reviewer verdict v2 (#144) and
@v0has moved, so every edition now runs it. The released artifact was smoke-tested by driving the built bundle against a harness PR — it emitted a complete 17-field block withengineVersion: 0.22.0— but nothing has yet run through the real GitHub Actions path, because no edition had an open translation PR at release time.A local bundle run cannot exercise the things most likely to break in production:
@v0resolution inside a workflow, the deployed workflow config and its label filter, the estate's secrets, or comment rendering as GitHub actually displays it. This issue is the reminder to close that gap once real PRs exist, and to analyse the first batch rather than glancing at one.This program has now been caught twice by treating one step as implying the next — #131's fix was released but silently skipped review on every CLI resync PR for days, and the v0.22.0 release PR merged without anyone cutting the tag. Shipped is not the same as working.
What will produce the first real PRs
Sync runs in the source repo when a PR merges there. Currently wired:
lecture-python-programminglecture-python-introlecture-python.mystSo the first organic verdict-v2 review will come from a merge into
lecture-python-programmingorlecture-python-intro. CLI resync PRs (translate forward --github) are a second, distinct shape worth covering — see below.What to check on the first real sync PR
The review ran at all. The job triggers, is not
skipped, and posts a comment. This is the #131 failure mode: a label filter that does not match means the workflow completes green having done nothing.The block is present and parseable. A
translation-review-verdictHTML comment at the end of the review comment, valid JSON, all 17 fields,schemaVersion: 1.engineVersionreads0.22.0, notunknown. If it readsunknownthe ESM resolution path is being taken —getEngineVersion()relies on__dirname, which does not exist under"type": "module". Harmless to the gate but it degrades a contract field, andsrc/cli/translate-state.ts'sgetToolVersion()already has ESM-safe fallbacks to copy.reviewedHeadShaequals the PR head. The whole supersession design rests on this binding.autoMergeModeisoffandwouldAutoMergeis absent. No edition has opted into shadow yet; if the field appears, something is enabling it unintentionally.The comment renders cleanly. Findings are now rendered from structured objects with severity and category labels instead of prose strings — this is the first time real model output flows through that rendering path in production.
What to analyse across the first batch (~10 PRs)
Beyond "it works", the first batch is the earliest real data on the question Stage 4 exists to answer:
recommendationandrecommendationReasonsacross the batch. All six harness runs recommendededitor, and an auditor argued the gate may approximately never fire, because the prompt definesminoras "correct but awkward" while aminorfinding in accuracy or terminology gates absolutely. If the eligible rate is near zero, the fix is to sharpen the prompt's severity definitions — not to lower the floors, which are provisional placeholders rather than policy.findingsMalformedgate, how often isfileattributed on multi-file PRs, and do severities look consistently applied.headingMapCorrectfailed on most harness fixtures, but those carry a legacyheading-mapkey — production editions should not, so a high failure rate there would indicate something real.Also still unproven: the #131 path
Separately from verdict v2, the #131 fix shipped in v0.21.0 and no CLI resync PR has been opened anywhere in the fleet since, so "resync PRs receive AI review" remains unobserved in production. The next resync wave is its first real test. Worth checking in the same pass, since a resync PR also exercises the reviewer's
getSourceAtCommitpath rather than the source-PR-diff path.Done when
A handful of real sync PRs (and at least one CLI resync PR) have been inspected against the checklist above, the results recorded on QuantEcon/project-translation#15, and either the shadow rollout proceeds or a prompt/severity adjustment is raised off the back of the numbers.
Context: program plan and Stage 1 delivery notes in QuantEcon/project-translation (
PROJECT-PLAN-HUMAN-REVIEWS.md); handover QuantEcon/project-translation#16; contract specdocs/user/metadata-contract.md.