# task-2698+1 — PR #157 OWNER_AUTHORIZED_SINGLE_PUSH_EXCEPTION (2 test medium 한정 · 회장 B 승인 verbatim 2026-05-27)

- Level: Lv.2 (test/인프라 코드 품질 2건 · runtime production code 변경 0)
- 담당: **dev7 이참나** (★ PR #157 작성자 self-fix · resolver 재투입 아님 — 자기 PR Gemini medium 반영)
- chair_authorization: **회장 B 승인 verbatim 2026-05-27** — "PR #157에 한해 same-PR post-review push 1회를 예외 승인" (★ task-2698 chair_auth `CHAIR-AUTH-PR156-REPLACEMENT-RUNTIME-ONLY-FRESH-PR-20260527-JJONGS-IMPLEMENT-001` 연장 · 예외표지 `OWNER_AUTHORIZED_SINGLE_PUSH_EXCEPTION_FOR_2_TEST_MEDIUMS`)
- 완료 목표: **`TASK_2698_PR157_SINGLE_PUSH_EXCEPTION_APPROVED`** (★ not MERGE_READY / not RELEASE_READY / not MERGED)

## ★ 목표 (1줄)

PR #157 (branch `task/task-2698-dev7`, 현재 head `3a937f62`) 에 **Gemini medium 2건만** 수정하고 **same-PR push 1회**. 그 외 일체 변경 금지.

## ★ 허용 범위 (★ 회장 verbatim · 이 2건에만 한정)

1. **`tests/regression/callback_session_propagation/conftest.py` L39 계열** — `_LIVE_PREFIX = "/home/jay/workspace/"` 하드코딩 제거. 안전한 workspace root 산출로 대체 (예: worktree `_ROOT` 외부 경로 여부로 판별 / env 기반 / `Path` 동적 산출). ★ Gemini 권고: 특정 사용자 로컬 경로 하드코딩 금지 → 프로젝트 모듈이 worktree root 외부에 캐싱됐는지로 동적 판별. 기능 동등성 유지(CI clean checkout no-op 보장).
2. **`tests/regression/callback_session_propagation/test_envelope_schema_fields.py` L81 계열** — 함수명 `test_schema_no_additional_properties` 가 실제 동작(`additionalProperties: True` 허용 검증)과 모순. 실제 검증 목적에 맞게 함수명 rename (예: `test_schema_allows_additional_properties`) + docstring 정합.

## ★ 제한 조건 (★ 회장 verbatim 10)

1. **push 1회만** 허용 (PR #157 branch `task/task-2698-dev7`)
2. 수정 파일 = 위 2개 파일 **또는 해당 medium 해결에 직접 필요한 test 파일로만** 제한
3. **runtime production code 변경 금지** (dispatch/helper·prompt / schemas / finish-task.sh / utils 일체 미변경)
4. **artifact 추가 금지** (memory/·reports/·plans/·envelope/·marker/·log → PR head commit 0)
5. **PR #155 callback/enforce 블록 diff 0 유지** (helper.py EnforceResult/assert_normal_callback_actually_registered · finish-task NORMAL-CALLBACK-ENFORCE L1003~1041)
6. **PR #157 artifact 0 유지**
7. 수정 후 **new HEAD SHA lock** → CI 11/11 SUCCESS · Gemini fresh review on new HEAD · unresolved 0 · mergeStateStatus CLEAN 재확인 **전까지 MERGE_READY 표기 금지**
8. same-PR push 예외 사유 closeout 기록: **`OWNER_AUTHORIZED_SINGLE_PUSH_EXCEPTION_FOR_2_TEST_MEDIUMS`**
9. **1회 push 이후 Gemini 가 새 unresolved 생성 시 자동 추가 push 금지** → `OWNER_DECISION_REQUIRED` 로 ANU callback 재보고
10. **merge 는 별도 회장 승인 전까지 금지**

## ★ 작업 절차

1. 기존 branch `task/task-2698-dev7` checkout (origin 최신 fetch · head 3a937f62 확인)
2. 위 2 medium 수정 (test/인프라만)
3. regression 재실행: `python3 -m pytest tests/regression/callback_session_propagation/ -q` PASS 확인
4. PR #155 enforce diff 0 자가검증: `git diff origin/main..HEAD -- scripts/finish-task.sh dispatch/normal_fallback_callback_helper.py | grep -E "NORMAL-CALLBACK-ENFORCE|EnforceResult|assert_normal_callback"` → 0건 확인
5. artifact 0 자가검증: `git diff --name-only origin/main..HEAD | grep -E "^(memory/|reports/|plans/)|/anu_callback/|/envelope/"` → 0건
6. commit + **push 1회** (PR #157 branch)
7. **new HEAD SHA** 기록 → ANU callback (CI/Gemini 재확인은 ANU 수행)

## ★ 금지 (★ 회장 verbatim)

- 2 medium 외 파일 변경 / runtime production code 변경
- 2회 이상 push / amend 반복
- artifact/marker/log/report PR head commit
- PR #155 enforce 블록 훼손
- 1회 push 후 새 unresolved 자동 추가 수정 (→ OWNER_DECISION_REQUIRED 재보고)
- auto-merge / merge
- 추가 doctrine/packet/memory feedback md 생성

## ★ Spawn Verification Hard Gate

dispatch.py status:ok 단독 신뢰 0. fire+5분 4 신호: worktree(task/task-2698-dev7 재checkout) / state file / dev7 process or schedule_history running / task md sha256 일치. 1+ 실패 → `TASK_2698_PLUS1_SPAWN_VERIFICATION_FAILED` 즉시 HOLD_FOR_CHAIR.

## ★ callback (★ push 후)

- ANU key `c119085addb0f8b7` + `cokacdir --cron --session 53e89540-5bed-4692-a726-ed857820758a` 강제
- 4-source 검증 · envelope ≤3900 bytes · self-key 금지 (PR #155 enforce 차단)
- envelope 에 **new HEAD SHA · 2 medium 수정 내역 · regression 결과 · artifact 0 evidence · PR#155 diff 0 evidence** 포함
- ★ callback envelope 자체도 PR head commit 0

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "tests/regression/callback_session_propagation/conftest.py"
    - "tests/regression/callback_session_propagation/test_envelope_schema_fields.py"
    - "tests/regression/callback_session_propagation/** (★ 해당 medium 직접 해결에 필요한 test 파일만)"
  forbidden_paths:
    - "dispatch/** · schemas/** · scripts/finish-task.sh · utils/** (★ runtime production code 변경 금지)"
    - "memory/** · reports/** · plans/** · **/anu_callback/** · **/envelope/** (★ artifact 0)"
    - "settings.json · hooks/** · Axis/** · .github/** · dispatch.py · dispatch/__init__.py"
  commands:
    - "git fetch / checkout / diff / show / status / add / commit / push (★ PR #157 branch · push 1회만)"
    - "gh pr view / gh api (read)"
    - "python3 -m pytest (regression 재실행)"
  merge_policy: "no_merge_no_auto_chair_approval_required_single_push_exception"
  ttl_hours: 4
```

## ★ 보고 필드 (★ callback)

1. new HEAD SHA (push 후)
2. 2 medium 수정 내역 (conftest L39 / test_envelope L81)
3. regression PASS
4. artifact 0 evidence (git diff --name-only)
5. PR #155 enforce diff 0 evidence
6. push 횟수 (=1 확인)
7. 새 unresolved 발생 여부 (있으면 OWNER_DECISION_REQUIRED)
8. forbidden_action_count

## 종결

성공: **`TASK_2698_PR157_SINGLE_PUSH_EXCEPTION_APPROVED`** (★ not MERGE_READY · CI/Gemini new HEAD 재확인은 ANU/회장)

★ 회장 B 승인 verbatim 2026-05-27. same-PR push 1회 예외 (2 test medium 한정). 일반 same-PR push 허용 아님. merge 회장 결재.

끝

## goal_assertions (auto-generated)
- `python3 -m pytest tests/regression/callback_session_propagation/ -q`
