Adds the DOMAIN "what did it do" events inside daemon handlers and the previously-silent internals. Not a proto change. Every event emitted inside a handler inherits the OBS-2 per-RPC span (so it carries request_id for free) — this story does NOT re-log OBS-2's bare RPC entry/exit.
What was instrumented
8 gRPC services (grpc.rs): account added/updated/removed (id + transport kind), connection-probe result, ListAccounts count (DEBUG), mark-read applied, mail sync dispatch + finished, contact created, contacts/calendar sync finished, rule created/updated/deleted (rule id), rules imported/exported (counts + format), triage started/finished (spawned worker .instrumented with the RPC span), export started/finished (counts + bytes), audit chain verify result. INFO for state changes, DEBUG for reads.
Silent filessend.rs, calendar_sync.rs, contacts_sync.rs: now emit dispatch + outcome (attempted / counts / accepted / WARN on failure) so a send and a calendar/contacts sync are followable.
Outbox (outbox.rs): logs each mutation attempt (op + mutation_id + surrogate message_id) BEFORE issuing and the result (Completed at INFO; the existing Retry/Failed at DEBUG/WARN) after; mailbox mutations DEBUG the remote identity (remote_id / folder_id / uid_validity).
Shutdown lifecycle (main.rs + lifecycle.rs): each drain step (stop-accepting, draining workers, DB close/WAL checkpoint, complete) is logged, and ShutdownController::trigger now emits a traceable line where the CoreEvent::ShuttingDown event is published to subscribers.
Security
No message bodies/subjects/addresses, credentials, tokens, or keyring secret values in any tracing macro — only ids, counts, transport/op/rule kinds, folder names, status, booleans. A send.rs test asserts recipient/subject/body never appear in telemetry; an outbox.rs test asserts subject/body never appear.
Tests
New offline, mocks-only tests reusing test_tracing.rs's capturing layer: send dispatch+acceptance (+ secret-safety), calendar sync, contacts sync, outbox attempt+completion (+ secret-safety), a state-changing RPC (create_rule) emitting its domain event under a request-scoped span, and trigger emitting the ShuttingDown lifecycle log. Full gate green (fmt / clippy -D warnings / test-all), 0 ignored.
## OBS-3 — daemon handler + lifecycle log coverage (Refs #359)
Adds the DOMAIN "what did it do" events inside daemon handlers and the previously-silent internals. Not a proto change. Every event emitted inside a handler inherits the OBS-2 per-RPC span (so it carries `request_id` for free) — this story does NOT re-log OBS-2's bare RPC entry/exit.
### What was instrumented
- **8 gRPC services** (`grpc.rs`): account added/updated/removed (id + transport kind), connection-probe result, `ListAccounts` count (DEBUG), mark-read applied, mail sync dispatch + finished, contact created, contacts/calendar sync finished, rule created/updated/deleted (rule id), rules imported/exported (counts + format), triage started/finished (spawned worker `.instrument`ed with the RPC span), export started/finished (counts + bytes), audit chain verify result. INFO for state changes, DEBUG for reads.
- **Silent files** `send.rs`, `calendar_sync.rs`, `contacts_sync.rs`: now emit dispatch + outcome (attempted / counts / accepted / WARN on failure) so a send and a calendar/contacts sync are followable.
- **Outbox** (`outbox.rs`): logs each mutation attempt (op + mutation_id + surrogate message_id) BEFORE issuing and the result (Completed at INFO; the existing Retry/Failed at DEBUG/WARN) after; mailbox mutations DEBUG the remote identity (remote_id / folder_id / uid_validity).
- **Shutdown lifecycle** (`main.rs` + `lifecycle.rs`): each drain step (stop-accepting, draining workers, DB close/WAL checkpoint, complete) is logged, and `ShutdownController::trigger` now emits a traceable line where the `CoreEvent::ShuttingDown` event is published to subscribers.
### Security
No message bodies/subjects/addresses, credentials, tokens, or keyring secret values in any `tracing` macro — only ids, counts, transport/op/rule kinds, folder names, status, booleans. A `send.rs` test asserts recipient/subject/body never appear in telemetry; an `outbox.rs` test asserts subject/body never appear.
### Tests
New offline, mocks-only tests reusing `test_tracing.rs`'s capturing layer: send dispatch+acceptance (+ secret-safety), calendar sync, contacts sync, outbox attempt+completion (+ secret-safety), a state-changing RPC (`create_rule`) emitting its domain event under a request-scoped span, and `trigger` emitting the ShuttingDown lifecycle log. Full gate green (fmt / clippy -D warnings / test-all), 0 ignored.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
OBS-3 — daemon handler + lifecycle log coverage (Refs #359)
Adds the DOMAIN "what did it do" events inside daemon handlers and the previously-silent internals. Not a proto change. Every event emitted inside a handler inherits the OBS-2 per-RPC span (so it carries
request_idfor free) — this story does NOT re-log OBS-2's bare RPC entry/exit.What was instrumented
grpc.rs): account added/updated/removed (id + transport kind), connection-probe result,ListAccountscount (DEBUG), mark-read applied, mail sync dispatch + finished, contact created, contacts/calendar sync finished, rule created/updated/deleted (rule id), rules imported/exported (counts + format), triage started/finished (spawned worker.instrumented with the RPC span), export started/finished (counts + bytes), audit chain verify result. INFO for state changes, DEBUG for reads.send.rs,calendar_sync.rs,contacts_sync.rs: now emit dispatch + outcome (attempted / counts / accepted / WARN on failure) so a send and a calendar/contacts sync are followable.outbox.rs): logs each mutation attempt (op + mutation_id + surrogate message_id) BEFORE issuing and the result (Completed at INFO; the existing Retry/Failed at DEBUG/WARN) after; mailbox mutations DEBUG the remote identity (remote_id / folder_id / uid_validity).main.rs+lifecycle.rs): each drain step (stop-accepting, draining workers, DB close/WAL checkpoint, complete) is logged, andShutdownController::triggernow emits a traceable line where theCoreEvent::ShuttingDownevent is published to subscribers.Security
No message bodies/subjects/addresses, credentials, tokens, or keyring secret values in any
tracingmacro — only ids, counts, transport/op/rule kinds, folder names, status, booleans. Asend.rstest asserts recipient/subject/body never appear in telemetry; anoutbox.rstest asserts subject/body never appear.Tests
New offline, mocks-only tests reusing
test_tracing.rs's capturing layer: send dispatch+acceptance (+ secret-safety), calendar sync, contacts sync, outbox attempt+completion (+ secret-safety), a state-changing RPC (create_rule) emitting its domain event under a request-scoped span, andtriggeremitting the ShuttingDown lifecycle log. Full gate green (fmt / clippy -D warnings / test-all), 0 ignored.🤖 Generated with Claude Code