You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Suggested sequence for the work left after the 2026-07-15 review round, with the reasoning for the order. Not a new roadmap — PLAN.md still holds the detail; this is what to do first and why, which PLAN deliberately doesn't say.
How this is ordered
Three rules, applied in this priority:
External clocks first. Only one item has a deadline someone else controls.
Detection before repair. Today's whole finding was that failures produce success-shaped artifacts. Fixing five silent bugs without a check that would catch the sixth is worse value than building the check.
Shared foundations before things that need them. Several items land once if sequenced, six times if not.
1 — #89 node24 + @actions/* majors · S–M · do first
The only item with someone else's clock: GitHub is already force-running the action on Node 24 while action.yml declares node20, on every production run. It also carries the last open prod advisories (undici, only clearable via the majors), and it forces a dist-action/ rebuild — so it should not be split across releases.
Sequence it first because it is independent of everything below and gets less pleasant the longer the runtime divergence runs.
Validation caveat: src/index.ts is at 0% coverage, so the suite will not catch an @actions/* API break. Validate with the e2e harness (26 scenarios × 2 languages) — which is trustworthy as of #86/#87, and wasn't before. Pin its ref: to the candidate.
Seven small items, mostly one-liners, all high-confidence: runRebase posting success on no-op early returns, context.sha vs merge_commit_sha on the primary sync path, \translate-resync zh failing open to all languages, the @anthropic-ai/sdk bump, CHANGELOG [Unreleased].
Plus Phase 1.5 — rebase input-validation hardening [H], the one security item in the backlog. It should land before #66 documents the metadata as a public contract.
Ship 1+2 together as v0.17.0 (the @actions/* majors make it a minor, not a patch).
3 — Phase 2: parser & validation correctness · L · the main event
The highest-leverage work in the backlog, and the reason to resist doing #90 first. It delivers four things at once:
A real validateMyST — today it validates nothing (parseSections never throws, so the gates can't fire). Replacing it pays out three more times: it's the structural veto auto-merge needs (FUTURE 1), the basis of the No test set for model upgrades — v0.16.0 shipped a model change unmeasured #82 deterministic eval, and the check that makes the next unseen MyST construct a loud failure instead of silent corruption.
Do this before #90. Patching #90's five defects individually leaves you with five fixes and no way to catch the sixth — and there will be a sixth; there have been five already (#5, #6/#40, #49, #50/#54, #65, and the typography bug makes six).
5 — Phase 6: one LLM client, one parser, one state module · M–L · the multiplier
Not glamorous, but it's the precondition for the two best remaining ideas landing once instead of six times:
R8 structured outputs — Sonnet 5 supports output_config.format. Deletes three defect classes at a stroke: the 3-strategy JSON parsing, the retry-on-parse-failure loop (3 full-price calls on persistent bad JSON), and the NaN-verdict bug (Phase 4). Cheapest permanent fix for all three.
R9 prompt caching — the static prefix (rules + 357-term glossary ≈ 15K tokens) is resent at full price on every call. Section-based sync makes many calls per file inside the 5-minute TTL → cache reads at ~0.1×.
The evidence that Phase 6 matters isn't theoretical: CRLF was fixed in pr-creator but not reviewer; pagination in rebase but not sync; overloaded retry in the translator but nowhere else. Each of those was one bug fixed in one of several copies. #83 had to fix the same stop_reason guard in five places.
6 — Then, roughly in this order
why here
Phase 4 (action robustness)
NaN verdicts largely fall out of R8; the rest is per-file review evaluation and rebase 409 retry (pairs with #92)
minutes; do it alongside #4's canonicalizeHeading so the docs describe the settled answer
Cheap wins, any time
Phase 8 gardening — ~10 issues closeable with pre-written rationale. Highest tidiness-per-minute in the backlog.
R11 release automation — today's release needed: move 3 tags, bump 4 files, reconcile STATE, and I still left Next stale until Copilot caught it. A script or checklist-issue template would have prevented the v0-stale-for-9-releases bug outright.
What I'd explicitly not do yet
ARCHITECTURE Q1 (repo topology) and Q2 (mystmd migration) — both correctly parked on external triggers; nothing today moved them.
FUTURE 1 auto-merge — wants Phase 2's structural veto and Phase 4's review fixes first. It's the biggest throughput win available, and it's gated on exactly the work above.
Every defect fixed today, in the action and the harness, was one shape: the failure path produced a success-shaped artifact. Truncated translations committed as complete; backward analysis calling a truncated file clean; fetch failures dropping files under a green check; a partial eval reporting "25 passed, 0 failed"; a stale rubric confidently marking correct output down; reports silently never committed; a lint gate covering 41% of the code; v0 cheerfully serving year-old code.
The ordering above is mostly a bet that detection beats repair — Phase 2's round-trip test and a real validateMyST are worth more than any five individual fixes, because they're what makes the next one loud.
Suggested sequence for the work left after the 2026-07-15 review round, with the reasoning for the order. Not a new roadmap — PLAN.md still holds the detail; this is what to do first and why, which PLAN deliberately doesn't say.
How this is ordered
Three rules, applied in this priority:
Remaining PLAN state, for calibration: Phase 1
8 todo / 2×[H]· Phase 214 / 4×[H]· Phase 319 / 3×[H]· Phase 49· Phase 59 / 1×[H]· Phase 612· Phase 78· Phase 810.1 — #89 node24 +
@actions/*majors · S–M · do firstThe only item with someone else's clock: GitHub is already force-running the action on Node 24 while
action.ymldeclares node20, on every production run. It also carries the last open prod advisories (undici, only clearable via the majors), and it forces adist-action/rebuild — so it should not be split across releases.Sequence it first because it is independent of everything below and gets less pleasant the longer the runtime divergence runs.
Validation caveat:
src/index.tsis at 0% coverage, so the suite will not catch an@actions/*API break. Validate with the e2e harness (26 scenarios × 2 languages) — which is trustworthy as of #86/#87, and wasn't before. Pin itsref:to the candidate.2 — Finish Phase 1 · S · same release as #89
Seven small items, mostly one-liners, all high-confidence:
runRebaseposting success on no-op early returns,context.shavsmerge_commit_shaon the primary sync path,\translate-resync zhfailing open to all languages, the@anthropic-ai/sdkbump, CHANGELOG[Unreleased].Plus Phase 1.5 — rebase input-validation hardening [H], the one security item in the backlog. It should land before #66 documents the metadata as a public contract.
Ship 1+2 together as v0.17.0 (the
@actions/*majors make it a minor, not a patch).3 — Phase 2: parser & validation correctness · L · the main event
The highest-leverage work in the backlog, and the reason to resist doing #90 first. It delivers four things at once:
(label)=before headings #65 —(label)=anchors dropped before headings. Known production breakage (broke a zh-cn build).parseSections—##inside a code cell is currently parsed as a heading.reconstruct(parse(doc)) === doc) — this is the detection layer. It catches three of Silent data loss in the sync merge path — five ways translations vanish while the run reports success #90's five defects as a class, and it would have caught the typography bug before it shipped.validateMyST— today it validates nothing (parseSectionsnever throws, so the gates can't fire). Replacing it pays out three more times: it's the structural veto auto-merge needs (FUTURE 1), the basis of the No test set for model upgrades — v0.16.0 shipped a model change unmeasured #82 deterministic eval, and the check that makes the next unseen MyST construct a loud failure instead of silent corruption.Do this before #90. Patching #90's five defects individually leaves you with five fixes and no way to catch the sixth — and there will be a sixth; there have been five already (#5, #6/#40, #49, #50/#54, #65, and the typography bug makes six).
4 — #90 remainder +
canonicalizeHeading()· MWhatever Phase 2's round-trip test doesn't cover:
canonicalizeHeading()(REVIEW §7.6 R12) — one function used at every heading-map write and lookup site. Fixes Silent data loss in the sync merge path — five ways translations vanish while the run reports success #90.1 (role-bearing headings never match, so sections get re-translated and human refinements discarded) and Silent data loss in the sync merge path — five ways translations vanish while the run reports success #90.4 (heading level changes) structurally rather than site-by-site. Also settles docs: heading-maps.md documents a key format the action has never written #91's question of what a key actually is.fetchAllFileContentsreturns{files, errors}; fetch errors get treated like processing errors. No happy-path change.5 — Phase 6: one LLM client, one parser, one state module · M–L · the multiplier
Not glamorous, but it's the precondition for the two best remaining ideas landing once instead of six times:
output_config.format. Deletes three defect classes at a stroke: the 3-strategy JSON parsing, the retry-on-parse-failure loop (3 full-price calls on persistent bad JSON), and the NaN-verdict bug (Phase 4). Cheapest permanent fix for all three.The evidence that Phase 6 matters isn't theoretical: CRLF was fixed in
pr-creatorbut notreviewer; pagination in rebase but not sync;overloadedretry in the translator but nowhere else. Each of those was one bug fixed in one of several copies. #83 had to fix the samestop_reasonguard in five places.6 — Then, roughly in this order
validateMySTchecks; building it first means building them twiceindex.ts0%, 32 fake tests intranslator.test.ts, coverage threshold. Raise it opportunistically while touching things abovegh issue closewith rationales already written in PLAN — genuinely an hourcanonicalizeHeadingso the docs describe the settled answerCheap wins, any time
Nextstale until Copilot caught it. A script or checklist-issue template would have prevented thev0-stale-for-9-releases bug outright.What I'd explicitly not do yet
The through-line
Every defect fixed today, in the action and the harness, was one shape: the failure path produced a success-shaped artifact. Truncated translations committed as complete; backward analysis calling a truncated file clean; fetch failures dropping files under a green check; a partial eval reporting "25 passed, 0 failed"; a stale rubric confidently marking correct output down; reports silently never committed; a lint gate covering 41% of the code;
v0cheerfully serving year-old code.The ordering above is mostly a bet that detection beats repair — Phase 2's round-trip test and a real
validateMySTare worth more than any five individual fixes, because they're what makes the next one loud.Refs: REVIEW-FABLE5-2026-07-15.md · PLAN.md · #89 #90 #91 #92 #81 #82 #65 #66