diff --git a/packages/core/session/tests/session.spec.ts b/packages/core/session/tests/session.spec.ts index e649214a29..f1147396c9 100644 --- a/packages/core/session/tests/session.spec.ts +++ b/packages/core/session/tests/session.spec.ts @@ -764,6 +764,8 @@ describe('Session', () => { { header: { ...base, seedLength: '1' }, error: /seedLength must be a non-negative safe integer/ }, { header: { ...base, seedLength: 0.5 }, error: /seedLength must be a non-negative safe integer/ }, { header: { ...base, seedLength: -1 }, error: /seedLength must be a non-negative safe integer/ }, + { header: { ...base, sandboxMode: 1 }, error: /header sandboxMode must be a string/ }, + { header: { ...base, approvalPolicy: 1 }, error: /header approvalPolicy must be a string/ }, ] for (const { header, error } of cases) { @@ -1011,6 +1013,8 @@ describe('SessionStore', () => { { meta: { delegationDepth: '1' }, error: /delegationDepth must be a non-negative safe integer/ }, { meta: { delegationDepth: 0.5 }, error: /delegationDepth must be a non-negative safe integer/ }, { meta: { delegationDepth: -1 }, error: /delegationDepth must be a non-negative safe integer/ }, + { meta: { sandboxMode: 1 }, error: /header sandboxMode must be a string/ }, + { meta: { approvalPolicy: 1 }, error: /header approvalPolicy must be a string/ }, ] for (const [index, { meta, error }] of cases.entries()) { diff --git a/packages/session-persistence/session-persistence/tests/contract.ts b/packages/session-persistence/session-persistence/tests/contract.ts index 88d1eef68e..4508e0ccaa 100644 --- a/packages/session-persistence/session-persistence/tests/contract.ts +++ b/packages/session-persistence/session-persistence/tests/contract.ts @@ -84,6 +84,36 @@ export function runPersistenceContract(name: string, make: () => Promise { + const { persistence, dispose } = await make() + try { + // A delegated child header: the sandbox/approval baselines must + // survive storage verbatim — a resumed child falling back to the + // deployment default would reopen the delegation bypass. + const child: SessionHeader = { + ...meta('s-baseline', '/work'), + delegationDepth: 1, + sandboxMode: 'read-only', + approvalPolicy: 'never', + } + await persistence.create(child) + await persistence.append(child.id, oneTurnLog()) + const loaded = await persistence.load(child.id) + expect(loaded.meta).toMatchObject({ sandboxMode: 'read-only', approvalPolicy: 'never' }) + + // A top-level header: absent baselines stay ABSENT (not null/empty) — + // presence is the signal the policy owners branch on. + const top = meta('s-no-baseline', '/work') + await persistence.create(top) + await persistence.append(top.id, oneTurnLog()) + const reloaded = await persistence.load(top.id) + expect('sandboxMode' in reloaded.meta).toBe(false) + expect('approvalPolicy' in reloaded.meta).toBe(false) + } finally { + await dispose() + } + }) + it('rejects a fractional creation timestamp without reserving its session id', async () => { const { persistence, dispose } = await make() try {