fix(jobs): align table and board query contracts

This commit is contained in:
cesnimda
2026-09-29 17:26:08 +02:00
parent 42a696bc86
commit 6fc8937701
21 changed files with 541 additions and 100 deletions
+3 -1
View File
@@ -24,7 +24,7 @@ Reconciled against [P4-06](../phase-4/p4-06/README.md#opendeferred-issue-reconci
| 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 |
| Table/Board filter/population mismatch | Existing distinct reads; not a new vulnerability | **Blocks P5-04b** alias/integration, not P5-04a visuals or other screens; separately define/prove owner-scoped bounded read parity |
| Table/Board filter/population mismatch | **Read prerequisite resolved in [P5-04b readiness](p5-04b-readiness/README.md)**: shared logical query, complete ID membership, owner/trash/derived filters and mutation refresh proven | **GO for P5-04b** with existing full-array scaling limits documented; integration itself remains unimplemented and must preserve query/route state |
| P3-O01 analytics names/periods/populations | Open source-confirmed semantic limitations | **Blocks P5-06/07 accurate presentation acceptance**; labels/values tests within those slices, backend metrics/data repair separate |
| F04/B06 production ingress | **Open**; repository/local checks are not deployed proof. Historical DNS/HTTPS observations do not prove actual peer/firewall boundary or current topology | **Production gate; does not block local P5 slices**. Operator evidence for actual Traefik peer, nginx trust, listeners/ports, direct/spoofed access, B04 client IP, firewall/NAT/IPv6, DNS/TLS/redirect and restart needed; no closure or credentials accessed here |
| Protected-main CI/browser runner and deployment | Unresolved remote-runner evidence; local tests pass | **Separate release gate**; feature-branch docs/UI push is not production deployment approval |
@@ -35,6 +35,8 @@ Reconciled against [P4-06](../phase-4/p4-06/README.md#opendeferred-issue-reconci
| Stripe activation, paid deletion/retention/provider cleanup | Configuration/policy/provider proof pending; deletion remains gated | **Separate product/backend/release work**; no new billing/trial/delete UX claims or Settings migration |
| Provider mail/AI/calendar/OAuth delivery | Partial local mocks/service tests, no universal live provider certification | **Does not block unchanged navigation/presentation**; actual send/reconnect/provider semantics changes wait for sandbox/operator proof. AI truthfulness is not guaranteed by a review dialog |
| Full screen-reader/touch/zoom/forced-colors coverage | P4 manual browser checks partial; incomplete axe nodes remain | **Affected-slice accessibility acceptance gates** per visual protocol; unavailable evidence must stay open, not counted as success. Public certification remains blocked |
| P5-04b-R01 command entry/focus timing | One full-run failure on unchanged command/theme/test code; trace shows keyboard focus-visible gained then lost around the dialog's entry callback. Three unchanged focused reruns passed | **Separate shell accessibility debt before P5-15**, not query-population parity. [Observation](p5-04b-readiness/README.md#unrelated-baseline-observation-p5-04b-r01); no assertion weakened or shell repair attempted |
| P5-04b-R02 CV section-expansion smoke | One full-run failure on unchanged CV editor/test, before PDF export; three unchanged focused reruns passed; cause unproven | **Existing CV readiness owner**, not Jobs integration. [Observation](p5-04b-readiness/README.md#unrelated-baseline-observation-p5-04b-r02); keep the regression and investigate before broad CV migration |
| Historical post-axe NB glyph omissions / scrolled table screenshot edges | Capture limitations, not accepted typography/column alignment | **Evidence quality gate**: pre-axe captures, DOM/text verification, start-of-scroll and focused-scroll comparisons in P5. No product fix inferred without reproducing it |
| Original P4 unnamed targeted controls / preview keyboard defect | Closed for P4-02/03 targets only | **Not a blocker**, retain tests; advanced untouched controls still need their own loaded-state proof |
| Historical TS2571 | No longer present; standalone gate passed | **Not a blocker**, retain CI type gate; do not describe as current expected failure |
+2
View File
@@ -24,6 +24,8 @@ Exit: focused reproduction now passes, no general axe exclusions, final complete
## G-JOBS — before table/board consolidation
**Current query gate: GO after [P5-04b readiness](p5-04b-readiness/README.md).** Both existing endpoints now use one server query, the separate clients share URL interpretation, and native membership/refresh/ownership evidence passes. Full Board population remains O(N), not one Table page; see the explicit performance ceiling. Integration has not begun. The paragraphs below preserve the original prerequisite and why the readiness checkpoint was necessary.
Before P5-03, extend PRES-J05/J06 behavioral coverage for saved-view create/select/delete, filtered selection, partial bulk failures, column/page preferences, custom-status URLs, Back/refresh, capture review without writes and 320px actions. Preserve current local Comfortable default; density is neither server-persisted nor a CV setting.
Before P5-04b, prove the actual data contract. `JobTable` calls paginated `/jobapplications` with search/company/status/location/readiness/follow-up/sort/deletion filters. `KanbanBoard` calls `/jobapplications/board` without those parameters; that API accepts only `includeDeleted`, returns all matching non-deleted records by default and has its own ordering. **Parity does not exist today.**
+2 -2
View File
@@ -1,6 +1,6 @@
# Phase 5 — Representative screens / major UI redesign plan
**Current successor: [P5-02 Global shell utilities](p5-02/README.md), implementation verified with conditional accessibility acceptance.** The first major visible redesign, P5-01, grouped existing destinations without changing the 31-pattern route/provider contract. P5-02 retains existing commands and notifications while fixing search error/stale-result semantics. A manual screen-reader utility task is still required before automatic P5-03 progression. B07 has not started; F04 remains open.
**Current successor: [P5-04b query readiness](p5-04b-readiness/README.md), GO for the shared-read prerequisite.** P5-01–P5-04a implementation records remain authoritative for their scopes. The separate Table and Board now share proven logical query membership; Table/Board integration has not begun. P5-02 manual screen-reader acceptance remains mandatory for P5-15 and does not block independent Jobs work. P2-D01, F04, native touch verification and recorded baseline timing observations remain open. B07 has not started.
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.
@@ -22,7 +22,7 @@ Read alongside the [original redesign sequence](../IMPLEMENTATION_PLAN.md), [Pha
Current source inspection confirms:
- App has 31 page/alias patterns, a session-invalidated provider-tree unmount, existing shell groups/collapse and distinct account/Career Profile routes. Preserve React Router and providers; table preferences still participate in router memoization, so characterize rather than assume state lifetime.
- Current `JobTable` and `KanbanBoard` do **not** share filter/read scope. Board API accepts deletion inclusion only and returns the full matching board; a page-sized replacement or early alias would lose behavior. Split board presentation from gated integration.
- At planning time `JobTable` and `KanbanBoard` did **not** share filter/read scope. The [separate readiness checkpoint](p5-04b-readiness/README.md) resolves that prerequisite while retaining complete Board population and paged Table responses. Integration still must not substitute a single Table page for the Board.
- QuickCommandDialog has six commands plus job/company results, not global CV/document search. Notifications already have their own store/actions. Reuse these and repair explicit error/keyboard states, without new producers.
- Analytics reports exist inside Dashboard with two load groups and five owner-local visibility flags. `/analytics` is a new **destination** for existing data, not permission to invent metrics. Documents/global aggregate Admin data are not ready; do not add empty navigation targets.
- The CV editor already has Template/Content/Customize/AI/History, live preview, overrides, undo/history, mobile panes and extensive controls. Keep them. Server revision enforcement remains absent on Save, and preview injects pagination/cropping into rendered HTML. Those facts justify independent integrity/rendering gates before broad CV changes.
@@ -0,0 +1,123 @@
# P5-04b readiness — shared Jobs query
Base: `42a696bc866c3eae17afa618d5ae1290d58db076`. This checkpoint changes only the read/query contract; Table/Board integration remains separate. **Status: complete; GO for the P5-04b query-parity prerequisite.**
## Decision before implementation
The existing `/api/jobapplications/board` already returns the complete owned population in one request. Extend this read with Table's existing query semantics and extract the existing controller query into one private implementation. Keep the Board array response and Table paged DTO response compatible. No new endpoint, schema, browser page crawl, oversized page request, or query framework is needed.
### Previous contracts and reproduction
| Concern | Table `/api/jobapplications` | Board `/api/jobapplications/board` |
|---|---|---|
| Search | SQL LIKE over title/company/notes/correspondence content | Ignored |
| Filters | Exact status (including custom), company, location LIKE; rule-derived follow-up and readiness before pagination | None |
| Scope | Active default; includeDeleted; deletedOnly takes precedence | Active default; includeDeleted |
| Ownership | Authenticated controller and EF current-owner filters on jobs/company/correspondence | Same filters, never bypassed |
| Sort | Whitelisted company/title/status/location/dateApplied/daysSince; asc/desc | DateApplied descending; UI groups by stage then recency |
| Pagination | Page >= 1; pageSize 15/20/25; total before paging | Complete array, no paging |
| URL | q/status/companyId/location/needsFollowUp/readiness/includeDeleted/sortBy/sortDir/page; booleans encoded as 1 | Query retained in navigation but ignored by load |
The native P5-04a fixture had 27 jobs: 26 titles contained `Board`; the remaining Norwegian title did not. Table `q=Board` correctly matched 26 (15 on page 1). Board ignored `q=table-only` and returned 27. This was divergent read capability, not a pagination/counting defect. Original [P5-04a evidence](../p5-04a/README.md) is preserved.
### Shared logical contract
Both reads apply the same server-owned search, exact standard/custom status, company, location, rule-derived filters, deletion scope and tenant boundary. SQL LIKE wildcard/collation behavior is preserved. `deletedOnly` wins over `includeDeleted`. There is no independent archive flag/filter on these reads; submitted-package archives are unrelated. Invalid readiness remains 400. No supplied user/account identifier affects ownership. Unknown statuses remain exact strings, including in Other. Table's existing status-selector catalogue is unchanged; direct/custom status query values remain supported without inventing a custom-status editor or expanding filter controls here.
Table alone paginates, with its existing whitelist. Board's array length is its complete logical total; no silent truncation. Shared sorting adds ascending ID as a stable tie-breaker. Board's existing within-column stage/recency presentation remains intact: membership parity does not require identical visual ordering.
The existing Jobs URL vocabulary is accepted by Board; page position remains Table-only. Both clients default to descending dateApplied; historical direct API omitted-sort defaults remain Table ascending / Board descending for compatibility. An explicit sort has identical server ordering. Existing routes stay separate. The existing Board → Table button retains the query, including a carried Table page; no unified selector or Table → Board switch is introduced. Global shell destinations remain independent fresh routes; P5-04b owns the future two-way switch and compatibility alias. `/trash` still supplies Table's `deletedOnly` scope; there is no new Trash Board UI. Both APIs can read that same deletion scope.
Status mutations reload the server query so a moved job can leave a filtered result. The Board shows its existing loading/error/retry surface while refreshing, rather than actionable stale membership. A write failure retains the card; a committed write followed by read failure hides the outdated Board, and Retry repeats only the read. Focus returns to the moved card if still present, otherwise the first named column. No client-side approximation of rule filters.
### Performance boundary
One Board HTTP read, not N page requests. Normal Table filters retain database pagination. Derived filters already materialize matching candidates before Table pagination; Board necessarily materializes all matching rows. This retains the existing full-array/O(N) Board contract and has no fixed result cap. Stable IDs remove tied-sort page ambiguity, but reads are not a cross-request snapshot under concurrent writes. Large-account Board rendering/response size remains a separate pagination/virtualization concern; do not claim unbounded scalability or silently limit results.
The shared read also obtains the cached account rule settings and latest-correspondence dictionary; on a warm settings cache it executes the correspondence aggregate plus the result query (Table additionally counts). One successful Board mutation costs one PATCH plus one GET; failed refresh Retry is one GET. API cancellation tokens still reach EF operations, and existing authentication/rate controls are unchanged. There is no dedicated Board result-size or account-job-count cap to rely on. The 62-owned-row SQLite corpus proves multi-page completeness, not a production capacity benchmark. No new full-dataset browser cache or persistent preferences are introduced.
## Preservation impact
| Contracts | Existing behavior → parity requirement | Evidence planned |
|---|---|---|
| PRES-J05 | Table search/filter/sort/page/saved query → identical Board membership, unchanged Table pages | Native SQLite membership and browser query cases |
| PRES-J06 | Active/trash/restore → same deletion scopes without mutation changes | Deleted/includeDeleted membership cases; inherited lifecycle suites |
| PRES-J07, PRES-W02 | Grouped/custom statuses and movement → preserve grouping/actions; requery after successful mutation | Board keyboard/pointer/menu/failure cases; filtered-out move |
| PRES-W01 | Open/Back retains URL → retain query and focus | Existing native navigation and filtered Board case |
| PRES-E08, PRES-E09 | Localized errors/retry, account isolation → fail closed on reload; trusted owner only | Retry/ownership cases; inherited session tests |
| PRES-S03 (indirect) | Saved filters/rules/page size → reuse interpretation without preference/schema change | Rule-derived parity and full baseline |
## Open acceptance items
P5-02 manual screen-reader verification remains mandatory for P5-15. P2-D01, F04 production ingress evidence and native touch-drag verification remain open. No integration, new visual design, P5-06 or B07 work is authorized here.
## Implementation and file justification
- `JobApplicationsController.cs`: extract its existing query into private `ReadJobsAsync`; both GETs use it. Board accepts the existing logical filters and retains the raw entity-array response; Table retains DTOs, total and page-size whitelist. Ascending ID breaks equal-sort ties. No ownership filters are bypassed, and no mutation endpoint changes.
- `jobsQuery.ts` / `JobTable.tsx`: extract existing URL interpretation, including invalid-value fallbacks, into a small shared parser. Table's debounce, form state, pagination, saved-view writes, density, selection and row actions remain intact.
- `KanbanBoard.tsx`: submit those query parameters, reload after successful status writes, preserve query in its existing Table link, and restore meaningful focus after reload. No styling, columns, grouping, backend status values, menu actions or route hierarchy changed.
- `translations.ts`: replace the now-false statement that Board ignores query filters, in EN/NB. No new UI workflow.
- `JobQueryParityTests.cs`, `kanban-grouped-board.test.tsx`, `board-presentation.spec.ts`: permanent membership, refresh/failure/focus and native regression evidence. `kanban-theme.spec.ts` only changes its mock URL matcher to include query parameters.
- This record, four synthetic screenshots, readiness/blocker index and TODO updates keep the gate's current status discoverable. The original mismatch evidence remains in P5-04a and history.
## Regression evidence
`JobQueryParityTests` runs 16 native SQLite cases with 62 owned jobs plus a foreign owner's job: unfiltered, search, notes, correspondence, standard status, custom status, combined search/status, no results, company, foreign company, location, follow-up, needs-work, interview, deleted-only and include-deleted. Each compares the ordered Board IDs against every Table page, asserts no duplicates or foreign IDs, verifies nonempty positive cases and relevant exact counts, and preserves readiness validation. Tied dates span more than four Table pages; ordinary Table pages remain at most 15.
Three new frontend cases prove the URL query/ownership exclusion, removal plus focus after a filtered-out move, and committed-write/read-failure recovery without write replay. Existing keyboard, pointer, menu, custom-status, cancellation and failed-write tests remain.
The existing native Board browser case is expanded, not counted as a new case. Seven API query variants compare full ID membership. The 27-job corpus still yields 26 for `q=Board`; Table page 1 has 15. `q=Board&status=Saved` yields 24; moving a matching job to Applied yields 23 and removes exactly that card. The existing Table link keeps the same URL query and shows 15 matching rows; browser Back returns to the 24-card Board. An absent search gives three empty columns and zero cards. The remainder still exercises all four theme/language combinations, 1440/1024/768/390/320 widths, native pointer and keyboard movement, custom status, write failure and workspace Back focus.
## Rendered UI and accessibility evidence
Reviewed the actual browser screenshots below. Query-scoped and empty results retain the P5-04a columns/cards, semantic colors, status text and responsive horizontal Board. Updated NB explanatory copy wraps at phone width without horizontal page overflow. No presentation migration was performed.
- [Filtered query, light/English](evidence/board-filtered-query-light-en.png)
- [Zero-result query, light/English](evidence/board-zero-query-light-en.png)
- [Existing full Board, dark/Bokmål](evidence/board-desktop-dark-nb.png)
- [Phone Board, dark/Bokmål](evidence/board-phone-dark-nb.png)
Native keyboard and pointer checks pass in the focused and final full runs. Board axe checks detect zero violations. Each phone-theme scan has one incomplete color-contrast node; the empty-state scan has one incomplete color-contrast and one aria-prohibited-attr node. These are not certified as passes. [Sanitized final outcome/axe summary](evidence/final-browser-summary.json). Historical post-axe screenshot glyph omissions remain an evidence limitation, not a new typography fix. No spoken-name/live-announcement screen-reader acceptance or native touch certification is claimed.
## Validation ledger
Commands run from repository root unless UI directory is specified. All used the required `rtk` wrapper (`rtk proxy` for unsupported commands). Local .NET executable: `C:/Users/Connor/.dotnet/dotnet.exe`; `DOTNET_ROOT`/`DOTNET_HOST_PATH` identify that installation.
| Command | Result |
|---|---|
| `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj -c Release --no-restore --filter FullyQualifiedName~JobQueryParityTests --logger 'console;verbosity=minimal'` | 16 passed |
| `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj -c Release --no-restore --logger 'console;verbosity=minimal'` | 934 passed: 918 inherited + 16 parity cases |
| UI `npm.cmd test -- --runInBand --silent` | 384 passed in 77 suites: 381 + 3 query/refresh cases |
| UI `npm.cmd run typecheck` | Passed after final application change |
| UI `npm.cmd run lint` | Passed after final application change |
| UI `npm.cmd run build` | Passed; local browser build uses `NEXT_PUBLIC_API_BASE_URL=http://localhost:5302/api`, `CI=false` |
| `dotnet build JobTrackerApi/JobTrackerApi.csproj -c Release --no-restore -warnaserror` | Passed, zero warnings/errors |
| UI `npm.cmd run test:e2e -- e2e/board-presentation.spec.ts e2e/kanban-theme.spec.ts --reporter=line` | 3 passed; also passed in final full run |
| UI `npm.cmd run test:e2e -- --reporter=line` | First full run: 74 actual passes + P2-D01 expected failure (75 reporter passes), 2 unexpected failures below, 12.1 minutes |
| UI `npm.cmd run test:e2e -- --reporter=line,json` | Final full run: **76 actual passes + unchanged P2-D01 expected failure**, no unexpected failures (77 reporter passes), 10.6 minutes. `PLAYWRIGHT_STATIC_EXPORT=true`, `PLAYWRIGHT_PREBUILT_EXPORT=true`; JSON report written locally with `PLAYWRIGHT_JSON_OUTPUT_NAME=test-results/query-readiness-full.json` |
| UI `npm.cmd run test:rate-limits -- --reporter=line` | 9 passed |
| UI `npm.cmd exec playwright test -- --config=playwright.ingress.config.ts --reporter=line` | 6 passed |
| UI `npm.cmd run test:pdf-admission -- --reporter=line` | 1 passed |
| UI `npm.cmd run test:e2e -- e2e/semantic-foundations.spec.ts e2e/smoke.spec.ts --grep 'dark loaded status\|Code template' --repeat-each=3 --reporter=line` | 6 passed: three unchanged repetitions of each unexpected failure; no retry mode or relaxed assertions |
| `python scripts/test-ingress.py` | 3 passed |
| `python scripts/test-supply-chain.py` | 3 passed |
| `python scripts/test-ollama-evaluation.py` | 5 passed |
| `node --test browser-extension/tests/*.test.mjs` | 3 passed |
| `python scripts/supply-chain.py scan-secrets` | Passed with new code/tests staged |
| Local Markdown target existence check; `git diff --check`; `git diff --cached --check` | Passed. Target check does not certify anchor fragments/external URLs |
During development the new URL parser needed an explicit readiness union type, and reload exposed a focus effect running before the refresh finished. Both were corrected and focused tests rerun. One new test used the wrong English menu label (`Set status: Applied` instead of the existing `Set Applied`); the fixture was corrected. No inherited expected failure was weakened.
### Unrelated baseline observation: P5-04b-R01
The first full browser run failed the inherited **dark loaded status/navigation/command focus** case: `toBeFocused` passed, then the outline was 0px instead of 3px. [Sanitized trace timing](evidence/command-focus-timing.json) shows the command acquired `Mui-focusVisible` after Tab at +290ms, then lost it at +311ms. The unchanged `QuickCommandDialog` has a transition `onEntered` that focuses the search input; this is the leading explanation for the late focus loss. The component, theme and test are byte-equivalent (normalizing line endings) to the base checkpoint. This query patch neither changes nor disables their assertions. Three unchanged focused repetitions and the final full run passed; this does not close the timing-sensitive accessibility debt. Owner: shell keyboard/transition validation before P5-15, not the Jobs query contract.
### Unrelated baseline observation: P5-04b-R02
The same full run failed the inherited long Code-template CV smoke case before PDF export: after clicking Expand Experience and Expand Education, Collapse Experience was absent. [Sanitized observation](evidence/cv-smoke-observation.json). The CV editor and smoke test are unchanged from the base; the query patch has no CV route/state/rendering changes. Three unchanged focused repetitions and the final full run passed. Root cause is not established, so this is not claimed fixed or conclusively diagnosed. Owner: existing CV behavior/rendering readiness gate; keep separate from query parity. No assertion was skipped or relaxed.
## Decision
**GO for P5-04b's shared-read prerequisite.** Search/filter/status/custom-status/deletion/owner membership is shared and proven by IDs, with complete Board population and independent Table pagination. No query-parity blocker remains. The existing full-array scaling ceiling and non-snapshot concurrent-data behavior remain explicit limitations, not fabricated guarantees.
The next slice may implement the approved two-way view integration using this contract; it must preserve query state and both route histories, re-run membership/focus checks, and must not replace the Board with one Table page. Rollback is this checkpoint's controller/parser/consumer/test changes together; no schema/data migration is involved. Integration, P5-06 and B07 have **not** begun. Existing production/provider/accessibility/CV gates and the two recorded baseline observations remain open for their owners.
Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

@@ -0,0 +1,54 @@
{
"scope": "Sanitized timing only; no network/identity data",
"observation": "Unchanged command Dialog onEntered focuses the search input after initial keyboard Tab; investigate outside query parity",
"events": [
{
"ms": -194.445,
"key": "Tab"
},
{
"ms": -169.725,
"key": "Shift+Tab"
},
{
"ms": 0.0,
"key": "Control+k"
},
{
"ms": 92.661,
"firstCommandFocusVisible": false
},
{
"ms": 152.212,
"key": "Tab"
},
{
"ms": 174.129,
"firstCommandFocusVisible": true
},
{
"ms": 175.99,
"key": "Shift+Tab"
},
{
"ms": 195.527,
"firstCommandFocusVisible": false
},
{
"ms": 266.717,
"key": "Tab"
},
{
"ms": 289.622,
"firstCommandFocusVisible": true
},
{
"ms": 310.561,
"firstCommandFocusVisible": false
},
{
"ms": 321.389,
"firstCommandFocusVisible": false
}
]
}
@@ -0,0 +1,14 @@
{
"scope": "Unchanged CV smoke failure; no request data or credentials",
"failure": "Expected Collapse Experience after expanding Experience and Education; element absent",
"clicks": [
{
"time": 618946.003,
"selector": "internal:role=button[name=\"Expand Experience\"i]"
},
{
"time": 619121.061,
"selector": "internal:role=button[name=\"Expand Education\"i]"
}
]
}
@@ -0,0 +1,42 @@
{
"outcomes": {
"('passed', 'expected', 'passed')": 76,
"('failed', 'expected', 'failed')": 1
},
"boardAxe": [
{
"name": "board-phone-light-axe",
"violations": 0,
"incomplete": [
{
"rule": "color-contrast",
"nodes": 1
}
]
},
{
"name": "board-phone-dark-axe",
"violations": 0,
"incomplete": [
{
"rule": "color-contrast",
"nodes": 1
}
]
},
{
"name": "board-empty-light-en-axe",
"violations": 0,
"incomplete": [
{
"rule": "aria-prohibited-attr",
"nodes": 1
},
{
"rule": "color-contrast",
"nodes": 1
}
]
}
]
}
+2
View File
@@ -4,6 +4,8 @@ Status reconciled: 2026-09-28.
## Current repository work
- **P5-04b query readiness complete — GO for integration's read prerequisite:** shared server query and URL interpretation, full Board versus paged Table ID parity, refresh/focus and failure evidence. [Record](../redesign/phase-5/p5-04b-readiness/README.md). Baseline: 934 backend, 384 frontend, 76 actual browser passes + unchanged P2-D01 expected failure; security 9/6/1, configuration 3. Earlier unchanged command-focus/CV smoke failures are recorded as R01/R02, not silently closed by passing reruns. No integration, P5-06 or B07 implemented; F04/manual screen-reader/native touch remain open.
- **P5-03 — Jobs Table and mobile cards complete:** restrained table/card presentation, existing Comfortable/Compact controls, localized display, partial-bulk retry, and Browser Back row focus have [real-browser and unit evidence](../redesign/phase-5/p5-03/README.md). Baseline: 918 backend, 377 frontend, 74 actual browser passes plus unchanged P2-D01 expected failure. P5-00-D02 and P4-05-O01 close for Jobs/Trash; P5-02 manual screen-reader acceptance and F04 remain open. Stop before P5-04a.
- **P5-01 — AppShell/grouped navigation complete:** existing destinations are grouped under Dashboard, Job search, Career, Admin and Account; expanded/rail/mobile access, parent/child current semantics, skip/main and route-heading focus have automated and visual evidence. Final baseline: 918 backend, 365 frontend, 70 browser passes plus unchanged P2-D01 expected failure. [Record](../redesign/phase-5/p5-01/README.md). P5-02 remains separate; no route/provider/business change or B07 work.
- **P5-02 — global shell utilities implemented, accessibility acceptance conditional:** command error/retry and stale-result isolation, grouped existing commands, keyboard selection, and notification stale-load/read/dismiss presentation pass 918 backend, 373 frontend and 74 actual browser tests plus unchanged P2-D01 expected failure. [Record](../redesign/phase-5/p5-02/README.md). P5-02-D01's spoken-name and live/state-announcement check remains mandatory for P5-15; it does not block independent P5-03 Jobs work. F04 remains open.