mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-19 07:49:34 +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",
|
event_type="deal.stage_changed",
|
||||||
payload={"deal_id": str(deal.id), "from": prev_stage, "to": data.stage},
|
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)
|
await db.refresh(deal)
|
||||||
return DealResponse.model_validate(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"]},
|
"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",
|
"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(),
|
"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()
|
settings = get_settings()
|
||||||
canary = [x.strip() for x in (settings.OPENCLAW_CANARY_TENANTS or "").split(",") if x.strip()]
|
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)
|
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}
|
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()
|
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