Skip to content

EPBDS-16211: bring the plan's checklist in line with what is done - #150

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

AlexSamBY merged 1 commit into
masterfrom
docs-plan-housekeeping

Conversation

@AlexSamBY

Copy link
Copy Markdown
Member

What changes

The checklists in docs/UPGRADE-PLAN.md now match what the plan records as done. Several boxes were still open, or said "still open", after the work had landed and been recorded elsewhere in the plan.

  • Each box closed here cites the evidence that closes it.
  • Each box that stays open now says why.

There is no code change. In package.json, only the text of lint messages changes.

Closed, with the record that closes them

§9.3 step 3, de-globalizing instance state, is marked done.

  • Its header read "STARTED 2026-09-23: Active.translate is done, the rest is not".
  • But every item under it had been closed or measured not to leak, and §11 retired R14 on that evidence (2026-10-01).

One item in step 3 had no record: the translation registries. I checked them now, and there is nothing to convert:

  • Every localiseTranslation call in src/core runs at module top level.
  • Active.LANG, the language the phrases are read in, is assigned nowhere outside the tests.
  • The same search found no other write to Active from an instance, apart from the translate fallback that step 3 already records. renderField, Field and UIRender are code, and the same for every document. passwordCheck is set by the host.
  • Each zero-hit search was proven with a control: the same pattern run on the tests finds their writes.

Phase 6: five boxes are ticked.

  • State per instance: §9.3 step 3 and R14, as above.
  • Runtime hazards: §9.3 step 4 records "This step is now empty", and R17 was retired on 2026-09-23.
  • The engine ⇄ form-modules import cycle: gone since EPBDS-16211 Phase 6 step 2: dissolve the engine/form-modules import cycle #69 (2026-09-23). Re-checked:
    • No source file under src/core/modules imports the engine. Only its tests do, to render whole documents.
    • No suppression of the layer rule is left in src.
  • Two instances on one page: four tests cover it: rules.two-instances.test.js, rules.two-instances-errors.test.js, popup-root.two-instances.test.js, and the two-documents case in examples.strict-mode.test.js.
  • StrictMode: done 2026-09-29 (§9.3 step 7). The test has run on virtual time since EPBDS-16211: compare the StrictMode runs on virtual time #149.

The go/no-go on the E2/E3 tail of the TS migration. It was decided GO on 2026-09-30 (§9.6, Governance), and the tail is done.

H1/H6: the pack Tabs.

H1/H6: grepping consumer metas for orphan names is moot, as measured.

Phase 1: the react-refresh dev loop, checked on 18.

  • The demo has developed against React 18.3 since EPBDS-16211 Develop and test against React 18.3 #31, and the checkpoint release on 17 was cancelled (§10). So there is no dev loop on 17 left to check.
  • In the running demo, an edit to src/demo/pages/Examples.jsx arrived as a hot update, and so did reverting it.
  • Neither reloaded the page: a value set on window survived both, and so did a number typed into a field.

Ongoing invariant: the alias grep stays at zero.

  • It reads 0 today.
  • No ui-*-pack alias is configured in any webpack config or in jest, and no such package is installed. So an import of one fails to resolve.

Two findings are marked resolved.

  • E3's colGroup propType: E5 deleted the propTypes, and the TS type, TableColGroupProps['colGroup'], says style.
  • F1's tooltip half: closed at F1 step 2. omitProps keeps view, index and symbol off the bubble.

Left open, now saying why

  • F2: "The gate did not open: moment stays (2026-09-30)". Its two boxes wait for a reopening. The F2-seam invariant now says it applies only if F2 reopens.
  • F4: postponed on 2026-09-30, and no longer a React 19 prerequisite. Its two boxes stay open.

package.json: the layer lint's messages

Only the message text changes, in 14 messages:

  • The core/modules message said "Two sites in modules/form/utils.tsx predate this rule and carry an eslint-disable". EPBDS-16211 Phase 6 step 2: dissolve the engine/form-modules import cycle #69 (§9.3 step 2) removed both.
  • The core/state override's three messages began "core/utils must not import". They were copied from the utils override.
  • The layer direction every message quotes left out core/state. It now matches CLAUDE.md, and the bans configured in the overrides.

I put a probe import of the engine in src/core/state and another in src/core/modules. Both still fail lint, with the new text, and the probes are removed. Rewriting package.json through JSON leaves it byte-identical when nothing is changed, so nothing but these 14 lines moved.

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.

The number of tests is unchanged.

🤖 Generated with Claude Code

Several boxes in docs/UPGRADE-PLAN.md were still open, or said "still
open", after the work they track had landed and been recorded elsewhere
in the plan. Each box closed here cites the evidence that closes it.
Each box that stays open now says why.

- §9.3 step 3 is marked done, as R14 already was. The one item with no
  record, the translation registries, was checked: every phrase is
  registered when its module loads, and no instance writes them.
- Phase 6: five boxes are ticked. Each cites its record: §9.3 steps 2,
  3, 4 and 7, and the two-instance tests.
- The go/no-go on the TypeScript tail is ticked with its 2026-09-30
  decision. The Tabs reconciliation is ticked with its rename (#60).
- The orphan-name grep is moot. The mapper registered none of the
  twelve files H1 deleted, and each name renders the same before and
  after #53.
- The react-refresh check ran on 18, the React the demo develops
  against: a hot update kept the page's state.
- The alias grep is ticked. No alias is configured, so such an import
  cannot resolve.
- F2 and F4 stay open, each headed by the decision that keeps it so.
  The F2-seam invariant applies only if F2 reopens.
- E3's colGroup finding and F1's tooltip half are marked resolved.

package.json: the layer lint's messages were stale.
- The modules message said two suppressed imports remained in
  modules/form/utils. §9.3 step 2 removed both.
- The state override's messages said "core/utils".
- The layer direction they quote now includes core/state.

Only the message text changes. A probe import still fails both rules.
@AlexSamBY
AlexSamBY merged commit 9bc9cf9 into master Oct 2, 2026
5 checks passed
@AlexSamBY
AlexSamBY deleted the docs-plan-housekeeping branch October 2, 2026 08:13
AlexSamBY added a commit that referenced this pull request Oct 2, 2026
## What changes

**Five sentences in `docs/UPGRADE-PLAN.md` no longer say that the `Tabs`
duplicate is open.**
- They still said that the pack `Tabs.js` was on disk, and that the H6
duplicate was only half resolved.
- In fact #60 renamed the pack copy `StandaloneTabs` on 2026-09-22, and
§9.9-H6 records the item as closed.

| 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:
  - the engine ⇄ form-modules cycle, which #69 removed;
- an import of `modules` from `components/Text.js:4`, while `Text.tsx`
imports nothing from it;
  - the demo entries at the `src/` root, which H3 moved to `src/demo/`.

## 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](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