@@ -464,17 +464,22 @@ This feature is delivered as a cascade of five stacked pull requests, each
464464building on the previous one:
465465
466466``` text
467- develop ← PR 1 ← PR 2 ← PR 3 ← PR 4 ← PR 5
467+ develop
468+ ← PR 1 docs/key-autorotation-spec
469+ ← PR 2 feat/key-rotation-manual
470+ ← PR 3 feat/key-rotation-scheduler
471+ ← PR 4 feat/key-rotation-notifications
472+ ← PR 5 feat/key-rotation-ui
468473```
469474
470- ### PR 1 — Specification (this document )
475+ ### PR 1 — Specification (` docs/key-autorotation-spec ` → ` develop ` )
471476
472477Publish the complete key auto-rotation specification so reviewers and
473478subsequent PRs have a stable reference. Standardise terminology: ** Key
474479Rotation** for symmetric/asymmetric re-keying, ** Certificate Renewal** for
475480certificate operations.
476481
477- ### PR 2 — Manual rotation for all key types + test vectors
482+ ### PR 2 — Manual rotation for all key types + test vectors ( ` feat/key-rotation-manual ` → ` docs/key-autorotation-spec ` )
478483
479484Implement ` Re-Key ` and ` Re-Key Key Pair ` for all six scenarios described
480485in this document:
@@ -488,7 +493,7 @@ in this document:
488493
489494All test vectors green at merge time. No auto-rotation scheduler in this PR.
490495
491- ### PR 3 — Auto-rotation scheduler + deadline detection
496+ ### PR 3 — Auto-rotation scheduler + deadline detection ( ` feat/key-rotation-scheduler ` → ` feat/key-rotation-manual ` )
492497
493498Background cron that finds due keys and rotates them automatically:
494499
@@ -500,17 +505,21 @@ Background cron that finds due keys and rotates them automatically:
500505 rotation) emitting events via a ` Notifier ` trait (no-op stub until PR 4)
501506- OTel counter ` kms.key.auto_rotation ` on every successful rotation
502507
503- ### PR 4 — Notification system (webhooks )
508+ ### PR 4 — Notification system (` feat/key-rotation-notifications ` → ` feat/key-rotation-scheduler ` )
504509
505- First concrete ` Notifier ` implementation — POST JSON to configured URLs:
510+ ` NotificationsStore ` trait + SMTP email notifier for key renewal warnings and
511+ rotation events:
506512
507- - ** Events** : ` rotation_success ` , ` rotation_failure ` , ` approaching_deadline `
508- - Exponential-backoff retry; failures logged but never block rotation
509- - Configuration designed as an extensible enum for future sinks (email,
510- Slack, cloud pub/sub)
511- - Wizard step for notification endpoint setup
513+ - ** Events stored** : ` rotation_success ` , ` rotation_failure ` , ` approaching_deadline `
514+ - ` dispatch_renewal_warnings() ` background scanner with threshold-based dedup
515+ (` rotate_last_warning_days ` attribute prevents duplicate alerts)
516+ - SMTP email delivery via ` lettre ` ; failures logged but never block rotation
517+ - HTTP API: ` GET /notifications ` , ` GET /notifications/unread/count ` ,
518+ ` POST /notifications/{id}/read ` , ` POST /notifications/read-all `
519+ - ` SmtpConfig ` + ` RenewalNotificationStrategy ` configuration
520+ - ` NoopNotificationsStore ` for the Redis-findex backend
512521
513- ### PR 5 — UI and CLI features
522+ ### PR 5 — UI and CLI features ( ` feat/key-rotation-ui ` → ` feat/key-rotation-notifications ` )
514523
515524Mirror rotation features in the Web UI and ` ckms ` CLI:
516525
0 commit comments