test(a3): seal confirmation date and native discovery follow-up

This commit is contained in:
cesnimda
2026-11-11 08:04:44 +01:00
parent df8f4dbbd3
commit d027754d15
15 changed files with 2178 additions and 2 deletions
@@ -0,0 +1,28 @@
# IM10 confirmation, date and native discovery follow-up
Application source `5a880a6ac711db53cdcab01146542f94694a6275` adds the bounded fixes below. Native discovery caller/evidence integration is `df8f4dbbd33dc9001ae9dd4965b5d6a1b0e55748`. This report records development verification. Final A3 Gate F remains open.
## Confirmation focus
The real mobile saved-search deletion journey reproduced Cancel losing initial focus when confirmation opens above the filter Drawer. The active element was the confirmation's presentation container. Shared `ConfirmProvider` now recovers Cancel on opening-transition completion only while focus remains on that exact container. Deliberate focus already moved inside the dialog is preserved. Focus enforcement, cancellation, restoration and confirmed writes retain their existing owners.
The deterministic new case failed before the fix while three existing confirmation cases passed. The final selected confirmation/discovery run passed 34 cases, including the prior deliberate-focus transition regression. Raw red/green/type/lint receipts are in `evidence/im10-followup-2026-11-11/`.
## Calendar-day inputs
Add/Edit picker wrappers now parse literal dates as local calendar days and format the selected local day. The seven controls retain their request and revision contracts. Add's initial and successful-reset default now uses local today. Existing reopening draft retention remains intact. [Calendar-day report](../i18n/DATE_PICKER_CALENDAR_DAY.md) records the actual component callbacks and exact payloads.
Seven component cases passed separately in Los Angeles, Oslo and Kiritimati processes. They include EN/NB, all seven controls, null/invalid callbacks, exact creation/save payloads, revision7 and two fixed UTC clocks around midnight. The previous five cases and nearby suite overlap these results. These are seven cases executed in three environments. Actual MUI date-widget browser interaction and native devices remain unexecuted for this date package.
## Integrated checks and native browser evidence
- 96 selected frontend tests in 11 suites passed together on `5a880a6a`. Full application lint and export/build with TypeScript passed. Earlier 67, 34 and nearby date counts overlap this combined run.
- Both complete existing native discovery specs passed together, 11 tests with zero skips/retries/flaky outcomes, on `ec57a24d` plus the exact confirmation fix. The separate date package was not included in that browser source. Its controls are outside those saved-search journeys. [Native reconciliation](DISCOVERY_NATIVE_DRAWER_RECONCILIATION.md) preserves the source hashes, failed/intermediate receipts and final combined native JSON/list.
- Native JSON embeds all 31 screenshots and 27 accessibility-audit attachments. Root independently inspected the final counters and screenshot bodies, verified all 20 compressed/raw receipt hashes and four raw working-source hashes, and matched those sources to Git after LF normalization. Native owner reads/writes/foreign denials remain actual disposable SQLite API calls; provider-shaped search/run results retain their documented fixtures.
- The earlier controlled drawer36/108 and saved16/48 matrices remain their own source-bound receipts. They were not repeated by this native package. Earlier page-query/rules tests remain separately scoped.
## Remaining qualifications
Legacy Edit timestamp loading and Company/Jobs date display still need a qualified date-versus-timestamp contract. The current fix preserves legacy parsing/loading and does not rewrite persisted records or reconstruct timezone/precision metadata. These findings are tracked in the date report.
Complete route/visual consistency review, affected broader regression, human/device/native-language checks and final A3 review remain open. Provider/model activation, integrated security, actual recovery, hosted/production and final release qualifications retain their separate gates. Rollback reverts the confirmation/date source commits and reruns affected checks before publication.
@@ -5,7 +5,7 @@ Owner addendum received 9 November 2026. Source `E:/Storage/Projects/Active/temp
| Work package | Next independently eligible slice | Gate or residual requirement | | Work package | Next independently eligible slice | Gate or residual requirement |
| --- | --- | --- | | --- | --- | --- |
| Admin information isolation | The original redaction patch passed 62 tests on the security branch. [A3 integration](ADMIN_AUDIT_ISOLATION_VALIDATION.md) matched the exact source/test patch and passed 57 selected tests. The runs overlap and remain separate evidence. | Integrated security, remaining delivery paths, broader minimisation and deployment checks remain separate. | | Admin information isolation | The original redaction patch passed 62 tests on the security branch. [A3 integration](ADMIN_AUDIT_ISOLATION_VALIDATION.md) matched the exact source/test patch and passed 57 selected tests. The runs overlap and remain separate evidence. | Integrated security, remaining delivery paths, broader minimisation and deployment checks remain separate. |
| Discover Jobs | [Search-first layout](visual-correction/DISCOVERY_SEARCH_FIRST.md) and [mobile filter drawer](visual-correction/DISCOVERY_MOBILE_FILTERS.md) qualify existing NAV search, retained drafts, keyboard submit, source disclosure and responsive focus. | Expose new filters, map and multilingual suggestions only with qualified data and the existing GJ architecture. Focused detail and broader saved-search browser qualification remain open. | | Discover Jobs | [Search-first layout](visual-correction/DISCOVERY_SEARCH_FIRST.md), [mobile filters](visual-correction/DISCOVERY_MOBILE_FILTERS.md) and [all11 native discovery cases](DISCOVERY_NATIVE_DRAWER_RECONCILIATION.md) qualify retained drafts, keyboard/focus and bounded local saved-search persistence. | Expose new filters, map and multilingual suggestions only with qualified data and the existing GJ architecture. Focused detail, actual provider-run persistence and native/owner acceptance remain open. |
| Applications | [Title-first rows and explicit bulk mode](visual-correction/APPLICATION_SELECTION_REVIEW.md) and [compact row actions](visual-correction/APPLICATION_ACTIONS_REVIEW.md) qualified at 36 configurations each. | Final native/visual review and broader server-backed workflows remain open. | | Applications | [Title-first rows and explicit bulk mode](visual-correction/APPLICATION_SELECTION_REVIEW.md) and [compact row actions](visual-correction/APPLICATION_ACTIONS_REVIEW.md) qualified at 36 configurations each. | Final native/visual review and broader server-backed workflows remain open. |
| Admin Users and Audit | [Compact user actions](visual-correction/ADMIN_USER_ACTIONS_REVIEW.md) preserve alignment and read-only 2FA. [Recent audit filtering and details](visual-correction/AUDIT_FILTERS_REVIEW.md) passed its own 36-configuration checks. Additional audit filters remain open. | 2FA recovery and private support access require explicit owner approval of their technical and privacy designs. | | Admin Users and Audit | [Compact user actions](visual-correction/ADMIN_USER_ACTIONS_REVIEW.md) preserve alignment and read-only 2FA. [Recent audit filtering and details](visual-correction/AUDIT_FILTERS_REVIEW.md) passed its own 36-configuration checks. Additional audit filters remain open. | 2FA recovery and private support access require explicit owner approval of their technical and privacy designs. |
| Job Correspondence | Continue inbox layout, mailbox-status presentation and existing explicit consent flow. | Provider verification, restricted scopes, multiple-account persistence and retention decisions retain their gates. Signing in grants no mailbox access. | | Job Correspondence | Continue inbox layout, mailbox-status presentation and existing explicit consent flow. | Provider verification, restricted scopes, multiple-account persistence and retention decisions retain their gates. Signing in grants no mailbox access. |
+2
View File
@@ -2,6 +2,8 @@
Applications runtime `bfbfaeb9` consolidates existing row controls into one keyboard menu while preserving selection, status, edit, Trash and Restore. See [application action review](visual-correction/APPLICATION_ACTIONS_REVIEW.md). Applications runtime `bfbfaeb9` consolidates existing row controls into one keyboard menu while preserving selection, status, edit, Trash and Restore. See [application action review](visual-correction/APPLICATION_ACTIONS_REVIEW.md).
The [11 November follow-up](IM10_FOLLOWUP_2026-11-11.md) records shared confirmation recovery, calendar-day input/default fixes, 96 combined frontend tests and both reconciled native discovery specs passing11 cases. Broader route/visual/human qualification and final Gate F remain open.
Discovery runtime `4f3541e5` adds the existing mobile filter drawer with 36 controlled configurations and one server-backed keyboard/import case. Application density follow-up `64603f56` passed all four server-backed EN/NB/theme cases. See [drawer review](visual-correction/DISCOVERY_MOBILE_FILTERS.md) and [density verification](visual-correction/APPLICATION_DENSITY_SERVER_REVIEW.md). Broader historical saved-search mobile sequences and final acceptance remain open. Discovery runtime `4f3541e5` adds the existing mobile filter drawer with 36 controlled configurations and one server-backed keyboard/import case. Application density follow-up `64603f56` passed all four server-backed EN/NB/theme cases. See [drawer review](visual-correction/DISCOVERY_MOBILE_FILTERS.md) and [density verification](visual-correction/APPLICATION_DENSITY_SERVER_REVIEW.md). Broader historical saved-search mobile sequences and final acceptance remain open.
Admin Users runtime `171a6908` groups existing row actions into one keyboard menu. See [Admin action evidence](visual-correction/ADMIN_USER_ACTIONS_REVIEW.md). Admin Users runtime `171a6908` groups existing row actions into one keyboard menu. See [Admin action evidence](visual-correction/ADMIN_USER_ACTIONS_REVIEW.md).
@@ -0,0 +1,23 @@
> job-tracker-ui@0.1.0 build
> node --max-old-space-size=4096 ./node_modules/next/dist/bin/next build
▲ Next.js 16.4.1 (Turbopack)
✓ Running next.config.js took 29ms
Creating an optimized production build ...
✓ Compiled successfully in 767ms
Running TypeScript ...
Finished TypeScript in 6.5s ...
Collecting page data using 4 workers ...
Generating static pages using 4 workers (0/3) ...
✓ Generating static pages using 4 workers (3/3) in 816ms
Finalizing page optimization ...
Route (app)
┌ ○ /
└ ○ /_not-found
○ (Static) prerendered as static content
@@ -0,0 +1,96 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand confirm.test.tsx
console.error
An update to ForwardRef(ButtonBase) inside a test was not wrapped in act(...).
When testing, code that causes React state updates should be wrapped into act(...):
act(() => {
/* fire events that update state */
});
/* assert on the output */
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
34 | const messageRegion = screen.getByRole('region', { name: 'Delete job' });
35 | expect(messageRegion).toHaveAttribute('tabindex', '0');
> 36 | messageRegion.focus();
| ^
37 | expect(messageRegion).toHaveFocus();
38 | });
39 |
at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
at node_modules/@mui/material/ButtonBase/ButtonBase.js:162:7
at node_modules/@mui/material/ButtonBase/ButtonBase.js:290:7
at node_modules/@mui/utils/useEventCallback/useEventCallback.js:24:19
at executeDispatch (node_modules/react-dom/cjs/react-dom-client.development.js:19116:9)
at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
at processDispatchQueue (node_modules/react-dom/cjs/react-dom-client.development.js:19166:19)
at node_modules/react-dom/cjs/react-dom-client.development.js:19767:9
at batchedUpdates$1 (node_modules/react-dom/cjs/react-dom-client.development.js:3255:40)
at dispatchEventForPluginEventSystem (node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
at dispatchEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
at dispatchDiscreteEvent (node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
at HTMLBodyElement.callTheUserObjectsOperation (node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30)
at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25)
at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:286:3)
at HTMLButtonElementImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:233:9)
at Object.exports.fireFocusEventWithTargetAdjustment (node_modules/jsdom/lib/jsdom/living/helpers/focusing.js:103:10)
at HTMLDivElementImpl.focus (node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js:58:16)
at HTMLDivElement.focus (node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js:128:34)
at Object.focus (src/confirm.test.tsx:36:17)
console.error
An update to ForwardRef(TouchRipple) inside a test was not wrapped in act(...).
When testing, code that causes React state updates should be wrapped into act(...):
act(() => {
/* fire events that update state */
});
/* assert on the output */
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
at node_modules/react-dom/cjs/react-dom-client.development.js:18758:19
at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:874:13)
at warnIfUpdatesNotWrappedWithActDEV (node_modules/react-dom/cjs/react-dom-client.development.js:18757:9)
at scheduleUpdateOnFiber (node_modules/react-dom/cjs/react-dom-client.development.js:16409:11)
at dispatchSetStateInternal (node_modules/react-dom/cjs/react-dom-client.development.js:9170:13)
at dispatchSetState (node_modules/react-dom/cjs/react-dom-client.development.js:9127:7)
at Object.stop (node_modules/@mui/material/ButtonBase/TouchRipple.js:292:5)
at node_modules/@mui/material/useLazyRipple/useLazyRipple.js:74:47
FAIL src/confirm.test.tsx
● finishing the opening transition recovers Cancel from the nested-modal container fallback
expect(element).toHaveFocus()
Expected element with focus:
<button class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary css-1dn15bh-MuiButtonBase-root-MuiButton-root" tabindex="0" type="button">Cancel<span class="MuiTouchRipple-root css-r3djoj-MuiTouchRipple-root" /></button>
Received element with focus:
<div class="MuiDialog-container MuiDialog-scrollPaper css-19do60a-MuiDialog-container" role="presentation" style="opacity: 1; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" tabindex="-1"><div aria-describedby="_r_f_" aria-labelledby="_r_g_" aria-modal="true" class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation24 MuiDialog-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthXs MuiDialog-paperFullWidth css-n24a7g-MuiPaper-root-MuiDialog-paper" role="dialog" style="--Paper-shadow: 0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12);"><h2 class="MuiTypography-root MuiTypography-h6 MuiDialogTitle-root css-rcehg8-MuiTypography-root-MuiDialogTitle-root" id="_r_g_">Delete job</h2><div aria-labelledby="_r_g_" class="MuiDialogContent-root css-kw13he-MuiDialogContent-root" role="region" tabindex="0"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation0 MuiAlert-root MuiAlert-colorWarning MuiAlert-outlinedWarning MuiAlert-outlined css-15us3fl-MuiPaper-root-MuiAlert-root" role="alert" style="--Paper-shadow: none;"><div class="MuiAlert-icon css-1wrdnka-MuiAlert-icon"><svg aria-hidden="true" class="MuiSvgIcon-root MuiSvgIcon-fontSizeInherit css-1ckov0h-MuiSvgIcon-root" data-testid="ReportProblemOutlinedIcon" focusable="false" viewBox="0 0 24 24"><path d="M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z" /></svg></div><div class="MuiAlert-message css-zioonp-MuiAlert-message">This action may be hard to undo.</div></div><p class="MuiTypography-root MuiTypography-body1 css-3yi46c-MuiTypography-root" id="_r_f_">Are you sure?</p></div><div class="MuiDialogActions-root MuiDialogActions-spacing css-1uwjd7y-MuiDialogActions-root"><button class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary css-1dn15bh-MuiButtonBase-root-MuiButton-root" tabindex="0" type="button">Cancel<span class="MuiTouchRipple-root css-r3djoj-MuiTouchRipple-root" /></button><button class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedError MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-colorError MuiButton-root MuiButton-contained MuiButton-containedError MuiButton-sizeMedium MuiButton-containedSizeMedium MuiButton-colorError css-1c26q6j-MuiButtonBase-root-MuiButton-root" tabindex="0" type="button">Delete</button></div></div></div>
79 | expect(container).toHaveFocus();
80 | await act(async () => { jest.advanceTimersByTime(1000); });
> 81 | expect(screen.getByRole('button', { name: 'Cancel' })).toHaveFocus();
| ^
82 | } finally {
83 | jest.useRealTimers();
84 | }
at Object.toHaveFocus (src/confirm.test.tsx:81:60)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 3 passed, 4 total
Snapshots: 0 total
Time: 3.412 s
Ran all test suites matching confirm.test.tsx.
@@ -0,0 +1,10 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand confirm.test.tsx confirm-flow.test.tsx dialog-flow.test.tsx job-discovery.test.tsx
Test Suites: 4 passed, 4 total
Tests: 34 passed, 34 total
Snapshots: 0 total
Time: 18.477 s
Ran all test suites matching confirm.test.tsx|confirm-flow.test.tsx|dialog-flow.test.tsx|job-discovery.test.tsx.
@@ -0,0 +1,4 @@
> job-tracker-ui@0.1.0 typecheck
> tsc --noEmit --incremental false
@@ -0,0 +1,4 @@
> job-tracker-ui@0.1.0 typecheck
> tsc --noEmit --incremental false
@@ -0,0 +1,10 @@
> job-tracker-ui@0.1.0 test
> jest --runInBand job-table-density.test.tsx jobs-view-integration.test.tsx workflow-trust-signals.test.tsx job-discovery.test.tsx confirm.test.tsx confirm-flow.test.tsx dialog-flow.test.tsx job-date-picker-calendar.test.tsx edit-job-revision.test.tsx quick-capture.test.tsx file-picker-activation.test.tsx
Test Suites: 11 passed, 11 total
Tests: 96 passed, 96 total
Snapshots: 0 total
Time: 54.244 s, estimated 61 s
Ran all test suites matching job-table-density.test.tsx|jobs-view-integration.test.tsx|workflow-trust-signals.test.tsx|job-discovery.test.tsx|confirm.test.tsx|confirm-flow.test.tsx|dialog-flow.test.tsx|job-date-picker-calendar.test.tsx|edit-job-revision.test.tsx|quick-capture.test.tsx|file-picker-activation.test.tsx.
@@ -0,0 +1,4 @@
> job-tracker-ui@0.1.0 lint
> eslint . --max-warnings=0
@@ -14,6 +14,6 @@ The exported UI passed 36 controlled journeys and 108 axe scans/captures across
One server-backed browser case passed using Playwright's isolated SQLite/API and Next development servers. Keyboard navigation reaches the mobile drawer, Enter from municipality searches, results sort and reflow across 375/768/1440 px, and the selected vacancy opens reviewed import. Vacancy and import-preview responses were fixtures. The real local server log includes a cancelled dashboard-preferences request logged as HTTP 500 during navigation. That log remains in the evidence and does not establish a successful response for that cancelled request. One server-backed browser case passed using Playwright's isolated SQLite/API and Next development servers. Keyboard navigation reaches the mobile drawer, Enter from municipality searches, results sort and reflow across 375/768/1440 px, and the selected vacancy opens reviewed import. Vacancy and import-preview responses were fixtures. The real local server log includes a cancelled dashboard-preferences request logged as HTTP 500 during navigation. That log remains in the evidence and does not establish a successful response for that cancelled request.
This package uses the current NAV search contract. New geography, taxonomy, map, providers and data persistence retain their roadmap dependencies. The broader historical phase7 discovery/saved-search browser suites need their mobile sequences reconciled with the drawer and remain unexecuted for this increment. Native-device and final owner acceptance remain open. This package uses the current NAV search contract. New geography, taxonomy, map and providers retain their roadmap dependencies. The historical phase7 discovery/saved-search suites have since been reconciled and passed all11 cases in [native reconciliation](../DISCOVERY_NATIVE_DRAWER_RECONCILIATION.md), with their exact local API/provider-fixture boundaries. Native-device, actual provider-run persistence and final owner acceptance remain open.
The existing controlled verifier modes have since been reconciled in [saved-search follow-up](DISCOVERY_SAVED_DRAWER.md), with 16 saved-search configurations and separate search/tracking pilots. These retain the separate persistent-state qualification above. The existing controlled verifier modes have since been reconciled in [saved-search follow-up](DISCOVERY_SAVED_DRAWER.md), with 16 saved-search configurations and separate search/tracking pilots. These retain the separate persistent-state qualification above.
@@ -44,6 +44,8 @@ Owner correction: 3 November 2026. This register extends IM10 and the original 3
| V34 | Application row actions | Repeated edit, Trash and status controls crowd rows and phone cards | RESOLVED in `bfbfaeb9` | [Application actions review](APPLICATION_ACTIONS_REVIEW.md) covers named keyboard menus, focus, Restore and responsive boundaries. Native and final owner review remain open. | | V34 | Application row actions | Repeated edit, Trash and status controls crowd rows and phone cards | RESOLVED in `bfbfaeb9` | [Application actions review](APPLICATION_ACTIONS_REVIEW.md) covers named keyboard menus, focus, Restore and responsive boundaries. Native and final owner review remain open. |
| V35 | Application density | Long custom status squeezes the selected phone title; selected dark listing links fall below AA | RESOLVED in `64603f56` | [Server verification](APPLICATION_DENSITY_SERVER_REVIEW.md) retains failures and all four passing cases. | | V35 | Application density | Long custom status squeezes the selected phone title; selected dark listing links fall below AA | RESOLVED in `64603f56` | [Server verification](APPLICATION_DENSITY_SERVER_REVIEW.md) retains failures and all four passing cases. |
| V36 | Discovery mobile filters | The full filter and saved-search rail pushes phone results down the page | RESOLVED in `4f3541e5` scoped validation | [Drawer review](DISCOVERY_MOBILE_FILTERS.md) retains draft, form and focus checks. Broader saved-search/native qualification remains open. | | V36 | Discovery mobile filters | The full filter and saved-search rail pushes phone results down the page | RESOLVED in `4f3541e5` scoped validation | [Drawer review](DISCOVERY_MOBILE_FILTERS.md) retains draft, form and focus checks. Broader saved-search/native qualification remains open. |
| V37 | Shared confirmation | A confirmation opened over the filter Drawer can leave initial focus on its presentation container | RESOLVED in `df93bfb6` | [Follow-up](../IM10_FOLLOWUP_2026-11-11.md) includes red unit/native proof, preserved deliberate focus and all11 final native discovery cases. |
| V38 | Add/Edit dates | Date-only picker values shift through UTC, and Add defaults to UTC today | RESOLVED in `265794e0` / `5a880a6a` | Seven cases in each of three timezone processes, exact payloads, null/invalid values and successful reset checked. Legacy timestamp loading and Company/Jobs display semantics remain separate. |
The owner-approved design foundation remains original A1 dashboard, D1 visual system, B1 tracking, editor left / preview right, application context right, desktop sidebar and hybrid mobile navigation. No controls, imports, revisions, permissions or provider rights may be removed to obtain visual simplicity. The owner-approved design foundation remains original A1 dashboard, D1 visual system, B1 tracking, editor left / preview right, application context right, desktop sidebar and hybrid mobile navigation. No controls, imports, revisions, permissions or provider rights may be removed to obtain visual simplicity.
File diff suppressed because it is too large Load Diff