Call `defer cancel()` immediately after you create the context.
- Reuse `ctx` when a child context replaces its parent. Use a different
name only when both contexts stay in use. Return `ctx.Err()` directly.
+- Derive each context from the context of the caller. When work must
+ finish even after the caller is cancelled, such as a final write, use
+ `context.WithoutCancel` of the caller's context. Use
+ `context.Background()` only where no caller context exists: in `run`,
+ and in methods that follow `io.Closer`.
+- Name a duration that limits one operation after that operation, and
+ end the name with `Timeout`, so that the name says what it limits
+ without its comment. Define it in the file that applies it, not in the
+ file of another type.
## Errors
- When deferred cleanup can fail, use a named `err` result and join the
cleanup error with `errors.Join`.
+## Logs
+
+- Log with the `*slog.Logger` of the part (`daemonLogger`). The handler
+ formats the line; do not format values into the message.
+- Write the message as a short event in plain words, such as "receive
+ failed" or "subagent done". Do not explain what it means or what the
+ user must do.
+- Put names, IDs, counts, and durations in attributes, with short keys
+ (`name`, `id`, `after`, `retry`). Put the cause in `err`; the handler
+ writes it last.
+- Use info for normal events, warn for a failure that is retried or
+ loses nothing, and error for a failure that loses data or stops a
+ part.
+- Never log secrets, tokens, message text, or phone numbers. Redact IDs
+ as the existing code does.
+
## Style
- Keep function signatures on one line. Write function bodies on more