@chrono-meta/fh-gate 2.0.0 → 2.0.1

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.
Files changed (39) hide show
  1. package/.claude/capabilities/adapters/gstack-content-safety.cap +110 -0
  2. package/.claude/capabilities/adapters/mate-agent-boundary.cap +110 -0
  3. package/.claude/capabilities/adapters/qasp-new-code-anchor.cap +116 -0
  4. package/.claude/capabilities/degrade-direction-scan.cap +24 -0
  5. package/.claude/capabilities/public-surface-scan.cap +24 -0
  6. package/.claude-plugin/marketplace.json +3 -3
  7. package/AGENTS.md +9 -3
  8. package/CHEATSHEET.md +17 -1
  9. package/CLAUDE.md +2 -2
  10. package/README.ja.md +55 -20
  11. package/README.ko.md +86 -20
  12. package/README.md +57 -20
  13. package/README.zh.md +49 -19
  14. package/knowledge/shared/harness-core/fh_three_layer_canon.md +96 -5
  15. package/knowledge/shared/harness-core/harness_incubator_doctrine.md +1 -1
  16. package/knowledge/shared/harness-core/harness_terminal_correlation_and_recommendations.md +214 -0
  17. package/knowledge/shared/harness-core/harness_verification_core_extended.md +1 -1
  18. package/knowledge/shared/harness-core/ship_readiness_gate.md +29 -10
  19. package/knowledge/shared/learnings/subagent_invocations_log.yaml +62 -0
  20. package/package.json +10 -2
  21. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  22. package/plugins/fh-meta/.claude-plugin/plugin.json +2 -2
  23. package/plugins/fh-meta/CHANGELOG.md +17 -0
  24. package/scripts/adapters/gstack_content_safety.sh +186 -0
  25. package/scripts/adapters/mate_agent_boundary.sh +120 -0
  26. package/scripts/adapters/peer_resolve.sh +99 -0
  27. package/scripts/adapters/qasp_new_code_anchor.sh +159 -0
  28. package/scripts/branch_claim.sh +14 -0
  29. package/scripts/capability_effect_probe.sh +340 -20
  30. package/scripts/capability_registry_check.sh +198 -10
  31. package/scripts/cluster_capability_scan.sh +629 -0
  32. package/scripts/fh_session_load.sh +70 -0
  33. package/scripts/portability_lint.sh +257 -0
  34. package/scripts/relay_channel.sh +70 -7
  35. package/scripts/selfcheck.sh +138 -1
  36. package/scripts/test_adapter_lanes.sh +296 -0
  37. package/scripts/test_capability_entrypoint_shipping.sh +8 -1
  38. package/scripts/test_relay_channel_lanes.sh +76 -0
  39. package/templates/.git-hooks/pre-commit +14 -2
@@ -299,7 +299,7 @@ disruptive path *looks inferior early* — running it is a deliberate bet, named
299
299
  ### 4-b. Boundary crossing — what actually flows between harnesses
300
300
 
301
301
  Compose and disrupt say *what FH does to* other harnesses. They do not say **what moves across the
302
- boundary, or what must not**. That gap is where the value of a multi-harness cluster is won or lost, so
302
+ boundary, or what must not**. That gap is where the value of the **harness cluster** (identity ①; renamed from "multi-harness cluster" 2026-08-16 — "multi" and "cluster" both meant plurality) is won or lost, so
303
303
  name it: a harness that only deepens its own well stays blind to what the neighbouring well knows —
304
304
  one harness sees runtime behaviour and not source structure, another sees source structure and never
305
305
  runtime. **The meta-harness's job is not to dig a deeper well; it is to make outputs flow across the
@@ -0,0 +1,214 @@
1
+ ---
2
+ name: harness-terminal-correlation-and-recommendations
3
+ description: "Imported-and-reviewed report on how an AI agent harness relates to its terminal/orchestration environment (cmux vs Orca, both worktree-based orchestrators), human cognitive load bounds, risk-driven sandboxing, and execution-model recommendations. Authored by an external runtime 2026-08-15; corrected under the FH 4-axis gate 2026-08-16 — the original mis-cast Orca as a kernel sandbox."
4
+ date: 2026-08-15
5
+ tags: [harness, terminal, cmux, orca, architecture, ergonomics, governor-pattern, risk-driven-sandboxing, imported-reviewed]
6
+ ---
7
+
8
+ # 하네스와 터미널 간 상관관계 및 사용 추천 (Correlation & Recommendation Report)
9
+
10
+ ## Executive Summary
11
+
12
+ 본 분석 보고서는 **AI 에이전트 하네스(Agent Harness)의 발달 수준과 터미널 환경(Multiplexer / Sandbox) 간의 상관관계 및 직교적 계층 구조**를 규명하고, 신뢰성 기반의 최적 운용 모델을 제안합니다.
13
+
14
+ * **핵심 명제**: **"신뢰된 로컬 개발 환경에서는, 터미널 인프라에 의존하지 않는 얇은 하네스(Thin Harness)로 충분하다."** (전칭 «가장 뛰어난» 을 뺐다 — 비교 모집단을 잰 적이 없다)
15
+ * **결론**: 에이전트 자체의 오케스트레이션 및 자가 검증(**4축 게이트** — Axis 1 `regression_guard.sh` · Axis 2 `steel-quench` · Axis 3 `phantom-quench` · Axis 4 `edit-manifest`, FH 자산 변경 시 **커밋 경계에서 훅으로 강제**)이 성숙한 환경에서는 터미널 멀티플렉서(`cmux`)를 **가벼운 UI 껍데기**로 활용하고 **거버너(Governor) 에이전트 위임 모델**을 적용하는 것이 인지 부하를 최소화합니다. 단, 비신뢰 코드 실행 및 파괴적 부작용이 수반되는 과제는 **위험도 기반 샌드박싱(Risk-Driven Sandboxing)**에 따라 **실제 커널 경계를 가진 샌드박스**(Firecracker · Kata · gVisor · Docker Sandboxes 계열)를 하부에 계층화하여 방어합니다. 🟥 초판은 이 자리에 `Orca` 를 적었고 그것은 틀렸다(§4 최종추천 2 · §명명된 잔여 1).
16
+
17
+ ---
18
+
19
+ ## 1. 문제 제기 및 백그라운드
20
+
21
+ 과거 AI 에이전트 운용 초기에는 에이전트의 오탐, 환각, 호스트 파일시스템 오염을 막기 위해 **외부 인프라(터미널 멀티플렉서, 무거운 Docker/VM 샌드박스)**로 에이전트를 감싸고 통제했습니다.
22
+
23
+ 그러나 메타 하네스(`forge-harness`) 체계가 도입되면서, 에이전트 스스로 하위 작업을 생성·위임하고, 검증(4축 게이트)과 마감 피어 동기화(`knowledge/shared/rules/multi_session_close_protocol.md` — **마감 순서와 peer 델타 append 규율**이지, 메모리 색인 락이 아니다)를 소프트웨어적 통제 레이어에서 수행할 수 있게 되었습니다.
24
+
25
+ 이에 따라 **개발자 UX를 위한 UI 레이어(`cmux`)**, **거버넌스·오케스트레이션 레이어(`FH`)**, 그리고 **OS/커널 보안 레이어**의 역할 분담 및 선택 기준을 규정할 필요성이 제기되었습니다. 🟥 **초판은 세 번째 자리에 `Orca` 를 놓았으나 Orca 는 보안 레이어가 아니다** — Stably AI 의 멀티에이전트 오케스트레이터 데스크톱 앱이고 격리 기전이 **git worktree** 라, `cmux`·`FH` 와 **같은 층의 경쟁재**다.
26
+
27
+ ---
28
+
29
+ ## 2. 3계층 구조 대조 분석 (UI · 거버넌스 · 보안실행)
30
+
31
+ 터미널 및 하네스 수단은 선형 대체 관계가 아닌 **3계층 구조**입니다. 🟥 **단 «직교»는 과장이다** — 아래 표가 보여주듯 UI 층(cmux)과 프로토콜 층(FH)은 **worktree 격리에서 겹친다**. 초판은 «cmux 격리 = 없음»을 전제로 직교를 주장했고 그 전제가 틀렸다(임포트 심사에서 외부 1차 문서로 반증). 실제 구분선은 *격리를 제공하느냐*가 아니라 **검증 게이트를 강제하느냐**다:
32
+
33
+ ```
34
+ ┌─────────────────────────────────────────────────────────┐
35
+ │ 1. Presentation / UI Layer (e.g. cmux) │ ──> 인간의 시각적 탭/세션 관리를 위한 껍데기
36
+ ├─────────────────────────────────────────────────────────┤
37
+ │ 2. Protocol / Governance Layer (e.g. forge-harness) │ ──> 지능적 오케스트레이션, 검증 게이트, 소스 앵커링
38
+ ├─────────────────────────────────────────────────────────┤
39
+ │ 3. Execution / Security Sandbox Layer │ ──> OS/커널 레벨의 보안, 자원 쿼터, 파괴 방지
40
+ │ (Firecracker · Kata · gVisor · Docker Sandboxes) │ ⚠️ 이 층에 Orca·cmux 는 해당하지 않는다
41
+ └─────────────────────────────────────────────────────────┘
42
+ ```
43
+
44
+ | 비교 축 | Execution Sandbox (Firecracker · gVisor · Docker Sandboxes) | UI/오케스트레이터 (`cmux` · `Orca`) | Protocol-Native Harness (FH 거버너 위임) |
45
+ |---|---|---|---|
46
+ | **계층 역할** | OS/커널 레벨의 물리적 보안 및 자원 격리 | 시각적 탭/창 관리를 위한 UI 껍데기 | 지능적 오케스트레이션 및 소스 앵커링 |
47
+ | **격리 범위** | 파일시스템, 네트워크 포트, 커널, CPU/RAM 쿼터 | 🟥 **«없음» 이 아니다** — cmux 는 local / **worktree** / SSH 워크스페이스를 자체 제공한다고 공식 페이지가 밝힌다(<https://cmux.com/>, 2026-08-16 열람). ⚠️ 이는 **벤더 서술이며 격리 강도를 실측한 것이 아니다** | 서브에이전트 컨텍스트 격리 (별도 컨텍스트 윈도우·요약 반환). **worktree 는 FH 의 기본 격리 수단이 아니다** |
48
+ | **주요 장점** | 비신뢰 코드 실행 시 호스트 시스템 보호(완전 격리는 아니다 — MicroVM 탈출 사례가 실존한다) | 낮은 인지 오버헤드, 빠른 로컬 파일 접근 | 편향 격리(저자 추론을 못 본 채 평가), 컨텍스트 보존, 검증 게이트 |
49
+ | **주요 단점** | 기동 오버헤드, 피어 감지 및 볼륨 바인딩 마찰 | 자원 경합 및 직접적인 호스트 부작용 무방비 | 에이전트의 거버넌스 능력 필요. 🟥 **worktree 를 쓰면 게이트가 깨진다** (아래 §3.2 주의) |
50
+ | **선택 기준** | **비신뢰 코드, 패키지 설치, 파괴적 셸 실행** | **신뢰된 로컬 환경 (1~3개 상위 세션)** | **모든 에이전트 오케스트레이션 및 검증** |
51
+
52
+ ---
53
+
54
+ ## 3. 구조적 상관관계 메커니즘
55
+
56
+ ### 3.1. 인간 활성 인지 한계 ($N_{human} \le 3$) vs 서브에이전트 비동기 병렬성 ($M_{subagent}$)
57
+ 보고서의 세션 제한 규율은 **인간의 동기식 의사결정 맥락**과 **서브에이전트 백그라운드 병렬성**으로 명확히 구별됩니다.
58
+
59
+ 1. **인간 활성 세션 ($N_{human} \le 3$)**:
60
+ * 개발자가 직접 개입하고 의사결정을 내리는 동기식 스트림을 **최대 3개**로 제한합니다. 🟥 **이 «3»은 운영자의 운용 규율이지 문헌값이 아니다** — 초판은 Miller's Law 에 귀속시켰으나 Miller(1956)의 수는 **7±2 chunks**(단기기억 span), 4±1 은 Cowan(2001)이고 **어느 쪽도 3을 주지 않는다.** 권위 이름을 뗀 채로 둔다(근거 = 운영 경험, 표본 미측정).
61
+ * **Stream 1**: 메인 도메인 기능 개발 (Feature Track)
62
+ * **Stream 2**: 시스템 리팩토링 및 테스트 (Refactoring Track)
63
+ * **Stream 3**: 실험적 R&D 및 스펙 검토 (Research Track)
64
+ 2. **서브에이전트 백그라운드 병렬성 ($M_{subagent}$)**:
65
+ * 거버너 에이전트 하위에서 백그라운드로 작동하는 비동기 서브에이전트는 인간 인지 부하를 **크게 늘리지 않으므로** $M > 3$ 병렬 실행이 가능하다고 **가정**합니다. ⚠️ **미측정 운용 가설이다** — «인지 부하 0» 도 «자원·rate limit 에 의해서**만** 제한» 도 잰 적이 없다(거버너의 통합·검토 부담은 M 에 따라 늘어난다). 재려면 M 을 바꿔가며 거버너 턴수·정정 횟수를 세야 한다.
66
+
67
+ ### 3.2. 거버너 + 위임 패턴 및 요약 페이로드 게이트 (Context Budgeting)
68
+ `forge-harness`의 기본 독트린은 **거버너(Governor) 세션이 마감 권한과 소스 재검증 권한을 독점**하고, 하위 에이전트에게 **컨텍스트 격리**(별도 컨텍스트 윈도우, 저자 추론 미상속)를 위임하는 방식입니다.
69
+
70
+ > 🟥 **worktree 로 위임하지 마라 — 이건 FH 가 실측으로 반대하는 경로다.** `CLAUDE.md §Agent Dispatch
71
+ > Operation` 이 정본이다: ⓐ 문서가 설치를 지시하는 **상대경로 `core.hooksPath`** 형태에서는
72
+ > worktree 안의 훅 사본을 고치면 그 worktree 의 게이트가 무력화된다(실측 `rc=0` — 마커 없는 FH 자산
73
+ > 커밋이 통과). ⓑ 그와 무관하게 **`tracks/` 가 gitignored 라 worktree 로 따라가지 않으므로**, Axis 2–3
74
+ > 마커와 Axis 4 매니페스트가 **구조적으로 부재**한다 — 만족시킬 수 없는 게이트는 우회를 훈련시킨다.
75
+ > ⇒ **FH 자산 커밋은 표준 세션에서 한다.** worktree 는 «자율 하위 격리»의 수단이 아니라 게이트 무결성
76
+ > 위험이며, 이 문서의 초판은 그것을 강점으로 서술했다(임포트 심사에서 정정).
77
+
78
+ 단, 거버너 세션의 컨텍스트 윈도우 포화(Context Rot)를 방지하기 위해 서브에이전트는 대용량 원문 대신 **정제된 요약 페이로드(Summary Payload / Context Card)** 형태로 거버너에게 보고하며, 거버너는 앵커링 시에만 해당 디스크 아티팩트를 원문 대조합니다.
79
+
80
+ ```mermaid
81
+ graph TD
82
+ Human["👤 작업자 (Human Director)"] -->|"상위 목표 전달 (N_human ≤ 3)"| Gov["👑 Governor Agent (Main Session)"]
83
+ Gov -->|컨텍스트 격리 위임| Sub1["🤖 Subagent A (기능 구현)"]
84
+ Gov -->|컨텍스트 격리 위임 · 블라인드| Sub2["🛡️ Subagent B (Axis 2 steel-quench 적대 심사)"]
85
+ Gov -->|컨텍스트 격리 위임| Sub3["🔍 Subagent C (Axis 3 phantom-quench 출처 역추적)"]
86
+ Sub1 -->|Summary Payload 요약 반환| Gov
87
+ Sub2 -->|Summary Payload 요약 반환| Gov
88
+ Sub3 -->|Summary Payload 요약 반환| Gov
89
+ Gov -->|디스크 아티팩트 소스 대조 & 앵커링| MainTree["📦 Main Working Directory & Knowledge"]
90
+ ```
91
+
92
+ ### 3.3. 세션 간 메모리 동기화 (Peer Dialog Protocol의 범위)
93
+ 병렬 세션 간 마감 충돌은 `multi_session_close_protocol.md` 의 **마감 순서 규율 + peer 델타 append(자기 소유 파일에만 쓴다)**로 다룹니다. 🟥 **다만 이것을 «메모리 색인 쓰기 충돌의 완화책»으로 읽으면 안 된다** — 그 프로토콜에는 메모리 색인 락도 트랜잭션 락도 **없다**. 그리고 그 문서 자신이 명시하는 한계가 이 문서의 cmux 권고를 직접 약화시킨다: **peer 판별이 cwd 매칭이라 다른 worktree 의 peer 를 못 잡는다.** 즉 세션을 늘릴수록 «살아있는 peer 에게 물어본다» 단계가 조용히 빈다. 동시 쓰기의 실제 방어선은 이 프로토콜이 아니라 **디렉터리/파일 소유 분리**이며, 락은 현재 존재하지 않는 미구축 항목이다.
94
+
95
+ ---
96
+
97
+ ## 4. 위험도 기반 샌드박싱 의사결정 트리 (Risk-Driven Decision Tree)
98
+
99
+ ```
100
+ [ 새로운 작업 오더 ]
101
+
102
+ Is Execution Dangerous / Untrusted?
103
+ (비신뢰 코드, 외부 패키지, 파괴적 셸)
104
+
105
+ ┌────────────┴────────────┐
106
+ YES NO
107
+ │ │
108
+ [ 커널 샌드박스 ] [ Meta-Harness (FH) / Thin Protocol + cmux ]
109
+ (OS/커널 물리 격리 적용) (표준 세션 + 거버너 오케스트레이션)
110
+
111
+ Human Decision Streams?
112
+
113
+ ┌─────────┴─────────┐
114
+ N_human <= 3 N_human > 3
115
+ │ │
116
+ [ cmux 1~3개 탭 ] [ 인지 과부하 경고: ]
117
+ (가벼운 UI 껍데기) [ 과제 통합 및 조정 ]
118
+ ```
119
+
120
+ ### 최종 요약 추천
121
+ 1. **신뢰된 로컬 환경 (Trusted Local Setup)**: **`Meta-Harness (forge-harness) + cmux` (가벼운 UI 껍데기 1~3개 탭)**
122
+ * 메타 하네스가 자가 검증(4축 게이트)과 거버너 오케스트레이션, 서브에이전트 **컨텍스트 격리**를 수행하므로, 인프라 오버헤드가 없는 `cmux` 를 **잠정 권고**합니다(이 운영자 구성에서의 판단, n=1 · cmux 미실측). 여기서 "Thin Harness"는 인프라 샌드박스 대비 소프트웨어 프로토콜 중심이라는 최소 기준을 의미하며, `forge-harness`는 이 계층의 최상위 메타 하네스로 작동합니다.
123
+ * ⚠️ **범위 한정**: `cmux` 는 **macOS 전용 네이티브 앱**이다. FH 지식본은 크로스플랫폼이므로 이 권고는 macOS 노드에만 적용되며, 리눅스/윈도우 노드의 UI 층 선택은 이 문서가 다루지 않는다(미조사).
124
+ 2. **비신뢰 및 파괴적 과제 (Untrusted Execution)**: **실제 커널/하이퍼바이저 샌드박스** — Firecracker · Kata Containers · gVisor · Docker Sandboxes 계열
125
+ * 파괴적 셸 명령, 비신뢰 외부 코드 실행 시에는 커널 경계를 가진 샌드박스를 하부에 배치해 호스트 노출을 크게 줄입니다(«완벽»이 아니다 — 커널/하이퍼바이저 탈출은 실존하는 위협 클래스다).
126
+ * 🟥 **초판은 여기에 `Orca` 를 «물리 샌드박스»로 적었고 그건 틀렸다. 이 정정이 이 문서에서 가장
127
+ 중요하다** — `stablyai/orca` 는 *"The AI Orchestrator for 100x builders"* 로, 격리 기전이
128
+ **git worktree** 다(*"each in its own isolated git worktree"*). 커널 격리도 MicroVM 도 컨테이너도
129
+ **없다.** 초판의 권고를 그대로 따르면 **비신뢰 코드를 커널 샌드박스로 착각한 채 호스트에서 그냥
130
+ 실행하게 된다.** worktree 는 «어느 파일을 보느냐»의 분리이지 «무엇을 실행할 수 있느냐»의 경계가
131
+ 아니다 — 같은 커널·같은 사용자 권한·같은 네트워크다.
132
+
133
+ ---
134
+
135
+ ## 5. FH 는 Orca 를 이미 써 보고 떠났다 (2026-07-12 기록)
136
+
137
+ 이 문서가 놓친 가장 큰 맥락은 **FH 가 Orca 를 실제로 운용해 본 이력이 있다**는 것이다.
138
+ 따라서 «Orca vs cmux» 는 가설 비교가 아니라 **이미 내려진 결정의 사후 서술**이다.
139
+
140
+ > 🟥 **출처 도달성 — 이 절의 표는 리뷰어가 검증할 수 없다.** 근거는 운영자 memory
141
+ > `reference_orca_app_config.md`(2026-07-12) · `feedback_no_ui_terminal_native_identity.md` 인데,
142
+ > **둘 다 이 레포에 없다**(비공개 컴패니언 스토어의 gitignored 기록). 즉 아래 표는
143
+ > `LOCAL-ONLY ATTESTATION — UNVERIFIED` 이며, 저자의 주장이지 리뷰어가 확인한 증거가 아니다.
144
+ > 이것은 `fh_4axis_gate.md §Reviewer-visible evidence` 가 지적하는 «증거를 리뷰어가 닿을 수 없는
145
+ > 곳에 둔» 바로 그 형태다 — 라벨은 갭을 정직하게 드러낼 뿐 닫지 않는다. **cross-family 심사가
146
+ > 지목해서 추가된 문단이다**(내부 세션은 자기 memory 가 보이니 이 결손이 안 보였다).
147
+
148
+ | 관찰(2026-07-12 실측) | 함의 |
149
+ |---|---|
150
+ | Orca 는 작업마다 `~/orca/workspaces/<레포>/<브랜치>/` 에 워크트리를 판다 | FH 자산 커밋 경로와 정면 충돌 — §3.2 의 게이트 무결성 문제를 **구조적으로 상시 유발** |
151
+ | 그 결과 세 레포에 **방치 브랜치 다수** 발생, 스윕으로 정리 | 병렬성의 정리 비용이 사람에게 남는다 |
152
+ | 에이전트별 기본 인자에 `--dangerously-skip-permissions` 가 박혀 있었다 | 승인 게이트를 기본값으로 우회 — FH 의 HITL 규율과 반대 방향 |
153
+ | 상태 훅이 **프롬프트 원문·툴콜까지** 로컬 상태파일에 기록 (실측 확인 후 OFF) | 텔레메트리 표면. residency 관점에서 점검 대상 |
154
+
155
+ **운영자 결론(그대로 인용)**: FH 는 *"사람=선형적 단일스레드로 거버넌스, AI=병렬 사이드카가
156
+ 흩어졌다 다시 모여 결과만 보고"* 하는 구조인데, Orca 는 반대로 *"병렬성을 사람이 보는 표면에
157
+ 그대로 노출"* 시켜 **통합 부담을 사람에게 떠넘긴다.**
158
+
159
+ ⇒ 이것이 cmux 로 옮긴 실제 이유이며, §3.1 의 $N_{human} \le 3$ 과 같은 축이다: **UI 층은 병렬성을
160
+ 보여주기만 해야 하고, 병렬성을 관리하는 주체는 거버너여야 한다.**
161
+
162
+ ⚠️ **단 이것은 도구의 속성이 아니라 «어떻게 쓰느냐»의 문제다** — cmux 도 팀/에이전트 오케스트레이션
163
+ 기능을 갖고 있다(공식 페이지). 여기서 «가벼운 UI 껍데기»는 **그 기능을 쓰지 않고 탭 관리로만 쓰는
164
+ 운용 구성**을 가리키며, 그렇게 쓰는 한 통합 부담이 거버너에 남는다. 같은 도구를 오케스트레이터로
165
+ 쓰기 시작하면 Orca 에서 떠난 이유가 **cmux 에서도 그대로 재발한다.** (초판 정정문은 이를 cmux 의
166
+ 속성인 것처럼 썼고, cross-family 심사가 그 과장을 지목했다.)
167
+
168
+ ---
169
+
170
+ ## 명명된 잔여 (Named Residuals)
171
+
172
+ 이 문서는 **다른 런타임(Antigravity/Gemini 계열)이 2026-08-15 에 작성한 것을 2026-08-16 에 FH 로
173
+ 임포트하면서 4축 게이트로 심사한 판본**이다. 초판의 주장 중 반증된 것은 위 본문에 🟥 로 표시했다.
174
+ 남은 잔여는 다음과 같다 — 닫힌 척하지 않는다.
175
+
176
+ 1. ✅ **`Orca` 오귀속 — 해소됨(운영자 지목 + 실물 확인). 이 문서 최대의 정정이다.**
177
+ 초판은 Orca 를 «OS/커널 MicroVM 물리 샌드박스»로 세웠다. 실물은
178
+ [`stablyai/orca`](https://github.com/stablyai/orca) — *"The AI Orchestrator for 100x builders"*,
179
+ *"each in its own isolated **git worktree**"* 다. 커널 격리도 MicroVM 도 컨테이너도 **없다.**
180
+ ⇒ Orca 는 보안층이 아니라 **`cmux`·FH 와 같은 층의 오케스트레이터**다.
181
+ 위험도는 분류 오류에 그치지 않는다: 초판을 그대로 따르면 **비신뢰 코드를 커널 샌드박스로 착각한
182
+ 채 호스트 권한으로 실행하게 된다.**
183
+ 2. **cmux 는 로컬 미설치 — 벤더 1차 문서 대조까지만 했고 런타임 실측이 아니다.** 워크스페이스 격리
184
+ 제공 사실은 공식 문서 기반이며, 그 격리의 *강도*는 재지 않았다.
185
+ 3. **`N_human ≤ 3` 은 표본 미측정 운용 규율**이다(§3.1). 문헌 근거 없음이 확인된 상태이지,
186
+ 3이 옳다고 검증된 것이 아니다.
187
+ 4. **메모리 색인 동시쓰기 방어는 미구축**이다(§3.3). 하네스 층 파일 락은 존재하지 않으며,
188
+ 현재 방어선은 파일 소유 분리라는 *규율*뿐이다.
189
+ 5. **부록의 심사 이력은 저자 런타임 자기신고**이며 재현 불가하다(아래 부록 자체 주석 참조).
190
+ 6. **표본 n=1** — 단일 운영자·단일 머신 구성에서의 판단이다.
191
+
192
+ ---
193
+
194
+ ## Appendix: `ko-tech-writer` & 글로벌 전문가 심사 이력 (Audit Log)
195
+
196
+ | 파이프라인 단계 | 수행 항목 및 결과 | 비고 / check-class |
197
+ |---|---|---|
198
+ | **Step 0 레지스터** | 독자용 아키텍처 기술문서 (문어 존댓말/명료체) | mandatory-pass |
199
+ | **Step 1 캘리브레이션** | FH Knowledge Core 정본 표본(`knowledge/shared/harness-core/fh_ecosystem_positioning.md`) 서식 및 톤 대조 완료 | mandatory-pass |
200
+ | **Step 2 문체 규율** | 번역투·조각문 5종 스캔 «잔여 0건 (양성 컨트롤 동반)» 주장 | 🟥 `UNCALIBRATED` — 컨트롤이 무엇이었는지·재현 커맨드·출력이 **하나도 없다**. 재현 불가한 0은 0의 증거가 아니다 |
201
+ | **Step 3 정직 수위** | 저자 내부 집계 규율 서술 제거 및 독자 의사결정 기반 정보 보존 | judged |
202
+ | **Step 4 수치·주장 게이트** | 수치 전수 추출 + «전칭 단정 스캔 잔여 0건» 주장 | 🟥 `UNCALIBRATED — 자기반증`: 그 «0건» 시점에 본문에 전칭 단정이 **3건 살아 있었다**(«완벽 보호» ×2, «가장 뛰어난 하네스») — 임포트 심사가 손으로 잡아 정정했다. 계기는 초록인데 대상을 안 쟀다 |
203
+ | **Step 5 지각 QA** | Mermaid 다이어그램 노드 레이블 및 Decision Tree ASCII 렌더링 시각 확인 완료 | judged |
204
+ | **글로벌 인프라 심사** | 논리 격리 vs 보안 샌드박싱 분리, 자원 경합 및 Context Budgeting 피드백 반영 | 🟥 `LOCAL-ONLY ATTESTATION — UNVERIFIED`: 저자 런타임(Antigravity) 측 심사이고, 짝으로 적혀 있던 `research` 서브에이전트는 **이 레포에 존재하지 않는다**(등록 에이전트 8종 중 없음). FH 안에서 재현 불가 |
205
+ | **적대적 공격 심사** | 직교적 3계층 모델 재정립, $N_{human}$ vs $M_{subagent}$ 인지 분리, 샌드박싱 조건 개고 | 🟥 `LOCAL-ONLY ATTESTATION — UNVERIFIED`: `challenger` 는 실재하는 FH 에이전트지만(`plugins/fh-meta/agents/challenger.md`), 이 행이 가리키는 실행의 마커·로그가 없다. **이름의 실재는 실행의 증거가 아니다** |
206
+
207
+ > 🟥 **이 부록 전체의 지위**: 저자 런타임의 **자기신고**이며, 위 «잔여 0건»·«PASS» 는 아티팩트로
208
+ > 뒷받침되지 않는다. FH 자기 규율상 이것은 증거가 아니라 저자의 주장이다
209
+ > (`fh_4axis_gate.md §Reviewer-visible evidence` 의 degrade 라벨을 그대로 적용).
210
+ > **이 문서에 대한 재현 가능한 심사는 임포트 시점의 4축 게이트 기록**이며, 그 델타는
211
+ > 부록이 아니라 커밋 이력과 `tracks/_meta/edit_manifest.yaml` 2026-08-16 항목에 있다.
212
+
213
+ ---
214
+ *Authored by an Antigravity (Gemini-family) runtime, 2026-08-15; imported into the FH Knowledge Core and reviewed under the 4-axis gate on 2026-08-16.*
@@ -14,7 +14,7 @@ has two structurally different sources of lift:
14
14
  | Mode | What it is | Availability |
15
15
  |---|---|---|
16
16
  | **Core** | Verification questions FH/PMH can ask **natively, with no cluster member present** — methodology internalized as FH's own lens | Must hold stand-alone (cluster-independent) |
17
- | **Extended** | Verification **instruments** dispatched from the multi-harness cluster — a field QA harness's audit lens, a trace-boundary auditor, a process-fidelity/judge harness | Available when the cluster member and its consent lane are |
17
+ | **Extended** | Verification **instruments** dispatched from the **harness cluster** (identity ①; renamed from "multi-harness cluster" 2026-08-16) — a field QA harness's audit lens, a trace-boundary auditor, a process-fidelity/judge harness | Available when the cluster member and its consent lane are |
18
18
 
19
19
  **First clause (the boundary)**: *harness-verification core = the FH-native triad-consistency lens;
20
20
  harness-verification extended = cluster instruments.* The operative test is **what discharges the
@@ -48,7 +48,7 @@ as a humble concession. The reference is AlexNet: on data it had never seen, it
48
48
  against the realistic alternative (a plain single-model session, a competing harness's flow), our harness
49
49
  must **decisively win**, not merely tie or "also work."
50
50
 
51
- The composition identity (멀티하네스 클러스터) is downstream of this: we equip *other* harnesses onto the
51
+ The composition identity (**하네스 클러스터** — 2026-08-16 에 「멀티하네스 클러스터」에서 줄임, [§①-naming](#id1-naming)) is downstream of this: we equip *other* harnesses onto the
52
52
  parts **we deliberately chose not to cover, or left general-purpose** — a decision made from strength, after
53
53
  proving we would win the parts we do cover. Composing because we *can't* win is weakness wearing the costume
54
54
  of humility; composing because we *choose* the frontier and hand the rest to specialists is dominance.
@@ -89,6 +89,15 @@ the *only* thing that caught the irreversibility/safety class; competitors HITL
89
89
  theirs. A dominance benchmark is also *diagnostic*: where we do NOT yet dominate tells us exactly where to go
90
90
  next (the operator: "압도성을 결과로 봐야 앞으로 나아갈 방향을 안다").
91
91
 
92
+ > 🟥 **①에 한한 예외 (운영자 결정, 2026-08-16).** 정체성 ①(하네스 클러스터)에는 이 절의
93
+ > dominance 요구를 적용하지 않고 **ⓐⓑⓒ 3기준**(재사용이 실재하고 호출 가능한가 · FH 가 안
94
+ > 커졌는가 · 뾰족함이 보존되는가)으로 대체한다. **이 절이 틀려서가 아니라 ①에 대해 겨냥이
95
+ > 틀린 계기이기 때문**이다 — ①의 산출은 «더 많이 잡았다»가 아니라 **«안 지어도 됐다»** 다.
96
+ > 결정 전에 **두 번 쟀고 둘 다 미성립**이었다(상보 · safety 동률). 근거·측정·반증조건은
97
+ > [§①-2026-08-16](#id1-20260816) 와 두 개의 사전등록/결과 쌍
98
+ > (`tracks/_meta/dominance_2026-08-16*_RESULT.md`). **다른 행은 이 절 그대로다.**
99
+ > 이 예외를 다른 행으로 넓히려면 같은 절차를 밟아라 — 사전등록 → 측정 → 미성립 → 운영자 결정.
100
+
92
101
  ## The gate is the audit method (reusable)
93
102
  Score with the same triangulation the 2026-07-14 audit used — no single-source self-attestation:
94
103
  1. **Cross-family falsifiable checklist** — draft the per-identity PASS criteria with ≥2 decorrelated
@@ -158,7 +167,7 @@ where those numerals mean *identities*.
158
167
  > recorded here so they stay readable, **not** to make the numbering canonical. New writing uses names.
159
168
 
160
169
  **Why engines gate the advertised capabilities**: the harness's most-advertised surfaces — incubating a new
161
- project, orchestrating a multi-harness cluster — are simultaneously *long, autonomous, novel and shipping*.
170
+ project, orchestrating the harness cluster — are simultaneously *long, autonomous, novel and shipping*.
162
171
  They therefore load all four engines at once, which is why a harness with a mature ship-gate and little
163
172
  else appears to fail *at* those surfaces while the cause is underneath them.
164
173
 
@@ -273,7 +282,7 @@ unchanged and keeps its own 2026-07-14 evidence).
273
282
  | ③ | 거버넌스 게이트 (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) |
274
283
  | ⑤ | 증폭자 (amplifier) | judgment-circuit | 🟢 GREEN | short-intent→literature-grounding→ultimate-doc real instances; rules-diet −18.2k measured; intent-routing probe 94% (below) |
275
284
  | ④ | 프런티어→조직 전파 (**🔵 RC, 2026-08-09**) | external-grounding | 🔵 RC | frontier-digest launchd auto + AX submission docs both real, but digest→org never closed as ONE pipeline. **2026-08-09**: the missing link was built — `scripts/digest_landing_check.sh` extracts the digest's candidate table into probes and reuses the existing landing checker (no second verifier). Self-test 8 lanes green. **🔵 RC (2026-08-09)**: the mtime defect that initially held it back is closed — the since-filter now splits two axes (git-tracked → commit time via `git log --since`; gitignored `tracks/**` → mtime, the only evidence that axis has; dirty-tracked → `UNMEASURED`), and **two lanes pin that split**: a file with only a fresh mtime is *not* counted, and a file with only a fresh commit *is* counted even when its mtime is stale. The second lane matters — without it the fix degenerates into "discard all tracked files so only negatives pass" (named by the cross-family reviewer). Self-test **10 lanes** green. **What remains is a named residual, not a calibration gap**: `file-change ≠ token-introduction` — a file committed after the digest may carry the token from before (closing it needs token-level diff, which does not fit the checker's interface). The instrument therefore prints, and this row states, that it is a **screener, not an adjudicator**: hits must be opened. Four real runs, four hand-verifications, four defects found |
276
- | ① | 멀티하네스 클러스터 (**🔵 RC, 2026-08-09**) | context-continuity | 🔵 RC | 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 is *멀티하네스 클러스터*; 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` |
285
+ | ① | 하네스 클러스터 (**🟢 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 기록 필수 · 게이트는 그대로)로 좁히기 전엔 자동화하지 않는다. **미구축이며, 미구축이라고 적는다.**
277
286
  | ② | 프로젝트 인큐베이터 (**🔵 RC, 2026-08-09**) | context-continuity + judgment-circuit | 🔵 RC | **RC 세 다리가 섰다** — (a) 구현: `chamber_run.sh` 6단계 게이트 (b) known-pair: 러너 게이트 **18 레인**(`test_chamber_run_lanes.sh`, BLOCK/PASS 대칭 — PASS arm 이 있어야 "전부 막는 게이트"도 걸린다) + 순서 증인 **16 레인**(`chamber_witness.sh`) (c) self-test 초록. **실상황 발화 대기 = formal chamber EMIT 아직 0** — 그것이 RC 가 🟢 이 아닌 이유이자 RC 정의 그 자체다. ⚠️ **그 0 의 해석이 2026-08-09 에 바뀌었다**: 지금까지 *"챔버가 엄격해서"* 로 읽었으나, KILL 된 후보 다수가 **메타-형** 이고 유일한 EMIT(`forge-wiki`)만 **필드-형** 이다 — 즉 *낳을 수 없었던* 게 아니라 **애초에 대상이 아닌 후보가 들어왔을** 가능성이 있다. 필드 ⊥ 메타 프로파일과 씨앗(precocial) 기준 정의: `harness_incubator_doctrine.md §3-a`. ⚠️ 그 분류는 **사후에 이뤄졌고 n=9** 라 가설이다 — 사전 등록 후 다음 런을 예측해야 결과가 된다. 아래 옛 판정 줄은 이력으로 남긴다 |
278
287
  | ②-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 → 🟡 |
279
288
 
@@ -380,8 +389,12 @@ incubator entry absorbed into deep-clarify) — the identity-② weakness surfac
380
389
  > external-grounding=질문하기), 그 대응은 새로 만든 것이 아니라 이 표에 이미 있던 것이다.
381
390
 
382
391
  **Verdict (2026-08-09 — supersedes the 2026-07-14 line)**: FH is tagged **`v0.1.0` = honest baseline**,
383
- not all-green. ③⑤ are 🟢, **①②④ are 🔵 RC**, **none 🔴** the `v0.1.0` notes state this and make no
392
+ not all-green. ~~③⑤ are 🟢, **①②④ are 🔵 RC**~~ **2026-08-16: ①③⑤ are 🟢, ②④ are 🔵 RC**,
393
+ **none 🔴** — the `v0.1.0` notes state this and make no
384
394
  all-green claim (per the refined 0.x↔1.0 mapping above). **`v1.0.0` remains the all-green target.**
395
+ 🟥 **①의 🟢 은 기준이 바뀐 결과다** — 옛 dominance 절로 재면 오늘도 🔵 이고, 두 번 쟀고 둘 다
396
+ 미성립이었다. 무엇이 왜 바뀌었는지는 [§①-2026-08-16](#id1-20260816) 을 읽어라. **그 행이 명시
397
+ 잔여 셋(외부 소유 선언 n=1 · qasp 보류 · (d) 미해결)을 함께 지고 있고, 그걸 빼고 인용하지 마라.**
385
398
 
386
399
  > *Why this paragraph is being rewritten rather than edited in place*: it read **"①②④ 🟡"** for three
387
400
  > sessions **after** the rows above had moved — ② to RC on 2026-08-09 (PR #281), ④ on 2026-08-09
@@ -394,12 +407,18 @@ What now blocks `v1.0` is **closing the 🔵s** — RC means the mechanism stand
394
407
  walked outside:
395
408
 
396
409
  ```
397
- external-harness recommend (cluster-wizard, still parked UNCHANGED 2026-08-11, and this is
398
- the one that is a *build*, not a check) · ~~capability_registry_check.sh absent~~ BUILT
399
- 2026-08-11 · ~~a run across two genuinely different capabilities~~ RAN 2026-08-11, but both
400
- nodes are FH-internal the *cross-harness* arm is still the old copies-of-one-scanner run
401
- · NEW: the registration bar cannot verify a declared side-effect axis (`writes: read-only`
402
- passed M1–M5, then the entry point deleted a directory)
410
+ **CLOSED 2026-08-16 행은 이상 v1.0 막지 않는다.** 아래는 이력이다:
411
+ ~~external-harness recommend (cluster-wizard, still parked)~~ **BUILT + 머지**
412
+ (`scripts/cluster_capability_scan.sh`, PR #399 / main `db33a7e`) · ~~capability_registry_check.sh
413
+ absent~~ BUILT 2026-08-11 · ~~both nodes are FH-internal~~ **크로스하네스 유니온이 실주행**
414
+ (`pmh-dev:merge-noop-check` = pmh 자기 레포 소유 선언 FH 자기 선언, 양·음 arm 이 다른
415
+ 노드에서 다른 이유로 막힌다) · dominance 절은 **①에 한해 ⓐⓑⓒ 로 대체**(운영자 결정,
416
+ [§①-2026-08-16](#id1-20260816))
417
+ 🟥 **다만 (d) 는 안 닫혔다** — 「선언된 부작용 축을 검증 못 한다」. `.git/objects` 감시로 한
418
+ 부류를 닫았으나 **M6 는 선언된 캘리브레이션 arm 만 관측한다**(실증: 분기 입력에서 객체를 쓰는
419
+ 능력이 `writes: read-only` 거짓 선언으로 통과). ⚠️ 이건 이제 **①의 블로커가 아니라
420
+ «등록 바의 열린 결함»** 으로 재분류된 것이다 — ⓐⓑⓒ 가 «바가 선언을 검증한다」를 요구하지
421
+ 않기 때문이지 **문제가 사라졌기 때문이 아니다.** 별도 항목으로 계속 추적한다
403
422
  ② a formal chamber EMIT — the mechanism firing in a real situation, not a retrofitted verdict
404
423
  ④ file-change ≠ token-introduction — the instrument is a screener, not an adjudicator
405
424
  ```
@@ -2018,3 +2018,65 @@
2018
2018
  ★**라운드를 거듭할수록 과녁을 직전 수리로 옮긴 것이 값을 냈다** — R2·R3 의 A급은 원래 결함이 아니라 **그 결함을 고치려고 내가 쓴 코드**에 있었다. R4 에 「앞 라운드가 닫은 것」을 명시해 준 것도 효과가 있었다(재보고 0, 새 축에서만 1건).
2019
2019
  ⚠️ **innovator 는 자기 근거의 한계를 스스로 붙였고 그걸 지우지 않았다** — 7건을 재검증하지 못했고(편집 금지+Bash 없음) task card 진술을 그대로 받았다고 명시. 제안 1의 수율은 미측정이라고 못박았고, 손검증 불가한 EMSE 수치는 **인용을 거부**했다. 사이드카가 자기 표본 한계를 먼저 선언한 사례로 남긴다.
2020
2020
  🟥 **거버너 쪽 실책 2건**: ⓐ staleness 감사기를 띄워 놓고 그 사이 대상 파일을 편집(`feedback_audit_target_must_be_frozen` 재생산, 자력 적발) ⓑ 되돌림 프로브의 적용확인 단언이 인용부호에서 깨져 **프로브가 실행되지 않았는데 스위트는 초록**이었다 — 단언이 없었으면 「되돌려도 초록」을 「앵커 살아있음」으로 오독했을 것이다."
2021
+
2022
+ - date: 2026-08-16
2023
+ session: fh-parallel-d3501fc9 (Opus 5 1M, bg — qasp 축 세션의 자율주행 마감 구간, 08-15 밤에서 날짜 넘김)
2024
+ agents_summary: "2 dispatches: codex gpt-5.5×1 (cross-family, 출하 표면 변경 PR #396) · general-purpose×1 (격리 Pre-Publish 코드 보안 패스, 출하되는 실행 코드 5파일, 2.0.0 출하 직전)."
2025
+ dispatch_count: 2
2026
+ outcome: accepted
2027
+ evidence: "codex 4건(2×A·2×B) — [A1] 1.5.0 minor 가 SemVer 상 약하다(M6 는 종전 통과하던 capfile 을 REJECTED 로 바꾸는 공개 CLI 동작 변경, `^1.4.x` 가 자동 수용) → **2.0.0** 채택. 🟥 같은 finding 의 다른 처방 「M6 를 opt-in/경고로 낮춰라」는 **근거를 대고 거부**(비가역 표면의 fail-closed 축은 끌 수 있으면 floor 가 아니다). [A2] publish 경계에 git 신선도 검사 부재 — 기존 게이트 넷이 전부 **파일 내용**만 보고 「그 내용이 어느 커밋의 것인가」를 안 묻는다 → `publish_freshness_check.sh` 신설. [B] symlink 경로 해석 · CHANGELOG 미범프. **A2·B2 는 자력 미적발**이고 codex 는 「반증 실패」 4건을 명시했다(억지 발견 없음).
2028
+ 보안 패스 6건(1×S·2×A·3×B) — 🟥 **[S] 가 이번 릴리스의 헤드라인 축을 무효화했다**: 프로브의 «샌드박스» 가 `git worktree` 였고 워크트리는 정의상 실물 레포의 `.git` 을 공유한다. `writes: read-only` 를 선언한 진입점이 `git config --local core.pager \"sh -c evilcmd\"` 를 심으면 **실물 레포에 영속 코드실행이 남는데 프로브는 `✅ VERIFIED · 관측=no-write`** 를 찍는다. 거버너가 격리 임시 레포에서 손으로 재현했고(태그+core.pager 실제 잔존), `git archive` 기반 `.git` 없는 사본으로 수리. [A] `eval \"$entry $pos_args\"` args 무검문(형제 등록기엔 `_validate_arm_args` 가 이미 있었고 프로브에만 없었다). [B×3] 예측가능 temp(CWE-377) · `worktree prune` 이 남의 워크트리 등록 청소 · mktemp 누수."
2029
+ notes: "★**자력 적발 0 / 10건**(codex 4 + 보안 6). 두 사이드카의 발견이 **비중첩**이다 — codex 가 본 것을 보안 패스가 0건, 보안 패스가 본 것을 codex 가 0건. **계열이 아니라 렌즈가 갈랐다**(둘 다 다른 계열이지만 codex 는 출하/정합, 보안 패스는 실행 표면). 다음엔 보안 렌즈를 다른 계열에 얹어 두 축을 곱해야 한다.
2030
+ ★**처방을 그대로 따랐다가 더 조용한 결함을 만들 뻔했다** — 보안 [A] 처방이 「eval 을 버리고 `set -- $entry $args`」였는데, 적용하니 셸 형태 진입점의 따옴표가 깨져 rc=2 로 죽고 **아무것도 안 바뀌었으니 `✅ VERIFIED`** 가 나왔다. 닫을 곳은 args 라 판단해 eval 을 되돌리고 검문만 남겼다. 사이드카 처방도 소스로 검증해야 한다는 실측 사례.
2031
+ ★**재현이 판정을 깎기도 했다** — 보안 [B] 「심링크 순환 무한루프」는 캡을 넣고 실제 순환 쌍으로 재보니 **OS 가 ELOOP 로 먼저 막아** 도달 불가였다(지적은 루프 본문을 격리 실행한 결과). 캡은 남기되 「무한루프를 고쳤다」고 주장하지 않는다.
2032
+ 🟥 **거버너 쪽 실책 3건**: ⓐ 「소비자가 M6 fail-closed 로 전건 거부당한다」를 **예측으로 말했다가 실물 tarball 손검증이 반증**(그 tarball 엔 M6 가 0회 — 소비자는 깨진 M6 가 아니라 M6 자체를 못 받았다) ⓑ 신규 self-test 의 셋업을 `>/dev/null 2>&1` 로 삼켜 **CI 에서만 조용히 통과**했다(첫 재현 시도도 격리가 안 먹어 두 가설을 못 갈랐고, 조건 강제로 바꾸고서야 재현) ⓒ `mktemp -t <prefix>` 를 써서 **GNU 에서 죽었다**(BSD-first, 이 레포가 이미 기록한 `stat -f` 와 같은 얼굴). 셋 다 CI 또는 손검증이 잡았고 자력 적발은 0."
2033
+
2034
+ - date: 2026-08-16
2035
+ session: fh-parallel-d3501fc9 (Opus 5 1M, bg — 정체성 ① 승급 · 크로스하네스 어댑터 · 검증 축 4→6 구간)
2036
+ agents_summary: "10 dispatches: general-purpose×9 (qasp 입장리뷰 · pmh 자기선언 · qasp 스크립트 수리 PR-A · pmh 정본 노출 기록 · 등록바 관측범위 · gstack 자기선언 · mate 자기선언 · README 영/일/중 6축 동기화 · FH 내장 어댑터 3종) · general-purpose×1 (CHEATSHEET 호출 어휘). 별도 사이드카: codex gpt-5.5×1 (cross-family, relay/probe 델타)."
2037
+ dispatch_count: 10
2038
+ outcome: accepted
2039
+ evidence: "🟥 **입장리뷰가 REJECT 를 냈고 그대로 따랐다** — qasp 정본으로 심사시키니 «`.claude/capabilities/` 는 qasp 의 결정이 아니다»(정본 근거 0건 · 소비자 0곳 · `session.md:101` n=3 규칙 위반 · 선언 경로가 조직 미러 제외 대상 아님 · §8-2 생산자=판정자). 그 판정이 **정체성 ①의 (c) 블로커가 «위치만 옮긴 채» 남아 있었음**을 드러냈고, 운영자 결정으로 «어댑터가 기본 경로» 로 정본 문단을 뒤집는 데까지 갔다. 같은 리뷰가 스크립트 결함 S3+A5+B3 도 냈고 PR-A(#174, 29 tests · 되돌림 5/5 · CI 4/4)로 착지.
2040
+ cross-family(codex) 5건(A3·B2) — [A] `entry: bash -c 'false'` + `writes: read-only` 가 **`✅ VERIFIED · 관측=no-write`** 를 받는다(선언 거짓말을 잡으라고 만든 프로브 안의 not-found-is-not-zero) · [A] `.git/objects` 이름만 세기가 기존 객체 덮어쓰기 미탐 · [A] `$node_args` 가 `$argv_extra` 앞이라 `--cap-args --` 로 인과 결박 무력화 · [B×2] 중복 `--cap-args` 무음 폐기 · 개행이 메타문자 가드 통과. **전부 손 재현 후 수리 + 회귀 앵커.**
2041
+ 어댑터 3종 M1–M6 `REGISTRABLE`(실물 트리, 커밋 후 재검증) → **단일 합성이 5 하네스를 태웠다**: gstack→pmh→mate→qasp, 청정 arm `FH_RELAY_VERDICT: PASS`(rc=0) · 교란 arm node3 `FAIL`→`BLOCKED`(rc=2)."
2042
+ notes: "★**자력 적발은 이번에도 낮다 — 그런데 그게 이 스택의 설계다**(운영자 지적, 2026-08-16). 값을 낸 쪽이 숫자로 갈렸다: 내가 지은 기계가 틀린 것 5건(L13c 앵커를 gitignored 데이터에 · M6 관측범위 · relay 인자채널 부재 · enum 일치 축 부재 · 스냅샷 소속 미검사) vs 탈상관 축이 잡은 것 23건+(입장 12 · cross-family 5 · 어댑터/레인 파생). **짓는 쪽이 아니라 다른 지능을 태우는 쪽이 값을 냈다.**
2043
+ ★**에이전트가 내 지시를 반증한 것이 셋** — ⓐ mate 담당이 «FH·qasp·pmh 에 JS/CSS 타깃 기계 능력 0개» 를 반증(qasp `src/static_review/{mate,mobile,web}_rules.py` 실재, 22 rule). 내가 잰 범위는 `scripts/*.sh` 였고 주장 범위는 «클러스터 전량» 이었다 — **잰 범위 ≠ 주장 범위**, 오늘 두 번째. ⓑ pmh 담당이 내 지시문의 «`writes` 도 strictest-wins» 를 **거짓으로 지목**(계약상 `writes`·`judge` 는 행위 축이라 most-capable 병합이고, 계약이 「엄격으로 접기」를 «엄격이라는 말을 쓴 완화» 로 금지). 세 계열이 독립으로 같은 지적. ⓒ CHEATSHEET 담당이 «그래프» 가 과거 코퍼스에 **호출 어휘로 0건**임을 실측(전부 그래프 엔지니어링/머메이드) — 정본 어휘 «병렬 탈상관 가속화» 를 병기.
2044
+ ★**어댑터 담당이 자기 검증의 한계를 먼저 선언했다** — M6 가 작업 트리에서 UNVERIFIABLE 인 이유를 추정이 아니라 실측(`git archive HEAD | tar -t | grep -c adapters` = 0)으로 대고, 버려지는 클론에서 돌린 초록은 «진짜 판정이 아니다» 라고 못박았다. 사후에 거버너가 커밋 후 재실행해 확정.
2045
+ 🟥 **거버너 쪽 실책 4건**: ⓐ `git add scripts/` 가 **다른 에이전트의 편집 중 파일을 삼켰다**(`feedback_shared_checkout_ops_touch_others_work` 재현, 그 에이전트가 스스로 확인해 보고) ⓑ zsh 비인용 확장으로 두 인자를 한 인자로 넘겨 전 항목 rc=3 — 오늘 두 번째 ⓒ 레인 앵커를 **gitignored 데이터**(L13c)와 **운영자 머신 레이아웃**(어댑터 레인)에 걸어 **로컬 초록 / CI 적색**을 두 번 만들었다 ⓓ 6축 절을 재작성하며 ⓑ행의 `§7` 링크를 떨어뜨렸고 그게 **4개 언어판 전부로 번졌다**(동기화 에이전트가 «부수효과» 로 보고해 잡힘, 자력 아님).
2046
+ ★**두 번째 실책의 수리에서 새 규율이 나왔다**: peer 의존 레인의 SKIP 은 **시끄러워야 한다** — 컨트롤이 전부 빠지면 남은 초록이 「늘 같은 값을 내는 계기」와 구분되지 않는다. `not found ≠ 0` 를 레인 자신에게 적용한 형태."
2047
+ - date: 2026-08-16
2048
+ agent: general-purpose (isolated) — weekly-audit 결함클래스 재발 추출
2049
+ purpose: "tracks/_meta 와 a private companion store 미러의 fh_completed_*/fh_signal_* 17일치를 읽어 결함 클래스별 재발 집계"
2050
+ outcome: accepted
2051
+ evidence: "결함행 ~567 추출, N≥3 클래스 13종. 라이브 결함 1건 신규 적발(gate_anchor_check.sh 호출부 0). 자기 계기 결함 1건 자기신고(./ 접두 불일치로 진짜 양성을 부재로 렌더 → known-pair 로 수정 후 재실행). 🟥 그 보고의 논거 하나는 거버너가 기각 — 「다른 zero-caller 는 전부 문서화돼 있다」가 publish_freshness_check(md 참조 0 + 배선됨)로 반증됨"
2052
+ cost: 292k tokens
2053
+ - date: 2026-08-16
2054
+ agent: fh-meta:expert (isolated) — agy 문서 외부 인용 실사
2055
+ purpose: "signal_2026-08-16_test_time_compute 의 arXiv/시스템카드 인용 4건을 실제 페치해 지지 여부 판정"
2056
+ outcome: accepted
2057
+ evidence: "팬텀 ID 0건 · 오귀속 3건. Snell 2408.03314 의 4x(best-of-N 대비)를 14x(FLOPs-matched+조건부)와 혼동한 것이 최대 소득. 거버너가 abs 초록을 직접 페치해 verbatim 재확인(사이드카 발견을 소스로 닫음)"
2058
+ cost: 96k tokens
2059
+ - date: 2026-08-16
2060
+ agent: fh-meta:fact-checker (isolated) — agy 문서 FH 내부 그라운딩
2061
+ purpose: "같은 문서의 restricted-env 실측 인용·정본 서술·누출 토큰을 file:line 으로 역추적"
2062
+ outcome: accepted
2063
+ evidence: "「중복 0건」이 원 기록과 정반대임을 적발(원본은 convergence 가 결론) · 「S급 6·zero overlap」이 다른 날짜·다른 대상 실험에서 이식된 것 · LEAK 1건(HIGH+MED)"
2064
+ cost: 116k tokens
2065
+ - date: 2026-08-16
2066
+ agent: fh-meta:challenger (isolated) — Axis 2 적대검증, audit remediation staged diff
2067
+ purpose: "4축 게이트 Axis 2. 내 델타 4종의 degrade 방향·계기 타당성·스코프를 공격"
2068
+ outcome: accepted
2069
+ evidence: "M5·S6·R6, 「Trend: Increasing · Signal: Not yet」. 거버너가 하중 큰 M 셋을 재현해 전부 성립 확인 후 수리(rc=10 fail-open 자기모순 · CI hooksPath 0건 영구 SKIP · 노드-로컬 스코프). Bash 미가용이라 실행 확인은 못 했다고 스스로 명시 — 그 한계 표기가 판정의 신뢰도를 올렸다"
2070
+ cost: 162k tokens
2071
+ - date: 2026-08-16
2072
+ agent: fh-meta:fact-checker (isolated) — Axis 3 그라운딩, audit remediation staged diff
2073
+ purpose: "4축 게이트 Axis 3. 내 주석의 file:line·PR·수치·메모리 참조를 전수 역추적"
2074
+ outcome: accepted
2075
+ evidence: "🟥 내 주석의 팬텀 2건 적발 — publish_freshness_check 의 「md 참조 0건」은 거짓(tracks/*.md 3건) · fh-gate.sh:37 은 같은 세션 수리로 :52 로 밀린 stale 참조(이 커밋이 지적하는 클래스의 자기재현). Bash 미가용을 UNMEASURED 로 명시하고 초록으로 렌더하지 않음"
2076
+ cost: 126k tokens
2077
+ - date: 2026-08-16
2078
+ agent: codex/gpt-5.6-terra (cross-family, headless) — Axis 2 탈상관 레그
2079
+ purpose: "같은 staged diff 를 다른 계열로 공격. crossfamily 마커 값 확보"
2080
+ outcome: accepted
2081
+ evidence: "1M/4S/2R. 챌린저와 중첩 2건뿐(rc=10 fail-open · 사전순 정렬) — 렌즈가 계열보다 갈랐다. 단독 적발 3건: package.json files[] 누락 · 비UTF8 바이트에서 grep 무매치하는 로케일 fail-open(양쪽 로케일 직접 실행) · 파일스코프 set -e 판별. 그리고 의심 하나를 기각(§ 구분자는 두 로케일에서 실측 통과)"
2082
+ cost: 105k tokens
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
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": [
@@ -75,6 +75,11 @@
75
75
  "scripts/publish_freshness_check.sh",
76
76
  "scripts/lane_runner_check.sh",
77
77
  "scripts/test_package_coverage_lanes.sh",
78
+ "scripts/adapters/peer_resolve.sh",
79
+ "scripts/adapters/gstack_content_safety.sh",
80
+ "scripts/adapters/mate_agent_boundary.sh",
81
+ "scripts/adapters/qasp_new_code_anchor.sh",
82
+ "scripts/test_adapter_lanes.sh",
78
83
  "scripts/test_fh_gate_regressions.sh",
79
84
  "templates/local_fh_context.md",
80
85
  "docs/ETHOS.md",
@@ -93,6 +98,7 @@
93
98
  "templates/.claude/rules/session.md",
94
99
  "scripts/below_floor_scan.sh",
95
100
  "scripts/capability_registry_check.sh",
101
+ "scripts/cluster_capability_scan.sh",
96
102
  "scripts/capability_effect_probe.sh",
97
103
  "scripts/chamber_run.sh",
98
104
  "scripts/fh_env_delta_scan.sh",
@@ -199,6 +205,8 @@
199
205
  "scripts/test_knowledge_seam_lanes.sh",
200
206
  "tests/seam_absence_probes.md",
201
207
  "scripts/gate_anchor_check.sh",
202
- "scripts/rtk_gross_ablation.sh"
208
+ "scripts/portability_lint.sh",
209
+ "scripts/rtk_gross_ablation.sh",
210
+ ".claude/capabilities"
203
211
  ]
204
212
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "fh-meta",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
7
- "description": "New in 1.4.74: shipped documents no longer point at files the package omits. 35 such paths were measured on 2026-07-28 — CLAUDE.md instructed consumers to run templates/predelete_check.sh before a destructive op and the file did not ship. 20 more paths added; the 4 that remain absent are enumerated with a written reason each (per-environment registries and operator-private sync). Closing the set once is worth little because it regrows, so scripts/package_coverage_check.sh now fails selfcheck on any new occurrence, known-pair calibrated, and it caught itself on first wiring. New in 1.4.73: the mechanical floor now ships — templates/.git-hooks (pre-commit/pre-push) plus every script they actually invoke, their regression anchors, and the .claude/rules data they read. Until now the package shipped the prose that tells you to run the gates while omitting the gates, and 35 shipped-doc references pointed at files the tarball did not contain. Verified by unpacking the tarball, installing the hooks in a scratch repo and committing through them, not by inspecting files[]. degrade_direction_scan gains shell probes: it collected .sh files that no probe could match and reported them clean (known-positive scored 0/4); git hooks were invisible entirely because the extension test ran against the path, not the basename. The field-propagated templates/ copy had drifted from scripts/ and is now byte-pinned by an anchor. Hub meta-engineering toolkit — 35 skills + 7 agents. New in 1.4.71: SKILL_detail.md brought inside the 4-axis gate — the gate matched the literal `SKILL.md`, which `SKILL_detail.md` does not contain, leaving 27.7% of the skill-spec surface ungated (measured; it leaked twice for real). Fix escalated from a name list to a directory scope after an enumeration sweep found a real uncovered file on its first run; anchored by scripts/gate_pathspec_check.sh (known-pair, wired into pre-commit). One-way mirror sync gains a destination-newer abort + mechanically injected mirror banner after two session cards were silently overwritten, anchored by scripts/sync_guard_check.sh. dialogue-harvest gains Step 4-b cross-corpus provenance (absorbed / held-unused / declined) for single-author corpora, where the original provenance labels were free and measured nothing. frontier-digest arxiv leg category-scoped after a relevance drift the staleness rule structurally could not catch (known-pair calibration recorded). templates/CLAUDE.md hub paths switched to {FH_ROOT} so a copied harness stops carrying one operator's absolute paths into org-visible checkouts. New in 1.4.70: dialogue-harvest (mines AI-dialogue logs — sycophancy strip first, induced-vs-independent provenance labeling, EN+KO known-pair calibration shipped); asset-placement-gate Step 0.6 official-corpora check (Claude Cookbook as Tier-0 consult corpus, judged-flag semantics); context-doctor built-in-/doctor-first sister anchor. New in 1.4.48: phantom-quench + steel-quench gain external frontier anchors (arXiv:2607.02052 package-hallucination; arXiv:2607.02057 prompt-coverage-adequacy); README model-flat claim reframed from a per-release point-curve to structural invariants (operation flattens across tiers; depth tier-order fixed within a generation). New in 1.4.47: onboarding step ① surfaces the Mode D companion-store session-start load in the auto-read salience anchor (previously only in the local binding + rules, so a greeting could skip the load). New in 1.4.46: context-doctor gains a command-output axis — routes to a command-output proxy/hook (rtk) to trim verbose CLI stdout, complementing .claudeignore; risk-gated to token-scarce environments (lossy filtering, off gate-input paths). New in 1.4.41: context-doctor 2026 trigger vocab (context engineering/rot/collapse) + phantom-citation hardening; hub measurement-integrity-checklist (cross-model measurement pre-flight: display-name pin/reps≥3/discriminating probe). New in 1.4.40: install-wizard scaffolds the companion store as a queryable wiki (INDEX + session-start read + Raw/Wiki/Conversation ingest axis). New in 1.4.39: auto-decorrelation (cross-family verifier sidecar recruitment, calibration-gated) + video-ingest (capability-routed video ingestion). New in 1.4.37: corpus-grounding-expander + persona-roster-expander (field-harvested verbatim-relay capability skills). New in 1.3.0: public-surface-audit (git-tracked private-token leak scan), field-harvest Mode B session-end auto-trigger, 4-axis gate scope extension (docs/ + AGENTS.md). New in 1.2.0: pipeline-conductor (4-pipeline gated sweep), return-path-gate (chain closure audit), goal-quench (Stop hook + quality gate), steel-quench Wave 5 (multi-model sidecar challenger), 2-layer architecture docs, YAML validation script. Validated cross-CLI: Claude Code, Codex, Gemini.",
7
+ "description": "New in 2.0.1: harness-doctor cadence promoted from prose to a SessionStart hook (30-day overdue check no longer silent); portability lint (BSD/GNU, zsh/bash pattern denylist) wired into pre-commit as the shell-layer sibling of the existing lints; branch_claim.sh gains an explicit warning that live-claim count is not a same-tree concurrent-edit count; the public-surface confidentiality scan's fail-open notice (operator pattern override absent) is now a hard-to-miss banner instead of a two-line aside; fh-gate.sh survives a missing package.json instead of dying under set -euo pipefail; identity ① (harness cluster) reclassified 🟢 under a redefined ⓐⓑⓒ bar (reuse is real and callable, FH did not grow to get it, sharpness is preserved via strictest-wins merge) — cross-harness adapters + relay_channel.sh --cap-args node-specific argument channel; §1-a-2's 6-axis verification canon synchronized across the file (a prior draft still said 4 in one place). New in 1.4.74: shipped documents no longer point at files the package omits. 35 such paths were measured on 2026-07-28 — CLAUDE.md instructed consumers to run templates/predelete_check.sh before a destructive op and the file did not ship. 20 more paths added; the 4 that remain absent are enumerated with a written reason each (per-environment registries and operator-private sync). Closing the set once is worth little because it regrows, so scripts/package_coverage_check.sh now fails selfcheck on any new occurrence, known-pair calibrated, and it caught itself on first wiring. New in 1.4.73: the mechanical floor now ships — templates/.git-hooks (pre-commit/pre-push) plus every script they actually invoke, their regression anchors, and the .claude/rules data they read. Until now the package shipped the prose that tells you to run the gates while omitting the gates, and 35 shipped-doc references pointed at files the tarball did not contain. Verified by unpacking the tarball, installing the hooks in a scratch repo and committing through them, not by inspecting files[]. degrade_direction_scan gains shell probes: it collected .sh files that no probe could match and reported them clean (known-positive scored 0/4); git hooks were invisible entirely because the extension test ran against the path, not the basename. The field-propagated templates/ copy had drifted from scripts/ and is now byte-pinned by an anchor. Hub meta-engineering toolkit — 35 skills + 7 agents. New in 1.4.71: SKILL_detail.md brought inside the 4-axis gate — the gate matched the literal `SKILL.md`, which `SKILL_detail.md` does not contain, leaving 27.7% of the skill-spec surface ungated (measured; it leaked twice for real). Fix escalated from a name list to a directory scope after an enumeration sweep found a real uncovered file on its first run; anchored by scripts/gate_pathspec_check.sh (known-pair, wired into pre-commit). One-way mirror sync gains a destination-newer abort + mechanically injected mirror banner after two session cards were silently overwritten, anchored by scripts/sync_guard_check.sh. dialogue-harvest gains Step 4-b cross-corpus provenance (absorbed / held-unused / declined) for single-author corpora, where the original provenance labels were free and measured nothing. frontier-digest arxiv leg category-scoped after a relevance drift the staleness rule structurally could not catch (known-pair calibration recorded). templates/CLAUDE.md hub paths switched to {FH_ROOT} so a copied harness stops carrying one operator's absolute paths into org-visible checkouts. New in 1.4.70: dialogue-harvest (mines AI-dialogue logs — sycophancy strip first, induced-vs-independent provenance labeling, EN+KO known-pair calibration shipped); asset-placement-gate Step 0.6 official-corpora check (Claude Cookbook as Tier-0 consult corpus, judged-flag semantics); context-doctor built-in-/doctor-first sister anchor. New in 1.4.48: phantom-quench + steel-quench gain external frontier anchors (arXiv:2607.02052 package-hallucination; arXiv:2607.02057 prompt-coverage-adequacy); README model-flat claim reframed from a per-release point-curve to structural invariants (operation flattens across tiers; depth tier-order fixed within a generation). New in 1.4.47: onboarding step ① surfaces the Mode D companion-store session-start load in the auto-read salience anchor (previously only in the local binding + rules, so a greeting could skip the load). New in 1.4.46: context-doctor gains a command-output axis — routes to a command-output proxy/hook (rtk) to trim verbose CLI stdout, complementing .claudeignore; risk-gated to token-scarce environments (lossy filtering, off gate-input paths). New in 1.4.41: context-doctor 2026 trigger vocab (context engineering/rot/collapse) + phantom-citation hardening; hub measurement-integrity-checklist (cross-model measurement pre-flight: display-name pin/reps≥3/discriminating probe). New in 1.4.40: install-wizard scaffolds the companion store as a queryable wiki (INDEX + session-start read + Raw/Wiki/Conversation ingest axis). New in 1.4.39: auto-decorrelation (cross-family verifier sidecar recruitment, calibration-gated) + video-ingest (capability-routed video ingestion). New in 1.4.37: corpus-grounding-expander + persona-roster-expander (field-harvested verbatim-relay capability skills). New in 1.3.0: public-surface-audit (git-tracked private-token leak scan), field-harvest Mode B session-end auto-trigger, 4-axis gate scope extension (docs/ + AGENTS.md). New in 1.2.0: pipeline-conductor (4-pipeline gated sweep), return-path-gate (chain closure audit), goal-quench (Stop hook + quality gate), steel-quench Wave 5 (multi-model sidecar challenger), 2-layer architecture docs, YAML validation script. Validated cross-CLI: Claude Code, Codex, Gemini.",
8
8
  "author": {
9
9
  "name": "chrono-meta",
10
10
  "email": "chrono-meta@users.noreply.github.com"
@@ -10,6 +10,23 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
10
10
 
11
11
  ## Plugin Level
12
12
 
13
+ ### [2.0.1] — 2026-08-16
14
+
15
+ - **feat(cadence)**: `harness-doctor` 30일 캐던스가 산문 제안에서 SessionStart 훅으로 승격 —
16
+ 초과 상태가 더 이상 침묵으로 렌더되지 않는다.
17
+ - **feat(portability)**: BSD/GNU·zsh/bash 패턴 denylist 린트를 pre-commit에 배선 —
18
+ `degrade_direction_scan` 옆 셸 레이어 자매 레인, advisory(비차단).
19
+ - **fix(branch-claim)**: `branch_claim.sh show`가 live claim 수를 실제 동시편집 스레드 수처럼
20
+ 오독시키는 문제 — 헤더 주석 + 출력 자체에 경계선 명시.
21
+ - **fix(confidentiality)**: `.public-surface-patterns`(operator override) 부재 시 fail-open
22
+ 경고가 두 줄짜리 아쉬운 존재였던 것을 놓칠 수 없는 배너로 — 방향(PASS)은 그대로, 가시성만.
23
+ - **fix(fh-gate)**: `package.json` 부재 시 `set -euo pipefail` 아래서 즉사하던 결함 수리 —
24
+ known-pair 확정(수정본 rc=12 / package.json 있으면 rc=12 / HEAD 사본 rc=1).
25
+ - **feat(cluster)**: 정체성 ① 하네스 클러스터 🔵→🟢 — 기준을 dominance에서 재정의된 ⓐⓑⓒ로
26
+ 교체(운영자 결정). 크로스하네스 어댑터 + `relay_channel.sh --cap-args` 노드별 인자 채널.
27
+ 잔여 명시: (d) 등록 바가 선언의 진위를 검증하지 못하는 구조는 안 닫힘 — 별도 항목 추적.
28
+ - **docs(canon)**: 6축 검증 정본(§1-a-2) 표기가 파일 내 두 자리에서 어긋나 있던 것 동기화.
29
+
13
30
  ### [2.0.0] — 2026-08-16
14
31
 
15
32
  **BREAKING — M6 로 인해 종전 통과하던 capability 등록이 거부될 수 있다. 그리고 그 M6 는 1.4.99 에서 출하되지 않았다.**