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

@ -56,6 +56,8 @@ class AdminOpsTest(unittest.IsolatedAsyncioTestCase):
return {
"total_turns": 2,
"metered_turns": 1,
"token_metered_turns": 1,
"token_unmetered_turns": 0,
"tokens_in": 11,
"tokens_out": 13,
"cost_usd": 0.0042,
@ -69,24 +71,33 @@ class AdminOpsTest(unittest.IsolatedAsyncioTestCase):
{
"day": "2026-06-28",
"turns": 1,
"token_metered_turns": 1,
"token_unmetered_turns": 0,
"tokens_in": 11,
"tokens_out": 13,
"cost_usd": 0.0042,
"unpriced_turns": 0,
"unpriced_tokens_in": 0,
"unpriced_tokens_out": 0,
"provider": "claude_cli",
"model": "gateway-default",
}
]
case.assertIn(
"COALESCE(SUM(tokens_in), 0) + COALESCE(SUM(tokens_out), 0) DESC",
query,
)
case.assertNotIn("tokens_in + tokens_out DESC", query)
case.assertIn("unpriced_tokens_in", query)
case.assertNotIn("LIMIT 12", query)
return [
{
"provider": "claude_cli",
"model": "gateway-default",
"turns": 1,
"token_metered_turns": 1,
"token_unmetered_turns": 0,
"tokens_in": 11,
"tokens_out": 13,
"cost_usd": 0.0042,
"unpriced_turns": 0,
"unpriced_tokens_in": 0,
"unpriced_tokens_out": 0,
}
]
@ -101,13 +112,65 @@ class AdminOpsTest(unittest.IsolatedAsyncioTestCase):
self.assertEqual(usage.source, "database")
self.assertEqual(usage.total_turns, 2)
self.assertEqual(usage.metered_turns, 1)
self.assertEqual(usage.token_metered_turns, 1)
self.assertEqual(usage.token_unmetered_turns, 0)
self.assertEqual(usage.by_provider[0].provider, "claude_cli")
self.assertEqual(usage.by_provider[0].cost_basis, "provider_estimate")
self.assertEqual(usage.recorded_cost_usd, 0.0042)
self.assertEqual(usage.estimated_cost_usd, 0)
self.assertTrue(usage.evaluator_cache.enabled)
self.assertEqual(usage.evaluator_cache.requests, 4)
self.assertEqual(usage.evaluator_cache.hit_rate, 0.75)
self.assertEqual(usage.daily_cost[0].day, "2026-06-28")
self.assertEqual(usage.daily_cost[0].cost_usd, 0.0042)
async def test_usage_from_database_backfills_agy_zero_cost_with_reference_rate(self) -> None:
class Conn:
def __init__(self) -> None:
self.fetch_calls = 0
async def fetchrow(self, query, *args, **kwargs):
return {
"total_turns": 5,
"metered_turns": 5,
"token_metered_turns": 5,
"token_unmetered_turns": 0,
"tokens_in": 35_703,
"tokens_out": 1_129,
"cost_usd": 0,
}
async def fetch(self, query, *args, **kwargs):
self.fetch_calls += 1
row = {
"provider": "agy_cli",
"model": "gemini-3.6-flash-high",
"turns": 5,
"token_metered_turns": 5,
"token_unmetered_turns": 0,
"tokens_in": 35_703,
"tokens_out": 1_129,
"cost_usd": 0,
"unpriced_turns": 5,
"unpriced_tokens_in": 35_703,
"unpriced_tokens_out": 1_129,
}
if self.fetch_calls == 2:
return [{"day": "2026-07-31", **row}]
return [row]
with patch.object(admin_routes, "acquire", return_value=_Acquire(Conn())):
usage = await admin_routes._usage_from_database(window_days=30)
self.assertEqual(usage.cost_usd, 0.062022)
self.assertEqual(usage.recorded_cost_usd, 0)
self.assertEqual(usage.estimated_cost_usd, 0.062022)
self.assertEqual(usage.daily_cost[0].cost_usd, 0.062022)
breakdown = usage.by_provider[0]
self.assertEqual(breakdown.cost_usd, 0.062022)
self.assertEqual(breakdown.cost_basis, "reference_rate")
self.assertIn("Gemini 3.6 Flash", breakdown.rate_label or "")
async def test_uptime_from_database_aggregates_health_samples(self) -> None:
now = datetime.now(timezone.utc)