`Hook::handle` passed on Stop whenever anything was pending, so a single unsettled
background task muted the stop gate, the routine, the journal reminder — all of them.
The cost was measured rather than argued: one session counted 415 pieces of work and
held NOT ONE stop, because in a long session something is always running.
The silence was right for exactly two hooks and wrong for the rest, which is why it
is per-hook now rather than a blanket. `PlanReminder` opts out because telling an
agent to keep going is redundant advice to one already waiting on work it started;
`JudgeReminder` opts out because it CONSUMES the batch of touched files it reports
on, so firing at a stop the agent is only parked at would mute the real stop after.
`isSubagent()` had the same shape one event over. It reads `agent_id`/`agent_type` —
but on `SubagentStop` those name the worker that STOPPED while the hook runs in the
parent, so every hook was silenced on the one moment that reports a worker finishing.
Which was the moment the orchestration layer was missing. `WorkerFinished` rides
`SubagentStop`: the harness saying it happened, rather than completion inferred from
silence, since an absent row in a listing is an absence you interpret where this is a
measurement. It carries the AGENT and nothing about the board, because a worker can
finish having never claimed an item — its findings existing only in a message. That
split `Event` in two: the base carries what every moment has, and a claim belongs to
a moment about a piece of work.
A `Handler` is a `Trigger` now, and it arms on a moment with `fire()`. `hook` was
already taken by the harness transport, and the two sat in one folder loaded by one
mechanism — the ambiguity produced wrong conversations before it produced wrong code.
The scope is the sharper half of that distinction, so a trigger lives in its
PROFILE's `triggers/` and loads only while that profile is in force. A hook states a
fact about the project and applies everywhere; "when a walker reports, dispatch the
secretary" means nothing where there is no walker and no board, and a rule firing
where it cannot be satisfied is how most false positives are born.
An agent is a value object now — an id that dies with its session and a type that
outlives it, together because neither answers alone. It sits beside `Workspace`
rather than in either layer, since the harness reports it and orchestration consumes
it.