On job completion, Timmy generates a privacy-safe 1-3 sentence summary
(via Haiku) and broadcasts it as a signed Nostr kind:1 note.
- New `nostr-publish.ts` utility: signs event with Timmy's nsec,
publishes to Hermes strfry (HTTP inject) and optionally to an
external relay (wss://relay.damus.io) via NIP-01 WebSocket.
Failed publishes are non-blocking (warn + continue).
- `AgentService.generateJobSummary()`: Haiku call producing a public-safe
summary and category slug; falls back to canned text in stub mode.
- `runWorkInBackground` fires the broadcast fire-and-forget after the
job DB row is committed; persists the event ID on `jobs.nostr_event_id`.
- Tags: `["t","timmy-tower"]`, job category, link to alexanderwhitestone.com.
- Tower Log includes nostrEventId + njump.me link in the completion log entry.
- DB schema: `nostr_event_id` on `jobs`, `job_id` on `timmy_nostr_events`.
- Migration: `0009_nostr_job_completions.sql`.
Fixes#13
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>