# task-2558 context notes

## PR #110 carry-over 박제

- merge_commit: `09f2f3d0e0054fd1f97f5503eb66c80a0c837223`
- original head: `324e5d03a401ca715c3fc2fa22a21cd0cad71cd2`
- follow-up: `cd594866a5b76fab3f7b8250af30b34d36486526`
- token_hash_prefix: `a9e05574` (5번째 활용)
- classification: `auto_gemini_triage.minor_in_expected_files` (회장 §명시 2026-05-12)
- fixture candidate: `memory/events/task-2550+1.minor-in-expected-files-fixture-candidate.json`
- 기존 schema: `memory/events/task-2550+1.gemini_triage_decision.json` `pr_110_auto_triage_decision` 필드

## 회장 §명시 핵심

1. classification = `minor_in_expected_files` (Critical 7 #6 아님)
2. allowed_action = `single_follow_up_commit_allowed`
3. max_follow_up_commits = 1 (hard cap)
4. follow-up commit 후 cascade fresh review 신규 finding → non-functional 이면 reply+resolve, real bug 면 escalate
5. owner_trigger_only / executor_scheduler 자동만 허용 (수동 `/gemini review` 절대 금지)
6. expected_files 외 수정 0, forbidden path 수정 0, PR #98~#110 branch 변경 0

## 코드 확장 portion

기존 `auto_gemini_triage.py` 559 line — task-2558 추가:
- 6 신규 상수 (CLASSIFICATION_*, ACTION_SINGLE_FOLLOW_UP_*, ACTION_REPLY_*, MAX_FOLLOW_UP_*, MINOR_FIX_NATURE_BUCKETS, CASCADE_NON_FUNCTIONAL_BUCKETS, OWNER_TRIGGER_*)
- 1 dataclass `MinorInExpectedFilesInput`
- 1 dataclass `CascadeFinding`
- 1 helper `_path_is_in_expected()`
- 4 functions: `classify_minor_in_expected_files()`, `build_gemini_triage_decision()`, `handle_cascade_finding()`, `owner_trigger_decision()`
- 1 상수 tuple `GEMINI_TRIAGE_DECISION_FIELDS` (17)

기존 4 분류 / classify_evidence / triage_batch / list_chat_audit 1:1 보존 (제거/이름 변경 0).

## test-2538 ACTIONS 가드 갱신 사유

기존 가드 `len(ACTIONS) == 4` 가 task-2558 §명시 확장과 충돌. v0 4 actions 보존 (제거/이름 변경 0) + 추가 entry 허용으로 가드 갱신 (`v0_actions.issubset(ACTIONS)`). doctrine 보존 + 확장 허용 1:1.

## one-way isolation 보장

- 추가 import 0 (기존 `re`, `dataclasses`, `datetime`, `typing` 만)
- utils/dispatch/scripts/dashboard 의존성 0
- token raw 0 (build_gemini_triage_decision 의 cascade_findings 도 _redact_tokens 통과)
