# Standing TV display verification — 6 November 2026

Implemented in the existing public TV HTML/CSS/JavaScript. Schedule APIs, database records, polling, room selection, and agenda continuation logic retain their existing contracts. The existing watermark image is unchanged. The supplied reference URL was unavailable during the initial pass; the compact-pattern follow-up below successfully retrieved and inspected its HTML.

## Automated checks

- `npm test`: 22 checks passed. The new progress test covers before/start/midpoint/end/after states, WIB midnight, equivalent UTC timestamps, and invalid or nonpositive ranges.
- `npm run typecheck`: passed.
- `npm run build`: passed. Vite retains its advisory about the existing admin bundle exceeding 500 kB.
- `git diff --check`: passed.
- After the status styling and moving-border refinement, the focused signage suite passed again: `node --import tsx --test --test-isolation=none tests/signage.test.cjs` (15 checks). The public JavaScript/CSS loaded directly in the repeated browser checks below.

Commands ran with the available Node.js 26.8.1. The project declares Node.js 24 for development and deployment.

## Browser checks

Headless Microsoft Edge 156.0.4314.58 loaded the actual public assets from an isolated loopback fixture server. API-shaped fixtures used the existing bundled demo titles and speakers, with explicitly controlled dates for boundary checks. No application database was read, seeded, migrated, or modified by these browser checks. Browser timezone was set to America/New_York to verify that the display still uses WIB.

- 1080×1920 and 540×960 portrait: both session cards displayed their three complete demo topics and speakers without detected frame, card, or list overflow.
- 1920×1080 with both clockwise and counterclockwise rotation: the portrait canvas retained its layout without detected overflow.
- Exactly ten loaded watermark images: four small, four medium, two large, within the requested size ranges at 1080×1920. Each has a unique animation configuration, a 35–53 second duration, and a 64–70px drift vector. Placement keeps a large mark on the white session surface.
- All ten computed transforms changed independently during observation; opacity stayed at 5%. After the visibility refinement, measured movement over five seconds was approximately 9–15px per mark. Under emulated reduced motion, all ten animations were disabled.
- Only cards whose status is `NOW` have a white computed background and an SVG border. Upcoming and completed cards have blue backgrounds, including the first card before/between sessions and after the final session. These assertions passed across time boundaries, both portrait sizes, rotations, and continuation pages.
- The active gold border segment changed its computed stroke offset over five seconds. In reduced-motion mode, its animation was disabled while the static outline remained.
- CSS neutral silhouettes and difference blending keep the original image visible on both blue and white surfaces. A blue-card screenshot comparison with the watermark layer visible versus hidden found 58,120 pixels with at least five color levels of difference and a maximum channel difference of 13. This verifies rendered contrast, in addition to image loading and transform changes. Active and completed-state screenshots were visually inspected.
- Topic numbers and the first title line share a baseline, including wrapped titles. Browser probes inserted temporary zero-size inline baseline markers and confirmed less than 0.5px difference in portrait, both rotations, and the 100-step long-content checks, including speaker continuation pages.
- The WIB clock advanced from `09.30.00` to `09.30.01` and session progress advanced beyond 50% while the existing featured card DOM node stayed in place.
- Advancing the clock across exact session boundaries automatically selected the correct current/next/final session and showed 0%, 50%, or 100% progress as appropriate. A gap between sessions selected the next session with `Akan datang` and zero progress.
- Long session titles, long unbroken strings, 14 featured topics, 9 secondary topics, and two speakers per topic remained available through measured continuation pages. Both portrait sizes passed 100 page-rotation steps without detected overflow; all topic indices appeared.
- A single session occupied the available card area. The settings dialog and fullscreen keyboard control remained functional.
- No browser JavaScript errors occurred. Portrait screenshots were also visually inspected.

Local ignored QA artifacts are `.preview/verify-tv-animation.mjs`, `.preview/tv-animation-results.json`, and `.preview/tv-animated-*.png`. The harness uses the already available local Playwright installation; no runtime dependencies were added.

These checks verify browser rendering with controlled fixtures. Deployment, live database-backed API operation, sustained 60 FPS, prolonged kiosk operation, physical TV reading distance, and overscan were not measured in this run.

## Control auto-hide follow-up

The toolbar starts hidden and responds to pointer movement/presses, touch taps, wheel activity, and keyboard input. It fades out and hides the cursor after 3.5 idle seconds. Pointer-focused buttons no longer keep it open indefinitely; closing settings starts a fresh countdown. Keyboard-focused controls and an open settings dialog remain available. Touch pointer-leave events from lifting a finger do not dismiss the toolbar immediately.

Headless Edge 156.0.4314.58 passed ten interaction checks at 1080×1920: hidden on initial load; mouse reveal and real idle timeout; settings remaining available while open and hiding after close; fullscreen click followed by auto-hide; keyboard shortcut reveal; keyboard focus preservation; wheel reveal; mouse leaving the viewport; touch tap with idle timeout; and touch settings open/close with auto-hide. No browser JavaScript errors occurred. Touch used browser emulation. The loopback fixture server did not access the application database.

`node --check public/standing-tv.js` and `git diff --check` passed. Local QA artifacts are `.preview/verify-tv-controls.mjs`, `.preview/tv-controls-results.json`, and `.preview/tv-controls-idle.png`.

## Clock typography and status hierarchy follow-up

The clock uses separate hour/minute and seconds spans, with seconds at 55% of the main font size. Status badges now have separate colors and icons: green/live dot, gold/clock, and muted gray/check. The active card has a shallow edge and shadow; completed cards use darker navy and muted text/accent colors. Whole-card opacity remains 1 to preserve watermark/text stacking.

The 15 focused signage checks, JavaScript syntax check, and whitespace check passed again. Edge browser checks confirmed the smaller seconds font, persistent seconds markup after a clock tick, distinct badge palettes/icons, active-only shadow and running border, and darker completed cards across actual timestamp boundaries. Both portrait sizes, both rotations, reduced motion, and 100 continuation-page steps per long-content case passed without detected overflow or JavaScript errors. The controls remained below the clock without overlap or layout shift. Active/upcoming and completed screenshots were visually inspected; the loopback browser fixtures did not access the application database.

## Compact reference watermark follow-up

Retrieved the [Wayang Kreatif reference](https://wayangkreatif.com/kppti/standing-tv.html?room=A) and inspected its pattern: 260×260px tiles with 50px images at (24,24) and (154,154). The TV keeps its existing ten animated images and three classes, using selected positions from that staggered coordinate pattern. Full-HD mark sizes are now 50px, 65px, and 80px instead of the earlier 80–450px configuration. All sizes and positions scale with the portrait unit.

Edge checks confirmed the 4/4/2 distribution, compact widths, and each base position against the reference tile/inset coordinates. Independent animation, constant opacity, reduced motion, both portrait sizes and rotations, status transitions, and long-content pagination passed again without detected overflow or JavaScript errors. The portrait screenshot was visually inspected. Source and browser results remain in the ignored `.preview/reference-standing-tv.html` and `.preview/tv-animation-results.json`; no application database was accessed. `git diff --check` passed.
