Skip to content

Showcase PR-V1: unify the eight-page visual system - #178

Merged
nghqqa merged 1 commit into
mainfrom
feat/mergepilot-showcase-visual-system
Aug 17, 2026
Merged

Showcase PR-V1: unify the eight-page visual system#178
nghqqa merged 1 commit into
mainfrom
feat/mergepilot-showcase-visual-system

Conversation

@nghqqa

@nghqqa nghqqa commented Aug 16, 2026

Copy link
Copy Markdown
Owner

1. Positioning

This is PR-V1 of the MergePilot Portfolio Showcase Sprint: it unifies the existing 8-page visual system and presentation density. It does not add a 9th page, does not expand backend or production scope, does not implement Case A/B/C, and does not implement README, formal screenshots, architecture diagram, or demo script (those are PR-V2 and PR-V3).

2. Visual System Deliverables

  • Restrained operational palette: dark operational surface, 4 levels (bg/panel/raised/inset), 3 border weights, 5 text tones — no marketing hero, no decorative orbs, no illustrations
  • 37 CSS design tokens: surfaces, borders, text, accent, ok/warn/error semantic states (each with dim + border variants), typography scale (6 sizes), geometry (3 radii + 6 spacing steps), motion (transitions + elevation shadows + focus ring), layout dimensions
  • Unified per-page header: eyebrow (section label) → title → description, consistent across all 8 pages via PAGE_META + pageHeader()
  • Shared display components: panel (with accent-bar title), kv cell grid, metric card, skill card, evidence-row (label/value flex), table-wrap (mobile horizontal scroll), status chips (with shape indicator dot)
  • Sticky table headers with row hover (no data semantic change)
  • Status hierarchy: success/warning/error/neutral chips with ::before dot — status never conveyed by color alone
  • Desktop/mobile responsive: sidebar nav (216px) with numbered items 01–08 collapses to horizontal scroll strip at ≤880px; content max-width 1200px; overflow-wrap: anywhere for long values
  • Accessibility static contracts: skip-link, ARIA landmarks (role=status, aria-live, aria-label, aria-labelledby, aria-current=page), :focus-visible (2px accent outline), @media (prefers-reduced-motion: reduce), @media (prefers-contrast: high), arrow-key nav code

3. Eight-Page Scope

Exactly these 8 pages (no 9th):

# Page Eyebrow Responsibility
01 overview Run Summary Run identity, PR, final status, metrics, skill execution
02 timeline Workflow Progress Ordered stages with status/timing
03 findings Code Review Issues with severity/file/message
04 rag Retrieval Advisory Suggestions with adoption/trust annotations
05 trace Observability Span/call chain
06 safety Guardrails Residue, secret scan, rollback events
07 evidence Provenance Bundle integrity, commits, evidence files
08 benchmark Capability Matrix Evaluation coverage and boundaries

All pages still consume one shared live snapshot — no per-page API, no per-page poller.

4. Dynamic Refresh & Safety Invariants (Unchanged)

  • Still only GET /api/live/status and GET /api/live/snapshot
  • Single fetch wrapper (exactly one fetch( in source)
  • Single setInterval (exactly one executable call); clearInterval + pagehide/beforeunload cleanup preserved
  • Refresh now does not create a second timer
  • REPLAY 404 (engine never starts), STALE (stops timer), placeholder (no baked data), fail-closed semantics all preserved
  • All dynamic values continue through the existing 5-character esc() escaping contract before entering innerHTML
  • Zero secret, DSN, or password in page source
  • No backend/API/compose/network/M8 changes (protected paths diff = 0)
  • serve.py verify_js_contract passes on the updated JS

5. Tests

Suite Result
test_dynamic_refresh 81 passed (59 + 22 new)
demo_console 421 passed / 6 skipped
isolated_live 691 passed / 7 skipped
verification 23 passed
Total 1135 passed / 13 skipped / 0 failed

22 new structure/contract tests (TestShowcaseDesignSystem): CSS token set, page header structure, skip-link, ARIA landmarks, table-wrap, single timer, page order, no 9th page, keyboard code presence, focus-visible, reduced-motion, high-contrast, evidence-row component, no extra fetch, no localStorage. Zero new skip, zero test removed.

6. Real Browser Verification (Existing Evidence)

  • Real 5-service stack (PostgreSQL/gateway/controller/demo-console/console-edge): all healthy
  • PREFLIGHT_OK 10/10
  • API via console-edge returned 200
  • Desktop 1440×900: 8/8 pages — active page/nav unique and correct, eyebrow/title/desc present, content blocks > 0, placeholder = 0, banner = OK, run_id exact match, zero page-level horizontal overflow
  • Mobile 390×844: 8/8 pages — same criteria plus Refresh now visible and clickable
  • Refresh now succeeded; request frequency side-evidence (server poll count deltas in equal 12s windows: Δ5 before = Δ5 after, no doubling) confirmed no second timer
  • Edge/demo-console logs: zero traceback/secrets; favicon.ico → 404 is expected edge whitelist rejection
  • Cleanup completed (containers/networks/materials removed, 8600 CLOSED, WSL restored)
  • Screenshots were temporary local verification materials only — formal screenshots belong to PR-V3

7. Residual Validation (Honest Disclosure)

These were NOT independently browser-automated due to in-app browser tool limitations:

  • Keyboard navigation implementation is statically contract-tested but was not independently browser-automated because the in-app browser could not reliably deliver focus/keyboard events
  • Reduced-motion CSS is contract-tested but was not independently browser-emulated
  • Direct browser console/pageerror listener was unavailable in the in-app browser

These are non-blocking for the mouse/touch-focused Portfolio Showcase scope. This PR does not claim WCAG compliance or complete accessibility certification.

8. Next Scope

  • PR-V2: Case A/B/C deterministic showcase seed and interactions
  • PR-V3: README productization, formal screenshots, architecture diagram, 3–5 minute demo script
  • M8-A2 is paused and was not modified

9. Truth Boundaries (Unchanged)

Showcase data is not external customer data. No real users or production deployment claimed.

  • application_integration_verified=false
  • database_verified=false
  • production_verified=false
  • M8-A1 is not revision producer integration
  • No new verified fields
  • No evidence/ or verification/ written

…-V1)

Portfolio Showcase Sprint PR-V1: upgrade the existing Phase 1-F visual
system to a professional, portfolio-grade operational design system.
Zero backend/API/contract changes; pure presentation improvement.

index.html — MergePilot Operational Design System:
- Expanded CSS token set: 30+ custom properties covering surfaces
  (4 levels), borders (3 weights), text (5 tones), accent, 4 semantic
  states (ok/warn/err with dim+border variants), typography scale
  (6 sizes), geometry (3 radii + 6 spacing steps), motion (transition
  timing + elevation shadows + focus ring shadow), and layout
  dimensions (sidebar width, content max, topbar height).
- Skip-to-content link for screen-reader/keyboard users.
- :focus-visible styles on all interactive elements (2px accent
  outline, offset variants for nav vs. content).
- @media (prefers-reduced-motion: reduce): all animations and
  transitions reduced to 0.01ms, spinner disabled.
- @media (prefers-contrast: high): elevated border and text tokens.
- Brand identity: icon block + wordmark + mode banner.
- Sidebar nav: numbered items (01-08), Console label, active state
  with accent border, arrow-key roving tabindex navigation.
- Per-page header scaffold emitted by JS (pageHeader() helper):
  eyebrow (section label), title, description — consistent across
  all 8 pages.
- Panel titles with accent bar indicator (::before pseudo-element).
- Status chips now carry a shape indicator (::before dot) — status
  is never conveyed by color alone.
- Tables: sticky headers, row hover, severity row tints, separated
  borders replaced with bottom-borders only, scoped column headers
  (scope=col via tableWrap helper).
- .table-wrap: overflow-x auto container for mobile scroll.
- Evidence rows: label/value flex layout for provenance data.
- Empty states: .empty-note with dot indicator (not just text).
- Loading placeholder: animated spinner with reduced-motion fallback.
- Mobile (max-width 880px): horizontal scroll nav strip (no scrollbar
  visible), table-wrap extends full-bleed, metrics tighten, title
  scales down, content padding reduces.

live-refresh.js — renderer enhancement (all engine invariants preserved):
- New PAGE_META map: per-page eyebrow/title/description for all 8 pages.
- pageHeader(page) helper: consistent .page-head scaffold (eyebrow +
  h2.title + p.desc) — every renderer now calls it first.
- tableWrap(headers, rows) helper: wraps tables in .table-wrap for
  mobile scroll; adds scope=col thead.
- panel(title, body) helper: panel with optional .panel-title header.
- evidenceRow(label, value) helper: provenance key-value row.
- Banner: restructured with aria-hidden separators, cleaner labels.
- All existing engine invariants verified by verify_js_contract:
  single fetch wrapper, single setInterval + clearInterval, pagehide/
  beforeunload cleanup, MIN_INTERVAL_MS=2000, PAGES order unchanged,
  5-character esc() on every dynamic value.

test_dynamic_refresh.py — 22 new showcase tests (TestShowcaseDesignSystem):
- CSS token set existence (30+ tokens)
- 8-page header structure (eyebrow/title/desc) via JS PAGE_META
- focus-visible, skip-link, reduced-motion, high-contrast, ARIA
  landmarks, aria-current page management
- Table wrapper for mobile scroll, sticky headers
- Status chip shape indicator (not color-only)
- No extra fetch calls, no localStorage/sessionStorage/reload
- Single timer contract (exactly one executable setInterval)
- Pages order unchanged (exact array match)
- Keyboard arrow navigation presence
- Panel title accent bar, evidence row component, metric hover
- No ninth page (exactly 8 sections)

Regression: 1135 passed / 13 skipped (baseline 1113/13; +22).
Browser-verified: desktop 1440×900 (8 pages, header structure,
content blocks, zero placeholder, zero overflow) and mobile 390×844
(overview active, zero overflow). Screenshots captured locally for
verification only (not committed — formal screenshots are PR-V3).

NOT implemented in PR-V1: Case A/B/C showcase data, README changes,
committed screenshots, architecture diagram, demo script — these are
PR-V2 and PR-V3 scope. No backend/API/container/network changes.
@nghqqa
nghqqa merged commit 381241f into main Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant