G0~G8 성과·동맹 측정 OS 작업 일괄 고정

8월 7일까지 워킹트리에만 남아 있던 미커밋 작업을 커밋한다. 여러 사본
폴더(worktree·clone)에 흩어져 있던 중간 스냅샷을 정리하기 전에 원본을
git 이력으로 고정하는 것이 목적이다.

- contracts/routes/services: measurement, outcome_trajectory, rupture_repair,
  deliberate_practice, calibration_transfer, supervision_research,
  multimodal_alliance, continuous_improvement 계열 신규 모듈과 테스트
- infra/db/init: 07~16 마이그레이션(측정 기반~calibration transfer 실행)
- apps/web: 세션 리뷰 카드·관리 화면·E2E 스펙 추가
- docs/ops: G0~G8 라이브 통합·배포·롤백 증거 문서와 evidence JSON/PNG
- scripts: smoke·ledger·릴리스 에이전트·NAS 프리뷰 운영 스크립트

engine.public 로그 .bak과 apps/web/test-results 산출물은 커밋에서 제외했다.
This commit is contained in:
Yun Chan 2026-08-08 01:30:53 +09:00
parent 93dd8f82d7
commit 16e791e044
390 changed files with 243188 additions and 499 deletions

View file

@ -23,7 +23,7 @@ from urllib.parse import urlencode, urlsplit
import httpx
from fastapi import APIRouter, Cookie, HTTPException, Query, Request, Response, status
from fastapi.responses import RedirectResponse
from pydantic import BaseModel
from pydantic import BaseModel, Field
from ..auth_types import AccountStatus, RoleName
from ..auth_sessions import (
@ -124,6 +124,7 @@ class DevLoginRequest(BaseModel):
email: str
role: RoleName = "learner"
display_name: str | None = None
cohort_ids: list[str] = Field(default_factory=list, max_length=16)
def _normalize_domain(domain: str | None) -> str:
@ -1066,6 +1067,13 @@ async def dev_login(request: Request, body: DevLoginRequest, response: Response)
email_verified=True,
hosted_domain=_email_domain(str(body.email)),
)
requested_cohort_ids: list[str] = []
_append_unique(
requested_cohort_ids,
[value.strip() for value in body.cohort_ids if value.strip()],
)
if not requested_cohort_ids:
requested_cohort_ids = _configured_cohort_ids(email=email)
try:
sid, user = await create_session(
email=email,
@ -1073,7 +1081,7 @@ async def dev_login(request: Request, body: DevLoginRequest, response: Response)
role=_role_for_managed_user(managed_user, Role(body.role)).value,
cohort_ids=_cohort_ids_for_managed_user(
managed_user,
_configured_cohort_ids(email=email),
requested_cohort_ids,
),
external_id=_provider_external_id("dev", email, email),
)