# task-2611 — Track B: critical7_and_codex_high_classifier (결과 보고)

- **Track**: B (preflight SAFE_PARALLEL · DISJOINT · +N 아님 독립 task)
- **Executor**: dev2-team 오딘 (key `fedf78d1d09509f5`, 1회 한정)
- **Spec sha256 검증**: `0f5641f1…fdad51` 일치 확인 후 spec 그대로 수행
- **Preflight 정본**: `memory/events/task-2610-batch-hold-system-preflight-decision_260519.json`
- **상태**: ✅ 완료 · GO_READY · HOLD_FOR_CHAIR = false

## 1. 목표 (회장 verbatim)

병렬 작업 중 Codex HIGH/HOLD 가 발생해도 batch 전체 context 를 모아 Critical7
인지 non-critical remediation 인지 자동 분류한다.

## 2. 산출물 (§4 allowlist 정확히 — 외부 write 0)

1. `anu_v3/critical7_classifier.py` — 단건 Critical7 분류기. yaml ruleset 단일
   진실원. 7 family 누락 시 ValueError(약화 가드). CLI `--selftest`/`--input`.
2. `anu_v3/codex_high_classifier.py` — batch Codex HIGH/HOLD 분류기.
   critical7_classifier 재사용. 출력 = Track A `batch_hold_adjudicator` 입력
   (`anu.codex_high_classification.v1`). CLI `--selftest`/`--input`.
3. `config/critical7_rules.yaml` — Critical7 7 family ruleset
   (security·credential·permission·forbidden_path·scope_expansion·merge_write·
   owner_pat) + invariant-break 신호 + non-critical 계열 정의.
4. `config/codex_high_classification_rules.yaml` — 라우팅 룰
   (CHAIR_HOLD vs AUTO_REMEDIATION_HOLD) + remediation 계열 신호 + 출력 계약.
5. `memory/events/task-2611.decision.json`
6. `memory/events/task-2611.result.json`
7. `memory/reports/task-2611.md` (본 문서)

## 3. 분류 로직 (deterministic, 회장 §3/§5/§6)

우선순위:
1. **shared invariant 파손** → `CHAIR_HOLD` (Critical7 동급, 회장 §6)
2. **Critical7 매치** → `CHAIR_HOLD` (회장 보고)
3. **remediation 계열**(coverage / test_failure / claim_mismatch / lint) →
   `AUTO_REMEDIATION_HOLD` (회장 §3 자동수렴 · Track C planner 입력)
4. **HIGH unmatched** → `AUTO_REMEDIATION_HOLD` (회장 §3 자동수렴)

batch_verdict 규칙: Critical7/invariant 1건이라도 → `CHAIR_HOLD`; 아니고
HIGH/HOLD 존재 → `AUTO_REMEDIATION_HOLD`; 그 외 → `GO`.

## 4. Critical7 기준 약화 금지 (회장 §5) — 준수

- `_assert_ruleset_not_weakened()` 가 7 family 중 하나라도 누락 시 ValueError.
- Critical7 게이트는 1순위 독립 평가. 미매치 HIGH 를 AUTO_REMEDIATION 으로
  수렴시키는 것은 회장 §3 자동수렴이며 Critical7 기준 약화가 아니다.
- 짧고 모호한 토큰(`rce`/`xss`/`ssrf`/`sqli`/`xxe`/`csrf`)은 substring
  false-positive(`fo`**`rce`** → security 오분류)를 막기 위해 word-boundary
  regex 로만 매치하도록 이전. **coverage 동일 · 정밀도만 강화**(약화 아님).

## 5. 실 entrypoint + regression (문서-only 금지 충족)

- `critical7_classifier --selftest`: 12 cases, 0 failures, **PASS**, exit 0.
- `codex_high_classifier --selftest`: 9-finding batch + remed-only +
  low-only(GO) + invariant-break 서브배치, 0 failures, **PASS**, exit 0.
  - batch_verdict = `CHAIR_HOLD`; critical7_rules_hit =
    `[C7_CREDENTIAL, C7_MERGE_WRITE, C7_SCOPE_EXPANSION, C7_SECURITY]`.
- **mock-only FAIL 입증**: 상수(항상 CHAIR_HOLD) stub 분류기는 regression 의
  5개 non-critical 케이스에서 FAIL → 실 로직 필수임을 증명.
- 패키지/직접 스크립트 양쪽 호출 exit 0 (try/except 임포트 폴백).

## 6. shared invariant 보존

- git HEAD `20456b5f83fc039f2fd6f50f4b94095c29b41bfb` 전후 EQUAL,
  branch `task/task-2553p1-f1-clean-replacement` 불변.
- task-2553·task-2604 multitrack 산출물·frozen anchor **byte-0**
  (read-only consume only — 해당 산출물 write 0).
- §4 allowlist 외 write **0**. PR/merge/branch/main/credential write 0.
- callback owner = 독립 ANU key `c119085addb0f8b7`. executor self key
  `fedf78d1d09509f5` 의 callback/collector/adjudication/dispatch **미사용**
  (+49 정본). independent ANU collector only authoritative.
- fallback/dead-man/fixed-time 진행 트리거 미사용.

## 7. Track A 연동 계약

`codex_high_classifier` 출력 `anu.codex_high_classification.v1` 의
`batch_hold_adjudicator_input` 블록(`verdict`/`chair_hold`/
`auto_remediation_candidates`)이 `anu_v3/batch_hold_adjudicator.py`
(task-2610 Track A) consolidated adjudication 입력으로 직접 소비된다.

## 8. 결론

GO_READY · HOLD_FOR_CHAIR = false. shared invariant 무손상, Critical7 기준
무약화. 완료 직후 normal completion callback 을 **독립 ANU key
`c119085addb0f8b7`** 로만 발사 (executor self key 절대 금지).
