# M46 MVP UI Consistency — Source-Bound Visual Audit ## Scope and stopping point M46 is a bounded presentation/component pass over the already playable MVP. It standardizes repeated command states, owned command icons, type/spacing tokens and notice/disabled surfaces without flattening the accepted page compositions. Market, Guild, Party/Readiness, Risk, Battle and Company keep their task-specific art masters, normalized 16:9 canvases and field-attached layout. Gameplay, economy, Contract/Battle rules, Save/Receipt semantics, routing, content identities and localization semantics were not changed. Normal `100%` landscape is the blocking visual scope. `130%` evidence remains supplemental and non-blocking, as recorded in the Owner-approved repository contract. Product migration source: `ebc0c8f26c222d4764064e7998e3b143da727f4f`. Foundation source: `f736d7ac41a56feb50e9336f97faa5a6fa90c339`. ## Architecture boundary - `ABGUI_Tokens`, `ABGUIFactory` and `ABGUIIcon` remain presentation-only. - Passive Views consume copied Controller/ViewData snapshots and emit the same explicit deferred intents and stable semantic node names as before. - `ABGPageView.set_command_state()` is the shared disabled/selected state entry point for Company/Result/Recovery controls. - Market, Party, Readiness, Risk Board and Risk Commitment migrate repeated command chrome through the shared factory while retaining their local content controls, art masters and normalized geometry. - The shipped command glyphs for Settings, Back, Company, Coin, Equipment and action commands now use the owned vector icon grammar. Risk option glyphs remain content markers, not command chrome. - EntryShell remains the composition and application boundary; no mass rewrite or Router extraction was introduced. ## Source-bound evidence All accepted attempts used `tools/run_test_attempt.py` with immutable source archives, owned HOME/cache/TMP/browser roots, exact-once marker accounting, strict diagnostics and complete process-group/workspace cleanup. | Check | Attempt | Result | Evidence archive SHA-256 | | --- | --- | --- | --- | | Shared foundation | `m46-ui-foundation-focused/20260826T122929Z-99785` at `f736d7a` | PASS; `ABG_M46_UI_FOUNDATION_OK` exactly once; tokens, factory, icons, notices and touch checks; strict diagnostics `0`; owned cleanup | no retained evidence files | | Market View contract | `m46-c-market_page_view_test/20260826T125129Z-22546` | PASS; `ABG_M41_MARKET_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Party Line View contract | `m46-c-party_line_page_view_test/20260826T125152Z-22882` | PASS; `ABG_M39_PARTY_LINE_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Readiness View contract | `m46-c-readiness_page_view_test/20260826T125211Z-23202` | PASS; `ABG_M37_READINESS_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Risk Board View contract | `m46-c-risk_board_page_view_test/20260826T125229Z-23448` | PASS; `ABG_M38_RISK_BOARD_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Risk Commitment View contract | `m46-c-risk_commitment_page_view_test/20260826T125245Z-23757` | PASS; `ABG_M36_RISK_COMMITMENT_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Battle Result View contract | `m46-c-battle_result_page_view_test/20260826T125302Z-24054` | PASS; `ABG_M35_BATTLE_RESULT_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Recovery View contract | `m46-c-recovery_page_view_test/20260826T125320Z-24295` | PASS; `ABG_M32_RECOVERY_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | Company View contract | `m46-c-company_page_view_test/20260826T125337Z-22545` | PASS; `ABG_M44_COMPANY_PAGE_VIEW_CONTRACT_OK` exactly once; strict diagnostics `0`; owned cleanup | no retained evidence files | | DEV-3 candidate | `m46-d-dev3-candidate/20260826T125502Z-25993` | PASS; `ABG_DEV3_CANDIDATE_SUITE_OK` exactly once; 24 normal-render frames; parsed touch; strict diagnostics `0`; owned cleanup | `4525acf73eb155deeb9877bf5a3f6fc237abe4377e6b5a64b290e4dd6e867fc0` | | DEV-4 candidate | `m46-d-dev4-candidate/20260826T125705Z-28196` | PASS; `ABG_DEV4_CANDIDATE_SUITE_OK` exactly once; 24 normal-render frames; parsed touch; strict diagnostics `0`; owned cleanup | `9ab49d9831ebdccc80ac32045af4e0af4b7864e561378c16e167b5e85210efaa` | | DEV-5 candidate | `m46-d-dev5-candidate/20260826T125831Z-29634` | PASS; `ABG_DEV5_CANDIDATE_SUITE_OK` exactly once; 24 normal-render frames; parsed touch; strict diagnostics `0`; owned cleanup | `bb77c47994940a0d3f93d7fe52c7fa4406779b69e0a2c0c7fec1d625d259f401` | | DEV-6 candidate | `m46-d-dev6-candidate/20260826T130007Z-31282` | PASS; `ABG_DEV6_CANDIDATE_SUITE_OK` exactly once; 24 normal-render frames; parsed touch; strict diagnostics `0`; owned cleanup | `f2c608563ed3a741dff6c466f5e8c641f151f22f92748846444c104ae0e803f4` | | MVP first-cycle audit | `m46-d-mvp-first-cycle-audit/20260826T130153Z-33276` | PASS; `ABG_MVP_FIRST_CYCLE_AUDIT_OK` exactly once; 128 normal `100%` frames / 180 evidence files; locales `zh_CN,en`; required viewports; parsed touch/restart; strict diagnostics `0`; owned cleanup | `5433de35ad94e3eaab5cd30b9d3c9db01cbb1c92dd5af35b1339fff969c4a413` | | Current Company captures | `m46-d-company-capture/20260826T132145Z-53462` | PASS; `ABG_M16_COMPANY_CAPTURE_OK` exactly once; eight normal `100%` Roster/Recruit Detail frames across all four fixtures; authored 44px target check; strict diagnostics `0`; owned cleanup | `9e8da00b61af5dba758c9387a61ee8fcb3cb4ec65720daeabb2ba4cffe621d14` | | Current Contract Return/Guild captures | `m46-d-contract-return-capture/20260826T132252Z-54509` | PASS; `ABG_M45_CONTRACT_RETURN_CAPTURE_OK` exactly once; 12 normal `100%` Market/Contract Return/Guild frames across all four fixtures; bounds, overlap and clipping checks; strict diagnostics `0`; owned cleanup | `1c43556f6ecfd3ab0f683ce4ca9a1a3afe338b2ea8d6e264afcfaefce581e2a0` | The first Company capture invocation at `20260826T131211Z-44224` used an incorrect headless normal-render command and was interrupted during startup. It is retained only as a handled runner terminal and is not acceptance evidence. The corrected normal-render invocation above is the accepted capture set. ## Normal `100%` visual matrix The accepted MVP audit supplies 128 normal frames across the first-cycle Market/Recruit, Party/Readiness/Risk, Battle Opening/Live, Result, Knockout, Reward, Recovery and restart states. Its capture fixtures cover: - `760x360 / zh_CN / 100%` - `844x390 / en / 100%` - `1280x720 / zh_CN / 100%` - `1280x720 / en / 100%` The current Company capture set adds Roster and Recruit Detail for all four fixtures. The current Contract Return capture set adds Market, Contract Return Review and returned Guild for all four fixtures. Together the retained sets cover every M46 page family at the required normal viewports and locales; the DEV-3/4/5/6 candidate archives provide additional supplemental states and 130% fixtures. ## Manual visual review Representative full-resolution frames were extracted from the retained archives and reviewed at the required normal fixtures. Automated capture checks cover complete frame dimensions, viewport containment, authored touch targets and the relevant page-specific overlap/clipping assertions; manual review checked the same frames for hierarchy and visual drift. ### Findings - **Command language — PASS.** Market, Party/Readiness, Risk, Result/Recovery and Company now read as one family through the shared navy/gold/ivory states, focus treatment, disabled contrast and owned Settings/Back/action icons. - **Task composition — PASS.** The Market right rail and field-attached exit, Party formation line, Risk parchment/cards and Battle field HUD remain distinct and readable. The consistency pass did not turn them into a card wall or replace their accepted art masters. - **Notices and disabled states — PASS.** Receipt/status notices use the same bordered surface language; disabled Continue/Begin Battle/return actions retain truthful muted state without obscuring the authored copy. - **Responsive containment — PASS.** The inspected short landscape and wide landscape frames keep the 16:9 masters centered/contained, with footer and right-rail controls inside the viewport. No visible clipping or command overlap was found in the reviewed frames; automated bounds checks cover the full capture sets. - **Typography and density — PASS at the blocking scope.** Engine-rendered values remain legible at normal `100%`. Market and Risk Commitment retain intentionally compact fact copy inside their authored slots; the existing `130%` fixtures remain supplemental and are not a M46 blocker. ## Scope and repository checks - Existing semantic node names, explicit intents, focus order, routing and Save/Receipt behavior remain covered by the focused View contracts and the DEV/MVP suites. - No gameplay, economy, content, static-master, localization, packaging, device, signing, store or release work was started. - `git diff --check` passes. The only untracked files are Godot-generated `.uid`/`.import` metadata and `prototype_incremental/`, all retained per the repository contract and not staged. ## Verdict M46-C migration and M46-D verification satisfy the written stopping point. The MVP now has one coherent reusable command/icon/type/notice language while preserving its page-specific composition and runtime behavior. `ABG M46 MVP UI CONSISTENCY PASS COMPLETE`