deepseek-harness/packages/hooks/hook-protocol/tests
Tianyi Cui 9ca31ab193 fix(hooks): drain detached hook runs on bridge dispose
The emit-shaped hook points (SessionStart, SubagentStart, SubagentStop)
run fire-and-forget: no seam awaits the run chain, so disposing a bridge
could strand a live hook process and let a late continuation inject into
a disposed context. The floating continuation also made the coverage
gate racy: the only coverage of the SubagentStart continuation's
no-context branch arm rode on an un-awaited .then, and on a loaded CI
runner the fork's per-file coverage snapshot beat it — master run
28798191671 failed the 100% branch gate on hooks-claude/src/index.ts at
99.03% (uncovered line 336) with the identical tree passing the PR run
three minutes earlier.

New shared primitive createDetachedRuns() in dsh-hook-protocol: a bridge
tracks each detached run chain, passes the tracker's abort signal to
runHook, and registers drain() as its effect disposer — drain aborts
still-running hook processes (a kill via the bash seam, not a wait out
to the 10-minute default hook timeout), then resolves once every chain
has settled. fiber.dispose() resolving now means the bridge's detached
work is quiescent (docs/defensive-patterns.md).

The subagent marker test disposes the bridge as its sync point, so the
formerly racy branch arm is executed deterministically before the file's
coverage snapshot; new tests pin abort-on-dispose promptness for both
bridges and the tracker's settle/drain contract in hook-protocol.
2026-07-06 23:27:54 +08:00
..
codec.spec.ts refactor(hooks): tighten the hook-protocol contract surface 2026-07-04 15:44:26 +08:00
detached.spec.ts fix(hooks): drain detached hook runs on bridge dispose 2026-07-06 23:27:54 +08:00
events.spec.ts restore hook/result durationMs — review keeps wall-clock audit timing durable 2026-07-04 22:00:12 +08:00
matcher.spec.ts feat(hooks): dsh-hook-protocol — shared Claude Code / Codex hook wire-protocol core 2026-07-01 00:41:53 +08:00
merge.spec.ts fix(hooks): merge surfaces the WINNING decision's reason, not only deny's 2026-07-01 02:20:12 +08:00
runner.spec.ts restore hook/result durationMs — review keeps wall-clock audit timing durable 2026-07-04 22:00:12 +08:00