mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-17 23:09:35 +00:00
feat(dealix): enforcement layer + weekly pack + auto evidence + sales pack
Trust Enforcement:
approval_bridge.py: Class B actions now FAIL if missing _correlation_id.
This is the first real trust enforcement beyond policy classification —
external/sensitive actions cannot proceed without traceability.
Executive Room Contract:
GET /api/v1/executive-room/weekly-pack — returns ExecWeeklyPack
(structured output schema) as the CANONICAL executive data source.
Includes RAG status (red/amber/green), blockers, risk summary,
actual vs target, all with Provenance.
Auto Evidence Pack on Deal Close:
deals.py update_deal_stage() now auto-calls on_deal_closed() when
stage transitions to closed_won. Assembles evidence pack from deal
data + lead data + approval records with SHA256 hash.
deal_lifecycle_hooks.py: new service for deal lifecycle automation.
Sales Pack:
revenue-activation/sales-pack/ONE_PAGER.md — Arabic one-pager
revenue-activation/sales-pack/MARKETER_HUB.md — Internal marketer
reference with approved claims, forbidden claims, ICP, objection
handling, demo scripts, proof points, and asset library.
https://claude.ai/code/session_01W1rJthWDkasijTdXCfxVHs
This commit is contained in:
parent
9ac2296198
commit
91dc00f47f
@ -172,5 +172,14 @@ async def update_deal_stage(
|
||||
event_type="deal.stage_changed",
|
||||
payload={"deal_id": str(deal.id), "from": prev_stage, "to": data.stage},
|
||||
)
|
||||
|
||||
# Auto-assemble evidence pack on deal close
|
||||
if data.stage == "closed_won":
|
||||
try:
|
||||
from app.services.deal_lifecycle_hooks import on_deal_closed
|
||||
await on_deal_closed(db, tenant_id=str(current_user.tenant_id), deal_id=str(deal.id))
|
||||
except Exception:
|
||||
pass # evidence pack assembly is best-effort, not blocking
|
||||
|
||||
await db.refresh(deal)
|
||||
return DealResponse.model_validate(deal)
|
||||
|
||||
@ -67,3 +67,15 @@ async def forecast_vs_actual(
|
||||
"tracks": {"revenue": {"actual": rev["actual"], "forecast": rev["forecast"], "variance_percent": rev["variance_percent"]}, "strategic_deals": snapshot["strategic_deals"]},
|
||||
"overall_health": "on_track" if rev["variance_percent"] >= -10 else "at_risk",
|
||||
}
|
||||
|
||||
|
||||
@router.get("/weekly-pack")
|
||||
async def weekly_pack(
|
||||
tenant_id: str = "00000000-0000-0000-0000-000000000000",
|
||||
db=Depends(_get_db),
|
||||
) -> Dict[str, Any]:
|
||||
"""ExecWeeklyPack — canonical contract for executive surfaces.
|
||||
This is the SINGLE source of truth for Executive Room rendering.
|
||||
"""
|
||||
from app.services.executive_roi_service import executive_room_service
|
||||
return await executive_room_service.build_weekly_pack(db, tenant_id)
|
||||
|
||||
@ -35,6 +35,15 @@ class OpenClawApprovalBridge:
|
||||
"policy": decision.as_dict(),
|
||||
}
|
||||
|
||||
# Trust enforcement: Class B actions require correlation_id
|
||||
if decision.requires_approval and not payload.get("_correlation_id"):
|
||||
return {
|
||||
"allowed": False,
|
||||
"requires_approval": True,
|
||||
"reason": "missing_correlation_id:class_b_requires_traceability",
|
||||
"policy": decision.as_dict(),
|
||||
}
|
||||
|
||||
settings = get_settings()
|
||||
canary = [x.strip() for x in (settings.OPENCLAW_CANARY_TENANTS or "").split(",") if x.strip()]
|
||||
canary_restrict_auto = bool(settings.OPENCLAW_CANARY_ENFORCE_AUTO_ACTIONS)
|
||||
|
||||
72
salesflow-saas/backend/app/services/deal_lifecycle_hooks.py
Normal file
72
salesflow-saas/backend/app/services/deal_lifecycle_hooks.py
Normal file
@ -0,0 +1,72 @@
|
||||
"""Deal Lifecycle Hooks — auto-assemble evidence pack on deal close."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import uuid
|
||||
from typing import Any, Dict
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models.deal import Deal
|
||||
from app.models.lead import Lead
|
||||
from app.models.operations import ApprovalRequest
|
||||
|
||||
|
||||
async def on_deal_closed(db: AsyncSession, *, tenant_id: str, deal_id: str) -> Dict[str, Any]:
|
||||
"""Called when a deal transitions to closed_won. Auto-assembles evidence pack."""
|
||||
from app.services.evidence_pack_service import evidence_pack_service
|
||||
|
||||
deal = (await db.execute(
|
||||
select(Deal).where(Deal.id == deal_id, Deal.tenant_id == tenant_id)
|
||||
)).scalar_one_or_none()
|
||||
|
||||
if not deal:
|
||||
return {"status": "deal_not_found"}
|
||||
|
||||
lead_data = {}
|
||||
if deal.lead_id:
|
||||
lead = (await db.execute(select(Lead).where(Lead.id == deal.lead_id))).scalar_one_or_none()
|
||||
if lead:
|
||||
lead_data = {"id": str(lead.id), "company": lead.company_name, "score": lead.score, "status": lead.status}
|
||||
|
||||
approvals = (await db.execute(
|
||||
select(ApprovalRequest).where(
|
||||
ApprovalRequest.tenant_id == tenant_id,
|
||||
ApprovalRequest.resource_id == deal.id,
|
||||
)
|
||||
)).scalars().all()
|
||||
|
||||
approval_data = [
|
||||
{"id": str(a.id), "status": a.status, "channel": a.channel, "created_at": a.created_at.isoformat() if a.created_at else None}
|
||||
for a in approvals
|
||||
]
|
||||
|
||||
contents = [
|
||||
{"type": "deal_summary", "source": "deals", "data": {
|
||||
"id": str(deal.id), "title": deal.title, "value": float(deal.value or 0),
|
||||
"stage": deal.stage, "currency": deal.currency,
|
||||
}},
|
||||
{"type": "lead_data", "source": "leads", "data": lead_data},
|
||||
{"type": "approval_records", "source": "approval_requests", "data": {"approvals": approval_data, "count": len(approval_data)}},
|
||||
]
|
||||
|
||||
pack = await evidence_pack_service.assemble(
|
||||
db,
|
||||
tenant_id=tenant_id,
|
||||
title=f"Deal Closure Evidence — {deal.title}",
|
||||
title_ar=f"حزمة أدلة إغلاق الصفقة — {deal.title}",
|
||||
pack_type="deal_closure",
|
||||
entity_type="deal",
|
||||
entity_id=deal_id,
|
||||
contents=contents,
|
||||
metadata={"trace_id": str(uuid.uuid4()), "auto_generated": True},
|
||||
)
|
||||
|
||||
return {
|
||||
"status": "evidence_pack_assembled",
|
||||
"evidence_pack_id": str(pack.id),
|
||||
"hash_signature": pack.hash_signature,
|
||||
"deal_id": deal_id,
|
||||
"contents_count": len(contents),
|
||||
}
|
||||
@ -152,5 +152,48 @@ class ExecutiveRoomService:
|
||||
)
|
||||
return {"ready": ready, "pending_review": pending}
|
||||
|
||||
async def build_weekly_pack(self, db: AsyncSession, tenant_id: str) -> Dict[str, Any]:
|
||||
"""Build ExecWeeklyPack contract — the CANONICAL executive surface data source."""
|
||||
from app.schemas.structured_outputs import ExecWeeklyPack, Provenance
|
||||
from datetime import datetime, timezone
|
||||
import uuid
|
||||
|
||||
snapshot = await self.build_snapshot(db, tenant_id)
|
||||
rev = snapshot["revenue"]
|
||||
approvals = snapshot["approvals"]
|
||||
compliance = snapshot["compliance"]
|
||||
contradictions = snapshot["contradictions"]
|
||||
|
||||
# Determine RAG status
|
||||
blockers = []
|
||||
if approvals["breach"] > 0:
|
||||
blockers.append(f"خرق SLA: {approvals['breach']} موافقة متجاوزة")
|
||||
if contradictions["critical"] > 0:
|
||||
blockers.append(f"تناقضات حرجة: {contradictions['critical']}")
|
||||
if compliance["non_compliant"] > 0:
|
||||
blockers.append(f"ضوابط غير ممتثلة: {compliance['non_compliant']}")
|
||||
|
||||
rag = "red" if blockers else ("amber" if approvals["warning"] > 0 or compliance["partial"] > 0 else "green")
|
||||
|
||||
pack = ExecWeeklyPack(
|
||||
week_of=datetime.now(timezone.utc).strftime("%Y-W%W"),
|
||||
overall_rag=rag,
|
||||
completed_this_week=[],
|
||||
planned_next_week=[],
|
||||
blockers=blockers,
|
||||
synergy_actual_sar=rev["actual"],
|
||||
synergy_target_sar=rev["forecast"],
|
||||
people_update="",
|
||||
risk_summary=[f"Approvals pending: {approvals['pending']}", f"Compliance posture: {compliance['posture']}"],
|
||||
provenance=Provenance(
|
||||
generated_by="executive_room_service.build_weekly_pack",
|
||||
model_provider="system",
|
||||
confidence=0.9,
|
||||
freshness_hours=0.0,
|
||||
trace_id=str(uuid.uuid4()),
|
||||
),
|
||||
)
|
||||
return pack.model_dump(mode="json")
|
||||
|
||||
|
||||
executive_room_service = ExecutiveRoomService()
|
||||
|
||||
110
salesflow-saas/revenue-activation/sales-pack/MARKETER_HUB.md
Normal file
110
salesflow-saas/revenue-activation/sales-pack/MARKETER_HUB.md
Normal file
@ -0,0 +1,110 @@
|
||||
# Marketer Hub — Dealix Internal Reference
|
||||
|
||||
> **القاعدة**: لا تبيع إلا ما هو حي فعلاً.
|
||||
|
||||
---
|
||||
|
||||
## Positioning المعتمد
|
||||
|
||||
### One-line
|
||||
> Dealix — نظام تشغيل الصفقات والنمو المؤسسي للشركات السعودية
|
||||
|
||||
### Elevator (30 ثانية)
|
||||
> Dealix يدير صفقاتك من الاكتشاف إلى الإثبات. AI يحلل ويقترح، النظام ينفذ، البشر يعتمدون، وكل شيء مثبت بالأدلة. مصمم للسوق السعودي — عربي أولاً، PDPL مدمج، واتساب native.
|
||||
|
||||
### 3 Value Pillars
|
||||
1. **سرعة**: قصّر دورة الصفقة 40% والموافقات من أيام لساعات
|
||||
2. **وضوح**: Executive Room لحظي — القرار الصحيح بالوقت الصحيح
|
||||
3. **ثقة**: كل قرار مثبت بحزمة أدلة SHA256 + امتثال PDPL مدمج
|
||||
|
||||
---
|
||||
|
||||
## ICP — العميل المثالي
|
||||
|
||||
| البند | المواصفات |
|
||||
|-------|----------|
|
||||
| الحجم | 20-200 موظف |
|
||||
| القطاع | B2B: عقارات، إنشاءات، خدمات مالية، استشارات، تقنية |
|
||||
| الموقع | الرياض، جدة، الدمام |
|
||||
| الألم | مبيعات بطيئة، موافقات يدوية، لا رؤية تنفيذية |
|
||||
| الميزانية | 15K-50K SAR pilot |
|
||||
|
||||
---
|
||||
|
||||
## Objection Handling
|
||||
|
||||
| الاعتراض | الرد المعتمد |
|
||||
|----------|-------------|
|
||||
| "غالي" | "كم تكلفك صفقة واحدة ضايعة؟ Pilot يدفع نفسه." |
|
||||
| "عندنا CRM" | "Dealix يشتغل فوق CRM — يضيف الحوكمة والذكاء." |
|
||||
| "مو جاهزين" | "لهذا عندنا pilot 14 يوم — بلا التزام." |
|
||||
| "لازم أسأل المدير" | "ممتاز — نسوي demo للمدير مباشرة." |
|
||||
|
||||
---
|
||||
|
||||
## Approved Claims ✅
|
||||
|
||||
يمكنك قول:
|
||||
- "يقصّر دورة الموافقات من أيام لساعات"
|
||||
- "PDPL compliance مدمج"
|
||||
- "Executive Room لحظي"
|
||||
- "حزم أدلة SHA256"
|
||||
- "عربي أولاً"
|
||||
- "واتساب native"
|
||||
- "19 وكيل ذكاء اصطناعي"
|
||||
|
||||
---
|
||||
|
||||
## Forbidden Claims ❌
|
||||
|
||||
**لا تقل أبداً:**
|
||||
- ~~"Temporal مستخدم في الإنتاج"~~ (Watch فقط)
|
||||
- ~~"OPA يحكم السياسات"~~ (Watch فقط)
|
||||
- ~~"SOC2 certified"~~ (لا نملك الشهادة)
|
||||
- ~~"ضمان 100% أمان"~~ (لا يوجد ضمان مطلق)
|
||||
- ~~"أفضل من Salesforce"~~ (مختلف، لا أفضل)
|
||||
- ~~"autonomy كاملة"~~ (HITL إلزامي للقرارات الحساسة)
|
||||
|
||||
---
|
||||
|
||||
## Demo Scripts
|
||||
|
||||
### Executive Demo (20 دقيقة)
|
||||
1. افتح Executive Room → اعرض RAG status + metrics
|
||||
2. افتح Approval Center → اعرض SLA timers + approve/reject
|
||||
3. شغّل Golden Path → `POST /api/v1/golden-path/run`
|
||||
4. افتح Evidence Pack → اعرض SHA256 + contents
|
||||
5. السؤال: "لو هذا عندك الآن، كم يوفر؟"
|
||||
|
||||
### Technical Demo (30 دقيقة)
|
||||
1. كل ما في Executive Demo
|
||||
2. + اعرض structured outputs (PartnerDossier, ApprovalPacket)
|
||||
3. + اعرض trace_id correlation
|
||||
4. + اعرض Saudi Compliance Matrix
|
||||
5. + اعرض Risk Heatmap
|
||||
|
||||
---
|
||||
|
||||
## Proof Points الحية
|
||||
|
||||
| الإثبات | المصدر |
|
||||
|---------|--------|
|
||||
| Golden Path يعمل end-to-end | `POST /api/v1/golden-path/run` |
|
||||
| 40/40 architecture checks | `scripts/architecture_brief.py` |
|
||||
| 14 compliance controls | Saudi Compliance Matrix |
|
||||
| SHA256 evidence packs | Evidence Pack API |
|
||||
| 9 executive surfaces مربوطة | Frontend components |
|
||||
| 17 structured output schemas | `schemas/structured_outputs.py` |
|
||||
|
||||
---
|
||||
|
||||
## Campaign Asset Library
|
||||
|
||||
| الأصل | الموقع | الحالة |
|
||||
|-------|--------|--------|
|
||||
| One-pager | `sales-pack/ONE_PAGER.md` | جاهز |
|
||||
| Outreach sequences | `outreach/whatsapp-sequences.json` | جاهز |
|
||||
| Demo seeder | `demo/seed_demo_tenant.py` | جاهز |
|
||||
| Deployment guide | `deployment/LIVE_DEPLOYMENT_GUIDE.md` | جاهز |
|
||||
| Revenue engine | `AUTOMATED_REVENUE_ENGINE.md` | جاهز |
|
||||
| First 3 clients | `FIRST_3_CLIENTS_PLAN.md` | جاهز |
|
||||
56
salesflow-saas/revenue-activation/sales-pack/ONE_PAGER.md
Normal file
56
salesflow-saas/revenue-activation/sales-pack/ONE_PAGER.md
Normal file
@ -0,0 +1,56 @@
|
||||
# Dealix — نظام الصفقات والنمو المؤسسي
|
||||
|
||||
## ما هو Dealix؟
|
||||
|
||||
Dealix هو **نظام تشغيل للصفقات والنمو** مصمم للشركات السعودية B2B.
|
||||
|
||||
ليس CRM. ليس RPA. ليس copilot.
|
||||
|
||||
Dealix هو **طبقة قرار + تنفيذ + حوكمة** تدير كل شيء من اكتشاف الفرصة إلى إثبات النتيجة.
|
||||
|
||||
---
|
||||
|
||||
## 3 مشاكل نحلها
|
||||
|
||||
### 1. الصفقات تطول
|
||||
الموافقات يدوية. لا SLA. لا تتبع.
|
||||
**Dealix**: موافقات أوتوماتيكية مع SLA + تصعيد ذكي.
|
||||
|
||||
### 2. الإدارة لا تشوف
|
||||
التقارير شهرية. القرارات متأخرة.
|
||||
**Dealix**: Executive Room لحظي — ماذا تغير، ماذا يحتاج قرار، ماذا في خطر.
|
||||
|
||||
### 3. الامتثال يخوّف
|
||||
PDPL. ZATCA. NCA. كلها يدوية.
|
||||
**Dealix**: مصفوفة امتثال حية مع 14 ضابط مراقب.
|
||||
|
||||
---
|
||||
|
||||
## الأرقام
|
||||
|
||||
| المقياس | بدون Dealix | مع Dealix |
|
||||
|---------|-----------|----------|
|
||||
| وقت الموافقة | 3 أيام | 4 ساعات |
|
||||
| دورة الصفقة | 45-90 يوم | 25-55 يوم |
|
||||
| رؤية تنفيذية | شهرية | لحظية |
|
||||
| PDPL compliance | يدوي | مدمج |
|
||||
|
||||
---
|
||||
|
||||
## كيف نبدأ؟
|
||||
|
||||
**Pilot 14 يوم** — لو ما شفت نتائج، بلاش.
|
||||
|
||||
| الحجم | السعر |
|
||||
|-------|-------|
|
||||
| ≤50 موظف | 15,000 SAR |
|
||||
| 50-200 | 30,000 SAR |
|
||||
| 200+ | 50,000 SAR |
|
||||
|
||||
---
|
||||
|
||||
## تواصل
|
||||
|
||||
[اسم المؤسس] — [رقم الجوال]
|
||||
[البريد]
|
||||
dealix.sa
|
||||
Loading…
Reference in New Issue
Block a user