Triage when customers report contract emails going to the 'wrong' people or too many CCs—especially conflating internal review assignment with approval-step emails, or unexpected CC on review-required mail. Trigger on: 'review email CC', 'approval email wrong recipients', 'Contract Review Approval', 'emails sent to whole review team', 'extra users on review notification', 'CONTRACT_REVIEW_REQUIRED', Fractal-style SOW workflow complaints, or support comparing review vs Contracts Review Team.
Two different product mechanisms send different emails to different role groups. Many escalations mistake one for the other, or assume a bug when workspace email config adds CC to creator-party review mail.
CONTRACT_REVIEW_REQUIRED style notifications tied to Admin / review assignment) vs approval steps (e.g. named “Contract Review Approval”, often tied to Contracts Review Team or other approval assignees).CONTRACT_EXECUTED, so configured lists can append on every send.Use email-delivery-triage for non-delivery, bounces, OTP, Postmark suppression—not for this recipient-construction class unless delivery also failed.
| Tool | Use |
|---|---|
| Slack MCP | Similar incidents, thread context |
| BigQuery MCP | QA datasets only; prod DB patterns need admin / Metabase |
| Groundcover / GCP Logging | Confirm send path, timestamps, workload |
| Atlassian | Linked bugs (e.g. SPD-43065 class) |
| Codebase | django-rest-api paths below |
email-delivery-triage.From email audit (Django admin), customer forward, or subject/body:
| Signal | Likely mechanism |
|---|---|
| Wording like “Approval requested for” (or approval-task template) | Approval notification → recipients follow approval assignment / team for that step (name may still say “Review”). |
| Review request / internal review assignment copy; workflow moved to review with Admin-side task | CONTRACT_REVIEW_REQUIRED path — goes to assigned reviewer (POC) for that review task; Admin team membership drives who is “in scope” for review, not the Contracts Review Team used for a separate approval step. |
Known example (Fractal, 2026-03): An approval was named “Contract Review Approval” and assigned to Contracts Review Team, while review was assigned to Admin. Screenshots showed review request emails; those correctly targeted Admin-side recipients. Customer expected approval-team-only mail. Resolution: clarify product behavior + naming; treat as WAI for recipient choice if the email type matches review, not approval.
If Step 1 already explains all recipients, stop or close with CS messaging—do not chase EmailConfig.
{contract_id}, assigned role/team vs email TO line.email_type (or equivalent) and raw TO/CC.Placeholders: {contract_id}, {wsid}, {workspace_id}, {cluster}, {wfid}.
If the audit shows CONTRACT_REVIEW_REQUIRED (or you have confirmed the send is from SendContractReviewRequiredEmailUseCase) and CC lists include addresses that are not explained by Step 1–2:
{workspace_id} and the contract’s contract type:
config_for in creator-party / ALL_EMAILS scope.email_type = CONTRACT_REVIEW_REQUIRED or NULL (broad match).Why config applies (code): FilterEmailCcBccAuditForContractEmailsUseCase._get_linked_to_entity_id_and_type only sets entity linkage for CONTRACT_EXECUTED; other types return empty audit → BaseSendEmailUseCase._get_final_cc_bcc_lists uses if not send_request.is_email_to_creator_party or email_cc_bcc_audit is None and then _get_custom_email_config merges configured CC/BCC.
Key files:
contracts_v3/services/contract_communication_service.py — communication_on_workflow_status_update_to_reviewcontracts_v3/contract/domain/use_cases/send_contract_review_required_email_use_case.py — email_type → CONTRACT_REVIEW_REQUIREDemails/email/domain/use_cases/base_send_email_use_case.py — _get_final_cc_bcc_listscontracts_v3/contract/domain/use_cases/filter_email_cc_bcc_audit_for_contract_emails_use_case.py — audit entity linking (today effectively executed-only)GCP / Groundcover around the send time for {contract_id} on the prod Django app for the cluster; correlate with email audit UUID / Postmark if needed.
CONTRACT_EXECUTED types (see Step 3)._get_custom_email_config in SendContractReviewRequiredEmailUseCase to return None, or extend CC/BCC audit to CONTRACT_REVIEW_REQUIRED with clear re-trigger semantics).ContractCommunicationService or template routing—engage contracts/workflow owners with request IDs and audit IDs.#incident-20260331-medium-fractal-auto-triggered-review-emails-sent-to-additional — Fractal, {workspace_id} 391689, {contract_id} 1857940, WFID 2714; Rootly 3060; Jira SPD-43065. Final CS stance: review vs approval confusion (WAI); parallel engineering analysis documented EmailConfig + audit behavior for true CC inflation cases.email-delivery-triage — delivery failures, suppression, OTP.resume-approvals-not-visible — approval state / UI, not email recipients.