# FreeCut draft PR #30 exact-head frontend QA

## Status

**FAIL — not shippable at this head.**

The complete exact-head run found four release blockers: timeline clips are not keyboard accessible, independent timeline section scrollbars are not keyboard reachable, the 390px editor clips core controls, and no contiguous rolling-trim handle is exposed at a real adjacent cut. The zero-error observability gate also fails because real-media and export execution emitted product warnings/errors.

## Environment and identity

- Repository: `/Users/lightninglu10/Q5/.worktrees/freecut/pr30-frontend-qa-head`
- Expected and actual HEAD: `925ebf37b01692c4b066407a9ee6a8563fd8028f`
- Source state before and after QA: clean; no source edits, commits, pushes, PR mutations, request interception, mocks, or static preview evidence
- App: real Vite FreeCut app at `http://localhost:5199`, real OPFS/in-memory workspace behavior
- Browser: Playwright 1.60.0, Chromium revision 1223, headless, Node 22.20.0, npm 11.8.0
- Media: generated red/440Hz, blue/880Hz, and moving video with active audio
- Worker: `qa-freecut-v1-pr30`, tab `5a111925-f78e-4551-89dc-23ea0e06c23c`, generation `gen-20260827-qa-pr30-2`
- Evidence: 83 screenshots/videos/MP4 assets and eight traces were privacy-reviewed and durably uploaded; mappings are in `published-artifact-manifest.json`

## Ship-gate result

| Contract | Result | Exact observed evidence |
| --- | --- | --- |
| B1 load | PASS | Real multi-clip OPFS project loaded at 30fps with frame-aligned item data and correct visible active source. `Invalid source position`: 0; stale skim/source overlay: 0; page errors: 0; bad HTTP responses: 0. |
| B2 seek | PASS | Real ruler/empty-lane/clip pointer probes produced one transition to the expected frame. Deferred seeded hover did not roll the playhead back; a fresh hover previewed and then cleared. Timed snapshots, screenshots, video, and trace retained under `seek-focused`. |
| B3 playback | PASS | Contiguous red/440Hz and blue/880Hz A/V clips crossed at frame 61 with sampled transport frames `57,60,62,65,67`; active visible color, video item, audio item, and source identity matched on both sides. EOF samples clamped at 120 without early wrap. |
| B4 cut/ripple/trim | **FAIL** | Real pointer click/drag/isolated trim and Razor plus undo passed; obvious split hotkey and undo/redo passed. Ripple delete removed the red linked A/V cohort, shifted blue from frame 61 to frame 1, and changed history by one command; UI Undo/Redo restored/reapplied it. However, selecting either neighbor at the real contiguous red→blue cut exposed no rolling-trim handle, so adjacency-preserving contiguous trim could not be performed. |
| B5 LOCK49 | PASS | Full existing 49-row live/store matrix passed 49/49, including nested/malformed ancestry, captions, linked selection on/off, async source/freeze drift and cleanup, transitions/keyframes, selection/history/dirty state, and valid nested one-command undo. A legacy optional UI add-on fixture was stale/blank and failed its own extra checks; it was not substituted for or allowed to weaken the completed 49-row matrix. |
| B6 DRAG45 | PASS | Full 45-row real-pointer/store linked-cohort matrix passed 45/45, including conflict solver/new lane, nested/missing/cyclic ancestry, source/implicit/destination/live locks, blockers, exact rollback, ordinary-click release, shared offset, and one-command undo. |
| B7 shortcuts | PASS | Current real UI passed 7/7 shortcut rows: defaults, remaps, deterministic winner/loser conflict, physical/platform aliases, conflict notice, reactive labels, J/K/L source/program ownership, split/keyframe bindings, and native browser/control ownership. Focused tests cover inputs, buttons, dialogs, menus, contenteditable, scrollbars, derived aliases, and source-monitor labels. |
| B8 host shortcuts | PASS | Exact integrated controlled-deferred host tests passed 20/20 for resolve/reject, retry/backoff, A→B replacement, external subscription updates, stale-epoch disposal, latest-desired persistence, and cleanup. These deterministic mounted host/runtime tests are retained with the 233-test focused log. |
| B9 keyboard/a11y | **FAIL** | All 23 visible clip roots lacked `role=button`, accessible names, and `tabIndex=0`; Tab reached 0/23. The locked clip could not be focused. Clip Enter/Space local activation therefore could not be exercised, and both independent overflowing section scrollbars had `tabIndex=-1`. No nested button duplication was observed, but the minimum focus/activation contract fails. |
| B10 export | PASS | Real export produced H.264/AAC MP4 through EOF: video 121 frames at 30fps, 4.033333s; audio 48kHz stereo, 4.117333s; format 4.117333s; monotonic PTS/DTS. Final-second decoded analysis found 27/27 unique frame hashes; final active-second audio mean was -21.1dB. No held/frozen or silent tail. Exact integrated abort/error/cleanup tests passed; they supplement rather than replace the MP4. |
| B11 responsive | **FAIL** | Desktop controls were visible/usable. At 390px the timeline began around x=652 with computed width 0 and core editor/export/keyboard controls were offscreen; the source monitor was hidden. The settings dialog itself fit only when opened programmatically, which does not rescue core editor usability. |
| B12 observability | **FAIL** | Aggregate complete logs: 1,340 console records, 3 errors, 628 warnings, 0 page errors, 5 request-failure records, 0 HTTP >=400, 0 invalid-source-position, 0 stale-skim. Product signals include 11 WaveformCache worker-registration warnings, one VideoFrameExtractor fallback, and one export-worker `WORKER_REQUIRES_MAIN_THREAD:audio-context` error before successful main-thread fallback. Two product-origin aborted module requests were traced to harness navigation lifecycle; they are documented, not hidden. |
| B13 package | PASS | Fresh consumer installed and rendered `@quantfive/freecut-editor-surface@0.3.9`; 2/2 consumer checks passed. Candidate tarball SHA-256 exactly matched committed identity `59012ac92ee7227583c756a5247cc260e7e968d5ab5725e3ca880e13133cb6f1`. |

## Failure evidence

- Keyboard/a11y: [public screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/b6083ccf-9ab3-4879-a25d-6736f29b6802-fixture-accessibility-failure.png)
- 390px editor clipping: [public screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/48a6e052-45a1-4ea9-966f-6aedd4f3d097-responsive-01-mobile-editor.png)
- Missing contiguous trim handle: [public screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/5d722972-c1d3-4d46-aa2c-f2291434bc46-edit-01-rolling-trim-handle-missing.png)
- Complete observability summary: `logs/pr30/observability-summary.json`; raw aggregate logs: `console.jsonl`, `network-failures.jsonl`, `page-errors.jsonl`

## Representative passing evidence

- Boundary before/after: [red/440](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/45f86b93-3b15-4300-a438-61d710dd06e1-boundary-01-red-before.png), [blue/880](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/151ffa9d-c4cd-48a0-9e66-193ee4203dbf-boundary-02-blue-after.png)
- Exported MP4: [moving-audio-export.mp4](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/e854b36b-0ac3-4393-bf34-7a24453f0623-moving-audio-export.mp4)
- Export completion: [screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/59f87bdc-ecdc-4224-b52c-a2c0f4f8eae2-export-04-complete.png)
- LOCK49 completion: [screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/bc00cd14-3847-47ac-9142-8dbf58105d4e-matrix-complete.png)
- DRAG45 telemetry row: [screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/43621477-0627-4793-af70-7bb74fd4daed-45-global-run-safety-telemetry-has-no-hangs-page-errors-or-failed-product-requests.png)
- Shortcut conflict: [screenshot](https://codepress-pr-assets-production.s3.us-west-2.amazonaws.com/codepress/quantfive__codepress/481441c8-0dc7-4d59-932f-80db85d07634-pr28-settings-conflict-dcdc2972.png)
- All visual, video, trace, report, and supporting-artifact URLs: `published-artifact-manifest.json`

## Verification commands and retained outputs

- Exact identity/cleanliness: `git rev-parse HEAD`; `git status --short`
- Dependency/browser bootstrap: Node 22 `npm ci`; `npx playwright install chromium`
- Focused integrated contract tests: repository Vitest selection recorded in `logs/pr30/focused-contract-tests.log` — 15 files, 233/233 tests passed
- Real browser runners and exact outputs: `logs/pr30/*-runner.mjs` and matching `*-run*.log`; these runners used Playwright/CDP against the real app and did not intercept product requests
- Package consumer: `npm run test:editor-surface:consumer -- --artifact .../freecut-editor-surface-0.3.9.tgz`; output in `package/pr30/consumer.log`
- Export analysis: `ffprobe`, decoded final-segment frame hashes, and ffmpeg audio analysis retained under `export/pr30`

## Artifact/privacy and cleanup

All 71 screenshots and 12 videos/MP4 captures were reviewed via six screenshot contact sheets plus representative decoded video frames before upload. They contain synthetic FreeCut projects/media only; the server log's private LAN address was redacted. Eight traces and the supporting bundle were also uploaded durably.

Owned helper tab `5296ed1c-73e6-48ec-b700-ed491e621c07` was deleted from CodePress session `778df11b-ea99-411f-8bee-9955f55408dd`. Port 5199 has no listener, no owned Vite/Playwright/Chromium process remains, the exact HEAD is unchanged, and `git status --short` is empty. No other workflow was touched. See `cleanup-proof.json`.
