Files
Project-SDE-WP-Suite/docs/reference/creator-frame.md
n.siegfried d092db3920 T7.1 prep - measure the iframe boundary before dissolving it
Wave 7 opens with the largest engineering item in the plan, and the wave file is
explicit that it ships alone. This is the measurement that should precede it -
the same role tokens.md played for T3.2, produced for the same reason: the
estimate in the plan came from a read of the symptom, not a count of the work.

Four numbers, and where they come from:

  page-stylesheet selectors colliding   21   (9 of them the sequence editor)
  script top-level names colliding       9   (all of them one feature done twice)
  markup ids colliding                   0
  cross-frame call sites                28   across 8 scripts and 1 page

The zero is the largest piece of good news available: 96 and 127 ids and not one
shared, so every getElementById in both files survives the merge untouched.

The nine script collisions are misleading in the other direction. They are not
nine names for nine things - they are usage analytics and the feedback panel,
each implemented twice. The merge is a de-duplication, not a rename, and behind
nine names sit two parallel implementations.

Also recorded: every cross-frame call added by waves 5 and 6 is a shim over the
boundary, is commented as such, and is DELETED by T7.1 rather than migrated.
T5.5 already proved the SOP-borne propagation path needs no boundary crossing at
all, which is X4 resolved rather than outstanding.

And three questions no count can answer, which T7.1 has to settle: whether the
creator gets an app bar back, whether the sequence editor becomes one component
or two, and what happens to body.embedded when "framed" stops being a state.

Wave 7's implementation is NOT started. This commit is measurement only, and
nothing in html/ or server/ changed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-17 00:28:25 -05:00

149 lines
6.8 KiB
Markdown

# The creator's iframe boundary — what `T7.1` has to untangle
**Produced for:** `T7.1` (`B7`) · **Measured:** August 17, 2026 · **Branch:** `feat/wp-suite-r2-implementation`
**Read by:** `T7.1`, and every task from `T7.2` down, since all of them depend on it
`T7.1` is described in the plan as the largest engineering item in it, and the wave file is
explicit that it ships as its own change with no feature work attached. This document is the
measurement that should precede it — the same role `docs/reference/tokens.md` played for
`T3.2`, and produced for the same reason: the estimate in the plan came from a read of the
symptom, not a count of the work.
**Nothing here is a decision.** It is four numbers and where they come from.
---
## 1. What the boundary actually is
`work-package-suite.html` declares `<iframe id="wp-frame">` with no `src`.
`work-package-suite-app.js` sets it at runtime to
`wp-creation-index.html?embedded=1&project=<id>`.
The creator is the only page in `html/` that loads **neither `wp-chrome.css` nor
`wp-chrome.js`** — that is why it has no app bar of its own and why it reads as part of the
wizard rather than as a page. Dissolving the frame means deciding whether it gets that chrome
back or deliberately does not; the wave file leaves that open and it is the one design
question inside an otherwise mechanical task.
---
## 2. The four collisions, counted
Merging two documents means merging four namespaces. Three of the four are far smaller than
they look, and the fourth is zero.
| Namespace | Wizard | Creator | Colliding |
|---|--:|--:|--:|
| Page-stylesheet class/id selectors | 104 | 307 | **21** |
| Script top-level names | 156 | 299 | **9** |
| Markup `id` attributes | 96 | 127 | **0** |
| Cross-frame call sites | — | — | **28**, across 8 scripts and 1 page |
### 2a. The 21 colliding selectors
```
active add-btn col1 drag-over dragging field field-grid field-hint
gate header header-title is-current modal notice seq-arrow
seq-gate-badge seq-handle seq-label seq-num seq-step sub-heading
```
`file-map.md` §2 predicted exactly this and said not to assume it stays harmless: *"They are
mutually exclusive per page today … so nothing currently breaks — wave 3 must not assume that
stays true once chrome is unified."* It is now the thing that breaks.
Nine of the twenty-one are the **sequence editor** (`seq-*`, `drag-over`, `dragging`, `gate`),
which exists in both because the wizard authors the sequence and the creator renders it. Those
are the same component drawn twice, and merging them is a real question rather than a rename.
The other twelve are generic layout names — `field`, `notice`, `modal`, `header` — where the
two sheets simply disagree about padding and type. Those are a rename or a scope, not a
design decision.
### 2b. The 9 colliding script names
```
ANALYTICS_KEY analyticsLoad analyticsSave downloadAnalytics showAnalytics
exportComments importComments toggleComments track
```
Every one of them is **the same feature implemented twice** — usage analytics and the feedback
panel. None is a genuine name clash between two different things. That means the merge is a
de-duplication rather than a rename, and it makes the count misleadingly small in the other
direction: nine names, but two parallel implementations of two features behind them.
`showAnalytics` is the one to check first — `T5.8` recorded that the wizard's copy has **no
caller in the wizard's markup**, because the "Usage data" button lives on the creator and calls
the creator's own.
### 2c. Markup ids: zero collisions
96 and 127 ids, none shared. That is luck rather than design, and it is the single largest
piece of good news in this document: every `getElementById` in both files keeps working.
### 2d. The 28 cross-frame call sites
Spread across `auth-guard.js`, `help.js`, `project-data.js`, `sw.js`,
`work-package-suite-app.js`, `wp-chrome.js`, `wp-creation-app.js`, `wp-sidenav.js` and
`work-package-suite.html`.
Three scripts branch on `window.top !== window.self` and change behaviour when the frame goes:
| Script | Framed behaviour today |
|---|---|
| `auth-guard.js` | redirects `window.top` to `login.html` |
| `wp-chrome.js` | returns early, renders no chrome |
| `help.js` | suppresses the Help FAB in the child |
And the parent reaches **into** the child at four call sites, all added or touched by waves 5
and 6, all commented as `T7.1` removes them:
| Call | Added by | Purpose |
|---|---|---|
| `cw.openWpById(id)` | before wave 5 | open a deep-linked package |
| `cw.showDashboard()` / `cw.showForm()` | before wave 5 | switch view |
| `cw.dashApplyFlag(flag)` | `T5.3` | carry the pipeline strip's filter across |
| `cw.applySopSections(sections, fields)` | `T5.5` / `T5.6` | carry a section toggle across |
The last two are the ones `X4` is about. **Both become unnecessary** when the frame goes —
they exist only because the two documents cannot share a variable.
---
## 3. What wave 5 and 6 already did to shrink this
Recorded so `T7.1` does not redo it:
- **`T5.5` proved the SOP-borne path works.** Section toggles reach the creator through the
SOP it reads at its own boot, with nothing crossing the boundary. The live hand-off is the
*second* path and is the only part `T7.1` deletes. `X4`'s concern was resolved in wave 5 and
is not outstanding.
- **`T5.3`'s dashboard filter is URL state.** The creator reads `?flag=` at boot. The
hand-off exists only for the already-loaded frame, and goes the same way.
- **`T6.3`'s location dropdowns fetch from the server**, not from the parent. Nothing new
crosses the boundary.
Every cross-frame call added since wave 4 is a *shim over the boundary*, is commented as such,
and is deleted rather than migrated.
---
## 4. What this does not tell you
Three things `T7.1` has to settle that no count can answer:
1. **Does the creator get the app bar back?** It is the only page without one. Giving it one
changes the wizard's layout maths (`chromeHeight()`, `--wp-chrome-h`, the `embed-full`
sizing); not giving it one leaves a page that is not a page.
2. **One sequence component or two?** Nine of the twenty-one selector collisions are the
sequence editor. Merging it is a genuine consolidation; scoping it is a rename that leaves
the duplication in place for wave 9 to find again.
3. **What happens to `body.embedded`?** `wp-creation-styles.css` opens with
`body.embedded .embed-hide { display: none }` — the creator hides its own header, its own
sample-data controls and its own analytics button when framed. Dissolved, "framed" stops
being a state and those controls need a home or a deletion.
`BL-001`, `BL-006`, `BL-007` and `BL-013` are all logged against `T7.1` and all live in
`wp-creation-styles.css`. If that sheet is being scoped or rewritten anyway, they are cheaper
now than they will ever be again — but they are separate items and `T7.1` says to bundle
nothing.