From da261f013489fa17666f74cc32cdd6aa43dd6001 Mon Sep 17 00:00:00 2001 From: Brad Groux <3053586+BradGroux@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:41:52 -0500 Subject: [PATCH] test: record packaged discovery popout acceptance --- docs/audits/DISCOVERY-POPOUTS-1440.md | 6 +- docs/design/OVERLAY-CONTRACT.md | 126 +++++++++++++------------- e2e/helpers/discovery-popouts.ts | 9 +- 3 files changed, 75 insertions(+), 66 deletions(-) diff --git a/docs/audits/DISCOVERY-POPOUTS-1440.md b/docs/audits/DISCOVERY-POPOUTS-1440.md index d5b34989..4d17ce5f 100644 --- a/docs/audits/DISCOVERY-POPOUTS-1440.md +++ b/docs/audits/DISCOVERY-POPOUTS-1440.md @@ -8,4 +8,8 @@ This slice depends on Settings #1437. Its legacy first-mount focus behavior is n Twenty-one focused unit tests pass across the shared overlay, command, and search slices. Web typecheck, changed-file lint, formatting, and both source-review axes pass. Browser acceptance passes both themes at 1700×900/16px, 1180×760/20px, and 900×480/20px, plus an animation-enabled interrupted reopening case. Checks cover scrolling, fixed footer, bounds, disabled commands, query/backend selection, Search-to-Settings and command-to-Search/Settings/Create handoffs, route navigation, help mounting, and exact opener restoration. Screenshots were visually inspected; command-row padding was corrected after inspection. A fixture selector initially used the wrong label case; that setup error is separate from the reproduced production focus failures. -Rebuilt packaged macOS acceptance remains pending. This document does not claim installed-app replacement, final maintained screenshots/GIFs, integration CI, or release completion. +Rebuilt packaged macOS acceptance passed on integration candidate `6044bd62ea7265153a9e878c9e3b865605b161aa`. The full `pnpm desktop:package:mac:dir` command succeeded, and `NATIVE_SCOPE=discovery pnpm --filter @veritas-kanban/server exec tsx /tmp/vk-native-ui-1389.8cJNtK/verify.mjs` launched the unsigned arm64 application with `app.isPackaged` asserted and a disposable isolated profile. The packaged web index SHA-256 is `79f1d0fc46dfa115279fc5ce5a8978765e313809dbd205894ccd4b60fec3aa68`; its main JavaScript asset `index-q7X4xg9m.js` is `dc1e6bcc9f6e7504152008282fc911d15624b869b0b409de10e126389e0e7645`. + +The complete discovery flow passed in light and dark themes at 1700×900/16px and 1180×760/20px, with normal animations enabled. Initial focus, scrolling, footer containment, disabled-command behavior, nested menu Escape, route navigation, chained Search/Settings/Create handoffs, and exact opener restoration passed. Search responses were deterministic fixtures; no real save, launch, or provider message was sent. The native harness initially expected the full-mode Settings title; the packaged Board Only badge correctly contributes to its accessible name. The selector now explicitly accepts either exact title. That was a harness mismatch, not a failed handoff. The previously reported Settings controls were also visibly aligned in the native capture. + +Native captures live under `/private/tmp/vk-native-ui-1389.8cJNtK/discovery-*.png`. Screenshots are diagnostic acceptance evidence, not final maintained media. This remains an unsigned version-6.1.6 candidate; installed-app replacement, final maintained screenshots/GIFs, full integration CI, and release completion are not claimed. diff --git a/docs/design/OVERLAY-CONTRACT.md b/docs/design/OVERLAY-CONTRACT.md index 433d4478..e240de2a 100644 --- a/docs/design/OVERLAY-CONTRACT.md +++ b/docs/design/OVERLAY-CONTRACT.md @@ -23,69 +23,69 @@ The shared provider registers only open overlays, removes unmounted entries, and Line numbers identify the audited opening and may move during migration. A shared primitive alone does not prove the feature's inner scroll, spacing, or keyboard behavior. Each row remains subject to rendered acceptance. -| Consumer | Opening line | Intended variant | Status | -| ------------------------------------------------------------------------------------------------- | -----------: | ---------------- | ----------------------------------------------------- | -| [TemplateEditorDialog.tsx](../../web/src/components/templates/TemplateEditorDialog.tsx) | 188 | authoring | Shared primitive adopted; runtime acceptance pending | -| [TemplatesPage.tsx](../../web/src/components/templates/TemplatesPage.tsx) | 274 | confirm | Shared primitive adopted; runtime acceptance pending | -| [TemplatesPage.tsx](../../web/src/components/templates/TemplatesPage.tsx) | 298 | form | Shared primitive adopted; runtime acceptance pending | -| [SearchDialog.tsx](../../web/src/components/search/SearchDialog.tsx) | 282 | authoring | Shared geometry; browser passed, native pending #1440 | -| [AdmissionQueuePanel.tsx](../../web/src/components/digest/AdmissionQueuePanel.tsx) | 315 | form | Migration pending | -| [WorkflowStartDialog.tsx](../../web/src/components/workflows/WorkflowStartDialog.tsx) | 71 | form | Migration pending; migrate with nested consumers | -| [CreateTaskDialog.tsx](../../web/src/components/task/CreateTaskDialog.tsx) | 267 | form | Migration pending; migrate with nested consumers | -| [PolicyManager.tsx](../../web/src/components/policies/PolicyManager.tsx) | 552 | authoring | Shared modal; runtime acceptance pending in #1423 | -| [PolicyManager.tsx](../../web/src/components/policies/PolicyManager.tsx) | 906 | form | Shared modal; runtime acceptance pending in #1423 | -| [TimeTrackingSection.tsx](../../web/src/components/task/TimeTrackingSection.tsx) | 243 | form | Migration pending | -| [BulkActionsBar.tsx](../../web/src/components/board/BulkActionsBar.tsx) | 366 | confirm | Migration pending | -| [ArchiveSuggestionBanner.tsx](../../web/src/components/board/ArchiveSuggestionBanner.tsx) | 92 | confirm | Migration pending | -| [ConflictResolver.tsx](../../web/src/components/task/ConflictResolver.tsx) | 124 | utility | Migration pending | -| [ConflictResolver.tsx](../../web/src/components/task/ConflictResolver.tsx) | 383 | confirm | Migration pending | -| [FilterBar.tsx](../../web/src/components/board/FilterBar.tsx) | 349 | form | Migration pending | -| [FilterBar.tsx](../../web/src/components/board/FilterBar.tsx) | 374 | confirm | Migration pending | -| [ChatPanel.tsx](../../web/src/components/chat/ChatPanel.tsx) | 279 | chat | Migration pending; migrate with nested consumers | -| [ChatPanel.tsx](../../web/src/components/chat/ChatPanel.tsx) | 297 | confirm | Migration pending; migrate with nested consumers | -| [TaskWorkView.tsx](../../web/src/components/task/TaskWorkView.tsx) | 1055 | confirm | Migration pending | -| [ObservationsSection.tsx](../../web/src/components/task/ObservationsSection.tsx) | 118 | confirm | Migration pending | -| [SquadChatPanel.tsx](../../web/src/components/chat/SquadChatPanel.tsx) | 522 | chat | Migration pending; migrate with nested consumers | -| [ReviewPanel.tsx](../../web/src/components/task/ReviewPanel.tsx) | 212 | form | Migration pending | -| [ArtifactPreviewModal.tsx](../../web/src/components/task/ArtifactPreviewModal.tsx) | 112 | authoring | Migration pending | -| [CommandPalette.tsx](../../web/src/components/layout/CommandPalette.tsx) | 293 | form | Shared geometry; browser passed, native pending #1440 | -| [SettingsDialog.tsx](../../web/src/components/settings/SettingsDialog.tsx) | 529 | authoring | Shared geometry; browser/native passed #1436 | -| [SettingsDialog.tsx](../../web/src/components/settings/SettingsDialog.tsx) | 739 | confirm | Shared geometry; browser/native passed #1436 | -| [PRDialog.tsx](../../web/src/components/task/git/PRDialog.tsx) | 36 | authoring | Migration pending | -| [ActivitySidebar.tsx](../../web/src/components/layout/ActivitySidebar.tsx) | 244 | utility | Migration pending | -| [SortableListItem.tsx](../../web/src/components/settings/SortableListItem.tsx) | 171 | confirm | Shared geometry; browser/native passed #1436 | -| [WorktreeStatus.tsx](../../web/src/components/task/git/WorktreeStatus.tsx) | 374 | form | Migration pending | -| [WorktreeStatus.tsx](../../web/src/components/task/git/WorktreeStatus.tsx) | 404 | confirm | Migration pending | -| [TaskDetailsTab.tsx](../../web/src/components/task/detail/TaskDetailsTab.tsx) | 254 | confirm | Migration pending | -| [KeyboardShortcutsDialog.tsx](../../web/src/components/layout/KeyboardShortcutsDialog.tsx) | 49 | form | Shared geometry; browser passed, native pending #1440 | -| [ArchiveSidebar.tsx](../../web/src/components/layout/ArchiveSidebar.tsx) | 240 | utility | Migration pending | -| [MobileShell.tsx](../../web/src/components/layout/MobileShell.tsx) | 129 | utility | Migration pending | -| [ApplyTemplateDialog.tsx](../../web/src/components/task/ApplyTemplateDialog.tsx) | 305 | authoring | Migration pending | -| [PreviewPanel.tsx](../../web/src/components/task/PreviewPanel.tsx) | 71 | utility | Migration pending; migrate with nested consumers | -| [AttachmentsSection.tsx](../../web/src/components/task/AttachmentsSection.tsx) | 172 | confirm | Migration pending | -| [SectionHeader.tsx](../../web/src/components/settings/shared/SectionHeader.tsx) | 66 | confirm | Shared geometry; browser/native passed #1436 | -| [DesktopOnboarding.tsx](../../web/src/components/auth/DesktopOnboarding.tsx) | 711 | authoring | Migration pending | -| [AgentRunTimelinePanel.tsx](../../web/src/components/task/AgentRunTimelinePanel.tsx) | 1373 | form | Migration pending | -| [DeliverablesSection.tsx](../../web/src/components/task/DeliverablesSection.tsx) | 272 | confirm | Migration pending | -| [DrillDownPanel.tsx](../../web/src/components/dashboard/DrillDownPanel.tsx) | 14 | utility | Migration pending | -| [WorkflowSection.tsx](../../web/src/components/task/WorkflowSection.tsx) | 266 | authoring | Migration pending | -| [CommentsSection.tsx](../../web/src/components/task/CommentsSection.tsx) | 190 | confirm | Migration pending | -| [TaskDetailPanel.tsx](../../web/src/components/task/TaskDetailPanel.tsx) | 271 | task | Migration pending | -| [sheet.tsx](../../web/src/components/ui/sheet.tsx) | 147 | utility | Migration pending | -| [alert-dialog.tsx](../../web/src/components/ui/alert-dialog.tsx) | 136 | form | Migration pending | -| [WorkProductsSection.tsx](../../web/src/components/task/WorkProductsSection.tsx) | 504 | authoring | Migration pending | -| [WorkProductsSection.tsx](../../web/src/components/task/WorkProductsSection.tsx) | 551 | authoring | Migration pending | -| [AgentPanel.tsx](../../web/src/components/task/AgentPanel.tsx) | 630 | confirm | Migration pending | -| [AgentPanel.tsx](../../web/src/components/task/AgentPanel.tsx) | 661 | form | Migration pending | -| [dialog.tsx](../../web/src/components/ui/dialog.tsx) | 157 | form | Migration pending | -| [ExportDialog.tsx](../../web/src/components/dashboard/ExportDialog.tsx) | 106 | form | Migration pending | -| [SkillRiskDashboardPanel.tsx](../../web/src/components/settings/tabs/SkillRiskDashboardPanel.tsx) | 339 | form | Shared geometry; browser/native passed #1436 | -| [ToolPoliciesTab.tsx](../../web/src/components/settings/tabs/ToolPoliciesTab.tsx) | 269 | authoring | Shared geometry; browser/native passed #1436 | -| [GeneralTab.tsx](../../web/src/components/settings/tabs/GeneralTab.tsx) | 404 | confirm | Shared geometry; browser/native passed #1436 | -| [TemplateComponents.tsx](../../web/src/components/settings/tabs/TemplateComponents.tsx) | 252 | confirm | Shared geometry; browser/native passed #1436 | -| [SecurityTab.tsx](../../web/src/components/settings/tabs/SecurityTab.tsx) | 174 | confirm | Shared geometry; browser/native passed #1436 | -| [AgentsTab.tsx](../../web/src/components/settings/tabs/AgentsTab.tsx) | 2331 | confirm | Shared geometry; browser/native passed #1436 | -| [MaintenanceTab.tsx](../../web/src/components/settings/tabs/MaintenanceTab.tsx) | 590 | form | Shared geometry; browser/native passed #1436 | +| Consumer | Opening line | Intended variant | Status | +| ------------------------------------------------------------------------------------------------- | -----------: | ---------------- | ---------------------------------------------------- | +| [TemplateEditorDialog.tsx](../../web/src/components/templates/TemplateEditorDialog.tsx) | 188 | authoring | Shared primitive adopted; runtime acceptance pending | +| [TemplatesPage.tsx](../../web/src/components/templates/TemplatesPage.tsx) | 274 | confirm | Shared primitive adopted; runtime acceptance pending | +| [TemplatesPage.tsx](../../web/src/components/templates/TemplatesPage.tsx) | 298 | form | Shared primitive adopted; runtime acceptance pending | +| [SearchDialog.tsx](../../web/src/components/search/SearchDialog.tsx) | 282 | authoring | Shared geometry; browser/native passed #1440 | +| [AdmissionQueuePanel.tsx](../../web/src/components/digest/AdmissionQueuePanel.tsx) | 315 | form | Migration pending | +| [WorkflowStartDialog.tsx](../../web/src/components/workflows/WorkflowStartDialog.tsx) | 71 | form | Migration pending; migrate with nested consumers | +| [CreateTaskDialog.tsx](../../web/src/components/task/CreateTaskDialog.tsx) | 267 | form | Migration pending; migrate with nested consumers | +| [PolicyManager.tsx](../../web/src/components/policies/PolicyManager.tsx) | 552 | authoring | Shared modal; runtime acceptance pending in #1423 | +| [PolicyManager.tsx](../../web/src/components/policies/PolicyManager.tsx) | 906 | form | Shared modal; runtime acceptance pending in #1423 | +| [TimeTrackingSection.tsx](../../web/src/components/task/TimeTrackingSection.tsx) | 243 | form | Migration pending | +| [BulkActionsBar.tsx](../../web/src/components/board/BulkActionsBar.tsx) | 366 | confirm | Migration pending | +| [ArchiveSuggestionBanner.tsx](../../web/src/components/board/ArchiveSuggestionBanner.tsx) | 92 | confirm | Migration pending | +| [ConflictResolver.tsx](../../web/src/components/task/ConflictResolver.tsx) | 124 | utility | Migration pending | +| [ConflictResolver.tsx](../../web/src/components/task/ConflictResolver.tsx) | 383 | confirm | Migration pending | +| [FilterBar.tsx](../../web/src/components/board/FilterBar.tsx) | 349 | form | Migration pending | +| [FilterBar.tsx](../../web/src/components/board/FilterBar.tsx) | 374 | confirm | Migration pending | +| [ChatPanel.tsx](../../web/src/components/chat/ChatPanel.tsx) | 279 | chat | Migration pending; migrate with nested consumers | +| [ChatPanel.tsx](../../web/src/components/chat/ChatPanel.tsx) | 297 | confirm | Migration pending; migrate with nested consumers | +| [TaskWorkView.tsx](../../web/src/components/task/TaskWorkView.tsx) | 1055 | confirm | Migration pending | +| [ObservationsSection.tsx](../../web/src/components/task/ObservationsSection.tsx) | 118 | confirm | Migration pending | +| [SquadChatPanel.tsx](../../web/src/components/chat/SquadChatPanel.tsx) | 522 | chat | Migration pending; migrate with nested consumers | +| [ReviewPanel.tsx](../../web/src/components/task/ReviewPanel.tsx) | 212 | form | Migration pending | +| [ArtifactPreviewModal.tsx](../../web/src/components/task/ArtifactPreviewModal.tsx) | 112 | authoring | Migration pending | +| [CommandPalette.tsx](../../web/src/components/layout/CommandPalette.tsx) | 293 | form | Shared geometry; browser/native passed #1440 | +| [SettingsDialog.tsx](../../web/src/components/settings/SettingsDialog.tsx) | 529 | authoring | Shared geometry; browser/native passed #1436 | +| [SettingsDialog.tsx](../../web/src/components/settings/SettingsDialog.tsx) | 739 | confirm | Shared geometry; browser/native passed #1436 | +| [PRDialog.tsx](../../web/src/components/task/git/PRDialog.tsx) | 36 | authoring | Migration pending | +| [ActivitySidebar.tsx](../../web/src/components/layout/ActivitySidebar.tsx) | 244 | utility | Migration pending | +| [SortableListItem.tsx](../../web/src/components/settings/SortableListItem.tsx) | 171 | confirm | Shared geometry; browser/native passed #1436 | +| [WorktreeStatus.tsx](../../web/src/components/task/git/WorktreeStatus.tsx) | 374 | form | Migration pending | +| [WorktreeStatus.tsx](../../web/src/components/task/git/WorktreeStatus.tsx) | 404 | confirm | Migration pending | +| [TaskDetailsTab.tsx](../../web/src/components/task/detail/TaskDetailsTab.tsx) | 254 | confirm | Migration pending | +| [KeyboardShortcutsDialog.tsx](../../web/src/components/layout/KeyboardShortcutsDialog.tsx) | 49 | form | Shared geometry; browser/native passed #1440 | +| [ArchiveSidebar.tsx](../../web/src/components/layout/ArchiveSidebar.tsx) | 240 | utility | Migration pending | +| [MobileShell.tsx](../../web/src/components/layout/MobileShell.tsx) | 129 | utility | Migration pending | +| [ApplyTemplateDialog.tsx](../../web/src/components/task/ApplyTemplateDialog.tsx) | 305 | authoring | Migration pending | +| [PreviewPanel.tsx](../../web/src/components/task/PreviewPanel.tsx) | 71 | utility | Migration pending; migrate with nested consumers | +| [AttachmentsSection.tsx](../../web/src/components/task/AttachmentsSection.tsx) | 172 | confirm | Migration pending | +| [SectionHeader.tsx](../../web/src/components/settings/shared/SectionHeader.tsx) | 66 | confirm | Shared geometry; browser/native passed #1436 | +| [DesktopOnboarding.tsx](../../web/src/components/auth/DesktopOnboarding.tsx) | 711 | authoring | Migration pending | +| [AgentRunTimelinePanel.tsx](../../web/src/components/task/AgentRunTimelinePanel.tsx) | 1373 | form | Migration pending | +| [DeliverablesSection.tsx](../../web/src/components/task/DeliverablesSection.tsx) | 272 | confirm | Migration pending | +| [DrillDownPanel.tsx](../../web/src/components/dashboard/DrillDownPanel.tsx) | 14 | utility | Migration pending | +| [WorkflowSection.tsx](../../web/src/components/task/WorkflowSection.tsx) | 266 | authoring | Migration pending | +| [CommentsSection.tsx](../../web/src/components/task/CommentsSection.tsx) | 190 | confirm | Migration pending | +| [TaskDetailPanel.tsx](../../web/src/components/task/TaskDetailPanel.tsx) | 271 | task | Migration pending | +| [sheet.tsx](../../web/src/components/ui/sheet.tsx) | 147 | utility | Migration pending | +| [alert-dialog.tsx](../../web/src/components/ui/alert-dialog.tsx) | 136 | form | Migration pending | +| [WorkProductsSection.tsx](../../web/src/components/task/WorkProductsSection.tsx) | 504 | authoring | Migration pending | +| [WorkProductsSection.tsx](../../web/src/components/task/WorkProductsSection.tsx) | 551 | authoring | Migration pending | +| [AgentPanel.tsx](../../web/src/components/task/AgentPanel.tsx) | 630 | confirm | Migration pending | +| [AgentPanel.tsx](../../web/src/components/task/AgentPanel.tsx) | 661 | form | Migration pending | +| [dialog.tsx](../../web/src/components/ui/dialog.tsx) | 157 | form | Migration pending | +| [ExportDialog.tsx](../../web/src/components/dashboard/ExportDialog.tsx) | 106 | form | Migration pending | +| [SkillRiskDashboardPanel.tsx](../../web/src/components/settings/tabs/SkillRiskDashboardPanel.tsx) | 339 | form | Shared geometry; browser/native passed #1436 | +| [ToolPoliciesTab.tsx](../../web/src/components/settings/tabs/ToolPoliciesTab.tsx) | 269 | authoring | Shared geometry; browser/native passed #1436 | +| [GeneralTab.tsx](../../web/src/components/settings/tabs/GeneralTab.tsx) | 404 | confirm | Shared geometry; browser/native passed #1436 | +| [TemplateComponents.tsx](../../web/src/components/settings/tabs/TemplateComponents.tsx) | 252 | confirm | Shared geometry; browser/native passed #1436 | +| [SecurityTab.tsx](../../web/src/components/settings/tabs/SecurityTab.tsx) | 174 | confirm | Shared geometry; browser/native passed #1436 | +| [AgentsTab.tsx](../../web/src/components/settings/tabs/AgentsTab.tsx) | 2331 | confirm | Shared geometry; browser/native passed #1436 | +| [MaintenanceTab.tsx](../../web/src/components/settings/tabs/MaintenanceTab.tsx) | 590 | form | Shared geometry; browser/native passed #1436 | The mobile notification drawer is a deliberate bottom-sheet exception; it still needs matching spacing and keyboard checks. Compatibility wrappers in `ui/dialog.tsx`, `ui/alert-dialog.tsx`, and `ui/sheet.tsx` remain inventoried above where they instantiate roots; their public call sites must not be silently treated as migrated. Docked Workbench chat is not a modal and must keep its non-modal focus model while adopting the same header/composer spacing. diff --git a/e2e/helpers/discovery-popouts.ts b/e2e/helpers/discovery-popouts.ts index 06647060..c201e989 100644 --- a/e2e/helpers/discovery-popouts.ts +++ b/e2e/helpers/discovery-popouts.ts @@ -131,7 +131,9 @@ export async function exerciseDiscoveryPopouts( await query.fill('fixture'); await query.press('Enter'); await search.getByRole('button', { name: /Fixture result 1\b/ }).press('Enter'); - const settingsFromSearch = page.getByRole('dialog', { name: 'Settings', exact: true }); + // Packaged Board Only mode adds its badge to the accessible dialog title. + const settingsName = /^Settings(?: Board Only)?$/; + const settingsFromSearch = page.getByRole('dialog', { name: settingsName }); await expect(settingsFromSearch).toBeVisible(); await expect .poll(() => settingsFromSearch.evaluate((element) => element.contains(document.activeElement))) @@ -148,7 +150,10 @@ export async function exerciseDiscoveryPopouts( await openPalette(); await input.fill(command); await input.press('Enter'); - const target = page.getByRole('dialog', { name: destination, exact: true }); + const target = page.getByRole('dialog', { + name: destination === 'Settings' ? settingsName : destination, + exact: true, + }); await expect(target).toBeVisible(); await expect .poll(() => target.evaluate((element) => element.contains(document.activeElement)))