# Task 5 Report: Fixture Coverage, Documentation, And Regression Tests ## Result Completed the fixture regression coverage and operational UX documentation. The fixture retains its explicit non-production command gate and the default 100-Agent/500-event/100-job shape. Its deterministic blocker count is now 51: 50 distinct open tenant/product pairs, including two open blocker rows for the same first product. Safe-blocked snapshot counts match the fixture's open product pairs. Failed jobs have duration timestamps, and linked events point to their job and, where present, the correct blocker/product and installation. ## TDD evidence 1. Added assertions for the additional same-product blocker, unique fingerprints, exact UUID5 installation identities, ownership, failed-job durations, and job/blocker/product event links. The first focused run was RED as expected: fixture returned 50 blockers while the requirement expected 51. 2. After implementing the blocker/job/event fixtures, added an assertion that each snapshot's `safe_blocked` value matched its open product pairs. The focused run was RED as expected because the old sample formula reported blocked products for installations without an open blocker. 3. Updated the deterministic snapshot values to match the generated open product pairs. The focused test then passed. ## Verification commands - RED: `python -m pytest central/tests/test_control_panel_fixture.py -q` — failed on the expected blocker count gap (`50 != 51`). - RED: `python -m pytest central/tests/test_control_panel_fixture.py -q` — failed on the expected safe-blocked snapshot mismatch (`1 != 0`). - GREEN: `python -m pytest central/tests/test_control_panel_fixture.py -q` — passed (`1 passed`). - Full central suite: `python -m pytest central/tests -q` — passed (`275 passed`). Pytest emitted its existing `pytest-asyncio` fixture-loop deprecation warning and one existing `openpyxl` print-area warning. - `git diff --cached --check` — passed with no whitespace errors. ## Documentation review Updated `docs/CONTROL_PANEL_V1.md` to link to the new operational UX contract and distinguish the installation-wide confirmation step from the validated blocker context workflow. Added `docs/CONTROL_PANEL_OPERATIONAL_UX_V1.md` covering the health invariant, technical/fiscal distinction, blocker/product counts, dashboard attention and empty states, identity-first views, timestamp and timezone presentation, blocker filters and summaries, operational-only priority tiers, safe resolution/auth/CSRF/audit fields, reprocess confirmation, password policy, performance limits, responsiveness, fixture command, and write/deployment boundaries. ## Commit - Implementation and product documentation: `4ba0fa8` (`test: complete control panel fixture UX coverage`) ## Concerns - Resolved in the timestamp tooltip follow-up below: templates now use raw ISO UTC timestamps in `title` and retain localized human-readable visible text. - Full central tests retain the two pre-existing dependency warnings described above; they did not fail the suite. ## Timestamp tooltip follow-up Resolved the full technical timestamp concern: agent, job, blocker, and populated dashboard failure timestamps now keep their localized human-readable text visible and expose the complete ISO UTC timestamp (including seconds and `+00:00`) in the `title` attribute. Blocker detail includes first- and last-seen timestamps. The existing raw ISO serializer now explicitly normalizes naive SQLite timestamps as UTC, matching the presentation layer's existing interpretation without changing the view-model shape. ### TDD and verification - RED: `python -m pytest central/tests/test_control_panel_pages.py -q -k "localized_last_seen or localized_created or localized_seen_times or bounded_failed_job_rows"` — 4 expected failures because the tooltips did not contain the required raw ISO values. - GREEN: `python -m pytest central/tests/test_control_panel_pages.py -q` — passed (`12 passed`). - Full suite: `python -m pytest central/tests -q` — passed (`278 passed`, one existing `openpyxl` warning; pytest-asyncio also emits its existing fixture-loop deprecation warning). - `git diff --check` — passed. - Commit message: `fix: show technical timestamps in tooltips`.