feat(webhooks): fire on proposal open/merge/reject (Phase 5a) The firing half — proposal lifecycle events now deliver GraphQL-native webhooks. Verified end to end against a live daemon: an agent REST propose delivers a signed POST whose body is the subscription's stored query executed against the ProposalEvent payload. - service: an EventSink seam (service/events.go). Propose emits PROPOSAL_OPENED for a new proposal, mergeProposal emits PROPOSAL_MERGED (the single merge point — both auto-merge and the human approve reach it), Reject emits PROPOSAL_REJECTED. Nil-safe; a Service with no sink emits nothing. - graph.NewProposalEvent builds the *model.ProposalEvent payload from a service.Proposal (reusing the existing service→graph→model mapping). - cmd webhookEventSink: proposal events happen in the service layer, which has none of core-go's request context, so the sink enqueues a dowork task onto the webhook queue. The task runs in the queue's worker context (server+database+config, from WithQueues), adds the owner's INTERNAL auth, and calls Schedule — which renders each subscriber's query and delivers it Ed25519-signed. Fire-and-forget off the write path: a webhook never blocks or fails a proposal write. Phase 5a (webhooks) is complete: DB, the authn→AuthContext bridge, the GraphQL surface, the core-go server wiring, and firing.