세션 평가와 교수자 분석 보강
This commit is contained in:
parent
5c4ac04e06
commit
fe2796f05a
51 changed files with 4928 additions and 240 deletions
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue