[Feature] Audit-proof single-recipient campaign send #69

Closed
opened 2026-07-14 20:08:41 +02:00 by zemion · 2 comments
Owner

Problem / User Need

Operators sometimes need to send a singular mail to one entry in the recipient list, possibly from template review. This must be audit-proof and included in the protocol.

Acceptance Criteria

  • A single recipient/message can be sent without sending the whole campaign.
  • The action makes clear whether it is a test, resend, partial send, or official send.
  • The send is recorded in campaign protocol/audit output with actor, timestamp, message identity, and reason/context.
  • The UI prevents accidental duplicate official sends unless explicitly allowed.

Notes / Decisions

Needs product decision on terminology and guardrails: test send, partial send, resend, and official one-off send may need different semantics.

## Problem / User Need Operators sometimes need to send a singular mail to one entry in the recipient list, possibly from template review. This must be audit-proof and included in the protocol. ## Acceptance Criteria - A single recipient/message can be sent without sending the whole campaign. - The action makes clear whether it is a test, resend, partial send, or official send. - The send is recorded in campaign protocol/audit output with actor, timestamp, message identity, and reason/context. - The UI prevents accidental duplicate official sends unless explicitly allowed. ## Notes / Decisions Needs product decision on terminology and guardrails: test send, partial send, resend, and official one-off send may need different semantics.
Author
Owner

Codex State: started

Summary

  • Starting implementation: support audit-proof single-message send from preview/review for one recipient entry.

Suggested status label: status/in-progress

## Codex State: started ### Summary - Starting implementation: support audit-proof single-message send from preview/review for one recipient entry. Suggested status label: `status/in-progress`
Author
Owner

Codex State: done

Summary

  • Implemented audit-path single message send from built-message preview with confirmation.
  • Added backend endpoint /campaigns/{campaign_id}/jobs/{job_id}/send using the existing CampaignJob/SendAttempt protocol and EML evidence verification.
  • Added preview footer action, guarded disabled states, and UI status refresh after the one-message send.

Changed Files

  • src/govoplan_campaign/backend/sending/jobs.py
  • src/govoplan_campaign/backend/router.py
  • src/govoplan_campaign/backend/schemas.py
  • webui/src/api/campaigns.ts
  • webui/src/features/campaigns/ReviewSendPage.tsx
  • webui/src/features/campaigns/components/MessagePreviewOverlay.tsx

Verification

  • /mnt/DATA/git/govoplan/.venv/bin/python -m unittest tests.test_zip_service tests.test_attachment_building
  • GOVOPLAN_WEBUI_MODULE_PACKAGES=@govoplan/campaign-webui npm run build (from govoplan-core/webui)
## Codex State: done ### Summary - Implemented audit-path single message send from built-message preview with confirmation. - Added backend endpoint /campaigns/{campaign_id}/jobs/{job_id}/send using the existing CampaignJob/SendAttempt protocol and EML evidence verification. - Added preview footer action, guarded disabled states, and UI status refresh after the one-message send. ### Changed Files - `src/govoplan_campaign/backend/sending/jobs.py` - `src/govoplan_campaign/backend/router.py` - `src/govoplan_campaign/backend/schemas.py` - `webui/src/api/campaigns.ts` - `webui/src/features/campaigns/ReviewSendPage.tsx` - `webui/src/features/campaigns/components/MessagePreviewOverlay.tsx` ### Verification - `/mnt/DATA/git/govoplan/.venv/bin/python -m unittest tests.test_zip_service tests.test_attachment_building` - `GOVOPLAN_WEBUI_MODULE_PACKAGES=@govoplan/campaign-webui npm run build (from govoplan-core/webui)`
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: add-ideas/govoplan-campaign#69
No description provided.