test(ui): retire 33 duplicate executions and share render setup (#16072)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip authored and GitHub committed 2026-10-14 23:12:34 -05:00
1 parent f64d05adf4
commit ccbfefef5f
59 files changed
+6112 -1038

No files matched your search

@@ -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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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}</span>",
"after": "{\"missing code\"}</span>",
"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}</span>",
"after": "{\"missing url\"}</span>",
"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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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}</span>",
"after": "{\"missing authorization url\"}</span>",
"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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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
}
@@ -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.
@@ -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 (<anonymous>)\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 (<anonymous>)\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 (<anonymous>)\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 (<anonymous>)\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
}
@@ -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.
@@ -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?</h2>",
"after": ">Which agents can use this connection?<span>Always installed</span></h2>"
},
"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
}
@@ -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.
@@ -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": "<OutputVideoPlayer src={attachment.contentPath} title={filename} />",
"after": "<OutputVideoPlayer src=\"/wrong-video.webm\" title={filename} />",
"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": "<OutputVideoPlayer src={attachment.contentPath} title={filename} />",
"after": "<video src={attachment.contentPath} />",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(video?.getAttribute(\"controls\")).not.toBeNull()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "5f63925596e95dc930e831668536812e50bb21f3c49e5d6d72458b4fe8e9558d",
"logSha256": "9685b1259ff56dade8aee65c3388084bb032c0a1bd584e7635cf64a90ae7ef34",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "738045b821839a3fe5b3ff8ab0c8abd6508462105a7ffde2ae24cd2a76d0f1e5",
"logSha256": "19e35c954f8972b9d86f893ee59877ad1ee28eaff8856c22fdeac4f4f49ebfab",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected null not to be null\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/IssueAttachmentsSection.test.tsx:207: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": "fetch",
"owner": "ui/src/components/IssueAttachmentsSection.tsx",
"sourceSha256": "2ba7827325ed63d57fad24f31144e54c48c0618584c0cd013b26acf93e7f525b",
"title": "lets video attachments open the shared media gallery",
"mutation": {
"before": " const filename = attachmentFilename(attachment);\n return (\n <Card id={`attachment-${attachment.id}`} className=\"block scroll-mt-20 overflow-hidden py-0\">",
"after": " const filename = attachmentFilename(attachment);\n void fetch(attachment.contentPath);\n return (\n <Card id={`attachment-${attachment.id}`} className=\"block scroll-mt-20 overflow-hidden py-0\">",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(fetchSpy).not.toHaveBeenCalled()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "fa3a3edf2518552cf54db294e33be650bbf026a1b9505f8dfd4b7baba5de5d8d",
"logSha256": "1ba024b01f756729fdfbc1a7f9b535b8cd16a650bc1da99d8ea9d5a79521f796",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "b43dea15a78ffa00aa10d67a79932d6b8bba5a6a57d8dfb828d8693e277e019b",
"logSha256": "130e9a50e1cb3db653a4324ce9aa86b785d9275436606793f823073f6432ab0d",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to not be called at all, but actually been called 1 times\n\nReceived:\n\n 1st vi.fn() call:\n\n Array [\n \"/api/attachments/video-attachment/content\",\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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:2214:51)\n at Proxy.<anonymous> (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/IssueAttachmentsSection.test.tsx:208: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:2783:20"
]
}
}
],
"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
}
@@ -0,0 +1,34 @@
# Test audit, Round 7 UI — Video attachments follow-up
This isolated follow-up removes **1 registered executions, 1 root renders and 22 net test lines** from `ui/src/components/IssueAttachmentsSection.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 video attachments through the same player used for artifact outputs` | `lets video attachments open the shared media gallery` | 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(); |
IssueAttachmentsSection.tsx classifies the same webm attachment into VideoAttachmentCard, which passes contentPath to the actual shared OutputVideoPlayer; OutputVideoPlayer supplies native controls. Gallery forwarding stays in AttachmentActions. Both tests use the same makeAttachment overrides, fresh query client/root/fetchSpy hooks, delete callback presence and act/flush lifecycle. The retired inline fresh vi.fn for onImageClick matches the existing keeper fresh named vi.fn after binding normalization; the keeper binding remains unchanged. Move video source, controls and no-fetch checks before gallery click. MIME fallback, non-video/non-markdown, generic download and read-only tests remain distinct.
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 | 8 | 8 | 0 | 0 |
| Candidate | 7 | 7 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/IssueAttachmentsSection.test.tsx`.
All 3 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 |
|---|---|
| source | `expect(video?.getAttribute("src")).toBe(` |
| controls | `expect(video?.getAttribute("controls")).not.toBeNull()` |
| fetch | `expect(fetchSpy).not.toHaveBeenCalled()` |
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-attachments-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.
@@ -0,0 +1,401 @@
{
"audit": {
"file": "ui/src/components/SidebarCompanyMenu.test.tsx",
"base": "2e76f5157240ee8b2d42adbdcd4c345aea07c013",
"originalSha256": "ad89f1174a840f7e10a04c180dcdfcbb972e66e96fd45a335d4af90da553f693",
"candidateSha256": "3b14e39deb667f2b9f79981767b6f47852ed4a8f3ee51fe39c4bd9efbd61d5d2",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1,
"netTestLinesRemoved": 28,
"migrations": [
{
"retired": "uses company-centric create copy without the chat flag",
"keeper": "toggles company order editing without selecting a company",
"exactLeadingStatements": 7,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": true,
"kind": "menu",
"exactMigratedStatements": [
"expect(trigger?.classList).toContain(\"px-4\");",
"expect(trigger?.classList).toContain(\"has-[>svg]:px-4\");",
"expect(trigger?.classList).toContain(\"hover:bg-sidebar-accent\");",
"expect(trigger?.classList).toContain(\"hover:text-sidebar-accent-foreground\");",
"expect(trigger?.classList).toContain(\"dark:hover:bg-sidebar-accent\");",
"expect(trigger?.classList).toContain(\"dark:hover:text-sidebar-accent-foreground\");",
"expect(trigger?.classList).not.toContain(\"hover:bg-background\");",
"expect(trigger?.classList).not.toContain(\"dark:hover:bg-background\");",
"expect(trigger?.classList).not.toContain(\"dark:hover:bg-accent/50\");",
"expect(document.body.textContent).toContain(\"Create organization\");",
"expect(document.body.textContent).not.toContain(\"Add company...\");"
],
"alreadyExactKeeperStatementsOrBindings": [
"act(() => {\n trigger?.dispatchEvent(new PointerEvent(\"pointerdown\", { bubbles: true, button: 0 }));\n trigger?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n });",
"await flushReact();"
],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
}
]
},
"verifierSha256": "ff07f5e2e308cfc0f26584a6cd6599bcd98665e79d7f4782ed5bb36b35cb8cb9",
"mutationVerifierSha256": "676b973d4838ed130c5ae92d4bc50fb32a65309af8c858450ec34bcce13729e9",
"runs": [
{
"kind": "baseline",
"total": 16,
"passed": 16,
"failed": 0,
"skipped": 0,
"jsonSha256": "b7e2061f311e86d6750c2c9b0e6aee6bd6e026ee7acd10483c3d0cb8de863ac8",
"logSha256": "bce8c6310d9cbd08d01f813b90d9115241d8809314b74211530ef05f6c3cfd27"
},
{
"kind": "candidate",
"total": 15,
"passed": 15,
"failed": 0,
"skipped": 0,
"jsonSha256": "122222983e6eb17dfcc0745805ae2662a4ebf0781b4811cff488cfaa65f5dd79",
"logSha256": "46a93fb15df0d8faae9d94c9c261e1901ec12456bc0eb7610aa0c80cc4c1b58b"
}
],
"mutations": [
{
"slug": "trigger-inset",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": "gap-2 px-4 text-left",
"after": "gap-2 px-2 text-left",
"replacementCount": 1
},
"intendedGuard": "expect(trigger?.classList).toContain(\"px-4\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "965e51bf2e7303dc08ed66d5758ef80bfb18f8852e967fb12dd9c05776422dd6",
"logSha256": "3d45f3d012ad3ffbe563e1150356387730e5e6d2c169a25b537bb7add31124fb",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "f20cf3f9ecda2e5fe608bcd28d9bd68e030c6b72b3bc1bc4edce7e895cfe3ba6",
"logSha256": "80548eebd34f5ed3546ce6dc68d47a8e6452ecae6a06a36b6e4e3dc34598cdda",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium transition-(--tp-color-background-color-border-color-box-shadow-opacity) disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-(length:--rad-3) aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive py-2 h-9 min-w-0 flex-1 justify-start gap-2 px-2 text-left hover:bg-sidebar-accent hover:text-sidebar-accent-foreground has-[>svg]:px-4 dark:hover:bg-sidebar-accent dark:hover:text-sidebar-accent-foreground\" to contain \"px-4\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:429:32\n at runNextTicks (node:internal/process/task_queues:65:5)\n at listOnTimeout (node:internal/timers:567:9)\n at processTimers (node:internal/timers:541: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": "icon-inset",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": "has-[>svg]:px-4",
"after": "has-[>svg]:px-2",
"replacementCount": 1
},
"intendedGuard": "expect(trigger?.classList).toContain(\"has-[>svg]:px-4\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "ea88a40c8b8bf6350d02344b57ed5d99783dc5f153b7abb4b3a344c994b7a0f3",
"logSha256": "6edb24fc26547ae0367a8d95a2e35530798bb07ce5f71d9f41b86001c4ee6c64",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "fc33c2e6d3e034a617bf247b3795f136b4e5d200b3a4323101df92ce7cc1d7ab",
"logSha256": "77d5d26f406f4c778dcd6a6c476577151cefd36b3e0e9b896bd21bfc4d435886",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium transition-(--tp-color-background-color-border-color-box-shadow-opacity) disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-(length:--rad-3) aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive py-2 h-9 min-w-0 flex-1 justify-start gap-2 px-4 text-left hover:bg-sidebar-accent hover:text-sidebar-accent-foreground has-[>svg]:px-2 dark:hover:bg-sidebar-accent dark:hover:text-sidebar-accent-foreground\" to contain \"has-[>svg]:px-4\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:430:32\n at runNextTicks (node:internal/process/task_queues:65:5)\n at listOnTimeout (node:internal/timers:567:9)\n at processTimers (node:internal/timers:541: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": "hover-background",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": "text-left hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
"after": "text-left hover:bg-accent hover:text-sidebar-accent-foreground",
"replacementCount": 1
},
"intendedGuard": "expect(trigger?.classList).toContain(\"hover:bg-sidebar-accent\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "6927fb926814f3a97c2a4c93ff715eebb7b55c7b26cf78395352cd6cf72a1d94",
"logSha256": "3a867b13b6c1a885838cda58afc327eac62f0eba9a60def7ec1d5d9b0a58b07b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "cdfc31c2e7474765edcda5c384aedb266d4f7ba38a6593c6da5d08a3329c98f4",
"logSha256": "e5d367e9396f285f008d50cc7745f3cbb4e49757bc887a4ec7847bf56cb0826c",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium transition-(--tp-color-background-color-border-color-box-shadow-opacity) disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-(length:--rad-3) aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive py-2 h-9 min-w-0 flex-1 justify-start gap-2 px-4 text-left hover:bg-accent hover:text-sidebar-accent-foreground has-[>svg]:px-4 dark:hover:bg-sidebar-accent dark:hover:text-sidebar-accent-foreground\" to contain \"hover:bg-sidebar-accent\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:431:32\n at runNextTicks (node:internal/process/task_queues:65:5)\n at listOnTimeout (node:internal/timers:567:9)\n at processTimers (node:internal/timers:541: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": "hover-foreground",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground has-",
"after": "hover:bg-sidebar-accent hover:text-foreground has-",
"replacementCount": 1
},
"intendedGuard": "expect(trigger?.classList).toContain(\"hover:text-sidebar-accent-foreground\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "395cc772d310d912806b746111d7f557091468b89d37d178a6a8f941926d113b",
"logSha256": "63ca60c22b27299275ea041bb23a009690f69e53a01857e34a63d222c0f790a5",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "7cee44772f8452a6a3236cdee1fd3b702a5b345bda5b14786125a5e63f4a7532",
"logSha256": "260cb917636d6fa2a351a3dc1118c2c59fbca81f1d819e25ebc78468f6de5ca9",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium transition-(--tp-color-background-color-border-color-box-shadow-opacity) disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-(length:--rad-3) aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive py-2 h-9 min-w-0 flex-1 justify-start gap-2 px-4 text-left hover:bg-sidebar-accent hover:text-foreground has-[>svg]:px-4 dark:hover:bg-sidebar-accent dark:hover:text-sidebar-accent-foreground\" to contain \"hover:text-sidebar-accent-foreground\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:432:32\n at runNextTicks (node:internal/process/task_queues:65:5)\n at listOnTimeout (node:internal/timers:567:9)\n at processTimers (node:internal/timers:541: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": "dark-background",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": " dark:hover:bg-sidebar-accent ",
"after": " dark:hover:bg-accent ",
"replacementCount": 1
},
"intendedGuard": "expect(trigger?.classList).toContain(\"dark:hover:bg-sidebar-accent\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "e1c8a5b52bbd8abdeeebdc2257fff6c94ee10d92fd5933af3eb2ad9e73187086",
"logSha256": "a11984915dd20c240e728db80d958100d62effb1d398de52e4b19116fc4df06a",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "6ef6c5847ced0672654141ddf703fe5da59b8e5698679983659f76b271836c34",
"logSha256": "2289f05b931304d15b3e256a6b7c12d1d5b2377e938ca3d0bd2be14d6fa5ff93",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium transition-(--tp-color-background-color-border-color-box-shadow-opacity) disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-(length:--rad-3) aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive py-2 h-9 min-w-0 flex-1 justify-start gap-2 px-4 text-left hover:bg-sidebar-accent hover:text-sidebar-accent-foreground has-[>svg]:px-4 dark:hover:bg-accent dark:hover:text-sidebar-accent-foreground\" to contain \"dark:hover:bg-sidebar-accent\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:433:32\n at runNextTicks (node:internal/process/task_queues:65:5)\n at listOnTimeout (node:internal/timers:567:9)\n at processTimers (node:internal/timers:541: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": "dark-foreground",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": "dark:hover:text-sidebar-accent-foreground\"",
"after": "dark:hover:text-foreground\"",
"replacementCount": 1
},
"intendedGuard": "expect(trigger?.classList).toContain(\"dark:hover:text-sidebar-accent-foreground\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "b8dec44374759a2d23864d8773b523144f17251cc417c6ba3a5a01ad84c74d54",
"logSha256": "38199b184a9191ec1f9690b5ee93a55372041e1bda5cccc283dd1606e5ff8c22",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "11c7a74f5e2910ad7245ce8dc6d0659d1c611c534fb0549b36f2a3e35fb3f5e3",
"logSha256": "d5fa2d5d892bc50fda4e5129d56424e33cc6ad64038c8b00ccc9a2071e24024b",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium transition-(--tp-color-background-color-border-color-box-shadow-opacity) disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-(length:--rad-3) aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive py-2 h-9 min-w-0 flex-1 justify-start gap-2 px-4 text-left hover:bg-sidebar-accent hover:text-sidebar-accent-foreground has-[>svg]:px-4 dark:hover:bg-sidebar-accent dark:hover:text-foreground\" to contain \"dark:hover:text-sidebar-accent-foreground\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:434:32\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": "create-copy",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": ">Create organization</span>",
"after": ">New organization</span>",
"replacementCount": 1
},
"intendedGuard": "expect(document.body.textContent).toContain(\"Create organization\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "094026d954d8a04e6c3f4a843905605b64087a7f1ffa32c0df6838da7b40abed",
"logSha256": "dddb890d92209e044b1140d2438e28a02b814b8681fb96ab0e77e60c7026cf12",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "c4cb06631eace0851f3d31084c403ddb990f22f55f03096031361e195aba6211",
"logSha256": "a7ecc001952a578b96aefa0a2c6f6ae7c87a01c8c64fb02102a50dad8c2f067a",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'AAcme LabsOrganizationsEditAAcme Labs\u2026' to contain 'Create organization'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:445:39\n at runNextTicks (node:internal/process/task_queues:65:5)\n at processTimers (node:internal/timers:538:9)\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": "legacy-create-copy",
"owner": "ui/src/components/SidebarCompanyMenu.tsx",
"sourceSha256": "2ea2c865a3e9817c140d3bf269a0c4f45d85a957f11b64d1a84e88926fe1b97a",
"title": "toggles company order editing without selecting a company",
"mutation": {
"before": ">Create organization</span>",
"after": ">Create organization Add company...</span>",
"replacementCount": 1
},
"intendedGuard": "expect(document.body.textContent).not.toContain(\"Add company...\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "4b450bb9ee4240877a53fa40ba1279d27a2c5d2eefbbd1ec6d66739b5a142c9f",
"logSha256": "53756ff97bc7913aab6c0a3bc303fd7151fb7cde78616841a3f9a07ef9e84d7b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "93eb614e6f297f934fb4491e2b55a5d4a2f3216774b8d981a20d2b4a27b01a47",
"logSha256": "220100c51d3b4e1ad9a020c6bb94af8f60b159cd1a5ef32cfcd67e04a5c77dfa",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'AAcme LabsOrganizationsEditAAcme Labs\u2026' not to contain 'Add company...'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/SidebarCompanyMenu.test.tsx:446:43\n at runNextTicks (node:internal/process/task_queues:65:5)\n at processTimers (node:internal/timers:538:9)\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-agentconfig-controls.json",
"sha256": "cfb4357610beaa464cdb26848f74a7b8d967d6409c63dbd6821c92886a9cf980"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md",
"sha256": "ea6d5dfc8cedcd653edd55ca9d77568431413a351f4de5db77ca6ac8f22b051a"
},
{
"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-experimental-controls.json",
"sha256": "9c72abee7ee1a937fdbd6ccee870320308bc7ce06b4fc1e338cd9bd3b0efba6b"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-experimental.md",
"sha256": "93b7583a8ebba39dc97e390918fd62029955a00beda22756f55bd6374acc3737"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json",
"sha256": "af9d3f115e6e0518c2c0a2e11b8913e7aa82a35c848f114e6750884323601e17"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline.md",
"sha256": "52d8e27970bd1c091ae7edf403b2331e921081da9198270df65ff779a8efc1bc"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json",
"sha256": "45d86fa901c8ab40bc3fe98d266e3ba1a7bbc93edb7bc2aae60ccd9bfa130c37"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md",
"sha256": "15e84a553c5a468aea013941f68d3aa517bfb5a13ae296a90e1a39586f85de8e"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json",
"sha256": "a56f183f1c6b940662db0c4bfb62457eda0cec453c2019b439ec716ed9d2a3e1"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md",
"sha256": "e137af5b991c936a167d6ad6f3c710b99688e939f839b163b203259fc998ded8"
},
{
"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
}
@@ -0,0 +1,41 @@
# Test audit, Round 7 UI — Company menu opening follow-up
This separate packet removes **1 registered executions, 1 rendered scenarios and 28 net test lines** from `ui/src/components/SidebarCompanyMenu.test.tsx`. It adds no helper and changes no production lines. Audit base: `2e76f5157240ee8b2d42adbdcd4c345aea07c013`. All prior committed proof remains byte-identical. Registration/render savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. A service-worker retirement counts only initializer setup, never a render.
## Exact retirement map
| Retired registration | Keeper | Exact observations migrated |
|---|---|---|
| `uses company-centric create copy without the chat flag` | `toggles company order editing without selecting a company` | expect(trigger?.classList).toContain("px-4");; expect(trigger?.classList).toContain("has-[>svg]:px-4");; expect(trigger?.classList).toContain("hover:bg-sidebar-accent");; expect(trigger?.classList).toContain("hover:text-sidebar-accent-foreground");; expect(trigger?.classList).toContain("dark:hover:bg-sidebar-accent");; expect(trigger?.classList).toContain("dark:hover:text-sidebar-accent-foreground");; expect(trigger?.classList).not.toContain("hover:bg-background");; expect(trigger?.classList).not.toContain("dark:hover:bg-background");; expect(trigger?.classList).not.toContain("dark:hover:bg-accent/50");; expect(document.body.textContent).toContain("Create organization");; expect(document.body.textContent).not.toContain("Add company..."); |
The original fresh QueryClient/provider/root setup, two flushes, trigger query and presence assertion match exactly. Both pointerdown/click opening statements and following flush also match. All nine original trigger-class checks move before opening; both Create organization/Add company copy checks move after opening and before Edit. The keeper retains order editing, reorder-button/row guards and no selection/navigation assertions. Existing health-enabled actions, sign-out, loading/error, selection and other menu cases stay distinct. The six exact trigger-class mutations cover the inset and light/dark hover styling behaviors; the three negative legacy-color guards also remain in the keeper. Adding a conflicting class was rejected as mutation evidence because tailwind-merge removed the required positive token before the negative guard. No token or production style change is included.
The verifier requires matching setup statements, enclosing hooks and explicit teardown where present. It reconstructs candidate source solely from the declared registrations/assertion migrations and requires exact byte equality plus full-program AST equality outside those edits. Existing shared variable bindings, mock arguments and provider/component inputs remain the same. No other fixture, helper, action order, wait, assertion strength, timer or cleanup changes. Default CI includes the file in `@paperclipai/ui` under `general-workspaces-a`, once across its two file shards, with no workflow/config change.
## Complete owner-file results
| Run | Registered | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 16 | 16 | 0 | 0 |
| Candidate | 15 | 15 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/SidebarCompanyMenu.test.tsx`.
All 8 separately selected positive controls passed. All 8 distinct production-owner regressions failed at intended retained/migrated assertions, not setup, timeout or another guard:
| Regression | Intended guard |
|---|---|
| trigger-inset | `expect(trigger?.classList).toContain("px-4")` |
| icon-inset | `expect(trigger?.classList).toContain("has-[>svg]:px-4")` |
| hover-background | `expect(trigger?.classList).toContain("hover:bg-sidebar-accent")` |
| hover-foreground | `expect(trigger?.classList).toContain("hover:text-sidebar-accent-foreground")` |
| dark-background | `expect(trigger?.classList).toContain("dark:hover:bg-sidebar-accent")` |
| dark-foreground | `expect(trigger?.classList).toContain("dark:hover:text-sidebar-accent-foreground")` |
| create-copy | `expect(document.body.textContent).toContain("Create organization")` |
| legacy-create-copy | `expect(document.body.textContent).not.toContain("Add company...")` |
Exactly one production owner changed per control, and every owner was restored byte for byte after each mutation and checked against pinned Git bytes. Literal keeper-name filters are escaped; unselected cases are not full-suite evidence. The initial first-install receipt verifier mistook emit( for it( and rejected its receipt despite the intended test failure. The declaration-boundary matcher was corrected and that control rerun; the rejected verifier attempt supplies no accepted evidence.
[Controls JSON](2026-10-12-test-audit-r7-ui-company-menu-controls.json) preserves source/owner hashes, exact before/after migrations, matched setup and variable-binding proof, complete-file run/log digests, intended assertion failures and restoration checks. Temporary raw scripts/logs are identified by digests rather than committed in full.
The earlier broad local `pnpm test:run` was intentionally stopped before completion and is not claimed as passed. These separate focused packets precede delivery-head replay and full CI. This packet includes no push, rebase, PR or merge.
@@ -0,0 +1,692 @@
{
"base": "e868e6645ce0d598d756d3458f0b3d71afd6db4a",
"scope": [
"ui/src/pages/InviteLanding.test.tsx",
"ui/src/pages/Agents.test.tsx",
"ui/src/components/Layout.test.tsx"
],
"testLinesRemoved": 364,
"productionLinesChanged": 0,
"registeredInvocationsRemoved": 1,
"sourceHelperCallsExpanded": 60,
"speedClaim": null,
"expansionNormalization": [
"AST locations",
"comments",
"raw literal formatting",
"whitespace-only JSX text"
],
"expansionVerifierSha256": "c97239d6b978cc11bb2f8ed11e0521ac107c37c6af5183dbd934d58b94418b3c",
"expansions": [
{
"file": "ui/src/pages/InviteLanding.test.tsx",
"originalSha": "2283067e52a3409f4c1a21e017e273649989559e7013a0d1442ebea268989bdd",
"candidateSha": "84ab29d3d382710df5d39d8e6d84fb2cf916d10e2470e6432d54ac2875a55153",
"expansions": 18,
"wholeProgramAstEqualOutsideMigration": true,
"migration": null,
"helperSync": true,
"parameterBindingArguments": [
"root",
"queryClient"
],
"freshJsxPerCall": true,
"expandedAstSha": "a95408adf3b302b35d13a5a40d1b0cddacff4232bff02629a275f63698b3f489"
},
{
"file": "ui/src/pages/Agents.test.tsx",
"originalSha": "f7a84d1d31119880d6b11dc956d3121930ba4e92a2df7832d32676fc48cb2313",
"candidateSha": "e2ab9c0de428585bee37b40df1ee6c4a3c823882582d006abadbfedbdd3e50ff",
"expansions": 16,
"wholeProgramAstEqualOutsideMigration": true,
"migration": {
"retired": "uses the built-in agents route segment as the built-in filter",
"keeper": "shows and filters built-in agents when the experimental flag is enabled",
"copiedExactRetiredSetup": true,
"migratedCountGuard": "1 agent",
"originalKeeperOtherAssertionsUnchanged": true
},
"helperSync": true,
"parameterBindingArguments": [
"root",
"queryClient"
],
"freshJsxPerCall": true,
"expandedAstSha": "2b0ff05182aa4cee5f94040fcff0321cb4ba7bce0e6a4d08bbaccf65e38873bb"
},
{
"file": "ui/src/components/Layout.test.tsx",
"originalSha": "d522929332ccbd413d56d5c9b7d7cd820344b58d6baa17b70002ecd387039093",
"candidateSha": "89b6c599f2cecd570831e1a5d3d673bc1188052ca8eeedb6013892d25491f791",
"expansions": 26,
"wholeProgramAstEqualOutsideMigration": true,
"migration": null,
"helperSync": true,
"parameterBindingArguments": [
"root",
"queryClient"
],
"freshJsxPerCall": true,
"expandedAstSha": "150995d2bb95bb3c7afa57ce23f38b664f518c2fe7ed1ca039475f24fb6f6f9f"
}
],
"runs": [
{
"label": "owners baseline",
"jsonSha256": "8995c66ecc3951722950526f9c3d1b6de551b8ac6cc153576d1315c43e0c7a5c",
"cases": 71,
"passed": 71,
"failed": 0,
"skipped": 0,
"files": [
{
"path": "ui/src/pages/Agents.test.tsx",
"status": "passed",
"cases": 21
},
{
"path": "ui/src/pages/InviteLanding.test.tsx",
"status": "passed",
"cases": 18
},
{
"path": "ui/src/components/Layout.test.tsx",
"status": "passed",
"cases": 32
}
]
},
{
"label": "siblings baseline",
"jsonSha256": "e4326b65ac0c85207df2c0a055a5ca7c34138fead744cf9ebd7c9ea060f27291",
"cases": 79,
"passed": 79,
"failed": 0,
"skipped": 0,
"files": [
{
"path": "ui/src/hooks/useCompanyInviteAccess.test.ts",
"status": "passed",
"cases": 10
},
{
"path": "ui/src/lib/company-selection.test.ts",
"status": "passed",
"cases": 11
},
{
"path": "ui/src/lib/shell-navigation.test.ts",
"status": "passed",
"cases": 6
},
{
"path": "ui/src/components/ActiveAgentsPanel.test.tsx",
"status": "passed",
"cases": 8
},
{
"path": "ui/src/components/PluginAppShellOverlays.test.tsx",
"status": "passed",
"cases": 6
},
{
"path": "ui/src/components/SidebarAgents.test.tsx",
"status": "passed",
"cases": 26
},
{
"path": "ui/src/components/SidebarShell.test.tsx",
"status": "passed",
"cases": 9
},
{
"path": "ui/src/components/access/InvitesSection.test.tsx",
"status": "passed",
"cases": 3
}
]
},
{
"label": "owners candidate",
"jsonSha256": "3bf91a48289f6db06c9ca0fdaf552866c39cebc20dec89602fb2ad8faaceb498",
"cases": 70,
"passed": 70,
"failed": 0,
"skipped": 0,
"files": [
{
"path": "ui/src/pages/Agents.test.tsx",
"status": "passed",
"cases": 20
},
{
"path": "ui/src/pages/InviteLanding.test.tsx",
"status": "passed",
"cases": 18
},
{
"path": "ui/src/components/Layout.test.tsx",
"status": "passed",
"cases": 32
}
]
},
{
"label": "all complete candidate",
"jsonSha256": "d17ff01fc3d46e1679832f3d589a4907cbed8be3f5012ae7e7079a93bfb5a118",
"cases": 149,
"passed": 149,
"failed": 0,
"skipped": 0,
"files": [
{
"path": "ui/src/hooks/useCompanyInviteAccess.test.ts",
"status": "passed",
"cases": 10
},
{
"path": "ui/src/pages/Agents.test.tsx",
"status": "passed",
"cases": 20
},
{
"path": "ui/src/pages/InviteLanding.test.tsx",
"status": "passed",
"cases": 18
},
{
"path": "ui/src/components/ActiveAgentsPanel.test.tsx",
"status": "passed",
"cases": 8
},
{
"path": "ui/src/components/Layout.test.tsx",
"status": "passed",
"cases": 32
},
{
"path": "ui/src/components/PluginAppShellOverlays.test.tsx",
"status": "passed",
"cases": 6
},
{
"path": "ui/src/components/SidebarAgents.test.tsx",
"status": "passed",
"cases": 26
},
{
"path": "ui/src/components/SidebarShell.test.tsx",
"status": "passed",
"cases": 9
},
{
"path": "ui/src/lib/company-selection.test.ts",
"status": "passed",
"cases": 11
},
{
"path": "ui/src/lib/shell-navigation.test.ts",
"status": "passed",
"cases": 6
},
{
"path": "ui/src/components/access/InvitesSection.test.tsx",
"status": "passed",
"cases": 3
}
]
}
],
"mutations": [
{
"slug": "builtin-filter",
"owner": "ui/src/pages/Agents.tsx",
"title": "shows and filters built-in agents when the experimental flag is enabled",
"sourceSha": "a734799d3b015ddc04424754ff30eb2eb872db66e8847c4603132093fbb5e9b2",
"replacements": 1,
"mutation": {
"before": "if (tab === \"builtin\") return builtInAgentIds.has(a.id);",
"after": "if (tab === \"builtin\") return true;"
},
"restoredByteForByte": true,
"positive": {
"exit": 0,
"status": "passed",
"jsonSha256": "9189086e19c4ca525e7c8692bfc3778bdb273647ee2eae0d1c9258c3904f68e6",
"logSha256": "91eb9ad0112c20347e1229c9d40002be1a6fc7f3c6c2b15ff82ba9fb8a84621c"
},
"negative": {
"exit": 1,
"status": "failed",
"jsonSha256": "c3710d64d3205aff35c8645d4c5675c49d2d1e28ac6f6bd3c2cfb49231386842",
"logSha256": "3c0ec61eae54edafcce43bfed5d791aa0d65ff8e6c99969a3e378e537942c8bf",
"intendedFailure": "AssertionError: expected 'AllActivePausedErrorBuilt-inNew Agent\u2026' to contain '1 agent'"
}
},
{
"slug": "invite-aria-invalid",
"owner": "ui/src/pages/InviteLanding.tsx",
"title": "renders invite auth errors in an alert region referenced by the inputs",
"sourceSha": "626dc7c372a74ff436f1f96f675ecf55bd0b2ae60107ec61bc88cec8c6fefe18",
"replacements": 3,
"mutation": {
"before": "aria-invalid={authFeedback?.tone === \"error\" ? true : undefined}",
"after": "aria-invalid={undefined}"
},
"restoredByteForByte": true,
"positive": {
"exit": 0,
"status": "passed",
"jsonSha256": "f5401b7b6c33dea587d00dedb8fe64c3baaa04f45fcb54ebd3225b0339de4291",
"logSha256": "802bc10c23fbeb70cae9effbef913145a90a28dd893550be3c6941ffbd1d4396"
},
"negative": {
"exit": 1,
"status": "failed",
"jsonSha256": "58d01e3723ff05867f87f82e2fa857d4d1d3d5f81dd50d04603d7da3b148c060",
"logSha256": "c90dcb374262c2caf2ca5a27069a2cbe5a2a1b4615df05d82a4e82e129e58080",
"intendedFailure": "AssertionError: expected null to be 'true' // Object.is equality"
}
},
{
"slug": "settings-sidebar",
"owner": "ui/src/components/Layout.tsx",
"title": "replaces the app sidebar with settings navigation on Streamlined settings routes",
"sourceSha": "4c236e0330ed4946572af9528f27d24c305bc3e73473814e921017199d4afa8a",
"replacements": 1,
"mutation": {
"before": "const sharedSecondarySidebar = isCompanySettingsRoute ? (",
"after": "const sharedSecondarySidebar = false ? ("
},
"restoredByteForByte": true,
"positive": {
"exit": 0,
"status": "passed",
"jsonSha256": "c4cba1779379171ad2d0fc234e699944118ab453f3f87c4547d92e688d3f64ef",
"logSha256": "5e6de08a8cda51850e9e237a76d993ceff3e32677ef38faaf2bffd0d40c6cf10"
},
"negative": {
"exit": 1,
"status": "failed",
"jsonSha256": "a0cdaa7f1233d4f88d6abd92f61984343f41b27e2723b8ce28b16a8c97624366",
"logSha256": "83b0ab380a65c7f9ec69f8ec36132dbafb6ef9cc2c4df220b20415144244eab3",
"intendedFailure": "AssertionError: expected 'Skip to Main ContentPaperclipCompany \u2026' to contain 'Company settings sidebar'"
}
}
],
"caseLedger": [
{
"file": "ui/src/pages/Agents.test.tsx",
"cases": [
{
"title": "omits the action bar from streamlined agent list rows",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "omits the action bar from production agent list rows",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "shows the configured model beside the adapter on the all agents page",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "switches between the preserved list and the interactive org chart with icon buttons",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "gives mobile agent names the full row width after the leading status indicator",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "uses the built-in agents route segment as the built-in filter",
"decision": "C",
"evidence": "Exact keeper retains fixture/count plus all stronger assertions"
},
{
"title": "shows effective environment and sandbox provider beside agents",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "uses configured names for local-driver environments",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "reserves the environment column while environment metadata is loading",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "hides the environment column when there is only one configured environment",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "hides the environment column when environments are experimentally disabled",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "uses the instance default environment unless the agent overrides it",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "falls back to the raw sandbox provider config when capabilities omit a display name",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "does not show environment filter or grouping controls yet",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "hides built-in agent surfaces while the experimental flag is disabled",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "shows and filters built-in agents when the experimental flag is enabled",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "gives list-view rows a fixed-width title so meta columns align (PAP-86)",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "omits star and leave/join actions from streamlined agent index list and org views",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "omits star and leave/join actions from production agent index list and org views",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "does not dim left-membership agent names on mobile",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps invalid-org-chain agents visible with a warning marker",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
}
]
},
{
"file": "ui/src/pages/InviteLanding.test.tsx",
"cases": [
{
"title": "keeps agent-invite onboarding on legacy adapters",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "defaults invite auth to account creation and guides existing users back to sign in",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "carries password-manager metadata and a11y attributes on the invite auth form",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "renders invite auth errors in an alert region referenced by the inputs",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "turns invalid sign-in responses into a clear invite-specific message",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "auto-accepts the invite after account creation and redirects into the company",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "shows the pending approval page with the company icon and non-clickable access instructions",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "auto-completes a previously accepted human invite after sign-in",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "asks unauthenticated users to sign in before completing an accepted human invite",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "redirects straight to the company after sign-in when the user already has access",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "re-reads membership for the account that just signed in",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "re-reads membership on mount for an already signed-in account",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the pending invite token when the session has lapsed",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "still reads the shared list as membership on a local_trusted instance",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "shows invite details instead of auto-redirecting for signed-in existing members",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "falls back to the generated company icon when the invite logo fails to load",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "normalizes the shared company cache envelope before checking membership",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "waits for the membership check before showing invite acceptance to signed-in users",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
}
]
},
{
"file": "ui/src/components/Layout.test.tsx",
"cases": [
{
"title": "does not render the deployment explainer in the shared layout",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "scopes the Streamlined task-detail surface while preserving balanced horizontal gutters",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "collapses atomically when the pointer is still over the sidebar (no re-peek) \u2014 PAP-10676",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "opens the peek when hovering a collapsed rail (positive control for the hover sim)",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "replaces the app sidebar with settings navigation on Streamlined settings routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the global sidebar beside legacy settings navigation when Streamlined UI is off",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "renders a mobile company settings selector on company settings routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "replaces the company nav on instance settings routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "replaces the company nav with the shared settings sidebar on /PAP/company/export",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "replaces the company nav with the shared settings sidebar on /PAP/company/import",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the company nav beside Apps navigation on legacy tools routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "mounts the Apps secondary sidebar regardless of the retired experimental flag",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the M8 advanced-setup tabs",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on legacy developer tabs behind the Advanced door",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the browse surface",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the connections surface",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the vercel-connect surface",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the review surface",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the chat surface",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the Apps sidebar on the gateways list and detail routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "uses the app connection sidebar on app detail routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "uses the app detail sidebar on not-connected app routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps global navigation beside Skills, Agent, and Routine details",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps global navigation with agent configuration navigation in the legacy shell",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the global rail beside Skills navigation in the legacy shell",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps Agent and Routine collection routes in global navigation",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "renders a route-scoped plugin sidebar for a matching plugin page route",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the route-scoped plugin sidebar on nested plugin page routes",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "uses the route company context for plugin route sidebars on the first render",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "keeps the normal company sidebar when a plugin page route is ambiguous",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "clips horizontal overflow on the mobile layout root so the viewport can't scroll sideways",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
},
{
"title": "clips overflow on the desktop layout root",
"decision": "R",
"evidence": "Whole-program expansion retains original assertions and action order outside the one recorded keeper migration"
}
]
}
],
"rawEvidenceAvailability": "Raw verifiers and run logs are temporary local audit packets; the committed report/JSON retain accepted decisions and digests, not complete raw payloads.",
"helperCleanupNetLinesRemoved": 320,
"duplicateRetirementNetLinesRemoved": 44
}
@@ -0,0 +1,306 @@
{
"audit": {
"file": "ui/src/pages/InstanceExperimentalSettings.test.tsx",
"base": "e3effbb9e5c66b838f67fd487987c8bf1007e413",
"originalSha256": "52dac85dd5b2ac621da8b25a73a343a15068fde818e64d59d5cf22ab9eee1dd0",
"candidateSha256": "4a1047181ad420553d9c9470f59f5df4287d9e37b06fc11cb4658625a758df65",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 2,
"rootRendersRemoved": 2,
"netTestLinesRemoved": 10,
"migrations": [
{
"retired": "does not render the Pipelines experimental setting for now",
"keeper": "does not render the Conference Room Chat experimental setting for now",
"exactSetupStatements": 2,
"sameEnclosingHooks": true,
"exactCleanupStatements": 0,
"migratedGuards": [
"expect(headings).not.toContain(\"Pipelines\");",
"expect(container.querySelector('button[aria-label=\"Toggle pipelines experimental setting\"]')).toBeNull();"
],
"exactDuplicateGuardAlreadyKept": [],
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1
},
{
"retired": "shows the cutoff-copy for the worktree run-execution toggle when off",
"keeper": "renders and patches the worktree run-execution toggle when in a worktree",
"exactSetupStatements": 2,
"sameEnclosingHooks": true,
"exactCleanupStatements": 0,
"migratedGuards": [
"expect(container.textContent).toContain(\n \"Only tasks created after enabling will run automatically\",\n );",
"expect(container.textContent).toContain(\"Toggling off and on resets the cutoff.\");",
"expect(container.textContent).not.toContain(\"Running tasks created after\");",
"expect(container.textContent).not.toContain(\"Execution is suppressed\");"
],
"exactDuplicateGuardAlreadyKept": [],
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1
}
]
},
"verifierSha256": "084bdbc359e510397ef64daeb24e259efbc62c8b5d2c56d3e09d7f2534f155aa",
"mutationVerifierSha256": "ca8463047109d38a447d93fb94a19bb8efe9b1df440e0abf91ab31a8c0a358a2",
"runs": [
{
"kind": "baseline",
"total": 55,
"passed": 55,
"failed": 0,
"skipped": 0,
"jsonSha256": "77f407f50f91bcdacb518c7b87b6dc5b47b9161a9bc49bfab32a6ee228351d38",
"logSha256": "a92310f5aab6de68b137ab9f6d8348fc0fe8640e37740ec0bfb493b3017edeb6"
},
{
"kind": "candidate",
"total": 53,
"passed": 53,
"failed": 0,
"skipped": 0,
"jsonSha256": "09e8de86d6b8fcbe9fb5fb4c74ea6a5fb57c1135763c5b6054232409435a6bc3",
"logSha256": "099ac5b8f1f678b23518f93833cf2924c4dd2833700f7f6a009f1065fb573bf3"
}
],
"mutations": [
{
"slug": "pipelines-heading",
"owner": "ui/src/pages/InstanceExperimentalSettings.tsx",
"sourceSha256": "946dd94d28db014fe2dbfc0bb8d4c5a4b96c3face7fca7a067789119abe76570",
"title": "does not render the Conference Room Chat experimental setting for now",
"mutation": {
"before": " {SHOW_CONFERENCE_ROOM_EXPERIMENTAL_SETTING ? (",
"after": " <section><h2>Pipelines</h2></section>\n {SHOW_CONFERENCE_ROOM_EXPERIMENTAL_SETTING ? (",
"replacementCount": 1
},
"intendedGuard": "expect(headings).not.toContain(\"Pipelines\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "7250f54890e55f4ad28063a359430027e325435ba39877b46b0d1a052196b8e5",
"logSha256": "f9a5178102546567b9cd25aed172c9f25496cfb250af226edb0721e5293792ef",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "a1bfbd98a6faf2364a061415d99e76799b6d23ed8627c5e5e27de64901e6b108",
"logSha256": "d498153df7fd34e0fe41d1c8996cc867553b949b266fe6e83bd1c72b76a0a6a2",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected [ 'Experimental features', \u2026(3) ] to not include 'Pipelines'\n at Proxy.<anonymous> (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.<anonymous> (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/pages/InstanceExperimentalSettings.test.tsx:319: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:2783:20"
]
}
},
{
"slug": "pipelines-toggle",
"owner": "ui/src/pages/InstanceExperimentalSettings.tsx",
"sourceSha256": "946dd94d28db014fe2dbfc0bb8d4c5a4b96c3face7fca7a067789119abe76570",
"title": "does not render the Conference Room Chat experimental setting for now",
"mutation": {
"before": " {SHOW_CONFERENCE_ROOM_EXPERIMENTAL_SETTING ? (",
"after": " <button aria-label=\"Toggle pipelines experimental setting\" />\n {SHOW_CONFERENCE_ROOM_EXPERIMENTAL_SETTING ? (",
"replacementCount": 1
},
"intendedGuard": "expect(container.querySelector('button[aria-label=\"Toggle pipelines experimental setting\"]')).toBeNull()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "a33d4d20281ca29d7e8ed3e27d4e7d5426053a5d0e2d95e1805dc33a0ae488fb",
"logSha256": "26e0d1406c59c0ea2ef2c24b94df8a26c3a64ee31ba8a625e8a1079389687b26",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "7fc3b1c7422ea1f814176df613b12f3250ad66816b25ce78b0c7a6dc034c45b9",
"logSha256": "09c205c0b6bb1b99738b5d9ae609402c623d2e9880502dc6ea07ee406a020c8b",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected <button \u2026(1)></button> to be null\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/InstanceExperimentalSettings.test.tsx:320:99\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": "cutoff-copy",
"owner": "ui/src/pages/InstanceExperimentalSettings.tsx",
"sourceSha256": "946dd94d28db014fe2dbfc0bb8d4c5a4b96c3face7fca7a067789119abe76570",
"title": "renders and patches the worktree run-execution toggle when in a worktree",
"mutation": {
"before": "Only tasks created after enabling will run automatically",
"after": "The cutoff copy is missing",
"replacementCount": 1
},
"intendedGuard": "expect(container.textContent).toContain(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "92c1be77e6c65655e99e26189954c5143e8c248be26f32d1b76257b97db781e4",
"logSha256": "dd36eab0fb20ae3a948e91625ef5e8c29c7a0451623d6b50f91c89881f43b16a",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "ebdd5d754e22071cbc50f1246b16b38fc14349885f0f77da2f257e208b780211",
"logSha256": "145903c50a5cb4eb8185d3c160f986a470c068259c54c74d7c05961df6cb828d",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'ExperimentalOpt into features that ar\u2026' to contain 'Only tasks created after enabling wil\u2026'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/InstanceExperimentalSettings.test.tsx:593: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:20"
]
}
},
{
"slug": "reset-copy",
"owner": "ui/src/pages/InstanceExperimentalSettings.tsx",
"sourceSha256": "946dd94d28db014fe2dbfc0bb8d4c5a4b96c3face7fca7a067789119abe76570",
"title": "renders and patches the worktree run-execution toggle when in a worktree",
"mutation": {
"before": "Toggling off and on resets the cutoff.",
"after": "The reset copy is missing",
"replacementCount": 1
},
"intendedGuard": "expect(container.textContent).toContain(\"Toggling off and on resets the cutoff.\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "08e815451edaa0b5a916e5027dfb0cb72a723dfde98e234873404a4f9cd4ccce",
"logSha256": "ba51c2a1cda7f0cc33a686e28fc9fc405737107133c3beea98fcf1c3696bd5c4",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "21d1d20cb6fd05663c4decd09baeb5533d2147017a7bbb14eee0657f295953b0",
"logSha256": "c0efad555c6819cd6e7c91692ac64521de7f1045be075ca3330cc6dd1c43df84",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'ExperimentalOpt into features that ar\u2026' to contain 'Toggling off and on resets the cutoff.'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/InstanceExperimentalSettings.test.tsx:596: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:20"
]
}
},
{
"slug": "armed-banner",
"owner": "ui/src/pages/InstanceExperimentalSettings.tsx",
"sourceSha256": "946dd94d28db014fe2dbfc0bb8d4c5a4b96c3face7fca7a067789119abe76570",
"title": "renders and patches the worktree run-execution toggle when in a worktree",
"mutation": {
"before": " {worktreeRunExecutionState.kind === \"armed\" ? (",
"after": " <span>Running tasks created after</span>\n {worktreeRunExecutionState.kind === \"armed\" ? (",
"replacementCount": 1
},
"intendedGuard": "expect(container.textContent).not.toContain(\"Running tasks created after\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "c9a437b67ada80258549e3e55e2839eb9247dca4e28eb31de8d5f5cea62aeae9",
"logSha256": "4b4b08da42e012356f839eee58b1c22d7b897d5055171e9167dfc54e29d314b7",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "53682bf5e687c68851723b3729a8f0979c0e68800186b70cf5d9c4a2e1cc8f04",
"logSha256": "7accc209bfd5438d9772a1d2f3d121b976f0579af35853d8367c527c80ada5af",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'ExperimentalOpt into features that ar\u2026' not to contain 'Running tasks created after'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/InstanceExperimentalSettings.test.tsx:598:39\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": "fail-closed",
"owner": "ui/src/pages/InstanceExperimentalSettings.tsx",
"sourceSha256": "946dd94d28db014fe2dbfc0bb8d4c5a4b96c3face7fca7a067789119abe76570",
"title": "renders and patches the worktree run-execution toggle when in a worktree",
"mutation": {
"before": " {worktreeRunExecutionState.kind === \"fail_closed\" ? (",
"after": " <span>Execution is suppressed</span>\n {worktreeRunExecutionState.kind === \"fail_closed\" ? (",
"replacementCount": 1
},
"intendedGuard": "expect(container.textContent).not.toContain(\"Execution is suppressed\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "0dccde3c027394a05076bc86035b085a2f420f102f65c234e6f536aaaf452e5e",
"logSha256": "9db8b2995432fdd99a941e894df0148b4fe83d12a20a86d87acc594b874c8005",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "fbc4edb913cba46818b5d9dd073a1b02d804e07f8a50e49bd180e5ab6c86b609",
"logSha256": "4f2dc5d037bea144ce679f1800079de085b153040ea553bae985bdc765e670fa",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'ExperimentalOpt into features that ar\u2026' not to contain 'Execution is suppressed'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/InstanceExperimentalSettings.test.tsx:599:39\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
}
@@ -0,0 +1,38 @@
# Test audit, Round 7 UI — Experimental settings follow-up
This separate packet removes **2 registered executions, 2 root renders and 10 net test lines** from `ui/src/pages/InstanceExperimentalSettings.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 |
|---|---|---|
| `does not render the Pipelines experimental setting for now` | `does not render the Conference Room Chat experimental setting for now` | expect(headings).not.toContain("Pipelines");; expect(container.querySelector('button[aria-label="Toggle pipelines experimental setting"]')).toBeNull(); |
| `shows the cutoff-copy for the worktree run-execution toggle when off` | `renders and patches the worktree run-execution toggle when in a worktree` | expect(container.textContent).toContain( "Only tasks created after enabling will run automatically", );; expect(container.textContent).toContain("Toggling off and on resets the cutoff.");; expect(container.textContent).not.toContain("Running tasks created after");; expect(container.textContent).not.toContain("Execution is suppressed"); |
InstanceExperimentalSettings.tsx keeps the retired Pipelines/Conference Room settings absent and owns the worktree-run toggle and activation-state banners. Two initial page renders consolidate independently: hidden Pipelines heading/toggle checks join the hidden Conference Room keeper; all off-state cutoff/reset copy and armed/fail-closed banner exclusions join the existing worktree toggle keeper before its click. Runtime worktree metadata, shared settings fixture, renderPage helper and lifecycle match in each pair. Enabled/armed/mismatch/managed/runtime-specific and toggle-interaction cases remain unchanged.
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 | 55 | 55 | 0 | 0 |
| Candidate | 53 | 53 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/pages/InstanceExperimentalSettings.test.tsx`.
All 6 isolated positive controls passed. All 6 deliberate behavior regressions failed at their intended retained/migrated assertion, rather than setup, timeout or a different guard:
| Regression | Intended guard |
|---|---|
| pipelines-heading | `expect(headings).not.toContain("Pipelines")` |
| pipelines-toggle | `expect(container.querySelector('button[aria-label="Toggle pipelines experimental setting"]')).toBeNull()` |
| cutoff-copy | `expect(container.textContent).toContain(` |
| reset-copy | `expect(container.textContent).toContain("Toggling off and on resets the cutoff.")` |
| armed-banner | `expect(container.textContent).not.toContain("Running tasks created after")` |
| fail-closed | `expect(container.textContent).not.toContain("Execution is suppressed")` |
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-experimental-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.
@@ -0,0 +1,221 @@
{
"audit": {
"file": "ui/src/components/IssueFiltersPopover.test.tsx",
"base": "2e76f5157240ee8b2d42adbdcd4c345aea07c013",
"originalSha256": "bc64ad73ccd00e837e92a2ddf0309cf063e30e6a55704b0e8031a6c95d697688",
"candidateSha256": "6bdb383ad113f555c1208bbdb1bda2203e027a059751fb9fa7b405d5e9c7f8ef",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1,
"netTestLinesRemoved": 22,
"migrations": [
{
"retired": "hides the Priority filter section while priority UI is off (PAP-411)",
"keeper": "uses a scrollable popover and a three-column desktop grid",
"exactLeadingStatements": 4,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": false,
"kind": "normal",
"exactMigratedStatements": [
"expect(popoverContent?.textContent).toContain(\"Status\");",
"expect(popoverContent?.textContent).not.toContain(\"Priority\");"
],
"alreadyExactKeeperStatementsOrBindings": [],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
}
]
},
"verifierSha256": "ff07f5e2e308cfc0f26584a6cd6599bcd98665e79d7f4782ed5bb36b35cb8cb9",
"mutationVerifierSha256": "676b973d4838ed130c5ae92d4bc50fb32a65309af8c858450ec34bcce13729e9",
"runs": [
{
"kind": "baseline",
"total": 5,
"passed": 5,
"failed": 0,
"skipped": 0,
"jsonSha256": "04cc18d7e6470f2861ac1d76af11bef0e60492f45dd94685df4efe078436bee4",
"logSha256": "05761c256ebb185006c0a3fc406347c46ef9543ba1ddcf5242e8f6e8f775356f"
},
{
"kind": "candidate",
"total": 4,
"passed": 4,
"failed": 0,
"skipped": 0,
"jsonSha256": "4deabc223e9f57bacf81f0c7d87b621c1eb620f397b54c1b49a876b3603810d0",
"logSha256": "d4a57beb3f938c21882056691d74fcb1bfc3db84656987cd3aaa5de8737fdbde"
}
],
"mutations": [
{
"slug": "status",
"owner": "ui/src/components/IssueFiltersPopover.tsx",
"sourceSha256": "ea92ceec823ad162f6fd843d094c849b9cd535aba1721059f7ea6d8c780d734b",
"title": "uses a scrollable popover and a three-column desktop grid",
"mutation": {
"before": ">Status</span>",
"after": ">Missing status</span>",
"replacementCount": 1
},
"intendedGuard": "expect(popoverContent?.textContent).toContain(\"Status\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "03e26e0e193e289480f5ee00500ec4d4e0e4d1de112ef708d7754a712fdadacc",
"logSha256": "de89d91b9b7e15774cc570b6fed343ace6fe6468c32f62045c4439061400b53e",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "81b7e1eb1de267f667c001ed838b65523fa8015f4265c84d82c19b9dd847d172",
"logSha256": "8f981560c571bacd648edcc6322ceee073cad7039085186a8381aa62f447b2be",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'FiltersQuick filtersAllActiveBacklogD\u2026' to contain 'Status'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/IssueFiltersPopover.test.tsx:76:41\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 (<anonymous>)\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 (<anonymous>)\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": "priority",
"owner": "ui/src/components/IssueFiltersPopover.tsx",
"sourceSha256": "ea92ceec823ad162f6fd843d094c849b9cd535aba1721059f7ea6d8c780d734b",
"title": "uses a scrollable popover and a three-column desktop grid",
"mutation": {
"before": "{SHOW_TASK_PRIORITY_UI && (",
"after": "{true && (",
"replacementCount": 1
},
"intendedGuard": "expect(popoverContent?.textContent).not.toContain(\"Priority\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "2b9d14ef5dba8d78ca254915e80969abb778dce7b6648548cc9684b3c79b698c",
"logSha256": "381ff350cd72e952c86246a8dd06867cd766e776fd6f471b71e220b312799866",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "d816a0329a953d6dd71e16eca02e95439534e24e753d50f1ea742ad43d9e9396",
"logSha256": "3fc77abdcbcedc235471237fdbb6a7d36caf9aa765193a9c62ffee4d39b99bb3",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'FiltersQuick filtersAllActiveBacklogD\u2026' not to contain 'Priority'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/IssueFiltersPopover.test.tsx:77:45\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 (<anonymous>)\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 (<anonymous>)\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-agentconfig-controls.json",
"sha256": "cfb4357610beaa464cdb26848f74a7b8d967d6409c63dbd6821c92886a9cf980"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md",
"sha256": "ea6d5dfc8cedcd653edd55ca9d77568431413a351f4de5db77ca6ac8f22b051a"
},
{
"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-experimental-controls.json",
"sha256": "9c72abee7ee1a937fdbd6ccee870320308bc7ce06b4fc1e338cd9bd3b0efba6b"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-experimental.md",
"sha256": "93b7583a8ebba39dc97e390918fd62029955a00beda22756f55bd6374acc3737"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json",
"sha256": "af9d3f115e6e0518c2c0a2e11b8913e7aa82a35c848f114e6750884323601e17"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline.md",
"sha256": "52d8e27970bd1c091ae7edf403b2331e921081da9198270df65ff779a8efc1bc"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json",
"sha256": "45d86fa901c8ab40bc3fe98d266e3ba1a7bbc93edb7bc2aae60ccd9bfa130c37"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md",
"sha256": "15e84a553c5a468aea013941f68d3aa517bfb5a13ae296a90e1a39586f85de8e"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json",
"sha256": "a56f183f1c6b940662db0c4bfb62457eda0cec453c2019b439ec716ed9d2a3e1"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md",
"sha256": "e137af5b991c936a167d6ad6f3c710b99688e939f839b163b203259fc998ded8"
},
{
"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
}
@@ -0,0 +1,35 @@
# Test audit, Round 7 UI — Issue filter popover follow-up
This separate packet removes **1 registered executions, 1 rendered scenarios and 22 net test lines** from `ui/src/components/IssueFiltersPopover.test.tsx`. It adds no helper and changes no production lines. Audit base: `2e76f5157240ee8b2d42adbdcd4c345aea07c013`. All prior committed proof remains byte-identical. Registration/render savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. A service-worker retirement counts only initializer setup, never a render.
## Exact retirement map
| Retired registration | Keeper | Exact observations migrated |
|---|---|---|
| `hides the Priority filter section while priority UI is off (PAP-411)` | `uses a scrollable popover and a three-column desktop grid` | expect(popoverContent?.textContent).toContain("Status");; expect(popoverContent?.textContent).not.toContain("Priority"); |
Both registered cases use identical streamlined props, filter state, agents/projects/labels and routine-visibility flag, root/act render and positive popover lookup. The existing rich scroll/layout keeper gains exact Status-presence and Priority-absence checks before its original layout assertions. Real IssueFiltersPopover.tsx gates the Priority section independently of Status. Option search, legacy presentation and interactive inbox-scope cases remain unchanged. Existing teardown is unchanged.
The verifier requires matching setup statements, enclosing hooks and explicit teardown where present. It reconstructs candidate source solely from the declared registrations/assertion migrations and requires exact byte equality plus full-program AST equality outside those edits. Existing shared variable bindings, mock arguments and provider/component inputs remain the same. No other fixture, helper, action order, wait, assertion strength, timer or cleanup changes. Default CI includes the file in `@paperclipai/ui` under `general-workspaces-a`, once across its two file shards, with no workflow/config change.
## Complete owner-file results
| Run | Registered | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 5 | 5 | 0 | 0 |
| Candidate | 4 | 4 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/IssueFiltersPopover.test.tsx`.
All 2 separately selected positive controls passed. All 2 distinct production-owner regressions failed at intended retained/migrated assertions, not setup, timeout or another guard:
| Regression | Intended guard |
|---|---|
| status | `expect(popoverContent?.textContent).toContain("Status")` |
| priority | `expect(popoverContent?.textContent).not.toContain("Priority")` |
Exactly one production owner changed per control, and every owner was restored byte for byte after each mutation and checked against pinned Git bytes. Literal keeper-name filters are escaped; unselected cases are not full-suite evidence. The initial first-install receipt verifier mistook emit( for it( and rejected its receipt despite the intended test failure. The declaration-boundary matcher was corrected and that control rerun; the rejected verifier attempt supplies no accepted evidence.
[Controls JSON](2026-10-12-test-audit-r7-ui-filters-controls.json) preserves source/owner hashes, exact before/after migrations, matched setup and variable-binding proof, complete-file run/log digests, intended assertion failures and restoration checks. Temporary raw scripts/logs are identified by digests rather than committed in full.
The earlier broad local `pnpm test:run` was intentionally stopped before completion and is not claimed as passed. These separate focused packets precede delivery-head replay and full CI. This packet includes no push, rebase, PR or merge.
@@ -0,0 +1,180 @@
{
"audit": {
"file": "ui/src/components/InlineEditor.test.tsx",
"base": "e3effbb9e5c66b838f67fd487987c8bf1007e413",
"originalSha256": "50117c71ad5cf0319742d5aff24d3b36b03576d45f7d7eb5759574cf373afbe6",
"candidateSha256": "d556cf16f5ca87e44174b4e680a66ce19b69eb3fc01834544795638b7e898f32",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1,
"netTestLinesRemoved": 15,
"migrations": [
{
"retired": "marks multiline preview textboxes as multiline",
"keeper": "enters multiline edit mode from the keyboard preview surface",
"exactSetupStatements": 4,
"sameEnclosingHooks": true,
"exactCleanupStatements": 1,
"migratedGuards": [
"expect(preview?.getAttribute(\"aria-multiline\")).toBe(\"true\");",
"expect(preview?.tabIndex).toBe(0);"
],
"exactDuplicateGuardAlreadyKept": [
"expect(preview).not.toBeNull();"
],
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1
}
]
},
"verifierSha256": "084bdbc359e510397ef64daeb24e259efbc62c8b5d2c56d3e09d7f2534f155aa",
"mutationVerifierSha256": "ca8463047109d38a447d93fb94a19bb8efe9b1df440e0abf91ab31a8c0a358a2",
"runs": [
{
"kind": "baseline",
"total": 10,
"passed": 10,
"failed": 0,
"skipped": 0,
"jsonSha256": "e2d0e45ee5a399f94e9dae9063e10eb82c4732e8735abb2910e7a99ce43b9e56",
"logSha256": "ff89195de1b2aea03e77b06103dc733d634075241a30cddf8fcf83cf0523cb38"
},
{
"kind": "candidate",
"total": 9,
"passed": 9,
"failed": 0,
"skipped": 0,
"jsonSha256": "9e64a19f6fe426eaa9976f6e57c1b3df624a90bc6985ed1b68ce2dedd7d8b138",
"logSha256": "6001db7d0b44f5162dfb7f3277f7a41ae44c32d8c07c70055c0c69a0fca470a9"
}
],
"mutations": [
{
"slug": "multiline",
"owner": "ui/src/components/InlineEditor.tsx",
"sourceSha256": "9b14c37ef76ab2f6372fd56e9b5b7d3125f50cb352dfec8c4a320cf91d77ef3c",
"title": "enters multiline edit mode from the keyboard preview surface",
"mutation": {
"before": "aria-multiline=\"true\"",
"after": "aria-multiline=\"false\"",
"replacementCount": 1
},
"intendedGuard": "expect(preview?.getAttribute(\"aria-multiline\")).toBe(\"true\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "61dc2a3025f09b64b8598cd30c3417fb352519278c7c62b794dff2f236849c9d",
"logSha256": "4b25b8b35d984b55fa024c6c36b2ec739ba1cac2383f325edba1787ec5b7b764",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "4341b22562ba43c8ab24ce4e90eb83cf99c143a89aa87785c0acb6b3935e1290",
"logSha256": "42c7242f5b1887c6eee56ad0a6be72a429432bc514cdc8f6a6725ced42caad80",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'false' to be 'true' // Object.is equality\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/InlineEditor.test.tsx:221:53\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 (<anonymous>)\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 (<anonymous>)\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": "tab-index",
"owner": "ui/src/components/InlineEditor.tsx",
"sourceSha256": "9b14c37ef76ab2f6372fd56e9b5b7d3125f50cb352dfec8c4a320cf91d77ef3c",
"title": "enters multiline edit mode from the keyboard preview surface",
"mutation": {
"before": "tabIndex={0}",
"after": "tabIndex={-1}",
"replacementCount": 1
},
"intendedGuard": "expect(preview?.tabIndex).toBe(0)",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "b6064902d779a1e4e32ed95b27fcae92c6a23f52818983552ff628bf3bb57d04",
"logSha256": "09f4dbfc349e5dfafac95f9a3be763025bd88b509d4c3e4cdb7b9aec091f21d2",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "a97cb51553559f3ab8e7ccc074a9c71fc29b06acd0c3d098861c57432fda2452",
"logSha256": "561db47d821ce123ed915b2f6428cdc2990d4ea4bfebefb78c8875f822ce8617",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected -1 to be +0 // Object.is equality\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/InlineEditor.test.tsx:222:31\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 (<anonymous>)\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 (<anonymous>)\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-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
}
@@ -0,0 +1,33 @@
# Test audit, Round 7 UI — Inline editor accessibility follow-up
This separate packet removes **1 registered executions, 1 root renders and 15 net test lines** from `ui/src/components/InlineEditor.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 |
|---|---|---|
| `marks multiline preview textboxes as multiline` | `enters multiline edit mode from the keyboard preview surface` | expect(preview?.getAttribute("aria-multiline")).toBe("true");; expect(preview?.tabIndex).toBe(0); |
InlineEditor.tsx exposes a focusable multiline preview textbox and enters edit mode on Enter. Both tests use identical non-empty value, multiline prop, fresh resolved onSave mock, real root, act render, preview query and unmount. The keyboard keeper already has the same not-null assertion; that exact duplicate is retained once. Exact aria-multiline and tabIndex guards move before Enter, preserving keyboard editing and preview/editor assertions. Focus, nullable save, click-entry, prop-sync and blur behavior remain distinct and unchanged.
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 | 10 | 10 | 0 | 0 |
| Candidate | 9 | 9 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/InlineEditor.test.tsx`.
All 2 isolated positive controls passed. All 2 deliberate behavior regressions failed at their intended retained/migrated assertion, rather than setup, timeout or a different guard:
| Regression | Intended guard |
|---|---|
| multiline | `expect(preview?.getAttribute("aria-multiline")).toBe("true")` |
| tab-index | `expect(preview?.tabIndex).toBe(0)` |
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-inline-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.
@@ -0,0 +1,145 @@
{
"audit": {
"file": "ui/src/components/IssueChatThread.test.tsx",
"base": "e3effbb9e5c66b838f67fd487987c8bf1007e413",
"originalSha256": "226728e901d702ff59651f4b0d1a6fa33b34654a8410c58f2f42cebf7022113e",
"candidateSha256": "4c8db9834c9bd6bd3ca77420d6dc5ec872903d35f6168dc177a5247372867593",
"retired": "does not auto-scroll to the latest comment on initial load",
"keeper": "can keep the page at the top on initial load while preserving manual jump-to-latest",
"sameEnclosingHooks": true,
"exactSubsetPrefixStatements": 20,
"exactSubsetCleanupStatements": 4,
"keeperBytesUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"allOtherProgramAstUnchanged": true,
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1,
"netTestLinesRemoved": 50,
"newHelpers": 0,
"retainedExactInitialGuards": [
"expect(elementScrollToMock).not.toHaveBeenCalled();",
"expect(scrollIntoViewMock).not.toHaveBeenCalled();"
]
},
"verifierSha256": "d5589d82c62e06412eae150b239b5552526428b764362485070ac3846a95789a",
"mutationVerifierSha256": "97072371ef809b8bdefbf09dcacd261989132a4135d67fcf857152dd179d2f03",
"runs": [
{
"kind": "baseline",
"total": 100,
"passed": 100,
"failed": 0,
"skipped": 0,
"jsonSha256": "efc81cf6ef5ca2bc0f495d185bb10ea905dcb003b084fc20ea29d76f122ed7e2",
"logSha256": "4d1be86a78cc5a8868d9fc99e53b4ddaa1d94deac818cea48952b887ca3cbca0"
},
{
"kind": "candidate",
"total": 99,
"passed": 99,
"failed": 0,
"skipped": 0,
"jsonSha256": "82badc1cc88a0e72db6dace6d9bae69d239d53eb9a187c9b286a6a6c4bfb75e5",
"logSha256": "0eb343b1ddd666c246c4df358a8b9210cfe97f9ecef7e8abe756103b4e16a7a3"
}
],
"mutations": [
{
"slug": "initial-auto-scroll",
"owner": "ui/src/components/IssueChatThread.tsx",
"sourceSha256": "23624e4e25b60c9ce8cc91fa548bfd46e18666723e5aa8d9f882846ded3bdf82",
"title": "can keep the page at the top on initial load while preserving manual jump-to-latest",
"mutation": {
"before": " if (!autoScrollToLatestOnInitialLoad) return;",
"after": " // Regression: ignore caller initial-scroll opt-out.",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": ".not.toHaveBeenCalled();",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "018d96099478a6400770da42da7a7af754e12a05c0ad3981b270fcd0d9317a7f",
"logSha256": "34e23348df52acad5ab2e1c6374125ae9f746f21dd3ea6bc5d4155fceb71590d",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "5a6c5faccd5b873cf5ddf2ef18b14f12fc2b3d596c15c11ca606d84a76ecd1d6",
"logSha256": "c87b37dcd855277f778930cf10f4ee89dd4c19627cebfd5d6452378c9ee44530",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to not be called at all, but actually been called 6 times\n\nReceived:\n\n 1st vi.fn() call:\n\n Array [\n Object {\n \"behavior\": \"smooth\",\n \"top\": 114916,\n },\n ]\n\n 2nd vi.fn() call:\n\n Array [\n Object {\n \"behavior\": \"auto\",\n \"top\": 114916,\n },\n ]\n\n 3rd vi.fn() call:\n\n Array [\n Object {\n \"behavior\": \"auto\",\n \"top\": 114916,\n },\n ]\n\n 4th vi.fn() call:\n\n Array [\n Object {\n \"behavior\": \"auto\",\n \"top\": 114916,\n },\n ]\n\n 5th vi.fn() call:\n\n Array [\n Object {\n \"behavior\": \"auto\",\n \"top\": 114916,\n },\n ]\n\n 6th vi.fn() call:\n\n Array [\n Object {\n \"behavior\": \"auto\",\n \"top\": 114916,\n },\n ]\n\n\nNumber of calls: 6\n\n at Proxy.<anonymous> (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:2214:51)\n at Proxy.<anonymous> (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/IssueChatThread.test.tsx:1217:37\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 (<anonymous>)\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"
]
}
}
],
"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
}
@@ -0,0 +1,32 @@
# Test audit, Round 7 UI — Issue thread initial scroll follow-up
This separate packet removes **1 registered executions, 1 root renders and 50 net test lines** from `ui/src/components/IssueChatThread.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 |
|---|---|---|
| `does not auto-scroll to the latest comment on initial load` | `can keep the page at the top on initial load while preserving manual jump-to-latest` | expect(elementScrollToMock).not.toHaveBeenCalled();; expect(scrollIntoViewMock).not.toHaveBeenCalled(); |
IssueChatThread.tsx keeps default initial viewport stable through the autoScrollToLatestOnInitialLoad opt-out, while an explicit Jump to latest action owns manual scrolling. The retired complete initial test is an exact AST subset of the keeper: all twenty setup/initial-judgment statements and all four cleanup statements match. Both use the exact same long-thread comments/runs/events/maps, fake timers, real scroll host, scrollTo mock, scrollIntoView prototype override and 500 ms timer advance. The keeper remains byte-identical, including both no-scroll guards before clicking. Hash routing, explicit auto-scroll and user-interruption cases remain byte-identical.
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 | 100 | 100 | 0 | 0 |
| Candidate | 99 | 99 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/IssueChatThread.test.tsx`.
All 1 isolated positive controls passed. All 1 deliberate behavior regressions failed at their intended retained/migrated assertion, rather than setup, timeout or a different guard:
| Regression | Intended guard |
|---|---|
| initial-auto-scroll | `.not.toHaveBeenCalled();` |
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-issuechat-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.
@@ -0,0 +1,149 @@
{
"audit": {
"file": "ui/src/pages/IssueDetail.test.tsx",
"base": "e3effbb9e5c66b838f67fd487987c8bf1007e413",
"originalSha256": "3f70d91da4a6b272ee190b33fd17c3e09e04df3dd42d6ab4f2c9cb74e2bca0c4",
"candidateSha256": "06b026c4bd296848011d1cc30f89711453a9db0c1e4c743fa22ae653b3e942d7",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1,
"netTestLinesRemoved": 11,
"migrations": [
{
"retired": "hides file viewer entry points by default",
"keeper": "hides the plan decomposition panel by default",
"exactSetupStatements": 4,
"sameEnclosingHooks": true,
"exactCleanupStatements": 0,
"migratedGuards": [
"expect(\n container.querySelector('[aria-label=\"Open file in this issue\"]'),\n ).toBeNull();"
],
"exactDuplicateGuardAlreadyKept": [],
"registeredInvocationsRemoved": 1,
"rootRendersRemoved": 1
}
]
},
"verifierSha256": "084bdbc359e510397ef64daeb24e259efbc62c8b5d2c56d3e09d7f2534f155aa",
"mutationVerifierSha256": "ca8463047109d38a447d93fb94a19bb8efe9b1df440e0abf91ab31a8c0a358a2",
"runs": [
{
"kind": "baseline",
"total": 141,
"passed": 141,
"failed": 0,
"skipped": 0,
"jsonSha256": "efc0588840631e46a0468684533c2a0df23ce43e24e9f165b69797ed4ba4f8f2",
"logSha256": "c2d0323c3d9b9050231dcdd9ff68c0bf2796911ae563283d37d253b990973b87"
},
{
"kind": "candidate",
"total": 140,
"passed": 140,
"failed": 0,
"skipped": 0,
"jsonSha256": "5710da0c420896d10b0e02a42310067ef3f56ae171831ea74c02943f4d38c9e4",
"logSha256": "45b5a51b85ec8358643fd4b6bfe0851d77d1f97f6adf7c59fdec0dbed36d569f"
}
],
"mutations": [
{
"slug": "file-viewer",
"owner": "ui/src/pages/IssueDetail.tsx",
"sourceSha256": "17b28ad871c2f00fa2d1153d50f151ebd0bed68c85d5a0f2a50164a2f1a612b2",
"title": "hides the plan decomposition panel by default",
"mutation": {
"before": "instanceExperimentalSettings?.enableExperimentalFileViewer === true;",
"after": "true;",
"replacementCount": 1
},
"intendedGuard": "container.querySelector('[aria-label=\"Open file in this issue\"]')",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "cfcf22e69da57c125f9622c1c692fbadf48181cf05804986c7f7d967f38295a0",
"logSha256": "e8175ef85629eb1163704e686efcbb7c0e08ea9e0de852541945a0448d79223f",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "b0e830d03ce630f19deae86869b4fa642ac41047da6d59fe4e363633d486e424",
"logSha256": "b7a6464f68a800d0218d044694c0f8405e993f18ee831634a9c22b4b00204c86",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected <button \u2026(3)>\u2026(1)</button> to be null\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/IssueDetail.test.tsx:4195: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"
]
}
}
],
"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
}
@@ -0,0 +1,32 @@
# Test audit, Round 7 UI — Issue detail default feature gates follow-up
This separate packet removes **1 registered executions, 1 root renders and 11 net test lines** from `ui/src/pages/IssueDetail.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 |
|---|---|---|
| `hides file viewer entry points by default` | `hides the plan decomposition panel by default` | expect( container.querySelector('[aria-label="Open file in this issue"]'), ).toBeNull(); |
IssueDetail.tsx derives fileViewerEnabled and showPlanDecompositionsSection independently from instance settings. The identical default issue/render/two-flush setup already proves the plan panel absent and no listAcceptedPlanDecompositions API request. It now also retains the exact file-entry-point absence guard. The actual IssuePlanDecompositionsSection owns its list API request only when mounted. Enabled file viewer, enabled plan decomposition, routing/hash and interactive viewer states remain distinct and unchanged.
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 | 141 | 141 | 0 | 0 |
| Candidate | 140 | 140 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/pages/IssueDetail.test.tsx`.
All 1 isolated positive controls passed. All 1 deliberate behavior regressions failed at their intended retained/migrated assertion, rather than setup, timeout or a different guard:
| Regression | Intended guard |
|---|---|
| file-viewer | `container.querySelector('[aria-label="Open file in this issue"]')` |
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-issuedetail-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.
@@ -0,0 +1,549 @@
{
"audit": {
"file": "ui/src/components/OnboardingWizard.test.tsx",
"base": "2e76f5157240ee8b2d42adbdcd4c345aea07c013",
"originalSha256": "6215ee2f034686deaf2d6091590030dcdeccff1697422574e45e0351eaf5a7fe",
"candidateSha256": "a2be5c51e61cffe1e6a01e281e073b766d7a2c18a2eb9795cfa0810d0cf9531d",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 5,
"renderInvocationsRemoved": 5,
"setupInvocationsRemoved": 5,
"netTestLinesRemoved": 56,
"migrations": [
{
"retired": "carries no token value in the hire payload",
"keeper": "sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists",
"exactLeadingStatements": 4,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": true,
"kind": "privacy",
"exactMigratedStatements": [
"const binding = hireBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY] as\n | { type: string }\n | undefined;",
"expect(binding?.type).toBe(\"user_secret_ref\");",
"expect(JSON.stringify(hireBody)).not.toContain(\"secretId\");"
],
"alreadyExactKeeperStatementsOrBindings": [
"expect(mockAgentsApi.hire).toHaveBeenCalled();",
"const hireArgs = mockAgentsApi.hire.mock.calls.at(-1) as unknown[];",
"const hireBody = hireArgs[1] as { adapterConfig: { env?: Record<string, unknown> } };"
],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
},
{
"retired": "sends the fixed binding in the environment test request when the status route returns 200",
"keeper": "sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists",
"exactLeadingStatements": 4,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": true,
"kind": "probe",
"exactMigratedStatements": [
"expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();",
"const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];",
"const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };",
"expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual({\n type: \"user_secret_ref\",\n key: CLAUDE_OAUTH_TOKEN_ENV_KEY,\n version: \"latest\",\n required: true,\n });"
],
"alreadyExactKeeperStatementsOrBindings": [],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
},
{
"retired": "sends no binding in the environment test request when the status route returns 404",
"keeper": "sends no binding and no flag when the Claude status route returns 404",
"exactLeadingStatements": 2,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": true,
"kind": "probe",
"exactMigratedStatements": [
"expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();",
"const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];",
"const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };",
"expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toBeUndefined();"
],
"alreadyExactKeeperStatementsOrBindings": [],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
},
{
"retired": "creates the organization on Continue and lands on the agent step, no mission",
"keeper": "shows no environment-check card on the model step, and no Mission row on review",
"exactLeadingStatements": 3,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": true,
"kind": "company",
"exactMigratedStatements": [
"expect(mockCompaniesApi.create).toHaveBeenCalledWith({ name: \"Initech\" });",
"expect(document.body.textContent).not.toContain(\"Define your mission\");",
"expect(document.body.textContent).not.toContain(\"Tell us about your team\");"
],
"alreadyExactKeeperStatementsOrBindings": [
"expect(document.body.textContent).toContain(\"Create your first agent\");"
],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
},
{
"retired": "renders no 'Use saved login' control",
"keeper": "starts the other source's login after backing out of the first",
"exactLeadingStatements": 3,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": true,
"kind": "normal",
"exactMigratedStatements": [
"expect(document.body.textContent).toContain(\"Sign in to Claude then come back and enter authorization code\");",
"expect(document.body.textContent).not.toContain(\"Use saved login\");"
],
"alreadyExactKeeperStatementsOrBindings": [],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
}
]
},
"verifierSha256": "ff07f5e2e308cfc0f26584a6cd6599bcd98665e79d7f4782ed5bb36b35cb8cb9",
"mutationVerifierSha256": "676b973d4838ed130c5ae92d4bc50fb32a65309af8c858450ec34bcce13729e9",
"runs": [
{
"kind": "baseline",
"total": 93,
"passed": 93,
"failed": 0,
"skipped": 0,
"jsonSha256": "647b2b743bba5c5fe87cf8b19b413bfa811867cb19cd2d0afd0e0e64f4989603",
"logSha256": "b83f2bc12966793c3f000e579f0f938011b715572bc5caa2f23c144cfa23e7c5"
},
{
"kind": "candidate",
"total": 88,
"passed": 88,
"failed": 0,
"skipped": 0,
"jsonSha256": "3d708b8681916868d4e03d569e89038082e25c899e0f95935d9ea1903a364ce9",
"logSha256": "e015a19efabf22acd715d06ac5dda923a4f5bf11926089fe762db4e20e39f561"
}
],
"mutations": [
{
"slug": "probe-present-200",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists",
"mutation": {
"before": "const result = await agentsApi.testEnvironment(\n createdCompanyId,\n adapterType,\n {\n adapterConfig: adapterConfigOverride ?? buildAdapterConfig(),\n ...(managedBindingForStep() ? { aiConnection: managedBindingForStep() } : {}),\n environmentId,\n }\n );",
"after": "const result = { adapterType, status: \"pass\" as const, checks: [], testedAt: new Date(0).toISOString() };",
"replacementCount": 1
},
"intendedGuard": "expect(mockAgentsApi.testEnvironment).toHaveBeenCalled()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "31743b16d52bc74738877f45c4d52400bd9fc9e105fc59b7ec4804906969ec98",
"logSha256": "d80825ed43906d24b6d325af1009b5d538e0cd9d8b52a5760c996f7cc7e1b34c",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "384a0396090744b528b532ad60ceece8882cc84eb1c554e1e59b0603942323dd",
"logSha256": "9f2c7c7ba8a4331469c7b7bd262c2657daabe0dfddd5a106882d9ed08600d8a1",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called at least once\n at Proxy.<anonymous> (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:2214:51)\n at Proxy.<anonymous> (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/OnboardingWizard.test.tsx:1044:45\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": "probe-binding-200",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists",
"mutation": {
"before": "adapterConfig: adapterConfigOverride ?? buildAdapterConfig(),",
"after": "adapterConfig: { ...(adapterConfigOverride ?? buildAdapterConfig()), env: {} },",
"replacementCount": 1
},
"intendedGuard": "expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "81c27fbb8cba0dcf5b7bdf2ce2c97aab35616ff5e6f1a969aaf30e22c2593e11",
"logSha256": "ca107f788a76c3d6646d58e82f4a9c6e2df72bb74e82de2597298c2502e33bff",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "46182474cf2dbeaf39f7bcad775b9b45aa0d5522998d11489c864642878d5ba5",
"logSha256": "7ffcbe62fc7de0402029a8fc92840b7c5fc17ed5d4a72d8ceab5235967c47416",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected undefined to deeply equal { type: 'user_secret_ref', \u2026(3) }\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:1047:72\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": "hire-reference-kind",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists",
"mutation": {
"before": "adapterConfig: hireAdapterConfig,",
"after": "adapterConfig: { ...hireAdapterConfig, env: { ...(hireAdapterConfig.env ?? {}), [\"CLAUDE_CODE_OAUTH_TOKEN\"]: { type: \"plain\", value: \"wrong-kind\" } } },",
"replacementCount": 1
},
"intendedGuard": "expect(binding?.type).toBe(\"user_secret_ref\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "7b4f481d6c0f365bf00f5713ff2203cff0642575c11ccb3911b9707ea8f54ef5",
"logSha256": "628ee5cd5995a7b11df381f985db1757fca8ef85710603e06fd259cfb8515c0a",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "d231ee320ece943d41cefd9b1d01eb1d8b136c14be04b93e8b0e135e6eb7e294",
"logSha256": "4b97d9537eabe304eadc0b82144acfaba7bc1088edc74ab915170cc6f23f907b",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'plain' to be 'user_secret_ref' // Object.is equality\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:1064:29\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": "hire-private-id",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists",
"mutation": {
"before": "adapterConfig: hireAdapterConfig,",
"after": "adapterConfig: hireAdapterConfig,\n secretId: \"leaked-reference-id\",",
"replacementCount": 1
},
"intendedGuard": "expect(JSON.stringify(hireBody)).not.toContain(\"secretId\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "c31e4abc66b53c0e2a0a1d670e8a5c09b4e5737e118299a7d7b62eec720fa6d2",
"logSha256": "5c3083595d2bf2f06f52668806ecf9e412059f1da5186ecb932532adbde2c655",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "b98037a4460a3e20efa63527204996fbbc8ecdb67d921af4ac32c04cca22d58a",
"logSha256": "29bed62b4bf4fb4d9a9aa9309fc5ebcddc8c73edd704933df4963dd401073262",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected '{\"name\":\"Ada\",\"appearance\":{\"schemaVe\u2026' not to contain 'secretId'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:1065:44\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": "probe-present-404",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "sends no binding and no flag when the Claude status route returns 404",
"mutation": {
"before": "const result = await agentsApi.testEnvironment(\n createdCompanyId,\n adapterType,\n {\n adapterConfig: adapterConfigOverride ?? buildAdapterConfig(),\n ...(managedBindingForStep() ? { aiConnection: managedBindingForStep() } : {}),\n environmentId,\n }\n );",
"after": "const result = { adapterType, status: \"pass\" as const, checks: [], testedAt: new Date(0).toISOString() };",
"replacementCount": 1
},
"intendedGuard": "expect(mockAgentsApi.testEnvironment).toHaveBeenCalled()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "4d38c478ca455f244954d02107699d6af5614dfb8c80f553da1caf15f0dafd5a",
"logSha256": "0d6a237b79947cd1b028a87b34e2cc4d28755194e54ee73fffa6cbb99a530488",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "68f321ac5807be15bc85e58e1adeab127485cbb17d62e540ec0ff415ff8c5d60",
"logSha256": "09d6f75954ccc52b7fefb1747f3d5d54a70f952c509e5971959de4b96e47515b",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called at least once\n at Proxy.<anonymous> (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:2214:51)\n at Proxy.<anonymous> (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/OnboardingWizard.test.tsx:1085:45\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": "probe-binding-404",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "sends no binding and no flag when the Claude status route returns 404",
"mutation": {
"before": "adapterConfig: adapterConfigOverride ?? buildAdapterConfig(),",
"after": "adapterConfig: { ...(adapterConfigOverride ?? buildAdapterConfig()), env: { [\"CLAUDE_CODE_OAUTH_TOKEN\"]: { type: \"user_secret_ref\", key: \"CLAUDE_CODE_OAUTH_TOKEN\", version: \"latest\", required: true } } },",
"replacementCount": 1
},
"intendedGuard": "expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toBeUndefined()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "3f40b447122e687985096e3af6f8e2a5a8cad624904d034874ace9a7925fbe09",
"logSha256": "84548520fda7a059de5f0d4b835b3df59477c69ccc199b2f9eaa10f35c2d5402",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "2223afa8cb0fef009b6b58ef34d5a0d4cb587efb1842f151c362b5d43cfc3086",
"logSha256": "4966efcc558d90d72e14d397901b306565dede76b0b908edbbbf223c48d9ac1d",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected { type: 'user_secret_ref', \u2026(3) } to be undefined\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:1088:72\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": "create-company-name",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "shows no environment-check card on the model step, and no Mission row on review",
"mutation": {
"before": "companiesApi.create({ name: companyName.trim() })",
"after": "companiesApi.create({ name: \"Wrong company\" })",
"replacementCount": 1
},
"intendedGuard": "expect(mockCompaniesApi.create).toHaveBeenCalledWith({ name: \"Initech\" })",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "4bd6223a943a9f88351a1163a68267c20a57907c0f685a804f42134df7d418b9",
"logSha256": "d6e0fc1cd39e843cef3ab559a562dfda70ea826456904fcb4199b41d22616682",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "43cb71ec93702eefdb0c1332d80e25d163629a5e27a1f67a8c4d2990013f01e0",
"logSha256": "07b461cd0a99e77e8f3e8c668613a67eb3f19ab622628cfa6b6058fb8e1dbb31",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ { name: 'Initech' } ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n {\n- \"name\": \"Initech\",\n+ \"name\": \"Wrong company\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/OnboardingWizard.test.tsx:462:39\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": "initial-mission",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "shows no environment-check card on the model step, and no Mission row on review",
"mutation": {
"before": "\"Create your first agent\"",
"after": "\"Create your first agent \u2014 Define your mission\"",
"replacementCount": 1
},
"intendedGuard": "expect(document.body.textContent).not.toContain(\"Define your mission\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "59d05408e1ca40f733f09b3a0a4f3006c6717056a54e08f1e5da4543aa6b5446",
"logSha256": "593772fcb849cf4afb7bbfc4a38164983b22229c9069663d65f059e7e60e43c7",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "cfd65b2c01b74f4e82db621b0987dbb7894ff6b7a9159f7ab4d2964bb0ee987b",
"logSha256": "ba59a142a703fbcfb915dea3365a1e72283c9b7acdb28b7f486ee2949411ad04",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Step 2 of 4 Create your first agent \u2026' not to contain 'Define your mission'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:463:45\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": "initial-team",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "shows no environment-check card on the model step, and no Mission row on review",
"mutation": {
"before": "\"Create your first agent\"",
"after": "\"Create your first agent \u2014 Tell us about your team\"",
"replacementCount": 1
},
"intendedGuard": "expect(document.body.textContent).not.toContain(\"Tell us about your team\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "a5a285c51d9f2d943310b9434bdcaa81a12d3c07384c86ae6b509f176359c359",
"logSha256": "d37342c66155290e327442b45115f0174acce8c5f6ab05844f75c6382480b0fb",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "e80732591e8829b5712e5714a1195b44c95d00f8d211f16b37360892dde3f66e",
"logSha256": "7ebb5382e5d3701c63233f2c9ffe01bb7a0add3adac6b160ed70b3cbd185f9cd",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Step 2 of 4 Create your first agent \u2026' not to contain 'Tell us about your team'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:464:45\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": "auth-instruction",
"owner": "ui/src/components/AdapterLoginChrome.tsx",
"sourceSha256": "7fe56ca349b17410287074f89a42373b8d46280adb580a57067253ba45f00499",
"title": "starts the other source's login after backing out of the first",
"mutation": {
"before": "? \" then come back and enter authorization code\"",
"after": "? \" then return\"",
"replacementCount": 1
},
"intendedGuard": "expect(document.body.textContent).toContain(\"Sign in to Claude then come back and enter authorization code\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "4154830e1db482e7b7be3bc29a90a305886135615e4931b4cc3ab94131a782c3",
"logSha256": "425b312c4684680caf805e055b467180d71771928739fb2fb0bc884c5816db90",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "159827cd6b9ff90b04bd8fad88d06d70b981a49439d21d766a581845a3bc0905",
"logSha256": "36c516fa3a6507b036edd82a58808b69ec8a0ec6bd5870d0103908edcb173473",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Step 2 of 3Ada Connect a modelPapercl\u2026' to contain 'Sign in to Claude then come back and \u2026'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:2839:41\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": "saved-login",
"owner": "ui/src/components/AdapterLoginChrome.tsx",
"sourceSha256": "7fe56ca349b17410287074f89a42373b8d46280adb580a57067253ba45f00499",
"title": "starts the other source's login after backing out of the first",
"mutation": {
"before": ": \" by providing the authorization code below\"}",
"after": ": \" by providing the authorization code below\"}\n <button>Use saved login</button>",
"replacementCount": 1
},
"intendedGuard": "expect(document.body.textContent).not.toContain(\"Use saved login\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "133ee3765d37cd8af631b422c60109dddbe698d3e6b699793552af48bcd4b8ba",
"logSha256": "d692064dd8957fe9868fb507be75364c6db3412f727978f894cee91e3a1ba672",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "122fed92c9caa458fa52e0a4b84524f8bcb64545e0578597430f645b47adec69",
"logSha256": "717f13481ecc00acbf9531e1e9a3c8c04c46d04f148f97b918d9137854a6593e",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Step 2 of 3Ada Connect a modelPapercl\u2026' not to contain 'Use saved login'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.test.tsx:2840:45\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-agentconfig-controls.json",
"sha256": "cfb4357610beaa464cdb26848f74a7b8d967d6409c63dbd6821c92886a9cf980"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md",
"sha256": "ea6d5dfc8cedcd653edd55ca9d77568431413a351f4de5db77ca6ac8f22b051a"
},
{
"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-experimental-controls.json",
"sha256": "9c72abee7ee1a937fdbd6ccee870320308bc7ce06b4fc1e338cd9bd3b0efba6b"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-experimental.md",
"sha256": "93b7583a8ebba39dc97e390918fd62029955a00beda22756f55bd6374acc3737"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json",
"sha256": "af9d3f115e6e0518c2c0a2e11b8913e7aa82a35c848f114e6750884323601e17"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline.md",
"sha256": "52d8e27970bd1c091ae7edf403b2331e921081da9198270df65ff779a8efc1bc"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json",
"sha256": "45d86fa901c8ab40bc3fe98d266e3ba1a7bbc93edb7bc2aae60ccd9bfa130c37"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md",
"sha256": "15e84a553c5a468aea013941f68d3aa517bfb5a13ae296a90e1a39586f85de8e"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json",
"sha256": "a56f183f1c6b940662db0c4bfb62457eda0cec453c2019b439ec716ed9d2a3e1"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md",
"sha256": "e137af5b991c936a167d6ad6f3c710b99688e939f839b163b203259fc998ded8"
},
{
"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
}
@@ -0,0 +1,196 @@
{
"audit": {
"file": "ui/src/components/OnboardingWizard.step.test.tsx",
"base": "2e76f5157240ee8b2d42adbdcd4c345aea07c013",
"originalSha256": "05f29524e705110bc020285744b4f1be3047ea8ed13eb1e5434013df54762019",
"candidateSha256": "6f38d97fc25a6ad573477e3ec00a6509eeb1993c6af0812429b7861091d3ba88",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1,
"netTestLinesRemoved": 9,
"migrations": [
{
"retired": "opens on the agent step when the goals lookup fails outright",
"keeper": "does not move an open wizard when a later refetch finds a mission",
"exactLeadingStatements": 5,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": false,
"kind": "subset",
"exactMigratedStatements": [],
"alreadyExactKeeperStatementsOrBindings": [
"routerState.pathname = \"/PC1/onboarding\";",
"mockGoalsApi.list.mockRejectedValue(new Error(\"goals unavailable\"));",
"await render();",
"await settle();",
"expect(currentStep()).toBe(\"agent\");"
],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
}
]
},
"verifierSha256": "ff07f5e2e308cfc0f26584a6cd6599bcd98665e79d7f4782ed5bb36b35cb8cb9",
"mutationVerifierSha256": "676b973d4838ed130c5ae92d4bc50fb32a65309af8c858450ec34bcce13729e9",
"runs": [
{
"kind": "baseline",
"total": 14,
"passed": 14,
"failed": 0,
"skipped": 0,
"jsonSha256": "97d067fe55e610e4c0d63f7ba0d7eab05ebe7d1a303248a616d01dd04f95015e",
"logSha256": "6e010087718c28d08d3f4a426280526bc8f760ff28984d5205eb18fa41d5b752"
},
{
"kind": "candidate",
"total": 13,
"passed": 13,
"failed": 0,
"skipped": 0,
"jsonSha256": "28eb77c49492b068be69a761fac2139788e49e78032473692dc37fbfbc0d56cd",
"logSha256": "fb8dcd4aafa59b414e1394dca9682a3f50c70bf567bb26086498d4b4fca9eb60"
}
],
"mutations": [
{
"slug": "initial-agent-step",
"owner": "ui/src/components/OnboardingWizard.tsx",
"sourceSha256": "22a2c8bfbe0aa02ea1ab13a95fad511760f4c2cf69c2e875af4f7c4bbd3c4861",
"title": "does not move an open wizard when a later refetch finds a mission",
"mutation": {
"before": "setStep(initialStepRef.current);",
"after": "setStep(4);",
"replacementCount": 1
},
"intendedGuard": "expect(currentStep()).toBe(\"agent\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "fb177a7674f0ad536aee811dbf0dbf02e7d3cb4db65ad80e274901b3db53613d",
"logSha256": "1afc3859f49727677ef5f0edfd5e77d15110136b154fe1c93b3bc2196b569daf",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "867f486c5b06f88c22e43d49aca66bd535b7c2d7b5e7b66c2e67db8b9a9b18c3",
"logSha256": "cbc50ca1569ffab283e25d0106fcdbd4540d4006a6ba872aef20aefc5339972e",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'other' to be 'agent' // Object.is equality\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/OnboardingWizard.step.test.tsx:305:27\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-agentconfig-controls.json",
"sha256": "cfb4357610beaa464cdb26848f74a7b8d967d6409c63dbd6821c92886a9cf980"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md",
"sha256": "ea6d5dfc8cedcd653edd55ca9d77568431413a351f4de5db77ca6ac8f22b051a"
},
{
"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-experimental-controls.json",
"sha256": "9c72abee7ee1a937fdbd6ccee870320308bc7ce06b4fc1e338cd9bd3b0efba6b"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-experimental.md",
"sha256": "93b7583a8ebba39dc97e390918fd62029955a00beda22756f55bd6374acc3737"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json",
"sha256": "af9d3f115e6e0518c2c0a2e11b8913e7aa82a35c848f114e6750884323601e17"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline.md",
"sha256": "52d8e27970bd1c091ae7edf403b2331e921081da9198270df65ff779a8efc1bc"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json",
"sha256": "45d86fa901c8ab40bc3fe98d266e3ba1a7bbc93edb7bc2aae60ccd9bfa130c37"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md",
"sha256": "15e84a553c5a468aea013941f68d3aa517bfb5a13ae296a90e1a39586f85de8e"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json",
"sha256": "a56f183f1c6b940662db0c4bfb62457eda0cec453c2019b439ec716ed9d2a3e1"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md",
"sha256": "e137af5b991c936a167d6ad6f3c710b99688e939f839b163b203259fc998ded8"
},
{
"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
}
@@ -0,0 +1,34 @@
# Test audit, Round 7 UI — Onboarding initial step follow-up
This separate packet removes **1 registered executions, 1 rendered scenarios and 9 net test lines** from `ui/src/components/OnboardingWizard.step.test.tsx`. It adds no helper and changes no production lines. Audit base: `2e76f5157240ee8b2d42adbdcd4c345aea07c013`. All prior committed proof remains byte-identical. Registration/render savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. A service-worker retirement counts only initializer setup, never a render.
## Exact retirement map
| Retired registration | Keeper | Exact observations migrated |
|---|---|---|
| `opens on the agent step when the goals lookup fails outright` | `does not move an open wizard when a later refetch finds a mission` | |
The retired complete five-statement body is an exact leading AST subset of the keeper, including the rejected goals mock, real route render, settle and agent-step assertion. The keeper is unchanged and then checks a later mission-cache update. Wizard opening/step effects and the real route resolver remain under test; explicit step, company change, reopen and in-flow behavior stay distinct. Existing global teardown remains unchanged.
The verifier requires matching setup statements, enclosing hooks and explicit teardown where present. It reconstructs candidate source solely from the declared registrations/assertion migrations and requires exact byte equality plus full-program AST equality outside those edits. Existing shared variable bindings, mock arguments and provider/component inputs remain the same. No other fixture, helper, action order, wait, assertion strength, timer or cleanup changes. Default CI includes the file in `@paperclipai/ui` under `general-workspaces-a`, once across its two file shards, with no workflow/config change.
## Complete owner-file results
| Run | Registered | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 14 | 14 | 0 | 0 |
| Candidate | 13 | 13 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/OnboardingWizard.step.test.tsx`.
All 1 separately selected positive controls passed. All 1 distinct production-owner regressions failed at intended retained/migrated assertions, not setup, timeout or another guard:
| Regression | Intended guard |
|---|---|
| initial-agent-step | `expect(currentStep()).toBe("agent")` |
Exactly one production owner changed per control, and every owner was restored byte for byte after each mutation and checked against pinned Git bytes. Literal keeper-name filters are escaped; unselected cases are not full-suite evidence. The initial first-install receipt verifier mistook emit( for it( and rejected its receipt despite the intended test failure. The declaration-boundary matcher was corrected and that control rerun; the rejected verifier attempt supplies no accepted evidence.
[Controls JSON](2026-10-12-test-audit-r7-ui-onboarding-step-controls.json) preserves source/owner hashes, exact before/after migrations, matched setup and variable-binding proof, complete-file run/log digests, intended assertion failures and restoration checks. Temporary raw scripts/logs are identified by digests rather than committed in full.
The earlier broad local `pnpm test:run` was intentionally stopped before completion and is not claimed as passed. These separate focused packets precede delivery-head replay and full CI. This packet includes no push, rebase, PR or merge.
@@ -0,0 +1,48 @@
# Test audit, Round 7 UI — Onboarding walkthroughs follow-up
This separate packet removes **5 registered executions, 5 rendered scenarios and 56 net test lines** from `ui/src/components/OnboardingWizard.test.tsx`. It adds no helper and changes no production lines. Audit base: `2e76f5157240ee8b2d42adbdcd4c345aea07c013`. All prior committed proof remains byte-identical. Registration/render savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. A service-worker retirement counts only initializer setup, never a render.
## Exact retirement map
| Retired registration | Keeper | Exact observations migrated |
|---|---|---|
| `carries no token value in the hire payload` | `sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists` | const binding = hireBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY] as \| { type: string } \| undefined;; expect(binding?.type).toBe("user_secret_ref");; expect(JSON.stringify(hireBody)).not.toContain("secretId"); |
| `sends the fixed binding in the environment test request when the status route returns 200` | `sends the fixed Claude binding and applyStoredClaudeLogin when a stored login exists` | expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();; const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];; const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };; expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual({ type: "user_secret_ref", key: CLAUDE_OAUTH_TOKEN_ENV_KEY, version: "latest", required: true, }); |
| `sends no binding in the environment test request when the status route returns 404` | `sends no binding and no flag when the Claude status route returns 404` | expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();; const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];; const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };; expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toBeUndefined(); |
| `creates the organization on Continue and lands on the agent step, no mission` | `shows no environment-check card on the model step, and no Mission row on review` | expect(mockCompaniesApi.create).toHaveBeenCalledWith({ name: "Initech" });; expect(document.body.textContent).not.toContain("Define your mission");; expect(document.body.textContent).not.toContain("Tell us about your team"); |
| `renders no 'Use saved login' control` | `starts the other source's login after backing out of the first` | expect(document.body.textContent).toContain("Sign in to Claude then come back and enter authorization code");; expect(document.body.textContent).not.toContain("Use saved login"); |
Five registrations consolidate within identical enclosing hooks and setup expressions. The stored-login 200 keeper receives the complete probe-called, captured probe payload and full fixed-binding equality before its original hire observations. The original hire-body binding is reused through the same captured mock-call expression; its broader type annotation and applyStoredClaudeLogin checks stay unchanged. The retired explicit reference-kind check and complete hire-payload secretId exclusion are retained before the original stronger binding equality. The 404 keeper separately receives its probe-called/captured-body/undefined-binding guards. The organization-create keeper carries exact requested name and both initial mission/team exclusions before advancing. The source-switch keeper carries the Claude instruction anchor and no-legacy-saved-login guard before Back. The real wizard creates companies, probes adapter environments and submits hires through distinct local call sites; its onboarding login UI uses AdapterLoginChrome. No status, provider, stored-login, cancellation or navigation paths are combined. An initial hire-kind mutation referenced an identifier not bound in the wizard and failed before the API payload assertion; it was rejected and restored, then rerun using the actual literal CLAUDE_CODE_OAUTH_TOKEN key. Every other case remains byte-identical.
The verifier requires matching setup statements, enclosing hooks and explicit teardown where present. It reconstructs candidate source solely from the declared registrations/assertion migrations and requires exact byte equality plus full-program AST equality outside those edits. Existing shared variable bindings, mock arguments and provider/component inputs remain the same. No other fixture, helper, action order, wait, assertion strength, timer or cleanup changes. Default CI includes the file in `@paperclipai/ui` under `general-workspaces-a`, once across its two file shards, with no workflow/config change.
## Complete owner-file results
| Run | Registered | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 93 | 93 | 0 | 0 |
| Candidate | 88 | 88 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/OnboardingWizard.test.tsx`.
All 11 separately selected positive controls passed. All 11 distinct production-owner regressions failed at intended retained/migrated assertions, not setup, timeout or another guard:
| Regression | Intended guard |
|---|---|
| probe-present-200 | `expect(mockAgentsApi.testEnvironment).toHaveBeenCalled()` |
| probe-binding-200 | `expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual(` |
| hire-reference-kind | `expect(binding?.type).toBe("user_secret_ref")` |
| hire-private-id | `expect(JSON.stringify(hireBody)).not.toContain("secretId")` |
| probe-present-404 | `expect(mockAgentsApi.testEnvironment).toHaveBeenCalled()` |
| probe-binding-404 | `expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toBeUndefined()` |
| create-company-name | `expect(mockCompaniesApi.create).toHaveBeenCalledWith({ name: "Initech" })` |
| initial-mission | `expect(document.body.textContent).not.toContain("Define your mission")` |
| initial-team | `expect(document.body.textContent).not.toContain("Tell us about your team")` |
| auth-instruction | `expect(document.body.textContent).toContain("Sign in to Claude then come back and enter authorization code")` |
| saved-login | `expect(document.body.textContent).not.toContain("Use saved login")` |
Exactly one production owner changed per control, and every owner was restored byte for byte after each mutation and checked against pinned Git bytes. Literal keeper-name filters are escaped; unselected cases are not full-suite evidence. The initial first-install receipt verifier mistook emit( for it( and rejected its receipt despite the intended test failure. The declaration-boundary matcher was corrected and that control rerun; the rejected verifier attempt supplies no accepted evidence.
[Controls JSON](2026-10-12-test-audit-r7-ui-onboarding-controls.json) preserves source/owner hashes, exact before/after migrations, matched setup and variable-binding proof, complete-file run/log digests, intended assertion failures and restoration checks. Temporary raw scripts/logs are identified by digests rather than committed in full.
The earlier broad local `pnpm test:run` was intentionally stopped before completion and is not claimed as passed. These separate focused packets precede delivery-head replay and full CI. This packet includes no push, rebase, PR or merge.
@@ -0,0 +1,303 @@
{
"audit": {
"file": "ui/src/components/RouteErrorBoundary.test.tsx",
"base": "c39262305b6b48a5decd564af8369083cd972b33",
"originalSha256": "aeca8c1302ed36fa9885d60b684b48fa67adc3f1a062e7b962be6a076bd93f57",
"candidateSha256": "d4af25551dd6e7b20ffbd34500bf41603f6797187836ca7f554b898594266760",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"additionalDeclaredCleanup": "Remove duplicate original title assertion; identical migrated title guard remains before route change",
"newHelpers": 0,
"registeredInvocationsRemoved": 2,
"rootRendersRemoved": 2,
"netTestLinesRemoved": 31,
"migrations": [
{
"retired": "reports one captured error and keeps the recovery button",
"keeper": "recovers and renders children again after the route changes",
"setupAstEqual": true,
"setupBindingNormalization": null,
"guards": [
"expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1);",
"expect(captureBrowserExceptionMock).toHaveBeenCalledWith(expect.any(Error), {\n boundary: \"route\", componentStack: expect.stringContaining(\"Boom\"),\n });",
"expect(\n Array.from(container.querySelectorAll(\"button\")).some(\n (button) => button.textContent === \"Go back\",\n ),\n ).toBe(true);"
],
"registeredInvocationsRemoved": 1
},
{
"retired": "renders a recoverable error card instead of a blank page when a child throws",
"keeper": "recovers and renders children again after the route changes",
"setupAstEqual": true,
"setupBindingNormalization": null,
"guards": [
"expect(container.textContent).toContain(\"This page hit an error\");",
"expect(container.textContent).toContain(\"Maximum update depth exceeded\");",
"expect(container.querySelector(\"pre\")).not.toBeNull();"
],
"registeredInvocationsRemoved": 1
}
]
},
"verifierSha256": "0f1b173c8a399bb8c3e831edac6805634304a749faffcfff7b8b1900da3d34a3",
"mutationVerifierSha256": "a05f5ba9071c0ce7ce8eac1bc0f6c7dd83401c4e720816389d779f8919312064",
"runs": [
{
"kind": "baseline",
"jsonSha256": "3782d05a0257e11e6618261f4f64121e86f253077e44c3191a3cf26b0f79cf24",
"logSha256": "dd5e7a343956d6f41c5b87a19073a0377a0a1e45ada33495ccf0eb25b1e926bb",
"total": 4,
"passed": 4,
"failed": 0,
"skipped": 0
},
{
"kind": "candidate",
"jsonSha256": "d6f68de33e64d9b11586f8fd885bacffe13659d1bd03d85e4b9e8fcd3e41e07e",
"logSha256": "c39520330407b89424c964598c0580454bbb24d5fb1568570547b027be8ba082",
"total": 2,
"passed": 2,
"failed": 0,
"skipped": 0
}
],
"mutations": [
{
"slug": "capture-count",
"owner": "ui/src/components/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"mutation": {
"before": " captureBrowserException(error, { boundary: \"route\", componentStack: info.componentStack });",
"after": " captureBrowserException(error, { boundary: \"route\", componentStack: info.componentStack });\n captureBrowserException(error, { boundary: \"route\", componentStack: info.componentStack });",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1)",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "8498654db6ea2733f761cef25c488c06ae35a9fdb32341915e5614beb9ee7077",
"logSha256": "4040e9d53955f1d919fd7932dc8a411cde138a58cb27b07a02a9cd286cbaf504",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "23a988b53557b6aa392f8f110fa672f9c34faf8480776c49a66dc4a642fc1143",
"logSha256": "abc91cb18b2edd6a6524b4fb006a50b36b76c40d6d5960480b18d283e958648c",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called 1 times, but got 2 times\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.test.tsx:80:41\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 (<anonymous>)\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 (<anonymous>)\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": "capture-boundary",
"owner": "ui/src/components/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"mutation": {
"before": "boundary: \"route\", componentStack: info.componentStack",
"after": "boundary: \"app\", componentStack: info.componentStack",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(captureBrowserExceptionMock).toHaveBeenCalledWith(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "aca0b48e03ef4f1562c8f41ab3bd1a036ae095e80b5abe9e10d4cb4b31cc5ce4",
"logSha256": "1983371a3c61ad944417f51bcd350a31e9e931be5a2796a0deea63cb222998f8",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "af6c302e83aad78e4fde8ea2968ac74d31a9604002046a3fef82505c0515a8c4",
"logSha256": "8621424418d7a4f7ba3cb039a554be9e914e73fac1989bf28aa7dbc959ace28a",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ Any<Error>, \u2026(1) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n- Any<Error>,\n+ Error {\n+ \"message\": \"Maximum update depth exceeded\",\n+ },\n {\n- \"boundary\": \"route\",\n- \"componentStack\": StringContaining \"Boom\",\n+ \"boundary\": \"app\",\n+ \"componentStack\": \"\n+ at Boom (/Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.test.tsx:25:8)\n+ at RouteErrorBoundaryInner (/Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.tsx:14:1)\n+ at RouteErrorBoundary (/Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.tsx:103:31)\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/RouteErrorBoundary.test.tsx:81:41\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 (<anonymous>)\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"
]
}
},
{
"slug": "capture-stack",
"owner": "ui/src/components/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"mutation": {
"before": "boundary: \"route\", componentStack: info.componentStack",
"after": "boundary: \"route\", componentStack: \"wrong-stack\"",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(captureBrowserExceptionMock).toHaveBeenCalledWith(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "a3300f805575e44bf1080d21d4a5e340e8da1e6bee8e1b9f99b4afb2f2c5da23",
"logSha256": "6142d202f3913c5768e0d391bf0f15cd1e3ead938d8ca6e003406110594b8365",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "3c03030c7ee7515ed74b20612ba4b1438cc211dda8d2d8ea8809213eee29f596",
"logSha256": "1ab3c58e2732f4a56023fcaae9f286d6de2bb60ea52973c975e53a7f60bd9e92",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ Any<Error>, \u2026(1) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n- Any<Error>,\n+ Error {\n+ \"message\": \"Maximum update depth exceeded\",\n+ },\n {\n \"boundary\": \"route\",\n- \"componentStack\": StringContaining \"Boom\",\n+ \"componentStack\": \"wrong-stack\",\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/RouteErrorBoundary.test.tsx:81:41\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 (<anonymous>)\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"
]
}
},
{
"slug": "go-back",
"owner": "ui/src/components/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"mutation": {
"before": " Go back",
"after": " Return",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": ").toBe(true);",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "cc46916e4056b5eda7134325b3167d1a9ad9826ba6e465ad3d3f431c0db810c6",
"logSha256": "117b4d3c72c850183d3ab9628940f7a729dce79f55e0a777ef5927d9da441b1b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "4b561764a1a9d962fda0610d0794f71320c0a3523642ae8ff0e49f2a3524f2b0",
"logSha256": "116d2d94a692a6a86a8acc74dd3b2aaa3d72443b6e87274164e0cf2ad6d200b5",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected false to be true // Object.is equality\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.test.tsx:88: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: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 (<anonymous>)\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 (<anonymous>)\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": "title",
"owner": "ui/src/components/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"mutation": {
"before": "This page hit an error",
"after": "Unexpected title",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(container.textContent).toContain(\"This page hit an error\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "f4f6f6cd80fd8ea6a668520c5e678cca1af4f2af117beed5c27aaedccd6a3888",
"logSha256": "5f4ba767c3a107c3dbba86fc9959045a2d7d989c1a03a6f566eff3fc3130faa4",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "ee00df253bff2477b681d9c817ad323faf1d2e4b7f10fde13a1fe49f90530b65",
"logSha256": "7ec386fd0c0fd4f37a8ac6bf5f7ad37f217f9be4a4647618750e92a937dac05e",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Unexpected titleSomething went wrong \u2026' to contain 'This page hit an error'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.test.tsx:90: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 (<anonymous>)\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 (<anonymous>)\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/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"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": "cb7f79721a1f5f3a32b1d9ca0749875d97ad9b644e2663d84226ce12edd9124a",
"logSha256": "b0ed753166122eafbd441172e5a2b47460fb08a2987cbacd53edb81861d33fd3",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "123f7949c426028edc343688cc50548d03399d5d56d5bb4a5dfcc7e5f7ed0ea9",
"logSha256": "0f9c80ef5e76823ced425f4f7e11cd9adce0c776eebd99170564b2bd4bb035c7",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'This page 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/RouteErrorBoundary.test.tsx:91: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 (<anonymous>)\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 (<anonymous>)\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": "pre",
"owner": "ui/src/components/RouteErrorBoundary.tsx",
"sourceSha256": "cc0e78de2ea683aca27e1497c1aee355bb4ab9e22918f1282730be1ba78c3394",
"title": "recovers and renders children again after the route changes",
"mutation": {
"before": "<pre className=",
"after": "<div className=",
"replacementCount": 1,
"additionalPreClosingTagReplacement": true
},
"intendedGuard": "expect(container.querySelector(\"pre\")).not.toBeNull()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "21c50a1cc9340c311c63b5c2a030cc6345004e0a5a610be679b7ed3a7d1506d8",
"logSha256": "d5be38cd7bd1f352f64d188d53c777f5eb7d18e9c3e11d9a43ee90a1809b72cb",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "44a7f4f7e9783b4e653d0db1512e2c40cc1d22502987517c18a36fd60152873e",
"logSha256": "8d8849edac3006c90066a8e877ef863570e42f9cfe862f2a99e3d9b79ac829a1",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected null not to be null\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/RouteErrorBoundary.test.tsx:92:48\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 (<anonymous>)\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 (<anonymous>)\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,
"postControlPolish": {
"controlCandidateSha256": "7d0c20e033b7f3daeccb0731ae544f213fccbfb297386786af014fdf385d5b93",
"polishedCandidateSha256": "d4af25551dd6e7b20ffbd34500bf41603f6797187836ca7f554b898594266760",
"difference": "Remove duplicate original title assertion; identical migrated title guard remains before route change",
"allIntendedGuardStatementsAndLocationsUnchanged": true,
"completePolishedFileReplayPassed": true
}
}
@@ -0,0 +1,41 @@
# Test audit, Round 7 UI — Route error boundary follow-up
This isolated follow-up removes **2 registered executions, 2 root renders and 31 net test lines** from `ui/src/components/RouteErrorBoundary.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 |
|---|---|---|
| `reports one captured error and keeps the recovery button` | `recovers and renders children again after the route changes` | expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1);; expect(captureBrowserExceptionMock).toHaveBeenCalledWith(expect.any(Error), { boundary: "route", componentStack: expect.stringContaining("Boom"), });; expect( Array.from(container.querySelectorAll("button")).some( (button) => button.textContent === "Go back", ), ).toBe(true); |
| `renders a recoverable error card instead of a blank page when a child throws` | `recovers and renders children again after the route changes` | expect(container.textContent).toContain("This page hit an error");; expect(container.textContent).toContain("Maximum update depth exceeded");; expect(container.querySelector("pre")).not.toBeNull(); |
Layout.tsx and Layout.production.tsx wrap the routed Outlet with RouteErrorBoundary. Its inner boundary captures the thrown error and component stack, renders recovery UI and resets after pathname/search changes. Paired initial createRoot/Boom/act subtrees and unmount statements are AST-identical. All migrated guards run before route mutation and retain the original capture metadata, count, Go-back presence, title, detail and pre checks. The duplicate original title assertion is removed after proving equality with the migrated title guard; the separate actual Go-back click/navigation test remains 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 | 4 | 4 | 0 | 0 |
| Candidate | 2 | 2 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/RouteErrorBoundary.test.tsx`.
All 7 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 |
|---|---|
| capture-count | `expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1)` |
| capture-boundary | `expect(captureBrowserExceptionMock).toHaveBeenCalledWith(` |
| capture-stack | `expect(captureBrowserExceptionMock).toHaveBeenCalledWith(` |
| go-back | `).toBe(true);` |
| title | `expect(container.textContent).toContain("This page hit an error")` |
| detail | `expect(container.textContent).toContain("Maximum update depth exceeded")` |
| pre | `expect(container.querySelector("pre")).not.toBeNull()` |
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-route-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.
The mutation controls preceded the final duplicate original-title removal. Exact byte reconstruction confirms that every intended migrated guard and its source location stayed unchanged; the final polished complete file passed again. The controls JSON records both candidate hashes.
@@ -0,0 +1,192 @@
{
"audit": {
"file": "ui/src/components/environment-variables-editor/EnvironmentVariablesEditor.test.tsx",
"base": "2e76f5157240ee8b2d42adbdcd4c345aea07c013",
"originalSha256": "23857fdf6e5db9d28c63f37ce24f0fd86b5eb57645d4b69ee7c01c77dfef7c04",
"candidateSha256": "07201fa2e9521bf6e235ee954ec4f7d72e9381d0083667130a9c5a907c7b1e41",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1,
"netTestLinesRemoved": 25,
"migrations": [
{
"retired": "opens the create-secret popover from the picker's + Create item (\u00a76.4, PAP-12476)",
"keeper": "keeps the create-secret popover open when focus returns to a control inside the value cell (\u00a76.4, PAP-12492)",
"exactLeadingStatements": 9,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": false,
"kind": "normal",
"exactMigratedStatements": [
"expect(\n document.querySelector('input[aria-label=\"Secret name\"]'),\n \"create-secret name field should render\",\n ).toBeTruthy();"
],
"alreadyExactKeeperStatementsOrBindings": [],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 1,
"setupInvocationsRemoved": 1
}
]
},
"verifierSha256": "ff07f5e2e308cfc0f26584a6cd6599bcd98665e79d7f4782ed5bb36b35cb8cb9",
"mutationVerifierSha256": "676b973d4838ed130c5ae92d4bc50fb32a65309af8c858450ec34bcce13729e9",
"runs": [
{
"kind": "baseline",
"total": 28,
"passed": 28,
"failed": 0,
"skipped": 0,
"jsonSha256": "353ef0936ad65121e272049737cae95e8c3afcabaf78d7abb68fae773ab8af6f",
"logSha256": "d5113caa5264644daf864032f6842fa4bfc514b3877e74d7d7d2d6fd11421c48"
},
{
"kind": "candidate",
"total": 27,
"passed": 27,
"failed": 0,
"skipped": 0,
"jsonSha256": "139fedbdb9bfb03c4d5d9595a4249b12ecb948d731f96e02f0962b0321cdea37",
"logSha256": "436156bfece2588699e879311e69a2a015701682a3786573df2aff1c29df5fa9"
}
],
"mutations": [
{
"slug": "initial-secret-name",
"owner": "ui/src/components/environment-variables-editor/CreateSecretPopover.tsx",
"sourceSha256": "d971769d01a99a53aff654e6b837b9e2502eb0f8f05b9f4474e8a5b23d46f535",
"title": "keeps the create-secret popover open when focus returns to a control inside the value cell (\u00a76.4, PAP-12492)",
"mutation": {
"before": "aria-label=\"Secret name\"",
"after": "aria-label=\"Missing secret name\"",
"replacementCount": 1
},
"intendedGuard": "document.querySelector('input[aria-label=\"Secret name\"]')",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "c83e93ae3f862d9ba20f93d3e7174f9736d5ce00fa7c8e64bf49a7f0721aaddc",
"logSha256": "d5ac329ef6d3cca724475b72d44c5db38ffdf6633a5f31a7151352389b3fab9c",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "c8944aa987dc601cec48de263d03c4fdf44e5da061bb55d21880c4590fee6d97",
"logSha256": "7bcf8061f31e3d87a657e33bc2436ae72933b0236ab6ae7d5adfe552da2630f7",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: create-secret name field should render: expected null to be truthy\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/environment-variables-editor/EnvironmentVariablesEditor.test.tsx:700: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"
]
}
}
],
"priorEvidenceUnchanged": [
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig-controls.json",
"sha256": "cfb4357610beaa464cdb26848f74a7b8d967d6409c63dbd6821c92886a9cf980"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md",
"sha256": "ea6d5dfc8cedcd653edd55ca9d77568431413a351f4de5db77ca6ac8f22b051a"
},
{
"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-experimental-controls.json",
"sha256": "9c72abee7ee1a937fdbd6ccee870320308bc7ce06b4fc1e338cd9bd3b0efba6b"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-experimental.md",
"sha256": "93b7583a8ebba39dc97e390918fd62029955a00beda22756f55bd6374acc3737"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json",
"sha256": "af9d3f115e6e0518c2c0a2e11b8913e7aa82a35c848f114e6750884323601e17"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline.md",
"sha256": "52d8e27970bd1c091ae7edf403b2331e921081da9198270df65ff779a8efc1bc"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json",
"sha256": "45d86fa901c8ab40bc3fe98d266e3ba1a7bbc93edb7bc2aae60ccd9bfa130c37"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md",
"sha256": "15e84a553c5a468aea013941f68d3aa517bfb5a13ae296a90e1a39586f85de8e"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json",
"sha256": "a56f183f1c6b940662db0c4bfb62457eda0cec453c2019b439ec716ed9d2a3e1"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md",
"sha256": "e137af5b991c936a167d6ad6f3c710b99688e939f839b163b203259fc998ded8"
},
{
"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
}
@@ -0,0 +1,34 @@
# Test audit, Round 7 UI — Secret picker popover follow-up
This separate packet removes **1 registered executions, 1 rendered scenarios and 25 net test lines** from `ui/src/components/environment-variables-editor/EnvironmentVariablesEditor.test.tsx`. It adds no helper and changes no production lines. Audit base: `2e76f5157240ee8b2d42adbdcd4c345aea07c013`. All prior committed proof remains byte-identical. Registration/render savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. A service-worker retirement counts only initializer setup, never a render.
## Exact retirement map
| Retired registration | Keeper | Exact observations migrated |
|---|---|---|
| `opens the create-secret popover from the picker's + Create item (§6.4, PAP-12476)` | `keeps the create-secret popover open when focus returns to a control inside the value cell (§6.4, PAP-12492)` | expect( document.querySelector('input[aria-label="Secret name"]'), "create-secret name field should render", ).toBeTruthy(); |
The retired picker/create transition and keeper use the same secret-ref value, secrets fixture, fresh callbacks, editor render, combobox focus, Create-item lookup/click and flush. Nine leading statements already match, including the initial heading assertion. The exact initial Secret name input-presence check moves before the keeper drives its late in-anchor focus return. Row.tsx retains the outside-focus guard; CreateSecretPopover.tsx owns the actual name input. Later heading/input persistence checks, outside interactions, store-as-secret and secret lifecycle cases remain unchanged.
The verifier requires matching setup statements, enclosing hooks and explicit teardown where present. It reconstructs candidate source solely from the declared registrations/assertion migrations and requires exact byte equality plus full-program AST equality outside those edits. Existing shared variable bindings, mock arguments and provider/component inputs remain the same. No other fixture, helper, action order, wait, assertion strength, timer or cleanup changes. Default CI includes the file in `@paperclipai/ui` under `general-workspaces-a`, once across its two file shards, with no workflow/config change.
## Complete owner-file results
| Run | Registered | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 28 | 28 | 0 | 0 |
| Candidate | 27 | 27 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/environment-variables-editor/EnvironmentVariablesEditor.test.tsx`.
All 1 separately selected positive controls passed. All 1 distinct production-owner regressions failed at intended retained/migrated assertions, not setup, timeout or another guard:
| Regression | Intended guard |
|---|---|
| initial-secret-name | `document.querySelector('input[aria-label="Secret name"]')` |
Exactly one production owner changed per control, and every owner was restored byte for byte after each mutation and checked against pinned Git bytes. Literal keeper-name filters are escaped; unselected cases are not full-suite evidence. The initial first-install receipt verifier mistook emit( for it( and rejected its receipt despite the intended test failure. The declaration-boundary matcher was corrected and that control rerun; the rejected verifier attempt supplies no accepted evidence.
[Controls JSON](2026-10-12-test-audit-r7-ui-secret-popover-controls.json) preserves source/owner hashes, exact before/after migrations, matched setup and variable-binding proof, complete-file run/log digests, intended assertion failures and restoration checks. Temporary raw scripts/logs are identified by digests rather than committed in full.
The earlier broad local `pnpm test:run` was intentionally stopped before completion and is not claimed as passed. These separate focused packets precede delivery-head replay and full CI. This packet includes no push, rebase, PR or merge.
@@ -0,0 +1,197 @@
{
"audit": {
"file": "ui/src/lib/service-worker-updates.test.ts",
"base": "2e76f5157240ee8b2d42adbdcd4c345aea07c013",
"originalSha256": "536e1fd2e7c9c0641fa45a9c4b3a5a2d08819e6673c599cf25dc2c26403b19f2",
"candidateSha256": "225c31546a4bedc53651e364723ef24865c7b0bdb8e73e4f4f201d9c9f39bf51",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"newHelpers": 0,
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 0,
"setupInvocationsRemoved": 1,
"netTestLinesRemoved": 10,
"migrations": [
{
"retired": "does not reload on a first-ever install",
"keeper": "reloads when a later deploy replaces the worker a first-visit tab installed",
"exactLeadingStatements": 6,
"sameEnclosingHooks": true,
"explicitCleanupAstEqual": false,
"kind": "subset",
"exactMigratedStatements": [],
"alreadyExactKeeperStatementsOrBindings": [
"const { container, emit } = fakeContainer({ controlled: false });",
"const { doc } = fakeDocument(\"hidden\");",
"const reload = vi.fn();",
"startServiceWorkerUpdates({ container, documentRef: doc, reload });",
"emit(\"controllerchange\");",
"expect(reload).not.toHaveBeenCalled();"
],
"registeredInvocationsRemoved": 1,
"renderInvocationsRemoved": 0,
"setupInvocationsRemoved": 1
}
]
},
"verifierSha256": "ff07f5e2e308cfc0f26584a6cd6599bcd98665e79d7f4782ed5bb36b35cb8cb9",
"mutationVerifierSha256": "676b973d4838ed130c5ae92d4bc50fb32a65309af8c858450ec34bcce13729e9",
"runs": [
{
"kind": "baseline",
"total": 9,
"passed": 9,
"failed": 0,
"skipped": 0,
"jsonSha256": "3b7fd48a3efcfb1e5cb4316e9a4bd1337765ad83f241269c30ad98407877a2bc",
"logSha256": "17439460b27c125513f7429f55f7a702a1b4e8643b9be25f30758a49aae64ccc"
},
{
"kind": "candidate",
"total": 8,
"passed": 8,
"failed": 0,
"skipped": 0,
"jsonSha256": "a64d06c0f236e73f3e446a515111f74c99f2f924ac381a6f8d4b88767b7cfba2",
"logSha256": "855085927b57d14b77892447f94ba3bc875946aa11e0208f900a4e481f7e51c7"
}
],
"mutations": [
{
"slug": "first-install",
"owner": "ui/src/lib/service-worker-updates.ts",
"sourceSha256": "2a6334bf805d331093ab9970d638cb732f0bb8070ef1ae2abea422ef8ce872db",
"title": "reloads when a later deploy replaces the worker a first-visit tab installed",
"mutation": {
"before": "let wasControlled = Boolean(container.controller);",
"after": "let wasControlled = true;",
"replacementCount": 1
},
"intendedGuard": "expect(reload).not.toHaveBeenCalled()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "a3511733ddddee2fa1b578225f0ec4e24544c824f76035e91c7a09517744f2a2",
"logSha256": "0598496c0b9388dc737b62b28f24a48e5242f3b78dc2871a6809be676215569a",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "421853ba449e7c93190f57187b683e42cc281f6ce5e744f5f786e8ec36425699",
"logSha256": "b8326ed6cb42630f0418ed7f75c8a43e88ee52de81b48c0315252ced142b166e",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to not be called at all, but actually been called 1 times\n\nReceived:\n\n 1st vi.fn() call:\n\n Array []\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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:2214:51)\n at Proxy.<anonymous> (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/lib/service-worker-updates.test.ts:97:24\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 (<anonymous>)\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"
]
}
}
],
"priorEvidenceUnchanged": [
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig-controls.json",
"sha256": "cfb4357610beaa464cdb26848f74a7b8d967d6409c63dbd6821c92886a9cf980"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-agentconfig.md",
"sha256": "ea6d5dfc8cedcd653edd55ca9d77568431413a351f4de5db77ca6ac8f22b051a"
},
{
"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-experimental-controls.json",
"sha256": "9c72abee7ee1a937fdbd6ccee870320308bc7ce06b4fc1e338cd9bd3b0efba6b"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-experimental.md",
"sha256": "93b7583a8ebba39dc97e390918fd62029955a00beda22756f55bd6374acc3737"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline-controls.json",
"sha256": "af9d3f115e6e0518c2c0a2e11b8913e7aa82a35c848f114e6750884323601e17"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-inline.md",
"sha256": "52d8e27970bd1c091ae7edf403b2331e921081da9198270df65ff779a8efc1bc"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat-controls.json",
"sha256": "45d86fa901c8ab40bc3fe98d266e3ba1a7bbc93edb7bc2aae60ccd9bfa130c37"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuechat.md",
"sha256": "15e84a553c5a468aea013941f68d3aa517bfb5a13ae296a90e1a39586f85de8e"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail-controls.json",
"sha256": "a56f183f1c6b940662db0c4bfb62457eda0cec453c2019b439ec716ed9d2a3e1"
},
{
"file": "doc/plans/2026-10-12-test-audit-r7-ui-issuedetail.md",
"sha256": "e137af5b991c936a167d6ad6f3c710b99688e939f839b163b203259fc998ded8"
},
{
"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
}
@@ -0,0 +1,34 @@
# Test audit, Round 7 UI — First service-worker takeover follow-up
This separate packet removes **1 registered executions, 0 rendered scenarios and 10 net test lines** from `ui/src/lib/service-worker-updates.test.ts`. It adds no helper and changes no production lines. Audit base: `2e76f5157240ee8b2d42adbdcd4c345aea07c013`. All prior committed proof remains byte-identical. Registration/render savings are per complete-suite invocation; no measured runtime or CI-speed claim is made. A service-worker retirement counts only initializer setup, never a render.
## Exact retirement map
| Retired registration | Keeper | Exact observations migrated |
|---|---|---|
| `does not reload on a first-ever install` | `reloads when a later deploy replaces the worker a first-visit tab installed` | |
The retired complete body is an exact prefix of the keeper: fresh uncontrolled fake container, hidden document, reload mock, real startServiceWorkerUpdates invocation, first controllerchange and no-reload assertion. The keeper remains byte-identical, then verifies that the later takeover reloads exactly once. This retirement removes one registration and initializer/observer setup, not a render. Initial-controlled and uncontrolled states, visibility, update checks and cleanup cases stay distinct. The mutation incorrectly treats a first-visit tab as already controlled; the retained first no-reload guard fails, so the boundary remains clear and meaningful.
The verifier requires matching setup statements, enclosing hooks and explicit teardown where present. It reconstructs candidate source solely from the declared registrations/assertion migrations and requires exact byte equality plus full-program AST equality outside those edits. Existing shared variable bindings, mock arguments and provider/component inputs remain the same. No other fixture, helper, action order, wait, assertion strength, timer or cleanup changes. Default CI includes the file in `@paperclipai/ui` under `general-workspaces-a`, once across its two file shards, with no workflow/config change.
## Complete owner-file results
| Run | Registered | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 9 | 9 | 0 | 0 |
| Candidate | 8 | 8 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/lib/service-worker-updates.test.ts`.
All 1 separately selected positive controls passed. All 1 distinct production-owner regressions failed at intended retained/migrated assertions, not setup, timeout or another guard:
| Regression | Intended guard |
|---|---|
| first-install | `expect(reload).not.toHaveBeenCalled()` |
Exactly one production owner changed per control, and every owner was restored byte for byte after each mutation and checked against pinned Git bytes. Literal keeper-name filters are escaped; unselected cases are not full-suite evidence. The initial first-install receipt verifier mistook emit( for it( and rejected its receipt despite the intended test failure. The declaration-boundary matcher was corrected and that control rerun; the rejected verifier attempt supplies no accepted evidence.
[Controls JSON](2026-10-12-test-audit-r7-ui-service-worker-controls.json) preserves source/owner hashes, exact before/after migrations, matched setup and variable-binding proof, complete-file run/log digests, intended assertion failures and restoration checks. Temporary raw scripts/logs are identified by digests rather than committed in full.
The earlier broad local `pnpm test:run` was intentionally stopped before completion and is not claimed as passed. These separate focused packets precede delivery-head replay and full CI. This packet includes no push, rebase, PR or merge.
@@ -0,0 +1,244 @@
{
"audit": {
"file": "ui/src/components/Sidebar.test.tsx",
"base": "c39262305b6b48a5decd564af8369083cd972b33",
"originalSha256": "9b463dd219ff0c4ef3a76f853feb29514e740102cf8f838a6bef981682d43f78",
"candidateSha256": "5b9033240feffd2c58165893f7c8a3037982711826415da8a52f330a05000eba",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"registeredInvocationsRemoved": 4,
"providerRootRendersRemoved": 4,
"newHelpers": 0,
"netTestLinesRemoved": 40,
"migrations": [
{
"retired": "does not flash the Workspaces link while experimental settings are loading",
"keeper": "keeps the simplified navigation while experimental settings are loading",
"setupAstEqual": true,
"unmountAstEqual": true,
"guards": [
"expect(container.textContent).not.toContain(\"Workspaces\");"
],
"registeredInvocationsRemoved": 1
},
{
"retired": "reserves the Goals nav slot while experimental settings are loading",
"keeper": "keeps the simplified navigation while experimental settings are loading",
"setupAstEqual": true,
"unmountAstEqual": true,
"guards": [
"expect([...container.querySelectorAll(\"nav a\")].map((a) => a.textContent?.trim())).not.toContain(\"Goals\");",
"expect(container.querySelector('[data-testid=\"sidebar-goals-placeholder\"]')).not.toBeNull();"
],
"registeredInvocationsRemoved": 1
},
{
"retired": "does not flash the Conference Room item while experimental settings are loading (PAP-137)",
"keeper": "keeps the simplified navigation while experimental settings are loading",
"setupAstEqual": true,
"unmountAstEqual": true,
"guards": [
"expect(container.textContent).not.toContain(\"Conference Room\");"
],
"registeredInvocationsRemoved": 1
},
{
"retired": "does not flash the Pipelines nav item while experimental settings are loading",
"keeper": "keeps the simplified navigation while experimental settings are loading",
"setupAstEqual": true,
"unmountAstEqual": true,
"guards": [
"expect(container.textContent).not.toContain(\"Pipelines\");"
],
"registeredInvocationsRemoved": 1
}
]
},
"verifierSha256": "31de795f5ffc44365740f1788b497fe117c236778ce05d0a95cc2472c014ce71",
"mutationVerifierSha256": "3783a894b558341f2a8ef0eddf7f774fb6ee46833161feca5def1279d7d4b887",
"runs": [
{
"kind": "baseline",
"jsonSha256": "38374087c2e9c98935c9b0e6e563c827127b21750f9797d3536271591bf793a5",
"logSha256": "361d260b375e5252086dac55605788a1a54421715d38ddc00700442562e707eb",
"total": 35,
"passed": 35,
"failed": 0,
"skipped": 0
},
{
"kind": "candidate",
"jsonSha256": "ce7c9e0fd848df8baf87a6d60c00190fae11eacbdd01991ca0e22388a1205780",
"logSha256": "a7bc412cee1de9d731c66a69dac53e69fa195807951091fefd1298c9b120ef86",
"total": 31,
"passed": 31,
"failed": 0,
"skipped": 0
}
],
"mutations": [
{
"slug": "workspaces",
"owner": "ui/src/components/Sidebar.tsx",
"sourceSha256": "2baa44740b00babc7fc5a02c2d28d8b5ed2bc478ad8840200f2689f073a1c9bd",
"title": "keeps the simplified navigation while experimental settings are loading",
"mutation": {
"before": "const showWorkspacesLink = !chatRail && experimentalSettings?.enableIsolatedWorkspaces === true;",
"after": "const showWorkspacesLink = experimentalSettings === undefined || (!chatRail && experimentalSettings?.enableIsolatedWorkspaces === true);"
},
"intendedGuard": "expect(container.textContent).not.toContain(\"Workspaces\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "0925c954fb40aeadf79dea76a015a9dcb637e2db9995b62e05094c86e0343f51",
"logSha256": "04c617da040c5b2f26885b6268951335b4c048f4deeed0fc2ec5ee511992b23a",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "adb925244eaeb8a6b3206f425c5e10775ec7f3cda791a965e739c55264cb4626",
"logSha256": "6cf3b4b626a80e4443325c75f7fe1887f12425322f142d93b69c476fcda9e8f3",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Company menuNew TaskSearchDashboardIn\u2026' not to contain 'Workspaces'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/Sidebar.test.tsx:270:39\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": "goals",
"owner": "ui/src/components/Sidebar.tsx",
"sourceSha256": "2baa44740b00babc7fc5a02c2d28d8b5ed2bc478ad8840200f2689f073a1c9bd",
"title": "keeps the simplified navigation while experimental settings are loading",
"mutation": {
"before": "const showGoalsLink = experimentalSettings?.enableGoalsSidebarLink === true;",
"after": "const showGoalsLink = experimentalSettings === undefined || experimentalSettings?.enableGoalsSidebarLink === true;"
},
"intendedGuard": "expect([...container.querySelectorAll(\"nav a\")].map((a) => a.textContent?.trim())).not.toContain(\"Goals\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "c65540e311c4131bb3b367088e8b3a2d175eb55577bcd434dd0128b4169374e9",
"logSha256": "87f3efaff20b56dfe4943004415205e0f1e1d06733230ccf8cd9dc27162cbebb",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "512f85c2e3ec85a0c09364a4872484e237f3771a7628911b569602b8987a98eb",
"logSha256": "d58f1e168ce951a214c10f9b2a690b061fc98113b3645ce1504129606a247620",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected [ 'Search', 'Dashboard', \u2026(10) ] to not include 'Goals'\n at Proxy.<anonymous> (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.<anonymous> (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/Sidebar.test.tsx:271:92\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": "conference",
"owner": "ui/src/components/Sidebar.tsx",
"sourceSha256": "2baa44740b00babc7fc5a02c2d28d8b5ed2bc478ad8840200f2689f073a1c9bd",
"title": "keeps the simplified navigation while experimental settings are loading",
"mutation": {
"before": "const conferenceRoomChatEnabled = experimentalSettings?.enableConferenceRoomChat === true;",
"after": "const conferenceRoomChatEnabled = experimentalSettings === undefined || experimentalSettings?.enableConferenceRoomChat === true;"
},
"intendedGuard": "expect(container.textContent).not.toContain(\"Conference Room\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "0637b1e10ca0d6d18e82baf74113b71d5217c879f7c26ce16fc2aab888c942ec",
"logSha256": "88ba4df5eab5e9e6b90f43104c534d9ec4cdfeb32770a1d66a301c47dd9381d5",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "0867024b3b2a6995608c8eefaafe9bc4d59000dee742c987d6d3948e89352ddd",
"logSha256": "c03a4143999fc21ff93cd6e945113cb76c140c34483515a26f4321eb84b25d24",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Company menuNew TaskSearchDashboardIn\u2026' not to contain 'Conference Room'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/Sidebar.test.tsx:273:39\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": "pipelines",
"owner": "ui/src/components/Sidebar.tsx",
"sourceSha256": "2baa44740b00babc7fc5a02c2d28d8b5ed2bc478ad8840200f2689f073a1c9bd",
"title": "keeps the simplified navigation while experimental settings are loading",
"mutation": {
"before": "const showPipelines = experimentalSettings?.enablePipelines === true;",
"after": "const showPipelines = experimentalSettings === undefined || experimentalSettings?.enablePipelines === true;"
},
"intendedGuard": "expect(container.textContent).not.toContain(\"Pipelines\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "290be9d7e8547a1842c594f0ba83c443e812ebaf7cebbb5ecf1a17f155d07cbc",
"logSha256": "5d56516d7a59c85d3c4926780e6ec3c1b60467fcd9818160cc0014da29adb6c5",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "5922637d763e6dbe8091839eef6f6d1336c22c32caaf922671058471fb8834ee",
"logSha256": "bf37d6a6eddb8da880fd0fff2680369b11cd9784d81d0f1d36fc7129ea3be981",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected 'Company menuNew TaskSearchDashboardIn\u2026' not to contain 'Pipelines'\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/Sidebar.test.tsx:274:39\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": "goals-placeholder",
"owner": "ui/src/components/Sidebar.tsx",
"sourceSha256": "2baa44740b00babc7fc5a02c2d28d8b5ed2bc478ad8840200f2689f073a1c9bd",
"title": "keeps the simplified navigation while experimental settings are loading",
"mutation": {
"before": "const goalsLinkPending = experimentalSettings === undefined;",
"after": "const goalsLinkPending = false;"
},
"intendedGuard": "expect(container.querySelector('[data-testid=\"sidebar-goals-placeholder\"]')).not.toBeNull()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "db75c234ed61cab71950d8e371a17496f3faa6e378f8fb4c8f5ba2eda2ff657a",
"logSha256": "79549245a36c31565101c45b74edbc22a9ebeffbe8b6206e3ba8530c3f03d454",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "af191c72c1f19e45e061cd3b4af054e4abe41087e48cf7b882b78f5698805621",
"logSha256": "528addefacd70920cd7fd16fbc15cb6be237fdc21379d6e61722ee847648aa3f",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected null not to be null\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/components/Sidebar.test.tsx:272:86\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-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
}
@@ -0,0 +1,39 @@
# Test audit, Round 7 UI — Sidebar loading state follow-up
This isolated follow-up removes **4 registered executions, 4 root renders and 40 net test lines** from `ui/src/components/Sidebar.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 |
|---|---|---|
| `does not flash the Workspaces link while experimental settings are loading` | `keeps the simplified navigation while experimental settings are loading` | expect(container.textContent).not.toContain("Workspaces"); |
| `reserves the Goals nav slot while experimental settings are loading` | `keeps the simplified navigation while experimental settings are loading` | expect([...container.querySelectorAll("nav a")].map((a) => a.textContent?.trim())).not.toContain("Goals");; expect(container.querySelector('[data-testid="sidebar-goals-placeholder"]')).not.toBeNull(); |
| `does not flash the Conference Room item while experimental settings are loading (PAP-137)` | `keeps the simplified navigation while experimental settings are loading` | expect(container.textContent).not.toContain("Conference Room"); |
| `does not flash the Pipelines nav item while experimental settings are loading` | `keeps the simplified navigation while experimental settings are loading` | expect(container.textContent).not.toContain("Pipelines"); |
Sidebar.tsx loads instance settings through useQuery. Workspaces, Goals, Conference Room and Pipelines derive from the same unresolved experimentalSettings value; Goals preserves its pending placeholder. The keeper uses the exact original never-resolving promise and renderSidebar helper. Existing nav checks remain; all five original moved assertions run before the unchanged unmount. Enabled, disabled, mobile, legacy, chat and permission/navigation variants remain distinct.
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 | 35 | 35 | 0 | 0 |
| Candidate | 31 | 31 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/components/Sidebar.test.tsx`.
All 5 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 |
|---|---|
| workspaces | `expect(container.textContent).not.toContain("Workspaces")` |
| goals | `expect([...container.querySelectorAll("nav a")].map((a) => a.textContent?.trim())).not.toContain("Goals")` |
| conference | `expect(container.textContent).not.toContain("Conference Room")` |
| pipelines | `expect(container.textContent).not.toContain("Pipelines")` |
| goals-placeholder | `expect(container.querySelector('[data-testid="sidebar-goals-placeholder"]')).not.toBeNull()` |
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-sidebar-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.
@@ -0,0 +1,271 @@
{
"audit": {
"file": "ui/src/pages/Timeline.test.tsx",
"base": "c39262305b6b48a5decd564af8369083cd972b33",
"originalSha256": "19543e8f10e41d438633bd3a825f45a9fa3c56f2807c01bc245b4e8e185a1108",
"candidateSha256": "8d5909b8aaf4d5d882d2fd1bc9072a2e8bb7fce9c98466ca15a6382e279ec9a7",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"additionalDeclaredCleanup": "Remove extra blank line before describe closes",
"newHelpers": 0,
"registeredInvocationsRemoved": 2,
"rootRendersRemoved": 2,
"netTestLinesRemoved": 26,
"migrations": [
{
"retired": "requests the collapsed app sidebar by default",
"keeper": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"setupAstEqual": true,
"setupBindingNormalization": null,
"guards": [
"expect(container.querySelector('[data-testid=\"request-collapsed-sidebar\"]')).not.toBeNull();"
],
"registeredInvocationsRemoved": 1
},
{
"retired": "requests the company timeline without a user lens parameter",
"keeper": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"setupAstEqual": true,
"setupBindingNormalization": null,
"guards": [
"expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(\n \"company-1\",\n expect.objectContaining({\n from: expect.any(String),\n to: expect.any(String),\n }),\n { signal: expect.any(AbortSignal) },\n );",
"expect(mockWorkTimelineApi.get.mock.calls[0]?.[1]).not.toHaveProperty(\"userId\");"
],
"registeredInvocationsRemoved": 1
}
]
},
"verifierSha256": "0f1b173c8a399bb8c3e831edac6805634304a749faffcfff7b8b1900da3d34a3",
"mutationVerifierSha256": "a05f5ba9071c0ce7ce8eac1bc0f6c7dd83401c4e720816389d779f8919312064",
"runs": [
{
"kind": "baseline",
"jsonSha256": "ae7cd09b89cd59f8f56d2ce5da5de1c87118bfd6b2893f212d61feff14398d1e",
"logSha256": "85573e535172170fc924ed4ec78737698a3a21cebb3cc9d1aa5fdc72564c44c8",
"total": 9,
"passed": 9,
"failed": 0,
"skipped": 0
},
{
"kind": "candidate",
"jsonSha256": "8ae0a854a756f627c20177d38418368d2ba82e141cc85a2010136af545449938",
"logSha256": "122fdad4346b64464466e96f0f34d5169578dcdc83de673df9ea82306a51224f",
"total": 7,
"passed": 7,
"failed": 0,
"skipped": 0
}
],
"mutations": [
{
"slug": "collapsed",
"owner": "ui/src/pages/Timeline.tsx",
"sourceSha256": "32dd72ff0b295bf23863f438a1be2b0262f039ea4e86b20c0e8df12abc5fb703",
"title": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"mutation": {
"before": "{!embedded && <RequestCollapsedSidebar />}",
"after": "{false && !embedded && <RequestCollapsedSidebar />}",
"replacementCount": 2,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(container.querySelector('[data-testid=\"request-collapsed-sidebar\"]')).not.toBeNull()",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "3c601ebb6478cc5815ab76983793956f042357ebc63a753df89d786ff5487e7d",
"logSha256": "bc0475e992fcaddd61f32e2bc5038fc469b86a8895c33159909cb089f5f1fc1b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "1669312785afa8b36c3e8495ff74cadddc7669a208289aa2a18687b4035cb89e",
"logSha256": "caf49d3737ee24ea97c9f3adbf9165b8943ee107f66454c0a594ae5015afbc81",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected null not to be null\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/Timeline.test.tsx:187:86\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": "userId",
"owner": "ui/src/pages/Timeline.tsx",
"sourceSha256": "32dd72ff0b295bf23863f438a1be2b0262f039ea4e86b20c0e8df12abc5fb703",
"title": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"mutation": {
"before": " ...params,",
"after": " ...params,\n userId: \"unexpected-user\",",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(mockWorkTimelineApi.get.mock.calls[0]?.[1]).not.toHaveProperty(\"userId\")",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "f7f10efaff0dd60e4cdcf0cc25f48382b14abc2223a8999e570444988940af60",
"logSha256": "eb14e95f3ba6aa4ef7c296071894a3ef933c82f5d89d9624e2fba7ce6faadd5b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "d809b1ab3cc65b66e7de8d8f09dc33f26ab2ce30c45fd7d5b1960389628cb0e8",
"logSha256": "73d702114b4bb05f2629e7b07be87a62b0cbdfb92958c2db55a3808bb7156b6f",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected { \u2026(5) } to not have property \"userId\"\n at /Users/dotta/.codex/worktrees/test-audit-r7-ui/paperclip/ui/src/pages/Timeline.test.tsx:197:60\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": "company",
"owner": "ui/src/pages/Timeline.tsx",
"sourceSha256": "32dd72ff0b295bf23863f438a1be2b0262f039ea4e86b20c0e8df12abc5fb703",
"title": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"mutation": {
"before": "workTimelineApi.get(companyId, {",
"after": "workTimelineApi.get(\"wrong-company\", {",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "cd568cc81271b304b2fc0c977a746436f7e6b49ebbc5e2f662fc9edfd20d517e",
"logSha256": "b0e17b15d6b5feeeabfa130ef7450242c7903631ee3ad90c15c348bea3924e8b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "5336632844af286db208fdf555dd21685ab4e6cc22ac09f26ad3550379d24bc0",
"logSha256": "340421b7b504bd8d0676f36fc2761f33a1a492e3e93dc3fb2bd8b5e183d13546",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'company-1', \u2026(2) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n- \"company-1\",\n- ObjectContaining {\n- \"from\": Any<String>,\n- \"to\": Any<String>,\n+ \"wrong-company\",\n+ {\n+ \"from\": \"2026-10-06T05:00:00.000Z\",\n+ \"limit\": 500,\n+ \"offset\": 0,\n+ \"to\": \"2026-10-13T04:59:59.999Z\",\n },\n {\n- \"signal\": Any<AbortSignal>,\n+ \"signal\": AbortSignal {\n+ Symbol(kEvents): Map {},\n+ Symbol(events.maxEventTargetListeners): 0,\n+ Symbol(events.maxEventTargetListenersWarned): false,\n+ Symbol(kHandlers): Map {},\n+ Symbol(kAborted): false,\n+ Symbol(kReason): undefined,\n+ Symbol(kComposite): false,\n+ },\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/pages/Timeline.test.tsx:189:37\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": "from",
"owner": "ui/src/pages/Timeline.tsx",
"sourceSha256": "32dd72ff0b295bf23863f438a1be2b0262f039ea4e86b20c0e8df12abc5fb703",
"title": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"mutation": {
"before": " ...params,",
"after": " ...params,\n from: 123,",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "0aa7e25d872ce8864151a25adf4ed3d744b425e99273a24a55edf55f6ab1b6ba",
"logSha256": "aaf0f2657f7bb1ca04517ce053e0728fb83c94223664d4ef1fb0cae0f9d61cd5",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "9feb2d30523ad4e7567d61d28e24f69eaa1a1869eaf1ff6e01cdb829d5c50b15",
"logSha256": "dd4740f663a636023f5ced054eaed3e51b0d1ee3db5df51f8f0127c8329564a6",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'company-1', \u2026(2) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n \"company-1\",\n- ObjectContaining {\n- \"from\": Any<String>,\n- \"to\": Any<String>,\n+ {\n+ \"from\": 123,\n+ \"limit\": 500,\n+ \"offset\": 0,\n+ \"to\": \"2026-10-13T04:59:59.999Z\",\n },\n {\n- \"signal\": Any<AbortSignal>,\n+ \"signal\": AbortSignal {\n+ Symbol(kEvents): Map {},\n+ Symbol(events.maxEventTargetListeners): 0,\n+ Symbol(events.maxEventTargetListenersWarned): false,\n+ Symbol(kHandlers): Map {},\n+ Symbol(kAborted): false,\n+ Symbol(kReason): undefined,\n+ Symbol(kComposite): false,\n+ },\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/pages/Timeline.test.tsx:189:37\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": "to",
"owner": "ui/src/pages/Timeline.tsx",
"sourceSha256": "32dd72ff0b295bf23863f438a1be2b0262f039ea4e86b20c0e8df12abc5fb703",
"title": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"mutation": {
"before": " ...params,",
"after": " ...params,\n to: 123,",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "21260048ec34af7eda86634ddd81d75077b8e8cbaa7b8fd54406a59de8ac2d7c",
"logSha256": "3100577ba46ffe7b80de31995086231d60745954b26e5e95cab0462b7925f4bf",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "8c49b367f7089b044ea8084ec2c03f7896402544b0d1f917601d941b000c4355",
"logSha256": "e00c810574b08bb023ddb25751e81a0320b013ea8bd6b9a25f4b56406a246ccb",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'company-1', \u2026(2) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n \"company-1\",\n- ObjectContaining {\n- \"from\": Any<String>,\n- \"to\": Any<String>,\n+ {\n+ \"from\": \"2026-10-06T05:00:00.000Z\",\n+ \"limit\": 500,\n+ \"offset\": 0,\n+ \"to\": 123,\n },\n {\n- \"signal\": Any<AbortSignal>,\n+ \"signal\": AbortSignal {\n+ Symbol(kEvents): Map {},\n+ Symbol(events.maxEventTargetListeners): 0,\n+ Symbol(events.maxEventTargetListenersWarned): false,\n+ Symbol(kHandlers): Map {},\n+ Symbol(kAborted): false,\n+ Symbol(kReason): undefined,\n+ Symbol(kComposite): false,\n+ },\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/pages/Timeline.test.tsx:189:37\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": "signal",
"owner": "ui/src/pages/Timeline.tsx",
"sourceSha256": "32dd72ff0b295bf23863f438a1be2b0262f039ea4e86b20c0e8df12abc5fb703",
"title": "renders range controls plus icon zoom controls without the user lens selector or visible-duration readout",
"mutation": {
"before": " }, { signal });",
"after": " }, { signal: undefined });",
"replacementCount": 1,
"additionalPreClosingTagReplacement": false
},
"intendedGuard": "expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(",
"restoredByteForByte": true,
"positive": {
"exit": 0,
"jsonSha256": "f7137b440fa63b4b7dfcaa7d733a6836389ff6a3385d768021dcd9cd4a600961",
"logSha256": "74011dd8441e744c01a605d359e1f714fef60505e180f010bd7a364962ff038b",
"caseStatus": "passed"
},
"negative": {
"exit": 1,
"jsonSha256": "e52b536a50fd6fd1dfa8aeb0a71411e67277be3003911be7e592a3d70657c7c7",
"logSha256": "e8be8243f0804bb96128cc9b62c55658309267c156cf0bc238081d317f1f3eb5",
"caseStatus": "failed",
"intendedFailureMessages": [
"AssertionError: expected \"vi.fn()\" to be called with arguments: [ 'company-1', \u2026(2) ]\n\nReceived:\n\n 1st vi.fn() call:\n\n [\n \"company-1\",\n- ObjectContaining {\n- \"from\": Any<String>,\n- \"to\": Any<String>,\n+ {\n+ \"from\": \"2026-10-06T05:00:00.000Z\",\n+ \"limit\": 500,\n+ \"offset\": 0,\n+ \"to\": \"2026-10-13T04:59:59.999Z\",\n },\n {\n- \"signal\": Any<AbortSignal>,\n+ \"signal\": undefined,\n },\n ]\n\n\nNumber of calls: 1\n\n at Proxy.<anonymous> (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.<anonymous> (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/pages/Timeline.test.tsx:189:37\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-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,
"postControlPolish": {
"controlCandidateSha256": "e5f6171e4fa9998e4bf14edad445701c5ae003f401875e7fcf278546e3f9cdf7",
"polishedCandidateSha256": "8d5909b8aaf4d5d882d2fd1bc9072a2e8bb7fce9c98466ca15a6382e279ec9a7",
"difference": "Remove extra blank line before describe closes",
"allIntendedGuardStatementsAndLocationsUnchanged": true,
"completePolishedFileReplayPassed": true
}
}
@@ -0,0 +1,40 @@
# Test audit, Round 7 UI — Timeline default render follow-up
This isolated follow-up removes **2 registered executions, 2 root renders and 26 net test lines** from `ui/src/pages/Timeline.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 |
|---|---|---|
| `requests the collapsed app sidebar by default` | `renders range controls plus icon zoom controls without the user lens selector or visible-duration readout` | expect(container.querySelector('[data-testid="request-collapsed-sidebar"]')).not.toBeNull(); |
| `requests the company timeline without a user lens parameter` | `renders range controls plus icon zoom controls without the user lens selector or visible-duration readout` | expect(mockWorkTimelineApi.get).toHaveBeenCalledWith( "company-1", expect.objectContaining({ from: expect.any(String), to: expect.any(String), }), { signal: expect.any(AbortSignal) }, );; expect(mockWorkTimelineApi.get.mock.calls[0]?.[1]).not.toHaveProperty("userId"); |
Timeline.tsx calls loadTimelineWindow with the selected company, computed date window and AbortSignal. The default unembedded render requests RequestCollapsedSidebar. All three paired cases use the same emptyTimeline beforeEach result, company context, blank URL search, fresh query client, render and flush. Sidebar-request and complete API argument/no-userId guards move after existing controls assertions. Populated stats, pagination, clipping, overlap and project scope remain distinct.
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 | 9 | 9 | 0 | 0 |
| Candidate | 7 | 7 | 0 | 0 |
From `ui/`: `pnpm exec vitest run src/pages/Timeline.test.tsx`.
All 6 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 |
|---|---|
| collapsed | `expect(container.querySelector('[data-testid="request-collapsed-sidebar"]')).not.toBeNull()` |
| userId | `expect(mockWorkTimelineApi.get.mock.calls[0]?.[1]).not.toHaveProperty("userId")` |
| company | `expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(` |
| from | `expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(` |
| to | `expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(` |
| signal | `expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(` |
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-timeline-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.
The mutation controls preceded the final blank-line cleanup. Exact byte reconstruction confirms that every intended migrated guard and its source location stayed unchanged; the final polished complete file passed again. The controls JSON records both candidate hashes.
@@ -0,0 +1,139 @@
{
"audit": {
"file": "ui/src/components/task-chat/transcript-adapter.test.ts",
"base": "51dc1eb69f5c52d6ef0e29cd2e4061da6c88871f",
"originalSha256": "a4b107fd4a12ee5acf55ee2a6aabcf1f8d7f26202b8adf2c533d1929a39be1ef",
"candidateSha256": "f79f72eb7d5f43e26fb0ac9f614887786dabea6f82af12e64446aba5fa54e03c",
"allOtherProgramAstUnchanged": true,
"allOtherSourceBytesUnchanged": true,
"formattingOnlyCleanup": "Remove one extra blank line before the enclosing describe closes",
"newHelpers": 0,
"registeredInvocationsRemoved": 2,
"parserCallsRemoved": 2,
"netTestLinesRemoved": 15,
"migrations": [
{
"retired": "marks only the message still open at the tail as streaming",
"keeper": "tags agent messages streamed inside a live run turn as interstitial",
"parserInputsAndFilterEqual": true,
"originalKindGuardRetained": true,
"exactMigratedStatements": [
"if (messages[0].kind !== \"message\" || messages[1].kind !== \"message\")\n return;",
"expect(messages[0].streaming).toBe(false);",
"expect(messages[1].streaming).toBe(true);"
],
"registeredInvocationsRemoved": 1,
"parserCallsRemoved": 1
},
{
"retired": "stamps atMs from the first streamed chunk",
"keeper": "tags settled-history messages interstitial too, so live and history agree",
"parserInputsAndFilterEqual": true,
"originalKindGuardRetained": true,
"exactMigratedStatements": [
"if (messages[0].kind !== \"message\" || messages[1].kind !== \"message\")\n return;",
"expect(messages[0].atMs).toBe(Date.parse(TS));",
"expect(messages[1].atMs).toBe(Date.parse(\"2026-07-31T12:00:05.000Z\"));"
],
"registeredInvocationsRemoved": 1,
"parserCallsRemoved": 1
}
]
},
"verifierSha256": "421f9dbbf4e63e1ed307279704a1be2918526bc35109fa15adc88d06668d0c58",
"runs": [
{
"kind": "baseline",
"jsonSha256": "2bc04c1382a274652a867e74fd7916721419e325e76c4c364757538a85d35300",
"total": 105,
"passed": 105,
"failed": 0,
"skipped": 0
},
{
"kind": "candidate",
"jsonSha256": "1a7f58af351f003c24491660580c7565fcb6f46203ec641837c06cf39ced9f14",
"total": 103,
"passed": 103,
"failed": 0,
"skipped": 0
}
],
"mutations": [
{
"slug": "transcript-non-tail-reset",
"owner": "ui/src/components/task-chat/transcript-adapter.ts",
"title": "tags agent messages streamed inside a live run turn as interstitial",
"sourceSha": "b1895fa6038b65e4d7fab3773dc1ea83ec1a35892d1b001142b14b275e7b1ae1",
"replacements": 1,
"mutation": {
"before": "if (it.kind === \"message\" && idx !== messageIndex) it.streaming = false;",
"after": "if (it.kind === \"message\" && idx !== messageIndex) it.streaming = true;"
},
"restoredByteForByte": true,
"positive": {
"exit": 0,
"caseStatus": "passed",
"jsonSha256": "298db52c7b3cd9636c1dfcc50b403e278bdd35a3e8f72156973bb77b9e1c294f",
"logSha256": "8ab8ab05ce7559f4de16ffd01ed68c7ce0aa847401f129bcea8bf449cc2ac206"
},
"negative": {
"exit": 1,
"caseStatus": "failed",
"intendedAssertionFailure": "AssertionError: expected true to be false // Object.is equality",
"jsonSha256": "bc2ffc949c5982f6975a48356631cf044f272950a6567815895e6b312a48dca0",
"logSha256": "1eff4e160b2a4237619c4849d5c6896fc8d627ce24c72b18393328aff9d22b4f"
}
},
{
"slug": "transcript-message-timestamp",
"owner": "ui/src/components/task-chat/transcript-adapter.ts",
"title": "tags settled-history messages interstitial too, so live and history agree",
"sourceSha": "b1895fa6038b65e4d7fab3773dc1ea83ec1a35892d1b001142b14b275e7b1ae1",
"replacements": 1,
"mutation": {
"before": "atMs: Number.isFinite(atMs) ? atMs : undefined,",
"after": "atMs: Number.isFinite(atMs) ? atMs + 1 : undefined,"
},
"restoredByteForByte": true,
"positive": {
"exit": 0,
"caseStatus": "passed",
"jsonSha256": "03eadad261cf00b8294cffe69d300e521c370d5e939c8cfd585c38c55b90ea25",
"logSha256": "ff2883bd26a884dacfafb56fa698259aa6023d2526ee3d982ddffc2c6a50d1de"
},
"negative": {
"exit": 1,
"caseStatus": "failed",
"intendedAssertionFailure": "AssertionError: expected 1785499200001 to be 1785499200000 // Object.is equality",
"jsonSha256": "cff42697f265879a73202f701d39fac703788a5bf26ebe236e47e943227a101b",
"logSha256": "4736d9727f5398ac9009afd0498ad19529009d7d4eee639743f40b875f9e3103"
}
}
],
"allProductionOwnerBytesRestored": true,
"productionLinesChanged": 0,
"priorUiProofUnchanged": {
"commit": "51dc1eb69f5c52d6ef0e29cd2e4061da6c88871f",
"files": {
"doc/plans/2026-10-12-test-audit-r7-ui.md": "896b9928af85a4c7d588dfca93484980aadb238bd79d8142e671c62f0b191fa8",
"doc/plans/2026-10-12-test-audit-r7-ui-controls.json": "0d445f6f066032f2d9cd724525a8d7d2290246cbfeee1f6ab4b44818467af2a7",
"doc/plans/2026-10-12-test-audit-r7-ui-appdetail.md": "715f23cd27502c92d0f5d1b83b91bcac03f254c73ab63b44181ae76939805229",
"doc/plans/2026-10-12-test-audit-r7-ui-appdetail-controls.json": "7906fde0d62e14a7511b5cf45f864c9386a4c377922333eefc7f7e703c832f6a"
}
},
"discardedAttempt": "Initial candidate clipped the suite-closing statement and failed to parse; regenerated from baseline before accepted full-file run. No result from that attempt counts as proof.",
"ciInclusion": "@paperclipai/ui project in general-workspaces-a; complete file remains included; no routing changes",
"combinedNetTestLinesRemoved": 386,
"combinedRegisteredInvocationsRemoved": 4,
"combinedCompleteFileBaselineCases": 333,
"combinedCompleteFileCandidateCases": 329,
"finalPolishedSourceRun": {
"candidateSha256": "f79f72eb7d5f43e26fb0ac9f614887786dabea6f82af12e64446aba5fa54e03c",
"jsonSha256": "1cdd87edeed3e2801bcb6aeaab417ae87452bced5daf8f3436ac52bc1ded9aef",
"total": 103,
"passed": 103,
"failed": 0,
"skipped": 0
}
}
@@ -0,0 +1,40 @@
# Test audit, Round 7 UI — transcript follow-up
This follow-up removes **two duplicate registered invocations, two parser calls, and 15 net test lines (14 from the migrations and one blank-line cleanup)** from `ui/src/components/task-chat/transcript-adapter.test.ts`. It adds no helper and changes zero production lines. Combined with the [first UI batch](2026-10-12-test-audit-r7-ui.md) and [AppDetail migration](2026-10-12-test-audit-r7-ui-appdetail.md), the branch removes **386 net test lines and four registered invocations**. Helper cleanup accounts for 320 lines; the three retirement/migration batches account for 65, with one additional blank-line cleanup. No wall-time or CI-speed claim is made.
The transcript audit base is `51dc1eb69f5c52d6ef0e29cd2e4061da6c88871f`. This file still has its original Round 6 parent bytes at that base. Prior UI tests and reports remain unchanged.
## Exact migrations
| Retired registration | Retained keeper | Exact observations carried |
|---|---|---|
| `marks only the message still open at the tail as streaming` | `tags agent messages streamed inside a live run turn as interstitial` | Original kind-narrowing guard, first message streaming=false, tail message streaming=true. |
| `stamps atMs from the first streamed chunk` | `tags settled-history messages interstitial too, so live and history agree` | Original kind-narrowing guard, first timestamp Date.parse(TS), second timestamp Date.parse("2026-07-31T12:00:05.000Z"). |
Within each pair, the stream array, runId, running state, parser call and message-filter predicate match exactly. The live retired case uses an intermediate items variable; its parser expression and subsequent filter match the keeper's direct chain. Both scopes resolve stream to the same enclosing constant. The settled pair already uses the same direct chain. No hooks, mocks or producer state differ between paired cases. Existing keeper length and interstitial/settled-streaming assertions remain.
Live running=true and settled running=false remain distinct. **`marks no message streaming when the tail is a tool call` remains byte-identical.** Every other case remains byte-identical, including saved plans, final replies, provider activity, native response-wake authority, thinking state, tool identity, usage, grouping and timeline boundaries.
TaskChatThread calls the actual transcript parser and settledRunChildren for its run segments. The parser assigns each message timestamp from its first transcript entry and resets non-tail streaming state after the full input. The owner is `ui/src/components/task-chat/transcript-adapter.ts`. The complete suite remains included in `@paperclipai/ui` / `general-workspaces-a`; no CI routing or skip policy changes.
## Evidence
| Complete transcript file | Registered cases | Passed | Failed | Skipped |
|---|---:|---:|---:|---:|
| Baseline | 105 | 105 | 0 | 0 |
| Candidate | 103 | 103 | 0 | 0 |
Run from `ui/`: `pnpm exec vitest run src/components/task-chat/transcript-adapter.test.ts`.
The audit checks parser inputs and filter ASTs, inserts the original three statements from each retired body, and compares the entire candidate/original program outside those declared migrations. It also reconstructs candidate text from exactly the two removals and two insertions, requiring byte equality. All other source bytes stay unchanged outside the declared blank-line cleanup before the enclosing describe closes. The initial edit clipped the enclosing suite boundary and failed to parse; the temporary codemod was corrected and the candidate regenerated from pinned source before the accepted run. That attempt supplies no passing evidence.
Both positive keeper controls passed. Both deliberate production regressions failed at the intended migrated assertion:
| Regression | Intended failure |
|---|---|
| Leave completed non-tail messages streaming | Live keeper expected false and received true for messages[0].streaming. |
| Shift parsed message timestamps by one millisecond | Settled keeper expected 1785499200000 and received 1785499200001 for messages[0].atMs. |
Neither control failed on setup, timeout or a different assertion. The production owner was restored byte for byte after each mutation and matched pinned Git bytes. Name-filtered controls select one keeper; unselected cases are not full-suite evidence.
[Transcript controls](2026-10-12-test-audit-r7-ui-transcript-controls.json) retain the exact source hashes, body-audit digest, migration map, complete-file counts, mutation descriptions, intended failures, run/log digests, prior proof hashes and byte-restoration receipts. Temporary raw verifiers/logs are identified by digests but not preserved in full. Across the three separate baseline/candidate packets, all thirteen complete files total 333 baseline cases and 329 candidate cases. After removing one extra blank line, a final complete-file replay passed all 103 cases on the polished source bytes. A delivery-head combined replay remains separate PR evidence.
+74
View File
@@ -0,0 +1,74 @@
# Test audit, Round 7 UI — preservation report
This UI batch removes **364 net test lines and one registered invocation** from three files. It changes **zero production lines**. Of the 364 lines, 320 come from helper cleanup and 44 from retiring the duplicate after its fixture/assertion migration. The helper cleanup reduces maintenance code; it makes no wall-time or CI-speed claim. The one retired invocation avoids one duplicate rendered roster scenario.
The branch starts at pinned parent `e868e6645ce0d598d756d3458f0b3d71afd6db4a`, the head of [Round 6, PR #16047](https://github.com/paperclipai/paperclip/pull/16047). It follows OpenClaw's [test-audit skill](https://github.com/openclaw/openclaw/blob/main/.agents/skills/test-audit/SKILL.md) and [campaign process](https://github.com/openclaw/openclaw/blob/main/.agents/skills/test-audit/CAMPAIGN.md). All ten Round 6 test files were excluded. Prior cleanup remains in the parent history.
## Scope and cost
| File | Net test lines removed | Source helper calls expanded | Registered invocations removed |
|---|---:|---:|---:|
| `ui/src/pages/InviteLanding.test.tsx` | 132 | 18 | 0 |
| `ui/src/pages/Agents.test.tsx` | 136 | 16 | 1 |
| `ui/src/components/Layout.test.tsx` | 96 | 26 | 0 |
| Total | 364 | 60 | 1 |
Each helper contains one synchronous `root.render` statement. It creates the same complete JSX subtree on each call. The invitation helper also creates a fresh initial-route array. Helpers accept the existing root and query client. They create no root or query client, add no await, and contain no assertion. The roster helper retains QueryClientProvider → ToastProvider → Agents. The distinct table render of production and streamlined AgentList remains inline. Every original outer `act`, flush, timer, input, assertion, cleanup and provider order remains, outside the single declared migration below.
The audit read the actual invitation, roster and shell owners, their App routes, production-shell/roster counterparts, current tests and source history. It inspected analogous invitation-access, shell-route, company-selection, sidebar, plugin-overlay and roster surfaces. Permission gates, membership/account cache checks, keyboard/hover controls, accessibility, pending state and routing cases retain their own registrations.
## Exact retirement and keeper
Retired: Agents `uses the built-in agents route segment as the built-in filter`.
Keeper: Agents `shows and filters built-in agents when the experimental flag is enabled`.
Both cases came from commit `8b6a06ee254` and use `/agents/builtin`, the enabled built-in flag, and the same built-in and regular agent/org rows. The keeper now copies the retired case's exact setup, including the populated BuiltInAgentState.agent pointing to the same built-in object as the agent list. It also carries the retired `1 agent` assertion. Its original checks remain: company-scoped built-in API request, Built-in tab text, included built-in name, excluded regular name, absent old badge, and no redirect to the all-agents route.
The former keeper's null nested agent fixture does not supply a separate ready/list behavior: the actual roster uses entry.agentId and entry.status on that path. The setup modal is not mounted for a ready entry. Copying the retired populated fixture preserves the stronger keeper's observations while retaining every retired observation. Other built-in enable/disable and production-versus-streamlined registrations remain.
No other case retires. In particular, invitation error presentation remains distinct from its accessibility guard and membership/cache timing cases. Layout route variants retain all original parameter rows and loop iterations. Roster environment-loading, single-environment, disabled-feature and fallback-provider cases remain separate.
## Complete-file evidence
| Run | Complete files | Passed cases | Failures | Skips |
|---|---:|---:|---:|---:|
| Original changed owners | 3 | 71 | 0 | 0 |
| Original owner siblings | 8 | 79 | 0 | 0 |
| Candidate changed owners | 3 | 70 | 0 | 0 |
| Final candidate owners and siblings | 11 | 149 | 0 | 0 |
The original total is 150, compared with candidate 149. These are actual Vitest registrations, including table rows. The sixty helper counts are source call expansions, not retired executions. Complete-file runs have no name filter. Separate name-filtered mutation controls intentionally select one keeper and do not count their unselected cases as complete-suite proof.
Commands run from `ui/` use `pnpm exec vitest run` followed by the complete file paths. Changed-owner paths are `src/pages/InviteLanding.test.tsx`, `src/pages/Agents.test.tsx` and `src/components/Layout.test.tsx`. Siblings are SidebarAgents, ActiveAgentsPanel, access/InvitesSection, useCompanyInviteAccess, shell-navigation, company-selection, PluginAppShellOverlays and SidebarShell.
Dependencies were installed offline with the frozen lockfile in this checkout. Initial dependency-link exploration and two startup-error attempts were discarded; none counts as baseline proof. Accepted runs use this checkout's workspace packages.
## Expansion and intended regressions
The verifier expands the actual helper bodies at all sixty call sites, then compares complete original and candidate ASTs. They match outside removal of the named duplicate, its exact setup migration, and insertion of its count assertion into the keeper. Location/comment/raw-format metadata and whitespace-only JSX text are ignored; executable values and statement order are retained. Root/client argument names are checked at each call. Independent review also checks lexical binding, provider nesting and fresh JSX/route values; AST substitution alone does not establish binding correctness.
All three positive keeper controls passed. All deliberate production regressions failed at the intended retained assertion:
| Mutation | Intended failing keeper observation |
|---|---|
| Return all agents from the built-in filter | Migrated `1 agent` count guard. |
| Omit actual invite auth aria-invalid state | Email input's fixed `aria-invalid === "true"` guard. |
| Bypass the settings sidebar branch | Visible Company settings sidebar guard. |
These failures are direct assertions, not timeout/setup/worker errors. Each owner was restored byte for byte and checked against the pinned Git source. The final diff has no production changes. Mutation controls use fixed literal expected values from the original tests; helpers supply no oracle.
## Provenance and limits
[Controls JSON](2026-10-12-test-audit-r7-ui-controls.json) records exact original/candidate source hashes, all sixty expansion counts, the retirement map, decisions for all 71 original owner registrations, complete-file results, intended failures, raw-run digests, and source-restoration receipts. Raw expansion scripts and logs were temporary audit packets. Digests identify them but do not preserve their full payloads.
The required token gate and diff whitespace check passed. Workspace typecheck/build, broad default tests and latest-head CI/Greptile status belong in the PR so this preservation report does not confuse focused proof with whole-workspace success. No tests, workflow, dependency, production, retry, timeout or skip policy was weakened to make checks pass.
## Integration with current master
During replay after #16047 landed, the retired Priority-filter case had gained
three assertions for the agent-created-task checkbox. Those assertions moved
to the retained same-input grid/render case, which already enables that filter.
The label and initial unchecked state remain covered; no new contract is removed.
Fresh PR CI validates the integrated source. Historical controls above remain
evidence for their recorded revisions.
@@ -974,6 +974,8 @@ describe("AgentConfigForm environment selector", () => {
]);
roots.push(result.root);
expect(result.container.textContent).not.toContain("Secret access");
expect(result.container.textContent).not.toContain("Environment override");
expect(result.container.querySelector('[aria-label="Environment override"]')).toBeNull();
});
@@ -1067,15 +1069,6 @@ describe("AgentConfigForm environment selector", () => {
expect(existing.onSave).not.toHaveBeenCalled();
});
it("keeps secret access out of the main Configuration content", async () => {
const result = await renderForm([
makeEnvironment({ id: "local-1", name: "Local", driver: "local" }),
]);
roots.push(result.root);
expect(result.container.textContent).not.toContain("Secret access");
});
it("renders secret access as dedicated form content", async () => {
const result = await renderForm(
[makeEnvironment({ id: "local-1", name: "Local", driver: "local" })],
@@ -1704,21 +1697,6 @@ describe("AgentConfigForm environment selector", () => {
expect(findButton(result.container, "Sign in")).toBeFalsy();
});
it("starts a login session for the effective sandbox and shows the code and the authentication URL", async () => {
mockAgentsApi.testEnvironment.mockResolvedValue(AUTH_MISSING_RESULT);
const result = await renderCodexSandbox();
roots.push(result.root);
await runTest(result.container);
await startLogin(result.container);
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");
});
it("shows the loading state while the session starts and the prompt is not ready", async () => {
mockAgentsApi.testEnvironment.mockResolvedValue(AUTH_MISSING_RESULT);
mockAgentsApi.getAdapterAuthLoginStatus.mockResolvedValue({
@@ -1817,6 +1795,12 @@ describe("AgentConfigForm environment selector", () => {
await runTest(result.container);
await startLogin(result.container);
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");
// The Cancel button appears while the session is active.
expect(findButton(result.container, "Cancel")).toBeTruthy();
@@ -2558,31 +2542,6 @@ describe("AgentConfigForm environment selector", () => {
expect(findButton(result.container, "Sign in")).toBeFalsy();
});
it("shows the authorization URL and a browser-code input for a Claude sandbox", async () => {
mockAgentsApi.testEnvironment.mockResolvedValue(CLAUDE_AUTH_MISSING_RESULT);
const result = await renderClaudeSandbox();
roots.push(result.root);
await runTest(result.container);
await startLogin(result.container);
await flushUntil(() =>
(result.container.textContent ?? "").includes("https://claude.example.test/authorize"),
);
expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith("company-1", {
environmentId: "sandbox-1",
});
// The panel shows the authorization URL and a browser-code input. It never
// shows a server-displayed code.
expect(result.container.textContent).toContain("https://claude.example.test/authorize");
expect(
result.container.querySelector('input[aria-label="Browser code"]'),
).toBeTruthy();
// The default prompt carries no advisory: a confidential transport. So the
// panel shows no disclaimer.
expect(result.container.textContent).not.toContain("not encrypted");
});
it("shows a non-blocking disclaimer when the transport advisory is present", async () => {
mockAgentsApi.testEnvironment.mockResolvedValue(CLAUDE_AUTH_MISSING_RESULT);
// The guarded prompt read reports a non-confidential transport. The server
@@ -3017,6 +2976,19 @@ describe("AgentConfigForm environment selector", () => {
(result.container.textContent ?? "").includes("https://claude.example.test/authorize"),
);
expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledWith("company-1", {
environmentId: "sandbox-1",
});
// The panel shows the authorization URL and a browser-code input. It never
// shows a server-displayed code.
expect(result.container.textContent).toContain("https://claude.example.test/authorize");
expect(
result.container.querySelector('input[aria-label="Browser code"]'),
).toBeTruthy();
// The default prompt carries no advisory: a confidential transport. So the
// panel shows no disclaimer.
expect(result.container.textContent).not.toContain("not encrypted");
expect(findButton(result.container, "Cancel")).toBeTruthy();
await clickByText(result.container, "Cancel");
@@ -3820,6 +3792,9 @@ describe("AgentConfigForm managed-sandbox-only host surfaces", () => {
});
await flushReact();
const labels = fieldLabels(result.container);
expect(labels).toContain("ACP session mode");
expect(labels).toContain("ACP non-interactive permissions");
expect(labels).not.toContain("Working directory (deprecated)");
expect(labels).not.toContain("Command");
expect(labels).not.toContain("Execution engine");
@@ -3831,25 +3806,6 @@ describe("AgentConfigForm managed-sandbox-only host surfaces", () => {
expect(result.container.textContent).not.toContain("/srv/agents/cody");
});
it("keeps the non-path ACP controls visible when the policy hides the engine choice", async () => {
setManagedSandboxOnly(true);
const result = await renderForm(
[makeEnvironment({ id: "managed-1", name: "Managed", driver: "sandbox", config: { provider: "daytona" } })],
{ adapterType: "claude_local", adapterConfig: MANAGED_AGENT_CONFIG },
);
roots.push(result.root);
await act(async () => {
for (const button of result.container.querySelectorAll("button")) {
if (["Advanced", "Advanced Run Policy"].includes(button.textContent?.trim() ?? "")) button.click();
}
});
await flushReact();
const labels = fieldLabels(result.container);
expect(labels).toContain("ACP session mode");
expect(labels).toContain("ACP non-interactive permissions");
});
it("keeps the host-path fields hidden while the policy is still loading", async () => {
// A cold cache resolves the policy to false on the first render. The gate
// fails closed so a managed instance never flashes a stored host path.
+3 -23
View File
@@ -50,6 +50,9 @@ describe("AppErrorBoundary", () => {
);
});
expect(container.textContent).toContain("Paperclip hit an error");
expect(container.textContent).toContain("Maximum update depth exceeded");
expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1);
expect(captureBrowserExceptionMock).toHaveBeenCalledWith(expect.any(Error), {
boundary: "app", componentStack: expect.stringContaining("BoomRender"),
@@ -65,29 +68,6 @@ describe("AppErrorBoundary", () => {
});
});
it("renders a reload prompt instead of a blank page when the shell throws in render", () => {
const root = createRoot(container);
act(() => {
root.render(
<AppErrorBoundary>
<BoomRender />
</AppErrorBoundary>,
);
});
expect(container.textContent).toContain("Paperclip hit an error");
expect(container.textContent).toContain("Maximum update depth exceeded");
expect(
Array.from(container.querySelectorAll("button")).some(
(button) => button.textContent === "Reload page",
),
).toBe(true);
act(() => {
root.unmount();
});
});
it("catches errors thrown from effects, not just render", () => {
const root = createRoot(container);
act(() => {
+3 -18
View File
@@ -207,24 +207,6 @@ describe("InlineEditor", () => {
});
});
it("marks multiline preview textboxes as multiline", () => {
const onSave = vi.fn().mockResolvedValue(undefined);
const root = createRoot(container);
act(() => {
root.render(<InlineEditor value="Hello world" multiline onSave={onSave} />);
});
const preview = container.querySelector<HTMLElement>('[role="textbox"]');
expect(preview).not.toBeNull();
expect(preview?.getAttribute("aria-multiline")).toBe("true");
expect(preview?.tabIndex).toBe(0);
act(() => {
root.unmount();
});
});
it("enters multiline edit mode from the keyboard preview surface", () => {
const onSave = vi.fn().mockResolvedValue(undefined);
const root = createRoot(container);
@@ -236,6 +218,9 @@ describe("InlineEditor", () => {
const preview = container.querySelector<HTMLElement>('[role="textbox"]');
expect(preview).not.toBeNull();
expect(preview?.getAttribute("aria-multiline")).toBe("true");
expect(preview?.tabIndex).toBe(0);
act(() => {
preview!.dispatchEvent(new KeyboardEvent("keydown", { bubbles: true, key: "Enter" }));
});
@@ -180,33 +180,6 @@ describe("IssueAttachmentsSection", () => {
expect(fetchSpy).not.toHaveBeenCalled();
});
it("renders video attachments through the same player used for artifact outputs", async () => {
const attachment = makeAttachment({
id: "video-attachment",
originalFilename: "demo.webm",
contentType: "video/webm",
contentPath: "/api/attachments/video-attachment/content",
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<IssueAttachmentsSection
attachments={[attachment]}
onDelete={vi.fn()}
onImageClick={vi.fn()}
/>
</QueryClientProvider>,
);
});
await flushReact();
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();
});
it("lets video attachments open the shared media gallery", async () => {
const attachment = makeAttachment({
id: "video-attachment",
@@ -229,6 +202,11 @@ describe("IssueAttachmentsSection", () => {
});
await flushReact();
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();
const browse = container.querySelector<HTMLButtonElement>(
'button[aria-label="Browse demo.webm in gallery"]',
);
@@ -1210,56 +1210,6 @@ describe("IssueChatThread", () => {
// PAP-12003: initial page load must not jump to the latest comment. If a
// user wants the newest message, the explicit Jump to latest control owns it.
it("does not auto-scroll to the latest comment on initial load", () => {
vi.useFakeTimers();
container.remove();
const scrollHost = document.createElement("main");
scrollHost.id = "main-content";
scrollHost.style.overflowY = "auto";
scrollHost.style.overflow = "auto";
scrollHost.style.height = "640px";
document.body.appendChild(scrollHost);
container = document.createElement("div");
scrollHost.appendChild(container);
const elementScrollToMock = vi.fn();
scrollHost.scrollTo =
elementScrollToMock as unknown as typeof scrollHost.scrollTo;
const originalScrollIntoView = Element.prototype.scrollIntoView;
const scrollIntoViewMock = vi.fn();
Element.prototype.scrollIntoView =
scrollIntoViewMock as unknown as typeof Element.prototype.scrollIntoView;
const root = createRoot(container);
act(() => {
renderIssueThread(root, {
comments: issueChatLongThreadComments,
linkedRuns: issueChatLongThreadLinkedRuns,
timelineEvents: issueChatLongThreadEvents,
agentMap: issueChatLongThreadAgentMap,
currentUserId: "user-board",
transcriptsByRunId: issueChatLongThreadTranscriptsByRunId,
hasOutputForRun: (runId) =>
issueChatLongThreadTranscriptsByRunId.has(runId),
});
});
// No jump click: initial render should preserve the page position.
act(() => {
vi.advanceTimersByTime(500);
});
expect(elementScrollToMock).not.toHaveBeenCalled();
expect(scrollIntoViewMock).not.toHaveBeenCalled();
Element.prototype.scrollIntoView = originalScrollIntoView;
act(() => {
root.unmount();
});
scrollHost.remove();
vi.useRealTimers();
});
it("can keep the page at the top on initial load while preserving manual jump-to-latest", () => {
vi.useFakeTimers();
container.remove();
+3 -25
View File
@@ -72,6 +72,9 @@ describe("IssueFiltersPopover", () => {
const popoverContent = container.querySelector("[data-testid='popover-content']");
expect(popoverContent).not.toBeNull();
expect(popoverContent?.textContent).toContain("Status");
expect(popoverContent?.textContent).not.toContain("Priority");
expect(popoverContent?.querySelector('[data-filter-options="workspaces"]')).toBeNull();
expect(popoverContent?.textContent).not.toContain("Workspace");
expect(popoverContent?.className).toContain("overflow-y-auto");
@@ -83,31 +86,6 @@ describe("IssueFiltersPopover", () => {
);
expect(layoutGrid?.className).toContain("grid-cols-1");
expect(popoverContent?.textContent).toContain("Live runs only");
});
it("hides the Priority filter section while priority UI is off (PAP-411)", () => {
const root = createRoot(container);
act(() => {
root.render(
<IssueFiltersPopover
presentation="streamlined"
state={defaultIssueFilterState}
onChange={vi.fn()}
activeFilterCount={0}
agents={[{ id: "agent-1", name: "Agent One" }]}
projects={[{ id: "project-1", name: "Project One" }]}
labels={[{ id: "label-1", name: "Bug", color: "#ff0000" }]}
enableAgentCreatedVisibilityFilter
/>,
);
});
const popoverContent = container.querySelector("[data-testid='popover-content']");
expect(popoverContent).not.toBeNull();
// Status section still renders, Priority section is gated off (PAP-411).
expect(popoverContent?.textContent).toContain("Status");
expect(popoverContent?.textContent).not.toContain("Priority");
const creationToggle = Array.from(popoverContent?.querySelectorAll("label") ?? []).find((label) => label.textContent?.includes("show agent-created tasks"));
expect(creationToggle?.textContent).toBe("show agent-created tasks");
expect(creationToggle?.querySelector("input")?.checked).toBe(false);
+34 -130
View File
@@ -295,6 +295,14 @@ async function flushReact() {
});
}
function renderLayoutView(root: ReturnType<typeof createRoot>, queryClient: QueryClient) {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
}
describe("Layout", () => {
let container: HTMLDivElement;
@@ -346,11 +354,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -382,11 +386,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -426,11 +426,7 @@ describe("Layout", () => {
const renderLayout = async () => {
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
};
@@ -489,11 +485,7 @@ describe("Layout", () => {
defaultOptions: { queries: { retry: false } },
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
@@ -554,11 +546,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -589,11 +577,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -617,11 +601,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -656,11 +636,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -685,11 +661,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -711,11 +683,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -740,11 +708,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -768,11 +732,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -793,11 +753,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -822,11 +778,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -853,11 +805,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -880,11 +828,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -908,11 +852,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -937,11 +877,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -997,11 +933,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1030,11 +962,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1061,11 +989,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1113,11 +1037,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1169,11 +1089,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1236,11 +1152,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1308,11 +1220,7 @@ describe("Layout", () => {
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1334,11 +1242,7 @@ describe("Layout", () => {
defaultOptions: { queries: { retry: false } },
});
await act(async () => {
root.render(
<QueryClientProvider client={queryClient}>
<Layout />
</QueryClientProvider>,
);
renderLayoutView(root, queryClient);
});
await flushReact();
const rootEl = container.firstElementChild as HTMLElement;
@@ -293,15 +293,6 @@ describe("OnboardingWizard — which step it lands on", () => {
expect(currentStep()).toBe("agent");
});
it("opens on the agent step when the goals lookup fails outright", async () => {
routerState.pathname = "/PC1/onboarding";
mockGoalsApi.list.mockRejectedValue(new Error("goals unavailable"));
await render();
await settle();
expect(currentStep()).toBe("agent");
});
it("does not move an open wizard when a later refetch finds a mission", async () => {
// The defect this file exists for, in its current form. A refetch landing
// mid-flow used to flip the derived step from 2 to 3 and move the customer
+28 -84
View File
@@ -457,19 +457,6 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
await flushReact();
}
it("creates the organization on Continue and lands on the agent step, no mission", async () => {
mockCompaniesApi.create.mockResolvedValue({ id: "company-new", issuePrefix: "INI" });
const { root } = await openStepOne();
await clickByText((t) => t.startsWith("Continue"));
expect(mockCompaniesApi.create).toHaveBeenCalledWith({ name: "Initech" });
expect(document.body.textContent).toContain("Create your first agent");
expect(document.body.textContent).not.toContain("Define your mission");
expect(document.body.textContent).not.toContain("Tell us about your team");
await act(async () => root.unmount());
});
it("shows no environment-check card on the model step, and no Mission row on review", async () => {
// Round-3 walk feedback: the adapter environment check still runs —
// Connect probes before hiring and blocks on a fail — but its idle card
@@ -480,6 +467,10 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
mockCompaniesApi.create.mockResolvedValue({ id: "company-new", issuePrefix: "INI" });
const { root } = await openStepOne();
await clickByText((t) => t.startsWith("Continue"));
expect(mockCompaniesApi.create).toHaveBeenCalledWith({ name: "Initech" });
expect(document.body.textContent).not.toContain("Define your mission");
expect(document.body.textContent).not.toContain("Tell us about your team");
expect(document.body.textContent).toContain("Create your first agent");
// Step 3 → 4 needs an agent name — the one field the step has now.
@@ -1059,12 +1050,28 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
// Selecting the provider automatically verifies the saved subscription.
await flushReact();
expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();
const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];
const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };
expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual({
type: "user_secret_ref",
key: CLAUDE_OAUTH_TOKEN_ENV_KEY,
version: "latest",
required: true,
});
expect(mockAgentsApi.hire).toHaveBeenCalled();
const hireArgs = mockAgentsApi.hire.mock.calls.at(-1) as unknown[];
const hireBody = hireArgs[1] as {
adapterConfig: { env?: Record<string, unknown> };
applyStoredClaudeLogin?: boolean;
};
const binding = hireBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY] as
| { type: string }
| undefined;
expect(binding?.type).toBe("user_secret_ref");
expect(JSON.stringify(hireBody)).not.toContain("secretId");
expect(hireBody.applyStoredClaudeLogin).toBe(true);
expect(hireBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual({
type: "user_secret_ref",
@@ -1084,6 +1091,11 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
await clickByText((t) => isArcPrimary(t));
expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();
const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];
const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };
expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toBeUndefined();
expect(mockAgentsApi.hire).toHaveBeenCalled();
const hireArgs = mockAgentsApi.hire.mock.calls.at(-1) as unknown[];
const hireBody = hireArgs[1] as {
@@ -1124,68 +1136,6 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
await act(async () => root.unmount());
});
it("carries no token value in the hire payload", async () => {
mockAgentsApi.getClaudeOAuthTokenStatus.mockReset();
mockAgentsApi.getClaudeOAuthTokenStatus.mockResolvedValue({
secretId: "11111111-1111-1111-1111-111111111111",
latestVersion: 1,
});
const { root } = await openConnectStep();
// Selecting the provider automatically verifies the saved subscription.
await flushReact();
expect(mockAgentsApi.hire).toHaveBeenCalled();
const hireArgs = mockAgentsApi.hire.mock.calls.at(-1) as unknown[];
const hireBody = hireArgs[1] as { adapterConfig: { env?: Record<string, unknown> } };
const binding = hireBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY] as
| { type: string }
| undefined;
// A reference, never a value: no `value` field, no `secretId` field
// either — the fixed binding names the env var, not the status
// response's secret id.
expect(binding?.type).toBe("user_secret_ref");
expect(JSON.stringify(hireBody)).not.toContain("secretId");
await act(async () => root.unmount());
});
it("sends the fixed binding in the environment test request when the status route returns 200", async () => {
mockAgentsApi.getClaudeOAuthTokenStatus.mockReset();
mockAgentsApi.getClaudeOAuthTokenStatus.mockResolvedValue({
secretId: "11111111-1111-1111-1111-111111111111",
latestVersion: 1,
});
const { root } = await openConnectStep();
// Selecting the provider automatically verifies the saved subscription.
await flushReact();
expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();
const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];
const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };
expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toEqual({
type: "user_secret_ref",
key: CLAUDE_OAUTH_TOKEN_ENV_KEY,
version: "latest",
required: true,
});
await act(async () => root.unmount());
});
it("sends no binding in the environment test request when the status route returns 404", async () => {
// The default `beforeEach` mock already rejects with a 404 `ApiError`.
const { root, clickByText } = await openConnectStep();
await clickByText((t) => isArcPrimary(t));
expect(mockAgentsApi.testEnvironment).toHaveBeenCalled();
const testArgs = mockAgentsApi.testEnvironment.mock.calls.at(-1) as unknown[];
const testBody = testArgs[2] as { adapterConfig: { env?: Record<string, unknown> } };
expect(testBody.adapterConfig.env?.[CLAUDE_OAUTH_TOKEN_ENV_KEY]).toBeUndefined();
await act(async () => root.unmount());
});
it("hires when a stored login exists, even though a probe without the binding would warn adapter_auth_missing", async () => {
mockAgentsApi.getClaudeOAuthTokenStatus.mockReset();
mockAgentsApi.getClaudeOAuthTokenStatus.mockResolvedValue({
@@ -3004,6 +2954,9 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
const { root } = await openStep4({ adapterType: "claude_local" });
await pickSource(/Claude/);
expect(document.body.textContent).toContain("Sign in to Claude then come back and enter authorization code");
expect(document.body.textContent).not.toContain("Use saved login");
expect(mockAgentsApi.startClaudeSetupTokenLogin).toHaveBeenCalledTimes(1);
const back = [...document.body.querySelectorAll("button")].find((b) =>
@@ -3042,15 +2995,6 @@ describe("OnboardingWizard restore-gate (stale localStorage across accounts)", (
await act(async () => root.unmount());
});
it("renders no 'Use saved login' control", async () => {
mockAgentsApi.getAdapterAuthSignal.mockResolvedValue({ status: "absent" });
const { root } = await openStep4({ adapterType: "claude_local" });
await pickSource(/Claude/);
expect(document.body.textContent).toContain("Sign in to Claude then come back and enter authorization code");
expect(document.body.textContent).not.toContain("Use saved login");
await act(async () => root.unmount());
});
it("reads the signal again after an adapter change", async () => {
mockAdapterRegistry.list = [{ type: "claude_local" }, { type: "codex_local" }];
mockAgentsApi.getAdapterAuthSignal.mockResolvedValue({ status: "absent" });
+13 -44
View File
@@ -41,50 +41,6 @@ describe("RouteErrorBoundary", () => {
captureBrowserExceptionMock.mockClear();
});
it("reports one captured error and keeps the recovery button", () => {
const root = createRoot(container);
act(() => {
root.render(
<RouteErrorBoundary>
<Boom />
</RouteErrorBoundary>,
);
});
expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1);
expect(captureBrowserExceptionMock).toHaveBeenCalledWith(expect.any(Error), {
boundary: "route", componentStack: expect.stringContaining("Boom"),
});
expect(
Array.from(container.querySelectorAll("button")).some(
(button) => button.textContent === "Go back",
),
).toBe(true);
act(() => {
root.unmount();
});
});
it("renders a recoverable error card instead of a blank page when a child throws", () => {
const root = createRoot(container);
act(() => {
root.render(
<RouteErrorBoundary>
<Boom />
</RouteErrorBoundary>,
);
});
expect(container.textContent).toContain("This page hit an error");
expect(container.textContent).toContain("Maximum update depth exceeded");
expect(container.querySelector("pre")).not.toBeNull();
act(() => {
root.unmount();
});
});
it("navigates back when the user clicks Go back", () => {
const root = createRoot(container);
act(() => {
@@ -120,7 +76,20 @@ describe("RouteErrorBoundary", () => {
</RouteErrorBoundary>,
);
});
expect(captureBrowserExceptionMock).toHaveBeenCalledTimes(1);
expect(captureBrowserExceptionMock).toHaveBeenCalledWith(expect.any(Error), {
boundary: "route", componentStack: expect.stringContaining("Boom"),
});
expect(
Array.from(container.querySelectorAll("button")).some(
(button) => button.textContent === "Go back",
),
).toBe(true);
expect(container.textContent).toContain("This page hit an error");
expect(container.textContent).toContain("Maximum update depth exceeded");
expect(container.querySelector("pre")).not.toBeNull();
// Simulate back-navigation to a different route, then re-render with a
// healthy child — the boundary should reset off the new resetKey.
+5 -45
View File
@@ -267,6 +267,11 @@ describe("Sidebar", () => {
expect(navLabels).toContain("Projects");
expect(navLabels).toContain("Agents");
expect(container.textContent).not.toContain("Organization");
expect(container.textContent).not.toContain("Workspaces");
expect([...container.querySelectorAll("nav a")].map((a) => a.textContent?.trim())).not.toContain("Goals");
expect(container.querySelector('[data-testid="sidebar-goals-placeholder"]')).not.toBeNull();
expect(container.textContent).not.toContain("Conference Room");
expect(container.textContent).not.toContain("Pipelines");
flushSync(() => {
root.unmount();
@@ -464,17 +469,6 @@ describe("Sidebar", () => {
});
});
it("does not flash the Workspaces link while experimental settings are loading", async () => {
mockInstanceSettingsApi.getExperimental.mockImplementation(() => new Promise(() => {}));
const root = await renderSidebar();
expect(container.textContent).not.toContain("Workspaces");
flushSync(() => {
root.unmount();
});
});
it("does not poll attention until Decisions is enabled", async () => {
mockInstanceSettingsApi.getExperimental.mockResolvedValue({ enableDecisions: false });
const root = await renderSidebar();
@@ -549,18 +543,6 @@ describe("Sidebar", () => {
});
});
it("reserves the Goals nav slot while experimental settings are loading", async () => {
mockInstanceSettingsApi.getExperimental.mockImplementation(() => new Promise(() => {}));
const root = await renderSidebar();
expect([...container.querySelectorAll("nav a")].map((a) => a.textContent?.trim())).not.toContain("Goals");
expect(container.querySelector('[data-testid="sidebar-goals-placeholder"]')).not.toBeNull();
flushSync(() => {
root.unmount();
});
});
it("shows the Goals nav item when the experimental setting is enabled", async () => {
mockInstanceSettingsApi.getExperimental.mockResolvedValue({
enableIsolatedWorkspaces: false,
@@ -625,17 +607,6 @@ describe("Sidebar", () => {
});
});
it("does not flash the Conference Room item while experimental settings are loading (PAP-137)", async () => {
mockInstanceSettingsApi.getExperimental.mockImplementation(() => new Promise(() => {}));
const root = await renderSidebar();
expect(container.textContent).not.toContain("Conference Room");
flushSync(() => {
root.unmount();
});
});
it("hides the Pipelines nav item when pipelines are disabled", async () => {
mockInstanceSettingsApi.getExperimental.mockResolvedValue({
enableIsolatedWorkspaces: false,
@@ -685,17 +656,6 @@ describe("Sidebar", () => {
});
});
it("does not flash the Pipelines nav item while experimental settings are loading", async () => {
mockInstanceSettingsApi.getExperimental.mockImplementation(() => new Promise(() => {}));
const root = await renderSidebar();
expect(container.textContent).not.toContain("Pipelines");
flushSync(() => {
root.unmount();
});
});
it("shows the Workspaces link when isolated workspaces are enabled", async () => {
mockInstanceSettingsApi.getExperimental.mockResolvedValue({ enableIsolatedWorkspaces: true });
const root = await renderSidebar();
+13 -41
View File
@@ -248,47 +248,6 @@ describe("SidebarCompanyMenu", () => {
});
});
it("uses company-centric create copy without the chat flag", async () => {
const root = createRoot(container);
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
});
act(() => {
root.render(
<QueryClientProvider client={queryClient}>
<SidebarCompanyMenu />
</QueryClientProvider>,
);
});
await flushReact();
await flushReact();
const trigger = container.querySelector('button[aria-label="Open Acme Labs organization switcher"]');
expect(trigger).not.toBeNull();
expect(trigger?.classList).toContain("px-4");
expect(trigger?.classList).toContain("has-[>svg]:px-4");
expect(trigger?.classList).toContain("hover:bg-sidebar-accent");
expect(trigger?.classList).toContain("hover:text-sidebar-accent-foreground");
expect(trigger?.classList).toContain("dark:hover:bg-sidebar-accent");
expect(trigger?.classList).toContain("dark:hover:text-sidebar-accent-foreground");
expect(trigger?.classList).not.toContain("hover:bg-background");
expect(trigger?.classList).not.toContain("dark:hover:bg-background");
expect(trigger?.classList).not.toContain("dark:hover:bg-accent/50");
act(() => {
trigger?.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true, button: 0 }));
trigger?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
});
await flushReact();
expect(document.body.textContent).toContain("Create organization");
expect(document.body.textContent).not.toContain("Add company...");
act(() => {
root.unmount();
});
});
it("shows the requested company actions and signs out through the dropdown", async () => {
const root = createRoot(container);
const queryClient = new QueryClient({
@@ -467,12 +426,25 @@ describe("SidebarCompanyMenu", () => {
const trigger = container.querySelector('button[aria-label="Open Acme Labs organization switcher"]');
expect(trigger).not.toBeNull();
expect(trigger?.classList).toContain("px-4");
expect(trigger?.classList).toContain("has-[>svg]:px-4");
expect(trigger?.classList).toContain("hover:bg-sidebar-accent");
expect(trigger?.classList).toContain("hover:text-sidebar-accent-foreground");
expect(trigger?.classList).toContain("dark:hover:bg-sidebar-accent");
expect(trigger?.classList).toContain("dark:hover:text-sidebar-accent-foreground");
expect(trigger?.classList).not.toContain("hover:bg-background");
expect(trigger?.classList).not.toContain("dark:hover:bg-background");
expect(trigger?.classList).not.toContain("dark:hover:bg-accent/50");
act(() => {
trigger?.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true, button: 0 }));
trigger?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
});
await flushReact();
expect(document.body.textContent).toContain("Create organization");
expect(document.body.textContent).not.toContain("Add company...");
const editButton = Array.from(document.body.querySelectorAll("button"))
.find((element) => element.textContent === "Edit");
expect(editButton).toBeTruthy();
@@ -662,36 +662,6 @@ describe("EnvironmentVariablesEditor", () => {
expect(secretValueField?.value).toBe("supersecretvalue");
});
it("opens the create-secret popover from the picker's + Create item (§6.4, PAP-12476)", async () => {
// Regression: selecting the picker's `+ Create secret` item closes the
// combobox popover and (in the same tick) opens the anchored create-secret
// popover. The two Radix popovers must not race — the create popover has to
// survive the combobox's focus-return instead of being dismissed instantly.
render(
<EnvironmentVariablesEditor
value={{ GH: { type: "secret_ref", secretId: "s1", version: 2 } }}
secrets={secrets}
onChange={() => {}}
onCreateSecret={async () => secrets[0]}
/>,
);
const combobox = container.querySelector<HTMLElement>('[role="combobox"]')!;
combobox.focus();
await flush();
const createItem = [...document.querySelectorAll<HTMLElement>("[cmdk-item]")].find((el) =>
el.textContent?.includes("Create"),
);
expect(createItem, "create item should be present in the open picker").toBeTruthy();
createItem!.click();
await flush();
// The create-secret popover is open (heading rendered) and stays open.
expect(document.body.textContent, "create-secret popover should open").toContain("Create secret");
expect(
document.querySelector('input[aria-label="Secret name"]'),
"create-secret name field should render",
).toBeTruthy();
});
it("keeps the create-secret popover open when focus returns to a control inside the value cell (§6.4, PAP-12492)", async () => {
// Regression for the *fragile* part of the picker → create transition.
// The picker's combobox and the anchored create popover share the value
@@ -724,6 +694,11 @@ describe("EnvironmentVariablesEditor", () => {
await flush();
expect(document.body.textContent, "create-secret popover should open").toContain("Create secret");
expect(
document.querySelector('input[aria-label="Secret name"]'),
"create-secret name field should render",
).toBeTruthy();
// Simulate the picker's animation-delayed focus-return landing on a control
// that lives inside the value cell (the source-switch trigger is a stable
// in-anchor target that doesn't reopen the picker). Moving focus fires a
@@ -1715,14 +1715,6 @@ describe("interstitial self-talk classification (PAP-355)", () => {
if (m.kind !== "message") continue;
expect(m.interstitial).toBe(true);
}
});
it("marks only the message still open at the tail as streaming", () => {
const items = transcriptToTaskChatItems(stream, {
runId: "run-1",
running: true,
});
const messages = items.filter((it) => it.kind === "message");
if (messages[0].kind !== "message" || messages[1].kind !== "message")
return;
// The first message was closed by the tool call — finished self-talk.
@@ -1751,13 +1743,6 @@ describe("interstitial self-talk classification (PAP-355)", () => {
expect(m.interstitial).toBe(true);
expect(m.streaming).toBe(false);
}
});
it("stamps atMs from the first streamed chunk", () => {
const messages = transcriptToTaskChatItems(stream, {
runId: "run-1",
running: false,
}).filter((it) => it.kind === "message");
if (messages[0].kind !== "message" || messages[1].kind !== "message")
return;
expect(messages[0].atMs).toBe(Date.parse(TS));
-10
View File
@@ -86,16 +86,6 @@ describe("startServiceWorkerUpdates", () => {
expect(reload).toHaveBeenCalledTimes(1);
});
it("does not reload on a first-ever install", async () => {
const { container, emit } = fakeContainer({ controlled: false });
const { doc } = fakeDocument("hidden");
const reload = vi.fn();
startServiceWorkerUpdates({ container, documentRef: doc, reload });
emit("controllerchange");
expect(reload).not.toHaveBeenCalled();
});
it("reloads when a later deploy replaces the worker a first-visit tab installed", async () => {
const { container, emit } = fakeContainer({ controlled: false });
const { doc } = fakeDocument("hidden");
+39 -175
View File
@@ -294,6 +294,16 @@ function findAgentRow(container: HTMLElement, agentName: string): HTMLElement |
return Array.from(container.querySelectorAll("a")).find((row) => row.textContent?.includes(agentName)) ?? null;
}
function renderAgentsView(root: ReturnType<typeof createRoot> | null, queryClient: QueryClient) {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
}
describe("Agents", () => {
let container: HTMLDivElement;
let root: ReturnType<typeof createRoot> | null;
@@ -396,13 +406,7 @@ describe("Agents", () => {
it("shows the configured model beside the adapter on the all agents page", async () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -420,13 +424,7 @@ describe("Agents", () => {
it("switches between the preserved list and the interactive org chart with icon buttons", async () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
@@ -489,13 +487,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -522,57 +514,7 @@ describe("Agents", () => {
expect(row?.textContent).not.toContain("Pause");
});
it("uses the built-in agents route segment as the built-in filter", async () => {
mockRouterState.pathname = "/agents/builtin";
mockInstanceSettingsApi.get.mockResolvedValue(makeInstanceSettings({ enableBuiltInAgents: true }));
const builtInAgent = makeAgent({
id: "built-in-agent",
name: "Briefs Agent",
urlKey: "briefs-agent",
});
const regularAgent = makeAgent({
id: "regular-agent",
name: "Regular Agent",
urlKey: "regular-agent",
});
mockAgentsApi.list.mockResolvedValue([builtInAgent, regularAgent]);
mockAgentsApi.org.mockResolvedValue([
{
id: "built-in-agent",
name: "Briefs Agent",
role: "engineer",
status: "active",
reports: [],
},
{
id: "regular-agent",
name: "Regular Agent",
role: "engineer",
status: "active",
reports: [],
},
]);
mockBuiltInAgentsApi.list.mockResolvedValue([
makeBuiltInAgentState({ agentId: "built-in-agent", agent: builtInAgent }),
]);
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
});
await flushReact();
await flushReact();
expect(container.textContent).toContain("1 agent");
expect(container.textContent).toContain("Briefs Agent");
expect(container.textContent).not.toContain("Regular Agent");
});
it("shows effective environment and sandbox provider beside agents", async () => {
mockAgentsApi.list.mockResolvedValue([
@@ -592,13 +534,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -625,13 +561,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -653,13 +583,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -692,13 +616,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -751,13 +669,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -815,13 +727,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -859,13 +765,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -877,13 +777,7 @@ describe("Agents", () => {
it("does not show environment filter or grouping controls yet", async () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -897,13 +791,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -916,18 +804,17 @@ describe("Agents", () => {
it("shows and filters built-in agents when the experimental flag is enabled", async () => {
mockRouterState.pathname = "/agents/builtin";
mockInstanceSettingsApi.get.mockResolvedValue(makeInstanceSettings({ enableBuiltInAgents: true }));
mockAgentsApi.list.mockResolvedValue([
makeAgent({
id: "built-in-agent",
name: "Briefs Agent",
urlKey: "briefs-agent",
}),
makeAgent({
id: "regular-agent",
name: "Regular Agent",
urlKey: "regular-agent",
}),
]);
const builtInAgent = makeAgent({
id: "built-in-agent",
name: "Briefs Agent",
urlKey: "briefs-agent",
});
const regularAgent = makeAgent({
id: "regular-agent",
name: "Regular Agent",
urlKey: "regular-agent",
});
mockAgentsApi.list.mockResolvedValue([builtInAgent, regularAgent]);
mockAgentsApi.org.mockResolvedValue([
{
id: "built-in-agent",
@@ -945,22 +832,17 @@ describe("Agents", () => {
},
]);
mockBuiltInAgentsApi.list.mockResolvedValue([
makeBuiltInAgentState({ agentId: "built-in-agent" }),
makeBuiltInAgentState({ agentId: "built-in-agent", agent: builtInAgent }),
]);
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
expect(container.textContent).toContain("1 agent");
expect(mockBuiltInAgentsApi.list).toHaveBeenCalledWith("company-1");
expect(container.textContent).toContain("Built-in");
expect(container.textContent).toContain("Briefs Agent");
@@ -972,13 +854,7 @@ describe("Agents", () => {
it("gives list-view rows a fixed-width title so meta columns align (PAP-86)", async () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1066,13 +942,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1090,13 +960,7 @@ describe("Agents", () => {
root = createRoot(container);
await act(async () => {
root!.render(
<QueryClientProvider client={queryClient}>
<ToastProvider>
<Agents />
</ToastProvider>
</QueryClientProvider>,
);
renderAgentsView(root, queryClient);
});
await flushReact();
await flushReact();
@@ -316,16 +316,11 @@ describe("InstanceExperimentalSettings — Conference Room Chat card (PAP-11233)
await renderPage();
const headings = [...container.querySelectorAll("section h2")].map((h) => h.textContent);
expect(headings).not.toContain("Conference Room Chat");
expect(container.querySelector(CONFERENCE_TOGGLE_SELECTOR)).toBeNull();
});
it("does not render the Pipelines experimental setting for now", async () => {
await renderPage();
const headings = [...container.querySelectorAll("section h2")].map((h) => h.textContent);
expect(headings).not.toContain("Pipelines");
expect(container.querySelector('button[aria-label="Toggle pipelines experimental setting"]')).toBeNull();
expect(headings).not.toContain("Conference Room Chat");
expect(container.querySelector(CONFERENCE_TOGGLE_SELECTOR)).toBeNull();
});
it("does not render the toggle even when the stored flag is currently enabled", async () => {
@@ -596,6 +591,14 @@ describe("InstanceExperimentalSettings — Conference Room Chat card (PAP-11233)
setWorktreeRuntimeMeta(true);
await renderPage();
expect(container.textContent).toContain(
"Only tasks created after enabling will run automatically",
);
expect(container.textContent).toContain("Toggling off and on resets the cutoff.");
// Off => no armed banner and no fail-closed hint.
expect(container.textContent).not.toContain("Running tasks created after");
expect(container.textContent).not.toContain("Execution is suppressed");
expect(container.textContent).toContain("Run tasks in this worktree");
expect(container.textContent).toContain(
"isolated git-worktree preview instance",
@@ -615,19 +618,6 @@ describe("InstanceExperimentalSettings — Conference Room Chat card (PAP-11233)
expect(toggle?.getAttribute("aria-checked")).toBe("true");
});
it("shows the cutoff-copy for the worktree run-execution toggle when off", async () => {
setWorktreeRuntimeMeta(true);
await renderPage();
expect(container.textContent).toContain(
"Only tasks created after enabling will run automatically",
);
expect(container.textContent).toContain("Toggling off and on resets the cutoff.");
// Off => no armed banner and no fail-closed hint.
expect(container.textContent).not.toContain("Running tasks created after");
expect(container.textContent).not.toContain("Execution is suppressed");
});
it("shows the armed timestamp when the flag matches the current instance", async () => {
setWorktreeRuntimeMeta(true);
setWorktreeInstanceIdMeta("inst-current");
+30 -162
View File
@@ -78,6 +78,18 @@ async function flushReact() {
flushSync(() => {});
}
function renderInviteLanding(root: ReturnType<typeof createRoot>, queryClient: QueryClient) {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
}
describe("InviteLandingPage", () => {
let container: HTMLDivElement;
@@ -148,15 +160,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -187,15 +191,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -265,15 +261,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -322,15 +310,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -397,15 +377,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -488,15 +460,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -573,15 +537,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -656,15 +612,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -702,15 +650,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -744,15 +684,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -857,15 +789,7 @@ describe("InviteLandingPage", () => {
const queryClient = createAppLikeQueryClient("user-1");
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -943,15 +867,7 @@ describe("InviteLandingPage", () => {
const queryClient = createAppLikeQueryClient("user-1");
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -978,15 +894,7 @@ describe("InviteLandingPage", () => {
const queryClient = createAppLikeQueryClient("user-1");
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1010,15 +918,7 @@ describe("InviteLandingPage", () => {
const queryClient = createAppLikeQueryClient(null);
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1051,15 +951,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1093,15 +985,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1149,15 +1033,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
await flushReact();
@@ -1201,15 +1077,7 @@ describe("InviteLandingPage", () => {
});
await act(async () => {
root.render(
<MemoryRouter initialEntries={["/invite/pcp_invite_test"]}>
<QueryClientProvider client={queryClient}>
<Routes>
<Route path="/invite/:token" element={<InviteLandingPage />} />
</Routes>
</QueryClientProvider>
</MemoryRouter>,
);
renderInviteLanding(root, queryClient);
});
await flushReact();
+3 -14
View File
@@ -4341,23 +4341,12 @@ describe("IssueDetail", () => {
await flushReact();
await flushReact();
expect(container.textContent).not.toContain("Plan decomposition");
expect(mockIssuesApi.listAcceptedPlanDecompositions).not.toHaveBeenCalled();
});
it("hides file viewer entry points by default", async () => {
mockIssuesApi.get.mockResolvedValue(createIssue());
await act(async () => {
renderIssueView();
});
await flushReact();
await flushReact();
expect(
container.querySelector('[aria-label="Open file in this issue"]'),
).toBeNull();
expect(container.textContent).not.toContain("Plan decomposition");
expect(mockIssuesApi.listAcceptedPlanDecompositions).not.toHaveBeenCalled();
});
it("shows file viewer entry points when the experimental flag is enabled", async () => {
+12 -38
View File
@@ -143,21 +143,6 @@ describe("Timeline", () => {
vi.clearAllMocks();
});
it("requests the collapsed app sidebar by default", async () => {
root = createRoot(container);
flushSync(() => {
root?.render(
<QueryClientProvider client={queryClient}>
<Timeline />
</QueryClientProvider>,
);
});
await flushReact();
expect(container.querySelector('[data-testid="request-collapsed-sidebar"]')).not.toBeNull();
});
it("applies project scope from the project Timeline control", async () => {
mockLocation.search = "?projectId=11111111-1111-4111-8111-111111111111";
root = createRoot(container);
@@ -198,6 +183,18 @@ describe("Timeline", () => {
expect(container.textContent).not.toContain("Everyone");
expect(container.textContent).not.toContain("work kicked off");
expect(container.textContent).not.toContain("visible");
expect(container.querySelector('[data-testid="request-collapsed-sidebar"]')).not.toBeNull();
expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(
"company-1",
expect.objectContaining({
from: expect.any(String),
to: expect.any(String),
}),
{ signal: expect.any(AbortSignal) },
);
expect(mockWorkTimelineApi.get.mock.calls[0]?.[1]).not.toHaveProperty("userId");
});
it("renders top timeline stats and keeps range controls in the chart footer", async () => {
@@ -357,27 +354,4 @@ describe("Timeline", () => {
totalTokens: 1_250,
});
});
it("requests the company timeline without a user lens parameter", async () => {
root = createRoot(container);
flushSync(() => {
root?.render(
<QueryClientProvider client={queryClient}>
<Timeline />
</QueryClientProvider>,
);
});
await flushReact();
expect(mockWorkTimelineApi.get).toHaveBeenCalledWith(
"company-1",
expect.objectContaining({
from: expect.any(String),
to: expect.any(String),
}),
{ signal: expect.any(AbortSignal) },
);
expect(mockWorkTimelineApi.get.mock.calls[0]?.[1]).not.toHaveProperty("userId");
});
});
+3 -10
View File
@@ -926,6 +926,9 @@ describe("AppDetail", () => {
await renderAppDetail();
expect(container.textContent).toContain("Which agents can use this connection?");
expect(container.textContent).not.toContain("Always installed");
expect(putConnectionInstallsMock).not.toHaveBeenCalled();
expect(container.textContent).toContain("Read (1)");
expect(container.textContent).toContain("Write (1)");
expect(container.textContent).toContain("Read repo");
@@ -1030,16 +1033,6 @@ describe("AppDetail", () => {
});
});
it("removes the separate always-installed controls from Permissions", async () => {
mockParams.tab = "permissions";
await renderAppDetail();
expect(container.textContent).toContain("Which agents can use this connection?");
expect(container.textContent).not.toContain("Always installed");
expect(putConnectionInstallsMock).not.toHaveBeenCalled();
});
it("shows and removes task-granted access without changing the connection's default permissions", async () => {
const grant = {
id: "task-grant", status: "active", profileKey: "connection-intent:conn-1:agent-1",