@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
@@ -0,0 +1,110 @@
1
+ # ═════════════════════════════════════════════════════════════════════════════
2
+ # 어댑터 선언 — FH 가 **남의 하네스 능력을 자기 안에서** 선언한다
3
+ # ═════════════════════════════════════════════════════════════════════════════
4
+ # 이 파일은 forge-harness 의 «자기 능력» 선언이 아니다. peer 하네스 `gstack` 의 능력을
5
+ # FH 가 **호출 가능하게 감싼** 것이다. 어댑터임은 **id 네임스페이스**(`adapter/…`)와 이
6
+ # 헤더로 표시한다 — 🟥 **새 스키마 키를 만들지 않는다.** `.cap` 파서가 이 클러스터에 네 벌
7
+ # 있고(relay · registry · cluster_scan · effect-probe), 오늘만 관대함 차이로 두 번 터졌다
8
+ # (`summary`/`tags` 가 한쪽에만 추가돼 «등록되나 호출 불가»). 키를 늘리면 네 곳을 동시에
9
+ # 고쳐야 하고 그게 이 레포의 재발 결함이다.
10
+ #
11
+ # 왜 여기 사나 (운영자 결정 2026-08-16): *"사용자들은 다들 대상 레포에 짓지 않을 거야.
12
+ # FH 내부에 상주시키겠지 — 로컬에서 작업하기 위한 거니까 어댑터는 내장되어 있어야지."*
13
+ # 남의 레포 안 `.cap`(소유 선언)은 그 하네스를 소유하고 **동시에 노출을 결정한** 특권적
14
+ # 경우이지 일반 경로가 아니다. gstack 레포에도 같은 목적의 소유 선언
15
+ # (`.claude/capabilities/content-safety-scan.cap`)이 있고, 이 어댑터는 그것과 **경쟁하지
16
+ # 않는다** — peer 가 자기 선언을 갖든 안 갖든 FH 가 부를 수 있게 하는 것이 어댑터의 일이다.
17
+ #
18
+ # `requires_cwd: SELF` 인 이유: 선언이 FH 안에 있고, tracked 파일에 운영자 홈 절대경로를
19
+ # 싣지 않는다. peer 레포 위치는 **실행 시점에** `scripts/adapters/peer_resolve.sh` 가
20
+ # 푼다 — 규칙은 `cluster_capability_scan.sh` 와 같은 한 벌이다(`FH_CLUSTER_ROOTS` 또는
21
+ # `FH_PROJECTS_HOME`(기본 `$HOME/projects`) + 별칭 `<n>`·`<n>-dev`·`_`→`-`, 모호하면 안 고른다).
22
+ #
23
+ # ── 무엇을 재나 ──────────────────────────────────────────────────────────────
24
+ # 텍스트 표면의 내용 안전성. gstack 의 공유 redact 엔진(`lib/redact-engine.ts`, 34패턴 /
25
+ # secret·pii·legal·internal)이 매칭 **전에** 정규화(NFKC + zero-width 제거 + 소형 HTML
26
+ # 엔티티 디코드)하므로 유니코드 혼동문자·제로폭 회피가 통하지 않고, 스캔하기엔 너무 큰
27
+ # 입력에서는 조용한 통과 대신 합성 HIGH 로 **fail-closed** 한다.
28
+ #
29
+ # ── 왜 net-new 인가 (기계 확인, 기억 아님 — gstack 소유 선언에서 옮겨온 근거) ──
30
+ # 가장 가까운 기존 노드는 허브의 `public-surface-scan`(누출 렌즈)이다.
31
+ # · OVERLAP(정직하게, 그리고 더 큰 쪽): 자격증명 **형태**. 허브가 이미 AWS/GitHub/Slack/
32
+ # OpenAI/Anthropic/Google 키 형태와 PEM 헤더를 담는다.
33
+ # · NET-NEW(등록할 값어치): 허브는 `pii`·`legal`·`internal` 범주에 패턴이 **0개**다 —
34
+ # SSN·카드번호·E.164 전화·이메일·공인 IP 탐지가 아예 없다. 그리고 `grep -E` 로 raw
35
+ # 바이트를 보므로 정규화 층이 없고 제로폭/혼동문자에 뚫린다. 심각도 중간값(«사람이
36
+ # 봐야 한다»)도 없다 — CLEAN/LEAK 둘뿐이다.
37
+ # 허브 자신의 게이트 문서가 그 갭을 자기 말로 적어 뒀다 — 커밋시점·발행시점 스캔은
38
+ # *"자기 경로 위의 denylist 이지 범용 시크릿 스캐너가 아니다"* 이고 *"패턴 없는 시크릿
39
+ # 형태"* 가 명명된 잔여로 올라 있다. 이 선언은 그 잔여를 겨눈다.
40
+ #
41
+ # ── 왜 `bin/gstack-redact` 를 직접 선언 못 하나 ──────────────────────────────
42
+ # 그 CLI 의 exit 은 {0 clean, 2 MEDIUM, 3 HIGH} + git 레포 아님용 1 이고, **「아무것도 안
43
+ # 쟀다」를 뜻하는 값이 없다.** 빈 파일·후보 0개 디렉토리·인터프리터 부재가 전부 exit 0 =
44
+ # CLEAN 으로 렌더된다 — 「PASS 가 no-op 과 구분 불가」(§ⓑ.4 B1). CLI 코드를 바꾸는 선택지는
45
+ # 일부러 버렸다: gstack 의 다른 스킬과 pre-push 훅이 그 코드를 소비하므로, 설명하는 행위로
46
+ # 남의 레포 계약을 조용히 바꾸지 않는다. 래퍼가 없는 구분만 더한다.
47
+ id: forge-harness:adapter/gstack-content-safety
48
+ summary: adapter to gstack content-safety scan — secret/PII/legal patterns with normalization-before-match
49
+ tags: adapter gstack secret pii leak redact publish surface scan content-safety
50
+ entry: bash scripts/adapters/gstack_content_safety.sh
51
+ requires_cwd: SELF
52
+ verdict_channel: exit
53
+ #
54
+ # 🟥 「안 돌았다」가 **세 값**으로 갈라져 있다 — 셋은 서로 다른 명제다:
55
+ # NO_TARGET(3) 계기는 멀쩡한데 잴 대상이 없다 (대상에 대한 진술)
56
+ # 도달 경로(실물): `--target <dir>` 인데 전 파일이 바이너리/빈/공백뿐 ·
57
+ # `--target <file>` 이 0바이트이거나 공백뿐
58
+ # HARNESS_ERROR(10) 노드는 있는데 계기가 깨졌다 (계기에 대한 진술)
59
+ # 도달 경로: bun 부재 · CLI/엔진 부재 · 대상 부재/불가독 · find 열거
60
+ # 실패 · 인자 없음 · 하위 CLI 가 자기 {0,2,3} 계약 밖 코드 반환 ·
61
+ # peer 별칭이 둘 이상 동시에 맞음(어느 트리를 쟀는지 말할 수 없다)
62
+ # PEER_ABSENT(20) 그 노드가 이 머신에 없다 (클러스터에 대한 진술)
63
+ # ★어댑터 고유값. 「gstack 을 안 깔았다」가 CLEAN 으로도
64
+ # HARNESS_ERROR 로도 접히면 안 된다. 전자는 미측정을 통과로 렌더하고
65
+ # 후자는 멀쩡한 이웃을 고장으로 렌더한다.
66
+ # ★등록 바는 아래 두 arm 만 돌린다 — REVIEW_MEDIUM·NO_TARGET·HARNESS_ERROR·PEER_ABSENT 는
67
+ # 선언돼 있으나 그 판정에서 **관측되지 않는다**(검사기가 자기 출력에 그렇게 적는다).
68
+ # 그 넷은 `scripts/test_adapter_lanes.sh` 가 따로 덮는다.
69
+ verdict_enum: 0=CLEAN 1=BLOCK_HIGH 2=REVIEW_MEDIUM 3=NO_TARGET 10=HARNESS_ERROR 20=PEER_ABSENT
70
+ approval: auto
71
+ reversibility: reversible
72
+ # 진입점이 스캔한 파일 **경로**와 엔진의 마스킹된 미리보기(매치 구간 앞 4자 이내)를 싣는다.
73
+ # 경로는 호출자가 고르므로 콕핏이 운영자 파일을 겨눌 수 있다 — `public` 선언은 출력이 나를
74
+ # 수 있는 것을 느슨하게 하는 쪽이다. `company` 는 주장하지 않는다: gstack 은 공개 OSS 이고
75
+ # 이 레포는 회사 자산을 담지 않는다.
76
+ residency: operator-private
77
+ degrade: fail-closed
78
+ tier_floor: none
79
+ #
80
+ # `writes: read-only` — **실측했다**(양 arm 연속 실행 전후 대조):
81
+ # ① `$HOME` 엔트리 목록 diff = 비어 있음
82
+ # ② FH 워킹트리 `git status --porcelain` 이 이 실행으로 바뀐 항목 0건
83
+ # ③ peer(gstack) 워킹트리 `git status --porcelain` diff = 비어 있음 (peer 를 변이하지 않는다)
84
+ # 래퍼가 `$TMPDIR` 아래 만드는 스크래치는 자기 cleanup 트랩이 지운다(경로를 찍어 재-stat:
85
+ # 사라짐).
86
+ # ⚠️ 명명된 잔여: 인터프리터가 `bun` 이고 패키지 매니저는 원리상 `$HOME/.bun/` 아래 캐시를
87
+ # 건드릴 수 있다. 위 측정은 `$HOME` **엔트리**를 보므로 이미 존재하는 `~/.bun` 하위의
88
+ # 쓰기는 못 봤을 것이다. 측정 머신에 `~/.bun` 은 이미 있었고 새 최상위 엔트리는 안 생겼다.
89
+ # 이 진입점은 install/resolve 단계를 돌리지 않는다(상대 모듈과 내장만 임포트).
90
+ writes: read-only
91
+ judge: mechanical
92
+ # CLEAN 만 clearing. REVIEW_MEDIUM 은 자동 경로를 막고 사람에게 넘긴다. 나머지 셋은 결과가
93
+ # 아니라 「안 쟀다」이므로 정확히 그 이유로 막는다.
94
+ verdict_binding: BLOCK_HIGH REVIEW_MEDIUM NO_TARGET HARNESS_ERROR PEER_ABSENT
95
+ #
96
+ # known-pair — 양 arm 모두 래퍼 자신의 스크래치 디렉토리에서 실행시점에 픽스처를 만들고,
97
+ # 둘 다 **실제로 실행했다**:
98
+ # 양성(BLOCK_HIGH): AWS 액세스키 형태 + SSN 형태 → 실측 rc=1
99
+ # (`aws.access_key` HIGH + `pii.ssn` MEDIUM)
100
+ # 음성(CLEAN) : 같은 길이대·같은 주제, 자격증명도 PII 도 없음 → 실측 rc=0
101
+ # ★고정 SHA 도 `HEAD~N` 도 쓰지 않는다. 상대 ref 는 커밋이 쌓이면 조용히 다른 구간을 재고,
102
+ # 고정 SHA 는 얕은 클론에서 해석 불가인데 effect probe 가 레포를 복제한다. 실행시점 생성
103
+ # 픽스처는 **양쪽 모두에서** 안정적이다. 대가: 쌍이 재는 것은 이 레포의 히스토리가 아니라
104
+ # 엔진이다 — 내용 스캐너에는 그쪽이 옳은 표적이다.
105
+ # ★픽스처 리터럴은 래퍼 안에서 printf 인자로 **쪼개져** 있다. 픽스처가 자기를 담은 레포를
106
+ # 발행 불가로 만들면 안 된다.
107
+ calibration_positive_args: --known-positive
108
+ calibration_positive_expect: BLOCK_HIGH
109
+ calibration_negative_args: --known-negative
110
+ calibration_negative_expect: CLEAN
@@ -0,0 +1,110 @@
1
+ # ═════════════════════════════════════════════════════════════════════════════
2
+ # 어댑터 선언 — FH 가 **남의 하네스 능력을 자기 안에서** 선언한다
3
+ # ═════════════════════════════════════════════════════════════════════════════
4
+ # peer 하네스 `mate`(로컬 별칭 해석: `mate-dev`)의 기존 회귀 앵커를 FH 가 호출 가능하게
5
+ # 감싼 것이다. 어댑터임은 **id 네임스페이스**(`adapter/…`)와 이 헤더로 표시한다 —
6
+ # 🟥 **새 스키마 키를 만들지 않는다.** `.cap` 파서가 이 클러스터에 네 벌 있고
7
+ # (relay · registry · cluster_scan · effect-probe), 키를 늘리면 네 곳을 동시에 고쳐야 하며
8
+ # 그게 이 레포의 재발 결함이다(오늘만 관대함 차이로 두 번 터졌다).
9
+ #
10
+ # 왜 여기 사나 (운영자 결정 2026-08-16): 어댑터가 **기본 경로**다. 남의 레포 안 `.cap`
11
+ # (소유 선언)은 그 하네스를 소유하고 **동시에 노출을 결정한** 특권적 경우이지 일반 경로가
12
+ # 아니다. `requires_cwd: SELF` 인 이유: 선언이 FH 안에 있고 tracked 파일에 운영자 홈
13
+ # 절대경로를 싣지 않는다. peer 위치는 실행 시점에 `scripts/adapters/peer_resolve.sh` 가
14
+ # 푼다 — 규칙은 `cluster_capability_scan.sh` 와 **같은 한 벌**이다
15
+ # (`FH_CLUSTER_ROOTS` 또는 `FH_PROJECTS_HOME`(기본 `$HOME/projects`) + 별칭
16
+ # `<n>`·`<n>-dev`·`_`→`-`, 모호하면 고르지 않는다). 두 계기가 다른 트리를 보면 안 된다.
17
+ #
18
+ # ── 무엇을 재나 ──────────────────────────────────────────────────────────────
19
+ # 에이전트 명세서가 **정보경계 불변식을 여전히 담고 있는가**(11항 회귀 앵커):
20
+ # 입력 어휘 allowlist(denylist 아님) · 금지 대상을 «위치» 가 아니라 **«출처»** 로 정의
21
+ # (레포 안 사본·빌드 산출물·`sourcesContent` 소스맵 포함) · 금지가 **도구 무관**임을 명시
22
+ # (도구를 열거하면 열거 안 된 경로가 우회로가 된다) · 런타임 증거 없을 때의 **신뢰도 상한**
23
+ # 이 다른 모든 조항에 우선 · **메모리 쓰기 금지**(저장값은 다음 호출에 자동 주입되어 세션
24
+ # 경계를 넘어 오염이 지속된다) · 배선 상태 정직 표기 · 능동탐색과 조우의 분리.
25
+ # 그 불변식은 **전부 산문 규칙**이라 편집 한 번으로 조용히 되돌아간다 — 이 앵커가 그걸 막는다.
26
+ #
27
+ # ── 왜 net-new 인가 ──────────────────────────────────────────────────────────
28
+ # FH 에 같은 계기가 **없다**. FH 의 인접 자산은 전부 다른 질문을 한다:
29
+ # · `public-surface-scan` / `public_surface_scan_files.sh` — 「이 표면에 나가면 안 되는
30
+ # **토큰**이 있나」(내용의 리터럴을 본다)
31
+ # · `degrade-direction-scan` — 「판정이 어느 방향으로 무너지나」(verdict 로직을 본다)
32
+ # · `judgment_circuit_lint.sh` — 판단 회로의 형태를 본다
33
+ # 이 능력은 「**한 에이전트 정의가 자기 정보경계 계약을 아직 담고 있나**」를 본다 — 토큰도
34
+ # verdict 도 아니라 **명세서의 안전 조항 자체**가 대상이다. FH 는 그 렌즈를 갖고 있지 않다.
35
+ #
36
+ # ── 왜 진입점을 그대로 못 쓰나 ───────────────────────────────────────────────
37
+ # peer 스크립트의 exit 은 {0,1,10} 으로 이미 typed 이고 「안 돌았다」(10)도 갖고 있다 —
38
+ # 그래서 여기서 고칠 게 별로 없다. 어댑터가 더하는 것은 딱 하나: **peer 자체의 부재**를
39
+ # 뜻하는 값이다. 그게 없으면 「이 머신에 mate 를 안 깔았다」가 HARNESS_ERROR(= mate 가
40
+ # 깨졌다)로 렌더되고, 클러스터 스캔이 그 노드를 «고장» 으로 세게 된다.
41
+ id: forge-harness:adapter/mate-agent-boundary
42
+ summary: adapter to mate agent information-boundary invariant anchor — checks an agent spec still carries its safety clauses
43
+ tags: adapter mate agent boundary invariant regression anchor safety spec information-boundary
44
+ entry: bash scripts/adapters/mate_agent_boundary.sh
45
+ requires_cwd: SELF
46
+ verdict_channel: exit
47
+ #
48
+ # 🟥 「안 돌았다」가 **두 값**으로 갈라져 있다 — 다른 명제이기 때문이다:
49
+ # HARNESS_ERROR(10) 하네스는 있는데 못 쟀다 (계기/대상에 대한 진술)
50
+ # 도달 경로(실물): 대상 파일 부재/불가독(peer 스크립트가 직접 냄) ·
51
+ # peer 진입점 부재 · peer 별칭이 둘 이상 동시에 맞음 · 모드 미지정 ·
52
+ # peer 가 자기 {0,1,10} 계약 밖 코드 반환
53
+ # PEER_ABSENT(20) 그 노드가 이 머신에 없다 (클러스터에 대한 진술)
54
+ # peer 헤더 자신이 앞의 것을 못 박아 뒀다 — *"exit 10 은 «위반 0» 이 **아니다**. 대상을
55
+ # 못 읽은 것이므로 검사가 시작조차 안 한 상태다. 부재를 통과로 렌더하면 이 앵커는
56
+ # 장식이 된다."* 어댑터는 그 규율을 클러스터 층까지 연장한다.
57
+ # ★등록 바는 아래 두 arm 만 돌린다 — HARNESS_ERROR·PEER_ABSENT 는 선언돼 있으나 그
58
+ # 판정에서 **관측되지 않는다**. 둘은 `scripts/test_adapter_lanes.sh` 가 덮는다.
59
+ verdict_enum: 0=PASS 1=FAIL 10=HARNESS_ERROR 20=PEER_ABSENT
60
+ approval: auto
61
+ reversibility: reversible
62
+ #
63
+ # 🟥 `residency: company` — peer 레포가 company 다. `--target`/`--peer-default` 모드에서
64
+ # 이 어댑터는 **peer 의 실물 명세서**를 검사하고 그 진입점의 출력(위반한 조항의 grep
65
+ # 히트 줄 포함)을 stdout 에 그대로 싣는다. 그 줄은 조직 식별자를 나를 수 있다.
66
+ # ⇒ 이 능력의 **출력**은 로컬에 남기고, 외부 계열 디스패치에 그대로 넘기지 않는다.
67
+ # ⚠️ 캘리브레이션 arm(아래)은 합성 픽스처만 읽으므로 그 경로에 한해 조직 내용이 없다.
68
+ # 그러나 residency 는 **가장 넓게 관측된 값**으로 선언한다 — arm 이 좁다는 이유로
69
+ # 능력 전체를 느슨하게 선언하지 않는다.
70
+ residency: company
71
+ degrade: fail-closed
72
+ tier_floor: none
73
+ #
74
+ # `writes: read-only` — **실측했다**(양 arm 연속 실행 전후 대조, 2026-08-16):
75
+ # `$HOME` 엔트리 목록 · `$HOME/.config` 엔트리 목록 · FH 워킹트리 `git status --porcelain` ·
76
+ # peer(mate-dev) 워킹트리 · qasp-dev 워킹트리 — **다섯 diff 전부 비어 있음**.
77
+ # 이 어댑터는 스크래치 디렉토리도 만들지 않는다(픽스처가 tracked 파일이다).
78
+ # ⚠️ 명명된 잔여: peer 진입점은 `grep` 만 돌리지만, 그 진입점이 미래에 바뀌면 이 선언은
79
+ # 낡는다. M6 는 **선언된 arm 이 지난 경로만** 관측한다.
80
+ writes: read-only
81
+ judge: mechanical
82
+ # PASS 만 clearing. FAIL 은 회귀, 나머지 둘은 「안 쟀다」 — 셋 다 막는다.
83
+ verdict_binding: FAIL HARNESS_ERROR PEER_ABSENT
84
+ #
85
+ # known-pair — **어댑터가 자기 픽스처를 갖는다**:
86
+ # `scripts/adapters/fixtures/mate_agent_boundary_known_{positive,negative}.md`
87
+ # peer 레포의 `scripts/fixtures/agent_boundary_known_*.md` 에서 **바이트 동일하게** 복사
88
+ # (sha1 positive=ad317909fd6415d02609da5f21a50c1e13bb0508 ·
89
+ # negative=8e81f200eb17ce60901a6211b6916d47822ad029, 복사 직후 양쪽 대조).
90
+ # 양성(PASS): 불변식 11항을 전부 담은 합성 명세서 → 실측 rc=0
91
+ # 음성(FAIL): 같은 형태에서 불변식 문장을 **의도적으로 뺀** 것 → 실측 rc=1
92
+ # ★왜 peer 의 실물 명세서를 arm 으로 안 쓰나: 실물은 팀이 계속 고치는 살아있는 문서라,
93
+ # 그것을 양성 arm 으로 쓰면 이 어댑터의 판정이 **남의 편집에 따라 조용히 뒤집힌다**
94
+ # (감사 대상은 얼려야 한다). 실물은 `--peer-default` 로 계속 검사할 수 있다.
95
+ # ★잔여(명명): 복사본이라 **드리프트한다.** peer 가 불변식을 늘리면 이 사본은 낡고, 그때
96
+ # 음성 arm 이 여전히 FAIL 이더라도 «새 불변식을 재고 있다» 는 뜻은 아니다. 대가를 알고
97
+ # 고른 것이다 — 실행시점에 peer 트리를 읽으면 계기가 남의 편집에 흔들린다.
98
+ # 🟥 residency 확인(복사 전, 컨트롤 포함 — 유출은 되돌릴 수 없으므로 손으로 닫았다):
99
+ # ① 두 파일 **전문을 눈으로 읽었다**(1608 + 3615 바이트).
100
+ # ② peer 자신의 식별자 denylist grep → 0건. **그 grep 이 살아있음을 합성 known-positive
101
+ # 로 증명**했다(peer 의 실물 에이전트 정의 4개도 0건이라, 그것만으로는 「식별자가
102
+ # 없다」와 「grep 이 안 문다」가 구분되지 않았다 — 컨트롤 없이는 판별력이 없다).
103
+ # ③ 경로/URL/이메일/IP/`.co.kr`·`.com` grep → 0건. 컨트롤(합성 유출 줄) 은 정상 발화.
104
+ # ④ 두 파일의 **라틴 토큰 25개 전수 열거** — 전부 일반 기술어/파일명이고 조직 식별자 0건.
105
+ # ⑤ gstack redact 엔진(34패턴)도 돌렸으나 **컨트롤이 안 물었다**(그 엔진은 조직 자산명
106
+ # 패턴이 0개다) ⇒ 이 질문에 대해 **UNCALIBRATED**. 근거로 세지 않았다.
107
+ calibration_positive_args: --known-positive
108
+ calibration_positive_expect: PASS
109
+ calibration_negative_args: --known-negative
110
+ calibration_negative_expect: FAIL
@@ -0,0 +1,116 @@
1
+ # ═════════════════════════════════════════════════════════════════════════════
2
+ # 어댑터 선언 — FH 가 **남의 하네스 능력을 자기 안에서** 선언한다
3
+ # ═════════════════════════════════════════════════════════════════════════════
4
+ # peer 하네스 `qasp`(로컬 별칭 해석: `qasp-dev`)의 `scripts/new_code_anchor_scan.sh` 를
5
+ # FH 가 호출 가능하게 감싼 것이다. 어댑터임은 **id 네임스페이스**(`adapter/…`)와 이 헤더로
6
+ # 표시한다 — 🟥 **새 스키마 키를 만들지 않는다.** `.cap` 파서가 이 클러스터에 네 벌 있고
7
+ # (relay · registry · cluster_scan · effect-probe), 키를 늘리면 네 곳을 동시에 고쳐야 하며
8
+ # 그게 이 레포의 재발 결함이다.
9
+ #
10
+ # 왜 여기 사나 (운영자 결정 2026-08-16): 어댑터가 **기본 경로**다. 남의 레포 안 `.cap`
11
+ # (소유 선언)은 그 하네스를 소유하고 **동시에 노출을 결정한** 특권적 경우이지 일반 경로가
12
+ # 아니다. `requires_cwd: SELF` 인 이유: 선언이 FH 안에 있고 tracked 파일에 운영자 홈
13
+ # 절대경로를 싣지 않는다. peer 위치는 실행 시점에 `scripts/adapters/peer_resolve.sh` 가
14
+ # 푼다 — 규칙은 `cluster_capability_scan.sh` 와 **같은 한 벌**이다
15
+ # (`FH_CLUSTER_ROOTS` 또는 `FH_PROJECTS_HOME`(기본 `$HOME/projects`) + 별칭
16
+ # `<n>`·`<n>-dev`·`_`→`-`, 모호하면 고르지 않는다).
17
+ #
18
+ # ── 무엇을 재나 ──────────────────────────────────────────────────────────────
19
+ # **새로 추가된 실행 코드에 그것을 보는 앵커(테스트)가 있는가.** peer 헤더의 기원 실측
20
+ # (PR #66): 앵커 0개인 신규 스크립트가 들어왔고 CI 는 `success / 123 passed` 였다 — 그
21
+ # 123개 중 그 파일을 보는 게 **하나도 없었을** 뿐이다. 그 상태로 fail-open 3건이 같이
22
+ # 통과했다. 나중에 앵커 25건을 붙이고 초판으로 되돌리자 9건이 즉시 빨개졌다.
23
+ # 이 스캔이 닫는 것은 딱 하나: **「안 돌았다」가 「깨끗하다」로 읽히는 것.**
24
+ # 판정은 느슨하다(«이 파일을 보는 테스트가 존재하기는 하는가»), 그게 의도다 — 재는 것은
25
+ # «테스트가 훌륭한가» 가 아니다. 면제는 `ANCHOR_EXEMPT:` 트레일러로만 되고 사유가 출력에
26
+ # 남는다(침묵 면제 없음 — 과차단은 우회를 습관으로 만들고 그 습관은 같은 레포의 비가역
27
+ # 게이트까지 무장해제한다).
28
+ #
29
+ # ── 왜 net-new 인가 ──────────────────────────────────────────────────────────
30
+ # FH 에 같은 계기가 **없다**. FH 의 인접 자산은 다른 질문을 한다:
31
+ # · `scripts/gate_anchor_check.sh` — **기존 게이트**의 앵커가 살아있나(되돌리면 빨개지나)
32
+ # · `scripts/lane_runner_check.sh` — 레인 러너가 배선돼 있나
33
+ # · `degrade_direction_scan.sh` — 판정이 어느 방향으로 무너지나
34
+ # 이 능력은 「**이 diff 가 새로 들여온 실행 코드**에 앵커가 붙어 있나」를 본다 — 대상이
35
+ # «기존 자산» 이 아니라 **«이 범위의 신규 추가»** 이고, 판정 단위가 diff 다. 그 렌즈는
36
+ # FH 에 없다. ([[feedback_built_but_not_wired]] 의 앞단 — 아예 안 지어진 앵커를 잡는다.)
37
+ #
38
+ # ── 왜 진입점을 그대로 못 쓰나 ───────────────────────────────────────────────
39
+ # peer 의 exit 은 {0,1,2,3,4} 로 이미 typed 이고 「안 돌았다」가 셋(2·3·4)이나 갈라져
40
+ # 있다 — 잘 지어진 계기다. 어댑터가 더하는 것은 **peer 자체의 부재**를 뜻하는 값이다.
41
+ # 그게 없으면 「이 머신에 qasp 를 안 깔았다」가 HARNESS_ERROR(= qasp 가 깨졌다)로 렌더된다.
42
+ id: forge-harness:adapter/qasp-new-code-anchor
43
+ summary: adapter to qasp new-code anchor scan — newly added executable code without any test that looks at it
44
+ tags: adapter qasp anchor test coverage new-code diff gate regression fail-open
45
+ entry: bash scripts/adapters/qasp_new_code_anchor.sh
46
+ requires_cwd: SELF
47
+ verdict_channel: exit
48
+ #
49
+ # 🟥 「안 돌았다」가 **네 값**으로 갈라져 있다 — 전부 다른 명제다:
50
+ # ARGS(2) 인자가 틀렸다 (호출에 대한 진술)
51
+ # HARNESS_ERROR(3) 하네스는 있는데 못 쟀다 (계기에 대한 진술)
52
+ # 도달 경로(실물): ref 해석 불가 · merge-base 없음 · git diff 실패 ·
53
+ # git 레포 아님 · peer 진입점 부재 · peer 별칭 다중 히트 ·
54
+ # peer 가 자기 {0,1,2,3,4} 계약 밖 코드 반환
55
+ # OUT_OF_SCOPE(4) 계기는 돌았는데 대상이 사각지대다 (범위에 대한 진술)
56
+ # — 다른 언어의 신규 실행 코드가 있어 **검사되지 않았다**.
57
+ # peer 실측: 신규 `src/newthing.js` 1개 · 앵커 0개 → 이전 판은 rc=0
58
+ # (「범위 밖」이 「부재」로 접혔다). 그 접힘을 깨려고 신설된 값이다.
59
+ # PEER_ABSENT(20) 그 노드가 이 머신에 없다 (클러스터에 대한 진술)
60
+ # ★peer 헤더 자신의 규율: *"같은 숫자가 이 레포 안에서 다른 사건을 뜻한다 — 값을 옮겨
61
+ # 쓰지 마라."* (`judge_rer.sh` 의 4=BLOCKED · `pull_cli.py` 의 4=NO_CORPUS 는 여기의
62
+ # 4=OUT_OF_SCOPE 와 전부 다른 사건이다.) 어댑터는 하위 exit 을 전파하지 않고 **명시
63
+ # case 로 재매핑**한다.
64
+ # ★등록 바는 아래 두 arm 만 돌린다 — ARGS·HARNESS_ERROR·OUT_OF_SCOPE·PEER_ABSENT 는
65
+ # 선언돼 있으나 그 판정에서 **관측되지 않는다**. 넷은 `scripts/test_adapter_lanes.sh` 가 덮는다.
66
+ verdict_enum: 0=PASS 1=VIOLATION 2=ARGS 3=HARNESS_ERROR 4=OUT_OF_SCOPE 20=PEER_ABSENT
67
+ approval: auto
68
+ reversibility: reversible
69
+ #
70
+ # 🟥 `residency: company` — peer 레포가 company 다. `--range` 모드에서 이 어댑터는 peer
71
+ # 히스토리를 검사하고 진입점 출력에 **peer 의 파일 경로 목록**(위반 파일 · 범위 밖 파일)을
72
+ # 그대로 싣는다. 그 경로는 조직 자산명을 나른다.
73
+ # ⇒ 이 능력의 **출력**은 로컬에 남기고 외부 계열 디스패치에 그대로 넘기지 않는다.
74
+ # ⚠️ 캘리브레이션 arm 은 합성 레포만 만지므로 그 경로에 한해 조직 내용이 없다. 그러나
75
+ # residency 는 **가장 넓게 관측된 값**으로 선언한다(§ⓐ.5).
76
+ residency: company
77
+ degrade: fail-closed
78
+ tier_floor: none
79
+ #
80
+ # `writes: read-only` — **실측했다**(양 arm 연속 실행 전후 대조, 2026-08-16):
81
+ # `$HOME` 엔트리 목록 · `$HOME/.config` 엔트리 목록 · FH 워킹트리 `git status --porcelain` ·
82
+ # peer(qasp-dev) 워킹트리 · mate-dev 워킹트리 — **다섯 diff 전부 비어 있음**.
83
+ # 캘리브레이션 arm 이 `$TMPDIR` 아래에 합성 git 레포를 만든다(git init + 2 커밋). 그건
84
+ # OWNED_TMP 안이고 cleanup 트랩이 지운다 — 실측: 실행 전후 `/var/folders/**/T/tmp.*`
85
+ # 디렉토리 수 1063 → 1063(순증 0). 신원은 `git -c user.email/user.name` 으로 넘겨
86
+ # **전역 gitconfig 를 읽지도 쓰지도 않는다.**
87
+ # peer 트리는 `--range` 에서도 cwd 로만 쓰이고 rm/write 경로에 절대 안 들어간다.
88
+ # ⚠️ 명명된 잔여: M6 의 격리 샌드박스에는 `.git` 이 없어 **git 을 실제로 쓰는 capability 는
89
+ # 거기서 못 돈다**(그 프로브 헤더가 그렇게 적어 뒀다). 이 어댑터의 arm 은 자기 임시
90
+ # 레포를 만들므로 샌드박스의 `.git` 부재와 무관하지만, 그 사실 자체가 프로브의 관측
91
+ # 범위를 넓혀 주지는 않는다. 위 근거는 프로브 판정이 아니라 **손 실측**이다.
92
+ writes: read-only
93
+ judge: mechanical
94
+ # PASS 만 clearing. VIOLATION 은 위반, 나머지 넷은 「안 쟀다」의 서로 다른 얼굴 — 전부 막는다.
95
+ verdict_binding: VIOLATION ARGS HARNESS_ERROR OUT_OF_SCOPE PEER_ABSENT
96
+ #
97
+ # known-pair — **합성 레포**에서 실행시점에 세운다. peer 히스토리를 안 쓰는 이유 셋:
98
+ # ① peer 의 이 진입점은 **수리 중**이다(qasp PR #174, 브랜치
99
+ # `fix/anchor-scan-out-of-scope-repairs` — 이 쌍을 고른 시점의 체크아웃 상태다).
100
+ # 고정 SHA 를 박으면 그 브랜치가 squash 머지되는 순간 커밋이 orphan 이 되어 쌍이 죽는다.
101
+ # ② 상대 ref(`HEAD~N`)는 커밋이 쌓이면 가리키는 구간이 조용히 움직인다 — 같은 선언이
102
+ # 다른 것을 재게 된다.
103
+ # ③ peer 는 company 다. peer 히스토리를 arm 으로 쓰면 **캘리브레이션 출력에 조직 경로가
104
+ # 실린다.** 합성 레포는 그 표면을 아예 만들지 않는다.
105
+ # 대가(정직하게): 이 쌍이 재는 것은 «peer 의 히스토리» 가 아니라 **«peer 의 계기가 답
106
+ # 아는 두 케이스를 가르는가»** 다. M4 가 묻는 것이 정확히 후자다.
107
+ # 양성(VIOLATION): 신규 `src/plain_config.py`(앵커 0) → 실측 rc=1
108
+ # 음성(PASS) : 같은 파일 + `tests/test_plain_config.py`(stem 을 언급하는 앵커) → 실측 rc=0
109
+ # ★파일명 `plain_config.py` 는 peer 자신의 B1 실측에서 온 **대조군**이다: `latest_config.py`
110
+ # 는 `la·test_·config` 의 `test_` 부분문자열 때문에 제외 규칙에 걸려 무검사 통과했고
111
+ # (fail-open), `plain_config.py` 는 정상 차단됐다. 즉 이 양성 arm 은 peer 가 이미 손으로
112
+ # 가른 바로 그 케이스와 같다 — 우연히 빨간 케이스가 아니다.
113
+ calibration_positive_args: --known-positive
114
+ calibration_positive_expect: VIOLATION
115
+ calibration_negative_args: --known-negative
116
+ calibration_negative_expect: PASS
@@ -0,0 +1,24 @@
1
+ # forge-harness 가 **자기 능력을 스스로 선언한다.** FH 도 클러스터의 한 노드다 —
2
+ # 다른 하네스가 `cluster_capability_scan.sh` 로 이걸 발견할 수 있어야 방향이 양쪽이 된다.
3
+ # `requires_cwd: SELF` 인 이유: tracked 파일에 운영자 홈 절대경로를 싣지 않는다.
4
+ # node B — 판정 렌즈 (degrade_direction_scan). 내용이 아니라 **판정이 어느 방향으로
5
+ # 무너지나**를 본다. node A 와 같은 스캐너의 포크가 아니라 다른 계보의 다른 질문이다.
6
+ id: forge-harness:degrade-direction-scan
7
+ summary: verdict-degrade direction lens — which way a gate collapses when it cannot decide
8
+ tags: degrade verdict gate fail-open lint review
9
+ entry: bash scripts/degrade_probe_capability.sh
10
+ requires_cwd: SELF
11
+ verdict_channel: exit
12
+ verdict_enum: 0=CLEAN 2=FINDINGS 3=NO_TARGET 10=HARNESS_ERROR
13
+ approval: auto
14
+ reversibility: reversible
15
+ residency: operator-private
16
+ degrade: fail-closed
17
+ tier_floor: none
18
+ writes: read-only
19
+ judge: mechanical
20
+ verdict_binding: FINDINGS HARNESS_ERROR
21
+ calibration_positive_args: --known-negative
22
+ calibration_positive_expect: CLEAN
23
+ calibration_negative_args: --known-positive
24
+ calibration_negative_expect: FINDINGS
@@ -0,0 +1,24 @@
1
+ # forge-harness 가 **자기 능력을 스스로 선언한다.** FH 도 클러스터의 한 노드다 —
2
+ # 다른 하네스가 `cluster_capability_scan.sh` 로 이걸 발견할 수 있어야 방향이 양쪽이 된다.
3
+ # `requires_cwd: SELF` 인 이유: tracked 파일에 운영자 홈 절대경로를 싣지 않는다.
4
+ # node A — 누출 렌즈 (public-surface-audit 의 기계층). degrade-scan 과 다른 질문을 한다:
5
+ # "이 표면에 나가면 안 되는 토큰이 있나" (판정 로직이 아니라 내용을 본다)
6
+ id: forge-harness:public-surface-scan
7
+ summary: public surface leak scan over shipped/staged content — operator-private token detection
8
+ tags: leak security publish surface audit
9
+ entry: bash scripts/psa_probe_capability.sh
10
+ requires_cwd: SELF
11
+ verdict_channel: exit
12
+ verdict_enum: 0=CLEAN 1=LEAK 3=NOT_CONFIGURED 10=HARNESS_ERROR
13
+ approval: auto
14
+ reversibility: reversible
15
+ residency: operator-private
16
+ degrade: fail-closed
17
+ tier_floor: none
18
+ writes: read-only
19
+ judge: mechanical
20
+ verdict_binding: LEAK NOT_CONFIGURED HARNESS_ERROR
21
+ calibration_positive_args: --known-negative
22
+ calibration_positive_expect: CLEAN
23
+ calibration_negative_args: --known-positive
24
+ calibration_negative_expect: LEAK
@@ -11,13 +11,13 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "2.0.0",
15
- "description": "Hub meta-operations toolkit — 35 skills + 7 agents. New in 1.4.53: `fh-codex-doctor` (npm bin) — Codex adapter drift scanner; reads the documented M1/M2/M3 skill tier map + skill/agent source and reports codex-native/adapter-required/claude-native/unclassified per unit, wired into `npm test`/`prepublishOnly` (fail-closed on unclassified Claude-native primitives). New in 1.4.49: steel-quench gains Step 0.6 Verdict-Invariance Probe (groundedness axis — a load-bearing judged gate's verdict must track behavior, not rubric phrasing; measured flip-count over cross-family paraphrases; arXiv:2605.06161 Policy Invariance anchor); multi_model_sidecar_strategy §Vendor-native harness (a model is strongest in its own vendor CLI — Claude/CC, GPT/codex, Gemini/Antigravity; a universal router degrades all of them, so it stays an autocomplete/QA sidecar, never orchestration); predelete_check.sh fail-closed rewrite; memory-hygiene A-TMA 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 command-output axis (route to rtk/proxy for verbose CLI stdout, complementing .claudeignore; risk-gated to token-scarce envs). 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 queryable-wiki scaffold (INDEX + session-start read + R/W/C ingest). New in 1.4.39: auto-decorrelation (cross-family verifier sidecar recruitment) + video-ingest (capability-routed video ingestion). New in 1.4.x: verify-axis check-class taxonomy (mandatory-pass/measured/judged), no-reinvention Tier-0 inventory, 7-class failure taxonomy, Destructive-Op Gate, Wave-T (Temper), tier-floor governance, Mode D Model Notice, FC consent lane, default-Sonnet guidance. New in 1.3.0: public-surface-audit, field-harvest Mode B auto-trigger, 4-axis gate scope ext. Validated cross-CLI: Claude Code, Codex, Gemini.",
14
+ "version": "2.0.1",
15
+ "description": "Hub meta-operations toolkit — 35 skills + 7 agents. New in 2.0.1: harness-doctor cadence hook, portability lint wired into pre-commit, branch_claim.sh claim-count-vs-tree-count warning, louder confidentiality-scan fail-open notice, fh-gate.sh missing-package.json survival, identity ① reclassified 🟢 (cross-harness adapters + relay argument channel). New in 1.4.53: `fh-codex-doctor` (npm bin) — Codex adapter drift scanner; reads the documented M1/M2/M3 skill tier map + skill/agent source and reports codex-native/adapter-required/claude-native/unclassified per unit, wired into `npm test`/`prepublishOnly` (fail-closed on unclassified Claude-native primitives). New in 1.4.49: steel-quench gains Step 0.6 Verdict-Invariance Probe (groundedness axis — a load-bearing judged gate's verdict must track behavior, not rubric phrasing; measured flip-count over cross-family paraphrases; arXiv:2605.06161 Policy Invariance anchor); multi_model_sidecar_strategy §Vendor-native harness (a model is strongest in its own vendor CLI — Claude/CC, GPT/codex, Gemini/Antigravity; a universal router degrades all of them, so it stays an autocomplete/QA sidecar, never orchestration); predelete_check.sh fail-closed rewrite; memory-hygiene A-TMA 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 command-output axis (route to rtk/proxy for verbose CLI stdout, complementing .claudeignore; risk-gated to token-scarce envs). 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 queryable-wiki scaffold (INDEX + session-start read + R/W/C ingest). New in 1.4.39: auto-decorrelation (cross-family verifier sidecar recruitment) + video-ingest (capability-routed video ingestion). New in 1.4.x: verify-axis check-class taxonomy (mandatory-pass/measured/judged), no-reinvention Tier-0 inventory, 7-class failure taxonomy, Destructive-Op Gate, Wave-T (Temper), tier-floor governance, Mode D Model Notice, FC consent lane, default-Sonnet guidance. New in 1.3.0: public-surface-audit, field-harvest Mode B auto-trigger, 4-axis gate scope ext. Validated cross-CLI: Claude Code, Codex, Gemini.",
16
16
  "source": "./plugins/fh-meta"
17
17
  },
18
18
  {
19
19
  "name": "fh-commons",
20
- "version": "2.0.0",
20
+ "version": "2.0.1",
21
21
  "description": "Project-agnostic utility skills — 5 skills (convergence-loop · deliberation · mcp-circuit-breaker · token-budget-gate · ko-tech-writer) + 1 agent (quench-challenger). Domain-independent utilities transplantable into any project.",
22
22
  "source": "./plugins/fh-commons"
23
23
  }
package/AGENTS.md CHANGED
@@ -107,12 +107,18 @@ Because non-Claude runtimes do not auto-load Claude path rules, apply these rule
107
107
  Pre-Publish or Destructive-Op gate in `CLAUDE.md`. `pre-push` is only the git-side backstop.
108
108
  7. **Self-contrast on asset touch:** the trigger for the three-layer self-contrast (process ·
109
109
  engines · identities) is *touching an FH/PMH asset*, not being asked. Pick verification axes by
110
- failure mode — running all four every time is not the rule. Record, in the existing Axes 2–3
110
+ failure mode — running all six every time is not the rule. Record, in the existing Axes 2–3
111
111
  marker fields: the soul line written before design (or `none`), each axis run and not run — by
112
112
  name, and each axis's control with whether it survived. The minimum evidence that an axis ran is
113
113
  execution output with a live control; reporting an axis as run without one, or recording only a
114
- reason for not choosing it, is not compliance. The four axes are named in
115
- `knowledge/shared/harness-core/fh_three_layer_canon.md` §1-a read it before recording; §1-c
114
+ reason for not choosing it, is not compliance. The axes are named in
115
+ `knowledge/shared/harness-core/fh_three_layer_canon.md` — **§1-a is the original four
116
+ (2026-08-09) and §1-a-2 expanded them to six (2026-08-16)**: ⓐ different family · ⓑ standpoint ·
117
+ ⓒ isolated grounding · ⓓ third-party encounter · ⓔ first real use · ⓕ revert-and-observe.
118
+ Axes are separated by **what they received**, not by how adversarial they are — same input,
119
+ same blind spot, however many reviewers you add. ⚠️ The machine layer is still four: `axes-run`
120
+ requires four letters, ⓑ has its own marker field, and **ⓓ has no field at all** — record it in
121
+ prose and do not read a silent ⓓ as a run one. Read it before recording; §1-c
116
122
  holds the sample limits — read it before citing. This record is self-attested and has no hook
117
123
  behind it; it is closed by a different-family reader, not by writing it more carefully.
118
124
  8. **Branch-surface claims:** GitHub branch protection is two independent layers — legacy
package/CHEATSHEET.md CHANGED
@@ -70,6 +70,22 @@ cp <harness-root>/templates/CLAUDE.md <project>/CLAUDE.md
70
70
  > existing harness/config files (merges are proposed instead), and irreversible actions
71
71
  > (publish · delete · history-rewrite) still stop for you.
72
72
 
73
+ ### Autonomy & parallel dispatch — the phrases that spend tokens
74
+
75
+ These change *how much runs without you*. Three of them buy speed **with tokens**; the fourth is the
76
+ one that gives budget back. Each row states what actually happens, what it costs or assumes, and when
77
+ it is the wrong call.
78
+
79
+ | Say this | What actually happens | 🟥 Cost / precondition | Don't use it when |
80
+ |---|---|---|---|
81
+ | **"그래프로 병렬작업해줘"** · **"병렬 탈상관으로 돌려줘"** · *"run these as a parallel graph"* | Independent units are dispatched as **parallel agents in waves** (`CLAUDE.md` §Agent Dispatch Operation, *Parallel dispatch* row), planned by `agent-composer`. This is stage ② of the 3-stage process — *decorrelated acceleration* (`knowledge/shared/harness-core/fh_three_layer_canon.md` §1). | Cost scales with the **number of agents**, not the size of the work. `agent-composer` caps a wave at **≤4** and decomposes hierarchically above that — flat fan-out at N≥5 adds ~+285% coordination overhead (`agent-composer` SKILL.md §Coordination-overhead budget; DACS, arXiv:2604.07911). Parallel dispatch also needs a **recorded standing request**, or Claude asks per dispatch. | **The axes are the same.** Canon: *"병렬화 자체엔 방향이 없다"* — parallelism has no direction of its own. Two reviewers with the same lens is not decorrelation, it is the same blind spot read twice at double the price. **Choose the axis to match the failure mode; don't multiply it** (`fh_three_layer_canon.md` §1 ②). Genuinely dependent steps gain nothing either. |
82
+ | **"이노베이터 자율주행해줘"** · *"let the innovator drive"* | Dispatches the `persona-innovator` agent to run **on its own agenda** — it picks the gap, scans internal assets *and* the external frontier, and returns judgments + candidates. It proposes; it does not adopt. | It runs `WebSearch`/`WebFetch`, which is exactly why it is **not always-on** (`CLAUDE.md` §Event-bound proposals: a per-turn fire "would tax tokens"). Its output is proposals, so the review after it costs too. Observed: **loop-continuation depth differs by tier** — on a lower tier expect a shorter run, not a blocked one (the Sonnet floor holds; no capability here is tier-gated). | It removes no gate: a heavy autonomous run still goes under **`/goal-quench`** (budget + quality), and its candidates need a separate evaluator before adoption. Don't reach for it to execute a list you already have — that is the row below. |
83
+ | **"끝까지 해줘"** · **"자율완주해줘"** · *"run it to the end"* | Runs **a task you already stated** to completion, without per-item approval prompts. Full contract in the box above. | Budget agreed up front via `goal-quench` — one long block of spend rather than a multiple. | The difference from the innovator row: this executes **your** list, the innovator sets its own. If "the end" isn't defined, run `deep-clarify` first — an unbounded end condition is what makes an autonomous run expensive. |
84
+ | **"내 판단이 필요한 것만 넘겨"** · **"내 통찰이 필요한 부분은 내게 돌려줘"** | The **budget-returning** counterpart: keep running autonomously, but hand back the decision forks instead of the finished work. Pairs with either autonomy row above. | Cheap — this is the phrase that *saves* tokens rather than spending them. | It is a **prose modifier with no mechanical route**: it moves where Claude pauses, never what the floors are. It cannot loosen a gate — irreversible actions (publish · delete · history-rewrite) stop for you whether or not you said it. |
85
+
86
+ > Unsure whether you can afford one of the first three? Say **"how expensive is this"** first
87
+ > (`token-budget-gate`) — it returns a Green/Yellow/Orange/Red verdict before the run, not after.
88
+
73
89
  ---
74
90
 
75
91
  ## 5. Session Sync
@@ -170,7 +186,7 @@ Copy just 1 agent without plugin install and it's immediately callable. Updates
170
186
  |-------------|---------------------|
171
187
  | Audit external reader asset | "run persona audit" → calls `hub-persona-auditor` |
172
188
  | Code review | "review this diff" → calls project `code-reviewer` |
173
- | Naming gap detection + ideation | `/persona-innovator` or "find naming candidates" → 6-type classification + external signal scan |
189
+ | Naming gap detection + ideation | the `persona-innovator` **agent** (dispatch it by name, or say "find naming candidates") → 6-type classification + external signal scan |
174
190
  | Meta-simulation run | `/sim-conductor` (Area C default) · `/sim-conductor B` (internal audit) · `/sim-conductor A` (external user perspective) |
175
191
 
176
192
  **Promotion gate (after 2+ week pilot):** accepted ≥ 60% → maintain · rejected ≥ 40% → deprecate.
package/CLAUDE.md CHANGED
@@ -43,14 +43,14 @@ core invariants never melt). The nursery also **verifies what it births**: harne
43
43
  | **③ AI Collaboration Guide** | Accumulates and distributes best practices for token efficiency and dialogue methodology — "how to ask, delegate, and record". | `CHEATSHEET.md` · `knowledge/shared/dialogue/ai_dialogue_playbook.md` · `MEMORY.md` intent-based + associative recall (`knowledge/shared/dialogue/memory_intent_recall.md`) |
44
44
  | **Core Axis** | **Harness Engineering (How)** — the methodology and practice axis that realizes the three layers above. The 6-axis framework is the operating unit. **A harness is a means, not an end** — Field harness: "simpler over time" (complexity = warning signal). Meta-harness: *optimize*, not necessarily simplify — complexity earns its scope; red flags are orphaned, redundant, and decorative units, not complexity itself. | `harness_6axis_framework.md` · `hub_compounding_loop.md` · `claude_code_runtime_flow.md` · `plugins/*/agents/` (sub-agents) |
45
45
 
46
- > **3층 정본 — 공정 · 엔진 · 정체성**: FH 를 설명하는 뼈대는 세 층이고 셋의 관계가 정본으로 적혀 있다 — **3단 공정**(엔진을 벼리는 순서: 초기 영혼 → 중간 탈상관 가속화 → **마무리 4축 태우기**) → **4대 엔진**(영혼·품질게이트·질문하기·맥락유지) → **5대 정체성**(사람이 실제로 쓰는 기능). **Read `knowledge/shared/harness-core/fh_three_layer_canon.md`** before naming, re-scoping, or citing any of the three — it also defines the **4 verification axes** (ⓐ구현 · ⓑ재는 방식 · ⓒ주장 · ⓓ앵커) that the third stage actually consists of, and states why the three are *not* a clean stack. Grade table stays canonical in `ship_readiness_gate.md`; this pointer never carries grades.
46
+ > **3층 정본 — 공정 · 엔진 · 정체성**: FH 를 설명하는 뼈대는 세 층이고 셋의 관계가 정본으로 적혀 있다 — **3단 공정**(엔진을 벼리는 순서: 초기 영혼 → 중간 탈상관 가속화 → **마무리 6축 태우기**) → **4대 엔진**(영혼·품질게이트·질문하기·맥락유지) → **5대 정체성**(사람이 실제로 쓰는 기능). 기억용 형태는 **3단 공정 · 4대 엔진 · 5대 정체성 · 6축 검증**이나 🟥 **6축은 네 번째 층이 아니다** — 3단 공정 ③단계가 무엇으로 이루어지는지다. **Read `knowledge/shared/harness-core/fh_three_layer_canon.md`** before naming, re-scoping, or citing any of the three — it also defines the **6 verification axes** (ⓐ계열 · ⓑ입장 · ⓒ격리 그라운딩 · ⓓ3자대면 · ⓔ첫실사용 · ⓕ되돌림; §1-a 가 최초 4축, §1-a-2 가 2026-08-16 확장) that the third stage actually consists of, and states why the three are *not* a clean stack. 🟥 **축은 «얼마나 적대적인가»가 아니라 «무엇을 받았는가»로 갈린다** — 받는 것이 같으면 리뷰어를 몇 명 붙여도 같은 사각이 남는다. 🟥 **명칭 충돌 — 이 파일 안에 「4축」이 두 개다.** §FH Improvement **4-Axis Auto-Gate** 의 4축(Axis 1 회귀 · 2 적대 · 3 팬텀 · 4 매니페스트)은 **커밋 게이트**이고, 여기 6축은 **검증 축**이다. 부분적으로만 겹치고(Axis 1·4 는 ⓐ~ⓕ 에 대응이 없다) **서로 대체하지 않는다**. 그래서 6축은 「6축 게이트」가 아니라 **「6축 검증」**으로 부른다. Grade table stays canonical in `ship_readiness_gate.md`; this pointer never carries grades.
47
47
 
48
48
  > **자기 대조는 상시 의무 — 트리거는 발화가 아니라 «지금 FH/PMH 자산을 건드리고 있다»**
49
49
  > (운영자 결정 2026-08-09; 이 저장소든 **다른 사용자의 install 이든** 동일). §FH Improvement
50
50
  > 4-Axis Auto-Gate 와 **같은 트리거**이므로 새 트리거도 새 파일도 만들지 않는다 — 기록 자리는
51
51
  > **4축 마커의 기존 필드**(`axis2-*` · `axis3-*` · `residual`)다.
52
52
  > **마커에 반드시 남는 3줄** ① **①영혼** — 설계 *전에* 쓴 «성공 정의 / 절대 안 함»(없으면 `없음`)
53
- > · ② **돌린 축과 안 돌린 축을 각각 이름으로**(ⓐ구현 · ⓑ재는 방식 · ⓒ주장 · ⓓ앵커)
53
+ > · ② **돌린 축과 안 돌린 축을 각각 이름으로.** 마커 `axes-run` 이 기계적으로 요구하는 것은 **네 글자**(a=계열 · b=첫실사용 · c=격리 그라운딩 · d=되돌림)이고, ⓑ**입장**은 마커의 **`standpoint:` 자기 필드**로, ⓓ**3자대면**은 **아직 기록할 필드가 없다**(명시된 잔여). 즉 산문 정본은 6축인데 기계는 4+1축이다 — 이 어긋남을 알고 쓴다
54
54
  > · ③ **각 축의 컨트롤과 그 생사**. 축을 «돌렸다»의 **최소 증거 = 컨트롤이 살아 있는 실행 출력**
55
55
  > 이다 — 안 고른 이유만 적은 것은 준수가 아니다.
56
56
  > **비용 경계**: 넷을 매번 다 돌리지 않는다. 실패 모드에 맞춰 **고른다**.