# 120 — Verification

Status: approved 2026-09-30.

## 1. Principles

- Every phase ends with live captures from Kodi, compared by numbers and by
  looking at `side_by_side.png`; reading XML is never verification.
- **Estuary is the reference**: the same screen under `skin.estuary` and
  `skin.milionar` in the same session and resolution (2560x1440 native).
- `xmllint --noout` on every changed XML, `python3 -m py_compile` on every
  changed Python file, `kodi_live.py reload` with a clean log.
- The addon is re-checked in Estuary after every phase (no regressions for
  users who do not switch).

## 2. Screen set (`scripts/skin_harness/screens.json`)

| Group | Screens |
|-------|---------|
| Home | every visible main-menu item focused (widget area shown), top bar buttons focused, empty-library state |
| Videos | movie titles **and** TV show titles, each in all 9 views (List, Poster, IconWall, Shift, InfoWall, WideList, Wall, Banner, FanArt); seasons, episodes, sources, addon listing (`plugin://plugin.video.milionar/`) |
| Info | DialogVideoInfo movie / tv show / episode, cast list focused |
| Dialogs | context menu, select, yes/no, keyboard, busy, notification, extended progress, addon settings, text viewer, media source |
| Settings | Settings root, Interface category, SkinSettings each section, profile, system info |
| Playback | fullscreen OSD, seek bar, fullscreen info, subtitles dialog, played from a local ffmpeg test video (100 §5) |
| Addon | MyTV, MyCinema, Continue watching, search dialog (`DialogWcsSearch`), details, game, premium notification dialog (harness `dialog`) |
| New (skin only) | settings menu 1108, search window 1120 (results / empty), actions menu 1121, game topic picker 1122, Milionář info button, skin settings Milionář section |

Masks and expected changes per screen live in `screens.json`.

## 3. Phase checks

| Phase | Must hold |
|-------|-----------|
| F0 | Estuary captured twice → 0 differing px outside masks on all screens; native frames 2560x1440; `skin`/`reload`/`window`/`jsonrpc` commands work |
| F1 | fork (branding only) vs Estuary: every screen `same` except declared logo/icon bboxes; `difftree` clean; install/update tests 040 §7 pass; theme and colour switching work; `kodi.log` clean |
| F2 | only Home screens, 1108 and skin settings differ, and only in declared regions; each widget row filled and empty; widget timing ≤ 150 ms warm (060 §2); Home ready time within +10 % of Estuary (time from `ActivateWindow(Home)` until all visible rows report `Container(id).NumItems > 0` or empty state) |
| F3 | search flow end to end with results / no results / person / library match; no TMDb calls from row loads (log) |
| F4 | info button + action menu for movie/show/episode; context menu items in Estuary and skin.milionar; each action runs; info dialog unchanged elsewhere |
| F5 | full screen set green; addon regression pass in Estuary; user's test |

## 4. Acceptance (F5)

- Full `baseline.py compare` report attached to the F5 result, no
  `REGRESSION` rows.
- Fresh-install and update flows (040 §7) re-run on the final ZIP from
  `/deploy` (skin inside the ZIP).
- `docs/features/012-skin-milionar.md` written after the user's test
  (`/feature`).
- Skin screenshots for `resources/skin.milionar/addon.xml` assets taken from
  the live frames (1280x720 JPEG).

## 5. Amendment (2026-10-01)

The user ruled out automatic full runs: §3 phase checks and the §4 full compare are replaced by a targeted check of what was just changed (`baseline.py capture --only <screens>`, `compare --only`, plus a live look at the touched screen). A full set runs only when the user asks. What was run during the build: F0 stability (2x full, 71 screens identical), F1/F2/F4 spot compares (videos, info dialogs, context menu, OSD identical; Home-backed screens and the skin name in settings differ as declared in `screens.json`), install tests (040 §8).
