From 9c5da8d81ff57a68b4886ca2f6f9db0c5713ac1d Mon Sep 17 00:00:00 2001 From: Hypatia May Date: Mon, 6 Jul 2026 16:16:47 +0800 Subject: [PATCH] test: cover corrupt fork boundary guard --- packages/core/session/tests/fork.spec.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/core/session/tests/fork.spec.ts b/packages/core/session/tests/fork.spec.ts index 189d5ae690..46c9ef71ba 100644 --- a/packages/core/session/tests/fork.spec.ts +++ b/packages/core/session/tests/fork.spec.ts @@ -144,6 +144,18 @@ describe('SessionStore.fork', () => { .toThrow(new SessionForkError(`fork boundary ${source.seq} does not exist in session "parent" (last seq: ${source.seq - 1})`, 'INVALID_BOUNDARY')) }) + it('rejects a corrupted live source whose array index no longer matches event seq', async () => { + const { ctx, sessions } = await setup() + const source = ctx.sessions.create(SessionId('corrupt-parent')) + appendClosedTurn(source, 1) + const mutableLog = (source as unknown as { log: SessionEvent[] }).log + mutableLog[2] = { ...mutableLog[2]!, seq: 99 } + + expect(() => sessions.fork({ source, boundary: 2, childSessionId: SessionId('corrupt-child') })) + .toThrow(new SessionForkError('fork boundary 2 does not match a contiguous event seq in session "corrupt-parent"', 'INVALID_BOUNDARY')) + expect(ctx.sessions.get(SessionId('corrupt-child'))).toBeUndefined() + }) + it('rejects an unknown live session id', async () => { const { sessions } = await setup()