@chrono-meta/fh-gate 3.2.0 → 3.4.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 (48) hide show
  1. package/.claude/registry/agent_cards.json +1 -1
  2. package/.claude/rules/fh_4axis_gate.md +25 -0
  3. package/.claude-plugin/marketplace.json +3 -3
  4. package/AGENTS.md +2 -2
  5. package/CATALOG.md +4 -4
  6. package/CHEATSHEET.md +1 -1
  7. package/CLAUDE.md +4 -4
  8. package/docs/OUTPUT_EVIDENCE.md +1 -1
  9. package/docs/STANDARDS_ALIGNMENT.md +1 -1
  10. package/docs/codex-compat.md +1 -1
  11. package/knowledge/shared/harness-core/agents_md_runtime_details.md +2 -2
  12. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +30 -3
  13. package/knowledge/shared/harness-core/iso_ai_standards_crosswalk.md +1 -1
  14. package/knowledge/shared/harness-core/skill_quality_rubric.md +1 -1
  15. package/knowledge/shared/learnings/subagent_invocations_log.yaml +31 -0
  16. package/knowledge/shared/rules/modes_and_value.md +2 -2
  17. package/package.json +2 -1
  18. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  19. package/plugins/fh-commons/README.md +38 -0
  20. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  21. package/plugins/fh-meta/CHANGELOG.md +95 -0
  22. package/plugins/fh-meta/skills/agent-composer/SKILL.md +2 -2
  23. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +40 -0
  24. package/plugins/fh-meta/skills/frontier-digest/SKILL.md +1 -1
  25. package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +43 -5
  26. package/plugins/fh-meta/skills/{hub-cc-pr-reviewer → harness-pr-reviewer}/SKILL.md +75 -3
  27. package/plugins/fh-meta/skills/{hub-cc-pr-reviewer → harness-pr-reviewer}/SKILL_detail.md +2 -2
  28. package/plugins/fh-meta/skills/harvest-loop/SKILL_detail.md +2 -2
  29. package/plugins/fh-meta/skills/install-doctor/SKILL.md +1 -1
  30. package/plugins/fh-meta/skills/install-wizard/SKILL.md +1 -1
  31. package/plugins/fh-meta/skills/meta-prompt-builder/SKILL.md +1 -1
  32. package/plugins/fh-meta/skills/pipeline-conductor/SKILL.md +1 -1
  33. package/plugins/fh-meta/skills/plugin-recommender/SKILL.md +1 -1
  34. package/plugins/fh-meta/skills/sim-conductor/SKILL.md +1 -1
  35. package/plugins/fh-qp/.claude-plugin/plugin.json +1 -1
  36. package/scripts/finding_fleet.sh +391 -13
  37. package/scripts/finding_pipeline.sh +370 -11
  38. package/scripts/finding_verifier.sh +31 -2
  39. package/scripts/finding_verify.py +198 -13
  40. package/scripts/frontier_digest_autopilot.sh +3 -3
  41. package/scripts/gate_shape_scan.sh +16 -2
  42. package/scripts/test_finding_pipeline_lanes.sh +1556 -4
  43. package/scripts/test_gate_shape_scan_lanes.sh +11 -0
  44. package/scripts/test_marker_crossfamily_lanes.sh +75 -3
  45. package/scripts/test_marker_standpoint_lanes.sh +31 -6
  46. package/templates/.git-hooks/pre-commit +152 -6
  47. package/templates/local_fh_context.md +1 -1
  48. package/templates/regression_guard.sh +1 -1
@@ -50,7 +50,7 @@
50
50
  "file": "plugins/fh-meta/agents/hub-persona-auditor.md",
51
51
  "role": "Pre-publication audit of external-facing assets — 3+ persona simulation, 4-axis review (resonance/confusion/resistance/supplement), 3-tier revision proposals",
52
52
  "allowed_tools": ["Read", "Grep", "Glob"],
53
- "invoked_by": ["hub-cc-pr-reviewer", "sim-conductor", "direct"],
53
+ "invoked_by": ["harness-pr-reviewer", "sim-conductor", "direct"],
54
54
  "writes": false
55
55
  },
56
56
  {
@@ -87,6 +87,31 @@ FH asset modified → Axis 1 (templates/regression_guard.sh --pr {BRANCH})
87
87
  (`residency=(CLEAN|TAINTED|NOT_SCANNED)(...)`), and BLOCKS a `panel(...)` line that co-carries
88
88
  `residency=TAINTED(` or `residency=NOT_SCANNED(` — a sent payload and an unscreened/tainted
89
89
  one cannot both be true on the same line. Same fixtures file, cases `r1`–`r13`;
90
+ 🟥 **since 2026-09-12 (`EVIDENCE_TOKEN_GRACE_DATE`, no retroactivity), a `panel(<families>)`
91
+ value ALSO requires an `evidence=` token in the same grounds** — a closed set of three:
92
+ `evidence=SHARED(<what every family read>)` · `evidence=INDEPENDENT(<what each got separately>)` ·
93
+ `evidence=MIXED(<which member got which>)`. e.g.
94
+ `crossfamily: panel(codex) — residency=CLEAN(files=3) · evidence=SHARED(same staged diff to both) · R1, 3 findings`.
95
+ **Why**: `arXiv:2609.10969` separated the two decorrelation axes at a fixed call budget
96
+ (48 templates, 2,880 scenarios) and a cross-model vote over SHARED evidence approved **62.9 %**
97
+ of unsafe proposals against **22.9 %** with an independent source — source effect **40.9 pp**
98
+ vs **11.3 pp** for model diversity. A `panel(codex, gemini)` that read the *same diff* is that
99
+ 62.9 % arm while recording as this enum's strongest value; the token makes the distinction
100
+ sayable. 🟥 **`SHARED` is legal and common — it is not a failure.** What is blocked is a
101
+ `panel(...)` that does not say which it was, a value outside the three, a malformed/duplicated
102
+ token, and a vacuous body on `SHARED`/`MIXED` (those two are the values whose whole content is
103
+ *which* evidence was shared; `INDEPENDENT` is self-describing and is not body-checked, because
104
+ over-blocking the honest answer trains the override). Same fixtures file, cases `e1`–`e10`;
105
+ 🟥 **`standpoint:`'s `tier2`+ grounds check BLOCKS since 2026-09-12**
106
+ (`STANDPOINT_GROUNDS_GRACE_DATE`, no retroactivity) — it printed `⚠️` and returned 0 before.
107
+ `tier2`/`tier2b`/`tier3` assert code RAN in the target, so the grounds must **name the command
108
+ and the output** (`ran \`bash scripts/x.sh\` there, output: 30/30 PASS`); if you only read
109
+ files the honest rung is `tier1b`, which is not grounds-checked. Same external number is the
110
+ reason: leaving the STRONGER axis advisory while hard-blocking the weaker one was not a
111
+ balance. Fixtures `scripts/test_marker_standpoint_lanes.sh` `N8`(blocks) / `N8b`(named command
112
+ passes) / `N8c`(tier1b exempt) / `N8d`(pre-grace still advisory). 🟥 Both changes gate the
113
+ **shape of the record**, never whether the run was real — §Mechanization Boundary's deliberate
114
+ residual is untouched;
90
115
  **recorded-by-convention, validated by nothing**: `axis2-rounds` (per-round yield vector) —
91
116
  steel-quench §Convergence Criteria consumes it, and a hook check for it was built and then
92
117
  REMOVED the same day for firing on 100% of markers. The convergence claim it supports is
@@ -11,19 +11,19 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "3.2.0",
14
+ "version": "3.4.0",
15
15
  "description": "New in 2.2.0: BREAKING (gate): chamber step 6 now reads ACTUAL.md, not BUDGET.md — an in-flight chamber run whose actual cost sits in BUDGET.md blocks until the ACTUAL: line moves to tracks/_chamber/<slug>/ACTUAL.md (the runner prints the path). Why: BUDGET.md's pre-verdict hash IS the ordering witness, and step 6 hard-blocked until that same file changed, so every run that reached COMPLETE necessarily mutated a witnessed artifact and verify returned TAMPERED — the chamber's promotion condition was unsatisfiable by construction, not by strictness. Two roles (immutable witness / post-verdict calibration sink) had collided in one file; each was correct alone, so neither side's code showed the conflict. Also: ko-tech-writer Step 2/4-b scans are now calibration-backed (known-pair fixtures + reproducible command, shipped) — discrimination is proven, 'zero residue' is explicitly NOT; chamber lane suite 12 -> 33 including the runner x witness seam no test covered; chamber_run.sh now teaches the two-commit discipline (gate hashes and verdict hash must land in separate commits/PRs — it previously advised the opposite). New in 2.1.0: BREAKING (gate): `crossfamily: declined` in an Axes 2-3 marker now requires grounds naming a record path that RESOLVES on disk — bare `declined`, and `declined` justified by author judgment, are blocked at commit. Remedy: cite where the operator decision lives (e.g. `.. — operator declined sidecars, per knowledge/shared/rules/operational_adaptation.md`), or use `DEGRADED_PANEL_UNUSED` if a panel was reachable and you chose not to recruit it — which is what author judgment actually is. `declined` was the only enum value with no grounds requirement; a cross-family review then broke the first (vocabulary-grep) fix three ways — self-validating on the value's own token, vacuous keyword passes, and over-blocking real declinations in natural prose — so the check asserts a resolvable record instead of words. Also: standpoint axis gains `tier1b` (a STATIC read of a target repo, executed nothing) plus a decide-in-order procedure, after blind floor-tier sims graded pure cold-reads as `tier2` three rounds running; steel-quench Wave 1's sixth angle (gate-locality) gains the output-template row it never had, so a mandatory angle stops being structurally unreportable; verify-bidirectional gains category 5 (prescriptive doctrine statement); Sister Asset Protocol gains an active-adoption trigger; new resident doctrine — Mechanization Boundary, Local Execution First, Skeleton-not-Muscle, Expedition track, and this package's versioning policy. 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": "3.2.0",
20
+ "version": "3.4.0",
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
  },
24
24
  {
25
25
  "name": "fh-qp",
26
- "version": "3.2.0",
26
+ "version": "3.4.0",
27
27
  "description": "QP (Quality Platform) — the generic edition of a field QA harness's Prepare→Automation→Regression loop as an FH plugin: 4 skills (qp router · qp-plan · qp-run · qp-regress) + qp_tools.sh (target-class · adapter-probe · mask · surface-reach · mtm-check · run-verbs, typed exit codes) + a zero-domain-constant profile slot + 29 known-pair lanes. Drives web targets through the session's Playwright MCP and desktop targets through computer-use MCP (mobile deferred); calls a registered qasp typed capability when one exists (strictest-wins) — none is registered today, so the MCP fallback is the first edition. Verdict contract: a MACHINE closure requires a recorded assertion; a failed first step is attributed BLOCKED, not FAIL; surface_reach counts every TC in the denominator. Born as chamber run #18 (EMIT, 2026-09-05).",
28
28
  "source": "./plugins/fh-qp"
29
29
  }
package/AGENTS.md CHANGED
@@ -32,7 +32,7 @@ operations or steel-quench.
32
32
  | `expert` | `plugins/fh-meta/agents/expert.md` | Web-grounded domain accuracy and current practice | `sim-conductor` Area E/D, paper review, direct |
33
33
  | `challenger` | `plugins/fh-meta/agents/challenger.md` | Evidence-cited adversarial evaluation | `steel-quench`, `harvest-loop`, `sim-conductor`, direct |
34
34
  | `fact-checker` | `plugins/fh-meta/agents/fact-checker.md` | Pre-recommendation duplicate and stale-fact search | Before new asset creation or recommendation |
35
- | `hub-persona-auditor` | `plugins/fh-meta/agents/hub-persona-auditor.md` | External-facing pre-publication persona audit | `hub-cc-pr-reviewer`, `sim-conductor`, direct |
35
+ | `hub-persona-auditor` | `plugins/fh-meta/agents/hub-persona-auditor.md` | External-facing pre-publication persona audit | `harness-pr-reviewer`, `sim-conductor`, direct |
36
36
  | `quench-challenger` | `plugins/fh-commons/agents/quench-challenger.md` | Steel-quench attack plus concrete fix direction | `steel-quench` Wave 1, `install-doctor`, `marketplace-gate` |
37
37
  | `persona-innovator` | `plugins/fh-meta/agents/persona-innovator.md` | Naming gaps, frame proposals, frontier signals | `sim-conductor` Area A, `harvest-loop`, direct |
38
38
 
@@ -274,7 +274,7 @@ control; FH supplies the quality gate after goal completion.
274
274
  |---|---|---|
275
275
  | **M1 — Full** | No Claude-native dependency | `token-budget-gate`, `asset-placement-gate`, `phantom-quench`, `deep-clarify`, `convergence-loop`, `ko-tech-writer` (visual-QA steps degrade to text-only) |
276
276
  | **M2 — Partial** | Core works; native agent or slash-command steps need adaptation | `deliberation`, `steel-quench`, `harness-doctor`, `context-doctor`, `sim-conductor`, `harvest-loop` |
277
- | **M3 — Claude-only** | Requires a Claude hook or session-scoped dispatch | `goal-quench`, `hub-cc-pr-reviewer`, `install-wizard` |
277
+ | **M3 — Claude-only** | Requires a Claude hook or session-scoped dispatch | `goal-quench`, `harness-pr-reviewer`, `install-wizard` |
278
278
 
279
279
  > **Detail**: See `knowledge/shared/harness-core/agents_md_runtime_details.md §Invocation-patterns`
280
280
  > — single, parallel, and wave composition examples — read when choosing a dispatch shape.
package/CATALOG.md CHANGED
@@ -742,8 +742,8 @@ FH 전체 지도(2026-09-05) — 5층: ① 무엇인가(문 → 3단 공정 →
742
742
  - cross-family codex R1 21건(S2 = «막는다» 무조건 단정) → 수리 → R2 CONVERGED
743
743
 
744
744
  **File:** plugins/fh-meta/.claude-plugin/plugin.json + .claude-plugin/marketplace.json
745
- Hub meta operations tool bundle — 6 skills operation. harvest-loop path B generalization + verify-bidirectional path B generalization + frontier-digest path B generalization + cross-ecosystem-synergy-detection + plugin-recommender + **hub-cc-pr-reviewer** command tower gate operations rule automation (new). 2 agents (hub-persona-auditor + fact-checker). Beta operation — harness core principle *"beta + public release = practical capability obligation"* followed.
746
- - Decision: hub-cc-pr-reviewer skill newly created — command tower gate operations rule automation + PR lifecycle 4-run accumulated + explicit decision trigger
745
+ Hub meta operations tool bundle — 6 skills operation. harvest-loop path B generalization + verify-bidirectional path B generalization + frontier-digest path B generalization + cross-ecosystem-synergy-detection + plugin-recommender + **harness-pr-reviewer** command tower gate operations rule automation (new). 2 agents (hub-persona-auditor + fact-checker). Beta operation — harness core principle *"beta + public release = practical capability obligation"* followed.
746
+ - Decision: harness-pr-reviewer skill newly created — command tower gate operations rule automation + PR lifecycle 4-run accumulated + explicit decision trigger
747
747
  - Decision: plugin level v0.4.3 → v0.5.0 promoted — 6 skills operation baseline + path B generalization baseline followed
748
748
  - Decision: 3 skills path B generalization — harvest-loop + verify-bidirectional + frontier-digest / external user environment adaptation path enhanced
749
749
  - Note: audit-learnings deprecated from plugin (2026-05-xx) → transferred to hub-internal deprecated/; replaced by harvest-loop
@@ -763,8 +763,8 @@ Self-evolution pipeline — field-harvest → contention-layer → devil/innovat
763
763
  Bidirectional self-verification pattern automation — when user's precision counter-argument manifests after AI recommendation/agreement persistence, baseline update channel 6-step processing.
764
764
  - Decision: v0.5 official release — accumulated runs + mode C correction catch fully persisted
765
765
 
766
- ### 2026-05-08 | fh-meta | hub-cc-pr-reviewer, command-tower-gate-automation, baseline-coherence-check, layer-5-self-catch
767
- **File:** plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL.md
766
+ ### 2026-05-08 | fh-meta | harness-pr-reviewer, command-tower-gate-automation, baseline-coherence-check, layer-5-self-catch
767
+ **File:** plugins/fh-meta/skills/harness-pr-reviewer/SKILL.md
768
768
  Command Tower Gate operations rule automation — on PR input, auto-generates baseline coherence check 8-matrix + Layer 5 self-catch matrix + review comment attachment + admin override merge recommendation.
769
769
  - Decision: v0.1 newly created — PR lifecycle 4-run accumulated + explicit decision trigger met
770
770
 
package/CHEATSHEET.md CHANGED
@@ -567,7 +567,7 @@ Claude agents feature
567
567
  | Skill | What it does | Say this |
568
568
  |---|---|---|
569
569
  | `install-wizard` | First-install onboarding (zshrc, sentinels, the FH self-gate) | "first-time setup", "run the install wizard" |
570
- | `hub-cc-pr-reviewer` | Reads a PR diff → 8-matrix baseline-consistency check → review comment + merge call | "review this PR", "check this diff" |
570
+ | `harness-pr-reviewer` | Reads a PR diff → 8-matrix baseline-consistency check → review comment + merge call | "review this PR", "check this diff" |
571
571
  | `salience-splitter` | Splits an over-large SKILL.md that "does everything" into scoped files | "this skill is bloated", "SKILL.md too large", "split this skill" |
572
572
 
573
573
  ### Agents (sub-agents, dispatched — not slash commands)
package/CLAUDE.md CHANGED
@@ -48,14 +48,14 @@ core invariants never melt). The nursery also **verifies what it births**: harne
48
48
  > 등급표에서 **④** 다. 🟥 등급은 이 표가 아니라 `ship_readiness_gate.md` 가 정본이고, 이름도 거기가 정본이다.
49
49
 
50
50
 
51
- > **3층 정본 — 공정 · 엔진 · 정체성**: FH 를 설명하는 뼈대는 세 층이고 셋의 관계가 정본으로 적혀 있다 — **3단 공정**(FH 의 모든 작업이 밟는 방법론 — 엔진을 벼릴 때도 같다: 초기 영혼 → 중간 **병렬 탈상관** 가속화(두 다이얼 — **탈상관**=사각 위험[모델 계열 ⓐ + 입장 ⓑ] · **병렬**=표면 크기. 곱하지 말고 골라라) → **마무리 6축 태우기**) → **4대 엔진**(영혼·품질게이트·질문하기·맥락유지) → **정체성**(방법론과 코어가 맞물려 나타나는 능력 — 5대는 단련된 실물과 등급을 가진 안정 정체성, 그 외는 방향·레버에 따라 나타나고 사라지는 면모; 운영자 정식화 2026-09-05). 기억용 형태는 **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.
51
+ > **3층 정본 — 공정 · 엔진 · 정체성**: FH 를 설명하는 뼈대는 세 층이고 셋의 관계가 정본으로 적혀 있다 — **3단 공정**(FH 의 모든 작업이 밟는 방법론 — 엔진을 벼릴 때도 같다: 초기 영혼 → 중간 **병렬 탈상관** 가속화(두 다이얼 — **탈상관**=사각 위험[모델 계열 ⓐ + 입장 ⓑ] · **병렬**=표면 크기. 곱하지 말고 골라라) → **마무리 6축 태우기**) → **4대 엔진**(영혼·품질게이트·질문하기·맥락유지) → **정체성**(방법론과 코어가 맞물려 나타나는 능력 — 5대는 단련된 실물과 등급을 가진 안정 정체성, 그 외는 방향·레버에 따라 나타나고 사라지는 면모; 운영자 정식화 2026-09-05). 기억용 형태는 **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. 🟥 **축은 «얼마나 적대적인가»가 아니라 «무엇을 받았는가»로 갈린다** — 받는 것이 같으면 리뷰어를 몇 명 붙여도 같은 사각이 남는다. 🟢 **외부 수치가 생겼다(2026-09-12)**: `arXiv:2609.10969`(*Engineering Reliable Commit Gates for Agentic AI*, 2026-09-10)이 고정예산 2×2 로 **48 템플릿 · 2,880 시나리오**에서 두 축을 분리해 쟀다 — «**같은 증거를 읽는 교차-모델 투표**»는 위험 제안의 **62.9 %** 를 승인하고, «**독립 출처**»는 **22.9 %** 다. 출처 효과 **40.9 %p** vs 모델 다양성 효과 **11.3 %p** — **3.6 배**. 🟥 **그 수치를 읽고 바꿨다(같은 날)**: 강한 쪽(`standpoint:`)의 `tier2`+ grounds 검사가 **advisory 에서 차단으로** 올라갔고(`STANDPOINT_GROUNDS_GRACE_DATE=2026-09-12`, 소급 없음), `crossfamily:` 의 `panel(...)` 은 이제 **`evidence=SHARED|INDEPENDENT|MIXED`** 토큰을 요구한다 — «같은 diff 를 읽은 패널» 이 강한 값으로 기록되던 자리가 그 62.9 % 팔이다. 🟥 **닫힌 것은 여전히 형식이지 진위가 아니다** — 게임 가능성은 §Mechanization Boundary 가 사람에게 남긴 의도된 잔여다. 이 줄은 n=4+4 내부 관찰로 서 있었고 이제 외부 n=2,880 이 같은 방향을 가리킨다(숫자는 초록 직독으로 재확인, 2026-09-12). 🟥 **명칭 충돌 — 이 파일 안에 「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.
52
52
 
53
53
  > **자기 대조는 상시 의무 — 트리거는 발화가 아니라 «지금 FH/PMH 자산을 건드리고 있다»**
54
54
  > (운영자 결정 2026-08-09; 이 저장소든 **다른 사용자의 install 이든** 동일). §FH Improvement
55
55
  > 4-Axis Auto-Gate 와 **같은 트리거**이므로 새 트리거도 새 파일도 만들지 않는다 — 기록 자리는
56
56
  > **4축 마커의 기존 필드**(`axis2-*` · `axis3-*` · `residual`)다.
57
57
  > **마커에 반드시 남는 3줄** ① **①영혼** — 설계 *전에* 쓴 «성공 정의 / 절대 안 함»(없으면 `없음`)
58
- > · ② **돌린 축과 안 돌린 축을 각각 이름으로.** 마커 `axes-run` 은 **2026-08-17 부로 여섯 글자**를 요구한다 — **기호 키**(ⓐ계열 · ⓑ입장 · ⓒ격리 그라운딩 · ⓓ3자대면 · ⓔ첫실사용 · ⓕ되돌림). 그 전 날짜의 마커는 옛 **ASCII 네 글자**(a·b·c·d) 그대로다. 🟥 **두 배열은 같은 글자가 다른 축을 가리킨다** — 옛 `b`=첫실사용은 지금 **ⓔ**, 옛 `d`=되돌림은 지금 **ⓕ** 라서, 옛 줄을 그대로 옮기면 축 둘이 조용히 뒤바뀌고 아무 오류도 안 난다. **어느 배열인지는 마커 파일명의 날짜로 판별한다**(`< 2026-08-17` = 옛 4축). ⚠️ **표기법은 판별자가 아니다** — 초판이 «기호 키를 보면 6축인 줄 안다» 고 적었는데 **코퍼스 실측이 반증했다**: axes-run 보유 53건 중 기호 키가 4건인데 그중 **2건이 2026-08-10 자이면서 옛 4축 의미로 기호를 쓴다**(`ⓑ 첫실사용` · `ⓓ 되돌림` — 현 배열에선 각각 ⓔ·ⓕ), 혼용도 1건 있다. 훅은 그 셋을 안 읽으므로 커밋은 안 막지만 **감사자의 grep 은 거기서 틀린 답을 낸다**. ⓑ입장은 값을 여기 적지 않고 **`standpoint:` 자기 필드**를 가리킨다(`ⓑ=→standpoint`, 그 줄이 비면 죽은 포인터라 차단). 즉 산문 정본과 기계가 **축 개수로는 맞았고**, 남은 어긋남은 `standpoint:` 값의 **grounds** 한 칸이다. 🟥 **초판은 여기에 «값을 검증하는 코드가 아직 0줄»이라고 적었는데 그건 거짓이었다 — 2026-08-23 정정(RETRACTED).** 실측: `templates/.git-hooks/pre-commit` 의 `validate_standpoint_leg()` 는 **86줄**이고 `:1953` 에서 호출되어 `FAILED=1` 로 **커밋을 차단한다**(레인 = `scripts/test_marker_standpoint_lanes.sh`, 실재). 정확한 잔여는 「0줄」보다 훨씬 좁고, **그 구분을 접으면 안 된다**: ⓐ **enum 은 닫혀 있고 차단한다** — 함수 안 `return 1` **6개**(`standpoint:` 줄 부재 · 중복 `standpoint:` 줄 · enum 비-멤버 값 · `crossfamily:` 토큰 오염 · 근거 없는 `not-applicable` · 근거 없는 `DEGRADED_*`/`UNKNOWN`). ⓑ **`tier2`+ 의 «실행을 명명했는가» grounds 검사만 advisory** 미달이면 `⚠️` 찍고 `return 1` 을 **안 한다**(훅 스스로 *"Advisory by design"* 이라 적는다). 줄은 grounds 미검증」이라 적었어야 참이었다. **왜 그렇게 적혔나**: 2026-08-20 정정이 «enum 은 닫혔고 grounds 는 advisory» 로 이미 들어왔는데(§Standpoint-Execution-Evidence 포인터 줄이 그대로 적고 있다) **이 줄만 옛 서술로 남았다** — 같은 파일이 자기 자신과 어긋난 반쪽-픽스 전파경계다(`[[feedback_half_fix_propagation_boundary]]`). 🟥 **이 문단의 논지는 바뀌지 않는다** — 닫힌 것은 여전히 **«형식»이지 «진위»가 아니고**, 자평·게임 가능성은 그대로 열려 있다. 오히려 좁아진 만큼 정확해졌다. 형식 정본 = `.claude/rules/fh_4axis_gate.md §Marker axis fields`
58
+ > · ② **돌린 축과 안 돌린 축을 각각 이름으로.** 마커 `axes-run` 은 **2026-08-17 부로 여섯 글자**를 요구한다 — **기호 키**(ⓐ계열 · ⓑ입장 · ⓒ격리 그라운딩 · ⓓ3자대면 · ⓔ첫실사용 · ⓕ되돌림). 그 전 날짜의 마커는 옛 **ASCII 네 글자**(a·b·c·d) 그대로다. 🟥 **두 배열은 같은 글자가 다른 축을 가리킨다** — 옛 `b`=첫실사용은 지금 **ⓔ**, 옛 `d`=되돌림은 지금 **ⓕ** 라서, 옛 줄을 그대로 옮기면 축 둘이 조용히 뒤바뀌고 아무 오류도 안 난다. **어느 배열인지는 마커 파일명의 날짜로 판별한다**(`< 2026-08-17` = 옛 4축). ⚠️ **표기법은 판별자가 아니다** — 초판이 «기호 키를 보면 6축인 줄 안다» 고 적었는데 **코퍼스 실측이 반증했다**: axes-run 보유 53건 중 기호 키가 4건인데 그중 **2건이 2026-08-10 자이면서 옛 4축 의미로 기호를 쓴다**(`ⓑ 첫실사용` · `ⓓ 되돌림` — 현 배열에선 각각 ⓔ·ⓕ), 혼용도 1건 있다. 훅은 그 셋을 안 읽으므로 커밋은 안 막지만 **감사자의 grep 은 거기서 틀린 답을 낸다**. ⓑ입장은 값을 여기 적지 않고 **`standpoint:` 자기 필드**를 가리킨다(`ⓑ=→standpoint`, 그 줄이 비면 죽은 포인터라 차단). 즉 산문 정본과 기계가 **축 개수로는 맞았고**, 남은 어긋남은 `standpoint:` 값의 **grounds** 한 칸이다. 🟥 **초판은 여기에 «값을 검증하는 코드가 아직 0줄»이라고 적었는데 그건 거짓이었다 — 2026-08-23 정정(RETRACTED).** 실측: `templates/.git-hooks/pre-commit` 의 `validate_standpoint_leg()` 는 **86줄**이고 `:1953` 에서 호출되어 `FAILED=1` 로 **커밋을 차단한다**(레인 = `scripts/test_marker_standpoint_lanes.sh`, 실재). 정확한 잔여는 「0줄」보다 훨씬 좁고, **그 구분을 접으면 안 된다**: ⓐ **enum 은 닫혀 있고 차단한다** — 함수 안 `return 1` **6개**(`standpoint:` 줄 부재 · 중복 `standpoint:` 줄 · enum 비-멤버 값 · `crossfamily:` 토큰 오염 · 근거 없는 `not-applicable` · 근거 없는 `DEGRADED_*`/`UNKNOWN`). ⓑ **`tier2`+ 의 «실행을 명명했는가» grounds 검사도 2026-09-12 부로 차단한다** 전까지는 `⚠️` 찍고 `return 1` 을 했다(훅 스스로 *"Advisory by design"* 이라 적었다). 🟢 **바꾼 근거는 외부 실측이다**: `arXiv:2609.10969` 출처 축을 **40.9 %p**, 모델 축을 **11.3 %p** 로 재서(n=2,880 · 고정 호출예산) «강한 축의 grounds advisory 두고 약한 축을 하드 차단» 이 균형이 아니게 됐다. grace date 로 소급하지 않으며(`< 2026-09-12` 마커는 종전 경고), 레인 = `test_marker_standpoint_lanes.sh` N8/N8b/N8c/N8d. 🟥 막는 것은 **기록의 형태**(명령과 출력을 명명했는가)이지 그 실행의 진위가 아니다. **왜 그렇게 적혔나**: 2026-08-20 정정이 «enum 은 닫혔고 grounds 는 advisory» 로 이미 들어왔는데(§Standpoint-Execution-Evidence 포인터 줄이 그대로 적고 있다) **이 줄만 옛 서술로 남았다** — 같은 파일이 자기 자신과 어긋난 반쪽-픽스 전파경계다(`[[feedback_half_fix_propagation_boundary]]`). 🟥 **이 문단의 논지는 바뀌지 않는다** — 닫힌 것은 여전히 **«형식»이지 «진위»가 아니고**, 자평·게임 가능성은 그대로 열려 있다. 오히려 좁아진 만큼 정확해졌다. 형식 정본 = `.claude/rules/fh_4axis_gate.md §Marker axis fields`
59
59
  > · ③ **각 축의 컨트롤과 그 생사**. 축을 «돌렸다»의 **최소 증거 = 컨트롤이 살아 있는 실행 출력**
60
60
  > 이다 — 안 고른 이유만 적은 것은 준수가 아니다.
61
61
  > **비용 경계**: 넷을 매번 다 돌리지 않는다. 실패 모드에 맞춰 **고른다**.
@@ -972,7 +972,7 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
972
972
  | "pull this into FH", "reverse-harvest", "worth keeping", "harvest pattern", "field pattern" | `/field-harvest` |
973
973
  | **you installed or invoked an EXTERNAL asset (a tool, framework, or repo not ours) and ran it against something this hub owns** — `pip install`/`npm i` of an outside framework, cloning a peer repo to run it, adopting an upstream utility. Fires on the ACT, not on a keyword: the trigger is *"I reached outside because ours did not cover this"* | **Sister Asset Protocol** (`knowledge/shared/rules/sister_asset_protocol.md` §Active adoption) — record the resolution difference, list **items to import** AND **items the hub can propagate** (bidirectionality is a prohibition, not a nicety), and where there is no write access write a `tracks/_audit/proposal_*.md` so the operator can decide whether to contribute it upstream. 🟥 Missed 2026-08-16 on exactly this shape: an external red-team framework was installed, run against a field harness, found a real bypass — and was filed as a `type: reference` **tool pointer** with no sister audit at all |
974
974
  | "용광로모드", "crucible mode", "absorb this whole corpus", "throw everything in", "re-forge FH identity", "melt this down" (total-immersion absorption, not cherry-pick — esp. a whole corpus on a core FH axis, or a frontier showcase risking FOMO) | `knowledge/shared/harness-core/crucible_mode.md` (read it, run the chain: total-ingest → steel-quench/phantom-quench melt → governor identity-bonding → sim/persona reforge → field-harvest rebirth; the core invariants stay unmeltable) |
975
- | "review this PR", "check diff", "code review" | code diff → built-in `/code-review`·`/review` · FH-asset coherence → `/hub-cc-pr-reviewer` (role split) |
975
+ | "review this PR", "check diff", "code review" | code diff → built-in `/code-review`·`/review` · FH-asset coherence → `/harness-pr-reviewer` (role split) |
976
976
  | "keep watching X", "poll this", "check every N minutes", recurring WATCH item | built-in `/loop` (interval runner) — pair with the WATCH list, don't hand-poll |
977
977
  | "research this deeply", "survey the literature", "comprehensive analysis", "deep research", "look this up thoroughly", "조사해줘", "리서치" (general topic research, not trend-scan) | **Deep-Research Capability Ladder** (`knowledge/shared/harness-core/deep_research_capability_ladder.md`) — route to the highest available rung: built-in `/deep-research` if present → else Claude `WebSearch`+`WebFetch` synthesis (tier-sensitive) → `/frontier-digest` only if it's AI/harness trend-scan. **Boundary («동향/trend»+«조사» in one utterance)**: decide by TOPIC, not verb — AI/harness-adjacent trend → `/frontier-digest`, anything else → the ladder (routing probe 2026-08-10 #8: the two vocabularies co-occur in real utterances). No-reinvention: FH routes, does not build a research engine. |
978
978
  | "orchestrate agents", "parallel dispatch", "combine skills", "multiple agents" | `/agent-composer` |
@@ -1000,7 +1000,7 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
1000
1000
  | **사람이 읽을 산출물이 나가기 직전** — README·가이드·리포트·장표·PR 본문 등 «독자가 여는» 것 (proactive; 코드가 옳아도 걸린다 — 이 행이 잡는 건 정확성이 아니라 **가독성**이다) | **독자로서 한 번 읽어라** — 첫 8줄에 결론이 있나 · 본문이 고정 템플릿에 덮이지 않나 · 마지막 인상이 무엇인가. 렌즈는 이미 있다: `/sim-conductor` A-1(`beginner` cold-read) 또는 직접 렌더해서 읽기. 🟥 **정적 검사는 「없는 것」을 잡고 「안 읽히는 것」은 못 잡는다** — 실측 2건이 독립 수렴했다(qasp 축: 지적 12건 중 스캐너 적발 0 · gstack 3자대면: 배포된 리포트 본문 3줄 vs 고정 템플릿 21줄). pre-commit 이 같은 상기를 advisory 로 낸다(차단 아님) |
1001
1001
  | "ready to PR", "about to push", "merge this", "PR 올려줘", FH asset changed in session | 4-axis auto-gate (see above — runs automatically, no proposal needed) |
1002
1002
  | **field verdict/gate/safety/irreversible code changed** in a mapped project **— or a merge/landing verdict asked on any gate-shaped file, mapped or not** (function returning a verdict enum / gate exit code / safety-invariant · access-control / approval / auth / exposure boundary · publish/delete/history path; «gate-shaped» = the mechanical identifier test in §Field-Harness Load-Bearing Change Gate, not a feel) — **proactive, before merge** | **Field-Harness Load-Bearing Change Gate** (see above → degrade-lint → cross-family review → converge; same rigor as FH assets, applied to field code) |
1003
- | **a diff (yours or an unattended pipeline's) alters another harness's actual behavior, gate outcome, or interaction contract** — building automation that opens PRs autonomously, touching a synced/shared-body surface, or any change whose effect crosses a harness boundary (not merely a file-class match — most self-improvement is `not-applicable` here, which is the expected common case) — **proactive, before push, never as a post-PR comment** | **Standpoint axis** (`knowledge/shared/harness-core/field_verdict_crossfamily_gate.md §7` — orthogonal to `crossfamily:`; run the diff from the TARGET harness's own repo/standpoint via `tier2`/`tier2b`/`tier3`, or record `not-applicable`/`DEGRADED_*` on the closed enum. Missed once in-session while building `scripts/frontier_digest_autopilot.sh` 2026-08-15 — mis-routed to `fh-meta:hub-cc-pr-reviewer` (same-repo self-consistency, a different lens) before the operator caught it; this row exists so the next session connects the trigger without two rounds of correction.) |
1003
+ | **a diff (yours or an unattended pipeline's) alters another harness's actual behavior, gate outcome, or interaction contract** — building automation that opens PRs autonomously, touching a synced/shared-body surface, or any change whose effect crosses a harness boundary (not merely a file-class match — most self-improvement is `not-applicable` here, which is the expected common case) — **proactive, before push, never as a post-PR comment** | **Standpoint axis** (`knowledge/shared/harness-core/field_verdict_crossfamily_gate.md §7` — orthogonal to `crossfamily:`; run the diff from the TARGET harness's own repo/standpoint via `tier2`/`tier2b`/`tier3`, or record `not-applicable`/`DEGRADED_*` on the closed enum. Missed once in-session while building `scripts/frontier_digest_autopilot.sh` 2026-08-15 — mis-routed to `fh-meta:harness-pr-reviewer` (same-repo self-consistency, a different lens) before the operator caught it; this row exists so the next session connects the trigger without two rounds of correction.) |
1004
1004
  | **"진단해줘", "개선해줘", "diagnose this", "improve this harness", "check this project", "audit this project"** — said while working **in a mapped project** (not a single-file ask) | **Field-Harness Diagnostic** (see §Field-Harness Diagnostic above → compose existing checks into one ranked M/S/R list → HITL approval per item, nothing auto-fixed) |
1005
1005
  | **"새 프로젝트", "하네스 작성해줘", "이 프로젝트 가속화", "harness-ify this", "accelerate this project"** — an onboarding/acceleration door (returning-menu ①②③) | **Onboarding / Acceleration Autopilot** (see §Onboarding / Acceleration Autopilot above → Phase 0 auto-discover + branch → innovator-centered recommend → ranked install plan → HITL per item, non-overwriting; "끝까지 자율로" → full-autonomy under /goal-quench gate) |
1006
1006
 
@@ -131,7 +131,7 @@ rather than only synthetic ones.
131
131
 
132
132
  ```bash
133
133
  # active skills. NOTE: the old recipe here grepped each SKILL.md for "redirect stub"/"deprecated"
134
- # and returned 38, because phantom-quench and hub-cc-pr-reviewer — both live — merely MENTION those
134
+ # and returned 38, because phantom-quench and harness-pr-reviewer — both live — merely MENTION those
135
135
  # words in their prose. A body-text grep cannot tell "I am a stub" from "I detect stubs". There are
136
136
  # currently zero stubs, so count the files and re-introduce an exclusion only when one exists, in
137
137
  # frontmatter where it can be matched on a field rather than on a phrase.
@@ -41,7 +41,7 @@ to FH itself and to the field harnesses it emits.
41
41
  | 42001 A.7 data (A.7.2–A.7.6) | acquisition, quality, provenance, preparation | FH holds no training data but does hold **evaluation data** (probes, corpora, transcripts, logs): provenance = sim header `corpus_head_date` · quality = known-pair calibration · preparation = residency strip · **company residency is absolute** | `probes_live.yaml`, `scripts/residency_closure_scan.py` | 🟡 provenance/preparation present; no written acquisition or quality criteria for evaluation data |
42
42
  | ISO/IEC 5338 life cycle | define · control · execute · improve | incubator (chamber) → EMIT → field → harvest-loop compounding | `harness_incubator_doctrine.md`, `hub_compounding_loop.md` | ✅ |
43
43
  | ISO/IEC 23894 risk management | identify · analyse · evaluate · treat | ship-readiness grades · Surface-Class Degrade Invariant (irreversible = fail-closed) | `ship_readiness_gate.md`, `CLAUDE.md §Irreversibility Gates` | ✅ partial |
44
- | ISO/IEC 20246 reviews | work-product reviews | cross-family review · `/apex-review` · `hub-cc-pr-reviewer` · cold read (`beginner`) | `plugins/fh-meta/agents/` | ✅ |
44
+ | ISO/IEC 20246 reviews | work-product reviews | cross-family review · `/apex-review` · `harness-pr-reviewer` · cold read (`beginner`) | `plugins/fh-meta/agents/` | ✅ |
45
45
 
46
46
  ## What a field harness inherits
47
47
  A harness FH emits gets the same rows for free where it adopts the templates (`templates/.git-hooks/*`, the marker schema, the
@@ -113,7 +113,7 @@ When `codex exec` runs **inside this repo**, FH's Claude-native git/Stop/PostToo
113
113
  M2 skills (`deliberation`, `steel-quench`, `harness-doctor`, `context-doctor`, `sim-conductor`, `harvest-loop`) have a core workflow that runs under Codex, but any step that dispatches `Agent(subagent_type=...)` or a slash command must be replaced by `fh-run` or a direct `codex exec` call reading the sub-agent's `SKILL.md`/agent `.md` — same workflow, different runtime (the "M2 adaptation pattern" in `AGENTS.md`). Example: `steel-quench` Waves 1–3 run; the `quench-challenger` agent step becomes `fh-run --agent fh-commons:quench-challenger`.
114
114
 
115
115
  ### 3. M3 skills do not run automatically under Codex
116
- M3 skills (`goal-quench` Phase-3 Stop hook, `hub-cc-pr-reviewer` CC session context, `install-wizard` settings.json write) require Claude-Code-native runtime and are **methodology reference only** under Codex unless a dedicated adapter exists. Use Codex's native goal/session features for goal control, and use `fh-gate` after completion for FH quality gating.
116
+ M3 skills (`goal-quench` Phase-3 Stop hook, `harness-pr-reviewer` CC session context, `install-wizard` settings.json write) require Claude-Code-native runtime and are **methodology reference only** under Codex unless a dedicated adapter exists. Use Codex's native goal/session features for goal control, and use `fh-gate` after completion for FH quality gating.
117
117
 
118
118
  ### 4. No token accounting
119
119
  Codex token usage is billed in the Codex CLI quota and is **not** recorded in any FH session log or orchestrator measurement. Cross-family runs (Gemini/Codex) are invisible to FH's token-budget tooling by construction.
@@ -178,7 +178,7 @@ is not the headless substitute.
178
178
  |---|---|---|
179
179
  | **M1 — Full** | No Claude-native dependency | `token-budget-gate`, `asset-placement-gate`, `phantom-quench`, `deep-clarify`, `convergence-loop` |
180
180
  | **M2 — Partial** | Core works; native agent/slash-command steps need adaptation | `deliberation`, `steel-quench`, `harness-doctor`, `context-doctor`, `sim-conductor`, `harvest-loop` |
181
- | **M3 — Claude-only** | Requires a Claude hook or session-scoped dispatch | `goal-quench`, `hub-cc-pr-reviewer`, `install-wizard` |
181
+ | **M3 — Claude-only** | Requires a Claude hook or session-scoped dispatch | `goal-quench`, `harness-pr-reviewer`, `install-wizard` |
182
182
 
183
183
  **Which phase needs adapting** — the operative half of the M2/M3 rows. Without this a tier label
184
184
  tells a non-Claude runtime that a skill is "partial" but not *where* to intervene, which is the only
@@ -191,7 +191,7 @@ move, these per-skill cues did not, and they existed in no other file.)
191
191
  | `harvest-loop` | the git-scan phase | PR auto-proposal |
192
192
  | `deliberation` | proposal/synthesis structure | Mediator and Jury agent steps |
193
193
  | `goal-quench` (M3) | — | Phase 3 depends on a Claude Stop hook |
194
- | `hub-cc-pr-reviewer` (M3) | — | needs Claude session context |
194
+ | `harness-pr-reviewer` (M3) | — | needs Claude session context |
195
195
  | `install-wizard` (M3) | — | writes `settings.json` |
196
196
 
197
197
  For M2, replace `Agent(subagent_type=...)` and slash-command steps with `fh-run` or direct
@@ -93,6 +93,12 @@ it?) before acting — mechanical anchor over agreement.
93
93
  2. **Cross-family adversarial review** — `auto-decorrelation` recruits ≥1 different-family auditor
94
94
  (e.g. `codex` gpt-5.5 / high for repo-grounded verdict code). The same standing verifier the
95
95
  4-axis gate uses for load-bearing FH assets, now applied to **field** load-bearing changes.
96
+ 🟥 **Judgment-type questions need reps ≥ 3** (pmh-dev #76, 2026-09-11): the same «is this silent
97
+ fallback by-design or fail-open?» prompt at the same temperature returned DESIGN / DEFECT / DESIGN
98
+ across three runs of one auditor. A single run of a judgment question therefore cannot be recorded
99
+ as `panel(...)` CONCUR — run it ≥3×, report the split, and treat a split as *unresolved*, not as
100
+ whichever side came first. Fact-type questions (grep, existence, «does line N call X») are stable
101
+ across reps and families and need neither repetition nor a family change.
96
102
  3. **Confirm → fix → re-verify loop** — iterate until the cross-family pass is **CONVERGED**: no
97
103
  reachable false-PASS / false-CONFIRMED / masked-FAIL / crash-where-safe-fail-required. **Each fix
98
104
  ships a mechanical regression test** reproducing the closed hole — a *required* convergence
@@ -213,6 +219,27 @@ changes which ground truth the review is checked against — they are orthogonal
213
219
  that maxes out the first while leaving the second at zero has not raised its coverage of
214
220
  standpoint-dependent defects at all.*
215
221
 
222
+ 🟢 **External number, 2026-09-12 — and it is large.** `arXiv:2609.10969` (*Engineering Reliable
223
+ Commit Gates for Agentic AI: Cost-Aware Verification Portfolios under Common-Mode Data Failures*,
224
+ 2026-09-10, cs.SE) built this comparison as a benchmark: 48 task templates → **2,880 scenarios**,
225
+ **fixed-call 2×2** so budget is held constant and the comparison is about the axis rather than about
226
+ spending more. Result: a **cross-model vote over shared evidence approves 62.9 % of unsafe proposals**,
227
+ versus **22.9 % with an independent source** — source effect **40.9 pp** against **11.3 pp** for model
228
+ diversity, i.e. **3.6×**. 🟥 **Read that against which axis FH mechanizes**: `crossfamily:` is a closed
229
+ enum with a hard commit block and a fixtures lane, while `standpoint:`'s grounds check — the axis the
230
+ number says carries 3.6× the effect — **was advisory by design until 2026-09-12**
231
+ (`validate_standpoint_leg()` printed `⚠️` and did not `return 1` on a `tier2` naming no command).
232
+ 🟢 **Both gaps were closed the same day this number landed**: the `tier2`+ grounds check now
233
+ **blocks** (`STANDPOINT_GROUNDS_GRACE_DATE=2026-09-12`, no retro-blocking — lanes N8/N8b/N8c/N8d),
234
+ and `crossfamily:`'s `panel(...)` now requires an **`evidence=SHARED|INDEPENDENT|MIXED`** token in its
235
+ grounds (`EVIDENCE_TOKEN_GRACE_DATE=2026-09-12`, lanes e1–e10), because a cross-family panel reading
236
+ the **same diff** is, in their terms, the 62.9 % arm while recording as this enum's strong value.
237
+ 🟥 `SHARED` stays a legal answer — the defect was that it was unsayable, not that it is wrong. Until 2026-09-12 this section rested on FH's own
238
+ n=4+4/4+8 observations; the direction is unchanged and the magnitude is now external.
239
+ ⚠️ Scope: their unsafe-approval rates are from their fault-injection benchmark, not from FH's corpus —
240
+ cite the **asymmetry**, not the absolute percentages, as a property of FH's own gate.
241
+ (Numbers re-read off the abstract on 2026-09-12 rather than recalled — §Instrument Calibration.)
242
+
216
243
  **Relationship to the isolation axis — standpoint is isolation whose scope moved up to the
217
244
  harness (operator, 2026-08-18).** Operator wording: *"요는 이것도 '격리' 프레이밍이 하네스 단위로
218
245
  확장되는 거지 … 그 하네스 자체의 입장을 돌리는 거니까 (하네스라는 껍질에 모델이라는 알맹이를
@@ -542,7 +569,7 @@ one variable at a time — `banana(qasp)` → **blocked (enum)** · `tier2` with
542
569
  **passes**.
543
570
 
544
571
  **What is actually true, stated at the right width**: the enum IS closed and enforced; the `tier2`+
545
- execution grounds are **advisory** (a thin `tier2` records and warns, it does not block); and nothing
572
+ execution grounds **blocked** from 2026-09-12 (before that a thin `tier2` recorded and warned); and nothing
546
573
  checks whether the recorded value is *true*. The old sentence collapsed all three into "no validation",
547
574
  which suppresses use of a control that exists — the quietest kind of drift, because it reads as
548
575
  honest modesty.
@@ -573,7 +600,7 @@ grep the function name, not a line number) blocks on **six** distinct `return 1`
573
600
  duplicated one, a value outside the closed enum, a `crossfamily:` token contaminating this axis, a
574
601
  bare `not-applicable`, and a bare `DEGRADED_*`/`UNKNOWN`. Lanes: `scripts/test_marker_standpoint_lanes.sh`.
575
602
  **What is actually reserved is one narrow slot**: for `tier2`+ the «did you name a command you ran»
576
- grounds test emits `⚠️` and **does not** return 1 the hook labels it *"Advisory by design"*. So the
603
+ grounds test emitted `⚠️` and did **not** return 1 until 2026-09-12 (the hook labelled it *"Advisory by design"*); it now returns 1 for markers dated on/after `STANDPOINT_GROUNDS_GRACE_DATE`. So the
577
604
  accurate three-way split is: **enum → blocked · non-vacuity of grounds → blocked · truth of the value,
578
605
  and execution-naming on `tier2`+ → not checked.** Do not read this as "now mechanized"; read it as
579
606
  **"the channel is checked in more places than this file used to admit, and the judgment is still not
@@ -916,7 +943,7 @@ time, because the first version of this correction varied two and mis-attributed
916
943
  `banana(qasp)` → blocked (enum) · `tier2` without parens → blocked (enum) · `tier2(qasp)` with **no**
917
944
  execution grounds → **passes with a warning** · with grounds → passes. 🟥 So the first fix's claim
918
945
  that "grounds are non-empty" are checked **over-shot, and a different-family reviewer caught it**:
919
- the `tier2`+ execution grounds are **advisory**. Two residuals remain and both are real — grounds are
946
+ the `tier2`+ execution grounds **block as of 2026-09-12** (they were advisory before). Two residuals remain and both are real — grounds are
920
947
  not enforced, and whether `tier2` is *true* is still self-attested. What was wrong was only the claim
921
948
  that nothing validated the field at all. Three artifacts, one carrying two
922
949
  independent trials (forge-harness PR #368, a sibling field harness's PR #8 reps=3 and its
@@ -72,7 +72,7 @@ TS 8200), 위험 식별(42119-2 §6) — 이 정확히 **하네스 층**에 산
72
72
  | 42001 A.10 3자 | 3자·고객 관계 | capability composition contract(strictest-wins) · 클러스터 노드 등록 | `capability_composition_contract.md` | 🟡 |
73
73
  | 5338 수명주기 | 정의·통제·실행·개선 프로세스 | 인큐베이터(챔버 run) → EMIT → 필드 → harvest-loop 복리 | `harness_incubator_doctrine.md` · `hub_compounding_loop.md` | ✅ |
74
74
  | 23894 위험관리 | 식별·분석·평가·처리 | 등급표(🔴🟡🔵🟢) · Surface-Class Degrade Invariant(비가역 = fail-closed) · «미측정≠0」 | `ship_readiness_gate.md` · `CLAUDE.md §Irreversibility Gates` | ✅ 부분 |
75
- | 20246 리뷰 | 작업산출물 리뷰 프로세스 | cross-family 리뷰 · `/apex-review` · `hub-cc-pr-reviewer` · 콜드리드(`beginner`) | `plugins/fh-meta/agents/*` | ✅ |
75
+ | 20246 리뷰 | 작업산출물 리뷰 프로세스 | cross-family 리뷰 · `/apex-review` · `harness-pr-reviewer` · 콜드리드(`beginner`) | `plugins/fh-meta/agents/*` | ✅ |
76
76
 
77
77
  ## 3. qasp crosswalk — QA 하네스에게 29119 는 «선택된 활동」 단위로 걸린다
78
78
 
@@ -20,7 +20,7 @@ refs:
20
20
  "The ratio at which the result of executing a skill can be independently reproduced and verified by an external observer"
21
21
 
22
22
  ### Measurement targets (5 core skills — fixed denominator)
23
- harness-doctor · verify-bidirectional · hub-cc-pr-reviewer · context-doctor · sim-conductor
23
+ harness-doctor · verify-bidirectional · harness-pr-reviewer · context-doctor · sim-conductor
24
24
 
25
25
  ### Per-skill scoring criteria
26
26
 
@@ -3575,6 +3575,37 @@
3575
3575
  outcome: accepted
3576
3576
  evidence: "① 델타 진술 + 제목 3 + thesis 2, 각각 defeater 동반 ② 외부 선행 11건(URL 열어 확인) + 미확인 4건 라벨 분리 ③ FH 결손 6건(G-1~G-6, 전부 기계화 가능). 🟥 G-4(finding_verify.py 의 자기검증 가드가 옵셔널 필드에 걸린 fail-open)는 내가 소스 확인 + 알려진 쌍 재현 후 **이 릴리스에서 닫았다**(PR #694). 사이드카 원 주장은 배선 경로도 뚫린다는 함의였는데 파이프라인이 라우팅을 거부하므로 좁혀서 채택 — 사이드카 발견은 «증거 후보» 이지 판정이 아니라는 규율대로"
3577
3577
  residual: "🟥 자기보고 잔여를 스스로 6항 적어 왔다(EU AI Act 미열람 · preprint 자기보고 수치 · 우리 표의 커버리지 불일치). 그 정직성 자체가 채택 근거의 일부. 외부 인용은 **아직 재검증 안 함** — 논문에 싣기 전에 URL 을 내가 직접 연다"
3578
+ - date: 2026-09-10
3579
+ agent: sidecar-codex (gpt-6-astra high) + sidecar-agy (gemini-3.8-flash-high) + local ollama qwen3.8:27b@4090
3580
+ task: B-2 F_typed 팔 24런(+15 재실행) · F_gen 9런 · 채점 32+16+16+3 단위 · cross-family 수리 검토 1
3581
+ count: 37 (SubagentStop 집계) — 사이드카 CLI 호출은 별도(팔 ~140, 채점 ~70)
3582
+ outcome: accepted
3583
+ evidence: tracks/_meta/dominance_B2/RESULT_2026-09-10_scoring-calibration.md §1~§10 · fh_axes23_2026-09-10_verifier-roster.md · cross-family 6/6 실적발 전건 수리(L73~L78)
3584
+ cost: codex 577k(F_typed 리뷰) + 한도 3회 소진 · 로컬 4090 무료 · 거버너 UNMEASURED
3585
+ note: 통합 1항목. 사이드카는 auditor 로만(트리 쓰기 0). 자력 적발 0/6(cross-family) · 계기 축 자력 2(L72 · quota 오탐)
3586
+ - date: 2026-09-10
3587
+ agent: general-purpose ×5 (Claude, 로컬 격리 워크트리 · 사이드카 0 — residency)
3588
+ task: qasp-dev PR 스택 7건(#278–#284) 거버너 검증 — 레인 실행 · 되돌림 프로브 · 표본 손검증 · known-pair (#279 · #280+#281 · #282 · #283 · #284) + 거버너 직접 #278·스택 전수
3589
+ count: 5
3590
+ outcome: accepted
3591
+ evidence: tracks/_meta/field_gate_review_2026-09-10_qasp-stack7.md — #281 BLOCK(coverage.py:142 파생 fail-open 재현 + 정본 :41), 5건 A 소견 전부 file:line·재현 동반 · 스택 전수 4092/0
3592
+ cost: subagent_tokens 163k+184k+215k+200k+195k ≈ 957k · 거버너 UNMEASURED
3593
+ note: 통합 1항목. crossfamily=DEGRADED_SINGLE_FAMILY(corp-context 어휘 — residency). 자력(거버너) 적발 0 — 다섯 A 전부 에이전트 실행이 잡음; 저자 자기검토도 다섯 다 놓친 자리(«거버너 1종» 이 실제로 «기계 1종+의미 0종» 이라는 저자 정정은 채택)
3594
+ - date: 2026-09-12
3595
+ agent: general-purpose(sonnet) ×6 — persona-commons 1기 웹 리뷰 캐스트 첫 실사용(designer · ux-writer · fe-dev · be-dev · qa · a11y 렌즈, 격리·병렬)
3596
+ task: 공개 화면(FH 지도 페이지 캡처 33요소/5k자) 에 각 렌즈 파일+캡처만 주고 parallax 출력 + Unique-to-this-seat 자기 태그. 거버너가 렌즈별 고유 발견을 세어 장식 렌즈를 가른다(한계효용 정지)
3597
+ count: 6
3598
+ outcome: accepted
3599
+ evidence: 결과는 tracks/_meta/persona_cast_trial_2026-09-12.md 에 표로
3600
+ note: 렌즈 파일은 워크트리 초안(feat/persona-commons). 회사 데이터 0(공개 페이지)
3601
+ - date: 2026-09-12
3602
+ agent: codex sidecar(gpt-6-astra) — Axis 2 cross-family 감사, 짝지음 설계 diff 18,771 bytes
3603
+ task: finding_fleet.sh · finding_pipeline.sh · run_pair.sh 의 diff 를 읽고 결함 열거(S/A/B + 트리거 입력). «두 분기가 바이트 동일한 r1 을 먹어야 하고 드리프트는 크게 틀어져야 한다» 를 요구사항으로 명시
3604
+ count: 1
3605
+ outcome: accepted
3606
+ evidence: S 1건 적발 — `--r1-only` 이 빈 round-1 을 R1_ONLY(사용가능) 로 통과시키는 fail-OPEN(`grep -c . || echo 0` 이 "0\n0" 을 만들어 `[ -eq 0 ]` 이 구문오류로 거짓). 프로브 출력까지 받아 재현, 레인 L124 + fail-before 실행 증명으로 수리. 판정 원문 = tracks/_meta/dominance_B2/PREREG_ADDENDUM6_NOTE_2026-09-12.md
3607
+ cost: tokens 46,877 · 거버너 UNMEASURED
3608
+ note: 🟥 부분 완주 — 한도 소진으로 중단(리셋 15:44), 남은 표면(run_pair.sh phase2 동시성) 미검. 자력 적발 0 — 내가 20분 전에 쓴 코드였다. 회사 데이터 0(FH 자기 스크립트)
3578
3609
  - date: 2026-09-11
3579
3610
  agent: agy(gemini-3.1-pro-high · gemini-3.8-flash-high) · cross-family adversarial reviewer
3580
3611
  mode: sidecar
@@ -125,7 +125,7 @@ The forge-harness bundles **rules, skills, and session protocols** into one envi
125
125
  | `harvest-loop` | Weekly audit + self-evolution pipeline + Phase 2+ PR auto-proposal |
126
126
  | `verify-bidirectional` | Bidirectional self-verification + user-AI baseline update circuit |
127
127
  | `frontier-digest` | External-facing asset cross-ref + frontier trend + per-audience guide |
128
- | `hub-cc-pr-reviewer` | PR diff → baseline coherence check → review comment auto-generation |
128
+ | `harness-pr-reviewer` | PR diff → baseline coherence check → review comment auto-generation |
129
129
  | `context-doctor` | `.claudeignore` auto-generation + large file detection + `/clear` timing guidance |
130
130
  | `harness-doctor` | Harness structure L1~L4 diagnosis + M/S/R prescription |
131
131
  | `sim-conductor` | External scenario/internal audit/ideation scan autonomous execution + M-tier auto PR |
@@ -156,7 +156,7 @@ The forge-harness bundles **rules, skills, and session protocols** into one envi
156
156
  | "can I use what's in another project?", "what's available?" | Ecosystem synergy discovery | `cross-ecosystem-synergy-detection` |
157
157
  | "manage my context", "want to save tokens" | Context optimization | `context-doctor` |
158
158
  | "wrap up this week's work", "want to reflect" | Weekly audit | `harvest-loop` |
159
- | "review my PR", "please review" | PR audit | `hub-cc-pr-reviewer` |
159
+ | "review my PR", "please review" | PR audit | `harness-pr-reviewer` |
160
160
  | "check harness structure", "confirm everything's running well" | Structure diagnosis | `harness-doctor` |
161
161
  | "what are the latest AI tools?", "tell me about frontier trends" | External asset discovery | `frontier-digest` |
162
162
  | "want to share this pattern", "can I post this here?" | Pattern harvesting | `field-harvest` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "3.2.0",
3
+ "version": "3.4.0",
4
4
  "description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
5
5
  "homepage": "https://github.com/chrono-meta/forge-harness#readme",
6
6
  "bugs": {
@@ -227,6 +227,7 @@
227
227
  "plugins/fh-meta/skills",
228
228
  "plugins/fh-meta/agents",
229
229
  "plugins/fh-commons/.claude-plugin/plugin.json",
230
+ "plugins/fh-commons/README.md",
230
231
  "plugins/fh-commons/skills",
231
232
  "plugins/fh-commons/agents",
232
233
  "knowledge/shared/harness-core",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "3.2.0",
3
+ "version": "3.4.0",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -0,0 +1,38 @@
1
+ # fh-commons — Contention-Born Skill Habitat
2
+
3
+ **A different layer of plugin from fh-meta.**
4
+
5
+ fh-meta = meta-engineering skills for operating, diagnosing, and improving the harness itself
6
+ fh-commons = general-purpose utility skills born from the contention layer, transplantable to any project
7
+
8
+ ## Placement Criteria
9
+
10
+ When the `contention-layer` skill harvests contentions and generates new skill candidates:
11
+
12
+ | Determination | Destination |
13
+ |---|---|
14
+ | Harness engineering in nature | `fh-meta` |
15
+ | Project-general · domain-agnostic | **`fh-commons`** (this plugin) |
16
+ | Domain/team specific | field harvest (decided by the field team) |
17
+
18
+ ## Skill List
19
+
20
+ | Skill | Description | Contention Parent |
21
+ |---|---|---|
22
+ | `convergence-loop` | General-purpose gate reinforcement that replaces single-pass structures with a convergence loop of up to N rounds | harvest-loop (recurring single-pass-distrust pattern across hub gates) |
23
+ | `deliberation` | Innovator → Devil-Advocate → Mediator 3-layer multi-perspective synthesis. Generates conditional verdicts without binary win/loss | Migrated from fh-meta (2026-05-23 — domain-agnostic general decision structure) |
24
+ | `ko-tech-writer` | Korean technical-writing pipeline — register detection, venue calibration, translationese scan, honesty layering, number/claim gate, perceptual QA | Field-session harvest (2026-08-10 — conference tech-doc revision session, operator-driven shipping) |
25
+
26
+ ## The `origin` Field
27
+
28
+ Commons skills include the following fields in their SKILL.md frontmatter:
29
+
30
+ ```yaml
31
+ # Contention-born (extracted by contention-layer)
32
+ origin: contention-layer
33
+ contention-parents: [skill-A, skill-B]
34
+
35
+ # Migrated from fh-meta (reclassified as general-purpose)
36
+ origin: fh-meta
37
+ migration: "YYYY-MM-DD — reason for migration"
38
+ ```
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-meta",
3
- "version": "3.2.0",
3
+ "version": "3.4.0",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -1,5 +1,100 @@
1
1
  # forge-harness (fh-meta) Changelog
2
2
 
3
+ ### [3.4.0] — 2026-09-12 — 탈상관의 «강한 축» 을 기계로 옮긴다 (외부 실측 기인)
4
+
5
+ **BREAKING (gate):** 마커 두 자리가 조인다. 둘 다 **grace date 로 소급하지 않는다** — 그 날짜 이전
6
+ 파일명의 마커는 종전대로다.
7
+ ① `crossfamily: panel(<families>)` 는 이제 grounds 에 **`evidence=SHARED|INDEPENDENT|MIXED(...)`**
8
+ 토큰을 요구한다(`EVIDENCE_TOKEN_GRACE_DATE=2026-09-12`). 처방 = 한 토큰 추가:
9
+ `crossfamily: panel(codex) — residency=CLEAN(files=3) · evidence=SHARED(same staged diff to both) · …`
10
+ ② `standpoint:` 의 `tier2`/`tier2b`/`tier3` grounds 검사가 **advisory → 차단**
11
+ (`STANDPOINT_GROUNDS_GRACE_DATE=2026-09-12`). 처방 = 돌린 **명령과 본 출력을 명명**하거나,
12
+ 실행을 안 했으면 정직하게 `tier1b`(grounds 미검사)로 내린다.
13
+ 🟥 **소비자 install 도 같다** — 설치된 훅은 그 레포의 마커를 같은 기준으로 본다.
14
+
15
+ **왜 지금인가 — 근거가 내부 관찰에서 외부 실측으로 바뀌었다.** `arXiv:2609.10969`
16
+ (*Engineering Reliable Commit Gates for Agentic AI: Cost-Aware Verification Portfolios under
17
+ Common-Mode Data Failures*, 2026-09-10, cs.SE)이 탈상관 두 축을 **고정 호출예산 2×2**로 분리해
18
+ 48 템플릿 · **2,880 시나리오**에서 쟀다: 「같은 증거를 읽는 교차-모델 투표」는 위험 제안의 **62.9 %**
19
+ 를 승인하고 「독립 출처」는 **22.9 %** — 출처 효과 **40.9 %p** 대 모델 다양성 **11.3 %p**, **3.6 배**.
20
+ 즉 FH 가 **하드 차단하던 축이 약한 쪽**이었고, 강한 쪽의 grounds 는 advisory 였다. 그 불균형을 뒤집는다.
21
+
22
+ **`SHARED` 는 합법이다.** 결함은 «같은 diff 를 읽은 패널» 이 틀렸다는 것이 아니라 그 사실이 **기록에
23
+ 적힐 수 없었다**는 것 — 그런 런이 이 enum 의 가장 강한 값으로 남았다. 차단되는 것은: 어느 쪽인지 안
24
+ 적은 `panel(...)` · 닫힌 셋 밖의 값 · 형식 위반/중복 토큰 · `SHARED`/`MIXED` 의 공허한 본문
25
+ (`INDEPENDENT` 는 자기서술적이라 본문 검사 없음 — 정직한 답을 과차단하면 override 를 훈련시킨다).
26
+
27
+ 🟥 **막는 것은 «기록의 형태» 이고 «진위» 가 아니다.** 저자가 명령을 명명했는지는 기록의 속성이지만,
28
+ 그 실행이 진짜였는지는 이 게이트가 보지 않는다 — §Mechanization Boundary 가 사람에게 남긴 의도된 잔여다.
29
+
30
+ **함께 — 도구 쪽 정직성 (`auto-decorrelation` Step 4.6 신설).** 🟥 **이 스킬의 기본형이 곧 약한 팔이다**:
31
+ Step 4 가 payload 하나를 만들어 팬아웃하므로 평범하게 돌린 패널은 구조적으로 62.9 % 팔이다. 그 사실을
32
+ 스킬 본문에 적고, 토큰 값을 «의도가 아니라 실제 디스패치 형태로» 정하게 했다. **독립 출처 모드는 없다** —
33
+ 비용 구조·residency 경계·«독립» 의 정의가 전부 미결이라 설계 문제로 이름만 남겼다
34
+ (`tracks/_meta/fh_signal_2026-09-12_independent-source-axis.md`, CHAMBER-CANDIDATE).
35
+
36
+ **frontier-digest — 목록 경로의 ID↔제목 짝짓기.** 429 폴백 경로에서 **위치로 짝지으면 안 된다**:
37
+ 2026-09-12 실측에 목록이 **ID 51개 · 제목 50개**를 내서 두 병렬 추출이 중간부터 밀렸고, 그 뒤 짝은
38
+ **형식은 멀쩩한데 전부 틀렸다**(`2609.10550` 외 2건). 한 항목을 **한 단위로** 읽고, 그게 확인되기 전까지
39
+ **항목별 `abs/{id}` 재해소가 의무**이며 제목 불일치는 **버린다**. 훅은 없다(파싱이 세션 안에서 일어난다).
40
+
41
+ 🟥 **이 게이트의 초판이 여섯 군데 틀렸고, 다른 계열이 그걸 찾았다 (자력 적발 0).**
42
+ 같은 diff 를 `agy`(gemini-3.8-flash-high)에 보냈고 여섯 건 전부 **실행 프로브로 재현한 뒤** 고쳤다.
43
+ 방향이 중요하다 — **넷은 과차단**이었다. 새 게이트가 advisory 가 아니라 차단이 된 순간, 과차단은
44
+ 경고 한 줄이 아니라 `--no-verify` 를 훈련시키는 결함이 된다:
45
+
46
+ | # | 부류 | 초판 동작 | 수리 |
47
+ |:-:|---|---|---|
48
+ | ① | **과차단 S** | `evidence=MIXED(codex(diff), gemini(repo))` 의 본문이 안쪽 `)` 에서 잘려 «공허» 로 판정 → 정당한 기록 하드 차단 | 중첩 **한 겹** 허용(두 겹은 여전히 형식 위반) |
49
+ | ② | **fail-open S** | `evidence=INDEPENDENT()` 와 `INDEPENDENT(<what>)` 가 **통과** — «길이 미검사» 를 «본문 없어도 됨» 으로 접었다 | 빈 본문·자리표시자는 **세 값 모두** 차단, 길이 바만 SHARED/MIXED |
50
+ | ③ | **과차단 S** | `standpoint:` 키워드에 뒤따르는 공백이 박혀 `cargo check` · `python scripts/eval.py` · `ran: ./ci.sh` 가 전부 차단 | 경계를 비-알파벳으로 + 흔한 러너 추가 + `30/30`·`rc=`·`./path` 도 실행 증거로 |
51
+ | ④ | **fail-open S** | `EVIDENCE_TOKEN_GRACE_DATE` 미주입 시 grace 가 **조용히 꺼져** pre-grace 마커를 전부 차단 | 상수를 mdate 검사 **앞에서** `:?` 로 평가 → 크게 죽는다 |
52
+ | ⑤ | **fail-open A** | pre-grace 마커의 `evidence=PARTIAL(...)` 이 조용히 통과 | 부재는 면제, **오작성은 면제 아님**(residency 와 같은 약속) |
53
+ | ⑦ | **과차단 A** | `wc -w` 가 `same-diff` 도 `동일diff` 도 1 낱말로 세어 정당한 **한국어** 기록을 차단 | 길이 바를 **문자 수**로 |
54
+
55
+ ⑥(가드 단축평가 — `[ -n "$mdate" ] && [ ... ${VAR:?} ]` 에서 mdate 가 비면 `:?` 가 **아예 안 돈다**)도
56
+ 같이 고쳤다. 🟥 **가드가 있다고 적어두고 안 도는 것은 장식이다**(`[[feedback_anchor_can_be_decorative]]`).
57
+
58
+ **레인**: `test_marker_crossfamily_lanes.sh` **82 픽스처**(신규 `e1`–`e15`, 위 여섯 건이 각각 컨트롤과 짝) ·
59
+ `test_marker_standpoint_lanes.sh` `N8`~`N8i`. 되돌림 프로브 두 종 — evidence 요구를 떼면
60
+ **정확히 6개**(e1·e5·e6·e7·e8·e8c)만 적색, standpoint 차단을 떼면 **N8 하나만** 적색.
61
+ 🟥 두 레인 러너가 새 grace 상수를 주입하지 않으면 기존 픽스처가 통째로 오판하는 자리였다(standpoint 쪽은
62
+ 실제로 깨졌다) — 러너에 주입을 넣고, 훅에는 `:?` 가드를 박아 부분 추출이 **조용히 통과하지 않게** 했다.
63
+
64
+ ### [3.3.0] — 2026-09-12 — 짝지음(paired) 측정: 한 round-1 을 두 분기가 나눠 먹는다
65
+
66
+ **① 새 자산 — `--r1-only` · `--reuse-r1 <dir>` (`finding_fleet.sh` · `finding_pipeline.sh`).**
67
+ round-1 을 **한 번** 돌려 두고, 그 **같은** round-1 에서 round-2 를 두 번 갈라 돌린다
68
+ (`--reuse-r1 <dir> --round2` / `--round2-blind`). 왜 필요했나: «round-2 에서 상대 계열의 목록을
69
+ 보여주는가» 를 A/B 하려고 두 팔을 독립 실행했더니 **round-1 기저부터 달랐다**(146 vs 136, 7.4 %) —
70
+ 즉 한 변수 비교가 아니었다. 이 플래그들은 그 교란을 설득이 아니라 **설계**로 없앤다.
71
+ 부수 효과로 더 싸다 — round-1 을 두 번 돌리지 않는다(멤버콜 −25 %).
72
+
73
+ 기계 보증(레인 `test_finding_pipeline_lanes.sh` L115~L124, 122 → **132**):
74
+ 두 분기의 `findings_r1.jsonl` 이 공유 소스와 **바이트 동일** · 파이프라인이 r1 **sha256** 을 두 분기
75
+ 로그에 찍어 사후 대조 가능 · **빈 r1 재사용 거부**(미측정을 0 으로 렌더하지 않는다) · 옛 round-2
76
+ 잔재 제거 · 소스==out 거부 · `--reuse-r1` 단독 거부 · `--r1-only` 은 검증을 안 돌리므로 **씨앗 선언을
77
+ 거부**한다(선언된 컨트롤이 돈 적 없이 «통과» 로 읽히는 것을 막는다).
78
+
79
+ **② fail-open 수리 (`--r1-only`, cross-family 적발).** `--r1-only` 이 **빈 round-1 을 «사용 가능»
80
+ 으로 통과**시켰다. 기전: `grep -c . f || echo 0` 은 빈 파일에서 «`0` 을 찍고 rc=1» 이라 폴백이 줄을
81
+ 하나 더 붙여 `_n1="0\n0"` 이 되고, `[ "$_n1" -eq 0 ]` 이 **구문오류로 거짓**이 되어 `R1_UNUSABLE`
82
+ 분기를 건너뛴다. ⚠️ **새 경로라 종전 동작 변화는 없다** — 기존 팔(플래그 미사용)의 경로는 불변이고
83
+ 레인 122개가 그대로 통과한다. 질문은 «폴백을 붙였나» 가 아니라 **«실패 시 stdout 이 비는가»** 다.
84
+
85
+ **③ 출하 누락 수리 — `plugins/fh-commons/README.md` 를 `files[]` 에 명시.** npm 11 은 중첩 README 를
86
+ 암묵 포함했는데 **npm 12 는 뺀다**(실측: `npx npm@latest pack --dry-run` 에서 0건). 발행 경로가
87
+ npm@latest 이므로 그대로 두면 3.2.0 에서 이미 빠져 나갔을 파일이다.
88
+
89
+ **자릿수 근거**: 새 capability **instance** 가 아니라 새 플래그 둘 + 레인 10 + 출하 파일 1 —
90
+ §Version-Digit-Policy 의 minor(새 자산 · 새 게이트 레인)다. **`BREAKING (gate):` 없음** — 소비자의
91
+ 게이트 수용을 깨지 않는다(새 플래그는 opt-in, 기존 호출 경로 불변).
92
+
93
+ **④ harness-pr-reviewer (개명 + Axis 2·3 의무 배선) — 이 릴리스가 싣는다.**
94
+ - **RENAME** `hub-cc-pr-reviewer` → `harness-pr-reviewer` (운영자 결정 2026-09-12): 실제 쓰임이 «현장 하네스가 자기 PR 을 FH 리뷰 능력으로 검증하는 standalone 창구» 라서. 옛 이름 발화·참조는 그대로 라우팅(별칭), 리다이렉트 스텁 없음(phantom-quench 선례).
95
+ - Step 3.5 «Axis 2·3 의무 디스패치 레인» — 트리거 3항(8-matrix ❌ · load-bearing 경로 grep · 머지 권고 요청)을 PR 에서 계산, Axis 2 = auto-decorrelation 재사용 + `crossfamily:` 닫힌 enum, Axis 3 = phantom-quench(N/A 는 `--name-only` 로), 판정형 질문 reps≥3. Self-Catch 는 «판정이 아니라 cue». 플로어 sim: 현행 0/3 → 수정 3/3 (pmh-dev #77).
96
+
97
+ **⑤ `gate_shape_scan.sh` 여러 줄 docstring 안쪽 오탐 수리 + 판정형 질문 reps≥3 교리** (pmh-dev #76 역수확, #699): `"""`/`'''` 짝 상태를 추적해 docstring 내부를 판정 어휘 스캔에서 뺀다(selftest 8 → 10, 레인 9 → 11, L8b 되돌림 프로브 포함).
3
98
  ### [3.2.0] — 2026-09-09 — 판정 파이프라인이 실제로 돌고, 축에 이름이 붙었다
4
99
 
5
100
  **BREAKING (gate):** `scripts/**/*.py` 가 이제 HEAVY 다 — 마커 없는 파이썬 단독 커밋이 막힌다.