23 KiB
P5-14 — scoped responsive CV workflow checkpoint
Starts from ef661983a0660541eac1ccee0f8e7b82493cfc2a on codex/ui-redesign-phase4, after the separately committed and pushed Part A production decision. That assessment validated unchanged source 1095ef1 and remains PRODUCTION NO-GO; actual main remains 27657f31131cd95d42f0e1290853ec9c9b3959a4. No production merge, push, deployment or write occurs in this checkpoint.
CONDITIONAL GO for the implemented P5-09–12 responsive subset. Final local validation passes; human, physical-device and production qualifications below remain unaccepted. Connor explicitly authorizes this local checkpoint independently of release. The current P5-14 scope excludes unimplemented P5-13 review; its full AI-assisted journey remains an outstanding acceptance obligation. This is not unconditional Phase 5 acceptance. P5-15 and B07 have not started.
Reproduced failures and bounded corrections
The initial light/English responsive browser journey failed at 320px: the return-to-editor button's viewport top was −175.375px, while the fixed shell ended at 116px. Its center could not be reached above the shell. This is retained failure evidence, not a screenshot-only inference or an accepted geometry limitation.
The four new hook checks initially returned two passes and two failures. The failing cases were unsupported cross-section item drop changing section order and source dragend bubbling after drop had reset rendered state. Existing successful nested-entry and section-owner cases remain required; correcting the failures must not break them.
An interrupted full browser run also reproduced an inherited P5-11 held-request scroll regression: 80px of retained scroll position was lost. Unmounting the long-document notice while preview readiness was false enlarged the newly bounded canvas, reduced its maximum scroll range and caused the browser to clamp scrollTop. The two existing overflow/long-document notices now reserve their last-good geometry whenever retained HTML and the corresponding overflow/page-count condition exist. While loading or in an error state, visibility: hidden and aria-hidden keep stale warning/page counts out of visual and spoken output. Native page rendering and the inherited scroll assertion remain unchanged. The retained trace proves this failure; the interrupted run supplies no completed full-suite pass.
The next complete run returned 115 passes / 2 failures / 0 skips / 0 retries and exposed a boundary-key problem in both Bokmål journeys. Pressing Ctrl+Home while the named preview was already at its start initiated native outer-page scrolling. The trace records outer scroll 314 → 304 → 233 → 177 → 118 → 0px, before and during the subsequent Ctrl+End. At outer scroll zero, English happened to leave 163.125px of canvas visible; Bokmål's longer context/chrome left only 122.125px, below the declared 160px portrait requirement. The focused region now owns Ctrl+Home/End explicitly through its existing scrollTop; other keys and controls retain their existing behavior. The regression exercises the boundary even when already at the start and asserts outer position stays unchanged. No timing delay, skipped key or relaxed canvas threshold masks the failure. Native trace frames also distinguish the live, fully visible shell from a partially painted PNG captured during the former outer-scroll animation; that observation does not justify an unrelated shell redesign.
Diff review reproduced one further default-drop risk: an inactive foreign item list did not cancel the native drop into an editable title. The strengthened existing hook case failed 3/4 passing before correction. Drop cancellation now occurs before the inactive-owner guard, retaining the original browser-default protection while letting a valid outer section owner receive the event. The native browser journey additionally drops onto a foreign editable title and requires both its value and persisted CV to remain unchanged.
The implementation is confined to three existing application owners:
- AppShell exposes its existing measured header height on the main content owner as
--app-shell-header-height, with the existing mobile/desktop fallback while measurement settles. This one CSS variable supplies the CV frame's fixed-shell boundary; navigation, layout ownership, account, provider and route behavior are unchanged. - CvBuilderEditor adds the measured boundary plus 12px as
--cv-pane-topfor sticky pane placement and focus-scroll clearance. Preview focus first selects the existing pane, then its animation-frame callback scrolls the owning frame to the start only while focus remains inside it. Return-to-editor retains its existing animation-frame focus owner and also scrolls to the start. The preview has a definite100dvh-based height after shell clearance: chrome may scroll within at most 50% of that frame, while the canvas receives the remaining space throughflex: 1 1 0andminHeight: 0. This keeps wrapped status/help chrome from consuming the short landscape canvas. The editor retains a visible thin scrollbar; section navigation and section headers wrap. The frame and portalled add-content dialog reuse Phase 4comfortabledensity for meaningful 44px phone/coarse targets. - useDragReorder records the source gesture in a ref until native
dragend, even after drop resets rendered drag state. Only the active owning list handles and stops entry drop/over events. An inactive nested item list still lets a section gesture reach its actual section owner, while an entry gesture cannot activate another section's list. This preserves native entry and section reorder without adding cross-section movement.
No renderer, template/font engine, document geometry, domain model, API, provider, save/revision/history protocol, dependency, migration or route contract changes. The existing single editor, settings, mobile-pane, undo/save and preview owners remain responsible for state. Final acceptance below must prove the integration corrections; source inspection alone does not close them.
The retained browser repro artifacts also expose fixture issues independently of those application failures. The initial native drag helper's automatic scrolling could reveal a distant target before the source gesture had started; the corrected helper starts the real pointer gesture at the visible source, then reveals its target. A fixture comparison also needed to retain existing hidden sections. Outgoing menu and confirmation-dialog elements can remain mounted during their exit transition, so subsequent hit tests and captures must wait for their removal. These synchronization and fixture corrections require no additional application fix; their eventual passing results belong in the final validation record.
Native browser evidence and preservation mapping
The responsive workflow suite adds four light/dark × English/Bokmål journeys plus one Chromium touch-emulation case. Fixtures use fresh owned users and real local HTTP CV/profile data, repeated source entries and a long native document; outbound browser requests are restricted to loopback. The draft is held in a real PUT while panes and viewport change, then released through the normal save path.
The viewport matrix covers 320, 390, 768, 899, 900, 1024 and 1440px, including tablet portrait/landscape and a short 844×390px landscape viewport. Assertions use actual control-center hit testing against the fixed shell, visible canvas intersection, focused editor/preview return, no document horizontal overflow and meaningful 44px phone/coarse targets. Native pointer entry/section reorder, unsupported cross-section drops, source/sibling preservation, menu Escape focus return and mobile conflict draft download/reviewed reload supplement existing workflows. Screenshots and geometry JSON record the actual state; axe output retains distinct violations and incomplete fields. An incomplete check is not a pass.
Chromium hasTouch plus touchscreen.tap is emulated touch, not native hardware evidence. Entry movement in that case uses the existing named up/down alternative. It does not establish physical gestures, software-keyboard behavior or a mobile screen reader.
The 57-group preservation review, original requirements, preservation impact and per-slice evidence remain authoritative. The following is the affected contract mapping, not an exhaustive coverage percentage:
| PRES contract | Direct evidence or retained regression boundary | Limit retained |
|---|---|---|
| PRES-E07 — shell/navigation | Shared measured header clearance only; existing shell/route/command/drawer regressions remain required | No navigation redesign or universal shell acceptance |
| PRES-E08 — theme/locale/focus/errors | Four theme/locale journeys, keyboard return, Escape focus, center hit tests, screenshots/geometry and axe | Human spoken names/announcements, incomplete checks and broader zoom/reflow remain unaccepted |
| PRES-E09 — private account state | Fresh owner-isolated fixtures; canonical source and sibling snapshots remain unchanged; existing account-switch/session regressions retained | The new journey does not replace account-switch/BFCache or deployed-session proof |
| PRES-C05 — CV actions/library/publication | Existing document actions retained; new menu Escape/return evidence; existing frame/library/public-CV tests rerun | No library redesign or complete action/template/publication cross-product claim |
| PRES-C06 — studio/preview/mobile/save state | Held PUT across pane/viewport transitions, long preview scrolling, focused return, visible canvas and shell clearance | Physical touch, browser zoom and all short-height/wrapped-state combinations remain unqualified |
| PRES-C07 — section/item/custom/override scope | Native entry and section order, foreign-drop rejection, named touch alternative and four passing ownership hook checks; existing source/custom editing tests retained | P5-10-O01 closed for the demonstrated ownership/default-drop cases only; no cross-section entry-move feature or exhaustive override certification |
| PRES-C08 — templates/typography/photo/capabilities | Existing P5-12 controls/capability/lock tests and unchanged native rendering corpus retained | All-template/font/photo/browser combinations and production font availability unverified |
| PRES-C09 — page/layout/date/document settings | Existing A4/Letter/margin/density/date/language/settings-export tests retained through frame correction | No new settings/normalization/renderer behavior; advanced combinations remain finite |
| PRES-C10 — revision/save/undo/history | Held draft, conflict non-overwrite, downloadable local copy and reviewed reload; existing undo/history/revision tests retained | One save/history owner; long offline and unrelated profile/job concurrent-edit debt remain separate |
| PRES-C11 — CV AI review | Existing deterministic AI/privacy/revision protections and isolated Production withholding regressions retained | Deferred / not qualified / not accepted. No model calls, human review or responsive AI-review journey; existing Production 503 cv_ai_unavailable guard preserved |
| PRES-C12 — private/public PDF | Existing native preview/PDF fidelity, settings exports, public-CV ownership and PDF admission regressions retained | No production Linux/font/photo/all-browser or manual-print certification |
| PRES-W05 — application-linked CV/source | Existing job-linked editor/deep-link and attachment/tailoring relationship regressions retained | The new responsive fixture is not job-bound; no new relationship or provider-tailoring acceptance |
| PRES-W07 — drafts/frozen submitted packages | Existing native package/archive/ZIP/binary preservation regression remains required | P2-D01 remains an ordinary passing case, not an expected failure; no fresh production restore or external-send claim |
| PRES-S04 — AI privacy/usage/entitlements | Existing privacy, server entitlement/template-lock and Production withholding regressions retained | No billing/provider changes, additional AI disclosure or qualified AI acceptance |
Canonical Career Profile remains the source; CV edits persist only the current variant's lens. A sibling variant is not mutated. History remains CV settings history rather than a snapshot of Career Profile. Submitted packages and their archived bytes remain frozen even when the live CV later changes. Identified/private/public CV and application routes retain their existing owners and URL contracts.
Final validation — 2026-10-09
All results below follow the final application and fixture corrections. Backend/static checks ran 01:40:07–01:41:03 UTC; the complete browser run ran from 01:42:56 UTC for 1,175.861 seconds. Specialized security checks completed after it. Backend evidence, frontend evidence, all 117 browser cases and HTTP/security evidence distinguish the separate suites. AI and revision subsets are included in the backend total, not additional backend cases.
| Check | Inherited | Final | Difference |
|---|---|---|---|
| Backend | 1,023 | 1,023 | None |
| Frontend | 455 | 459, 82 suites | Four behavioral nested-drag ownership/default-cancellation tests |
| Main browser | 112 | 117 actual passes | Four theme/locale responsive journeys and one Chromium touch-emulation journey |
| Sidecar | 49 | 49 | None |
| Focused AI / revision safety | 108 / 5 | 108 / 5 | Existing backend subsets |
| Real HTTP contracts | 2 | 2 | Production withholding before provider/write; unrelated AI availability retained |
| Rate-limit / ingress / PDF admission / configuration | 9 / 6 / 1 / 3 | 9 / 6 / 1 / 3 | None |
| Original rendering corpus | 16/16; 36 = 36 pages | 16/16; 36 = 36 | None |
| Settings exports | 8/8; 24 = 24 pages | 8/8; 24 = 24 | None |
| TypeScript / e2e TypeScript / lint | Passing | Passing | No warnings from lint |
| Frontend production / API Release / test Release builds | Passing | Passing | API/test builds: zero warnings/errors |
| Secret / whitespace / document checks | Passing | Passing | Rerun for the final staged record |
Main browser and separate HTTP/security reports contain zero failures, skips or retries. P2-D01 is an ordinary passing native package case. No expected-failure annotation, reduced assertion, retry success or interrupted run is counted as a pass. Existing supply-chain helpers, offline evaluation harness and extension checks also pass 3 / 5 / 3; they are separate existing helper suites, not new product/model qualification tests.
The regression-first record preserves the original geometry/drag failures, the 80px inherited scroll failure, editable-drop default failure and intermediate 115-pass/2-failure report. It also records a separate interrupted harness error: omitting the public API URL while rebuilding the test export selected the localhost development fallback rather than the disposable test API. Root rebuilt with NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api; no application edit repaired that invocation error, and the interrupted run has no complete pass count. An initial e2e typecheck invocation named a nonexistent config; the corrected existing e2e/AI config passes. Raw traces/cookies/HTTP context stay ignored; committed failure evidence retains sanitized assertions and hashes.
Rendering, accessibility and performance
Original fidelity results, raw measurements, settings results and renderer hashes retain the unchanged contract: exact page count/content membership, page dimensions within 0.5mm, position within 2mm, typography within 0.5pt and RGB within 1/255. All 16 renderer HTML hashes match the pagination-readiness checkpoint. Build/capture provenance requires fresh measurement inputs and all 24 native HTML/PDF files after the final browser start; previous artifacts cannot qualify the result.
The axe record contains 242 automated scans with zero reported violations, retaining 1,839 incomplete node occurrences across aria-hidden-focus, aria-prohibited-attr, aria-valid-attr-value, color-contrast and th-has-data-cells. These occurrences are not distinct defects or passing checks. The count includes four inherited Job-section scans whose attachment names place axe before the locale suffix; the collector was reconciled with the full reporter rather than omitting those scans. Human screen-reader spoken names/live announcements remain open.
Local layout observations compare the same native corpus with P5-12: median 22.2ms → 20.9ms; eight settings layouts range 16.1–49.8ms. These are single local observations, not proof of improvement, production performance or typing latency. Existing debounce/save owners and iframe lifecycle remain unchanged; no continuous remeasurement loop or extra renderer remount is introduced. Retained scroll checks cover busy/error/retry without losing document position.
Rendered review and responsive evidence
The 33-image manifest, viewport/focus geometry, preview geometry and touch boundary record the actual final application. Review covered 20 new responsive captures across all four theme/language pairs plus selected source, document controls and error frames. No actionable chrome overlap/clipping was found in that finite set. Controls retain measured shell clearance, phone targets and no document horizontal overflow; Bokmål wraps naturally. The final boundary-key captures show the shell fully painted.
| State | Representative evidence |
|---|---|
| Desktop, dark/Bokmål, long document | 1440px preview start |
| Phone, light/English, held editing draft | 320px editor |
| Phone, light/Bokmål, first preview page | 320px preview start |
| Tablet, dark/Bokmål | 768px preview |
| Landscape, dark/Bokmål | 844×390px preview |
| Source versus CV override | Scoped field capture |
| Narrow document controls | Dark/Bokmål settings |
| Error/retry with retained scroll | Error chrome |
At 320px the document's 34% fit width is an overview, with small body text; it is not a reading-usability certificate. Landscape requires canvas/chrome scrolling. Some inherited source captures are cropped component views; end-of-scroll loading/error captures may show blank page tails, so content retention is established by the unchanged frame/content assertions and native oracle, not those pixels alone. Fit scaling remains the existing automatic behavior; no manual zoom/fullscreen mode is added. Physical touch, software keyboards, other browsers, browser zoom, human screen-reader and production font/photo evidence remain separate.
Reproduction
Use the existing backend/static commands from the production assessment and P5-12 reproduction. The changed regression owners are src/use-drag-reorder.test.tsx and e2e/cv-responsive-workflow.spec.ts. From job-tracker-ui, run rtk proxy npm.cmd test -- --runInBand --watch=false, rtk proxy npm.cmd run typecheck, rtk proxy npm.cmd exec tsc -- --project ../.artifacts/p5-13-readiness/e2e-tsconfig.json --noEmit --incremental false and rtk proxy npm.cmd run lint. Build the static browser export with NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api; PLAYWRIGHT_STATIC_EXPORT=true and PLAYWRIGHT_PREBUILT_EXPORT=true then use the existing main config. Run playwright.cv-ai.config.ts separately for the two isolated Production HTTP contracts. Main, rate-limit, ingress and PDF-admission configs share a disposable API port and must run sequentially. The two existing scripts/verify-cv-fidelity.py oracles compare the original and assembled settings measurements without changing tolerances.
Remaining debt and stop boundary
Human screen-reader operation/spoken names/state announcements, native touch hardware/software keyboard/mobile screen reader, 200%/400% browser zoom, forced colours/text spacing, broader pointer/reflow and production Linux/font/photo/other-browser qualification remain unaccepted. P5-13 stays DEFERRED — BLOCKED / NOT QUALIFIED with its frozen corpus/rubric and full return conditions; no qualification, Docker recovery or AI-review UI work occurred.
The measured shell boundary, focus callback and bounded landscape frame qualify only the viewport/state combinations actually exercised by final evidence. Emulated taps and the existing named reorder alternative do not qualify physical touch dragging. The nested ownership correction closes only the demonstrated entry/section gesture cases; a broader drag, browser or assistive-technology claim remains unaccepted.
Carry F04 actual ingress/runtime, current complete backup/restore, configuration/schema/rollback, protected CI/deployed SHA/authenticated acceptance, provider delivery and other recorded operational debt forward unchanged. Dashboard preference-save 500, Board scaling/native touch, deferred followMode compose UI, incomplete accessibility and separately owned calendar/worker/deletion/billing issues are not resolved by CV frame work. P5-10-O01 nested drag ownership is closed only to the final tested scope; physical drag/touch qualification remains separate.
After a passing scoped checkpoint, P5-15 acceptance planning is the recommended next step only. It has not started and no automatic continuation is implied. Full Phase 5 acceptance remains conditional/partial while mandatory retained requirements are unmet. Preserve Connor's requirement to commit and push every individual P5-15 change/checkpoint when that work is authorized; this P5-14 record makes no production release claim.