{"commit":{"body":[{"label":"Why","text":"짧은 join 실패 뒤 늦게 종료된 worker의 후속 정리가 진행되지 않아 재Start가 막혔다."},{"label":"What","text":"STOPPING/비동기 cleanup60초 deadline, pending 설정·취소·새 generation 전환과 공식 SDK Frame drop을 구현했다."},{"label":"Impact","text":"단일 Det·저장/Scenario/AL Off에 B를 적용한다. 진행 중 자원·오류·설정 저장 실패 보호를 유지하고 다른 실행과 중첩하지 않는다."},{"label":"Verify","text":"source/image 각72 tests와 SDK drop PASS. 실제 Start1 Restart1 Stop1, cleanup2.493초·새 결과3.870초·최종 cleanup2.579초. Analytics healthy/Stream stopped, 연결0·비대상 불변. 단일 window 수치이며 SLA와 다중채널 PASS는 아니다."},{"label":"Rollback","text":"이전 image와 모델을 보존했다. 배포 복구는 별도 승인으로 수행하며 version1 자동 rollback은 하지 않는다. 진단 mount는 다음 recreate 때 해제 또는 재판정한다."}],"title":"fix(pipeline): 비동기 cleanup과 안전한 개별 재Start 완결"},"created_at":"2026-09-11T03:30:33+00:00","expires_at":"2026-09-12T03:30:33+00:00","job_id":"ltb1021-contextra-restart-20260911","paths":[{"change":"modified","content_sha256":"94f88eb7358f588bd25a4c6165598b1193230196dbf9afcf69ed337b8aff1502","path":"app/api/streams.py"},{"change":"modified","content_sha256":"96fea3f5bda716f7757fbe0f12a6c28b1a171b7bd2966da3ef0b2d568a89901a","path":"app/multi_pipeline.py"},{"change":"modified","content_sha256":"d7c94e0cf26275c873f82501350ae840ac72d3dccb053597848c14cd13eb7bb8","path":"app/start_diagnostics.py"},{"change":"modified","content_sha256":"a1a4c382db39546295a077218089b3ae7c2cd9b722c6d32892325a1d24eb1ad2","path":"app/stream_lifecycle.py"},{"change":"modified","content_sha256":"6209a47635c196e19389db1423df29ab3ce704ad0db1953697ff15704048d371","path":"app/stream_manager.py"},{"change":"modified","content_sha256":"5bbff185fb2967c05cc0ddcdc5e3a0cbf940ed0ca6f9e85cc5670927c49c2764","path":"tests/test_cleanup_boundary.py"},{"change":"modified","content_sha256":"5379df5b2ac9720fa29c1cf5292a4ec2e5a7c0095ba3caaee873a42ed08c69cf","path":"tests/test_stream_apply.py"},{"change":"modified","content_sha256":"fb8a4ef1605cd86ffaa2993f661d63158d398c0b5dbd2e57b59242cacf1c6f18","path":"tests/test_stream_manager_lifecycle.py"},{"change":"added","content_sha256":"2e06433e2736f7045e69b657abb2830d9d9cd1e83c6f39a00eb251382dc60832","path":"tests/sdk_stop_drop_probe.py"},{"change":"added","content_sha256":"b13ee96dad7d740751d080cf758fbf13e964c5a29bcf854db5bb639dfc1fa4eb","path":"tests/test_async_restart.py"},{"change":"modified","content_sha256":"0c2edc98e26384d7ce490af9e81feed3ef8956f57bb16f1fc44ff9999bfd2323","path":"docs/profiles/ltb1021/topics/runtime-lifecycle/README.ko.md"},{"change":"added","content_sha256":"c99f01730a80588e65e68eb012962fb410b8399511d492db1a0549173f234c3d","path":"docs/profiles/ltb1021/topics/runtime-lifecycle/decision/20260911T122239+0900-decision-bounded-async-cleanup-restart.md"},{"change":"added","content_sha256":"57f9a6fabb8c7052b4fe896dbc956e1b9ea6c1aede7a6d21fd51ff1f966e4b05","path":"docs/profiles/ltb1021/topics/runtime-lifecycle/runs/20260911T122239+0900-run-async-restart-pass.md"}],"plan_hash":"4f8f321505d3c2b197dd868d177840d12517b437414a90a79f2794b0ae44a4d0","profile":"ltb1021","push":{"branch":"task/runtime-lifecycle-refactor","mode":"upstream","remote":"origin","remote_identity":"sha256:3a9ce41319a2ebea","upstream_head":"0667b1dcbb0b7aa1ea14a2630dacb1ee809f51be","upstream_ref":"origin/task/runtime-lifecycle-refactor"},"repository":{"baseline_head":"0667b1dcbb0b7aa1ea14a2630dacb1ee809f51be","branch":"task/runtime-lifecycle-refactor","worktree":"/workspace/contextra-analytics-runtime-lifecycle-refactor"},"schema_version":"ltb1021.codex_hub.git_closeout_manifest.v1","session_alias":"work-session","verify":["source/image 각72 tests PASS; SDK drop12->3 PASS; actual single Restart/cleanup PASS; source snapshot hash 및 Owner 링크/diff-check PASS"]}
