9.9 KiB
M56 Fixed Canvas UI Repair
Player-visible stopping point
The first-play UI renders from one 1280x720 authored canvas. Title, Guild, Contract and Market use the same canvas transform, background crop policy, text-slot rules and interaction-bound policy at 1280x720, 844x390 and 760x360. Each visible surface has one owner and no duplicate legacy copy is drawn. The existing gameplay, Save and route semantics remain unchanged.
Ordered steps
- M56-A — Freeze the canvas contract. COMPLETE (2026-09-12). Set the runtime design viewport to 1280x720, add one shared fixed-canvas host/transform, and record the safe area, pillarbox policy and physical touch minimums.
- M56-B — Remove duplicate ownership. COMPLETE (2026-09-12). Migrate Title, Guild, Contract and Market to the shared host; remove duplicate visible layers, legacy render branches and external copies of component-owned labels.
- M56-C — Normalize component slots. COMPLETE (2026-09-12). Use fixed authored slots and shared typography/buttons; make compact components reversible and give localized copy explicit state/layout variants.
- M56-D — Visual/runtime gate. IN_PROGRESS. Capture static-only, dynamic-only and final composite views for all three fixtures in Chinese and English; inspect alignment, clipping, contrast, duplicate surfaces and physical hit bounds.
Acceptance checks
- One visible
DesignRootowns each first-play page; all visible descendants resolve in 1280x720 design units. - Background, static master, runtime content and hit areas share the same transform. Aspect mismatch produces intentional matte/pillarbox space.
- No duplicate semantic labels, frames, badges or navigation copies are visible in the scene tree.
- Text remains inside its owner slot for the required locales and fixtures; no page-specific font shrinker is used to hide overflow.
- Visual captures pass strict diagnostics, exact markers, overlap/clipping checks and 44px physical interaction bounds.
Frozen scope
Do not change battle rules, economy, content, Save schema, route semantics, audio, packaging, device release or unrelated postgame pages.
Commit boundaries
M56-A: project viewport, shared canvas host, contract/checkpoint update.M56-B: first-play page ownership cleanup.M56-C: component slot and typography normalization.M56-D: source-bound visual/runtime evidence and handoff.
Issue register
M56-I01: current pages mix full-viewport aspect-cover backgrounds with a contained 16:9 UI canvas.M56-I02: Guild creates button-owned navigation labels and a second outerGuildNavigationlabel layer.M56-I03: Market retains hidden legacy layout branches beside the current component path.M56-I04:RecruitCardcompact layout changes are one-way after resize.M56-I05: page-specific text scaling and duplicate node names can update a hidden legacy label instead of the visible component label.M56-I06: Contract header title/subtitle slots touched at 760x360; split the authored rows and raised the header minimum height in14eaf5a.M56-I07: Contract action buttons relied on themedButton.textbeneath custom chrome; replaced it with an explicit icon-safeButtonLabelslot.M56-I08: Contract actions had unequal HBox widths; both commands now use the same 220px authored button slot so the dock has a stable rhythm.M56-I09: Shared commands had height tokens but page code still scattered fixed widths; semantic widths now live inui_tokens.gd, the shared factory enforces them for fixed requests, and Settings footer actions use the same secondary/primary footprints.M56-I10: Readiness bottom actions used four different normalized widths; they now use four equal authored slots while retaining primary/secondary visual state.M56-I11: Equal slots were still represented as page-local normalized literals; the shared token layer now calculates design-grid rows from canvas margins, gutters and column count so future pages use the same geometry.M56-I12: Readiness static master already contained four bottom button surfaces and icons; runtime controls duplicated them. Runtime now owns only measured hit areas and localized label slots over the authored plates.M56-I13: After removing duplicate chrome, the first runtime label slot sat below the authored cream plate; the slot was moved upward inside the measured plate bounds to prevent bottom-edge clipping.M56-I14: Owner review of the current Readiness composite rejects the page as a visual finish. Although the duplicate bottom chrome is gone, the frame still has weak runtime text hierarchy and an incomplete static-master/runtime composition; automated probes do not close this gate.M56-I15: Readiness runtime typography used micro labels for authored header and action slots; header values now use the shared label token and action/body slots have a higher readable floor without escaping their measured bounds.M56-I16: Repeated local fixes exposed that the page had no complete measured slot manifest. Owner feedback resets the visual gate: Readiness is the sole repair sample until its static, runtime and hit-area ownership is documented and its final composite is accepted at play size.M56-I17: The measured Readiness geometry was still embedded in the page view, making future edits likely to reintroduce drift. Added the source-bound slot manifest and routed header, member, action hit and action label geometry through it. The manifest does not close the visual gate; it makes the next review reproducible.M56-I18: The first manifest revision mapped only three header plates and left two runtime values overlapping; it also redrew the static Settings gear. The manifest now exposes all five value slots and Settings is hit-area only.M56-I19: The right warning stack could run beneath the foreground flag at play size. Its text column and auxiliary status labels now stay inside the measured left column, preserving the full warning copy without covering the flag.M56-I20: The static master contains two unused transition placeholders beneath the readiness summary. Their empty frames leaked through the translucent runtime band and looked like unexplained controls; the summary surface is now opaque and is the sole owner of that region.M56-I21: The warning stack was floating over the world and under the foreground flag. It now uses the authored upper-right parchment as its sole surface, with the risk and knockout hints kept in the adjacent left column.M56-I22: Owner could not infer the purpose of the central summary panel. Added an explicit localizedDEPARTURE SUMMARYtitle and renamed the four values to guard/ranged/control/reserve slots so the panel communicates its pre-departure decision purpose at a glance.M56-I23: The summary and warning surfaces still read as generic runtime rectangles against the authored parchment. Reduced the summary chrome to a thin angular plaque, removed the warning color bars, added severity text colors and localized the canonical warning strings for the Chinese render.M56-I24: Owner review rejected the old muted-yellow static master and its baked top/bottom controls as a visual system. Readiness now uses the clean Guild courtyard background and a single shared blue-gold runtime skin for top rail, status panels and all four command buttons; the slot manifest was rewritten so no authored control is duplicated.
Gate record
2026-09-12 source-bound checks passed for entry, Guild, Market, Contract and
Readiness. Visual probes were inspected at 760x360, 844x390 and 1280x720 in
Chinese and English, including static, dynamic and final composite captures.
The post-width-token DEV-1 candidate suite also passes all six headless checks
and the 20-frame normal entry capture with strict diagnostics at zero; the
Settings footer was re-inspected in 760x360 Chinese and 844x390 English.
The equal-slot Readiness revision passes the six-fixture visual probe with
strict diagnostics at zero and was inspected at 760x360 Chinese.
After moving the equal-row calculation into shared tokens, the same visual
probe passes again at commit 8804a23.
After removing the duplicate Readiness chrome and aligning labels to the
authored plates, the six-fixture visual probe passes again at commit 1abab14;
the 760x360 Chinese composite shows one visible button set with no lower-edge
duplicate or clipped label.
On 2026-09-13 the owner reviewed a live composite and rejected visual closure;
M56-D remains open for the static/runtime slot and typography repair.
The follow-up typography revision passes the six-fixture Readiness visual
probe with strict diagnostics at zero; the 760x360 Chinese composite was
re-inspected after the change.
That machine result does not close the gate. On 2026-09-13 the owner rejected
the recurring visual regressions; no further page migration is authorized by
this plan until the Readiness slot manifest and final composite are repaired.
The slot manifest is now checked in at
docs/runtime/M55_READINESS_SLOT_MANIFEST.md; the fresh-archive visual probe
passes at all three required viewports and both locales with strict diagnostics
zero. The final composite remains OPEN pending owner inspection.
The clean-skin revision passes the fresh-archive six-fixture probe at commit
1f76b6f; the 760×360 Chinese composite was inspected after raising the
runtime title and status labels above their owning panels. Visual acceptance
remains OPEN pending owner review.
The follow-up balance pass at commit 8c797cc keeps the party line clear of
the right information column, raises name contrast and reduces the summary
footprint; its fresh-archive six-fixture probe also passes. The gate remains
OPEN for owner review of the overall composition.
Final handoff
M56 closes only after the first-play pages are visually inspected at all required fixtures and the owner reviews the resulting captures at play size.