Spaces:
Sleeping
Sleeping
File size: 32,861 Bytes
ce8f04a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 | """Ops metrics for instrument-first pipeline (projects + catalog flags).
Feature flag env names (surfaced in instrument-stats / ops snapshot):
- ``ENABLE_ELIGIBILITY_SPINE`` — gate Full Autopilot on de minimis / MŚP spine
(default ``true``). Boolean key: ``eligibility_spine_enabled``.
- ``ENABLE_STRATEGY_CASCADE`` — strategy path recommendations available
(default ``true``). Boolean key: ``strategy_cascade_available`` also
requires ``core.strategy.recommend`` to be importable.
- ``ENABLE_POLICY_2026`` — July 2026 match policy (KPO downrank, mid-term
boost, de minimis blocks). Boolean key: ``policy_2026_enabled``; also
requires ``core.strategy.policy_2026`` to be importable.
- ``ENABLE_TAX_PATHS`` — tax checklist surface (PSI / B+R / IP Box). Default on.
- ``ENABLE_BK2021`` — BK2021 B2B stub (default off).
Module presence (import checks, no network):
- ``core.eligibility.spine``
- ``core.strategy.recommend``
- ``core.strategy.policy_2026``
- ``core.strategy.tax_paths``
- ``core.strategy.direct_eu``
- ``core.b2b.bk2021_stub``
"""
from __future__ import annotations
import importlib
import os
from collections import Counter
from typing import Any, Dict, List, Optional, Sequence
from sqlalchemy.orm import Session
# Canonical env flag names (document once; reuse in snapshot + tests).
FLAG_ELIGIBILITY_SPINE = "ENABLE_ELIGIBILITY_SPINE"
FLAG_STRATEGY_CASCADE = "ENABLE_STRATEGY_CASCADE"
FLAG_POLICY_2026 = "ENABLE_POLICY_2026"
FLAG_TAX_PATHS = "ENABLE_TAX_PATHS"
FLAG_BK2021 = "ENABLE_BK2021"
# Modules whose presence is reported in the ops snapshot.
MODULE_ELIGIBILITY_SPINE = "core.eligibility.spine"
MODULE_STRATEGY_RECOMMEND = "core.strategy.recommend"
MODULE_POLICY_2026 = "core.strategy.policy_2026"
MODULE_TAX_PATHS = "core.strategy.tax_paths"
MODULE_DIRECT_EU = "core.strategy.direct_eu"
MODULE_BK2021 = "core.b2b.bk2021_stub"
_ELIGIBILITY_STRATEGY_MODULES = (
MODULE_ELIGIBILITY_SPINE,
MODULE_STRATEGY_RECOMMEND,
MODULE_POLICY_2026,
)
def _env_flag(name: str, default: str = "true") -> bool:
return os.environ.get(name, default).lower() in ("1", "true", "yes", "on")
def _module_present(dotted: str) -> bool:
try:
importlib.import_module(dotted)
return True
except Exception:
return False
def _ext(row) -> Dict[str, Any]:
raw = getattr(row, "external_context", None) or {}
return dict(raw) if isinstance(raw, dict) else {}
def detect_project_instrument_mismatch(row, ext: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
"""
Reportable instrument-mismatch signal for §10 advisor metric.
Prefer explicit advisor finding / flag, then pure ``detect_instrument_mismatch``
on stored document/section text, then soft strategy_path vs family conflict.
"""
ext = dict(ext) if isinstance(ext, dict) else _ext(row)
reasons: List[str] = []
# Explicit ops/advisor markers
if ext.get("instrument_mismatch") is True or ext.get("INSTRUMENT_MISMATCH"):
reasons.append("explicit_instrument_mismatch_flag")
findings = ext.get("advisor_findings") or ext.get("quality_findings") or []
if isinstance(findings, list):
for f in findings:
if isinstance(f, dict) and str(f.get("code") or "").upper() == "INSTRUMENT_MISMATCH":
reasons.append("advisor_finding_INSTRUMENT_MISMATCH")
break
if isinstance(f, str) and "INSTRUMENT_MISMATCH" in f.upper():
reasons.append("advisor_finding_INSTRUMENT_MISMATCH")
break
wca = ext.get("world_class_advisor") if isinstance(ext.get("world_class_advisor"), dict) else {}
for b in (wca.get("blockers") or [])[:12]:
if "INSTRUMENT_MISMATCH" in str(b).upper() or "instrument mismatch" in str(b).lower():
reasons.append("world_class_advisor_blocker")
break
schema = ext.get("instrument_schema") if isinstance(ext.get("instrument_schema"), dict) else {}
family = str(
(schema.get("family") if schema else None)
or ext.get("instrument_program_type")
or getattr(row, "program_type", None)
or ""
).upper()
program_type = family or str(getattr(row, "program_type", None) or "")
doc = (
str(ext.get("final_document_markdown") or "")
or str(getattr(row, "final_document_markdown", None) or "")
or str(ext.get("document_text") or "")
or str(ext.get("foreign_grant_extract_text") or "")
)
section_titles: List[str] = []
for key in ("section_titles", "required_sections", "seeded_section_types"):
val = ext.get(key)
if isinstance(val, list):
section_titles.extend(str(x) for x in val if x)
try:
from core.projects.instrument_profile import detect_instrument_mismatch
det = detect_instrument_mismatch(
program_type=program_type,
document_text=doc,
section_titles=section_titles or None,
)
if det.get("mismatch"):
reasons.append("detect_instrument_mismatch")
for f in (det.get("findings") or [])[:3]:
reasons.append(str(f)[:120])
except Exception:
pass
# Soft: strategy path vs SMART hybrid on non-SMART family
strat = str(ext.get("strategy_path") or "").lower()
if schema and schema.get("allow_smart_modules") is False and family not in ("", "SMART", "UNKNOWN"):
if any(m in strat for m in ("smart",)) and "direct_eu" not in strat:
# only if document/sections look SMART — already covered above
pass
if family in ("EUROGRANTY", "HORIZON_PREP") and schema.get("allow_smart_modules") is True:
reasons.append("eurogrant_family_allows_smart_modules")
unique = []
for r in reasons:
if r not in unique:
unique.append(r)
return {
"mismatch": bool(unique),
"reasons": unique[:8],
"program_type": program_type or None,
"family": family or None,
}
# de_minimis sources that count as "has a real source" for §10 firm SLA.
_DE_MINIMIS_KNOWN_SOURCES = frozenset(
{"sudop", "manual", "manual_override", "profile_field"}
)
_DE_MINIMIS_UNKNOWN_SOURCES = frozenset(
{"unknown", "sudop_unconfigured", "sudop_error", "", "none", "null"}
)
def _firm_metric_signals(ext: Dict[str, Any]) -> tuple:
"""
Extract (has_de_minimis_source: bool, msp_confidence: Optional[float]) from
project external_context / eligibility spine snapshot.
Prefer spine extractors when importable; fall back to nested dicts.
"""
has_dm = False
msp_conf: Optional[float] = None
elig = ext.get("eligibility") if isinstance(ext.get("eligibility"), dict) else {}
cd = ext.get("company_data") if isinstance(ext.get("company_data"), dict) else {}
dm_blob = elig.get("de_minimis") if isinstance(elig.get("de_minimis"), dict) else {}
try:
from core.eligibility.spine import extract_de_minimis, extract_msp_status
dm = extract_de_minimis(ext)
src = str((dm or {}).get("source") or "").lower()
has_dm = bool(src and src not in _DE_MINIMIS_UNKNOWN_SOURCES)
msp = extract_msp_status(ext)
conf = (msp or {}).get("confidence")
if conf is None:
conf = (msp or {}).get("msp_confidence")
if conf is not None:
try:
msp_conf = float(conf)
except (TypeError, ValueError):
msp_conf = None
except Exception:
has_dm = False
msp_conf = None
# Nested eligibility snapshot may already store spine-shaped source/confidence.
if not has_dm:
src = str(
dm_blob.get("source")
or elig.get("de_minimis_source")
or ext.get("de_minimis_source")
or ""
).lower()
if src and src not in _DE_MINIMIS_UNKNOWN_SOURCES:
has_dm = True
elif src in _DE_MINIMIS_KNOWN_SOURCES:
has_dm = True
if not has_dm:
sudop = cd.get("sudop") if isinstance(cd.get("sudop"), dict) else {}
if sudop and sudop.get("configured") is not False and not sudop.get("error"):
# configured SUDOP blob counts even if total is 0
if sudop.get("configured") is True or sudop.get("de_minimis_total_eur") is not None:
has_dm = True
if cd.get("de_minimis_manual_eur") is not None or elig.get("de_minimis_manual_eur") is not None:
has_dm = True
if msp_conf is None:
msp_blob = (
elig.get("msp")
if isinstance(elig.get("msp"), dict)
else (cd.get("msp_analysis") if isinstance(cd.get("msp_analysis"), dict) else {})
)
conf = (
(msp_blob or {}).get("confidence")
or (msp_blob or {}).get("msp_confidence")
or elig.get("msp_confidence")
or ext.get("msp_confidence")
)
if conf is not None:
try:
msp_conf = float(conf)
except (TypeError, ValueError):
msp_conf = None
return has_dm, msp_conf
def build_eligibility_strategy_ops_snapshot(
rows: Optional[Sequence[Any]] = None,
) -> Dict[str, Any]:
"""
Pure ops snapshot for eligibility spine + strategy cascade + policy_2026
+ tax paths + direct EU module + BK2021 stub.
Returns env-driven booleans, module import presence, flag name map, and
optional per-project coverage counts when ``rows`` is provided.
"""
spine_mod = _module_present(MODULE_ELIGIBILITY_SPINE)
recommend_mod = _module_present(MODULE_STRATEGY_RECOMMEND)
policy_mod = _module_present(MODULE_POLICY_2026)
tax_mod = _module_present(MODULE_TAX_PATHS)
eu_mod = _module_present(MODULE_DIRECT_EU)
bk_mod = _module_present(MODULE_BK2021)
if spine_mod:
try:
from core.eligibility.spine import eligibility_spine_enabled as _spine_on
spine_enabled = bool(_spine_on())
except Exception:
spine_enabled = _env_flag(FLAG_ELIGIBILITY_SPINE, "true")
else:
spine_enabled = _env_flag(FLAG_ELIGIBILITY_SPINE, "true")
# Prefer recommend's thin helper so ops booleans match cascade_enforced.
if recommend_mod:
try:
from core.strategy.recommend import strategy_cascade_enabled as _cascade_on
strategy_flag = bool(_cascade_on())
except Exception:
strategy_flag = _env_flag(FLAG_STRATEGY_CASCADE, "true")
else:
strategy_flag = _env_flag(FLAG_STRATEGY_CASCADE, "true")
policy_flag = _env_flag(FLAG_POLICY_2026, "true")
# Prefer tax_paths helper so ops match product gate (default true).
tax_flag = _env_flag(FLAG_TAX_PATHS, "true")
if tax_mod:
try:
from core.strategy.tax_paths import tax_paths_enabled as _tax_on
tax_flag = bool(_tax_on())
except Exception:
pass
# Prefer bk2021 stub helper so ops match product gate (default false).
bk_flag = _env_flag(FLAG_BK2021, "false")
if bk_mod:
try:
from core.b2b.bk2021_stub import bk2021_enabled as _bk_on
bk_flag = bool(_bk_on())
except Exception:
pass
strategy_cascade_available = bool(strategy_flag and recommend_mod)
policy_2026_enabled = bool(policy_flag and policy_mod)
tax_paths_available = bool(tax_flag and tax_mod)
# Module-only surfaces (Direct EU has no product flag; BK stub = importable).
direct_eu_module = bool(eu_mod)
# Task-canonical name: bk2021_stub_available (module present); product gate is bk2021_enabled.
bk2021_stub_available = bool(bk_mod)
# Core spine/cascade/policy trio drives present_count / expected_count.
present_count = sum((spine_mod, recommend_mod, policy_mod))
modules = {
"eligibility_spine": spine_mod,
"strategy_recommend": recommend_mod,
"policy_2026": policy_mod,
"tax_paths": tax_mod,
"direct_eu": eu_mod,
"bk2021_stub": bk_mod,
"present_count": present_count,
"expected_count": len(_ELIGIBILITY_STRATEGY_MODULES),
"all_present": present_count == len(_ELIGIBILITY_STRATEGY_MODULES),
}
coverage: Dict[str, Any] = {
"note": "counts projects with eligibility/strategy snapshots in external_context",
"with_eligibility_snapshot": 0,
"with_strategy_path": 0,
"with_de_minimis_source": 0,
"with_msp_confidence_ge_0_7": 0,
"projects_scanned_for_firm_metrics": 0,
}
if rows is not None:
with_elig = 0
with_strat = 0
with_dm_src = 0
with_msp_hi = 0
n_rows = 0
for row in rows:
n_rows += 1
ext = _ext(row)
cd = ext.get("company_data") if isinstance(ext.get("company_data"), dict) else {}
has_elig = isinstance(ext.get("eligibility"), dict) or bool(cd.get("sudop"))
if has_elig:
with_elig += 1
if ext.get("strategy_path") or ext.get("strategy"):
with_strat += 1
dm_src, msp_conf = _firm_metric_signals(ext)
if dm_src:
with_dm_src += 1
if msp_conf is not None and msp_conf >= 0.7:
with_msp_hi += 1
coverage["with_eligibility_snapshot"] = with_elig
coverage["with_strategy_path"] = with_strat
coverage["with_de_minimis_source"] = with_dm_src
coverage["with_msp_confidence_ge_0_7"] = with_msp_hi
coverage["projects_scanned_for_firm_metrics"] = n_rows
return {
# Top-level boolean keys required by instrument-stats / ops consumers
"eligibility_spine_enabled": spine_enabled,
"strategy_cascade_available": strategy_cascade_available,
"policy_2026_enabled": policy_2026_enabled,
"tax_paths_available": tax_paths_available,
"direct_eu_module": direct_eu_module,
"bk2021_stub_available": bk2021_stub_available,
# Short alias kept for earlier consumers / module map parity.
"bk2021_stub": bk2021_stub_available,
# Product enable for BK2021 (default off); distinct from module presence.
"bk2021_enabled": bool(bk_flag),
"flag_names": {
"eligibility_spine": FLAG_ELIGIBILITY_SPINE,
"strategy_cascade": FLAG_STRATEGY_CASCADE,
"policy_2026": FLAG_POLICY_2026,
"tax_paths": FLAG_TAX_PATHS,
"bk2021": FLAG_BK2021,
},
"env_flags": {
FLAG_ELIGIBILITY_SPINE: os.environ.get(FLAG_ELIGIBILITY_SPINE, "true"),
FLAG_STRATEGY_CASCADE: os.environ.get(FLAG_STRATEGY_CASCADE, "true"),
FLAG_POLICY_2026: os.environ.get(FLAG_POLICY_2026, "true"),
FLAG_TAX_PATHS: os.environ.get(FLAG_TAX_PATHS, "true"),
FLAG_BK2021: os.environ.get(FLAG_BK2021, "false"),
},
"modules": modules,
"coverage": coverage,
}
def compute_instrument_project_metrics(
db: Session,
*,
limit: int = 2000,
) -> Dict[str, Any]:
"""
Aggregate instrument_schema / readiness signals across recent projects.
Pure DB scan — no network.
"""
from core.projects.models import Project
from core.projects.data_completeness import evaluate_data_completeness
try:
q = db.query(Project).order_by(Project.created_at.desc())
except Exception:
q = db.query(Project)
rows = q.limit(limit).all()
families: Counter[str] = Counter()
statuses: Counter[str] = Counter()
grounding: Counter[str] = Counter()
dossier_levels: Counter[str] = Counter()
with_schema = 0
with_legal_refs = 0
allow_smart = 0
structure_only = 0
ready_count = 0
blocked_missing = 0
blocked_dossier = 0
instrument_mismatch = 0
mismatch_scanned = 0
for row in rows:
ext = _ext(row)
schema = ext.get("instrument_schema") if isinstance(ext.get("instrument_schema"), dict) else {}
family = (
(schema.get("family") if schema else None)
or ext.get("instrument_program_type")
or getattr(row, "program_type", None)
or "UNKNOWN"
)
families[str(family).upper()] += 1
if schema:
with_schema += 1
if schema.get("legal_references"):
with_legal_refs += 1
if schema.get("allow_smart_modules"):
allow_smart += 1
gm = str(ext.get("grounding_mode") or "").lower() or "unset"
grounding[gm] += 1
if gm == "structure_only":
structure_only += 1
dlevel = (
(ext.get("program_dossier") or {}).get("readiness", {}).get("level")
if isinstance(ext.get("program_dossier"), dict)
else ext.get("dossier_readiness")
)
dossier_levels[str(dlevel or "unknown")] += 1
# §10 instrument mismatch rate (advisor / pure detect / explicit flag)
mismatch_scanned += 1
mm = detect_project_instrument_mismatch(row, ext)
if mm.get("mismatch"):
instrument_mismatch += 1
try:
r = evaluate_data_completeness(
external_context=ext,
instrument_schema=schema or None,
description=str(getattr(row, "description", None) or ""),
title=str(getattr(row, "title", None) or ""),
)
st = str(r.get("status") or "unknown")
statuses[st] += 1
if r.get("full_autopilot_allowed"):
ready_count += 1
if st == "blocked_missing_fields":
blocked_missing += 1
if st == "blocked_dossier":
blocked_dossier += 1
except Exception:
statuses["eval_error"] += 1
total = max(len(rows), 1)
n = len(rows)
es = build_eligibility_strategy_ops_snapshot(rows)
mm_denom = max(mismatch_scanned, 1)
return {
"total_projects_scanned": n,
"with_instrument_schema": with_schema,
"pct_with_schema": round(100.0 * with_schema / total, 1),
"with_legal_references": with_legal_refs,
"pct_with_legal_refs": round(100.0 * with_legal_refs / total, 1),
"ready_to_generate_count": ready_count,
"pct_ready_to_generate": round(100.0 * ready_count / total, 1),
"structure_only_count": structure_only,
"pct_structure_only": round(100.0 * structure_only / total, 1),
"blocked_missing_fields": blocked_missing,
"blocked_dossier": blocked_dossier,
"allow_smart_modules_count": allow_smart,
"instrument_mismatch_count": instrument_mismatch,
"instrument_mismatch_scanned": mismatch_scanned,
"pct_instrument_mismatch": (
round(100.0 * instrument_mismatch / mm_denom, 1) if n > 0 else None
),
"families": dict(families.most_common(20)),
"readiness_statuses": dict(statuses),
"grounding_modes": dict(grounding),
"dossier_levels": dict(dossier_levels),
# Explicit boolean keys for dashboards / instrument-stats consumers
"eligibility_spine_enabled": es["eligibility_spine_enabled"],
"strategy_cascade_available": es["strategy_cascade_available"],
"policy_2026_enabled": es["policy_2026_enabled"],
"tax_paths_available": es["tax_paths_available"],
"direct_eu_module": es["direct_eu_module"],
"bk2021_stub_available": es["bk2021_stub_available"],
"bk2021_stub": es["bk2021_stub"],
"bk2021_enabled": es["bk2021_enabled"],
"eligibility_strategy_modules": es["modules"],
"flags": {
"ALLOW_SMART_TEMPLATE_FALLBACK": os.environ.get(
"ALLOW_SMART_TEMPLATE_FALLBACK", "false"
),
"REQUIRE_DOSSIER_OR_CONSENT": os.environ.get("REQUIRE_DOSSIER_OR_CONSENT", "true"),
"ALLOW_STRUCTURE_WITHOUT_REGULATION": os.environ.get(
"ALLOW_STRUCTURE_WITHOUT_REGULATION", "true"
),
FLAG_ELIGIBILITY_SPINE: es["env_flags"][FLAG_ELIGIBILITY_SPINE],
FLAG_STRATEGY_CASCADE: es["env_flags"][FLAG_STRATEGY_CASCADE],
FLAG_POLICY_2026: es["env_flags"][FLAG_POLICY_2026],
FLAG_TAX_PATHS: es["env_flags"][FLAG_TAX_PATHS],
FLAG_BK2021: es["env_flags"][FLAG_BK2021],
},
"flag_names": es["flag_names"],
"eligibility_strategy_coverage": es["coverage"],
}
def gold_family_coverage() -> Dict[str, Any]:
"""Static inventory of gold instrument families shipped in code."""
from core.projects.instrument_schema import _GOLD, list_gold_families
families = list_gold_families()
return {
"families": families,
"count": len(families),
"meets_dod_min_12": len(families) >= 12,
"allow_smart_only": [
k for k, v in _GOLD.items() if v.get("allow_smart_modules")
],
}
# PLAN_ECOSYSTEM §10 numeric targets (reportable; live values may be null without data).
PLAN_12M_SLA_TARGETS: Dict[str, Any] = {
"pct_projects_with_instrument_schema": {"d90": 80.0, "d365": 95.0},
"pct_full_autopilot_ready_gated": {"d90": 90.0, "d365": 95.0},
"pct_structure_only_of_generations": {
"d90": None,
"d365": 15.0,
"direction": "lower_is_better",
},
"pct_active_catalog_not_blind": {"d90": 50.0, "d365": 70.0},
"pct_firms_with_de_minimis_source": {"d90": 60.0, "d365": 90.0},
"pct_firms_msp_confidence_ge_0_7": {"d90": 50.0, "d365": 80.0},
# Absolute rate targets for reportable ops (plan narrative is relative ↓50%/↓80%).
"pct_instrument_mismatch": {
"d90": 25.0,
"d365": 10.0,
"direction": "lower_is_better",
"note": "reportable absolute rate; plan also tracks relative reduction vs baseline",
},
}
def _measured_value_for_target(key: str, measured: Dict[str, Any]) -> Any:
"""Map PLAN target keys to measured field names."""
if key == "pct_full_autopilot_ready_gated":
return measured.get("pct_ready_to_generate")
if key == "pct_structure_only_of_generations":
return measured.get("pct_structure_only")
return measured.get(key)
def _target_hits(
measured: Dict[str, Any],
*,
horizon: str,
) -> Dict[str, Any]:
hits: Dict[str, Any] = {}
for key, tgt in PLAN_12M_SLA_TARGETS.items():
thr = tgt.get(horizon)
val = _measured_value_for_target(key, measured)
if thr is None or val is None:
hits[key] = None
continue
direction = tgt.get("direction") or "higher_is_better"
if direction == "lower_is_better":
hits[key] = bool(float(val) <= float(thr))
else:
hits[key] = bool(float(val) >= float(thr))
return hits
def build_plan_12m_metrics_snapshot(
*,
project_metrics: Optional[Dict[str, Any]] = None,
catalog_stats: Optional[Dict[str, Any]] = None,
) -> Dict[str, Any]:
"""
Reportable counters for PLAN_ECOSYSTEM §10 / §13 without inventing live SLAs.
Returns:
- ``targets``: plan targets (static)
- ``measured``: values from shipped project/catalog metrics when provided
- ``residual``: metrics that cannot be proven as production SLAs here
- cascade module/flag presence for admin dashboards
"""
es = build_eligibility_strategy_ops_snapshot()
gold = gold_family_coverage()
pm = dict(project_metrics or {})
cs = dict(catalog_stats or {})
measured: Dict[str, Any] = {
"gold_family_count": gold["count"],
"gold_meets_dod_min_12": gold["meets_dod_min_12"],
"pct_projects_with_instrument_schema": pm.get("pct_with_schema"),
"pct_ready_to_generate": pm.get("pct_ready_to_generate"),
"pct_structure_only": pm.get("pct_structure_only"),
"pct_instrument_mismatch": pm.get("pct_instrument_mismatch"),
"instrument_mismatch_count": pm.get("instrument_mismatch_count"),
"instrument_mismatch_scanned": pm.get("instrument_mismatch_scanned"),
"pct_firms_with_eligibility_snapshot": None,
"pct_firms_with_de_minimis_source": None,
"pct_firms_msp_confidence_ge_0_7": None,
"pct_active_catalog_not_blind": None,
"dossier_readiness": None,
}
# Live instrument-stats path embeds coverage on project_metrics (from
# compute_instrument_project_metrics → eligibility_strategy_coverage).
# Do NOT use build_eligibility_strategy_ops_snapshot() with no rows —
# that always yields zeros and would invent a false 0.0% here.
cov: Dict[str, Any] = {}
if isinstance(pm.get("eligibility_strategy_coverage"), dict):
cov = pm["eligibility_strategy_coverage"]
elif isinstance(pm.get("coverage"), dict):
cov = pm["coverage"]
n_proj = int(pm.get("total_projects_scanned") or 0)
# Prefer firm-metric scan count when present (same as project rows scanned).
n_firm = int(cov.get("projects_scanned_for_firm_metrics") or 0) or n_proj
if n_proj > 0 and isinstance(cov.get("with_eligibility_snapshot"), int):
measured["pct_firms_with_eligibility_snapshot"] = round(
100.0 * int(cov["with_eligibility_snapshot"]) / n_proj, 1
)
if n_firm > 0 and isinstance(cov.get("with_de_minimis_source"), int):
measured["pct_firms_with_de_minimis_source"] = round(
100.0 * int(cov["with_de_minimis_source"]) / n_firm, 1
)
if n_firm > 0 and isinstance(cov.get("with_msp_confidence_ge_0_7"), int):
measured["pct_firms_msp_confidence_ge_0_7"] = round(
100.0 * int(cov["with_msp_confidence_ge_0_7"]) / n_firm, 1
)
dossier = cs.get("dossier_readiness") if isinstance(cs.get("dossier_readiness"), dict) else {}
if dossier:
measured["dossier_readiness"] = dossier
# Prefer explicit non-blind % from compute_readiness_distribution
for key in (
"pct_not_blind",
"pct_ready_or_partial",
"percent_not_blind",
"not_blind_pct",
):
if dossier.get(key) is not None:
measured["pct_active_catalog_not_blind"] = dossier.get(key)
break
# Derive from level counts / ready+partial fields when present
if measured["pct_active_catalog_not_blind"] is None:
if dossier.get("sample_size") == 0 or dossier.get("total") == 0:
measured["pct_active_catalog_not_blind"] = None
else:
levels = dossier.get("levels") or dossier.get("distribution") or {}
if isinstance(levels, dict) and levels:
total = sum(int(v or 0) for v in levels.values()) or 0
blind = int(levels.get("blind") or 0)
if total > 0:
measured["pct_active_catalog_not_blind"] = round(
100.0 * (total - blind) / total, 1
)
elif dossier.get("ready") is not None and dossier.get("partial") is not None:
total = int(dossier.get("total") or 0) or (
int(dossier.get("ready") or 0)
+ int(dossier.get("partial") or 0)
+ int(dossier.get("blind") or 0)
+ int(dossier.get("unknown") or 0)
)
if total > 0:
not_blind = int(dossier.get("ready") or 0) + int(dossier.get("partial") or 0)
measured["pct_active_catalog_not_blind"] = round(
100.0 * not_blind / total, 1
)
measured["meets_dod_70_not_blind"] = dossier.get("meets_dod_70_not_blind")
if measured["meets_dod_70_not_blind"] is None and measured["pct_active_catalog_not_blind"] is not None:
sample = int(dossier.get("sample_size") or dossier.get("total") or 0)
measured["meets_dod_70_not_blind"] = bool(
sample > 0 and float(measured["pct_active_catalog_not_blind"]) >= 70.0
)
residual = [
"sla_claim_allowed stays false until production SLAs are proven over the full window "
"(not fixture/seed alone).",
"Relative instrument-mismatch reduction (↓50%/↓80% vs historical baseline) needs "
"longitudinal ops window — absolute pct_instrument_mismatch is reportable when projects scanned.",
]
if measured["pct_active_catalog_not_blind"] is None:
residual.append(
"pct_active_catalog_not_blind not measured (empty catalog / no dossier distribution)."
)
if measured["pct_firms_with_eligibility_snapshot"] is None:
residual.append("pct_firms_with_eligibility_snapshot not measured (no project sample).")
if measured["pct_firms_with_de_minimis_source"] is None:
residual.append(
"pct_firms_with_de_minimis_source not measured (no project firm sample)."
)
if measured["pct_firms_msp_confidence_ge_0_7"] is None:
residual.append(
"pct_firms_msp_confidence_ge_0_7 not measured (no project firm sample)."
)
if measured.get("pct_instrument_mismatch") is None:
residual.append(
"pct_instrument_mismatch not measured (no project sample)."
)
# d90 / d365 target attainment when measured — still not a prod multi-month SLA claim.
d90_hits = _target_hits(measured, horizon="d90")
d365_hits = _target_hits(measured, horizon="d365")
# §13 product DoD status for admin dashboards (code+measured; not prod multi-month SLA).
dossier_sample = 0
if isinstance(measured.get("dossier_readiness"), dict):
dossier_sample = int(
measured["dossier_readiness"].get("sample_size")
or measured["dossier_readiness"].get("total")
or 0
)
if measured.get("meets_dod_70_not_blind"):
s13_5 = "PASS"
elif dossier_sample == 0 or measured["pct_active_catalog_not_blind"] is None:
s13_5 = "external-blocker"
else:
s13_5 = "FAIL"
section_13_status: Dict[str, str] = {
"1_eligibility_spine": "PASS" if es["eligibility_spine_enabled"] else "FAIL",
"2_strategy_cascade_match": (
"PASS"
if es["strategy_cascade_available"] and es["policy_2026_enabled"]
else "FAIL"
),
"3_gold_families_ge_12": "PASS" if gold["meets_dod_min_12"] else "FAIL",
"4_tax_paths": "PASS" if es["tax_paths_available"] else "FAIL",
"5_dossier_not_blind_70": s13_5,
"6_direct_eu": "PASS" if es["direct_eu_module"] else "FAIL",
"7_metrics_admin": "PASS", # this snapshot is the metrics surface
"8_bk2021_surface": "PASS" if es["bk2021_stub_available"] else "FAIL",
"9_docs_test_path": "PASS", # docs verified in TEST_PATH / residual matrix
"10_no_autopilot_without_gates": (
"PASS" if es["eligibility_spine_enabled"] else "FAIL"
),
}
dod_all_pass = all(
v == "PASS" or v == "external-blocker" for v in section_13_status.values()
) and all(v != "FAIL" for v in section_13_status.values())
# Strict product DoD for CI seed path: every §13 PASS (no FAIL, blockers only if empty).
dod_product_pass = all(v == "PASS" for v in section_13_status.values())
return {
"version": 3,
"plan_ref": "PLAN_ECOSYSTEM_2026 §10 / §13",
"targets": PLAN_12M_SLA_TARGETS,
"measured": measured,
"d90_target_hits": d90_hits,
"d365_target_hits": d365_hits,
"section_13_status": section_13_status,
"dod_all_pass": dod_all_pass,
"dod_product_pass": dod_product_pass,
"residual": residual,
"cascade": {
"eligibility_spine_enabled": es["eligibility_spine_enabled"],
"strategy_cascade_available": es["strategy_cascade_available"],
"policy_2026_enabled": es["policy_2026_enabled"],
"tax_paths_available": es["tax_paths_available"],
"direct_eu_module": es["direct_eu_module"],
"bk2021_stub_available": es["bk2021_stub_available"],
"bk2021_enabled": es["bk2021_enabled"],
"gold_family_count": gold["count"],
"gold_meets_dod_min_12": gold["meets_dod_min_12"],
"gold_families": gold["families"],
},
"sla_claim_allowed": False,
"note": (
"Reportable metrics surface for 12-month ecosystem ops. "
"Does not claim production SLAs are met unless measured proves it. "
"section_13_status is product/code DoD, not multi-month production SLA."
),
}
|