73 lines
3.1 KiB
Python
73 lines
3.1 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from app.agents.schemas.learning import LearningSignal, SessionRetrospective
|
||
|
|
|
||
|
|
|
||
|
|
class RetrospectiveSignalExtractor:
|
||
|
|
def extract(self, retrospective: SessionRetrospective) -> list[LearningSignal]:
|
||
|
|
signals: list[LearningSignal] = []
|
||
|
|
|
||
|
|
if retrospective.outcome == "completed":
|
||
|
|
signals.append(
|
||
|
|
LearningSignal(
|
||
|
|
signal_type="workflow",
|
||
|
|
confidence=0.8,
|
||
|
|
evidence_refs=retrospective.evidence_refs[:3],
|
||
|
|
explanation="Completed runs can be mined as workflow hints later.",
|
||
|
|
payload={
|
||
|
|
"task_type": retrospective.task_type,
|
||
|
|
"execution_mode": retrospective.execution_mode,
|
||
|
|
},
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
if len(retrospective.task_refs) > 1:
|
||
|
|
context_snapshot = retrospective.context_snapshot or {}
|
||
|
|
merge_report = dict(context_snapshot.get("merge_report") or {})
|
||
|
|
verification_report = dict(context_snapshot.get("verification_report") or {})
|
||
|
|
effectiveness_score = 1.0
|
||
|
|
if merge_report.get("status") == "conflicted":
|
||
|
|
effectiveness_score = 0.45
|
||
|
|
elif merge_report.get("status") == "fallback":
|
||
|
|
effectiveness_score = 0.25
|
||
|
|
elif verification_report.get("status") == "failed":
|
||
|
|
effectiveness_score = 0.3
|
||
|
|
signals.append(
|
||
|
|
LearningSignal(
|
||
|
|
signal_type="decomposition",
|
||
|
|
confidence=0.7,
|
||
|
|
evidence_refs=retrospective.task_refs[:3],
|
||
|
|
explanation="Multiple completed task refs indicate a decomposition pattern.",
|
||
|
|
payload={
|
||
|
|
"task_count": len(retrospective.task_refs),
|
||
|
|
"scheduled_subtask_count": context_snapshot.get("scheduled_subtask_count", 0),
|
||
|
|
"effectiveness_score": effectiveness_score,
|
||
|
|
"merge_status": merge_report.get("status"),
|
||
|
|
},
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
if retrospective.used_skill_names:
|
||
|
|
signals.append(
|
||
|
|
LearningSignal(
|
||
|
|
signal_type="tool_success",
|
||
|
|
confidence=0.65 if retrospective.outcome == "completed" else 0.35,
|
||
|
|
evidence_refs=retrospective.evidence_refs[:2],
|
||
|
|
explanation="Task-scoped skill shortlist was available during this run.",
|
||
|
|
payload={"skills": retrospective.used_skill_names[:3]},
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
if retrospective.outcome == "failed":
|
||
|
|
signals.append(
|
||
|
|
LearningSignal(
|
||
|
|
signal_type="correction",
|
||
|
|
confidence=0.75,
|
||
|
|
evidence_refs=retrospective.evidence_refs[:2],
|
||
|
|
explanation="Failed retrospectives should remain auditable before any promotion.",
|
||
|
|
payload={"verification_status": retrospective.verification_status},
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
return signals
|