Files
deepseek-harness/docs/event-producer-consumer.md
kingwl c53e9c90db subagent: carry inherited policy overrides in the child session header
Review fix (ds-review-bot critical #2 on #623): the first-turn event stamp
had a durability hole no turn anchoring can close — an idle SessionStart-
style injection persists a complete one-shot turn before any prompt turn
opens, so a crash in that window left a resumable-looking child with no
inherited policy, falling back to a possibly wider deployment default.

The captured overrides now ride the child's creation meta into its
immutable SessionHeader (sandboxMode/approvalPolicy, neutral strings at the
session boundary — the delegationDepth precedent), durable from the moment
the session exists: no listener ordering can starve the baseline and no
crash window can lose it. overrideOf(session) on both policy services
resolves fold(events past header.seedLength) ?? header baseline, validating
against the closed vocabulary on read; stampOverride and the prompt-submit
listener machinery are deleted. The header field rides both persistence
backends (JSONL header line; SQLite sessions columns, SCHEMA_VERSION 11 —
pre-release, no migration). pty-local reads through overrideOf so PTY
spawns see the baseline too.

Red-first: header-durability-before-any-turn test (the injection crash
window shape), baseline/seed-boundary/closed-vocabulary contract tests in
both service suites; the real-wall suite (race, veto, fork stale-seed,
grandchild) re-anchored on header assertions and green. The Agent Note's
Alternatives now records the superseded event-stamping iteration with the
review evidence; bilingual docs updated.
2026-07-26 18:16:45 +08:00

15 KiB

Event Producer And Consumer Matrix

This matrix shows which packages dispatch each harness-owned event and which packages listen to it. It is intentionally a table rather than one large graph: events are many-to-many, and dense relation data is easier to review in rows. Receiver and event-name types also cover contained dispatch sites that deliberately bypass ctx.emit, such as subagent lifecycle containment.

Event Mode Declared in Dispatchers Listeners
agent-loop/config-start-failed emit packages/core/agent-loop/src/index.ts:353 agent-loop (events.dispatch) tui
agent/cancel-requested emit packages/core/agent/src/types.ts:350 agent-loop (emit) goal-session
agent/created emit packages/core/agent/src/types.ts:285 agent (events.dispatch) goal-session, tui
agent/disposed emit packages/core/agent/src/types.ts:294 agent (events.dispatch) agent-loop, goal-session, tui
agent/error emit packages/core/agent/src/types.ts:498 agent-loop (emit) apiproxy, goal-session, tui
agent/inbox/dequeue emit packages/core/agent/src/types.ts:326 agent-loop (emit) agent
agent/inbox/discard emit packages/core/agent/src/types.ts:340 agent-loop (emit) agent
agent/inbox/enqueue emit packages/core/agent/src/types.ts:316 agent-loop (emit) agent, goal-session, tui
agent/post-step serial packages/core/agent/src/types.ts:448 agent-loop (serial) compact-basic, session-checkpoint-policy
agent/pre-step serial packages/core/agent/src/types.ts:379 agent-loop (serial) time-context, user-approval
agent/prompt-submit waterfall packages/core/agent/src/types.ts:395 agent-loop (waterfall) goal-session, hooks-claude, hooks-codex, plan-mode, repeat-tool-guard
agent/request waterfall packages/core/agent/src/types.ts:409 agent-loop (waterfall) agent
agent/request-error waterfall packages/core/agent/src/types.ts:463 agent-loop (waterfall) compact-basic, llm-retry, plan-mode
agent/session-prefix waterfall packages/core/agent/src/types.ts:424 agent-loop (waterfall) tool-skill, workspace-context
agent/session-start emit packages/core/agent/src/types.ts:363 agent-loop (emit) goal, goal-session, hooks-claude, hooks-codex
agent/status emit packages/core/agent/src/types.ts:303 agent-loop (emit) agent, apiproxy, goal-session, tui
agent/step-result waterfall packages/core/agent/src/types.ts:436 agent-loop (waterfall) -
agent/turn-continuation waterfall packages/core/agent/src/types.ts:474 agent-loop (waterfall) hooks-claude, hooks-codex, plan-mode
agent/turn-stop serial packages/core/agent/src/types.ts:485 agent-loop (serial) subagent-inprocess, tool-goal
approval/request waterfall packages/ui/user-approval/src/index.ts:30 user-approval (waterfall) acp
commands/change emit packages/ui/commands/src/index.ts:103 commands (events.dispatch) tui
domain/changed emit packages/storage/storage-domain/src/events.ts:46 storage-domain (emit) apiproxy, storage-domain, workspace
fs/edit-intent waterfall packages/fs/fs/src/index.ts:62 tool-fs (waterfall) fs-policy
fs/observed emit packages/fs/fs/src/index.ts:71 tool-fs (emit) fs-policy
fs/write-intent waterfall packages/fs/fs/src/index.ts:54 tool-fs (waterfall) fs-policy
goal/changed emit packages/goal/goal/src/types.ts:167 goal (emit) goal-session
llm/stream waterfall packages/llm/llm/src/index.ts:52 llm (waterfall) agent-loop, llm, llm-replay, session-checkpoint-policy, session-title
session/created emit packages/core/session/src/index.ts:79 session (events.dispatch) apiproxy, compact, goal, hook-protocol, jsonrpc, llm-retry, session, session-persistence, user-approval
session/disposed emit packages/core/session/src/index.ts:89 session (events.dispatch) agent-loop, apiproxy, session-persistence, session-title
session/event emit packages/core/session/src/index.ts:101 session (events.dispatch) acp, apiproxy, cli-demo, compact, goal, goal-session, hook-protocol, jsonrpc, session, session-persistence, session-title, token-meter, tui, user-approval, workspace-context
session/flush parallel packages/core/session/src/index.ts:111 session (events.dispatch) session-persistence
subagent/end emit packages/subagent/subagent/src/index.ts:139 subagent (events.dispatch) hooks-claude, jsonrpc, subagent
subagent/provider-added emit packages/subagent/subagent/src/index.ts:113 subagent (emit) subagent, tool-subagent
subagent/provider-removed emit packages/subagent/subagent/src/index.ts:119 subagent (events.dispatch) subagent, tool-subagent
subagent/start emit packages/subagent/subagent/src/index.ts:130 subagent (events.dispatch) hooks-claude, subagent
system-prompt/assemble waterfall packages/core/system-prompt/src/index.ts:29 system-prompt (waterfall) agent, system-prompt
system-prompt/change emit packages/core/system-prompt/src/index.ts:35 system-prompt (emit) -
tools/change emit packages/core/tools/src/index.ts:143 tools (emit) -
tools/execute waterfall packages/core/tools/src/index.ts:113 tools (waterfall) session-checkpoint-policy, timeout-policy
tools/post-execute waterfall packages/core/tools/src/index.ts:125 tools (waterfall) hooks-claude, hooks-codex, repeat-tool-guard, spill-policy, tool-fs-search, workspace-context
tools/pre-execute waterfall packages/core/tools/src/index.ts:102 tools (waterfall) hooks-claude, hooks-codex, tool-tasks
tools/result emit packages/core/tools/src/index.ts:133 tools (events.dispatch) subagent-inprocess, workspace-context
workflow/agent-end emit packages/workflow/workflow/src/index.ts:81 workflow (events.dispatch) workflow
workflow/agent-start emit packages/workflow/workflow/src/index.ts:70 workflow (events.dispatch) workflow
workflow/end emit packages/workflow/workflow/src/index.ts:91 workflow (events.dispatch) workflow
workflow/log emit packages/workflow/workflow/src/index.ts:60 workflow (events.dispatch) -
workflow/phase emit packages/workflow/workflow/src/index.ts:53 workflow (events.dispatch) -
workflow/start emit packages/workflow/workflow/src/index.ts:45 workflow (events.dispatch) workflow

Non-harness or undeclared event strings seen in package source

Event string Dispatchers Listeners
internal/dispatch - compact, fs, goal, goal-session, hook-protocol, llm-retry, permission, plan-mode, pty-local, runtime, sandbox-policy, scope, session, subagent, time-context, tool-todo, tools, user-approval, workflow
internal/plugin - hmr, modules, webserver
internal/status - agent
locale/change locale (emit) locale, ui-models, ui-settings-general
slots/changed runtime (emit) -
theme/change ui-theme (emit) ui-layout, ui-theme

Maintenance mode: generated: Cordis event declarations and producer/listener edges are resolved from the repository TypeScript Program.