test(subagent): close continuable coverage and drop unreachable guards

Restores the one-shot settleRun coverage in its own file beside the helper,
covers fork's seed contribution, the post-transfer rollback, the descriptor
model route on cold resume, manager-unload drain, and a failing teardown branch.

Removes three redundant checks the surrounding contracts already own: the
duplicate-Activation and live-id pre-checks (AgentRegistry.enter is the
authoritative collision boundary) and a rollback lifecycle edge that could never
publish because the epoch had no start edge.
This commit is contained in:
Dudu-0223
2026-07-30 14:01:13 +08:00
committed by Tianyi Cui
parent 55f86367ad
commit bc504195df
7 changed files with 446 additions and 179 deletions
@@ -211,6 +211,35 @@ describe('dsh-subagent-fork', () => {
expect(ctx.subagents.list()).toEqual([])
})
it('contributes the completed-turn prefix as a continuable child\'s seed', async () => {
const { ctx, parent } = await setup([textResponse('parent turn'), textResponse('child answer')])
const provider = ctx.subagents.getProvider('fork')!
const signal = new AbortController().signal
// Before any completed parent turn there is nothing to inherit, so the
// child starts fresh rather than carrying an empty seed.
const fresh = await provider.prepareContinuable!({
sessionId: SessionId('continuable-fresh'),
parent,
signal,
})
expect(fresh.seed).toBeUndefined()
// Complete one parent turn, then the prefix is captured once at creation.
parent.followup({ content: [{ type: 'text', text: 'hello' }], source: { kind: 'user' } })
await parent.whenIdle()
const seeded = await provider.prepareContinuable!({
sessionId: SessionId('continuable-seeded'),
parent,
signal,
})
expect(seeded.seed).toBeDefined()
const lastSeeded = seeded.seed!.at(-1)
// The seed ends at a completed turn, so it replays as a valid child log.
expect(lastSeeded?.type).toBe('turn/end')
expect(seeded.seed!.map(event => event.seq)).toEqual(seeded.seed!.map((_event, index) => index))
})
it('has the namespace-plugin export shape (no stray default)', () => {
expect('default' in fork).toBe(false)
expect(fork.name).toBe('subagent-fork')