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:
parent
93dd8f82d7
commit
16e791e044
390 changed files with 243188 additions and 499 deletions
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue