{ "schema_version": "1.0", "manifest_id": "outcome-os-clean-release-2026-08-07", "captured_at": "2026-08-07T12:36:00+09:00", "repository": "D:/workspace/vignette", "scope": { "goals": [ "G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8" ], "selection_mode": "fail-closed", "release_readiness": "blocked", "decision": "G0-G8 내부 구현 후보와 무관 변경을 파일 단위로 분리한다. 혼합 파일은 자동 승격하지 않으며 명시적 hunk 검토 또는 깨끗한 재생성 전까지 릴리스 집합을 닫는다.", "source_of_truth": [ "docs/dev_dashboard.html", "docs/TODO.md", "docs/ops/backlog-2026-06-26.md", "docs/ops/vignette-outcome-alliance-os-agentic-plan-2026-08-06.md" ], "ssot_snapshot": { "G0-G6": "internal-done", "G7": "internal-done-external-proof-blocked", "G8": "done-isolated-nas-runtime-promoted" } }, "policy": { "related": "현재 diff가 G0-G8 또는 이 릴리스 감사만으로 구성된 whole-file 후보다. 이 표시는 stage 또는 release 승인이 아니다.", "mixed": "G0-G8과 무관 변경이 한 파일에 공존한다. disposition=hunk-review-required이며 release_eligible=false다.", "excluded": "Outcome/Alliance OS 릴리스 범위 밖 변경이다. 사용자의 별도 작업으로 보존하며 이 릴리스에 포함하지 않는다." }, "release_assembly": { "status": "verified", "base_commit": "76d0b9ae9bb11b62af86ccd9a55e798bbedc9e31", "hunk_map": "docs/ops/outcome-os-release-hunk-map-2026-08-07.json", "builder": "scripts/build-outcome-os-release-patch.py", "output_patch": "docs/ops/evidence/outcome-os-release-only-2026-08-07.patch", "patch_sha256": "a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d", "patch_bytes": 4412868, "patch_files": 304, "api_generated_sha256": "5a2f6c1810af0d9405eb47e77b0ffa9305572b728ec975f78b9a1f55ac552163", "deterministic_runs": 2, "git_apply_check": "passed-on-clean-temporary-head", "git_apply_cached_check": "passed-on-canonical-clean-index", "patch_line_endings": "lf-only", "artifact_publish": "atomic-replace-after-all-guards", "source_worktree": "unchanged-except-output-patch", "mixed_whole_files_release_eligible": false }, "classifications": { "related": [ { "id": "shared-runtime-integration", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "candidate-whole-file", "rationale": "G0-G8 라우터, 런타임 스키마, 회기 증거 UUID, 내부 토큰, 개발 E2E cohort와 공용 리뷰 표면을 연결하는 Outcome OS 통합 변경이다.", "paths": [ "apps/api/app/config.py", "apps/api/app/main.py", "apps/api/app/routes/auth.py", "apps/api/app/routes/sessions.py", "apps/api/app/routes/voice.py", "apps/api/app/runtime_schema.py", "apps/api/app/services/orchestrator.py", "apps/api/app/services/persona.py", "apps/api/app/session_read_model.py", "apps/api/app/test_auth_providers.py", "apps/api/app/test_runtime_schema_ssot.py", "apps/api/app/test_session_turn_persistence.py", "apps/web/e2e/support.ts", "apps/web/package.json", "apps/web/src/App.tsx", "apps/web/src/components/shell/Sidebar.tsx", "apps/web/src/lib/api.ts", "apps/web/src/pages/SessionReview.tsx", "docs/ops/outcome-os-g0-g1-g3-local-hardening-evidence-2026-08-07.md" ] }, { "id": "g0-measurement-foundation", "goals": ["G0"], "disposition": "candidate-whole-file", "rationale": "측정 계약, 원장, benchmark, 생성기와 계약 회귀 검증으로 G0 기반을 구성한다.", "paths": [ "apps/api/app/contracts/measurement.py", "apps/api/app/contracts/measurement_contract.v1.json", "apps/api/app/data/outcome_alliance_benchmark_g0.v1.json", "apps/api/app/routes/measurements.py", "apps/api/app/services/measurement_legacy.py", "apps/api/app/test_measurement_contract.py", "apps/api/app/test_measurement_routes.py", "apps/web/scripts/check-measurement-contract.mjs", "apps/web/src/lib/measurementContract.ts", "docs/decisions/outcome-alliance-measurement-ledger.md", "docs/ops/evidence/measurement-migration-rehearsal-2026-08-07.json", "docs/ops/evidence/measurement-provenance-census-live-2026-08-07.json", "docs/ops/measurement-provenance-inventory-2026-08-06.md", "infra/db/init/07_measurement_foundation.sql", "scripts/check-measurement-ledger.sql", "scripts/check-measurement-provenance-census.py", "scripts/generate-measurement-contract.py", "scripts/rehearse-measurement-migration.py", "scripts/test_measurement_provenance_tools.py" ] }, { "id": "g1-alliance-pulse", "goals": ["G1"], "disposition": "candidate-whole-file", "rationale": "Alliance Pulse 측정, 비동기 보정, 교수자 재평정, UI와 실제 DB/API 증거를 구성한다.", "paths": [ "apps/api/app/services/alliance_calibration.py", "apps/api/app/services/alliance_measurement.py", "apps/api/app/test_alliance_calibration.py", "apps/api/app/test_alliance_measurement.py", "apps/web/e2e/alliance-pulse.spec.ts", "apps/web/src/pages/session-review/AlliancePulseCard.tsx", "apps/web/src/pages/session-review/alliance-pulse.css", "apps/web/src/pages/session-review/alliancePulseApi.ts", "docs/ops/alliance-calibration-report-2026-08-06.md", "docs/ops/alliance-calibration-report-prompt-1.1.0-2026-08-06.md", "docs/ops/alliance-calibration-report-prompt-1.1.0-retry2-2026-08-06.md", "docs/ops/alliance-calibration-report-prompt-1.2.0-2026-08-06.md", "docs/ops/alliance-pulse-live-integration-evidence-2026-08-06.md", "docs/ops/evidence/alliance-calibration-candidate-2026-08-06.json", "docs/ops/evidence/alliance-calibration-candidate-prompt-1.1.0-2026-08-06.json", "docs/ops/evidence/alliance-calibration-candidate-prompt-1.1.0-retry2-2026-08-06.json", "docs/ops/evidence/alliance-calibration-candidate-prompt-1.2.0-2026-08-06.json", "docs/ops/evidence/alliance-calibration-comparison-2026-08-06.json", "docs/ops/evidence/alliance-calibration-comparison-prompt-1.1.0-2026-08-06.json", "docs/ops/evidence/alliance-calibration-comparison-prompt-1.1.0-retry2-2026-08-06.json", "docs/ops/evidence/alliance-calibration-comparison-prompt-1.2.0-2026-08-06.json", "docs/ops/evidence/alliance-pulse-live-prompt-1.2.0-2026-08-06.json", "docs/ops/evidence/alliance-pulse-live-hardening-2026-08-07.json", "scripts/check-alliance-pulse-ledger.sql", "scripts/compare-alliance-calibration.py", "scripts/run-alliance-calibration.py", "scripts/smoke-alliance-pulse-api.py" ] }, { "id": "g2-outcome-trajectory", "goals": ["G2"], "disposition": "candidate-whole-file", "rationale": "1-5회기 합성 성과 궤적의 계약, 저장소, API, UI, 원장과 실통합 증거다.", "paths": [ "apps/api/app/contracts/outcome_trajectory.py", "apps/api/app/data/outcome_trajectory_benchmark_g2.v1.json", "apps/api/app/routes/outcome_trajectories.py", "apps/api/app/services/outcome_trajectory.py", "apps/api/app/services/outcome_trajectory_store.py", "apps/api/app/test_outcome_trajectory.py", "apps/api/app/test_outcome_trajectory_schema.py", "apps/api/app/test_outcome_trajectory_store.py", "apps/web/e2e/outcome-trajectory.spec.ts", "apps/web/src/pages/session-review/OutcomeTrajectoryCard.tsx", "apps/web/src/pages/session-review/outcome-trajectory.css", "apps/web/src/pages/session-review/outcomeTrajectoryApi.ts", "docs/ops/evidence/outcome-trajectory-live-five-session-2026-08-06.json", "docs/ops/outcome-trajectory-live-integration-evidence-2026-08-06.md", "infra/db/init/08_outcome_trajectory.sql", "scripts/check-outcome-trajectory-ledger.sql", "scripts/smoke-outcome-trajectory-api.py" ] }, { "id": "g3-rupture-repair", "goals": ["G3"], "disposition": "candidate-whole-file", "rationale": "파열 시나리오, 감지·수선 상태기계, append-only 교정, UI 및 API/DB 검증을 구성한다.", "paths": [ "apps/api/app/contracts/rupture_repair.py", "apps/api/app/data/rupture_repair_benchmark_g3.v1.json", "apps/api/app/routes/rupture_repairs.py", "apps/api/app/services/rupture_repair.py", "apps/api/app/services/rupture_repair_store.py", "apps/api/app/services/rupture_runtime.py", "apps/api/app/services/rupture_scenario_director.py", "apps/api/app/test_rupture_repair.py", "apps/api/app/test_rupture_repair_store.py", "apps/api/app/test_rupture_runtime.py", "apps/api/app/test_rupture_scenario_director.py", "apps/web/e2e/rupture-repair.spec.ts", "apps/web/src/pages/session-review/RuptureRepairCard.tsx", "apps/web/src/pages/session-review/rupture-repair.css", "apps/web/src/pages/session-review/ruptureRepairApi.ts", "docs/ops/evidence/rupture-repair-live-api-2026-08-06.json", "docs/ops/evidence/rupture-repair-live-three-state-2026-08-07.json", "docs/ops/rupture-repair-live-integration-evidence-2026-08-06.md", "infra/db/init/09_rupture_repair.sql", "scripts/smoke-rupture-repair-api.py", "scripts/smoke-rupture-repair-ledger.sql" ] }, { "id": "g4-deliberate-practice", "goals": ["G4"], "disposition": "candidate-whole-file", "rationale": "의도적 수련 처방, 시도, 숙련도 갱신과 리뷰 UI 및 실제 원장 증거다.", "paths": [ "apps/api/app/contracts/deliberate_practice.py", "apps/api/app/data/deliberate_practice_benchmark_g4.v1.json", "apps/api/app/routes/deliberate_practices.py", "apps/api/app/services/deliberate_practice.py", "apps/api/app/services/deliberate_practice_store.py", "apps/api/app/test_deliberate_practice.py", "apps/api/app/test_deliberate_practice_store.py", "apps/web/e2e/deliberate-practice.spec.ts", "apps/web/src/pages/session-review/DeliberatePracticeCard.tsx", "apps/web/src/pages/session-review/deliberate-practice.css", "apps/web/src/pages/session-review/deliberatePracticeApi.ts", "docs/ops/deliberate-practice-live-integration-evidence-2026-08-06.md", "docs/ops/evidence/deliberate-practice-live-api-2026-08-06.json", "infra/db/init/10_deliberate_practice.sql", "scripts/check-deliberate-practice-ledger.sql", "scripts/smoke-deliberate-practice-api.py", "scripts/smoke-deliberate-practice-ledger.sql" ] }, { "id": "g5-calibration-transfer", "goals": ["G5"], "disposition": "candidate-whole-file", "rationale": "예측 잠금, 자기보정, 전이 평가, 역할별 투영과 리뷰 UI를 포함한 G5 구현·증거다.", "paths": [ "apps/api/app/contracts/calibration_transfer.py", "apps/api/app/data/calibration_transfer_benchmark_g5.v1.json", "apps/api/app/routes/calibration_transfer.py", "apps/api/app/services/calibration_transfer.py", "apps/api/app/services/calibration_transfer_store.py", "apps/api/app/test_calibration_transfer.py", "apps/api/app/test_calibration_transfer_store.py", "apps/web/e2e/calibration-transfer.spec.ts", "apps/web/src/pages/session-review/CalibrationTransferCard.tsx", "apps/web/src/pages/session-review/calibration-transfer.css", "apps/web/src/pages/session-review/calibrationTransferApi.ts", "docs/ops/calibration-transfer-live-integration-evidence-2026-08-06.md", "docs/ops/evidence/calibration-transfer-live-api-2026-08-06.json", "infra/db/init/11_calibration_transfer.sql", "scripts/smoke-calibration-transfer-api.py", "scripts/smoke-calibration-transfer-ledger.sql" ] }, { "id": "g6-supervision-research", "goals": ["G6"], "disposition": "candidate-whole-file", "rationale": "감독 큐, 연구 projection, 불일치·drift 기록, UI와 내부/사람 API 증거를 구성한다.", "paths": [ "apps/api/app/contracts/supervision_research.py", "apps/api/app/data/supervision_research_benchmark_g6.v1.json", "apps/api/app/routes/supervision_research.py", "apps/api/app/services/supervision_research.py", "apps/api/app/services/supervision_research_store.py", "apps/api/app/test_supervision_research.py", "apps/api/app/test_supervision_research_store.py", "apps/web/e2e/supervision-research.spec.ts", "apps/web/src/pages/SupervisionResearch.tsx", "apps/web/src/pages/supervision-research.css", "apps/web/src/pages/supervisionResearchApi.ts", "docs/ops/evidence/supervision-research-live-api-2026-08-06.json", "docs/ops/supervision-research-live-integration-evidence-2026-08-06.md", "infra/db/init/12_supervision_research.sql", "scripts/smoke-supervision-research-api.py", "scripts/smoke-supervision-research-ledger.sql" ] }, { "id": "g7-multimodal-alliance", "goals": ["G7"], "disposition": "candidate-whole-file", "rationale": "명시 동의, Deepgram 실시간 STT와 OpenAI batch fallback, 음성 파생 신호, 철회·삭제, fusion, 복구 UX와 리뷰 UI의 내부 구현·실DB 증거다. Deepgram live provider, 인증 공개 WSS, 물리 마이크, 50분 증거는 별도 gate로 남는다.", "paths": [ "apps/api/app/contracts/multimodal_alliance.py", "apps/api/app/data/multimodal_alliance_benchmark_g7.v1.json", "apps/api/app/routes/multimodal_alliance.py", "apps/api/app/services/multimodal_alliance.py", "apps/api/app/services/multimodal_alliance_store.py", "apps/api/app/services/voice.py", "apps/api/app/test_multimodal_alliance.py", "apps/api/app/test_multimodal_alliance_store.py", "apps/api/app/test_voice_service.py", "apps/api/app/test_voice_ws.py", "apps/api/requirements.txt", "apps/web/e2e/multimodal-alliance.spec.ts", "apps/web/e2e/voice-success.spec.ts", "apps/web/src/pages/session/voiceCapture.ts", "apps/web/src/pages/session-review/MultimodalAllianceCard.tsx", "apps/web/src/pages/session-review/multimodal-alliance.css", "apps/web/src/pages/session-review/multimodalAllianceApi.ts", "docs/ops/evidence/multimodal-alliance-live-api-2026-08-06.json", "docs/ops/evidence/g7-external-voice-gate-audit-2026-08-07.json", "docs/ops/outcome-os-g7-wss-soak-evidence-2026-08-07.md", "docs/ops/multimodal-alliance-live-integration-evidence-2026-08-06.md", "infra/db/init/13_multimodal_alliance.sql", "scripts/smoke-multimodal-alliance-api.py", "scripts/smoke-multimodal-alliance-ledger.py", "scripts/soak-public-voice-websocket.py", "scripts/soak-voice-websocket.py", "scripts/test_g7_external_voice_soak.py" ] }, { "id": "g8-continuous-improvement", "goals": ["G8"], "disposition": "candidate-whole-file", "rationale": "모니터 이벤트, incident DAG, 모델·콘텐츠·릴리스 gate와 관리자 cockpit의 내부 구현·실DB 증거다. 실제 배포와 공개 증거는 별도 gate다.", "paths": [ "apps/api/app/contracts/continuous_improvement.py", "apps/api/app/routes/continuous_improvement.py", "apps/api/app/services/continuous_improvement.py", "apps/api/app/services/continuous_improvement_store.py", "apps/api/app/test_continuous_improvement.py", "apps/api/app/test_continuous_improvement_store.py", "apps/web/e2e/continuous-improvement-admin.spec.ts", "apps/web/e2e/continuous-improvement-live.spec.ts", "apps/web/src/pages/AdminContinuousImprovement.tsx", "apps/web/src/pages/admin/ContinuousImprovementCockpit.tsx", "apps/web/src/pages/admin/continuous-improvement.css", "apps/web/src/pages/admin/continuousImprovementApi.ts", "docs/ops/continuous-improvement-live-integration-evidence-2026-08-06.md", "docs/ops/evidence/continuous-improvement-live-api-2026-08-06.json", "infra/db/init/14_continuous_improvement.sql", "scripts/smoke-continuous-improvement-api.py", "scripts/smoke-continuous-improvement-ledger.sql" ] }, { "id": "g1-g4-g5-g7-self-directed-session-integration", "goals": ["G1", "G4", "G5", "G7"], "disposition": "candidate-whole-file", "rationale": "실제 Session의 pre/mid alliance checkpoint, 코칭·전이 카드의 학습자 홈부터 새 회기까지 이어지는 typed launch contract, 역할 안전 음성 재연습과 desktop/mobile 통합 증거다.", "paths": [ "apps/web/e2e/avatar-expression.spec.ts", "apps/web/e2e/full-sweep-session.spec.ts", "apps/web/e2e/layout-visual-gate.spec.ts", "apps/web/e2e/learner.spec.ts", "apps/web/e2e/session-layout.spec.ts", "apps/web/e2e/session-mvp.spec.ts", "apps/web/e2e/session-persistence.spec.ts", "apps/web/src/lib/practiceLaunchIntent.ts", "apps/web/src/lib/voicePracticeContext.ts", "apps/web/src/pages/LearnerHome.tsx", "apps/web/src/pages/Session.tsx", "apps/web/src/pages/learner-home.css", "apps/web/src/pages/session/AllianceCheckpointPrompt.tsx", "apps/web/src/pages/session/alliance-checkpoint-prompt.css", "apps/web/src/pages/session/session.css", "apps/web/src/pages/session-review/session-review.css", "docs/ops/evidence/g1-alliance-mid-chromium-desktop-2026-08-07.png", "docs/ops/evidence/g1-alliance-mid-chromium-mobile-2026-08-07.png", "docs/ops/evidence/g1-alliance-pre-chromium-desktop-2026-08-07.png", "docs/ops/evidence/g1-alliance-pre-chromium-mobile-2026-08-07.png", "docs/ops/outcome-os-g1-g4-g5-g7-self-directed-integration-evidence-2026-08-07.md" ] }, { "id": "engine-gateway-auth-and-nas-preview", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "candidate-whole-file", "rationale": "NAS 격리 preview의 BuildKit 호환 ASCII 패키징, 비밀값 무출력 provisioning과 기동 경계, API→engine shared-secret 전달, 운영 설정 검증, 실브라우저 QA와 exact gateway dependency pin이다.", "paths": [ ".dockerignore", ".env.example", "apps/api/app/engine_client.py", "apps/api/app/test_runtime_policy.py", "apps/api/engine_gateway/requirements.txt", "docs/ops/evidence/nas-preview-learner-home-2026-08-07.png", "docs/ops/evidence/nas-preview-learner-session-2026-08-07.png", "scripts/provision-nas-preview-env.py", "scripts/start-nas-preview-engine.ps1", "scripts/test_provision_nas_preview_env.py" ] }, { "id": "g1-alliance-runtime-evidence", "goals": ["G1"], "disposition": "candidate-whole-file", "rationale": "실제 회기의 pre/mid/post Alliance Pulse 상태전이와 append-only provenance를 기계 판독 가능한 증거로 고정한다.", "paths": [ "docs/ops/evidence/alliance-pulse-pre-mid-post-live-2026-08-07.json" ] }, { "id": "g2-outcome-alert-producer", "goals": ["G2"], "disposition": "candidate-whole-file", "rationale": "실제 G0 측정 원장에서 G2 악화 궤적과 단발 noise false alert를 구분하는 production observation smoke와 비식별 증거다.", "paths": [ "docs/ops/evidence/outcome-trajectory-alerts-live-2026-08-07.json", "scripts/smoke-outcome-trajectory-alerts.py" ] }, { "id": "g3-rupture-runtime-producer", "goals": ["G3"], "disposition": "candidate-whole-file", "rationale": "실제 durable learner turn과 공용 finalizer에서 G3 episode·observation·reconciliation을 자동 생산하는 runtime smoke와 증거다.", "paths": [ "docs/ops/evidence/rupture-runtime-auto-live-2026-08-07.json", "scripts/smoke-rupture-runtime-auto.py" ] }, { "id": "g4-g5-session-learning-producer", "goals": ["G4", "G5"], "disposition": "candidate-whole-file", "rationale": "종료 회기 평가와 prediction lock에서 durable 근거를 소비해 G4 처방과 G5 독립 관찰만 fail-closed 생산하고 자동 mastery·transfer 승격을 금지하는 caller와 실 DB 증거다.", "paths": [ "apps/api/app/services/session_learning_producer.py", "apps/api/app/session_persistence.py", "apps/api/app/test_session_learning_producer.py", "docs/ops/evidence/session-learning-producer-live-2026-08-07.json", "docs/ops/outcome-os-g4-g5-production-caller-evidence-2026-08-07.md", "scripts/smoke-session-learning-producer.py" ] }, { "id": "g6-ledger-and-version-producers", "goals": ["G6"], "disposition": "candidate-whole-file", "rationale": "G0-G5 append-only 원장에서 G6 attention·curriculum·Phase 3 산출물과 repo-approved synthetic version 비교를 스케줄 생산하고 원문·임상 주장 누수를 차단하는 구현·회귀·실 DB 증거다.", "paths": [ "apps/api/app/services/supervision_research_producer.py", "apps/api/app/services/supervision_research_version_evaluator.py", "apps/api/app/test_supervision_research_producer.py", "apps/api/app/test_supervision_research_version_evaluator.py", "docs/ops/evidence/supervision-version-comparison-producer-live-2026-08-07.json", "docs/ops/outcome-os-g6-ledger-producer-evidence-2026-08-07.md", "docs/ops/outcome-os-g6-version-comparison-producer-evidence-2026-08-07.md", "scripts/smoke-supervision-version-comparison-producer.py" ] }, { "id": "g7-consent-concurrency-hardening", "goals": ["G7"], "disposition": "candidate-whole-file", "rationale": "멀티모달 동의·철회 경쟁에서 추가 provider 전송과 파생 저장을 차단하는 G7 동시성 smoke다.", "paths": [ "scripts/smoke-multimodal-consent-concurrency.py" ] }, { "id": "g8-agentic-production-worker", "goals": ["G8"], "disposition": "candidate-whole-file", "rationale": "repo-approved synthetic source에서 generator·독립 red-team·variant judge를 실행하고 lease/retry와 human gate 앞 pending 상태만 durable 저장하는 G8 worker, 안전 필터, 회귀 및 실패 포함 증거다.", "paths": [ "apps/api/app/data/continuous_improvement/synthetic_source_pack.v1.json", "apps/api/app/data/continuous_improvement/synthetic_source_pack.v2.json", "apps/api/app/data/continuous_improvement/synthetic_source_pack.v3.json", "apps/api/app/data/continuous_improvement/synthetic_source_pack.v4.json", "apps/api/app/data/continuous_improvement/synthetic_source_pack.v5.json", "apps/api/app/services/continuous_improvement_agentic.py", "apps/api/app/services/continuous_improvement_producer.py", "apps/api/app/services/continuous_improvement_trigger.py", "apps/api/app/services/guardrail.py", "apps/api/app/test_continuous_improvement_agentic.py", "apps/api/app/test_continuous_improvement_producer.py", "apps/api/app/test_continuous_improvement_trigger.py", "docs/ops/evidence/continuous-improvement-agentic-producer-answer-leakage-failure-2026-08-07.json", "docs/ops/evidence/continuous-improvement-agentic-producer-live-2026-08-07.json", "docs/ops/evidence/continuous-improvement-agentic-producer-live-failure-2026-08-07.json", "docs/ops/evidence/continuous-improvement-agentic-producer-redteam-failure-2026-08-07.json", "docs/ops/outcome-os-g8-agentic-worker-evidence-2026-08-07.md", "scripts/smoke-continuous-improvement-agentic-producer.py" ] }, { "id": "g1-g4-g5-g7-self-directed-learning-loop", "goals": ["G1", "G4", "G5", "G7"], "disposition": "candidate-whole-file", "rationale": "학습 홈 추천부터 실제 회기·리뷰·G4 재연습까지 이어지는 자기주도 루프, stage 대비 token, typed persona 표시, desktop/mobile 검증과 9장 시각 증거다.", "paths": [ "apps/web/e2e/self-directed-learning-loop.spec.ts", "apps/web/src/pages/learner-home/model.ts", "apps/web/src/styles/tokens.css", "docs/ops/evidence/self-directed-loop-active-session-320x568-chromium-mobile-2026-08-07.png", "docs/ops/evidence/self-directed-loop-active-session-chromium-desktop-2026-08-07.png", "docs/ops/evidence/self-directed-loop-active-session-chromium-mobile-2026-08-07.png", "docs/ops/evidence/self-directed-loop-home-chromium-desktop-2026-08-07.png", "docs/ops/evidence/self-directed-loop-home-chromium-mobile-2026-08-07.png", "docs/ops/evidence/self-directed-loop-repractice-prestart-chromium-desktop-2026-08-07.png", "docs/ops/evidence/self-directed-loop-repractice-prestart-chromium-mobile-2026-08-07.png", "docs/ops/evidence/self-directed-loop-review-prescription-chromium-desktop-2026-08-07.png", "docs/ops/evidence/self-directed-loop-review-prescription-chromium-mobile-2026-08-07.png", "docs/ops/outcome-os-self-directed-learning-loop-ui-evidence-2026-08-07.md" ] }, { "id": "g7-runtime-and-external-proof-hardening", "goals": ["G7"], "disposition": "candidate-whole-file", "rationale": "명시 동의 원장 선행, metadata-only worker/Uvicorn high-water, exact topology sampler, public WSS v4와 독립 human-held-out voice-gain 계약을 canonical four-artifact checker로 묶는 G7 내부 준비다. 실제 물리 마이크·Deepgram 운영 key/quota·50분 실행·사람 라벨은 외부 gate로 남긴다.", "paths": [ "apps/api/Dockerfile", "apps/api/app/contracts/g7_external_evidence.py", "apps/api/app/services/g7_voice_gain_evidence.py", "apps/api/app/services/voice_runtime.py", "apps/api/app/test_g7_voice_gain_evidence.py", "apps/api/app/test_voice_runtime.py", "docs/ops/outcome-os-g7-external-proof-readiness-2026-08-07.md", "scripts/capture-g7-runtime-evidence.py", "scripts/capture-g7-topology-evidence.py", "scripts/check-g7-external-proof.py", "scripts/test_g7_external_proof.py", "scripts/test_g7_runtime_evidence.py", "scripts/test_g7_topology_evidence.py" ] }, { "id": "agentic-plan-and-live-ssot-support", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "candidate-whole-file", "rationale": "Outcome OS의 에이전틱 계획, 동영상 분석 근거, 현행 TODO·백로그·로컬/배포 구성, NAS 격리 프리뷰 배포 증거 및 SSOT 검사 변경이다.", "paths": [ "apps/web/e2e/dev-dashboard.spec.ts", "docs/README.md", "docs/TODO.md", "docs/guides/local-development.md", "docs/ops/backlog-2026-06-26.md", "docs/ops/evidence/nas-preview-deployment-2026-08-07.json", "docs/ops/evidence/nas-preview-live-turn-2026-08-07.png", "docs/ops/nas-preview-deployment-evidence-2026-08-07.md", "docs/ops/outcome-os-deploy-preflight-evidence-2026-08-07.md", "docs/ops/outcome-os-g7-g8-visual-qa-2026-08-07.md", "docs/ops/outcome-os-public-deployment-evidence-2026-08-07.md", "docs/ops/video-c0schc1z71q-detailed-notes-2026-08-06.md", "docs/ops/vignette-outcome-alliance-os-agentic-plan-2026-08-06.md", "infra/.env.example", "infra/README.md", "infra/docker-compose.yml", "scripts/check-deploy-preflight.py", "scripts/check-dev-dashboard-ssot.py", "scripts/provision-outcome-os-runtime-secrets.py", "scripts/test_deploy_preflight.py", "scripts/test_dev_dashboard_ssot.py", "scripts/test_provision_outcome_os_runtime_secrets.py" ] }, { "id": "clean-release-governance", "goals": ["release-governance"], "disposition": "candidate-whole-file", "rationale": "현재 dirty 집합을 1:1로 분류하고 drift 또는 혼합 파일의 무검토 승격을 차단하며, 결정적 clean 후보만 격리 NAS에 승격하고 실패 시 이미지·런타임을 복구하는 감사·실행 산출물이다.", "paths": [ "docs/ops/outcome-os-clean-release-manifest-2026-08-07.json", "docs/ops/outcome-os-release-hunk-map-2026-08-07.json", "docs/ops/evidence/outcome-os-release-only-2026-08-07.patch", "scripts/build-outcome-os-release-patch.py", "scripts/check-outcome-os-release-manifest.py", "scripts/run-outcome-os-release-agent.py", "scripts/test_outcome_os_release_agent.py", "scripts/test_outcome_os_release_manifest.py" ] } ], "mixed": [ { "id": "generated-api-contract-cross-task", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "G0-G8 OpenAPI 계약과 별도 관리자 비용·Claude token telemetry 계약이 같은 생성 파일에 공존한다.", "required_action": "무관 API 소스를 제외한 깨끗한 G0-G8 소스 집합에서 전체 재생성하고 생성 결과를 다시 검증한다. 생성 파일의 수동 hunk stage는 금지한다.", "paths": ["apps/web/src/lib/api.gen.ts"] }, { "id": "dashboard-cross-task", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "Outcome OS G0-G8 상태·증거와 별도 X2 공급자 가격·Claude token backfill 운영 기록이 SSOT 한 파일에 공존한다.", "required_action": "Outcome OS 관련 hunk만 검토해 깨끗한 릴리스 브랜치에 적용하고, 적용 후 대시보드 SSOT 검사를 재실행한다.", "paths": ["docs/dev_dashboard.html"] }, { "id": "architecture-cross-task", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "Outcome OS 원장·데이터흐름과 별도 LLM 가격 추정·Claude 사용량 백필 아키텍처가 한 diff에 공존한다.", "required_action": "Outcome OS 아키텍처 hunk만 독립 적용하고 무관 비용 telemetry hunk는 원 작업에 남긴다.", "paths": ["docs/guides/architecture.md"] }, { "id": "admin-voice-runtime-cross-task", "goals": ["G7"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "G7 metadata-only voice runtime snapshot 라우트와 별도 X2 가격·Claude token telemetry가 같은 admin.py diff에 공존한다.", "required_action": "voice runtime import와 /admin/voice-runtime hunk만 exact hunk map으로 적용하고 X2 비용·토큰 telemetry hunk는 제외한다.", "paths": ["apps/api/app/routes/admin.py"] }, { "id": "testing-cross-task", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "G0-G8 검증 기록과 별도 관리자 가격·Claude token live/backfill 검증 기록이 같은 문서 diff에 공존한다.", "required_action": "Outcome OS 검증 hunk만 검토 적용하고 관련 테스트 명령을 깨끗한 집합에서 다시 실행한다.", "paths": ["docs/guides/testing.md"] }, { "id": "engine-gateway-auth-cross-task", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "gateway shared-secret middleware와 기존 X2 Claude token telemetry 전달 변경이 같은 gateway.py diff에 공존한다.", "required_action": "constant-time shared-secret 인증과 /health 예외 hunk만 적용하고 기존 token/cost telemetry hunk는 제외한다.", "paths": ["apps/api/engine_gateway/gateway.py"] }, { "id": "engine-gateway-auth-test-cross-task", "goals": ["G0", "G1", "G2", "G3", "G4", "G5", "G6", "G7", "G8"], "disposition": "hunk-review-required", "release_eligible": false, "rationale": "gateway 인증 회귀와 기존 X2 Claude usage·token 전달 회귀가 같은 test_gateway_model.py diff에 공존한다.", "required_action": "shared-secret 인증 회귀와 그 import만 적용하고 token/cost telemetry 회귀 hunk는 제외한다.", "paths": ["apps/api/engine_gateway/test_gateway_model.py"] } ], "excluded": [ { "id": "provider-pricing-and-claude-usage", "goals": [], "disposition": "exclude-from-outcome-release", "rationale": "관리자 공급자 가격 추정, Claude usage 수집·과거 백필과 공개 관리자 검증은 별도 X2 작업이며 G0-G8 릴리스 범위가 아니다.", "paths": [ "apps/api/app/services/claude_usage_backfill.py", "apps/api/app/services/llm_pricing.py", "apps/api/app/services/usage_report.py", "apps/api/app/test_admin_ops.py", "apps/api/app/test_claude_usage_backfill.py", "apps/api/app/test_llm_pricing.py", "apps/api/app/test_usage_report.py", "apps/api/engine_gateway/provider_registry.py", "apps/api/engine_gateway/test_provider_registry.py", "apps/web/e2e/admin.spec.ts", "apps/web/e2e/public-admin-visual.spec.ts", "apps/web/src/pages/AdminAi.tsx", "apps/web/src/pages/admin/admin-ai.css", "docs/guides/source-docs-and-gaps.md", "scripts/backfill-claude-token-usage.py" ] }, { "id": "transient-g7-visual-qa", "goals": [], "disposition": "exclude-from-outcome-release", "rationale": "로컬 직접 검토용 첫 동의 모달 PNG다. 제품 코드는 별도 회귀로 검증하며 test-results 산출물은 NAS release payload에 포함하지 않는다.", "paths": [ "apps/web/test-results/g7-voice-consent-desktop.png", "apps/web/test-results/g7-voice-consent-mobile.png" ] } ] }, "release_gates": [ { "id": "mixed-files-cleared", "status": "satisfied-by-verified-release-patch", "evidence_required": "검증된 release-only patch만 사용한다. 현재 mixed whole-file 4개를 직접 승격하거나 stage하면 다시 차단한다.", "evidence": "G7 hardening release SHA-256 a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d; 선행 consent ledger, metadata-only voice worker/Uvicorn high-water, public WSS v4, exact topology와 independent human-held-out four-artifact checker, 실제 사용자 동의 순서를 따르는 DB-backed voice E2E를 포함해 결정적 재생성; admin.py는 G7 runtime import/endpoint만 exact hunk로 포함하고 X2 가격·Claude usage telemetry 34개 hunk는 제외; clean temporary HEAD와 canonical index git apply 검사 통과." }, { "id": "g7-external-proof", "status": "blocked", "evidence_required": "scripts/check-g7-external-proof.py가 같은 공개 host·동시 시간창으로 묶인 네 artifact를 모두 검증해야 한다: Deepgram 운영 key·quota live interim/final과 OpenAI TTS를 사용한 authenticated public WSS, 실행 직전 명시 동의 물리 마이크 50분 양방향 soak, admin metadata-only worker/Uvicorn queue high-water, exact image·container·cgroup/proc/Docker/TCP topology high-water, 독립 blind human-labeled held-out voice-gain benchmark. synthetic·preflight·단일 short probe는 불가." }, { "id": "g8-agentic-runtime-promotion", "status": "satisfied-by-isolated-nas-release", "evidence_required": "변경 SHA를 격리 NAS에 실제 승격하고 semantic runtime, browser SSE→DB review, rollback snapshot과 exact-SHA SSOT handoff를 기록한다.", "evidence": "latest release-only SHA a8c27b0aadcb9dacea86c4be5e62e19277b9cc2678ebca51aa02998d2c2d1a0d promoted to vignette-preview-20260807; API image sha256:79ec731f6bcdb79850507f5b711930a710e2d8e82276e3ea61dc8e4a60e04450; web image sha256:c530213f4f8b23f228b2999df0c3653173cfa6939b6abb476f17df7488462f28; health ok db/engine true; OpenAPI 124; auth 401; G0-G8; readiness attempts 3; clean candidate session E2E 24/24 and postdeploy browser SSE to DB-backed review passed; physical microphone false; prior G8 rollback rehearsal remains verified; docs/ops/nas-preview-deployment-evidence-2026-08-07.md" }, { "id": "g8-public-proof", "status": "satisfied-by-public-release", "evidence_required": "실제 배포된 공개 API/UI에서 G8 release gate와 rollback 경로를 검증한 증거.", "evidence": "clean release API 8001 + Cloudflare Pages production; public OpenAPI 119 paths; G8 route 401 not 404; ops/outcome-os-public-deployment-evidence-2026-08-07.md" }, { "id": "aos-011-public-deployment-proof", "status": "satisfied-by-public-release", "evidence_required": "깨끗한 릴리스 집합의 public API, 정적 asset, 인증과 DB 연동 증거.", "evidence": "최초 deployment 3d53dc4b-2cd5-4422-805c-7c6e8a95d1a2와 G7 후속 deployment 6d7e89d5-a98c-4118-a0a4-fde77e1cc7c8; custom asset index-DZZoYvZq.js; prod/db/engine health; auth 401; OAuth 302+state" }, { "id": "aos-012-final-ssot-sync", "status": "satisfied-by-final-checkers", "evidence_required": "배포 증거 이후 dev_dashboard, TODO, backlog와 가이드의 최종 동기화.", "evidence": "dev_dashboard, TODO, backlog, guide, release manifest synchronized; dashboard and release checkers green" } ], "captured_status": { "dirty_files": 345, "related": 321, "mixed": 7, "excluded": 17 }, "verification": { "command": "py -3.11 -X utf8 scripts/check-outcome-os-release-manifest.py --json", "result": "passed", "executed_at": "2026-08-07T12:36:00+09:00", "assertions": [ "현재 git dirty path를 빠짐없이 정확히 한 번 분류한다.", "mixed는 hunk-review-required, release_eligible=false로 닫는다.", "G0-G8 모두 관련 또는 혼합 파일 증거가 있다.", "G7 외부 증거 gate만 blocked로 유지하고 G8 공개·격리 NAS 배포와 최종 SSOT sync는 충족 상태를 검증한다." ] } }