Skip to content

EPBDS-16211 make the plan tell the truth: 121 corrections - #51

Merged
AlexSamBY merged 1 commit into
masterfrom
plan-truth-repair
Sep 17, 2026
Merged

AlexSamBY merged 1 commit into
masterfrom
plan-truth-repair

Conversation

@AlexSamBY

Copy link
Copy Markdown
Member

23 agents read all 1329 lines of docs/UPGRADE-PLAN.md and checked every trackable claim against the repository. The document was wrong in both directions. The plan is what the next person reads before touching this code, so both directions matter.

104 stale markers — work presented as open that had shipped

Mostly because a PR fixed something and never came back to the plan. The largest case: phases 1, 2 and 3 are all complete and all three read as pending. The status row still described a "React 17 hosted checkpoint" months after the React 18 bump landed in 713c1e8.

plan said repo shows
Phase 1 (React 17) open peers widened, full-suite CI leg react-17
Phase 2 (React 18) open createRoot at main.jsx:12, RTL 12→16, devDeps ^18.3.1
Phase 3 (contract) "partial" 38 contract snapshots, meta.schema.json, error boundaries, 16/17 matrix

16 false claims — assertions the repository contradicts

The ones that could mislead someone into a decision:

react-final-form is "the ONLY remaining React ≤18 cap" — it is not. react-final-form-arrays@3.1.4 is a direct dependency carrying the identical cap. Asserted in three places, including the comment in .github/workflows/ci.yml that justifies --legacy-peer-deps. Corrected there too: the §9.7-F4 bump has to move both packages together — react-final-form-arrays@5.0.0 requires react-final-form ^7.0.1, verified against the registry.

Appendix C ticks "React 19 flip: peers widened to include ^19". They are not widened — package.json still reads ^16.14.0 || ^17.0.0 || ^18.0.0. Nothing is broken in the repo; the risk is a reader treating React 19 as supported and telling a consumer so.

The pack measurements were stale in five places. 295 files / 7.25 MB / 2.53 MB → re-measured with the repo's own gate: 299 / 6.44 MB / 2.39 MB. More files, less weight, after the semantic-ui exit.

The plan's own correction saying FIELD.METHODS "does not exist" is wrong. It exists at rules.js:1109 and :1127 — and it is precisely the hazard class finding 5 catalogues: a per-instance write onto a module-global object.

Every module size in Appendix A was understated. Render.js is 223 lines, not the recorded 133 (+68%). Phase 6 is scoped against those numbers.

"No legacy React APIs anywhere in src" is ticked while Upload.js:34 calls event.persist() — §2.4 records this correctly, Appendix C never did. The global-listener inventory also missed the two document listeners the SUIR exit added (Listbox.js:206, TooltipPop.js:369).

Method

Extraction and verification fanned out across the document; every edit was drafted against a re-check of the evidence, then applied serially with a uniqueness assertion on each anchor — all 120 matched verbatim and exactly once. 13 candidate corrections were dropped: two because the re-check refuted them and the plan was right as written, the rest as duplicates already covered by an adjacent edit.

Nothing is deleted. Every correction supersedes the old text and keeps it visible, in the style the document already uses, so a reader sees what changed and why.

Structure verified unchanged: 104 headings, 196 table rows, balanced fences. ci.yml re-parsed — all five jobs intact, comment-only diff. lint:js, lint:css, css:fixture:check and both docs checks green.

The version bump is not part of this — the release stays the maintainers' call.

🤖 Generated with Claude Code

A verification sweep read all 1329 lines of docs/UPGRADE-PLAN.md and checked
every trackable claim against the repository. The document was wrong in both
directions, and the plan is what the next person reads before touching this
code, so both directions matter.

104 STALE MARKERS — work presented as open that had in fact shipped. Most of
it because a PR fixed something and never came back to the plan. Phases 1, 2
and 3 are all complete and all three read as pending; the status row still
described a "React 17 hosted checkpoint" months after the React 18 bump.

16 FALSE CLAIMS — assertions the repository contradicts. The ones that could
mislead someone into a decision:

  - "react-final-form is the ONLY remaining React ≤18 cap" — it is not.
    react-final-form-arrays 3.1.4 is a direct dependency carrying the
    identical cap. Stated in three places, including the comment in ci.yml
    that justifies --legacy-peer-deps. Corrected there too: the §9.7-F4 bump
    has to move both packages together (arrays 5.0.0 requires rff ^7.0.1,
    verified against the registry).
  - Appendix C ticks "React 19 flip: peers widened to include ^19". They are
    not widened; package.json still reads ^16.14.0 || ^17.0.0 || ^18.0.0.
    A reader could publish that claim to a consumer.
  - The pack measurements (295 files / 7.25 MB / 2.53 MB) were stale in five
    places. Re-measured with the repo's own gate: 299 / 6.44 MB / 2.39 MB —
    more files, less weight, after the semantic-ui exit.
  - The plan's own correction saying FIELD.METHODS "does not exist" is wrong.
    It exists at rules.js:1109 and :1127, and it is precisely the hazard
    class finding 5 catalogues: a per-instance write onto a module-global.
  - Every module size in Appendix A was understated. Render.js is 223 lines,
    not the recorded 133. Phase 6 is scoped against those numbers.
  - "No legacy React APIs anywhere in src" is ticked while Upload.js:34 calls
    event.persist(); §2.4 records this correctly, Appendix C never did. The
    global-listener inventory missed the two document listeners the SUIR exit
    added (Listbox.js:206, TooltipPop.js:369).

Nothing is deleted. Every correction supersedes the old text and keeps it
visible, in the style the document already uses, so a reader can see what
changed and why. 13 candidate corrections were dropped — two because the
re-check refuted them and the plan was right as written, the rest as
duplicates already covered by an adjacent edit.

The version bump is NOT part of this: the release stays the maintainers' call.
@AlexSamBY
AlexSamBY merged commit a4258ce into master Sep 17, 2026
5 checks passed
@AlexSamBY
AlexSamBY deleted the plan-truth-repair branch September 17, 2026 14:09
AlexSamBY added a commit that referenced this pull request Sep 17, 2026
Replaces #52, which conflicted after #51 was squash-merged: this is the
same single H1 commit, rebased onto `master`. Identical diff — 32 files,
+61 −3150.

## What went

| | |
|---|---|
| **12 orphan components** | `Avatar`, `Badge`, `Carousel`, `Collapse`,
`ErrorContent`, `ErrorTable`, `FloatNumber`, `ImageSwatch`,
`MenuButton`, `Square`, `TabList`, `Tags` |
| **10 LESS files** | the whole `src/style/unused/` tree |
| **4 icomoon artifacts** | `demo.html`, `demo-files/`, `Read Me.txt` |
| **2 functions** | `formatTime`, `toHours` in `time.js`, with the
imports that existed only for them |

## What deliberately stayed

**The engine `TabList`** (`pages/main/components/TabList.js`) —
`mapper.js:33` resolves it, and it is *not* interchangeable with the
pack copy: both `import './Tabs'`, and those two `Tabs` differ by ~100
lines. Swapping them would have silently regressed tab behaviour. **The
pack `Tabs.js` also stays**, so H6's duplicate pair is only half
resolved.

**icomoon's `selection.json` and `style.css`** — `selection.json` is the
project file you re-upload to regenerate the icon set, the only
round-trip path back to it. Dead to every build, but its loss is not
recoverable the way a demo page's is.

**`FIELD.TYPE.DATE`**, which H1 also lists — delete it, or give it a
`view: 'Date'` branch? That is an owners' call, so it was left alone.

## One decision this forced

`ErrorTable` could not go alone (`ErrorContent` imported it), and it was
also the last in-repo caller passing `inverted`/`striped` to `Table`.
`SUPPORTED-PROPS.md` recorded that step 1 deferred their fate to exactly
this deletion.

**They are kept.** Both are genuinely styled
(`table:not(.as-layout).inverted`, `table.striped tr:nth-child(2n)`),
`Table.js` still destructures them, and a consumer meta can still set
them. Dropping a supported prop because our own last caller went away
would be a breaking change bought for nothing. The generated "Attributes
at the call sites" table no longer lists them — which is *correct*,
since that table reports what the codebase passes, not what the
component accepts — so `wrapper-prop-curation.js` now says so
explicitly.

## Verified before deleting

One agent per target, each asked to **refute** that its target was safe:
mapper registration, the components barrel, the published entry, every
import spelling, tracked metas, docs, schema, CSS, the sibling
checkouts. `src/style/unused/` was cleared by compiling `index.less`
through the repo's own `less-options` and reading less's resolved import
list (44 files, none under `unused/`) — not by grepping basenames, which
would have been wrong here: `avatar.less` and `carousel.less` exist
elsewhere too.

## Measured after

| | before | after |
|---|---|---|
| suites / tests | 166 / 2539 | 166 / **2527** |
| statements | 94.83% | **97.04%** |
| branches | 90.19% | **94.06%** |
| functions | 93.28% | **96.88%** |
| lines | 95.36% | **97.76%** |

The −12 tests are exactly the two time suites (−9, −3); a per-suite diff
confirms no other suite's count moved. Coverage thresholds green.
`static/all.css` sha256 **unchanged** at `dcdb0a40a6d8ee79…` — deleting
`unused/` and the icomoon page touched no byte a consumer downloads.
`lint:js`, `lint:css`, `css:fixture:check`, both docs checks,
`build-lib` and `build-css` all green.

## Side effects worth naming

- `moment` is now imported **nowhere** in `src/core/utils/` — progress
on §9.7-F2.
- Workstream A loses 4 class components and 3 `UNSAFE_*` sites (29/14 →
**26/12**, re-measured).
- The third function-component `defaultProps` site is resolved by
deletion.

The plan is updated in the same commit — 28 places closed or corrected,
including the orphan counts, which are now a historical record rather
than a list of files to go looking for.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant