# task-2657 — AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_FULL_IMPLEMENTATION

- Level: Lv.4 (Axis 3 canary monitoring/judgment layer 신규 모듈 + 8 regression · runtime/PreToolUse/Axis 1/2 변경 0)
- 담당: dev6 페룬 (PreToolUse canonical 작성자 · Axis 1/2/3 흐름 이해)
- 보조 검증자: dev5 마르둑 (canary traffic 실행자 · 본 task 실행 아님 · 후속 검증 한정)
- base: origin/main 최신 + Axis 3 canary infra 보존 + canary session 3A287AE0 monitoring 진행 중 (real_t0 = 2026-05-24T19:51:35+09:00)
- 단일소스 spec: 본 task md + packet `memory/events/scale-aware-prevention-guard-packet-axis-3-260525.json`
- chair_authorization_id: **`CHAIR-AUTH-AXIS-3-SCALE-GUARD-20260525-JJONGS-IMPLEMENT-001`** (★ 회장 verbatim 1회성 발행 · ANU/봇 임의 생성 0)

## 배경

task-2656 SAFE_TRAFFIC_SAMPLE_RECORDED 회장 인정 + 정정 3건 박제 (window_label_drift_warn / forbidden probe safety / destructive BLOCK safety + spec deviation WARN). canary 운영 scale 확장 시 cron queue backlog 누적 → observer drift 구조적 발생 → false HOLD 가능. 본 task = monitoring/judgment layer scale-aware guard 풀 구현.

## 범위 (회장 verbatim)

monitoring/judgment layer 한정. PreToolUse hook 자체 / BLOCK 정책 / live settings.json / dispatch.py / Axis 1/2 runtime 변경 금지.

## 필수 구현 12 (회장 verbatim 1:1)

1. real_t0 기준 absolute duration 계산
2. raw_drift_m / queue_backlog_m / normalized_drift_m 산출
3. normalized_drift 기준 PASS/WARN/HOLD 판정 (≤5 PASS · 5<x≤30 WARN · >30 HOLD_FOR_CHAIR)
4. queue_backlog는 봇 self-report 금지 · cokacdir cron-history + schedule_history 2 source 교차로만 산출
5. P0~P4 priority 판정 (packet 참조)
6. P3 observer coalescing 구현 (skipped_window_count / covered_window_start / covered_window_end · max=3)
7. P0/P1 coalescing 금지 (rollback / Critical7 / hook_crash / Axis 1/2 interference / trigger fire window 절대 단독 fire)
8. skipped_window_count / covered_window_start / covered_window_end 기록 (audit jsonl)
9. real_t0+24h (=2026-05-25T19:51:35+09:00) 기준 wall-clock 완료 판정 (drift 영향 0)
10. RUNNING 5조건 AND gate 구현 (time / safety / traffic / coverage / chair_signature) · ANU 자동선언 0
11. probe spec lock guard 연동 (봇 자율 destructive 명령 선택 차단 · spec verbatim match 강제)
12. result JSON 생성 시 자동 검증 (필수 필드 누락 → SELF_CHECK_FAIL)

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

1. low task count · drift 3m → PASS
2. high task count · raw drift 35m · backlog 33m → normalized 2m PASS
3. raw drift 35m · backlog 0 → HOLD
4. 6개 observer 밀림 → coalesced catch-up observer PASS (skipped=6 시 max=3 위반 → 부분 적용 + 잔여 HOLD)
5. trigger 있는 window는 coalescing 금지 (해당 윈도 단독 fire 강제)
6. real_t0+24h 전 observer label "24h" 도달 → completion 금지 (wall-clock 기준)
7. destructive probe substitution → HOLD (probe spec lock guard 발동)
8. allowed probe exact match → PASS (verbatim match)

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

1. Axis 3 RUNNING 자동 선언
2. full rollout
3. HARNESS_ENFORCED 전체 선언
4. policy 승격
5. BLOCK 정책 확대
6. PreToolUse runtime policy 변경
7. Axis 1/2 runtime 변경
8. dispatch.py 변경
9. live settings.json 변경
10. commit/push/PR/merge
11. 봇 self-report만으로 queue_backlog 인정

## 완료 상태 (회장 verbatim)

- 성공: **`AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_IMPLEMENTED`**
- 실패: **`AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_HOLD_FOR_CHAIR`**

## 보고 필수 7 (회장 verbatim 1:1)

1. changed_files
2. guard 적용 위치
3. queue_backlog 산출 방식
4. coalescing 판정 방식
5. RUNNING 5조건 AND gate
6. regression 결과 (8 fixture 개별 PASS/FAIL)
7. forbidden_action_count (target 0)

## expected_files (~10)

- `utils/axis_3_canary_scale_aware_guard/__init__.py`
- `utils/axis_3_canary_scale_aware_guard/drift_calculator.py` (raw/queue_backlog/normalized · cron-history 2 source 교차)
- `utils/axis_3_canary_scale_aware_guard/priority_classifier.py` (P0~P4)
- `utils/axis_3_canary_scale_aware_guard/observer_coalescer.py` (P3 only · max 3 · forbidden conditions 4)
- `utils/axis_3_canary_scale_aware_guard/completion_gate.py` (wall-clock + RUNNING 5조건 AND)
- `utils/axis_3_canary_scale_aware_guard/probe_spec_lock.py` (verbatim match)
- `utils/axis_3_canary_scale_aware_guard/result_self_check.py`
- `tests/axis_3_canary_scale_aware_guard/test_regression_8.py` (8 fixture)
- `memory/system/.axis_3_canary_observer_coalesce_audit.jsonl` (신규 · 첫 write로 생성)
- `memory/system/.axis_3_canary_drift_judgment_audit.jsonl` (신규 · 첫 write로 생성)
- `memory/events/task-2657.done`
- `memory/events/task-2657.axis-3-canary-scale-aware-guard-result-260525.json` (13 mandatory fields + 7 보고 필드)
- `memory/reports/task-2657.md`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "utils/axis_3_canary_scale_aware_guard/**"
    - "tests/axis_3_canary_scale_aware_guard/**"
    - "memory/system/.axis_3_canary_observer_coalesce_audit.jsonl"
    - "memory/system/.axis_3_canary_drift_judgment_audit.jsonl"
    - "memory/system/.callback_ledger.jsonl"
    - "memory/system/.callback_dedupe_table.jsonl"
    - "memory/.callback_inbox/**"
    - "memory/tasks/task-2657.md"
    - "memory/reports/task-2657.md"
    - "memory/events/task-2657.done"
    - "memory/events/task-2657.axis-3-canary-scale-aware-guard-result-260525.json"
    - "memory/events/scale-aware-prevention-guard-packet-axis-3-260525.json"
    - "INDEX.md"
  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"
    - "scripts/finish-task.sh"
    - "utils/replacement_pr_runner.py"
    - "utils/**axis_1**"
    - "utils/**axis_2**"
    - "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*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "python3 -m py_compile"
    - "python3 -m json.tool"
    - "python3 -m pytest"
    - "ls"
    - "cat"
    - "stat"
    - "git status"
    - "git diff"
    - "git log"
    - "git checkout"
    - "git branch"
    - "git worktree"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --cron-list"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
  merge_policy: "axis_3_monitoring_judgment_layer_no_runtime_change"
  ttl_hours: 72
```

## frozen anchors

- ANCHOR-1: "monitoring/judgment layer 한정 · PreToolUse runtime 변경 0 · Axis 1/2 변경 0 · dispatch.py 변경 0 · live settings.json 변경 0"
- ANCHOR-2: "real_t0 (2026-05-24T19:51:35+09:00) 절대 박제 유지 · 24h 완료 = wall-clock real_t0+24h"
- ANCHOR-3: "normalized_drift = raw - queue_backlog · queue_backlog 봇 self-report 금지 · cokacdir cron-history + schedule_history 2 source 교차만"
- ANCHOR-4: "P0/P1 coalescing 절대 금지 · P3 only coalesceable · max skipped=3"
- ANCHOR-5: "RUNNING 5조건 AND gate (time/safety/traffic/coverage/chair_signature) · ANU 자동선언 0"
- ANCHOR-6: "probe spec lock = task md verbatim destructive command match · 봇 자율 substitution → HOLD"
- ANCHOR-7: "회장 본 세션 적용 0 · ANU collector 세션 적용 0 · commit/push/PR/merge 0"

## finalize 프로토콜

1. base = origin/main + Axis 3 canary infra 보존
2. 별도 worktree task-2657-dev6
3. dev6 페룬 봇 작업
4. 12 필수 구현 + 8 regression fixture all PASS
5. result marker (13 mandatory + 7 보고 필드) 박제
6. ANU normal callback cron (helper · ★ ANU key c119085addb0f8b7 강제 · self-key 금지 · UTF-8 ≤3900 bytes hard limit · envelope only)
7. .done 발행

## 회장 보고 형식 (verbatim)

성공: **`AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_IMPLEMENTED`**
실패: **`AXIS_3_CANARY_SCALE_AWARE_PREVENTION_GUARD_HOLD_FOR_CHAIR`**

끝
