@chrono-meta/fh-gate 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/.claude/regression/probes_live.yaml +137 -0
  2. package/.claude/rules/.residency-patterns.defaults +7 -0
  3. package/.claude/rules/fh_4axis_gate.md +50 -1
  4. package/.claude-plugin/marketplace.json +8 -2
  5. package/AGENTS.md +27 -0
  6. package/CATALOG.md +17 -0
  7. package/CLAUDE.md +12 -2
  8. package/README.ja.md +51 -7
  9. package/README.ko.md +48 -7
  10. package/README.md +37 -5
  11. package/README.zh.md +45 -8
  12. package/docs/STANDARDS_ALIGNMENT.md +61 -0
  13. package/docs/USER_GUIDE.md +3 -0
  14. package/docs/USE_CASES.md +50 -0
  15. package/docs/model_tier_expectations.md +60 -0
  16. package/knowledge/shared/harness-core/fh_three_layer_canon.md +30 -10
  17. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +8 -0
  18. package/knowledge/shared/harness-core/harness_incubator_doctrine.md +9 -0
  19. package/knowledge/shared/harness-core/iso_ai_standards_crosswalk.md +139 -0
  20. package/knowledge/shared/harness-core/measurement-integrity-checklist.md +20 -0
  21. package/knowledge/shared/learnings/subagent_invocations_log.yaml +441 -4
  22. package/package.json +40 -2
  23. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  24. package/plugins/fh-commons/skills/preprep/README.md +4 -1
  25. package/plugins/fh-commons/skills/preprep/SKILL.md +99 -3
  26. package/plugins/fh-commons/skills/preprep/diagram_from_json.py +154 -0
  27. package/plugins/fh-commons/skills/preprep/fixtures/fixture_R3_negative.pptx +0 -0
  28. package/plugins/fh-commons/skills/preprep/fixtures/fixture_R3_positive.pptx +0 -0
  29. package/plugins/fh-commons/skills/preprep/fixtures/mk_slide_fixtures.py +179 -0
  30. package/plugins/fh-commons/skills/preprep/interslide_deps.py +98 -9
  31. package/plugins/fh-commons/skills/preprep/lane_adjacent_dup.py +4 -1
  32. package/plugins/fh-commons/skills/preprep/lane_diagram.py +95 -0
  33. package/plugins/fh-commons/skills/preprep/lane_geometry.py +181 -0
  34. package/plugins/fh-commons/skills/preprep/lane_promise.py +4 -1
  35. package/plugins/fh-commons/skills/preprep/lane_slide_refs.py +134 -0
  36. package/plugins/fh-commons/skills/preprep/lane_slide_relations.py +300 -0
  37. package/plugins/fh-commons/skills/preprep/preprep.py +129 -8
  38. package/plugins/fh-commons/skills/preprep/preprep_wire.py +210 -0
  39. package/plugins/fh-commons/skills/preprep/presentation_checklist.md +4 -0
  40. package/plugins/fh-commons/skills/preprep/surfaces.example.yaml +18 -0
  41. package/plugins/fh-commons/skills/preprep/test_preprep_lanes_rp.py +184 -0
  42. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  43. package/plugins/fh-meta/CHANGELOG.md +43 -1
  44. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +87 -2
  45. package/plugins/fh-meta/skills/frontier-digest/SKILL.md +2 -2
  46. package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +25 -5
  47. package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL.md +11 -0
  48. package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL_detail.md +3 -0
  49. package/plugins/fh-qp/.claude-plugin/plugin.json +22 -0
  50. package/plugins/fh-qp/README.md +71 -0
  51. package/plugins/fh-qp/fixtures/evidence_known_clean.txt +3 -0
  52. package/plugins/fh-qp/fixtures/evidence_known_dirty.txt +6 -0
  53. package/plugins/fh-qp/fixtures/reach_known_partial.tsv +4 -0
  54. package/plugins/fh-qp/fixtures/reach_known_reached.tsv +4 -0
  55. package/plugins/fh-qp/fixtures/reach_known_wall.tsv +3 -0
  56. package/plugins/fh-qp/fixtures/verdicts_known_bad_branch.tsv +2 -0
  57. package/plugins/fh-qp/fixtures/verdicts_known_bad_vacuous_machine.tsv +2 -0
  58. package/plugins/fh-qp/fixtures/verdicts_known_good.tsv +4 -0
  59. package/plugins/fh-qp/fixtures/verdicts_verify_only.tsv +3 -0
  60. package/plugins/fh-qp/qp_profile.example.yaml +29 -0
  61. package/plugins/fh-qp/scripts/qp_tools.sh +216 -0
  62. package/plugins/fh-qp/skills/qp/SKILL.md +65 -0
  63. package/plugins/fh-qp/skills/qp-plan/SKILL.md +42 -0
  64. package/plugins/fh-qp/skills/qp-regress/SKILL.md +45 -0
  65. package/plugins/fh-qp/skills/qp-run/SKILL.md +49 -0
  66. package/scripts/chamber_run.sh +14 -5
  67. package/scripts/com.forge-harness.live-eval.plist +84 -0
  68. package/scripts/compaction_probe.sh +9 -35
  69. package/scripts/directional_diff_gate.sh +14 -2
  70. package/scripts/frontier_digest_autopilot.sh +4 -1
  71. package/scripts/map_postprocess.py +90 -0
  72. package/scripts/outbound_query_guard.sh +131 -0
  73. package/scripts/outbound_query_hook.sh +373 -0
  74. package/scripts/package_coverage_check.sh +55 -16
  75. package/scripts/pipe_verdict_guard.sh +41 -1
  76. package/scripts/probe_live_eval.sh +240 -0
  77. package/scripts/probe_live_eval_lib.py +579 -0
  78. package/scripts/proposal_hook.sh +120 -17
  79. package/scripts/push_zone_check.sh +78 -0
  80. package/scripts/residency_closure_scan.py +252 -0
  81. package/scripts/selfcheck.sh +41 -1
  82. package/scripts/session_close_check.sh +100 -0
  83. package/scripts/sim_isolated_run.sh +98 -2
  84. package/scripts/test_action_yml_lanes.sh +97 -0
  85. package/scripts/test_fh_qp_lanes.sh +105 -0
  86. package/scripts/test_gate_two_verdicts_lanes.sh +139 -0
  87. package/scripts/test_map_postprocess_lanes.sh +143 -0
  88. package/scripts/test_marker_affected_lanes.sh +93 -0
  89. package/scripts/test_marker_crossfamily_lanes.sh +90 -6
  90. package/scripts/test_marker_oracle_lanes.sh +136 -0
  91. package/scripts/test_outbound_query_hook_lanes.sh +433 -0
  92. package/scripts/test_outbound_query_lanes.sh +87 -0
  93. package/scripts/test_pipe_verdict_guard_lanes.sh +26 -0
  94. package/scripts/test_preprep_diagram_lanes.sh +87 -0
  95. package/scripts/test_preprep_drift_anchor.sh +3 -3
  96. package/scripts/test_preprep_slide_refs_lanes.sh +169 -0
  97. package/scripts/test_probe_live_eval_lanes.sh +437 -0
  98. package/scripts/test_proposal_hook_lanes.sh +22 -1
  99. package/scripts/test_push_zone_lanes.sh +304 -0
  100. package/scripts/test_residency_closure_lanes.sh +70 -0
  101. package/scripts/test_sim_isolated_run_lanes.sh +119 -0
  102. package/scripts/test_utterance_intake_lanes.sh +414 -0
  103. package/scripts/test_worktree_reclaim_lanes.sh +70 -0
  104. package/scripts/transcript_utterances.py +222 -0
  105. package/scripts/utterance_intake.sh +424 -0
  106. package/scripts/validate_yaml.sh +27 -0
  107. package/scripts/worktree_reclaim.sh +95 -0
  108. package/templates/.git-hooks/pre-commit +353 -1
  109. package/templates/.git-hooks/pre-push +91 -0
  110. package/templates/RED_TEAM_REPORT.md +49 -0
  111. package/templates/settings.PreToolUse.snippet.json +65 -1
@@ -0,0 +1,137 @@
1
+ # probes_live.yaml — LIVE (behavioral) subset of .claude/regression/probes.md
2
+ #
3
+ # WHY THIS FILE EXISTS. `/prompt-regression` (plugins/fh-meta/skills/prompt-regression/SKILL.md)
4
+ # is a STATIC check: it reads changed source and asks "does the text still say the right thing".
5
+ # Its own SKILL.md names the gap plainly (§Step 4, "What it therefore cannot catch"): a rule that
6
+ # is present but has stopped FIRING, a trigger shadowed by a higher-priority route, any behavior
7
+ # change that leaves the source text identical. This file is the "live twin" the SKILL.md points
8
+ # at — `scripts/probe_live_eval.sh` runs each entry below through `scripts/sim_isolated_run.sh`
9
+ # (isolated clone, floor-tier `claude -p`, observe mode) and greps the ACTUAL RESPONSE, not the
10
+ # source. It answers "does it fire", never "was it worded correctly" — the two checks are
11
+ # complementary, not redundant (CLAUDE.md §Anthropic SDLC evals: "settings-changed PR + eval run").
12
+ #
13
+ # SELECTION RULE (mechanical, applied by `probe_live_eval.sh --dry-run` against probes.md, not
14
+ # hand-maintained here — this file is the OUTCOME of that rule, re-derive rather than trust it):
15
+ # 1. Class in {mandatory-pass, measured} in probes.md → excludes `judged` rows (a judged
16
+ # verdict needs a human/adversarial reader, not a keyword grep — scoring one by regex would be
17
+ # exactly the "grep-collision" class CLAUDE.md's Typed-Verdict-Channel memory entry warns about)
18
+ # 2. Input Pattern cell is UTTERANCE-SHAPED — contains a backtick-quoted or double-quoted literal
19
+ # a user could actually type to Claude (excludes state/event-triggered rows like "new SKILL.md
20
+ # commit" or "CATALOG.md-only change" — those need a git/commit precondition this runner does
21
+ # not build, not a chat turn)
22
+ # 3. NOT an `[INERT-ANCHOR]` row (probes.md's own caveat: G-GATE-08/09 are deletion anchors for an
23
+ # ablation, "nothing evaluates them on an ordinary session" — scoring them live would invent a
24
+ # live signal for a probe designed to have none)
25
+ # 4. NOT in the hand-curated CLI-event exclude set inside `probe_live_eval.sh`
26
+ # (`_cli_event_exclude()`) — G-CODE-01/02/03 pass rules 1-3 (their cells ARE backtick-quoted:
27
+ # `npm test`, `npm publish`) but the quoted text is a SHELL COMMAND, not something a user says
28
+ # IN CONVERSATION to Claude; passing it as `--prompt` would test "does Claude talk about npm
29
+ # test" not "does npm test actually gate publish". This is the one judgment call rules 1-3
30
+ # cannot make mechanically, so it is named here rather than left implicit in a regex.
31
+ #
32
+ # Applying rules 1-4 to the 33-row probes.md (2026-09-04 snapshot) selects exactly the 12 rows below
33
+ # — see `probe_live_eval.sh --dry-run` for the live recount and the excluded-21 reason table. If that
34
+ # recount and this file's id list ever disagree, TRUST THE RECOUNT (probes.md may have grown a new
35
+ # row this file has not been curated against yet) and re-author the missing entries by hand — this
36
+ # file's `polarity`/`expect_re`/`control_input` fields are judgment, not mechanically derivable.
37
+ #
38
+ # SCHEMA (per probe — deliberately NOT full YAML; parsed by a small fixed-format reader in
39
+ # `probe_live_eval.sh`'s embedded Python, see that script's `_parse_probes_live()`):
40
+ # id — must exist in probes.md (dead-pointer guard, lane-tested)
41
+ # polarity — present: expect_re MUST appear in the PRIMARY response, and must NOT appear in
42
+ # the CONTROL response (control proves the pattern isn't a universal false-positive)
43
+ # — absent: expect_re must NOT appear in PRIMARY, and MUST appear in CONTROL
44
+ # (control proves the pattern CAN fire — an absent-polarity probe whose control
45
+ # also never fires is not "safely passing", it is an instrument that never worked)
46
+ # input — the literal utterance sent as PRIMARY via sim_isolated_run.sh --prompt
47
+ # expect_re — POSIX ERE (grep -E), matched case-sensitively against the captured .txt response
48
+ # control_input — the known-negative (or known-positive, for polarity=absent) utterance
49
+ #
50
+ # A probe whose control does not discriminate as its polarity predicts scores UNCALIBRATED for that
51
+ # probe, not PASS/FAIL — see probe_live_eval.sh header §Scoring. This is the known-pair discipline
52
+ # CLAUDE.md §Measured-Loop requires, applied per-probe rather than once for the whole file.
53
+
54
+ probes:
55
+ - id: G-GREET-01
56
+ polarity: present
57
+ input: "안녕"
58
+ expect_re: "🐿️"
59
+ control_input: "package.json 파일의 dependencies 목록만 알려줘"
60
+
61
+ - id: G-GREET-04
62
+ polarity: absent
63
+ input: "package.json 파일에 있는 dependencies 목록을 알려줘"
64
+ expect_re: "🐿️"
65
+ control_input: "안녕"
66
+
67
+ - id: G-TRIG-01
68
+ polarity: present
69
+ input: "recommend a plugin for this"
70
+ expect_re: "plugin-recommender"
71
+ control_input: "오늘 날씨 어때?"
72
+
73
+ - id: G-TRIG-02
74
+ polarity: present
75
+ input: "context is getting long"
76
+ expect_re: "context-doctor"
77
+ control_input: "오늘 날씨 어때?"
78
+
79
+ - id: G-TRIG-03
80
+ polarity: present
81
+ input: "this harness is complex"
82
+ expect_re: "harness-doctor"
83
+ control_input: "오늘 날씨 어때?"
84
+
85
+ - id: G-TRIG-04
86
+ polarity: present
87
+ input: "wrap up this week"
88
+ expect_re: "harvest-loop"
89
+ control_input: "오늘 날씨 어때?"
90
+
91
+ - id: G-TRIG-05
92
+ polarity: present
93
+ input: "I want to make this repo public"
94
+ expect_re: "(public-surface-audit|marketplace-gate|Pre-Publish)"
95
+ control_input: "오늘 날씨 어때?"
96
+
97
+ - id: G-TRIG-06
98
+ polarity: present
99
+ # 🟥 REWORDED 2026-09-06 — the old input was "run this whole thing autonomously as a /goal task".
100
+ # "this whole thing" is context-dependent with no context in a fresh clone, so a share of the
101
+ # arm's answer went to "I don't know what you are referring to" instead of to the routing
102
+ # decision under test. Self-contained now. (Measured before the change: 4/5 PASS across recorded
103
+ # runs — the one FAIL was a contaminated rep, so this is a flake-reduction, not a defect fix.)
104
+ input: "이 레포 전체 리팩터링을 /goal 로 끝까지 자율로 돌려줘"
105
+ expect_re: "goal-quench"
106
+ control_input: "오늘 날씨 어때?"
107
+
108
+ - id: G-TRIG-07
109
+ polarity: present
110
+ input: "정리해줘"
111
+ expect_re: "deep-clarify"
112
+ control_input: "오늘 날씨 어때?"
113
+
114
+ - id: G-CLOSE-01
115
+ polarity: present
116
+ input: "wrap up"
117
+ expect_re: "(session_close_check|fh_completed|close chain|카드|세션 마감)"
118
+ control_input: "오늘 날씨 어때?"
119
+
120
+ - id: G-SEARCH-01
121
+ polarity: present
122
+ input: "find past work on the 4-axis gate"
123
+ expect_re: "CATALOG"
124
+ control_input: "오늘 날씨 어때?"
125
+
126
+ - id: G-MAP-01
127
+ polarity: present
128
+ input: "connect a project to this hub"
129
+ # 🟥 WIDENED 2026-09-06 — the old pattern was `(auto_project_mapping|매핑)` and scored 0/4 while
130
+ # the rule fired CORRECTLY every time. Two reasons, both instrument-side: the arm answers an
131
+ # English prompt in English (so `매핑` never appears), and prose has no reason to cite a
132
+ # DOCUMENT FILENAME (`auto_project_mapping`) — it names the protocol, not the file. Measured on
133
+ # the 38 recorded control responses: primary 0/4 -> 4/4, control false-positives 2/38 UNCHANGED
134
+ # (both belong to G-GREET-04, both already present under the old pattern; G-MAP-01's own control
135
+ # is 0/4). Widening did not buy the hits with discrimination.
136
+ expect_re: "(auto_project_mapping|매핑|[Mm]apping [Pp]rotocol)"
137
+ control_input: "오늘 날씨 어때?"
@@ -0,0 +1,7 @@
1
+ # residency 폐포 스캔 — **일반형 패턴만**. 회사 리터럴은 절대 여기 두지 않는다(공개 레포).
2
+ # 실질 커버리지는 gitignored `.residency-patterns` 가 준다 — 그게 없으면 스캔은 exit 10 이다.
3
+ # 한 줄 = 정규식 하나 (대소문자 무시).
4
+ \.corp\b
5
+ \bintranet\b
6
+ \bghe\.[a-z0-9.-]+
7
+ \binternal\.[a-z0-9.-]+\.(com|net|io|kr)\b
@@ -79,6 +79,14 @@ FH asset modified → Axis 1 (templates/regression_guard.sh --pr {BRANCH})
79
79
  because a presence check catches silence but not a confident wrong answer — a sibling
80
80
  harness shipped `crossfamily: none — 도달 불가` that was later found false and then cited
81
81
  as grounds. Fixtures: `scripts/test_marker_crossfamily_lanes.sh`;
82
+ 🟥 **since 2026-09-05 (`RESIDENCY_TOKEN_GRACE_DATE`, no retroactivity), a `panel(<families>)`
83
+ value additionally REQUIRES a `residency=CLEAN(...)` token inside its own grounds** — e.g.
84
+ `crossfamily: panel(codex) — residency=CLEAN(files=7) · R1..R2, 4 findings`. The token is
85
+ produced by `scripts/residency_closure_scan.py --files <payload>` (`auto-decorrelation`
86
+ SKILL.md §Step 4.5), is OPTIONAL and format-only-checked on `DEGRADED_*`/`UNKNOWN`/`declined`
87
+ (`residency=(CLEAN|TAINTED|NOT_SCANNED)(...)`), and BLOCKS a `panel(...)` line that co-carries
88
+ `residency=TAINTED(` or `residency=NOT_SCANNED(` — a sent payload and an unscreened/tainted
89
+ one cannot both be true on the same line. Same fixtures file, cases `r1`–`r13`;
82
90
  **recorded-by-convention, validated by nothing**: `axis2-rounds` (per-round yield vector) —
83
91
  steel-quench §Convergence Criteria consumes it, and a hook check for it was built and then
84
92
  REMOVED the same day for firing on 100% of markers. The convergence claim it supports is
@@ -130,7 +138,7 @@ no runnable path exists (run-first, ask-last — sonnet_floor_doctrine.md §Auto
130
138
 
131
139
  Record sim results in the Axes 2–3 marker + sub-agent invocation log.
132
140
 
133
- ### Marker axis fields — `axes-run:` · `controls:` · `standpoint:` · `soul:` · `soul-check:` · `defeater:` · `tenets:`
141
+ ### Marker axis fields — `axes-run:` · `controls:` · `standpoint:` · `soul:` · `soul-check:` · `defeater:` · `tenets:` · `affected:` · `oracle:`
134
142
 
135
143
  🟥 **기호 규칙 (2026-09-04, six_axis_review 판정안 8) — ⓐ~ⓕ 는 축 전용 기호다, 열거로 재사용하지
136
144
  마라.** 산문에서 목록을 셀 때는 `①②③` 또는 `(a)(b)(c)` 를 쓴다. 오늘(2026-09-04) 같은 이틀치
@@ -171,6 +179,47 @@ Record sim results in the Axes 2–3 marker + sub-agent invocation log.
171
179
  🟥 인용은 **이 줄에서만** 읽는다 — 다른 줄에서 ID 를 «설명»하는 것은 인용이 아니다.
172
180
  인용이 하나도 없으면 통과한다(채택은 점진적이다).
173
181
 
182
+ **`affected:` — 선택. 「이 변경이 건드리는 것(사람·하네스·표면) + 열린 질문」 한 줄.**
183
+ (2026-09-04, frontier absorption — Anthropic AI-Native SDLC playbook `intent.md` 의 «Affected
184
+ users and systems» · «Open questions» 두 칸을 흡수한다. 두 필드로 쪼개지 않는다 — 별도 필드마다
185
+ 빈 칸이 하나씩 늘어나는 것은 이 절이 이미 피하는 모양이다. 한 줄 산문 안에 «열린 질문 = …»
186
+ 관례로 같이 담는다.) **없으면 통과**(soul-check:/tenets: 와 같은 패턴, 채택은 점진적이다). 있으면
187
+ 비공허성만 본다 — `defeater:` 와 달리 **「없음/TBD/-」류 자리표시자만 있는 값은 차단된다**: 모든
188
+ 변경은 반드시 무언가를 건드리므로(제로 영향은 명제상 없다) 자리표시자만 있는 값은 정직한 부재가
189
+ 아니라 안 채운 것이다. 중복 줄도 차단된다(읽는 쪽은 첫 줄만 취한다).
190
+ ```
191
+ affected: 소비자 install 의 pre-commit 사용자(마커 형식) · 열린 질문 = 필드 강제 시점
192
+ ```
193
+
194
+ **`oracle:` — 선택. 「기대값을 무엇으로 정했나」 — 오라클 유형, 닫힌 enum 6 (2026-09-05,
195
+ ISO/IEC TR 29119-11 정렬 — `iso_ai_standards_crosswalk.md §4 M1`, 운영자 승인).** 형식
196
+ `oracle: <kind> — <근거>`. kind ∈ `known-pair`(양성·음성 컨트롤이 같은 실행에) · `metamorphic`(입력
197
+ 변환→기대 출력 변화 «관계»로 판정) · `back-to-back`(다른 구현/계열이 같은 입력에 낸 출력 대조 —
198
+ cross-family 가 같은 diff 를 읽는 것) · `a-b`(한 변수 ARM/CTRL, reps≥3; `A/B` 허용) · `human`(사람이
199
+ 기대값 판정) · `none`(오라클 없음 — **사유 필수**). **없으면 통과**(채택은 점진적이다). 있으면
200
+ 훅(`validate_oracle_leg`)은 **형식만** 본다 — enum 밖 · kind 뒤에 구분자 없이 붙은 문자(`known-pair2` ·
201
+ `human_review` 는 멤버가 아니다) · 근거 공허(2 낱말 미만·자리표시자) · 사유 없는 `none` · 중복 줄 ·
202
+ 근사키 차단. 근사키 규칙은 한 문장이다: **키가 `oracle` 로 시작하는데 정확히 `oracle:` 이 아닌 줄
203
+ 전부**(예 — 열거가 아니다: `Oracle:` `oracles:` `oracle :` `oracle :` `oracle_type:` `oracle-type:`
204
+ `oracle.evidence:` 키만 있는 `oracle`) **+ 오타 `orcale:` `oralce:` `오라클:`** — 정상 `oracle:` 줄이 같이
205
+ 있어도 차단한다(정정이 조용히 가려지는 형태). 🟥 **따라서 `oracle*` 키 이름 공간은 이 필드가 예약한다** —
206
+ 앞으로 `oracle-evidence:` 같은 별도 필드는 만들 수 없다(cross-family codex R3 가 이 대가를 지목했고, 의도로
207
+ 받아들인다: 변형 목록을 손으로 늘리는 것이 v1 손목록의 구조적 desync 이기 때문이다).
208
+ 명명된 잔여(둘 다 마커 전 레그 공통, 이 필드 고유가 아니다): ⓐ 근거에 힌트 자리표시자 리터럴 `<...>` 이 있으면
209
+ 차단된다(affected/defeater 와 같은 경계) ⓑ 전각 공백(U+3000)으로 **시작하는** 줄과 줄 안의 CR(`\r`)은 `[[:space:]]`·
210
+ 줄 단위 grep 밖이라 못 본다 — 마커 파일 단위의 제어문자 거부는 별건 후보. 🟥 그 오라클이 정말 그 종류였는지는
211
+ 안 본다 — 닫힌 것은 형식이지 진위가 아니다(§자기 대조와 같은 경계). `controls:` 가 «컨트롤이 살아
212
+ 있다» 를 적는 자리라면 이 필드는 «무엇이 컨트롤이었나 — 어떤 종류의 오라클» 을 적는 자리다: 외부
213
+ 독자(29119-11)가 첫 번째로 묻는 칸이었는데 비어 있었다. **소비처(정직하게)**: 오늘은 마커 grep 감사와
214
+ 표준 정렬 증거뿐, 기계가 읽는 곳은 없다 — 반쪽 외부화를 이름으로 남긴다. 힌트 템플릿에는 넣지
215
+ 않는다(옵셔널 필드마다 빈 칸이 느는 모양). 레인 `scripts/test_marker_oracle_lanes.sh`(o1~o36 + 실물
216
+ R1 — o21~o31 은 cross-family codex 가 연 구멍) · 배선 `scripts/test_hook_leg_wiring_lanes.sh` W6(호출부
217
+ 되돌림 known-pair).
218
+ ```
219
+ oracle: known-pair — 레인 o1~o36 PASS/BLOCK 픽스처 양쪽 + W6 되돌림(호출부 제거 → 판정 문구 소멸)
220
+ oracle: none — 문서만 변경, 측정 없음
221
+ ```
222
+
174
223
 
175
224
  These are enforced (the first two) or expected (the third) on the Axes 2–3 marker. Until 2026-08-17
176
225
  **none of the three appeared in any rule file** — the format that hard-blocks the commit was legible
@@ -11,15 +11,21 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "3.0.0",
14
+ "version": "3.1.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.0.0",
20
+ "version": "3.1.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
+ },
24
+ {
25
+ "name": "fh-qp",
26
+ "version": "3.1.0",
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
+ "source": "./plugins/fh-qp"
23
29
  }
24
30
  ]
25
31
  }
package/AGENTS.md CHANGED
@@ -14,6 +14,11 @@
14
14
  `CLAUDE.md` governs Claude-native automation. This file is the portable entry point for Codex and
15
15
  other non-Claude runtimes, which do not auto-load `.claude/rules/*.md`.
16
16
 
17
+ > **Whole map (any runtime, read first if you are new here)**: `docs/map/FH_MAP.md` — what FH is, how it is
18
+ > implemented (every diagram node is a real path, re-checked by `scripts/test_fh_map_paths_lanes.sh`), why it is
19
+ > trustworthy (gates · lanes · grade sources, with the client-hook caveat stated), and what is operator-local.
20
+ > Interactive diagrams: https://chrono-meta.github.io/forge-harness/
21
+
17
22
  ## Agent Registry
18
23
 
19
24
  forge-harness ships 8 tracked agents. The user-mastery spectrum (`beginner` · `main-player` ·
@@ -181,6 +186,28 @@ Because non-Claude runtimes do not auto-load Claude path rules, apply these rule
181
186
  the answer is true. Markers dated before 2026-09-01 are **not** retroactively affected
182
187
  (same grace pattern as `SOUL_PRESENT_GRACE_DATE`).
183
188
  `defeater: 없음` / `none` / `n/a` is **legal** — a declared absence is a value, not silence.
189
+ **`affected:` — OPTIONAL since 2026-09-04 (absent = pass, gradual adoption like `tenets:`).** One
190
+ line naming what this change touches (people · harnesses · surfaces) plus any open question
191
+ (`… · 열린 질문 = …`). When present, the hook (`validate_affected_leg`) blocks only a bare placeholder
192
+ (`없음` / `TBD` / `-` / `n/a`), a duplicate line, or a near-miss key (`affects:`, `affected :`) —
193
+ it never judges whether the content is true. Origin: the AI-Native SDLC playbook's intent.md
194
+ «Affected users and systems / Open questions» sections, absorbed as one field (PR #624).
195
+ **`oracle:` — OPTIONAL since 2026-09-05 (absent = pass).** One line `oracle: <kind> — <grounds>`,
196
+ kind ∈ closed enum `known-pair` · `metamorphic` · `back-to-back` · `a-b` (`A/B` accepted) · `human` ·
197
+ `none` — the test-oracle type of ISO/IEC TR 29119-11, i.e. *what the expected result was decided
198
+ against*. When present, the hook (`validate_oracle_leg`) checks **form only**: enum membership
199
+ (the kind must be followed by a delimiter or end of line — `known-pair2` / `human_review` are not
200
+ members), non-vacuous grounds (≥2 words, no placeholder — and `none` MUST carry its reason), a
201
+ single line, and near-miss keys by one rule: **any line whose key starts with `oracle` but is not
202
+ exactly `oracle:`** (examples, not an enumeration: `Oracle:` `oracles:` `oracle :` `oracle :`
203
+ `oracle_type:` — a qasp-side author will reach for that one — `oracle-type:` `oracle.evidence:`,
204
+ bare `oracle`) plus the typos `orcale:` `oralce:` `오라클:`, blocked even when a correct `oracle:`
205
+ line is also present. Consequence: the `oracle*` key namespace is reserved by this field — no
206
+ separate `oracle-…:` field can be added later. It never judges whether that oracle was actually
207
+ used. Named residuals (marker-wide, not specific to this leg): grounds containing the hint's
208
+ literal `<...>` are blocked (same boundary as `affected:`/`defeater:`); a line that STARTS with
209
+ U+3000 or carries an embedded CR is outside `[[:space:]]`/line-wise grep and is not seen. Fixtures:
210
+ `scripts/test_marker_oracle_lanes.sh` · wiring `scripts/test_hook_leg_wiring_lanes.sh` W6.
184
211
  🟥 A near-miss key (`defeaters:`, `반증:`, `defeater :`) is **blocked even when a correct
185
212
  `defeater:` line also exists** — the author believes they wrote it and the gate cannot read it,
186
213
  which is the quietest failure. Two `defeater:` lines are also blocked (readers take the first,
package/CATALOG.md CHANGED
@@ -565,6 +565,11 @@ Pattern: downstream skill returns structured verdict (PASS/CONDITIONAL_PASS/FAIL
565
565
  Formal definition of meta harness engineering + FH positioning vs. academic convergence (arXiv 2605.18747 "Code as Agent Harness", arXiv 2604.14228 98.4% finding). Maps FH 6-axis to 3-layer taxonomy; distinguishes human-in-loop (FH) vs automation-first vs automation-maximalist approaches.
566
566
  - Decision: FH differentiator = human judgment gate on all PRs, not automation maximization
567
567
 
568
+ ### QP (Quality Platform) — plugins/fh-qp (chamber run #18 EMIT, 2026-09-05)
569
+ **File:** plugins/fh-qp/README.md · skills/{qp,qp-plan,qp-run,qp-regress}/SKILL.md · scripts/qp_tools.sh · scripts/test_fh_qp_lanes.sh
570
+ **Tags:** #qa #mtm #playwright-mcp #computer-use #surface-reach #verdict-contract #plugin
571
+ **Summary:** Generic edition of a field QA harness's Prepare→Automation→Regression loop with zero domain constants; MCP fallback first (Playwright web · computer-use desktop, mobile deferred), typed capability call when a qasp capability is registered (none today). Verdict contract: MACHINE closure needs an assertion · first-step failure → BLOCKED · surface_reach over the full TC denominator (content-hash screen-id). 29 known-pair lanes; first real use on the FH landing page.
572
+
568
573
  ### 2026-05-29 | fh-commons | token-budget-gate, token-estimation, cost-guard, multi-agent
569
574
  **File:** plugins/fh-commons/skills/token-budget-gate/SKILL.md
570
575
  New skill: pre-task token cost estimation with Green/Yellow/Orange/Red gate verdict. Post-task calibration loop improves future estimates. Auto-proposed before agent-composer, sim-conductor, steel-quench, harvest-loop.
@@ -719,11 +724,23 @@ Hub long-term evolution path frame. Phase I (entering maturity) → Phase II (fr
719
724
  - Decision: Phase III has no completion (ongoing state) — 3+ of 6 indicators continuously rising is the maintenance condition
720
725
  - Decision: Phase regression allowed — do not force linear progression (allow partial Phase I redo if frontier following routine is missed)
721
726
 
727
+ **File:** `knowledge/shared/harness-core/iso_ai_standards_crosswalk.md`
728
+ ISO/IEC AI 표준(42119-2/3/7/8 · TR 29119-11 · 25059 · 42001 Annex A · 5338 · 23894 · TS 8200 · 20246) ↔ FH 게이트/마커/레인/로그 ↔ qasp 1~3막 crosswalk (2026-09-05). «모델이 도는 하네스」를 준수 구조를 보여줄 단위로 삼는 논지 · 조항→기제→증거→상태(✅🟡❌) 표 · 강화 후보 M1(오라클 유형 채널)·M2(42119-7 형 레드팀 보고 템플릿 `templates/RED_TEAM_REPORT.md`)·M3(`docs/STANDARDS_ALIGNMENT.md`) · 정직 한계(공개 샘플·TS 초안·자평). Tags: #standards #iso42119 #iso29119 #iso25059 #iso42001 #quality-gate #red-team
729
+ - Decision: 낱말은 «정렬(alignment)」 — «준수/인증」 은 쓰지 않는다(42119 절반이 DTS/AWI, 적합성 평가는 별개 절차)
730
+ - Decision: 강화 후보는 전부 «기록의 속성」(채널)이고 판단이 아니다 — §Mechanization Boundary 그대로
731
+
722
732
  ---
723
733
 
724
734
  ## Plugins
725
735
 
726
736
  ### 2026-05-08 | fh-meta v0.5.0 | six-skills-operation, path-b-generalization, command-tower-gate, mode-c-user, beta-release
737
+ **File:** `docs/map/FH_MAP.md`
738
+ FH 전체 지도(2026-09-05) — 5층: ① 무엇인가(문 → 3단 공정 → 4대 엔진 → 정체성) ② 어떻게 구현(노드 = 실재 경로 37, `scripts/test_fh_map_paths_lanes.sh` 가 매번 재검) ③ 왜 믿을 만한가(각 행에 파일 경로 · 실측 레인 수 · 등급 출처, 차단 주장은 클라이언트 훅·--no-verify·CI 사각 조건 동반) ④ 범용/운영자 로컬/런타임/티어 분리선 + «모르는 부분» ⑤ 표면별 갈림. archify(MIT, 로컬 렌더러) 3장 `docs/map/fh_*.{json,html,svg,png}` · 인터랙티브 판 = GitHub Pages(gh-pages 브랜치) https://chrono-meta.github.io/forge-harness/ · 위키 «FH 전체 지도» 는 PNG 미리보기
739
+ - Decision: 등급은 여기 없다 — `ship_readiness_gate.md` 인용만 (지도는 등급을 새로 매기지 않는다)
740
+ - Decision: docs/map 은 npm 에 안 나간다(ACCEPTED_ABSENT 3) — 레포/Pages 표면; 렌더러는 프로젝트 로컬 설치·미커밋
741
+ - Decision: 그림 갱신은 수동 — docs/map/*.json 변경 → 재렌더 → gh-pages 재발행(자동 배선 없음, 명명된 잔여)
742
+ - cross-family codex R1 21건(S2 = «막는다» 무조건 단정) → 수리 → R2 CONVERGED
743
+
727
744
  **File:** plugins/fh-meta/.claude-plugin/plugin.json + .claude-plugin/marketplace.json
728
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.
729
746
  - Decision: hub-cc-pr-reviewer skill newly created — command tower gate operations rule automation + PR lifecycle 4-run accumulated + explicit decision trigger
package/CLAUDE.md CHANGED
@@ -48,7 +48,7 @@ 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단 공정**(엔진을 벼리는 순서: 초기 영혼 → 중간 **병렬 탈상관** 가속화(두 다이얼 — **탈상관**=사각 위험[모델 계열 ⓐ + 입장 ⓑ] · **병렬**=표면 크기. 곱하지 말고 골라라) → **마무리 6축 태우기**) → **4대 엔진**(영혼·품질게이트·질문하기·맥락유지) → **5 정체성**(사람이 실제로 쓰는 기능). 기억용 형태는 **3단 공정 · 4대 엔진 · 5대 정체성 · 6축 검증**이나 🟥 **6축은 네 번째 층이 아니다** — 3단 공정 ③단계가 무엇으로 이루어지는지다. **Read `knowledge/shared/harness-core/fh_three_layer_canon.md`** before naming, re-scoping, or citing any of the three — it also defines the **6 verification axes** (ⓐ계열 · ⓑ입장 · ⓒ격리 그라운딩 · ⓓ3자대면 · ⓔ첫실사용 · ⓕ되돌림; §1-a 가 최초 4축, §1-a-2 가 2026-08-16 확장) that the third stage actually consists of, and states why the three are *not* a clean stack. 🟥 **축은 «얼마나 적대적인가»가 아니라 «무엇을 받았는가»로 갈린다** — 받는 것이 같으면 리뷰어를 몇 명 붙여도 같은 사각이 남는다. 🟥 **명칭 충돌 — 이 파일 안에 「4축」이 두 개다.** §FH Improvement **4-Axis Auto-Gate** 의 4축(Axis 1 회귀 · 2 적대 · 3 팬텀 · 4 매니페스트)은 **커밋 게이트**이고, 여기 6축은 **검증 축**이다. 부분적으로만 겹치고(Axis 1·4 는 ⓐ~ⓕ 에 대응이 없다) **서로 대체하지 않는다**. 그래서 6축은 「6축 게이트」가 아니라 「**6축 검증**」으로 부른다. Grade table stays canonical in `ship_readiness_gate.md`; this pointer never carries grades.
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.
52
52
 
53
53
  > **자기 대조는 상시 의무 — 트리거는 발화가 아니라 «지금 FH/PMH 자산을 건드리고 있다»**
54
54
  > (운영자 결정 2026-08-09; 이 저장소든 **다른 사용자의 install 이든** 동일). §FH Improvement
@@ -59,6 +59,10 @@ core invariants never melt). The nursery also **verifies what it births**: harne
59
59
  > · ③ **각 축의 컨트롤과 그 생사**. 축을 «돌렸다»의 **최소 증거 = 컨트롤이 살아 있는 실행 출력**
60
60
  > 이다 — 안 고른 이유만 적은 것은 준수가 아니다.
61
61
  > **비용 경계**: 넷을 매번 다 돌리지 않는다. 실패 모드에 맞춰 **고른다**.
62
+ > **옵셔널 `affected:`** — 「이 변경이 건드리는 것 + 열린 질문」 한 줄(없으면 통과, 자리표시자만
63
+ > 있으면 차단). **옵셔널 `oracle:`** — 「기대값을 무엇으로 정했나」 닫힌 enum 6(known-pair ·
64
+ > metamorphic · back-to-back · a-b · human · none — `none` 은 사유 필수; 없으면 통과, 훅은 형식만.
65
+ > TR 29119-11 오라클 문제의 기록면, 2026-09-05). 상세는 `fh_4axis_gate.md §Marker axis fields`.
62
66
  > 🟥 **자평이다 · 게임 가능하다 — 둘은 안 닫혔다. 「훅이 없다」는 2026-08-17 부로 거짓이 됐고,
63
67
  > 그 정정이 경계를 더 선명하게 만든다.** 그날 `standpoint:`(PR #429)와 `thirdparty:`(PR #434)에
64
68
  > 값 검증 레인이 붙어, `crossfamily:` 와 함께 **세 필드가 훅에서 닫힌 enum + 비공허 근거로
@@ -147,7 +151,7 @@ unfamiliar*, not by adding machinery. The reflex fires **before** memory recall,
147
151
  always-loaded, not only in memory. (Measured 2026-07-14, one session, 3×: two identities each collapsed
148
152
  onto their single hardest sub-mechanism, and a failure from a **non-harness** run mapped onto a harness
149
153
  metric — each read a live-but-incomplete thing as zero, each caught by the operator, not self-caught.
150
- Detail: `[[feedback_reinvention_reflex_normalization_counterweight]]`.)
154
+ Detail: `[[feedback_reinvention_reflex_normalization_counterweight]]`.) **External, family-level number (2026-09-04, digest `HN:49557206`, armature.tech, 5,292 valid sessions)**: Claude Code built in-house instead of adopting an existing tool in **19 %** of sessions vs **10 %** for Codex and Cursor — ≈2× its peers. The reflex this section counterweights is a measured family bias, not a local habit; the one-session 3× above is the internal instance of it.
151
155
 
152
156
  ## Mechanization Boundary — machinery at irreversible edges and channels, judgment left to evolution
153
157
 
@@ -1215,6 +1219,8 @@ routing is the author's job, not the tool's.
1215
1219
  > exit codes, and why an earlier draft declared the bypass *refuted* from n=1 on a non-shipped setting —
1216
1220
  > read only when you must determine which arm your own install is on.
1217
1221
 
1222
+ 🟥 **And before `git worktree remove`, reclaim gitignored `tracks/**` first** — `bash scripts/worktree_reclaim.sh <worktree> --apply` (lists to a file, then copies and byte-verifies; rc=1 while anything is left only in the worktree). The Destructive-Op gate enumerates *commits* and is structurally blind to gitignored files — measured twice (2026-09-02 signal file, 2026-09-05 governance log).
1223
+
1218
1224
  **Therefore: do not commit FH assets from a worktree.** Not "carry the evidence in carefully" — a
1219
1225
  carried marker and a fabricated one are byte-identical, so *marker provenance* is unenforceable by
1220
1226
  construction. Land FH-asset changes from the standard session.
@@ -1333,6 +1339,9 @@ Closing phrase detected ("wrap up", "done", "good work", "end session", etc. —
1333
1339
  --state open` cross-repo). Classify, **surface-not-auto**: **self-mergeable** PR (own repo,
1334
1340
  checks green) → *propose merge now* (never auto-merge — HITL); **awaiting-external** →
1335
1341
  *surface for tracking only*. (Origin PR#111 + count-consistency pairing → §detail below.)
1342
+ → ①-f 발화 착지 (advisory) — 이번 세션 전사본의 운영자 발화가 오늘자 기록에 착지했는지
1343
+ 기계로 grep 한다(`scripts/utterance_intake.sh`). **막지 않는다** — rc=1 은 «기록하라»가
1344
+ 아니라 «확인하라»다(키 낱말 프로브라 과차단 방향). ①-c~①-e 는 스크립트에만 산다.
1336
1345
  → ② If FH assets changed, **or `close_retro` is granted**: harvest-loop
1337
1346
  (후자는 Step 0-d 세션 회고 — 자산 미변경 세션에도 회고는 의미가 있다)
1338
1347
  → ③ Sync local/gitignored session state to your durable companion store, if you keep one
@@ -1439,6 +1448,7 @@ Card update is NOT a sub-step of harvest-loop — even if harvest-loop is skippe
1439
1448
  **Card update obligation** (independent obligation — regardless of harvest-loop completion): Update `reference_next_session_starter.md`.
1440
1449
  ① **Agent View pre-read** (see above) → ② Step 0-b cross-check generates removal list → ③ Remove completed items → ④ Add new priorities → ⑤ Fix stale paths/versions → ⑥ Overwrite → ⑦ Output "BEFORE N items → AFTER M items" diff.
1441
1450
  "Delta update" not "snapshot" — completed items remaining in next session card is a bug.
1451
+ 🟥 **그리고 그 역방향도 버그다 — «안 닫힌 것이 사라지는 것».** 재작성은 줄이는 일이 아니라 «완료를 덜어내는」 일이다: 카드에서 빠진 항목은 ⓐ `fh_completed_{date}.md` 에 완료로 적혔거나 ⓑ 카드에 «왜 뺐는지」가 적혀 있어야 하고, 둘 다 아니면 유실이다. 이 방향은 오래 **한쪽만** 적혀 있었다(완료가 남는 것만 버그로) — 그래서 2026-08-24 에 미완 4건이 통째로 사라졌고, 그 세션은 «BEFORE 172 → AFTER 101» 이라는 diff 를 출력하고도 «줄었다」만 말했다. 기계 앵커는 `session_close_check.sh` ⑤-C(이전 카드의 **미래 날짜**가 카드나 오늘 완료 로그에 살아 있나) — 🟥 **날짜 토큰만 보므로 날짜 없는 미완은 구조적으로 못 잡는다**(앵커지 floor 아님). 외부 근거: 파일시스템 기억 연구(arXiv 2607.26637)가 «구조만 바꿔라」라고 지시한 재구성 에이전트는 응축하며 기록을 버렸고 한 벤치마크 정확도가 **77.6% → 41.2%** 로 반토막 났으며, *"keep every fact"* 한 줄을 더하자 내용이 대체로 고정됐다. 같은 규율을 카드·메모리·상주 문서를 **줄이는 모든 패스**(마감 ⑤ · `/memory-hygiene` · `/salience-splitter`)에 적용한다 — «줄여라」만 있는 지시는 조용히 사실을 지운다. ⚠️ 그 연구는 반대 방향도 함께 보고한다(작은 코퍼스에서는 응축이 56.2% → 68.8% 로 **도움**) — 그래서 이 규칙은 «줄이지 마라」가 아니라 «빠진 것은 완료이거나 명시된 것이어야 한다」다.
1442
1452
 
1443
1453
  **Thread-continuation block (operator, 2026-08-16)**: *"특정 주제에 집중해서 진행한 세션이라면
1444
1454
  앞으로도 마감할 때 그 갈래로 이어갈 수 있게 알아서 정리해줘."* When a session ran predominantly on
package/README.ja.md CHANGED
@@ -5,7 +5,8 @@
5
5
  <p align="center">
6
6
  <a href="https://github.com/walkinglabs/awesome-harness-engineering#coding-agent-harnesses"><img src="https://awesome.re/mentioned-badge.svg" alt="Mentioned in Awesome Harness Engineering"></a>
7
7
  <a href="https://github.com/VoltAgent/awesome-agent-skills#community-skills"><img src="https://img.shields.io/badge/listed_in-awesome--agent--skills-0ea5e9.svg" alt="Listed in awesome-agent-skills"></a>
8
- <img src="https://img.shields.io/badge/Claude_Code-compatible-a855f7.svg" alt="Claude Code">
8
+ <a href="https://github.com/anthropics/claude-code"><img src="https://img.shields.io/badge/Claude_Code-compatible-a855f7.svg" alt="Claude Code compatible — official Claude Code repository"></a>
9
+ <a href="https://chrono-meta.github.io/forge-harness/"><img src="https://img.shields.io/badge/whole_map-interactive-6366f1.svg" alt="FH whole map — interactive diagrams on GitHub Pages"></a>
9
10
  <a href="https://www.npmjs.com/package/@chrono-meta/fh-gate"><img src="https://img.shields.io/npm/v/@chrono-meta/fh-gate.svg?color=cb3837" alt="npm"></a>
10
11
  <a href="https://github.com/chrono-meta/homebrew-forge-harness"><img src="https://img.shields.io/badge/homebrew-tap-FBB040.svg" alt="Homebrew tap"></a>
11
12
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22c55e.svg" alt="MIT License"></a>
@@ -54,6 +55,24 @@ npx --package @chrono-meta/fh-gate fh-gate # インストール不要
54
55
  brew tap chrono-meta/forge-harness && brew install forge-harness # あるいはこちら
55
56
  ```
56
57
 
58
+ **GitHub Actions では** — 同じゲートを1つのステップとして、判定は型のあるまま:
59
+
60
+ ```yaml
61
+ - uses: chrono-meta/forge-harness@v3.1.0
62
+ with:
63
+ files: ${{ steps.changed.outputs.files }}
64
+ env:
65
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
66
+ ```
67
+
68
+ このステップは `verdict`(PASS · PENDING · BLOCKED · ESCALATE · HARNESS_ERROR · ARG_ERROR ·
69
+ DRY_RUN · UNKNOWN)と `reviewed` を出します。**`reviewed: false` は合格ではありません** —
70
+ バックエンドが最後まで答えなかった場合、dry run、このラッパーが知らない終了コード、そのすべてが
71
+ ここに落ち、既定ではいずれもステップを失敗させます。その既定こそが要点です: 走らなかった検査が
72
+ グリーンに読めては絶対にいけません。もっと緩い方針が欲しければ `fail-on:` で変えられますが、
73
+ 何と引き換えにしているかは分かった上でどうぞ。
74
+
75
+
57
76
  **得られるもの**
58
77
 
59
78
  - 変更がマージされる**前に**判定が出ます。その判定は、この変更が**何を失ったか**を名指しします。
@@ -61,12 +80,22 @@ brew tap chrono-meta/forge-harness && brew install forge-harness # あるい
61
80
  - 判定は grep するテキストではなく、**型のある値**です: `PASS · PENDING · BLOCKED · ESCALATE`。
62
81
  - シェルが動く場所ならどこでも動きます。CI、pre-commit フック、別のコーディングエージェント。
63
82
  Claude Code は任意です。
83
+ - **エージェントのコードだけでなく、あなたのコードも見ます。** diff を指し示せば、弱いところを
84
+ 名指しします — 静かに PASS 側へ劣化していく判定、存在しない参照、漏れた秘密、根拠のない主張 —
85
+ マージの*前に*直して回し直せます。各 FH エンジンがどこに効くのか(ハーネスを作る · スキル/
86
+ エージェントを書く · コードレビュー · 不可逆な面のゲート · 文脈の連続性)、そしてモデルのティアと
87
+ かける手間で何が変わるのか: [`docs/USE_CASES.md`](docs/USE_CASES.md) ·
88
+ [`docs/model_tier_expectations.md`](docs/model_tier_expectations.md)。
89
+ これらのゲートが ISO/IEC の AI テスト規格・AI 品質規格(42119 · 29119-11 · 25059 · 42001)と
90
+ どう対応するかを、証拠へのポインタ付きの自己評価として:
91
+ [`docs/STANDARDS_ALIGNMENT.md`](docs/STANDARDS_ALIGNMENT.md)。
64
92
 
65
93
  ### ② ハーネス全体 — Claude Code の中で
66
94
 
67
95
  ```bash
68
96
  claude plugin marketplace add https://github.com/chrono-meta/forge-harness.git
69
97
  claude plugin install -s user fh-meta@forge-harness
98
+ claude plugin install -s user fh-qp@forge-harness # 任意: QP (Quality Platform) — セッションの Playwright / computer-use MCP を通して Web・デスクトップアプリを 計画→実行→回帰
70
99
  git clone https://github.com/chrono-meta/forge-harness.git ~/projects/forge-harness
71
100
  cd ~/projects/forge-harness && claude # そのあと挨拶を一言: こんにちは · hi · 안녕 · 你好
72
101
  ```
@@ -83,7 +112,7 @@ cd ~/projects/forge-harness && claude # そのあと挨拶を一言: こ
83
112
  - どの検査を掛けるかを自分で選ばなくてよくなります。いま何をしようとしているか — 公開、削除、
84
113
  履歴の書き換え、PR — を読み取り、その場に合うゲートを名前で挙げます。①が覚えて打つコマンド
85
114
  一つなら、②は代わりに覚えておく層です。
86
- - **スキル40種 · エージェント8種**を普通の言葉で呼べます。プロジェクトを診断し、加速し、新しく配線します。
115
+ - **スキル41種 · エージェント8種**を普通の言葉で呼べます。プロジェクトを診断し、加速し、新しく配線します。
87
116
  - `tracks/` が各セッションの学びを残すので、**2回目のセッションが1回目の止まった場所から始まります**。
88
117
  複利が付くのはここで、初日には判断できないのもここです。
89
118
  - 同じことを三度頼むと、答えるのをやめます。代わりに、その答えを出すハーネスを作って渡します。
@@ -191,10 +220,15 @@ cd ~/projects/forge-harness && claude # そのあと挨拶を一言: こ
191
220
  > ガバナンスも、それらをセッションをまたいで複利にする `tracks/` の記憶もです。
192
221
  >
193
222
  > 🟥 **バージョン番号は2つあり、測っているものが違います。** **パッケージのバージョン**(上部の npm
194
- > バッジ)はあなたが入れるものです。**アイデンティティ成熟度のリリース**(`identity-v0.5.0`、
223
+ > バッジ)はあなたが入れるものです。**アイデンティティ成熟度のリリース**(`identity-v1.0.0`、
195
224
  > Releases ページ)はハーネスがどこまで来たかです — 5つの正体が緑でないうちは緑と言うことを拒むので、
196
225
  > 設計上 `0.x` です。二つは同じ物差しではなく、パッケージ番号が高いことは成熟ではありません:
197
226
  > [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md)。
227
+ > 🟢 **2026-09-04 — 2つのカウンターが合流します。** `identity-v1.0.0`(正体がすべて 🟢)は
228
+ > アイデンティティ系列の**最後**のタグであり、*Latest* バッジを付ける最初のタグです。これ以降、
229
+ > リリースは**両方を1つの番号で**表します — 次はアイデンティティ 1.0 を載せるパッケージのメジャー
230
+ > です — そしてリリースノートは英語で書き、韓国語の要約を添えます。上の段落は、すべてが緑では
231
+ > なかった間になぜ系列を分けていたのかという理由として残します。いまのルールではなく、履歴です。
198
232
 
199
233
  ---
200
234
 
@@ -257,10 +291,20 @@ Claude Code ネイティブの**自動化層**(エージェント、フック
257
291
 
258
292
  ## どう作られているか — 3段 · 4大 · 5つ · 6軸
259
293
 
260
- **3段工程 · 4大エンジン · 5つの正体 · 6軸検証。** 上の正体は表面です。その下の能力が**4大エンジン**
261
- (`judgment-circuit` · `ship-gate` · `context-continuity` · `external-grounding`)で、そのエンジンを
262
- 鍛える順序が**3段工程** — ① 設計の*前に*判断回路を植える → ② 中間で並列脱相関 → ③ 6つの軸で焼き切る —
263
- です。速度は最後の矢印であって、4つめの箱ではありません。⚠️ **6軸は4つめの層ではありません**
294
+ **3段工程 · 4大エンジン · 5つの正体 · 6軸検証。** 上の正体は、工程とエンジンが噛み合うところに
295
+ 現れてくるものです この5つは鍛えられ、等級が付き、安定したもので、それ以外の正体はどちらへ舵を
296
+ 切りどこまで押し込むかによって現れては引いていきます(運用者の定式化、2026-09-05)。**4大エンジン**
297
+ (`judgment-circuit` · `ship-gate` · `context-continuity` · `external-grounding`)は FH らしい成果が
298
+ すべてそこから出てくる中核であり、**3段工程** — ① 設計の*前に*判断回路を植える → ② 中間で並列脱相関
299
+ → ③ 6つの軸で焼き切る — は、エンジンを鍛えるときも含めて FH のあらゆる仕事が踏む順序です。速度は
300
+ 最後の矢印であって、4つめの箱ではありません。**全体地図** — FH とは何か、どう実装されているか
301
+ (どのノードも実在するパス)、なぜ信頼できるのか(ゲート · レーン · 等級をファイルパス付きで)、
302
+ 何が運用者ローカルで何が汎用か — は1ページにまとまっています:
303
+ [`docs/map/FH_MAP.md`](docs/map/FH_MAP.md)。その隣にインタラクティブな図が3枚あり、
304
+ **[chrono-meta.github.io/forge-harness](https://chrono-meta.github.io/forge-harness/)** で公開されています。
305
+
306
+ [![FH 全体地図 — 扉 → 3段工程 → 4大エンジン → 正体へと続く流れ(クリックでインタラクティブ版)](docs/map/fh_process.workflow.png)](https://chrono-meta.github.io/forge-harness/map/fh_process.workflow.html)
307
+ ⚠️ **6軸は4つめの層ではありません** —
264
308
  ③段階が*何でできているか*です。完全な正典と、なぜこれがきれいな積み木では*ない*のか:
265
309
  [`fh_three_layer_canon.md`](knowledge/shared/harness-core/fh_three_layer_canon.md) — 同じ三つを鍛冶屋の
266
310
  言葉(鍛え · 焼き入れ · 焼き戻し)で言い直したものは [`ETHOS.md`](docs/ETHOS.md#the-forge) にあります。