mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-17 23:09:35 +00:00
PROBLEM
The codebase used Python 3.11+ stdlib features (`from datetime import UTC`,
`from enum import StrEnum`) in 22 files, breaking local dev on Python 3.10
(Windows users) and any pytest run that imports the affected modules.
SOLUTION
1. New `core/_py_compat.py` providing UTC + StrEnum shims that:
- On 3.11+ re-export the stdlib names (zero overhead)
- On 3.10 fall back to `timezone.utc` and a (str, Enum) backport
2. All 22 affected files patched to import from the shim:
- core/utils.py, core/config/models.py
- api/routers/admin.py
- auto_client_acquisition/{ai/model_router, agents/{intake,icp_matcher},
v3/{memory,agents,compliance_os,market_radar},
personal_operator/{operator,memory,launch_report},
innovation/{proof_ledger_repo,command_feed_live}}.py
- autonomous_growth/agents/sector_intel.py
- dealix/{trust/{approval,tool_verification,policy},
observability/cost_tracker,
contracts/{evidence_pack,event_envelope,audit_log,decision},
classifications/__init__,
governance/approvals}.py
3. Three new test suites for previously-untested layers (54 tests):
- tests/unit/test_business_suite.py — gtm_plan, launch_metrics,
market_positioning, pricing_strategy, proof_pack, unit_economics,
verticals (28 tests covering plan recommendation, performance fee,
ROI math, account health grading, vertical playbook structure)
- tests/unit/test_innovation_suite.py — aeo_radar, command_feed,
deal_rooms, experiments, growth_missions, proof_ledger, ten_in_ten
(18 tests covering deterministic reproducibility, card type taxonomy,
pending-approval invariant, kill-mission visibility)
- tests/unit/test_ai_model_router.py — ModelTask + get_model_route +
estimate_model_cost_class + requires_guardrail (8 tests covering
enum integrity, route round-trip, guardrail bool contract)
VERIFICATION
- ast.parse green on all 22 patched files
- pytest tests/unit/ → 477 passed, 2 skipped (provider smoke needs API keys)
on Python 3.10.12 venv with project requirements installed
- No behavior change on 3.11+: the shim re-exports stdlib symbols
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
73 lines
3.0 KiB
Python
73 lines
3.0 KiB
Python
"""PDPL-first Compliance OS for Dealix v3."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from core._py_compat import StrEnum
|
|
from typing import Any
|
|
|
|
|
|
class Contactability(StrEnum):
|
|
SAFE = "safe"
|
|
NEEDS_REVIEW = "needs_review"
|
|
BLOCKED = "blocked"
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ContactPolicyInput:
|
|
channel: str
|
|
has_opt_in: bool = False
|
|
has_prior_relationship: bool = False
|
|
is_cold_whatsapp: bool = False
|
|
has_unsubscribed: bool = False
|
|
includes_unsubscribe: bool = True
|
|
contains_sensitive_data: bool = False
|
|
high_value_enterprise: bool = False
|
|
|
|
|
|
def assess_contactability(item: ContactPolicyInput) -> dict[str, Any]:
|
|
reasons: list[str] = []
|
|
status = Contactability.SAFE
|
|
|
|
if item.has_unsubscribed:
|
|
return {"status": Contactability.BLOCKED.value, "score": 0, "reasons": ["Contact previously opted out."]}
|
|
if item.contains_sensitive_data:
|
|
status = Contactability.BLOCKED
|
|
reasons.append("Sensitive personal data detected; manual legal review required.")
|
|
if item.is_cold_whatsapp or (item.channel.lower() == "whatsapp" and not item.has_opt_in and not item.has_prior_relationship):
|
|
status = Contactability.BLOCKED
|
|
reasons.append("Cold WhatsApp is blocked by Dealix safety policy.")
|
|
if item.channel.lower() == "email" and not item.includes_unsubscribe:
|
|
status = Contactability.NEEDS_REVIEW
|
|
reasons.append("Outbound email needs unsubscribe footer and suppression handling.")
|
|
if item.high_value_enterprise and status != Contactability.BLOCKED:
|
|
status = Contactability.NEEDS_REVIEW
|
|
reasons.append("High-value enterprise account requires human approval.")
|
|
if not reasons:
|
|
reasons.append("Low-risk contact path; proceed with audit logging.")
|
|
|
|
score = {Contactability.SAFE: 90, Contactability.NEEDS_REVIEW: 55, Contactability.BLOCKED: 0}[status]
|
|
return {"status": status.value, "score": score, "reasons": reasons}
|
|
|
|
|
|
def campaign_risk_report(contacts: list[ContactPolicyInput]) -> dict[str, Any]:
|
|
results = [assess_contactability(contact) for contact in contacts]
|
|
return {
|
|
"total": len(results),
|
|
"safe": sum(1 for result in results if result["status"] == Contactability.SAFE.value),
|
|
"needs_review": sum(1 for result in results if result["status"] == Contactability.NEEDS_REVIEW.value),
|
|
"blocked": sum(1 for result in results if result["status"] == Contactability.BLOCKED.value),
|
|
"items": results,
|
|
}
|
|
|
|
|
|
def ropa_stub(process_name: str, purpose: str, retention_days: int = 365) -> dict[str, Any]:
|
|
return {
|
|
"process_name": process_name,
|
|
"purpose": purpose,
|
|
"data_categories": ["business contact", "company profile", "conversation metadata"],
|
|
"lawful_basis_note": "Record and review per PDPL operating policy before production outreach.",
|
|
"retention_days": retention_days,
|
|
"security_controls": ["audit_log", "role_based_access", "suppression_list", "data_minimization"],
|
|
}
|