feat: add rectification event decision contract v2
This commit is contained in:
@@ -4,13 +4,21 @@ from typing import Any
|
||||
from uuid import NAMESPACE_URL, uuid5
|
||||
|
||||
from scripts.rectification.candidate_feature_service import build_candidate_feature_snapshot
|
||||
from scripts.rectification.contracts import RectificationRequest
|
||||
from scripts.rectification.contracts import EVENT_CONTRACT_VERSION, RectificationRequest
|
||||
from scripts.rectification.decision_policy import (
|
||||
EXECUTION_LEDGER_VERSION,
|
||||
POLICY_VERSION,
|
||||
build_candidate_decisions,
|
||||
build_decision_receipt,
|
||||
build_execution_ledger,
|
||||
)
|
||||
from scripts.rectification.diagnostics_service import run_diagnostics
|
||||
from scripts.rectification.scoring_service import (
|
||||
ALGORITHM_VERSION,
|
||||
build_event_contribution_matrix,
|
||||
calculation_spec,
|
||||
score_from_matrix,
|
||||
scoreable_request,
|
||||
sha256,
|
||||
)
|
||||
|
||||
@@ -18,25 +26,36 @@ from scripts.rectification.scoring_service import (
|
||||
def candidate_features(request: RectificationRequest) -> dict[str, Any]:
|
||||
spec = calculation_spec(request)
|
||||
spec_hash = sha256(spec)
|
||||
scoring_request = scoreable_request(request)
|
||||
return {
|
||||
"algorithm_version": ALGORITHM_VERSION,
|
||||
"event_contract_version": EVENT_CONTRACT_VERSION,
|
||||
"decision_policy_version": POLICY_VERSION,
|
||||
"calculation_spec": spec,
|
||||
"calculation_spec_hash": spec_hash,
|
||||
"candidate_feature_snapshot": build_candidate_feature_snapshot(request, spec_hash),
|
||||
"candidate_feature_snapshot": build_candidate_feature_snapshot(scoring_request, spec_hash),
|
||||
"can_confirm_exact_minute": False,
|
||||
}
|
||||
|
||||
|
||||
def score_candidates(request: RectificationRequest) -> dict[str, Any]:
|
||||
built = build_event_contribution_matrix(request)
|
||||
rows = score_from_matrix(request, built)
|
||||
scoring_request = scoreable_request(request)
|
||||
built = build_event_contribution_matrix(scoring_request)
|
||||
rows = score_from_matrix(scoring_request, built)
|
||||
spec = calculation_spec(request)
|
||||
spec_hash = sha256(spec)
|
||||
diagnostics = run_diagnostics(request, rows, built)
|
||||
diagnostic_values = run_diagnostics(scoring_request, rows, built)
|
||||
fingerprint = sha256(request)
|
||||
result_id = str(uuid5(NAMESPACE_URL, f"{ALGORITHM_VERSION}:{fingerprint}"))
|
||||
candidate_decisions = build_candidate_decisions(rows, result_id=result_id)
|
||||
decision_receipt = build_decision_receipt(request, candidate_decisions, built, diagnostic_values)
|
||||
execution_ledger = build_execution_ledger(request, built, diagnostic_values, candidate_decisions)
|
||||
representative = candidate_decisions[0] if candidate_decisions else None
|
||||
return {
|
||||
"result_id": str(uuid5(NAMESPACE_URL, f"{ALGORITHM_VERSION}:{fingerprint}")),
|
||||
"result_id": result_id,
|
||||
"algorithm_version": ALGORITHM_VERSION,
|
||||
"event_contract_version": EVENT_CONTRACT_VERSION,
|
||||
"decision_policy_version": POLICY_VERSION,
|
||||
"calculation_spec": spec,
|
||||
"calculation_spec_hash": spec_hash,
|
||||
"candidate_scores": [{
|
||||
@@ -45,17 +64,32 @@ def score_candidates(request: RectificationRequest) -> dict[str, Any]:
|
||||
"supporting_event_ids": [item["event_id"] for item in row["evidence"] if item["points"] > 0],
|
||||
"conflicting_event_ids": [item["event_id"] for item in row["evidence"] if item["points"] < 0],
|
||||
} for row in rows],
|
||||
"candidate_decisions": candidate_decisions,
|
||||
"candidate_decision_receipt": decision_receipt,
|
||||
"decision_receipt": decision_receipt,
|
||||
"execution_ledger_version": EXECUTION_LEDGER_VERSION,
|
||||
"execution_ledger": execution_ledger,
|
||||
"event_contribution_matrix": built["matrix"],
|
||||
"candidate_feature_snapshot": build_candidate_feature_snapshot(request, spec_hash, built.get("static_contexts")),
|
||||
"diagnostics": diagnostics,
|
||||
"candidate_feature_snapshot": build_candidate_feature_snapshot(
|
||||
scoring_request, spec_hash, built.get("static_contexts")
|
||||
),
|
||||
"diagnostics": diagnostic_values,
|
||||
"robustness": {
|
||||
"neighbor_support_minutes": diagnostics["neighbor_support_minutes"],
|
||||
"leave_one_out_retention_rate": diagnostics["leave_one_event_out_retention_rate"],
|
||||
"leave_one_domain_out_retention_rate": diagnostics["leave_one_domain_out_retention_rate"],
|
||||
"date_sensitivity_retention_rate": diagnostics["date_sensitivity_retention_rate"],
|
||||
"neighbor_support_minutes": diagnostic_values.get("neighbor_support_minutes", 0),
|
||||
"leave_one_out_retention_rate": diagnostic_values.get("leave_one_event_out_retention_rate", 0),
|
||||
"leave_one_domain_out_retention_rate": diagnostic_values.get("leave_one_domain_out_retention_rate", 0),
|
||||
"date_sensitivity_retention_rate": diagnostic_values.get("date_sensitivity_retention_rate", 0),
|
||||
},
|
||||
"missing_layers": built["missing_layers"],
|
||||
"can_confirm_exact_minute": False,
|
||||
"display_allowed": decision_receipt["display_allowed"],
|
||||
"selection_allowed": decision_receipt["selection_allowed"],
|
||||
"acceptance_allowed": decision_receipt["acceptance_allowed"],
|
||||
"confirmation_allowed": decision_receipt["confirmation_allowed"],
|
||||
"representative_candidate_id": representative["candidate_id"] if representative else None,
|
||||
"representative_time": representative["time"] if representative else None,
|
||||
"overall_confidence": decision_receipt["overall_confidence"],
|
||||
"margin_percent": decision_receipt["margin_percent"],
|
||||
"can_confirm_exact_minute": decision_receipt["confirmation_allowed"],
|
||||
}
|
||||
|
||||
|
||||
@@ -64,8 +98,23 @@ def diagnostics(request: RectificationRequest) -> dict[str, Any]:
|
||||
return {
|
||||
"result_id": scored["result_id"],
|
||||
"algorithm_version": scored["algorithm_version"],
|
||||
"event_contract_version": scored["event_contract_version"],
|
||||
"decision_policy_version": scored["decision_policy_version"],
|
||||
"calculation_spec_hash": scored["calculation_spec_hash"],
|
||||
"candidate_decisions": scored["candidate_decisions"],
|
||||
"candidate_decision_receipt": scored["candidate_decision_receipt"],
|
||||
"decision_receipt": scored["decision_receipt"],
|
||||
"execution_ledger_version": scored["execution_ledger_version"],
|
||||
"execution_ledger": scored["execution_ledger"],
|
||||
"diagnostics": scored["diagnostics"],
|
||||
"missing_layers": scored["missing_layers"],
|
||||
"can_confirm_exact_minute": False,
|
||||
"display_allowed": scored["display_allowed"],
|
||||
"selection_allowed": scored["selection_allowed"],
|
||||
"acceptance_allowed": scored["acceptance_allowed"],
|
||||
"confirmation_allowed": scored["confirmation_allowed"],
|
||||
"representative_candidate_id": scored["representative_candidate_id"],
|
||||
"representative_time": scored["representative_time"],
|
||||
"overall_confidence": scored["overall_confidence"],
|
||||
"margin_percent": scored["margin_percent"],
|
||||
"can_confirm_exact_minute": scored["confirmation_allowed"],
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user