{"commit":{"body":[{"label":"Why","text":"기존 Scenario 판정과 기본값을 상속하지 않고 합의된 방문 단위 계약으로 교체한다."},{"label":"What","text":"ROI와 Frame 시간 상태 머신, settings CAS, 동일 Frame Event 및 표시를 연결하고 legacy 엔진을 제거한다."},{"label":"Impact","text":"운영 서비스와 image는 변경하지 않았다. Event는 NOT_SUBMITTED이며 Artifact와 HTTP 접수는 후속이다."},{"label":"Verify","text":"관련60 test 실행 PASS, 기록된 동일 Frame 결과60개 재생에서 Event7개와 이미지 JSON3쌍 확인. 실제 SDK 서비스 검증은 미완료다."},{"label":"Rollback","text":"배포 변경 없음. source rollback은 해당 commit의 역변경을 별도 승인하여 수행한다."}],"title":"feat(intrusion): Frame 기반 침입 판정과 설정 및 시각 경로 구현"},"created_at":"2026-09-13T05:00:12+00:00","expires_at":"2026-09-14T05:00:12+00:00","job_id":"contextra-intrusion-20260913-135551","paths":[{"change":"modified","content_sha256":"a367b75da4346455b51fda9cbf07e7203a6eaf7bf571fef395a89a671c525049","path":"app/api/streams.py"},{"change":"modified","content_sha256":"88165d7d13e691e60975a50440ccdcb46671a0789b1fdcd483f91582b4cf859e","path":"app/contracts/visualization.py"},{"change":"modified","content_sha256":"e2437587984a64d5f2bbf9591f008601ae657fdab0dc201c7ba44379ebb881ec","path":"app/det_result_path.py"},{"change":"modified","content_sha256":"b92296d81838a1622193d32617be9c8c45ca4c0ae02aadbcf716674252a741d3","path":"app/inference_profiles.py"},{"change":"modified","content_sha256":"a396544e02596794bdce137c85fe27979a68eecbc5fc795cd3ce8fb0738ddccb","path":"app/metadata_render.py"},{"change":"modified","content_sha256":"f016eb927d4ff518f3ef8342119ce1a7ab0e46128a8d3fdc1bfdf9377b26e174","path":"app/multi_pipeline.py"},{"change":"modified","content_sha256":"d5b7b7a18d374b2f6f6059c71375a2427c1202131825d8cedc24fc8bfbfd0cb6","path":"app/scenarios/__init__.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/face_detection/__init__.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/face_detection/runtime.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/face_detection/scenario.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/fire_smoke/__init__.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/fire_smoke/runtime.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/fire_smoke/scenario.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/intrusion_engine/__init__.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/intrusion_engine/config.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/intrusion_engine/runtime.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/intrusion_engine/scenario.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/intrusion_engine/state.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/loitering_engine/__init__.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/loitering_engine/config.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/loitering_engine/runtime.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/loitering_engine/scenario.py"},{"change":"deleted","content_sha256":null,"path":"app/scenarios/loitering_engine/state.py"},{"change":"modified","content_sha256":"3116a155e5731fee24755a51647b8af27603d204720d52d62e12690e516ee4a6","path":"app/stream_manager.py"},{"change":"modified","content_sha256":"dee757c4ec53e7bf5d9e27c0c06beecd54c58f81003b8c8bcfbbc5f3a35c5a75","path":"app/stream_settings.py"},{"change":"modified","content_sha256":"bad544c5a91fa3067aa7dc14863281ad4d3146e3f419cafbb7ea0c3c7ac021db","path":"configs/scenario_config.py"},{"change":"modified","content_sha256":"57e3c7e8f8ab9cba0be35c1a692c1364536e3abf46e3a9c8cfb3f6340e6de777","path":"configs/system_config.yaml"},{"change":"modified","content_sha256":"d0ee26c382b1dd749a185667bfe479f3cd8bee88db0be9158964d11ae8c779ac","path":"docs/profiles/ltb1021/topics/runtime-lifecycle/README.ko.md"},{"change":"added","content_sha256":"589f0da4efbd8405f12249a680b622faa899b901d79b01792332daf9d5cd33ef","path":"app/intrusion.py"},{"change":"added","content_sha256":"a1a84b7d1de17e5c72b60c31ca4d49ababa15123fd2bd856c44f49ad7c047c77","path":"docs/profiles/ltb1021/topics/runtime-lifecycle/decision/20260913T135551+0900-decision-intrusion-frame-contract.md"},{"change":"added","content_sha256":"ba5f55e0b63a440c19cf0cd76458020f40a07bac4c7e24bd7ae93548c57c98be","path":"docs/profiles/ltb1021/topics/runtime-lifecycle/validation/20260913T135551+0900-validation-intrusion-source-replay.md"},{"change":"added","content_sha256":"07e329587422fa388076ceb60e05cf956f4e88d32c6596cf03281cbc9a388760","path":"tests/test_intrusion.py"},{"change":"added","content_sha256":"bd23a2a54331352c74dbeedae5f4df2b32258bf63cad9e4b6866d0335bf4844f","path":"tests/test_intrusion_connection.py"}],"plan_hash":"d95ff91840d73fe6914c6ca6b8ca5810943574afbe142140221f4250a36ffd73","profile":"ltb1021","push":{"branch":"task/runtime-lifecycle-refactor","mode":"upstream","remote":"origin","remote_identity":"sha256:3a9ce41319a2ebea","upstream_head":"7dafc23dbabe99b950635a4d8ce31b58622dc564","upstream_ref":"origin/task/runtime-lifecycle-refactor"},"repository":{"baseline_head":"7dafc23dbabe99b950635a4d8ce31b58622dc564","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":["python3 -m unittest discover -s tests -p test_intrusion.py -v: 9 PASS","network-none existing image verify.py: 60 test executions PASS; replay.py: 60 frames, 7 events, cleanup PASS","git diff --check: PASS; actual Analytics healthy, Stream stopped, task containers 0"]}
