Skip to content

Work plan: suggested order for the post-review backlog #94

Description

@mmcky

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:

  1. External clocks first. Only one item has a deadline someone else controls.
  2. 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.
  3. Shared foundations before things that need them. Several items land once if sequenced, six times if not.

Remaining PLAN state, for calibration: Phase 1 8 todo / 2×[H] · Phase 2 14 / 4×[H] · Phase 3 19 / 3×[H] · Phase 4 9 · Phase 5 9 / 1×[H] · Phase 6 12 · Phase 7 8 · Phase 8 10.


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.

2 — Finish Phase 1 · S · same release as #89

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:

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() · M

Whatever Phase 2's round-trip test doesn't cover:

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)
#92 PR-creation timeout small; do with Phase 4's 409 retry — same "check the resulting state, don't trust the response" fix
#82 / R10 deterministic eval after Phase 2 — it reuses Phase 2's validateMyST checks; building it first means building them twice
Phase 5 (test debt) index.ts 0%, 32 fake tests in translator.test.ts, coverage threshold. Raise it opportunistically while touching things above
Phase 3 (CLI state) 19 items but all CLI-side; no production translation depends on it
Phase 7 / 8 docs remainder + issue gardening. Phase 8 is ~10 gh issue close with rationales already written in PLAN — genuinely an hour
#91 docs 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.
  • R2/R4 (state consolidation) — real, but only pays off when rebase state or a second consumer forces it. feat: document translation-sync-metadata as a stable, versioned contract for downstream tooling #66 is the trigger.

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; 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.

Refs: REVIEW-FABLE5-2026-07-15.md · PLAN.md · #89 #90 #91 #92 #81 #82 #65 #66

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions