전 저장소 리팩터링과 SSOT 정비

This commit is contained in:
Yun Chan 2026-07-15 21:31:30 +09:00
parent 14ecbd4e7d
commit 3dfddcac6f
173 changed files with 19679 additions and 6952 deletions

View file

@ -7,14 +7,7 @@ from datetime import datetime
from typing import Any, Callable
from ..store import InProcSession
_APPROPRIATENESS_SCORE = {
"neg": 0.0,
"warn": 0.25,
"neutral": 0.5,
"pos": 1.0,
}
from .evaluation_contract import GROWTH_APPROPRIATENESS_SCORE_01
@dataclass(frozen=True)
@ -80,7 +73,7 @@ def turn_score(ev: dict[str, Any]) -> float | None:
if str(ev.get("error") or "").strip():
return None
raw = str(ev.get("appropriateness") or "").strip().lower()
return _APPROPRIATENESS_SCORE.get(raw)
return GROWTH_APPROPRIATENESS_SCORE_01.get(raw)
def turn_rapport(ev: dict[str, Any]) -> float | None:
@ -179,7 +172,9 @@ def build_learner_growth(
ordered = sorted(learner_sessions, key=lambda sess: sess.created_at)
points = [session_growth_point(sess) for sess in ordered]
scored = [point for point in points if point.score is not None]
rapport_values = [point.rapport for point in points if point.rapport is not None]
rapport_values = [
point.rapport for point in points if point.rapport is not None
]
technique_counts: dict[str, int] = {}
for sess in ordered:
for turn in sess.turns:
@ -223,8 +218,12 @@ def build_learner_growth(
first_score=first_score,
latest_score=latest_score,
score_delta=score_delta,
avg_score=avg([point.score for point in scored if point.score is not None]),
avg_rapport=avg([value for value in rapport_values if value is not None]),
avg_score=avg(
[point.score for point in scored if point.score is not None]
),
avg_rapport=avg(
[value for value in rapport_values if value is not None]
),
trend=trend,
top_techniques=top_techniques,
points=points if point_limit is None else points[-point_limit:],
@ -234,7 +233,9 @@ def build_learner_growth(
return sorted_result if limit is None else sorted_result[:limit]
def recent_feedback_notes(sessions: list[InProcSession], *, limit: int = 5) -> list[dict[str, object]]:
def recent_feedback_notes(
sessions: list[InProcSession], *, limit: int = 5
) -> list[dict[str, object]]:
notes: list[dict[str, object]] = []
for sess in sorted(sessions, key=session_activity_time, reverse=True):
for turn in reversed(sess.turns):
@ -254,7 +255,9 @@ def recent_feedback_notes(sessions: list[InProcSession], *, limit: int = 5) -> l
"session_no": sess.session_no,
"stage": turn.stage,
"turn_seq": turn.turn_seq,
"created_at": iso_datetime(turn.created_at) or iso_datetime(session_activity_time(sess)) or "",
"created_at": iso_datetime(turn.created_at)
or iso_datetime(session_activity_time(sess))
or "",
"score": turn_score(ev),
"rapport": turn_rapport(ev),
"note": note,