diff --git a/docs/releases/2.2.1/patch-execution.md b/docs/releases/2.2.1/patch-execution.md index b8fdfbe5e..0dd5488bd 100644 --- a/docs/releases/2.2.1/patch-execution.md +++ b/docs/releases/2.2.1/patch-execution.md @@ -121,7 +121,7 @@ returned HTTP 401 from redirected storage. Check metadata confirms failures occur during tests after successful dependency installation. Failed-suite annotations now expose bounded diagnostic context through the checks API. The runner also counts subprocess failure when a suite prints `Failed: 0`. -Seven isolated runner regressions pass. +Eight isolated runner regressions pass. Follow-up review reproduced additional release defects. Ordered JSON merges to one Kimi destination were collapsed by destination-only preview indexing; @@ -132,3 +132,12 @@ and 36 existing settings tests pass). Static PowerShell alias and stdin values are resolved conservatively, with independent review covering mixed named and positional alias arguments. Hosted verification on the final patch remains required before merge or release. + +Run 34164970113 on 14e731c6 exposed the Windows failure through the new check +annotations: the Antigravity ownership fixture searched a native Windows source +path using a POSIX-only literal, then dereferenced a missing operation. The +fixture now normalizes separators and asserts both planned operations exist; +all 23 ownership tests pass locally. The diagnostic matcher also uses escaped +Unicode literals to satisfy the repository's Unicode gate, and excludes passing +error-handling case names from failure excerpts. Fresh hosted validation must +confirm these final fixture and diagnostic corrections. diff --git a/tests/ci/run-all.test.js b/tests/ci/run-all.test.js index 21c760c86..94a7274ef 100644 --- a/tests/ci/run-all.test.js +++ b/tests/ci/run-all.test.js @@ -84,6 +84,13 @@ const tests = [ assert.strictEqual(result.status, 1); assert.match(result.annotations[0], /SIGTERM/); }], + ['passing error-handling cases cannot hide the actual failure', () => { + const output = `${'PASS handles Error conditions\n'.repeat(5)}FAIL actual regression\n AssertionError: mismatch\nFailed: 1`; + const result = run({ status: 1, stdout: output }); + assert.match(result.annotations[0], /FAIL actual regression/); + assert.match(result.annotations[0], /AssertionError: mismatch/); + assert.ok(!result.annotations[0].includes('PASS handles')); + }], ['healthy suites preserve successful totals and emit no annotation', () => { const result = run({ status: 0, stdout: 'Passed: 3, Failed: 0' }); assert.strictEqual(result.status, 0); diff --git a/tests/run-all.js b/tests/run-all.js index 09bc0ccef..22d0ff5a4 100644 --- a/tests/run-all.js +++ b/tests/run-all.js @@ -51,7 +51,7 @@ function escapeAnnotation(value, property = false) { function annotateFailure(displayPath, reason, output) { if (process.env.GITHUB_ACTIONS !== 'true') return; const context = output.split(/\r?\n/) - .filter(line => /\b(?:FAIL|[A-Za-z]*Error)\b|[✗❌]/i.test(line)) + .filter(line => /^\s*(?:FAIL\b|not ok\b|[A-Za-z]*Error\b|[\u2717\u274c])/i.test(line)) .slice(0, 3) .join('\n'); const message = [reason, context].filter(Boolean).join(': ').slice(0, 1000); diff --git a/tests/scripts/ownership-guard.test.js b/tests/scripts/ownership-guard.test.js index 1856fc0fc..4c16afd2e 100644 --- a/tests/scripts/ownership-guard.test.js +++ b/tests/scripts/ownership-guard.test.js @@ -71,11 +71,15 @@ for (const adapter of listInstallTargetAdapters()) { test('Antigravity transforms preserve a conflicting agent and still update managed files', context => { const plan = createManifestInstallPlan({ ...context, target: 'antigravity', moduleIds: ['agents-core'] }); - const userOperation = plan.operations.find(item => item.sourceRelativePath === 'agents/architect.md'); + const userOperation = plan.operations.find(item => ( + item.sourceRelativePath.replace(/\\/g, '/') === 'agents/architect.md' + )); + assert.ok(userOperation, 'agent plan must include the architect source on every platform'); fs.mkdirSync(path.dirname(userOperation.destinationPath), { recursive: true }); fs.writeFileSync(userOperation.destinationPath, 'My architect\n'); applyInstallPlan(plan); const managed = plan.operations.find(item => item.destinationPath !== userOperation.destinationPath); + assert.ok(managed, 'agent plan must also include a separately managed file'); const original = fs.readFileSync(managed.destinationPath, 'utf8'); fs.writeFileSync(managed.destinationPath, 'old managed version\n'); applyInstallPlan(plan);