# Multi-Session Close Protocol — 같은 하네스에서 둘 이상이 돌 때의 마감

> **왜 여기 있나.** 이 프로토콜은 2026-08-09 까지 **세션 카드에만** 있었다. 카드는 gitignored 이고
> **세대마다 통째로 덮인다** — 그날 실제로 이월 8건이 그렇게 사라졌고, 하필 그중 하나가
> *"⑤-c 발화 착지 검증"*(카드가 내용 착지를 안 본다는 걸 고치려던 항목)이었다. 규율을 담은 곳이
> 규율이 막으려던 방식으로 유실됐다. **그래서 tracked 로 옮겼다.** 이건 승격이 아니라 이사다.
>
> **범위**: FH 자신의 다축 마감. `templates/` 로 전파하지 않는다 — 필드 하네스는 대개 단일
> 세션이라 아직 필요가 없고, 전파는 그쪽에서 병렬이 실제로 돌기 시작할 때다.

## 0. 전제 — 두 가지 형상을 구분한다

```
거버너 + 위임      한 세션이 카드를 쥐고 나머지는 그 세션이 띄운 에이전트
                   → 카드 소유가 명확하고 last-writer 경쟁이 없다. **기본형**
대등 peer          독립 세션 둘 이상이 각자 마감한다
                   → 아래 전부가 필요해진다. **다른 레포일 때만 권장**
```
2026-08-09 의 2축이 안전했던 이유는 모델이 좋아서가 아니라 **두 축이 다른 레포**였기 때문이다
(`forge-harness` / `qasp-dev`). 같은 워킹트리를 공유하는 대등 peer 는
`[[feedback_shared_checkout_ops_touch_others_work]]` 를 정면으로 부른다.

## 1. 순서 — 질문이 재대조보다 **앞이고 더 넓다**

```
① peer 가 자기 델타를 append          (자기 소유 파일에만. 아래 §4)
② 핑
③ ★ 접기 전에 「지금부터 마감이다, 더 있나」를 **묻는다**
④ 접는다 (⑤ 원자 실행: 로그 → 카드)
⑤ `gh pr list --merged` 재대조
```

**③이 ⑤로 대체되지 않는다.** 재대조는 *내가 아는 축*만 훑고, 질문은 *상대가 아는 축*을 가져온다.
2026-08-09 실측: 그 질문이 델타 8건을 꺼냈고 **PR 이 없어 `gh pr list` 로 구조적으로 안 잡히는
것들**이 다수였다(스펙/설계만 바뀐 것 · PR 이전 브랜치 커밋 · 외부 승인 대기 · 이월 누락).

## 1-b. 머지 직전 — no-op 확인 (pmh Axis 0 답습분 · 산문 — CLAUDE.md 마감체인 ①-b 에 붙는다)

self-mergeable PR 을 실제로 머지하기 **직전**(⑤ 카드 쓰기 이전 단계다), 반입할 내용이 실재하는지
**트리 비교**로 확인한다:

```
[ "$(git merge-tree --write-tree <base> <head>)" = "$(git rev-parse '<base>^{tree}')" ] && echo NO-OP
```

**NO-OP(트리 동일)면 머지하지 않는다** — 같은 내용이 이미 들어가 있다. merge-tree 의 충돌 종료는
«판정 불가»가 아니라 «델타 있음»이고, **ref 해석 불가만 판정 불가**다(not-found ≠ 0).
`--write-tree` 는 git ≥ 2.38. ⚠️ `git diff --stat <base>..<head>` 도 `<base>...<head>` 도 쓰지
마라 — «내용이 이미 다른 경로로 착지 + base 전진»인 바로 그 no-op 시나리오에서 **둘 다 비어 있지
않다** (2026-08-10 known-pair 실측: no-op 쌍=트리 일치 / 실델타 쌍=불일치로 가른 것은 merge-tree
형태뿐이었다). PR 의 열림/닫힘 · 커밋 수 · SHA · `@{u}` 거리는 전부 내용의 지표가 아니다.

기원: pmh 실측 3회 — ref 상태를 내용 상태로 오독, REST push/미러 경로에서 no-op 이중 머지 직전까지
감 (기록: `pmh-dev/scripts/merge_noop_check.sh` 헤더 — #61 vs #60, 트리 a170a8e5). FH 표면 실측 =
main 최근 200커밋 중 no-op 1건 (2026-08-09 측정, d2c7f55). **기계화 임계는 두 트리거다**
(`operations.md`: N≥3 **또는 같은 클래스의 타표면 재발**): (i) FH 표면 N=1 < 3 · (ii) 타표면
재발 — pmh→FH 는 아직 FH 재현 0. **FH 재현 1회 시 즉시 기계화** — pmh `merge_noop_check.sh` 를
가져오면 된다(exit 계약까지 이미 있다).

## 2. 네 가지를 각각 못 믿는다

### 2-a. 보냈다 ≠ 닿았다
크로스세션 메시지는 **수신자 사용자 승인 대기로 보류**될 수 있고, 그래도 발신 호출은 성공을
반환한다. 같은 날 카드는 이미 「5곳 전부 통지」라고 적고 있었다.

⚠️ **만료 통지는 계기끼리 어긋났다 — 한쪽으로 단정하지 않는다.** 보류 2건 중 하나에 대해
「승인 없이 만료 — 전달되지 않음」 통지가 왔는데, **운영자 확인으로는 도달해 있었다.**
어느 쪽이 맞는지 이 세션은 못 가른다. 그러니 **«만료 = 영구 미도달» 로 적지 마라**(초안이 그렇게
적었다가 반증됐다). 확실한 것은 하나뿐이다 — **발신 성공은 도달의 증거가 아니고, 통지도 아니다.**
도달을 확인하는 유일한 방법은 **답이 오는 것**이다.
→ **보낸 수가 아니라 답 온 수를 적고, 미회신 수를 카드에 명시한다.** 기계화 불가(스크립트는 회신을
못 본다) — `session_close_check.sh` ①-c 가 이 문장을 살리언스로 띄운다.

**외부 1차 근거 (2026-08-10, 벤더 문서 — code.claude.com/docs/en/cross-session-messaging)**:
크로스세션 배달은 **3값**이다 — `Delivered` / `Held`(수신자 승인 대기 — 기본 다이얼로그 경로는
`dialogExpiry` 초과 시 폐기되지만 **나중에 accept 가 적용되면 보류분이 릴리스**되고, `-p` 세션에선
계속 보류된다) / `Refused`. **도착 시 Refused 만 구조적 무음**이다(송신 측 통지 없음). 나머지
결과-통지 채널은 존재하되, 위 실측에서 관측과 어긋난 적이 있으므로 **신뢰층이 아니다 — 그래서
회신 수를 센다.** 벤더 문서는 명세지 관측이 아니다 — 위 «단정하지 마라»가 여전히 우선한다.
(Held-릴리스 경로는 08-09 의 «만료 통지 vs 실제 도달» 불일치를 설명할 수 있는 후보다.)

### 2-a-2. 탐지는 넓게, **통지는 좁게** — 둘을 같은 목록으로 쓰지 마라
2026-08-09 의 오발신은 탐지가 넓어서가 아니라 **탐지 목록을 그대로 수신자 목록으로 썼기** 때문이다
(원래 알려야 할 상대는 1곳이었다). 두 목록은 목적이 다르다:
```
탐지  넓게  — 살아있는 것 전부. 여분이 «마감 미완» 이라는 신호다 (§2-b)
통지  좁게  — **지금 돌아가는(working/busy) 세션에만.** 끝난 세션에 보내는 건 소음이고,
              수신자 승인을 태우며, 상대 기록에 남지도 않는다
```
**운영자 지시(2026-08-09)**: 「지금 돌아가는 동일 하네스 세션에만 보내라」.

### 2-b. 살아있다 ≠ 일하는 중이다 · 그리고 그 여분이 신호다
소켓이 살아있으면 **프로세스**가 살아있는 것이지 세션이 활성인 게 아니다. **판별 기준을 정확히
적는다**: 소켓 파일명의 PID 에 프로세스가 살아있고 그 cwd 가 이 하네스면 잡힌다 — 그게 전부다.

그래서 **세 가지가 섞여 들어오고, 통지가 필요한 건 첫째뿐이다**(2026-08-09 실측):
```
working 세션      → 접기 전에 물어라
놀고 있는 터미널   → 진짜 세션이지만 프롬프트에서 대기 중. 보통 건너뛴다
남은 프로세스     → 마감이 안 끝난 것 (1회 관측, 손으로 죽여야 했다)
예열 워커(bg-spare) → **세션이 아예 아니다.** args 로 기계 제외 — 안 걸러내면 순수 오탐
```
⚠️ **초판은 여분 전체를 «마감 미완» 이라고 적었다. 한 사례에서 과일반화한 것이고 틀렸다** —
실제 다수는 예열 워커와 놀고 있는 터미널이었다. **셋을 가르는 건 fleet 뷰뿐이고, 이 스캔은 못 한다.**
⚠️ **job 상태파일로 좁히지 마라 — 반대로 틀린다.** 같은 날 실측: 상태파일이 **돌고 있는 세션을
`done` + `firstTerminalAt` 로 표시**했다. 소켓이 넓은 만큼 상태파일은 좁다. **교차 판독.**

### 2-c. 닫혔다 ≠ 안 열렸다
「한 번도 안 닫힘」과 「닫고 또 일함」은 **밖에서 동일하게 Completed** 로 보이는데 처방이 반대다
(전자는 마저 닫기, 후자는 다시 접기). `session_close_check.sh` ①-d 가 마감 게이트 통과를 세서
2회 이상이면 알린다. **자기신고다** — 패턴을 감지하지 증명하지 않는다.

### 2-d. **내 계정이다 ≠ 내 것이다** — 그리고 목록의 «상태»도 못 믿는다

병렬 세션은 대개 **같은 GitHub 계정**으로 돈다. 그러면 `gh pr list --author @me` 가 **모든
세션의 PR 을 「내 PR」로** 보여준다. 이건 필터가 고장난 게 아니라 **그 필터가 세션을 모르는
것**이고, 마감할 때 두 가지를 동시에 망친다:

```
귀속 오독   남의 PR 을 내 처분 대상으로 카드에 싣는다 (또는 그 반대로 남에게 떠넘긴다)
상태 오독   목록이 내 것이라고 믿는 순간 그 목록의 state 도 확인 없이 받아 적는다
```

**2026-08-18 실측, 3축 마감에서 세 세션이 각각 한 번씩 틀렸다:**

| 세션 | 무엇을 | 어떻게 틀렸나 |
|---|---|---|
| A | PR 소유권 | 계정 목록을 근거로 「peer 소관」이라 적었는데 한 건은 자기 것이었다 |
| B | PR 소유권 | **브랜치명 ↔ peer 발화 내용을 매칭해서 추론.** 라벨이 소유권 증거가 아니다 |
| C | PR **상태** | 계정 목록을 근거로 「#442·#443 머지됨」이라 보고 — **실측 둘 다 OPEN** |

🟥 **B 의 오류가 가장 교훈적이다**: 그 세션은 *"계정으로는 못 가르니 브랜치명으로 귀속해라"*
라고 **쓴 바로 그 메시지 안에서** 추론으로 귀속했다. 규칙을 적는 행위가 지켰다는 감각을
만든다([[feedback_citing_a_rule_is_not_obeying_it]]).

**규율**
1. **소유권의 유일한 확정자는 «본인 확인»이다.** 살아있는 peer 에게 물어라(§1 의 질문에
   *"이 PR 들 중 네 것이 뭐냐"* 를 포함시킨다). 브랜치명·커밋 시각·작업 내용 매칭은 **후보를
   좁힐 뿐** 확정하지 못한다.
2. **peer 가 죽었거나 회신이 없으면 «미상»으로 적는다.** 추론해서 이름을 붙이지 마라 —
   틀린 귀속은 카드에서 다음 세대로 그대로 승계된다(§3).
3. **상태는 목록이 아니라 대상에서 읽는다.** `gh pr view <n> --json state` 를 **번호마다**
   돌려라. 목록의 state 는 캐시·필터 조합에 따라 어긋날 수 있고, 무엇보다 **내 것이라고 믿는
   순간 검증을 건너뛰게 된다.**
4. 카드에는 **판별 근거를 같이 적는다** — `#442 f9(본인확인) OPEN(gh pr view)`. 근거 없는
   귀속은 다음 세션이 재검증할 방법이 없다.

### 2-d-2. 🟥 **작업 중인 세션은 커밋 전까지 무방비다** — 그리고 위 규율이 그걸 못 막는다

§2-d 와 「스위치 직전 `git branch --show-current`」 류의 규율은 전부 **«내가 남을 밟는 것»** 을
막는다. **«내가 밟히는 것»** 은 못 막는다 — 내가 규율을 완벽히 지켜도, 내가 편집하는 동안 남이
체크아웃을 옮기면 내 미커밋은 그 사람의 `stash` 로 딸려가거나 `reset` 에 날아간다.

**2026-08-18 실측, 하루 3회** — 세 세션이 돌아가며 한 번씩 밟았다(A→B · ?→A · B→C). 마지막
사례에서 C 는 **자기 규율을 다 지킨 상태였다**: 브랜치를 잡고, 자른 직후 `git log main..HEAD`
로 0줄을 확인하고, `branch_claim.sh claim` 까지 갱신했다. 그리고도 밟혔다.
⇒ **구조가 원인의 절반이다.** 브랜치 이동은 공유 트리에서 구조적으로 나지만, **`stash -u`
는 타이핑한 명령**이다. 그래서 「누가 조심했나」로 전부 갈리지도 않고, 전부 안 갈리지도 않는다 —
**구조가 노출 구간을 만들고, 넓은 명령이 그 구간을 실제 사고로 바꾼다.** 아래 3번이 그 명령이다.

**규율 — 노출 시간을 줄이는 쪽으로만 갈린다**
1. **편집을 시작하기 전에** 브랜치를 잡아라. 편집 후에 잡으면 그 사이가 통째로 노출 구간이다.
2. **자를 수 있는 단위로 자주 커밋해라.** 파일 여러 개를 다 고치고 한 번에 커밋하려는 습관이
   노출 시간을 배로 만든다(위 C 가 그랬다 — 두 파일을 다 고치고 한 번에 가려다 둘 다 잃었다).
3. 🟥 **공유 체크아웃에서 `git stash` 는 `git add -A` 와 같은 급이다 — 아니, 더 넓다.**
   `add -A` 는 «스테이징» 이라도 남기는데 `stash -u` 는 **트리 전체를 치운다.** 2026-08-18
   사고의 실제 원인이 이것이다: 한 세션이 selfcheck 을 깨끗한 트리에서 돌리려고 `git stash -q -u`
   를 쳤고, 그게 **peer 의 미커밋까지 같이 담았다.** 친 사람은 그것을 «내 것만 치운다» 로 알고
   있었다. ⇒ 깨끗한 트리가 필요하면 stash 가 아니라 **`git worktree add` 로 별도 트리**를
   쓰거나, 최소한 **치우기 전에 `git status` 로 남의 파일이 섞였는지 보고 살아있는 peer 에게
   한 줄 알려라.** (`git stash push -- <경로>` 로 경로를 한정하는 방법도 있으나, 그것도
   «내 파일 목록을 내가 정확히 안다» 를 전제한다.)
4. **밟혔다면 먼저 `git stash list` 를 봐라.** 남이 스위치할 때 내 미커밋이 **그 사람의
   stash 로** 들어가 있을 수 있다. 위 사례는 거기서 **전량 회수**됐다(`git show stash@{0}:<path>`).
   🟥 **`stash pop` 은 하지 마라** — 그 stash 엔 **남의 파일도 같이** 들어있다. 파일 단위로
   뽑고 stash 는 그대로 둬라. 그 사람이 자기 것을 회수해야 한다.
5. 🟥 **`claim` 은 중재가 아니라 «내가 본 HEAD 의 스냅샷» 이다 — 여러 세션이 같은 값을 동시에
   claim 할 수 있다.** 2026-08-18 실측, `.git/fh-claims/` 4건이 **전부 같은 브랜치**를 기록하고
   그중 3개가 LIVE 였다. 그 셋 중 실제로 그 브랜치에서 작업하던 것은 **하나**다. 어떻게 그렇게
   되나: 한 세션이 `git switch <다른브랜치>` 를 쳤는데 **peer 의 staged 변경 때문에 abort** 됐고,
   그 실패를 **안 읽고** 다음 줄에서 `claim` 을 실행했다 — 그래서 남의 브랜치를 자기 것으로
   기록했다(rc 를 안 보고 다음 줄로 간 것). ⇒ 게이트가 잡는 것은 **«내가 기록한 뒤 HEAD 가
   움직였다»** 하나뿐이고, **소유권을 중재하지 못한다.** 「claim 했으니 안전」으로 읽지 마라 —
   claim 파일 여러 개가 같은 브랜치를 가리키는 것은 **정상 상태**이고 아무 경고도 안 난다.
   (짝: `git switch` 는 **실패할 수 있다.** rc 를 읽어라 — 안 읽으면 그 다음 줄이 전부 거짓
   전제 위에서 돈다.)
6. 회수 후에는 **내용 검증을 해라** — 파일이 있다 ≠ 내 최신 편집이다. 마지막에 넣은 수리가
   들어있는지 토큰으로 확인해라(위 사례는 cross-family 수리 3종을 grep 으로 확인했다).

### 2-d-3. 운영 형태 — **오늘의 사실**이지 «정해진 것» 이 아니다

게이트는 «세션당 worktree» 를 권하는데 **FH 자산은 워크트리에서 커밋이 안 된다.** 그래서
현재의 운영 형태는 이렇게 갈린다:

```
FH 자산 커밋      → **메인 트리 전용.** 병렬이면 직렬화된다(먼저 필요한 쪽이 잡고, 두 번째는
                    기다리거나 얹는다 — 운영자 규칙 2026-08-18)
필드 작업·읽기·검증 → **워크트리로 빠져라.** 메인 트리의 HEAD 를 안 건드리고, 감사 대상도 안 흔든다
                    (2026-08-18 실측: qasp 코드 수정·리뷰어 주행을 전부 워크트리에서 했고
                     사고 0. 사고 3건은 **전부 FH 자산 커밋 경합**에서 났다)
```

🟥 **이것을 «정본» 으로 읽지 마라 — 훅의 경로 해석 한 줄이 만든 사실이다.**
훅은 `REPO_ROOT=$(git rev-parse --show-toplevel)` 로 마커/매니페스트 경로를 만드는데, 워크트리에선
그게 워크트리를 가리켜 `tracks/` 가 없다. 그런데 **`git rev-parse --git-common-dir` 은 워크트리
에서도 메인 트리의 `.git` 을 준다**(2026-08-18 실측, 3트리 대조 — 메인 트리에서는 같은 값이라
하위호환도 성립). 즉 「구조적으로 불가능」이 아니라 **「아직 그렇게 안 해석한다」**이다. 초판이
이 절을 «구조적 부재» 로 적었는데 과했다 — `[[feedback_impossible_verdict_may_be_unread_half]]`.

**해제 조건**
1. ✅ **착지했다(2026-08-18, 첫 실사용 확인 2026-08-22).** 훅의 evidence-root 가
   `--git-common-dir` 기준으로 해석된다. 마커는 파일명이 `브랜치_날짜` 라 워크트리끼리 안 겹친다.
   🟥 **이것이 닫은 것은 「도달 가능성」 하나다.** 「파일명이 브랜치_날짜라 안 겹친다」는
   **충돌**에 대한 말이지 **provenance** 에 대한 말이 아니다 — 운반본과 날조본이 바이트 동일한
   문제는 그대로 열려 있다. 아래 2·3 과 함께 남아 있으므로 「워크트리에서 커밋해도 된다」로
   읽지 마라.
2. 🟥 **진짜 설계 문제는 `edit_manifest.yaml` 이다** — 단일 공유 파일이고 **gitignored 라 머지
   기계가 없다.** §4 의 「자기 소유 파일·즉시 커밋」 규율이 여기엔 안 먹는다(커밋할 수 없는
   파일이라서). 동시 append 를 어떻게 할지가 그 델타의 본체다.
3. 열면 **fail-closed 를 하나 잃는다** — 지금은 「워크트리에서 FH 자산 커밋 불가」가 사실상
   안전장치로 굴렀다. 다만 트리가 분리되면 오늘 같은 사고는 안 나므로 **위험의 종류가 바뀌는
   것**이지 늘어나는 것은 아니라고 본다(판단이지 실측 아님).

⚠️ **터미널·멀티세션 도구(Orca 류)만으로는 안 풀린다.** 그건 «세션이 어디서 도는지» 를 바꾸고,
이 문제는 «증거가 어디 있는지» 다. 격리 도구를 쓰면 오늘의 HEAD/stash 사고는 사라지지만 **대신
아무도 FH 자산을 커밋 못 하게 된다** — 위 1번이 같이 가야 진짜 병렬이 된다.

⚠️ **기계화 안 한다(오늘은).** `gh` 는 세션 개념이 없고, 커밋 author/committer 도 같은 계정이라
같은 한계를 공유한다.

> **원문 확인** (2026-08-30, `gh 2.93.0`): `gh --help` · `gh auth --help` 를 직접 읽었다 —
> 최상위에 `session` 계열 명령이 **없고**, `gh auth` 의 단위는 **account/host** 다
> (`auth switch` = 계정 전환 · `auth status` = *"each known GitHub host"*). 즉 같은 머신의
> 세션 여럿은 **한 계정을 공유**하므로 `gh` 로는 서로를 구분할 수 없다.
> 컨트롤 동반: 실재하는 `pr` 은 3회 잡히고 없는 낱말은 0회 — 스캔이 죽어서 0 이 아니다. 유일하게 기계적인 후보는 `.git/fh-claims/` 인데 그건 **브랜치**를 기록하지
**PR** 을 기록하지 않고, 이미 「스냅샷이지 lock 이 아니다」로 한 번 틀린 필드다. ⇒ 지금은 산문 +
본인 확인이 정직한 층이다. **PR 번호를 claim 에 적는 형태**가 후보로 남지만, 세션이 자기 것을
자기가 적는 자기신고라 위조는 여전히 못 막는다.

## 3. 세대 간 승계 — 동료-질문으로는 구조적으로 안 잡힌다

§1의 질문은 **동료 세션**을 향한다. **직전 세대 카드 자신의 이월분**은 그 질문의 사정거리 밖이다.
2026-08-09 실측: 그렇게 사라진 이월이 8건이었고 파일은 전부 살아 있었다 — 소실이 아니라
**카드에서만 안 잡히던 상태**.

→ **카드를 재작성할 때 이전 카드의 이월 블록을 grep 대조한다.** 새로 쓰는 게 아니라 **덜어낸 것을
확인하는** 절차다.

## 4. 쓰기 규율 — 공유 자원은 append 도 충돌한다

```
✅ 자기 소유 파일 · 자기 섹션에만 append → **즉시 커밋**
❌ `git add -A` (남의 미커밋 append 를 삼킨다)
❌ 남의 카드 직접 편집 — 내용을 넘기고 소유자가 싣는다
❌ `reset --hard` — Destructive-Op 게이트 대상
```
**메모리 인덱스도 같은 자원이다.** 2026-08-09: 한쪽이 항목을 archive 로 내리는 동안 다른 쪽이
hot 에 재색인해 **양 tier 동시 등재**가 됐다. 적용 직후 검사는 0이었고 **나중에 겹쳤다** — 즉
한 번의 검사로는 못 잡는다.

## 5. 마감 전 마지막 — 내용 착지를 따로 검증한다

close check 는 **형식**만 본다(카드가 로그보다 새로운가, 필수 아티팩트가 있는가). **내용이
착지했는지는 안 본다.** 2026-08-09 에 `CONSISTENT` 를 열세 번 내고도 발화 2건이 미기록이었고,
`scripts/utterance_landing_check.sh`(컨트롤 동반 grep)가 처음 잡았다.

**가장 잘 빠지는 것은 잊은 발화가 아니라 «행동으로 대응한 발화»다** — 답장에서 조사·판단까지
하고 나면 처리된 느낌이 남고, 그 판단이 어디에도 안 적힌 채 세션이 끝난다.

## 명명된 잔여

- ~~①-c 의 peer 판별은 **cwd 매칭**이라 **다른 worktree 의 peer 를 못 잡는다**(Orca 류 격리 사용 시).~~
  → **2026-08-22 수리됨.** 판별자가 «디렉터리 접두사»에서 **«레포 동일성»**(`git rev-parse
  --git-common-dir`, worktree 안에서 메인 트리의 `.git` 을 돌려준다)으로 바뀌었다. 회귀 앵커 =
  `scripts/test_peer_worktree_detect_lanes.sh`(수리 전 스크립트에 돌리면 정확히 4 레인이 적색).
  🟥 **잔여는 남았다 — 「다 잡는다」로 읽지 마라**: cwd 를 읽었는데 **어느 레포에도 안 속하는**
  세션은 여전히 못 놓는다. 다만 그건 이제 «없음»이 아니라 `UNPLACEABLE` 로 **세어져서 뜬다**
  (미측정을 0 으로 렌더하던 것이 이 결함의 본질이었다). 실측·귀속 정본 =
  `tracks/_meta/probe_2026-08-22_A2_replication.md`.
- ①-d 스탬프와 §5 검사 결과는 **자기신고**다. 형식은 잡고 위조는 못 잡는다.
- §1 의 질문은 **사람/세션이 해야 한다** — 기계 트리거가 없다. ①-c 는 «물어라» 를 띄울 뿐이다.
- ~~이 문서 자체가 n=1~~ → **n=2 가 됐다 (2026-08-18, 3축 마감).** 그 사례가 실제로 낸 것은
  §2-d(귀속·상태 오독) 하나이고, **§0~§5 의 나머지는 반증도 확증도 안 됐다** — 3축 마감이
  2축과 다르게 굴러서가 아니라 이번엔 §1 질문이 제대로 돌아 나머지가 시험대에 안 올랐다.
  ⚠️ §2-d 자체도 **한 번의 3축 마감**에서 나왔다(세 세션이 각각 한 번씩 틀린 것이 표본의
  전부다). 세 번째 사례를 계속 기다린다.
- (원문) 이 문서 자체가 n=1(2026-08-09 2축 마감 1회) 위에 서 있었다 —
  특히 §0 의 「거버너+위임이 기본형」은 그 한 번에서 나온 판단이다.
