# 090 — WP22 인덱스 재동기화와 이관 판정

- unit: `devlog/_plan/260731_webai_poll_deadline/`
- work-phase: WP22 (문서 전용)
- 대상: `devlog/00_index.md`의 `_plan` 표, 그리고 두 #88 유닛의 `_fin` 이관 가능 여부

## 인덱스가 뒤처져 있었다

목표의 수용 기준 4번은 "`00_index.md`가 `_plan`/`_fin` 실제 상태와 1:1로 맞고,
종료된 유닛은 `_fin`으로 이관되어 있다"이다. 내 조사에서는 두 행이 달랐고,
감사가 두 곳을 더 찾았다.

| 행 | 적혀 있던 것 | 실제 |
| --- | --- | --- |
| 아티팩트·finalizer | "B25 구현은 미착수" | WP20이 구현 완료(`4f518f7`~`41f68c8`) |
| 폴링 데드라인 | "G1 unmet" | WP21이 데드라인 경로를 전환(`d2f442d`~`5d849f0`) |
| 폴링 데드라인 | "`021` fail-open 6건 전부 교정(B03/B06/B01/B02/B07/B04)" | **목록 자체가 틀렸다** |
| GPT-Pro remediation | "CONCERNS 5 / FAIL 2 미해소" | 일부 residual은 구현됨 |

세 번째가 오래된 오류다. `021`이 지목한 fail-open 여섯은
**B03·B06·B23·B24·B25·B36**이고(`021_stall_boundary_map.md`의 C5),
B01/B02/B07/B04는 자매 유닛이 넘긴 별개의 read 경계다. 게다가 B23은 아직
관측만이라 "전부"도 아니다. 내가 쓴 문장이 아니라 이전 갱신에서 들어온 것을
그대로 옮겨 적었다 — **드리프트를 고치러 와서 드리프트를 복사했다.**

같은 행의 "정체된 read가 `--timeout`을 넘기지 못한다"도 넓었다. `065`가
"`--timeout` 안에 반환이라고 뭉뚱그리지 않는다"고 명시해 뒀는데 그걸 무시한
표현이다. 보장은 **데드라인이 armed된 뒤의** poll/recovery async 정체에
한정된다. `requireChatGptPage`는 데드라인 생성보다 앞이라 race 밖이다.

네 번째는 커밋 날짜만 보고 판단한 대가다. `260627`은 마지막 커밋이 6월이지만,
R2가 요구한 DNS pin이 `tls-fetch.mjs`에, feed/candidate wiring이 `index.mjs`에
이미 있다. **디렉터리가 안 바뀌었다고 내용이 안 바뀐 것은 아니다.** 유닛은
여전히 미완료지만(잔여 tracker와 재검증 verdict가 없다) "전부 미해소"는 틀렸다.

나머지 네 행(`260621`, `260625`, `260705`, `strict-migration`)은 감사에서
저장소 내용과 일치함을 확인했다.

## 번호 충돌 하나

`060_wp15_stop_probe_verdict.md`와 `060_wp15_tick_deadline.md`가 같은 접두사를
쓰고 있었다. 후자는 제3자 커밋 `93f21f0`이 hard deadline 구현과 함께 들여온
파일이고, 그때 이미 있던 `060`과 부딪혔다.

`065_`로 옮겼다. 활성 참조는 없다(`rg`로 확인). 병렬 작업트리의 미커밋
`.codexclaw/ledger.jsonl`에 구 이름이 한 건 남아 있는데(커밋된 트리에는 없다),
그건 그 시점의 기록이므로 고치지 않는다 — 역사 ledger를 소급 수정하면 그때 무슨
일이 있었는지가 사라진다.

## `_fin` 이관은 하지 않는다

"종료된 유닛은 `_fin`으로"가 기준이므로 **종료 여부를 먼저 판정해야 한다.**
두 유닛 모두 아직 아니다.

### `260731_webai_poll_deadline`

`c7`이 열려 있다. 이 유닛이 스스로 적어둔 미해결 항목이 그대로 남아 있다.

- single-flight — 패배한 `evaluate`가 선형 누적된다(WP16에서 실측)
- G1 부분 — WP21이 데드라인 경로만 옮겼고 `insertSession`·`patchSession`·
  `pruneSessions`와 `readSessionStoreLocked`는 동기 그대로다
- G4 미측정
- G3 partial (WP13)

### `260731_webai_artifact_finalizer`

`c8`은 B25에 한해 닫혔지만 유닛 전체는 아니다. `000_plan.md`의 work-phase 표에
WP1~WP7(예산 계약)이 미착수로 남아 있고, B23은 관측만 된 상태다.

**닫히지 않은 유닛을 `_fin`으로 옮기면 기준 4를 형식적으로만 만족시키고 실제
상태를 감춘다.** `_fin`은 "완료된 closeout"을 뜻하므로, 열린 항목을 가진 유닛이
거기 있으면 다음 사람이 그 항목을 못 찾는다.

## 기준 4의 현재 상태

- `_plan` 디렉터리 7개 ↔ 인덱스 행 7개, 1:1로 맞는다 (감사에서 독립 확인)
- 각 행의 서술이 실제 커밋·소스와 일치한다 — 감사가 잡은 세 곳을 고친 뒤다
- 이관 대상은 없다 — 열린 유닛만 남아 있고, 그 판정 근거가 위에 있다

**"인덱스가 실제와 맞다"는 한 번 맞추고 끝나는 상태가 아니다.** 이번에도 감사
없이는 세 곳이 틀린 채로 남았을 것이고, 그중 하나는 내가 새로 만든 오류가 아니라
**복사해 온 오류**였다. 다음에 이 표를 고치는 사람은 행의 문장을 믿지 말고
`021`과 각 유닛의 `000_plan.md`를 직접 봐야 한다.

`_fin` 이관 자체는 두 유닛이 각자의 종료 조건을 만족한 뒤에 일어난다. 그때가
언제인지는 `c7`·`c8`과 각 `000_plan.md`의 DONE 조건이 정한다.
