---
task_id: task-2693
type: context
scope: task
created: 2026-05-26
updated: 2026-05-26
status: completed
---

# 맥락 노트: task-2693

**task**: task-2693

---

## 결정 근거

### 핵심 결정 1 — 본 task scope = PR #152 expected_files 내부 한정
- 근거: 회장 verbatim 2026-05-26 결정 2 ("callback lifecycle hardening은 PR #152 내부 범위만 포함")
- 외부 분리 4항목(durable registry / 전역 dispatch.py / settings.json / hooks live)은 별도 task로 분리
- 대안 기각: "lifecycle 통합 하드닝"으로 한꺼번에 처리 → scope expansion 금지 anchor에 위배

### 핵심 결정 2 — Thread 1+3 (HIGH) 수정 방식
- Gemini 제안: `is_valid_session_id` 검사 제거하여 invalid UUID도 chair_sid와 다르면 mismatch로 감지
- 채택: invalid UUID는 이미 정상 propagation에서 발생하지 않으므로, 명시되었으나 chair_sid와 다르면 mismatch로 통일 처리 → SESSION_PROPAGATION_DISCONTINUITY 분류 정확도 향상
- 영향 분석: `is_valid_session_id`를 mismatch 분기에서 빼도 chair_sid는 이미 검증된 정상값이므로 false positive 없음

### 핵심 결정 3 — Thread 4/5 isinstance 방어 채택
- 근거: callback envelope이 외부 텍스트(JSON parse 결과)에서 들어올 수 있어 타입 신뢰 불가
- isinstance 검사 추가 → AttributeError 방지 + None/int/bool 입력 시 안전 fallback

### 핵심 결정 4 — Thread 6 canonical_root const → pattern
- 근거: schema의 `"const": "/home/jay/workspace"` 하드코딩은 다른 환경(CI/타 개발자) 포팅 불가
- pattern `"^/.*$"`로 완화 (절대 경로 enforce, 특정 경로 unconstrain)

### 3 Step Why (Lv.3+ 자문)
- **1st Why** (왜 이 설계가 필요한가?): PR #152 unresolved 6 thread + envelope-only PASS 사고 재발 방지를 위해 callback owner enforcement 코드 + regression 필요
- **2nd Why** (왜 A가 최선의 접근인가?): envelope 텍스트는 작성자가 임의 위조 가능 → actual cron channel(--cron-history) + ANU key + 3 SID 일치 + chair-facing inbound 4-source 교차검증만이 합리적 신뢰 모델 (대안: 단일 evidence + 책임자 서명 → 회장 verbatim에서 "텍스트는 증거 아님" 이미 기각됨)
- **3rd Why** (왜 B가 다른 대안보다 나은가?): 4-source 중 하나라도 실패하면 fail-closed → bypass 8 패턴(envelope만 작성 / actual cron 미등록 / self-key 등록) 모두 detect 가능. 단일 source 검증은 위조 1회로 우회 가능
- A-B-C 논리 일관성: PASS — envelope-only ↛ actual cross-check ↛ 4-source fail-closed 의 점진적 강제

## 참조 자료

- PR #152: https://github.com/Jeon-Jonghyuk/dev_workspace/pull/152 (head e2570b7f, branch task/task-2686-dev8)
- Worktree: `/home/jay/workspace/.worktrees/task-2686-dev8`
- 회장 verbatim 박제: `memory/events/chair-verbatim-pr-152-unresolved-6-remediation-approved-260526.json`
- task md: `memory/tasks/task-2693.md`
- 회장 verbatim chair_authorization_id: `CHAIR-AUTH-PR152-CALLBACK-OWNER-ENFORCEMENT-UNRESOLVED6-20260526-JJONGS-IMPLEMENT-001`

## 주의사항

- **★ envelope 텍스트는 증거 아님**: callback PASS 선언 시 owner_key + inbound 2-source 의무
- **★ ANU key fail-closed**: cron 등록 시 actual owner_key = `c119085addb0f8b7` 강제
- **★ 8 우회 패턴 즉시 HOLD_FOR_CHAIR**: TASKCTL_BYPASS / retry reset / stash·unstash / lock 수동 / git_evidence 박제 / "표준 패턴" 봇 명명 / "회장 verbatim의 정신" 재해석 / envelope-only PASS
- **★ 금지 11 + forbidden_paths 절대 준수**: /home/jay/.claude, cokacdir 바이너리, .github, settings.json, hooks/, dispatch.py 전역, Axis, finish-task.sh, durable_registry, PR #154/151/149 파일 etc
- **★ envelope 3 SID 동일**: chair_facing / collector / delivery 모두 `53e89540-5bed-4692-a726-ed857820758a`
- **★ envelope ≤ 3900 bytes UTF-8**
