From ccbfefef5f23d312bc11130d14eab05aec97d900 Mon Sep 17 00:00:00 2001 From: Dotta <34892728+cryppadotta@users.noreply.github.com> Date: Wed, 14 Oct 2026 23:12:34 -0500 Subject: [PATCH] test(ui): retire 33 duplicate executions and share render setup (#16072) Co-Authored-By: Paperclip --- ...test-audit-r7-ui-agentconfig-controls.json | 530 ++++++++++++++ ...2026-10-12-test-audit-r7-ui-agentconfig.md | 47 ++ ...test-audit-r7-ui-appboundary-controls.json | 137 ++++ ...2026-10-12-test-audit-r7-ui-appboundary.md | 33 + ...2-test-audit-r7-ui-appdetail-controls.json | 103 +++ .../2026-10-12-test-audit-r7-ui-appdetail.md | 47 ++ ...test-audit-r7-ui-attachments-controls.json | 168 +++++ ...2026-10-12-test-audit-r7-ui-attachments.md | 34 + ...est-audit-r7-ui-company-menu-controls.json | 401 ++++++++++ ...026-10-12-test-audit-r7-ui-company-menu.md | 41 ++ .../2026-10-12-test-audit-r7-ui-controls.json | 692 ++++++++++++++++++ ...est-audit-r7-ui-experimental-controls.json | 306 ++++++++ ...026-10-12-test-audit-r7-ui-experimental.md | 38 + ...-12-test-audit-r7-ui-filters-controls.json | 221 ++++++ .../2026-10-12-test-audit-r7-ui-filters.md | 35 + ...0-12-test-audit-r7-ui-inline-controls.json | 180 +++++ .../2026-10-12-test-audit-r7-ui-inline.md | 33 + ...2-test-audit-r7-ui-issuechat-controls.json | 145 ++++ .../2026-10-12-test-audit-r7-ui-issuechat.md | 32 + ...test-audit-r7-ui-issuedetail-controls.json | 149 ++++ ...2026-10-12-test-audit-r7-ui-issuedetail.md | 32 + ...-test-audit-r7-ui-onboarding-controls.json | 549 ++++++++++++++ ...-audit-r7-ui-onboarding-step-controls.json | 196 +++++ ...-10-12-test-audit-r7-ui-onboarding-step.md | 34 + .../2026-10-12-test-audit-r7-ui-onboarding.md | 48 ++ ...10-12-test-audit-r7-ui-route-controls.json | 303 ++++++++ .../2026-10-12-test-audit-r7-ui-route.md | 41 ++ ...t-audit-r7-ui-secret-popover-controls.json | 192 +++++ ...6-10-12-test-audit-r7-ui-secret-popover.md | 34 + ...t-audit-r7-ui-service-worker-controls.json | 197 +++++ ...6-10-12-test-audit-r7-ui-service-worker.md | 34 + ...-12-test-audit-r7-ui-sidebar-controls.json | 244 ++++++ .../2026-10-12-test-audit-r7-ui-sidebar.md | 39 + ...12-test-audit-r7-ui-timeline-controls.json | 271 +++++++ .../2026-10-12-test-audit-r7-ui-timeline.md | 40 + ...-test-audit-r7-ui-transcript-controls.json | 139 ++++ .../2026-10-12-test-audit-r7-ui-transcript.md | 40 + doc/plans/2026-10-12-test-audit-r7-ui.md | 74 ++ .../AgentConfigForm.render.test.tsx | 92 +-- ui/src/components/AppErrorBoundary.test.tsx | 26 +- ui/src/components/InlineEditor.test.tsx | 21 +- .../IssueAttachmentsSection.test.tsx | 32 +- ui/src/components/IssueChatThread.test.tsx | 50 -- .../components/IssueFiltersPopover.test.tsx | 28 +- ui/src/components/Layout.test.tsx | 164 +---- .../components/OnboardingWizard.step.test.tsx | 9 - ui/src/components/OnboardingWizard.test.tsx | 112 +-- ui/src/components/RouteErrorBoundary.test.tsx | 57 +- ui/src/components/Sidebar.test.tsx | 50 +- ui/src/components/SidebarCompanyMenu.test.tsx | 54 +- .../EnvironmentVariablesEditor.test.tsx | 35 +- .../task-chat/transcript-adapter.test.ts | 15 - ui/src/lib/service-worker-updates.test.ts | 10 - ui/src/pages/Agents.test.tsx | 214 +----- .../InstanceExperimentalSettings.test.tsx | 30 +- ui/src/pages/InviteLanding.test.tsx | 192 +---- ui/src/pages/IssueDetail.test.tsx | 17 +- ui/src/pages/Timeline.test.tsx | 50 +- ui/src/pages/apps/AppDetail.test.tsx | 13 +- 59 files changed, 6112 insertions(+), 1038 deletions(-) create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-agentconfig-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-appboundary-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-appboundary.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-attachments-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-attachments.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-company-menu-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-company-menu.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-experimental-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-experimental.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-filters-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-filters.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-inline.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-onboarding-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-onboarding-step-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-onboarding-step.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-onboarding.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-route-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-route.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-secret-popover-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-secret-popover.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-service-worker-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-service-worker.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-sidebar-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-sidebar.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-timeline-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-timeline.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-transcript-controls.json create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui-transcript.md create mode 100644 doc/plans/2026-10-12-test-audit-r7-ui.md diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-agentconfig-controls.json b/doc/plans/2026-10-12-test-audit-r7-ui-agentconfig-controls.json new file mode 100644 index 00000000000..c8b438ce094 --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-agentconfig-controls.json @@ -0,0 +1,530 @@ +{ + "audit": { + "file": "ui/src/components/AgentConfigForm.render.test.tsx", + "base": "e3effbb9e5c66b838f67fd487987c8bf1007e413", + "originalSha256": "57282ae3afe8c55ac118f3a658152d8df500a87b15383c8f6b0530a7fdcfb8a0", + "candidateSha256": "132112f3d2bb74d0844673a39ce31ffca1306e0b82d9846f3e0cafaf83e81708", + "allOtherProgramAstUnchanged": true, + "allOtherSourceBytesUnchanged": true, + "newHelpers": 0, + "registeredInvocationsRemoved": 4, + "rootRendersRemoved": 4, + "netTestLinesRemoved": 44, + "migrations": [ + { + "retired": "keeps secret access out of the main Configuration content", + "keeper": "hides the environment override when Local is the only configured environment", + "exactSetupStatements": 2, + "sameEnclosingHooks": true, + "exactCleanupStatements": 0, + "migratedGuards": [ + "expect(result.container.textContent).not.toContain(\"Secret access\");" + ], + "exactDuplicateGuardAlreadyKept": [], + "registeredInvocationsRemoved": 1, + "rootRendersRemoved": 1 + }, + { + "retired": "starts a login session for the effective sandbox and shows the code and the authentication URL", + "keeper": "shows a Cancel affordance while a login is active and cancels the session", + "exactSetupStatements": 5, + "sameEnclosingHooks": true, + "exactCleanupStatements": 0, + "migratedGuards": [ + "expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(\"company-1\", \"codex_local\", {\n environmentId: \"sandbox-1\",\n });", + "expect(result.container.textContent).toContain(\"WXYZ-1234\");", + "expect(result.container.textContent).toContain(\"https://auth.example.test/device\");" + ], + "exactDuplicateGuardAlreadyKept": [], + "registeredInvocationsRemoved": 1, + "rootRendersRemoved": 1 + }, + { + "retired": "shows the authorization URL and a browser-code input for a Claude sandbox", + "keeper": "cancels an active Claude login and returns to its start state", + "exactSetupStatements": 6, + "sameEnclosingHooks": true, + "exactCleanupStatements": 0, + "migratedGuards": [ + "expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith(\"company-1\", {\n environmentId: \"sandbox-1\",\n });", + "expect(result.container.textContent).toContain(\"https://claude.example.test/authorize\");", + "expect(\n result.container.querySelector('input[aria-label=\"Browser code\"]'),\n ).toBeTruthy();", + "expect(result.container.textContent).not.toContain(\"not encrypted\");" + ], + "exactDuplicateGuardAlreadyKept": [], + "registeredInvocationsRemoved": 1, + "rootRendersRemoved": 1 + }, + { + "retired": "keeps the non-path ACP controls visible when the policy hides the engine choice", + "keeper": "hides the host path and execution-engine fields for claude_local when the policy is on", + "exactSetupStatements": 6, + "sameEnclosingHooks": true, + "exactCleanupStatements": 0, + "migratedGuards": [ + "expect(labels).toContain(\"ACP session mode\");", + "expect(labels).toContain(\"ACP non-interactive permissions\");" + ], + "exactDuplicateGuardAlreadyKept": [], + "registeredInvocationsRemoved": 1, + "rootRendersRemoved": 1 + } + ] + }, + "verifierSha256": "084bdbc359e510397ef64daeb24e259efbc62c8b5d2c56d3e09d7f2534f155aa", + "mutationVerifierSha256": "ca8463047109d38a447d93fb94a19bb8efe9b1df440e0abf91ab31a8c0a358a2", + "runs": [ + { + "kind": "baseline", + "total": 99, + "passed": 99, + "failed": 0, + "skipped": 0, + "jsonSha256": "16a733e7e1de263ce88f1fbd89b94d4844aab7b6e7eca1fd670899fd670e263f", + "logSha256": "3f6f04966d8971e70a782681fccde2afd1aee5099fd8f376197109ed2babd2e5" + }, + { + "kind": "candidate", + "total": 95, + "passed": 95, + "failed": 0, + "skipped": 0, + "jsonSha256": "7fdabb69061f6d6f072c17224832171a225ac9a992d53c94d050c277eb467120", + "logSha256": "2717b82c2589f41dad5d9e926a7a37dd4fd79594acc1e9e6d9614a89ae2b5841" + } + ], + "mutations": [ + { + "slug": "secrets", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "hides the environment override when Local is the only configured environment", + "mutation": { + "before": "if (!isCreate && props.content === \"secrets\")", + "after": "if (!isCreate && (props.content === \"secrets\" || props.content === undefined))", + "replacementCount": 1 + }, + "intendedGuard": "expect(result.container.textContent).not.toContain(\"Secret access\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "24cf0c3e870ddc964fe327426491a4bbdfde043206191df578686ffb089d2f8f", + "logSha256": "10c8a0e3b2aafe33ab63fce0881fdf2b066d1cee507ccc589db6076701da4161", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "a9af939b306874f9bc7ef93c6954f3a234aafbb252c14672097aa33732c86f90", + "logSha256": "7fa30fef5ccdfa2cb797df92c4b207dff1eac29c99b9dcefa7a977278a4c3593", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'Secret accessSecrets this agent can r\u2026' not to contain 'Secret access'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:822:46\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "codex-company", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "shows a Cancel affordance while a login is active and cancels the session", + "mutation": { + "before": "agentsApi.startAdapterAuthLogin(companyId, adapterType, { environmentId, aiConnection })", + "after": "agentsApi.startAdapterAuthLogin(\"wrong-company\", adapterType, { environmentId, aiConnection })", + "replacementCount": 1 + }, + "intendedGuard": "expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "fabccb095c86b4151cb80e0446d83e60074a4da76e7f0a36d4fef0246a483696", + "logSha256": "3397bb075079467542110406669cb26177cbbcdee8c6e6c56a5f52ccaaafd30f", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "332cf3fce408da458c33289abaf343fbf76ffedc68d37ee532a5c43ffc09f93e", + "logSha256": "81892e052e638ba655789fcac2b9bf95b243d1bd628c86a72053ebd7c596a432", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected \"vi.fn()\" to be called with arguments: [ Array(3) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n- \"company-1\",\n+ \"wrong-company\",\n \"codex_local\",\n {\n+ \"aiConnection\": undefined,\n \"environmentId\": \"sandbox-1\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2233:10)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:1593:49\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "codex-adapter", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "shows a Cancel affordance while a login is active and cancels the session", + "mutation": { + "before": "agentsApi.startAdapterAuthLogin(companyId, adapterType, { environmentId, aiConnection })", + "after": "agentsApi.startAdapterAuthLogin(companyId, \"wrong-adapter\", { environmentId, aiConnection })", + "replacementCount": 1 + }, + "intendedGuard": "expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "3acb41404a916f7bc11b1ff698bfbaaa22017c67835907e59283b7b1df5ea07c", + "logSha256": "6530c744b0788868f9123b062307dfd1fac3f40740e193943a81da360fb19f3a", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "b3cbd3bfee156e965bed6924beefc3f0e6009785f3dcade569f03b88fd5cba55", + "logSha256": "90eeb1ecbbce2406915a5123c24d1311016fc1fe3d878af795781da3c352a071", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected \"vi.fn()\" to be called with arguments: [ Array(3) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n \"company-1\",\n- \"codex_local\",\n+ \"wrong-adapter\",\n {\n+ \"aiConnection\": undefined,\n \"environmentId\": \"sandbox-1\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2233:10)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:1593:49\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "codex-environment", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "shows a Cancel affordance while a login is active and cancels the session", + "mutation": { + "before": "agentsApi.startAdapterAuthLogin(companyId, adapterType, { environmentId, aiConnection })", + "after": "agentsApi.startAdapterAuthLogin(companyId, adapterType, { environmentId: \"wrong-sandbox\", aiConnection })", + "replacementCount": 1 + }, + "intendedGuard": "expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "3afd47d7705415ceb4ad8b7ce1415bd61b0b202d65732881660d75e75910c536", + "logSha256": "874b11b544fc038fba5e9ff57b156229acbbefb1db8410bf1bebc6794d1e5f20", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "2750457c4f575d786dade8a250f50520e08b1e351c95d2562900a06ffc9ab769", + "logSha256": "845ff3e01a9b6640496b2f895ca31e169639a65e3bf8e94bb3a383026e232b8b", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected \"vi.fn()\" to be called with arguments: [ Array(3) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n \"company-1\",\n \"codex_local\",\n {\n- \"environmentId\": \"sandbox-1\",\n+ \"aiConnection\": undefined,\n+ \"environmentId\": \"wrong-sandbox\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2233:10)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:1593:49\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "codex-code", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "shows a Cancel affordance while a login is active and cancels the session", + "mutation": { + "before": "{prompt.code}", + "after": "{\"missing code\"}", + "replacementCount": 1 + }, + "intendedGuard": "expect(result.container.textContent).toContain(\"WXYZ-1234\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "f985ab64892d06589b60759cb68183f52c9128056b79c93e69880cb5ff8c3ad1", + "logSha256": "dba2f7e6b14ed30859608119e88ac17f20c3c6de3ad93727a357d3860dc5a592", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "3a7ecc1e9c5e40c93c8e92f9e3930a4d0a01a2f84f01ffed53541c3403be4737", + "logSha256": "77c403024242dedc9cfa765484486337c97a35133cea348ed4ec57caf26a760d", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'IdentityNameTitleReports toChoose man\u2026' to contain 'WXYZ-1234'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:1596:42\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "codex-url", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "shows a Cancel affordance while a login is active and cancels the session", + "mutation": { + "before": "{prompt.url}", + "after": "{\"missing url\"}", + "replacementCount": 1 + }, + "intendedGuard": "expect(result.container.textContent).toContain(\"https://auth.example.test/device\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "0a11ca18e53fda28ea9a2956ee7254ab1b9f40f32f772b530df169adb06569b9", + "logSha256": "1772bbd6667cd1f32383f0671a186bc263054ef434de07933bac4feda1e3d4b6", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "3cca5f95b518a31622ebf3f17758c4617fa40476623210da56eee539c5a1efb6", + "logSha256": "1bac45eb7f9b150cdc6a99067d62e588baeca3af41d148fe897d0a0fa5949332", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'IdentityNameTitleReports toChoose man\u2026' to contain 'https://auth.example.test/device'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:1597:42\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "claude-company", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "cancels an active Claude login and returns to its start state", + "mutation": { + "before": "agentsApi.startClaudeSetupTokenLogin(companyId, {", + "after": "agentsApi.startClaudeSetupTokenLogin(\"wrong-company\", {", + "replacementCount": 1 + }, + "intendedGuard": "expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith(", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "40ec576f564d239009569ca0033715f58f5b255f76ef22da20b134c2e490218f", + "logSha256": "075d5fe2d62f1b80f60d63e0ce37e540fffdf2e666b01a21740264e6d4075478", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "0bf3dff32509866e86a80d67029ee81a1437d335045a91cb6cdf7f6ce59b5982", + "logSha256": "7ae4dcd73616fa424d373204986a05e798f573b5659daef4ac58bc6f7b9d9fdf", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'company-1', \u2026(1) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n- \"company-1\",\n+ \"wrong-company\",\n {\n+ \"aiConnection\": undefined,\n \"environmentId\": \"sandbox-1\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2233:10)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:2782:54\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "claude-environment", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "cancels an active Claude login and returns to its start state", + "mutation": { + "before": "agentsApi.startClaudeSetupTokenLogin(companyId, {\n environmentId,", + "after": "agentsApi.startClaudeSetupTokenLogin(companyId, {\n environmentId: \"wrong-sandbox\",", + "replacementCount": 1 + }, + "intendedGuard": "expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith(", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "4250b6cc6d66dc4df5753f403ef6894ceacdbc94bbf7812c5788ae143201d617", + "logSha256": "b76c385cbee9d1e26130b8e0c8c5f61fb2b31523e2ca65e2fbbf7303037ff179", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "7dfc3e5efa6eeb0c719d717b901b31fca6ca4a5cff1eb817382fa932a90f983b", + "logSha256": "56c3a19a6f86d4cc69918c47afd81bc4b4d887f788c135c7b956ea4fc3c0903c", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'company-1', \u2026(1) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n \"company-1\",\n {\n- \"environmentId\": \"sandbox-1\",\n+ \"aiConnection\": undefined,\n+ \"environmentId\": \"wrong-sandbox\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2233:10)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:2782:54\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "claude-url", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "cancels an active Claude login and returns to its start state", + "mutation": { + "before": "{authorizationUrl}", + "after": "{\"missing authorization url\"}", + "replacementCount": 1 + }, + "intendedGuard": "expect(result.container.textContent).toContain(\"https://claude.example.test/authorize\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "8ee00e28a8630374d9bfe8c85d96a44121121377b89b7f845ee4b32d659833f5", + "logSha256": "35255166875e6184b0a10b1abc4c6f42a281d4217eeac6ba2d1bbda83620aaf9", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "b2aca78cbef836af30a95188def37939d9ea2d0af743392abe804ae1bf118605", + "logSha256": "bb383cfabd0dc16036f31324b47ad392159a9eb7db75c622e2c2e132c2d1ee63", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'IdentityNameTitleReports toChoose man\u2026' to contain 'https://claude.example.test/authorize'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:2787:42\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "claude-input", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "cancels an active Claude login and returns to its start state", + "mutation": { + "before": "aria-label=\"Browser code\"", + "after": "aria-label=\"Missing browser input\"", + "replacementCount": 1 + }, + "intendedGuard": "result.container.querySelector('input[aria-label=\"Browser code\"]')", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "cf8cb1ded0e9999bb966c94c1c38aa7a147d217a06ff4ebe647c4f03ed3e550f", + "logSha256": "dc8c2389ba9b411989fc0d60a27e489829b21de1001c94b908555c337dfc685e", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "1bffa0d67d82af2e69b851eea8a1d4b2c319f85cad4b9b9fdf36dc95c143bde5", + "logSha256": "13f2b561842f8803f084be9723c7042abf5c0be74b625c99effb180f0c57dc4d", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected null to be truthy\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:2790:7\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "claude-advisory", + "owner": "ui/src/components/AgentConfigForm.tsx", + "sourceSha256": "bf999102f39bfc762747ce5d598e1e6ec2f926ac5fb28de55fa1baf5493f28b1", + "title": "cancels an active Claude login and returns to its start state", + "mutation": { + "before": "{transportInsecure && (", + "after": "{true && (", + "replacementCount": 2 + }, + "intendedGuard": "expect(result.container.textContent).not.toContain(\"not encrypted\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "ce03b65cc51ee03992fec6dfa438798f57053b914aca0cb56a791a43817a04b7", + "logSha256": "1e6753c737dd67dafe5f8cc4f7ec40be3be0875a4b97f0668e8d457a31462d4f", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "7f3ed2737dd31b0caf900567545c59d50c2cbf9aca876fd35080f13c87fb8757", + "logSha256": "aca8606f2a3f8176814074b81c913ec3f702e44141cd2131e28c14de2ce695c7", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'IdentityNameTitleReports toChoose man\u2026' not to contain 'not encrypted'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:2793:46\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "acp-mode", + "owner": "ui/src/adapters/claude-local/config-fields.tsx", + "sourceSha256": "c7e5aa4093bf30d31d5d3b1de092abe767965b7c79143965f92f8c250bf916f6", + "title": "hides the host path and execution-engine fields for claude_local when the policy is on", + "mutation": { + "before": "label=\"ACP session mode\"", + "after": "label=\"Missing ACP mode\"", + "replacementCount": 1 + }, + "intendedGuard": "expect(labels).toContain(\"ACP session mode\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "f6011ba4b3d6f34b47bf64dd76424cfb674b81a6663a58df2dd3994b9f87fca7", + "logSha256": "0174f7e7bcb488d93a15306214bb579be7049bfba08e3a048c3183f79360b6b0", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "294e714633d60e3121afe528b1c461d32bf13e4407cbfbd0da2581fc6d22f1ad", + "logSha256": "90a2ade05e125113eabeb530edec54a30e21dabd097407bb285139f4d87a35af", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected [ Array(17) ] to include 'ACP session mode'\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2077:15)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:3599:20\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "acp-permissions", + "owner": "ui/src/adapters/claude-local/config-fields.tsx", + "sourceSha256": "c7e5aa4093bf30d31d5d3b1de092abe767965b7c79143965f92f8c250bf916f6", + "title": "hides the host path and execution-engine fields for claude_local when the policy is on", + "mutation": { + "before": "label=\"ACP non-interactive permissions\"", + "after": "label=\"Missing ACP permissions\"", + "replacementCount": 1 + }, + "intendedGuard": "expect(labels).toContain(\"ACP non-interactive permissions\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "f859cc875b6f5c83be73f63cf9122d2fe928ad225c6d815a9ae29f6fed365766", + "logSha256": "06269344f536044578526368812f6c89c02f8208b9258beb773d14043859720b", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "b8b76b1c053101b532aec230f5356cbea28900d0c40fb012e3a8cc9b93a1ff2d", + "logSha256": "590f6908806038ca072a41f61516323dcba661886afbab66c0e1cf280c596060", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected [ Array(17) ] to include 'ACP non-interactive permissions'\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2077:15)\n at Proxy. (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)\n at Proxy.methodWrapper (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/chai@6.3.0/node_modules/chai/index.js:1737:25)\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AgentConfigForm.render.test.tsx:3600:20\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + } + ], + "priorEvidenceUnchanged": [ + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-appboundary-controls.json", + "sha256": "bad49e7bc92dea919df6b980bfa45e7452984cf31a6fd4655b355ba0444ff9a6" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-appboundary.md", + "sha256": "cd6f173584db0d485004af6f85b1ce78fa65b19d8c6ef582b061f0d232c6c1ed" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json", + "sha256": "7906fde0d62e14a7511b5cf45f864c9386a4c377922333eefc7f7e703c832f6a" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md", + "sha256": "715f23cd27502c92d0f5d1b83b91bcac03f254c73ab63b44181ae76939805229" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-attachments-controls.json", + "sha256": "c4ff66a3226e1edafd286cad0ca45c9445795b46944cf70d606c59a754913f3a" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-attachments.md", + "sha256": "d38715393c95306d10e871a5a2c9a32f105fa1452871cd7ad030d86dbbdb7416" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-controls.json", + "sha256": "0d445f6f066032f2d9cd724525a8d7d2290246cbfeee1f6ab4b44818467af2a7" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-route-controls.json", + "sha256": "0a72a7770ec749f2c0507a74d395e65d70b722d0b9d2a767a2c066a67ed46382" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-route.md", + "sha256": "9b5e1543163d6c9d0958aa3e377a593ec458f6674ce1ddb2bf3ca158786f09c4" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-sidebar-controls.json", + "sha256": "ae9f24746e67432cf6247c5da130b9c1bba46fc85112c0610d3f18545dfce326" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-sidebar.md", + "sha256": "5e267441c43aa8375fa5c54edcbd2879428d657708be9a2ab372aa66e4792886" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-timeline-controls.json", + "sha256": "6a86b07770f1cd8d758334fb61c46254197a7f533d24c056fc9a52c317488291" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-timeline.md", + "sha256": "612dc3ec4c3d435888055ba20a7f28230ce89ea8b071b8c38d1ea2c147074a96" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-transcript-controls.json", + "sha256": "9e4dbdc33806d6fcc912dc3aacc8691a77939e2ce2403032b2a8127c0e407e94" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-transcript.md", + "sha256": "9e4ac8c92a3a9eca727c29a77ae428702d19ecdee0cab0e3dfcda0a36bf004db" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui.md", + "sha256": "896b9928af85a4c7d588dfca93484980aadb238bd79d8142e671c62f0b191fa8" + } + ], + "ownerRestoredToBaseGitBytes": true, + "productionLinesChanged": 0 +} diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md b/doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md new file mode 100644 index 00000000000..84eaf0b9da3 --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md @@ -0,0 +1,47 @@ +# Test audit, Round 7 UI — Agent configuration follow-up + +This separate packet removes **4 registered executions, 4 root renders and 44 net test lines** from `ui/src/components/AgentConfigForm.render.test.tsx`. It adds no helper and changes no production lines. Audit base: `e3effbb9e5c66b838f67fd487987c8bf1007e413`. Prior committed evidence remains byte-identical. Render/execution savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. + +## Exact retirement map + +| Retired registration | Keeper | Observations retained | +|---|---|---| +| `keeps secret access out of the main Configuration content` | `hides the environment override when Local is the only configured environment` | expect(result.container.textContent).not.toContain("Secret access"); | +| `starts a login session for the effective sandbox and shows the code and the authentication URL` | `shows a Cancel affordance while a login is active and cancels the session` | expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith("company-1", "codex_local", { environmentId: "sandbox-1", });; expect(result.container.textContent).toContain("WXYZ-1234");; expect(result.container.textContent).toContain("https://auth.example.test/device"); | +| `shows the authorization URL and a browser-code input for a Claude sandbox` | `cancels an active Claude login and returns to its start state` | expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith("company-1", { environmentId: "sandbox-1", });; expect(result.container.textContent).toContain("https://claude.example.test/authorize");; expect( result.container.querySelector('input[aria-label="Browser code"]'), ).toBeTruthy();; expect(result.container.textContent).not.toContain("not encrypted"); | +| `keeps the non-path ACP controls visible when the policy hides the engine choice` | `hides the host path and execution-engine fields for claude_local when the policy is on` | expect(labels).toContain("ACP session mode");; expect(labels).toContain("ACP non-interactive permissions"); | + +Each of four pairs uses identical beforeEach/afterEach hooks and render/helper input expressions. The Local-only configuration keeper absorbs the Secret access exclusion. The Codex and Claude cancellation keepers retain their respective original provider-specific start API and displayed-code/submitted-browser-code observations before any Cancel click; their providers and lifecycle remain separate. Real runTest/startLogin helpers click Test/Sign in under the original QueryClient/Toast/Tooltip tree with fresh clients and roots. The managed-sandbox-only keeper absorbs both visible non-path ACP labels after the same Advanced/Advanced Run Policy toggles. AgentConfigForm.tsx passes the policy into real ClaudeLocalAdvancedFields from adapters/claude-local/config-fields.tsx, which retains non-path mode/permission fields while host paths are hidden. Existing enabled/disabled/loading, stored-token, terminal-state, submit, cancel-error and timeout cases remain unchanged. Two retired login cases avoid repeated environment-test/start-login API paths; polling request counts and time savings are not claimed. + +The AST verifier checks exact setup, shared enclosing hooks and matched cleanup where present, reconstructs candidate text solely from the declared registrations/assertion migrations, and requires exact byte equality plus full-program AST equality outside those edits. No fixture, helper, provider, action order, wait, assertion strength, timer or teardown changes. The IssueChatThread keeper is an existing complete subset proof; InlineEditor’s identical not-null guard is retained once. Every other case stays byte-identical. Default CI includes this file in `@paperclipai/ui` under `general-workspaces-a`, once across the two file shards; workflow/config unchanged. + +## Complete owner-file results + +| Run | Registered | Passed | Failed | Skipped | +|---|---:|---:|---:|---:| +| Baseline | 99 | 99 | 0 | 0 | +| Candidate | 95 | 95 | 0 | 0 | + +From `ui/`: `pnpm exec vitest run src/components/AgentConfigForm.render.test.tsx`. + +All 13 isolated positive controls passed. All 13 deliberate behavior regressions failed at their intended retained/migrated assertion, rather than setup, timeout or a different guard: + +| Regression | Intended guard | +|---|---| +| secrets | `expect(result.container.textContent).not.toContain("Secret access")` | +| codex-company | `expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(` | +| codex-adapter | `expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(` | +| codex-environment | `expect(mockAgentsApi.startAdapterAuthLogin).toHaveBeenCalledWith(` | +| codex-code | `expect(result.container.textContent).toContain("WXYZ-1234")` | +| codex-url | `expect(result.container.textContent).toContain("https://auth.example.test/device")` | +| claude-company | `expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith(` | +| claude-environment | `expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith(` | +| claude-url | `expect(result.container.textContent).toContain("https://claude.example.test/authorize")` | +| claude-input | `result.container.querySelector('input[aria-label="Browser code"]')` | +| claude-advisory | `expect(result.container.textContent).not.toContain("not encrypted")` | +| acp-mode | `expect(labels).toContain("ACP session mode")` | +| acp-permissions | `expect(labels).toContain("ACP non-interactive permissions")` | + +Exactly one production owner was temporarily changed per control. Every owner was restored byte for byte after each mutation and matched pinned Git bytes. Filtered controls select one keeper; unselected tests do not count as full-suite evidence. [Controls JSON](2026-10-12-test-audit-r7-ui-agentconfig-controls.json) records exact owner/source hashes, migration/input proof, complete-file run/log digests, mutation bodies, intended assertion failures and restoration receipts. Temporary raw verifiers and logs are identified by digests rather than committed in full. + +The earlier broad `pnpm test:run` was intentionally stopped without completion and is not claimed as passed. Separate packet results are focused proof, not a completed combined delivery-head replay or pending full CI. No push, rebase, PR or merge is included here. diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-appboundary-controls.json b/doc/plans/2026-10-12-test-audit-r7-ui-appboundary-controls.json new file mode 100644 index 00000000000..cafb0f6a273 --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-appboundary-controls.json @@ -0,0 +1,137 @@ +{ + "audit": { + "file": "ui/src/components/AppErrorBoundary.test.tsx", + "base": "c39262305b6b48a5decd564af8369083cd972b33", + "originalSha256": "1cc53b4a6978c3c5e98761467208d8e2e9a165163956a64a33bb84cea2778327", + "candidateSha256": "51fce35eb3b3b2dd0e1aacdd09f14dcd208e2e6b557ab0e4de9a16606fa3b778", + "allOtherProgramAstUnchanged": true, + "allOtherSourceBytesUnchanged": true, + "newHelpers": 0, + "registeredInvocationsRemoved": 1, + "rootRendersRemoved": 1, + "netTestLinesRemoved": 20, + "migrations": [ + { + "retired": "renders a reload prompt instead of a blank page when the shell throws in render", + "keeper": "reports one captured error and keeps the reload prompt", + "setupAstEqual": true, + "setupBindingNormalization": null, + "guards": [ + "expect(container.textContent).toContain(\"Paperclip hit an error\");", + "expect(container.textContent).toContain(\"Maximum update depth exceeded\");" + ], + "registeredInvocationsRemoved": 1 + } + ] + }, + "verifierSha256": "0f1b173c8a399bb8c3e831edac6805634304a749faffcfff7b8b1900da3d34a3", + "mutationVerifierSha256": "a05f5ba9071c0ce7ce8eac1bc0f6c7dd83401c4e720816389d779f8919312064", + "runs": [ + { + "kind": "baseline", + "jsonSha256": "c1a2a5f2da21b5a730f174b628b23c1b01e682b2b8cc10ab8f332dbcede339bd", + "logSha256": "475145ce3b58595c9e76cbed628598ecc97a3d5cc835b1e374a10507e72ba9f7", + "total": 6, + "passed": 6, + "failed": 0, + "skipped": 0 + }, + { + "kind": "candidate", + "jsonSha256": "b27bec00f8765cc28254633e2752f96f15d6f0734cd59b4e0c10267ba138ff46", + "logSha256": "bba83ddd4f7aae20381ef90bfd2f17f6b44818e71994c5f716ea17df8c10c057", + "total": 5, + "passed": 5, + "failed": 0, + "skipped": 0 + } + ], + "mutations": [ + { + "slug": "title", + "owner": "ui/src/components/AppErrorBoundary.tsx", + "sourceSha256": "72bfc237fd0760e8432a9948e3423b6cab6881507f28815240f585f46e3ceb7c", + "title": "reports one captured error and keeps the reload prompt", + "mutation": { + "before": "Paperclip hit an error", + "after": "Unexpected title", + "replacementCount": 1, + "additionalPreClosingTagReplacement": false + }, + "intendedGuard": "expect(container.textContent).toContain(\"Paperclip hit an error\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "85d36ca8369f85ceb5e9173db5670b2d5ccf3c843cf26b3b1fb0ddb73a59a029", + "logSha256": "088a6c3c7dafb9546d8c32db0829797a2917cba4ce2e78c0215529c99d9096f2", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "b82c5bc57625cae251acafe46aa64021129848550e43cb66c19996b10f7ced0f", + "logSha256": "5f8f8ad95575b5920ae4574c4c04d7d7a6b3db3262c293973953b4f56f2f6604", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'Unexpected titleSomething went wrong \u2026' to contain 'Paperclip hit an error'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AppErrorBoundary.test.tsx:53:35\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:1628:35\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:26\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3321:20\n at new Promise ()\n at runWithCancel (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3316:10)\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3301:20\n at new Promise ()\n at runWithTimeout (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3259:10)\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3882:64" + ] + } + }, + { + "slug": "detail", + "owner": "ui/src/components/AppErrorBoundary.tsx", + "sourceSha256": "72bfc237fd0760e8432a9948e3423b6cab6881507f28815240f585f46e3ceb7c", + "title": "reports one captured error and keeps the reload prompt", + "mutation": { + "before": "{error.message}", + "after": "{\"hidden detail\"}", + "replacementCount": 1, + "additionalPreClosingTagReplacement": false + }, + "intendedGuard": "expect(container.textContent).toContain(\"Maximum update depth exceeded\")", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "a11dcafca2602e4baed9feff4925dcca4c09ceb46a36b5baf782742274fe467d", + "logSha256": "23301c06f7a3c46599867040f2fe947f36fe6bf9c33c66e6c0d465c9b7a97746", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "3d0fdd9f0f6fa788decca2bdf816bee3bcbe4f2d5836ba6582e8e2860369d974", + "logSha256": "31c8775a1049760ef218a4d1bb14df2dde621652cd58f1b53c24651a4dfa0d3a", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected 'Paperclip hit an errorSomething went \u2026' to contain 'Maximum update depth exceeded'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/AppErrorBoundary.test.tsx:54:35\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:1628:35\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:26\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3321:20\n at new Promise ()\n at runWithCancel (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3316:10)\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3301:20\n at new Promise ()\n at runWithTimeout (file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3259:10)\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:3882:64" + ] + } + } + ], + "priorEvidenceUnchanged": [ + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json", + "sha256": "7906fde0d62e14a7511b5cf45f864c9386a4c377922333eefc7f7e703c832f6a" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md", + "sha256": "715f23cd27502c92d0f5d1b83b91bcac03f254c73ab63b44181ae76939805229" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-controls.json", + "sha256": "0d445f6f066032f2d9cd724525a8d7d2290246cbfeee1f6ab4b44818467af2a7" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-transcript-controls.json", + "sha256": "9e4dbdc33806d6fcc912dc3aacc8691a77939e2ce2403032b2a8127c0e407e94" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui-transcript.md", + "sha256": "9e4ac8c92a3a9eca727c29a77ae428702d19ecdee0cab0e3dfcda0a36bf004db" + }, + { + "file": "doc/plans/2026-10-12-test-audit-r7-ui.md", + "sha256": "896b9928af85a4c7d588dfca93484980aadb238bd79d8142e671c62f0b191fa8" + } + ], + "ownerRestoredToBaseGitBytes": true, + "productionLinesChanged": 0 +} diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-appboundary.md b/doc/plans/2026-10-12-test-audit-r7-ui-appboundary.md new file mode 100644 index 00000000000..a6780b611f0 --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-appboundary.md @@ -0,0 +1,33 @@ +# Test audit, Round 7 UI — App error boundary follow-up + +This isolated follow-up removes **1 registered executions, 1 root renders and 20 net test lines** from `ui/src/components/AppErrorBoundary.test.tsx`. It changes no production lines and adds no helper. The pinned audit base is `c39262305b6b48a5decd564af8369083cd972b33`. Prior UI proof remains unchanged. Registration/render reductions are per complete-suite invocation; no measured runtime or CI-speed claim is made. + +## Exact migrations + +| Retired registration | Keeper | Original observations retained | +|---|---|---| +| `renders a reload prompt instead of a blank page when the shell throws in render` | `reports one captured error and keeps the reload prompt` | expect(container.textContent).toContain("Paperclip hit an error");; expect(container.textContent).toContain("Maximum update depth exceeded"); | + +main.tsx wraps the app in AppErrorBoundary. The paired tests create the same root and render the same BoomRender throw under the real boundary, with identical hooks/unmount. Move title and original error detail before retained capture/count/metadata/reload-button checks. The retired reload-button expression already matches the retained expression exactly. Effect errors, healthy children and DOM insertion/translation errors remain distinct and unchanged. + +The verifier reconstructs the exact candidate text from only the declared removals and insertions, requires byte equality, and compares the entire program AST after the same migrations. Every unrelated source byte, hook, mock, test body and binding remains unchanged, outside the audit receipt’s explicitly declared duplicate-title or blank-line cleanup where applicable. Setup ASTs are equal except the explicitly normalized attachment callback binding described above where applicable. No tests are skipped, softened, suppressed or added. Each file remains included in `@paperclipai/ui` under CI `general-workspaces-a`; Vitest file sharding selects it once across the two shards, with no workflow/config change. + +## Complete-file evidence + +| Run | Registered | Passed | Failed | Skipped | +|---|---:|---:|---:|---:| +| Baseline | 6 | 6 | 0 | 0 | +| Candidate | 5 | 5 | 0 | 0 | + +From `ui/`: `pnpm exec vitest run src/components/AppErrorBoundary.test.tsx`. + +All 2 separately selected positive keeper controls passed. Every deliberate behavior mutation failed at the corresponding intended keeper assertion, not setup, timeout or another guard: + +| Mutation | Intended assertion | +|---|---| +| title | `expect(container.textContent).toContain("Paperclip hit an error")` | +| detail | `expect(container.textContent).toContain("Maximum update depth exceeded")` | + +Every mutated production owner was restored byte for byte after each mutation and checked against pinned Git bytes. Name-filtered controls select exactly one keeper; their unselected tests are not full-suite evidence. [Compact controls](2026-10-12-test-audit-r7-ui-appboundary-controls.json) preserve source/owner hashes, exact migration map, body verifier digests, complete run/log digests, intended failure receipts and restoration checks. Temporary AST/receipt scripts initially needed corrections for chained assertions or statement position; those verifier attempts produced no accepted test evidence. + +The earlier broad local `pnpm test:run` was intentionally stopped before completion; it is not claimed as a pass. These focused runs do not substitute for pending delivery-head CI. No push, rebase, pull request or merge is included in this packet. diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json b/doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json new file mode 100644 index 00000000000..86e3b3a6fac --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json @@ -0,0 +1,103 @@ +{ + "audit": { + "file": "ui/src/pages/apps/AppDetail.test.tsx", + "base": "81cd7ab0ca0bdc55ea0927bc44fcf6e764a530ed", + "originalSha256": "35c4d4828daa80d37b8319fa1dfd4c049c03e26a780c6ce3b1e64990f32be9c6", + "candidateSha256": "f41c56cc4bae6e496067c93b58419ed3acfc6938f7a1ea7169ac2b1fa9ae3e61", + "retired": "removes the separate always-installed controls from Permissions", + "keeper": "renders searchable action groups with three-way permission toggles", + "identicalInitialSetup": true, + "migratedExactAssertions": [ + "expect(container.textContent).toContain(\"Which agents can use this connection?\");", + "expect(container.textContent).not.toContain(\"Always installed\");", + "expect(putConnectionInstallsMock).not.toHaveBeenCalled();" + ], + "allOtherSourceBytesUnchanged": true, + "allOtherProgramAstUnchanged": true, + "newHelpers": 0, + "registeredInvocationsRemoved": 1, + "completeRenderCallsRemoved": 1, + "netTestLinesRemoved": 7 + }, + "verifierSha256": "8252a8caeedbbbc3b6b630376b8207b4f78021b719ac601e061d394535ecea0e", + "runs": [ + { + "kind": "baseline", + "jsonSha256": "74eb47f37400e2409108c4a88bbbd1f0c25d12d0e7f9c8576aad598758472ea3", + "total": 78, + "passed": 78, + "failed": 0, + "skipped": 0 + }, + { + "kind": "candidate", + "jsonSha256": "50a8a2e03f8521f125011f82c0ee816b55e1bd1d751e9d3fd2fe3fd71fad2314", + "total": 77, + "passed": 77, + "failed": 0, + "skipped": 0 + } + ], + "mutations": [ + { + "slug": "appdetail-old-install-copy", + "owner": "ui/src/pages/apps/app-detail/PermissionsPanel.tsx", + "title": "renders searchable action groups with three-way permission toggles", + "sourceSha": "b3b96c2e2fbafee17e0b01c9127c30bd4a0a787f2481a264001fd6c2bce8e379", + "replacements": 1, + "mutation": { + "before": ">Which agents can use this connection?", + "after": ">Which agents can use this connection?Always installed" + }, + "restoredByteForByte": true, + "positive": { + "exit": 0, + "caseStatus": "passed", + "jsonSha256": "a97f5dd88c5febcf4fe906f34ea7efd0672781b95b2757aeb9cbcb0bd9247edf", + "logSha256": "26c7c2d6e1c6edca6e56e0f21ecbe3897c28c3f7ad1300dd07886fe905d0c025" + }, + "negative": { + "exit": 1, + "caseStatus": "failed", + "intendedAssertionFailure": "AssertionError: expected 'GitHubConnected2 actions availableUnv\u2026' not to contain 'Always installed'", + "jsonSha256": "a444c1fbc181dabecbcf67ce1ea7da5659d2bf3cc85a5983fc02fd49418ea66d", + "logSha256": "feef1c4c056f2bba80e2bda438edc27e099da834f11d3c5b1ccaf1e13da73b0d" + } + }, + { + "slug": "appdetail-install-on-mount", + "owner": "ui/src/pages/apps/AppDetail.tsx", + "title": "renders searchable action groups with three-way permission toggles", + "sourceSha": "ee8ab6e844ce11bf5d13954f0a73de3e42de61a933deb01ad9e40cb76e3b93d1", + "replacements": 1, + "mutation": { + "before": " const activeTab: AppTabKey | null = isAppTabKey(tab) ? tab : null;", + "after": " useEffect(() => { void toolsApi.putConnectionInstalls(connectionId, []); }, [connectionId]);\n const activeTab: AppTabKey | null = isAppTabKey(tab) ? tab : null;" + }, + "restoredByteForByte": true, + "positive": { + "exit": 0, + "caseStatus": "passed", + "jsonSha256": "b87e88f3d6a624d21ce9795889d002fb0bb8a08ad7b27bd5cad6420b03ec6f04", + "logSha256": "0d0d9d88fd6da2c652fb4119fb2ed3cef7c624514e8b0501f3daf62578ec99ac" + }, + "negative": { + "exit": 1, + "caseStatus": "failed", + "intendedAssertionFailure": "AssertionError: expected \"vi.fn()\" to not be called at all, but actually been called 1 times", + "jsonSha256": "7d04f5db02f84793fe53914e4f8cfc98f7644766146861857afcf586809b6d16", + "logSha256": "cc98a64e983162d6330263ea4433cc6b17c4925b3b9806794996dafb9b7acd0c" + } + } + ], + "allProductionOwnersRestored": true, + "productionLinesChanged": 0, + "priorUiProofUnchanged": { + "commit": "81cd7ab0ca0bdc55ea0927bc44fcf6e764a530ed", + "reportSha256": "896b9928af85a4c7d588dfca93484980aadb238bd79d8142e671c62f0b191fa8", + "controlsSha256": "0d445f6f066032f2d9cd724525a8d7d2290246cbfeee1f6ab4b44818467af2a7" + }, + "ciInclusion": "@paperclipai/ui project in general-workspaces-a; complete file remains included; no routing changes", + "netCombinedTestLinesRemoved": 371, + "combinedRegisteredInvocationsRemoved": 2 +} diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md b/doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md new file mode 100644 index 00000000000..91ceee0a2af --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md @@ -0,0 +1,47 @@ +# Test audit, Round 7 UI — AppDetail follow-up + +This follow-up removes **one duplicate registered invocation, one complete render, and seven net test lines** from `ui/src/pages/apps/AppDetail.test.tsx`. It adds no helper and changes zero production lines. Combined with the [approved first UI batch](2026-10-12-test-audit-r7-ui.md), the branch removes **371 net test lines and two registered invocations**. The original UI report, controls and test bytes remain unchanged. + +The follow-up audit base is local UI commit `81cd7ab0ca0bdc55ea0927bc44fcf6e764a530ed`. This file has the same original bytes at Round 6 parent `e868e6645ce0d598d756d3458f0b3d71afd6db4a`. + +## Exact retirement and keeper + +Retired: `removes the separate always-installed controls from Permissions`. + +Keeper: `renders searchable action groups with three-way permission toggles`. + +Both cases use the same enclosing beforeEach, connection, catalog, profiles, grants, install state and spies. Their two pre-assertion statements are byte-identical: select the permissions tab, then await the same complete AppDetail render. Neither case changes a fixture or takes a user action before its assertions. Both permission observations were updated by [PR #12802](https://github.com/paperclipai/paperclip/pull/12802). + +All three retired observations move unchanged into the keeper, immediately after render and before its existing assertions: + +- The agent-access question is visible. +- The old Always installed copy is absent. +- The connection-install mutation API has not been called. + +The keeper also retains its original fixed action-group counts, action names, review prompt, search input, selected Allowed/Ask first radio states, two Test actions, old-copy exclusions and card-layout exclusion. Viewer gates, picked-agent mode, required installed agents, access mutations, AI credential routing, task-grant removal and failure paths remain separate cases. + +App.tsx mounts AppDetail at `apps/:connectionId/:tab`. AppDetail's actual permissions path renders AgentAccessSection and ActionsSection in PermissionsPanel. AgentAccessSection supplies the question and access controls. The install API is used by the explicit AI-connection save path, so a no-write-on-read check is a separate observation from absent UI copy. Both fixed guards remain in the keeper. The grouped action-control sibling suite remains unchanged. + +The test stays in the `@paperclipai/ui` project and the `general-workspaces-a` lane. This cut removes a collected test and its full query-client/root render; it changes no suite inclusion or CI routing. No wall-time improvement is claimed. + +## Proof + +| Complete AppDetail file | Registered cases | Passed | Failed | Skipped | +|---|---:|---:|---:|---:| +| Baseline | 78 | 78 | 0 | 0 | +| Candidate | 77 | 77 | 0 | 0 | + +Run from `ui/`: `pnpm exec vitest run src/pages/apps/AppDetail.test.tsx`. + +The body audit checks the two identical setup statements, copies the three exact assertion ASTs, and compares full original/candidate programs outside the declared removal and insertion. It also reconstructs the exact candidate text from only those source edits and requires byte equality. Every other source byte remains unchanged, including all mock factories, beforeEach, render helper, spies, waits, cleanup and original keeper assertions. No withPermissions helper exists in these pinned file bytes; no such setup was added or changed. + +Both positive keeper controls passed. Two deliberately broken production owners failed at the intended migrated guard: + +| Production regression | Direct keeper failure | +|---|---| +| Reintroduce Always installed copy beside the access question in PermissionsPanel | Fixed negative old-copy assertion. | +| Write connection installs from an AppDetail mount effect | Fixed no-install-API-call assertion. | + +Each negative control selected only the keeper. Its unselected cases do not count as complete-file proof. Neither mutation failed on setup, timeout or an unrelated action assertion. Both production owners were restored byte for byte and checked against pinned Git source. + +[Follow-up controls](2026-10-12-test-audit-r7-ui-appdetail-controls.json) retain exact original/candidate hashes, the unchanged prior proof hashes, body-audit digest, complete-file results, mutation descriptions, intended failures, run/log digests and source-restoration receipts. Raw verifiers and logs remain temporary audit packets; their digests do not retain complete payloads. Latest delivery-head replay, typecheck, token gates, build and CI status belong in the PR. The broad local default run was stopped before completion as recorded by the coordinator; it is not a full-suite pass. diff --git a/doc/plans/2026-10-12-test-audit-r7-ui-attachments-controls.json b/doc/plans/2026-10-12-test-audit-r7-ui-attachments-controls.json new file mode 100644 index 00000000000..31b88e75810 --- /dev/null +++ b/doc/plans/2026-10-12-test-audit-r7-ui-attachments-controls.json @@ -0,0 +1,168 @@ +{ + "audit": { + "file": "ui/src/components/IssueAttachmentsSection.test.tsx", + "base": "c39262305b6b48a5decd564af8369083cd972b33", + "originalSha256": "938aead11f9ccd2246049fe7ebe82800c3bdc8ff7c17fc20017d03ecc659d73a", + "candidateSha256": "e7cc76d20708169e8eadba692d6f9bc9e7ba32cb18075e72c8aaceb420705a94", + "allOtherProgramAstUnchanged": true, + "allOtherSourceBytesUnchanged": true, + "newHelpers": 0, + "registeredInvocationsRemoved": 1, + "rootRendersRemoved": 1, + "netTestLinesRemoved": 22, + "migrations": [ + { + "retired": "renders video attachments through the same player used for artifact outputs", + "keeper": "lets video attachments open the shared media gallery", + "setupAstEqual": false, + "setupBindingNormalization": "Inline fresh vi.fn becomes existing keeper fresh named vi.fn; provider/attachment/delete callback/flush unchanged", + "guards": [ + "const video = container.querySelector(\"video\");", + "expect(video?.getAttribute(\"src\")).toBe(\"/api/attachments/video-attachment/content\");", + "expect(video?.getAttribute(\"controls\")).not.toBeNull();", + "expect(fetchSpy).not.toHaveBeenCalled();" + ], + "registeredInvocationsRemoved": 1 + } + ] + }, + "verifierSha256": "0f1b173c8a399bb8c3e831edac6805634304a749faffcfff7b8b1900da3d34a3", + "mutationVerifierSha256": "a05f5ba9071c0ce7ce8eac1bc0f6c7dd83401c4e720816389d779f8919312064", + "runs": [ + { + "kind": "baseline", + "jsonSha256": "41996a845a818368c4fe0a7a4b31474ddc1b35c56c9aff524dcfae3218a1112c", + "logSha256": "cf1b9e033afd854462df31d4d65f4e604f317f6473c1f75c25b91ccf46e3e92c", + "total": 8, + "passed": 8, + "failed": 0, + "skipped": 0 + }, + { + "kind": "candidate", + "jsonSha256": "e9db5edd68d2e89898848aa90dabf75957fb703813c429472f80fbae92d194b4", + "logSha256": "67fe4596626962ac86f547b251f992158d5a28063a2c62962816433c3e837ed2", + "total": 7, + "passed": 7, + "failed": 0, + "skipped": 0 + } + ], + "mutations": [ + { + "slug": "source", + "owner": "ui/src/components/IssueAttachmentsSection.tsx", + "sourceSha256": "2ba7827325ed63d57fad24f31144e54c48c0618584c0cd013b26acf93e7f525b", + "title": "lets video attachments open the shared media gallery", + "mutation": { + "before": "", + "after": "", + "replacementCount": 1, + "additionalPreClosingTagReplacement": false + }, + "intendedGuard": "expect(video?.getAttribute(\"src\")).toBe(", + "restoredByteForByte": true, + "positive": { + "exit": 0, + "jsonSha256": "26bb673ede3119522a715a31928f8066c41c6538e78139e5a1dde1e879964fd5", + "logSha256": "5f31a93058981f8a4a0b9c109b851aad78153f734eb723cc04998fb3ffca555b", + "caseStatus": "passed" + }, + "negative": { + "exit": 1, + "jsonSha256": "41c490f0613aaf4958ad6ccc613dcf31053f2f528b1c7b2a252230470bc7d8ae", + "logSha256": "984bfe91fe92dcb4518504ae6fe21205466e3c775c2dde6806934471d73ab7d5", + "caseStatus": "failed", + "intendedFailureMessages": [ + "AssertionError: expected '/wrong-video.webm' to be '/api/attachments/video-attachment/con\u2026' // Object.is equality\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/IssueAttachmentsSection.test.tsx:206:40\n at file:///Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/node_modules/.pnpm/vitest@5.0.3_@opentelemetry+api@1.9.1_@types+node@24.13.3_jsdom@30.0.1_@noble+hashes@2.4.0__v_wr5mxfuu6kgge6st623q4v5egm/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20" + ] + } + }, + { + "slug": "controls", + "owner": "ui/src/components/IssueAttachmentsSection.tsx", + "sourceSha256": "2ba7827325ed63d57fad24f31144e54c48c0618584c0cd013b26acf93e7f525b", + "title": "lets video attachments open the shared media gallery", + "mutation": { + "before": "", + "after": "