관리자 워크스페이스 접근 확장과 소유자 결정 7건 확정 반영
- 관리자(role=admin)가 학습자·교수자·관리자 워크스페이스를 모두 접근하도록 can_access_role/require_role와 프론트 auth 헬퍼·Sidebar 내비를 정리하고 admin 워크스페이스 내비 E2E를 추가. - 소유자 결정 7건 전건 확정(2026-06-30)을 SSOT 대시보드·백로그에 반영하고 결정 필요 7→0으로 동기화. SSOT drift 게이트 기대 카운트도 갱신. - 확정된 H1 평가설계(κ≥0.70·ICC≥0.75·환각률≤0.03·t-검정 α=0.05·무작위 배정)를 approved-export κ 게이트(checker·dataset_export·recursive export)와 KPI 측정계획·export manifest 문서에 반영. 검증: npm run typecheck, npm run check:api-types, 백엔드 pytest 290 passed, admin 내비 E2E 1 passed, 레이아웃 시각게이트 9/9, session-layout 4 passed, SSOT drift 게이트 PASS.
This commit is contained in:
parent
1274ba9ccc
commit
4e6b0045e3
17 changed files with 110 additions and 53 deletions
|
|
@ -25,10 +25,10 @@ EXPECTED_STATUS_COUNTS = {
|
|||
}
|
||||
EXPECTED_OWNER_COLUMN_COUNTS = {
|
||||
"block": 2,
|
||||
"decide": 7,
|
||||
"decide": 0,
|
||||
"ext": 2,
|
||||
}
|
||||
EXPECTED_DECISION_DETAIL_ROWS = 7
|
||||
EXPECTED_DECISION_DETAIL_ROWS = 0
|
||||
EXPECTED_EXTERNAL_GATE_ROWS = 6
|
||||
|
||||
REQUIRED_SHARED_PHRASES = (
|
||||
|
|
@ -38,9 +38,9 @@ REQUIRED_SHARED_PHRASES = (
|
|||
"실 provider 장시간 운영",
|
||||
"임상 골든셋",
|
||||
"재압축",
|
||||
"블로커 2 · 결정 7 · 외부조율 2",
|
||||
"decisions 7건(owner 결정)",
|
||||
"결정 7개",
|
||||
"블로커 2 · 결정 0 · 외부조율 2",
|
||||
"owner 결정 7건은 2026-06-30 전건 확정",
|
||||
"결정 0개(전건 확정)",
|
||||
"MASTERPLAN_REVISIONS F-10 승인",
|
||||
)
|
||||
|
||||
|
|
@ -59,6 +59,12 @@ FORBIDDEN_STALE_PHRASES = (
|
|||
"자유연습 기본값</b><p>수정안",
|
||||
"decisions 8건(owner 결정)",
|
||||
"결정 8개",
|
||||
"블로커 2 · 결정 7 · 외부조율 2",
|
||||
"decisions 7건(owner 결정)",
|
||||
"결정 7개",
|
||||
"블로커 2 · 결정 3 · 외부조율 2",
|
||||
"decisions 3건(owner 결정)",
|
||||
"결정 3개",
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -435,8 +435,8 @@ def validate_manifest(root: Path, report: Report) -> None:
|
|||
else:
|
||||
kappa = numeric_value(agreement.get("kappa"))
|
||||
icc = numeric_value(agreement.get("icc"))
|
||||
if kappa is None or kappa < 0.60:
|
||||
report.error(f"{rel_path}: approved export requires agreement.kappa >= 0.60")
|
||||
if kappa is None or kappa < 0.70:
|
||||
report.error(f"{rel_path}: approved export requires agreement.kappa >= 0.70")
|
||||
if icc is None or icc < 0.75:
|
||||
report.error(f"{rel_path}: approved export requires agreement.icc >= 0.75")
|
||||
selection_criteria = data.get("selection_criteria")
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ async def fetch_agreement(conn: asyncpg.Connection, dataset_id: int | None, args
|
|||
rows = [row_to_dict(row) for row in await conn.fetch(ANNOTATION_QUERY, dataset_id)]
|
||||
kappa = cohen_kappa(rows, args.kappa_label)
|
||||
icc = intraclass_correlation(rows, args.icc_label)
|
||||
gold_status = "gold_candidate" if kappa is not None and kappa >= 0.60 and icc is not None and icc >= 0.75 else "not_gold"
|
||||
gold_status = "gold_candidate" if kappa is not None and kappa >= 0.70 and icc is not None and icc >= 0.75 else "not_gold"
|
||||
return {"kappa": kappa, "icc": icc, "gold_status": gold_status}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue