deepseek-harness/packages/core/agent-loop/tests
Tianyi Cui 547aacee2f fix: honor the teardown order on owner unload; make the structured commit unconditional
Adversarial-review findings (own reviewer agent), each verified and pinned:

B1: agents.register() returned a wrapper lambda, so the factory composite's
yield could not identity-nest it — on OWNER unload the unregistration (and
agent/disposed) disposed as a concurrent sibling, firing mid-drain while
the final turn was still closing (pre-existing on master; this branch's
docs re-assert the order, so it must be true). register() now returns the
EXACT cordis effect disposer (the Scope.rawDispose move); the composite
nests it and owner unload runs stop/drain -> unregister -> detach -> scope
like every other path. Regression test pins turn-end before disposed
before detach on owner unload.

B2: the structured two-phase commit could promote a stale stage when a
later capture call REUSED the orphaned stage's call id with a body that
never staged (denied downstream, or invalid args throwing pre-stage). The
runtime's pre-execute listener now clears any stale stage unconditionally
when a new capture call enters the pipeline — only a call's own body can
stage for its commit; the call-id mismatch guard becomes a defensive
second layer. Repro test: blocked capture then same-id invalid call.

C1: an explicit empty toolFilter config now fails at plugin LOAD (the
check is self-contained) instead of killing every delegation at child
setup. C2: Scope.dispose/ScopeHost.dispose @returns state the single-shot
repeat-call semantics honestly.
2026-07-09 04:48:52 +08:00
..
agent.spec.ts simplify(agent): drop the unused public Agent.abort(), keep whenIdle() 2026-06-21 09:05:21 +08:00
cancel.spec.ts refactor(events): remove the agent/stream-chunk mirror of assistant/chunk 2026-07-02 23:42:16 +08:00
config-session-id.spec.ts review: the persona becomes the system-prompt plugin's deployment config 2026-07-05 23:23:46 +08:00
coverage-edges.spec.ts refactor(events): remove the turn boundary mirror events 2026-07-02 03:26:45 +08:00
inbox.spec.ts Reorganize packages into a modular hierarchy 2026-06-20 22:55:20 +08:00
interception.spec.ts fix(loop): record a durable prompt/blocked for every vetoed prompt 2026-07-02 17:03:53 +08:00
loop.spec.ts loop: every request is built from the log — boundary snapshot, header events, config-only waterfall 2026-07-06 03:07:34 +08:00
mock-adapter.ts Reorganize packages into a modular hierarchy 2026-06-20 22:55:20 +08:00
properties.spec.ts feat(types): brand bash ids + stop brand erosion; extract Branded to dsh-brand 2026-06-21 07:19:59 +08:00
request-cache.e2e.ts loop: every request is built from the log — boundary snapshot, header events, config-only waterfall 2026-07-06 03:07:34 +08:00
request-log.spec.ts loop: every request is built from the log — boundary snapshot, header events, config-only waterfall 2026-07-06 03:07:34 +08:00
request-reconstruction.spec.ts fix review findings: one frozen seed through the waterfall; stale agent/request docs 2026-07-06 04:17:29 +08:00
resume.spec.ts feat(events): interception seams — the typed-Decision surface for hooks 2026-06-30 17:11:18 +08:00
review-fixes.spec.ts loop: every request is built from the log — boundary snapshot, header events, config-only waterfall 2026-07-06 03:07:34 +08:00
scope-lifecycle.spec.ts fix: honor the teardown order on owner unload; make the structured commit unconditional 2026-07-09 04:48:52 +08:00
tool-order.spec.ts feat(core): scope-aware registries and session dispatch carriers 2026-07-09 01:09:21 +08:00