From 223dcf57d26bab624261994b61a46f2d3e2dd5b2 Mon Sep 17 00:00:00 2001 From: cesnimda Date: Wed, 14 Oct 2026 13:03:05 +0200 Subject: [PATCH] fix(ui): preserve compose draft identity and delivery safeguards --- .../EmailDraftsControllerTests.cs | 218 +- .../Controllers/EmailDraftsController.cs | 8 +- docs/redesign/phase-7/COMMITS.md | 8 + docs/redesign/phase-7/DEBT.md | 8 + docs/redesign/phase-7/PRESERVATION.md | 8 + docs/redesign/phase-7/README.md | 10 +- docs/redesign/phase-7/p7-06/COMPOSE.md | 112 + docs/redesign/phase-7/p7-06/INBOX.md | 2 + docs/redesign/phase-7/p7-06/README.md | 58 +- .../phase-7/p7-06/evidence/compose-entry.json | 293 ++ .../p7-06/evidence/compose-results.json | 3223 +++++++++++++++++ .../p7-06/evidence/compose-static-checks.json | 104 + .../phase-7/p7-06/evidence/inbox-results.json | 109 +- docs/roadmap/todo.md | 4 +- .../e2e/phase7-correspondence-compose.spec.ts | 212 ++ .../src/correspondence-inbox-page.test.tsx | 331 ++ job-tracker-ui/src/i18n/translations.ts | 10 +- .../src/views/CorrespondenceInboxPage.tsx | 496 +-- 18 files changed, 4947 insertions(+), 267 deletions(-) create mode 100644 docs/redesign/phase-7/p7-06/COMPOSE.md create mode 100644 docs/redesign/phase-7/p7-06/evidence/compose-entry.json create mode 100644 docs/redesign/phase-7/p7-06/evidence/compose-results.json create mode 100644 docs/redesign/phase-7/p7-06/evidence/compose-static-checks.json create mode 100644 job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts diff --git a/JobTrackerApi.Tests/EmailDraftsControllerTests.cs b/JobTrackerApi.Tests/EmailDraftsControllerTests.cs index 3389bbf..ba4e05d 100644 --- a/JobTrackerApi.Tests/EmailDraftsControllerTests.cs +++ b/JobTrackerApi.Tests/EmailDraftsControllerTests.cs @@ -115,7 +115,7 @@ public sealed class EmailDraftsControllerTests var refused = await controller.NewAttempt(original.Id, new EmailDraftsController.NewAttemptRequest(1), default); Assert.IsType(refused.Result); - db.EmailSendAttempts.Add(new EmailSendAttempt + var failedAttempt = new EmailSendAttempt { Id = Guid.NewGuid(), OwnerUserId = "user-1", @@ -127,7 +127,8 @@ public sealed class EmailDraftsControllerTests FailureCategory = "provider_rejected", CreatedAtUtc = DateTime.UtcNow, CompletedAtUtc = DateTime.UtcNow, - }); + }; + db.EmailSendAttempts.Add(failedAttempt); await db.SaveChangesAsync(); var rotatedResult = await controller.NewAttempt(original.Id, new EmailDraftsController.NewAttemptRequest(1), default); @@ -139,6 +140,218 @@ public sealed class EmailDraftsControllerTests Assert.IsType((await controller.NewAttempt(original.Id, new EmailDraftsController.NewAttemptRequest(1), default)).Result); await using var otherDb = fixture.Context("user-2"); Assert.IsType((await Controller(otherDb, "user-2").NewAttempt(original.Id, new EmailDraftsController.NewAttemptRequest(2), default)).Result); + + await using var verify = fixture.Context("user-1"); + var persisted = await verify.EmailDrafts.AsNoTracking().SingleAsync(); + AssertDraftContentUnchanged(original, persisted); + Assert.Equal(rotated.ClientRequestId, persisted.ClientRequestId); + Assert.Equal(2, persisted.Revision); + var readback = Assert.IsType( + Assert.IsType((await Controller(verify, "user-1").Get(original.Id, default)).Result).Value); + Assert.Equal(rotated, readback); + AssertAttemptUnchanged(failedAttempt, Assert.Single(await verify.EmailSendAttempts.AsNoTracking().ToListAsync())); + } + + [Theory] + [InlineData(EmailSendStatuses.Pending)] + [InlineData(EmailSendStatuses.Sending)] + [InlineData(EmailSendStatuses.Uncertain)] + [InlineData(EmailSendStatuses.Sent)] + public async Task Nonfailed_attempts_cannot_rotate_identity_or_change_draft_and_history(string status) + { + await using var fixture = await Fixture.CreateAsync(seedDrafts: true); + await using var db = fixture.Context("user-1"); + var original = await db.EmailDrafts.AsNoTracking().SingleAsync(); + var attempt = new EmailSendAttempt + { + Id = Guid.NewGuid(), + OwnerUserId = original.OwnerUserId, + JobApplicationId = original.JobApplicationId, + Provider = original.Provider, + ClientRequestId = original.ClientRequestId, + PayloadHash = new string('a', 64), + Status = status, + ProviderMessageId = status == EmailSendStatuses.Sent ? "sent-message" : null, + FailureCategory = status == EmailSendStatuses.Uncertain ? "delivery_unknown" : null, + CreatedAtUtc = original.CreatedAtUtc, + StartedAtUtc = status == EmailSendStatuses.Pending ? null : original.UpdatedAtUtc, + CompletedAtUtc = status is EmailSendStatuses.Uncertain or EmailSendStatuses.Sent ? original.UpdatedAtUtc : null, + }; + db.EmailSendAttempts.Add(attempt); + await db.SaveChangesAsync(); + + var result = await Controller(db, "user-1").NewAttempt(original.Id, + new EmailDraftsController.NewAttemptRequest(original.Revision), default); + Assert.IsType(result.Result); + + await using var verify = fixture.Context("user-1"); + var persisted = await verify.EmailDrafts.AsNoTracking().SingleAsync(); + AssertDraftContentUnchanged(original, persisted); + Assert.Equal(original.ClientRequestId, persisted.ClientRequestId); + Assert.Equal(original.Revision, persisted.Revision); + Assert.Equal(original.UpdatedAtUtc, persisted.UpdatedAtUtc); + AssertAttemptUnchanged(attempt, Assert.Single(await verify.EmailSendAttempts.AsNoTracking().ToListAsync())); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task Failures_with_another_owner_or_request_key_cannot_rotate_or_change_either_tenant(bool wrongOwner) + { + await using var fixture = await Fixture.CreateAsync(seedDrafts: true); + await using var seed = fixture.Context(null); + var originals = await seed.EmailDrafts.IgnoreQueryFilters().AsNoTracking().OrderBy(draft => draft.OwnerUserId).ToListAsync(); + var ownDraft = originals.Single(draft => draft.OwnerUserId == "user-1"); + var foreignDraft = originals.Single(draft => draft.OwnerUserId == "user-2"); + var attempt = new EmailSendAttempt + { + Id = Guid.NewGuid(), + OwnerUserId = wrongOwner ? foreignDraft.OwnerUserId : ownDraft.OwnerUserId, + JobApplicationId = wrongOwner ? foreignDraft.JobApplicationId : ownDraft.JobApplicationId, + Provider = ownDraft.Provider, + ClientRequestId = wrongOwner ? ownDraft.ClientRequestId : foreignDraft.ClientRequestId, + PayloadHash = new string('b', 64), + Status = EmailSendStatuses.Failed, + FailureCategory = "provider_rejected", + CreatedAtUtc = ownDraft.CreatedAtUtc, + StartedAtUtc = ownDraft.UpdatedAtUtc, + CompletedAtUtc = ownDraft.UpdatedAtUtc, + }; + seed.EmailSendAttempts.Add(attempt); + await seed.SaveChangesAsync(); + + await using var db = fixture.Context("user-1"); + var result = await Controller(db, "user-1").NewAttempt(ownDraft.Id, + new EmailDraftsController.NewAttemptRequest(ownDraft.Revision), default); + Assert.IsType(result.Result); + + await using var verify = fixture.Context(null); + var persistedDrafts = await verify.EmailDrafts.IgnoreQueryFilters().AsNoTracking().OrderBy(draft => draft.OwnerUserId).ToListAsync(); + Assert.Equal(originals.Count, persistedDrafts.Count); + foreach (var original in originals) + { + var persisted = persistedDrafts.Single(draft => draft.Id == original.Id); + AssertDraftContentUnchanged(original, persisted); + Assert.Equal(original.ClientRequestId, persisted.ClientRequestId); + Assert.Equal(original.Revision, persisted.Revision); + Assert.Equal(original.UpdatedAtUtc, persisted.UpdatedAtUtc); + } + AssertAttemptUnchanged(attempt, Assert.Single(await verify.EmailSendAttempts.IgnoreQueryFilters().AsNoTracking().ToListAsync())); + } + + [Fact] + public async Task Draft_DTO_timestamps_keep_UTC_shape_and_exact_ticks_after_SQLite_roundtrips() + { + await using var fixture = await Fixture.CreateAsync(); + await using var createDb = fixture.Context("user-1"); + var created = Assert.IsType( + Assert.IsType((await Controller(createDb, "user-1").Create( + new EmailDraftsController.CreateDraftRequest(fixture.UserOneJobId, "gmail", "one@example.test", "UTC subject", "UTC body", "utc-thread"), default)).Result).Value); + AssertUtcTimestamps(created); + + await using var readDb = fixture.Context("user-1"); + var beforeReads = await readDb.EmailDrafts.AsNoTracking().SingleAsync(); + var reader = Controller(readDb, "user-1"); + var retrieved = Assert.IsType( + Assert.IsType((await reader.Get(created.Id, default)).Result).Value); + var listed = Assert.Single(Assert.IsAssignableFrom>( + Assert.IsType((await reader.List(fixture.UserOneJobId, default)).Result).Value)); + + await using var verifyReads = fixture.Context("user-1"); + var afterReads = await verifyReads.EmailDrafts.AsNoTracking().SingleAsync(); + AssertDraftContentUnchanged(beforeReads, afterReads); + Assert.Equal(beforeReads.ClientRequestId, afterReads.ClientRequestId); + Assert.Equal(beforeReads.Revision, afterReads.Revision); + Assert.Equal(beforeReads.UpdatedAtUtc, afterReads.UpdatedAtUtc); + Assert.Equal(beforeReads.CreatedAtUtc.Kind, afterReads.CreatedAtUtc.Kind); + Assert.Equal(beforeReads.UpdatedAtUtc.Kind, afterReads.UpdatedAtUtc.Kind); + Assert.Empty(await verifyReads.EmailSendAttempts.AsNoTracking().ToListAsync()); + Assert.Equal(created, retrieved); + Assert.Equal(created, listed); + Assert.Equal(created.CreatedAtUtc.Ticks, retrieved.CreatedAtUtc.Ticks); + Assert.Equal(created.UpdatedAtUtc.Ticks, retrieved.UpdatedAtUtc.Ticks); + Assert.Equal(created.CreatedAtUtc.Ticks, listed.CreatedAtUtc.Ticks); + Assert.Equal(created.UpdatedAtUtc.Ticks, listed.UpdatedAtUtc.Ticks); + AssertUtcTimestamps(retrieved); + AssertUtcTimestamps(listed); + + var updated = Assert.IsType( + Assert.IsType((await reader.Update(created.Id, + new EmailDraftsController.UpdateDraftRequest(created.Revision, "one@example.test", "Updated UTC subject", "Updated UTC body"), default)).Result).Value); + AssertUtcTimestamps(updated); + Assert.Equal(created.CreatedAtUtc.Ticks, updated.CreatedAtUtc.Ticks); + Assert.Equal(created.ClientRequestId, updated.ClientRequestId); + Assert.Equal(2, updated.Revision); + + var failedAttempt = new EmailSendAttempt + { + Id = Guid.NewGuid(), + OwnerUserId = "user-1", + JobApplicationId = updated.JobApplicationId, + Provider = updated.Provider, + ClientRequestId = updated.ClientRequestId, + PayloadHash = new string('c', 64), + Status = EmailSendStatuses.Failed, + FailureCategory = "provider_rejected", + CreatedAtUtc = updated.CreatedAtUtc, + CompletedAtUtc = updated.UpdatedAtUtc, + }; + readDb.EmailSendAttempts.Add(failedAttempt); + await readDb.SaveChangesAsync(); + var rotated = Assert.IsType( + Assert.IsType((await reader.NewAttempt(updated.Id, + new EmailDraftsController.NewAttemptRequest(updated.Revision), default)).Result).Value); + AssertUtcTimestamps(rotated); + Assert.Equal(updated.CreatedAtUtc.Ticks, rotated.CreatedAtUtc.Ticks); + Assert.NotEqual(updated.ClientRequestId, rotated.ClientRequestId); + Assert.Equal(3, rotated.Revision); + + await using var verifyRotation = fixture.Context("user-1"); + var finalReader = Controller(verifyRotation, "user-1"); + var finalRetrieved = Assert.IsType( + Assert.IsType((await finalReader.Get(rotated.Id, default)).Result).Value); + var finalListed = Assert.Single(Assert.IsAssignableFrom>( + Assert.IsType((await finalReader.List(null, default)).Result).Value)); + Assert.Equal(rotated, finalRetrieved); + Assert.Equal(rotated, finalListed); + AssertUtcTimestamps(finalRetrieved); + AssertUtcTimestamps(finalListed); + AssertAttemptUnchanged(failedAttempt, Assert.Single(await verifyRotation.EmailSendAttempts.AsNoTracking().ToListAsync())); + } + + private static void AssertUtcTimestamps(EmailDraftsController.DraftDto draft) + { + Assert.Equal(DateTimeKind.Utc, draft.CreatedAtUtc.Kind); + Assert.Equal(DateTimeKind.Utc, draft.UpdatedAtUtc.Kind); + } + + private static void AssertDraftContentUnchanged(EmailDraft expected, EmailDraft actual) + { + Assert.Equal(expected.Id, actual.Id); + Assert.Equal(expected.OwnerUserId, actual.OwnerUserId); + Assert.Equal(expected.JobApplicationId, actual.JobApplicationId); + Assert.Equal(expected.Provider, actual.Provider); + Assert.Equal(expected.To, actual.To); + Assert.Equal(expected.Subject, actual.Subject); + Assert.Equal(expected.BodyText, actual.BodyText); + Assert.Equal(expected.ThreadId, actual.ThreadId); + Assert.Equal(expected.CreatedAtUtc, actual.CreatedAtUtc); + } + + private static void AssertAttemptUnchanged(EmailSendAttempt expected, EmailSendAttempt actual) + { + Assert.Equal(expected.Id, actual.Id); + Assert.Equal(expected.OwnerUserId, actual.OwnerUserId); + Assert.Equal(expected.JobApplicationId, actual.JobApplicationId); + Assert.Equal(expected.Provider, actual.Provider); + Assert.Equal(expected.ClientRequestId, actual.ClientRequestId); + Assert.Equal(expected.PayloadHash, actual.PayloadHash); + Assert.Equal(expected.Status, actual.Status); + Assert.Equal(expected.ProviderMessageId, actual.ProviderMessageId); + Assert.Equal(expected.FailureCategory, actual.FailureCategory); + Assert.Equal(expected.CreatedAtUtc, actual.CreatedAtUtc); + Assert.Equal(expected.StartedAtUtc, actual.StartedAtUtc); + Assert.Equal(expected.CompletedAtUtc, actual.CompletedAtUtc); } private static EmailDraftsController Controller(JobTrackerContext db, string userId) @@ -232,6 +445,7 @@ public sealed class EmailDraftsControllerTests To = recipient, Subject = "Synthetic", BodyText = "Synthetic private draft.", + ThreadId = "thread-1", ClientRequestId = Guid.NewGuid().ToString("D"), CreatedAtUtc = DateTime.UtcNow, UpdatedAtUtc = DateTime.UtcNow, diff --git a/JobTrackerApi/Controllers/EmailDraftsController.cs b/JobTrackerApi/Controllers/EmailDraftsController.cs index 1d974e2..bc57235 100644 --- a/JobTrackerApi/Controllers/EmailDraftsController.cs +++ b/JobTrackerApi/Controllers/EmailDraftsController.cs @@ -65,8 +65,8 @@ public sealed class EmailDraftsController( draft.ThreadId, draft.ClientRequestId, draft.Revision, - draft.CreatedAtUtc, - draft.UpdatedAtUtc)) + DateTime.SpecifyKind(draft.CreatedAtUtc, DateTimeKind.Utc), + DateTime.SpecifyKind(draft.UpdatedAtUtc, DateTimeKind.Utc))) .ToListAsync(cancellationToken)); } @@ -235,6 +235,6 @@ public sealed class EmailDraftsController( draft.ThreadId, draft.ClientRequestId, draft.Revision, - draft.CreatedAtUtc, - draft.UpdatedAtUtc); + DateTime.SpecifyKind(draft.CreatedAtUtc, DateTimeKind.Utc), + DateTime.SpecifyKind(draft.UpdatedAtUtc, DateTimeKind.Utc)); } diff --git a/docs/redesign/phase-7/COMMITS.md b/docs/redesign/phase-7/COMMITS.md index 0dcfcbb..9dbef34 100644 --- a/docs/redesign/phase-7/COMMITS.md +++ b/docs/redesign/phase-7/COMMITS.md @@ -76,3 +76,11 @@ Forms committed and normal push verified **4c3254c472871d1cac05abcef502feb4a1be4 [Inbox report](p7-06/INBOX.md) and [portable results](p7-06/evidence/inbox-results.json) retain actual42/5 frontend,25 unchanged-DLL/no-build backend and fresh8/8 native on build uhKavi8_u6PrcEm2rZ1On. App/browser types, lint and build pass; all20 latest PNGs actually displayed/reviewed, all-enabled20 axe scans0 violations/84 incomplete contrast contexts retained. Meaningful I7 and I8 RED→GREEN prove literal all/hash/current-query recovery and one-step Back after typing. The incorrect55 native assumption was corrected to positively preserve the existing owned trashed-job56/page50+6/detail200 contract; authorization stays strict. Twelve added cases/zero suites derive729/94 frontend and eight added native derive291 browser only. Implemented-scope CONDITIONAL GO, final hygiene/normal push pending; commit hash follows direct receipt in the successor compose boundary. Main unchanged, production NO-GO. Compose/send remains next. Final inbox hygiene PASS observed2026-10-14 05:14:23UTC: secret and working/staged/phase whitespace gates pass,15 docs/474 local links resolve,57 groups and32 routes retained. Normal development push pending; main unchanged. + +Inbox/read committed and normal push verified **a791e353b062cc91e10429cd767350ec9f0aaef2** at2026-10-14T05:14:53.828571UTC: cleanHEAD=origin=live development; local/origin/live main27657f3 unchanged. Second slice implemented CONDITIONAL GO; overallP7-06 ongoing. Mandatory compose/send follows; no production or Phase8 action. + +### P7-06 compose/send final bounded gate + +[Compose report](p7-06/COMPOSE.md) and [portable results](p7-06/evidence/compose-results.json): Compose affected52/5 and fresh backend25 PASS; native10+inbox8+ordinaryP2-D01=19 PASS on LFCrTZzDtX5hNBSRBj5Xx; app/browser TypeScript, lint and build PASS. Actual image review 47/47; all-enabled44scans0violations/330incompletes triaged, human/device/provider qualifications remain. +10front/+0suites,+10browser,+7backend derive739/94,301,1041 only; no integrated full-suite claim. Captured operation/UUID and all field dirty protections, definitive-failure preparation retaining unsaved edits, GET-only recovery and current locale/focus/contrast are verified within recorded bounds. Sole API change marks existing UTC DTO values without tick/data/schema changes. All failed attempts and true source/timing limits remain. Real disconnected server failure precedes provider delivery; simulated delivery states are labelled, actual grants/delivery/manual/production remain unverified. All57groups56PARTIAL/C11DEFERRED and32routes;RD11/RD21/06F/P513 retained. All three mandatoryP7-06 boundaries implemented CONDITIONAL GO; final hygiene/normal push pending. P7-07 contract then UI follows, no Phase 8 ormain push. + +Final compose hygiene PASS observed2026-10-14 11:01:54.856146UTC: secret/working/staged/phase whitespace gates pass,16 docs/486 local links resolve,57 groups56PARTIAL/C11DEFERRED and32original routes retained. All47finalimages actually reviewed. Implemented scope CONDITIONAL GO; normal development push pending, productionNO-GO/mainunchanged. diff --git a/docs/redesign/phase-7/DEBT.md b/docs/redesign/phase-7/DEBT.md index ccf1919..1929f7d 100644 --- a/docs/redesign/phase-7/DEBT.md +++ b/docs/redesign/phase-7/DEBT.md @@ -176,3 +176,11 @@ Final embedded-forms implemented scope is **CONDITIONAL GO**, normal push pendin [Inbox/read evidence](p7-06/evidence/inbox-results.json) confirms repairs for initial failure versus empty, exact GET-only list/detail/provider recovery, late-query/fallback exclusion, locale-only no-GET, review-note retention, synchronous explicit decisions and created-resource recovery. Literal all, URL hash/state/source and one-step Back after text-search edits have ordinary failing then passing regressions. The owned trashed-mail56/page50+6 contract is preserved; failed55 was an unsupported test premise, not a backend policy defect. Final42/5 units and8/8 native pass; all20 PNGs reviewed,20axe0/84 incomplete contrast contexts remain. Strict real language204 passed in this final run; this does not diagnose or close earlier RD11 HTTP500. Actual provider grants/sync/create atomicity, human reader/device/zoom and release evidence remain open. The confirmed compose UUID/save/send/complete-dirty-fields safety dependency remains mandatory at the next approved third boundary; no delivery or new attempt is enabled by this read slice. Final inbox hygiene PASS observed2026-10-14 05:14:23UTC: secret and working/staged/phase whitespace gates pass,15 docs/474 local links resolve,57 groups and32 routes retained. Normal development push pending; main unchanged. + +### P7-06 compose/send final bounded gate + +[Compose report](p7-06/COMPOSE.md) and [portable results](p7-06/evidence/compose-results.json): Compose affected52/5 and fresh backend25 PASS; native10+inbox8+ordinaryP2-D01=19 PASS on LFCrTZzDtX5hNBSRBj5Xx; app/browser TypeScript, lint and build PASS. Actual image review 47/47; all-enabled44scans0violations/330incompletes triaged, human/device/provider qualifications remain. +10front/+0suites,+10browser,+7backend derive739/94,301,1041 only; no integrated full-suite claim. Captured operation/UUID and all field dirty protections, definitive-failure preparation retaining unsaved edits, GET-only recovery and current locale/focus/contrast are verified within recorded bounds. Sole API change marks existing UTC DTO values without tick/data/schema changes. All failed attempts and true source/timing limits remain. Real disconnected server failure precedes provider delivery; simulated delivery states are labelled, actual grants/delivery/manual/production remain unverified. All57groups56PARTIAL/C11DEFERRED and32routes;RD11/RD21/06F/P513 retained. All three mandatoryP7-06 boundaries implemented CONDITIONAL GO; final hygiene/normal push pending. P7-07 contract then UI follows, no Phase 8 ormain push. + +P7-11 residual localisation evidence from current compose/inbox images: after a saved draft opens in EN, a dirty switch to NB leaves the generic saved-draft context in its opening locale, while controls update. English saved-mail counts use singular `1 attachments` / `1 items`. Actual user text and resource names stay verbatim. These limited copy findings remain open; no blanket localisation acceptance is claimed. + +Final compose hygiene PASS observed2026-10-14 11:01:54.856146UTC: secret/working/staged/phase whitespace gates pass,16 docs/486 local links resolve,57 groups56PARTIAL/C11DEFERRED and32original routes retained. All47finalimages actually reviewed. Implemented scope CONDITIONAL GO; normal development push pending, productionNO-GO/mainunchanged. diff --git a/docs/redesign/phase-7/PRESERVATION.md b/docs/redesign/phase-7/PRESERVATION.md index d19fbf2..78b6ad4 100644 --- a/docs/redesign/phase-7/PRESERVATION.md +++ b/docs/redesign/phase-7/PRESERVATION.md @@ -186,3 +186,11 @@ Final embedded-forms implemented scope is **CONDITIONAL GO**, normal push pendin [Inbox/read report](p7-06/INBOX.md) and [exact evidence](p7-06/evidence/inbox-results.json) add M03 owner-page/filter/direction/link/detail/Back/hash/literal-all/GET-retry and late-query evidence, preserving owned trashed-parent correspondence56/page50+6/detail200 and foreign/anonymous denial. M02/M05 notes, synchronous explicit decisions, hidden pending decisions, created-ID recovery and saved-decision GET-only Retry have focused unit/controller proof; native queue/provider projections remain explicitly qualified. M06 provider-status GET recovery does not establish real grants/reconnect/sync.42/5 units,25 unchanged-DLL backend,8/8 native,20 reviewed PNGs/20axe0/84 incomplete; strict final language204 passes but RD11 remains undiagnosed. M04 compose/send is not accepted by this second slice. All57 groups remain56 PARTIAL/C11 DEFERRED,32routes unchanged; M01–M12/provider/output/release conditions persist. Hygiene/normal push pending. Final inbox hygiene PASS observed2026-10-14 05:14:23UTC: secret and working/staged/phase whitespace gates pass,15 docs/474 local links resolve,57 groups and32 routes retained. Normal development push pending; main unchanged. + +### P7-06 compose/send final bounded gate + +[Compose report](p7-06/COMPOSE.md) and [portable results](p7-06/evidence/compose-results.json): Compose affected52/5 and fresh backend25 PASS; native10+inbox8+ordinaryP2-D01=19 PASS on LFCrTZzDtX5hNBSRBj5Xx; app/browser TypeScript, lint and build PASS. Actual image review 47/47; all-enabled44scans0violations/330incompletes triaged, human/device/provider qualifications remain. +10front/+0suites,+10browser,+7backend derive739/94,301,1041 only; no integrated full-suite claim. Captured operation/UUID and all field dirty protections, definitive-failure preparation retaining unsaved edits, GET-only recovery and current locale/focus/contrast are verified within recorded bounds. Sole API change marks existing UTC DTO values without tick/data/schema changes. All failed attempts and true source/timing limits remain. Real disconnected server failure precedes provider delivery; simulated delivery states are labelled, actual grants/delivery/manual/production remain unverified. All57groups56PARTIAL/C11DEFERRED and32routes;RD11/RD21/06F/P513 retained. All three mandatoryP7-06 boundaries implemented CONDITIONAL GO; final hygiene/normal push pending. P7-07 contract then UI follows, no Phase 8 ormain push. + +P7-11 residual localisation evidence from current compose/inbox images: after a saved draft opens in EN, a dirty switch to NB leaves the generic saved-draft context in its opening locale, while controls update. English saved-mail counts use singular `1 attachments` / `1 items`. Actual user text and resource names stay verbatim. These limited copy findings remain open; no blanket localisation acceptance is claimed. + +Final compose hygiene PASS observed2026-10-14 11:01:54.856146UTC: secret/working/staged/phase whitespace gates pass,16 docs/486 local links resolve,57 groups56PARTIAL/C11DEFERRED and32original routes retained. All47finalimages actually reviewed. Implemented scope CONDITIONAL GO; normal development push pending, productionNO-GO/mainunchanged. diff --git a/docs/redesign/phase-7/README.md b/docs/redesign/phase-7/README.md index ffd87ac..e81d982 100644 --- a/docs/redesign/phase-7/README.md +++ b/docs/redesign/phase-7/README.md @@ -14,7 +14,7 @@ The entry commit is `b5319981ad3d1bd635daff861453d23c0de5320b` on `codex/ui-rede | [P7-03](p7-03/README.md) | Career structured editing and import review | Source-ID and structured-editor commits pushed; final import/history runtime/design CONDITIONAL GO: affected76/6, native35, backend98/seeder24, types/lint/build PASS;33/54 final images inspected. Import17 scans0/302, editor13 scans0/377, Career22 scans0/99 retained. Final staged hygiene PASS; normal push5d6e3235 directly verified17:28:54UTC with clean worktree/main unchanged. RD21/human/provider/output gates remain;57/32 unchanged | | [P7-04](p7-04/README.md) | CV library and public entry | Implemented CONDITIONAL GO; library fcacae7 push verified. Public affected38/3/native8/types/lint/build and fresh fidelity16/36+8/24 PASS;18 images actually reviewed, frame-tested12/manual gates retained. Public final hygiene PASS/normal push bfa0ab6 directly verified22:24:44UTC, clean main unchanged | | [P7-05](p7-05/README.md) | Discovery, Companies, Offers and Reminders | Entry bfa0ab6 verified; Discovery21/1,new8+existing4native/backend14/types/lint/build pass;18 actual PNG reviews/qualified81+52incompletes. Discovery implemented CONDITIONAL GO, hygiene PASS/normal push34a4d6d verified; Companies30/4,new6+old2+named4native/backend2/types/lint/build pass;20actual PNG reviews/qualified91+163incompletes. Companies implemented CONDITIONAL GO, hygiene PASS/normal pusha8aba85 verified; Offers9/1,new4native/backend6/types/lint/build pass;14actual PNG reviews/15incompletes qualified. Offers implemented CONDITIONAL GO, hygiene PASS/normal pushc723a4e verified; Reminders17/3,new6native/backend6/types/lint/build pass;17actual PNG reviews/114incompletes qualified. P7-05 implemented CONDITIONAL GO, hygiene PASS/normal push627955a directly verified11:49:32UTC, clean localHEAD=origin=live/main unchanged; P7-06 next | -| [P7-06](p7-06/README.md) | Remaining Application forms and global correspondence | Overall ongoing. Forms4c325 pushed/55/4 units/30 backend; current15PASS/1FAIL relevant16 retains strict RD11, qualified prior consumers30/1 relevant31. [Inbox/read](p7-06/INBOX.md) implemented CONDITIONAL GO, final hygiene/push pending:42/5 units,25 sameDLL backend,8/8 native, types/lint/build pass;20 reviewed PNGs/20axe0/84 incomplete. +12front derives729/94; +8native derives291, no full-suite claim. Compose/send is the mandatory third boundary;06F deferred;57/32/main unchanged | +| [P7-06](p7-06/README.md) | Remaining Application forms and global correspondence | All three boundaries implemented CONDITIONAL GO: forms4c325/inboxa791 normally pushed; [compose](p7-06/COMPOSE.md) Compose affected52/5 and fresh backend25 PASS; native10+inbox8+ordinaryP2-D01=19 PASS on LFCrTZzDtX5hNBSRBj5Xx; app/browser TypeScript, lint and build PASS. Actual image review 47/47; all-enabled44scans0violations/330incompletes triaged, human/device/provider qualifications remain. +10front/+0suites,+10browser,+7backend derive739/94,301,1041 only; no integrated full-suite claim. Final hygiene/normal push pending;06Fdeferred/57groups32routes/main unchanged; P7-07 contract first next | | P7-06F | Deferred `followMode` reviewed composer | Optional separately reviewed mail slice; **DEFERRED** until mode→draft/review action and fallback are explicitly decided | | P7-07 | Documents owner-scoped index | Authenticated metadata-only paginated backend projection first; source destinations from P7-04/06; planned | | P7-08 | Existing notifications and operations | Existing store and real destinations; new enabled producers require F20 recovery evidence; planned | @@ -64,3 +64,11 @@ Final embedded-forms implemented scope is **CONDITIONAL GO**, normal push pendin Forms committed and normal push verified **4c3254c472871d1cac05abcef502feb4a1be435b** at2026-10-13T21:27:19.353249UTC: cleanHEAD=origin=live development, main27657f3 unchanged. First slice implemented CONDITIONAL GO; overallP7-06 ongoing. Inbox/read entered next; compose/send follows. No production or Phase8 action. Final inbox hygiene PASS observed2026-10-14 05:14:23UTC: secret and working/staged/phase whitespace gates pass,15 docs/474 local links resolve,57 groups and32 routes retained. Normal development push pending; main unchanged. + +Inbox/read committed and normal push verified **a791e353b062cc91e10429cd767350ec9f0aaef2** at2026-10-14T05:14:53.828571UTC: cleanHEAD=origin=live development; local/origin/live main27657f3 unchanged. Second slice implemented CONDITIONAL GO; overallP7-06 ongoing. Mandatory compose/send follows; no production or Phase8 action. + +### P7-06 compose/send final bounded gate + +[Compose report](p7-06/COMPOSE.md) and [portable results](p7-06/evidence/compose-results.json): Compose affected52/5 and fresh backend25 PASS; native10+inbox8+ordinaryP2-D01=19 PASS on LFCrTZzDtX5hNBSRBj5Xx; app/browser TypeScript, lint and build PASS. Actual image review 47/47; all-enabled44scans0violations/330incompletes triaged, human/device/provider qualifications remain. +10front/+0suites,+10browser,+7backend derive739/94,301,1041 only; no integrated full-suite claim. Captured operation/UUID and all field dirty protections, definitive-failure preparation retaining unsaved edits, GET-only recovery and current locale/focus/contrast are verified within recorded bounds. Sole API change marks existing UTC DTO values without tick/data/schema changes. All failed attempts and true source/timing limits remain. Real disconnected server failure precedes provider delivery; simulated delivery states are labelled, actual grants/delivery/manual/production remain unverified. All57groups56PARTIAL/C11DEFERRED and32routes;RD11/RD21/06F/P513 retained. All three mandatoryP7-06 boundaries implemented CONDITIONAL GO; final hygiene/normal push pending. P7-07 contract then UI follows, no Phase 8 ormain push. + +Final compose hygiene PASS observed2026-10-14 11:01:54.856146UTC: secret/working/staged/phase whitespace gates pass,16 docs/486 local links resolve,57 groups56PARTIAL/C11DEFERRED and32original routes retained. All47finalimages actually reviewed. Implemented scope CONDITIONAL GO; normal development push pending, productionNO-GO/mainunchanged. diff --git a/docs/redesign/phase-7/p7-06/COMPOSE.md b/docs/redesign/phase-7/p7-06/COMPOSE.md new file mode 100644 index 0000000..bdec831 --- /dev/null +++ b/docs/redesign/phase-7/p7-06/COMPOSE.md @@ -0,0 +1,112 @@ +# P7-06 — Compose and send + +**Implemented scope: CONDITIONAL GO. Affected regression, final native consumers, actual47-image review and finite hygiene pass; normal development push pending.** This is the third mandatory P7-06 boundary after [embedded forms](FORMS.md) and [inbox/read review](INBOX.md). Follow the [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries); optional P7-06F remains DEFERRED pending its mode→draft/review action and fallback decision. + +[Compose entry](evidence/compose-entry.json) records the preceding inbox commit `a791e353b062cc91e10429cd767350ec9f0aaef2`. Its normal push was observed on **2026-10-14 at 05:14:53.828571 UTC**: clean local HEAD = origin = live `codex/ui-redesign-phase4`; local/origin/live `main` remained `27657f31131cd95d42f0e1290853ec9c9b3959a4`. That receipt establishes synchronization of the predecessor, not acceptance or push of this slice. + +## Existing contract and scope + +The existing global correspondence composer remains the owner of new messages, replies, saved drafts, review confirmation and send feedback. It keeps the existing provider registry, owned-job choices, draft routes, explicit send confirmation, shared confirmation/toast infrastructure and English/Bokmål catalogue. The sole API presentation correction marks existing draft DTO timestamps as UTC consistently after SQLite reload. No new document persistence, mailbox grant, provider integration, renderer, route or schema is introduced. + +The server assigns a saved draft's request UUID and revision. PUT and DELETE require the captured revision; new-attempt preparation changes identity only for that owner's matching definitive failed attempt. Confirmed send uses the owned job, provider, request UUID and payload hash. An uncertain or terminal attempt cannot restart. The stored-draft DTO has no delivery-status field; resuming a draft does not prove provider delivery status or authorize a new identity. + +The entry inspection identified concrete safety defects: a held Save could merge into later work, Save and Send could race while persistence changed the UUID, edits could clear recorded delivery protection, and recipient-only or subject-only changes could be discarded without confirmation. This slice repairs those paths before accepting the migrated presentation. + +## Bounded repairs + +A synchronous operation guard reserves Save, Send, Discard, failed-attempt preparation and draft replacement before any confirmation or asynchronous work. Each completion belongs to its captured draft/job/provider/request identity and mounted owner. Conflicting controls lock during writes; confirmation triggers remain available for Cancel focus restoration. An unmounted completion does not refresh drafts or attach its result to another screen. + +Recipient, subject and body form the complete dirty check. Saved content has a separate persisted baseline, so an unchanged saved draft can be resumed later while unsaved edits require deliberate replacement or discard confirmation. Cancel preserves all fields and makes no write. Explicit Send captures the reviewed payload; repeated activation cannot create another confirmation or another concurrent POST. + +Recorded failed, uncertain, pending, sending and sent results lock field editing and ordinary Save/Send. Edits cannot implicitly rotate the request UUID or erase the result. Only an authoritative failed result offers explicit new-attempt preparation. Managed drafts use the server's new UUID/revision, retaining all local unsaved fields and comparing them with the returned persisted baseline. A generic HTTP409 is treated as uncertain; plain preflight 4xx errors keep the same request key without inventing a failed attempt. Preparation remains a separate action from reviewing and sending again. + +Owned job choices and saved drafts have independent loading/error states and GET-only Retry. A successful write updates the known draft DTO locally before a following list read. If that read fails, recovery repeats the GET without replaying the write. A post-write read starts a fresh generation even when an earlier list GET is still pending; a late old snapshot cannot replace the committed state. HTTP401/403 recovery withholds unauthorized saved data. Revision errors keep the current fields and captured revision with localized feedback on the original action. + +The composer uses existing density tokens, H3 hierarchy, named focus groups, shared feedback and wrapping content. Three new catalogue entries describe owned-job read failure, no matching jobs and discard failure; existing saved-draft feedback is reused. The unsaved-change wording now covers all three fields. Both English and Bokmål remain catalogue-backed. The disabled editor's informational character counter uses the existing secondary-text token after a measured contrast failure. No second toast/dialog framework or dependency is introduced. + +## Affected regression evidence + +All times below are UTC on **2026-10-14**. Exact commands, reports, failed attempts and frozen source captures remain under `.artifacts/phase7/p7-06/compose/`. + +| Observation | Actual result | Evidence boundary | +|---|---|---| +| Published entry frontend | **42 cases/5 suites PASS** | Earlier inbox GREEN, 05:08:44.577597–05:09:06.324638. All 14 frozen as-run sources equal published `a791e353` Git blobs under UTF-8/LF normalization. This is source equivalence to the earlier execution, not a new run at the clean commit | +| Existing backend baseline | **18 PASS** | 05:17:30.164673–05:17:33.709705, `--no-build` against the existing Release DLL. Entry source and binary equality are recorded separately | +| Compose meaningful RED | **43 pass/7 fail of 50** | `unit-red`, 05:21:42.841428–05:22:08.085477. All original 42 cases pass; the new repeated-confirmation case already passes. Seven failures expose write ownership, lost protection, dirty confirmation, GET recovery, unmount and revision feedback defects | +| First candidate | **35 pass/15 fail of 50** | `unit-candidate-1`, 05:29:14.641920–05:29:40.212958. An unconditional asynchronous approval wait delayed the no-confirmation fast path; this implementation regression was repaired rather than waived | +| Second candidate | **47 pass/3 fail of 50** | `unit-candidate-2`, 05:31:13.767478–05:31:53.017579. Canonical localized HTTP409 feedback and the new uncertain-state observation were corrected before the next run | +| Initial compose GREEN | **50 cases/5 suites PASS** | `unit-candidate-3`, 05:34:01.640374–05:34:28.524596; zero failed/pending/todo cases | +| Review-added RED | **50 pass/2 fail of 52** | `unit-review-red`, 05:37:16.529544–05:37:49.453325. Two ordinary additions reproduce unsaved-field loss during server identity rotation and a post-write list read suppressed by an older pending GET | +| Review GREEN | **52 cases/5 suites PASS** | `unit-review-green`, 05:40:17.199755–05:40:46.294482; all 14 pre/post source captures match, zero failed/pending/todo cases | +| Fresh backend guard regression | **24 PASS** | 05:29:23.773379–05:29:43.744878, fresh Release compilation and test execution with `--no-restore`; zero failed/not-executed cases | +| UTC contract RED | **24 pass/1 fail of 25** | `backend-utc-red`, 05:51:46.857292–05:51:56.549754. The ordinary new Fact observes `Unspecified` after SQLite reload where the DTO contract requires UTC; all ten sources have true pre/post captures | +| UTC contract GREEN | **25 PASS** | `backend-utc-green`, 05:53:02.535746–05:53:11.849241, fresh Release compilation and execution; all ten pre/post sources match, zero failed/not-executed cases | +| Final affected GREEN | **52 cases/5 suites PASS** | `unit-final`, 06:00:56.823199–06:01:25.904825, after the counter-color correction. All 14 pre/post sources match; zero failed/pending/todo cases. The read-only 10:36:21.072658 resumption check confirms the same 14 working sources | + +The final affected frontend source includes `CorrespondenceInboxPage.tsx` SHA256 `38ed35060aab502bf64c947dfad6d6e0cc9e4970d7ee16dd3518a3da1d3543f4`. The latest product export is `LFCrTZzDtX5hNBSRBj5Xx`; its 10:36 gates and final native pre/post receipts retain source/export correspondence. Later C8/C5 fixture corrections change only the browser specification; browser TypeScript and native checks rerun against the same product export, with no product rebuild inferred. + +Six new backend cases cover pending/sending/uncertain/sent rejection and mismatched owner/request-key failures. They assert unchanged draft content, revision, request identity and attempt history across fresh contexts. The existing successful rotation case now also proves persisted identity/content/history readback. A seventh case proves UTC kinds, exact ticks and complete DTO fields through Create/Get/List/Put/NewAttempt, with stored values and failed history unchanged by reads. + +The original native whole-DTO comparison found Create timestamps ending in `Z` while reloaded Get/List timestamps omitted it. Four `DateTime.SpecifyKind(value, DateTimeKind.Utc)` DTO mappings restore the existing UTC transport contract without converting ticks or mutating stored data. Routes, ownership, request identity, revision checks and schema remain unchanged. Assertions retain exact DTO equality; no timestamp normalization hides the failure. + +The fresh 24-case API DLL was SHA256 `5e32c5b5b60fa0fda7bed6f392b75c3087a321476244f5aa9ff229d6a1372fa8`; compilation reflects current assembly revision metadata. Its ten-source receipt is timestamped **05:29:52.777062**, after the command ended at **05:29:43.744878**, with matching later captures at 05:31:55.584513. `backend-final-source/capture-qualification.json` corrects the original receipt and post-receipt's inaccurate “during compilation” wording while retaining their raw bytes. That evidence is not a pre-build capture. The later UTC RED/GREEN runs have genuine ten-source pre/post captures; current GREEN API DLL SHA256 is `951ca8d7b46345c4aab976215d50d42b769bad1aa4a1e1b97fd3cfaaf5615527`. + +## Browser, responsive and accessibility evidence + +Ten new native cases cover actual owned draft create/list/detail/update/delete/reload and stale revisions; anonymous/foreign-owner denial; job-choice and draft-list GET recovery; held Save/unmount; dirty Cancel and Send Cancel; real failed-only identity preparation; explicitly labelled delivery-state fixtures; strict actual language HTTP204; and finite bilingual/theme/width reflow. Every failed attempt below remains immutable, with complete reports, source qualifications, axe vectors and PNGs. + +| Native observation | Actual result | Qualification and repair | +|---|---|---| +| Previous committed export `uhKavi8_u6PrcEm2rZ1On` | **0 pass/10 fail**, 05:42:41.382361–05:48:48.604257 | `native-red-old-uhK` is an old-export RED comparison, not current UI acceptance. Four cases fail whole-DTO UTC serialization before later assertions; remaining failures expose missing recovery/dirty feedback and write or delivery locks. Case 7 stops at the missing dirty indicator and cannot prove its later preparation assertions. The separate unit RED proves unsaved-field loss | +| First repaired export `sk-T5pqHLrLW1H-3l7x6i` | **8 pass/2 fail**, 05:56:16.089420–05:57:12.095693 | `native-candidate-1-skT`; 19 source pre/post captures match. Both failures are the 12px informational character counter at **4.48:1**, `#777680` on white, in held-Save and uncertain states. The existing secondary-text token repairs it; the 4.5:1 assertion and all axe rules remain unchanged. Later assertions in those failed cases were not reached | +| Counter-corrected export `LFCrTZzDtX5hNBSRBj5Xx` | **9 pass/1 fail**, 10:36:54.419717–10:37:55.849468 | `native-candidate-2-counter`; 19 pre/post captures match. Held Save/unmount and counter checks pass. C8 passes its first uncertain fixture but cannot find the independently seeded second pending draft: navigation to the identical URL/fragment retains the mounted list. C8 now reloads between independent fixtures and proves a new `performance.timeOrigin`; no product auto-refetch, lost-state reset, skip or relaxed assertion is added | +| C8 fixture-corrected run, same `LFCrTZzDtX5hNBSRBj5Xx` export | **9 pass/1 fail**, 10:46:44.269454–10:47:53.113854 | `native-candidate-3-c8`, result SHA256 `142c0bba53863e1c518386746a8a2e6946d448f13011b242044d4743aebad4c0`; 19 pre/post sources match. All five C8 status fixtures pass. C5 waits for the destination URL before proving the lazy workspace rendered; its trace has no destination-workspace GET before Back. Releasing Save and going Back encounters a replacement dialog for saved A before B's field assertion. The fixture now requires B's actual heading/tablist and zero old draft regions before release. Product code and strict persistence/identity assertions remain unchanged | +| Final compose, same product export | **10 PASS**, 10:51:11.697665–10:52:14.846477 | `native-final-verified`; all five C8 status branches and C5's actual-unmount/late-completion assertions execute and pass; zero skipped, unexpected or flaky cases, retries 0 | +| Final inbox/read consumer | **8 PASS**, 10:52:14.851996–10:53:01.436862 | Same final capsule/export; prior inbox query, decision and recovery assertions remain ordinary passing cases, retries 0 | +| Final ordinary P2-D01 | **1 PASS**, 10:53:01.442415–10:53:13.190106 | Existing `legacy workspace preserves frozen documents` case, retries 0; no skip or expected-failure marker | + +The earlier C8-corrected specification SHA256 is `1cb1d3f458bdfc8ce856b9e1f54a1d59ffa25e535ff4835b8bc99375a130902c`; `native-final-c8-pre.json` captures that attempt. The final C5/C8 specification SHA256 is `5cb7a8f67926eb8abaf87e740eef5192921a52d39d14cbdad556476d4e818f0d`. `native-final-unmount-pre.json` and `native-final-unmount-post.json` prove all 19 inputs unchanged across final compose/inbox/P2-D01 execution. Final capsule `native-final-verified/results.json` SHA256 is `21a02c6d67dc2732e4a230787261b406be8db3100d5df3a10065f5669f482a11`. + +The four retained attempts contain, respectively, **13/22/23/23 axe scans**, **0/2/0/0 violation nodes**, **143/228/239/235 incomplete nodes**, and **25/26/26/26 PNGs**. Incomplete categories are short badge content, overlapped contrast backgrounds and `aria-hidden-focus` modal-open checks; retain their complete contexts for the final contextual review. Zero automated violations in a failed run do not establish workflow or human accessibility acceptance. + +Finite responsive samples cover 320, 360, 390, 768, 1024, 1280, 1440 and 1920px, including 1280×320 landscape, both languages and themes. Long drafts, keyboard setup, review, Cancel and viewport-focused captures use zero app-root overflow assertions. This is a finite sample, not every width/theme/language/state combination. + +Final compose records **24 all-enabled axe scans, 0 violation nodes and 246 incomplete nodes**: 24 short notification badges, 219 overlapped contrast backgrounds and 3 modal hidden-root focus checks. Final inbox adds **20 scans, 0 violations and 84 incomplete nodes**: 20 badges and 64 overlap backgrounds. Ordinary P2-D01 performs no axe scan. The combined final evidence is **44 scans / 0 violations / 330 incompletes**, with every vector retained. `axe-triage-final.json` records category dispositions; badge/background contrast and full modal Tab/Shift-Tab containment and reader behavior remain conformance obligations. Incompletes are not counted as passing. + +The triage receipt measures **23 informational character helpers**, including locked states, from recorded foreground and nearest Paper background; minimum calculated ratio is **9.3359:1**. This resolves the specific counter-color failure and does not settle blending, every other contrast target, fonts or contextual manual contrast acceptance. + +The final capsule retains **47 PNGs**. Root has inspected 16; the remaining 31 are under independent visual review. Image existence does not establish review completion. Root's actual bilingual review identifies a residual localisation issue for **P7-11**: changing an open saved draft from English to Bokmål preserves the generic context label **“Saved email draft”** in its opening locale while surrounding controls translate. Stored source/job/subject names remain verbatim. Strict language HTTP204 and unsaved-field/identity preservation pass, but this residual prevents a blanket localisation PASS. + +The browser boundary distinguishes actual isolated HTTP/SQLite draft persistence from capability/delivery presentation fixtures. One case permits real `/email/send` only after independently proving the fresh owner has no Gmail connection: the server must record `failed/reauthorization_required` before delivery. Its failed-only new-attempt response is real. Other send requests are blocked or fulfilled by labelled browser fixtures. Uncertain/pending/sending/sent/generic409 UI states do not prove provider persistence or successful delivery. No external recipient is sent mail, and no provider grant, Google/Outlook/IMAP execution, Gmail sync/import/create/unlink or model call is authorized by this evidence. + +Current product app TypeScript, lint, browser TypeScript and frontend build all exit **0** between **10:36:14.414955 and 10:36:54.413694**, producing `LFCrTZzDtX5hNBSRBj5Xx`. Browser TypeScript reruns after final test-only C8/C5 corrections at **10:51:06.686512–10:51:11.691657**, exit **0**. Automated names, keyboard and axe evidence cannot close human screen-reader, contextual contrast, physical touch/software-keyboard, real zoom, fonts/photo or print qualification. + +### Final acceptance checks pending + +Final browser TypeScript and **19/19 native cases** pass on the unchanged export, with matching pre/post sources. Complete the remaining visual review and record its actual scope; retain the triaged manual accessibility and localisation qualifications. Documentation, secret, whitespace, route/preservation checks, commit and normal development push remain **PENDING**. This draft does not claim final slice acceptance or push. + +## Count reconciliation and preservation + +| Inventory | Inbox exit | Compose additions | Derived inventory | +|---|---:|---:|---:| +| Frontend cases/suites | 729/94 | +10 cases/+0 suites | **739/94** | +| Browser cases | 291 | +10 | **301** | +| Backend cases | 1,034 | +7 | **1,041** | + +These are inventory calculations, not fresh whole-suite pass counts. Latest actual whole frontend **573/89**, backend **1,033** and sidecar **49** remain inherited until P7-12's integrated run. New cases remain ordinary assertions; no skipped or expected-failure case conceals a regression. + +All **57 preservation groups remain 56 PARTIAL / PRES-C11 DEFERRED**, with **32 routes**. Evidence narrows W05–W10 and M01–M06 workflow risks without declaring any complete group accepted. M04 remains qualified by the actual draft/send boundary and pending provider/manual evidence. Original owner authorization, explicit confirmation, payload identity, revision conflicts, uncertain delivery, frozen package bytes, CV associations and canonical Career Profile authority remain binding. + +M01–M12 remain NOT VERIFIED. Keep RD11, RD21, actual provider delivery, screen-reader, physical touch/software keyboard, real zoom, production fonts/photo/print, Board/Dashboard reliability and other recorded debt. P5-13 remains withheld; P7-06F remains deferred. F04 ingress, backup/restore, schema/configuration verification and tested rollback still prevent production acceptance. + +## Remaining acceptance work + +Complete visual review, run finite documentation/secret/whitespace/route/preservation checks, then commit this bounded repair and verify the normal development push against HEAD. Record the commit and actual receipt after the push. Carry the generic saved-draft locale residual into P7-11 and preserve all manual qualifications. Proceed to the approved P7-07 metadata contract before its Documents UI; do not restructure correspondence persistence there. + +**Compose/send acceptance: PENDING. Overall P7-06: ongoing. Production: NO-GO; main unchanged. Phase 8 implementation: none.** + +### Final visual observation + +All **47 final PNGs** were actually displayed and reviewed: root16 and independent reviewer31, with exact per-image references in the portable result. No blocking visual defect was found. Full-page/sticky/dialog/transition captures and resized long images retain their stated limits. In addition to the opening-locale draft-context label, English singular count copy (`1 attachments`, `1 items`) remains a P7-11 residual. No human reader, physical-device, zoom, provider or production acceptance follows. Final runtime/source/visual gates establish bounded **CONDITIONAL GO**; finite hygiene and normal development push follow below. + +Final compose hygiene PASS observed2026-10-14 11:01:54.856146UTC: secret/working/staged/phase whitespace gates pass,16 docs/486 local links resolve,57 groups56PARTIAL/C11DEFERRED and32original routes retained. All47finalimages actually reviewed. Implemented scope CONDITIONAL GO; normal development push pending, productionNO-GO/mainunchanged. diff --git a/docs/redesign/phase-7/p7-06/INBOX.md b/docs/redesign/phase-7/p7-06/INBOX.md index d7afa1c..dcb27c8 100644 --- a/docs/redesign/phase-7/p7-06/INBOX.md +++ b/docs/redesign/phase-7/p7-06/INBOX.md @@ -61,3 +61,5 @@ All 57 preservation groups remain **56 PARTIAL / PRES-C11 DEFERRED** and 32 rout Complete review and push this second boundary before implementing the separately scoped compose/send repair. Preserve exact draft identity/revision and uncertain-delivery safeguards there. **P5-13 remains withheld; P7-06F remains deferred; production remains NO-GO; main is unchanged; Phase 8 has not started.** Final inbox hygiene PASS observed2026-10-14 05:14:23UTC: secret and working/staged/phase whitespace gates pass,15 docs/474 local links resolve,57 groups and32 routes retained. Normal development push pending; main unchanged. + +Inbox/read committed and normal push verified **a791e353b062cc91e10429cd767350ec9f0aaef2** at2026-10-14T05:14:53.828571UTC: cleanHEAD=origin=live development; local/origin/live main27657f3 unchanged. Second slice implemented CONDITIONAL GO; overallP7-06 ongoing. Mandatory compose/send follows; no production or Phase8 action. diff --git a/docs/redesign/phase-7/p7-06/README.md b/docs/redesign/phase-7/p7-06/README.md index 5f739cb..d19353b 100644 --- a/docs/redesign/phase-7/p7-06/README.md +++ b/docs/redesign/phase-7/p7-06/README.md @@ -1,53 +1,35 @@ # P7-06 — Remaining Application forms and global correspondence -**Overall P7-06: ongoing. Embedded forms: implemented-scope CONDITIONAL GO, committed and pushed. Inbox/read review: bounded CONDITIONAL GO; final static checks and normal push pending. Compose/send: next mandatory boundary.** +**Implemented scope: CONDITIONAL GO.** All three approved boundaries are implemented. Embedded forms and inbox/read are normally pushed; compose/send has final runtime evidence, with hygiene and normal push pending below. Production remains NO-GO; main unchanged. P7-06F stays DEFERRED. -Follow the exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries). P7-06 has three sequential implementation boundaries: embedded forms → inbox/read review → compose/send. Optional P7-06F remains **DEFERRED** until its exact mode→draft/review action and fallback are decided. +The exact [approved handoff](../../phase-6/p6-05/PHASE7_HANDOFF.md#migration-order-and-commit-boundaries) governs the sequence: embedded forms → inbox/read review → compose/send. No generic Documents persistence, new provider capability, withheld AI review or Phase8 feature was introduced. -## Current checkpoint status - -| Boundary | Current result | Evidence and remaining work | +| Boundary | Outcome | Evidence | |---|---|---| -| Embedded Application forms | Implemented-scope **CONDITIONAL GO**; normal push verified | [Forms report](FORMS.md), [portable results](evidence/forms-results.json). Commit `4c3254c472871d1cac05abcef502feb4a1be435b`; RD11 and manual qualifications remain | -| Inbox/read review | Bounded **CONDITIONAL GO**; static checks and normal push pending | [Inbox report](INBOX.md), [entry evidence](evidence/inbox-entry.json). Latest affected units **42/5 PASS**, final native **8/8 PASS**, app/browser TypeScript, lint and build pass; manual/provider/reliability qualifications remain | -| Compose/send | **Not implemented at this boundary** | Repair the [confirmed safety dependency](../DEBT.md#p7-06-confirmed-compose-safety-entry-dependency) coherently after the inbox slice. Preserve draft revisions, explicit confirmation, uncertain delivery and deliberate failed-attempt recovery | +| Embedded forms | Implemented-scope CONDITIONAL GO; pushed4c3254c472871d1cac05abcef502feb4a1be435b | [Forms report](FORMS.md), [results](evidence/forms-results.json); affected55/4, backend30; final native9PASS/1FAIL retains strict RD11 language204→500. Current Jobs5/P2-D01ordinary1 yields15/1 relevant16; earlier CV4/Career11 yields30/1 qualified31. All23/111 current forms images reviewed;55qualifiedaxe0/741 | +| Inbox/read | Implemented-scope CONDITIONAL GO; pusheda791e353b062cc91e10429cd767350ec9f0aaef2 | [Inbox report](INBOX.md), [results](evidence/inbox-results.json); affected42/5, existing backend25, native8/8,20reviewed images/20 axe0/84. Owned trashed-parent messages56/page50+6/detail200 preserved; foreign/anonymous denied | +| Compose/send | Implemented-scope CONDITIONAL GO; final hygiene/normal push pending | [Compose report](COMPOSE.md), [results](evidence/compose-results.json). Compose affected52/5 and fresh backend25 PASS; native10+inbox8+ordinaryP2-D01=19 PASS on LFCrTZzDtX5hNBSRBj5Xx; app/browser TypeScript, lint and build PASS. Actual image review 47/47; all-enabled44scans0violations/330incompletes triaged, human/device/provider qualifications remain. +10front/+0suites,+10browser,+7backend derive739/94,301,1041 only; no integrated full-suite claim. | -The forms push was observed on **2026-10-13 at 21:27:19.353249 UTC**: clean local HEAD = origin = live `codex/ui-redesign-phase4`. Local/origin/live `main` remained `27657f31131cd95d42f0e1290853ec9c9b3959a4`. This receipt establishes source synchronization; it does not add human or production acceptance. +## Final compose behavior -## Completed forms evidence +Captured draft identity and synchronous operation ownership prevent duplicate or conflicting actions. Complete recipient/subject/body dirty state survives replacement Cancel, conflicts and definitive-failure preparation. Protected delivery states preserve the sending identity; generic409 remains uncertain, with no implicit resend/new attempt. Only an authoritative failed attempt permits deliberate server-side identity rotation. Confirmed send and captured-revision cleanup remain explicit. -The forms slice preserves the seven-section workspace, CV cardinality and associations, existing letter/answer encoding, additive history, owned attachments and frozen package bytes. It adds generation/identity guards, durable GET-only recovery, deliberate dirty Restore confirmation and synchronous Save/AI Apply ownership. The later aggregate repair prevents one job's drafts from populating another job while its read is pending. +Draft/setup errors use durable GET-only Retry. A successful write followed by a failed list refresh retains actual saved identity and never repeats the write. Late completions cannot mutate a different or unmounted draft. Current-locale feedback, shared headings/density/focus and character-counter contrast use existing infrastructure. Four DTO date expressions mark existing UTC values consistently after SQLite round trips; ticks, stored data, ownership, revisions and content are unchanged. -Latest affected frontend tests pass **55 cases/4 suites**; the unchanged backend subset passes **30 cases** on the same Release DLL with `--no-build`. Final forms build `9sM6acEkOGxgN5fTRZXdE` records **9 pass/1 fail of 10** native cases. The strict actual Bokmål language save expected HTTP204 and received HTTP500: **RD11 remains an ordinary failure**. Fresh Jobs5 and ordinary P2-D01 give **15 pass/1 fail of 16** on that build. Qualified earlier-build CV4/Career11 extend the relevant observation to **30 pass/1 fail of 31**; they are not fresh current-build executions. +All failed unit/native attempts remain in the compose report. Two fixture corrections establish independent delivery-state documents and actual destination rendering before unmount assertions; retries/skips/expected-failure markers and weakened data assertions were not used. -All **23/111 latest forms PNGs** were displayed and reviewed; the other 88 retained consumer images were not reviewed in that continuation. Across the qualified forms/Jobs/CV/Career lanes, **55 recorded axe scans** contain **0 violations/741 incomplete nodes**. Raw vectors and source/build limits remain in the forms report. Missing locale captures and changed scan scope do not establish contrast improvement. App/browser TypeScript, lint, build and finite static checks passed before the verified forms push. +## Count and preservation reconciliation -## Inbox/read scope +| Inventory | P7-06 entry | Forms | Inbox | Compose | Derived total | +|---|---:|---:|---:|---:|---:| +| Frontend cases/suites | 706/94 | +11/0 | +12/0 | +10/0 | **739/94** | +| Browser cases | 273 | +10 | +8 | +10 | **301** | +| Backend cases | 1034 | +0 | +0 | +7 | **1041** | -The second slice retains existing owner-paginated correspondence, detail/provider fallback, URL filters/pages, legacy alias and job Back context. It reuses shared surfaces, semantic headings, feedback and focus patterns. Read ownership prevents late or unrelated results from changing the active query; explicit recovery retains drafts and does not replay a saved decision POST. +These inventories are not fresh full-suite pass counts. Actual whole573/89frontend,1033backend and49sidecar remain inherited until P7-12. Relevant preserved contracts include W01/W05–W10, M01–M06 and E08/E09; all57wholegroups remain56PARTIAL/C11DEFERRED,32routes retained. OrdinaryP2-D01 freshly passes; pagination renderer and frozen bytes remain protected. -The saved correspondence contract includes owned messages associated with jobs in Trash. The native oracle preserves all **56 owned messages**, exact ordering, pages **50/6**, owned trashed-message detail and foreign-resource denial. The earlier expected total 55 was a false policy assumption, retained as failed evidence rather than represented as a backend regression. +M01–M12, provider grants/delivery, physical touch/software keyboard, human reader/zoom, production fonts/photo/print and release evidence remain unverified. Latest strict language204 passes do not diagnose earlier RD11. RD21 and other [debt](../DEBT.md) remain. P5-13/C11 stays withheld32cases/366required/0calls/0human;06F awaits its exact action/fallback decision. -See [INBOX.md](INBOX.md) for meaningful RED/GREEN progression, the final-run boundary and provider-fixture limits. Compose persistence and send behavior remain the third slice. +Next approved checkpoint is **P7-07**: metadata-only authenticated paginated contract commit first, then Documents UI. Do not start Phase8 or deploy. -Final inbox build `uhKavi8_u6PrcEm2rZ1On` ran all eight native cases on 2026-10-14 at 05:09:27.486825–05:10:16.147321 UTC, with zero failed/skipped/flaky cases. All 16 captured pre/post sources match. All 20 latest PNGs were displayed and reviewed; all20 all-enabled axe scans record 0 violations/84 incomplete nodes. The incompletes require human contrast assessment, and full-page image review retains narrow/sticky/zoom/device limits. Strict real language HTTP204 passes in this fixture; separately reproduced RD11 remains intermittent and undiagnosed. - -## Count reconciliation - -| Inventory | Entry | Forms additions | Inbox additions | Current derived total | -|---|---:|---:|---:|---:| -| Frontend cases/suites | 706/94 | +11 cases/+0 suites | +12 cases/+0 suites | **729/94** | -| Browser cases | 273 | +10 | +8 | **291** | -| Backend cases | 1,034 | +0 | +0 | **1,034** | - -These are **derived inventories**, not a fresh integrated pass count. Latest actual whole frontend **573/89**, backend **1,033** and sidecar **49** remain inherited. P7-12 requires fresh integrated regression and an explanation of every changed count. - -## Preservation and remaining gates - -All **57 preservation groups remain 56 PARTIAL / PRES-C11 DEFERRED**, with **32 routes** retained. Current forms and inbox evidence narrows particular workflow risks; it does not mark entire groups complete. Preserve Career Profile/CV scope, frozen packages, original paging/search semantics and server-side authorization. Bodyless restore without ExpectedVersion and partial-write behavior remain under RD21. - -Compose/send must establish captured draft identity, synchronous Save–Send protection, complete dirty-field handling, revision/conflict recovery, explicit confirmed send, uncertain-delivery protection and a deliberate new attempt after definitive failure. Do not automatically send or resend. No generic Documents persistence or second renderer belongs in this boundary. - -M01–M12 remain **NOT VERIFIED**. Actual screen-reader, physical touch/software keyboard, real zoom, provider, fonts/photo/native print and release evidence remain qualified. RD11 stays open; P5-13 stays withheld; P7-06F stays deferred. **Production: NO-GO; main unchanged. Phase 8 implementation: none.** - -Final inbox hygiene PASS observed2026-10-14 05:14:23UTC: secret and working/staged/phase whitespace gates pass,15 docs/474 local links resolve,57 groups and32 routes retained. Normal development push pending; main unchanged. +Final compose hygiene PASS observed2026-10-14 11:01:54.856146UTC: secret/working/staged/phase whitespace gates pass,16 docs/486 local links resolve,57 groups56PARTIAL/C11DEFERRED and32original routes retained. All47finalimages actually reviewed. Implemented scope CONDITIONAL GO; normal development push pending, productionNO-GO/mainunchanged. diff --git a/docs/redesign/phase-7/p7-06/evidence/compose-entry.json b/docs/redesign/phase-7/p7-06/evidence/compose-entry.json new file mode 100644 index 0000000..7a7c998 --- /dev/null +++ b/docs/redesign/phase-7/p7-06/evidence/compose-entry.json @@ -0,0 +1,293 @@ +{ + "checkpoint": "P7-06", + "slice": "Compose/send", + "recordedUtc": "2026-10-14T05:19:18.411345+00:00", + "precedingInboxPush": { + "observedUtc": "2026-10-14T05:14:53.828571+00:00", + "branch": "codex/ui-redesign-phase4", + "head": "a791e353b062cc91e10429cd767350ec9f0aaef2", + "originDevelopment": "a791e353b062cc91e10429cd767350ec9f0aaef2", + "liveDevelopment": "a791e353b062cc91e10429cd767350ec9f0aaef2", + "main": "27657f31131cd95d42f0e1290853ec9c9b3959a4", + "originMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4", + "liveMain": "27657f31131cd95d42f0e1290853ec9c9b3959a4", + "workingTreeClean": true, + "pendingPaths": [], + "commands": [ + { + "command": [ + "rtk", + "proxy", + "git", + "branch", + "--show-current" + ], + "exitCode": 0, + "stdout": "codex/ui-redesign-phase4\n", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + }, + { + "command": [ + "rtk", + "proxy", + "git", + "rev-parse", + "HEAD" + ], + "exitCode": 0, + "stdout": "a791e353b062cc91e10429cd767350ec9f0aaef2\n", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + }, + { + "command": [ + "rtk", + "proxy", + "git", + "rev-parse", + "origin/codex/ui-redesign-phase4" + ], + "exitCode": 0, + "stdout": "a791e353b062cc91e10429cd767350ec9f0aaef2\n", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + }, + { + "command": [ + "rtk", + "proxy", + "git", + "rev-parse", + "main" + ], + "exitCode": 0, + "stdout": "27657f31131cd95d42f0e1290853ec9c9b3959a4\n", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + }, + { + "command": [ + "rtk", + "proxy", + "git", + "rev-parse", + "origin/main" + ], + "exitCode": 0, + "stdout": "27657f31131cd95d42f0e1290853ec9c9b3959a4\n", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + }, + { + "command": [ + "rtk", + "proxy", + "git", + "ls-remote", + "origin", + "refs/heads/codex/ui-redesign-phase4", + "refs/heads/main" + ], + "exitCode": 0, + "stdout": "a791e353b062cc91e10429cd767350ec9f0aaef2\trefs/heads/codex/ui-redesign-phase4\n27657f31131cd95d42f0e1290853ec9c9b3959a4\trefs/heads/main\n", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + }, + { + "command": [ + "rtk", + "proxy", + "git", + "status", + "--porcelain=v1" + ], + "exitCode": 0, + "stdout": "", + "stderr": "[rtk] /!\\ No hook installed — run `rtk init -g` for automatic token savings\n" + } + ] + }, + "baseline": { + "actual": { + "numPassedTests": 42, + "numFailedTests": 0, + "numPendingTests": 0, + "numTodoTests": 0, + "numPassedTestSuites": 5, + "numFailedTestSuites": 0 + }, + "asRun": { + "command": [ + "rtk", + "proxy", + "npm.cmd", + "test", + "--", + "--runInBand", + "--watchAll=false", + "--json", + "--outputFile=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\unit\\p706-inbox-history-green-20261014-review-20261014T050844Z.json", + "src/correspondence-inbox-page.test.tsx", + "src/gmail-review-page.test.tsx", + "src/correspondence-gmail-import.test.tsx", + "src/correspondence-search-context.test.ts", + "src/email-provider-connections.test.tsx" + ], + "startedUtc": "2026-10-14T05:08:44.577597+00:00", + "finishedUtc": "2026-10-14T05:09:06.324638+00:00", + "exitCode": 0, + "counts": { + "numPassedTests": 42, + "numFailedTests": 0, + "numPendingTests": 0, + "numTodoTests": 0, + "numPassedTestSuites": 5, + "numFailedTestSuites": 0 + } + }, + "sourceEquivalence": "All14 earlierGREEN frozenasrun bytes equalpublished a791 GitblobsunderUTF8/LF. RawWindowsCRLF hashes retained separately; not a newexecution atcleancommit. Original42 mandatoryinexpandedRED/GREEN.", + "sources": [ + { + "path": "job-tracker-ui/src/correspondence-inbox-page.test.tsx", + "sha256": "494e4e7da11a5910cd55b742837ca250ff0fa3efa9d28994eda15e98371b7ddf", + "bytes": 50069 + }, + { + "path": "job-tracker-ui/src/gmail-review-page.test.tsx", + "sha256": "e67ca4f4f5bbd38043c4420159124dd98cad9789ebbfc380ebc1c2772a46b2a9", + "bytes": 16559 + }, + { + "path": "job-tracker-ui/src/correspondence-gmail-import.test.tsx", + "sha256": "fbe0592502fa180ea32cbe18c700894f5e0da36b58f9320e0954dcb39d3c4cc0", + "bytes": 16504 + }, + { + "path": "job-tracker-ui/src/correspondence-search-context.test.ts", + "sha256": "91dfb843add49d1d68f083f22c5106dffa04b1322decb88f79de2ca140ac23ad", + "bytes": 986 + }, + { + "path": "job-tracker-ui/src/email-provider-connections.test.tsx", + "sha256": "b8e090601bc7790bb1457e574d7bcf54c20d876c664f82d5b47176536494ff27", + "bytes": 3517 + }, + { + "path": "job-tracker-ui/src/views/CorrespondenceInboxPage.tsx", + "sha256": "0929313b17ef18e3397251329c975ea87d151d03b17b5b372dfa2dc07bff382d", + "bytes": 43643 + }, + { + "path": "job-tracker-ui/src/views/GmailReviewPage.tsx", + "sha256": "b3674c1d5e0776a86af6996eecfe7ef9f707fe5e9d7f9ac94891ea93d3bd5d9e", + "bytes": 19744 + }, + { + "path": "job-tracker-ui/src/components/EmailProviderConnections.tsx", + "sha256": "174eab8de4f89e6aa69b954de5d06d6361d6a7b77116ab8b47133f3c768042ed", + "bytes": 9715 + }, + { + "path": "job-tracker-ui/src/components/Correspondence.tsx", + "sha256": "e0869cf484c202ab7faa508a9d5db720d4b46ac8c99a6f0eeb355cf7fb38b31b", + "bytes": 41057 + }, + { + "path": "job-tracker-ui/src/types.ts", + "sha256": "a45779b0b7868c4a69ed4a17316899074416fc8c6f8f6c083827e949f790d7b1", + "bytes": 13452 + }, + { + "path": "job-tracker-ui/src/i18n/translations.ts", + "sha256": "de67f2ef3f83dad4f70310a1cdb517a4423f3826cc9dabfe6bbf041f3c09a2cc", + "bytes": 317202 + }, + { + "path": "job-tracker-ui/src/components/ViewStateNotice.tsx", + "sha256": "fd4bb314346a1603d9e01a15fd02f01576b9fd959e83f8ff0b1dfe5ec94378e9", + "bytes": 2340 + }, + { + "path": "job-tracker-ui/src/hooks/useViewResource.ts", + "sha256": "8c73a2fd845b8bc4c4c10b7c69f8d12dae8e83c434c537558a78b74377511b27", + "bytes": 3292 + }, + { + "path": "job-tracker-ui/src/i18n/I18nProvider.tsx", + "sha256": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113", + "bytes": 3184 + } + ], + "publishedCanonicalLfMatches": [ + { + "path": "job-tracker-ui/src/correspondence-inbox-page.test.tsx", + "sha256Lf": "9e50b3cf9b5111d762d7947a4e45ac7cd4b4f3ecea5f95e07314fa679497c391", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/gmail-review-page.test.tsx", + "sha256Lf": "667bdfe4aa2cae9669777a066a8df2b7b7bf1fbb1fe719f20204bf3360231790", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/correspondence-gmail-import.test.tsx", + "sha256Lf": "3ee780a8036b24859982e5f07bd5789f093b17bd79a428d4baee8d9a2c2695e3", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/correspondence-search-context.test.ts", + "sha256Lf": "8fc52ff3e10827e96194d6eb293e4872f65d4c73213b0b29e275bad9bbac5b15", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/email-provider-connections.test.tsx", + "sha256Lf": "6924ea09580a11871cf5abd4548e0f89078963306a09d2001a160dca517d66fb", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/views/CorrespondenceInboxPage.tsx", + "sha256Lf": "ad7978b0833129fb74e99120285010c21c721547350e4ad886eaec62590b496a", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/views/GmailReviewPage.tsx", + "sha256Lf": "5e87cad1c5f5118fdd6d62d3aae35b83b3ab10d8d60722ed18c1dbb4487f9890", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/components/EmailProviderConnections.tsx", + "sha256Lf": "c6bfd306580688d5aca274b48f33bf8a283c37c3d059953624fe2a7e4953acde", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/components/Correspondence.tsx", + "sha256Lf": "e0fc56591a1ccc88e4bbe68b119e989cc011aa1f754a1870bbdb2cc33ffc72eb", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/types.ts", + "sha256Lf": "d7b551f669415f752fdc38850367fd89257e3f6d6c9d8b459cbf1a1ad91f6a85", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/i18n/translations.ts", + "sha256Lf": "de67f2ef3f83dad4f70310a1cdb517a4423f3826cc9dabfe6bbf041f3c09a2cc", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/components/ViewStateNotice.tsx", + "sha256Lf": "7b6c3e6c311860897eb5327936dbb129e860781929cfd9a4d4e17f81c607c70c", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/hooks/useViewResource.ts", + "sha256Lf": "5912131c525ba85ae6994efc38306a10ec2e673cc0082686226b59f00df5da99", + "publishedGitBlobMatches": true + }, + { + "path": "job-tracker-ui/src/i18n/I18nProvider.tsx", + "sha256Lf": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113", + "publishedGitBlobMatches": true + } + ] + }, + "contract": "DraftserverUUID/rev1;PUT/DELETEcapturedrevision;Failed-onlyatomicnewattempt;confirmedownedUUIDpayloadhashsend. StoredDraftDTOhasnoattemptstatus. AuthSMTPfixture isnotGmail/Graphcompose. NoAPI/schema/provider/inference/productionchange.", + "requiredProof": "SynchronouscapturedSave-Send-discard-prepare-replacementconfirmation;completefieldsdirty;noimplicituncertain/terminalrotation;authoritativeFailedexplicitnewattemptonly;generic409notFailed;GETonlyRetry;unmountidentity;realHTTPdraftrevisiontenant/safedisconnectedsend;UIstatusfixturesqualified.", + "acceptance": "PENDING_RED_IMPLEMENTATION_RUNTIME_VISUAL_STATIC_PUSH", + "preservation": "57groups56PARTIAL/C11DEFERRED32routes;M04next06FdeferredP513withheldmainunchangedproductionNO-GO" +} diff --git a/docs/redesign/phase-7/p7-06/evidence/compose-results.json b/docs/redesign/phase-7/p7-06/evidence/compose-results.json new file mode 100644 index 0000000..3b3de09 --- /dev/null +++ b/docs/redesign/phase-7/p7-06/evidence/compose-results.json @@ -0,0 +1,3223 @@ +{ + "schemaVersion": 1, + "checkpoint": "P7-06", + "slice": "Compose/send", + "recordedUtc": "2026-10-14T11:01:30.155858+00:00", + "acceptance": "COMPOSE_IMPLEMENTED_SCOPE_CONDITIONAL_GO_HYGIENE_PASS_NORMAL_PUSH_PENDING", + "precedingInboxCommit": "a791e353b062cc91e10429cd767350ec9f0aaef2", + "immutableFinalCapsule": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/results.json", + "bytes": 309463, + "sha256": "21a02c6d67dc2732e4a230787261b406be8db3100d5df3a10065f5669f482a11", + "hashPolicy": "Exact raw bytes" + }, + "verifiedFileReferences": 404, + "unit": { + "result": { + "path": ".artifacts/phase7/p7-06/compose/unit-final/results.json", + "bytes": 2813, + "sha256": "205a2969a0af011211f8c7c357ef11e0d2941e8b333c34182dda367ca5a13b08", + "hashPolicy": "Exact raw bytes" + }, + "capturedAtUtc": "2026-10-14T06:01:51.616955+00:00", + "allSourcesMatchPreRun": true, + "prefix": "p706-compose-final-20261014-review-20261014T060056Z", + "command": { + "command": [ + "rtk", + "proxy", + "npm.cmd", + "test", + "--", + "--runInBand", + "--watchAll=false", + "--json", + "--outputFile=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\unit\\p706-compose-final-20261014-review-20261014T060056Z.json", + "src/correspondence-inbox-page.test.tsx", + "src/gmail-review-page.test.tsx", + "src/correspondence-gmail-import.test.tsx", + "src/correspondence-search-context.test.ts", + "src/email-provider-connections.test.tsx" + ], + "startedUtc": "2026-10-14T06:00:56.823199+00:00", + "finishedUtc": "2026-10-14T06:01:25.904825+00:00", + "exitCode": 0, + "counts": { + "numPassedTests": 52, + "numFailedTests": 0, + "numPendingTests": 0, + "numTodoTests": 0, + "numPassedTestSuites": 5, + "numFailedTestSuites": 0 + } + }, + "counts": { + "numPassedTests": 52, + "numFailedTests": 0, + "numPendingTests": 0, + "numTodoTests": 0, + "numPassedTestSuites": 5, + "numFailedTestSuites": 0 + }, + "suites": [ + { + "name": "correspondence-inbox-page.test.tsx", + "passed": 34, + "failed": 0 + }, + { + "name": "correspondence-gmail-import.test.tsx", + "passed": 6, + "failed": 0 + }, + { + "name": "gmail-review-page.test.tsx", + "passed": 7, + "failed": 0 + }, + { + "name": "email-provider-connections.test.tsx", + "passed": 3, + "failed": 0 + }, + { + "name": "correspondence-search-context.test.ts", + "passed": 2, + "failed": 0 + } + ], + "frozenRawFiles": [ + { + "path": ".artifacts/phase7/p7-06/compose/unit-final/raw/p706-compose-final-20261014-review-20261014T060056Z.json", + "sha256": "5620b3a8a797188dc65644b4dcc3365d889b27d5ed9047e63dc6950bf9768117", + "bytes": 24643 + }, + { + "path": ".artifacts/phase7/p7-06/compose/unit-final/raw/p706-compose-final-20261014-review-20261014T060056Z.log", + "sha256": "5c59f8194542f26265a267b89d2f769f2554fe2f48f06eb48b9f251915fbae5a", + "bytes": 947 + }, + { + "path": ".artifacts/phase7/p7-06/compose/unit-final/raw/p706-compose-final-20261014-review-20261014T060056Z-command.json", + "sha256": "79e2c04070eea3d6cc1e48455bd40adfb7e7108535214339697d786573ceda89", + "bytes": 853 + } + ], + "qualification": "Final52ordinaryPASSafterMessagehelperdisabledcontrastcolorcorrection. Alltestsunchanged; nativecontrastqualifications independentlyownednotclaimedfromJest. MockedAxios/Jestonly no native/provider/model." + }, + "backend": { + "passed": 25, + "failed": 0, + "command": { + "command": [ + "rtk", + "proxy", + "C:/Users/Connor/.dotnet/dotnet.exe", + "test", + "JobTrackerApi.Tests/JobTrackerApi.Tests.csproj", + "--configuration", + "Release", + "--no-restore", + "--filter", + "FullyQualifiedName~EmailDraftsControllerTests|FullyQualifiedName~EmailDraftPersistenceTests|FullyQualifiedName~EmailSendControllerTests|FullyQualifiedName~EmailSendAttemptStoreTests", + "--logger", + "trx;LogFileName=career.trx", + "--results-directory", + "E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\backend-career\\p706-compose-utc-green-20261014-20261014T055302Z" + ], + "startedUtc": "2026-10-14T05:53:02.535746+00:00", + "finishedUtc": "2026-10-14T05:53:11.849241+00:00", + "exitCode": 0, + "logSha256": "917b3b4dcdcfb1c4746544d17d261cded08d896fd69e88cd2031dc15171c843e", + "counts": { + "total": 25, + "passed": 25, + "failed": 0, + "notExecuted": 0 + }, + "resultSha256": "410fe105886be55f917cf332cd2fb0b786c445cd0bc45074683ad51618b45d35" + }, + "raw": [ + { + "path": ".artifacts/phase7/current/backend-career/p706-compose-utc-green-20261014-20261014T055302Z/command.json", + "bytes": 1051, + "sha256": "cf115bfd51586818690f06cc1333f3dd81f701303ffa01511c942acd7a58f3e2", + "hashPolicy": "Exact raw bytes" + }, + { + "path": ".artifacts/phase7/current/backend-career/p706-compose-utc-green-20261014-20261014T055302Z/career.log", + "bytes": 999, + "sha256": "917b3b4dcdcfb1c4746544d17d261cded08d896fd69e88cd2031dc15171c843e", + "hashPolicy": "Exact raw bytes" + }, + { + "path": ".artifacts/phase7/current/backend-career/p706-compose-utc-green-20261014-20261014T055302Z/career.trx", + "bytes": 37437, + "sha256": "410fe105886be55f917cf332cd2fb0b786c445cd0bc45074683ad51618b45d35", + "hashPolicy": "Exact raw bytes" + } + ], + "preSource": { + "path": ".artifacts/phase7/p7-06/compose/backend-utc-green/pre-source.json", + "bytes": 3282, + "sha256": "c247197371e17d5c3831a90e4de58c7fea856bdbc31c30a23442c88a40533c02", + "hashPolicy": "Exact raw bytes" + }, + "postSource": { + "path": ".artifacts/phase7/p7-06/compose/backend-utc-green/post-source.json", + "bytes": 3318, + "sha256": "06391553e87fe90311779580d9d31a5f0f2419a99eb68d42108f10e946c4f195", + "hashPolicy": "Exact raw bytes" + }, + "qualification": "Fresh Release compile and 25 ordinary cases: 18 existing + six failed-only ownership/status guards + one UTC DTO round-trip test. UTC RED24/1 then GREEN25/0, exact ticks/content/UUID/revisions and persisted source unchanged; not a whole backend run.", + "earlierCaptureCorrection": { + "path": ".artifacts/phase7/p7-06/compose/backend-final-source/capture-qualification.json", + "bytes": 859, + "sha256": "027793555b481d2d8541f191c0bc207e1abc98d89253c4545dd0349f4a74b727", + "hashPolicy": "Exact raw bytes" + } + }, + "native": { + "correspondence-compose": { + "command": { + "name": "correspondence-compose", + "command": [ + "rtk", + "proxy", + "node", + "node_modules/@playwright/test/cli.js", + "test", + "e2e/phase7-correspondence-compose.spec.ts", + "--retries=0", + "--reporter=list,json", + "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\correspondence-compose-results" + ], + "startedUtc": "2026-10-14T10:51:11.697665+00:00", + "finishedUtc": "2026-10-14T10:52:14.846477+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose-command.json", + "sha256": "5283276c9b64e47422b74d9544bc312182cc82c9561e7c6f8f03f95e6de6610a", + "bytes": 509, + "hashPolicy": "Exact measured raw bytes" + }, + "reportRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.log", + "sha256": "ce687ad287b1bb2b99eb1e53bdf4fa0f7a6d8b99980beca1065b6209d22dc056", + "bytes": 2506, + "hashPolicy": "Exact measured raw bytes" + }, + "stats": { + "startTime": "2026-10-14T10:51:12.198Z", + "duration": 62593.239, + "expected": 10, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "[P7-06 compose] real server-owned identity, revisions, stale conflict, reload and confirmed delete preserve exact draft content", + "file": "phase7-correspondence-compose.spec.ts", + "line": 97, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 4985 + }, + { + "title": "[P7-06 compose] anonymous and another owner cannot read, update, delete, prepare or associate a private draft", + "file": "phase7-correspondence-compose.spec.ts", + "line": 114, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 2516 + }, + { + "title": "[P7-06 compose] failed owned job choices provide GET-only Retry without claiming there are no jobs", + "file": "phase7-correspondence-compose.spec.ts", + "line": 127, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 2231 + }, + { + "title": "[P7-06 compose] saved-draft GET Retry and committed Save/list503 retain identity and never repeat the write", + "file": "phase7-correspondence-compose.spec.ts", + "line": 137, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 2712 + }, + { + "title": "[P7-06 compose] held captured Save locks conflicting controls and late unmounted completion preserves both owned drafts", + "file": "phase7-correspondence-compose.spec.ts", + "line": 145, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 4271 + }, + { + "title": "[P7-06 compose] recipient-only and subject-only draft Cancel retain edits and explicit send Cancel makes zero POSTs", + "file": "phase7-correspondence-compose.spec.ts", + "line": 158, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 3157 + }, + { + "title": "[P7-06 compose] real failed-attempt preparation changes only server identity and preserves all unsaved local fields for the next reviewed send", + "file": "phase7-correspondence-compose.spec.ts", + "line": 165, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 3245 + }, + { + "title": "[P7-06 compose] labelled uncertain pending sending sent and generic409 fixtures retain state with no implicit identity or resend", + "file": "phase7-correspondence-compose.spec.ts", + "line": 179, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 9800 + }, + { + "title": "[P7-06 compose] strict actual language204 preserves all dirty fields and saved identity without draft or setup rereads", + "file": "phase7-correspondence-compose.spec.ts", + "line": 196, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 2544 + }, + { + "title": "[P7-06 compose] eight finite bilingual theme widths retain long drafts and keyboard setup review Cancel with complete axe vectors", + "file": "phase7-correspondence-compose.spec.ts", + "line": 203, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 19705 + } + ], + "reportErrors": [], + "configuration": { + "version": "1.62.1", + "workers": 1, + "projects": [ + { + "name": "chromium", + "retries": 0 + } + ] + } + }, + "correspondence-read": { + "command": { + "name": "correspondence-read", + "command": [ + "rtk", + "proxy", + "node", + "node_modules/@playwright/test/cli.js", + "test", + "e2e/phase7-correspondence-read.spec.ts", + "--retries=0", + "--reporter=list,json", + "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\correspondence-read-results" + ], + "startedUtc": "2026-10-14T10:52:14.851996+00:00", + "finishedUtc": "2026-10-14T10:53:01.436862+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-read-command.json", + "sha256": "d53c3d57388de20be8ea292f10f4dbceaad59b709ae2cb60edcf1af95ae3f19a", + "bytes": 500, + "hashPolicy": "Exact measured raw bytes" + }, + "reportRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-read.json", + "sha256": "178905463530bf5c8499c883f13d9e39499f558a54a84d57e65f7b150d95bfa1", + "bytes": 4121224, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-read.log", + "sha256": "162d0f0d903c477cd3e208f5baa48049589ca374bc73df9bbf335446456ced3f", + "bytes": 2008, + "hashPolicy": "Exact measured raw bytes" + }, + "stats": { + "startTime": "2026-10-14T10:52:15.361Z", + "duration": 46024.899, + "expected": 8, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "[P7-06 read] actual owner page50, filters, ordering and job Back preserve saved-message context and ownership", + "file": "phase7-correspondence-read.spec.ts", + "line": 126, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 5458 + }, + { + "title": "[P7-06 read] initial503 Retry and held latest query remain distinct from true empty results", + "file": "phase7-correspondence-read.spec.ts", + "line": 163, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 3331 + }, + { + "title": "[P7-06 read] actual saved-detail Retry preserves its ID and Hide/another row cancel stale completion", + "file": "phase7-correspondence-read.spec.ts", + "line": 189, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 3327 + }, + { + "title": "[P7-06 read] qualified provider live-copy failure retries exact captured source before real saved fallback", + "file": "phase7-correspondence-read.spec.ts", + "line": 208, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 2330 + }, + { + "title": "[P7-06 read] strict real UI-language204 preserves inbox context, selected saved body and dirty review notes with zero read deltas", + "file": "phase7-correspondence-read.spec.ts", + "line": 226, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 3604 + }, + { + "title": "[P7-06 read] independent provider-status503 Retry only rereads status while saved owner messages remain usable", + "file": "phase7-correspondence-read.spec.ts", + "line": 243, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 2244 + }, + { + "title": "[P7-06 read] qualified paired review reads retain notes/filter and actual nonlinked decision recovery never replays committed POST", + "file": "phase7-correspondence-read.spec.ts", + "line": 258, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 4290 + }, + { + "title": "[P7-06 read] eight finite bilingual theme widths preserve long saved bodies and qualified review-note keyboard access", + "file": "phase7-correspondence-read.spec.ts", + "line": 297, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 14337 + } + ], + "reportErrors": [], + "configuration": { + "version": "1.62.1", + "workers": 1, + "projects": [ + { + "name": "chromium", + "retries": 0 + } + ] + } + }, + "application-p2d01": { + "command": { + "name": "application-p2d01", + "command": [ + "rtk", + "proxy", + "node", + "node_modules/@playwright/test/cli.js", + "test", + "e2e/redesign-preservation.spec.ts", + "--grep", + "legacy workspace preserves frozen documents", + "--retries=0", + "--reporter=list,json", + "--output=E:\\Storage\\Projects\\Active\\Job tracker\\.artifacts\\phase7\\current\\ui\\application-p2d01-results" + ], + "startedUtc": "2026-10-14T10:53:01.442415+00:00", + "finishedUtc": "2026-10-14T10:53:13.190106+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/application-p2d01-command.json", + "sha256": "aed6b8b27d041cdae4635bd4f5e914511d3401cda647ea2108d177c9fcdb6ee2", + "bytes": 558, + "hashPolicy": "Exact measured raw bytes" + }, + "reportRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/application-p2d01.json", + "sha256": "85902e4a8fb8419c8a43a8ffa0973a8fe30f6353f93babab12dcd30553bca4e0", + "bytes": 129887, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/application-p2d01.log", + "sha256": "f5406e937ff9e45f57ea372c3e481cba07f6afec30c6c3b83b5f76594a28966c", + "bytes": 674, + "hashPolicy": "Exact measured raw bytes" + }, + "stats": { + "startTime": "2026-10-14T10:53:01.962Z", + "duration": 11191.380000000001, + "expected": 1, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change", + "file": "redesign-preservation.spec.ts", + "line": 73, + "expectedStatus": "passed", + "project": "chromium", + "resultStatuses": [ + "passed" + ], + "retries": [ + 0 + ], + "errors": [ + [] + ], + "durationMs": 4227 + } + ], + "reportErrors": [], + "configuration": { + "version": "1.62.1", + "workers": 1, + "projects": [ + { + "name": "chromium", + "retries": 0 + } + ] + } + } + }, + "gates": [ + { + "command": { + "name": "typecheck", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "run", + "typecheck" + ], + "startedUtc": "2026-10-14T10:36:14.414955+00:00", + "finishedUtc": "2026-10-14T10:36:23.857217+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/typecheck-command.json", + "sha256": "25b80dc589180d5e21c15bb31bbbc82c5e74fb5dbb76c237a17d6ae33115b994", + "bytes": 247, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/typecheck.log", + "sha256": "89b0ec97b537eca6560c13ca2dfea9e3a97dd1bb35580c4ff39d2462db25e080", + "bytes": 148, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "command": { + "name": "lint", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "run", + "lint" + ], + "startedUtc": "2026-10-14T10:36:23.859260+00:00", + "finishedUtc": "2026-10-14T10:36:42.504950+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/lint-command.json", + "sha256": "8892ab7740415427e8e2044c0fbbc528003411abc0e859b3eda5338c43b6d502", + "bytes": 237, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/lint.log", + "sha256": "b040dbeca9b4adb3f6f4c25ac49de0d37e921375b2d9b57e87b542a10f599913", + "bytes": 136, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "command": { + "name": "browser-typecheck", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "exec", + "tsc", + "--", + "--project", + "../.artifacts/phase7/e2e-tsconfig.json", + "--noEmit" + ], + "startedUtc": "2026-10-14T10:51:06.686512+00:00", + "finishedUtc": "2026-10-14T10:51:11.691657+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/browser-typecheck-command.json", + "sha256": "2fbc20be5c9a68128ddde97ccfe35028b0bd5dd2d7730cdf17a38fc5916ed8b7", + "bytes": 343, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/browser-typecheck.log", + "sha256": "d2993bc68ad9a63f711c8f5473155e2ba00fdcd461220cc3849185f2f9ad93e6", + "bytes": 78, + "hashPolicy": "Exact measured raw bytes" + } + }, + { + "command": { + "name": "build", + "command": [ + "rtk", + "proxy", + "npm.cmd", + "run", + "build" + ], + "startedUtc": "2026-10-14T10:36:47.552001+00:00", + "finishedUtc": "2026-10-14T10:36:54.413694+00:00", + "exitCode": 0 + }, + "commandRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/build-command.json", + "sha256": "9c1505800d19af427d5878adc2859675a1cf28d08f0c4861e6872192c2d66ab4", + "bytes": 239, + "hashPolicy": "Exact measured raw bytes" + }, + "logRaw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/gates/build.log", + "sha256": "5cd66a1d0548a649d44c2054e461f06cfc7c4ddadf693aea0bc6b4d15d5c25c2", + "bytes": 670, + "hashPolicy": "Exact measured raw bytes" + } + } + ], + "buildId": "LFCrTZzDtX5hNBSRBj5Xx", + "export": { + "count": 74, + "sha256": "569954e8909ed96298d4aa7c219a60cf2c35c22bc05c3fd009f3fa77b5404962", + "policy": "Windows Path sort; original output path + TAB + exact raw file SHA + LF" + }, + "sourceSnapshots": [ + { + "originalSourcePath": "job-tracker-ui/src/correspondence-inbox-page.test.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/correspondence-inbox-page.test.tsx", + "sha256": "01989bec3ffa248704a1c37707ea0ac444285336b3520e847bdc09cdbb3e3e45", + "bytes": 74077, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/correspondence-inbox-page.test.tsx", + "sha256": "3649d3353495888e69ea299be0aed159c8416b6491f119d9c7a1eaae509677e2", + "bytes": 72924, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/gmail-review-page.test.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/gmail-review-page.test.tsx", + "sha256": "e67ca4f4f5bbd38043c4420159124dd98cad9789ebbfc380ebc1c2772a46b2a9", + "bytes": 16559, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/gmail-review-page.test.tsx", + "sha256": "667bdfe4aa2cae9669777a066a8df2b7b7bf1fbb1fe719f20204bf3360231790", + "bytes": 16287, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/correspondence-gmail-import.test.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/correspondence-gmail-import.test.tsx", + "sha256": "fbe0592502fa180ea32cbe18c700894f5e0da36b58f9320e0954dcb39d3c4cc0", + "bytes": 16504, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/correspondence-gmail-import.test.tsx", + "sha256": "3ee780a8036b24859982e5f07bd5789f093b17bd79a428d4baee8d9a2c2695e3", + "bytes": 16087, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/correspondence-search-context.test.ts", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/correspondence-search-context.test.ts", + "sha256": "91dfb843add49d1d68f083f22c5106dffa04b1322decb88f79de2ca140ac23ad", + "bytes": 986, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/correspondence-search-context.test.ts", + "sha256": "8fc52ff3e10827e96194d6eb293e4872f65d4c73213b0b29e275bad9bbac5b15", + "bytes": 969, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/email-provider-connections.test.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/email-provider-connections.test.tsx", + "sha256": "b8e090601bc7790bb1457e574d7bcf54c20d876c664f82d5b47176536494ff27", + "bytes": 3517, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/email-provider-connections.test.tsx", + "sha256": "6924ea09580a11871cf5abd4548e0f89078963306a09d2001a160dca517d66fb", + "bytes": 3452, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/views/CorrespondenceInboxPage.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/views/CorrespondenceInboxPage.tsx", + "sha256": "38ed35060aab502bf64c947dfad6d6e0cc9e4970d7ee16dd3518a3da1d3543f4", + "bytes": 50351, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/views/CorrespondenceInboxPage.tsx", + "sha256": "38ed35060aab502bf64c947dfad6d6e0cc9e4970d7ee16dd3518a3da1d3543f4", + "bytes": 50351, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/views/GmailReviewPage.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/views/GmailReviewPage.tsx", + "sha256": "b3674c1d5e0776a86af6996eecfe7ef9f707fe5e9d7f9ac94891ea93d3bd5d9e", + "bytes": 19744, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/views/GmailReviewPage.tsx", + "sha256": "5e87cad1c5f5118fdd6d62d3aae35b83b3ab10d8d60722ed18c1dbb4487f9890", + "bytes": 19405, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/components/EmailProviderConnections.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/components/EmailProviderConnections.tsx", + "sha256": "174eab8de4f89e6aa69b954de5d06d6361d6a7b77116ab8b47133f3c768042ed", + "bytes": 9715, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/components/EmailProviderConnections.tsx", + "sha256": "c6bfd306580688d5aca274b48f33bf8a283c37c3d059953624fe2a7e4953acde", + "bytes": 9508, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/components/Correspondence.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/components/Correspondence.tsx", + "sha256": "e0869cf484c202ab7faa508a9d5db720d4b46ac8c99a6f0eeb355cf7fb38b31b", + "bytes": 41057, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/components/Correspondence.tsx", + "sha256": "e0fc56591a1ccc88e4bbe68b119e989cc011aa1f754a1870bbdb2cc33ffc72eb", + "bytes": 40298, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/types.ts", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/types.ts", + "sha256": "a45779b0b7868c4a69ed4a17316899074416fc8c6f8f6c083827e949f790d7b1", + "bytes": 13452, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/types.ts", + "sha256": "d7b551f669415f752fdc38850367fd89257e3f6d6c9d8b459cbf1a1ad91f6a85", + "bytes": 12920, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/i18n/translations.ts", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/i18n/translations.ts", + "sha256": "f64a60e481fee15c6d9f6fa9509697b47430569134c83345de067a663a2cb0e8", + "bytes": 317651, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/i18n/translations.ts", + "sha256": "f64a60e481fee15c6d9f6fa9509697b47430569134c83345de067a663a2cb0e8", + "bytes": 317651, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/components/ViewStateNotice.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/components/ViewStateNotice.tsx", + "sha256": "fd4bb314346a1603d9e01a15fd02f01576b9fd959e83f8ff0b1dfe5ec94378e9", + "bytes": 2340, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/components/ViewStateNotice.tsx", + "sha256": "7b6c3e6c311860897eb5327936dbb129e860781929cfd9a4d4e17f81c607c70c", + "bytes": 2312, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/hooks/useViewResource.ts", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/hooks/useViewResource.ts", + "sha256": "8c73a2fd845b8bc4c4c10b7c69f8d12dae8e83c434c537558a78b74377511b27", + "bytes": 3292, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/hooks/useViewResource.ts", + "sha256": "5912131c525ba85ae6994efc38306a10ec2e673cc0082686226b59f00df5da99", + "bytes": 3176, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/i18n/I18nProvider.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/i18n/I18nProvider.tsx", + "sha256": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113", + "bytes": 3184, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/i18n/I18nProvider.tsx", + "sha256": "d22b5d033d0e405ffb5d581c752d61a24056d1e496f5f6a2f1baecef500f2113", + "bytes": 3184, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/src/App.tsx", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/App.tsx", + "sha256": "f6d5b769ffd44f35373d06bab859d74ca5105b2d23749a7273a6b4a55097486e", + "bytes": 28100, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/src/App.tsx", + "sha256": "ccc07bcdc05c204dee6b368057669483389a034517f524a9c4a42db12f1eddf4", + "bytes": 27578, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/e2e/phase7-correspondence-read.spec.ts", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/e2e/phase7-correspondence-read.spec.ts", + "sha256": "5bedf8e8d62b2482afe27883fb2b3d77981eaab0f3abfc3f265122b55c19938e", + "bytes": 42571, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/e2e/phase7-correspondence-read.spec.ts", + "sha256": "5bedf8e8d62b2482afe27883fb2b3d77981eaab0f3abfc3f265122b55c19938e", + "bytes": 42571, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts", + "sha256": "5cb7a8f67926eb8abaf87e740eef5192921a52d39d14cbdad556476d4e818f0d", + "bytes": 46145, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/job-tracker-ui/e2e/phase7-correspondence-compose.spec.ts", + "sha256": "5cb7a8f67926eb8abaf87e740eef5192921a52d39d14cbdad556476d4e818f0d", + "bytes": 46145, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "sha256": "088c8b52ff90c44f91d1014966568fa4f5cf245cc6dff89b1cd6f19b56d4fdfd", + "bytes": 24377, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/JobTrackerApi.Tests/EmailDraftsControllerTests.cs", + "sha256": "088c8b52ff90c44f91d1014966568fa4f5cf245cc6dff89b1cd6f19b56d4fdfd", + "bytes": 24377, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + }, + { + "originalSourcePath": "JobTrackerApi/Controllers/EmailDraftsController.cs", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/JobTrackerApi/Controllers/EmailDraftsController.cs", + "sha256": "bcbb26145668bb82666d43e1721418864220a15149487282af40397cd86784a5", + "bytes": 11172, + "hashPolicy": "Exact measured raw bytes" + }, + "canonicalLf": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/source/JobTrackerApi/Controllers/EmailDraftsController.cs", + "sha256": "a4c563e6266c944a9be467f4a8278cacc6e9a3ebc1625cb5b1fe791a2ff3887f", + "bytes": 10932, + "hashPolicy": "UTF-8 text with CRLF normalized to LF" + }, + "qualification": "Current candidate snapshot at collection time; parent must qualify unchanged as-run source before acceptance." + } + ], + "preNative": { + "path": ".artifacts/phase7/p7-06/compose/native-final-unmount-pre.json", + "bytes": 4010, + "sha256": "a1079c439d9dc5b4dd307f3ff3235a69e304320f82e3bc636cee6afbef1a8850", + "hashPolicy": "Exact raw bytes" + }, + "postNative": { + "path": ".artifacts/phase7/p7-06/compose/native-final-unmount-post.json", + "bytes": 3673, + "sha256": "f1b97ce0bdcdd81b70a40fc06ca19fb3f206310bc7d894a0c10f84e17c3fe06c", + "hashPolicy": "Exact raw bytes" + }, + "visualReview": { + "receipt": { + "path": ".artifacts/phase7/p7-06/compose/visual-review-final.json", + "bytes": 41063, + "sha256": "ac0d44334fe3eb03f4a8d51aef7a922ccb5a34c7906fd257c65c9e5c8648aaae", + "hashPolicy": "Exact raw bytes" + }, + "recordedUtc": "2026-10-14T11:01:25.494049+00:00", + "reviewed": 47, + "retained": 47, + "rootViewed": 16, + "agentViewed": 31, + "receipts": [ + { + "path": ".artifacts/phase7/p7-06/compose/visual-root-final.json", + "sha256": "b472057f047b574721052d45991c755e84e125d9c57f56873dd5a29454515aa6", + "bytes": 18106 + }, + { + "path": ".artifacts/phase7/p7-06/compose/visual-agent-final.json", + "sha256": "279f4aa22c54abfe7af4736daf71f9d1f7bcd3b43654a4c86158bbaa8b0197b5", + "bytes": 26504 + } + ], + "images": [ + { + "index": 0, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/002-p706-compose-en-light-1440-actual-stale409-local-retained.png", + "sha256": "c6078081e62b69e5908d070c5071c240ac9aa052bc36c9444ca3e3a72212a84b", + "bytes": 113861, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] real server-owned identity, revisions, stale conflict, reload and confirmed delete preserve exact draft content", + "name": "p706-compose-en-light-1440-actual-stale409-local-retained", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 1, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/005-p706-compose-en-light-1440-actual-owner-only-draft.png", + "sha256": "8528f280d90c3f3764d5fadc05d5aab56e5468255f49ad25d930652711f8b26a", + "bytes": 110514, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] anonymous and another owner cannot read, update, delete, prepare or associate a private draft", + "name": "p706-compose-en-light-1440-actual-owner-only-draft", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 2, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/008-p706-compose-en-light-1440-actual-job-choices-recovered.png", + "sha256": "08071e01d745c02dde9c41a5312b8faaf105537bc4716ead1ff8c2ad84e6e8cd", + "bytes": 89190, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] failed owned job choices provide GET-only Retry without claiming there are no jobs", + "name": "p706-compose-en-light-1440-actual-job-choices-recovered", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 3, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/011-p706-compose-en-light-1440-committed-save-list-get-only-recovery.png", + "sha256": "6bfd0704143c24f56461391ad6133a2472ac499977e0cf4a1b51a46cbc011ee7", + "bytes": 100133, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] saved-draft GET Retry and committed Save/list503 retain identity and never repeat the write", + "name": "p706-compose-en-light-1440-committed-save-list-get-only-recovery", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 4, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/014-p706-compose-en-light-1440-held-save-conflict-controls-locked.png", + "sha256": "9bde396edc6415a0e0a93c59fb74dc8d8322b86d5241ce0e89807c20be327719", + "bytes": 101565, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] held captured Save locks conflicting controls and late unmounted completion preserves both owned drafts", + "name": "p706-compose-en-light-1440-held-save-conflict-controls-locked", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 5, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/016-p706-compose-en-light-1440-late-a-save-b-draft-preserved.png", + "sha256": "110a67a1492c10cdb44ae450269c650e9a06fb847b70ebd46d7bcbcda4bfdace", + "bytes": 111251, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] held captured Save locks conflicting controls and late unmounted completion preserves both owned drafts", + "name": "p706-compose-en-light-1440-late-a-save-b-draft-preserved", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 6, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/019-p706-compose-en-light-1440-explicit-send-review-before-cancel.png", + "sha256": "a0b0b23dee81b7b1749334c49f61d6294d3be7f3f3e2490666d884c3ca54b151", + "bytes": 114325, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] recipient-only and subject-only draft Cancel retain edits and explicit send Cancel makes zero POSTs", + "name": "p706-compose-en-light-1440-explicit-send-review-before-cancel", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 7, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/022-p706-compose-en-light-1440-real-new-attempt-unsaved-fields-preserved.png", + "sha256": "be0fd649fa0cc1244f291ef1a359629a26c48795ba391537d8fce090b09cc832", + "bytes": 103444, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] real failed-attempt preparation changes only server identity and preserves all unsaved local fields for the next reviewed send", + "name": "p706-compose-en-light-1440-real-new-attempt-unsaved-fields-preserved", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 8, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/027-p706-compose-en-light-1440-controlled-uncertain-identity-protected.png", + "sha256": "eb92e95cc7a6a8828237fa91a4d99de2661b0af1903b9eeeda88b4dc18237742", + "bytes": 107969, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] labelled uncertain pending sending sent and generic409 fixtures retain state with no implicit identity or resend", + "name": "p706-compose-en-light-1440-controlled-uncertain-identity-protected", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 9, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/033-p706-compose-en-light-1440-controlled-generic409-identity-protected.png", + "sha256": "2bb9c5ce62c0adc369cabd9f4ed45381c206cdab9a092e20c60d787bb26bcab4", + "bytes": 115704, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] labelled uncertain pending sending sent and generic409 fixtures retain state with no implicit identity or resend", + "name": "p706-compose-en-light-1440-controlled-generic409-identity-protected", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 10, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/037-p706-compose-nb-light-1440-strict-language-dirty-draft.png", + "sha256": "59d601409010043dd9f3c60a2b6e8f13945ef2eb361a4095cfb9f2d4655abf8b", + "bytes": 116931, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] strict actual language204 preserves all dirty fields and saved identity without draft or setup rereads", + "name": "p706-compose-nb-light-1440-strict-language-dirty-draft", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 11, + "name": "p706-compose-en-light-320-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/041-p706-compose-en-light-320-long-draft-keyboard.png", + "sha256": "54dc7d448a6054ba0daaa7e6ff8cee34909b5f84362096584fd19b35ca3104c7", + "bytes": 149927 + }, + "dimensions": { + "width": 320, + "height": 3255 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Narrow long draft reflows into one column; message focus outline visible; Save/Review actions visible below content; provider/status and long resume label wrap without app-chrome horizontal clipping. Single-line addresses/subjects scroll or truncate within their own inputs." + ] + }, + { + "index": 12, + "name": "p706-compose-en-light-320-owned-setup-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/043-p706-compose-en-light-320-owned-setup-keyboard.png", + "sha256": "aeb034828a78ecd66abf0d547a09efd56b2b7dacc1856ec4a364a9c65166948f", + "bytes": 160492 + }, + "dimensions": { + "width": 320, + "height": 3478 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "320px owned-job setup fits one column; focused Job control and separate Cancel/Start Draft controls are visible; long saved draft remains below setup." + ] + }, + { + "index": 13, + "name": "p706-compose-nb-dark-360-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/045-p706-compose-nb-dark-360-long-draft-keyboard.png", + "sha256": "d954fcad34df6df8a3e4de0859f6c5056c1360b0b259ca479aae99183e3e02de", + "bytes": 156678 + }, + "dimensions": { + "width": 360, + "height": 3237 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Narrow long draft reflows into one column; message focus outline visible; Save/Review actions visible below content; provider/status and long resume label wrap without app-chrome horizontal clipping. Single-line addresses/subjects scroll or truncate within their own inputs." + ] + }, + { + "index": 14, + "name": "p706-compose-en-dark-390-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/047-p706-compose-en-dark-390-long-draft-keyboard.png", + "sha256": "4426acc8af18f2073259e388d568cfef995219b24f4ed3331b9fe5b40152e06b", + "bytes": 136450 + }, + "dimensions": { + "width": 390, + "height": 2497 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Narrow long draft reflows into one column; message focus outline visible; Save/Review actions visible below content; provider/status and long resume label wrap without app-chrome horizontal clipping. Single-line addresses/subjects scroll or truncate within their own inputs." + ] + }, + { + "index": 15, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/049-p706-compose-en-dark-390-send-review-keyboard.png", + "sha256": "49ee87137a177f0f8b1a451e708165168e57f3b346b233934782a8c1b8d597d5", + "bytes": 140375, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] eight finite bilingual theme widths retain long drafts and keyboard setup review Cancel with complete axe vectors", + "name": "p706-compose-en-dark-390-send-review-keyboard", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 16, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/050-p706-compose-en-390-focused-viewport.png", + "sha256": "b93c42133c6d18f195e5706d4c4163aac1c1ec0e9569f5c0997a9113497b77a5", + "bytes": 43748, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] eight finite bilingual theme widths retain long drafts and keyboard setup review Cancel with complete axe vectors", + "name": "p706-compose-en-390-focused-viewport", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 17, + "name": "p706-compose-nb-light-768-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/052-p706-compose-nb-light-768-long-draft-keyboard.png", + "sha256": "e14fa1958e74e7f3019a0616a7a1096740261d2350ff61c61b89ab901a57a4a4", + "bytes": 155377 + }, + "dimensions": { + "width": 768, + "height": 1923 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Tablet and desktop long drafts keep message focus visible and retain actions at the bottom; 768px remains one column and desktop pairs the short fields. Bokmal labels and Unicode sample content render; no app-chrome horizontal clipping observed." + ] + }, + { + "index": 18, + "name": "p706-compose-nb-light-768-owned-setup-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/054-p706-compose-nb-light-768-owned-setup-keyboard.png", + "sha256": "cb6645d54ba12db900c4e453c8764f9e9b122a74a98c7897c2a80fd6f19d0d9c", + "bytes": 173858 + }, + "dimensions": { + "width": 768, + "height": 2154 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "768px job/provider setup has a visible focused Job field and separate actions; long selected job text is horizontally scrolled inside the input, rather than escaping the page." + ] + }, + { + "index": 19, + "name": "p706-compose-en-dark-1024-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/056-p706-compose-en-dark-1024-long-draft-keyboard.png", + "sha256": "118b3569f60004b7abd8300cf54c35f3e9f268d5ea9d1c2a6328e813f002a521", + "bytes": 171547 + }, + "dimensions": { + "width": 1024, + "height": 1631 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Tablet and desktop long drafts keep message focus visible and retain actions at the bottom; 768px remains one column and desktop pairs the short fields. Bokmal labels and Unicode sample content render; no app-chrome horizontal clipping observed." + ] + }, + { + "index": 20, + "name": "p706-compose-nb-light-1280-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/058-p706-compose-nb-light-1280-long-draft-keyboard.png", + "sha256": "9c0f6a7a2b792c1b8a062d38ad5bfc6aa86f8c4a4172e41c8a208851432fdc35", + "bytes": 167124 + }, + "dimensions": { + "width": 1280, + "height": 1567 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Tablet and desktop long drafts keep message focus visible and retain actions at the bottom; 768px remains one column and desktop pairs the short fields. Bokmal labels and Unicode sample content render; no app-chrome horizontal clipping observed." + ] + }, + { + "index": 21, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/060-p706-compose-nb-light-1280-send-review-keyboard.png", + "sha256": "adce35a9f91881fdf07695446491fa472b13922535f72af4daf1c17b5afd219e", + "bytes": 180257, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] eight finite bilingual theme widths retain long drafts and keyboard setup review Cancel with complete axe vectors", + "name": "p706-compose-nb-light-1280-send-review-keyboard", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 22, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/061-p706-compose-nb-1280-focused-viewport.png", + "sha256": "f04fde06c9997a6985a00de025ceca141a272bbddbdb651b1914c7d5ccc2800b", + "bytes": 33705, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/correspondence-compose.json", + "sha256": "81c92292422df306cd892738abdfa1d065e692d1db787f28e87da6a684101a69", + "bytes": 5219403, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "correspondence-compose", + "test": "[P7-06 compose] eight finite bilingual theme widths retain long drafts and keyboard setup review Cancel with complete axe vectors", + "name": "p706-compose-nb-1280-focused-viewport", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + }, + { + "index": 23, + "name": "p706-compose-en-light-1440-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/063-p706-compose-en-light-1440-long-draft-keyboard.png", + "sha256": "6d6c930a89ce1d8c3a8d68e5185a32c3429753093a68b91810be501154aac913", + "bytes": 186144 + }, + "dimensions": { + "width": 1440, + "height": 1583 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Wide desktop long drafts use paired short fields, visible focused message boundary and separate Save/Review actions; EN and NB app labels remain coherent. Deliberate fixture prose stays in its source language." + ] + }, + { + "index": 24, + "name": "p706-compose-en-light-1440-owned-setup-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/065-p706-compose-en-light-1440-owned-setup-keyboard.png", + "sha256": "7665609adbcbd470199064f0e10e4c311d1c4d93f555adbb9bf74c5cf2a31797", + "bytes": 199940 + }, + "dimensions": { + "width": 1440, + "height": 1715 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "1440px owned setup uses one row for job/provider/actions; focused long job input remains bounded and Cancel/Start Draft are visible alongside the existing draft." + ] + }, + { + "index": 25, + "name": "p706-compose-nb-dark-1920-long-draft-keyboard", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-compose/067-p706-compose-nb-dark-1920-long-draft-keyboard.png", + "sha256": "49056a76f7fa9249a837ee85dc04744aa56c0e48f59af1fba298904711949104", + "bytes": 196347 + }, + "dimensions": { + "width": 1920, + "height": 1583 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Wide desktop long drafts use paired short fields, visible focused message boundary and separate Save/Review actions; EN and NB app labels remain coherent. Deliberate fixture prose stays in its source language." + ] + }, + { + "index": 26, + "name": "p706-read-en-light-1440-real-filtered-owner-page", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/002-p706-read-en-light-1440-real-filtered-owner-page.png", + "sha256": "e30df8db7f3b9fd31918fa67179d0ed81c45c945ea03a99528cb40a75e2a567c", + "bytes": 266415 + }, + "dimensions": { + "width": 1440, + "height": 2039 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Filtered owned inbox presents total and page-scoped linked/inbound counts, selected filters and uniform message cards. Minor existing copy defect visible: a one-file count reads '1 attachments'." + ] + }, + { + "index": 27, + "name": "p706-read-en-light-1440-initial-list503-not-empty", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/006-p706-read-en-light-1440-initial-list503-not-empty.png", + "sha256": "1436dad4bdaa772bbf33b720d7fb67c661f12e85cf6c4c371ced9e1ea08655f7", + "bytes": 81325 + }, + "dimensions": { + "width": 1440, + "height": 900 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Initial list failure shows a clear error row and explicit Retry; no false zero-result/empty message is visible." + ] + }, + { + "index": 28, + "name": "p706-read-en-light-1440-held-current-query-no-stale-rows", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/008-p706-read-en-light-1440-held-current-query-no-stale-rows.png", + "sha256": "ea406bcb9baa14e39a11998ded832e6ba0487f6b9202f205e7a81ded2dee9464", + "bytes": 78427 + }, + "dimensions": { + "width": 1440, + "height": 900 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Held new query shows focused search/loading feedback without obsolete counts or actionable old rows." + ] + }, + { + "index": 29, + "name": "p706-read-en-light-1440-held-original-saved-detail-retry", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/011-p706-read-en-light-1440-held-original-saved-detail-retry.png", + "sha256": "b0f6c9055e58557a26ae8c27667dc304280a55689089c5cb24fdead3fccf3586", + "bytes": 116457 + }, + "dimensions": { + "width": 1440, + "height": 1060 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Saved-detail Retry has a visible focused detail group and progress indicator while the parent list remains present." + ] + }, + { + "index": 30, + "name": "p706-read-en-light-1440-actual-saved-body-and-metadata", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/013-p706-read-en-light-1440-actual-saved-body-and-metadata.png", + "sha256": "f938056dbeed7163117afe89bcb2e2c1681bcacea96c46e7b40e8a15a068c028", + "bytes": 149787 + }, + "dimensions": { + "width": 1440, + "height": 1240 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Loaded owned detail preserves multiline plain text and labels/file metadata; the literal script marker is visible as text. Hide Message has a visible focus ring." + ] + }, + { + "index": 31, + "name": "p706-read-en-light-1440-qualified-provider-unavailable-real-saved-copy", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/016-p706-read-en-light-1440-qualified-provider-unavailable-real-saved-copy.png", + "sha256": "ec0e709c4c10776aa7bd4ee2dc23a0f6e80f3dff51422a7236877ae5795b8af2", + "bytes": 145758 + }, + "dimensions": { + "width": 1440, + "height": 1206 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Provider-unavailable saved-copy warning, source context and reconnect guidance are visible together; saved plain text and metadata stay readable inside a focused detail group. Minor existing English copy reads '1 items' and '1 attachments'." + ] + }, + { + "index": 32, + "name": "p706-read-nb-light-1440-strict-locale-preserved-saved-detail", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/021-p706-read-nb-light-1440-strict-locale-preserved-saved-detail.png", + "sha256": "ce4955c52c0a93c6717738a29ae87435935380597ad5d6abd29b8fd55e037196", + "bytes": 174127 + }, + "dimensions": { + "width": 1440, + "height": 1393 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "NB navigation/actions/filter labels/date formatting render coherently while saved source-language message and metadata remain intact; language button focus is visible." + ] + }, + { + "index": 33, + "name": "p706-read-en-light-1440-strict-locale-dirty-review-notes", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/024-p706-read-en-light-1440-strict-locale-dirty-review-notes.png", + "sha256": "65773c5930655a92bab4b1b670b526d22cca97118051ed440f9d3255f68b3a81", + "bytes": 151123 + }, + "dimensions": { + "width": 1440, + "height": 1259 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Review notes preserve a Unicode dirty note under EN chrome; filter, counts, candidate context and explicit actions remain visually distinct." + ] + }, + { + "index": 34, + "name": "p706-read-en-light-1440-held-status-retry-saved-body-retained", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/027-p706-read-en-light-1440-held-status-retry-saved-body-retained.png", + "sha256": "25da84ab0f64c6994c91ce5e77824d612fe41435016b2676bd2f07454683a83c", + "bytes": 147377 + }, + "dimensions": { + "width": 1440, + "height": 1224 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Provider status pending Retry has a focused progress group while saved message body/metadata remain visible and the list controls retain context." + ] + }, + { + "index": 35, + "name": "p706-read-en-light-1440-review-read-retry-retains-note-filter", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/030-p706-read-en-light-1440-review-read-retry-retains-note-filter.png", + "sha256": "ba5eb1e60cffc4055ce1c37c080511d90601a6a72818b3465c15ed4f8b9039a7", + "bytes": 117052 + }, + "dimensions": { + "width": 1440, + "height": 1018 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Recovered review read retains selected Review filter and edited note with a clear focused review-body boundary." + ] + }, + { + "index": 36, + "name": "p706-read-en-light-1440-held-local-review-decision", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/032-p706-read-en-light-1440-held-local-review-decision.png", + "sha256": "1268f70c7786ff33e2b77c3d1ae7b57444d378fbf9497f791f637e1fc32a0c6c", + "bytes": 116234 + }, + "dimensions": { + "width": 1440, + "height": 1090 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Pending local decision shows progress and focused group; write/sync/refresh controls and note are visibly disabled while context and selected filter remain." + ] + }, + { + "index": 37, + "name": "p706-read-en-light-1440-committed-decision-get-only-recovery", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/034-p706-read-en-light-1440-committed-decision-get-only-recovery.png", + "sha256": "92d6fc76b39fe5aa26d30797752661300a10cb5e6405581125249ec30ce32a33", + "bytes": 126293 + }, + "dimensions": { + "width": 1440, + "height": 1018 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "Committed decision recovery shows Rejected routing/filter and retained note; selected filter focus is visible." + ] + }, + { + "index": 38, + "name": "p706-read-en-light-320-long-inbox", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/038-p706-read-en-light-320-long-inbox.png", + "sha256": "15cacd5322ccbadda0b002bb36ee03f92ab582287c05f91223567b031f0a76dc", + "bytes": 118211 + }, + "dimensions": { + "width": 320, + "height": 2168 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "320px long inbox wraps company/subject/address/status/file labels and action buttons within card bounds; focused View Message stays visible. Minor '1 attachments' grammar remains." + ] + }, + { + "index": 39, + "name": "p706-read-nb-dark-360-long-review", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/040-p706-read-nb-dark-360-long-review.png", + "sha256": "887edc93f62989127fc027a84095681f26ea1bf96f74c424b9b2b89a35e4548b", + "bytes": 127424 + }, + "dimensions": { + "width": 360, + "height": 2126 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "360px NB dark review wraps heading, filter choices, long candidate/source chips and explicit action controls; focused review note remains readable. Source fixture content stays in its original language." + ] + }, + { + "index": 40, + "name": "p706-read-en-dark-390-long-detail", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/042-p706-read-en-dark-390-long-detail.png", + "sha256": "7509ea1c1e26fe0107fc8afb604954aba8a3482dafbc8014d8b493bf80f41c0f", + "bytes": 157090 + }, + "dimensions": { + "width": 390, + "height": 2414 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "390px EN dark detail wraps long saved body, sender/date and metadata inside the card; focused Hide Message remains visible and the script marker is shown as plain text." + ] + }, + { + "index": 41, + "name": "p706-read-nb-light-768-long-inbox", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/044-p706-read-nb-light-768-long-inbox.png", + "sha256": "0d456725fded0c7e2ccb1825885f48261e981bfa67185ffd82db0314af2cab6a", + "bytes": 118530 + }, + "dimensions": { + "width": 768, + "height": 1365 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "768px NB inbox keeps filters in a predictable single column and wraps action rows within cards; selected View Message focus and NB date/status labels are clear." + ] + }, + { + "index": 42, + "name": "p706-read-en-dark-1024-long-review", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/046-p706-read-en-dark-1024-long-review.png", + "sha256": "a36e3c9b96ebbce0fd10ab39b9ffd9d561dc79f443bb51124617daeb98d2fe09", + "bytes": 144753 + }, + "dimensions": { + "width": 1024, + "height": 1314 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "1024px dark review keeps candidate summaries and explicit actions in bounded card rows; selected note focus is clearly visible with long source labels." + ] + }, + { + "index": 43, + "name": "p706-read-nb-light-1280-long-detail", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/048-p706-read-nb-light-1280-long-detail.png", + "sha256": "6c1b6964f896f602e103fe758efdc12464d3a2be7409d9d0a70f63642acd28c6", + "bytes": 170161 + }, + "dimensions": { + "width": 1280, + "height": 1377 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "1280px NB detail keeps long source subject/body and attachment labels bounded; Hide Message focus remains visible with localized controls and dates." + ] + }, + { + "index": 44, + "name": "p706-read-en-light-1440-long-review", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/050-p706-read-en-light-1440-long-review.png", + "sha256": "75d295ba5823bab3b9b7e1f888c0e01ca5f0a45df322ada79268fb73b3b6c9d3", + "bytes": 152168 + }, + "dimensions": { + "width": 1440, + "height": 1259 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "1440px EN review retains a clear focused notes field and bounded candidate/action rows with long Unicode subjects." + ] + }, + { + "index": 45, + "name": "p706-read-nb-dark-1920-long-inbox", + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/correspondence-read/052-p706-read-nb-dark-1920-long-inbox.png", + "sha256": "51206d41e284cc688808358c7365bbea1f122daac499b10c8c49d290cbbffeea", + "bytes": 155307 + }, + "dimensions": { + "width": 1920, + "height": 1080 + }, + "actuallyViewed": true, + "rawShaVerified": true, + "observations": [ + "1920px NB dark inbox uses desktop space without oversized cards; status/action rows fit and View Message focus remains visible." + ] + }, + { + "index": 46, + "raw": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/embedded/application-p2d01/001-native-frozen-package.png", + "sha256": "afd6816facb97dfeb10cae608059f4135fa0548f8a02d0ee0b56290b1ccb7856", + "bytes": 94087, + "hashPolicy": "Exact measured raw bytes" + }, + "originalEmbeddedReport": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/application-p2d01.json", + "sha256": "85902e4a8fb8419c8a43a8ffa0973a8fe30f6353f93babab12dcd30553bca4e0", + "bytes": 129887, + "hashPolicy": "Exact measured raw bytes" + }, + "lane": "application-p2d01", + "test": "[PRES-W01 PRES-W05 PRES-W06 PRES-W07 PRES-W08] legacy workspace preserves frozen documents after current sources change", + "name": "native-frozen-package", + "manualReview": "PENDING_ACTUAL_PARENT_IMAGE_RECEIPT", + "actuallyViewed": true, + "reviewer": "root" + } + ], + "qualification": "Every47finalPNG actually displayed: root16, agent31. Fullpage sticky/sidebar/skip/dialog and transition captures, resized/tall images and singleline input internal scrolling limit the observation. No everypixel, settledallstate, browserzoom, humanreader, physicaltouch/softwarekeyboard, realprovider orproduction acceptance.", + "residuals": [ + "Resumed generic saved-draft context stays in openinglocale across dirtyENtoNB change;P7-11.", + "English countcopy1attachments/1items in savedmaildetails;P7-11. Actualuser/mailcontent unchanged." + ] + }, + "accessibility": { + "triage": { + "path": ".artifacts/phase7/p7-06/compose/axe-triage-final.json", + "bytes": 49525, + "sha256": "595bc1e8cbbcbb64f53b651f758735e1b61b94c2e57cec28c97cf3a6d0ec4eca", + "hashPolicy": "Exact raw bytes" + }, + "recordedUtc": "2026-10-14T10:57:07.759209+00:00", + "source": { + "path": ".artifacts/phase7/p7-06/compose/native-final-verified/results.json", + "bytes": 309463, + "sha256": "21a02c6d67dc2732e4a230787261b406be8db3100d5df3a10065f5669f482a11" + }, + "lanes": { + "correspondence-compose": { + "scans": 24, + "violations": 0, + "incomplete": 246, + "completeCheckContexts": [ + { + "kind": "incomplete", + "rule": "color-contrast", + "check": "color-contrast", + "message": "Element content is too short to determine if it is actual text content", + "occurrences": 24, + "representativeContexts": [ + { + "attachment": "p706-compose-en-light-1440-actual-stale409-local-retained-audit", + "target": [ + ".MuiBadge-badge" + ], + "data": { + "contrastRatio": 0, + "fontSize": "9.0pt (12px)", + "fontWeight": "normal", + "messageKey": "shortTextContent", + "expectedContrastRatio": "4.5:1" + }, + "relatedNodes": [] + }, + { + "attachment": "p706-compose-en-light-1440-actual-owner-only-draft-audit", + "target": [ + ".MuiBadge-badge" + ], + "data": { + "contrastRatio": 0, + "fontSize": "9.0pt (12px)", + "fontWeight": "normal", + "messageKey": "shortTextContent", + "expectedContrastRatio": "4.5:1" + }, + "relatedNodes": [] + } + ] + }, + { + "kind": "incomplete", + "rule": "color-contrast", + "check": "color-contrast", + "message": "Element's background color could not be determined because it is overlapped by another element", + "occurrences": 219, + "representativeContexts": [ + { + "attachment": "p706-compose-en-light-1440-actual-stale409-local-retained-audit", + "target": [ + ".MuiButton-outlinedSizeSmall.css-13ssfkv.MuiButton-outlined:nth-child(6)" + ], + "data": { + "contrastRatio": 0, + "fontSize": "9.8pt (13px)", + "fontWeight": "normal", + "messageKey": "bgOverlap", + "expectedContrastRatio": "4.5:1" + }, + "relatedNodes": [] + }, + { + "attachment": "p706-compose-en-light-1440-actual-stale409-local-retained-audit", + "target": [ + "#_r_t_" + ], + "data": { + "contrastRatio": 0, + "fontSize": "10.5pt (14px)", + "fontWeight": "normal", + "messageKey": "bgOverlap", + "expectedContrastRatio": "4.5:1" + }, + "relatedNodes": [] + } + ] + }, + { + "kind": "incomplete", + "rule": "aria-hidden-focus", + "check": "focusable-modal-open", + "message": "Check that focusable elements are not tabbable in the current state", + "occurrences": 3, + "representativeContexts": [ + { + "attachment": "p706-compose-en-light-1440-explicit-send-review-before-cancel-audit", + "target": [ + "#root" + ], + "data": null, + "relatedNodes": [ + { + "html": "Skip to main content", + "target": [ + "a" + ] + }, + { + "html": "", + "target": [ + ".css-11kar8v" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(1) > .MuiList-padding.css-k1qkeu[aria-label=\"Navigation\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters > .css-j56oom.MuiListItemButton-root[aria-label=\"Dashboard\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-j56oom.MuiListItemButton-root[aria-label=\"Job Applications\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-1rv7atp[aria-label=\"Job Applications\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-1rv7atp[aria-label=\"Job Applications\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(2) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-1rv7atp[aria-label=\"Job Applications\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(3) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-1rv7atp[aria-label=\"Job Applications\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(4) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-1rv7atp[aria-label=\"Job Applications\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(5) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(2) > .MuiList-padding.css-k1qkeu[aria-label=\"Job search\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(2) > .Mui-selected[aria-label=\"Job email\"][aria-current=\"page\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(3) > .MuiList-padding.css-k1qkeu[aria-label=\"Career\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-j56oom.MuiListItemButton-root[aria-label=\"Career profile\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(3) > .MuiList-padding.css-k1qkeu[aria-label=\"Career\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters:nth-child(2) > .css-j56oom.MuiListItemButton-root[aria-label=\"CV Builder\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-184269b.MuiBox-root > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root:nth-child(4) > .MuiList-padding.css-k1qkeu[aria-label=\"Insights\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters > .css-j56oom.MuiListItemButton-root[aria-label=\"Analytics\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root > .MuiList-padding.css-k1qkeu[aria-label=\"Account\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters > .css-j56oom.MuiListItemButton-root[aria-label=\"Settings\"]" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root > .MuiList-padding.css-k1qkeu[aria-label=\"Account\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters > .css-1rv7atp[aria-label=\"Settings\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(1) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "
", + "target": [ + ".MuiDrawer-paperAnchorDockedLeft > .css-1vpgucn > .css-6zugs3.MuiBox-root > .css-r91acf.MuiBox-root > .MuiList-padding.css-k1qkeu[aria-label=\"Account\"] > .css-hapf9j.MuiListItem-root.MuiListItem-gutters > .css-1rv7atp[aria-label=\"Settings\"] > .css-1ohqk82.MuiListItem-root.MuiListItem-gutters:nth-child(2) > .css-m9zpd7.MuiListItemButton-root.MuiListItemButton-gutters" + ] + }, + { + "html": "", + "target": [ + ".css-1u962su" + ] + }, + { + "html": "