feat(ui): redesign job workspace sections
@@ -1,5 +1,7 @@
|
||||
# Redesign traceability
|
||||
|
||||
Job section migration: [P5-08b implementation trace and evidence](../phase-5/p5-08b/README.md#preservation-impact-and-discovered-owners) maps W01–W12, C/M relationships, E07–E09 and Jobs return entries to seven URL-backed sections, existing domain owners, focused unit/native browser tests and synthetic rendered evidence. Frozen/native package proof is retained, personal Notes stays separate from application answers, and `followMode` remains metadata only. No revision, mail or backend semantics are rewritten; manual screen-reader acceptance remains open for P5-15.
|
||||
|
||||
Job workspace readiness: [P5-08b native/navigation/accessibility proof](../phase-5/p5-08b-readiness/README.md#preservation-traceability-and-changed-files) supplements W01/W04–W08, C01/C05/C07/C10 and E07–E09 with real SQLite/ZIP and four native locale/theme navigation cases. Historical P2-D01 rows below retain the original expected-failure evidence; the successor owns the repair/results. Connor explicitly deferred absent `followMode` UI to the mail phase while preserving metadata; manual screen-reader acceptance remains open.
|
||||
|
||||
Job header/Overview: [P5-08a scoped inventory, preservation and evidence](../phase-5/p5-08a/README.md#preservation-impact-before-implementation) maps PRES-W01/W02/W03 entry, W04/W08/W11 links, J05/J06/J07/J09 entry and E07–E09 to the existing owner, semantic header/summary, progress keyboard access, five new unit cases and two local-browser cases. Deeper W05–W10/W12 owners remain regression dependencies; native package proof, incomplete accordion/contrast checks and manual screen-reader acceptance remain open.
|
||||
|
||||
@@ -15,14 +15,14 @@ Reconciled against [P4-06](../phase-4/p4-06/README.md#opendeferred-issue-reconci
|
||||
| P5-02-D01 utility screen-reader operation | Automated axe and keyboard checks and command/notification semantic regressions pass; spoken names and live/state announcements have not been manually verified | **Open mandatory P5-15 accessibility acceptance item**. It does not block independent P5-03 Jobs work under Connor's explicit scope clarification. Operator steps and evidence request are in [P5-02](p5-02/README.md) |
|
||||
| P3-O02 workspace search replacement loses `followMode` | Addressed by [P5-08b readiness](p5-08b-readiness/README.md): only the section key changes; native history/reload retains query metadata | Query-retention prerequisite met; actual mode activation is the separate contradiction below |
|
||||
| P5-08b-R01 documented follow-up mode has no consumer | Connor explicitly decided on 2026-10-07: preserve `followMode` metadata and defer mode-specific UI; current absent consumer is not presented as implemented | **Deferred to mail phase; does not block P5-08b.** Preserve query compatibility without inventing send/generation; see readiness decision |
|
||||
| P5-08b readiness rendered-capture limits and deeper presentation debt | Full-page fixed-header stitching and entry/tab transitions limit settled visual claims; existing narrow attachment table/empty-message clipping and backend-generated English text in Bokmål remain | Does not block the scoped native/query/ARIA readiness proof; later workspace presentation/localisation and existing shared-dialog acceptance owners retain the gaps. [Review limits](p5-08b-readiness/README.md#rendered-review-and-evidence-limits) |
|
||||
| P5-08b readiness rendered-capture limits and deeper presentation debt | Historical stitched/transition captures remain limited. [P5-08b](p5-08b/README.md) adds viewport captures and a named keyboard-scrollable attachment table with an independently readable empty state | Scoped narrow document clipping is addressed; backend-generated English event/content text in Bokmål, shared-dialog timing and human assistive-technology acceptance remain open. Historical [review limits](p5-08b-readiness/README.md#rendered-review-and-evidence-limits) are not erased |
|
||||
| P4-02-D03 mobile progress scroll not focusable | **Closed for the targeted strip in [P5-08a](p5-08a/README.md)**: named keyboard region, native arrow scrolling, visible shared focus and current-step semantics | Scoped G-WORKSPACE 08a gate met; does not certify deeper accordions or full screen-reader acceptance |
|
||||
| P4-02-D04 literal AI context `{name}` | Addressed by P5-08b readiness using the existing interpolation argument; focused AI review regression protects the actual source name | Source/context/API unchanged; live-provider grounding certification remains separate |
|
||||
| P4-02-D02 company-save error outside accessible modal | Open; draft retained, transient toast hidden by modal isolation | **Does not block Phase 5 shell/navigation**. Company form/Phase 7 owner; direct company-form restructuring requires durable in-modal error. P5-00 toast position does not close this |
|
||||
| P4-04-O02 concurrent SQLite notification save | Open, earlier 2/10 native attempts HTTP 500 / database locked | **Separate backend reliability**; no shell/visual blocker with unchanged calls, but any increased polling/write concurrency waits for proof. Sequential passing test does not close it |
|
||||
| P2-O01 isolated rules-save 500 | Historical unconfirmed, cause not established | **Separate reliability triage** if recurrent; keep successful native oracle, no generic retry mask |
|
||||
| P4-05-O01 English status actions/browser-locale dates | **Closed for Jobs/Trash in [P5-03](p5-03/README.md)**: standard status display uses existing translations, custom status text and raw API keys remain stable, and applied/deadline display follows UI language | P5-03 localized table gate met in English/Bokmål; stored date/time semantics are unchanged |
|
||||
| P2-D01 native SQLite tailoring/capture | Repaired and post-capture assertions reached in [P5-08b readiness](p5-08b-readiness/README.md): frozen source/file readback plus real SQLite/account ZIP and copy-failure/retry proof | Native-package prerequisite addressed; successor final validation owns the expected-to-actual browser transition. CV revision/geometry and production restore remain separate |
|
||||
| P2-D01 native SQLite tailoring/capture | **Closed/passing** in [P5-08b readiness](p5-08b-readiness/README.md): frozen source/file readback plus real SQLite/account ZIP and copy-failure/retry proof | Ordinary regression retained in P5-08b; no expected-failure branch. CV revision/geometry and production restore remain separate |
|
||||
| F01 / audit D01 stale CV revision (related profile/job revisions distinct) | Open version increments without expected revision guard | **Blocks P5-09–14 broad CV**; separately authorized integrity work with cross-client proof. Profile/job persistence changes likewise gated, but their unchanged page links are safe. No automatic B07 |
|
||||
| Creation-intent idempotency | Open independent contract; not B02 identity or stale revision | **Separate backend/product work**; no Add/import/POST-on-mount expansion in Phase 5. Existing create review/no-write navigation must remain |
|
||||
| CV margins/templates/preview/pagination | Open, user concern reiterated during P4; current preview has extra pagination/cropping logic | **Blocks P5-09–14** via dedicated G-CV-RENDER corpus/repair checkpoint; keyboard passing does not prove geometry. No broad renderer replacement inside UI slice |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Phase 5 — Representative screens / major UI redesign plan
|
||||
|
||||
**Current successor: [P5-08b readiness](p5-08b-readiness/README.md).** Native package/ZIP readback and scoped navigation/accessibility regression evidence supplement the unchanged [P5-08a header/Overview](p5-08a/README.md). Five sections, six deeper disclosures, routes and domain owners remain. Connor explicitly reconciled the absent follow-up consumer: preserve compatibility metadata and defer mode-specific UI to the mail phase. Readiness evidence now governs scoped P5-08b GO. [P5-07 Analytics](p5-07/README.md), [P5-06 Dashboard](p5-06/README.md) and [P5-04b Jobs integration](p5-04b/README.md) remain authoritative for their areas. P5-02 manual screen-reader acceptance remains mandatory for P5-15. F04, incomplete accessibility checks, native touch, Board scaling and recorded timing/preference-save observations remain open. P5-08b visual migration, Phase 8 and B07 have not started.
|
||||
**Current successor: [P5-08b Job sections](p5-08b/README.md).** Seven URL-backed sections and Application/Timeline subsections recompose the existing owners on the Phase 4 foundations. [Native readiness proof](p5-08b-readiness/README.md) and the ordinary passing P2-D01 regression remain authoritative for frozen packages/ZIPs. P5-08a header/Overview and all compatibility routes remain. `followMode` metadata is preserved; mode-specific UI stays deferred to the mail phase by Connor's decision. [P5-07 Analytics](p5-07/README.md), [P5-06 Dashboard](p5-06/README.md) and [P5-04b Jobs integration](p5-04b/README.md) remain authoritative for their areas. P5-02 manual screen-reader acceptance remains mandatory for P5-15. F04, incomplete accessibility checks, native touch, Board scaling and recorded timing/preference-save observations remain open. P5-09 remains blocked by separate revision/rendering gates; no CV slice, Phase 8 or B07 has begun.
|
||||
|
||||
Historical planning checkpoint: source `2a2f9e48052c562ef599825458d0d3a6f9f9fc61`, inspected on 2026-09-13 on `codex/ui-redesign-phase4`. That checkpoint was documentation-only; the successor record above owns implementation/validation status.
|
||||
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
# P5-08b — Job sections and preserved domain content
|
||||
|
||||
Implementation from `acd1d94` on `codex/ui-redesign-phase4`. This checkpoint owns deeper workspace presentation and URL composition only; P5-08a header/Overview context and every existing domain/data owner remain intact. No P5-09 or B07 work.
|
||||
|
||||
## Gates and composition
|
||||
|
||||
The [readiness proof](../p5-08b-readiness/README.md) established native SQLite/ZIP contents, immutable readback after live-source mutation/deletion, attachments/ownership, numeric helper compatibility, history/query retention and scoped accessibility. P2-D01 is a genuine passing regression from that checkpoint.
|
||||
|
||||
Seven approved top-level sections: Overview, Match, Application, Documents, Timeline, Notes & tasks, Interview. Application has URL-addressable CV, Letter, Answers and Submission subsections. Timeline has Activity and Correspondence. Existing legacy section URLs reveal their original owner without rewriting the incoming URL. The persisted numeric 0–9 route helper remains unchanged. Navigation preserves unrelated query metadata, including `followMode`, and Jobs return/focus state. The reviewed follow-up composer remains deferred to mail work.
|
||||
|
||||
Presentation reuses MUI/Emotion, provisional primary and semantic surface/text/status tokens, Phase 4 PageSection/typography/focus. No new palette, font, cards framework or provider. Compact section summaries and restrained borders replace the old nested domain accordion collection; only job-detail disclosure remains in Overview. Each visible subsection mounts its existing owner, with existing letter/answer dirty guards covering subsection navigation. No implicit AI generation, freeze or sending.
|
||||
|
||||
## Preservation impact and discovered owners
|
||||
|
||||
| Contracts | Existing owner / invariants | P5-08b change and evidence required |
|
||||
| --- | --- | --- |
|
||||
| PRES-W01, E07/E08/E09; J05/J06/J07 entry | Workspace page, URL adapter, jobWorkspaceRoute, protected provider tree | Seven sections; secondary `sub` URL; every legacy/numeric alias, query/history, permissions and Jobs Back-focus regression |
|
||||
| PRES-W02/W03 | JobDetails, Timeline, Analysis/Match/Strategy/StatusSuggestion | Overview detail owner retained; deterministic Match and stored Timeline events, source/unknown states; no new AI facts |
|
||||
| PRES-W04/W10/W11 | ApplicationChecklist, FollowUp, ApplicationCalendarActions | Notes & tasks and calendar grouping; human Notes stays Job.Notes and uses existing EditJobDialog; checklist remains its own data type |
|
||||
| PRES-W05/W06/W07; C01/C04/C05–C12 relationship entry | ApplicationCv/Tailoring, CoverLetter, PackageDrafts, SubmittedPackages | Application subsections; current selected CV/source vs draft vs immutable snapshot; attach/detach, versions, dirty cancel/leave, AI accept/reject and native package regression |
|
||||
| PRES-W08 | Attachments real upload/metadata/AI consent/preview/download/delete | Documents presentation and narrow local table scroll; preserve filenames, purpose and ownership |
|
||||
| PRES-W09/W10; M01/M02/M04/M05 entry | InterviewPrep/FollowUp, Correspondence/Gmail manual/provider paths | Scoped section surfaces, existing prep review and logged/imported history; no mail/provider/domain rewrite |
|
||||
| PRES-W12 adjacent | Existing asynchronous operation progress/notification owners | Entry and current error states retained; no background engine change |
|
||||
|
||||
Data remains account-owned by the same server services. Application drafts are neither an external send nor a frozen package. Frozen readback uses the exact captured CV/version/HTML, letter, material JSON and archived binaries, never current Career Profile/CV data. Documents exposes current attachments separately from frozen package history. Submission owns the explicit Freeze action; viewing and downloading old packages remains read-only.
|
||||
|
||||
## Final section architecture and route compatibility
|
||||
|
||||
| Entry | Visible content / existing data owner |
|
||||
|---|---|
|
||||
| `section=overview` | P5-08a identity, summary, progress and actions; existing full job-details disclosure remains |
|
||||
| `section=match` | Analysis, recorded CV match, strategy snapshot; no generation on mount |
|
||||
| `section=application&sub=cv` | Current selected CV, exact variant link, tailoring and existing review/save controls |
|
||||
| `section=application&sub=letter` | Current editable letter and existing AI proposal/accept/reject boundary |
|
||||
| `section=application&sub=answers` | Application answer and recruiter-message drafts; explicit Save/Discard and navigation guard |
|
||||
| `section=application&sub=submission` | Explicit Freeze action and immutable historical package readback/download |
|
||||
| `section=documents` | Current uploaded attachments, CV/letter entry links, read-only frozen history; no Freeze control here |
|
||||
| `section=timeline&sub=activity` | Stored milestones/events and existing category filters |
|
||||
| `section=timeline&sub=correspondence` | Existing logged/imported mail, provider status, import/link/unlink/manual entry and retained history |
|
||||
| `section=tasks` | Human Notes using existing EditJobDialog; independent checklist/progress/reorder/dismiss actions and calendar export/provider actions |
|
||||
| `section=interview` | Existing preparation, reviewed AI suggestions, manual answers/questions, readiness, debrief and follow-up |
|
||||
|
||||
Legacy `analysis`/`match`, `cv`, `cover-letter`, `checklist`, `notes`, `documents`/`portfolio`, `timeline`, `communication`, `job-details`, `overview` and `interview` remain meaningful. Legacy CV/letter/correspondence keys take precedence over unrelated `sub` metadata. Unknown/prototype-like keys safely fall back to Overview. Canonical Application defaults to CV and Timeline defaults to Activity. The 0–9 helper still emits its original URLs, including the shared correspondence/follow-up destination. `/applications/:id` retains its existing compatibility redirect to `/jobs/:id`; no route/provider tree changes.
|
||||
|
||||
Selecting a subsection writes durable `sub` URL state; selecting a primary section removes obsolete subsection state while retaining other query metadata and `location.state`. Back/Forward/reload and Jobs originating focus context remain protected. Direct deeper entry focuses the named panel only when focus is still on the document body; keyboard tab activation retains the tab focus. Existing overlay props are retained without adding a new host; hosted subsection state remains local because the existing callback only accepts a primary section.
|
||||
|
||||
`followMode` round-trips unchanged and does not select a new compose mode. Connor's approved decision is **preserve compatibility metadata; defer mode-specific UI**. No follow-up send/generation is inferred from that query key.
|
||||
|
||||
## Domain preservation and presentation changes
|
||||
|
||||
- **Timeline:** source event arrays/order/types/IDs are unchanged. Locale-aware day headings replace backend English day labels. Semantic ordered lists and `time` elements expose recorded timestamps with an explicit UTC label, consistent with the server's UTC day grouping. This is not a timezone-model migration; stored event descriptions and user content remain literal.
|
||||
- **Application/Documents:** selected current CV and editable letter/answer owners remain distinct from frozen history. Freeze is still an explicit existing operation, not proof of external submission. Frozen views show exact captured CV name/theme/version, archived HTML, original letter, material and file downloads. The existing embedded answer encoding is decoded for display into separate Notes/Answer headings without rewriting package JSON or stored data. Native manifests, filenames, byte content, version associations and owner filtering are unchanged.
|
||||
- **Notes/tasks/calendar:** Notes edits use the original job editor, and a native assertion compares application answers after that write. Checklist tasks remain their own domain, with completion/order/dismiss controls intact. Calendar actions still export/create the existing deadline/follow-up events; no interview appointment, external provider or notification model is invented.
|
||||
- **Correspondence/interview/AI:** existing manual/provider/import and review owners remain. AI suggestions still require their original explicit accept/reject flow; this slice never adds user facts, silently applies suggestions or sends mail. Provider-dependent behavior is covered by existing mocks where noted, not certified against live services.
|
||||
- **Loading/errors:** shared PageSection and continuously mounted ViewStateNotice provide consistent headings and loading/error semantics. Genuine initial attachment/mail read failures previously looked empty or escaped error handling; they now show a local error/Retry without hiding the available manual entry. Other owners retain their existing retry/mutation contracts. Partial failure is not converted into a fabricated empty result.
|
||||
|
||||
The six existing component files changed outside the composition adapter are all approved deeper-section owners. `ApplicationAssets`, `ApplicationIntelligence` and `InterviewPrep` consolidate their local wrappers onto PageSection/ViewStateNotice; no new wrapper framework is introduced. `ApplicationChecklist` uses the same sections and responsive add form. `Attachments` and `Correspondence` remove legacy decorative shadows/glass and permit narrow reflow. `translations.ts` contains EN/NB presentation/accessibility/error strings only. Header/Overview business semantics, API endpoints, DTOs, database, auth, billing, renderer, AppShell and CI are unchanged.
|
||||
|
||||
### Scoped issues reproduced and resolved
|
||||
|
||||
1. Attachment rows had eight cells but seven headers. The existing upload date now has its translated header. All existing metadata/AI-use/action controls remain in a named, focusable local scroll region; the empty message is outside the wide table, so it stays readable at 320px.
|
||||
2. Package View disables its invoking button during asynchronous detail loading, so default dialog focus restoration could miss it. A scoped button ref restores focus on dialog exit; native Escape proves return to that View button. This does not close unrelated shared confirmation timing observations.
|
||||
3. Expanded populated Notes/tasks axe found completed text at **4.48:1**, below 4.5:1. Completed text now uses `text.secondary`, retaining checked state and strike-through; it is readable content, not a disabled action. The same expanded scan passes after the change.
|
||||
4. The existing interview answer textarea used only a placeholder below its item title. Its accessible name now includes the recorded question title through EN/NB localisation. The interview loaded-state scan protects this boundary.
|
||||
|
||||
## Regression coverage
|
||||
|
||||
The adapter tests were first run against the old five-section implementation and failed for the intended seven-section architecture/missing subsection resolver before implementation. Existing test assertions were migrated to the approved destinations, never replaced with generic visibility passes.
|
||||
|
||||
Six new Jest cases:
|
||||
|
||||
- `applicationWorkspace.test.ts`: legacy subsection precedence and canonical/unknown subsection handling (+2).
|
||||
- `application-workspace-overlay.test.tsx`: dirty answer subsection Cancel/Discard plus metadata/no writes; correspondence versus human Notes ownership (+2).
|
||||
- `application-assets.test.tsx`: read-only frozen history, exact captured content, separate Notes/Answer and no implicit capture/update (+1).
|
||||
- `attachments.test.tsx`: real read failure versus empty, retry recovery and no mutation (+1); existing metadata case also checks all eight headers.
|
||||
|
||||
Five new native Chromium cases in `job-sections-presentation.spec.ts`:
|
||||
|
||||
- Four EN/NB × light/dark journeys create real account/job/CV/letter/answers/file/task/prep/correspondence data, verify all seven sections and legacy entries, protect dirty answers, explicitly save/freeze, read frozen history, return dialog focus, complete a task, edit human Notes without changing answers, retain `followMode`, and exercise responsive navigation/local document scrolling.
|
||||
- One local fault-injection case holds then fails an attachment read, shows genuine error/Retry/recovery and independently fails correspondence reads. Only these read responses are mocked; it is not native archive/provider proof.
|
||||
|
||||
Existing ordinary P2-D01 native browser proof still compares frozen CV/letter/material/binaries after live-source changes and reads the native ZIP. Existing readiness cases cover numeric aliases, history/reload and keyboard movement. Inherited AI rejection/edited acceptance, CV attachment/ownership, mail/import, calendar, Jobs Back focus and auth tests remain active. The 57-contract ledger remains the preservation source; mapping a contract here is not a claim of exhaustive coverage.
|
||||
|
||||
## Validation and evidence
|
||||
|
||||
Inherited baseline: backend 936, frontend 412, browser 88 actual passes, rate 9, ingress 6, PDF 1, configuration 3. Final unit run: **418/418, 80 suites** (+6); backend: **936/936**, zero failures/skips. Final complete Chromium run: **93 actual passes** (+5), zero skipped, flaky, expected-failure or unexpected outcomes, 13.5 minutes. P2-D01 remains an ordinary passing case. TypeScript, lint, production export, edited-browser TypeScript and API Release build pass. Security suites remain **9 / 6 / 1**, configuration **3**, unchanged.
|
||||
|
||||
All commands use `rtk proxy`; npm commands run in `job-tracker-ui`. Specialized browser suites share port 5302 and run sequentially. Disposable raw traces/cookies are ignored; only safe summaries, invariant records and synthetic screenshots are retained.
|
||||
|
||||
| Final command | Result |
|
||||
|---|---|
|
||||
| `C:/Users/Connor/.dotnet/dotnet.exe test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj -c Release --no-restore --logger 'console;verbosity=minimal'` | 936 passed, 0 failed/skipped; unchanged count and native SQLite/ZIP proof retained |
|
||||
| `npm.cmd test -- --runInBand --silent --json --outputFile=../.artifacts/p5-08b-jest.json` | 418 passed / 80 suites, 0 failures; +6 cases described above |
|
||||
| `npm.cmd run test:e2e -- --reporter=line,json` | 93 actual passes, 0 expected failures/skips/flaky/unexpected; +5 new section cases |
|
||||
| `npm.cmd run typecheck` / `npm.cmd run lint` | Passed |
|
||||
| `npm.cmd run build`, `NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api` | Production static export passed |
|
||||
| `C:/Users/Connor/.dotnet/dotnet.exe build JobTrackerApi/JobTrackerApi.csproj -c Release --no-restore -warnaserror` | Passed, 0 warnings/errors |
|
||||
| `npm.cmd exec tsc -- --project ../.artifacts/p5-08b-e2e-tsconfig.json --noEmit --incremental false` | All edited permanent browser fixtures type-check using existing frontend types |
|
||||
| `npm.cmd run test:rate-limits -- --reporter=line` | 9 passed; same-IP account isolation, forged headers/session context and IP policy behavior |
|
||||
| `npm.cmd exec playwright test -- --config=playwright.ingress.config.ts --reporter=line` | 6 passed; application-level proxy/host/scheme/CORS regressions, not deployed topology proof |
|
||||
| `npm.cmd run test:pdf-admission -- --reporter=line` | 1 passed; actual cross-route render admission/recovery |
|
||||
| `python scripts/test-ingress.py` | 3 configuration/Compose checks passed |
|
||||
| `python scripts/test-supply-chain.py` / `python scripts/test-ollama-evaluation.py` / `node browser-extension/tests/capture-url.test.mjs` | 3 / 5 / 3 passed; local fixtures, not live provider certification |
|
||||
| `python scripts/supply-chain.py scan-secrets` | Staged candidate passed; no high-confidence credential patterns |
|
||||
| `git diff --check` / `git diff --cached --check` | Passed |
|
||||
| `python .artifacts/p4-04-check-doc-links.py` | 143 current/root Markdown files, zero missing local targets; historical archive excluded |
|
||||
|
||||
Browser runs use `DOTNET_ROOT=C:/Users/Connor/.dotnet`, `DOTNET_HOST_PATH=C:/Users/Connor/.dotnet/dotnet.exe`, `PLAYWRIGHT_STATIC_EXPORT=true`, `PLAYWRIGHT_PREBUILT_EXPORT=true`; main JSON output is `test-results/p5-08b-final.json`. No dependency, CI, package script or production configuration change was needed. Code stayed unchanged throughout final validation and supplemental visual inspection.
|
||||
|
||||
The [safe full-browser summary](evidence/final-browser-summary.json), [native invariant records](evidence/native-invariants.json), [accessibility summary](evidence/accessibility-summary.json) and [screenshot manifest](evidence/visual-manifest.json) contain no authentication storage or raw trace. The main run retains 74 synthetic viewport captures across the five new journeys.
|
||||
|
||||
### Accessibility evidence limits
|
||||
|
||||
Eight new whole-mounted-page scans have **zero reported violations**, using WCAG 2 A/AA and 2.1 A/AA tags. Four scan populated EN/light Documents, Correspondence, Notes/tasks and Interview; four scan 320px Submission in all theme/language combinations. Inactive sections/provider dialogs are not scanned. **Every scan has incomplete checks**: 43 contrast node occurrences and 46 ARIA node occurrences across these captures, with repeated nodes counted per scan rather than unique defects.
|
||||
|
||||
The ARIA incomplete findings identify existing Tooltip-cloned `aria-label` attributes on generic wrapper spans (45 checklist action wrappers, one interview Delete wrapper). The inner action buttons keep their independent accessible names; these findings are not declared passes or silently repaired here. Contrast incompletes include a short notification badge and overlapping field/background samples. Rendered review does not quantify every unresolved pair. Carry both rule types to the relevant shared-control/manual acceptance owners before P5-15.
|
||||
|
||||
Keyboard tab activation, selected/panel naming, reload/history, Cancel/Discard, checklist actions, dialog Escape/return and local table scrolling have native browser evidence. Manual visual review means inspection of actual rendered captures. It is **not** a human screen-reader or physical touch session. P5-02 spoken names/live announcements remain mandatory and open for P5-15; no full assistive-technology acceptance is claimed.
|
||||
|
||||
## Rendered, responsive and localisation review
|
||||
|
||||
The permanent four native journeys exercise 1440×900 desktop, 768×1024 intermediate, 390×844 phone and 320×844 narrow phone, in EN/NB × light/dark. They assert no global horizontal overflow; the existing status strip/tabs and attachment table use deliberate local scrolling instead of squeezing/removing content. Native numeric/history journeys also retain the earlier 1280px/390px coverage. Actions retain their existing permissions and independent accessible names.
|
||||
|
||||
Inspected **21 of 94 retained captures individually**; the manifest marks precisely which were reviewed. The other captures are retained evidence, not asserted to have received individual visual sign-off. Representative review covers all four theme/language combinations: desktop Match, current CV, letter, recorded Timeline, completed tasks and Interview; reopened frozen version; focused section navigation at 320/390/768; long NB title/company; local document-table focus; mobile Notes/Interview/CV/answers; actual loading/error/Retry/empty content.
|
||||
|
||||
Twenty supplemental captures reuse an ignored copy of the same five native fixtures, scroll the relevant content into view and wait for populated controls. They add mobile Notes, Interview, CV and Answers plus four actual read-state frames. The [supplemental summary](evidence/supplemental-visual-summary.json) records **5 passed**, separate from the permanent 93-case baseline. Exact command: `npm.cmd run test:e2e -- --config=../.artifacts/p5-08b-visual-config.ts --reporter=line,json`, with the same browser environment above; its reporter output resolves under `.artifacts/test-results/p5-08b-visual.json`.
|
||||
|
||||
The first supplemental attempt had 4 passes and one **capture-helper** timeout: Playwright waited for the continuously rotating progress SVG to become stable before scrolling. The ignored helper now scrolls its stable parent; all loading/error assertions remain, and the five-case rerun passes without application/permanent-test changes. The failed log/report remain ignored locally; the safe summary preserves the outcome/reason. This failure is not relabelled as an application pass or added to the main baseline.
|
||||
|
||||
Limits remain explicit: some original phone screenshots frame the preserved P5-08a header with the relevant state below the fold; separate `content-*` frames show that state. Long tab sets deliberately scroll locally (including keyboard selection), rather than show all seven labels simultaneously at 320px. Frozen HTML remains a white, scrollable document canvas even in dark mode; the iframe's original geometry/templates are untouched and not certified by this UI review. Stored backend-generated English descriptions/events remain English in NB; authored text/custom status values are not translated. No live provider, physical touch, browser zoom corpus or exhaustive template/output comparison is inferred.
|
||||
|
||||
## Files and rollback boundary
|
||||
|
||||
Application changes: `src/applicationWorkspace.ts`, `src/views/ApplicationWorkspacePage.tsx`, `src/i18n/translations.ts`; existing `components/ApplicationAssets.tsx`, `ApplicationIntelligence.tsx`, `ApplicationChecklist.tsx`, `Attachments.tsx`, `Correspondence.tsx`, `InterviewPrep.tsx`.
|
||||
|
||||
Five existing unit files and four existing browser files are adapted to the approved section composition; one new browser file supplies five cases. Documentation updates this scoped record/evidence, Phase 5 current index/open blockers, Phase 2 traceability and roadmap status. No shared AppShell, route table, dependency, CI, backend, schema or renderer file changed.
|
||||
|
||||
Revert the adapter/composition and child presentation as one UI checkpoint if required; do not rewrite persisted packages/material or restore old data. If later compatibility links use `application/sub`, `timeline/sub` or the new primary sections, retain a route adapter exposing the original child when rolling presentation back. Existing legacy helper URLs must continue functioning in either direction.
|
||||
|
||||
## Open debt and next boundary
|
||||
|
||||
F04 production ingress evidence remains open. Human screen-reader spoken names/live-state acceptance remains open for P5-15, separate from automated keyboard/axe. Native Board touch, Board full-result scaling, Dashboard preference-save 500/SQLite contention, P5-07/shared-confirmation focus timing and incomplete accessibility/manual checks are not silently closed. The pre-existing attachment-preview dialog's Download path still constructs ID 0; the ordinary table/archive download paths are separate and unchanged. Record that existing defect for the later attachment owner rather than repair it in this section migration. `followMode` mode-specific UI is deferred to mail work. P2-D01 is **closed/passing**, not open debt.
|
||||
|
||||
**P5-08b scoped acceptance: complete**, subject to the explicitly retained manual/provider/accessibility limits. Job sections/routes/history, drafts/Notes separation, immutable package/version/file/ownership proof and native entry controls remain green.
|
||||
|
||||
**P5-09: NO-GO until G-CV-REV and G-CV-RENDER are independently satisfied.** Missing proof includes cross-client stale save/restore rejection with unsaved-work recovery, and measured preview versus real PDF geometry/template/page-break fidelity across the agreed corpus. P5-08b does not resolve those contracts or authorise B07, a renderer replacement, schema changes, or CV editing redesign. Stop before P5-09.
|
||||
@@ -0,0 +1,109 @@
|
||||
{
|
||||
"manualScreenReaderAcceptance": "open for P5-15",
|
||||
"scans": [
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"capture": "sections-documents-en-light-axe",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"capture": "sections-correspondence-en-light-axe",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"capture": "sections-notes-tasks-en-light-axe",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "aria-prohibited-attr",
|
||||
"nodes": 45
|
||||
},
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"capture": "sections-interview-en-light-axe",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "aria-prohibited-attr",
|
||||
"nodes": 1
|
||||
},
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 9
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"capture": "sections-axe-en-light",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 7
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, dark)",
|
||||
"capture": "sections-axe-en-dark",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 7
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, light)",
|
||||
"capture": "sections-axe-nb-light",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 7
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, dark)",
|
||||
"capture": "sections-axe-nb-dark",
|
||||
"scope": "whole mounted page at capture; excludes inactive sections and provider dialogs",
|
||||
"violations": [],
|
||||
"incomplete": [
|
||||
{
|
||||
"id": "color-contrast",
|
||||
"nodes": 7
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 63 KiB |
@@ -0,0 +1,852 @@
|
||||
{
|
||||
"statistics": {
|
||||
"startTime": "2026-10-06T23:32:04.072Z",
|
||||
"duration": 807118.4199999999,
|
||||
"expected": 93,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
"flaky": 0
|
||||
},
|
||||
"actualPasses": 93,
|
||||
"expectedFailures": 0,
|
||||
"unexpected": [],
|
||||
"cases": [
|
||||
{
|
||||
"file": "accessibility.spec.ts",
|
||||
"title": "public entry points meet automated WCAG A and AA checks",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "accessibility.spec.ts",
|
||||
"title": "primary authenticated workspaces meet automated WCAG A and AA checks",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "account-isolation.spec.ts",
|
||||
"title": "retained profile request from A cannot write using B cookies and fresh B CSRF",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "account-isolation.spec.ts",
|
||||
"title": "missing and forged session contexts fail closed while same-account profile saves work",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "account-isolation.spec.ts",
|
||||
"title": "crafted CV identifiers cannot cross read update delete or job-association ownership",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "account-isolation.spec.ts",
|
||||
"title": "[P5-00 PRES-E05 E07 E08] account switch disposes open command, account and notification surfaces",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "account-isolation.spec.ts",
|
||||
"title": "two tabs discard A's private form before B can use it, including Back navigation",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "analytics-presentation.spec.ts",
|
||||
"title": "[PRES-S01 S02 E07 E08 E09 J05 J09] Analytics native reports, direct entry, period, drill-down and owner isolation",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "analytics-presentation.spec.ts",
|
||||
"title": "[PRES-S01 E08] Analytics independent loading and failure states never masquerade as empty reports",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "board-presentation.spec.ts",
|
||||
"title": "[PRES-J07 J05 W01 W02 E07 E08 E09] Board query membership matches Table and preserves moves, focus and route",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "board-presentation.spec.ts",
|
||||
"title": "[PRES-J05 J07 E07 W01] legacy Board replaces history and preserves query, hash and route state; default Jobs stays Table",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "board-presentation.spec.ts",
|
||||
"title": "[PRES-J07 E08] Board loading, retryable error and fully empty columns",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "builder-preview-keyboard.spec.ts",
|
||||
"title": "[PRES-C06 PRES-C07 PRES-C10 PRES-E08] light/en preview keyboard, pagination and responsive state",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "builder-preview-keyboard.spec.ts",
|
||||
"title": "[PRES-C06 PRES-C07 PRES-C10 PRES-E08] dark/nb preview keyboard, pagination and responsive state",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "builder-preview-keyboard.spec.ts",
|
||||
"title": "[PRES-C06 PRES-C07 PRES-C10 PRES-E08] light/nb preview keyboard, pagination and responsive state",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "builder-preview-keyboard.spec.ts",
|
||||
"title": "[PRES-C06 PRES-C07 PRES-C10 PRES-E08] dark/en preview keyboard, pagination and responsive state",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "csv-export.spec.ts",
|
||||
"title": "CSV export has safe cells and headers, and browser download preserves its UTF-8 bytes",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "dashboard-presentation.spec.ts",
|
||||
"title": "[PRES-S01 S02 E07 E08 E09] Dashboard native data, visibility and responsive presentation",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "dashboard-presentation.spec.ts",
|
||||
"title": "[PRES-S01 E08] Dashboard loading and independent failed resources retain retry and exact values",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-discovery.spec.ts",
|
||||
"title": "discovery remains usable across widths and opens the reviewed import",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-overview-presentation.spec.ts",
|
||||
"title": "[PRES-W01 W02 W03 J05 E08 E09] native Job header/Overview retains actions, custom status, aliases and mobile progress keyboard access",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-overview-presentation.spec.ts",
|
||||
"title": "[PRES-W01 W02 E08] Job Overview loading, failed read, retry and unavailable resource remain explicit",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-sections-presentation.spec.ts",
|
||||
"title": "[PRES-W01 W08 M01 E08] Job section loading and partial read failures stay explicit and recover locally",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-sections-presentation.spec.ts",
|
||||
"title": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-sections-presentation.spec.ts",
|
||||
"title": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, dark)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-sections-presentation.spec.ts",
|
||||
"title": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, light)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "job-sections-presentation.spec.ts",
|
||||
"title": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, dark)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "kanban-theme.spec.ts",
|
||||
"title": "kanban columns use dark theme surfaces",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "named-controls-modal-state.spec.ts",
|
||||
"title": "[PRES-E07 PRES-E08 PRES-J08 PRES-C08 PRES-C09 PRES-W06 PRES-W08] light/en/1440 named controls, modal keyboard and retained draft",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "named-controls-modal-state.spec.ts",
|
||||
"title": "[PRES-E07 PRES-E08 PRES-J08 PRES-C08 PRES-C09 PRES-W06 PRES-W08] dark/nb/1440 named controls, modal keyboard and retained draft",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "named-controls-modal-state.spec.ts",
|
||||
"title": "[PRES-E07 PRES-E08 PRES-J08 PRES-C08 PRES-C09 PRES-W06 PRES-W08] light/nb/390 named controls, modal keyboard and retained draft",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "named-controls-modal-state.spec.ts",
|
||||
"title": "[PRES-E07 PRES-E08 PRES-J08 PRES-C08 PRES-C09 PRES-W06 PRES-W08] dark/en/390 named controls, modal keyboard and retained draft",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-C01 PRES-C06 PRES-C07 PRES-C10] mobile CV override persists without changing the canonical profile or sibling CV",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-W01 PRES-W04 PRES-W08 PRES-E08 PRES-E09] native workspace aliases, keyboard sections and history retain context (en, light)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-W01 PRES-W04 PRES-W08 PRES-E08 PRES-E09] native workspace aliases, keyboard sections and history retain context (en, dark)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-W01 PRES-W04 PRES-W08 PRES-E08 PRES-E09] native workspace aliases, keyboard sections and history retain context (nb, light)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-W01 PRES-W04 PRES-W08 PRES-E08 PRES-E09] native workspace aliases, keyboard sections and history retain context (nb, dark)",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-S03 PRES-W11] responsive settings navigation keeps rule edits and persists notification preferences",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-S03] rule changes persist through the real API",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-E07 PRES-W01 PRES-J04] keyboard command navigation and legacy workspace entry preserve the selected job",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "redesign-preservation.spec.ts",
|
||||
"title": "[PRES-A01 PRES-S04 PRES-E07] non-admin navigation cannot grant API privileges or unlock CV AI",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] light/en/1440 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] light/en/390 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] light/nb/1440 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] light/nb/390 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E07 PRES-E08 PRES-J05 PRES-J07] light loaded status semantics, navigation and command focus",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-C06 PRES-C07 PRES-C08 PRES-C09 PRES-C11 PRES-S03] light loaded CV tabs, selects and settings",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] dark/en/1440 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] dark/en/390 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] dark/nb/1440 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-J08] dark/nb/390 loading → error → retry → empty → populated",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E07 PRES-E08 PRES-J05 PRES-J07] dark loaded status semantics, navigation and command focus",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "semantic-foundations.spec.ts",
|
||||
"title": "[PRES-E08 PRES-C06 PRES-C07 PRES-C08 PRES-C09 PRES-C11 PRES-S03] dark loaded CV tabs, selects and settings",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "settings-page-layout.spec.ts",
|
||||
"title": "[PRES-E07 E08 E09 S03 S04 S05 J05 J10 M06 W11] light/en Settings headings, reflow and retained actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "settings-page-layout.spec.ts",
|
||||
"title": "[PRES-E07 E08 E09 S03 S04 S05 J05 J10 M06 W11] light/nb Settings headings, reflow and retained actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "settings-page-layout.spec.ts",
|
||||
"title": "[PRES-E07 E08 E09 S03 S04 S05 J05 J10 M06 W11] dark/en Settings headings, reflow and retained actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "settings-page-layout.spec.ts",
|
||||
"title": "[PRES-E07 E08 E09 S03 S04 S05 J05 J10 M06 W11] dark/nb Settings headings, reflow and retained actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 E08 A03] light-en mobile labels, focus and admin reflow",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 J03 J08] light-en command list, keyboard and no-write actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-02 PRES-E07 E08 E09 S02] light-en utility search and notification states",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E08 C06 S05] light-en real Tooltip contrast and open-toast action access",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-01 PRES-E07 E08 A03] light-en grouped shell, rail menu and route focus",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 E09 C06 S02 S03] light-en dirty editor survives shell utilities and cancel",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 E08 A03] light-nb mobile labels, focus and admin reflow",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 J03 J08] light-nb command list, keyboard and no-write actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-02 PRES-E07 E08 E09 S02] light-nb utility search and notification states",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E08 C06 S05] light-nb real Tooltip contrast and open-toast action access",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-01 PRES-E07 E08 A03] light-nb grouped shell, rail menu and route focus",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 E08 A03] dark-en mobile labels, focus and admin reflow",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 J03 J08] dark-en command list, keyboard and no-write actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-02 PRES-E07 E08 E09 S02] dark-en utility search and notification states",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E08 C06 S05] dark-en real Tooltip contrast and open-toast action access",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-01 PRES-E07 E08 A03] dark-en grouped shell, rail menu and route focus",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 E08 A03] dark-nb mobile labels, focus and admin reflow",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 J03 J08] dark-nb command list, keyboard and no-write actions",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-02 PRES-E07 E08 E09 S02] dark-nb utility search and notification states",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E08 C06 S05] dark-nb real Tooltip contrast and open-toast action access",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-01 PRES-E07 E08 A03] dark-nb grouped shell, rail menu and route focus",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "shell-readiness.spec.ts",
|
||||
"title": "[P5-00 PRES-E07 E09 C06 S02 S03] dark-nb dirty editor survives shell utilities and cancel",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "API liveness and database readiness are separate public probes",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "public plans stay honest, responsive and keyboard accessible",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "login establishes an authenticated session",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "a Free account keeps manual work available while AI actions stay honestly locked",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "a saved job can be created through the reviewed UI flow",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "the dedicated application workspace survives deep links, long data and unsaved navigation",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "Career Workspace loads from the authenticated application shell",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "a public CV renders anonymously and downloads as PDF",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "smoke.spec.ts",
|
||||
"title": "the Code template exports a long structured CV as searchable multi-page PDF",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "table-density.spec.ts",
|
||||
"title": "[PRES-J05 J06 W01 W02 S03 E08 E09] light/en table and cards preserve behavior at both densities",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "table-density.spec.ts",
|
||||
"title": "[PRES-J05 J06 W01 W02 S03 E08 E09] light/nb table and cards preserve behavior at both densities",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "table-density.spec.ts",
|
||||
"title": "[PRES-J05 J06 W01 W02 S03 E08 E09] dark/en table and cards preserve behavior at both densities",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"file": "table-density.spec.ts",
|
||||
"title": "[PRES-J05 J06 W01 W02 S03 E08 E09] dark/nb table and cards preserve behavior at both densities",
|
||||
"expectedStatus": "passed",
|
||||
"outcome": "expected",
|
||||
"actualStatuses": [
|
||||
"passed"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
[
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, light)",
|
||||
"evidence": {
|
||||
"packageCapture": true,
|
||||
"dirtyAnswersKeptAndExplicitlySaved": true,
|
||||
"currentVsFrozenSeparated": true,
|
||||
"personalNotesSeparate": true,
|
||||
"checklistWriteSucceeded": true,
|
||||
"legacyCvLetterCommunicationNotes": true,
|
||||
"followModePreserved": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (en, dark)",
|
||||
"evidence": {
|
||||
"packageCapture": true,
|
||||
"dirtyAnswersKeptAndExplicitlySaved": true,
|
||||
"currentVsFrozenSeparated": true,
|
||||
"personalNotesSeparate": true,
|
||||
"checklistWriteSucceeded": true,
|
||||
"legacyCvLetterCommunicationNotes": true,
|
||||
"followModePreserved": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, light)",
|
||||
"evidence": {
|
||||
"packageCapture": true,
|
||||
"dirtyAnswersKeptAndExplicitlySaved": true,
|
||||
"currentVsFrozenSeparated": true,
|
||||
"personalNotesSeparate": true,
|
||||
"checklistWriteSucceeded": true,
|
||||
"legacyCvLetterCommunicationNotes": true,
|
||||
"followModePreserved": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01–W11 E08 E09] native Job sections retain drafts, frozen documents, tasks and history (nb, dark)",
|
||||
"evidence": {
|
||||
"packageCapture": true,
|
||||
"dirtyAnswersKeptAndExplicitlySaved": true,
|
||||
"currentVsFrozenSeparated": true,
|
||||
"personalNotesSeparate": true,
|
||||
"checklistWriteSucceeded": true,
|
||||
"legacyCvLetterCommunicationNotes": true,
|
||||
"followModePreserved": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change",
|
||||
"evidence": {
|
||||
"packageId": 5,
|
||||
"version": 1,
|
||||
"cvVariantId": 20,
|
||||
"cvVariantVersion": 1,
|
||||
"attachment": {
|
||||
"name": "evidence.txt",
|
||||
"sha256": "4a89d7c5a8430781d00cb8a09550fe69c5dac43f571a8a83843347a5d69d9366",
|
||||
"bytes": 31
|
||||
},
|
||||
"immutableReadback": true,
|
||||
"canonicalAndVariantAndLetterAndAnswerMutated": true,
|
||||
"liveAttachmentDeleted": true,
|
||||
"siblingUnchanged": true,
|
||||
"detachPreservedVariant": true
|
||||
}
|
||||
}
|
||||
]
|
||||
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 103 KiB |
|
After Width: | Height: | Size: 103 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 90 KiB |