Skip to content

EPBDS-16211: stop the plan calling the Tabs duplicate open - #151

Merged
AlexSamBY merged 1 commit into
masterfrom
docs-plan-tabs
Oct 2, 2026
Merged

AlexSamBY merged 1 commit into
masterfrom
docs-plan-tabs

Conversation

@AlexSamBY

Copy link
Copy Markdown
Member

What changes

Five sentences in docs/UPGRADE-PLAN.md no longer say that the Tabs duplicate is open.

Where It said It now adds
§1, executive summary "the pack Tabs.js is still present" the rename, and why the copies were renamed rather than merged
§2.6, finding 14 "the pack Tabs.js survives" the same
§9.2, step 1 "Tabs is still open … the gate above still applies" the gate is met, and the copy was converted to hooks on 2026-09-28 (§9.3 step 6)
Appendix A, structure facts "H6 is not closed" H6's Tabs/TabList item is closed, and its other renames are still open
Appendix C, archived snapshot "only half reconciled" the rename

Each sentence is struck through and followed by what closed it, as the plan marks its other closed items.

How I checked that none is left: I searched the plan for the stale phrases:

  • "H6 is not closed";
  • "half resolved" and "half reconciled";
  • "Tabs is still open";
  • "Tabs.js is still" and "Tabs.js survives".

They occur on six lines, and on each one only inside a strikethrough. #150 struck the sixth.

Found, and not changed here

  • The orphan scan in Appendix B scans nothing now. It loops over src/core/components/*.js, and since the TypeScript migration the pack has no .js file: it has 42 .ts/.tsx files.
    • In zsh the glob fails.
    • In bash the loop runs once, on the literal pattern.
    • Its Tabs example also predates the rename.
  • Appendix A's structure facts are stale beyond Tabs. They still list three things that are gone:

Gates

All exited 0, run on this branch:

  • lint:js, lint:css, typecheck, typecheck:contract;
  • docs:props:check, docs:views:check, css:fixture:check;
  • test:env-flags, build;
  • test:coverage, thresholds included;
  • test:pack, test:pack:peers, test:types;
  • test:react16, test:react17, test:react19, 2854 tests each, with no worker crash;
  • test:e2e, 41 tests;
  • the manifest contract.

🤖 Generated with Claude Code

Five sentences in docs/UPGRADE-PLAN.md still said the pack Tabs.js was
on disk and the H6 duplicate only half resolved: in §1, §2.6 finding
14, §9.2, Appendix A and Appendix C. #60 renamed the pack copy
StandaloneTabs on 2026-09-22, and §9.9-H6 records the item as closed.

Each sentence is struck through and followed by what closed it, as the
plan marks its other closed items. The §9.2 one also says that the
gate it set is met, and where the conversion to hooks is recorded.
Appendix A adds that H6's other renames are still open.
@AlexSamBY
AlexSamBY merged commit e7ffaab into master Oct 2, 2026
5 checks passed
@AlexSamBY
AlexSamBY deleted the docs-plan-tabs branch October 2, 2026 08:30
AlexSamBY added a commit that referenced this pull request Oct 2, 2026
## What changes

These are the two findings that #151 recorded and left for a change of
their own. Both are in `docs/UPGRADE-PLAN.md`.

### The orphan scan in Appendix B reads TypeScript again

**It had checked no component since the TypeScript migration.** It
looped over `src/core/components/*.js`, and the pack has no `.js` file
now: it has 42 `.ts`/`.tsx` files.
- **In zsh**, the glob fails: `no matches found:
src/core/components/*.js`, and nothing is printed.
- **In bash**, the loop runs once, on the literal pattern. It prints one
line, `198 *`: the pattern becomes `/*'`, which matches every file that
contains a `'`.

**The new command finds the pack's `.ts` and `.tsx` files** and strips
either extension. It matches an import in either quote style, and leaves
out the component's own file under either extension.

How I checked it:
- **Run as the plan prints it,** in bash and in zsh, it scans all 42
files, with the same output in both shells.
- **It reports nothing as an orphan today:** no pack file reads 0.
- **It can still fail:** a file I planted in the pack with no importer
read 0. I then deleted it.

**Its notes on reading the output are re-measured.** The old ones
described what the scan showed on 2026-09-17:
- **`index`** used to be "the only remaining 0". It now reads 5, and
none of the five is the pack's barrel: three import the engine's
`index`, and two are doc comments. The barrel itself is imported by
directory path (`from '../components'`), which the pattern cannot see.
- **The same-name trap still applies, with a current example.** `files`
reads 5, and two of the five import `modules/variables/files.ts`. The
old example, `Tabs`, went with the H6 rename.
- **A count includes the demo.** `StandaloneTabs` reads 1, and that one
importer is the demo's `NavTabs`.

### Appendix A's structure facts

Each fact that is gone is struck through and followed by the change that
removed it, as the plan marks its other closed items:
- **The engine ⇄ form-modules cycle** went with #69 (§9.3 step 2,
2026-09-23).
- **`components/Text.js:4` importing `modules`** went with #64 (H5,
2026-09-23). The layer lint rejects both of these imports now.
- **The demo entries at the `src/` root** moved to `src/demo/` with #63
(H3, 2026-09-23).

Two more fixes in the same bullet:
- **The orphan-scan result** is the re-run above. It used to say the
barrel read 0.
- **The engine `TabList`'s path** now also gives its current one,
`src/core/engine/components/TabList.tsx`. This one was not in #151's
list.

There is no code change.

## Gates

All exited 0 on this branch, `test:coverage` on its second run:
- `lint:js`, `lint:css`, `typecheck`, `typecheck:contract`;
- `docs:props:check`, `docs:views:check`, `css:fixture:check`;
- `test:env-flags`, `build`;
- `test:coverage`, thresholds included;
- `test:pack`, `test:pack:peers`, `test:types`;
- `test:react16`, `test:react17`, `test:react19`, 2854 tests each, with
no worker crash;
- `test:e2e`, 41 tests;
- the manifest contract.

**The first `test:coverage` run failed one test, and this PR is not the
cause.** `examples.strict-mode.test.js` compares each example's DOM
after an edit, with and without StrictMode. On `tableForm` the two runs
read different DOM:
- the plain run read the date picker still open, with the typed text;
- the strict run read it closed, with the value reverted.

This is the same kind of race #149 fixed, through animation frames
instead of timers:
- The picker opens, aligns and closes on animation frames, through
`rc-util/raf`. #149 left `requestAnimationFrame` on real time.
- The 400 ms the test waits after an edit are virtual, and they take 1–3
ms of real time. Whether a real frame lands inside them is chance. With
the test's own timer setup and no coverage, 2 of 3 plain runs had no
frame there, and read the picker open.
- With frames suppressed, both modes read the picker open. So the
comparison depends on whether a frame ran.

The rerun passed all 2854 tests. The fix belongs in the test, in a
change of its own.

🤖 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