@chrono-meta/fh-gate 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -370,3 +370,93 @@ sessions (no FH asset modification) never see this notice — the Sonnet default
370
370
  > `knowledge/shared/harness-core/capability_escalation_consent.md` — the negotiated-consent protocol
371
371
  > (UAP `sidecar_consent`/`floorup_consent`) that decides ask-once vs. no-surprise floor-up/sidecar use.
372
372
  > This notice is the passive advisory; that doc is the active escalation gate.
373
+
374
+ ---
375
+
376
+ ## §Version-Digit-Policy — 어느 자릿수를 올리나 (CLAUDE.md §Session-Close ④-b 상세)
377
+
378
+ > **왜 여기 있나**: 이 판단은 **버전을 올릴 때만** 필요하다 — 매 세션 마감이 아니다.
379
+ > CLAUDE.md 는 규칙(3값 + 판별자 + `BREAKING (gate):` 의무)만 상주로 갖고, 아래 근거·판례를
380
+ > 여기서 읽는다. salience-split 2026-08-21.
381
+
382
+ 🟥 **WHICH DIGIT — operator decision 2026-08-17, and it is deliberately NOT strict semver.**
383
+ There was no policy before this line, which is why one session proposed three different bumps
384
+ for the same delta on three different (and each individually defensible) grounds. Decide by
385
+ **what the number tells a reader**, not by whether anything technically broke:
386
+
387
+ | Bump | Reserved for (operator's own wording, 2026-08-17) |
388
+ |---|---|
389
+ | **major** `+1.0.0` | **any one of three**: ⓐ **완전히 새로 지음** — rebuilt from scratch, not extended · ⓑ **정체성이 확립됨** — 🟥 **다섯이 «전부» 🟢** 인 순간이지 하나가 🟢 로 올라선 순간이 아니다(운영자 결정 2026-08-21). 초판은 *"an identity of the five … actually standing 🟢"* 였고 **「하나만 초록이어도 major」로 읽혔다** — 실제로 그날 ②가 🟢 로 판정되면서 3.0.0 후보로 올라왔고, 그 애매함이 그때 닫혔다. 🟥 그리고 **정체성 등급은 npm 이 나르는 신호가 아니다** — 그건 `identity-v*` 계보의 사건이고, npm 이 또 나르면 같은 날 고친 「두 계보 한 이름」 결함을 번호에서 재생산한다. ⇒ major-ⓑ 는 **`identity-v1.0.0` 과 같은 사건**을 가리킨다 · ⓒ **기능이 혁신적으로 변경되거나 늘어남** — a capability *class* appears or is replaced, not a capability instance. 🟥 **Never** for tightening a gate that already existed |
390
+ | **minor** `+0.1.0` | 미들급 — new assets, new gate lanes, doctrine that changes behavior; **including changes that break a consumer's gate acceptance**, which then carry a mandatory `BREAKING (gate):` line |
391
+ | **patch** `+0.0.1` | 트리비아급 — fixes, wiring, docs that change no behavior |
392
+
393
+ **The discriminator between major-ⓒ and minor**: *class* vs *instance*. A sixth Wave-1 attack
394
+ angle is an instance → minor. An attack-angle **registry** where none existed is a class → major.
395
+ Today's delta is instances and tightenings throughout, which is why it is 2.1.0 and not 3.0.0
396
+ even though it breaks a gate acceptance.
397
+
398
+ **Why gate-tightenings are minor here, stated so it is not mistaken for hiding a break**: what
399
+ breaks is the **record format of a gitignored local marker**, not an API or the consumer's code;
400
+ the hook prints exactly what to write instead; and the blast radius needs the consumer to have
401
+ installed the hook AND be making a load-bearing change AND have used the specific old form.
402
+ Against that, strict semver would burn a major on every gate we tighten — this repo took 2.0.0
403
+ for a publish-freshness gate one day and would have taken 3.0.0 for a commit gate the next.
404
+ **A major number that arrives monthly stops meaning anything**, and the milestone it should be
405
+ reserved for would have no word left.
406
+
407
+ ⚠️ **The condition that makes this honest, and it is not optional**: a minor that breaks gate
408
+ acceptance MUST carry `BREAKING (gate): <what now blocks> — <the one-line remedy>` in the
409
+ release description AND the CHANGELOG. Without it this policy is just burying breaks in minors.
410
+ **Applies from 2026-08-17 forward, not retroactively** (2.0.0 was the same class and is left
411
+ as-is rather than rewritten).
412
+
413
+ ---
414
+
415
+ ## §Branch-Protection-Two-Layers — 서버측 보호의 2층 구조와 세 번의 오판
416
+
417
+ > CLAUDE.md 는 결론만 상주로 갖는다: **통합 브랜치는 PR 전용 · 하드 플로어는 서버측 ·
418
+ > 브랜치 표면을 판정하려면 두 API 를 **모두** 읽어라.** 아래는 그 근거와, 한쪽만 읽어서
419
+ > 세 번 오판한 기록이다. salience-split 2026-08-21.
420
+
421
+ > **Two layers, and which one is the floor**: the **hard floor is server-side** — this repo now runs
422
+ > `enforce_admins: true` with `required_approving_review_count: 0` (set 2026-07-20; the count must be
423
+ > `0`, because enabling `enforce_admins` while it is `1` locks a solo operator out of merging their
424
+ > own PRs — self-approval is impossible). The hook is the **shift-left layer**: it fails at push time
425
+ > and prints the actual remedy, and it keeps holding if the server setting is ever relaxed. It is
426
+ > deliberately not the floor — a client-side hook is bypassable with `--no-verify`.
427
+ > *Origin*: before that change the server had `enforce_admins: false`, so an admin push *satisfied*
428
+ > the rule and merely printed `Bypassed rule violations` — a notice, not a block. A rule that
429
+ > announces its own bypass is not a floor.
430
+ > ✅ **Retraction — the server-side force-push surface is CLOSED, and the way it was misread is the
431
+ > durable part.** An earlier version of this block said `allow_force_pushes` on `main` was "still
432
+ > `true`", that two API writes "did not persist", and that the **server-side** history-rewrite
433
+ > surface therefore "remains open". The field reading was correct; the conclusion was not.
434
+ > **Branch protection is two independent layers — legacy protection and rulesets coexist, and the
435
+ > strictest wins** — so a field on the protection object is never the effective answer by itself.
436
+ > Measured on this repo 2026-08-09: `GET /repos/{owner}/{repo}/rules/branches/main` returns
437
+ > `non_fast_forward` from ruleset `main-no-force-push` — `enforcement: active`,
438
+ > `current_user_can_bypass: never`, `bypass_actors: []`, live since 2026-07-25 — while the legacy
439
+ > object still reports `allow_force_pushes: true`. The two API writes that "did not persist" were
440
+ > writing to the layer that does not govern *this* outcome while the stricter ruleset is active — not
441
+ > a layer that is inert in general: disable or retarget the ruleset and the legacy toggle governs
442
+ > again. **Read BOTH layers before declaring any branch surface open or closed** — `/rules/branches/
443
+ > {branch}` shows only what the *rulesets* impose, and `/branches/{branch}/protection` only what
444
+ > *legacy protection* imposes; neither is the effective view alone. A protection-object field read by
445
+ > itself misjudged this three times ([[reference_github_protection_two_layers]]).
446
+ > **Scope of the retraction, stated narrowly on purpose**: it covers *force-push / non-fast-forward*,
447
+ > which is what `non_fast_forward` blocks. Branch **deletion** is a separate rule and is closed on the
448
+ > other layer (`allow_deletions: false`, same GET). PR-routing is likewise a different field —
449
+ > `required_pull_request_reviews` present with `enforce_admins: true` — not something
450
+ > `required_status_checks` says anything about.
451
+ > ⚠️ A *different* residual on `main` is still real and must not be folded into the one just
452
+ > retracted — but the residual's own description was itself stale and needed correction on
453
+ > 2026-08-12 (live re-check, `[[reference_github_protection_two_layers]]`): legacy
454
+ > `required_status_checks.contexts` is **`["validate"]`**, not `[]` — a green `validate` check IS
455
+ > required before a PR can merge, and `GET /rules/branches/main` carries no competing
456
+ > `required_status_checks` rule, so the legacy field is the effective one here. `validate`
457
+ > (`.github/workflows/validate.yml`) is a **separate job from Axis 1** (`regression-guard.yml`) —
458
+ > Axis 1 is still not required, see the 4-axis section below. The gap on `validate` is
459
+ > `strict: false`: that check re-runs on every push to the PR branch, but nothing re-forces it
460
+ > against a **moving** main after it last ran — so a check that passed can still land behind
461
+ > concurrent merges it never saw.
462
+
@@ -103,3 +103,78 @@ dd if="$V" bs=1 skip=$off count=420 2>/dev/null | tr -d '\0'
103
103
  - Whether any **operator-config** key gates the constant is unmeasured; only text-absence was checked.
104
104
  - What ① (client-data) actually carries in this environment was not inspected — only that it takes
105
105
  precedence.
106
+
107
+ ---
108
+
109
+ ## §Hook-Floor-Unverified — 「어느 방향도 훅으로 안 막힌다」의 실측 근거
110
+
111
+ > CLAUDE.md §Agent Dispatch 는 결론 한 줄만 상주로 갖는다. 아래가 그 근거·미검증 항목이다.
112
+ > salience-split 2026-08-21.
113
+
114
+ ⚠️ **Neither direction has a confirmed hook-level floor. Say that plainly rather than implying one.**
115
+ ```
116
+ opening salience only for the POSTURE. The prohibition met in the field is CONDITIONAL,
117
+ which changes what "override" even means — see the measured block below.
118
+ blocking ALSO not hook-enforced. `SubagentStart` fires on spawn but is **context-only** —
119
+ it cannot block, exit 2 only surfaces stderr, and it has no decision field
120
+ (official hooks reference, read 2026-08-08). It can INJECT context at the moment
121
+ of dispatch, which is better-placed salience than this file, but still salience.
122
+ UNVERIFIED whether a `permissions` deny entry or a `PreToolUse` matcher can target subagent
123
+ spawning at all — the reference does not name a tool for it, and this repo has no
124
+ precedent. **Do not cite a blocking mechanism until someone runs the known pair**
125
+ (configure the deny, attempt a dispatch, observe). Until then: unverified, not absent.
126
+ ```
127
+
128
+ ## §Retraction-SubagentStart — 이 블록이 두 번 틀렸던 기록
129
+
130
+ An earlier draft of this very block asserted "a `SubagentStart` hook can deny, and a denial there is a
131
+ real floor." That was false, taken on trust from an adjacent session and written here before the
132
+ reference was read. A second draft, on 2026-08-09, then wrote that the constant's call site "needs
133
+ binary inspection, which was blocked" — **also false**: three plain `grep` calls resolved it, and an
134
+ adversarial reviewer demonstrated that by doing it. Declaring something unmeasurable before trying the
135
+ cheap tool is [[feedback_impossible_verdict_may_be_unread_half]]; the honest label is *"not yet
136
+ measured,"* never *"blocked."* A blind target-tier sim then read it back correctly — which shows a sim measures
137
+ whether text is *followable*, never whether it is *true*. Both checks are needed; neither substitutes.
138
+
139
+
140
+ ## §Worktree-Gate-Integrity — `core.hooksPath` 양팔 실측 (2026-08-05)
141
+
142
+ > 🟥 **운영 규칙은 CLAUDE.md 에 있다**: *워크트리에서 FH 자산을 커밋하지 않는다.*
143
+ > 아래는 그 규칙이 왜 조건부 사실 위에 서 있는지의 근거이고, **규칙을 실행하는 데는 필요 없다** —
144
+ > 「내 설치가 어느 팔인가」를 따져야 할 때만 읽어라. salience-split 2026-08-21.
145
+
146
+ **Fourth reason — gate-integrity in a worktree, and the answer is CONDITIONAL on how `core.hooksPath`
147
+ was set (measured 2026-08-05, both arms).** Do not carry a single verdict here; the two installs
148
+ behave differently:
149
+
150
+ | `core.hooksPath` | Which hook actually runs in a worktree | Consequence |
151
+ |---|---|---|
152
+ | **relative** — `templates/.git-hooks`, the form every FH doc installs (`CHEATSHEET.md`, `.claude/rules/fh_4axis_gate.md`, `install-wizard`, `self_evolution_routine.md`) | the **worktree's own copy** | Editing that copy *inside the worktree* disables the gate for that worktree — measured: neutralized hook → FH-asset commit with no marker succeeded (`rc=0`). The verifier becomes the verified, and the edit is invisible to `git status` in the main tree. |
153
+ | **absolute** — a hand-set full path (this operator's machine; **not** what any doc tells you to run) | the **main tree's copy** | A worktree-local edit has no effect; a known-positive is blocked there exactly as in the main tree (`rc=1`). |
154
+
155
+ An earlier draft of this section reported only the absolute-path arm and declared the
156
+ "worktree bypasses the gates" hypothesis *refuted* — from **n=1 on a non-canonical setting**, with a
157
+ do-not-revisit label attached. The relative-path arm, which is what everyone else runs, reproduces
158
+ the bypass. Freezing a conclusion is a defect when the measurement did not cover the shipped
159
+ configuration.
160
+
161
+ 🟥 **RETRACTED 2026-08-22.** This said the marker and manifest are *structurally absent* in a
162
+ worktree. They are not: `templates/.git-hooks/pre-commit` resolves evidence through
163
+ `git rev-parse --git-common-dir`, which returns the **main tree's** `.git` from inside a worktree.
164
+ Measured in a clean worktree with the known-negative established first (its own `tracks/` = skeleton
165
+ only; `$REPO_ROOT/tracks/_meta/edit_manifest.yaml` NOT FOUND, `$EVIDENCE_ROOT/...` FOUND — the two
166
+ roots disagree, so the probe discriminates).
167
+ **The operating rule is UNCHANGED: do not commit FH assets from a worktree.** Its remaining **open risk areas** — not
168
+ established grounds — are marker provenance, concurrent manifest append, and a copy of `tracks/` that
169
+ appears in a worktree from an unattributed source. They are **deliberately not enumerated as reasons
170
+ here**; an earlier draft enumerated
171
+ them and adversarial review found a defect in nearly every added claim. ⚠️ **Reachable is not automatic**: the hook *reads* `$EVIDENCE_ROOT`, but a
172
+ worktree session writing by relative path lands in the worktree's own `tracks/`, not the main tree's.
173
+ The gate is satisfiable — its failure message prints the absolute `MARKER_DIR` to write to — but the
174
+ routing is the author's job, not the tool's.
175
+ ⚠️ The `core.hooksPath` two-arm table above is a separate axis (hook substitution) and is untouched.
176
+ One observation from the retracted paragraph survives on its own: note the
177
+ hook itself prints `mkdir -p …/tracks/_meta` on that failure, i.e. the actor's own error message
178
+ teaches the marker-creation path — so "just don't fabricate it" is prose sitting under a machine
179
+ instruction pointing the other way.
180
+
@@ -50,8 +50,12 @@ tags: [canon, three-layer, engines, identity, verification-axes]
50
50
  ```
51
51
  ① 초기 영혼 심지(판단 회로)를 먼저 심는다. 무엇이 성공 · 어디로 기움 ·
52
52
  범위 밖 · 절대 안 함
53
- ② 중간 탈상관 가속화 축을 골라 동시에 친다. **곱하지 말고 골라라** — 병렬화 자체엔
54
- 방향이 없다(축은 판단 회로가 고른다)
53
+ ② 중간 **병렬 탈상관** 가속화
54
+ 다이얼을 **각각** 돌린다 — 곱하지 말고 골라라.
55
+ **탈상관** ← 사각 위험에 반응. **모델 탈상관**(ⓐ 계열) +
56
+ **입장 탈상관**(ⓑ 대상 하네스의 정본·레포)
57
+ **병렬** ← 표면 크기에 반응(한 컨텍스트에 담기나). fan-out
58
+ 병렬화 자체엔 방향이 없다 — 축은 판단 회로(①)가 고른다
55
59
  ③ 마무리 6축 태우기 §1-a-2 의 여섯 축으로 태운다. **적대검증 하나가 아니다**
56
60
  ```
57
61
 
@@ -176,6 +180,21 @@ measurement_needs_control]])에 있다. 표본이 지지하는 건 "바깥 하
176
180
  `fh_signal_2026-08-07_shift-left-governance` §④ 의 *"뒷단 부하는 앞단 부재의 함수다"* 와
177
181
  같은 명제이고, 이 괄호가 그것을 ②의 정의 안으로 넣는다.
178
182
 
183
+ 🟥 **이름이 손실 압축돼 있었다 — 2026-08-21 에 운영자가 잡아 복원했다.** 바로 위 원발화는
184
+ **「병렬 탈상관 가속화」**인데, 요약줄(§0)과 `CLAUDE.md` 는 **「병렬」을 떨어뜨린 채** 8월 내내
185
+ 「탈상관 가속화」로 실려 있었다. 그러자 이름이 다이얼 **하나만** 부르게 되고, 읽는 쪽에서
186
+ *"이거 그냥 서브에이전트 병렬 아니냐"* 가 나온다 — 실제로 운영자가 그 질문을 던져서 발견됐다.
187
+ **자력 적발 0.**
188
+
189
+ 🟥 **그리고 「다양성」으로 부르지 않는다 — 검토했고 기각했다(운영자 결정 2026-08-21).**
190
+ 다양성은 **리뷰어 집합**의 성질이고 탈상관은 **입력**의 성질이다. 같은 diff 를 세 계열에 주면
191
+ *다양하되 상관돼 있고* 사각은 그대로 남는다 — §1-a-2 의 판별 명제(«무엇을 받았는가»)가 정확히
192
+ 그것을 막는 문장이다. 「다양성」으로 부르면 *"모델 세 개 썼으니 됐다"* 가 통과한다. 실측:
193
+ **이 문단을 쓰기 전** 기준으로 이 파일 · `field_verdict_crossfamily_gate.md` · `CLAUDE.md` 에서
194
+ 「다양성」 **0건**이었고, 그건 우연이 아니라 이 구분을 지키느라 안 쓴 것으로 보인다.
195
+ 🟥 **스코프를 명시하는 이유**: 지금은 이 문단 자신이 그 단어를 쓰므로 같은 grep 이 히트한다.
196
+ 스코프 없는 부재 주장은 자기 자신이 반례가 된다(cross-family 지목, 자력 적발 0).
197
+
179
198
  ⚠️ **가속화 ≠ shift-left.** 앞당기는 것과 탈상관하는 것은 다른 축이다. 오늘은 둘이 같이
180
199
  갔을 뿐이고, 한 문장으로 묶으면 *"병렬로 돌렸으니 앞당긴 것"* 이라는 오독이 나온다.
181
200
 
@@ -251,11 +270,27 @@ measurement_needs_control]])에 있다. 표본이 지지하는 건 "바깥 하
251
270
  |---|---|---|
252
271
  | ⓐ 다른 계열 | diff + 저자의 프레이밍 | 구현 |
253
272
  | **ⓑ 입장** (신규) | diff + **대상 하네스의 정본** | **인용한 규약이 정말 그런가** |
254
- | ⓒ 격리 그라운딩 | 저자가 쓴 문장 + 지금의 트리 | 주장 |
273
+ | ⓒ 격리 그라운딩 | 저자가 쓴 문장(**사후 주장 및 사전 선언**) + 지금의 트리 | 주장 · **델타가 선언한 것과 안 맞음** |
255
274
  | **ⓓ 3자 대면** (신규) | 문제 + **남의 코드베이스** | **이미 풀린 문제 아닌가** · 내 변경이 남의 레포를 어디서 만지나 |
256
275
  | ⓔ 첫 실사용 | 실물 대상 한 건 | 재는 방식(계기의 계기) |
257
276
  | ⓕ 되돌림 실측 | 배선을 지운 트리 | 앵커 |
258
277
 
278
+ 🟥 **ⓒ 행은 2026-08-21 에 넓어졌고, 이 정본은 그날 안 따라왔다.**
279
+ ⚠️ **초판은 여기 「8일간」이라고 적었는데 그건 지어낸 숫자다** — `db8e72a` 는 **같은 날
280
+ 15:45:09 +0900** 이라 실제 지연은 몇 시간이고, 자력 적발 0(cross-family 가 커밋 날짜를 대조해
281
+ 반증했다). 짧다고 덜 나쁜 것은 아니다 — **길이가 아니라 「기계가 갱신될 때 정본이 같은 PR 에
282
+ 안 들어갔다」가 결함**이고, 그 성질은 지연이 1시간이든 8일이든 같다. 숫자를 크게 잡아 심각성을
283
+ 빌려온 형태라 그대로 남긴다. `templates/.git-hooks/pre-commit:1186` 이 이미 *"⇒ ⓒ's 「받는 것」 widens to «저자가 쓴
284
+ 문장(사후 주장 및 **사전 선언**)»"* 라고 선언하고 `soul-check:` 레인까지 돌고 있는데(PR #481,
285
+ `db8e72a`), 그 PR 이 바꾼 파일 셋(`selfcheck.sh` · `test_marker_soul_check_lanes.sh` ·
286
+ `pre-commit`)에 **이 파일이 없었다.** 그래서 이 절 전체에서 `사전 선언` grep 이 **0건**이었다 — 🟥 **이 문단을 쓰기 전 기준이다.**
287
+ 지금은 이 문단 자신이 그 문자열을 여러 번 쓰므로 같은 grep 이 히트한다. 스코프를 안 적으면
288
+ 자기무효 측정이 된다(cross-family 지목).
289
+ `[[feedback_half_fix_propagation_boundary]]` 이고, 방향이 뒤집힌
290
+ `[[feedback_rule_misdescribes_its_own_machine]]` 이다 — 보통은 규칙이 없는 기계를 주장하는데
291
+ 여기서는 **규칙이 있는 기계를 안 적었다.** 발견자는 병렬 피어 세션(하네스닥터)이고 **자력 적발
292
+ 0** 이다 — 위 §피어 절이 말한 ⓑ∪ⓓ 가 실제로 낸 첫 수확이다.
293
+
259
294
  **저자 자평을 걷어낸 자리**: 발견 16건을 **출처를 지운 채** 봉인된 정답키와 함께 **레포 밖 cwd·
260
295
  헤드리스**로 다른 계열 분류자 **둘**에게 독립 판정시켰다. 채점 11/15 · 12/15, 상호 일치 13/15(87%),
261
296
  사전 등록한 반증 조건(일치율 50% 미만) 미발동.
@@ -271,6 +306,45 @@ measurement_needs_control]])에 있다. 표본이 지지하는 건 "바깥 하
271
306
  다른 축으로 넘어갔다). 반대로 「남의 레포가 과거에 폐기한 규칙」은 **도구로도 못 가져온다** —
272
307
  그 프로젝트의 리뷰 이력에 접근할 이유가 없기 때문이다. 거기가 ⓓ가 남는 자리다.
273
308
 
309
+ #### 피어 세션은 새 축이 아니라 ⓑ∪ⓓ 의 변형이다 (2026-08-21, 운영자 결정)
310
+
311
+ > **운영자**: *"피어논의는 입장리뷰+3자대면의 변형이지않을까"*
312
+
313
+ 같은 하네스에서 갈라져 나온 **병렬 세션**의 판정을 어디에 적을지가 열려 있었다(신호:
314
+ `tracks/_meta/fh_signal_2026-08-21_peer-axis-canon-claim.md`). 결정은 **7번째 축 아님** —
315
+ ⇒ **마커 `axes-run` 배열 변경 없음**(기존 마커 전량 무효화라는 가장 비싼 결과를 피했다).
316
+
317
+ 위 표의 판별자(«무엇을 받았는가»)로 대조하면 둘 다 맞는다:
318
+ - **ⓑ 입장** — 피어가 낸 S-1 이 정확히 *"인용한 규약이 정말 그런가"* 였다(rc 계약을 인용해
319
+ 놓고 주 진입점이 그 계약을 안 썼다).
320
+ - **ⓓ 3자 대면** — 같은 날 사고 둘이 문자 그대로 *"내 변경이 남의 레포를 어디서 만지나"* 였다.
321
+
322
+ 🟥 **«변형»은 전달 방식이 아니라 «관점 자체»다 — 이 절의 초판이 그걸 틀렸고 운영자가 정정했다.**
323
+
324
+ > **운영자**: *"동일 하네스에서 분화한 세션이라도 **그 세션으로 뜨거워진 지점에서는 다른 양상과
325
+ > 관점을 지니게 된다. 그 세션만큼은 두 얼굴이 생기는거다.**"*
326
+
327
+ 초판은 *"받는 «것»은 같고 받는 «방식»이 다르다"* 라고 적었는데 그건 열화다. **뜨거워진 지점에서
328
+ 그 세션은 진짜로 다른 입장이고 진짜로 남의 코드베이스 자리다.** 그래서 ⓑ∪ⓓ 로 갈리는 것이지
329
+ «내용은 같은데 배달이 다른» 것이 아니다.
330
+
331
+ **그리고 이 정정이 운용 규칙을 바꾼다** — 초판대로면 안 나왔을 규칙이다:
332
+ ```
333
+ ✅ 피어에게 물을 때는 그 피어가 «뜨거워진 축»을 물어라 — 거기서만 두 번째 얼굴이 있다
334
+ 🟥 뜨겁지 않은 축에서 피어는 나와 같은 얼굴이다 — 물어도 탈상관이 안 된다(같은 사각)
335
+ 🟥 서브에이전트·내 재독으로 대체 불가다. 두 번째 얼굴은 «그 세션이 실제로 그 일을 한 것»
336
+ 에서만 나오지, 프롬프트로 만들어지지 않는다
337
+ ```
338
+ `[[feedback_decorrelation_axis_matches_failure_mode]]` 의 피어 판본이다 — 축은 계열만이 아니라
339
+ **«그 세션이 무엇으로 뜨거워졌나»**로도 갈린다.
340
+
341
+ **기록 규약**: 피어 판정을 근거로 쓸 때 `axes-run` 은 `ⓑ=` 와 `ⓓ=` 에 적는다. 새 기호는 안
342
+ 만든다. 단 **`ⓑ=→standpoint`** 규약이 이미 있으므로(값은 `standpoint:` 필드가 가진다),
343
+ 피어-유래 ⓑ 는 그 필드에 «peer 세션이 자기 갈래에서 판정» 임을 명시한다.
344
+
345
+ ⚠️ **표본 한계**: 근거는 하루·두 세션이고 **대조군이 없다**(같은 일을 피어 없이 했을 때와
346
+ 비교하지 않았다). 결정은 운영자 판단이고, 판별력 실측은 미실시다.
347
+
274
348
  ✅ **기계층이 6축으로 확장됐다 (2026-08-17, 운영자 승인).** 아래는 그 상태와 **남은 잔여 하나**다.
275
349
  ```
276
350
  axes-run: ⓐ~ⓕ 마커 날짜 ≥ 2026-08-17 이면 pre-commit 이 **기호 여섯 글자를 요구**한다
@@ -771,3 +771,76 @@ standpoint.
771
771
  third-party axis's *exclusive* yield at **2 of 15** findings. Both were boundary-crossing
772
772
  (a rule the other project had already abandoned; another repo importing the changed file) —
773
773
  which is why it earns its place on large-and-irreversible surfaces and nowhere else.
774
+
775
+ ---
776
+
777
+ ## §Q0-Evidence — 「shipped 여부는 판별자가 아니다」의 실측과 인용 경고
778
+
779
+ > CLAUDE.md 는 Q0 의 **규칙(ⓐⓑⓒ + pre-push 결박)**만 상주로 갖는다. 아래는 그 근거·경고다.
780
+ > salience-split 2026-08-21.
781
+
782
+ 🟥 **Settle the TARGET CLASS(es) before the tier — §7's `Q0`, added 2026-08-17 (operator decision).**
783
+ A consumer install **is** another harness; what the enum scopes is not who *receives* the change but
784
+ where it has to be **executed**. Q0 is **not first-match — it can return more than one target, and
785
+ each owes its own tier**: ⓐ a **named peer** whose local repo carries the changed surface, or which
786
+ the cluster registry / a `scripts/adapters/` entry names (decide by that test, not from a name list)
787
+ → the enum as written · ⓑ the delta changes **consumer-visible behavior** (what a consumer's gate
788
+ blocks or passes, what their session is told to do, what an install receives) → target = a *clean
789
+ install of the packed artifact*, and it binds **now, pre-push — never deferred to the eventual
790
+ release** · ⓒ neither → `not-applicable`. 🟥 Do **not** read «no cross-repo consumer contract» as
791
+ «this file is not shipped» — measured, **194/200 recent non-merge commits touch a shipped path (97%,
792
+ all 6 exceptions hand-verified)**, so shipped-ness cannot be the discriminator; the behavior clause
793
+ is. Pricing the axis at that rate is the **over-triggering** §7's own Trigger paragraph rejects.
794
+ ⚠️ 97% measures **the reach of the discarded shipped-path argument**, not the applicability rate —
795
+ how often ⓑ actually fires is **unmeasured in both tails** (it could also land near-universal, which
796
+ would be a rubber stamp — watch the next 20 markers). 🟥 Do **not** cite
797
+ `[[feedback_unreachable_done_when_trains_evasion]]` here: that memory concerns an unreachable *pass
798
+ condition*, and `not-applicable` is an *exemption* — the direction inverts. Three marker-audit legs all failed at that reading;
799
+ they were **not** decorrelated (same family · same prompt · same canon) so that is one observation,
800
+ not three. ⚠️ The consumer-install arm's *presence* half is mechanized at ship time; its
801
+ **execution** half (extract the tarball, run the gate, record command + output) has **no lane** —
802
+ do it by hand, and do not cite that arm as mechanized.
803
+
804
+ ## §Standpoint-Execution-Evidence — 실행 하중 · 철회 · 명명 충돌 · 2026-08-20 정정
805
+
806
+ > CLAUDE.md 는 판별 규칙(**명령과 출력을 댈 수 있나 → tier2, 못 대면 tier1b**)만 상주로 갖는다.
807
+ > 아래는 그 근거와 이 문단이 두 번 틀렸던 기록이다. salience-split 2026-08-21.
808
+
809
+ 🟥 **The execution is the load-bearing half** (operator decision 2026-08-16): a static standpoint
810
+ read competes with cross-family review for the same defect classes and mostly loses — *running the
811
+ target harness locally, to completion*, is the part with no substitute. Measured on one delta the
812
+ same day: static read found 1, running the target's own suite found 2 more, one of which printed
813
+ neither `FAIL` nor `❌` and was unreachable by any read. So **`tier2`+ asserts something was RUN** —
814
+ if the review only read, it is `tier1b`, and `tier1b` is deliberately the weak rung so that
815
+ recording it honestly surfaces that the execution arm is still owed. (Broken on the day it was
816
+ written — a static read was recorded as `tier2` because `tier1b` did not yet exist; a missing rung
817
+ gets filled by the next one up rather than staying empty.) Naming note: this collides in
818
+ English with FH's own persona/viewpoint sense of "standpoint" (`fh-meta:beginner`/`main-player`/
819
+ `expert`) — a different axis (which persona reviews, not whose repo is ground truth); kept as-is,
820
+ not renamed, but do not conflate the two. 🟥 **CORRECTED 2026-08-20 — this paragraph used to say
821
+ `standpoint:` was "Prose-only today — no pre-commit hook or fixture suite validates this field yet".
822
+ That is FALSE and was false in this same file**: `validate_standpoint_leg()` lives in
823
+ `templates/.git-hooks/pre-commit` and is called from the marker block, and its fixture suite
824
+ `scripts/test_marker_standpoint_lanes.sh` is wired through `scripts/selfcheck.sh`. (🟥 **Grep the
825
+ names, do not trust line numbers** — the first version of this correction cited `:798`/`:1575` and a
826
+ commit landed the same hour that moved them to `:878`/`:1665`. A hardcoded anchor in prose is a
827
+ phantom waiting for the next edit.) §자기 대조
828
+ above already said so (PR #429), so **one file carried both claims at once** and a reader landed on
829
+ whichever they reached first. Found by the residency-ledger pass, not by a lane — no check compares
830
+ a rule's self-description against the machinery it describes, which is why a stale "we have not
831
+ built this yet" is the quietest form of drift: it reads as honest modesty and it suppresses use of a
832
+ control that already exists. **What is validated is the ENUM** — measured by varying ONE variable at a
833
+ time, because the first version of this correction varied two and mis-attributed the result:
834
+ `banana(qasp)` → blocked (enum) · `tier2` without parens → blocked (enum) · `tier2(qasp)` with **no**
835
+ execution grounds → **passes with a warning** · with grounds → passes. 🟥 So the first fix's claim
836
+ that "grounds are non-empty" are checked **over-shot, and a different-family reviewer caught it**:
837
+ the `tier2`+ execution grounds are **advisory**. Two residuals remain and both are real — grounds are
838
+ not enforced, and whether `tier2` is *true* is still self-attested. What was wrong was only the claim
839
+ that nothing validated the field at all. Three artifacts, one carrying two
840
+ independent trials (forge-harness PR #368, a sibling field harness's PR #8 reps=3 and its
841
+ known-answer trial, qasp-dev PR #161 as adjacent corroboration) crossed this repo's own evidence
842
+ bar the same day this was formalized — including one caught by this session's own qasp PR #161
843
+ review, not fed in externally, and a second live demonstration the same day when a cross-harness
844
+ standpoint review of this very section caught real residency and citation defects in the first
845
+ draft (fixed in the same commit that added this line).
846
+
@@ -332,7 +332,7 @@ unchanged and keeps its own 2026-07-14 evidence).
332
332
  | **Ⓑ** | **프로젝트 부스터** (booster) — 🟥 **다른 다섯과 같은 층이 아니다. 포괄 기능이되 ①②⑤ 를 «포함»하지 않고 «끌어다 쓴다» — 셋 다 부스팅 밖의 고유 범위를 갖는다** — 번호 대신 Ⓑ 를 쓰는 이유이자 §Ⓑ-layering 을 먼저 읽어야 하는 이유 | judgment-circuit + ship-gate | 🟢 **GREEN (신설 2026-08-16)** | **이 행이 없던 것이 이 표의 맹점이었다.** 온보딩 문 ③(«매핑 프로젝트 가속»)이 오래전부터 이 기능을 팔고 있었는데 등급표에 대응 행이 없었다 — 그래서 부스터는 **한 번도 등급이 매겨진 적이 없고, 약점이 발견될 자리도 없었다.** 미할당 기능은 미감사 기능이다. **인접 세 행이 이걸 안 덮는다**: ②는 *새 하네스를 낳고*(성숙한 하네스는 대상 아님), ⑤는 *사람의 의도*를 벼리고(증폭 대상이 하네스가 아니다), ①은 남의 능력을 *FH 가* 쓴다(활용 ∪ 흡수 — 둘 다 FH 가 이득 보는 방향). 부스터는 **FH 의 기계가 상대 하네스의 자체 개발을 가속하는 것**이라 셋 다와 방향이 다르다. **실적(운영자 열거 + 실측)**: pmh 는 *이 경로에서 출발했다* · mate 스킬 출하 + 인프라 배선 · 조직 환경 2건(품질 게이트 인프라 이식, 자산명은 residency 로 미기재) · clawd-on-desk · gstack. **Dominance — §Gate consequence 를 면제 없이 그대로 만족한다.** 경쟁자 = *그 하네스 자신의 개발 과정*, 결과 = 그 과정이 놓친 것을 부스팅이 잡았다: ⑴ **gstack**(외부·운영자 통제 밖) — 이슈 #1890 을 외부인 자격으로 제기, 그 레포 오너가 수정하고 **회귀 테스트 `test/claude-provider-keychain.test.ts` 로 못 박아 릴리스에 실었다**(2026-08-15). 채택 판정이 **우리가 아니라 그쪽 메인테이너**라 자기채점이 아니다. ⑵ **pmh**(2026-08-16 실측) — 이식된 자산이 대상 환경에서 **게이트가 죽은 채** 있었고 selfcheck 35 FAIL 이 CI 부재로 몇 달간 안 보였다; 부스팅 경로가 그걸 드러내고 31/31·35→2 로 닫았다. ①이 받은 dominance 면제는 **이 행에 필요하지 않다** — ①은 산출이 «안 지어도 됐다»라 겨냥이 틀렸던 경우고, 부스터의 산출은 «상대가 못 잡던 걸 잡았다»라 이 절의 정의에 그대로 맞는다. 🟥 **명시 잔여 — 초록 행의 잔여이지 보류 사유가 아니다**(①이 «(d) 안 닫힘»을 안고 🟢인 것과 같은 처리): **부스팅이 이식한 자산이 대상 환경에서 실제로 발화하는지 재는 계기가 없었다.** 2026-08-16 pmh 실측이 그 대가다 — 한 줄(`set -euo pipefail` 아래 `package.json` 읽는 할당문)이 게이트를 즉사시켰고, 30레인 회귀 스위트가 그걸 30번 보고하는데 **아무도 안 봤다**(그 레포에 CI 가 없었으므로). 승급이 아니라 **이 행의 첫 승급 기준**이 거기서 나온다(아래). ⚠️ n 은 세지 않는다 — 실적 열거는 운영자 증언 + 오늘 실측 2건이고, 조직 환경 2건은 이 파일에서 검증 불가(residency)이므로 **증언으로 표기하고 측정으로 세지 않는다** |
333
333
  | ③ | 거버넌스 게이트 (governance) | ship-gate | 🟢 GREEN | pre-commit/pre-push physically block; moat measured 3–4 family blind (HITL 8/8 ABSENT); cross-family caught a real companion-store-name leak 2026-07-14 (fail-closed) |
334
334
  | ⑤ | 증폭자 (amplifier) | judgment-circuit | 🟢 GREEN | short-intent→literature-grounding→ultimate-doc real instances; rules-diet −18.2k measured; intent-routing probe 94% (below) |
335
- | ④ | 프런티어 답습 (**의도 기반** — 🔵 RC, 재정의 2026-08-21) | external-grounding | 🔵 RC | 🟥 **이 정체성은 «파이프라인»이 아니라 «루프»다** (운영자 재정의 2026-08-21): **트리거** = 운영자가 행동·판단에 **의문을 표한 순간**(*"그거 아니지 않아?"* · *" 이상한데"* · *"이거 어때?"* · *"어떻게 생각해?"*) → **절차** = 숙고 → **내면 도구 먼저(책장)** → 안 닫히면 **세계(도서관)** → **제안 2단** = «물어볼까?» 그리고 «반영할까?». **완주 판정** = *사람이 안 시켰는데* «물어볼까?»가 떴고, 회수한 것이 **실제 강화로 이어졌나**. 🟥 **`frontier-digest` 는 이 정체성이 아니다** — 그건 launchd 로 도는 **기계화된 일상작업**이고, 이 행이 그동안 그것을 재고 있었다(범위 오조준). 아래 §digest-routine 으로 이관. **2026-08-21 실측 — 0/4**: 그날 운영자 의문 5건 중 4건(*봉인 개봉* · *발화속도 숫자* · *의도 오독* · *작업 범위*)에서 세션은 **전부 내부 확인으로 닫았고 외부 조회 0회**, 나머지 1건은 *"세계에 물어보았나"* 라는 **명시 명령**이라 트리거가 아니라 지시였다. 그 1회가 곧바로 선행연구(`arXiv:2507.23158`, 같은 과제의 벤치마크 P61/R36)를 냈다 — **능력이 아니라 격발이 빈 자리**임을 같은 날 양쪽으로 보여준다. **격발 표면은 둘이고 상태가 다르다**: ⓐ **빌드 시점**(새 메커니즘 짓기 직전) — 물건은 있다(`feat/prior-art-prompt-t2`, 「책장 먼저, 없으면 도서관」) 그러나 **어느 settings 에도 미등록**이고, 등록해도 `matcher=Write` 라 **auto-mode 세션이 heredoc 으로 파일을 만드는 한 구조적으로 우회된다**(2026-08-21 측정, 컨트롤 동반). ⓑ **대화 시점**(의문 발화) — **기계 없음**. 🟥 **경계**: «이 의문이 외부를 요구하나»는 **판단이지 채널이 아니다**. 훅이 할 수 있는 최대는 «외부 고유명사가 제안/물음 형태로 들어왔다»를 surface 하는 것까지고, 낡았는지는 사람/세션이 정한다 — 이걸 기계에 넘기면 §Mechanization Boundary 가 금하는 «결론을 단언하는 체크»가 된다 |
335
+ | ④ | 프런티어 답습 (**의도 기반** — 🔵 RC, 재정의 2026-08-21) | external-grounding | 🔵 RC | 🟥 **이 정체성은 «파이프라인»이 아니라 «루프»다** (운영자 재정의 2026-08-21): **트리거 (재정의 2026-08-22, 운영자 승인 — 종전보다 넓다)** = **두 조건의 곱**이다: **① 운영자 발화가 요청 · 질문 · 제안이다**(운영자 원문: *"내가 뭔가 **해달라고 요청하거나 네게 물어보거나 제안하는 경우**"*) **∧ ② 내가 단정짓기 어려운 데가 «조금이라도» 있다**. 🟥 **①은 채널이고 ②는 판정이다** — 발화 «종류»는 기계가 볼 수 있고(§Mechanization Boundary 의 채널), «확신»은 세션 몫이며 기계로 옮기면 «결론을 단언하는 체크»가 된다. 🟥 **임계는 «조금이라도» 다 — 이게 하중선이다.** 운영자 원문: *" «조금이라도」가 중요할 것 같아. 아니면 **아는척**으로 끝날 것 같으니까 그 정도로는 조여야 할 듯."* 「상당히 불확실할 때」로 잡으면 세션은 **언제나 충분히 확신해서** 창이 영영 안 열린다 — 2026-08-21 의 0/4 가 그 모양이다. **창이 자주 열리고 대부분 책장에서 닫히는 것이 정상 동작**이고, 도서관행이 드문 건 실패가 아니다. 🟥 **목적은 재발명 차단이다**(운영자 원문: *"재발명을 차단하는 걸로"*) — 외부 인용으로 똑똑해 보이는 것이 아니라, 📚**책장 = 우리가 이미 가진 걸 다시 짓지 마라** · 🌍**도서관 = 세상이 이미 만든 걸 다시 짓지 마라**. ⚠️ **종전 정의(«의문을 표한 순간» + 예시 넷) 좁아서 실패 사례를 정의 밖에 두었다** — 0/4 중 하나(«작업 범위»)는 「의문」이 아니라 **요청**이라 그 정의로는 트리거로도 안 잡혔다. 좁은 정의는 자기 실패를 못 센다. → **절차** = 숙고 → **내면 도구 먼저(책장)** → 안 닫히면 **세계(도서관)** → **제안 2단** = «물어볼까?» 그리고 «반영할까?». 🟥 **결말은 셋이다(2026-08-22 실측 신설)** — ⓐ **숙고만으로 닫힘**(외부 불요) · ⓑ 책장에서 닫힘 · ⓒ 도서관행. ⓐ 가 ⓑ 와 구분된다는 것이 R1 라운드에서 실물로 나왔다(책장이 히트했지만 **주제가 다른 히트**여서 조회가 답이 아니었던 사례). **셋을 갈라 세지 않으면 ⓐ 가 ⓑ 로 계상되어 「책장에서 닫힘」 열이 부풀고, 그 열이 이 정체성의 핵심 계측이다.** **완주 판정** = *사람이 안 시켰는데* «물어볼까?»가 떴고, 회수한 것이 **실제 강화로 이어졌나**. 🟥 **`frontier-digest` 는 이 정체성이 아니다** — 그건 launchd 로 도는 **기계화된 일상작업**이고, 이 행이 그동안 그것을 재고 있었다(범위 오조준). 아래 §digest-routine 으로 이관. **2026-08-21 실측 — 0/4**: 그날 운영자 의문 5건 중 4건(*봉인 개봉* · *발화속도 숫자* · *의도 오독* · *작업 범위*)에서 세션은 **전부 내부 확인으로 닫았고 외부 조회 0회**, 나머지 1건은 *"세계에 물어보았나"* 라는 **명시 명령**이라 트리거가 아니라 지시였다. 그 1회가 곧바로 선행연구(`arXiv:2507.23158`, 같은 과제의 벤치마크 P61/R36)를 냈다 — **능력이 아니라 격발이 빈 자리**임을 같은 날 양쪽으로 보여준다. **격발 표면은 둘이고 상태가 다르다**: ⓐ **빌드 시점**(새 메커니즘 짓기 직전) — 물건은 있다(`feat/prior-art-prompt-t2`, 「책장 먼저, 없으면 도서관」) 그러나 **어느 settings 에도 미등록**이고, 등록해도 `matcher=Write` 라 **auto-mode 세션이 heredoc 으로 파일을 만드는 한 구조적으로 우회된다**(2026-08-21 측정, 컨트롤 동반). ⓑ **대화 시점**(의문 발화) — **기계 없음**. 🟥 **경계**: «이 의문이 외부를 요구하나»는 **판단이지 채널이 아니다**. 훅이 할 수 있는 최대는 «외부 고유명사가 제안/물음 형태로 들어왔다»를 surface 하는 것까지고, 낡았는지는 사람/세션이 정한다 — 이걸 기계에 넘기면 §Mechanization Boundary 가 금하는 «결론을 단언하는 체크»가 된다 |
336
336
  | ① | 하네스 클러스터 (**🟢 2026-08-16 — 기준이 바뀌었다, 아래 §①-2026-08-16 를 먼저 읽어라**) | context-continuity | 🟢 | routing already ran for real (17 nodes, sidecar-orchestrator, Skill Bus). **The relay half is now built rather than specified**: `capability_composition_contract.md` (2026-08-02) was a complete spec with **zero implementing code** — the ① blocker was missing wiring, not missing design ([[feedback_built_but_not_wired]]). `scripts/relay_channel.sh` executes it (strictest-wins merge · typed invocation · checks 1/2/3 · short-circuit · causal binding), `scripts/test_relay_channel_lanes.sh` carries **64 lanes, BLOCK/PASS symmetric**, and three arms ran across **two real field harnesses** (pmh-dev · qasp-dev) on FH's own assets. ⭐ **The measured result is the divergence arm, and its mechanism is not what the first draft of this row said.** On `templates/.git-hooks`, `qasp` alone returns exit 0 — a single-node pass would have shipped it — and the composition returns `BLOCKED` because `pmh` returns `FINDINGS`. But `qasp`'s exit 0 is `degrade-scan: no scannable (py/sh) target files`: **zero files were scanned.** The qasp copy predates pmh's 2026-07-28 shebang pass, so extension-less hook files are invisible to it, and its exit 0 means *no target*, not *clean*. So the composition did not catch a substantive disagreement between two harnesses — it caught **a single node rendering an unmeasured surface as a pass**, which is `[[feedback_not_found_is_not_zero_family]]`, and structurally the spec's own §ⓑ.4 B1 ("the exit 0 that means I never started"). That is a *stronger* result than the first framing and a narrower one: it demonstrates the union catching a blind spot, not decorrelated judgment. **Correction also to the order claim**: both orders return `rc=2`, but in the pmh-first order the chain short-circuits at node 1 and qasp never runs — only the qasp-first order actually exercises the union. Non-decorative: reverting each wiring line reddens lanes and no reversion passes silently. **Why this is RC and not 🟢** — *updated 2026-08-11; (b) and (c) moved, (a) did not, and a fourth appeared*: (a) the row's *other* half, external-harness recommend, is still parked — **unchanged, and it is a build, not a check**; (b) ~~`scripts/capability_registry_check.sh` does not exist~~ → **built 2026-08-11** (M1–M5 + the ran≠did-not-run clause, M4 pair executed, 7 self-test lanes BLOCK/PASS symmetric); (d) **NEW, and it cuts against the row**: a capability declaring `writes: read-only` passed all of M1–M5 and its entry point then `rm -rf`'d this repo's `scripts/`. The registration bar measures *form* and *known-pair separation*, never *whether the declaration is true* — so the machinery this row now points at carries a demonstrated structural hole (`capability_composition_contract.md §Salience`). A checker whose green can precede a destructive act is not yet a green identity; (c) ~~the two nodes are copies of one scanner at different staleness~~ → **superseded 2026-08-11, but only partly**: a run now exists across two *genuinely different* capabilities (a leak lens ∪ a verdict-direction lens — different enums, different defect classes, each blocking on its own finding), and the clean arm exercised the union end-to-end. ⚠️ **That satisfies the letter of the old (c) and not the identity's spirit: both new nodes live inside FH.** This identity was then named *멀티하네스 클러스터* (shortened to *하네스 클러스터* 2026-08-16); the only run that actually crossed harness boundaries is still the older pmh-dev/qasp-dev one, whose nodes were<a name="c-orig"></a> **copies of one scanner at different staleness** (all three copies — pmh 237 ln, qasp 121 ln, FH 269 ln — share a byte-identical 12-line header; the clean arm's two `out_sha` were identical), so the run proves the channel turns and that composing unequal copies has value, not that two independent judgments were decorrelated. Artifact: `tracks/_meta/identity_audit_2026-08-09_relay_channel.md` <br><br>**<a name="id1-20260816"></a>§①-2026-08-16 — 이 행이 🟢 이 된 이유는 «더 잘해서» 가 아니라 «다른 것을 재서» 다. 그 사실을 먼저 적는다.** 🟥 **옛 바로 재면 이 행은 오늘도 🔵 다.** §Gate consequence 의 dominance 절을 **두 번** 쟀고 **둘 다 미성립**이다 — 1차(기계 스캔 vs recall, `tracks/_meta/dominance_2026-08-16_cluster_scan_vs_recall_RESULT.md`)는 **상보**: 기계는 실행 축(M4·M6)을 독점하고 recall 은 구조·정합 축을 독점한다 — 서열이 아니라 직교다. 2차(**복사 vs 호출**, survives 다리, `tracks/_meta/dominance_2026-08-16b_copy_vs_call_RESULT.md`)는 **safety 동률**: 구 enum 사본으로 `exit 4` 를 부르면 relay 가 enum 밖 값을 `HARNESS_ERROR` 로 접어 `BLOCKED`(rc=2), 소유 선언은 `OUT_OF_SCOPE` 로 `BLOCKED`(rc=2) — **둘 다 막는다.** 「복사는 조용히 썩는다」는 예측이 반증됐고, 안 썩게 막아주는 것은 이 레포가 이미 가진 «미측정≠PASS» 규율의 기계 판본이었다. 두 측정 다 **사전등록 봉인 후 실행**이고 반증 조건을 결과 뒤에 옮기지 않았다. ⇒ **운영자 결정(2026-08-16)**: ①의 🟢 기준을 dominance 에서 **ⓐⓑⓒ 3기준으로 대체**한다. 운영자 원문 — *"그들의 능력을 활용하고 **내 쪽에서 더 짓지 않기 위한(재발명을 최소화하기 위한)** 목적이 멀티하네스 클러스터"* · *"FH 의 **뾰족한 부분을 유지하면서** 능력을 최대한 쓸 수 있는 방법"* · *"오래오래 진화에 따라 **살아남으면서 얇아지면서도** 가치를 발휘 … LLM 의 진화 그리고 다른 유수의 하네스들의 진화, **그 덕을 받는 것이 목적**"* (전문 + 방법론: `tracks/_meta/doctrine_2026-08-16_identity1_redefinition_and_method.md`). ①의 산출은 «더 많이 잡았다»가 아니라 **«안 지어도 됐다»** 라서 dominance 는 겨냥이 틀린 계기다. ⚠️ **이 대체는 ①에만 적용된다** — 다른 행의 dominance 요구는 그대로다. **ⓐ 재사용이 실재하고 호출 가능한가(복붙 아님)** → ✅ **측정**: `pmh-dev:merge-noop-check` 가 **pmh 자기 레포에서** 선언되고(`.claude/capabilities/merge-noop-check.cap`, `requires_cwd: SELF`, known-pair 는 그 레포의 실제 커밋 두 개), FH 가 `cluster_capability_scan.sh discover` 로 **발견** → `capability_registry_check.sh` M1–M6 `REGISTRABLE` → `relay_channel.sh run` 으로 **실제 호출**한다. 양·음 arm 이 갈린다 — NO-OP 입력은 `FH_NODE1_VERDICT: NO_OP` 로 node1 에서 BLOCKED, 차이 있는 입력은 node1 통과(`HAS_DIFF`) 후 node2(`forge-harness:degrade-direction-scan`)가 `FINDINGS` 로 BLOCKED. **다른 노드에서 다른 이유로** 막히므로 「늘 막는 계기」와 구분된다. **ⓑ FH 가 안 커졌는가 — «안 한 일»을 이름으로 댈 수 있는가** → ✅: `merge_noop_check.sh`(트리해시 + 조상관계 판정)를 FH 는 짓지 않았고, FH 자기 정본 `knowledge/shared/rules/multi_session_close_protocol.md §1-b` 가 **그 파일을 이름으로 지목하며 «가져오면 된다»** 고 이미 적어둔 자리가 여기다. 오늘 FH 가 새로 지은 것은 **채널**(`relay_channel.sh --cap-args`, 노드별 호출 인자)이지 판단이 아니다 — 그 채널이 없는 동안 호출 시점 인자를 요구하는 능력은 **항상 `ARGS → HARNESS_ERROR → BLOCKED`** 였다(방향은 fail-closed 로 옳았으나 **신호가 0**, 즉 «호출 가능» 을 구조적으로 만족시킬 수 없었다). **ⓒ 뾰족함이 보존되는가** → ✅ **측정**: 합성이 `FH_MERGED_residency: company`(둘 중 엄격한 쪽) · `verdict_binding` 은 4값 합집합 · 상류가 막히면 하류 노드 미실행. 🟥 **명시 잔여 — 축소하지 않는다.** ⑴ **두 측도를 갈라 적는다.** **㉮ 선언 보유 하네스 = 2**(FH · pmh) — *능력(capacity)* 측도. **㉯ 실제로 함께 돈 하네스 = 5** — *사건(event)* 측도이고 정체성이 묻는 쪽이다. 🟥 **단일 합성 한 번에 5개가 돌았다(실측, 세션 말)**: `relay_channel.sh run` 4노드 체인이 `gstack`(어댑터) → `pmh-dev`(소유 선언) → `mate-dev`(어댑터) → `qasp-dev`(어댑터) 를 태우고 FH 가 그 사이에서 병합했다 — 청정 arm 은 **네 노드 전부 실행 후 `FH_RELAY_VERDICT: PASS`(rc=0)**, 교란 arm 은 node3 `FAIL` 에서 `BLOCKED` + 하류 미실행(rc=2). **늘 통과하지도 늘 막지도 않는다.** 병합 결과: `residency: company`(다섯 중 최엄격) · `verdict_binding` **9값 합집합**. ⚠️ ㉮ 가 여전히 2인 것은 나머지 셋이 **어댑터**(FH 소유·FH 유지)이기 때문이고, 그게 결함이 아니라 운영자 결정으로 정해진 **기본 경로**다(§선언 위치). ㉮ 가 커지는 것은 남이 «노출한다» 고 자기 정본에 적었을 때뿐이다. 그리고 ㉮ 가 여전히 작다는 사실은 남는다: ⚠️ **부풀리지 않는다**: clawd-on-desk 는 하네스 자산이 없는 **대상 레포**라 PR #888 은 기여였지 하네스 주행이 아니다 — 세지 않았다. 그리고 ㉮ 가 여전히 작다는 사실은 남는다: qasp 는 **그 하네스 자신의 입장리뷰가 REJECT** 했다 — 정본 근거 0건 · 소비자 0곳(읽는 건 FH 뿐) · `session.md:101` 「n=3 전엔 추상화 금지」 위반 · **그 선언 경로가 그 하네스의 조직 미러 대상에서 제외돼 있지 않다**(운영자가 이 레포에서 통제하지 않는 목적지로 그대로 복제된다). 운영자 결정(2026-08-16)으로 **보류**이며, 「이 하네스는 외부 하네스에 자기 인터페이스를 노출한다」를 **그 하네스 자신의 정본에 적는 것**이 선행 조건이다. 선언 파일이 남의 레포에 **있다**는 것과 그 하네스가 노출을 **결정했다**는 것은 다른 명제다. ⑵ 🟥 **(d) 는 안 닫혔다.** `.git/objects` 를 감시면에 넣어 객체 쓰기 한 부류를 닫았고(probe L13 탐지 / L13b 과차단 컨트롤 / 되돌림 시 정확히 L13 만 적색), **그러나 M6 는 선언된 캘리브레이션 arm 만 관측한다** — 실증: `merge_noop_check.sh` 는 **분기 입력에서 git 객체를 쓰는데**(격리 클론 실측: `.git/objects` 파일 수가 **+1**. ⚠️ 절대값은 클론 상태에 의존하므로 **델타만 인용한다** — 이전 판본이 적었던 절대 쌍은 재현 불가라 철회한다) 선언된 두 arm 이 그 경로를 안 지나므로 `writes: read-only` 로 거짓 선언해도 `REGISTRABLE` 이 난다(실측 확인). 같은 날 아침에 나온 **「검사기에 enum↔구현 일치 축이 없다」와 같은 형태**다 — 같은 stale 선언이 캘리브레이션 쌍에 따라 REJECTED 도 REGISTRABLE 도 된다. 한 문장으로: **검사기는 선언이 시키는 것만 본다.** ⑶ 그러므로 이 🟢 은 **「클러스터가 실제로 돈다」**에 대한 것이지 **「등록 바가 선언의 진위를 검증한다」**에 대한 것이 아니다. 후자는 열려 있고, 열려 있다고 적는다. Artifact: `tracks/_meta/identity_audit_2026-08-16_cluster_green.md` <br><br>**<a name="id1-naming"></a>§①-naming (운영자 결정, 2026-08-16) — 이름을 줄이고, 그 안의 하중 부품에 이름을 준다.** 「멀티하네스 클러스터」 → **「하네스 클러스터」**: 「멀티」와 「클러스터」가 둘 다 복수를 뜻해 **중복이었다**. 그리고 그 아래에 **크로스하네스**를 둔다 — *"서로간의 능력을 보강하기 위함이야. **없는 걸 쓰기 위함**이고, FH 에서 **‘짓지 않아도 되는 것’을 다른 레포 개발에 활용**하기 위함이지. 다만 그 와중에 **FH 에서 지어야 하는 게 보이면 개선해서 답습**하는 거고."*(운영자) ⇒ **크로스하네스는 양방향이다**: **활용**(남의 능력을 호출해 FH 가 안 짓는다) **∪ 흡수**(FH 가 지어야 할 것이 보이면 개선해 들여온다). 종전 정의는 앞의 절반뿐이었다. 🟥 **둘의 관계는 합집합이 아니라 «포함 + 하중»이다.** 운영자: *"하네스 클러스터가 돌려면 크로스하네스는 항상 있어야 하니까."* ⇒ **크로스하네스는 하네스 클러스터의 필요조건**이고, 그래서 판정에서 다음이 따라 나온다 — **ⓐ(«재사용이 실재하고 호출 가능한가»)가 곧 크로스하네스 시험이고, 그게 이 정체성의 결박 지점이다.** 노드 수 n 은 클러스터의 **범위**를 재지 «도는가»를 재지 않는다. (이 구분이 없어서 이 행의 잔여 ⑴이 «n=1»을 마치 미성립처럼 읽히게 적혀 있었다 — n=1 에서도 교환은 실제로 일어났다. 다만 **n 을 늘리는 것은 여전히 옳고, 그건 선언이 없어서지 기제가 없어서가 아니다**: 실측 2026-08-16, 매핑된 하네스 12개 중 선언 보유 2개 · 나머지 10개는 `.claude/capabilities` 디렉토리 자체가 없다. 도구는 있다 — gstack `bin/*`=69 · gbrain 50 · openhuman 43 · mate-dev 7 · qasp-dev 16.) 🟥 **크로스하네스는 두 형태를 갖고, 둘 다 «건넜다»에 든다(운영자, 2026-08-16).** **기계 형태** = 남의 능력을 typed 채널로 호출한다(`.cap` 선언 필요) · **판단 형태** = **남의 정본을 근거로 심사받는다**(입장리뷰 — 선언 불요). 운영자: *"입장리뷰도 크로스가 아닐까 … 결국 너와 그쪽 하네스 2개가 동시에 도는 거니까."* ⇒ **판단 형태는 선언 없이 지금 당장 모든 하네스에서 성립한다**, 그리고 **한 번의 크로싱이 이미 하네스 2개의 동시 주행**이다. *"크로스하네스는 노드 1개라도 발휘되는 거고 … 그게 늘어나면 클러스터가 되는 거고."* ⇒ **크로스하네스 = 사건(건넜다) · 하네스 클러스터 = 그 사건의 누적.** 🟥 **이 문장이 아래 잔여 ⑴의 계수 오류를 잡는다** — 나는 «외부 **선언** 수»를 셌는데 정체성이 묻는 것은 «**함께 돈 하네스** 수»다. 두 측도를 갈라 적는다(둘 다 남긴다, 유리한 쪽만 남기지 않는다). 🟥 **명칭 경계 — 알고 쓴다.** `cross-harness` 는 이 레포에서 **이미 다른 뜻**으로 쓰인다: `CLAUDE.md §Standpoint axis` · `field_verdict_crossfamily_gate.md §7` 의 *"cross-harness-boundary change"* = **다른 하네스의 동작·게이트 결과·상호작용 계약을 바꾸는 diff**(게이트 트리거 범위). 정체성 이름이 「하네스 클러스터」로 남으므로 **최상위 층에서는 충돌하지 않지만**, 하위 기제 「크로스하네스」와는 여전히 같은 낱말이다 — 구분: **명사 「크로스하네스」 = 능력 교환(이 정체성의 필요조건)** · **형용구 cross-harness-boundary = 그 게이트의 적용 범위**. 섞어 쓰지 마라. 🟥 **ⓑ 기준이 양방향화에 맞춰 «좁아진다»(느슨해지는 게 아니다).** 흡수를 허용하면 ⓑ(«FH 가 안 커졌는가»)가 그대로는 무력해지므로: **FH 는 «닫는 FH 결함을 이름으로 댈 수 있을 때만» 커진다.** 새 규율이 아니라 이미 있는 증거-임계 빌드 규율(`fh_signal_2026-08-16_expedition_two_tracks.md` §경계 2 — *"«좋아 보여서»가 아니라 «우리 결함이 그걸 요구해서»"*)을 ⓑ 의 판정 문구로 승격시킨 것이다. ⇒ **ⓑ = ⑴ 호출로 대체한 것을 이름으로 댈 수 있고, ⑵ 새로 지은 것은 각각 닫는 FH 결함을 이름으로 댄다.** 오늘 실적: 대체 = `merge_noop_check.sh`(안 지었다) · 신축 = `--cap-args` 채널(닫는 결함 = «호출 시점 인자를 요구하는 능력이 relay 를 통과할 방법이 없다», 실측) + `.git/objects` 감시(닫는 결함 = «`writes: read-only` 거짓 선언이 VERIFIED 를 받는다», 실측). 둘 다 이름이 붙는다. 🟥 **선언 위치는 두 종류이고, 기본은 «어댑터»다(운영자 결정 2026-08-16 — 초판은 이걸 거꾸로 적었다).** 운영자: *"사용자들은 다들 대상 레포에 짓지 않을 거야. **FH 내부에 상주시키겠지.** 필요하다면 개인용 레포로 분리해서 관리할 거고."* · *"로컬에서 작업하기 위한 거니까 **어댑터는 내장되어 있어야지.**"* ⇒ **어댑터 선언 = 기본 경로**(FH 안 `.claude/capabilities/adapters/` + FH 소유 스크립트, **유지 책임은 FH**, peer 는 **이름으로 해석**해 tracked 파일에 홈 절대경로를 안 싣는다). **소유 선언 = 특권적 경우** — 그 하네스를 소유하고 **동시에** 「외부 하네스에 인터페이스를 노출한다」를 **그 하네스 자신의 정본에 적었을 때만**(pmh-dev 가 그 유일한 사례다). 🟥 **이 뒤집기는 실측이 강제했다**: qasp 입장리뷰가 남의 레포 안 선언을 REJECT 했고(정본 근거 0건 · 소비자 0곳 · n=3 규칙 위반 · 조직 미러 노출), gstack 은 **애초에 남의 공개 레포(READ 권한)라 푸시 자체가 불가능**했다 — 즉 소유 선언은 «드문 경우»가 아니라 **대부분의 경우 성립조차 하지 않는다.** 어댑터가 허용되는 근거는 dominance-2 가 잰 것이다 — 복사 vs 호출이 **safety 동률**이었고 차이는 «정보와 유지 책임»뿐이었다. 라벨과 FH 소유가 그 차이를 닫는다. ⚠️ **residency 경계**: `company` peer 의 어댑터는 **tracked 로 두지 않는다** — 커밋 시점 공개표면 스캔이 floor 이지만, 판단이 먼저다. ⚠️ **미결 — 운영자 결정 대기**: *"운영자 환경에서는 상시 제안 가능. 사실 제안도 자동으로 반영 가능"*. 제안의 **자동 반영**은 자율성 확장이라 §Operational Adaptation Loop 의 action-class floor 를 그대로 통과해야 한다 — 흡수 커밋 자체는 가역이지만 **그것이 publish 를 먹이면 taint 가 전파**되고, 그 경우 registry floor 가 `promotion_eligible` 을 금한다. 바운드된 형태(운영자 환경 한정 · 가역 표면 한정 · typed 기록 필수 · 게이트는 그대로)로 좁히기 전엔 자동화하지 않는다. **미구축이며, 미구축이라고 적는다.**
337
337
  | ② | 프로젝트 인큐베이터 (**🟢 2026-08-21**) | context-continuity + judgment-circuit | 🟢 GREEN | **정식 흐름이 배출했고, 배출물이 대상 하네스에서 돌았다.** (a) 구현 `chamber_run.sh` 6단계 게이트 (b) known-pair 러너 18 레인 + 순서 증인 16 레인 (c) self-test 초록 — RC 세 다리는 2026-08-09 에 섰다. **🟢 로 올린 근거는 그 위의 넷이다**: ⓐ **런 #15 `interslide-dependency-graph` = EMIT + 순서 증인 `WITNESSED`**(게이트 아티팩트 3건이 verdict 보다 먼저 커밋 고정; `chamber_witness.sh verify` 재실행 확인) ⓑ 배출물이 **대상 하네스에 배선되어 실물 발화**(2026-08-21, `preprep` L8 — 절 29 · HARD 의존 4 · 깨짐 0 · UNRESOLVED 2) ⓒ **배출물의 미해소를 재서 줄였고 정답쌍이 안 깨졌다**(표기 정규화 수리 → `S20 → S9 [OK]`; arm A rc=1 BROKEN 유지 · arm B rc=0 불변; 진짜 모호한 1건은 안 풀림 = 새 오탐 0) ⓓ advisory 되돌림 컨트롤 통과(HEAD 판 대비 rc·USE 불변). 🟥 **정직 조건 셋, 지우지 마라**: (1) **n=1** — 런 #14 도 EMIT 이나 순서 증인 `VOID(TAMPERED)` 라 근거로 못 쓰고 **그 문서가 스스로 그렇게 적었다** (2) L8 은 **advisory 고정**이라 아직 «사람이 못 본 결함을 잡은» 적은 없다 — 잡은 것은 자기 미해소다 (3) 옛 서술 *"formal chamber EMIT 아직 0"* 은 **2026-08-20 부로 stale** 이었다(#14·#15). 그 stale 이 12일간 안 잡힌 것 자체가 `[[feedback_rule_misdescribes_its_own_machine]]` 사례다. 아래 옛 판정 줄은 이력으로 남긴다 |
338
338
  | ②-old | (이력) 프로젝트 인큐베이터 | context-continuity + judgment-circuit | 🟡 PARTIAL | incubation is running — **stockbattle is being incubated now** (S1 built, mid-flight) + qasp/pmh spin-out precedent + scaffold-emit shipped (doctrine: "emit shipped today as scaffold+approval; the chamber flow is the named target"). **Corrected 2026-08-08** (the old text read "6 runs, 6 KILL … 0/6", which was stale on both counts, and the ledger itself was missing a run): hand-counted from `tracks/_chamber/INDEX.md` — **9 full runs (#2–#10), 8 KILL, 1 EMIT** (#1 is a trigger probe, not a full run). Runs #5–#6 *measured* the emit-worthiness criterion (net-new ∧ artifact-shaped ∧ real-data-precision-adequate ∧ hub-state-independent); run #6 confirmed the graduation-order principle — hub-internal proof before standalone extraction, never the reverse. **The 🟡 is now held for a different reason than before.** The old reason ("no closed emit-via-incubation yet") is false: run #9 `forge-wiki` emitted and shipped publicly under operator approval with the Pre-Publish gate passed. What is *not* proven is that the **formal chamber flow** produced it — that run's workspace holds only an `EMISSION_VERDICT.md`, with no `INTENT.md`, `BUDGET.md` or `SIM_NOTES.md`, so the intent/budget/blind-persona gates have no artifact and the verdict was written after the fact. The first run to complete the formal flow end-to-end is #10 (2026-08-08, 3 blind isolated personas) and it KILLed. So: **the identity has fired once, the mechanism has not yet been shown to be what fired it**, and the dominance result every 🟢 owes is still outstanding → 🟡 |
@@ -2442,3 +2442,109 @@
2442
2442
  finding: "🟥 **자력 적발 0. 열 건 넘게 전부 남이 잡았다** — 운영자 6 · codex(HIGH 7·MED 5, BLOCK 판정) · challenger(S 4, «이미 지어져 배선된 novelty_claim_check.sh 재발명») · beginner(HARD 6, «배치 vs 인터럽트») · 레인 2 · CI 2. ★ 측정으로 확정된 계단: **명시 지시 3/3 · advisory 0/3 · 프레이밍 0/3**(3프로브 18판, 독립 판정자). ★ 개입 코퍼스 전수(대화원본 433발화): 개입 54주장/~43추정, **ⓒ판단결함 32(59%) · ⓑ내부미조회 9 · ⓐ외부미조회 6(11%)** — 초판 설계가 겨눈 «세계에 물어봐» 는 소수 클래스였다. ★ 타이밍 sim 이 **봉인 예측 5중 4를 반증**했고 전부 내 제안에 불리한 방향. 교란(과제가 검색을 이름으로 부름)을 스스로 지목. 교란 안 된 대비 하나가 값을 냈다 — 양팔 다 검색, **힌트 쥔 쪽만 정답 도달(2/3 vs 0/3)** ⇒ 기전은 «찾게 함» 이 아니라 **«이름 붙이게 함»**."
2443
2443
  note: "🟥 **오케스트레이션의 값은 산출이 아니라 «내가 못 보는 것을 봤다» 였다.** 특히 challenger 가 12일 전 같은 결함·같은 운영자 발화로 지어진 `novelty_claim_check.sh` 를 찾아냈다 — 재발명 방지 능력을 제안하면서 이미 있는 더 엄격한 기계를 못 찾은 것이 이 런의 진짜 산출이다. ⚠️ 「독립 수렴」 을 두 번 썼다가 두 번 다 철회했다(같은 저자·캐논·모델 계열 ⇒ 상호보강이되 상관됨) — 오늘 스스로 인용한 규칙을 몇 시간 뒤 위반한 형태."
2444
2444
  cost: "39판 4,001,378 · 34판 3,794,737 · 46판 5,660,769 · 9판 1,045,403 · 18판 2,077,707 = **subagent_tokens 16,580,000 (기계 출처)** · codex ×2 = UNMEASURED(CLI) · 거버너 = **UNMEASURED**(세션이 자기 소비를 못 읽는다). 🟥 미측정 칸을 0 으로 접지 않는다."
2445
+ - date: 2026-08-21
2446
+ agent: general-purpose (×2, 병렬)
2447
+ model: inherited (session default)
2448
+ caller: FH hub session 59ea8c2a — README 4종 갱신 (운영자 지시 6항)
2449
+ purpose: "README.ja.md · README.zh.md 에 en/ko 편집 6항 이식 (파일당 1에이전트, 파일 무교차)"
2450
+ prompt_summary: "`git diff README.md README.ko.md` 를 명세로 주고 이식 지시. 자연스러운 현지어 · 경로 번역 금지 · 착지 여부 grep 전수 확인 · 못 찾으면 추정 금지 「미착지+이유」로 보고"
2451
+ outcome: accepted
2452
+ finding: "✅ 완주. 두 에이전트가 각각 **5턴**(초기 이식 → 3+결과 재편 → ⓓ 다리 → mermaid → 각주/정의 교체)까지 이어졌고 전량 착지. 🟥 **둘 다 «내 지시의 결함»을 잡아 보고했다** — zh: 내가 준 `五种身份` 이 그 파일에 없는 절이라 **죽은 포인터**가 될 뻔했다(실제는 `五重身份`) · zh: 다리 문단 위치가 내 지시(맨 끝)와 영어본(🟥 앞)이 어긋나 **영어본을 따르겠다고 이유를 대고 보고** — 그쪽이 옳았다 · ja: 내가 준 `ハーネスクラスタ` 가 파일 표기(`~ター`)와 다름 + **기존 불릿 자신이 절 제목과 어긋나 있던 것**까지 발견. 거버너 자체 확정분: README.ko/zh/ja 의 6축 표 ⓒ 행이 **영어본 대비 stale**(2026-08-21 사전선언 확대 미반영)이고, 그 뒤 「ⓒ widened」 블록도 3개 언어에 부재. 즉 4언어 README 는 이미 드리프트 상태였다 — 이번 지시가 아니었으면 안 드러났다."
2453
+ note: "운영자 상시 요청(CLAUDE.local.md, lease→2026-11-09, scope=서브에이전트 디스패치)에 따라 건별 승인 없이 디스패치. 파일 경계로 격리(공유 체크아웃이라 git 조작은 전면 금지 지시). 별도로 peer 세션(하네스닥터)에 ⓑ∪ⓓ 축으로 질의 — SendMessage 는 enqueue 지 도착이 아니므로 대기하지 않고 진행."
2454
+ cost: "UNMEASURED (완료 알림의 subagent_tokens 로 마감 시 갱신) · 거버너 = UNMEASURED. 합계 안 적는다"
2455
+ - date: 2026-08-21
2456
+ agent: general-purpose sonnet ×13 (블라인드 플로어 sim) · fh-meta:beginner ×1 (콜드리드) · codex/gpt-5.5 ×2 (cross-family)
2457
+ model: sonnet (sim) / opus (콜드리드) / gpt-5.5 (codex)
2458
+ caller: FH hub session 59ea8c2a — README 4언어 갱신 + listing-watch
2459
+ purpose: "① 인사말 언어 규칙이 플로어 티어에서 발화하는지 블라인드 측정(R1 4팔 · R2 5+4팔) ② 수리본 README 콜드리드 ③ 판정 로직 있는 델타 2건에 cross-family"
2460
+ prompt_summary: "sim 은 **프롬프트가 인사말 한 단어뿐**이다 — 무엇을 시험하는지 안 말했다. 컨트롤 팔(`hi`/`hey`)을 매 라운드 동봉. codex 는 diff 전문 + «칭찬 금지, 파일·행 지목» 지시"
2461
+ reps: 1~3 (팔당) — 🟥 이 저장소 자기 바(reps>=3) 미달, 그렇게 적는다
2462
+ outcome: accepted
2463
+ finding: "🟥 **sim 이 내가 방금 «사실» 로 적은 것을 반증했다** — 인사말 언어 일치가 운영자 install 에서 中 **1/5**. 배선을 두 번 고쳐도(§Voice/Tone → 문 골격 자리, gate-locality 처방) **수치 무변화** ⇒ 조이는 대신 문서를 실측에 맞춰 줄였다. ★ **clean clone 실측이 원인을 재귀속**: 핀 없는 새 클론에서는 `你好`·`嗨`·`안녕` 전부 **문 라벨까지 그 언어**로 왔다 — 1/5 는 소비자 동작이 아니라 그 install 의 성질이었다(컨트롤 2종으로 CLAUDE.md 로드 증명). ★ 콜드리드: 서두 `<p>` 넷이 **같은 말을 세 번**, 6축 절이 초심자에게 벽 · 용어가 정의보다 168행 먼저. ★ codex: README diff **5건**(자기무효 측정 2 · **내가 지어낸 숫자 「8일」** · ⓓ 정의 모순 · ja 🐿️ 0건) · listing_watch **9건**(그중 3건 실행 재현 — gh 실패가 2회차부터 **영구 무출력**)."
2464
+ note: "운영자 상시 요청(CLAUDE.local.md, lease→2026-11-09)에 따라 건별 승인 없이 디스패치. 🟥 **오늘 적발 총 20여 건에서 자력 적발은 사실상 0** — 운영자·피어 세션·codex·콜드리드·레인·CI·서브에이전트가 각각 잡았다. 특히 **codex 지적을 수리한 것이 새 결함 2건을 낳았고 레인이 잡았으며, 그 수리본이 CI 에서 이식성 2건으로 또 죽었다**(`stat -f` BSD-first — 내 메모리에 원인까지 적혀 있던 결함). 위임의 값은 산출이 아니라 «내가 못 보는 것을 봤다» 였다."
2465
+ cost: "subagent_tokens 기계 출처 합 ≈ 2.6M (sim 13팔 ~110~120k/팔 · 콜드리드 120k · 이식 에이전트 2×5턴 누적 ~330k) · codex ×2 = 153,165(CLI 출력) · 거버너 = **UNMEASURED**(세션이 자기 소비를 못 읽는다). 🟥 미측정 칸을 0 으로 접지 않는다."
2466
+ - date: 2026-08-21
2467
+ agent: codex/gpt-5.5 (cross-family 적대검증 사이드카) ×4 · agy/gemini ×2
2468
+ model: gpt-5.5 (codex) / gemini-3.7-flash-high (agy, 핀 무시됨) / opus (거버너)
2469
+ caller: FH hub session ce820b56 — psa 유출 스캐너 R4·R5·R6 + T2 훅 1라운드
2470
+ purpose: "PR #484(psa) 와 #486(T2 훅) 델타에 대한 타계열 반증. "
2471
+ outcome: accepted
2472
+ finding: "🟥 **누계 16건 지적 · 16건 수리 · 반증 0 · 자력 적발 0.**
2473
+ psa 3라운드 11건 — 그중 **7건이 직전 라운드 «내 수리»의 산물**(R4 6건 중 4 · R5 3건 전부).
2474
+ R6 2건은 **신뢰 경계 밖**(소싱 셸 내부 함수 정의)이라 수렴 판정의 근거가 됐다 —
2475
+ 「지적 0」이 아니라 「지적의 성격」으로 멈췄다.
2476
+ T2 훅 5건 — **4가 HIGH 이고 넷 다 «오발화»**(이 훅에서 가장 비싼 급) + session_id 경로 탈출."
2477
+ note: "🟥 **agy 계열은 2회 발주 전부 죽은 계기다** — 프롬프트를 안 읽고 자기 모델을 설명하는
2478
+ 응답을 냈고(`--model` 핀도 무시), 그 축은 **미검사**이지 「지적 0」이 아니다. 계열을 나눠
2479
+ 팬아웃하려던 시도가 실패한 것이라, 오늘 탈상관은 **사실상 한 계열**이었다.
2480
+ ★자력으로 잡은 것도 있다: 죽은 계기 6건(되돌림 프로브가 `|| true` 로 errexit 자가해제 ·
2481
+ 픽스처가 뿌리를 못 바꿔 실제 레포를 스캔 · 되돌림 위치 오류로 살아있는 앵커를 「장식」 오판 ·
2482
+ 셸 능력 검사 초판이 bash/zsh 과차단 · **장식 앵커 2건**)."
2483
+ cost: "codex 4판 82,892 + 93,170 + 145,876 + 55,286 = **377,224 (기계 출처)** ·
2484
+ agy = 미측정(죽은 계기) · 거버너 = UNMEASURED. 🟥 합계 안 적는다."
2485
+
2486
+ - date: 2026-08-22
2487
+ agent: general-purpose ×4 · fh-meta:challenger ×2 (거버너 직접 디스패치)
2488
+ model: opus (전부 상속) · 1건만 sonnet 핀(README 드리프트 — 기계적 대조라 티어 무관 판단)
2489
+ caller: FH hub session 0c0a5afd — Orca 재도입 실측 + 워크트리 증거주장 철회 델타
2490
+ purpose: "Lane A(①-c peer 판별) · Lane B(워크트리 배선 소실) · 챌린저 1R·2R(철회 델타 적대검증) ·
2491
+ Lane D(README 정체성 드리프트) · Lane F(트랜스크립트 토큰 계상)"
2492
+ outcome: accepted
2493
+ finding: "🟥 **위임의 값이 산출이 아니라 «내가 못 보는 것»에서 났다 — 오늘도.**
2494
+ ① 챌린저 1R 이 내 실측의 **판별력 0** 을 지목(오염된 워크트리에서 재서 수리 전 코드로도 통과).
2495
+ 자력 적발 0. 그 오염된 표를 이미 **세 파일에 3중으로 박은 뒤**였다.
2496
+ ② 챌린저 2R 신규 S=2 A=8 B=4 — **과반이 1R 수리가 새로 넣은 문장**.
2497
+ potency stable → 「안 떨어지면 줄여라」 발동, 191줄 → 41줄 축소.
2498
+ ③ Lane B 가 내 1차 실측을 **반증**(tracks/ 는 워크트리에 있다 — 사본 747개).
2499
+ ④ Lane F **UNCALIBRATED** — known-pair 4건 재현 실패. 대신 더 큰 걸 냈다:
2500
+ `subagent_tokens` 는 소비량이 아니라 **컨텍스트 크기**이고 실제 4필드 합 대비 **16.4배 과소**.
2501
+ §Expedition 계측 ③ 이 이 값을 그대로 적으라 하는데 축 명시가 없다."
2502
+ note: "🟥 **훅은 오늘 66건을 셌는데 내가 직접 띄운 건 6건이다.** 차이는 서브에이전트 내부
2503
+ 팬아웃으로 보이나 **미검증**이다 — 낱개 복원이 불가해서 클래스로 묶고 실측 카운트를 붙였다
2504
+ (규칙이 허용하는 형태). 🟥 그리고 이 원장 자체가 **오늘 세션 내내 비어 있었다** —
2505
+ close-check 이 push 때 적발했다. CLAUDE.md 가 이 floor 를 만든 사건(20+ 디스패치 무기록)의
2506
+ 재현이고, 이번엔 66건이다. 기록 시점은 «직후» 여야 하는데 **마감에 몰아 썼다.**"
2507
+ cost: "subagent_tokens 기계 출처: 135,161 + 198,214 + 188,760 + 185,184 + 173,250 + 193,671
2508
+ = 1,074,240. 🟥 단 Lane F 실측대로 이 값은 **소비가 아니라 컨텍스트 크기**다 —
2509
+ 소비로 읽지 마라. 거버너 = UNMEASURED. 합계 안 적는다."
2510
+
2511
+ - date: 2026-08-22
2512
+ agent: peer 워크트리 세션 ×5 (Claude Code, SendMessage 로 조종)
2513
+ model: "각 세션 자기 설정 — **거버너가 못 정한다** (실측 — 남의 세션 모델 핀 불가)"
2514
+ caller: FH hub session 0c0a5afd — 거버너-레인 형태 첫 본격 운용
2515
+ purpose: "probe-peer-detect(①-c 블라인드 재현) · probe-binding-loss(체감 결손) ·
2516
+ clean-wt(EVIDENCE_ROOT 반쪽-픽스) · probe-xfam-agy(비-CC 브리지 프로브) ·
2517
+ identity4-green(정체성 ④ 초록 원정, 진행중)"
2518
+ outcome: accepted
2519
+ finding: "**서브에이전트가 구조적으로 못 하는 것을 했다.** ⓐ 블라인드 재현 — A2 가 A 의 산출을
2520
+ 안 보고 같은 두 결함에 수렴 ⓑ **자기 계기 오염을 자력 적발** — clean-wt 이 첫 명령 전에
2521
+ tracks/ 가 8→752 로 채워진 걸 스스로 잡고 `git archive` 로 pristine arm 을 따로 세웠다
2522
+ (내가 아까 못 한 것) ⓒ 결함 자리(:176)와 발현 자리(:213-214)의 분리.
2523
+ 🟥 다만 **peer 도 나와 같은 계열이라 ⓐ축(계열)은 못 채운다** — 사본 생성 주체를
2524
+ 나·Lane B·Lane E 셋이 각자 다른 범인으로 단언하고 셋 다 반증됐다. 같은 사각이었다."
2525
+ note: "채널 실측: `SendMessage` 가 **툴 라운드 사이에 자동 도착**하고 사람 개입이 없었다
2526
+ (peer 자기보고 + 회신 도착 양방향 확인). 기록된 3/4 폐기 사례와 다른 결과라 일반화 금지 —
2527
+ 「오늘 이 구성에서는 도착했다」. 🟥 그리고 **비-CC 런타임은 이 브리지에 안 잡힌다** —
2528
+ agy 를 워크트리에 실제로 띄웠고(pid 69134), `/tmp/cc-socks/` 소켓 전수가 claude 였다.
2529
+ 컨트롤 생존(기존 CC 레인은 같은 실행에서 잡힘). 사전등록 예측대로 FAIL."
2530
+ cost: "UNMEASURED — 거버너가 peer 세션 소비를 못 읽는다. 단 Lane F 가 트랜스크립트는
2531
+ 남는다는 것까지 확인했다(워크스페이스 경로 기반 디렉터리) — 다음엔 잴 수 있다."
2532
+
2533
+ - date: 2026-08-22
2534
+ agent: codex/gpt-5.5 ×3 시도 · agy ×2 (cross-family 사이드카)
2535
+ model: gpt-5.5 (codex) / antigravity 기본 (agy)
2536
+ caller: FH hub session 0c0a5afd — 철회 델타 1·2차 + Step 3-b
2537
+ purpose: "축소 전/후 델타의 주장 검증 + Step 3-b degrade 방향"
2538
+ outcome: accepted
2539
+ finding: "🟥 **계열을 나눈 값이 실물로 났다** — agy 가 「모순 없음」이라 판정한 자리에서
2540
+ codex 가 모순 2건을 찾았다(marker provenance open/closed 불일치 · 철회된 이유가 현재 이유로 잔존).
2541
+ Step 3-b 에서는 codex 가 **degrade-direction 결함** 1건 — `harness-error` 를 mandatory-pass
2542
+ 허용 상태에 넣어 오류가 pass 로 읽히는 형태. 전건 반영."
2543
+ note: "🟥 **agy 는 붙여넣은 diff 를 검증했지 레포를 안 열었다** — 산출의 파일 링크가
2544
+ `~/.gemini/config/...` 를 가리켰다. **논증 검증으로는 유효, 레포상태 검증으로는 아니다.**
2545
+ 이 구분을 안 하면 「타계열 0건」이 과신이 된다.
2546
+ codex 운용 메모: 1차 2분 타임아웃 · 2차 `--skip-git-repo-check` 없어 rc=1 · 3차 성공.
2547
+ 메모리 기록대로 **항상 stdin `-` + `--skip-git-repo-check`** 로 띄워야 한다."
2548
+ cost: "codex 3판 CLI 출력 기준: 38,275 + 19,522 + (1차 미완) · agy = CLI 미출력.
2549
+ 🟥 합계 안 적는다."
2550
+
@@ -207,9 +207,13 @@ FH 자산 커밋 → **메인 트리 전용.** 병렬이면 직렬화된다
207
207
  하위호환도 성립). 즉 「구조적으로 불가능」이 아니라 **「아직 그렇게 안 해석한다」**이다. 초판이
208
208
  이 절을 «구조적 부재» 로 적었는데 과했다 — `[[feedback_impossible_verdict_may_be_unread_half]]`.
209
209
 
210
- **해제 조건 (다음 델타의 설계 포인트)**
211
- 1. 훅의 evidence-root 를 `--git-common-dir` 기준으로 해석 마커는 파일명이 `브랜치_날짜`
212
- 워크트리끼리 **안 겹친다**.
210
+ **해제 조건**
211
+ 1. **착지했다(2026-08-18, 실사용 확인 2026-08-22).** 훅의 evidence-root
212
+ `--git-common-dir` 기준으로 해석된다. 마커는 파일명이 `브랜치_날짜` 라 워크트리끼리 겹친다.
213
+ 🟥 **이것이 닫은 것은 「도달 가능성」 하나다.** 「파일명이 브랜치_날짜라 안 겹친다」는
214
+ **충돌**에 대한 말이지 **provenance** 에 대한 말이 아니다 — 운반본과 날조본이 바이트 동일한
215
+ 문제는 그대로 열려 있다. 아래 2·3 과 함께 남아 있으므로 「워크트리에서 커밋해도 된다」로
216
+ 읽지 마라.
213
217
  2. 🟥 **진짜 설계 문제는 `edit_manifest.yaml` 이다** — 단일 공유 파일이고 **gitignored 라 머지
214
218
  기계가 없다.** §4 의 「자기 소유 파일·즉시 커밋」 규율이 여기엔 안 먹는다(커밋할 수 없는
215
219
  파일이라서). 동시 append 를 어떻게 할지가 그 델타의 본체다.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -236,6 +236,8 @@
236
236
  ".claude/capabilities",
237
237
  "scripts/prior_art_prompt.sh",
238
238
  "scripts/test_prior_art_prompt_lanes.sh",
239
- "templates/settings.PriorArt.snippet.json"
239
+ "templates/settings.PriorArt.snippet.json",
240
+ "scripts/listing_watch.sh",
241
+ "scripts/test_listing_watch_lanes.sh"
240
242
  ]
241
243
  }