vignette/docs/ops/evidence/nas-preview-deployment-2026-08-07.json
Yun Chan 16e791e044 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 산출물은 커밋에서 제외했다.
2026-08-08 01:30:53 +09:00

95 lines
4 KiB
JSON

{
"schema": "vignette.nas-preview-deployment-evidence.v1",
"captured_at": "2026-08-07T12:59:25+09:00",
"target": {
"base_url": "http://100.116.83.60:8088",
"nas": "YUNCHAN-NAS",
"compose_project": "vignette-preview-20260807",
"remote_root": "/volume1/docker/vignette-preview-20260807",
"isolation": "dedicated compose project, ports, network, and volumes"
},
"runtime": {
"deployment_sha": "a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d",
"previous_deployment_sha": "e9b482ccba616a610c1f4862366d44aabae20ee8c82d8ef7f2cf16069f2d6e99",
"api_image": "sha256:79ec731f6bcdb79850507f5b711930a710e2d8e82276e3ea61dc8e4a60e04450",
"web_image": "sha256:c530213f4f8b23f228b2999df0c3653173cfa6939b6abb476f17df7488462f28",
"health": {
"status": "ok",
"environment": "dev",
"db": true,
"engine": true,
"engine_mode": "claude_cli"
},
"openapi_paths": 124,
"unauthenticated_me_status": 401,
"db_contract_ready": true
},
"browser_proof": {
"learner_launch_e2e": "1 passed in 13.1s",
"real_stream_review_e2e": "1 passed in 24.4s; test body 23.4s",
"live_turn_session_id": "c96922ab-0334-4864-ae48-df41a24aae14",
"durable_review_turns": 2,
"durable_client_turns": 1,
"review_api_recheck": {
"captured_at": "2026-08-07T08:29:23+09:00",
"status": 200,
"session_id": "c96922ab-0334-4864-ae48-df41a24aae14",
"stored_turns": 2,
"learner_turns": 1,
"client_turns": 1
},
"physical_microphone_used": false,
"release_agent_postdeploy": {
"test": "session-persistence: browser SSE stream -> DB-backed review",
"status": "passed",
"stdout_sha256": "b45111ce9f47d30e4c848362813940f3efd5464660b5046159b88befd9a59840"
},
"screenshots": [
"nas-preview-learner-home-2026-08-07.png",
"nas-preview-learner-session-2026-08-07.png",
"nas-preview-live-turn-2026-08-07.png"
]
},
"deployment_gates_added": [
"ASCII-only active root .dockerignore patterns for Synology BuildKit",
"required FRONTEND_ORIGIN_MAP without nested JSON interpolation",
"DB health waits for app role and final G8 schema access",
"API health requires status=ok, db=true, and engine=true",
"five-minute fresh-DB initialization start period",
"explicit dev-login email-domain allowlist",
"SSE done event terminates the browser reader without waiting for transport EOF",
"clean candidate generated API contract and Linux shell scripts are normalized to LF",
"promotion and rollback share the canonical snapshotted NAS env path with preflight",
"post-recreate transient readiness retries are bounded to 180 seconds"
],
"release_agent": {
"status": "deployed_ssot_synced",
"desired_sha": "a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d",
"readiness_attempts": 3,
"openapi_goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"],
"candidate_session_e2e_duration_ms": 505578,
"candidate_session_e2e_result": "24 passed",
"postdeploy_browser_review_duration_ms": 25328,
"rollback_rehearsal": {
"status": "verified",
"restored_api_image": "sha256:1bdaad1eb225936a292739c44975017f75981b6710505a2c272e438a9fdccf25",
"restored_web_image": "sha256:1833da07e42a4e1f008be78b94f08f7f326b5387cf28f720157568eed0ec82fb",
"restored_openapi_paths": 122,
"restored_auth_status": 401
}
},
"automation": {
"id": "vignette-e2e",
"name": "Vignette 회기 E2E 정기 검증",
"schedule": "daily 04:30 KST",
"status": "ACTIVE",
"notification_policy": "failed_runs_only",
"nas_promotion_policy": "material milestone + deterministic release-only patch + manifest checker + canonical clean-index + NAS preflight + changed deployment SHA",
"run_history_attached": false
},
"remaining_gate": {
"id": "g7-external-proof",
"status": "BUILD",
"reason": "physical microphone capture is not authorized and a Deepgram operations key is unavailable"
}
}