A goal round reporting complete or blocked used to conclude the turn at the tool result, so the model never spoke after the call and sessions ended on a bare update_goal card. The terminal update now defers one plugin-sourced <goal_complete>/<goal_blocked> instruction onto its result asking for a grounded closing message without further tool calls; the turn then ends through the ordinary no-tool-calls stop. Direct-human mutations stay uninstructed. Wording chosen by A/B sampling on deepseek-v4-pro; one extra request per goal lifecycle. New keyless ACP snapshot goal-wrapup drives the shipped app through create -> round one -> autonomous complete and pins the injection, the same-turn closing message, and the completed turn end.
goal/ — persisted same-session goals
English | 中文
The goal family owns durable objective state independently of the model-facing tools and continuation policy that consume it.
| Package | Role | ctx key |
|---|---|---|
goal/ |
Event-sourced goal lifecycle, replay fold, compare-and-set mutations, and process-local activation | ctx.goals |
goal-session/ |
Same-session goal-round admission, outcome mapping, and lifecycle race fencing | — |
tool-goal/ |
Model-facing read/create/update tools with execution-time authority checks | — |
command-goal/ |
Human-facing /goal status and lifecycle control over the command plane |
— |
Goal state is part of the owning session log. Consumers depend on dsh-goal, not on the concrete agent loop; continuation behavior belongs in a separate plugin on the public agent seams.