세션 평가와 교수자 분석 보강

This commit is contained in:
Yun Chan 2026-07-01 12:10:52 +09:00
parent 5c4ac04e06
commit fe2796f05a
51 changed files with 4928 additions and 240 deletions

View file

@ -28,6 +28,7 @@ EXPECTED_OWNER_COLUMN_COUNTS = {
"decide": 0,
"ext": 2,
}
EXPECTED_CRITICAL_CARD_COUNT = 3
EXPECTED_DECISION_DETAIL_ROWS = 0
EXPECTED_EXTERNAL_GATE_ROWS = 6
@ -42,6 +43,11 @@ REQUIRED_SHARED_PHRASES = (
"owner 결정 7건은 2026-06-30 전건 확정",
"결정 0개(전건 확정)",
"MASTERPLAN_REVISIONS F-10 승인",
"Public API <b>recovered OK</b>",
"error code 1033",
"Docker Desktop/DB 재기동",
"watchdog healthy: engine, api, web-preview, cloudflared, public-api",
"dev-dashboard E2E redteam 10 passed",
)
FORBIDDEN_STALE_PHRASES = (
@ -65,6 +71,9 @@ FORBIDDEN_STALE_PHRASES = (
"블로커 2 · 결정 3 · 외부조율 2",
"decisions 3건(owner 결정)",
"결정 3개",
"Public API <b>prod OK</b>",
"Public API <b>530 BLOCK</b>",
"API: prod/dev OK",
)
@ -148,6 +157,13 @@ def _planned_cards(dashboard: str) -> list[str]:
)
def _has_check_status_markup(dashboard: str) -> bool:
return bool(
re.search(r'<[^>]+class="[^"]*\btask-status\b[^"]*\bs-check\b[^"]*"', dashboard)
or re.search(r'>\s*CHECK\s*<', dashboard)
)
def run_checks(paths: argparse.Namespace) -> dict[str, Any]:
dashboard = _read(paths.dashboard)
source_gaps = _read(paths.source_gaps)
@ -172,7 +188,7 @@ def run_checks(paths: argparse.Namespace) -> dict[str, Any]:
checks.append(
Check(
name="no_doing_cards",
passed=doing_count == 0 and ">CHECK<" not in dashboard and "s-check" not in dashboard,
passed=doing_count == 0 and not _has_check_status_markup(dashboard),
detail=f"doing={doing_count}",
)
)
@ -213,6 +229,15 @@ def run_checks(paths: argparse.Namespace) -> dict[str, Any]:
)
)
critical_card_count = dashboard.count('class="critbadge"')
checks.append(
Check(
name="critical_card_count",
passed=critical_card_count == EXPECTED_CRITICAL_CARD_COUNT,
detail=f"expected={EXPECTED_CRITICAL_CARD_COUNT} actual={critical_card_count}",
)
)
decision_detail_rows = structure.decision_panel_rows
checks.append(
Check(