@chrono-meta/fh-gate 2.0.0 → 2.1.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.
Files changed (56) 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/rules/fh_4axis_gate.md +77 -1
  7. package/.claude-plugin/marketplace.json +3 -3
  8. package/AGENTS.md +25 -3
  9. package/CHEATSHEET.md +17 -1
  10. package/CLAUDE.md +241 -5
  11. package/README.ja.md +55 -20
  12. package/README.ko.md +86 -20
  13. package/README.md +57 -20
  14. package/README.zh.md +49 -19
  15. package/knowledge/shared/harness-core/capability_composition_contract.md +68 -0
  16. package/knowledge/shared/harness-core/fh_three_layer_canon.md +122 -5
  17. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +115 -3
  18. package/knowledge/shared/harness-core/harness_incubator_doctrine.md +83 -1
  19. package/knowledge/shared/harness-core/harness_terminal_correlation_and_recommendations.md +255 -0
  20. package/knowledge/shared/harness-core/harness_verification_core_extended.md +1 -1
  21. package/knowledge/shared/harness-core/ship_readiness_gate.md +234 -11
  22. package/knowledge/shared/learnings/subagent_invocations_log.yaml +128 -0
  23. package/knowledge/shared/rules/sister_asset_protocol.md +12 -0
  24. package/package.json +12 -3
  25. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  26. package/plugins/fh-commons/agents/quench-challenger.md +6 -1
  27. package/plugins/fh-meta/.claude-plugin/plugin.json +2 -2
  28. package/plugins/fh-meta/CHANGELOG.md +60 -0
  29. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +14 -2
  30. package/plugins/fh-meta/skills/steel-quench/SKILL_detail.md +13 -0
  31. package/plugins/fh-meta/skills/verify-bidirectional/SKILL.md +34 -1
  32. package/scripts/adapters/gstack_content_safety.sh +186 -0
  33. package/scripts/adapters/mate_agent_boundary.sh +120 -0
  34. package/scripts/adapters/peer_resolve.sh +99 -0
  35. package/scripts/adapters/qasp_new_code_anchor.sh +159 -0
  36. package/scripts/branch_claim.sh +14 -0
  37. package/scripts/capability_effect_probe.sh +340 -20
  38. package/scripts/capability_registry_check.sh +271 -20
  39. package/scripts/chamber_run.sh +24 -3
  40. package/scripts/chamber_witness.sh +25 -0
  41. package/scripts/cluster_capability_scan.sh +629 -0
  42. package/scripts/fh-gate.sh +16 -1
  43. package/scripts/fh_session_load.sh +70 -0
  44. package/scripts/package_coverage_check.sh +10 -0
  45. package/scripts/portability_lint.sh +257 -0
  46. package/scripts/prepublish_scope_note.sh +139 -0
  47. package/scripts/relay_channel.sh +70 -7
  48. package/scripts/selfcheck.sh +167 -5
  49. package/scripts/test_adapter_lanes.sh +296 -0
  50. package/scripts/test_capability_entrypoint_shipping.sh +8 -1
  51. package/scripts/test_fh_gate_regressions.sh +21 -9
  52. package/scripts/test_marker_axes_run_lanes.sh +87 -3
  53. package/scripts/test_marker_crossfamily_lanes.sh +31 -1
  54. package/scripts/test_relay_channel_lanes.sh +76 -0
  55. package/templates/.git-hooks/pre-commit +239 -12
  56. package/templates/subagent-tally-hook.json +2 -2
@@ -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
 
@@ -270,13 +279,162 @@ unchanged and keeps its own 2026-07-14 evidence).
270
279
 
271
280
  | # | Identity | Engines it loads | Status | Evidence / what's missing |
272
281
  |---|---|---|---|---|
282
+ | **Ⓑ** | **프로젝트 부스터** (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)이므로 **증언으로 표기하고 측정으로 세지 않는다** |
273
283
  | ③ | 거버넌스 게이트 (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
284
  | ⑤ | 증폭자 (amplifier) | judgment-circuit | 🟢 GREEN | short-intent→literature-grounding→ultimate-doc real instances; rules-diet −18.2k measured; intent-routing probe 94% (below) |
275
285
  | ④ | 프런티어→조직 전파 (**🔵 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` |
286
+ | ① | 하네스 클러스터 (**🟢 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
287
  | ② | 프로젝트 인큐베이터 (**🔵 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
288
  | ②-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
289
 
290
+ ### <a name="b-layering"></a>§Ⓑ-layering — **프로젝트 부스터**는 여섯 번째 행이 아니라 **다른 층**이다 (운영자, 2026-08-16)
291
+
292
+ > 🟥 **먼저 — 이 절을 위계도로 읽지 마라. 이 표는 분류학이 아니라 재고 목록이다.**
293
+ > 운영자(2026-08-16): *"사실 계층구조로 지으면 5대 정체성은 **서로를 먹고 먹지만**, 그럼에도
294
+ > 정체성을 두는 이유는 **여기에 뭐가 있는지를 볼 수 있게** 하기 위함이야. 실제로는 유기적으로
295
+ > 서로 연결되고 조합하여 사용해내게 되는 거지."*
296
+ >
297
+ > 아래 관계 서술은 **«무엇이 무엇 밑이다»를 굳히려는 게 아니라, 각 행이 서로 다른 범위를 갖는다는
298
+ > 증거**다. 관계를 정밀화할수록 표는 실제 사용과 멀어진다 — 현장에서는 한 작업이 ①⑤ 를 같이
299
+ > 태우고 그 결과가 ② 로 흐른다. **정합한 위계를 못 그리는 것은 이 표의 결함이 아니다.**
300
+ >
301
+ > ⇒ 그래서 Ⓑ 부재의 비용도 «위계가 틀렸다»가 아니다. **목록에 없어서 안 보였고, 안 보이니 감사가
302
+ > 물을 수 없었다** — 그게 전부이고, 그거면 충분히 비싸다.
303
+
304
+ 이 항목의 초판은 부스터를 «⑥» 으로, 즉 나머지 다섯과 **나란한 여섯 번째 정체성**으로 적었다.
305
+ 운영자가 그걸 정정했다: *"증폭자, 하네스클러스터 이 두 개가 사실 부스팅을 위한 **과정적
306
+ 정체성**인데 부스터는 **포괄적 기능**이라고 보는 게 맞을지도 모르겠다"* · *"인큐베이터도
307
+ 비슷한 것 같네."*
308
+
309
+ 🟥 **그리고 그 정정의 초판도 과했다 — 운영자가 같은 자리에서 두 번 고쳤다.** 초판은 위 문장을
310
+ «Ⓑ 가 ①②⑤ 를 **포함**한다»로 옮겨 적었는데, 운영자가 되물었다: *"증폭자는 하네스를 부스팅하기
311
+ 위한 것뿐만이 아니라 **훨씬 범용적으로** 쓸 수 있는 거 아닌가?"* 맞다. 그리고 같은 잣대를 나머지
312
+ 둘에 대면 셋 다 포함관계가 아니다:
313
+
314
+ | 행 | 부스팅 밖의 범위 | 그래서 |
315
+ |---|---|---|
316
+ | ⑤ 증폭자 | **사람의 의도** 전반. `CLAUDE.md §Intent Marshaling` 이 하네스가 전혀 안 끼는 일반 작업(문서·리서치·정리)까지 명시적으로 이 아래 둔다 | Ⓑ 보다 **넓다** |
317
+ | ① 하네스 클러스터 | 남의 능력을 **FH 가** 써서 FH 가 안 짓는다 — 수혜자가 FH 다 | Ⓑ 와 **방향이 반대** |
318
+ | ② 프로젝트 인큐베이터 | **유닛을 낳는다 — 하네스만이 아니다.** 「프로젝트」는 더 큰 틀로 고른 이름이고 범위가 **하네스 · 스킬 · 에이전트 · 하네스 형태가 아닌 일반 레포**까지다(운영자, 2026-08-16). 부스팅은 낳은 뒤에 온다 | **순차**지 종속이 아니다 |
319
+
320
+ ⇒ **관계는 «포함»이 아니라 «끌어다 쓴다»(uses)** 다.
321
+
322
+ ```
323
+ Ⓑ 프로젝트 부스터 ← 포괄 기능이되, 셋을 소유하지 않는다
324
+ ↑ 끌어다 쓴다 (uses, not contains)
325
+ ⑤ 증폭자 · ① 하네스 클러스터 · ② 프로젝트 인큐베이터
326
+ — 각자 부스팅 밖의 고유 범위를 갖는다 (위 표)
327
+ ② 의 산출 유닛 = 하네스 · 스킬 · 에이전트 · 일반 프로젝트 레포
328
+ ```
329
+
330
+ 이 구분이 실질을 바꾼다: 포함이면 ①②⑤ 의 등급이 Ⓑ 의 등급에 종속되고, **끌어다 쓰는 관계면
331
+ 각 행이 자기 승급 기준을 그대로 진다.** 후자가 맞고, 그래서 Ⓑ 신설이 다른 행의 등급을 하나도
332
+ 건드리지 않는다.
333
+
334
+ **이게 왜 «행이 없었나»를 설명한다.** 부스터는 다섯과 같은 층에 없었으므로 다섯을 아무리
335
+ 들여다봐도 나오지 않는다 — 빠진 게 아니라 **층이 하나 접혀 있었다.** 다섯은 각각 자기 자리에서
336
+ 감사됐고, **그것들을 무엇에 쓰고 있었는지**는 표에 적힌 적이 없다.
337
+
338
+ 🟥 **그리고 «왜 아무도 안 적었나»의 답은 «빠뜨렸다»가 아니다.** 운영자: *"부스터가 비워져
339
+ 있던 이유는 사실 FH 자체의 **너무나도 당연한 기본 정체성**이었기 때문이야. 가장 근원적인 것.
340
+ 계속 **숨쉬듯이** 해왔으니까. 그 위에 5개 정체성이 서게 되었는데."*
341
+
342
+ 이건 흔한 사각과 **방향이 반대다.** 보통 놓치는 것은 드물고 눈에 안 띄는 것인데, 이것은
343
+ **항상 하고 있어서 안 보였다.** 사람은 자기가 끊임없이 하는 일을 명제로 적지 않는다 — 적을
344
+ 이유를 못 느끼기 때문이고, 그래서 **가장 근원적인 항목이 가장 늦게 문서화된다.**
345
+
346
+ ⇒ 이 표에 대한 진단 질문이 하나 생긴다: **«우리가 매일 하고 있는데 여기 적혀 있지 않은 것은
347
+ 무엇인가»** — 없는 것을 찾는 게 아니라 **있는데 너무 흔해서 안 세는 것**을 찾는 물음이다.
348
+ `[[feedback_reinvention_reflex_normalization_counterweight]]` 의 사촌이되 반대 극이다: 저쪽은
349
+ 낯선 것을 익숙한 것으로 접는 반사고, 이쪽은 **익숙한 것을 아예 항목으로 세지 않는 반사**다.
350
+
351
+ **난이도 순서가 등급을 설명한다(정합성 확인).** 운영자: *"인큐베이터는 이 부스팅보다
352
+ 어렵기에(**없는 걸 만드는 자리니까**) 초록이 되기까지 오래 걸린 거였고."* ⇒ 있는 것을 빠르게
353
+ 하는 일(Ⓑ) < 없는 것을 만드는 일(②). 그러므로 **Ⓑ 가 🟢 이고 ② 가 🔵 RC 인 것은 이상이
354
+ 아니라 예상되는 순서다.** 만약 반대였다면 둘 중 하나의 등급을 의심해야 했다.
355
+
356
+ **명명이 평행한 것은 우연이 아니다 — 두 행의 유닛 범위가 같기 때문이다(운영자, 2026-08-16).**
357
+ ② 가 「하네스 인큐베이터」가 아니라 **「프로젝트 인큐베이터」**인 이유가 *"하네스를 인큐베이팅하기
358
+ 위한 것도 있지만 **스킬이나 에이전트도** 인큐베이팅하기 위해 더 큰 틀로 프로젝트라 명명한 것"*
359
+ 이고, *"하네스 형태가 아니더라도 **프로젝트 레포**를 만들어 줄 수도 있"*다. 부스터도 같은 범위를
360
+ 다루므로 **「프로젝트 부스터」**다. 초판이 「하네스 부스터」로 적은 것은 ② 를 「하네스를 낳는다」로
361
+ 좁게 적은 것과 **같은 실수**이며, 같은 자리에서 두 번 났다.
362
+
363
+ ```
364
+ 유닛 난이도 사다리 (두 행 공통)
365
+ 일반 프로젝트 레포 < 스킬 < 에이전트 < 하네스
366
+ ↑ 쉽다 ↑ 가장 어렵다
367
+ ```
368
+
369
+ **⇒ 등급 판정 규칙(운영자): «하네스까지 도달해 있으면 이미 초록이다».** 하네스가 사다리 꼭대기라
370
+ 거기 닿았다는 것은 아래 단계를 이미 통과했다는 뜻이다.
371
+ 🟥 **이 사다리는 «하네스까지 할 수 있습니다»이지 «하네스만 가능하다»가 아니다**(운영자, 2026-08-16).
372
+ 포함 관계이지 배타가 아니다 — 하네스에 도달하려면 **그 전까지의 모든 것이 가능해야** 하므로,
373
+ 꼭대기 칸의 실적은 아래 칸들의 실적을 **함께 주장한다**. 그래서 Ⓑ 의 🟢 은 «하네스를 부스팅한다»가
374
+ 아니라 **«일반 레포부터 하네스까지 부스팅한다»**로 읽어야 하고, 반대로 아래 칸 실적만 있는 상태를
375
+ 꼭대기 실적으로 올려 읽어서도 안 된다. 이 자로 두 행을 같이 재면 현재 등급이
376
+ 설명된다 — **Ⓑ 는 하네스 급 대상(pmh · gstack · mate)에서 실적이 있어 🟢**, **② 는 유일한 EMIT 이
377
+ 사다리의 아래쪽 유닛이라 아직 🔵**. 두 행이 다른 등급인 것은 서로 다른 잣대를 써서가 아니라
378
+ **같은 사다리의 다른 칸에 도달했기 때문**이다.
379
+
380
+ **기전(운영자 비유)**: *"실무자도 사회초년생을 가르치는 자보다 **3년 이상 실무한 사람을 옆에서
381
+ 부스팅**해주는 게 훨씬 쉬운 것과 마찬가지."* 3년차에게는 이미 판단·맥락·도는 루프가 있어
382
+ **지렛대를 대면 된다**. 신입에게는 그 엔진 자체를 **만들어 줘야** 한다. 부스터는 전자, 인큐베이터는
383
+ 후자다.
384
+
385
+ 🟥 **그래서 이 행이 실제로 주장하는 범위는 좁게 적어야 한다.** 부스터의 난이도는 **대상의
386
+ 성숙도에 반비례**하고, 위 실적의 대상은 **전부 이미 도는 개발 과정을 가진 하네스**였다(pmh ·
387
+ gstack · mate · 조직 환경 2건 — 어느 것도 무에서 시작하지 않았다). 그러니 이 🟢 은 «성숙한
388
+ 엔진에 지렛대를 댔다»에 대한 초록이지 «무에서 길렀다»에 대한 초록이 아니다 — 후자는 ②의
389
+ 자리이고 ②는 아직 🔵 다.
390
+ ⇒ 승급 기준 4로 승격: **실적을 셀 때 대상의 성숙도를 같이 기록한다.** 안 그러면 «하네스 6개를
391
+ 부스팅했다»가 «도는 엔진 6개를 가속했다»와 «6개를 무에서 길렀다» 사이에서 **어느 쪽인지 모르는
392
+ 숫자**가 된다. 지금까지의 실적은 전부 전자이며, 그렇게 적는다.
393
+
394
+ ⚠️ **③ 과 ④ 는 이 아래로 넣지 않았다 — 운영자가 그 둘을 말하지 않았고, 내가 대신 정할 일이
395
+ 아니다.** 잠정 관찰만 남긴다: ③ 거버넌스 게이트는 부스팅을 *포함한* 모든 행위가 통과하는
396
+ 품질 바닥이라 하위라기보다 **직교**로 보이고, ④ 프런티어→조직 전파는 대상이 하네스가 아니라
397
+ 조직이라 **다른 축**일 수 있다. 둘 다 운영자 판단 대기이며, 그때까지 이 표에서 위치를
398
+ 바꾸지 않는다.
399
+
400
+ ⚠️ 그리고 **계보와 포함은 다른 관계다.** 운영자는 별도로 *"부스터로부터 모든 정체성이
401
+ 발아했다"* 고도 말했는데, 그건 «부스터가 나머지를 포함한다»가 아니라 **«나머지가 거기서
402
+ 나왔다»**다. 씨앗이 나무를 포함하지 않는다 — 각 행은 자기 승급 기준을 그대로 진다.
403
+
404
+ ### §Ⓑ-genealogy — 그리고 계보상으로도 **첫 번째**다 (운영자, 2026-08-16)
405
+
406
+ 운영자 원문: *"부스터로부터 모든 정체성이 발아했다고 보면 될 정도임."* 이 행이 표에 **늦게 추가된
407
+ 것**은 발견 순서이지 계보의 순서가 아니다. 나머지 행들이 전제하는 것을 보면 이유가 보인다:
408
+
409
+ - **① 하네스 클러스터**는 *클러스터할 남의 하네스가 존재하고 연결돼 있어야* 성립한다. 그 하네스들이
410
+ 존재하고 연결된 경위가 부스팅이다. pmh 는 이 경로에서 **출발했다**.
411
+ - **② 인큐베이터**가 방출한 것은 방출로 끝나지 않는다 — 길러진다. 그 기르는 행위가 부스팅이다.
412
+ - **⑤ 증폭자**는 사람의 의도를 벼리고, 부스터는 그렇게 벼려진 것을 **다른 하네스에 실어 나른다**.
413
+
414
+ 🟥 **그래서 이 행의 부재가 비쌌다.** 등급표는 FH 가 자기를 감사하는 계기인데, 계보상 첫 번째인 기능에
415
+ 행이 없으면 그 기능은 매 감사에서 **구조적으로 시야 밖**이다. 2026-08-16 pmh 실측(이식 자산이 대상
416
+ 환경에서 죽어 있었고 몇 달간 안 보였음)은 그 사각의 청구서다.
417
+
418
+ ⚠️ **여기서 «모든 정체성이 부스터에서 나왔다»를 «부스터가 나머지를 포함한다»로 읽지 마라.** 계보와
419
+ 포함은 다른 관계다. 씨앗이 나무를 포함하지 않는다 — 각 행은 자기 승급 기준을 그대로 진다.
420
+
421
+ ### §Ⓑ promotion criteria — 이 행이 지킬 것
422
+
423
+ 🟢 로 신설됐으므로 이 절은 «어떻게 올라가나»가 아니라 **«무엇이 이 행을 내릴 수 있나»**를 적는다.
424
+ 잔여가 닫히는 조건이자, 다음 감사가 이 행에 물어야 할 질문이다.
425
+
426
+ 1. **이식 발화 검사 (핵심 잔여, 미구축).** 부스팅이 대상 하네스에 자산을 이식했을 때, 그 자산이
427
+ **대상 환경에서 실제로 발화하는가**를 재는 계기가 없다. 2026-08-16 의 실패 형태가 정본이다:
428
+ 저자 레포에는 있고 대상 레포에는 없는 전제(여기서는 npm 표면)를 자산이 조용히 깔고 있었고,
429
+ **저자 환경에서는 31/31 초록**이었다. ⇒ 판정은 **대상 환경에서** 이뤄져야 한다. 판별선은
430
+ `harness_incubator_doctrine.md §3-b` 의 것을 그대로 쓴다 — **«아무것도 하기 전에 죽는다»(rc=1)**
431
+ 와 **«돌았고 타입 있는 verdict 를 낸다»(HARNESS_ERROR)** 는 다른 상태다.
432
+ 2. **가속과 오염을 가른다.** 부스팅은 **자산을 이식하는 행위**라, 이식되는 것에는 저자 하네스의
433
+ 결함도 같이 실린다. 이 행의 실적은 «몇 개를 이식했나»가 아니라 «이식된 것이 **거기서** 도나»로
434
+ 센다. 전자는 활동량이고 후자만 결과다.
435
+ 3. **조직 환경 실적은 증언으로 남고 측정으로 세지 않는다.** residency 때문에 이 파일에서 검증할 수
436
+ 없고, 검증 못 하는 것을 숫자에 넣으면 그 숫자 전체가 못 쓰게 된다.
437
+
280
438
  ### ② promotion criteria — and what the criteria themselves turned out not to be able to check
281
439
 
282
440
  ②'s 🟡 has been re-argued on different grounds each round, every round re-deriving the bar from scratch.
@@ -309,7 +467,62 @@ unreachable condition, which is the shape that trains people to delete the thing
309
467
 
310
468
  | | Condition | Check class | Status |
311
469
  |---|---|---|---|
312
- | **P1** | An EMIT run leaves an ordering record that does not depend on trusting the author — the intent/budget/sim record committed, hashed, or otherwise witnessed **outside** the gitignored workspace, before the verdict | mandatory-pass | **channel now exists (2026-08-08)** — `scripts/chamber_witness.sh`, wired into `chamber_run.sh` steps 2–5. **Still unsatisfied**: no run holds a witness yet |
470
+ | **P1** | An EMIT run leaves an ordering record that does not depend on trusting the author — the intent/budget/sim record committed, hashed, or otherwise witnessed **outside** the gitignored workspace, before the verdict | mandatory-pass | **channel exists (2026-08-08)** — `scripts/chamber_witness.sh`, wired into `chamber_run.sh` steps 2–5. 🟥 **and it was UNSATISFIABLE until 2026-08-17 — by construction, not by strictness.** See §P1-2026-08-17 below. **Still unsatisfied**: no run holds a witness yet |
471
+
472
+ <a name="p1-20260817"></a>
473
+ **§P1-2026-08-17 — 첫 형식 완주가 이 조건이 «도달 불가능»이었음을 실측했다. 수리했고, 그 사실을 남긴다.**
474
+
475
+ 챔버 런 **#11**(`persona-simulator-harness`, KILL)은 이 채널을 **처음으로 끝까지** 태운 런이다.
476
+ 그리고 완주하자마자 `verify` 가 **`TAMPERED — 증인 무효`** 를 냈다. 기전은 추측이 아니라 코드다:
477
+
478
+ ```
479
+ step 3 BUDGET.md(ESTIMATE)의 해시를 증인 원장에 기록 ← 사전등록 증인
480
+ step 5 verdict 기록
481
+ step 6 BUDGET.md 에 ^ACTUAL: 을 요구하며 하드 차단(exit 1) ← 그 파일을 변경하도록 강제
482
+ verify 기록된 해시 ≠ 현재 파일 → TAMPERED
483
+ ```
484
+
485
+ ⇒ **COMPLETE 에 도달하려면 반드시 증인 아티팩트를 사후 변경해야 했다. 우회로가 없었다.**
486
+ 즉 P1 은 «완주한 런»으로 만족이 불가능했고, 그것이 ②가 🔵 였던 **기계적** 이유다 — 후보가
487
+ 부족해서가 아니다. 이 절이 2026-08-08 에 *"unreachable condition … trains people to delete the
488
+ thing being counted"* 라고 경고한 그 형태가, **그 경고를 적은 채널 자신에서** 재발했다.
489
+
490
+ **대상 선정 실수가 아니다.** P1 문언이 *"the **intent/budget**/sim record"* 로 BUDGET 을 증인
491
+ 대상으로 **명시 지목**한다. 결함은 **한 파일에 두 역할이 겹친 것**이다 — ①불변을 요구하는 증인 ·
492
+ ②변경을 요구하는 사후 캘리브레이션. **개별로는 둘 다 옳고, 충돌은 아무도 소유하지 않는다.**
493
+ 그래서 어느 쪽 코드를 읽어도 안 보였고, 정적 판독은 양쪽 다 초록으로 읽힌다.
494
+
495
+ **왜 기존 검증이 다 놓쳤나 — 이게 남길 값의 본체다.**
496
+ - `test_chamber_run_lanes.sh` 는 헤더에 *"순서 증인은 이 테스트의 대상이 아니다 — 부수 효과가
497
+ 섞이므로 복사하지 않는다"* 라고 **명시적으로 증인을 제외**했다.
498
+ - `chamber_witness.sh --self-test` 16레인은 증인을 **단독으로** 시험했다(cross-family 가 fail-open
499
+ 7건을 잡은 그 레인들이다).
500
+ - ⇒ **러너 × 증인의 이음매를 어느 쪽도 안 봤다.** 두 테스트 다 자기 범위에선 옳았다.
501
+ - 그리고 러너 픽스처 `_mk_budget()` 이 `ESTIMATE:\nACTUAL: -` 를 **한 번에** 써서, 12레인 어디에도
502
+ «추정→실행→실비용» 이라는 **실제 순서가 존재하지 않았다.** 픽스처가 *상태*를 모델링했고 결함은
503
+ *과정*에 있었다. `[[feedback_adversarial_review_not_substitute_for_first_use]]` 의 교과서 사례다.
504
+
505
+ **수리(2026-08-17)** — 스펙은 안 건드리고 **변경 요구만** 빼낸다:
506
+ - `chamber_run.sh` step 6 → **별도 `ACTUAL.md`**. 정의상 판정 후 산물이므로 **증인에 기록하지 않는다.**
507
+ - `chamber_witness.sh do_record` → 동일 `(run, artifact, sha)` 삼중항 재기록 스킵. 종전엔 무조건
508
+ append 라 4스텝 런에 엔트리 **11개**가 쌓였다(판정은 안 틀리나 공개 tracked 파일이 부풀고 verify
509
+ 출력이 같은 줄을 반복해 **읽는 사람이 「몇 건이 문제인가」를 오독**한다). 🟥 **내용이 바뀐 경우는
510
+ 여전히 새 엔트리로 남는다** — 그게 TAMPERED 를 성립시키는 증거다.
511
+ - `test_chamber_run_lanes.sh` **12 → 26레인**. 신설 축은 **이음매**이고, 어서션이 두 겹이다:
512
+ **L13-a**(완주 후 BUDGET.md 해시 불변) + 🟥 **L13-b**(step 6 이 **지목하는 파일**이 증인 대상이
513
+ 아닐 것). L13-b 가 본체다 — **러너는 BUDGET.md 를 직접 고치지 않고 사람에게 고치라고 시키므로**,
514
+ 파일 해시만 보는 L13-a 는 되돌림 프로브에서 **초록으로 남았다**(즉 그것만으로는 장식이었다).
515
+ 잴 것은 파일이 아니라 **지시**였다. 되돌림 실측: `git show HEAD:` 판으로 되돌리면 L13-b 가
516
+ 적색(`step6 이 증인 아티팩트를 고치라고 시킨다`), 컨트롤은 초록 유지.
517
+
518
+ ⚠️ **런 #11 자신은 TAMPERED 로 남는다. 소급 수리하지 않는다** — 과거 9런을 back-fill 하지 않는 것과
519
+ 같은 이유다(사후에 쓴 기록은 증명하지 않는다). **P1 은 이 수리 이후의 EMIT 런에서 처음 만족 가능하다.**
520
+ 🟥 그리고 이 수리는 **P1 을 만족시키지 않는다** — 만족을 *가능하게* 만들 뿐이다. ②는 🔵 유지.
521
+
522
+ ⚠️ **되돌림 프로브 자체에서 실책 1건(기록)**: 첫 시도가 `sed` 로 따옴표 포함 패턴만 바꿔 **검사는
523
+ BUDGET, 메시지는 ACTUAL 인 잡종**을 만들었고, 그 상태에서 L13-b 가 초록이라 하마터면 «레인이
524
+ 장식이다»로 결론 낼 뻔했다. 되돌림은 **`git show HEAD:` 로 통째 복원**해야 한다 — 부분 되돌림은
525
+ 되돌림이 아니다.
313
526
 
314
527
  **P1's channel was built, and that is not the same as P1 passing.** The row above said *not buildable
315
528
  today*; that is no longer true, and the reason it was true is worth keeping because it names the shape of
@@ -380,8 +593,12 @@ incubator entry absorbed into deep-clarify) — the identity-② weakness surfac
380
593
  > external-grounding=질문하기), 그 대응은 새로 만든 것이 아니라 이 표에 이미 있던 것이다.
381
594
 
382
595
  **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
596
+ not all-green. ~~③⑤ are 🟢, **①②④ are 🔵 RC**~~ **2026-08-16: ①③⑤ are 🟢, ②④ are 🔵 RC**,
597
+ **none 🔴** — the `v0.1.0` notes state this and make no
384
598
  all-green claim (per the refined 0.x↔1.0 mapping above). **`v1.0.0` remains the all-green target.**
599
+ 🟥 **①의 🟢 은 기준이 바뀐 결과다** — 옛 dominance 절로 재면 오늘도 🔵 이고, 두 번 쟀고 둘 다
600
+ 미성립이었다. 무엇이 왜 바뀌었는지는 [§①-2026-08-16](#id1-20260816) 을 읽어라. **그 행이 명시
601
+ 잔여 셋(외부 소유 선언 n=1 · qasp 보류 · (d) 미해결)을 함께 지고 있고, 그걸 빼고 인용하지 마라.**
385
602
 
386
603
  > *Why this paragraph is being rewritten rather than edited in place*: it read **"①②④ 🟡"** for three
387
604
  > sessions **after** the rows above had moved — ② to RC on 2026-08-09 (PR #281), ④ on 2026-08-09
@@ -394,12 +611,18 @@ What now blocks `v1.0` is **closing the 🔵s** — RC means the mechanism stand
394
611
  walked outside:
395
612
 
396
613
  ```
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)
614
+ **CLOSED 2026-08-16 행은 이상 v1.0 막지 않는다.** 아래는 이력이다:
615
+ ~~external-harness recommend (cluster-wizard, still parked)~~ **BUILT + 머지**
616
+ (`scripts/cluster_capability_scan.sh`, PR #399 / main `db33a7e`) · ~~capability_registry_check.sh
617
+ absent~~ BUILT 2026-08-11 · ~~both nodes are FH-internal~~ **크로스하네스 유니온이 실주행**
618
+ (`pmh-dev:merge-noop-check` = pmh 자기 레포 소유 선언 FH 자기 선언, 양·음 arm 이 다른
619
+ 노드에서 다른 이유로 막힌다) · dominance 절은 **①에 한해 ⓐⓑⓒ 로 대체**(운영자 결정,
620
+ [§①-2026-08-16](#id1-20260816))
621
+ 🟥 **다만 (d) 는 안 닫혔다** — 「선언된 부작용 축을 검증 못 한다」. `.git/objects` 감시로 한
622
+ 부류를 닫았으나 **M6 는 선언된 캘리브레이션 arm 만 관측한다**(실증: 분기 입력에서 객체를 쓰는
623
+ 능력이 `writes: read-only` 거짓 선언으로 통과). ⚠️ 이건 이제 **①의 블로커가 아니라
624
+ «등록 바의 열린 결함»** 으로 재분류된 것이다 — ⓐⓑⓒ 가 «바가 선언을 검증한다」를 요구하지
625
+ 않기 때문이지 **문제가 사라졌기 때문이 아니다.** 별도 항목으로 계속 추적한다
403
626
  ② a formal chamber EMIT — the mechanism firing in a real situation, not a retrofitted verdict
404
627
  ④ file-change ≠ token-introduction — the instrument is a screener, not an adjudicator
405
628
  ```
@@ -2018,3 +2018,131 @@
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
2083
+ - date: 2026-08-17
2084
+ agent: fh-meta:beginner (isolated) — 챔버 런 #11 step-4 블라인드 페르소나 1/3
2085
+ purpose: "인물 시뮬레이터 하네스 후보에 대한 냉담 첫 접촉 — 첫 실패 지점·믿을 이유·이해 불가 지점"
2086
+ outcome: accepted
2087
+ evidence: "tool_uses 8(실독 확인 — 어제 sim 8회 tool_uses:0 죽은 컨트롤의 반대). 최대 소득 = 첫 기계적 실패가 크래시가 아니라 무음 통과라는 지목: grounding_gate_v3.py:88-93 _KNOWN_BOOKS 가 'Book Ch:Vs' 주소 문법에 하드코딩이라 임의 인물 코퍼스에선 빈 셋 → 오귀속 검출 b1/b2 가 초록으로 통째 우회. 🟥 최강 발견 1건은 VOID(stale 체크아웃에 조준한 내 계기 결함 — personas_dialogue.json 이 반증). 부재를 0으로 안 렌더한 덕에 그 결함이 드러났다"
2088
+ cost: 102k tokens
2089
+ - date: 2026-08-17
2090
+ agent: fh-meta:main-player (isolated) — 챔버 런 #11 step-4 블라인드 페르소나 2/3
2091
+ purpose: "실사용자 일상 가치 — 티어 선정 후 매일 쓸 값어치가 있는지, 게이트가 값인지 방해인지"
2092
+ outcome: accepted
2093
+ evidence: "tool_uses 9. 핵심 숫자 = 사용 장면 0/3 생존(2 기존수단 대체 · 1 자기 게이트가 금지). 그리고 Light↔Heavy 구조적 상충(게이트 ON→Light 사망 / OFF→Heavy 유일 값 소멸)이 튜닝으로 못 푸는 것임을 코드 주석(v3:233-234 'PARAPHRASE over-blocks … err-safe direction')으로 근거화. Midcore 스킵을 자백하고 '이 스킵이 판정의 최약 고리'라고 스스로 적음. 결론 'KILL the simulator · EMIT the attribution gate'"
2094
+ cost: 102k tokens
2095
+ - date: 2026-08-17
2096
+ agent: fh-meta:challenger (isolated) — 챔버 런 #11 step-4 블라인드 페르소나 3/3
2097
+ purpose: "배출 후보 적대 심사 — 핵심 술어 성립성·재발명·배출가치·실패비용·안 보이는 것"
2098
+ outcome: accepted
2099
+ evidence: "tool_uses 22, 자체 컨트롤 부착(같은 Glob 이 battery4.py·normalization.py 는 잡음 → 계기 생존 증명). 🟥 거버너 사각 2건 적발: EMIT 이 이미 내려진 운영자 결정(출하 없음)과 정면 충돌 · Delphi 가 미승인 Peter Attia 클론을 실제 테이크다운(카파시와 동일 프로파일). 최대 기여 = 술어가 '더 어렵다'가 아니라 '목적과 상충'임을 코드로(grounding_gate.py:317-332). 팬텀 4건은 VOID(stale 체크아웃)이나 본인이 '원인 MED, stale 가능성 배제 못 함'이라고 선제 자백 — 등급 자기하향이 판정 신뢰도를 올렸다"
2100
+ cost: 117k tokens
2101
+ - date: 2026-08-17
2102
+ agent: general-purpose (isolated) — 챔버 런 #11 조건 1(net-new) measured 스캔
2103
+ purpose: "외부 생태계 + FH 내부 자산 전수 스캔으로 재발명 여부를 측정. '없는 것 같다'는 결과가 아니라고 명시 지시"
2104
+ outcome: accepted
2105
+ evidence: "tool_uses 28(WebSearch 12 · WebFetch 3 · 로컬 SKILL 4종 정독). 🟥 이 런의 KILL 을 가른 계기이고, 유일하게 stale-체크아웃 결함의 영향 밖이다(the-bible 은 '안 열었다'고 자백). ⓐ=Delphi.ai 상용 + verbatimeter(--fail 비영종료 CI 게이트) + 내부 corpus-grounding-expander · ⓒ=NeMo Guardrails + 내부 persona_container_schema.md 4그룹 tier-floor · ⓑ만 빈칸인데 그건 배출물이 아니라 업계 미해결 난제. 선행연구 PersonaCite(CHI 2026 EA) 가 후보 루프와 동형. 미탐 자백 6종(영어 전량·Delphi 실계정 미검증·GitHub code search 미실시 등)을 스스로 열거"
2106
+ cost: 157k tokens
2107
+ - date: 2026-08-17
2108
+ agent: codex/gpt-5.5 (cross-family, headless) — 챔버 P1 증인 수리 델타 Axis 2 탈상관
2109
+ purpose: "chamber_run.sh/chamber_witness.sh/test_chamber_run_lanes.sh 197줄 diff 를 다른 계열로 공격. crossfamily 마커 값 확보(하중 변경 — 게이트 exit 동작 + 증인 판정)"
2110
+ outcome: accepted
2111
+ evidence: "7건(A급3·B급4) · **자력 적발 0/7**. A급 전부 손 재현 후 수리 — ⓐ 멱등 가드 `substr($0,9)` 오프셋(`- run: `는 7자, 값은 8부터): 슬러그 첫 글자가 잘려 **어떤 정상 엔트리와도 매칭 안 됨** = 가드가 조용히 무력인데 30레인 전부 초록이었다(재현: `printf -- '- run: g2\\n' | awk '{print substr($0,9)}'` → `2`) ⓑ L11 이 «멱등»을 잰다면서 증인 원장이 아니라 G4 INDEX.md 를 셌다 → L14 신설(증인 실제 복사 후 2회 기록) ⓒ L13-b 가 `step 6 BLOCKED` 한 줄만 grep 해 뒤에 한 줄 더 붙이면 게임 가능 → 차단 블록 전체로 확대. B급 4 중 3 채택(인접성 상태기계 · 리터럴→호출 인자 **집합 대조** · 거짓 주석 정정), 1건 수용(레거시 런이 시끄럽게 막히는 건 안전 방향). 🟥 그리고 **내 주석 하나가 거짓임을 지적**했다(레인이 증인을 복사한다고 적었는데 `grep -c 'cp .*chamber_witness'`=0). 미탐 자백: bash 3.2/BSD·GNU 이식성 구체 결함 0건 — 공백 아티팩트명은 상류에서 이미 거부되어 도달 불가라고 근거까지 댔다"
2112
+ cost: 50k tokens
2113
+ - date: 2026-08-17
2114
+ agent: general-purpose (isolated) — axes-run 4축→6축 조사·설계안
2115
+ purpose: "마커 스펙 정본 위치 · 훅이 실제로 강제하는 것 · 6축 대응표 · 기존 마커 실측 · 마이그레이션 설계안 3개. 파일 수정 금지(read-only)"
2116
+ outcome: accepted
2117
+ evidence: "tool_uses 21. 🟥 승인의 전제를 반증한 것이 최대 기여 — 「기존 마커 전량 무효화」가 거짓이고 훅은 `.axes_23_passed_{branch}_{TODAY}.marker` 한 개만 검증한다(pre-commit:906 인용). 실측 190건 중 차단 0 · 재해석 51. 그리고 스펙 정본이 **어느 rule 파일에도 없다**는 것(grep 0건)을 지목해 §Marker axis fields 신설로 이어졌다. 자기 미확인 3건을 스스로 열거(08-10 자 기호 마커 2건이 어떻게 통과했는지 · 기호 grep 이식성 · 다른 소비자 영향)"
2118
+ cost: 168k tokens
2119
+ - date: 2026-08-17
2120
+ agent: general-purpose (isolated) — deepteam 업스트림 이슈 준비
2121
+ purpose: "전달본 §DELIVERABLE 정리 + 채널 기계 확인 + 이슈 템플릿/라벨 조사 + 사생활 스캔. 게시 금지(read-only)"
2122
+ outcome: partial
2123
+ evidence: "tool_uses 14. 채널을 기계로 확정(hasDiscussionsEnabled=false / hasIssuesEnabled=true, 출력 인용) — 운영자 서술을 맞춰준 게 아니라 확인했다. 전달본이 `sentry_sdk` 누락을 「the one genuinely actionable thing」으로 단정한 것을 코드검색 hit 0 근거로 격하 권고. 🟥 **그 권고가 뒤집혔다** — 검색 대상이 `main` 이었고 설치되는 건 릴리스 1.0.9 다. 깨끗한 venv 실측에서 `import deepteam` 이 실제로 죽었고(telemetry.py:7), 이슈는 사용노트가 아니라 **버그 리포트**로 게시됐다(#263). 정적 검색이 「없다」고 하고 실행이 「있다」고 한 형태 — partial 로 기록"
2124
+ cost: 107k tokens
2125
+ - date: 2026-08-17
2126
+ agent: general-purpose (isolated) — ⓓ 3자대면(날짜 컷오프 마이그레이션 선례 대조)
2127
+ purpose: "「날짜 컷오프 + 표기법이 스키마 버전을 나른다」가 남의 코드베이스에 알려진 패턴인가 안티패턴인가. 반증 기회로 돌릴 것을 명시 지시"
2128
+ outcome: accepted
2129
+ evidence: "tool_uses 2(WebSearch/WebFetch 중심). 🟥 **내 명제 2건을 반증했다** — ⓐ 「표기법이 배열을 선언한다」가 거짓(코퍼스 손 카운트: axes-run 53건 중 기호 4·혼용 1, 기호 4 중 2건이 08-10 자 옛 4축 의미) ⓑ 날짜 컷오프가 프로덕션 도달 불가 분기(호출부가 ${TODAY} 로 경로 구성). 둘 다 내가 재현 확인. 선례 3계열을 URL 근거로 제시(SonarQube new-code-period · PNG 청크 암묵버전 + 그 전제 문장 · git repositoryFormatVersion 3단 롤아웃 · protobuf 필드번호 재사용금지). 「찾지 못함 ≠ 없다」를 스스로 구분해 적음"
2130
+ cost: 136k tokens
2131
+ - date: 2026-08-17
2132
+ agent: general-purpose (isolated) — qasp-dev 입장리뷰(정적+동적)
2133
+ purpose: "전파 자산(pre-commit) 변경에 대한 standpoint 축. 훅 부재 가설을 실행으로 검증 + qasp 자기 정본 독해. 실물 레포 불변"
2134
+ outcome: accepted
2135
+ evidence: "tool_uses 19. 임시 클론에서 git commit 8회, **양방향 컨트롤**(스텁 훅 rc=1 / 실구성 rc=0 · hooksPath unset 시 폴백 rc=1)로 pre-commit 부재 확정. 🟥 **내 프레이밍을 규범적으로 반증** — 「게이트 부재 = S급 결함」이 아니다(qasp 정본 «4축 비적용» + FH 정본 «NEVER installed into field projects», 양쪽 일치). 내가 세운 「.new.NNNNN = 설치 중단 흔적」 가설도 반증(rename 단계 부재, mv 는 폐기된 옛 설계). 부산물로 FH 자기 기록 2건 오진 발견(08-03 철회 후 08-10 재발). 등급 tier2(qasp-dev)"
2136
+ cost: 146k tokens
2137
+ - date: 2026-08-17
2138
+ agent: general-purpose (isolated) — pmh-dev 동적 입장리뷰(tier2)
2139
+ purpose: "6축 전파가 pmh-dev 에서 무엇을 깨는가. 임시 클론에 이식 후 실제 커밋 양팔. 실물 레포 불변"
2140
+ outcome: accepted
2141
+ evidence: "tool_uses 43. 🟥 **자기 방법론 사고를 자백하고 전량 재실행** — 1차가 움직이는 FH 워킹트리를 소스로 써서 중간 측정이 설명 불가능한 값을 냈다(훅 1414줄). `git show a15e384:<path>` 로 동결 후 재실행하고 매 실행마다 계기 적재를 diff 로 대조(IDENTICAL). 커밋 4팔 exit 1/1/0/0 + 되돌림 컨트롤로 귀속 확인. 신규 FAIL 0(기준선 35=전파 후 35) · 기존 마커 42건 재판정 0 · LC_ALL=C sed remap 유니코드 무손상(바이트 IDENTICAL). **내 델타 안의 결함 2건 적발** — 픽스처 헤더가 기호 표기로 옛 4축 의미를 가르침 + selfcheck 주석 stale. 범위 밖 관측 2건을 미확인으로 분리 기재"
2142
+ cost: 180k tokens
2143
+ - date: 2026-08-17
2144
+ agent: codex/gpt-5.5 (cross-family sidecar, headless)
2145
+ purpose: "출하 배선 + axes-run 6축 델타 309줄에 대한 적대 리뷰. 공격 지점 6개를 명시 지정"
2146
+ outcome: accepted
2147
+ evidence: "8건 지적(S2·A3·B3). 그중 2건(혼용 오탐 · 화살표 fail-open)은 내가 투입 전 자력 수리했고 codex 가 독립으로 같은 지점을 지목해 수렴 확인 — 그 둘은 「둘 다 봤다」. **나머지 5건 자력 적발 0**: grep 이 주석 처리된 호출에 매칭(S) · if:false 로 꺼진 잡(S) · 트리거 미검사(A) · 잡 신원 미검사(A) · 마커 파일명 날짜 추출 fail-open(B, 선재). 각 지적에 깨뜨리는 입력을 구체적으로 제시해 손 재현이 즉시 가능했다"
2148
+ cost: 85k tokens
@@ -12,6 +12,18 @@ When a **sister asset** (another team in the organization · external frontier
12
12
  - An external resource with **similar scope but different resolution** from a `knowledge/shared/` asset is found
13
13
  - An external reference URL repeatedly appears in the weekly audit scanner aggregation
14
14
  - User mentions "that other project/team also did this"
15
+ - 🟥 **ACTIVE ADOPTION — you went looking for an external asset, installed it, and RAN it** against
16
+ something this hub owns. Added 2026-08-16 because every condition above is **passive discovery**
17
+ ("a resource *is found*"), and the strongest sister signal there is does not look like discovery
18
+ at all: deliberately reaching for an outside tool *because ours did not cover something* is a
19
+ measured resolution difference, not a hunch about one. **Measured miss**: an external red-team
20
+ framework was installed, run against a field harness's safety gate, and found a real bypass — and
21
+ none of it fired this protocol. It was filed in memory as `type: reference`, a **tool pointer**,
22
+ because "a tool I used" was an available and correct-looking category while "sister asset" was a
23
+ category no listed condition named. That is the normalization reflex `CLAUDE.md
24
+ §Envelope-Boundary Discipline` exists to counter, reproduced inside the protocol meant to catch it.
25
+ **The tell**: if you can answer *"what does it do that ours doesn't?"* — you have already done
26
+ step 1's resolution-difference analysis, and owe steps 2–3.
15
27
 
16
28
  ## Lightweight path (C-tier — cheap debt entry)
17
29
 
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.1.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": [
@@ -27,7 +27,7 @@
27
27
  "prepare": "chmod +x bin/fh-gate.js bin/fh-run.js bin/fh-goal.js bin/fh-codex-doctor.js scripts/fh-gate.sh scripts/fh-run.sh scripts/fh-goal.sh",
28
28
  "postinstall": "node scripts/postinstall_notice.js",
29
29
  "test": "bash scripts/selfcheck.sh",
30
- "prepublishOnly": "bash scripts/publish_freshness_check.sh && bash scripts/version_lockstep_check.sh && bash scripts/selfcheck.sh && bash scripts/package_coverage_check.sh --vs-tarball && bash scripts/public_surface_scan_files.sh",
30
+ "prepublishOnly": "bash scripts/prepublish_scope_note.sh && bash scripts/publish_freshness_check.sh && bash scripts/version_lockstep_check.sh && bash scripts/package_coverage_check.sh --vs-tarball && bash scripts/public_surface_scan_files.sh",
31
31
  "release": "bash scripts/public_surface_scan_files.sh && npm publish"
32
32
  },
33
33
  "engines": {
@@ -73,8 +73,14 @@
73
73
  "scripts/test_version_lockstep_lanes.sh",
74
74
  "scripts/package_coverage_check.sh",
75
75
  "scripts/publish_freshness_check.sh",
76
+ "scripts/prepublish_scope_note.sh",
76
77
  "scripts/lane_runner_check.sh",
77
78
  "scripts/test_package_coverage_lanes.sh",
79
+ "scripts/adapters/peer_resolve.sh",
80
+ "scripts/adapters/gstack_content_safety.sh",
81
+ "scripts/adapters/mate_agent_boundary.sh",
82
+ "scripts/adapters/qasp_new_code_anchor.sh",
83
+ "scripts/test_adapter_lanes.sh",
78
84
  "scripts/test_fh_gate_regressions.sh",
79
85
  "templates/local_fh_context.md",
80
86
  "docs/ETHOS.md",
@@ -93,6 +99,7 @@
93
99
  "templates/.claude/rules/session.md",
94
100
  "scripts/below_floor_scan.sh",
95
101
  "scripts/capability_registry_check.sh",
102
+ "scripts/cluster_capability_scan.sh",
96
103
  "scripts/capability_effect_probe.sh",
97
104
  "scripts/chamber_run.sh",
98
105
  "scripts/fh_env_delta_scan.sh",
@@ -199,6 +206,8 @@
199
206
  "scripts/test_knowledge_seam_lanes.sh",
200
207
  "tests/seam_absence_probes.md",
201
208
  "scripts/gate_anchor_check.sh",
202
- "scripts/rtk_gross_ablation.sh"
209
+ "scripts/portability_lint.sh",
210
+ "scripts/rtk_gross_ablation.sh",
211
+ ".claude/capabilities"
203
212
  ]
204
213
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },