@chrono-meta/fh-gate 1.4.95 → 1.4.97

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 (76) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/AGENTS.md +18 -0
  3. package/CHEATSHEET.md +1 -1
  4. package/CLAUDE.md +11 -4
  5. package/README.md +19 -0
  6. package/knowledge/shared/harness-core/fh_detail_protocols.md +12 -0
  7. package/knowledge/shared/harness-core/ship_readiness_gate.md +7 -4
  8. package/knowledge/shared/learnings/subagent_invocations_log.yaml +113 -1
  9. package/package.json +10 -2
  10. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  11. package/plugins/fh-commons/agents/quench-challenger.md +49 -23
  12. package/plugins/fh-commons/skills/convergence-loop/SKILL.md +14 -0
  13. package/plugins/fh-commons/skills/deliberation/SKILL.md +14 -0
  14. package/plugins/fh-commons/skills/mcp-circuit-breaker/SKILL.md +10 -1
  15. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  16. package/plugins/fh-meta/CHANGELOG.md +36 -0
  17. package/plugins/fh-meta/agents/beginner.md +4 -1
  18. package/plugins/fh-meta/agents/challenger.md +7 -1
  19. package/plugins/fh-meta/agents/expert.md +1 -1
  20. package/plugins/fh-meta/agents/fact-checker.md +7 -1
  21. package/plugins/fh-meta/agents/hub-persona-auditor.md +2 -1
  22. package/plugins/fh-meta/agents/main-player.md +4 -1
  23. package/plugins/fh-meta/agents/persona-innovator.md +10 -2
  24. package/plugins/fh-meta/skills/agent-composer/SKILL.md +2 -2
  25. package/plugins/fh-meta/skills/apex-review/SKILL.md +5 -0
  26. package/plugins/fh-meta/skills/asset-placement-gate/SKILL.md +38 -8
  27. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +16 -2
  28. package/plugins/fh-meta/skills/context-doctor/SKILL_detail.md +45 -10
  29. package/plugins/fh-meta/skills/corpus-grounding-expander/SKILL.md +14 -5
  30. package/plugins/fh-meta/skills/cross-ecosystem-synergy-detection/SKILL.md +93 -30
  31. package/plugins/fh-meta/skills/deep-clarify/SKILL.md +28 -9
  32. package/plugins/fh-meta/skills/fh/SKILL.md +4 -0
  33. package/plugins/fh-meta/skills/frontier-digest/SKILL.md +64 -8
  34. package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +20 -7
  35. package/plugins/fh-meta/skills/goal-quench/SKILL.md +48 -15
  36. package/plugins/fh-meta/skills/goal-quench/SKILL_detail.md +58 -11
  37. package/plugins/fh-meta/skills/harness-doctor/SKILL_detail.md +109 -33
  38. package/plugins/fh-meta/skills/harvest-loop/SKILL.md +6 -1
  39. package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL.md +126 -17
  40. package/plugins/fh-meta/skills/install-doctor/SKILL.md +50 -14
  41. package/plugins/fh-meta/skills/install-wizard/SKILL.md +26 -7
  42. package/plugins/fh-meta/skills/install-wizard/SKILL_detail.md +68 -21
  43. package/plugins/fh-meta/skills/memory-hygiene/SKILL.md +64 -17
  44. package/plugins/fh-meta/skills/meta-prompt-builder/SKILL.md +38 -4
  45. package/plugins/fh-meta/skills/persona-roster-expander/SKILL.md +15 -7
  46. package/plugins/fh-meta/skills/plugin-recommender/SKILL.md +39 -11
  47. package/plugins/fh-meta/skills/plugin-recommender/SKILL_detail.md +24 -7
  48. package/plugins/fh-meta/skills/prompt-regression/SKILL.md +54 -11
  49. package/plugins/fh-meta/skills/salience-splitter/SKILL.md +120 -7
  50. package/plugins/fh-meta/skills/salience-splitter/SKILL_detail.md +46 -13
  51. package/plugins/fh-meta/skills/sim-conductor/SKILL_detail.md +28 -3
  52. package/plugins/fh-meta/skills/steel-quench/SKILL.md +3 -1
  53. package/plugins/fh-meta/skills/verify-bidirectional/SKILL.md +72 -14
  54. package/scripts/compaction_probe.sh +153 -10
  55. package/scripts/consent_registry_check.sh +63 -0
  56. package/scripts/count_check.sh +47 -1
  57. package/scripts/degrade_direction_scan.sh +276 -6
  58. package/scripts/degrade_probe_capability.sh +105 -0
  59. package/scripts/lane_runner_check.sh +425 -0
  60. package/scripts/package_coverage_check.sh +190 -35
  61. package/scripts/psa_probe_capability.sh +78 -0
  62. package/scripts/psa_scan_lib.sh +164 -0
  63. package/scripts/public_surface_scan_files.sh +38 -0
  64. package/scripts/selfcheck.sh +346 -28
  65. package/scripts/test_capability_entrypoint_shipping.sh +132 -0
  66. package/scripts/test_consent_registry.sh +54 -0
  67. package/scripts/test_count_check_readme_format_lanes.sh +75 -0
  68. package/scripts/test_degrade_scan_shell_probes.sh +415 -0
  69. package/scripts/test_marker_crossfamily_lanes.sh +10 -1
  70. package/scripts/test_marker_floor_lanes.sh +25 -1
  71. package/scripts/test_psa_singlefile_lanes.sh +288 -0
  72. package/scripts/test_reviewer_capability_conformance.sh +10 -1
  73. package/scripts/test_selfcheck_state_lanes.sh +173 -0
  74. package/scripts/validate_yaml.sh +146 -0
  75. package/templates/degrade_direction_scan.sh +276 -6
  76. package/templates/goal-quench-settings-merged.json +30 -0
@@ -11,13 +11,13 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "1.4.95",
14
+ "version": "1.4.97",
15
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.",
16
16
  "source": "./plugins/fh-meta"
17
17
  },
18
18
  {
19
19
  "name": "fh-commons",
20
- "version": "1.4.95",
20
+ "version": "1.4.97",
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
@@ -33,6 +33,15 @@ operations or steel-quench.
33
33
 
34
34
  Machine-readable mirror: `.claude/registry/agent_cards.json`.
35
35
 
36
+ > **Agent frontmatter must be valid YAML — and this bites non-Claude runtimes hardest.** Claude Code's
37
+ > loader is lenient (it accepted an unquoted `description:` containing `": "`); a strict YAML parser
38
+ > does not, and then **every key below the bad line is silently dropped** — including `tools:` and any
39
+ > `model:` floor. Measured 2026-08-11: one agent's multi-line unquoted `description` (with `user:` /
40
+ > `assistant:` lines inside it) invalidated its declared `tools: Read, Grep, Glob` and its `model: opus`
41
+ > floor; the agent ran with all tools and no pin. Keep `description:` to **one quoted line** and put
42
+ > examples in the body. `bash scripts/validate_yaml.sh` now covers `plugins/*/agents/*.md` as well as
43
+ > skills, and reports a zero-file scan as an instrument error rather than a pass.
44
+
36
45
  ### Tool restrictions
37
46
 
38
47
  | Agent | Allowed tools |
@@ -42,6 +51,15 @@ Machine-readable mirror: `.claude/registry/agent_cards.json`.
42
51
  | `hub-persona-auditor` | Read, Grep, Glob |
43
52
  | `quench-challenger` | Read, Grep, Glob |
44
53
  | `persona-innovator` | Read, Grep, Glob, WebSearch, WebFetch |
54
+ | `beginner` | Read |
55
+ | `main-player` | Read, Grep, Glob |
56
+ | `expert` | Read, WebSearch, WebFetch |
57
+
58
+ The table is the whole roster — all eight agents above appear here. *Three were missing until
59
+ 2026-08-11; the omission read as "unrestricted" to anyone checking this page, which is the wrong
60
+ default for a table whose subject is restriction.* Cross-check with the files themselves rather
61
+ than trusting either side alone: the same audit found `challenger` documented here with a tool set
62
+ its file never declared at all.
45
63
 
46
64
  ## Runtime Boundaries
47
65
 
package/CHEATSHEET.md CHANGED
@@ -161,7 +161,7 @@ echo '.claude/agents/' >> <project>/.git/info/exclude
161
161
 
162
162
  ```bash
163
163
  # Copy only the agents you need to your project
164
- cp <harness-root>/.claude/agents/fact-checker.md <my-project>/.claude/agents/
164
+ cp <harness-root>/plugins/fh-meta/agents/fact-checker.md <my-project>/.claude/agents/
165
165
  ```
166
166
 
167
167
  Copy just 1 agent without plugin install and it's immediately callable. Updates require manual re-copy.
package/CLAUDE.md CHANGED
@@ -254,9 +254,16 @@ into muscle memory and disarm it.
254
254
  > `required_pull_request_reviews` present with `enforce_admins: true` — not something
255
255
  > `required_status_checks` says anything about.
256
256
  > ⚠️ A *different* residual on `main` is still real and must not be folded into the one just
257
- > retracted: `required_status_checks.contexts` is `[]` pushes are routed through PRs by the fields
258
- > just named, but **no check is required to be green** for one to merge (named again in the 4-axis
259
- > section below).
257
+ > retracted but the residual's own description was itself stale and needed correction on
258
+ > 2026-08-12 (live re-check, `[[reference_github_protection_two_layers]]`): legacy
259
+ > `required_status_checks.contexts` is **`["validate"]`**, not `[]` — a green `validate` check IS
260
+ > required before a PR can merge, and `GET /rules/branches/main` carries no competing
261
+ > `required_status_checks` rule, so the legacy field is the effective one here. `validate`
262
+ > (`.github/workflows/validate.yml`) is a **separate job from Axis 1** (`regression-guard.yml`) —
263
+ > Axis 1 is still not required, see the 4-axis section below. The gap on `validate` is
264
+ > `strict: false`: that check re-runs on every push to the PR branch, but nothing re-forces it
265
+ > against a **moving** main after it last ran — so a check that passed can still land behind
266
+ > concurrent merges it never saw.
260
267
 
261
268
  ## Permission-Denial Guidance (When Auto-Mode Blocks an Action)
262
269
 
@@ -324,7 +331,7 @@ Every new `SKILL.md` must clear a **6-item bar** (role-duplication via `/asset-p
324
331
 
325
332
  **FH 자산을 수정하면**(SKILL.md · **SKILL_detail.md** · `.claude/rules/*.md` · `knowledge/shared/rules/*.md` · `templates/` · `CLAUDE.md` · substantive `knowledge/`·`docs/*.md` · `AGENTS.md` · **`scripts/**/*.sh`** · **에이전트 정의**(`plugins/*/agents/**/*.md` · `.claude/agents/**/*.md`)) **4축 검증 체인이 그 세션 첫 커밋 전에 자동 실행된다.** 사용자 요청 불요 — 제안이 아니라 의무 단계다.
326
333
 
327
- **기계층 — 무엇이 실제로 막는지 나눠서 말한다(2026-08-04 실측).** `git commit` 은 `templates/.git-hooks/pre-commit` 이 **하드 차단**한다: 축이 전부 PASS 할 때까지 커밋이 안 되고, 아래 상세가 로드되지 않아도 훅이 막는다 — 이 산문은 훅 위의 살리언스 층이지 유일 floor 가 아니다. 다만 **훅은 클라이언트측이고 `--no-verify` 로 우회된다**(§Integration branch 가 이미 그렇게 말한다 — 두 곳이 어긋나 보이던 것을 여기서 맞춘다). **그리고 서버측이 이걸 받쳐주지 않는다**: `main` 은 `enforce_admins: true` 로 **푸시 경로**(PR 경유)를 강제하지만 `required_status_checks.contexts` **비어 있다** — Axis 1 워크플로가 PR 에서 돌긴 해도 **필수 체크가 아니라 빨간 채로도 머지가 된다.** 즉 서버가 강제하는 건 *어디로 들어오는가*지 *내용이 검증됐는가*가 아니다. Axes 2–3(마커)·Axis 4(매니페스트)는 그 파일들이 `tracks/**` 로 gitignored 라 CI 가 **구조적으로 볼 수조차 없다**. 정직한 표현은 "하드 차단"이 아니라 **"가용한 가장 강한 층"**이다. **미해결 잔여**: 필수 체크 0개 켜는 운영자 결정이다(막 flaky 레인을 하나 기록한 참이라, 과차단이 override 를 습관화시키는 쪽으로 기울 수 있다).
334
+ **기계층 — 무엇이 실제로 막는지 나눠서 말한다(2026-08-04 실측).** `git commit` 은 `templates/.git-hooks/pre-commit` 이 **하드 차단**한다: 축이 전부 PASS 할 때까지 커밋이 안 되고, 아래 상세가 로드되지 않아도 훅이 막는다 — 이 산문은 훅 위의 살리언스 층이지 유일 floor 가 아니다. 다만 **훅은 클라이언트측이고 `--no-verify` 로 우회된다**(§Integration branch 가 이미 그렇게 말한다 — 두 곳이 어긋나 보이던 것을 여기서 맞춘다). **그리고 서버측 검증엔 남은 잔여가 있다(2026-08-12 재확인 — `contexts=[]` 서술은 stale, 정정됨)**: `main` 은 `enforce_admins: true` 로 **푸시 경로**(PR 경유)를 강제하고, legacy `required_status_checks.contexts` **`["validate"]`** `validate` 잡(`.github/workflows/validate.yml`, 메타데이터·`selfcheck.sh` 배선 레인)이 실제 **필수 체크**다. ⚠️ **`validate` 는 Axis 1 이 아니다** — Axis 1(`regression-guard.yml` `templates/regression_guard.sh`)은 여전히 필수 체크가 **아니고**, 그 워크플로의 `paths:` 필터가 `SKILL.md`·`.claude/rules/*.md`·`CLAUDE.md`·`templates/*.md` 만 보므로 이 절이 4축 대상으로 나열한 `knowledge/shared/rules/*.md`·`docs/*.md`·`AGENTS.md`·`scripts/**/*.sh`·에이전트 정의·`SKILL_detail.md` 만 바뀐 PR 에는 **Axis 1 자체가 돌지도 않는다**. `validate` 쪽 남은 갭은 `strict: false`: 그 체크는 PR 브랜치에 푸시할 때마다 재실행되지만(오픈 시점 한정이 아니다), 그 뒤 main 이 움직여도 재검증을 강제하지 않으므로 **초록으로 남아 있는 체크가 실제로 병합되는 최신 트리를 적이 없을 수 있다.** 즉 서버가 강제하는 건 *체크가 초록인가*지 *그 체크가 지금의 main 을 봤는가*가 아니다. Axes 2–3(마커)·Axis 4(매니페스트)는 그 파일들이 `tracks/**` 로 gitignored 라 CI 가 **구조적으로 볼 수조차 없다**. 정직한 표현은 "하드 차단"이 아니라 **"가용한 가장 강한 층"**이다. **미해결 잔여**: `strict` 를 켜는 것도, Axis 1 을 필수 체크로 걸거나 `paths:` 넓히는 것도 운영자 결정이다(막 flaky 레인을 하나 기록한 참이라, 과차단이 override 를 습관화시키는 쪽으로 기울 수 있다).
328
335
 
329
336
  > **상세 정본**: `.claude/rules/fh_4axis_gate.md` — 4축 정의·마커 필수 필드·경량 예외·substantive carve-out·target-tier sim 게이트·Mode D 모델 공지·cross-family 보완. **`paths:` 로 *일부* FH 자산 경로에 스코핑돼 있어 그 파일들을 *읽을 때* 자동 로드된다 — 로드 조건이지 게이트 적용 범위가 아니다** (공식 트리거는 read — `code.claude.com/docs/en/memory.md` §Path-specific rules).
330
337
  > (2026-07-20 분리. **파일 char 실측**: 이 절 자체가 76,706자 중 **10,331자(13.5%)**로 단일 최대였다. 그 분리 + 같은 세션의 중복 3건 제거 + New-Skill 게이트 편입까지 **합산**해 파일은 **76,706 → 67,611 (순감 9,095자, 11.9%)** — 합산치이지 이 절 하나의 성과가 아니다 — 이건 파일 크기지 `/context` 상주 실측이 아니다(계기≠대상, [[feedback_resident_memory_measured_fresh_toplevel]]: 상주는 톱레벨 새 세션 `/context` 로만 잰다 — 미측정). 트리거가 *파일*이고 *기계 백스톱*이 있어 1순위 후보였다. 같은 이유로 **비가역 게이트 3종은 이동 불가** — 의도 트리거라 경로 스코핑하면 fail-open 이 된다.)
package/README.md CHANGED
@@ -56,6 +56,25 @@
56
56
 
57
57
  **Prerequisite**: Claude Code CLI — verify with `claude --version`
58
58
 
59
+ <details><summary><b>Optional: one gate needs Python + PyYAML</b> — <code>npm test</code> is red without it</summary>
60
+
61
+ The consent-registry gate parses YAML, and it **fails closed** when it cannot — correctly, since an
62
+ unvalidated consent record must not read as a clean one. But that fail-closed turns the whole of
63
+ `npm test` (and `prepublishOnly`) red on a machine without PyYAML, and until 2026-08-12 the
64
+ requirement was written down **nowhere**:
65
+
66
+ ```bash
67
+ python3 -m pip install --user pyyaml # verify: python3 -c 'import yaml; print(yaml.__version__)'
68
+ ```
69
+
70
+ Why this is called out rather than left implicit: a release once shipped green from a session whose
71
+ `python3` happened to resolve to an **unrelated project's virtualenv** that had PyYAML, while the
72
+ machine's own `python3` did not. The gate was never bypassed — it passed, and the pass simply was not
73
+ portable. Every verdict from that gate now prints the interpreter and PyYAML version it used, so a
74
+ green states what produced it instead of leaving the reader to assume.
75
+
76
+ </details>
77
+
59
78
  ```bash
60
79
  # 1. Install the plugin
61
80
  claude plugin marketplace add https://github.com/chrono-meta/forge-harness.git
@@ -224,6 +224,18 @@ FH에서 발화 문구·규약 파일명을 **추가하거나 바꾸는 변경
224
224
  갈림 판별 기준: **사용자-대면 발화이거나 게이트가 찾는 파일명이면 remap 대상, 환경변수·훅
225
225
  스크립트명·npm bin 같은 기계 결합 이름은 불변**(변환하면 파손된다).
226
226
 
227
+ ⚠️ **「게이트가 찾는」이 두 뜻으로 읽힌다 — 기계적으로 가른다** (pmh-dev #54 보류 2건 판정이
228
+ 이 구분을 요구했다). 「찾는다」가 *런타임 탐색*인지 *정적 참조*인지가 판정을 뒤집는다:
229
+
230
+ | 「찾는」의 종류 | 판정 | 실례 | 왜 |
231
+ |---|---|---|---|
232
+ | **런타임 패턴 매칭 산물** — 검사기가 디렉토리에서 글롭/정규식으로 훑어 찾는 *산출물* 파일명 | **remap 대상** | `fh_completed_*` · `fh_signal_*` | 하류 실물이 `pmh_completed_*` 인데 검사기가 `fh_completed_*` 를 훑으면 **거짓 실패**(위 ④-log 3개월 오귀인이 그 사례) |
233
+ | **정적 경로 참조** — 스크립트가 **상수로 들고 있는** 규약/설정 파일명 | **불변(기계 결합)** | `.claude/rules/fh_4axis_gate.md` (`gate_pathspec_check.sh` 의 `CANON=` · `selfcheck.sh` · pre-commit 이 같은 경로) · `scripts/fh-gate.sh` (npm bin · 테스트가 못박은 경로) | 이름을 바꾸면 스크립트가 **대상을 못 찾아 파손**된다 |
234
+
235
+ 판별 절차(1줄): **그 이름이 코드에 리터럴 상수로 박혀 있으면 불변**, **패턴의 일부로 훑이는
236
+ 대상이면 remap**. `grep -n '<이름>' scripts/ templates/` 한 번이면 갈린다 — 상수 대입
237
+ (`X="…<이름>…"`)으로 나오면 전자, 글롭/정규식 안에 있으면 후자다.
238
+
227
239
  ### Why the greeting branch test is session files, never git history
228
240
 
229
241
  A fresh-clone Sonnet simulation rendered the **returning-user menu** to a brand-new install, because it
@@ -161,7 +161,7 @@ unchanged and keeps its own 2026-07-14 evidence).
161
161
  | ③ | 거버넌스 게이트 (governance) | ship-gate | 🟢 GREEN | pre-commit/pre-push physically block; moat measured 3–4 family blind (HITL 8/8 ABSENT); cross-family caught a real companion-store-name leak 2026-07-14 (fail-closed) |
162
162
  | ⑤ | 증폭자 (amplifier) | judgment-circuit | 🟢 GREEN | short-intent→literature-grounding→ultimate-doc real instances; rules-diet −18.2k measured; intent-routing probe 94% (below) |
163
163
  | ④ | 프런티어→조직 전파 (**🔵 RC, 2026-08-09**) | external-grounding | 🔵 RC | frontier-digest launchd auto + AX submission docs both real, but digest→org never closed as ONE pipeline. **2026-08-09**: the missing link was built — `scripts/digest_landing_check.sh` extracts the digest's candidate table into probes and reuses the existing landing checker (no second verifier). Self-test 8 lanes green. **🔵 RC (2026-08-09)**: the mtime defect that initially held it back is closed — the since-filter now splits two axes (git-tracked → commit time via `git log --since`; gitignored `tracks/**` → mtime, the only evidence that axis has; dirty-tracked → `UNMEASURED`), and **two lanes pin that split**: a file with only a fresh mtime is *not* counted, and a file with only a fresh commit *is* counted even when its mtime is stale. The second lane matters — without it the fix degenerates into "discard all tracked files so only negatives pass" (named by the cross-family reviewer). Self-test **10 lanes** green. **What remains is a named residual, not a calibration gap**: `file-change ≠ token-introduction` — a file committed after the digest may carry the token from before (closing it needs token-level diff, which does not fit the checker's interface). The instrument therefore prints, and this row states, that it is a **screener, not an adjudicator**: hits must be opened. Four real runs, four hand-verifications, four defects found |
164
- | ① | 멀티하네스 클러스터 (**🔵 RC, 2026-08-09**) | context-continuity | 🔵 RC | routing already ran for real (17 nodes, sidecar-orchestrator, Skill Bus). **The relay half is now built rather than specified**: `capability_composition_contract.md` (2026-08-02) was a complete spec with **zero implementing code** — the ① blocker was missing wiring, not missing design ([[feedback_built_but_not_wired]]). `scripts/relay_channel.sh` executes it (strictest-wins merge · typed invocation · checks 1/2/3 · short-circuit · causal binding), `scripts/test_relay_channel_lanes.sh` carries **64 lanes, BLOCK/PASS symmetric**, and three arms ran across **two real field harnesses** (pmh-dev · qasp-dev) on FH's own assets. ⭐ **The measured result is the divergence arm, and its mechanism is not what the first draft of this row said.** On `templates/.git-hooks`, `qasp` alone returns exit 0 — a single-node pass would have shipped it — and the composition returns `BLOCKED` because `pmh` returns `FINDINGS`. But `qasp`'s exit 0 is `degrade-scan: no scannable (py/sh) target files`: **zero files were scanned.** The qasp copy predates pmh's 2026-07-28 shebang pass, so extension-less hook files are invisible to it, and its exit 0 means *no target*, not *clean*. So the composition did not catch a substantive disagreement between two harnesses — it caught **a single node rendering an unmeasured surface as a pass**, which is `[[feedback_not_found_is_not_zero_family]]`, and structurally the spec's own §ⓑ.4 B1 ("the exit 0 that means I never started"). That is a *stronger* result than the first framing and a narrower one: it demonstrates the union catching a blind spot, not decorrelated judgment. **Correction also to the order claim**: both orders return `rc=2`, but in the pmh-first order the chain short-circuits at node 1 and qasp never runs — only the qasp-first order actually exercises the union. Non-decorative: reverting each wiring line reddens lanes and no reversion passes silently. **Why this is RC and not 🟢**: (a) the row's *other* half, external-harness recommend, is still parked; (b) the spec's own named gap `scripts/capability_registry_check.sh` (M1–M5 registration + M4 pair) still does not exist only the call moment is closed; (c) the two nodes are **copies of one scanner at different staleness** (all three copies — pmh 237 ln, qasp 121 ln, FH 269 ln — share a byte-identical 12-line header; the clean arm's two `out_sha` were identical), so the run proves the channel turns and that composing unequal copies has value, not that two independent judgments were decorrelated. Artifact: `tracks/_meta/identity_audit_2026-08-09_relay_channel.md` |
164
+ | ① | 멀티하네스 클러스터 (**🔵 RC, 2026-08-09**) | context-continuity | 🔵 RC | routing already ran for real (17 nodes, sidecar-orchestrator, Skill Bus). **The relay half is now built rather than specified**: `capability_composition_contract.md` (2026-08-02) was a complete spec with **zero implementing code** — the ① blocker was missing wiring, not missing design ([[feedback_built_but_not_wired]]). `scripts/relay_channel.sh` executes it (strictest-wins merge · typed invocation · checks 1/2/3 · short-circuit · causal binding), `scripts/test_relay_channel_lanes.sh` carries **64 lanes, BLOCK/PASS symmetric**, and three arms ran across **two real field harnesses** (pmh-dev · qasp-dev) on FH's own assets. ⭐ **The measured result is the divergence arm, and its mechanism is not what the first draft of this row said.** On `templates/.git-hooks`, `qasp` alone returns exit 0 — a single-node pass would have shipped it — and the composition returns `BLOCKED` because `pmh` returns `FINDINGS`. But `qasp`'s exit 0 is `degrade-scan: no scannable (py/sh) target files`: **zero files were scanned.** The qasp copy predates pmh's 2026-07-28 shebang pass, so extension-less hook files are invisible to it, and its exit 0 means *no target*, not *clean*. So the composition did not catch a substantive disagreement between two harnesses — it caught **a single node rendering an unmeasured surface as a pass**, which is `[[feedback_not_found_is_not_zero_family]]`, and structurally the spec's own §ⓑ.4 B1 ("the exit 0 that means I never started"). That is a *stronger* result than the first framing and a narrower one: it demonstrates the union catching a blind spot, not decorrelated judgment. **Correction also to the order claim**: both orders return `rc=2`, but in the pmh-first order the chain short-circuits at node 1 and qasp never runs — only the qasp-first order actually exercises the union. Non-decorative: reverting each wiring line reddens lanes and no reversion passes silently. **Why this is RC and not 🟢** — *updated 2026-08-11; (b) and (c) moved, (a) did not, and a fourth appeared*: (a) the row's *other* half, external-harness recommend, is still parked **unchanged, and it is a build, not a check**; (b) ~~`scripts/capability_registry_check.sh` does not exist~~ → **built 2026-08-11** (M1–M5 + the ran≠did-not-run clause, M4 pair executed, 7 self-test lanes BLOCK/PASS symmetric); (d) **NEW, and it cuts against the row**: a capability declaring `writes: read-only` passed all of M1–M5 and its entry point then `rm -rf`'d this repo's `scripts/`. The registration bar measures *form* and *known-pair separation*, never *whether the declaration is true* — so the machinery this row now points at carries a demonstrated structural hole (`capability_composition_contract.md §Salience`). A checker whose green can precede a destructive act is not yet a green identity; (c) ~~the two nodes are copies of one scanner at different staleness~~ → **superseded 2026-08-11, but only partly**: a run now exists across two *genuinely different* capabilities (a leak lens ∪ a verdict-direction lens — different enums, different defect classes, each blocking on its own finding), and the clean arm exercised the union end-to-end. ⚠️ **That satisfies the letter of the old (c) and not the identity's spirit: both new nodes live inside FH.** This identity is *멀티하네스 클러스터*; the only run that actually crossed harness boundaries is still the older pmh-dev/qasp-dev one, whose nodes were<a name="c-orig"></a> **copies of one scanner at different staleness** (all three copies — pmh 237 ln, qasp 121 ln, FH 269 ln — share a byte-identical 12-line header; the clean arm's two `out_sha` were identical), so the run proves the channel turns and that composing unequal copies has value, not that two independent judgments were decorrelated. Artifact: `tracks/_meta/identity_audit_2026-08-09_relay_channel.md` |
165
165
  | ② | 프로젝트 인큐베이터 (**🔵 RC, 2026-08-09**) | context-continuity + judgment-circuit | 🔵 RC | **RC 세 다리가 섰다** — (a) 구현: `chamber_run.sh` 6단계 게이트 (b) known-pair: 러너 게이트 **18 레인**(`test_chamber_run_lanes.sh`, BLOCK/PASS 대칭 — PASS arm 이 있어야 "전부 막는 게이트"도 걸린다) + 순서 증인 **16 레인**(`chamber_witness.sh`) (c) self-test 초록. **실상황 발화 대기 = formal chamber EMIT 아직 0** — 그것이 RC 가 🟢 이 아닌 이유이자 RC 정의 그 자체다. ⚠️ **그 0 의 해석이 2026-08-09 에 바뀌었다**: 지금까지 *"챔버가 엄격해서"* 로 읽었으나, KILL 된 후보 다수가 **메타-형** 이고 유일한 EMIT(`forge-wiki`)만 **필드-형** 이다 — 즉 *낳을 수 없었던* 게 아니라 **애초에 대상이 아닌 후보가 들어왔을** 가능성이 있다. 필드 ⊥ 메타 프로파일과 씨앗(precocial) 기준 정의: `harness_incubator_doctrine.md §3-a`. ⚠️ 그 분류는 **사후에 이뤄졌고 n=9** 라 가설이다 — 사전 등록 후 다음 런을 예측해야 결과가 된다. 아래 옛 판정 줄은 이력으로 남긴다 |
166
166
  | ②-old | (이력) 프로젝트 인큐베이터 | context-continuity + judgment-circuit | 🟡 PARTIAL | incubation is running — **stockbattle is being incubated now** (S1 built, mid-flight) + qasp/pmh spin-out precedent + scaffold-emit shipped (doctrine: "emit shipped today as scaffold+approval; the chamber flow is the named target"). **Corrected 2026-08-08** (the old text read "6 runs, 6 KILL … 0/6", which was stale on both counts, and the ledger itself was missing a run): hand-counted from `tracks/_chamber/INDEX.md` — **9 full runs (#2–#10), 8 KILL, 1 EMIT** (#1 is a trigger probe, not a full run). Runs #5–#6 *measured* the emit-worthiness criterion (net-new ∧ artifact-shaped ∧ real-data-precision-adequate ∧ hub-state-independent); run #6 confirmed the graduation-order principle — hub-internal proof before standalone extraction, never the reverse. **The 🟡 is now held for a different reason than before.** The old reason ("no closed emit-via-incubation yet") is false: run #9 `forge-wiki` emitted and shipped publicly under operator approval with the Pre-Publish gate passed. What is *not* proven is that the **formal chamber flow** produced it — that run's workspace holds only an `EMISSION_VERDICT.md`, with no `INTENT.md`, `BUDGET.md` or `SIM_NOTES.md`, so the intent/budget/blind-persona gates have no artifact and the verdict was written after the fact. The first run to complete the formal flow end-to-end is #10 (2026-08-08, 3 blind isolated personas) and it KILLed. So: **the identity has fired once, the mechanism has not yet been shown to be what fired it**, and the dominance result every 🟢 owes is still outstanding → 🟡 |
167
167
 
@@ -282,9 +282,12 @@ What now blocks `v1.0` is **closing the 🔵s** — RC means the mechanism stand
282
282
  walked outside:
283
283
 
284
284
  ```
285
- ① external-harness recommend (cluster-wizard, still parked) · capability_registry_check.sh
286
- (registration-moment M1–M5, named by the spec, still absent) · a run across two genuinely
287
- different capabilities rather than two forks of one scanner
285
+ ① external-harness recommend (cluster-wizard, still parked UNCHANGED 2026-08-11, and this is
286
+ the one that is a *build*, not a check) · ~~capability_registry_check.sh absent~~ BUILT
287
+ 2026-08-11 · ~~a run across two genuinely different capabilities~~ RAN 2026-08-11, but both
288
+ nodes are FH-internal — the *cross-harness* arm is still the old copies-of-one-scanner run
289
+ · NEW: the registration bar cannot verify a declared side-effect axis (`writes: read-only`
290
+ passed M1–M5, then the entry point deleted a directory)
288
291
  ② a formal chamber EMIT — the mechanism firing in a real situation, not a retrofitted verdict
289
292
  ④ file-change ≠ token-introduction — the instrument is a screener, not an adjudicator
290
293
  ```
@@ -1801,7 +1801,7 @@
1801
1801
  - date: 2026-08-11
1802
1802
  session: qasp-axready-night-autonomous
1803
1803
  agents_summary: "7 열거 + 훅 집계 9 (consolidated): ① Explore 필드 정본 읽기(MTM/2막 계약/발화 자격) ② Explore 데이터-플레인 오라클 삽입지점 설계(bg) ③ codex gpt-5.5 1R (야간 5커밋 diff 적대 감사) ④ fh-meta:beginner 콜드리드 1차(기술문서 삽입 초안) ⑤ general-purpose 독립 2차 지각 QA(PDF 8쪽, 200dpi 크롭) ⑥ fh-meta:beginner 콜드리드 2차(수리본 재검 — 1차 후 고친 것을 다시 읽힌 라운드) ⑦ general-purpose@sonnet 블라인드 sim(ko-tech-writer 보강본, 심은 결함 3종)"
1804
- dispatch_count: 9
1804
+ dispatch_count: 13
1805
1805
  dispatch_count_note: "훅 집계 9 · 내가 이름으로 열거 가능한 것 7. 차이 2건은 귀속 미상이라 지어내지 않는다 — 세션 로그를 뒤져 채우는 대신 미상으로 남긴다(없는 엔트리를 만드는 것이 빠진 엔트리보다 나쁘다). 초판은 3으로 적혀 있었고 마감 체크 ④-e 가 9를 찍어 드러났다."
1806
1806
  outcome: accepted
1807
1807
  evidence: "④⑤⑥ 는 기술문서 축(같은 세션 후속) — ⑥ 이 **1차 콜드리드 수리본을 다시 읽힌 라운드**이고 거기서 «반례 흔한 단정 + 배치 오류» 가 나와 §7→§6 이동으로 이어졌다(그 경험이 스킬 Step 5 재콜드리드 규율의 근거다). ⑦ sim = 심은 결함 3/3 검출·오탐 0. ① 정본 Explore 가 «MTM=블박+화박 동시 실행, verdict 불변, 표기 4상태» 를 정본 인용으로 확정 — 이후 2-arm 실측(판정 51/51 동일 · mtm_cited 17)이 그 계약과 일치함을 확인하는 근거가 됐다. 일반 개념(«화이트박스 모드») 정규화를 사전 차단. ② 설계 Explore 가 relations.py 5곳·triage.py:258 닫힌 어휘·sourced 레인 선점 함정·데이터 리더 부재(known-positive 컨트롤 동반)를 특정 — 이번 세션은 그 능력을 안 지었으나(잔여 S1) 지도는 그대로 유효. ③ codex 1R: S/A/B/C 4축 반증 중 **헤드라인 반증 1건 수용** — 「품절 배지 검출」 주장이 로케일 축 오귀속임을 App.tsx/en.ts 근거로 지적, governor 가 소스 재확인 후 철회하고 attribution_risk 를 기계에 실었다(86dc8bf). 추가로 C-1(미생성 사유가 stdout 전용) 수용·수리, 잔여 4건은 명명"
@@ -1830,3 +1830,115 @@
1830
1830
  outcome: accepted
1831
1831
  evidence: "4 findings 전건 수용·수리·되돌림 검증: F3(S — `references` 가 이미 5곳에서 4의미로 쓰임(finding_id·BVA source_defect_id·StateMatrix_combo_N·조인 id·row id) → 값만 보고 finding 해석 시 SM/BVA TC 오귀속, 감사자가 함수 실행으로 /orders 주입 재현 → reference_kind 선언 자격) · F2(S — sibling 위반은 행 쌍인데 조인이 첫 행에서 break, row1=/customers·row2=/orders 가 /customers 로 결박 → distinct 2+ 면 scalar 비움) · F1(S — 저신뢰 AREA_LABEL 이 선언된 유래를 이김 → 유예+충돌 typed, 유예가 좌표 손실이면 후퇴라 복원 경로 동반) · F4(M — 색인 raw / 소비 strip 불일치로 'dup'/'dup ' 미검출). 수리 4건 **각각 되돌려 정확히 그 앵커 1개씩 적색** 확인 후 커밋. 재생성 무회귀(app_id 40/51 · basis 분포 동일) · 전량 2,819 passed"
1832
1832
  notes: "감사자가 «일반 import 는 fitz/docx 부재로 막혀 P7·surface_inventory 를 직접 로드해 함수 단위로 확인» 이라고 **계기 한계를 스스로 명시**했다. 자체 적발 1건 — F3 게이트가 F 계열의 정당한 직결까지 막아 app_id 40→39(자격 게이트 도입은 기존 통과 경로에도 선언을 요구한다는 표준 회귀). peer 세션(로컬 다른 축)이 같은 라운드에 **두 축을 더** 잡았다: ⓐ 내 신규 앵커가 장식(생산자 배선 되돌려도 16 전건 초록 — 호출부 우회) ⓑ DISPLAY_MAPPING 의 case-insensitive 부분수리 함정(en.ts 직독 확인: 6종 중 5종만 통과). ★**갈림의 원인은 계열이 아니라 «무엇을 받았느냐» 다**(peer 정정 수용): codex 에게는 **diff** 를 줬고 → 코드 경로 결함 4건, peer 에게는 **내 보고서(주장)** 가 갔고 → 장치·주장 결함 4건. 계열이 같아도 diff 를 받았으면 같은 것을 봤을 것이다. 재사용 가능한 형태는 «탈상관 축은 누가 보느냐만이 아니라 **무엇을 받느냐**» — 적대검증을 아무리 붙여도 **전부 diff 를 주면 주장 축은 계속 빈다**([[feedback_grounding_audit_of_own_record]] 와 같은 축). peer 도 그 넷을 설계해서 잡은 게 아니라 **주장을 읽는 채널에 있었기 때문**이라고 자기 몫을 정직하게 낮췄다 — «피어 세션은 장치 결함을 잡는다» 가 아니라 «**주장을 받은 쪽**이 장치 결함을 잡는다» 가 맞는 모델이고, 그 차이가 다음에 누구에게 무엇을 보낼지를 바꾼다. 🟥**적발 비율을 지표로 읽지 마라**: 이 세션은 자력 1 · 외부 8 인데 그 8 = **codex(diff) 4 + peer(주장) 4** — 즉 «내가 못 봤다» 가 아니라 «**두 축을 열었다**» 다. 분모(어떤 채널을 몇 개 붙였나)를 안 적으면 리뷰를 많이 붙일수록 자력 비율이 나빠 보이고, 그 수를 성과로 읽는 순간 최적해가 «리뷰를 덜 붙이는 것» 이 된다(peer 지적). 채널을 같이 적어야 위의 «무엇을 받았느냐» 구분이 그 숫자 안에서 다시 접히지 않는다"
1833
+
1834
+ - date: 2026-08-11
1835
+ session: reship-campaign-stier-and-security
1836
+ agents_summary: "4 dispatches: fh-meta:challenger×3 (S티어 9종 병렬 적대검토 — 배치1 synergy/deep-clarify/memory-hygiene · 배치2 frontier-digest/hub-cc-pr-reviewer/plugin-recommender · 배치3 salience-splitter/corpus/persona) + fh-meta:challenger×1 (v1.4.95 배포 직전 Pre-Publish 게이트 ③ 코드 보안 패스, foreground)"
1837
+ dispatch_count: 4
1838
+ outcome: accepted
1839
+ evidence: "S티어 M급 25건+ 회수, governor spot-check 5/5 CONFIRMED(claude mcp search 부재 · marketplace add 인자 불일치 · 인용 memory 8/8 부재 · enforce_admins stale · digests/ 부재 — 각 판정에 known-positive 컨트롤 동반). 보안 패스는 A급 4건 회수, **그중 3건이 그 릴리스 신규 코드**: 내가 새로 넣은 pair-allowlist 가 `.*` 한 줄로 담요 뮤트였고 주석은 «불가능»이라 적혀 있었다. 감사자가 known-pair 로 실증했고, 내 1차 수리(정규식 앵커)도 `^(.*)$` 라 여전히 뚫려 리터럴 비교로 3판 만에 폐쇄. 1순위 4건은 #344 로 머지, 나머지 21건+ 는 원장 우선순위표로 이월"
1840
+ notes: "★배치3 이 이 캠페인 최대 발견을 냈다 — **salience-splitter 가 자기가 넓히는 구멍을 모른다**: 4축 게이트 헤더가 이 스킬을 이름으로 지목해 «split 마다 목적지가 게이트 안인지 재확인하라»고 적는데 스킬 본문엔 0글자고, 컷 판정은 「머릿속으로」(mentally)로 열려 있어 CLAUDE.md 의 ablation 절차와 정면 충돌하며, 자체 검증 grep 은 실물 헤더 7개 중 **0개 매치**(공백에서 끊김). 세 결함이 같은 방향(상주 다이어트가 성공할수록 커버리지가 조용히 줄어듦)을 가리킨다. ★배치1 은 cross-ecosystem Step 7 파이썬을 **직접 실행해** AttributeError 를 확인했다 — 스킬이 자기가 안 돌았다는 걸 모르는 상태. 계기가 죽은 것이 「대상 없음」으로 렌더되는 not-found≠0 의 교과서 사례. 🟥 **네 배치 전부 fh-meta:challenger = 같은 계열**이다. 격리는 됐으나 탈상관이 아니고, 그 구분을 내가 #343 마커에 panel(...) 로 뭉갰다가 pre-commit 훅에 막혔다 — 훅이 옳았다"
1841
+
1842
+ - date: 2026-08-11
1843
+ session: qasp-s1-data-plane-oracle
1844
+ agents_summary: "6 dispatches: Explore×1 (데이터-플레인 오라클 지형 지도 — window_stats·술어 클래스·러너 급전 경로·픽스처 소스) + codex gpt-5.5 ×4 (R1~R4 수렴 라운드, **diff** 축) + agy gemini-3.1-pro-high ×1 (**내 보고서** 축 — 코드 미제공, 의도적)"
1845
+ dispatch_count: 6
1846
+ outcome: accepted
1847
+ evidence: "cross-family 25건 회수·수리, 수렴 벡터 **R1 12(S1 A4 B2 + 주장축 S2 A2 B1) → R2 7(S1 A5 B2) → R3 4(A2 B2, S 소멸) → R4 2(B2, 둘 다 기명 잔여)** = CONVERGED. R1 codex 7건은 뿌리가 하나(라벨 뒤 잔여를 «첫 매치»로 읽음)라 전량 소비 문법 하나로 닫혔다 — 유니코드 마이너스·회계 괄호·복수 값·HK$/US$ 경계·malformed 천단위가 전부 **거짓 PASS** 였다. 수리마다 되돌림 실측(R1b·R2·R3b·R4·R5 · Q1~Q6 · T1·T2·T3c) 전건 정확히 그 레인만 적색. 신규 회귀 레인 65개. 전량 2,922 passed · 라이브 known-pair ×4 동일(FAIL/PASS 갈림 보존 · spec_mismatch 0)"
1848
+ notes: "★**채널을 갈라 보낸 것이 이 세션의 재사용 소득**(직전 세션 [[feedback_decorrelation_axis_is_what_you_send]] 를 의도적으로 적용): codex 에겐 diff → 코드 경로 결함, agy 에겐 **내 보고서만**(코드 미제공) → 주장·계기 결함. 후자가 잡은 둘은 diff 로는 구조적으로 안 나온다 — ⓐ **순환논증**(«제공자 값이 정답키와 일치» 는 *채점 기준*의 증거이지 *채점기*의 증거가 아니다) ⓑ **교란 변수**(라이브 known-pair 의 두 TC 가 비즈니스 로직이 아니라 **포맷 복잡도**로 갈렸을 가능성 — 통화 vs 순수정수). 둘 다 수용해 grounds 에 원시 행 텍스트를 싣고 포맷×결함 2×2 매트릭스를 채웠다. 🟥 **내 수리가 거짓 PASS 를 과차단으로 바꿔치기한 것을 R2 가 잡았다** — 느슨한 파싱 7경로를 «판정 불가»로 막고 닫았다고 적었는데, 유니코드 마이너스·회계 괄호·통화 접두는 **정상 표기**고 막으면 그 표면의 채점이 조용히 0이 된다. 판정 불가는 안전해 보이지만 손실 방향이 다를 뿐이다([[feedback_overblock_traded_for_failopen]] 의 거울상). 🟥 **내 레인이 세 번 나를 속였다, 전부 되돌림 프로브가 잡았다**: ⓐ bool 가드 레인이 실물이 아니라 **테스트 더블**을 재서 실물 가드를 지워도 초록 ⓑ 파서 되돌림을 **부분**(끝 앵커만)으로 해 4건이 안 뒤집혀 «앵커 약함» 오판 직전 — 전량 되돌리니 18건 ⓒ 변환-크래시 레인이 `lambda v=bad:` 였는데 **기본인자도 파라미터**라 DataPlane 이 서명을 보고 거기 `now` 를 넘겨 셋 다 datetime 반환 → «비수치 거부»로 **틀린 이유로 통과**. 무인자 제공자로 고치자 앵커가 0→1 적색. ★그리고 되돌림 자체도 **적용 확인이 필요하다** — 치환이 안 먹었는지 확인 없이 «앵커 0건» 을 한 번 냈다. 계기 검증에도 컨트롤이 붙어야 한다."
1849
+
1850
+ - date: 2026-08-11
1851
+ agent: fh-meta:beginner
1852
+ context: "if(kakao)26 발표 장표 S15(구조도) 제로컨텍스트 냉독 — 과거 사람 콜드리더의 «통째로 소실» 보고가 다크 재생성본에서도 재현되는지 측정"
1853
+ invoked_by: FH 세션 (장표 제작 축)
1854
+ input: "슬라이드 렌더 PNG 1장 + 발표 조건(40~60초 노출 · 발표자 발화 2문장만) 고정"
1855
+ outcome: accepted
1856
+ evidence: "재현됨 + 위치 특정. ⓐ 완전소실=왼쪽 세로회전 텍스트(존재 인지 실패) ⓑ 기능적소실=방법론3항·게이트3항·S1~S3·기준4·인용줄. 신개념 30개+(40~60초 수용 한계 3~4개). 단일 최대 하드블록=«PMH 가 정의 없이 주인공 자리». 발표자 2문장이 화면 30%만 덮고, 두 번째로 눈에 띄는 빨간 박스는 말로 한 번도 안 나옴"
1857
+ note: "저자(나)의 육안 검수는 이 장을 «다크 변환으로 해결»로 판정했다 — 냉독이 그 판정을 뒤집었다. 표준 렌즈였으면 안 나왔을 결함"
1858
+
1859
+ - date: 2026-08-11
1860
+ session: reship-campaign-stier-wave2-night
1861
+ agents_summary: "9 dispatches: fh-meta:challenger×3 (S티어 9종 findings **재생성** — 직전 세션이 요지만 남기고 세부를 트랜스크립트와 함께 잃었다) + general-purpose×3 (수리, 파일 분리 소유) + codex gpt-5.5 ×3 (diff 축 cross-family — 앞 2회는 판정 없이 종료) + fh-meta:challenger×3 (agents 8종 · R티어 23종 스윕 2배치) + general-purpose×2 (R티어 수리 2배치)"
1862
+ dispatch_count: 9
1863
+ outcome: accepted
1864
+ evidence: "감사 47건 회수 → governor 스팟체크 11/11 CONFIRMED(전건 known-positive 컨트롤 동반) → 수리 47건 → Axis 1 `pass · M-tier 0` → codex 16건 중 수용 3·기각 3(소스 대조)·계기산물 7. 되돌림 실측 1건(steel-quench §Phase0 포인터 제거→rc=1, 복원→rc=0)"
1865
+ notes: "★**수리자 셋 중 둘이 내 브리프의 오류를 되돌려 왔다** — ⓐ 나는 memory-hygiene 나이 소스를 `metadata.modified` 로 단정하라고 지시했는데 실측이 77/267 뿐이라, 그대로 썼으면 190건이 «최신»으로 렌더될 뻔했다(폴백 체인+AGE-UNKNOWN 으로 정정해 옴) ⓑ corpus/persona 수리자는 자기 수리 6건에 러너가 없다는 걸 스스로 명시하고 «돌려서 뒤집혔다»를 주장하지 않았다. 지시자가 감사자보다 정확할 거라는 가정이 틀렸다. ★**나와 배치②가 같은 함정을 각자 밟았다**: 코드펜스의 `<placeholder>` 가 bash 리다이렉트로 파싱돼 구문오류가 됐고, 배치②는 자체 적발했으나 나는 못 봤다 — Axis 1 이 `0 → 1` 로 잡아줬다. 계기가 없었으면 둘 다 통과했을 것이다. 🟥 **codex 가 3회 중 2회 판정 없이 종료**(레포 훅 `UserPromptSubmit Failed`) — 레포 밖 cwd 로 우회해 3회차 성공. 「돌았다≠결과 냈다」의 사이드카판이고, 우회했을 뿐 원인은 안 고쳤다. 🟥 **내가 「diff 만 보라」고 묶은 제약이 findings 의 44%(7/16)를 계기 산물로 만들었다** — 「측정 근거가 diff 에 없다」는 판정이 아니라 내 프롬프트의 그림자다. 탈상관 채널에 무엇을 보내느냐가 무엇을 받느냐를 정한다([[feedback_decorrelation_axis_is_what_you_send]])는 것의 비용 쪽 얼굴"
1866
+ night_addendum: "야간 완주분(3차 웨이브) 결과 추가 — agents 8종에서 M8·S9·R4, R티어 23종에서 M16·S18. **최대 발견은 계기가 대상에 안 닿는 형태였다**: `validate_yaml.sh` 가 에이전트를 스캔 대상에서 빼고 있었고, 그 사이 `quench-challenger` 의 frontmatter 가 깨져 선언한 `tools`·`model: opus` HARD FLOOR 가 둘 다 무효인 채로 돌고 있었다(런타임 agent 목록이 증거 — 이 에이전트만 `All tools`). 두 계기를 배선으로 닫았다(에이전트 편입 + 마크다운 펜스 추출). ★**수리 에이전트들이 내 브리프의 오류를 3회 되돌렸다**: 나이 소스 단정(실측 77/267) · 「모든 제안에 앵커」 대신 stub 라벨 · `fh-goal` 처방을 추측으로 쓰지 않고 2×2 프로브로 근본원인(npx 버전 스펙) 확정. 지시자가 감사자보다 정확할 거라는 가정은 이 세션에서 세 번 틀렸다. ★**자기 계기 결함 자체적발 3건**(내 셸 env 오염으로 음성 arm 이 거짓 PASS · 계수 grep 형식 불일치로 전부 0 · 첫 arXiv 조회가 http 라 컨트롤까지 실패) — 전부 「숫자를 말하기 전에 계기를 의심」으로 잡혔다. 🟥 codex 는 3회 중 2회 판정 없이 종료(레포 훅), 3차 웨이브에는 cross-family 미실시(마커에 typed)"
1867
+
1868
+ - date: 2026-08-12
1869
+ session: qasp-declaration-channel-night
1870
+ agents_summary: "5 dispatches: Explore×1 (MECE page↔area 좌표계 조사 — 인수인계 §4 전제 확인) + codex gpt-5.5 ×3 (R1 diff 축 · 주장 축 · R2 수리 재감사) + fh-meta:persona-innovator×1 (Mode F 완주 — 운영자 명시 요청)"
1871
+ dispatch_count: 5
1872
+ outcome: accepted
1873
+ evidence: "R1(diff 축) 1S·2A·5B → 전부 **재현 후** 수리 6건, B2 만 근거 명시 수용. 주장 축 10개 전부 TRUE·FALSE 0(명령+컨트롤 동반). 전량 2956 passed/43 skipped · 라이브 known-pair 유지(생성 TC 가 손 미션과 **grounds 바이트 동일**). PR qasp-dev #156"
1874
+ notes: "★**Explore 축이 인수인계의 전제를 반증했다** — 11c §4 「page↔area 를 선언 채널에 얹으면 NO_MATCH 6건이 열린다」가 틀렸다. 페이지 토큰은 매칭 키가 아니고(surface_inventory 에 `page` 0회, control `route` 36회), 같은 «p3 영역» 토큰인 TC_MT_005 는 매칭 성공·TC_MT_019 는 NO_MATCH 다. 나는 **그 위에 스키마를 이미 얹은 뒤** 실측했다 — 「남이 준 다음 할 일」도 전제부터 재야 하고, 특히 범위를 **줄이는** 방향일 때 소스 그라운딩이 제일 허술해진다([[feedback_scope_widening_needs_grounding]] 의 반대편 얼굴). 🟥 **선언 채널이 자기 실패모드를 맞았다** — 「선언 파일을 줬는데 선언이 없으면」 3가지 입력 전부 rc=0 으로 조용히 통과, cross-family 가 잡았고 자력 적발 0. 🟥 **되돌림 프로브가 내 테스트 하나를 장식으로 적발** — origin 을 spec_dictionary 로 위조해도 62건 전건 초록이었다(`anchors: []` 라 qualify_anchor 가 origin 을 보기도 전에 빠진다). 「자격이 안 나온다」를 확인했지 「origin 게이트가 산다」를 확인한 게 아니었다. 🟥 **계기가 세 번 거짓말했다**: `tail -1` 이 요약 대신 DeprecationWarning · 파이프 뒤 `$?` 가 필터 상태(훅이 잡아줌) · **pytest 색상 escape 때문에 `1 failed, 71 passed` 를 「71 passed」로 읽음**. 셋째는 실제 실패 1건을 숨겼다 — 전량 판정은 `--color=no` 필수. ★innovator 리포트의 B6(「처방 전사 검사 없음」)은 **오판** — 그 에이전트가 테스트 파일을 안 읽었다. 해당 레인은 존재하고 되돌림에서 2 적색. 남의 리포트도 대조 대상이다"
1875
+
1876
+
1877
+ - date: 2026-08-12
1878
+ session: ifkakao-deck-notes-parallel
1879
+ agents_summary: "3 dispatches: general-purpose×3 — ⓐ 챔버 런 원장 1차기록 재측정(승격 후보) · ⓑ 창작 도메인 «죽인 것» 1차기록 대조(승격 후보) · ⓒ 창작 대체안 B 5건 커밋 diff 직독"
1880
+ dispatch_count: 3
1881
+ outcome: accepted
1882
+ evidence: "세 리포트의 load-bearing 주장을 거버너가 **전건 원문·컨트롤로 재검증**했다.
1883
+ ⓐ 런#10 판정문:31 «10런 중 9 KILL» 오기 확인 · 디렉터리 9 ↔ 판정파일 9 대응 ·
1884
+ `chamber_ordering_witness.yaml` 부재(컨트롤 = 같은 디렉터리 `subagent_invocations_log.yaml` 존재) ·
1885
+ #5 «5/5 false-positive on 111 real source files» 축자 확인.
1886
+ ⓑ `codex_decorrelation_audit_2026-07-25.md:14` 축자 · 신호 `:52` «독트린화는 여전히 보류» ·
1887
+ `tracks/noblewriter/` 대상 grep rc=1 + **컨트롤 rc=0(10파일)**.
1888
+ ⓒ `fh_completed_2026-08-01.md:76` 축자 · 캐논 검사기 부재(target rc=1, control rc=0) ·
1889
+ 커밋 `7046798` diff 축자.
1890
+ 산출: 원장 승격 1(인큐베이션) · 기각 2(창작 A·B) · 발표 출하 1장(S18-b)"
1891
+ notes: "★**ⓒ가 내 중계 오류를 반증했다 — 이 세션 최대 소득이고 자력 적발 0이다.**
1892
+ ⓑ의 요약을 받아 «typed 캐논이 저자를 잡은 3건»으로 운영자에게 **원문을 안 열고 중계**했는데,
1893
+ 요약 로그 원문은 그중 **둘을 «운영자 캐치»로 명시**한다 — 게이트가 *놓친* 것이라 실적으로 세면
1894
+ 논지가 뒤집힌다. 「대화에서 말한 것도 publish 다」(§Instrument-Calibration publish-order)가
1895
+ always-loaded 인데도 뚫렸고, 잡은 건 후속 격리 에이전트다.
1896
+ ★**세 리포트 모두 «부재»를 주장할 때 컨트롤을 스스로 동반했다** — 브리프에 명시한 결과이고,
1897
+ ⓒ는 첫 컨트롤 실행이 파이프 오염($? 가 head 를 읽음)이었음을 **스스로 적발**해 rc 캡처로 재실행했다.
1898
+ ★**ⓐ가 손 집계와 자동 grep 이 갈리는 지점을 지목**: `grep -c 'EMIT|KILL'` 은 27/43 을 뱉는데
1899
+ 그건 파일 내 토큰 계수이지 런별 판정이 아니다(#2·#3 이 `KILL / PARTIAL-EMIT` 형태).
1900
+ ★**분모가 셋 다 방어 가능하다는 것을 ⓐ가 먼저 말했다** — 원장 행 전체(10, #1 오염) vs
1901
+ 완주 런(9, 권고) vs 아티팩트 완비(8). 어느 걸 쓰는지가 정직성 갈림길이라는 지적이 그대로
1902
+ 발표 인용 형태 결정(계수 대신 한 건)의 입력이 됐다.
1903
+ 🟥 **리포트를 그대로 옮기지 않은 것이 세 번 다 옳았다** — 세 건 모두 거버너 재검증에서
1904
+ 라벨/귀속이 교정됐다(ⓐ 「첫 정식 런 #10」 기계 미판별 · ⓑ 도메인 라벨 · ⓒ 캐치 주체)."
1905
+
1906
+ - date: 2026-08-12
1907
+ agent: general-purpose
1908
+ task: "qasp 상류 라우팅 축 — 1.5막 질문 게이트 + 이관 처분 상태 신설 (설계·구현·cross-family 수렴·PR·머지까지 완주)"
1909
+ dispatcher: FH 세션 (qasp+psa 축)
1910
+ tier: opus-5[1m]
1911
+ duration: "약 3.5시간 (bg, 재개 2회)"
1912
+ outcome: accepted
1913
+ evidence: "qasp-dev PR #157 MERGED (squash → main 8ff549e) · 파일 19 · +2735/-26 · CI 4/4 SUCCESS · 회귀 3043 passed/43 skipped (기준선 2967 대비 +76) · cross-family 7R CONVERGED(codex/gpt-5.5). 자기 반증 5건을 스스로 보고했고 그중 하나(자리표시자 18→17)는 내 독립 측정과 일치했다. 전수 되돌림 프로브로 **자기 수리 24종 중 4건이 장식**임을 스스로 적발. 시험관(나)의 몫은 메타감사·정본 지시·머지 조건(사설 companion-store 매니페스트) 강제였고, 실제 설계·구현·수렴은 에이전트가 완주했다."
1914
+ note: "④-e 훅은 이 세션에서 47 dispatch 를 셌는데, 그중 대부분은 이 에이전트 자신의 하위 디스패치(cross-family 7R + 되돌림 프로브)다. 한 클래스로 묶어 1 엔트리로 기록한다 — 규율이 허용하는 형태이고 총 미기록을 막는 것이 훅의 목적이다."
1915
+
1916
+ - date: 2026-08-12
1917
+ invoker: FH 재출하 축 병렬세션 (Opus 5 1M)
1918
+ subagent: codex/gpt-5.5 (cross-family 사이드카, headless `codex exec -m gpt-5.5 -`)
1919
+ count: 6
1920
+ purpose: v1.4.96 npm publish 게이트 — 독립검증. 채널 3종으로 나눠 발주(diff 리뷰 · 클레임 13건 검증 · 동결 게이트리뷰 4회)
1921
+ outcome: accepted
1922
+ evidence: "S 22건 회수 중 실건 19 수리 · 2건은 기계로 반증(count_check 이스케이프 known-pair · 되돌림 프로브 2pass/3fail) · 1건 미수리 잔여(B, 의도). 실건 벡터 3→6→5→2→3. **자력 적발 0 이었던 결함 5건을 잡았다** — 그중 3건이 직전 라운드 수리 산물. 레인 20→46 은 전부 이 회수분의 앵커다."
1923
+ cost_note: "1라운드 killed(내가 레인 전수 스윕을 시켜 시간초과 — 발주자 결함, 범위 축소 후 재주행). 1라운드 절반 무효(WRONG-TARGET — 발주 후 트리 수정)."
1924
+
1925
+ - date: 2026-08-12
1926
+ invoker: FH ifkakao 병렬세션 (Sonnet 5 → Opus 5 중도 전환)
1927
+ subagent: fh-commons:quench-challenger (Axis 2 적대검증, in-session)
1928
+ count: 1
1929
+ purpose: CLAUDE.md §257·§331 stale 브랜치보호 서술 정정본의 사실성·내부정합 검증
1930
+ outcome: accepted
1931
+ evidence: "S 1건 + A 2건 회수, 전부 실건이고 **자력 적발 0**. S = `validate` 필수체크를 «Axis 1 워크플로»로 오귀속(실제로는 별개 잡 — regression-guard.yml 은 여전히 필수 아니고 paths: 필터로 4축 대상 자산 다수에 돌지도 않는다). A1 = «PR 오픈 시점» 과잉주장(실제 synchronize 마다 재실행). A2 = «both layers» 근거 미인용. 셋 다 수정 후 워크플로 YAML + 라이브 gh api 재대조. PR #354 머지(main f62a5a9)."
1932
+ note: "정정이 원 서술보다 더 틀릴 수 있다는 사례 — stale 한 것은 `contexts=[]` 라는 «목록»이었지 «Axis 1 이 필수가 아니다»라는 «귀속»이 아니었는데, 초안이 후자까지 지웠다. 적대검증이 그 구분을 복원했다."
1933
+
1934
+ - date: 2026-08-12
1935
+ session: reship-residual-A-A2-night (Sonnet 5 → Opus 5 1M 전환)
1936
+ agents_summary: "3 dispatches: fh-commons:quench-challenger×1 (PR #355 diff 6축 구조공격) · codex gpt-5.5×1 (같은 diff cross-family, Bash 사이드카) · fh-meta:persona-innovator×1 (Mode F 자율주행 — 운영자 지시)"
1937
+ dispatch_count: 3
1938
+ outcome: accepted
1939
+ evidence: "challenger = A 4건 + B 3건 회수, 그중 최상위(vendored-.git 트리에서 원래 버그 재현)가 첫 수리를 반증해 일반해(선언 조회)로 방향을 바꿨다. codex = 독립으로 같은 B 2건에 수렴(stale SKIP 문구 · 모드 enum 미검증), S/A 0 보고하며 «패딩 대신 없다고 말한다»를 실제로 이행. innovator Mode F = 내부 갭 5 + 외부 프런티어 6(전부 fetch 된 URL) + null result 5, **내 주장 2건 반증**(N≥3 오계상 · 주석 방향). 산출은 PR #355·#356·#357 (main b80ed97) + 카드 §🔱⑳."
1940
+ notes: "★**세 디스패치 중 둘이 내 판정을 뒤집었고 자력 적발은 0이다.** challenger 가 내 첫 수리(`[ -e .git ]`)를 «좁은 문 뒤에서 원래 버그가 재현된다»로 반증했고, innovator 가 내 N≥3 정당화를 **이 레포 자신의 판별자**(첫 발생 직후 고쳤다면 나머지가 막혔겠는가)로 반증했다 — 첫 수리가 두 번째 발견을 *만든* 헬퍼라 한 발견이지 두 재발이 아니고, compaction_probe 수리는 반대 방향이었다. 정직한 값 N=1–2, 임계 미만. **재발 횟수가 아니라 측정된 12건이 이 빌드의 근거**로 헤더를 고쳐 적었다.
1941
+ ★**innovator 가 자기 계수를 스스로 UNCALIBRATED-partial(2/16 손검증)로 라벨**했고, 내 전수 재계상은 18 이었다 — 정직 라벨이 있었기에 그 숫자로 작업 크기를 산정하지 않았다.
1942
+ ★**H1 규율 이행 확인**: innovator 가 벤더 마케팅 출처의 수치 2건(cross-family 검출률 +40~60% · 공유맥락 온보딩 -35~50%)을 SPECULATIVE 로 격리하고 **어느 제안에도 인용하지 않았다**. 대신 «우리 자체 증거가 더 강하다 — 약한 외부 숫자로 강한 내부 실측을 장식하지 마라»를 명시.
1943
+ 🟥 **codex 발주 비용 관측**: diff + 산문 프롬프트 1회로 충분했다(오전 축의 7회 352KB 대비). 같은 클래스 결함을 같은 채널로 두 번 보내지 않은 것이 차이다.
1944
+ ⚠️ **goal-quench 미발화** — 사이드카 3회 미달(2회)이라 카드 K 의 트리거 조건(3회 초과)엔 안 걸렸다. 이건 규율 준수이지 갭이 아니다."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.95",
3
+ "version": "1.4.97",
4
4
  "description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -26,7 +26,7 @@
26
26
  "scripts": {
27
27
  "prepare": "chmod +x bin/fh-gate.js bin/fh-run.js bin/fh-goal.js bin/fh-codex-doctor.js scripts/fh-gate.sh scripts/fh-run.sh scripts/fh-goal.sh",
28
28
  "test": "bash scripts/selfcheck.sh",
29
- "prepublishOnly": "bash scripts/version_lockstep_check.sh && bash scripts/selfcheck.sh && bash scripts/public_surface_scan_files.sh",
29
+ "prepublishOnly": "bash scripts/version_lockstep_check.sh && bash scripts/selfcheck.sh && bash scripts/package_coverage_check.sh --vs-tarball && bash scripts/public_surface_scan_files.sh",
30
30
  "release": "bash scripts/public_surface_scan_files.sh && npm publish"
31
31
  },
32
32
  "engines": {
@@ -68,6 +68,7 @@
68
68
  "scripts/test_selfcheck_state_lanes.sh",
69
69
  "scripts/test_version_lockstep_lanes.sh",
70
70
  "scripts/package_coverage_check.sh",
71
+ "scripts/lane_runner_check.sh",
71
72
  "scripts/test_package_coverage_lanes.sh",
72
73
  "scripts/test_fh_gate_regressions.sh",
73
74
  "templates/local_fh_context.md",
@@ -83,6 +84,7 @@
83
84
  "templates/temper_check.sh",
84
85
  "templates/contrib_session.md",
85
86
  "templates/goal-quench-hook-setup.md",
87
+ "templates/goal-quench-settings-merged.json",
86
88
  "templates/.claude/rules/session.md",
87
89
  "scripts/below_floor_scan.sh",
88
90
  "scripts/capability_registry_check.sh",
@@ -119,10 +121,16 @@
119
121
  "templates/predelete_check.sh",
120
122
  "templates/PRE-PUBLISH-CHECKLIST.md",
121
123
  "scripts/degrade_direction_scan.sh",
124
+ "scripts/degrade_probe_capability.sh",
125
+ "scripts/psa_probe_capability.sh",
126
+ "scripts/test_capability_entrypoint_shipping.sh",
127
+ "scripts/validate_yaml.sh",
128
+ "scripts/test_count_check_readme_format_lanes.sh",
122
129
  "scripts/test_degrade_scan_shell_probes.sh",
123
130
  "scripts/gate_pathspec_check.sh",
124
131
  "scripts/prepush_guard_check.sh",
125
132
  "scripts/psa_scan_lib.sh",
133
+ "scripts/test_psa_singlefile_lanes.sh",
126
134
  "scripts/session_close_check.sh",
127
135
  "scripts/utterance_landing_check.sh",
128
136
  "scripts/test_dispatch_log_lanes.sh",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "1.4.95",
3
+ "version": "1.4.97",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -1,8 +1,28 @@
1
1
  ---
2
2
  name: quench-challenger
3
- description: Dedicated quench attack-prescription synthesis agent — Devil (6-axis harness-specific attack) + Innovator (immediate alternatives) + Prescriber (one-line surgical prescription) 3-DNA synthesis. Every attack is paired with a concrete fix direction. No pure criticism — attack and prescription always come as a pair. Built-in replacement engine for steel-quench Wave 1. Operates without external plugin dependency. Can be auto-wired via /steel-quench or run standalone. Includes ghost-finding prevention (blocks misidentification of intentional design decisions), severity escalation rules, and cross-axis reasoning. Examples:
3
+ description: "Dedicated quench attack-prescription synthesis agent — Devil (6-axis harness-specific attack) + Innovator (immediate alternatives) + Prescriber (one-line surgical prescription) 3-DNA synthesis. Every attack is paired with a concrete fix direction no pure criticism. Built-in replacement engine for steel-quench Wave 1; runs standalone or auto-wired via /steel-quench. Includes ghost-finding prevention, severity escalation rules, and cross-axis reasoning."
4
+ model: opus
5
+ # model is a HARD FLOOR (tier-floor resolution — multi_model_sidecar_strategy.md §Tier-floor):
6
+ # adversarial increment-finding is the depth-sensitive class. floor: hard semantics — the floor
7
+ # outranks diversity: prefer any floor-meeting engine (incl. native Tier-3 at opus) over a below-floor
8
+ # diversity engine. Only when NO engine reaches the floor, dispatch at best available with the
9
+ # below-floor header (e.g. "challenger: sonnet (below-floor; floor=opus)") — never hard-fail.
10
+ # Below-floor judged verdicts are PROVISIONAL (not gate-PASS evidence) until floor-tier re-run or
11
+ # explicit operator acceptance; the weekly audit is the standing re-quench consumer.
12
+ color: red
13
+ tools: Read, Grep, Glob
14
+ version: 0.2
15
+ ---
4
16
 
5
- <example>
17
+ ## Invocation examples
18
+
19
+ > Moved out of `description:` on 2026-08-11. They were an unquoted multi-line block whose `user:` /
20
+ > `assistant:` lines parsed as new YAML keys, which broke the whole frontmatter — so the declared
21
+ > `tools:` and the `model: opus` HARD FLOOR below it **never took effect**. Measured in a live
22
+ > session agent list: this agent showed `(Tools: All tools)` and the fallback description, while
23
+ > siblings showed exactly what they declared. Keep `description:` to ONE quoted line.
24
+
25
+ <example>
6
26
  Context: steel-quench Wave 1 — need to attack a SKILL.md
7
27
  user: (internal — steel-quench spawns this)
8
28
  assistant: Agent(subagent_type="fh-commons:quench-challenger", prompt="Attack the following SKILL.md across all 6 axes:\n\n[SKILL.md content]")
@@ -16,21 +36,12 @@ description: Dedicated quench attack-prescription synthesis agent — Devil (6-a
16
36
  user: (internal — install-doctor or marketplace gate)
17
37
  assistant: Agent(subagent_type="fh-commons:quench-challenger", prompt="Determine whether the following skill draft qualifies for registration using the 6 axes:\n\n[draft content]")
18
38
  <commentary>
19
- If even one S-tier finding exists, registration is blocked. A-tier and below allow registration after fix recommendations.
39
+ Any S- **or A**-tier finding blocks registration fix and re-run (this matches the deployment
40
+ judgment line in §Output Format; an earlier version of this example said S-only, which is the
41
+ looser of the two and would have been the one a reader met first).
20
42
  </commentary>
21
43
  </example>
22
- model: opus
23
- # model is a HARD FLOOR (tier-floor resolution — multi_model_sidecar_strategy.md §Tier-floor):
24
- # adversarial increment-finding is the depth-sensitive class. floor: hard semantics — the floor
25
- # outranks diversity: prefer any floor-meeting engine (incl. native Tier-3 at opus) over a below-floor
26
- # diversity engine. Only when NO engine reaches the floor, dispatch at best available with the
27
- # below-floor header (e.g. "challenger: sonnet (below-floor; floor=opus)") — never hard-fail.
28
- # Below-floor judged verdicts are PROVISIONAL (not gate-PASS evidence) until floor-tier re-run or
29
- # explicit operator acceptance; the weekly audit is the standing re-quench consumer.
30
- color: red
31
- tools: Read, Grep, Glob
32
- version: 0.2
33
- ---
44
+
34
45
 
35
46
  # quench-challenger — Dedicated Attack-Prescription Synthesis Agent
36
47
 
@@ -136,9 +147,12 @@ Escalate severity one level when the following conditions overlap:
136
147
  → Verdict: Pass (reason: citation complete)
137
148
 
138
149
  ✅ Valid attack:
139
- "arXiv 2605.00914 cited — only '32.3pp degradation' number with no connection to implementation"
150
+ "arXiv 2605.00914 cited — a number lifted from the abstract with no connection to implementation"
140
151
  → [B] Citation annotation missing: number present but no one-liner explaining how this skill's isolation structure implements the paper's basis
141
- → Prescription: Add `arXiv 2605.00914 basis: reasoning path isolation = 32.3pp confirmation bias blocked` one line
152
+ → Prescription: Add `arXiv 2605.00914 basis: plurality voting discards correct answers already in the pool (oracle gap ≤32.3pp) collect by union, do not vote` one line
153
+ → ⚠️ When you write that prescription, state what the number MEASURES. This exact line previously
154
+ read "32.3pp confirmation bias blocked", which is the wrong metric in the wrong direction — see
155
+ §References. A citation-integrity axis that ships a misattributed number teaches the misattribution.
142
156
  ```
143
157
 
144
158
  ---
@@ -147,7 +161,19 @@ Escalate severity one level when the following conditions overlap:
147
161
 
148
162
  **Diagnostic question**: "Does the instance executing this synthesis or evaluation step share a reasoning path with the instance that generated the artifact being evaluated?"
149
163
 
150
- Basis: arXiv 2605.00914 32.3pp performance degradation demonstrated when the same instance self-evaluates.
164
+ Basis: arXiv 2605.00914, *The Cost of Consensus: Isolated Self-Correction Prevails Over Unguided
165
+ Homogeneous Multi-Agent Debate* — measured on N=10 homogeneous agents over R=3 rounds. What it
166
+ actually shows: **sycophantic conformity** (modal adoption ≤85.5%), **contextual fragility** (peer
167
+ rationales destabilize previously-correct reasoning, ≤70.0%), and **consensus collapse** (plurality
168
+ voting discards correct answers *already present in the pool* — oracle gap ≤32.3pp), at 2.1–3.4×
169
+ the tokens. The axis this supports is: **do not homogeneously debate-then-vote; isolate, then
170
+ collect by union.**
171
+
172
+ ⚠️ **Read the direction, not just the number.** This line previously said "32.3pp performance
173
+ degradation when the same instance self-evaluates" — wrong metric (the 32.3pp is a voting oracle
174
+ gap) and wrong direction (the paper's title result is that *isolated self-correction prevails*).
175
+ Verified against the live abstract 2026-08-11 with a control fetch; `self-evaluat` and
176
+ `confirmation bias` do not occur in it.
151
177
 
152
178
  #### Checklist
153
179
 
@@ -371,10 +397,10 @@ Deployment judgment: ✅ 0 S/A findings / ❌ N S/A findings — fix and re-run
371
397
  ## References
372
398
 
373
399
  - **CaseCraft PoC counter-example criteria set**: CC-1 (self-declaration) · CC-2 (single-case generalization) · CC-3 (achieved = performed equivalence) · CC-6 (Done When absent) — loaded in steel-quench Phase 0
374
- - **Cost of Consensus**: arXiv 2605.00914 — 32.3pp degradation in same-instance self-evaluation (Axis 3 basis)
375
- - **SAGE automated critique layer**: arXiv 2603.15255 — Critic isolation structure (harvest-loop Step 3.75 implementation basis)
400
+ - **Cost of Consensus**: arXiv 2605.00914 — plurality voting discards correct answers already in the pool (**oracle gap ≤32.3pp**); conformity ≤85.5%; isolated self-correction wins the cost/accuracy tradeoff (Axis 3 basis). *Corrected 2026-08-11 — previously cited as "32.3pp degradation in same-instance self-evaluation", which is neither the paper's metric nor its direction.*
401
+ - **SAGE**: arXiv 2603.15255, *Multi-Agent Self-Evolution for LLM Reasoning* four agents (Challenger, Planner, Solver, Critic) that **co-evolve from a shared LLM backbone**. *Corrected 2026-08-11: this is NOT an isolation result — the abstract says co-evolve and never says "isolat". Step 3.75's Critic isolation is an FH design decision; its evidence is 2605.00914 above, not SAGE.*
376
402
  - **FH Done When standard**: `harvest-loop/SKILL.md`, `deliberation/SKILL.md` Done When sections
377
- - **Harness simplification principle**: `README.md` (Axis 6 basis)
378
- - **Ghost finding prototype**: deliberation Mediator conclusion transfer permitted (clarified 2026-05-25) — `0a03189`
403
+ - **Harness simplification principle**: `CLAUDE.md` §Core Axis — "Field harness: simpler over time (complexity = warning signal); meta-harness: optimize, not necessarily simplify" (Axis 6 basis). *Corrected 2026-08-11: previously pointed at `README.md`, where the principle does not appear (`grep -in simpl README.md` → 0 hits; control `grep -c harness` → 40, so the file is greppable).*
404
+ - **Ghost finding prototype**: deliberation Mediator conclusion transfer permitted (clarified 2026-05-25). *Commit hash removed 2026-08-11 the cited `0a03189` does not resolve in this repo (`git cat-file -t` → not a valid object name; control: `HEAD` → commit). The claim stands on its date and its subject, not on a hash nobody can check.*
379
405
 
380
- Version history = CHANGELOG.md (fh-commons).
406
+ Version history = `plugins/fh-meta/CHANGELOG.md`. *Corrected 2026-08-11: `plugins/fh-commons/CHANGELOG.md` does not exist (control: the fh-meta one does).*
@@ -158,15 +158,29 @@ Max rounds: N | Actual convergence round: M
158
158
 
159
159
  ## Done When
160
160
 
161
+ Each condition declares its check class (mandatory-pass / measured / judged); every judged condition
162
+ names its adversarial pairing — no judge-only path.
163
+
161
164
  ```
162
165
  Setup complete (gate name, pass criteria, max rounds confirmed)
166
+ (mandatory-pass — all three named in writing BEFORE round 1; criteria written after seeing round-1
167
+ output are post-hoc and do not satisfy this)
163
168
  + Minimum 2 rounds executed
169
+ (measured: round count >= 2, read off the per-round table below)
164
170
  + Convergence declared (a round returns zero new failures AND you make no repairs in response to
165
171
  it, at any grade) or escalation triggered
172
+ (measured: the round's new-failure count = 0 AND its repair count = 0 — two numbers, both recorded
173
+ per round; a single-number reading is what let "0 new failures while still repairing" pass)
166
174
  ⚠️ NOT "2 consecutive rounds": while every round ships repairs that criterion can never fire, so
167
175
  it reads as permanently not-converged and gets shipped past. Adjudicated with measured evidence in
168
176
  `steel-quench` §Convergence Criteria (2026-08-02).
177
+ + Escalation root cause classified when max rounds is hit without convergence
178
+ (judged — adversarial pairing: `fh-commons:quench-challenger` argues that the loop stopped because
179
+ the GATE is blind rather than because the artifact is clean; an unchallenged "converged" on a
180
+ gate that never produced a FAIL is the failure mode this pairing exists to catch)
169
181
  + Per-round result table output
182
+ (mandatory-pass — one row per executed round, each carrying its new-failure and repair counts;
183
+ a missing row makes the two measured conditions above unreadable)
170
184
  ```
171
185
 
172
186
  ## External anchor (independent convergence)
@@ -261,10 +261,24 @@ The jury fills the domain blind spots that no single person can see on their own
261
261
 
262
262
  ## Done When
263
263
 
264
+ Each condition declares its check class (mandatory-pass / measured / judged); every judged condition
265
+ names its adversarial pairing — no judge-only path.
266
+
264
267
  ```
265
268
  All Steps 0~3 completed (Steps 4~5 added if 5-layer selected)
269
+ (mandatory-pass — each layer's output block is present in the declared format; a skipped layer is
270
+ a FAIL, not a default pass)
271
+ + Every Innovator proposal carries a Devil-Advocate rebuttal AND an acknowledgment line
272
+ (measured: rebuttal count == proposal count, and acknowledgment count == rebuttal count. A
273
+ rebuttal without an acknowledgment is already flagged `[WARN: unsynthesizable rebuttal]` in
274
+ Step 2 — this condition is what makes that flag block completion instead of decorating it)
266
275
  + [Mediator — Synthesis Verdict] output present (Adopt / Alert absorption / Verdict / Conditions / Discard)
276
+ (judged — adversarial pairing: the Devil-Advocate layer is the standing opposition to the
277
+ Innovator, and the Mediator's synthesis is re-attacked by `fh-commons:quench-challenger` on the
278
+ one axis the Devil conceded; a synthesis that only restates the concessions is not a verdict)
267
279
  + User's final decision confirmed (deliberation output must never be auto-executed)
280
+ (mandatory-pass — an explicit user utterance selecting an option; silence, absence, or the
281
+ session's own inference does NOT satisfy it)
268
282
  ```
269
283
 
270
284
  **→ When invoked from agent-composer Wave next-D: synthesis verdict is the fan-in input for Wave continuation** — return the Mediator verdict + Conditions to agent-composer so the conflict is marked resolved in the fan-in result set. After this, agent-composer re-runs Step 4-b state transition evaluation with the conflict cleared; subsequent Waves (next-M / next-E / end) proceed based on the updated result.