# task-2661 — CALLBACK_NORMAL_FIRE_DELAY_REMEDIATION_PHASE_2B_ABSOLUTE_AT

- Level: Lv.4 (Phase 2b remediation · normal callback fire delay 절대시각 30s 이내 · fallback 변경 0 · PR 생성 허용 · auto-merge 0)
- 담당: dev5 마르둑 (회장 verbatim executor 지정 · dev1 사고 발견자 / dev6 audit 대상 모두 제외)
- base: origin/main 최신 (HEAD `d4098b04 task-2642`) + task-2660 commit `c6425611` (worktree task-2660-dev1 보존)
- 단일소스 spec: 본 task md + audit packet `memory/events/callback-fire-at-delay-audit-packet-260525.json` + sago marker `memory/events/task-2660.hold-for-chair-plus-cokacdir-10s-reject-incident-260525.json`
- chair_authorization_id: **`CHAIR-AUTH-CALLBACK-DELAY-P2B-20260525-JJONGS-ABSOLUTE-AT-001`** (★ 회장 verbatim 1회성 발행 · 임의 생성 0)

## 배경

task-2660 (dev1 헤르메스) 작업 결과 `--at "10s"` 가 cokacdir live runtime 에서 reject. docstring `(10s)` 라인 거짓 확인. commit `c6425611` 보존 / HOLD_FOR_CHAIR 유지. Phase 2b = 절대시각 사용으로 30s 이내 fire 달성.

## 회장 verbatim 정정 확정 (1:1)

- normal callback delay 10분→30초 이내 방향 = 정확
- 실패 원인 = 정책 방향 아님 · **구현 방식** (cokacdir `--at "10s"` reject)
- 상대시간 전체가 안 되는 것 아님 · **초 단위(s)만 live runtime reject**
- `10m / 4h / 절대시각` 정상 동작 (★ 기존 사용 이력)

## 다른 AI 피드백 채택/비채택 (회장 verbatim 박제)

**채택:**
- API Overloaded 부하 분석 참고 (★ 장시간 단일 세션 / 과도한 turn / 과도한 output token = 별도 최적화 후보 박제)

**비채택:**
- `--in 10s` / `--delay 10s` 옵션 = cokacdir 증거 없음 (★ 환각 가능성)
- `--at` 절대시각만 받는다는 주장 = 부정확
- `/D9C7384C` 재개 권장 = 검증 전 운영 지시 채택 X

## 목표 (회장 verbatim)

normal callback fire delay 30초 이내 + cokacdir `--at "10s"` 금지 + **절대시각 사용**.

## smoking gun 위치 + 정정 방향

```
scripts/finish-task.sh:1369
  현재 (task-2660 c6425611 적용 후): --at "10s"  (★ cokacdir reject)
  목표: --at "$(date -d '+30 seconds' '+%Y-%m-%d %H:%M:%S')"
        또는 Python helper로 절대시각 생성 (now + 30s)

dispatch/normal_fallback_callback_helper.py
  현재 (task-2660 c6425611 적용 후): DEFAULT_AT_NORMAL = "10s"  (★ reject)
  목표: DEFAULT_AT_NORMAL_DELAY_SECONDS = 30
        + helper 내부에서 절대시각 변환 함수 (now + delay_seconds → "YYYY-MM-DD HH:MM:SS")

utils/anu_callback_registrar.py docstring (line 250-264)
  현재: "cokacdir accepts ... second granularity (10s)"
  목표: "cokacdir live runtime accepts minute/hour/day suffixes (10m/4h/1d) AND absolute timestamp
         (YYYY-MM-DD HH:MM:SS). Second suffix (10s) is UNSUPPORTED in live runtime; use absolute
         timestamp for sub-minute delays."
```

## 허용 7 (회장 verbatim 1:1)

1. task-2660 commit `c6425611` 참고 또는 rebase material 로 사용
2. `scripts/finish-task.sh` normal callback 경로에서 `--at` 값을 **절대시각으로 생성** (예: now + 30초를 `YYYY-MM-DD HH:MM:SS` 형식)
3. `dispatch/normal_fallback_callback_helper.py` 의 docstring 과 live runtime 제약 정정
4. normal callback 과 fallback/dead-man 역할 분리 라벨 유지
5. regression 추가/수정
6. result/report/done marker 작성
7. PR 생성까지 허용

## 금지 12 (회장 verbatim 1:1)

1. fallback/dead-man delay 변경
2. fallback launcher 구조 변경
3. threshold enforce Phase 4 구현
4. dispatch.py 변경
5. live settings.json 변경
6. Axis 1/2/3 runtime 변경
7. PR #147 merge
8. auto-merge
9. policy 승격
10. HARNESS_ENFORCED 전체 선언
11. **`--at "10s"` 재사용**
12. **`--in` / `--delay` 옵션 사용**

## 필수 regression 8 (회장 verbatim 1:1)

1. normal callback uses absolute `--at` timestamp ≤ 30s from done time
2. `--at "10s"` is not used anywhere in production path
3. fallback/dead-man delay remains unchanged
4. delay > 60s normal callback requires reason or reclassification
5. task-2659 timing fixture prevents 14:10 → 14:25 normal callback delay recurrence
6. callback envelope byte limit 유지 (UTF-8 ≤ 3900)
7. docstring reflects live runtime: second suffix unsupported · absolute timestamp supported
8. API overloaded is logged separately and does not mask scheduler format failure

## 성공 조건 7 (회장 verbatim 1:1)

1. normal callback schedule target ≤ 30s from done time
2. cokacdir accepted format uses absolute timestamp
3. fallback/dead-man behavior unchanged
4. regression PASS (8/8)
5. forbidden_action_count = 0
6. PR 생성 완료
7. auto-merge 0

## 완료 상태 (회장 verbatim)

- 성공: **`CALLBACK_NORMAL_FIRE_DELAY_REMEDIATION_P2B_PR_READY`**
- 실패: **`CALLBACK_NORMAL_FIRE_DELAY_REMEDIATION_P2B_HOLD_FOR_CHAIR`**

## 보고 필수 8

1. PR 번호
2. changed_files
3. normal delay before/after (★ absolute timestamp 형식 명시)
4. fallback 영향 여부
5. regression 결과 (8/8 개별)
6. forbidden_action_count
7. auto-merge 0 확인
8. cokacdir `--at` absolute timestamp 동작 검증 (★ 실 cokacdir runtime 호환성 확인)

## expected_files (~7)

- `scripts/finish-task.sh` (★ line 1369 절대시각 생성으로 정정)
- `dispatch/normal_fallback_callback_helper.py` (★ DEFAULT_AT_NORMAL 절대시각 변환 함수 추가 · fallback default 변경 0)
- `utils/anu_callback_registrar.py` (★ docstring 정정만 · 함수 시그니처 변경 0)
- `tests/callback_fire_delay_remediation_p2b/test_regression_8.py` (★ 신규 8 fixture)
- `memory/events/task-2661.done`
- `memory/events/task-2661.callback-normal-fire-delay-remediation-p2b-result-260525.json`
- `memory/reports/task-2661.md`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "scripts/finish-task.sh"
    - "dispatch/normal_fallback_callback_helper.py"
    - "utils/anu_callback_registrar.py"
    - "tests/callback_fire_delay_remediation_p2b/**"
    - "memory/system/.callback_ledger.jsonl"
    - "memory/.callback_inbox/**"
    - "memory/tasks/task-2661.md"
    - "memory/reports/task-2661.md"
    - "memory/events/task-2661.done"
    - "memory/events/task-2661.callback-normal-fire-delay-remediation-p2b-result-260525.json"
    - "memory/events/callback-fire-at-delay-audit-packet-260525.json"
    - "memory/events/task-2660.hold-for-chair-plus-cokacdir-10s-reject-incident-260525.json"
    - "INDEX.md"
  read_only_reference:
    - "utils/anu_callback_fallback.py (★ fallback module · 변경 0)"
    - "utils/completion_callback_fallback_cancel.py (★ cancel-on-success · 변경 0)"
    - "prompts/DIRECT-WORKFLOW.md (★ 538-547 · 변경 0)"
    - "/home/jay/workspace/.worktrees/task-2660-dev1 (★ c6425611 참고 또는 rebase material)"
  forbidden_paths:
    - "/home/jay/.claude/settings.json"
    - "/home/jay/.claude/settings.local.json"
    - "/home/jay/.claude/hooks/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "schemas/**"
    - "hooks/**"
    - "dispatch.py"
    - "dispatch/__init__.py"
    - "utils/replacement_pr_runner.py"
    - "utils/anu_callback_fallback.py"
    - "utils/completion_callback_fallback_cancel.py"
    - "utils/**axis_1**"
    - "utils/**axis_2**"
    - "utils/axis_3_canary_scale_aware_guard/**"
    - "utils/anu_spawn_visibility_guard/**"
    - "memory/tasks/task-2641*"
    - "memory/tasks/task-2642*"
    - "memory/tasks/task-2643*"
    - "memory/tasks/task-2644*"
    - "memory/tasks/task-2645*"
    - "memory/tasks/task-2646*"
    - "memory/tasks/task-2647*"
    - "memory/tasks/task-2648*"
    - "memory/tasks/task-2649*"
    - "memory/tasks/task-2650*"
    - "memory/tasks/task-2651*"
    - "memory/tasks/task-2652*"
    - "memory/tasks/task-2653*"
    - "memory/tasks/task-2654*"
    - "memory/tasks/task-2655*"
    - "memory/tasks/task-2656*"
    - "memory/tasks/task-2657*"
    - "memory/tasks/task-2658*"
    - "memory/tasks/task-2659*"
    - "memory/tasks/task-2660*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "python3 -m py_compile"
    - "python3 -m json.tool"
    - "python3 -m pytest"
    - "python3 -c"
    - "ls"
    - "cat"
    - "stat"
    - "date"
    - "git status"
    - "git diff"
    - "git log"
    - "git checkout"
    - "git branch"
    - "git add"
    - "git commit"
    - "git push"
    - "git worktree"
    - "git cherry-pick"
    - "git rebase"
    - "gh pr create"
    - "gh pr view"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --cron-list"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
  merge_policy: "phase_2b_normal_callback_absolute_at_pr_only_no_auto_merge"
  ttl_hours: 72
```

## frozen anchors

- ANCHOR-1: "Phase 2b only · 절대시각 사용 · `--at \"10s\"` 재사용 금지 · `--in`/`--delay` 옵션 사용 금지 · fallback default `10m` 변경 0"
- ANCHOR-2: "scripts/finish-task.sh:1369 절대시각 생성 (now + 30초 이내) · `date -d` 또는 Python helper"
- ANCHOR-3: "dispatch/normal_fallback_callback_helper.py: DEFAULT_AT_NORMAL_DELAY_SECONDS=30 + 절대시각 변환 helper · fallback default 변경 0"
- ANCHOR-4: "utils/anu_callback_registrar.py docstring 정정: second suffix UNSUPPORTED in live runtime · absolute timestamp supported · 함수 시그니처 변경 0"
- ANCHOR-5: "API overloaded 별도 logging · scheduler format failure 와 분리 (★ task-2660 stop_sequence=정상 / Overloaded=별도)"
- ANCHOR-6: "auto-merge 0 · PR #147 merge 0 · 본 task PR merge 회장 verbatim 별도 강제"
- ANCHOR-7: "observer chain 영향 0 · Axis 1/2/3 runtime · dispatch.py · live settings.json · live cokacdir 변경 0"
- ANCHOR-8: "BOT App token 부재 시 (ghs_ 없음 / OWNER PAT만) push/PR 불가 → P2B_HOLD_FOR_CHAIR + 회장 결정 대기"
- ANCHOR-9: "task-2660 commit `c6425611` 보존 · Phase 2b 에서 rebase 또는 cherry-pick 활용 가능 · 회장 verbatim 보존 anchor"

## finalize 프로토콜

1. base = origin/main 최신 fetch · HEAD `d4098b04 task-2642`
2. 별도 worktree task-2661-dev5
3. dev5 마르둑 봇 작업
4. task-2660 commit `c6425611` 의 `--at "10s"` 부분만 절대시각 생성으로 정정 (★ rebase 또는 신규 commit)
5. `scripts/finish-task.sh:1369` 절대시각 생성으로 정정
6. `dispatch/normal_fallback_callback_helper.py` DEFAULT_AT_NORMAL 절대시각 변환 helper 추가 (fallback default 변경 0)
7. `utils/anu_callback_registrar.py` docstring 정정 (★ 함수 시그니처 변경 0)
8. role/kind/source_attribution 라벨 유지 (★ Phase 3 구조 변경 금지)
9. tests/callback_fire_delay_remediation_p2b/test_regression_8.py 신규 + 8 fixture all PASS
10. **cokacdir runtime 호환성 실 검증** (★ 실 `--at "YYYY-MM-DD HH:MM:SS"` 등록 시도 dry-run · 봇 dispatch 영향 0)
11. commit (Phase 2b PR 범위) + push
12. gh pr create (★ auto-merge label 절대 금지)
13. result marker + report + .done 발행
14. ANU normal callback cron (helper · ★ ANU key `c119085addb0f8b7` 강제 · self-key 등록 금지 · UTF-8 ≤3900 bytes · envelope only)

## 회장 보고 형식 (verbatim)

성공: **`CALLBACK_NORMAL_FIRE_DELAY_REMEDIATION_P2B_PR_READY`**
실패: **`CALLBACK_NORMAL_FIRE_DELAY_REMEDIATION_P2B_HOLD_FOR_CHAIR`**

끝
