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>
6.8 KiB
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.5proved 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 partT7.1deletes.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:
- 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, theembed-fullsizing); not giving it one leaves a page that is not a page. - 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.
- What happens to
body.embedded?wp-creation-styles.cssopens withbody.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.