@chrono-meta/fh-gate 2.5.1 → 2.7.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 (57) hide show
  1. package/.claude/rules/fh_4axis_gate.md +26 -3
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/AGENTS.md +24 -3
  4. package/CATALOG.md +41 -0
  5. package/CLAUDE.md +77 -15
  6. package/README.ja.md +36 -11
  7. package/README.ko.md +36 -11
  8. package/README.md +116 -18
  9. package/README.zh.md +32 -11
  10. package/docs/USER_GUIDE.md +118 -0
  11. package/docs/platform_sustainability.md +174 -0
  12. package/knowledge/shared/GLOSSARY.md +26 -1
  13. package/knowledge/shared/harness-core/fh_detail_protocols.md +44 -2
  14. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +19 -5
  15. package/knowledge/shared/harness-core/harness_incubator_doctrine.md +129 -2
  16. package/knowledge/shared/harness-core/multi_model_sidecar_strategy.md +32 -0
  17. package/knowledge/shared/harness-core/ship_readiness_gate.md +77 -8
  18. package/knowledge/shared/learnings/subagent_invocations_log.yaml +110 -0
  19. package/knowledge/shared/rules/knowledge_layer_seam.md +1 -1
  20. package/package.json +17 -3
  21. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  22. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  23. package/plugins/fh-meta/CHANGELOG.md +136 -0
  24. package/plugins/fh-meta/agents/persona-innovator.md +170 -0
  25. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +44 -0
  26. package/plugins/fh-meta/skills/fh/SKILL.md +31 -0
  27. package/plugins/fh-meta/skills/goal-quench/SKILL_detail.md +1 -1
  28. package/plugins/fh-meta/skills/harness-doctor/SKILL.md +7 -1
  29. package/plugins/fh-meta/skills/harvest-loop/SKILL.md +32 -0
  30. package/plugins/fh-meta/skills/public-surface-audit/SKILL_detail.md +16 -1
  31. package/plugins/fh-meta/skills/steel-quench/SKILL.md +97 -0
  32. package/scripts/adapters/fixtures/mate_agent_boundary_known_negative.md +31 -0
  33. package/scripts/adapters/fixtures/mate_agent_boundary_known_positive.md +56 -0
  34. package/scripts/adapters/peer_resolve.sh +58 -6
  35. package/scripts/cluster_capability_scan.sh +60 -18
  36. package/scripts/digest_landing_check.sh +181 -10
  37. package/scripts/fh_hub_identity.sh +83 -0
  38. package/scripts/fh_session_load.sh +53 -5
  39. package/scripts/fh_track_resolve.sh +114 -0
  40. package/scripts/field_canon_preload.sh +50 -5
  41. package/scripts/package_coverage_check.sh +17 -0
  42. package/scripts/prior_art_prompt.sh +168 -0
  43. package/scripts/psa_scan_lib.sh +201 -15
  44. package/scripts/residency_admission_check.sh +204 -0
  45. package/scripts/selfcheck.sh +117 -1
  46. package/scripts/test_adapter_lanes.sh +67 -2
  47. package/scripts/test_heavy_classifier_lanes.sh +144 -0
  48. package/scripts/test_marker_defense_lanes.sh +152 -0
  49. package/scripts/test_marker_soul_check_lanes.sh +211 -0
  50. package/scripts/test_prior_art_prompt_lanes.sh +128 -0
  51. package/scripts/test_psa_singlefile_lanes.sh +351 -1
  52. package/scripts/test_residency_admission_lanes.sh +60 -0
  53. package/scripts/test_track_resolve_lanes.sh +158 -0
  54. package/templates/.git-hooks/pre-commit +400 -4
  55. package/templates/.git-hooks/pre-push +17 -2
  56. package/templates/settings.PriorArt.snippet.json +15 -0
  57. package/scripts/test_satellite_publish_gate_lanes.sh +0 -339
package/README.md CHANGED
@@ -3,12 +3,13 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22c55e.svg" alt="MIT License"></a>
7
- <a href="https://zenodo.org/records/20397566"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.20397566-blue.svg" alt="DOI"></a>
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>
8
7
  <img src="https://img.shields.io/badge/Claude_Code-compatible-a855f7.svg" alt="Claude Code">
9
8
  <a href="https://github.com/chrono-meta/forge-harness/issues/72"><img src="https://img.shields.io/badge/Codex-beta_·_help_validate-f59e0b.svg" alt="Codex-compatible beta — help validate (issue #72)"></a>
10
9
  <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>
11
10
  <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
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22c55e.svg" alt="MIT License"></a>
12
+ <a href="https://zenodo.org/records/20397566"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.20397566-blue.svg" alt="DOI"></a>
12
13
  <a href="https://github.com/chrono-meta/forge-harness/stargazers"><img src="https://img.shields.io/github/stars/chrono-meta/forge-harness?style=social" alt="GitHub stars"></a>
13
14
  </p>
14
15
 
@@ -17,24 +18,48 @@
17
18
  </p>
18
19
 
19
20
  <p align="center">
20
- <sub>If this is useful, a helps others find it.</sub>
21
+ <b>Ask it for things. When the asking repeats, it offers to build you the thing.</b>
21
22
  </p>
22
23
 
23
24
  <p align="center">
24
- <b>Forge your Claude Code projectspass them through, they come out faster.</b><br>
25
- A practitioner's <b>meta-harness</b> — the galaxy your project harnesses live in.<br>It raises each project's <b>floor</b> (harness-ify the setup) and <b>ceiling</b> (accelerate the work), then compounds the gains across your whole portfolio.
25
+ You already tell Claude Code the same things over and over the checks to run, the rules to hold,
26
+ the shape a change has to have.<br>
27
+ <b>forge-harness turns that into something reusable</b>: skills, gates and agents that live in your
28
+ repo and fire on their own.<br>
29
+ Its skills stay general on purpose and get shaped to your case as you go.
30
+ <b>When one shape keeps coming back, it offers to ship it</b> as its own skill, or its own harness.
26
31
  </p>
27
32
 
28
- <p align="center">
29
- <b>Quality is the lever; speed is the result.</b> Every change earns its way through the gates —<br>adversarial · phantom · regression — and <i>that</i> is what makes the next change faster.
30
- </p>
33
+ ---
34
+
35
+ ## Try it in two minutes — you do not have to read this document
36
+
37
+ ```bash
38
+ claude plugin marketplace add https://github.com/chrono-meta/forge-harness.git
39
+ claude plugin install -s user fh-meta@forge-harness
40
+ git clone https://github.com/chrono-meta/forge-harness.git ~/projects/forge-harness
41
+ cd ~/projects/forge-harness && claude
42
+ ```
43
+
44
+ **Then type `hi`.** A numbered menu appears and takes it from there — pick a door, answer a couple of
45
+ questions, and it runs the install wizard for you. Everything below this line is reference for when you
46
+ want it, not homework before you start.
47
+
48
+ **What it amplifies** — the number of attempts; trial and error moves off you and runs in parallel.
49
+ **What it does not** — the model's ceiling. A harness lifts a model to its own ceiling, not past it.
50
+ **How you can check** — it grades itself in public, five identities, in every
51
+ [release](https://github.com/chrono-meta/forge-harness/releases); the ones that are not green name
52
+ the real run still missing.
53
+
54
+ ---
31
55
 
32
56
  <p align="center">
33
- <i>Fork it. Rename it. Make it yours.</i>
57
+ <img src="docs/pillars.svg" alt="FORK - ADAPT - COLLABORATE - EMPOWER" width="680">
34
58
  </p>
35
59
 
36
60
  <p align="center">
37
- <img src="docs/pillars.svg" alt="FORK · ADAPT · COLLABORATE · EMPOWER" width="680">
61
+ <b>Quality is the lever; speed is the result.</b> <i>Fork it. Rename it. Make it yours.</i><br>
62
+ <sub>If this is useful, a star helps others find it.</sub>
38
63
  </p>
39
64
 
40
65
  <p align="center">
@@ -58,7 +83,7 @@
58
83
 
59
84
  ---
60
85
 
61
- ## Get started in 2 minutes
86
+ ## Requirements
62
87
 
63
88
  **Prerequisite**: Claude Code CLI — verify with `claude --version`
64
89
 
@@ -75,11 +100,8 @@ the single place a new machine can learn it. That is an improvement over nowhere
75
100
  python3 -m pip install --user pyyaml # verify: python3 -c 'import yaml; print(yaml.__version__)'
76
101
  ```
77
102
 
78
- Why this is called out rather than left implicit: a release once shipped green from a session whose
79
- `python3` happened to resolve to an **unrelated project's virtualenv** that had PyYAML, while the
80
- machine's own `python3` did not. The gate was never bypassed — it passed, and the pass simply was not
81
- portable. Every verdict from that gate now prints the interpreter and PyYAML version it used, so a
82
- green states what produced it instead of leaving the reader to assume.
103
+ Every verdict from that gate prints the interpreter and PyYAML version it used, so a green
104
+ states what produced it.
83
105
 
84
106
  </details>
85
107
 
@@ -135,11 +157,41 @@ cd ~/projects/{your-project} && claude
135
157
  |---|---|
136
158
  | Solo dev, one project, just trying it | [`templates/starter_profile.md`](templates/starter_profile.md) — one command, curated first-five skills |
137
159
  | Multiple projects, want the compounding hub | Clone the hub (quickstart above) |
138
- | CI / non-Claude runtime, gates only | `npx @chrono-meta/fh-gate` (zero-install governance gate) |
160
+ | CI / non-Claude runtime, gates only | `npx --package @chrono-meta/fh-gate fh-gate` (zero-install governance gate) |
139
161
  | Prefer `brew` over `npx`/`npm` | `brew tap chrono-meta/forge-harness && brew install forge-harness` — same 100%-parity content, different install UX (community tap; not yet in Homebrew Core, so `brew search` won't find it without the tap first) |
140
162
 
141
163
  ---
142
164
 
165
+ ## Two version numbers, and they measure different things
166
+
167
+ This repo publishes **two counters**, deliberately. Conflating them is the single most common way to
168
+ misread the project's status, so they are named here rather than only in the canon.
169
+
170
+ | Counter | Where you see it | What it means |
171
+ |---|---|---|
172
+ | **Package version** (currently **2.7.0**) | npm, the plugin manifests, `git tag v2.x` | *what you install.* Ordinary release numbering: fixes → patch, new assets and gate lanes → minor, a capability **class** appearing or the thing being rebuilt → major |
173
+ | **Identity-maturity release** (currently **identity-v0.4.0**) | the GitHub **Releases** page | *how far along the harness is.* `0.x` carries an incomplete-but-honest status **by design**; **the all-green ship is reserved for `identity-v1.0.0`** — every one of the five identities at 🟢, none 🔵/🟡/🔴 |
174
+
175
+ 🟥 **A high package number does not mean maturity.** `2.7.0` is not "ahead of" `identity-v0.4.0`; they are not on
176
+ the same scale. The maturity track is deliberately allowed to sit at `0.x` while the package ships and
177
+ improves, because the thing `0.x` refuses to do is **lie** — it says out loud that not every identity has
178
+ cleared its bar yet, and each release names exactly which real run is still missing.
179
+
180
+ ⚠️ **Fixed, and the wart is left on the record**: the two counters used to share one `vX.Y.Z` git-tag
181
+ namespace, and only the maturity track had GitHub *Release* objects — so the Releases page showed
182
+ `v0.3.0` as "Latest" while the shipped package was `2.6.0`. Two layers under one name is a defect this
183
+ project keeps finding in its own gates; here it was in its own version numbers. The maturity track now
184
+ carries its own `identity-v*` prefix (first such release: `identity-v0.4.0`, 2026-08-21). 🟥 **Not** by also publishing the package
185
+ track here — that was tried on 2026-08-21 and reverted the same hour: GitHub gives exactly **one**
186
+ "Latest" badge, so two tracks on one page compete for it, and whichever holds it defines what the repo
187
+ says it is. Putting the package number there pushed the maturity claim — the honest core — below it.
188
+ **The Releases page carries the maturity track; what the package shipped is carried by
189
+ [CHANGELOG](plugins/fh-meta/CHANGELOG.md) and the registry.** Existing tags are left alone — renaming them is an irreversible operation on a public surface, and the
190
+ [Destructive-Op gate](knowledge/shared/harness-core/claude_md_gate_details.md) applies to us too.
191
+
192
+ Full rules for what each grade requires:
193
+ [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md).
194
+
143
195
  ## What it is
144
196
 
145
197
  forge-harness is structured as **two distinct layers**:
@@ -320,11 +372,26 @@ That is why the column that matters most below is *what it gets*:
320
372
  |---|---|---|---|
321
373
  | **ⓐ Different family** | the diff + the author's framing | the **implementation** is wrong | a reviewer from another model family (`auto-decorrelation`) |
322
374
  | **ⓑ Standpoint** | the diff + **the target harness's own canon** | **whether the rule you cited actually says that** | run the diff from that harness's own repo and rules ([`§7`](knowledge/shared/harness-core/field_verdict_crossfamily_gate.md)) |
323
- | **ⓒ Isolated grounding** | the sentences the author wrote + the tree as it stands now | the **claim** is wrong | someone who did not write it re-measures what it says |
375
+ | **ⓒ Isolated grounding** | the sentences the author wrote — their claims *and* what they **declared before starting** — + the tree as it stands now | the **claim** is wrong · the delta does not match what was declared | someone who did not write it re-measures what it says; for the pre-declaration, a gate that reads the stated success definition back against the delta |
324
376
  | **ⓓ Third-party encounter** | the problem + **someone else's codebase** | **is this already solved** · where your change touches someone else's repo | look at the same problem in an unrelated third repo |
325
377
  | **ⓔ First real use** | one real target | the **way you are measuring** is wrong — the instrument's instrument | run it once against one real target and check the result by hand |
326
378
  | **ⓕ Revert and observe** | the tree with the wiring deleted | the **anchor** is wrong — the check is decorative | delete the thing it guards and confirm *that specific* check goes red |
327
379
 
380
+ > **ⓒ widened on 2026-08-21, and how it widened is the more useful part.** Every commit marker in
381
+ > this repo has been required since 2026-08-09 to carry the author's own pre-declaration — *what
382
+ > counts as success* and *what I will not do* — written before designing. Measured with a control
383
+ > that day: **nothing read it.** Zero lines of consuming code anywhere, while the sibling fields
384
+ > were checked in 21 places; the gate spec did not even name it. On the real corpus, **37 of 98
385
+ > markers carried no such line at all** — including a panel-reviewed one with 28 lanes and every
386
+ > other field filled. The axes all looked *outward* (the diff, the target repo, prior art, the
387
+ > artifact); none looked at the record's own mandatory field. A slot with no consumer always
388
+ > reports "done", because presence is doing the judging.
389
+ >
390
+ > The fix was not a seventh axis. ⓒ already receives *the sentences the author wrote plus the tree
391
+ > as it stands* — which is, word for word, what a pre-declaration check receives. Tense (declared
392
+ > beforehand vs claimed afterwards) is a **posture**, like adversariality, not an axis. Minting a
393
+ > new one would have repeated the exact error the blind reclassification above found.
394
+
328
395
  **You do not run all six every time, and that is the design** — do not multiply them, **choose**:
329
396
 
330
397
  ```
@@ -353,6 +420,37 @@ with tools**, the boundary blurs — an outside judgment held that "the store is
353
420
  Conversely, "a rule another repo retired long ago" **cannot be fetched by any tool** — there is no reason
354
421
  to have access to that project's review history in the first place. That is where ⓓ remains.
355
422
 
423
+ **Where a rule lives — and why the always-loaded layer does not have to grow forever.**
424
+
425
+ A harness learns by writing rules down. The obvious place is the always-loaded file every session
426
+ reads, and that file only ever gets longer. Left there, the reasoning ends in a corner: *a harness
427
+ that keeps learning keeps getting more expensive to start.*
428
+
429
+ It does not, because a rule has **three possible seats**, and the right one is decided by **when the
430
+ rule has to fire**:
431
+
432
+ | Seat | Fires | Costs | Fits |
433
+ |---|---|---|---|
434
+ | **Always-loaded** | before you act | every session, every turn | rules whose trigger is an *intention* — tone, "don't normalize the unfamiliar", "prove the instrument works here". Nothing can hook an intention, so salience is the only layer |
435
+ | **The gate's own error message** | at the moment you act | **nothing** | rules whose trigger is an *action*. The message that blocks you also teaches the form: `Write, before the design: success = «…». never = «…».` |
436
+ | **The hook** | after you act | nothing | properties of a record — present · typed · attributable · non-vacuous |
437
+
438
+ The middle seat is the one that usually goes unused, and it is free. It is
439
+ [gate-locality](knowledge/shared/harness-core/gate_locality_principle.md) applied to salience: the actor reads it exactly where the
440
+ action happens, so it does not have to be carried all session to be there when needed.
441
+
442
+ 🟥 **It is a third layer, not a replacement — and the honest limit is that it only fires on failure.**
443
+ Someone who gets it right never sees it. So mechanizing a rule does **not** shrink the resident layer:
444
+ measured on the very change described above, the machine grew by 480 lines and the always-loaded prose
445
+ by **zero**, and that is correct. The prose has to reach the author *before* they design; the hook
446
+ catches its absence *after*. A backstop cannot substitute for salience that must fire earlier.
447
+
448
+ ⚠️ And the threshold that would tell you the resident layer is "too big" is, in this repo, **not
449
+ grounded** — the numbers in our own doctor skill were introduced without a single line justifying the
450
+ cutpoints, and one of them was set to a value the target already exceeded on the day it landed. We are
451
+ re-deriving them rather than trimming toward a number nobody can defend. Cutting resident text toward
452
+ an unjustified target buys fail-open with the savings.
453
+
356
454
  > 🟥 **Limits to read before citing this**: the six-axis table is **n=1** (one artifact · one session ·
357
455
  > one author). Whether the axes' non-overlap is structural or an accident of that day is **unmeasured**.
358
456
  > And when the author's self-scoring was stripped out — 16 findings handed, **with their provenance
package/README.zh.md CHANGED
@@ -3,12 +3,13 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22c55e.svg" alt="MIT License"></a>
7
- <a href="https://zenodo.org/records/20397566"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.20397566-blue.svg" alt="DOI"></a>
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>
8
7
  <img src="https://img.shields.io/badge/Claude_Code-compatible-a855f7.svg" alt="Claude Code">
9
8
  <a href="https://github.com/chrono-meta/forge-harness/issues/72"><img src="https://img.shields.io/badge/Codex-beta_·_help_validate-f59e0b.svg" alt="Codex-compatible beta — help validate (issue #72)"></a>
10
9
  <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>
11
10
  <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
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22c55e.svg" alt="MIT License"></a>
12
+ <a href="https://zenodo.org/records/20397566"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.20397566-blue.svg" alt="DOI"></a>
12
13
  <a href="https://github.com/chrono-meta/forge-harness/stargazers"><img src="https://img.shields.io/github/stars/chrono-meta/forge-harness?style=social" alt="GitHub stars"></a>
13
14
  </p>
14
15
 
@@ -17,24 +18,44 @@
17
18
  </p>
18
19
 
19
20
  <p align="center">
20
- <sub>如果这对你有用,⭐ 一下能帮助更多人发现它。</sub>
21
+ <b>有需要就交给它。同一个请求反复出现时,它会主动提议把那件事本身做出来。</b>
21
22
  </p>
22
23
 
23
24
  <p align="center">
24
- <b>锻造你的 Claude Code 项目 —— 让它通过,它会更快出炉。</b><br>
25
- 一个实践者的 <b>元框架 (meta-harness)</b> —— 你的项目框架们所栖居的星系。<br>它抬高每个项目的 <b>下限 (floor)</b>(把设置框架化)和 <b>上限 (ceiling)</b>(加速工作),再把这些收益在你的整个项目组合中复利累积。
25
+ 你大概已经在对 Claude Code 反复说同样的话:要跑的检查、要守的规则、一次变更该有的样子。<br>
26
+ <b>forge-harness 把这些变成可复用的东西</b>:住在你仓库里、会自己触发的技能、闸门和 agent。<br>
27
+ 技能刻意保持通用,在使用过程中按你的场景当场锻造。
28
+ <b>当同一种形状反复回来,它就提议出货</b> —— 作为独立技能,或独立框架。
26
29
  </p>
27
30
 
28
- <p align="center">
29
- <b>品质是杠杆,速度是结果。</b> 每一次变更都要挣得通过门禁的资格 ——<br>对抗 (adversarial) · 幽灵 (phantom) · 回归 (regression) —— 而 <i>正是这一点</i>让下一次变更更快。
30
- </p>
31
+ ---
32
+
33
+ ## 两分钟就能试 —— 你不必读完这份文档
34
+
35
+ ```bash
36
+ claude plugin marketplace add https://github.com/chrono-meta/forge-harness.git
37
+ claude plugin install -s user fh-meta@forge-harness
38
+ git clone https://github.com/chrono-meta/forge-harness.git ~/projects/forge-harness
39
+ cd ~/projects/forge-harness && claude
40
+ ```
41
+
42
+ **然后输入 `hi`。** 会出现一个带编号的菜单,之后由工具引导你:选一个入口,回答几个问题,
43
+ 它会替你运行安装向导。这条线以下是需要时再查的参考资料,而不是开始前的作业。
44
+
45
+ **它放大什么**:尝试的次数。试错从你身上移开,并行运行。
46
+ **它不放大什么**:模型的天花板。框架只把模型抬到它自己的天花板,不会更高。
47
+ **如何验证**:它公开自己的评级。五个身份,如实记录在每一次
48
+ [发布](https://github.com/chrono-meta/forge-harness/releases)中。未变绿的那些,会指名说出还缺哪一次真实运行。
49
+
50
+ ---
31
51
 
32
52
  <p align="center">
33
- <i>Fork 它。改名。让它成为你的。</i>
53
+ <img src="docs/pillars.svg" alt="FORK - ADAPT - COLLABORATE - EMPOWER" width="680">
34
54
  </p>
35
55
 
36
56
  <p align="center">
37
- <img src="docs/pillars.svg" alt="FORK · ADAPT · COLLABORATE · EMPOWER" width="680">
57
+ <b>质量是杠杆,速度是结果。</b> <i>Fork 它。改名。让它成为你的。</i><br>
58
+ <sub>如果这对你有用,⭐ 一下能帮助更多人发现它。</sub>
38
59
  </p>
39
60
 
40
61
  <p align="center">
@@ -130,7 +151,7 @@ cd ~/projects/{your-project} && claude
130
151
  |---|---|
131
152
  | 单人开发者,一个项目,只想先试试 | [`templates/starter_profile.md`](templates/starter_profile.md) —— 一条命令,一份精选的头五个技能 |
132
153
  | 有多个项目,想要那个复利累积的中枢 | 克隆中枢(见上面的快速上手) |
133
- | CI / 非 Claude 运行时,只要门禁 | `npx @chrono-meta/fh-gate`(零安装的治理门禁) |
154
+ | CI / 非 Claude 运行时,只要门禁 | `npx --package @chrono-meta/fh-gate fh-gate`(零安装的治理门禁) |
134
155
  | 比起 `npx`/`npm` 更习惯 `brew` | `brew tap chrono-meta/forge-harness && brew install forge-harness` —— 内容 100% 一致,只是安装体验不同(社区 tap;尚未进入 Homebrew Core,所以不先加 tap 的话 `brew search` 找不到它) |
135
156
 
136
157
  ---
@@ -0,0 +1,118 @@
1
+ # forge-harness 사용 가이드
2
+
3
+ > **이 문서는 「읽는」 문서다.** 명령을 찾으려면 `CHEATSHEET.md`, 과거 작업을 찾으려면
4
+ > `CATALOG.md`, FH 가 무엇이고 왜 작동하는지는 `README.md` 를 봐라. 여기는 **처음 쓰는 사람이
5
+ > 첫 세션을 완주하는 것**만 다룬다.
6
+
7
+ ---
8
+
9
+ ## 0. 먼저 — 지금 내 상태가 무엇인가
10
+
11
+ FH 는 세 가지 상태로 쓸 수 있고, **되는 일이 다르다.** 아래를 그대로 실행해서 확인해라.
12
+
13
+ ```bash
14
+ ls CLAUDE.md knowledge/ plugins/ 2>/dev/null # 있으면 → 클론했다 (A/B)
15
+ claude plugin list | grep fh-meta # 있으면 → 플러그인이 깔렸다
16
+ ls tracks/ 2>/dev/null # 디렉토리가 있으면 → 프로젝트가 매핑돼 있다
17
+ ```
18
+
19
+ | 상태 | 무엇이 되나 | 무엇이 안 되나 |
20
+ |---|---|---|
21
+ | **클론 + 플러그인** | 전부 | — |
22
+ | **클론만** | 규칙·지식·게이트(훅) | 슬래시 커맨드(`/harness-doctor` 등) |
23
+ | **플러그인만** | 스킬 호출 | `knowledge/` 정본, 세션 기록(`tracks/`), 자체 게이트 |
24
+
25
+ 셋 다 아니면 `README.md` 의 설치 절을 먼저 보고 오면 된다.
26
+ 확신이 안 서면 **`/install-doctor`** 를 부르면 기계가 대신 판정해준다.
27
+
28
+ ---
29
+
30
+ ## 1. 첫 세션 — 실제로 무엇을 타이핑하나
31
+
32
+ **「안녕」 한 마디면 된다.** 인사가 온보딩 트리거다(어느 언어든).
33
+
34
+ ```
35
+ 당신: 안녕
36
+ FH : 🐿️ Welcome to FH. ① 첫 프로젝트 만들기 · ② 기존 프로젝트 매핑 …
37
+ ```
38
+
39
+ 문이 뜨면 **번호를 말하거나 그냥 하고 싶은 일을 문장으로 말하면 된다.** 문은 안내지 강제가 아니다.
40
+ 바로 일을 시키고 싶으면 인사를 건너뛰고 작업을 말해도 된다 — 그러면 메뉴는 안 뜬다.
41
+
42
+ **문이 하는 일**
43
+
44
+ | 문 | 언제 고르나 |
45
+ |---|---|
46
+ | ① 프로젝트 매핑 | 이미 있는 레포를 FH 가 알게 한다. 여기서부터 대부분 시작한다 |
47
+ | ② 새 프로젝트 | 아직 없는 것을 처음부터 |
48
+ | ③ 가속/진단 | 매핑된 프로젝트에 대해 «개선해줘» · «진단해줘» |
49
+ | ④ 크로스 시너지 | 프로젝트가 2개 이상일 때만 뜬다 |
50
+ | 🔧 FH 자체 개발 | FH 를 고치는 사람에게만 뜬다 |
51
+ | 📖 가이드 · Q&A | 이 문서를 열거나, FH 사용법을 묻는다 |
52
+
53
+ ---
54
+
55
+ ## 2. 알아두면 헷갈리지 않는 것 넷
56
+
57
+ **ⓐ FH 는 「대신 해주는」 게 아니라 「틀리기 어렵게」 만든다.**
58
+ 그래서 가끔 **막는다.** 커밋이 막히면 고장이 아니라 게이트가 일한 것이고, 화면에 **무엇을 하면
59
+ 풀리는지**가 같이 뜬다. 그 문구를 그대로 따르면 된다.
60
+
61
+ **ⓑ 「없음」과 「못 쟀음」을 구별해서 말한다.**
62
+ FH 는 확인 못 한 것을 0 으로 적지 않는다. `UNMEASURED` · `SKIPPED` · `못 쟀다` 같은 말이 보이면
63
+ **그건 실패가 아니라 정직한 공백**이다. 숫자가 안 나온 게 아니라 안 나왔다고 말하는 중이다.
64
+
65
+ **ⓒ 비가역한 일 앞에서는 반드시 멈춘다.**
66
+ 공개 전환 · 삭제 · 히스토리 재작성. 되돌릴 수 있는 일(커밋 등)은 경고만 하고 넘어간다.
67
+ **이 둘의 차이가 FH 설계의 중심**이다.
68
+
69
+ **ⓓ 기록은 자동으로 쌓인다.**
70
+ `tracks/` 는 gitignored 라 공개 레포에 안 올라간다. 세션이 끝날 때 카드가 갱신되고,
71
+ 다음 세션이 그걸 읽고 이어간다. 「지난번에 뭐 했지」라고 물으면 거기서 찾아 답한다.
72
+
73
+ ---
74
+
75
+ ## 3. 자주 막히는 곳 (FAQ)
76
+
77
+ **Q. 커밋했는데 `🚫 BLOCKED` 가 뜬다.**
78
+ FH 자산(규칙·스킬·스크립트 등)을 고치면 4축 검증 마커를 요구한다. 화면에 **정확히 무엇을 어디에
79
+ 쓰라고** 나온다. 우회(`--no-verify`)는 같은 훅에 있는 삭제 방지 게이트까지 같이 끄니 쓰지 마라.
80
+
81
+ **Q. 슬래시 커맨드가 안 먹는다.**
82
+ 플러그인이 안 깔렸거나 옛 버전이다. `claude plugin list` 로 버전을 보고, 레포 `package.json` 의
83
+ 버전과 다르면 `claude plugin update fh-meta@forge-harness` 후 재시작해라.
84
+ **등록됐다 ≠ 최신이다** — 이건 실제로 자주 난다.
85
+
86
+ **Q. 훅이 안 도는 것 같다.**
87
+ `git config core.hooksPath` 가 `templates/.git-hooks` 를 가리켜야 한다. 비어 있으면
88
+ `/install-wizard` 를 다시 돌려라(멱등이다).
89
+
90
+ **Q. 플러그인만 깔면 뭐가 없나?**
91
+ `knowledge/` 정본 · `tracks/` 세션 기록 · 이 레포 자체 게이트. 스킬은 돈다.
92
+
93
+ **Q. `tracks/` 는 왜 gitignored 인가?**
94
+ 세션 기록엔 로컬 경로·프로젝트 이름 같은 개인 정보가 섞인다. 공개 레포에 안 올라가는 게 기본이고,
95
+ 따로 보관하고 싶으면 개인 저장소를 붙이면 된다.
96
+
97
+ **Q. 「진단해줘」와 「개선해줘」는 뭐가 다른가?**
98
+ 같은 문이다(③). FH 가 기존 검사들을 모아 **M/S/R 로 등급 매긴 목록**을 주고, **자동으로 안 고친다.**
99
+ 무엇을 할지는 사람이 고른다.
100
+
101
+ **Q. 토큰이 너무 든다.**
102
+ `/context-doctor` 를 불러라. 무엇이 상주 중이고 무엇을 뺄 수 있는지 진단한다.
103
+
104
+ ---
105
+
106
+ ## 4. 더 읽을 것
107
+
108
+ | 알고 싶은 것 | 어디 |
109
+ |---|---|
110
+ | 명령·트리거 문구 전체 | `CHEATSHEET.md` |
111
+ | FH 가 무엇이고 왜 작동하나 | `README.md` |
112
+ | 용어 | `knowledge/shared/GLOSSARY.md` |
113
+ | 예전에 무슨 작업을 했나 | `CATALOG.md` |
114
+ | 기여하기 | `docs/CONTRIBUTING.md` |
115
+
116
+ ---
117
+
118
+ *이 문서가 답을 안 주면 그냥 물어봐라 — FH 는 위 문서들을 근거로 답하고, **없으면 없다고 말한다.***
@@ -0,0 +1,174 @@
1
+ ---
2
+ title: FH Platform Sustainability — Plan B + Simplification Criteria
3
+ type: strategy
4
+ date: 2026-05-18
5
+ tags: [sustainability, plan-b, simplification-gate, scenario]
6
+ ---
7
+
8
+ # FH Platform Sustainability
9
+
10
+ > **Purpose**: Document how forge-harness survives and evolves in scenarios where the Anthropic official ecosystem expands. Describes simplification gate criteria and meta-harness specification principles together.
11
+
12
+ ---
13
+
14
+ ## 1. FH Survival Strategy Per Anthropic Official Ecosystem Expansion Scenario
15
+
16
+ As Anthropic develops Claude Code, some FH functions may overlap with default features. This section states FH's differentiation points and survival strategy for each scenario.
17
+
18
+ ### Scenario A: Anthropic official skill marketplace launches
19
+
20
+ **Risk**: If Anthropic operates an official skill marketplace, FH's plugin distribution function could be replaced.
21
+
22
+ **FH differentiation**:
23
+ - **Organization-specific domain curation**: Generic skills in the official market vs FH's optimized combinations for your organization's specific infrastructure — irreplaceable
24
+ - **Organizational context preservation**: `tracks/` session history and `knowledge/` domain knowledge are organization-specific assets — cannot be transferred to the official market
25
+ - **Federated market role**: FH becomes a sub-channel (specialized marketplace) of the official market → actually strengthens canonical source positioning
26
+
27
+ **Strategy**: When official market launches, use `marketplace-gate` skill to select FH assets worth registering in the official market → contribute to the official market in reverse.
28
+
29
+ ---
30
+
31
+ ### Scenario B: Claude Code harness diagnostic features built-in
32
+
33
+ **Risk**: Features similar to `harness-doctor` and `context-doctor` may be added as Claude Code default features.
34
+
35
+ **FH differentiation**:
36
+ - **Organization context-specific diagnosis**: Default features are generic — FH has organization-specific diagnostic layers (your GHE structure, network policies, etc.)
37
+ - **Three-Doctor Loop**: `harness-doctor` + `context-doctor` + `sim-conductor` closed-loop connection is a system, not a single feature — not replaceable by one default feature
38
+ - **L4~L5 layers**: Field project connection diagnosis (L4) + skill activity, context fit, and effect indicators (L5) are FH-unique layers
39
+
40
+ **Strategy**: Delegate L1~L3 that overlap with default features to defaults, and FH focuses on L4·L5 organization-specific layers.
41
+
42
+ ---
43
+
44
+ ### Scenario C: Organization-internal marketplace newly created
45
+
46
+ **Risk**: If an internal official marketplace is created by your organization's leadership, FH's internal distribution role could be replaced.
47
+
48
+ **FH differentiation → FH becomes canonical source**:
49
+ - FH = the **original input** for the internal marketplace. Verified skills originate from FH → the market is a distribution channel
50
+ - `marketplace-gate` skill already performs pre-registration 5-point suitability gate — can naturally integrate with the internal market quality gate
51
+ - `field-harvest` feeds field patterns back to FH → plays the role of automatic supply pipeline to the internal market
52
+
53
+ **Strategy**: When internal marketplace is created, position FH as canonical source. Register FH in the internal market as an official source.
54
+
55
+ ---
56
+
57
+ ### Common principle: Replacement vs Complement judgment criteria
58
+
59
+ | Judgment criterion | Replaced (delegate) | Complement maintained |
60
+ |---|---|---|
61
+ | Generic function | Delegate to default feature + remove from FH | — |
62
+ | Organization-specific function | — | Maintain in FH + layer on top of default feature |
63
+ | Domain knowledge assets (`knowledge/`) | — | FH-unique — irreplaceable |
64
+ | Session history (`tracks/`) | — | FH-unique — irreplaceable |
65
+ | Cross-project synergy combinations | — | FH-unique combination — not possible with single default feature |
66
+
67
+ > **Core principle**: FH differentiates through **combination, context, and accumulation** rather than feature competition. As default features get stronger, the value of FH's combination layer grows more.
68
+
69
+ ---
70
+
71
+ ## 2. Simplification Gate Criteria
72
+
73
+ > **Basis**: "A good harness gets simpler over time. If it's getting more complex, something is wrong." — CLAUDE.md throughline
74
+
75
+ ### Required checks before adding new skills (RULE-AUTO-EXPANSION-GATE)
76
+
77
+ Every time a new skill addition proposal arises, the following checklist must be passed first.
78
+
79
+ **Checklist** (check in order):
80
+
81
+ ```
82
+ [ ] 1. Is there an existing skill among the current skills that can cover it?
83
+ → If yes: replace with existing skill SKILL.md improvement. No new creation.
84
+ → If no: proceed to next check.
85
+
86
+ [ ] 2. Did it pass `/asset-placement-gate` 4-criteria judgment?
87
+ → ①(cross-project value) + ④(non-duplicate with existing skills) must pass
88
+ → If not passed: no new creation.
89
+
90
+ [ ] 3. Has it been demonstrated as a pattern repeated 3+ times in the field?
91
+ → 1-2 time pattern: mark as candidate only + ★ 1 → create properly after 3+ accumulation
92
+ → 3+ time pattern: creation possible.
93
+
94
+ [ ] 4. Can `/marketplace-gate` Check 1~5 PASS?
95
+ → If FAIL items exist: revise then re-verify.
96
+ ```
97
+
98
+ All 4 checks must pass to proceed with creation. **If any one fails, no creation**.
99
+
100
+ ### Existing skill deprecation criteria
101
+
102
+ `harness-doctor` L5-A INACTIVE_90D judgment = Deprecation Gate entry:
103
+
104
+ | Status | Criteria | Handling |
105
+ |---|---|---|
106
+ | INACTIVE_30D | 0 times within 30 days | `/sim-conductor D skill {name}` — trigger phrase verification |
107
+ | INACTIVE_90D | 0 times within 90 days | Deprecation Gate — consider deprecation/consolidation |
108
+ | Deprecation confirmed | INACTIVE_90D + coverable skill exists | archive + remove corresponding skill SKILL.md |
109
+
110
+ ---
111
+
112
+ ## 3. Meta-Harness Specification Simplification Principle
113
+
114
+ > **Core proposition**: "The meta-harness gets simpler **within its own specification (meta layer)** — do not evaluate by single project standards."
115
+
116
+ ### Server room vs data center distinction
117
+
118
+ | Classification | Criteria | Application |
119
+ |---|---|---|
120
+ | **Server room** (single project) | 200-line CLAUDE.md standard | Single project exceeds 200 lines = M-tier |
121
+ | **Data center** (meta-harness) | Meta layer specification standard | **No line/count threshold exists.** `harness-doctor` declares meta CLAUDE.md raw line and section count **"Not a verdict"** and judges by the char-based always-loaded footprint (S > 40k · M > 80k) plus the residency ledger and the doctrine red flags (orphaned · redundant · decorative) |
122
+
123
+ `harness-doctor` L2 complexity diagnosis automatically applies this separation:
124
+ - Scope is decided **mechanically at the TARGET root** (`tracks/` ∧ `knowledge/` ∧ `plugins/` all present = meta),
125
+ never from cwd and never self-declared — a bare cwd test misclassifies every field target as meta
126
+ - On a meta target the line-count rows are **disabled outright**, not swapped for a larger number —
127
+ so `harness-doctor` cannot fire an **M-tier** on FH's own CLAUDE.md off a single-project line
128
+ standard. The verdict comes instead from the footprint rows, which apply to both scopes and are
129
+ char-based; those *can* legitimately reach M-tier, and when they do the lever is capability-level
130
+ (merge or retire a governance unit), never "the file is long"
131
+
132
+ ### Meta-harness self-constraint prohibition
133
+
134
+ Prohibit the pattern of applying external standards (single project complexity standards) to the meta-harness to self-constrain:
135
+
136
+ - **Prohibited**: "FH has N skills, it's gotten complex → needs to be reduced" (single project standard applied)
137
+ - **Allowed**: "Among FH skills, some have 0 invocation records within 90 days → those skills enter Deprecation Gate" (meta layer standard applied)
138
+
139
+ 🟥 **Why this section carries no numbers (2026-08-20).** It used to pin "500-line / 16 skills".
140
+ Both went stale (CLAUDE.md is past 1,400 lines; there are 40 skills) and — worse — the 500 was
141
+ **contradicted by the skill it claimed to describe**: `harness-doctor` disables the line-count row for
142
+ meta targets rather than raising it. That live-but-wrong number is not inert: a run once fabricated
143
+ `M-1 · exceeds the FH threshold of 500` and a downstream sidecar reasoned from the invented figure
144
+ (recurrence N=2 — `harness-doctor/SKILL.md` §"Every M/S-tier must cite the row it fired"). The skill's
145
+ own post-mortem grepped **itself** and found 0 hits, so it concluded the threshold was invented from
146
+ nothing — it never grepped the repo, where **this file was the source**. Do not re-pin a number here:
147
+ thresholds belong in the skill that measures them, where a citation can be quoted verbatim.
148
+
149
+ Judgment standard: **If there are no real-use problems, no simplification pressure**. Simplification is solving real-use problems, not reducing complexity.
150
+
151
+ ---
152
+
153
+ ## 4. External Contribution Facilitation Structure (not one-way)
154
+
155
+ FH aims for a **bidirectional contribution structure**, not one-way distribution.
156
+
157
+ ### Contribution occurrence examples
158
+
159
+ | Contribution direction | Example | Channel |
160
+ |---|---|---|
161
+ | FH → field | Skill/agent distribution, session context connection | plugin install, clone |
162
+ | Field → FH | Field pattern feedback (`field-harvest`) | PR |
163
+ | External → FH | External user contributions, cascade β | External PR / autonomous operation |
164
+
165
+ ### cascade β demonstration
166
+
167
+ - An external user (not the owner) autonomously operated FH skills → caught and merged a bug in a PR
168
+ - Contribution from external project: owner contributed to that project → demonstrated structure where FH facilitates external contributions
169
+
170
+ **Meaning**: FH looks like a 1-contributor project but it's an **amplifier structure** where contributions to other projects occur through FH.
171
+
172
+ ---
173
+
174
+ *Reference: `CONTRIBUTING.md` (PR rules) · `plugins/fh-meta/skills/asset-placement-gate/SKILL.md` (new asset judgment) · `plugins/fh-meta/skills/harness-doctor/SKILL.md` (L5 activity check)*
@@ -74,4 +74,29 @@
74
74
 
75
75
  ---
76
76
 
77
- *Updated: 2026-05-26*
77
+ ## Notation — `[[wikilink]]` in FH documents
78
+
79
+ FH documents (this package included) use `[[some_note_name]]` to cite a **provenance note in the
80
+ author's local memory store** — the per-project memory directory a Claude Code session keeps outside
81
+ the repository. Measured 2026-08-20 across the npm-published file set: **156 shipped `.md` files
82
+ carry 98 such references to 59 distinct targets, and none of those targets exist inside the
83
+ package** (hand-verified sample: `CLAUDE.md` cites `[[feedback_not_found_is_not_zero_family]]`,
84
+ which resolves only at the operator's memory path — `git ls-files` returns 0).
85
+
86
+ **So, for a reader who is not the author, these are not navigable links.** They are *attribution
87
+ markers*: they say "this sentence came from a recorded failure, not from taste", and they name that
88
+ failure so it can be discussed. Read them as footnote labels, not as paths.
89
+
90
+ 🟥 **Do not treat one as a broken reference or try to repair it.** They are deliberately not
91
+ vendored — a memory store is per-operator, session-scoped, and frequently contains project-private
92
+ material, so shipping it would be a residency violation, not a fix. Equally, do not read a
93
+ `[[…]]`-cited claim as *unsourced*: the surrounding text always states the claim in full, and the
94
+ marker is provenance on top of it, never a substitute for it.
95
+
96
+ The convention is scoped to memory notes. A pointer to a file that **does** ship is written as an
97
+ ordinary path (`knowledge/shared/harness-core/…`), and those are checked mechanically by the
98
+ detail-pointer resolution gate at commit time.
99
+
100
+ ---
101
+
102
+ *Updated: 2026-08-20*