system-prompts-and-models-o.../dealix/auto_client_acquisition/growth_operator/proof_pack.py
Dealix Builder 8942c6e84c feat(growth-operator): Arabic Growth Operator — 10 modules + 16 endpoints + 50 tests
Builds the full Saudi Autonomous Revenue OS surface as 10 deterministic
modules + a 16-endpoint router under /api/v1/growth-operator/.
Approval-first: every outbound is draft. No live send / charge / calendar
insert from this layer.

MODULES (auto_client_acquisition/growth_operator/)

1. client_profile.py — ClientGrowthProfile + Saudi-default approval
   + compliance rules (no cold WhatsApp, blocked keywords, weekly cap,
   quiet_hours_riyadh)
2. contact_importer.py — normalize_phone (Saudi E.164),
   dedupe_contacts (richer-record-wins), classify_contact_source
   (existing/inbound/event/referral/old_lead/cold/unknown), detect_opt_out
   (Arabic + English markers), summarize_import (dashboard report)
3. contactability.py — score_contactability returns
   safe/needs_review/blocked with Arabic reasons; default policy:
   no cold WhatsApp without lawful basis (PDPL Art.5)
4. targeting.py — segment_contacts, rank_targets (filters unsafe),
   recommend_top_10, why_now_stub (deterministic, sector-aware)
5. message_planner.py — draft_arabic_message (Saudi tone, 4-sector
   opener bank, no overhyped phrases, always pending_approval),
   draft_followup (4 outcome modes), draft_objection_response
   (6 indexed Saudi B2B objections with score_delta + next_action)
6. partnership_planner.py — 6 partner types catalog
   (agency / consultant / integrator / crm / community / influencer)
   + suggest_partner_types (size/sector aware) + draft_partner_outreach
   + partner_scorecard (platinum/gold/silver/bronze)
7. meeting_planner.py — build_meeting_agenda (15/20-30/45+ min slot
   plans), build_calendar_draft (Google Calendar shape, live_inserted=False,
   conferenceData for Meet, Asia/Riyadh timezone), build_post_meeting_followup
8. payment_offer.py — sar_to_halalas, build_moyasar_payment_link_draft
   (full payload + in-chat message + 4-plan catalog, live_charged=False)
9. proof_pack.py — build_weekly_proof_pack with grade A+/A/B/C/D,
   activity/money/quality/best-of sections, dynamic next_week_plan_ar,
   markdown export
10. mission_planner.py — 6 GROWTH_MISSIONS (first_10_opportunities 
    kill feature, recover_stalled_deals, partnership_sprint,
    safe_whatsapp_campaign, meeting_booking_sprint, list_cleanup);
    list_missions() + run_mission()

ROUTER (api/routers/growth_operator.py) — 16 endpoints

POST /contacts/import-preview · POST /contactability/score
POST /targets/top-10 · POST /messages/draft · POST /messages/followup
POST /messages/objection-response · POST /partners/suggest
POST /partners/outreach · POST /partners/scorecard
POST /meetings/draft · POST /meetings/post-followup
POST /payment-offer/draft · GET /missions · POST /missions/{id}/run
GET /proof-pack/demo · POST /profile

WIRING: api/main.py adds growth_operator import + router include
(positioned after personal_operator, before public).

DOCS

- docs/ARABIC_GROWTH_OPERATOR_FULL_SPEC.md (NEW): 20-section vision +
  customer-type table + upload flow + contactability rules +
  WhatsApp/Gmail/Calendar/Moyasar drafts + 6 missions + 16-endpoint
  catalog + competitive comparison + beta readiness checklist

TESTS — 50 passing on Python 3.10 venv

tests/unit/test_growth_operator.py covers:
- Phone normalization across 5 input formats including invalid
- Dedupe richer-record invariant
- Source classification (existing/inbound/event/cold/unknown)
- Opt-out detection (Arabic + English notes + status)
- Import summary aggregation
- Contactability: opt-out blocked, cold WhatsApp blocked,
  unknown→needs_review, existing→safe, inbound→safe
- Bulk contactability summary
- Top-10 filtering (unsafe excluded), max-cap enforcement
- Segment buckets
- Arabic message: pending_approval invariant + Arabic content
  + no overhyped phrases (banned list)
- Followup approval invariant
- Objection response: known + unknown→diagnostic
- Partner suggestions size-aware (SMB→agency/consultant/community)
- Partner outreach approval invariant
- Partner unknown type returns error
- Partner scorecard tier ordering
- Meeting agenda + calendar draft (live_inserted=False) +
  Asia/Riyadh timezone + post-followup pending
- Payment: halalas conversion (1 SAR=100), negative raises,
  draft NEVER charges (live_charged=False), unknown plan→error
- Proof pack: grade range + structure + markdown export
- Missions: first_10_opportunities present + kill feature ID
  + run mission known/unknown
- Profile: demo specialized + partial not specialized
  + default compliance blocks 'ضمان 100' + no_cold_whatsapp_without_lawful_basis

VERIFICATION
- 527 unit tests pass (was 477; +50 growth_operator)
- 2 skipped (provider smoke needs API keys)
- AST green on all 13 new files
- Approval invariant holds across every drafting function

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 15:33:11 +03:00

163 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Weekly Proof Pack — evidence the customer can show their CEO/board.
Tracks: opportunities discovered, messages approved, replies, meetings,
deals, pipeline, blocked risks (PDPL gates that fired), revenue leaks
recovered, next week plan.
Pure function. No I/O.
"""
from __future__ import annotations
from datetime import datetime, timezone
from typing import Any
def _grade_week(*, pipeline_sar: float, plan_cost_sar: float, deals_won: int) -> str:
"""Quick A+/A/B/C/D grade for the week."""
if plan_cost_sar <= 0:
return "B"
multiple = pipeline_sar / plan_cost_sar
if multiple >= 5 and deals_won >= 1:
return "A+"
if multiple >= 3:
return "A"
if multiple >= 1.5:
return "B"
if multiple >= 0.5:
return "C"
return "D"
def build_weekly_proof_pack(
*,
customer_id: str,
customer_name: str,
week_label: str,
plan_cost_weekly_sar: float = 750,
# Activity
opportunities_discovered: int = 0,
messages_drafted: int = 0,
messages_approved: int = 0,
messages_sent: int = 0,
replies_received: int = 0,
positive_replies: int = 0,
meetings_booked: int = 0,
meetings_held: int = 0,
proposals_sent: int = 0,
deals_won: int = 0,
# Money
pipeline_added_sar: float = 0.0,
revenue_won_sar: float = 0.0,
# Risk / quality
risky_drafts_blocked: int = 0,
revenue_leaks_recovered: int = 0,
avg_response_minutes: int = 0,
# Best of
best_message_subject: str | None = None,
best_message_reply_rate: float | None = None,
) -> dict[str, Any]:
"""Build the weekly proof pack (Markdown + structured)."""
approve_rate = (
round(messages_approved / messages_drafted, 4) if messages_drafted else 0.0
)
reply_rate = (
round(replies_received / messages_sent, 4) if messages_sent else 0.0
)
grade = _grade_week(
pipeline_sar=pipeline_added_sar,
plan_cost_sar=plan_cost_weekly_sar,
deals_won=deals_won,
)
multiple = round(pipeline_added_sar / plan_cost_weekly_sar, 2) if plan_cost_weekly_sar else 0.0
headline_ar = (
f"{pipeline_added_sar:,.0f} ريال pipeline + "
f"{meetings_booked} اجتماع + {risky_drafts_blocked} مخاطرة محبوطة "
f"خلال {week_label}"
)
activity = {
"فرص مكتشفة": opportunities_discovered,
"مسودات": messages_drafted,
f"موافقات ({approve_rate*100:.0f}%)": messages_approved,
"مُرسلة": messages_sent,
f"ردود ({reply_rate*100:.1f}%)": replies_received,
"ردود إيجابية": positive_replies,
"اجتماعات محجوزة": meetings_booked,
"اجتماعات منعقدة": meetings_held,
"عروض مرسلة": proposals_sent,
"صفقات مكسوبة": deals_won,
}
money = {
"Pipeline مضاف": f"{pipeline_added_sar:,.0f} ريال",
"إيراد محسوم": f"{revenue_won_sar:,.0f} ريال",
"Multiple على تكلفة الأسبوع": f"{multiple}×",
}
quality = {
"drafts خطرة محبوطة (PDPL gates)": risky_drafts_blocked,
"تسريبات إيراد منقذة": revenue_leaks_recovered,
"متوسط زمن الرد (دقيقة)": avg_response_minutes,
}
next_week_plan_ar = []
if reply_rate < 0.05:
next_week_plan_ar.append("اختبر صياغة مختلفة للسطر الأول — معدل الرد منخفض.")
if avg_response_minutes > 60:
next_week_plan_ar.append(f"قلل زمن الرد من {avg_response_minutes} إلى أقل من 60 دقيقة.")
if meetings_booked == 0 and replies_received >= 5:
next_week_plan_ar.append("ركّز على qualifying — ردود كثيرة بدون اجتماع.")
if deals_won == 0 and proposals_sent >= 2:
next_week_plan_ar.append("مراجعة العروض المرسلة + جلسة Deal Coach.")
if not next_week_plan_ar:
next_week_plan_ar.append("ركّز على الـ scale — زد عدد الـ leads بنسبة 30%.")
md_lines = [
f"# Dealix Proof Pack — {customer_name}",
f"**الفترة:** {week_label}",
f"**التقييم:** {grade}",
"",
"## TL;DR",
headline_ar,
"",
"## النشاط",
*(f"- {k}: {v}" for k, v in activity.items()),
"",
"## المال",
*(f"- {k}: {v}" for k, v in money.items()),
"",
"## الجودة + الأمان",
*(f"- {k}: {v}" for k, v in quality.items()),
"",
"## أفضل أداء",
f"- subject الأنجح: {best_message_subject or ''}",
f"- معدل ردها: {(best_message_reply_rate or 0)*100:.1f}%",
"",
"## خطة الأسبوع القادم",
*(f"- {x}" for x in next_week_plan_ar),
"",
f"_Generated by Dealix at {datetime.now(timezone.utc).isoformat()}_",
]
return {
"customer_id": customer_id,
"customer_name": customer_name,
"week_label": week_label,
"grade": grade,
"headline_ar": headline_ar,
"activity": activity,
"money": money,
"quality": quality,
"best_message": {
"subject": best_message_subject,
"reply_rate": best_message_reply_rate,
},
"next_week_plan_ar": next_week_plan_ar,
"markdown_export": "\n".join(md_lines),
"approval_required": False,
"compliance_note_ar": (
"هذا تقرير قراءة فقط — يُولَّد من سجلات حقيقية ولا يحوي أي PII "
"خارج هوية الشركة المشتركة."
),
}