diff --git a/docs/redesign/phase-5/p5-15/p5-15-02/AXE_TRIAGE.md b/docs/redesign/phase-5/p5-15/p5-15-02/AXE_TRIAGE.md new file mode 100644 index 0000000..e017af3 --- /dev/null +++ b/docs/redesign/phase-5/p5-15/p5-15-02/AXE_TRIAGE.md @@ -0,0 +1,25 @@ +# P5-15-02 — Inherited axe triage + +Source checkpoint `cf847e9b256d9aec733abf3f37c42852c9dd2421`. The [raw-derived baseline inventory](evidence/axe-baseline-triage.json) independently reconciles **267 result attachments / zero violations / 2,041 incomplete node occurrences** from the final R-03 ordinary run. This is fresh parsing of inherited execution, not a new browser run. The approximate 2,040 in the request is superseded by the actual 2,041 count. + +One occurrence is one `incomplete[].nodes[]` entry. Repeated states, languages, themes, generated IDs and CSS classes remain counted. Exact-node hashes and normalized grouping are provided to reduce duplicated investigation; neither is a count of distinct defects. The five rules have 5/38/4/304/2 normalized groups respectively. Full scan ledger, messages, representative targets, HTML excerpts and hashes are retained in the JSON. Attachments without result JSON are excluded; 267 is not every axe invocation in the application. + +| Priority / rule | Occurrences | Underlying evidence and representative component | Required verification / status | +|---|---:|---|---| +| High: `aria-hidden-focus` | 41 | Five normalized groups; retained MUI modal drawer and modal focus scopes. Every message asks whether descendants are tabbable in the current state. | Traverse real Tab/Shift+Tab with drawer open/closed; inspect active modal/hidden background and Escape return, then human screen reader. **PARTIAL; potentially serious if hidden content receives focus.** A retained hidden node alone is not a failure. | +| High: `aria-valid-attr-value` | 18 | Four groups in named-controls/modal fixtures. Generated `aria-labelledby` IDs are missing on Quick Search and other MUI Dialog papers, even when an explicit `aria-label` exists. | Inspect settled DOM/AX name; match dialog title reference or explicit name, then test spoken name with operator. **PARTIAL; unresolved semantic reference candidate**, not automatically an unnamed dialog. | +| Medium: `aria-prohibited-attr` | 209 | 204 generic spans and five generic divs; 38 groups. Includes CV/status labels, Board states and the admin version badge (`div` with `aria-label`, no supported naming role). | Determine whether essential state is independently conveyed as readable text/control semantics; operator review. **PARTIAL; unsupported ARIA use requires scope-specific correction if it carries essential meaning.** No global removal or automatic violation inference. | +| Medium: `th-has-data-cells` | 4 | Two groups in Jobs Table empty/missing action-data cells, both languages. Message: table data cells missing or empty. | Inspect populated and empty table header associations, row action names and nonvisual table navigation. **PARTIAL; empty/action-column structure and tool limitation must be distinguished.** | +| Medium: `color-contrast` | 1,769 | 1,383 overlapped background +193 partially obscured +4 partial overlap +189 too-short-text checks; 304 groups. Includes badges, sticky/pane intersections and dialog states. | Human rendered-pair review and measured foreground/background in the actual unobscured state. Separate real obstructed controls from intentional off-screen/hidden/transitional content. **PARTIAL; incomplete contrast is neither passing nor demonstrated low contrast.** | + +No category is closed solely from zero violations. Real low contrast, focus traps, inaccessible states or missing names found by the fresh audit belong in its defect register. Remaining incompletes require the [operator programme](MANUAL_ACCEPTANCE.md), including speech rather than an accessibility snapshot. Representative messages may come from third-party MUI/axe behavior; that does not exempt the product from acceptance. + +## Acceptance standard and supplemental coverage + +The [Phase 3 accessibility plan](../../../phase-3/ACCESSIBILITY_PLAN.md) requires ordinary text 4.5:1, large text 3:1, essential controls/focus 3:1, usable 320 CSS-px ordinary content and a 44px touch-target aim. [Phase 4 acceptance](../../../phase-4/p4-06/README.md) and original PRES contracts remain binding. WCAG 2.2 AA obligations are not weakened: the 2.5.8 minimum/spacing exceptions and project 44px aim are distinct. + +Installed axe-core **4.13.0** metadata maps the inherited rules to 1.4.3/4.1.2/1.3.1. Earlier fixture tags principally select WCAG 2.0/2.1 A/AA. `target-size` is **disabled by default**; a zero earlier result does not qualify 2.2 target size. Fresh supplemental audit explicitly selects `wcag22aa` and enables that rule. Supplemental scan totals are recorded separately from the inherited 267. No rules are disabled and no failed control is hidden to improve results. Local standards and installed metadata were inspected; external websites were not queried. + +## Human/device availability boundary + +The read-only local probe found Narrator installed, no active screen-reader process and no detected physical test device; that is availability information, not testing. The owner subsequently reported a screen-reader operator available. An operator packet was issued; **actual observed spoken results remain NOT VERIFIED until supplied**. Installed software and operator availability cannot substitute for a completed workflow record. Physical touch, software keyboard, mobile screen reader, other browser/device combinations and production fonts remain open. diff --git a/docs/redesign/phase-5/p5-15/p5-15-02/MANUAL_ACCEPTANCE.md b/docs/redesign/phase-5/p5-15/p5-15-02/MANUAL_ACCEPTANCE.md new file mode 100644 index 0000000..57fb730 --- /dev/null +++ b/docs/redesign/phase-5/p5-15/p5-15-02/MANUAL_ACCEPTANCE.md @@ -0,0 +1,180 @@ +# P5-15-02 — Human, assistive-technology and physical-device acceptance + +This is an executable operator packet for the responsive/accessibility audit. **All human, screen-reader and physical-device results in this packet are NOT VERIFIED.** No operator, spoken transcript, real-device interaction or manual approval is invented. The checkpoint's separate automated evidence may verify particular browser interactions; it cannot fill the human/device result fields below. Production remains **NO-GO**. P5-13 remains deferred, unqualified and Production-withheld; this packet authorizes neither provider qualification nor its review UI. + +This packet retains the thirteen M01–M13 areas from the [P5-15 planning script](../MANUAL_ACCEPTANCE.md), makes the current controls/routes explicit, and adds repeatable result forms. Binding sources are [Phase 3 accessibility](../../../phase-3/ACCESSIBILITY_PLAN.md), [responsive strategy](../../../phase-3/RESPONSIVE_STRATEGY.md), [P4-06 acceptance and evidence limits](../../../phase-4/p4-06/README.md), the [57 original groups and current preservation matrix](../PRESERVATION_ACCEPTANCE.md), [P5-14 responsive evidence](../../p5-14/README.md), and [R-03 functional reconciliation](../p5-15-01/analytics-auth-repair/README.md). Historical P4 package expected failures are historical: **P2-D01 is now an ordinary passing case**. No original requirement is rewritten by this manual packet. + +## Evidence lanes and prerequisites + +Use only an authorized disposable local/sandbox build and synthetic fixtures: accounts A/B, admin/non-admin, available/locked capabilities, empty/populated Jobs, long EN/NB titles, custom statuses, persisted saved searches, Rules drafts, source-backed/overridden/hidden/CV-only entries, a short CV, a multipage CV, attachments and an existing immutable submitted package. Obtain the run SHA from the actual build, not a guessed checkpoint. Do not publish personal data, send provider mail, make billing changes or mutate production. + +| Lane | Required operator/equipment | Evidence that can close this lane | Initial result | +|---|---|---|---| +| H-K | Human keyboard operator; supported desktop browser | Actual task completion, focus/scroll observations and dated recording | NOT VERIFIED | +| H-SR | Human using installed NVDA or Narrator; record exact OS/browser/AT versions and browse/focus mode | Exact spoken names/states/errors, reading order and successful task traversal | NOT VERIFIED | +| H-Z | Human using actual browser zoom and text spacing, at recorded outer-window size | Full task completion at 200%/400%, visible controls/focus and measured viewport | NOT VERIFIED | +| H-C | Human visual/contrast review, actual forced-colors and reduced-motion settings | Settled rendered ratios, non-color meanings, focus and contextual incomplete dispositions | NOT VERIFIED | +| H-T | Physical phone/tablet, actual browser, real touch and software keyboard | Device video/observations of keyboard occlusion, orientation, touch and fallback actions | NOT VERIFIED | +| H-MSR | Physical mobile device with VoiceOver or TalkBack operated by a human | Exact spoken/gesture observations and successful primary tasks | NOT VERIFIED | +| A | Automated browser/keyboard/pointer/geometry/axe or actual browser-engine zoom | Only its precise assertions and retained raw evidence | Reported separately; never entered as a human result | + +Actual Chromium browser-engine zoom can be tested automatically using a browser zoom facility. That is stronger evidence than merely shrinking a Playwright viewport, but remains **automated**, not human task/assistive-technology acceptance, and does not qualify other browsers/devices. Record `innerWidth`, `innerHeight`, outer dimensions, device-pixel ratio, zoom level and visual viewport scale for each actual zoom run. Do not retroactively rewrite earlier records that correctly left their unexecuted zoom checks open. + +Unavailable operators/devices stay NOT VERIFIED with an access dependency and owner. A code/AX-tree review is not a spoken screen-reader test. An emulated touchscreen does not qualify H-T or H-MSR. A screenshot cannot establish a software keyboard's occlusion, gesture reliability, focus return or status speech. + +## Coverage dimensions and acceptance targets + +Run EN and Bokmål in light and dark. Keep a row for every executed variant; a representative subset is not the full cross-product. Start with 1440×900 desktop, 768×1024 portrait tablet, 1024×768 landscape tablet, 390×844 phone and 320 CSS-pixel reflow. Add 430, 1280 and 1920 widths when the layout changes; use 844×390 landscape for long dialogs and CV panes. Record actual usable height after browser chrome/keyboard. + +Current application tokens are `xs=0`, `sm=768`, `md=1024`, `lg=1266`, `xl=1440` in [theme.ts](../../../../../job-tracker-ui/src/theme.ts). [AppShell](../../../../../job-tracker-ui/src/layout/AppShell.tsx) uses `down("md")`, so its present drawer boundary is **1024**, not the historical Phase 3 shell description of 768. [CV editor](../../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx) has compact Edit/Preview modes below **900** and grid/sticky changes at **1024**. Test 767/768, 899/900 and 1023/1024 independently; between 900 and 1023 both CV panes may stack. Resizing must preserve resource identity, dirty drafts, save ownership and focused-pane accessibility. + +Apply the project's WCAG 2.2 AA acceptance target to the actual interaction, without claiming certification from this packet: + +- **2.5.8 Target Size (Minimum):** 24×24 CSS pixels, or the criterion's spacing exception. Undersized targets satisfy spacing only when 24-pixel circles centered on them do not intersect another target or another such circle. Equivalent control, inline, user-agent-controlled and essential exceptions require a written, criterion-specific justification. **44×44 is the Phase 3 touch aim / 2.5.5 enhanced target, not the AA minimum.** Measure the interactive hit area, not only the visible icon. Coarse-pointer usability remains a physical-device check. +- **1.4.10 Reflow:** ordinary content/actions must work without loss at 320 CSS-pixel width or 256 CSS-pixel height in the respective scrolling orientation. A necessary two-dimensional table/Board/document canvas can have an appropriate bounded scroll exception; labels, menus, filters, Save/Cancel and surrounding ordinary content do not inherit a blanket exception. Record why both dimensions are necessary. Do not hide overflow globally to manufacture a pass. +- **1.4.4 / 1.4.12:** actual 200% resize and increased text spacing must not lose content/function. Test line height 1.5× font size, paragraph spacing 2×, letter spacing 0.12× and word spacing 0.16×; remove the temporary user stylesheet afterwards. CV print geometry is independently protected; review application chrome separately from renderer-owned pages. +- **2.4.7 / 2.4.11:** keyboard focus is visible and not entirely obscured by authored sticky headers, footers or overlays. Also retain the project's stronger fully usable/focus-visible expectation. A software keyboard requires the separate real-device lane. +- **2.1.1 / 2.1.2 / 2.5.7:** complete tasks using keyboard and a non-drag single-pointer alternative where required; distinguish keyboard alternatives from physical drag qualification. Tab widgets need deliberate arrow/activation behavior; links and section selectors must not be given unrelated tab expectations. +- **1.4.3 / 1.4.11:** settled ordinary text ≥4.5:1, large text ≥3:1 and essential non-text controls/state ≥3:1 against adjacent colors; document any genuine exceptions. The Phase 3 focus contrast target is also ≥3:1. Color alone must not communicate status, inclusion, selected state, errors or differences. +- **1.3.1 / 3.3.1 / 3.3.2 / 4.1.2 / 4.1.3:** meaningful structure, names, labels/help/errors and perceivable status messages. Verify actual speech, not only attributes. The proposed error-summary/first-invalid-focus target must be checked against each current form; missing implementation is a gap to assess, not proof that original behavior existed. + +These are project acceptance criteria and recording instructions, not a legal/conformance attestation. No new standards lookup or external inspection is claimed in this checkpoint. + +## Per-step operator record + +Duplicate this record for **every step × variant × lane**. Never replace the observed field with expected text or an automated assertion. + +| Field | Initial entry | +|---|---| +| Run ID / script.step / PRES / related finding | NOT VERIFIED — enter before execution | +| Commit/build SHA / run date/time / operator and reviewer | NOT VERIFIED — actual identifiers only | +| Route plus query/hash / fixture ID / account role | NOT VERIFIED — synthetic owner labels only | +| OS/device model / physical or emulated input | NOT VERIFIED | +| Browser version / AT name/version / browse or focus mode | NOT VERIFIED | +| Theme / UI locale / document locale | NOT VERIFIED | +| Outer window / CSS viewport / zoom / DPR / orientation / keyboard | NOT VERIFIED | +| Exact action / expected outcome | Copy the specific step and expectation below | +| Observed UI outcome / exact spoken words / focus before→after | NOT VERIFIED — no observations supplied | +| Sanitized evidence path / screenshot/video/transcript / measured values | NOT VERIFIED | +| Result / defect ID / owner / required retest | NOT VERIFIED | + +Results may become PASS/FAIL only for the precisely executed step/lane. Preserve first failures and intermittent observations alongside retests. Do not close a human lane when its operator is absent. Never retain cookies/tokens, real CVs or unnecessary personal content in committed evidence. + +## M01 — Shell, account menus and route continuity + +**Routes/components:** protected shell and `/dashboard`, `/jobs`, `/analytics`, `/career`, `/settings`; [AppShell](../../../../../job-tracker-ui/src/layout/AppShell.tsx), [App](../../../../../job-tracker-ui/src/App.tsx), [LoginPage](../../../../../job-tracker-ui/src/views/LoginPage.tsx). **PRES:** E02–E09. **Lanes:** H-K/H-SR/H-Z/H-T. **Observed/version/device/result:** NOT VERIFIED. + +1. With SR running, open an owned loaded route; navigate landmarks/headings, use Skip to content, and hear one meaningful main plus route heading. Use expanded navigation and current-page state, then the collapsed rail. Expected: understandable route grouping and names, no duplicate active navigation or unreachable feature. +2. Collapse desktop navigation, reload, narrow below 1024, open drawer with keyboard and traverse every item including the first/last. Close with Escape and reopen; rotate/resize while open. Expected: labels remain available, focused items sit below the header, modal isolation is deliberate, Escape returns to a visible trigger and no hidden control retains focus. +3. Operate account, theme and language menus; hear current/checked values and disabled explanations, close and check trigger return. Include long synthetic admin build/version text in Bokmål. Expected: names remain meaningful after wrapping; language does not rely on icon/color alone. Record any untranslated badge name separately. +4. Follow `/analytics?months=6#report`, authenticate in the approved synthetic flow and use refresh/Back/Forward. Expected: the supported six-month query survives; unknown fragments do not invent report state; no loop. Test account A→logout→B: previous private shell/query results must not reappear. Real provider consent remains a separately authorized lane. + +## M02 — Commands, notifications and operation destinations + +**Routes/components:** global command dialog, notification popover, `/operations`; [QuickCommandDialog](../../../../../job-tracker-ui/src/components/QuickCommandDialog.tsx), [NotificationsPopover](../../../../../job-tracker-ui/src/components/NotificationsPopover.tsx). **PRES:** E07/E08/E09/W11/W12. **Lanes:** H-K/H-SR/H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Open visible search and Ctrl/Cmd+K; hear dialog/search names. Type a Norwegian query; use arrows/Home/End/Enter, then Tab/Shift+Tab and Escape. Expected: grouped results, selected result and count are understandable; one activation; visible selection/focus; return to trigger; no composing-IME activation. +2. Exercise populated, empty, loading and a locally forced failed-search response. Expected: loading/result count/error are announced at useful times, durable Retry is reachable, no repeated speech per keystroke or stale result from an earlier query. Inspect the exact generated dialog ID relationships, not just its visible title. +3. Open notifications, read unread state/title/date, use Open/Mark read/Dismiss/View all. Expected: each action's purpose is spoken, Mark read does not complete the task, Dismiss does not delete a Job and `/operations` remains reachable. Test long list keyboard scroll/Escape, failure/retry and delayed result during account change without provider calls. + +## M03 — Jobs Table/cards, Board, saved searches and Trash + +**Routes/components:** `/jobs`, `/jobs?view=board`, legacy `/kanban`, `/trash`; [JobTable](../../../../../job-tracker-ui/src/components/JobTable.tsx), [KanbanBoard](../../../../../job-tracker-ui/src/components/KanbanBoard.tsx). **PRES:** J02/J05/J06/J07/W01. **Lanes:** H-K/H-SR/H-Z/H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Use populated table in both densities: read headers, sort state, checkboxes, role/company/status/dates and row actions. Sort/page/filter; selection must not open the row. At phone use equivalent cards with long/custom status labels. Expected: every original action is keyboard-reachable, exact status remains textual and information survives reflow. +2. Create/apply a synthetic saved search, navigate away/reload and switch Table/Board. Force a local saved-search load failure and Retry. Expected: persistence/query result membership retained, failure distinct from zero records, no stack trace, current Jobs workspace remains usable. Do not claim scheduler delivery from this UI flow. +3. Open a job and return using explicit Back and browser Back. Expected: meaningful prior query and visible originating row/card focus. Test loaded/empty/no-result/error states, invalid/busy actions and safe Trash restore; no hidden destructive action or false success. +4. Board: hear all standard/custom/empty column names; use pick-up/drop/cancel and exact-status menu without pointer drag. Verify changed status/readback and moved-card focus. Then separately try actual touch/pointer drag and cancellation on authorized disposable data. Expected: alternatives succeed without mandatory dragging and targets remain reachable across horizontal column scroll. Large-result scaling and physical drag stay open if not executed. + +## M04 — Dashboard and Analytics exact values + +**Routes/components:** `/dashboard`, `/analytics?months=6`; [DashboardView](../../../../../job-tracker-ui/src/components/DashboardView.tsx), [AnalyticsPage](../../../../../job-tracker-ui/src/views/AnalyticsPage.tsx). **PRES:** S01/S02/J09. **Lanes:** H-K/H-SR/H-Z/H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Read populated, sparse, empty and custom-status fixtures. Open every chart's exact-values disclosure/table, use headings and table reading, and compare one representative status/trend/salary value with the supplied fixture. Expected: period/population and units are understandable without hover/color; a missing denominator is not a misleading zero. +2. Select the actual supported Analytics period (6/12/24 months), refresh and use history; open supported Jobs drill-down. Expected: report caption/values/query agree and destination can represent its stated membership. No invented filter or metric is expected. +3. Toggle each of the five existing owner-local Dashboard visibility flags, reload and switch A/B/A. Inspect independent report loading/error/Retry. Expected: preferences distinguish local visibility from server persistence, available sections survive one source failure, API failure is not empty-success. Record a reproduced preference-save 500 as a failure; do not assume historic debt closed. + +## M05 — Job sections, drafts, packages and attachment menus + +**Routes/components:** `/jobs/:id?section=documents`, `?section=application&sub=letter`, Timeline/Correspondence; [ApplicationWorkspacePage](../../../../../job-tracker-ui/src/views/ApplicationWorkspacePage.tsx). **PRES:** W01–W12/M01/M02. **Lanes:** H-K/H-SR/H-Z/H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Traverse Overview, Match, Application, Documents, Timeline, Notes & tasks and Interview. Use actual primary/secondary Tabs with arrows and explicit activation; visit CV/Letter/Answers/Submission and Activity/Correspondence. Directly refresh a deeper URL, Back/Forward and a legacy alias. Expected: selected/tab-panel relationships and route state agree; focused tab remains visible; direct-load panel has a meaningful name; all sections are reachable on phone. +2. Read status/progress/next task; keyboard-scroll progress. Edit a long Letter/Answers draft, switch/resize and attempt leaving. Expected: draft/dirty confirmation retained; Stay/Cancel/Discard are distinct, errors actionable; no automatic backend save invented. `followMode` metadata survives but compose UI is deferred, not an expected implemented workflow. +3. Reorder/check/complete a checklist using named alternatives; inspect Notes and calendar entry points without provider writes. Expected: task/reminder/calendar meaning remains distinct, moved-item focus/order understandable and busy/error state accurate. +4. Upload/rename/change purpose/delete a disposable attachment using prompt/confirmation. Test Shift+Tab to Delete, nested modal isolation, Escape and trigger return. Read an existing frozen package after current CV/profile changes. Expected: submitted snapshot remains read-only/historically identifiable, content/filenames preserved; no new native preservation claim from a visual review. Native ZIP proof remains separate. + +## M06 — Implemented CV workflow, scope and preview + +**Routes/components:** `/career/builder`, `/career/builder/:id`; [CvBuilderEditor](../../../../../job-tracker-ui/src/views/CvBuilderEditor.tsx), [CvCustomizeTab](../../../../../job-tracker-ui/src/components/cv/CvCustomizeTab.tsx). **PRES:** C05–C10/C12. **Lanes:** H-K/H-SR/H-Z/H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Hear CV identity, editing-region name, studio Tabs and source/override/hidden states. Use section selector with **keyboard** and pointer; expected: chosen section expands/focuses correctly and current inclusion/order is understandable. Edit source-backed, customized and CV-only entries; reset to source where supported. Canonical Career Profile/sibling CV must not change from a CV-scoped edit. +2. Add/remove a disposable entry/custom section; keyboard move earlier/later and inspect first/last disabled reasons. Expected: successful action has meaningful retained/returned focus, exclusion uses text/state instead of dimming, selected order matches preview/persistence. Physical drag/cancel is an additional independent lane. +3. Hold a local save and switch Edit↔Preview; traverse 899/900 and 1023/1024, then landscape. Enter named preview; PageDown/Home/End/Ctrl+Home/End at middle and boundaries; Tab out and use Return to editing. Expected: pane visibility/scroll/focus preserved, no outer-scroll trap, return control reachable beneath header, unsaved changes intact. Between 900–1023 inspect stacked-pane access rather than assuming desktop split view. +4. Read preview loading/error/Retry and last-good content; page count comes from settled rendering, not a stale completed announcement. Verify first/middle/last page and long-CV reading; at 320px automatic fit is an overview, not proof of legible text. Operate existing zoom/fit behavior only; do not invent unsupported zoom controls. +5. Use Template/Customize/History and document overflow actions; hear selected template/value/reset scope and current historical version. Undo/Redo, failed-save retry and stale-version conflict must preserve the draft and normal save owner. Expected: error/conflict/download local copy/reload choices are distinguishable from reset-to-source/history restore. Retain the separately recorded intermittent CV Unsaved assertion; a manual pass does not diagnose it. +6. Export a synthetic PDF, read selectable non-ASCII text and compare representative page/order/settings with preview. Expected: existing 16-fixture and eight-settings numerical gates remain separate; no renderer geometry change for app reflow. Production font/photo/manual printing stay open absent deployed evidence. Do not invoke deferred P5-13 generation/review. + +## M07 — Settings, Rules and shared form failure handling + +**Routes/components:** `/settings`, `/companies?edit=:id`; [SettingsView](../../../../../job-tracker-ui/src/components/SettingsView.tsx), [RulesSettingsCard](../../../../../job-tracker-ui/src/components/RulesSettingsCard.tsx). **PRES:** S03/S05/E08/J08. **Lanes:** H-K/H-SR/H-Z/H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Desktop settings Tabs: arrows/activation, selected state, content name and predictable next Tab. Phone section Select: name/value, selection and content reading. Expected: relationship and order understandable in the **rendered** accessibility tree; current plain TabPanel Box and unnamed panel linkage require inspection, not presumed compliance. +2. Rules: edit all six numeric fields, switch sections repeatedly and return; enter empty/out-of-range value, Save, hear error associated with its field. Failed local PUT→retry, explicit Discard and successful Save→reload must preserve expected baseline/draft states. Expected: switching does not discard; dirty status not color-only; failed Save not announced successful; validation readable/correctable. Any absent error-summary/first-invalid-focus is recorded against the Phase 3 target. +3. Settings notification/theme/language actions: inspect actual persistence outcome and failure/retry while draft remains usable. A locally applied language change is not proof the preference PUT succeeded. Perform separate reliability probes only if authorized; historic SQLite contention is not closed by sequential success. +4. Company edit modal: fail a disposable save, read visible/spoken error, retry and cancel. Expected: feedback available in active modal, draft retained, one focus trap, name/help/errors remain visible above software keyboard. Record inaccessible outside-modal feedback separately; no broad repair is authorized here. + +## M08 — Retained Career, mail, account and administrator destinations + +**Routes/components:** `/career?section=profile`, `/career?section=evidence`, `/career?section=import`, `/profile`, `/correspondence`, `/settings/connected-accounts`, `/reminders`, `/operations`, `/offers`, `/admin/users`, `/admin/audit`, `/admin/system`; [CareerProfilePage](../../../../../job-tracker-ui/src/views/CareerProfilePage.tsx), [ProfilePage](../../../../../job-tracker-ui/src/views/ProfilePage.tsx), [CorrespondenceInboxPage](../../../../../job-tracker-ui/src/views/CorrespondenceInboxPage.tsx). **PRES:** C01–C05/M01–M06/E04–E06/J09/A01–A03. **Lanes:** H-K/H-SR/H-Z/H-T. **Observed/version/device/result:** NOT VERIFIED. + +1. Reach each intended destination through shell/commands/linked context. For Career, use actual `?section=` values, canonical fields/add/remove/save, validation and history; read import/evidence controls without unapproved extraction/provider calls. Expected: true route/owner remains, source scope explicit and new shell does not make old actions unreachable. `/career/profile` used by existing links is not assumed a separate top-level route; record actual redirect/compatibility behavior. +2. Inbox list/filter/detail, owned draft and local manual correspondence: read labels, long content, attachment actions and dirty state. Expected: clear log-versus-send distinction, no send from navigation, list/detail transition and return usable on phone. `followMode` compose entry remains deferred. +3. Profile/security sessions/2FA controls, linked accounts and locked capabilities: hear explanations and reversible control names without changing providers. Admin/non-admin fixture: denial safe, aggregate/table alternatives readable and dangerous/last-admin actions clearly separated. No real consent, delivery, authenticator or production admin proof is claimed. + +## M09 — Screen-reader names, dialogs, validation and live state + +**Routes/components:** M01–M08 loaded controls, shared toast/prompt/confirmation, menus and dialogs. **PRES:** all applicable UI groups; E08/C06–C10/W08 priorities. **Lanes:** H-SR/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. Repeat primary M01–M08 tasks with actual SR browse/focus modes. Record exact spoken names, descriptions, selected/current/disabled/included states, landmark/headings and reading order. Expected: every actionable icon/control has a purpose; tooltip wrapper plus button is not misleadingly read twice; hidden/background nodes not reachable. +2. Required text/number/date/autocomplete/select/rich-text fields: label, required state/help, invalid value, submit, error and correction. Expected: field/error association reliable, input retained, logical focus and useful failure explanation. Record actual speech/timing rather than inferring it from `aria-live`. +3. Nested prompt/confirmation/add-content dialog/row menu: initial focus, Tab/Shift+Tab, Escape/Cancel policy, background isolation, error and trigger return. Expected: one active modal trap, no hidden exit content receiving focus, no dropped focus after removal or viewport change. +4. Hold/fail/retry loading, saving and rendering. Expected: meaningful busy→completion/error updates once at useful time without focus theft or repeated keystroke chatter; after failure no false saved/page-ready announcement. A visible toast outside modal requires explicit spoken/recovery testing. + +## M10 — Actual browser zoom, reflow and text spacing + +**Routes/components:** primary tasks M01–M08, especially shell/actions, forms/dialogs, Jobs filters/cards, charts/tables and CV panes. **PRES:** E07/E08/J05/J07/W01/C06–C10/S03. **Lanes:** H-Z/H-K/H-SR. **Observed/version/device/result:** NOT VERIFIED. + +1. At recorded desktop outer size, set browser zoom to actual 200%, then 400%; record browser UI level and measured CSS viewport/DPR. Complete navigation, search, form Save/Cancel/errors, Jobs/Board actions, report values and CV mode return at each. Expected: no ordinary content loss or inaccessible target, no focus obscured by sticky chrome. A viewport-only resize is recorded as a different automated check, not this human result. +2. Restore zoom; apply the declared text-spacing user stylesheet and repeat long NB headings, errors/helper text, buttons/menus, table/card metadata and CV chrome. Expected: no clipped text, overlap or loss of function; remove stylesheet and confirm normal state. Capture exact exceptions for genuinely two-dimensional content rather than declaring any overflow acceptable. +3. At 320 CSS width/short landscape heights, keyboard traverse top→bottom with dialogs open and with preview focused. Expected: independent intended scroll, actions still reachable, no nested-scroll keyboard trap or global overflow hiding. Repeat one supported alternate browser; unavailable browser stays NOT VERIFIED. + +## M11 — Contextual contrast, forced colors and motion + +**Routes/components:** all loaded primary surfaces plus the five retained axe incomplete families. **PRES:** E08 and mapped surface contracts. **Lanes:** H-C/H-K/H-SR. **Observed/version/device/result:** NOT VERIFIED. + +1. For every retained incomplete target, record file/case/state/theme/locale, raw rule/check detail, actual role/name/value and rendered context. Inspect `color-contrast`, `aria-hidden-focus`, `aria-prohibited-attr`, `aria-valid-attr-value` and `th-has-data-cells` separately. Expected: measured disposition or scoped finding; repeated node occurrences are not unique defect counts and zero violations do not pass incompletes. +2. Measure settled active text, selected/disabled explanations, hover/tooltip/error and control/focus contrast against actual backgrounds, including transparency/overlays. Expected: project target ratios or justified criterion exception. Document white print-page ink separately from dark surrounding UI; no color inversion to manufacture app contrast. +3. Enable actual OS/browser forced-colors, then reduced motion. Repeat menus/drawer/selection/inclusion/reorder/errors and preview return. Expected: focus/selected/error/status remain identifiable without color; no outcome relies on animation. Repeat normal finite transitions for hidden-focus issues; passing reduced-motion tests cannot certify all normal-motion timing. + +## M12 — Physical touch, software keyboard and orientation + +**Routes/components:** primary M01–M08 tasks; long forms, prompts/add-content/dirty dialogs, Board and CV panes/reorder. **PRES:** E07/E08/J05/J07/W01/C01/C06–C10/S03. **Lanes:** H-T/H-MSR. **Observed/version/device/result:** NOT VERIFIED. + +1. On actual phone and tablet use touch to open drawer/search/notifications, filters/actions, Jobs cards/Board, report disclosures, workspace sections, Career forms and CV edit/preview/settings. Measure target hit regions, spacing and any exception. Expected: no hover requirement or inaccessible action, appropriate single-pointer alternatives, no accidental activation during scroll. +2. Open actual software keyboard in long EN/NB search/text/date/rich-text fields near form bottom and inside dialogs. Show validation/server error and scroll to focused field/help/Save/Cancel; dismiss/reopen keyboard. Expected: field/action not hidden by keyboard/chrome, caret/draft retained, no jump to unrelated content. Record keyboard/browser/device and usable viewport/video. +3. Rotate portrait↔landscape with dirty or held-save CV/Rules draft and a long modal. Expected: same owner/field/section/draft, visible return/controls and deliberate scroll. Try touch selection, real entry/section/Board drag/drop/cancel and keyboard/status-menu alternatives; qualification of alternatives does not imply native drag succeeded. +4. With actual VoiceOver/TalkBack gestures repeat primary navigation, forms, menu/dialog, status errors and preview entry/exit. Expected: meaningful speech and focus/reading order, no inaccessible scroll canvas or lost edit mode. Absence of equipment/operator leaves the lane NOT VERIFIED, never simulated acceptance. + +## M13 — Deferred AI return obligations; do not execute + +**Routes/components:** retained builder AI entry affordances and future P5-13 review UI. **PRES:** C11 plus CV/source/revision boundaries. **Lanes:** eventual H-K/H-SR/H-T/H-MSR and separately approved configured-model qualification. **Observed/version/device/result:** NOT VERIFIED / DEFERRED. + +P5-13 remains unqualified, Production-withheld, **0/366 required calls**, **zero human model reviews**, semantic accuracy unmeasured and review UI unimplemented. Do not run Docker recovery, provider calls or fabricate AI screens for responsive acceptance. Existing deterministic grounding/stale-apply/Production no-write protections are separate automated evidence, not completion of this area. + +After explicit return authorization and approved qualification/UI prerequisites, retain: Current/Proposed/Sources and exact CV scope, insert/delete meaning without color, short/long mobile diff, explicit Accept/Reject/Close/Regenerate, focus entry/return, unavailable/error/retry/stale state, no-write rejection and normal revision participation. The frozen qualification corpus/rubric/human reviewer obligations remain unchanged. No mandatory item is dropped because implemented scope can proceed separately. + +## Exit and escalation rules + +Stop an unsafe operator action on demonstrated data loss, cross-account exposure or severe inaccessible critical operation; retain sanitized evidence and report a bounded finding. Ordinary missing manual coverage is NOT VERIFIED, not a guessed functional FAIL. Each issue needs exact reproduction, affected PRES, impact/severity, owner and separate scoped remediation/retest. This audit packet grants no broad product changes. + +A manual area earns acceptance only for its actual completed variants/lanes with retained operator evidence and no unresolved required behavior. Do not change the 57-group matrix to PASS from this script or from one unrelated browser result. Complete screen-reader acceptance, physical touch/software keyboard, full cross-screen zoom/reflow/contrast and deployed font/photo obligations stay open until their own evidence exists. Production ingress/backup/restore/configuration/rollback gates remain separate NO-GO dependencies. Full original Phase 5 scope cannot receive unconditional GO while P5-13 or other mandatory acceptance remains incomplete. diff --git a/docs/redesign/phase-5/p5-15/p5-15-02/README.md b/docs/redesign/phase-5/p5-15/p5-15-02/README.md new file mode 100644 index 0000000..271ef66 --- /dev/null +++ b/docs/redesign/phase-5/p5-15/p5-15-02/README.md @@ -0,0 +1,13 @@ +# P5-15-02 — Responsive and accessibility audit + +Start `cf847e9b256d9aec733abf3f37c42852c9dd2421`, development `codex/ui-redesign-phase4`, 2026-10-10. Production `main` remains unchanged and **NO-GO**. This is an audit of the existing product, not remediation or completion of full Phase 5. + +## Independently reviewable baseline/operator checkpoint + +[Axe triage](AXE_TRIAGE.md) reconciles the authoritative inherited **267 scans / zero violations / 2,041 incomplete node occurrences** from actual R-03 output. [Manual acceptance](MANUAL_ACCEPTANCE.md) covers all 13 requested areas with operator/version/device, expected/observed announcements and explicit result fields. The owner reports a screen-reader operator available; actual workflow results remain pending and NOT VERIFIED. No physical touch or software-keyboard acceptance is inferred. + +The binding sources are the [Phase 5 plan](../../PHASE5_PLAN.md), [parent acceptance programme](../README.md), [57 contracts](../PRESERVATION_ACCEPTANCE.md), [Phase 3 accessibility](../../../phase-3/ACCESSIBILITY_PLAN.md)/[responsive strategy](../../../phase-3/RESPONSIVE_STRATEGY.md), [Phase 4 acceptance](../../../phase-4/p4-06/README.md), P5-01–14 implementation evidence and all three functional repair records. Historic Phase 3 shell prose says below768; current shell uses1024. CV mode switches below900 independently of the1024 layout boundary; audit actual implementation and record that discrepancy rather than changing breakpoints. + +Fresh keyboard/native viewport, explicit WCAG 2.2 target-size, genuine Chromium tab zoom, text-spacing and emulated-touch checks are being collected. Their results and acceptance decision are **not yet established by this baseline checkpoint**. Browser automation, DOM inspection and agent screenshot review are distinct from independent human/assistive-technology evidence. Collection success will not imply every measured product check passes. + +P5-13 remains deferred/unqualified/Production-withheld: 0/366 qualification calls, zero human semantic reviews, no AI-review UI. Do not activate it or run provider/Docker work. F04, current production backup/tested restore, configuration/schema/secrets verification, rollback and deployment evidence remain open. Saved-search, Rules and AUTH-01 repairs, CV revision/source/frozen package and renderer geometry are preserved; no application changes are authorized by this record. diff --git a/docs/redesign/phase-5/p5-15/p5-15-02/evidence/axe-baseline-triage.json b/docs/redesign/phase-5/p5-15/p5-15-02/evidence/axe-baseline-triage.json new file mode 100644 index 0000000..846d63d --- /dev/null +++ b/docs/redesign/phase-5/p5-15/p5-15-02/evidence/axe-baseline-triage.json @@ -0,0 +1,15369 @@ +{ + "kind": "Inherited baseline triage; fresh parsing of R03 outputs, not a fresh application execution", + "recordedUtc": "2026-10-10T13:26:12.523780+00:00", + "documentationSourceCheckpoint": "cf847e9b256d9aec733abf3f37c42852c9dd2421", + "sourceCheckpoint": "339e3ba591c91dcd3590d4cbc451ad31268f1aec", + "codeCheckpoint": "68437671762aa9a4d93036a23a06810f1f47dd57", + "rawReport": { + "path": ".artifacts/p5-15-01R-03/browser/main.json", + "bytes": 5686596, + "sha256": "fdf09ffb0e2e92dff823b72beaabaa2242831cec84e9cd018c1c63a6f07bdc10" + }, + "portableSources": [ + { + "path": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/evidence/validation.json", + "bytes": 42703, + "sha256": "a70b6e3a07b56ed25c3914666a14488b126a62170f537f0ccbe0c9d288c4150d" + }, + { + "path": "docs/redesign/phase-5/p5-15/p5-15-01/analytics-auth-repair/evidence/auth-proof.json", + "bytes": 10104, + "sha256": "ac2e1402d510737f7239a0d43eda590160dbe845daf86068532a522bbd8e8c39" + } + ], + "totals": { + "scans": 267, + "violations": 0, + "incompleteNodeOccurrences": 2041, + "ruleCounts": { + "color-contrast": 1769, + "aria-hidden-focus": 41, + "aria-prohibited-attr": 209, + "aria-valid-attr-value": 18, + "th-has-data-cells": 4 + }, + "testFileFamilies": 19, + "browserMainCases": 134, + "browserMainUnexpected": 0, + "browserMainFlaky": 0, + "browserMainSkipped": 0 + }, + "countingContract": { + "scan": "One axe-result JSON attachment with violations and incomplete arrays in final R03 main results.", + "incompleteNode": "One entry in rule.nodes in incomplete; repeated snapshots, modes, languages and test files remain counted.", + "uniqueExactNodeFingerprint": "SHA256 of canonical original complete node JSON; changes in any data produce distinct identities.", + "normalizedGroup": "SHA256 of target, HTML and check id/message with emotion CSS hashes and generated React IDs normalized. Grouping aid only; not distinct defect count.", + "limits": "Generic accessibility.spec.ts scans without result attachments and scans in other runs are excluded. No claim every scan is full-page or every application route/state is covered." + }, + "installedAxe": { + "version": "4.13.0", + "rules": [ + { + "ruleId": "aria-hidden-focus", + "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements", + "help": "ARIA hidden element must not be focusable or contain focusable elements", + "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/aria-hidden-focus?application=axeAPI", + "tags": [ + "cat.name-role-value", + "wcag2a", + "wcag412", + "TTv5", + "TT6.a", + "EN-301-549", + "EN-9.4.1.2", + "RGAAv4", + "RGAA-10.8.1" + ], + "actIds": [ + "6cfa84" + ], + "enabled": true, + "defaultEnabled": true + }, + { + "ruleId": "aria-prohibited-attr", + "description": "Ensure ARIA attributes are not prohibited for an element's role", + "help": "Elements must only use permitted ARIA attributes", + "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/aria-prohibited-attr?application=axeAPI", + "tags": [ + "cat.aria", + "wcag2a", + "wcag412", + "EN-301-549", + "EN-9.4.1.2", + "RGAAv4", + "RGAA-7.1.1" + ], + "actIds": [ + "5c01ea" + ], + "enabled": true, + "defaultEnabled": true + }, + { + "ruleId": "aria-valid-attr-value", + "description": "Ensure all ARIA attributes have valid values", + "help": "ARIA attributes must conform to valid values", + "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/aria-valid-attr-value?application=axeAPI", + "tags": [ + "cat.aria", + "wcag2a", + "wcag412", + "EN-301-549", + "EN-9.4.1.2", + "RGAAv4", + "RGAA-7.1.1" + ], + "actIds": [ + "6a7281" + ], + "enabled": true, + "defaultEnabled": true + }, + { + "ruleId": "color-contrast", + "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds", + "help": "Elements must meet minimum color contrast ratio thresholds", + "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/color-contrast?application=axeAPI", + "tags": [ + "cat.color", + "wcag2aa", + "wcag143", + "TTv5", + "TT13.c", + "EN-301-549", + "EN-9.1.4.3", + "ACT", + "RGAAv4", + "RGAA-3.2.1" + ], + "actIds": [ + "afw4f7", + "09o5cg" + ], + "enabled": true, + "defaultEnabled": true + }, + { + "ruleId": "target-size", + "description": "Ensure touch targets have sufficient size and space", + "help": "All touch targets must be 24px large, or leave sufficient space", + "helpUrl": "https://dequeuniversity.com/rules/axe/4.13/target-size?application=axeAPI", + "tags": [ + "cat.sensory-and-visual-cues", + "wcag22aa", + "wcag258" + ], + "enabled": false, + "defaultEnabled": false + }, + { + "ruleId": "th-has-data-cells", + "description": "Ensure that