# post_pr150_runtime_wiring_audit · Sub-spec 3/5 · finish-task.sh callback runner 결선
- task: task-2685
- chair_authorization_id: CHAIR-AUTH-POST-PR150-RUNTIME-WIRING-AUDIT-20260526-JJONGS-AUDIT-001
- audit_mode: read-only
- audit_date: 2026-05-26 04:20 UTC
- main_repo_head: 2752182a (task-2661 Phase 2b · "callback normal fire delay → absolute timestamp" PR #148)
- file_target: `scripts/finish-task.sh` (origin/main · 1391 lines)

## 영역 3 결선 verdict

| Sub-check | Verdict | Evidence (origin/main scripts/finish-task.sh) |
|---|---|---|
| A. normal callback helper 항상 호출 | **PASS** | L1372-1380 — `python3 -m dispatch.normal_fallback_callback_helper launch --kind normal --task-id ... --executor-key ... --owner-key "$T2626_ANU_KEY" --chat-id "6937032012" --prompt "$T2626_ENVELOPE" --at "$T2661_NORMAL_ABSOLUTE_AT" --canonical-root "$WORKSPACE"` — 조건 0으로 항상 invoke |
| B. ANU key 강제 (c119085addb0f8b7) | **PASS** | L1361 — `T2626_ANU_KEY="c119085addb0f8b7"` · L1370 — `--owner-key "$T2626_ANU_KEY"` · L1362 — `export COKACDIR_KEY_ANU="${COKACDIR_KEY_ANU:-$T2626_ANU_KEY}"` |
| C. callback 등록 실패 시 PASS 처리 안 함 | **FAIL** | L1378-1380 — `... > callback-launch.json 2>/dev/null && echo "PASS" || echo "fail-closed/non-blocking"` ← ★ `\|\| echo` 패턴 exit code 항상 0. helper exit 2 (FAIL) 시도 .done 정상 생성. L1355 주석 "ADDITIVE · 완전 방어 · 비차단" — 의도적이나 audit requirement 위반. |
| D. envelope ≤3900 bytes 제한 | **PASS** | envelope 실측 ~275 bytes (TASK_ID=test, WORKSPACE=/home/jay/workspace) · helper `dispatch/normal_fallback_callback_helper.py:341` — `CALLBACK_PROMPT_MAX_BYTES = 3900` · `launch_callback()` L623-700 prompt size 초과 reject |
| E. normal callback absolute now+30s | **PASS** | L1363 — `T2661_NORMAL_ABSOLUTE_AT="$(date -d '+30 seconds' '+%Y-%m-%d %H:%M:%S')"` · L1376 — `--at "$T2661_NORMAL_ABSOLUTE_AT"` · L1357 주석 "cokacdir live runtime 은 --at "Ns" reject — 절대시각만 사용" · helper `build_absolute_at_for_normal_delay(30)` default fallback |
| F. fallback/dead-man 분리 | **PASS** | `git show origin/main:scripts/finish-task.sh | grep "fallback"` → 0건 (--kind fallback 미invoke). normal kind만 호출. helper module 내부에는 CALLBACK_KIND_NORMAL · CALLBACK_KIND_FALLBACK 분리 enum 존재. 혼합 위험 0. |

## 결함 list

| ID | Severity | Path · line | 설명 |
|---|---|---|---|
| D3.C | **MEDIUM-HIGH** | `scripts/finish-task.sh:1378-1380` | callback helper exit 2 (FAIL) → `\|\| echo`로 silent swallow. .done 정상 생성 + section 6 후속 알림 진행. 회장 verbatim 체크 C "callback 등록 실패 시 PASS 처리 안 함" 위반. fix: `\|\| echo` 제거 또는 `\|\| exit 1` 또는 trap. |
| D3.C-note | 설명 | 동 위치 L1355 주석 | "비차단" 설계 의도 명시. audit requirement와 design intent 충돌. chair 판정 필요. |

## 결선 reachability 매트릭스 (origin/main)

| 컴포넌트 | reachable? · note |
|---|---|
| `dispatch.normal_fallback_callback_helper:launch` | YES · L1372 unconditional |
| ANU key `c119085addb0f8b7` 주입 | YES · L1361/1370 hardcoded |
| absolute timestamp now+30s | YES · L1363 |
| envelope 3900 bytes guard | YES · helper L341 |
| fallback separation | YES · normal kind only |
| **fail-stop on callback FAIL** | **NO** · L1378 `\|\| echo` non-blocking |

## 종합 verdict

**PARTIAL (5/6 PASS · 1 FAIL on fail-stop)** — runner 결선 PASS · ANU key 강제 PASS · absolute timestamp PASS · envelope 한도 PASS · fallback 분리 PASS. ★ callback 등록 실패 silent swallow만 결함.

## 권고 (★ 별도 task + chair signature)

1. L1378-1380 `\|\| echo` 패턴 변경: `(...) && echo "PASS" \|\| { echo "FAIL"; exit 1; }` 또는 ANU 한정승인으로 의도 보존
2. fail-stop 채택 시 negative regression test 추가 (helper exit 2 → .done 미생성 검증)
3. 비차단 의도 보존 시 chair signature로 doctrine 박제 + audit checklist C 회장 verbatim 보정
