Files
2026-10-06 22:58:45 +02:00

27 KiB
Raw Permalink Blame History

P5-08a — Job header and Overview

Completed from 42a6e425b6e4 on codex/ui-redesign-phase4. Header/Overview only; P5-08b and B07 are not included. Local scoped acceptance is satisfied; this is not production or complete screen-reader certification.

Existing owners and data inventory

ApplicationWorkspacePage owns the aggregate read, edit dialog, five section keys, return context and dirty-navigation guard. /jobs/:id and /applications/:id continue using that owner. Overview owns six existing accordions: job details, checklist, calendar, timeline, documents and correspondence. Analysis, CV, cover-letter/drafts and interview children retain their existing loading/mutation owners.

The authenticated workspace endpoint resolves the principal and owner-loads the job. The service reads job/company/source, attached CV, attachment count, saved AI history and eight recent JobEvents. Its existing checklist read seeds system tasks; this historical side effect is not new client generation or changed by this slice.

Available: role/company/location/salary, literal status and pipeline metadata, saved/applied/deadline/follow-up dates, listing URL/source/country, original/translated description, tags/notes, selected CV identity, cover-letter readiness, document and saved-AI counts, checklist progress and server-selected next pending task. The next task remains the server checklist's recommendation, not a new client workflow engine.

Not in the aggregate: favourite/priority, structured work arrangement/employment type, response/interview/offer dates, actual match score/freshness or submitted-package identity. Existing edit/deeper sections remain the entry for their supported data. No speculative fields, additional match request, AI generation, package capture, rendering or backend contract is added to fill the design.

Preservation impact before implementation

Contracts Retained behaviour Bounded change Required evidence
PRES-W01, J05/J06/J07/J09 entry Five section keys/aliases, edit/details, full-page/optional overlay props, list return/filter/focus, dirty cancel/discard Local header and Overview presentation Existing route/overlay and native smoke/Jobs Back suites
PRES-W02 Literal/custom status, deterministic progress, dates/details/description, server next task, recent activity Header hierarchy, summary, keyboard-scrollable progress New progress/custom-status/read-retry fixtures; native responsive workflow
PRES-W03 entry Explicit analysis/match/strategy/review owners Retain Analysis and saved-AI entry Intelligence/workflow suites; no automatic generation
PRES-W04/W08/W11 links Checklist, documents, calendar and their owners Preserve existing Overview accordions Checklist/attachments/calendar and native smoke
PRES-W05/W06/W07/W09/W10 CV, drafts, immutable packages, interview and follow-up owners Unchanged children Full frontend/backend regression; package proof remains blocked
PRES-W12 adjacent dependency Existing asynchronous operation/progress/notification owners No producer, polling or operation change Existing operation/profile tests; no new provider/worker acceptance
PRES-E07/E08/E09 Authenticated routing, semantic theme/focus, EN/NB, identity isolation Shared PageHeader/PageSection/ViewStateNotice consumption Themes/locales/widths, missing/foreign resource and security suites

G-WORKSPACE's P4-02-D03 is reproduced in the historical phone scans: the progress strip scrolls horizontally but has no keyboard scroll entry. Add a named focusable scroll region at that strip only. Stages stay noninteractive. Custom status must not imply completion of every standard stage.

Open gates

G-PACKAGE/P2-D01 remains open. Packages/tailoring/deeper section composition are untouched; native preservation proof is still required before P5-08b. F04, P5-02 manual screen-reader acceptance, incomplete axe checks, preference-save 500, Board scaling/native touch and P5-07-O01 are retained separately.

Header hierarchy and action decisions

Reuse PageHeader below the existing shell h1: role is h2, company is its description, literal/localized status and location/deadline sit immediately below. Edit is a named outlined button invoking the unchanged EditJobDialog; the original advert is a labelled external link with the existing new-tab/no-opener relationship. The existing Back control, optional full-page link and five scrollable tabs remain. Long titles/company/custom status wrap; actions wrap rather than compress or disappear. Source and salary remain in Job details instead of crowding the header.

Status editing still happens through the existing edit dialog; reviewed message-status suggestions remain in their owner. No new status endpoint, deletion/menu workflow, favourite state or header-only package action is introduced. Existing delete/archive/trash operations remain in their existing Jobs/Trash owners, not silently removed or reimplemented here.

Overview hierarchy and retained domain content

  1. A compact Application information definition list presents recorded saved/applied/deadline/follow-up dates. Absent values are —, not inferred dates. UI language selects the existing EN/NB date formatting; stored timestamps/timezone semantics are unchanged.
  2. The server checklist's next pending task remains the recommendation and existing section action. Its label/description use existing system-key translations or literal user task text. No client stage/wizard or automatic AI content is added.
  3. Application preparation retains all five existing entries and counts: selected/tailored CV, cover letter, documents, saved AI suggestions and checklist. Native MUI Buttons replace manually keyboard-wired Paper buttons, reuse shared focus treatment and retain the same handlers. Incomplete preparation text uses readable secondary text rather than disabled-colour styling.
  4. Recent activity retains all eight server-provided events and Refresh; narrow screens stack dates below details. Backend event type strings remain literal as before; no new event stream or localization inference.
  5. All six existing accordions and domain children remain in the same owner/order. JobDetailsSection's salary/source/country/tags/notes/original/translated description stays intact. Calendar, timeline, uploads/correspondence, CV/package, interview and AI review owners are unchanged. Dates are deliberately repeated in the full disclosure for low-risk compatibility; deeper consolidation belongs to P5-08b after its gates.

The progress strip now has a named keyboard-focusable scroll region using the shared focus-visible foundation. Arrow keys scroll natively; individual stages stay noninteractive and the current standard stage has aria-current="step". Unknown/custom status remains literal and shows that no standard position exists. The prior Number.MAX_SAFE_INTEGER fallback falsely coloured all standard stages complete; no backend/custom status values or standard movement semantics change.

ViewStateNotice supplies initial load/completion and explicit error semantics. Retry repeats only the existing aggregate GET for transport/server failure; invalid, unauthorized, forbidden and missing resources offer Back without a futile retry. Existing mounted section/draft owners are not replaced by a new resource framework or remounted merely on refresh. Historical failed-load handling already replaces the workspace with an error; this slice does not redesign draft recovery.

Regression protection and bounded fixes

Before implementation the new fixture run had 7 inherited passes and 3 expected-to-reproduce failures: no named scroll region, custom standard-pipeline overstatement and missing Retry. After implementation that suite has 12 passes: the same 7 inherited cases and 5 new cases for progress/current-stage semantics, literal custom status, read retry/no mutation, supported next-task/CV entry and recorded/unknown dates.

The two new native-browser cases use disposable owned records, preserve five tabs/aliases, test edit Escape/focus return, original-link behavior, no client mutation on open, trusted owner read denial, dates/custom status/sparse records and native progress scrolling/focus. A controlled local transport fixture tests loading→503→Retry→404 explicitly; it is not native missing-resource or ownership proof, which remain covered separately by the real API and inherited workspace smoke.

The first new browser attempt used a nonexistent theme-preference endpoint in the fixture (404). Corrected the fixture to the existing local theme owner and native language preference endpoint; no application endpoint or test expectation was weakened. The focused rerun passed both cases. Rendered review then found an undefined spacing variable introduced by this slice; corrected it to existing --app-section-gap before final complete validation. One new unit fixture used unsupported Testing Library exact typing; removed that fixture-only option before the final build.

Deferred observations and P5-08b boundary

  • P5-08a-O01, existing next-task adapter limitation: server complete-career-profile has no section, so its overview fallback is checklist. Existing go writes that key and workspaceSection maps it back to Overview; it does not open the canonical Career Profile or expand the checklist automatically. Unknown task destinations such as portfolio/notes also lack current workspace adapters. This slice preserves the server recommendation and existing handler rather than invent a workflow. Supported prepare-cv → cv is tested. Resolve intended aliases/entry behavior in the authorized P5-08b adapter work, not by claiming all task buttons have a native destination today.
  • Existing followMode loss from setParams({section}) and literal AI {name} remain P5-08b gates. No route/query adapter or deeper section migration occurred.
  • Native package capture/tailoring success plus immutable archived-binary/source-mutation proof is still absent. P5-08b remains NO-GO until G-PACKAGE and its own query/draft/AI-label prerequisites pass.
  • Manual screen-reader spoken names/live announcements, real touch and incomplete automated contrast checks remain explicit acceptance gaps. No screenshot or axe pass certifies them.
  • P5-08a-O03, existing deeper accordion ARIA IDs: the unchanged OverviewDetails gives each AccordionSummary aria-controls="<panel>-content" and repeats that ID on AccordionDetails. The installed MUI Accordion also creates its region with the Summary's aria-controls ID. Both nodes therefore share each of six content IDs. The scoped axe scans report this under incomplete, not violations; source inspection confirms the duplication. Deeper accordion/section accessibility must address this in P5-08b's authorized composition work. It is not a newly introduced Header/Overview-summary defect and was not silently repaired here.
  • F04, P2-D01, P5-06-O01 preference-save 500, P5-07-O01 confirmation-focus observation, Board scaling/native touch and other pre-existing debt remain open. No provider, schema, backend, shell, CI, renderer or dependency changes were made.

Files and scope review

  • job-tracker-ui/src/views/ApplicationWorkspacePage.tsx: existing header/Overview owner, shared page/state primitives, native preparation buttons, date summary and progress accessibility. No replacement section or new routing owner.
  • job-tracker-ui/src/i18n/translations.ts: two labels in each existing language for application preparation and a custom status without a standard pipeline position.
  • job-tracker-ui/src/application-workspace-overlay.test.tsx: five behavioral regressions alongside seven retained routing/overlay/dirty-navigation cases.
  • job-tracker-ui/e2e/job-overview-presentation.spec.ts: two local-browser regressions with native owned records plus controlled failed-read states.
  • job-tracker-ui/e2e/dashboard-presentation.spec.ts: two lines synchronize the existing menu-contrast scan with completed entry opacity; justification and retained failure evidence below. No new case, disabled rule or altered contrast assertion.
  • This implementation record, sanitized evidence, current Phase 5 index/readiness/blocker links, preservation trace index and TODO status.

Dashboard, theme, AppShell, App routes/providers, backend, CI and dependencies are unchanged. Shared PageHeader/PageSection/ViewStateNotice and existing theme tokens are consumed, not copied. No native package/archive operation, PDF renderer, AI write, delete/archive flow or query adapter was changed. Existing underlying controls remain available in their current disclosures/owners.

Validation observations retained

P5-08a-O02 — inherited Dashboard menu contrast observation: two complete pre-synchronization browser runs each had 82 actual passes, unchanged P2-D01 expected failure and one unexpected failure in the existing Dashboard customization-menu axe assertion. Dark/English menu text was measured at 3.77:1 for the focused item and 3.87:1 for other items against the 4.5:1 requirement. The initial and second summaries preserve both outcomes; the sanitized second scan retains all five affected targets/ratios without raw HTML.

Direct read-only browser inspection confirmed entry opacity 0.0111545, the existing 305ms opacity/203ms transform transition, and settled opacity 1 with rgb(234,234,242) text on rgb(28,28,36). This establishes that focus alone is not proof of settled contrast. The exact opacity during the earlier axe computation was not instrumented, so the timing explanation is supported rather than retrospectively proven. To obtain a meaningful stable-state baseline, the existing fixture now polls the semantic menu's parent computed opacity to 1 before the original axe scan. This bounded validation synchronization is the only change outside the workspace/i18n owners. Dashboard styling, keyboard/focus assertions, rules, contrast assertion, expected-failure annotation and retry configuration are unchanged. No product transition, Dashboard redesign or unrelated defect repair is included; transition-wide and manual screen-reader acceptance are not certified by a settled-state pass.

No raw authentication cookies, CSRF/session context, trace archives or response bodies are committed as evidence. The browser tests only call the disposable local API and abort external page requests; no production verification or provider call is claimed.

Accessibility, localization and responsive validation

The existing shell h1 is retained; the role is an h2 and Overview sections use shared h2 headings with the next task at h3. Buttons/links have visible names independent of tooltips. Status uses literal/localized text plus the existing semantic color, and custom text is never translated into a fabricated standard stage. The keyboard-scrollable progress region has a shared ≥3px focus outline and native arrow scrolling; its stages are not invented controls. Preparation buttons retain normal Enter/Space activation rather than custom keyboard handlers. Edit retains its existing Escape and focus-return behavior.

Native fixture captures cover all four combinations of light/dark and English/Bokmål at 1440×900, 768×1024 and 390×844, with additional dark/Bokmål 320×900 and 1920×900 cases. Long Norwegian role/company names, date labels and wrapping actions are deliberate fixtures. On phones the summary stacks, existing tabs/progress remain their own horizontal scroll surfaces and the page itself does not horizontally overflow. Reduced-motion behavior is inherited from the shared foundation; no new animation is introduced.

The two English-phone axe scans use the existing WCAG A/AA tags without disabling rules. The final sanitized scan summary has zero detected violations in each, but five incomplete color-contrast nodes and six incomplete duplicate-id-aria nodes per scan. Contrast could not be determined for the invisible notification badge and four off-screen/partially obscured progress captions after horizontal scrolling; these are not contrast passes. The six duplicate IDs belong to unchanged deeper accordions (P5-08a-O03 above), not falsely accepted as harmless. Scans do not certify untested sections, states/locales or spoken names/live announcements. Broader manual screen-reader acceptance remains mandatory for P5-15. Native touch, exhaustive zoom/forced-colors and calendar/DST correctness are not certified by these fixtures. The optional overlay still has its existing automated routing/dirty-navigation protection; no production quick-preview workflow is claimed.

Direct computer-use keyboard review used an existing disposable admin-owned CSV fixture job: Enter on its Jobs row opens the workspace, Enter on Edit opens the existing dialog, Escape restores Edit focus, Tab reaches the named progress region and then the Overview tab. At the requested 390×844 phone override, the actual document width/scroll width were both 375px (15px scrollbar); Right moved the progress strip to scrollLeft=40 with its 3px dark-theme outline visible. Direct keyboard screenshot records that state. No edit was saved. The subsequent direct Browser Back attempt overlapped the disposable API's teardown and could not validate row restoration; no manual Back pass is claimed. The four inherited Table-density native cases independently retain Browser Back/focus assertions in the complete suite. The temporary tab was closed and viewport override reset. This is direct browser/keyboard review, not a spoken screen-reader session.

Rendered evidence

The final visual manifest records native versus controlled fixtures, viewport/full-page dimensions, capture timestamps and reviewed byte hashes. All 23 scripted workspace PNGs were individually inspected after the final application change, with one additional direct computer-use keyboard capture. These are synthetic owned records against the production UI export/disposable API, not production accounts or a live deployment.

State / representative evidence Rendered review
Desktop light EN, dark EN, light Bokmål, dark Bokmål Role/company hierarchy, named actions, literal status, recorded dates, compact preparation entries, retained disclosures and semantic surfaces
Phone light EN, dark EN, light Bokmål, dark Bokmål 390×844; long role/company/action text wraps, summary stacks and only the existing tab/progress strips scroll horizontally
Tablet light EN, dark EN, light Bokmål, dark Bokmål 768×1024; actions deliberately wrap below long Bokmål identity, two-column dates/preparation and usable section navigation
Minimum 320, wide 1920 320×900 and 1920×900 dark/Bokmål; bounded page width, multiline advert action, no document overflow; wide capture retains keyboard focus from the preceding check
Progress light EN, dark EN, light Bokmål, dark Bokmål Shared outline is visible/not clipped; edge stage text is naturally clipped only inside the keyboard-scrolled region, not removed
Custom status, sparse job Native alias entry, literal custom text without false standard completion; unknown dates stay —, absent listing URL stays absent
Loading, 503 with Retry, unavailable without Retry Controlled local transport, genuine progress/error messages, Back retained; no placeholder metrics or false empty-state success

Status and dates remain textually understandable without color; there is no new match card because the aggregate has no match score. Full-page phone captures are intentionally longer because all five preparation actions and six existing disclosures remain available. This does not claim new section navigation or package functionality. Exact labels/values are also checked against DOM/native responses; a raster alone is not proof of text accuracy, accessibility or historical date semantics.

Compatibility and rollback

All existing routes/provider boundaries are unchanged, including /jobs/:id, /applications/:id and all five current section keys. Existing aggregate read cadence and child persistence owners remain; Retry adds only an explicitly invoked repetition of that read. Header opening does not invoke AI/render/create/status writes. The new UI requires no migration or deployment setting. Rollback restores the local header/Overview composition together, without changing saved data, route adapters or immutable document/archive owners. Keep the progress accessibility and behavioral evidence when evaluating any later composition change; rolling back presentation is not a reason to restore the inaccessible strip.

Validation commands and baseline

Inherited: 934 backend, 403 frontend, 81 actual browser passes plus unchanged P2-D01 expected failure; rate-limit 9, ingress 6, PDF admission 1, configuration 3. Commands run through rtk proxy; npm commands use job-tracker-ui. General browser and API security suites use separate disposable API lifetimes sequentially. Browser configuration uses DOTNET_ROOT=C:/Users/Connor/.dotnet, DOTNET_HOST_PATH=C:/Users/Connor/.dotnet/dotnet.exe, PLAYWRIGHT_STATIC_EXPORT=true, PLAYWRIGHT_PREBUILT_EXPORT=true; the production export uses NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api, CI=false. No configured retry or baseline annotation is changed.

Check Command after rtk proxy Final-candidate result
Backend Release tests C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj -c Release --no-restore --logger 'console;verbosity=minimal' 934 passed, zero failed/skipped; unchanged
Frontend npm.cmd test -- --runInBand --silent 408 passed in 80 suites, zero failed/skipped; +5 workspace cases, no removal; final rerun 129.325s
TypeScript npm.cmd run typecheck Passed; historical TS2571 is not current
New E2E fixture typing npm.cmd exec tsc -- --noEmit --incremental false -p ../.artifacts/p5-08a-e2e-tsconfig.json Passed; ignored local config, no compiler/CI change
Lint npm.cmd run lint Passed, zero warnings
Frontend production export npm.cmd run build Passed after the final spacing and fixture-typing correction
API Release build C:/Users/Connor/.dotnet/dotnet.exe build JobTrackerApi/JobTrackerApi.csproj -c Release --no-restore -warnaserror Passed, zero warnings/errors
Effective Compose/config python scripts/test-ingress.py 3 passed; unchanged, not deployed ingress proof
Supply-chain fixtures python scripts/test-supply-chain.py 3 passed; unchanged
Ollama evaluation fixtures python scripts/test-ollama-evaluation.py 5 passed; unchanged
Extension capture URL node --test browser-extension/tests/capture-url.test.mjs 3 passed; unchanged

These checks ran after the last application change and the final menu-fixture synchronization; documentation-only acceptance updates do not change the tested application. The first two complete browser runs are explicitly not accepted as clean runs: each had 82 actual passes, one unchanged expected failure and one unexpected inherited Dashboard contrast failure. New workspace cases passed in those runs; no existing failure is hidden behind that fact.

Remaining check Command after rtk proxy Final result
Complete browser npm.cmd run test:e2e -- --reporter=line,json 83 actual passes: 81 inherited +2 new; unchanged P2-D01 expected failure, zero unexpected/skipped/retries; 11m09s
Rate-limit npm.cmd run test:rate-limits -- --reporter=line 9 passed, unchanged
Ingress npm.cmd exec playwright test -- --config=playwright.ingress.config.ts --reporter=line 6 passed, unchanged; does not close F04
PDF admission npm.cmd run test:pdf-admission -- --reporter=line 1 passed, unchanged
Secret scan python scripts/supply-chain.py scan-secrets Passed on staged final candidate; no high-confidence credential patterns
Whitespace git diff --check and git diff --cached --check Passed; normal LF/CRLF notices are not failures
Documentation/evidence python .artifacts/p4-04-check-doc-links.py plus local JSON/PNG hash/dimension/outcome assertions 141 current/root Markdown files, zero missing local targets; 24 inspected PNGs, 84 distinct case outcomes, zero retries/skips

The final browser summary separates all 84 outcomes. Playwright's “84 passed” includes the annotated failing package case; this report counts it as one expected failure, not actual success. No existing case/rule/assertion was removed, skipped or weakened. The only inherited fixture adjustment is the explicitly justified settled-state wait, not a generic retry or annotation. Final screenshots were retained before specialized API suites replaced temporary output, and reviewed hashes match the committed PNGs.

The final scope/security review confirms that principal/ownership/session checks, outbound HTTP protections, rate partitions, PDF admission, CSV safety and ingress configuration are untouched. Existing security suites and the full backend suite remain healthy; local tests are not production F04 evidence. Only the three application files listed above changed. The extra Dashboard file is a validation fixture, with its necessity recorded rather than presented as Job-workspace implementation. No test/CI/package baseline configuration was altered.

Acceptance and stopping point

P5-08a accepted within its approved local presentation/preservation scope. Job identity/status/dates/actions and all existing children remain available. Both aliases/five section keys, native missing/foreign handling, dirty navigation and Jobs Browser Back contracts retain regression coverage. Light/dark, English/Bokmål and desktop/tablet/phone/minimum-width rendered review is complete; keyboard progress access resolves the specifically assigned P4-02-D03 gate. This does not certify every protected workflow, provider, touch or screen-reader state.

P5-08b remains NO-GO: G-PACKAGE native capture/archive/historical-binary proof is still missing. Its section/query/followMode retention, draft/AI review guards, literal AI {name} correction and legacy mappings also require their own prerequisite evidence. P5-08a-O01's next-task adapter limitation and O03's existing accordion IDs must be addressed at the approved deeper navigation/composition boundary. No package/tailoring restructure or P5-08b implementation occurred. F04 and the other carried operational/accessibility debt remain explicitly open. Stop here; do not begin P5-08b or B07 automatically.