{ "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" } }