---
name: fh-three-layer-canon
description: FH 를 설명하는 3층 정본 — 3단 공정(모든 작업이 밟는 방법론) · 4대 엔진(FH 고유의 출력이 나오는 코어) · 정체성(방법론과 코어가 맞물려 나타나는 능력 — 5대는 단련된 실물과 등급을 가진 안정 정체성, 그 외는 방향·레버에 따라 나타나고 사라지는 면모). 층별 명명 규칙과 6축 검증의 정의를 포함한다(§1-a 최초 4축 · §1-a-2 2026-08-16 확장).
date: 2026-08-09
tags: [canon, three-layer, engines, identity, verification-axes]
---

# FH 3층 정본 — 공정 · 엔진 · 정체성

> **왜 이 문서가 필요했나**: 세 층이 **따로 살고 있었다.** 5대 정체성만
> `ship_readiness_gate.md` 에 있었고, **3단 공정과 4대 엔진은 공개 지식층에 0건** —
> gitignored `tracks/` 와 개인 메모리에만 있었다(2026-08-09 실측). 즉 FH 를 설명하는
> 뼈대의 3분의 2를 **다른 세션·다른 런타임이 읽을 수 없었다.** 이건 내용 부족이 아니라
> `[[gate_locality_principle]]` 문제다 — 필요한 곳에 없으면 없는 것이다.
> 셋을 한 곳에서 다루는 문서는 그때까지 **존재하지 않았다**(no-reinvention 스캔 확인).

## 0. 세 층은 무엇이 다른가 — **명사가 층을 실어야 한다**

```
정체성       방법론과 코어가 **맞물려 나타나는 능력**                (표면 — 무엇을 얻나)
             5대 = 단련된 실물과 등급을 가진 **안정 정체성**(대표)
             그 외 = 사용 방향·레버에 따라 나타나고 사라지는 **면모**
    ↑ 맞물린다
4대 엔진     FH 고유의 **출력이 나오는 곳**                          (코어 — 무엇을 할 수 있나)
    ↑ 밟는다
3단 공정     FH 의 **모든 작업**이 밟는 순서                          (방법론 — 어떻게 하나)
```

**2026-09-05 개정 — 운영자 정식화(축자, 승인 «문구 그대로»)**:
> fh의 모든작업: 3단공정으로 이루어진다(방법론) / fh 고유의 출력: 엔진으로부터 나온다(코어) / fh의 정체성: 방법론과
> 코어가 맞물리고 그 조합으로 나타나는 능력들. 그 대표적으로 등장하는 것이 5대정체성이나 사용 방향과 레버에 따라 다른
> 정체성도 나타나게 된다. … 5대정체성들은 사실 모두 그만큼의 단련을 거쳐서 실물이 엔진과는 또 별개로 있는 것 …
> 사용자의 사용방향성과 응용정도에 따라서 다른 정체성들이 사용하는 중에 나타나고 사라지지않을까

개정 전(2026-08-09) 표기 — 이력으로 남긴다: `5대 정체성 = 쓸 수 있는 기능 · 4대 엔진 = 그 기능을 가능하게 하는 능력 ·
3단 공정 = 그 엔진을 벼리는 순서`. 두 자리가 바뀌었다. ① **3단 공정의 범위**가 «엔진을 벼릴 때」에서 «모든 작업」으로
넓어졌다 — 근거는 실측이다: 2026-09-05 하루의 오라클 채널(영혼 → codex 탈상관 R2·R3 → 6축 마커)·원정·지도 작업이
전부 같은 세 단을 밟았고 그중 엔진을 벼리는 작업은 없었다. ② **정체성의 정의**가 «표면의 기능」에서 «결합에서 나타나는
능력」으로 옮겼고, 그 안에서 **5대와 그 외를 갈랐다**: 5대는 각각 엔진과 별개인 자기 실물(① 라우팅·Skill Bus · ②
`chamber_run.sh`·정식 EMIT · ③ pre-commit/pre-push 물리 차단 · ④ external-grounding · Ⓑ)과 6축 단련·등급표 행을
가진 **안정 정체성**이고, 그 외는 결합이 도는 동안만 관측되는 **면모**다 — 되풀이 + 자기 실물 + 등급표 행을 얻으면
그때 여섯 번째 정체성이 된다(`tracks/_meta/DESIGN_2026-09-05_engine-composition.md §3·§6` 의 규칙). 🟥 정체성이
«결합의 이름」이라는 표현은 면모에만 맞는 말이다 — 5대에 쓰지 마라(같은 날 그렇게 적었다가 운영자가 정정했다).

**명명 규칙(2026-08-09 운영자 확정)**: `공정 / 엔진 / 정체성`.
이전 표기 `3단 개발법 · 4개 엔진 · 5대 요소` 의 문제는 단어 품질이 아니라 **층이 안 들린다**는
것이었다 — 「엔진」과 「요소」가 사실상 동의어라 듣는 쪽이 어느 층인지 구분하지 못한다.
바뀐 것은 두 단어뿐이다: `개발법 → 공정`(개발만이 아니라 검증까지 덮는다) ·
`요소 → 정체성`(부품이 아니라 존재다). **「엔진」은 유지** — 기존 PR·카드·메모리 인용이 그대로 산다.

### ⚠️ 순수 스택이 아니다 — 그리고 그게 결함이 아닌 이유

3단의 **1단계(영혼)** 와 **3단계(4축 태우기)** 는 엔진 ①②와 **같은 재료**다.
아래층이 위층을 쓰므로 엄밀한 계층이 아니다. 이 모순은 **주어가 다르다**는 것으로 풀린다:

```
4대 엔진  = 각 단을 **채우는** 능력(코어) — 1단은 영혼 엔진을, 3단은 품질게이트 엔진을 돌린다
3단 공정  = 그 엔진들을 **어느 순서로 돌리나**(방법론) — 사용자 일에도, 자기 엔진을 벼릴 때도 같다
```

(2026-09-05 개정 전에는 «주어가 다르다 — 엔진은 사용자 일, 공정은 자기 엔진 벼리기」로 풀었다. 공정의 범위가
모든 작업으로 넓어지면서 그 풀이는 «방법론이 코어를 돌린다」로 바뀐다 — 재료가 겹치는 이유가 더 단순해졌다.)
밖에서 빌려온 방법론이면 엔진과 무관했을 것이다. **재료가 겹친다는 것은 도그푸딩의 지문**이고,
오히려 3단이 실재한다는 증거다. "깔려 있다" 를 *"엔진과 무관한 아래층"* 으로 읽으면 과장이다.

---

## §1 — 3단 공정 (모든 작업이 밟는 순서 — 엔진을 벼릴 때도 같다)

```
① 초기 영혼           심지(판단 회로)를 먼저 심는다. 무엇이 성공 · 어디로 기움 ·
                      범위 밖 · 절대 안 함
② 중간 **병렬 탈상관** 가속화
                      두 다이얼을 **각각** 돌린다 — 곱하지 말고 골라라.
                        **탈상관** ← 사각 위험에 반응. **모델 탈상관**(ⓐ 계열) +
                                     **입장 탈상관**(ⓑ 대상 하네스의 정본·레포)
                        **병렬**   ← 표면 크기에 반응(한 컨텍스트에 담기나). fan-out
                      병렬화 자체엔 방향이 없다 — 축은 판단 회로(①)가 고른다
③ 마무리 6축 태우기    §1-a-2 의 여섯 축으로 태운다. **적대검증 하나가 아니다**
```

> 🟥 **이 줄은 2026-08-16 까지 「4축」이었다 — 갱신을 놓쳤던 것이지 별개 개념이 아니다.**
> 같은 날 `§1-a-2` 가 4축을 6축으로 확장했는데 이 요약줄이 안 따라와서, **`CLAUDE.md` 는 「6축」
> 이고 여기는 「4축」인 상태가 존재했다.** 그 사이 외부 계열이 작성한 문서 한 건이 실제로 이 줄을
> 읽고 ③단계를 「4축」으로 서술했다(weekly_audit_2026-08-16 🟥-4).
>
> 🟥 **더 위험한 절반은 숫자가 아니라 문자다 — 같은 글자가 두 배열에서 다른 축을 가리킨다.**
>
> | 문자 | §1-a (옛 4축) | §1-a-2 (현 6축) |
> |---|---|---|
> | ⓐ | 다른 계열 | 계열 *(동일)* |
> | **ⓑ** | **첫 실사용** | **입장** ← 옛 ⓑ 는 현 **ⓔ** 로 밀렸다 |
> | ⓒ | 기록 그라운딩 | 격리 그라운딩 *(대응)* |
> | **ⓓ** | **되돌림 실측** | **3자 대면** ← 옛 ⓓ 는 현 **ⓕ** 로 밀렸다 |
> | ⓔ | — | 첫 실사용 |
> | ⓕ | — | 되돌림 실측 |
>
> ✅ **2026-08-17 부로 마커도 이 배열이다** — 날짜 ≥ 2026-08-17 인 마커는 `axes-run` 이
> **기호 여섯 글자(ⓐ~ⓕ)**를 요구하고, 그 이전 마커는 옛 ASCII 넷을 그대로 쓴다(소급 강제 없음).
> ⚠️ **표기법은 판별자가 아니다 — 이 줄의 초판이 그렇게 적었고 코퍼스 실측이 반증했다.**
> 초판은 *"표기법이 곧 배열 선언이라 감사자가 grep 한 번으로 판별한다"* 였다. 실측: `axes-run`
> 보유 **53건 중 기호 키가 4건**인데 그중 **2건이 2026-08-10 자이면서 옛 4축 의미로 기호를
> 쓴다**(`ⓑ 첫실사용` · `ⓓ 되돌림` — 현 배열에선 각각 ⓔ·ⓕ), 혼용도 1건 있다. 훅은 그 셋을 안
> 읽으므로 **커밋은 안 막지만 감사자의 grep 은 거기서 틀린 답을 낸다.**
> ✅ **판별자는 마커 파일명의 날짜다** (`< 2026-08-17` = 옛 4축). 이게 유일한 기계 판별자다.
>
> 🟥 **그리고 아래 문단은 삭제됐다 — 이 절이 스스로와 모순하고 있었다.** 삭제된 문장은
> *"확장은 기존 마커 전부를 무효화하므로 운영자 결정 사항으로 열려 있다 — 그때까지 마커를 쓸
> 때는 **옛 배열**을 쓰고…"* 였다. 바로 위 ✅ 줄(2026-08-17 착지)과 정면으로 어긋나고,
> **그 줄을 따라 읽은 세션은 오늘 옛 배열로 마커를 써서 훅에 막힌다.** 반쪽 픽스가 위 문단에만
> 착지하고 아래 문단이 살아남은 형태다(`[[feedback_half_fix_propagation_boundary]]`).
> 「전량 무효화」 전제 자체도 별도로 반증돼 있다 — 훅은 **오늘·이 브랜치 마커 한 개만** 검증하므로
> 190건 중 차단 0·재해석 51이었다(`CLAUDE.md` §명칭 충돌).
>
> **남은 어긋남은 하나뿐** — `standpoint:` 값의 **`tier2`+ 실행 grounds** 가 advisory 라는 것이다.
> 🟥 **RETRACTED 2026-08-23 — 이 줄은 «값의 enum 을 검증하는 코드가 아직 0줄이다» 라고 적고
> 있었고, 그건 거짓이었다. 그리고 이 자리의 거짓이 다른 어느 자리보다 나빴다** — enum 이 바로
> **차단하는 절반**이라, 하필 닫혀 있는 쪽을 「0줄」이라 부른 것이다. 실측(2026-08-23, 컨트롤
> 동반): `templates/.git-hooks/pre-commit` 의 `validate_standpoint_leg()` 는 **86줄**, `:1953` 에서
> 호출되어 `FAILED=1` 로 커밋을 차단하고, 그 안의 `return 1` **6개**가 ⓐ `standpoint:` 줄 부재
> ⓑ 중복 `standpoint:` 줄 ⓒ enum 비-멤버 값 ⓓ `crossfamily:` 토큰 오염 ⓔ 근거 없는
> `not-applicable` ⓕ 근거 없는 `DEGRADED_*`/`UNKNOWN` 을 막는다(레인 =
> `scripts/test_marker_standpoint_lanes.sh`). **advisory 인 것은 딱 한 칸** — `tier2`+ 가
> «실행을 명명했는가» 를 못 채우면 `⚠️` 만 찍고 `return 1` 을 안 한다(훅 스스로 *"Advisory by
> design"*). **왜 그렇게 적혔나**: 2026-08-20 에 이 거짓을 잡은 정정이 다섯 자리를 훑었는데
> **이 파일은 그 목록에 없었다** — 목록 자체가 불완전했던 반쪽-픽스다
> (`[[feedback_half_fix_propagation_boundary]]`). 🟥 **논지는 안 바뀐다**: 닫힌 것은 여전히
> **«형식»이지 «진위»가 아니다.**
> 옛 배열로 쓴 줄을 기계가 **조용히 다른 축으로 읽으며 오류를 내지 않는다** — 그래서 옛 마커를
> 읽을 때는 날짜부터 본다. 산문으로 논할 때는 언제나 §1-a-2 의 6축을 쓴다.
>
> 🟥 그리고 ③단계는 **「결정론적 기계 스크립트」가 아니다.** 여섯 축 중 다섯이 모델/에이전트
> 판단이고, 기계 앵커가 붙은 축은 현재 **되돌림 하나뿐**이다(§ 아래 «자평이다» 절). ③을
> pre-commit·exit code 로 서술하면 그건 **커밋 경계의 4축 게이트**(회귀·적대·팬텀·매니페스트)를
> 말하는 것이며, 둘은 부분적으로만 겹치고 **서로 대체하지 않는다**(`CLAUDE.md` §명칭 충돌).
>
> 🟥 **그리고 이 저장소 안에서 '4'는 «둘»이 아니라 «셋»이다.** `CLAUDE.md` §명칭 충돌은 앞의
> 두 개(게이트 ↔ 검증)만 가른다. 세 번째가 **4대 엔진**이고, 그것까지 병치해야 인용 사고가
> 닫힌다 — 인용하기 전에 어느 '4' 인지 확인하라:
>
> | 이름 | 무엇 | 어디에 붙나 |
> |---|---|---|
> | **4축 게이트** | Axis 1 회귀 · 2 적대 · 3 팬텀 · 4 매니페스트 | **커밋 경계** — 층이 아니다 |
> | **4대 엔진** | 영혼 · 품질게이트 · 질문하기 · 맥락유지 | **능력 층**(§2) |
> | **4축 검증** | → **6축**으로 확장됨(§1-a-2) | **3단 공정 ③단계**의 내용물 |
>
> 셋은 부분적으로만 겹치고 서로 대체하지 않는다: Axis 2·3 이 ⓐ·ⓒ 와 가깝지만 **Axis 1·4 는
> 검증 축에 대응이 아예 없다.** 그래서 6축은 「6축 게이트」가 아니라 「**6축 검증**」이다.
> (출처: 이 표는 `README.ko.md` 에만 있던 것을 정본으로 옮긴 것이다 — 4개 언어판 중 하나에만
> 있는 내용은 비대칭이고, 그 판을 안 읽는 독자에게는 존재하지 않는 것과 같다.)

**이건 도구 목록이 아니라 투입 순서다.** 축 없이 병렬부터 던지면 노이즈가 늘고,
태우기부터 하면 태울 게 없다. 근본 명제(운영자, 2026-08-09):

> **"하네스는 방법론이고 지능은 이미 가지고 있다. 방법론만 바꾸면 승리한다."**
> 병력 = 지능(이미 있다, 변수가 아니다) · 병법 = 하네스(배치와 순서)

실측: 모델 고정 · 방법만 혼자→cross-family → **자력 적발 0 → 11건**(2026-08-09).
선례: `dominance_benchmark_2026-07-14` 가 *"Sonnet floor 고정, method 만 변화"* 로
5/8 → 6/8 → **8/8** 계단을 냈다.

### §1-b — 스코프 (2026-08-09 운영자 정식화 + 같은 날 3스코프 실측)

> **운영자**: *"3단은 스코프가 자유자재다. 작은 스코프는 세션, 큰 스코프는 필드 하네스 개발,
> 그 위가 메타하네스 자기 자신."*

**대체로 맞다. 다만 실측하면 세 가지가 더 붙는다.**

#### ⓐ 자유자재가 아니라 — **하한이 있다**

판별 기준은 **크기가 아니라 «성공 정의가 설계를 바꾸는가»** 다.

```
gitignore 한 줄 수리   ① 영혼 불요   답이 하나다. 심으면 오버헤드
branch-claim 게이트    ① 영혼 필수   «무엇을 성공으로 볼 것인가»가 설계를 결정한다
```

**실측(2026-08-09)**: 후자에서 ①을 건너뛴 대가가 나왔다 — *"성공 = 오늘 그 사고가
재현될 때 차단된다"* 를 검증 가능한 문장으로 안 썼고, 그래서 **트리 단위 설계가
자기 성공 기준을 즉시 실패한다는 것**(A가 switch 후 claim 하면 B가 통과)을
**적대검증 4라운드 뒤에** 알았다. 심지 한 줄이 짓기 전에 잡았을 것이다.

#### ⓑ 스코프는 나란하지 않다 — **중첩되고, 서로를 먹인다**

```
안쪽 ③  ◀──빌린다──  바깥 기계   게이트를 검증한 4축 훅은 **세션/저장소 스코프의 것**이다.
                                게이트가 자기 힘으로 자기를 검증한 게 아니다  [강한 증거]
바깥 ②  ──먹인다──▶  안쪽 ②     두 축이 서로를 검증했다(각자 상대 주장을 반증)  [약한 증거]
안쪽 ③  ◀──빌린다──  바깥 하네스 이 층은 이미 정본화됐다 — 새로운 건 ③ 스코프-차용
                                프레임 안에서의 표본이다 (2026-08-14)  [중간 증거]
```

**강한 쪽부터**: 안쪽 스코프는 **자기보다 바깥의 기계에 의존해서** ③을 완수한다.
오늘 branch-claim 게이트를 통과시킨 4축 훅·마커·앵커는 전부 저장소 스코프 자산이다.
즉 «메타하네스 자기 스코프» 는 독립 실행 단위가 아니다 — **바깥이 없으면 ③이 성립하지 않는다.**

**이 층(바깥 하네스를 빌린다)은 이미 정본화돼 있다** — `harness_verification_core_extended.md`
(2026-08-01, PR #225, ARC CLOSED): "Extended = 멀티하네스 클러스터에서 디스패치된 검증 도구,
대상 하네스 자신의 검증 독트린 로드 금지(그게 탈상관의 요점)." ⚠️ 인용은 원문 그대로다 — 그 정체성의 이름은 2026-08-16 에 **「멀티하네스 클러스터」 → 「하네스 클러스터」** 로 줄었다(「멀티」와 「클러스터」가 둘 다 복수를 뜻해 중복이었다). 내용 불변, 상세는 `ship_readiness_gate.md` §①-naming. 실증 N=2(qasp↔FH 슬라이스,
7건 신규 접지 발견) + `feedback_decorrelation_axis_matches_failure_mode`(2026-08-07, mate PR
#8, reps=3): 코어 결함은 하네스 무관 일치(6/6), **주변부 발견의 클래스가 하네스별로 갈린다**
(같은 형태를 이 절이 지금 다시 보고 있다). ⚠️ 이 절의 초판은 이 선례를 못 찾고 "자리가 없다,
n=1"이라고 적었다 — 바로 위 메모리 파일이 스스로 경고하는 실패모드("엣지 없어 선례를 못 찾고
기록에 없다고 단정")를 **이 절 자신이 재현**했다. 정정: 미충족은 명제 부재가 아니라 **`crossfamily:`
필드가 family-shaped 라 하네스 축을 typed 값으로 못 싣는다**는 좁은 배선 갭뿐이다.

**2026-08-14 표본은 새 명제가 아니라 이 층의 세 번째 표본이다.** PMH 세션에서 `grep | head` 가
증거 두 줄을 잘라 오독을 일으킨 사고를 PMH 내부 어떤 층도 못 잡고 다른 하네스(FH, PR #368 리뷰)가
잡았다. **교란 미배제, 있는 그대로 적는다**: 그 파일(`scripts/sync-to-be.sh`)은 FH 소유 자산이라
"다른 하네스"와 "원본 소유자"가 완전히 분리되지 않고, `head` 미사용 grep 은 스코프 문제가 아니라
능력 문제이며, 이 클래스의 처방(대조엔 컨트롤 동반)은 이미 이 절 아래([[feedback_absence_
measurement_needs_control]])에 있다. 표본이 지지하는 건 "바깥 하네스가 잡았다"까지이지
"바깥 하네스가 필요하다"까지는 아니다.

⚠️ **약한 쪽은 약하다고 적는다.** 초판은 *"세션 축 분리로 **예산**이 생겨 3렌즈를 띄웠다"*
라고 썼는데 **과장이다** — 두 세션은 예산이 독립이고, 축 분리가 준 것은 예산이 아니라
**컨텍스트 집중**이다. 게다가 그 분리는 *계획된 탈상관*이 아니라 **원래 다른 두 작업**이었고,
상호 검증은 계획이 아니라 **창발**이었다. 「바깥 ②가 안쪽 ②를 먹인다」는 **가설이지 실측이 아니다.**

즉 «작은/큰»의 병렬 배열은 아니되, **확인된 의존은 아래→위 한 방향뿐**이다.

#### ⓒ ②의 효과는 둘이고, **둘째가 더 크다**

> **운영자**: *"병렬 탈상관 가속화를 하여 개발을 빠르게 해낸다(**뒷단의 부담을 덜어낼 수도 있다**)."*

실측: 3렌즈가 잡은 **M급 9건 + 콜드리드 HARD 5건**이 없었다면 그 14건은 **직렬이고
시간이 정해진 리허설**로 몰렸을 것이다. 거기서 나오면 못 고친다.
`fh_signal_2026-08-07_shift-left-governance` §④ 의 *"뒷단 부하는 앞단 부재의 함수다"* 와
같은 명제이고, 이 괄호가 그것을 ②의 정의 안으로 넣는다.

🟥 **이름이 손실 압축돼 있었다 — 2026-08-21 에 운영자가 잡아 복원했다.** 바로 위 원발화는
**「병렬 탈상관 가속화」**인데, 요약줄(§0)과 `CLAUDE.md` 는 **「병렬」을 떨어뜨린 채** 8월 내내
「탈상관 가속화」로 실려 있었다. 그러자 이름이 다이얼 **하나만** 부르게 되고, 읽는 쪽에서
*"이거 그냥 서브에이전트 병렬 아니냐"* 가 나온다 — 실제로 운영자가 그 질문을 던져서 발견됐다.
**자력 적발 0.**

🟥 **그리고 「다양성」으로 부르지 않는다 — 검토했고 기각했다(운영자 결정 2026-08-21).**
다양성은 **리뷰어 집합**의 성질이고 탈상관은 **입력**의 성질이다. 같은 diff 를 세 계열에 주면
*다양하되 상관돼 있고* 사각은 그대로 남는다 — §1-a-2 의 판별 명제(«무엇을 받았는가»)가 정확히
그것을 막는 문장이다. 「다양성」으로 부르면 *"모델 세 개 썼으니 됐다"* 가 통과한다. 실측:
**이 문단을 쓰기 전** 기준으로 이 파일 · `field_verdict_crossfamily_gate.md` · `CLAUDE.md` 에서
「다양성」 **0건**이었고, 그건 우연이 아니라 이 구분을 지키느라 안 쓴 것으로 보인다.
🟥 **스코프를 명시하는 이유**: 지금은 이 문단 자신이 그 단어를 쓰므로 같은 grep 이 히트한다.
스코프 없는 부재 주장은 자기 자신이 반례가 된다(cross-family 지목, 자력 적발 0).

⚠️ **가속화 ≠ shift-left.** 앞당기는 것과 탈상관하는 것은 다른 축이다. 오늘은 둘이 같이
갔을 뿐이고, 한 문장으로 묶으면 *"병렬로 돌렸으니 앞당긴 것"* 이라는 오독이 나온다.

#### 🟥 ⓓ 실측 — **자기 스코프가 가장 나빴다**

같은 날 한 세션에서 세 스코프가 다 돌았고, 품질이 이렇게 갈렸다:

| 스코프 | ① 영혼 | ② 탈상관 | ③ 4축 |
|---|---|---|---|
| **A 세션** (두 축 병렬) | 🟡 프레임은 있고 «절대 안 함» 없음 | 🟡 **창발이지 설계가 아니다** — 원래 다른 두 작업이었고 상호검증이 결과로 생겼다 | ✅ peer 상호검증 · 마감 스윕이 미착지 결정 1건 적발 |
| **B 산출물** (발표 원고) | ✅✅ 인용금지 원장 = «절대 안 함» | ✅✅ 3렌즈를 **실패 모드로** 골랐다 | ✅ ⓐ 다른계열 · ⓑ 첫실사용 · ⓒ 격리감사 4건 반증 |
| **C 메타하네스 자기** (게이트·배선) | 🟥 **안 심었다** | 🟡 사후 검증으로 씀(«중간»이 아니다) | 🟡 ⓐⓑⓓ 함 · **ⓒ 안 함** |

**FH 가 남의 것엔 3단을 잘 쓰고 자기 것엔 못 썼다.** §0 이 *"재료가 겹친다는 것은
도그푸딩의 지문"* 이라고 적었는데, 실측은 한 겹 더 말한다 — **겹치면 건너뛰기도 쉽다.**
자기 코드는 *"내가 아니까"* 라는 감각이 ①을 먼저 지운다.

> **운영자(2026-08-09)**: *"아직 RC 이긴 한데, RC 인 만큼 스스로가 잘 굴려야 초록으로도
> 갈 수 있겠지."* → **C 스코프의 품질이 승급 경로다.** 남에게 잘 쓰는 것으로는 안 오른다.
> ⚠️ 등급 어휘(🔵/🟢)는 **§3 정체성 층에 붙지 이 공정 층에 붙지 않는다**(정본 =
> `ship_readiness_gate.md`). 위 문장은 «공정을 자기에게 적용한 품질이 정체성 승급을
> 좌우한다» 로 읽어라 — 공정 자체에 등급을 매기는 것이 아니다.

**근거 등급 (정직하게)**: 위 표는 **한 세션 n=1** 이다. 하한 판별 기준(ⓐ)의 근거는
**사례 2개**(gitignore vs 게이트)뿐이다. ⓓ 의 «자기 스코프가 가장 나쁘다» 가 구조적인지
그날 우연인지는 **미측정** — 다음 세션들에서 같은 표를 채워 봐야 안다.

### §1-a — 마무리 «4축» (2026-08-09 실측으로 정의) — 🟥 **§1-a-2 로 확장됨. 이 절만 읽고 인용하지 마라**

> **이 배열은 현행이 아니다.** 산문 정본은 `§1-a-2` 의 **6축**이다. 이 절은 그 6축이 어떻게
> 도출됐는지의 **이력**으로 남긴다(§1-a-2 가 이 절을 덮지 않는다고 명시하므로 삭제하지 않는다).
>
> 🟥 **인용 전에 반드시**: 아래 문자 ⓑ·ⓓ 는 §1-a-2 에서 **다른 축을 가리킨다** — 옛 ⓑ(첫 실사용)
> → 현 **ⓔ**, 옛 ⓓ(되돌림) → 현 **ⓕ**. 표는 §1 요약줄 아래에 있다. 이 절의 문자를 그대로
> 6축 문맥에 옮기면 **조용히 다른 축을 지목하게 된다.**
>
> ⚠️ **이 절의 배열은 2026-08-17 이전 날짜의 마커에만 유효하다** — 그 날짜부터 마커도 §1-a-2 의
> 6축(기호 키)을 요구한다. 옛 마커를 **읽을** 때는 여기가 맞고, 새로 **쓸** 때는 §1-a-2 가 맞다.
> 산문/기계 어긋남은 해소됐고, 남은 잔여는 `standpoint:` 값 검증이 없다는 것 하나다.

3단계를 오래 «적대검증» 이라고 불렀으나, 그건 **넷 중 하나**다. 각 축은 **다른 것이 틀린
경우**를 잡고 **서로를 대체하지 못한다**:

| 축 | 무엇이 틀린 경우 | 대표 계기 |
|---|---|---|
| **ⓐ 다른 계열** | **구현**이 틀렸다 | cross-family 적대검증(`auto-decorrelation`) |
| **ⓑ 첫 실사용** | **재는 방식**이 틀렸다 | 실물 대상에 한 번 돌려본다 |
| **ⓒ 기록 그라운딩** | **주장**이 틀렸다 | 격리 감사가 문서의 수치·인용·기전을 재측정 |
| **ⓓ 되돌림 실측** | **앵커**가 틀렸다 | 배선을 지우고 대응 레인이 빨개지는지 본다 |

**2026-08-09 실측(한 산출물, 같은 날)**: ⓐ 18건 · ⓑ 2건 · ⓒ 11건 · ⓓ 15건.
그리고 **ⓐ 4라운드가 ⓒ 를 0건 잡았고, ⓒ 가 ⓓ 를 0건 잡았다.**
ⓑ 는 *"계기의 계기가 틀린"* 경우라 ⓐ·ⓓ 가 **구조적으로** 못 본다.

⚠️ **한 문장으로 묶지 마라 — 처방이 갈린다**: ⓒ=기록 재감사 · ⓓ=앵커 되돌림 ·
계기 유효성=known-pair 보정. 두 병렬 세션이 이 결론에 독립 수렴했다.
비용 경계: 넷을 매번 다 돌리는 축이 아니다. **곱하지 말고 실패 모드에 맞춰 골라라**
(`[[feedback_decorrelation_not_fanout_cost_boundary]]`).


### §1-a-2 — 4축 → **6축** 확장 (2026-08-15 실측 · 2026-08-16 정본화)

위 네 축은 **2026-08-09 실측의 것이고 그대로 유효하다.** 그 뒤 한 산출물(qasp 1막 조건 배치 수리)
에서 **두 축이 더 섰다.** 이 절은 앞 절을 대체하지 않고 **덧붙인다** — 날짜 박힌 측정을 덮지 않는다.

🟥 **확장의 근거가 되는 명제 — 이게 표보다 중요하다**:
> **축은 «얼마나 적대적인가»로 갈리지 않는다. «무엇을 받았는가»로 갈린다.**
> 받는 것이 같으면 리뷰어를 몇 명 붙여도 **같은 사각이 남는다.**
> ⇒ 「근원은 적대검증」은 **정본과 어긋난다.** 적대성은 **자세**지 축이 아니다 — 아무 축에나
> 얹을 수 있고, 얹어도 그 축이 못 보는 것은 여전히 못 본다.

| 축 | **받는 것** | 무엇이 틀린 경우 |
|---|---|---|
| ⓐ 다른 계열 | diff + 저자의 프레이밍 | 구현 |
| **ⓑ 입장** (신규) | diff + **대상 하네스의 정본** | **인용한 규약이 정말 그런가** |
| ⓒ 격리 그라운딩 | 저자가 쓴 문장(**사후 주장 및 사전 선언**) + 지금의 트리 | 주장 · **델타가 선언한 것과 안 맞음** |
| **ⓓ 3자 대면** (신규) | 문제 + **남의 코드베이스** | **이미 풀린 문제 아닌가** · 내 변경이 남의 레포를 어디서 만지나 |
| ⓔ 첫 실사용 | 실물 대상 한 건 | 재는 방식(계기의 계기) |
| ⓕ 되돌림 실측 | 배선을 지운 트리 | 앵커 |

🟥 **ⓒ 행은 2026-08-21 에 넓어졌고, 이 정본은 그날 안 따라왔다.**
⚠️ **초판은 여기 「8일간」이라고 적었는데 그건 지어낸 숫자다** — `db8e72a` 는 **같은 날
15:45:09 +0900** 이라 실제 지연은 몇 시간이고, 자력 적발 0(cross-family 가 커밋 날짜를 대조해
반증했다). 짧다고 덜 나쁜 것은 아니다 — **길이가 아니라 「기계가 갱신될 때 정본이 같은 PR 에
안 들어갔다」가 결함**이고, 그 성질은 지연이 1시간이든 8일이든 같다. 숫자를 크게 잡아 심각성을
빌려온 형태라 그대로 남긴다. `templates/.git-hooks/pre-commit:1186` 이 이미 *"⇒ ⓒ's 「받는 것」 widens to «저자가 쓴
문장(사후 주장 및 **사전 선언**)»"* 라고 선언하고 `soul-check:` 레인까지 돌고 있는데(PR #481,
`db8e72a`), 그 PR 이 바꾼 파일 셋(`selfcheck.sh` · `test_marker_soul_check_lanes.sh` ·
`pre-commit`)에 **이 파일이 없었다.** 그래서 이 절 전체에서 `사전 선언` grep 이 **0건**이었다 — 🟥 **이 문단을 쓰기 전 기준이다.**
지금은 이 문단 자신이 그 문자열을 여러 번 쓰므로 같은 grep 이 히트한다. 스코프를 안 적으면
자기무효 측정이 된다(cross-family 지목).
`[[feedback_half_fix_propagation_boundary]]` 이고, 방향이 뒤집힌
`[[feedback_rule_misdescribes_its_own_machine]]` 이다 — 보통은 규칙이 없는 기계를 주장하는데
여기서는 **규칙이 있는 기계를 안 적었다.** 발견자는 병렬 피어 세션(하네스닥터)이고 **자력 적발
0** 이다 — 위 §피어 절이 말한 ⓑ∪ⓓ 가 실제로 낸 첫 수확이다.

**저자 자평을 걷어낸 자리**: 발견 16건을 **출처를 지운 채** 봉인된 정답키와 함께 **레포 밖 cwd·
헤드리스**로 다른 계열 분류자 **둘**에게 독립 판정시켰다. 채점 11/15 · 12/15, 상호 일치 13/15(87%),
사전 등록한 반증 조건(일치율 50% 미만) 미발동.
🟥 **그리고 그 판정이 저자를 반증했다** — 저자가 ⓓ에 귀속시킨 **5건 중 3건**을 둘 다 **다른 축**
으로 판정했다("저장소 전수 미사용"=격리 · "예외 삼킴"=계열). **그 셋은 축이 필요했던 게 아니라
다른 축이 놓친 것**이다. 살아남은 것은 2건이고, 그 2건에 대해서만 두 계열이 독립으로 나머지 다섯
축을 «구조적 불가»로 판정했다.

**왜 기반 모델 발전으로 대체되지 않나**: 축은 *리뷰어의 능력*이 아니라 **입력**으로 정의된다.
모델이 세져도 **「받지 않은 정보」는 여전히 못 본다.** 스캐폴딩은 벗겨지지만 **입력 경계 탈상관은
벗겨지지 않고**, 단일 저자는 정의상 자기 입력을 벗어날 수 없다.
⚠️ 정직한 가장자리: 에이전트가 **도구로 스스로 입력을 가져오면** 경계는 흐려진다(그래서 위 3건이
다른 축으로 넘어갔다). 반대로 「남의 레포가 과거에 폐기한 규칙」은 **도구로도 못 가져온다** —
그 프로젝트의 리뷰 이력에 접근할 이유가 없기 때문이다. 거기가 ⓓ가 남는 자리다.

#### 피어 세션은 새 축이 아니라 ⓑ∪ⓓ 의 변형이다 (2026-08-21, 운영자 결정)

> **운영자**: *"피어논의는 입장리뷰+3자대면의 변형이지않을까"*

같은 하네스에서 갈라져 나온 **병렬 세션**의 판정을 어디에 적을지가 열려 있었다(신호:
`tracks/_meta/fh_signal_2026-08-21_peer-axis-canon-claim.md`). 결정은 **7번째 축 아님** —
⇒ **마커 `axes-run` 배열 변경 없음**(기존 마커 전량 무효화라는 가장 비싼 결과를 피했다).

위 표의 판별자(«무엇을 받았는가»)로 대조하면 둘 다 맞는다:
- **ⓑ 입장** — 피어가 낸 S-1 이 정확히 *"인용한 규약이 정말 그런가"* 였다(rc 계약을 인용해
  놓고 주 진입점이 그 계약을 안 썼다).
- **ⓓ 3자 대면** — 같은 날 사고 둘이 문자 그대로 *"내 변경이 남의 레포를 어디서 만지나"* 였다.

🟥 **«변형»은 전달 방식이 아니라 «관점 자체»다 — 이 절의 초판이 그걸 틀렸고 운영자가 정정했다.**

> **운영자**: *"동일 하네스에서 분화한 세션이라도 **그 세션으로 뜨거워진 지점에서는 다른 양상과
> 관점을 지니게 된다. 그 세션만큼은 두 얼굴이 생기는거다.**"*

초판은 *"받는 «것»은 같고 받는 «방식»이 다르다"* 라고 적었는데 그건 열화다. **뜨거워진 지점에서
그 세션은 진짜로 다른 입장이고 진짜로 남의 코드베이스 자리다.** 그래서 ⓑ∪ⓓ 로 갈리는 것이지
«내용은 같은데 배달이 다른» 것이 아니다.

**그리고 이 정정이 운용 규칙을 바꾼다** — 초판대로면 안 나왔을 규칙이다:
```
✅  피어에게 물을 때는 그 피어가 «뜨거워진 축»을 물어라 — 거기서만 두 번째 얼굴이 있다
🟥  뜨겁지 않은 축에서 피어는 나와 같은 얼굴이다 — 물어도 탈상관이 안 된다(같은 사각)
🟥  서브에이전트·내 재독으로 대체 불가다. 두 번째 얼굴은 «그 세션이 실제로 그 일을 한 것»
    에서만 나오지, 프롬프트로 만들어지지 않는다
```
`[[feedback_decorrelation_axis_matches_failure_mode]]` 의 피어 판본이다 — 축은 계열만이 아니라
**«그 세션이 무엇으로 뜨거워졌나»**로도 갈린다.

**기록 규약**: 피어 판정을 근거로 쓸 때 `axes-run` 은 `ⓑ=` 와 `ⓓ=` 에 적는다. 새 기호는 안
만든다. 단 **`ⓑ=→standpoint`** 규약이 이미 있으므로(값은 `standpoint:` 필드가 가진다),
피어-유래 ⓑ 는 그 필드에 «peer 세션이 자기 갈래에서 판정» 임을 명시한다.

⚠️ **표본 한계**: 근거는 하루·두 세션이고 **대조군이 없다**(같은 일을 피어 없이 했을 때와
비교하지 않았다). 결정은 운영자 판단이고, 판별력 실측은 미실시다.

🟥 **ⓓ 정의 좁힘 (2026-09-04, six_axis_review 판정안 6 — append-only, 위 문단들을 지우지 않는다).**
6축 전수 실측(`tracks/_meta/six_axis_review_2026-09-04.md`, 마커 169개)이 ⓓ 를 다시 세었다:
`thirdparty:` 값이 실린 마커 중 **①선행자산 확인(`checked`/`none-found`)이 대다수, ②하네스 단위
적대검증(`peer-review`)은 6/102** — `.claude/rules/fh_4axis_gate.md §Marker axis fields` 의
`thirdparty:` 절이 이미 **①과 ②를 같은 필드의 두 반쪽**으로 정의해 두고 있었다. 이 문단은 그
정의를 **좁힌다**: ②(peer-review)는 **ⓐ 계열 축의 패널 분류 안으로 접는다** — 피어 하네스의
세션이 리뷰하는 것은 «한 계열의 패널 멤버가 하나 더 붙는 것»과 같은 모양이다(패널 구성원이
다른 하네스에서 왔다는 사실은 `crossfamily:` 의 `panel(<families>)` 기록이 이미 흡수할 수 있는
정보다). **ⓓ 는 ①선행자산 확인(`checked`/`none-found`, 그리고 그 형제 degrade 값들)만 남는다.**
🟥 **값은 삭제하지 않는다** — `peer-review` enum 멤버는 그대로 있고, 이미 쓰인 6건의 기록도
무효화되지 않는다. 좁히는 것은 **어느 축이 그 값을 자기 것으로 소유하나**라는 정의 문장이지,
필드나 값이 아니다. **하류 훅은 무변경** — `validate_thirdparty_leg` 은 포인터가 가리키는
`thirdparty:` 필드의 **존재**만 보고 어느 하위 형태(①/②)를 썼는지는 안 본다(§Marker axis
fields 의 `thirdparty:` 절이 이미 그렇게 명시한다). 이 정정은 **다음에 쓸 때**의 지침이지
과거 마커를 다시 채점하는 규칙이 아니다.

✅ **기계층이 6축으로 확장됐다 (2026-08-17, 운영자 승인).** 아래는 그 상태와 **남은 잔여 하나**다.
```
axes-run: ⓐ~ⓕ         마커 날짜 ≥ 2026-08-17 이면 pre-commit 이 **기호 여섯 글자를 요구**한다
axes-run: a/b/c/d      그 이전 날짜의 마커는 옛 네 글자 그대로 (소급 강제 없음)
standpoint:            ⓑ 는 **자기 필드**가 정본이고, `axes-run` 은 `ⓑ=→standpoint` 포인터만 든다
                       (이중 기록 회피). 포인터가 있는데 그 줄이 비면 **죽은 포인터로 차단**
                       ✅ 값의 **enum 은 닫혀 있고 차단한다** — pre-commit 의
                          `validate_standpoint_leg()` (함수명으로 grep 해라; 행번호는 드리프트한다).
                          그 안의 `return 1` 6개가 막는다. 레인 = test_marker_standpoint_lanes.sh
                       ⚠️ 남은 잔여는 **`tier2`+ 의 실행 grounds 뿐** — 미달 시 ⚠️ 만 찍고 통과
                       🟥 **RETRACTED 2026-08-23**: 이 칸은 «값 자체의 enum 검증은 여전히 0줄»
                          이라 적고 있었고 거짓이었다 — enum 이 바로 차단하는 절반이다. 위 §95 참조
ⓓ 3자 대면             ✅ 기록할 자리가 생겼다 (`ⓓ=`)
```
🟥 **판별자는 마커 파일명의 날짜다**(`< 2026-08-17` = 옛 4축). 표기를 가른 이유는 미관이 아니라
실측이다: 두 배열은 **같은 글자가 다른 축을 가리킨다**(옛 `b`=첫실사용 → 지금 **ⓔ**, 옛 `d`=되돌림
→ 지금 **ⓕ**). 같은 글자를 쓰면서 의미만 바꾸면 **조용히 다른 축으로 읽히고 오류가 안 난다** —
`not found ≠ 0` 의 형제다.

⚠️ **다만 「표기법이 배열을 선언한다」는 명제는 반증됐다** — 이 절의 초판이 그렇게 적었고, 같은 날
ⓓ3자대면 축이 코퍼스를 손으로 세어 반례를 냈다: `axes-run` 보유 **53건 중 기호 키 4 · 혼용 1**,
그리고 **기호 4건 중 2건이 2026-08-10 자이면서 옛 4축 의미**(`ⓑ 첫실사용` · `ⓓ 되돌림`)다. 훅은
그 셋을 안 읽으니 커밋에는 영향이 없고, 틀린 답을 받는 쪽은 **감사자**다. 표기 정렬은 «앞으로 쓸
때 옛 줄을 복붙하지 않게» 하는 값이지 **소급 판별자가 아니다**.

⚠️ 그리고 **날짜 비교 자체가 프로덕션에서 도달 불가 분기**다 — 훅 호출부가 마커 경로를 `${TODAY}`
로 구성하므로 `mdate` 는 항상 오늘이다. **기존 마커를 지킨 것은 그 상수가 아니라 경로 구성**이고,
8일 전 `crossfamily:` 확장이 컷오프 없이 성립한 이유도 같다. 숨기지 않고 적는다.

**승인의 전제였던 「기존 마커 전부 무효화」는 반증됐다(2026-08-17 실측).** 훅은
`.axes_23_passed_{브랜치}_{오늘}.marker` **한 개만** 검증하고 과거 마커 재검증 경로가 없다:
디스크 마커 **190개** 중 커밋이 막히는 건수는 **0**, 실제 비용은 유예일 이후 **51건이 「어느
배열인지 읽을 수 없다」**는 것 — 파손이 아니라 **미측정**이다. 그래서 처방이 「고친다」가 아니라
**「어느 배열인지 말하게 만든다」**(표기 정렬)가 됐다. 이식성은 bash 3.2 + BSD grep, 4개 locale
× 6키 전부 HIT · known-negative 0 으로 선행 실측했다(Linux/GNU grep 은 CI 가 첫 측정).
형식 정본 = `.claude/rules/fh_4axis_gate.md §Marker axis fields` · 픽스처 25레인 =
`scripts/test_marker_axes_run_lanes.sh`.

> **한계 — 인용 전에 읽어라**: **n=1**(한 산출물 · 한 세션 · 한 저자). 축의 «비중복»이 구조적인지
> 그날 우연인지는 **미측정**이다. 축은 **사전 등록되지 않았다**(ⓓ는 세션 도중에 생겼고 그 뒤에
> 무엇을 잡았나를 셌다 — 사후 분류 편향). 분류자는 **실물을 안 봤고** 저자가 쓴 요약 16문장만
> 받았다 — 걷어낸 것은 «출처 지식»이지 «저자의 서술»이 아니다. 비용은 부분 실측(서브에이전트
> 합계 ≈ 1.23M 토큰, 사람 시간 미측정).

#### ⓔ 첫실사용 — 노출 사다리로 확장 (2026-09-04, append-only — 위 표의 정의를 지우지 않는다)

위 표(`| ⓔ 첫 실사용 | 실물 대상 한 건 | 재는 방식(계기의 계기) |`)는 그대로 유효하다 — 이
문단은 **덧붙인다**. 6축 전수 실측(`tracks/_meta/six_axis_review_2026-09-04.md`, 마커 169개)이
ⓔ를 **가장 자주 도는 축**(none 비율 33.7%로 최저 — 즉 가장 자주 채워지는 축)이면서 동시에
정의상 **«실물 한 건(n=1)»에 묶인** 축으로 지목했고, 프런티어 대조
(`tracks/_meta/frontier_verification_map_2026-09-04.md`)는 이를 shadow deployment(요청을
포크해 비교)·canary(단계적 노출 + 자동 롤백)와 견줘 **최대 델타**로 표시했다.

**확장 — 살리언스 의존 자산(규칙·문구·훅 트리거)에 한해, ⓔ는 사다리로 읽는다**:

```
배선(wire)  →  N세션 shadow 관찰(발화·판단 카운트만, 판정 안 함)  →  승격(promote)
```

세션마다 «발화했나 / 무엇을 했나»를 **세기만** 하고, 그 세션에서 옳았는지는 그 자리에서
판정하지 않는다 — 판정(승격 여부)은 카운트가 쌓인 뒤 별도 발화로 이뤄진다. **새 기계는
필요 없다**: `six_axis_review_2026-09-04.md` 판정안 1이 스스로 근거로 든 것처럼, 오늘 이
세션(팔 C)의 F 행 카운트 + 카드 인계 관행이 이미 그 형태를 실물로 갖고 있다 — 세션마다
발화 여부를 세고 다음 세션 카드로 넘기는 것 자체가 shadow 관찰이다.

🟥 **여전히 남는 것 — 사다리는 n=1 을 여러 건으로 부풀리는 장치가 아니다.** N 세션을
관찰해도 그 자체를 판정으로 읽으면 안 된다 — 표본은 그대로 N 이지 «검증 통과»가 아니다.
승격은 사전에 정한 임계(예: N세션 연속 관찰 + 이상 없음)나 운영자 판단으로 별도 이뤄진다.

**마커 표기**: `axes-run` 의 ⓔ 값에 `shadow(N=<세션수>, F=<발화수>)` 형태를 허용한다 —
형식 정본은 `.claude/rules/fh_4axis_gate.md §Marker axis fields`. 🟥 **훅은 무변경이다** —
`validate_first_use_leg` 은 「새 계기가 추가된 커밋인데 ⓔ 가 비었거나 none 인가」만 보고,
비어 있지 않은 값의 형태(«실물 한 건» 산문이든 `shadow(...)`든)는 안 본다. 그 사실 자체가
이 확장이 새 레인 없이 즉시 쓸 수 있는 이유다.



### §1-c — 자기 대조를 **상시 의무**로 만든 근거 (그리고 그 표본의 한계)

`CLAUDE.md` 가 «3층 자기 대조는 상시 의무 · 트리거는 발화가 아니라 자산 접촉» 을 상주로 싣는다.
그 규칙은 여기서 근거를 가져간다. **인용 전에 이 절의 «표본 한계» 를 같이 읽어라** — 규칙 본문은
짧고, 짧은 만큼 근거보다 세게 들린다.

**왜 트리거를 옮겼나**: §1-b ⓓ 의 A/B/C 표가 «자기 스코프가 가장 나빴다» 를 보였고, 그 미스는
**규칙을 몰라서 난 것이 아니다** — 같은 세션이 아침에 규칙을 읽고 저녁에 어겼다. 살리언스는 이미
최대였다. 그러면 처방이 「더 세게 읽어라」가 될 수 없고, 남는 지렛대는 **트리거를 «누가 물었나»
에서 «지금 자산을 건드리고 있다» 로 옮기는 것**이다. 후자는 4축 게이트가 이미 쓰는 트리거라
새 기계층이 필요 없다.

**축보다 컨트롤이 먼저다 (실측 n=4, 2026-08-09 병렬 세션)**:
| | |
|---|---|
| 측정 시도 | 4 |
| **컨트롤 없이 죽은 측정** | **2** |
| 최악 사례 | 컨트롤이 없었으면 *"운영자 발화 **30건** 전건 미착지"* 로 보고할 뻔했다 — **실제는 전건 착지** |

> 🟥 **이 표의 「30」은 정정본이다 — 초판은 `39` 였고 그것도 계기 결함이었다** (2026-08-09,
> 원 측정 세션이 격리 재측정으로 자진 철회). `type=user` 442건을 `origin.kind` 로 완전 분할하니
> **human 30 · peer 메시지 6 · task-notification 3** 이었다 — 파서가 `type=user` 를 사람 발화로
>읽었는데 **다른 AI 세션이 보낸 메시지와 시스템 알림이 같은 타입·같은 문자열 content** 라 섞여
> 들어왔다. **랜덤 오차가 아니라 범주 오류**이고, 나쁜 쪽은 커버리지가 30% 부풀려지는 것보다
> **AI 발화와 사람 의도가 한 통에 섞이는 것**이다.
> **방향은 살아남았다** — 30건도 전건 착지다. 죽은 것은 **분모**다.
> ★ **이 정정 자체가 이 절의 논거다.** 「컨트롤이 잡았다」던 사례의 분모를 잡은 것은 컨트롤이
> 아니라 **격리 재측정**(ⓒ 기록 그라운딩)이었다 — 축이 서로를 대체하지 못한다는 §1-a 의 주장이
> 자기 근거 위에서 한 번 더 성립했다.
> ⚠️ **전파 경계**: 이 값은 `CLAUDE.md` 상주 블록에는 **실려 있지 않다** — cross-family 지적으로
> 상주를 31줄→14줄로 줄일 때 사례가 빠졌기 때문이다. 축약이 오염 범위를 좁혔다(의도한 효과는
> 아니었다). 원장·PR 본문 등 다른 표면에 `39` 가 남았는지는 **표면별로 확인해야 한다**
> (`[[feedback_half_fix_propagation_boundary]]`).
> 🟡 **`n=4` 는 그 시점 값이다.** 원 측정 세션이 이후 더 늘었다고 보고했으나 **이 문서는 그
> 수치를 검증하지 않았고, 그래서 싣지 않는다** — 검증 전 인용이 방금 정정한 그 경로다
> (Instrument-Calibration §publish-order: *"publish = 어떤 형태로든 처음 말한 순간"*).

죽은 것은 대상이 아니라 **세는 줄**이었다(`[[feedback_absence_measurement_needs_control]]`).
그래서 규칙은 「4축을 돌려라」가 아니라 **「축을 돌렸다의 최소 증거 = 컨트롤이 살아 있는 실행
출력」** 을 요구한다. 축을 늘리는 것보다 각 축이 살아 있는지 보는 것이 먼저다.

**🟥 표본 한계 — 규칙이 이 표본보다 넓게 적용된다**

| 주장 | 표본 | 적용 범위 |
|---|---|---|
| 자기 스코프가 가장 나쁘다 | **세션 1개** (§1-b ⓓ) | 모든 FH/PMH 자산 변경 |
| 컨트롤 없는 측정이 절반 죽는다 | **n=4**, 한 세션 | 모든 축, 모든 install |
| 자평은 자력 적발률 0 | **분모 없는 관측** | 규칙 전체의 최약점 판정 |

이 비대칭은 cross-family 리뷰(2026-08-09, codex)가 지목한 것이고 **닫히지 않았다.** 규칙을 유지하는
근거는 표본 크기가 아니라 **비용 비대칭**이다 — 대조를 한 번 더 도는 비용은 작고, 안 돌아서
설계가 4라운드 뒤에 반증되는 비용은 크다. 표본이 커지면 이 절을 갱신하라.

**🟥 안 닫힌 것 셋** — 규칙 본문에도 그대로 적혀 있다.
- **자평이다.** 지금 기계 앵커가 붙는 축은 **ⓓ 뿐**이다(되돌려서 적색인지는 실행 결과다).
  ⚠️ 다만 이것은 **현 상태이지 원리적 한계가 아니다** — ⓐ(구현)는 테스트로, ⓒ(주장)는 출처
  검사로 기계화할 수 있다(codex 지목). 「ⓓ만 가능」으로 읽지 마라.
- **게임 가능하다.** 축을 임의로 고르고 「안 고른 이유」만 적으면 형식은 충족된다. 최소 증거
  요구가 그 폭을 좁히지만 없애지 못한다.
- **훅이 없다.** 트리거가 *의도*라 커밋 훅이 못 잡는다. 재발 실측이 기계화 임계 미만이라
  **일부러 안 지었다**(`[[feedback_mechanize_at_repetition_prose_before]]`).

닫는 방향은 **cross-family 가 그 마커를 읽는 것**이다. 세션이 자기 채점을 더 성실히 하는 것은
같은 축이라 구조적으로 못 잡는다(`[[feedback_citing_a_rule_is_not_obeying_it]]`).

---

## §2 — 4대 엔진 (그 능력)

게이트 표의 `engine` 열이 **이미 이 넷을 기계적으로 들고 있었다** — 이 문서는 그것에
이름을 붙인 것이지 새 이론이 아니다.

| 엔진 | 게이트 표기 | 받치는 정체성 |
|---|---|---|
| **영혼(심지)** | `judgment-circuit` | ⑤ 증폭자 · ② 인큐베이터 |
| **품질 게이트** | `ship-gate` | ③ 거버넌스 게이트 |
| **맥락 유지** | `context-continuity` | ① 클러스터 · ② 인큐베이터 |
| **질문하기** | `external-grounding` | ④ 프런티어→조직 전파 |

- **영혼 = 정체성 선언이 아니라 판단의 좌표계**다(무엇이 성공 · 어디로 기움 · 범위 밖 ·
  절대 안 함). 페르소나 선언은 **v2a 팔(12런)** 실측에서 **약모델 순손실**이므로 넣지 않는다(🟥 이 발견은 2×2 팩토리얼 81런이 아니라 `CORE IDENTITY` 절만 제거한 **12런 단일변수 팔**의 것이다 — 「105런 실측」으로 부르면 근거를 9배 부풀린다).
  형식 검사기: `scripts/judgment_circuit_lint.sh`.
- **영혼은 한 번에 안 만들어진다** — FH 는 **씨앗 초안**만 주고, 실제로 채워지는 것은
  현장 하네스가 사용자에 의해 무수히 사용되면서다. 등급 대응:
  **씨앗 출하 = 🔵 RC · 사용 축적 = 🟢 REALIZED**.
- **질문하기 ↔ external-grounding 은 같은 것의 양면**이다: 밖에 묻는다 = 밖에 근거를 둔다.
  ⚠️ 이 엔진의 **수용 절반이 비어 있다** — 묻는 경로는 있고 *들어온 통찰을 자산화하는*
  경로가 약하다(`[[feedback_operator_insight_must_become_asset]]`).

---

## §3 — 정체성 (방법론 × 코어가 맞물려 나타나는 능력 — 5대는 단련된 실물과 등급을 가진 안정 정체성)

**등급 표의 정본은 `ship_readiness_gate.md` 다.** 여기 중복해서 적지 않는다 —
두 곳에 같은 등급을 두면 반드시 한쪽이 stale 이 된다(2026-08-09 에 그 결함을 실제로
세 번 겪었다: 표만 고치고 요약 안 고침 → 요약만 고치고 등급 칸 안 고침).

| # | 정체성 | 사람이 얻는 것 |
|---|---|---|
| ① | 하네스 클러스터 | 한 태스크를 여러 하네스에 태우고 그 사이에서 거버넌스가 계산된다. 하위 기제 **크로스하네스** = 없는 능력을 호출해 쓰고, 지어야 할 것이 보이면 흡수한다 |
| ② | 프로젝트 인큐베이터 | 새 하네스가 **태어난 자리에서 걷는** 상태로 나온다 |
| ③ | 거버넌스 게이트 | 못 나갈 것이 기계적으로 막힌다 |
| ④ | 프런티어→조직 전파 | 바깥에서 온 것이 조직 안까지 착지한다 |
| ⑤ | 증폭자 | 짧은 의도가 최종 산출물까지 벼려진다 |

**등급 어휘**: `🔴 이상론` → `🟡 부분` → `🔵 RC`(실험실에서 섰다) → `🟢 REALIZED`(밖에서 걸었다).
**RC 는 구현 성공이면 된다** — 문턱을 높이지 마라. 🟢 는 실사용 축적을 요구한다.

### §3-a — 정체성은 **별도 층이 아니라 스킬·에이전트에 퍼져 있다** (운영자, 2026-08-09)

> *"5개 요소는 자연스럽게 스킬과 에이전트를 포함한 하네스 자체 기능으로 퍼져 있는 것"*

이건 정체성이 스킬 위에 **덧씌운 분류**가 아니라, **스킬이 뭉치는 모양의 이름**이라는 뜻이다.
§2 에서 게이트의 `engine` 열이 이미 4엔진을 들고 있었던 것과 같은 형태 — 있는 것의 이름이다.

**그리고 이 관점은 공짜로 검출기 하나를 준다**: 어느 정체성에도 안 붙는 스킬 =
**미배정(unmapped) 유닛**이다. ⚠️ **「고아(orphan)」라고 부르지 마라 — 이 저장소에서 그 단어는
이미 기계화된 다른 뜻이고, 그 뜻도 하나가 아니다**: ① **참조-고아** — 인바운드 참조 0
(`harness-doctor` SKILL.md §Step 5 「orphan page」 → R-tier · `phantom-quench` 역방향 검사 ·
`harvest-loop` INDEX/FILE-ORPHAN) ② `harness-doctor` L2 상주 원장의 `orphaned/decorative` —
트리거/백스톱 없는 **상주 섹션**(참조와도 정체성과도 무관한 제3의 용법). 미배정은 **분류
문제**고 참조-고아는 **삭제 후보**라 처방이 정반대인데, 어휘를 합치면 다음 세션이 「정체성
미배정」을 「참조 0」으로 읽어 멀쩡히 배선된 스킬을 R-tier 로 렌더한다 (2026-08-10 스크리너
실측: 위 저항 3종 전부 인바운드 참조 보유 — 명령:
`grep -rn "token-budget-gate\|mcp-circuit-breaker\|video-ingest" CLAUDE.md knowledge/ plugins/`.
단 grep 스크리너 수준이고 ⓓ 되돌림 실측은 미실시, 참조 있음 ≠ 배선됨). `CLAUDE.md §Identity`
의 적신호 문장(*"red flags are orphaned, redundant, and decorative units"*)은 orphaned 를
**정의하지 않는다** — 이 문서는 그 단어를 이미 기계화된 참조-0 쪽에 **고정한다**(원문 독해가
아니라 어휘 결정이다). 정체성 매핑은 분류가 아니라 **자산 감사 계기**다.

🟡 **전수 대응은 미측정이다 — 눈으로 배정하지 마라.** 실측 규모는 **스킬 38 · 에이전트 8**
(2026-08-09). 명확한 것도 많지만 **실제로 저항하는 항목이 있다**: `video-ingest`(⑤ 증폭자인가
④ external-grounding 인가) · `mcp-circuit-breaker` · `token-budget-gate` — 인프라성이라
다섯 중 어디에도 자연스럽게 안 붙는다. 그 저항이 **고아 신호일 수도, 분류 축이 모자란
신호일 수도** 있고, 둘은 처방이 정반대다. 손으로 배정해 표를 채우면 그 구분이 사라진다.

**다음 세션 후보(미착수)**: 스킬별 정체성 선언을 frontmatter 로 받고 미선언·미분류를
세는 검사기. 선언은 저자가 하고 계기는 **세기만** 한다 — 계기가 분류를 대신 하면
`[[feedback_not_found_is_not_zero_family]]` 로 되돌아간다. 합법값에
**`identity: n/a — run-facing`** 을 포함하라 — 위 저항 3종은 사용자의 *일*이 아니라 **런 그
자체**(비용 · 도구 건강 · 입력 채널)를 다루는 자산이라, «사람이 얻는 기능»을 값역으로 갖는
정체성 축의 **대상 밖**이다(§0 의 정의상 — 얻는 게 아니라 안 죽게 하는 것).
이 값이 없으면 계기가 미배정을 0으로 렌더한다.

⚠️ **⑤ 의 🟢 는 범위 한정 가능성이 열려 있다**(2026-08-09 관찰, 미반영): 그 근거가 전부
*"사용자 산출물"* 대상에서 측정됐고, `⑤ × 하네스 자신` · `⑤ × 낳는 하네스` 는 미측정이다.
등급을 내리자는 게 아니라 **무엇에 대해 초록인지 명시하자는 것**이며, 등급 관련이라
**운영자 확인 후** 반영한다.

---

## 4. 이 문서가 하지 않는 것

- **등급 판정을 하지 않는다** — `ship_readiness_gate.md` 가 정본이다.
- **4축을 매번 다 돌리라고 하지 않는다** — 축은 실패 모드에 맞춰 고른다.
- **3층이 깔끔한 계층이라고 주장하지 않는다** — §0 의 자기참조 절을 반드시 같이 읽어라.
