=== task-2463 라이브 차단 로그 #4: taskctl 미호출 main 진입 시도 → 차단 === timestamp: 2026-05-05T20:34:41+09:00 차단 레이어: scripts/safe_pr_merge.sh:14-19 (TASKCTL_INVOKED 검증) + scripts/finish-task.sh taskctl-verify-gate ## 실행 시나리오 #1: safe_pr_merge.sh를 TASKCTL_INVOKED 없이 호출 env -u TASKCTL_INVOKED MERGE_CALLER=test bash scripts/safe_pr_merge.sh 1 task-2463-mock-log4 merge ## stdout ## stderr [BLOCKED] safe_pr_merge.sh: TASKCTL_INVOKED 미설정 — taskctl 우회 시도 차단 (task-2463 P0-1) [HARD-GATE] taskctl not invoked — merge blocked ## exit code: 1 ## 실행 시나리오 #2: finish-task.sh taskctl verify gate (mock taskctl FAIL) 임시 mock으로 taskctl verify가 exit 1을 반환하는 환경에서 finish-task.sh의 verify gate만 실행. WORKSPACE= TASK_ID=mock bash -c "" ## stdout [INFO] taskctl verify task-2463-mock-log4 호출 (P0-1 게이트) [mock-taskctl] verify FAIL — taskctl bypass 시뮬레이션 ## stderr [HARD-GATE] taskctl verify FAIL — .merge-done blocked. .merge-failed 생성: /tmp/task-2463-events-log4/task-2463-mock-log4.merge-failed ## exit code: 1 ## .merge-failed 5필드 JSON { "task_id": "task-2463-mock-log4", "reason": "taskctl verify FAIL — main 진입 차단", "timestamp": "2026-05-05T20:34:41+09:00", "blocked_layer": "scripts/finish-task.sh:taskctl-verify-gate", "exit_code": 1 } ## 5필드 정리 (시나리오 #1: safe_pr_merge.sh) 1) 실행 명령어: env -u TASKCTL_INVOKED MERGE_CALLER=test bash scripts/safe_pr_merge.sh 1 task-2463-mock-log4 merge 2) stderr: [BLOCKED] safe_pr_merge.sh: TASKCTL_INVOKED 미설정 — taskctl 우회 시도 차단 (task-2463 P0-1) [HARD-GATE] taskctl not invoked — merge blocked 3) exit code: 1 4) 차단 레이어: scripts/safe_pr_merge.sh:14-19 (TASKCTL_INVOKED 검증) 5) timestamp: 2026-05-05T20:34:41+09:00 ## 5필드 정리 (시나리오 #2: finish-task.sh taskctl verify gate) 1) 실행 명령어: WORKSPACE= TASK_ID=mock bash -c "" 2) stderr: [HARD-GATE] taskctl verify FAIL — .merge-done blocked. .merge-failed 생성: /tmp/task-2463-events-log4/task-2463-mock-log4.merge-failed 3) exit code: 1 4) 차단 레이어: scripts/finish-task.sh:447-465 (taskctl-verify-gate, .merge-failed JSON.blocked_layer 참조) 5) timestamp: 2026-05-05T20:34:41+09:00 ## 종합 검증 PASS: 두 시나리오 모두 exit=1 + 명시적 차단 메시지 + 5필드 evidence 박제