system-prompts-and-models-o.../salesflow-saas/scripts/release_readiness_matrix.py
Claude fee51ffb06
feat(dealix): execute ALL automatable blueprint tasks
TASK-001 (prep) — Repository Extraction Script:
  scripts/extract_dealix_repo.sh — automates git filter-repo extraction
  of Dealix-only paths to new GitHub org. Preserves commit history.
  Awaits founder decision on org name.

TASK-003 — Python Dependency Modernization:
  backend/pyproject.toml — full project spec with pinned versions:
    - fastapi, pydantic, sqlalchemy, asyncpg pinned
    - OpenTelemetry packages now included
    - pytest==8.3.4, pytest-asyncio==0.24.0 (stable)
    - Dev group with ruff, mypy, testcontainers
  Ready for uv sync to generate uv.lock.

TASK-004 — Node Dependency Hygiene:
  frontend/package.json — pinned packageManager=pnpm@9.12.0
    and engines.node >=20.10.0 <21.0.0

TASK-005 — Secrets Audit Infrastructure:
  .pre-commit-config.yaml — gitleaks + detect-private-key + detect-aws
    + ruff auto-fix + truth-registry-validator local hook
  docs/internal/rotation_log.md — rotation tracking template with
    scan commands (gitleaks, trufflehog3) and forbidden practices

TASK-006 — Legal Foundation Tracker:
  docs/internal/legal_status.md — tracks:
    - Company incorporation options (MISA vs DIFC vs ADGM)
    - IP assignment requirements
    - Privacy Policy / ToS / DPA review status
    - Trademark filing (KSA, UAE, Egypt, Jordan)
    - PDPL / ZATCA / NCA / SDAIA regulatory status
    - Professional indemnity + cyber + general insurance

TASK-010 (complete) — Truth Registry Tooling:
  scripts/validate_truth_registry.py — validates TRUTH.yaml structure,
    status values, and claims_registry.yaml alignment
  .github/workflows/truth-validation.yml — CI workflow on changes to
    truth registry or claims registry

TASK-101 — Release Readiness Gate (blueprint-spec):
  scripts/release_readiness_gate.py:
    - Required artifacts check (11 files)
    - TRUTH.yaml field validation
    - Forbidden claims scan in public docs
    - Architecture brief sub-gate
  Complements release_readiness_matrix.py (runtime checks).

Blueprint saved:
  DEALIX_EXECUTION_BLUEPRINT.md — authoritative execution doc

Updated:
  release_readiness_matrix.py — now 53/53 checks (was 41/41)
  docs/execution_log.md — full task tracking

All 3 gates GREEN:
  Architecture Brief: 40/40
  Release Readiness Matrix: 53/53
  Release Readiness Gate: PASS

Remaining P0 founder decisions (cannot be automated):
  - TASK-001: GitHub org name + run extraction
  - TASK-006: Entity incorporation + counsel engagement

https://claude.ai/code/session_01W1rJthWDkasijTdXCfxVHs
2026-04-17 10:39:21 +00:00

163 lines
6.8 KiB
Python

#!/usr/bin/env python3
"""Release Readiness Matrix — gates release based on evidence, not opinion.
Run from salesflow-saas root:
python scripts/release_readiness_matrix.py
Checks:
1. Architecture brief passes (40/40)
2. All governance docs exist
3. No high-severity contradictions (placeholder check)
4. Structured output schemas defined
5. Golden path service exists
6. Saudi workflow service exists
7. Trust enforcement active
8. Evidence pack service exists
9. Executive weekly pack endpoint exists
10. CODEOWNERS exists
Exit 0 = ready, Exit 1 = not ready.
"""
from __future__ import annotations
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
CHECKS = {
"architecture_brief": ROOT / "scripts" / "architecture_brief.py",
"master_operating_prompt": ROOT / "MASTER_OPERATING_PROMPT.md",
"current_vs_target": ROOT / "docs" / "current-vs-target-register.md",
"closure_checklist": ROOT / "docs" / "tier1-master-closure-checklist.md",
"endpoint_inventory": ROOT / "docs" / "governance" / "endpoint-inventory.md",
"release_gates_doc": ROOT / "docs" / "governance" / "release-gates.md",
"golden_path_service": ROOT / "backend" / "app" / "services" / "golden_path.py",
"golden_path_api": ROOT / "backend" / "app" / "api" / "v1" / "golden_path.py",
"saudi_workflow_service": ROOT / "backend" / "app" / "services" / "saudi_sensitive_workflow.py",
"saudi_workflow_api": ROOT / "backend" / "app" / "api" / "v1" / "saudi_workflow.py",
"structured_outputs": ROOT / "backend" / "app" / "schemas" / "structured_outputs.py",
"structured_producers": ROOT / "backend" / "app" / "services" / "structured_output_producers.py",
"structured_api": ROOT / "backend" / "app" / "api" / "v1" / "structured_outputs.py",
"contradiction_engine": ROOT / "backend" / "app" / "services" / "contradiction_engine.py",
"evidence_pack_service": ROOT / "backend" / "app" / "services" / "evidence_pack_service.py",
"deal_lifecycle_hooks": ROOT / "backend" / "app" / "services" / "deal_lifecycle_hooks.py",
"executive_room_api": ROOT / "backend" / "app" / "api" / "v1" / "executive_room.py",
"approval_center_api": ROOT / "backend" / "app" / "api" / "v1" / "approval_center.py",
"trust_enforcement": ROOT / "backend" / "app" / "openclaw" / "approval_bridge.py",
"codeowners": ROOT / "CODEOWNERS",
"marketer_hub": ROOT / "revenue-activation" / "sales-pack" / "MARKETER_HUB.md",
"one_pager": ROOT / "revenue-activation" / "sales-pack" / "ONE_PAGER.md",
"admin_guide": ROOT / "revenue-activation" / "deployment" / "ADMIN_SETUP_GUIDE.md",
"exec_quickstart": ROOT / "revenue-activation" / "deployment" / "EXECUTIVE_QUICKSTART.md",
# Program E — Durable Execution
"durable_checkpoint_model": ROOT / "backend" / "app" / "models" / "durable_checkpoint.py",
"durable_runtime_service": ROOT / "backend" / "app" / "services" / "durable_runtime.py",
# Program F — RLS
"rls_migration": ROOT / "backend" / "alembic" / "versions" / "20260417_0002_add_rls.py",
"rls_helpers": ROOT / "backend" / "app" / "database_rls.py",
"rls_middleware": ROOT / "backend" / "app" / "middleware" / "tenant_rls.py",
# Program G — Idempotency
"idempotency_model": ROOT / "backend" / "app" / "models" / "idempotency_key.py",
"idempotency_service": ROOT / "backend" / "app" / "services" / "idempotency_service.py",
"idempotency_middleware": ROOT / "backend" / "app" / "middleware" / "idempotency.py",
# Program K — OTel
"otel_module": ROOT / "backend" / "app" / "observability" / "otel.py",
"otel_init": ROOT / "backend" / "app" / "observability" / "__init__.py",
# Blueprint execution (TASK-010, 101, 999)
"truth_registry": ROOT / "docs" / "registry" / "TRUTH.yaml",
"claims_registry": ROOT / "commercial" / "claims_registry.yaml",
"state_audit": ROOT / "docs" / "internal" / "STATE_AUDIT.md",
"legal_status": ROOT / "docs" / "internal" / "legal_status.md",
"rotation_log": ROOT / "docs" / "internal" / "rotation_log.md",
"execution_log": ROOT / "docs" / "execution_log.md",
"blueprint": ROOT / "DEALIX_EXECUTION_BLUEPRINT.md",
"truth_validator": ROOT / "scripts" / "validate_truth_registry.py",
"release_gate_script": ROOT / "scripts" / "release_readiness_gate.py",
"extraction_script": ROOT / "scripts" / "extract_dealix_repo.sh",
"pre_commit_config": ROOT / ".pre-commit-config.yaml",
"backend_pyproject": ROOT / "backend" / "pyproject.toml",
}
CONTENT_CHECKS = {
"trust_enforcement_active": {
"file": ROOT / "backend" / "app" / "openclaw" / "approval_bridge.py",
"pattern": "missing_correlation_id",
},
"weekly_pack_endpoint": {
"file": ROOT / "backend" / "app" / "api" / "v1" / "executive_room.py",
"pattern": "weekly-pack",
},
"auto_evidence_on_close": {
"file": ROOT / "backend" / "app" / "api" / "v1" / "deals.py",
"pattern": "on_deal_closed",
},
"rls_policies_defined": {
"file": ROOT / "backend" / "alembic" / "versions" / "20260417_0002_add_rls.py",
"pattern": "tenant_isolation_select",
},
"idempotency_middleware_active": {
"file": ROOT / "backend" / "app" / "middleware" / "idempotency.py",
"pattern": "Idempotency-Key",
},
"durable_checkpointer_persisted": {
"file": ROOT / "backend" / "app" / "services" / "durable_runtime.py",
"pattern": "DurableCheckpoint",
},
"otel_correlation_bridge": {
"file": ROOT / "backend" / "app" / "openclaw" / "gateway.py",
"pattern": "inject_correlation_id",
},
}
def main() -> None:
print("=" * 60)
print(" RELEASE READINESS MATRIX")
print("=" * 60)
print()
total = passed = 0
# File existence checks
for name, path in CHECKS.items():
total += 1
exists = path.exists()
if exists:
passed += 1
mark = "+" if exists else "-"
print(f" {mark} {name}: {path.relative_to(ROOT)}")
print()
# Content checks
for name, spec in CONTENT_CHECKS.items():
total += 1
found = False
if spec["file"].exists():
content = spec["file"].read_text()
found = spec["pattern"] in content
if found:
passed += 1
mark = "+" if found else "-"
print(f" {mark} {name}: '{spec['pattern']}' in {spec['file'].name}")
print()
print("-" * 60)
score = round((passed / total) * 100, 1) if total else 0
ready = passed == total
print(f" SCORE: {score}% ({passed}/{total})")
print(f" RELEASE READY: {'YES' if ready else 'NO'}")
print("=" * 60)
report = {"total": total, "passed": passed, "score": score, "ready": ready}
(ROOT / "scripts" / "release_readiness_report.json").write_text(json.dumps(report, indent=2))
sys.exit(0 if ready else 1)
if __name__ == "__main__":
main()