system-prompts-and-models-o.../dealix/auto_client_acquisition/intelligence_layer/command_feed.py
Dealix Builder 4e969131c7 feat(platform+intelligence): Growth Control Tower + Growth Neural Network — 20 modules + 25 endpoints + 60 tests
Platform Services Layer (10 modules) — برج التحكم بالنمو
- event_bus: 27 typed events (whatsapp/email/calendar/lead/payment/review/social/partner/sheet/crm/action)
- identity_resolution: cross-channel merge (phone+email+CRM+social) with confidence scoring
- channel_registry: 11 channels (WA, Gmail, Calendar, Moyasar, LinkedIn, X, IG, GBP, Sheets, CRM, Forms) with capabilities/risk/PDPL notes
- action_policy: 9 rules (block_cold_whatsapp, block_payment_no_confirm, block_secrets, external_send_needs_approval, calendar_insert_needs_approval, social_dm_needs_explicit, unknown_source_review, high_value_deal_review, draft_only_safe)
- tool_gateway: single execution chokepoint, env-flag-gated live actions (default OFF)
- unified_inbox: 8 card types, ≤3 buttons enforced, Arabic
- action_ledger: requested→approved→executed audit trail
- proof_ledger: leads/meetings/drafts/sends/payments/revenue/risks_blocked/time_saved per channel
- service_catalog: 12 sellable services
- router api/routers/platform_services.py — 13 endpoints under /api/v1/platform/

Intelligence Layer (10 modules) — الشبكة العصبية للنمو
- growth_brain: per-customer Brain + is_ready_for_autopilot() (≥30 signals + ≥40% accept)
- command_feed: 9 daily card types (opportunity/revenue_leak/partner_suggestion/meeting_prep/review_response/competitive_move/customer_reactivation/ai_visibility_alert/action_required)
- action_graph: 10 typed edges (signal→action→outcome) with what_works_summary
- mission_engine: 7 missions, KILL FEATURE first_10_opportunities (10 فرص في 10 دقائق)
- decision_memory: learns from accept/skip/edit/block, returns preferences (channels, tones, sectors, rejected actions, accept_rate)
- trust_score: composite 0-100 (source+opt_in+channel+content+freq+approval) → safe/needs_review/blocked
- revenue_dna: best_channel/segment/angle + common_objection + avg_cycle_days
- opportunity_simulator: 9 Saudi sectors, expected_replies/meetings/deals/pipeline_sar + risk_score
- competitive_moves: 8 move types with Arabic recommended_action_ar
- board_brief: weekly Founder Shadow Board (3 decisions + 3 opportunities + 3 risks + relationship + experiment + metric)
- router api/routers/intelligence_layer.py — 12 endpoints under /api/v1/intelligence/

Tests
- tests/unit/test_platform_services.py — 31 tests covering catalog/channels/events/policy/gateway/identity/inbox/ledger/proof
- tests/unit/test_intelligence_layer.py — 29 tests covering brain/feed/graph/missions/memory/trust/dna/simulator/competitive/brief
- 60/60 new tests pass; full suite 587 passed, 2 skipped

Docs
- docs/PLATFORM_SERVICES_STRATEGY.md (Arabic)
- docs/INTELLIGENCE_LAYER_STRATEGY.md (Arabic)
- docs/DEALIX_100_PERCENT_LAUNCH_PLAN.md — added §32 Platform Services + §33 Intelligence Layer

Safety
- No live send by default (all WA/Gmail/Calendar/Moyasar guarded by env flags, all OFF)
- All external actions go through Tool Gateway → Action Policy → draft/approval_required
- No secrets allowed in payloads (block_secrets policy)
- PDPL-aware: cold WhatsApp without consent is hard-blocked
- Existing 477+ tests untouched (no breaking changes)

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

93 lines
4.3 KiB
Python

"""Intelligence Command Feed — Arabic decision cards with ≤3 buttons."""
from __future__ import annotations
from typing import Any
INTEL_CARD_TYPES: tuple[str, ...] = (
"opportunity",
"revenue_leak",
"approval_needed",
"meeting_prep",
"payment_followup",
"partner_suggestion",
"social_signal",
"review_response",
"competitive_move",
)
def build_command_feed_demo() -> dict[str, Any]:
"""Deterministic Arabic command feed for demo + tests."""
cards = [
{
"type": "opportunity",
"title_ar": "فرصة نمو — شركة تدريب في الرياض",
"summary_ar": "نشروا 3 وظائف مبيعات جديدة → توسع واضح في فريق المبيعات.",
"why_it_matters_ar": "التوسع = ميزانية = نافذة شراء ≤30 يوم.",
"recommended_action_ar": "رسالة قصيرة تعرض تجربة 7 أيام.",
"expected_impact_sar": 18_000,
"risk_level": "low",
"buttons_ar": ("قبول", "تخطّي", "اكتب رسالة"),
},
{
"type": "revenue_leak",
"title_ar": "تسريب إيراد — 7 leads بلا متابعة",
"summary_ar": "آخر تواصل قبل 72+ ساعة. الردود تتراجع 14%/ساعة.",
"why_it_matters_ar": "الإهمال خسارة pipeline متراكمة.",
"recommended_action_ar": "اعتمد 7 follow-ups جاهزة.",
"expected_impact_sar": 42_000,
"risk_level": "medium",
"buttons_ar": ("اعتمد", "عدّل", "تخطّي"),
},
{
"type": "partner_suggestion",
"title_ar": "فرصة شراكة — وكالة B2B في جدة",
"summary_ar": "عملاؤها يحتاجون lead-gen → Dealix يكمل خدماتها.",
"why_it_matters_ar": "الشراكة الواحدة تفتح 3-5 leads warmer.",
"recommended_action_ar": "رسالة partnership warm + اقتراح pilot.",
"expected_impact_sar": 60_000,
"risk_level": "low",
"buttons_ar": ("اكتب رسالة", "احجز اجتماع", "تخطّي"),
},
{
"type": "meeting_prep",
"title_ar": "اجتماع غداً مع شركة العقار الذهبي",
"summary_ar": "جاهز: ملف الشركة + 5 أسئلة + 3 اعتراضات + عرض مناسب.",
"why_it_matters_ar": "الاجتماع المُحضَّر يرفع الإغلاق 40%+.",
"recommended_action_ar": "افتح التحضير + راجع الأجندة.",
"expected_impact_sar": 250_000,
"risk_level": "low",
"buttons_ar": ("افتح التحضير", "اكتب أجندة", "أرسل تأكيد"),
},
{
"type": "review_response",
"title_ar": "تقييم Google جديد — 2 نجوم",
"summary_ar": "العميل اشتكى من التأخر في الرد.",
"why_it_matters_ar": "تقييم سلبي بدون رد ≤24 ساعة يضرّ السمعة المحلية.",
"recommended_action_ar": "اعتذار قصير + طلب تواصل + حل.",
"expected_impact_sar": 1_000,
"risk_level": "high",
"buttons_ar": ("اعتمد الرد", "صعّد للمدير", "تخطّي"),
},
{
"type": "competitive_move",
"title_ar": "منافس أطلق pricing جديد",
"summary_ar": "خفّضوا 15% على باقة Growth — يستهدفون نفس عملاءك.",
"why_it_matters_ar": "الردود السريعة تحفظ الـ pipeline.",
"recommended_action_ar": "حملة مضادة + ROI breakdown مقارن.",
"expected_impact_sar": 80_000,
"risk_level": "medium",
"buttons_ar": ("جهّز رد", "نبّه المبيعات", "تخطّي"),
},
]
# Validate constraints
for c in cards:
assert c["type"] in INTEL_CARD_TYPES
assert len(c["buttons_ar"]) <= 3
return {
"feed_size": len(cards),
"cards": cards,
"policy_note_ar": "كل كرت عربي + ≤3 buttons + approval-aware.",
}