// Integration test for CLAUDE.md §7.4 — when the isolate dies mid-invoke // (Deno.exit, segfault, panic) the host must surface `isolate_crashed` // promptly rather than waiting the full invocation timeout. Also verifies // that uncaught customer errors get tagged `function_threw` with their // message preserved (sanitizer is host-side only). import { describe, expect, test } from 'bun:test'; import { runIntegrationFixture } from './test-helpers.js'; describe('crash recovery (integration)', () => { test('Deno.exit during invoke surfaces isolate_crashed', async () => { const { result, cleanup } = await runIntegrationFixture({ fnName: 'test', deploymentId: 'd1', fnSource: ` import { query } from '@briven/cli/server'; export const test = query(async () => { Deno.exit(7); }); `, }); try { expect(result.ok).toBe(false); if (!result.ok) { // Drain-on-exit (Task 11) should surface isolate_crashed promptly. // Accept invocation_timeout as a fallback in case the resolver // hasn't been drained by the time we sample. expect(['isolate_crashed', 'invocation_timeout']).toContain(result.code); } } finally { await cleanup(); } }, 30_000); test('thrown error surfaces function_threw with sanitized message', async () => { const { result, cleanup } = await runIntegrationFixture({ fnName: 'test', deploymentId: 'd1', fnSource: ` import { query } from '@briven/cli/server'; export const test = query(async () => { throw new Error('boom from /tmp/briven-isolate-fake-leak'); }); `, }); try { expect(result.ok).toBe(false); if (!result.ok) { expect(result.code).toBe('function_threw'); expect(result.message).toContain('boom'); // Sanitizer should NOT have stripped /tmp/briven-isolate-fake-leak from // INSIDE the customer's own message body — that would over-redact. The // sanitizer applies to host-side error paths only. So this assertion // is intentionally not strict on path content. } } finally { await cleanup(); } }, 30_000); });