@chrono-meta/fh-gate 2.7.0 → 2.8.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.
package/README.md CHANGED
@@ -18,16 +18,21 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <b>Ask it for things. When the asking repeats, it offers to build you the thing.</b>
21
+ <b>A meta-harness with the quality gates built in.</b>
22
+ </p>
23
+
24
+ <p align="center">
25
+ Projects, skills, harnesses — building them, checking them, speeding them up: you ask for it here.<br>
26
+ It does not simply hand the result back. It puts the work past several checks that fail in
27
+ <i>different</i> ways first.<br>
28
+ <b>And when the same request keeps coming back, it builds you the harness that does it for you.</b>
22
29
  </p>
23
30
 
24
31
  <p align="center">
25
32
  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.
33
+ the shape a change has to have. That is the part that becomes reusable, and it keeps its general
34
+ form on purpose so it can be shaped to your case as you go.<br>
35
+ <sub>What grows is the number of attempts: the trial and error comes off you and runs in parallel.</sub>
31
36
  </p>
32
37
 
33
38
  ---
@@ -41,24 +46,40 @@ git clone https://github.com/chrono-meta/forge-harness.git ~/projects/forge-harn
41
46
  cd ~/projects/forge-harness && claude
42
47
  ```
43
48
 
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.
49
+ **Then type `hi`** or a greeting in whatever language you actually think in: `안녕`, `こんにちは`,
50
+ `你好`, `hola`, `bonjour`. **Any of them opens the menu**, and it will try to answer in the language you
51
+ used. A numbered menu appears and takes it from there — pick a door, answer a couple of questions, and
52
+ it runs the install wizard for you.
53
+
54
+ <sub>🟥 <b>Honest about that last part</b>: matching your language is a prose rule with nothing
55
+ mechanical behind it, so it does not always hold. Measured blind at the floor tier on 2026-08-21, on a
56
+ <b>clean clone like the one you just made</b>: Chinese and Korean greetings both came back fully
57
+ translated, door labels included. On the maintainer's own machine — which pins a default language —
58
+ Chinese landed only 1 time in 5, which is why this note exists at all. What is still shaky is whether
59
+ the menu fires: one greeting variant produced no menu. If it answers in the wrong language, or skips
60
+ the menu, just say so — it will switch. Written up in <code>CLAUDE.md</code> §Voice/Tone rather than
61
+ smoothed over.</sub>
62
+
63
+ Everything below this line is reference for when you want it, not homework before you start.
64
+
65
+ - **What it amplifies** — the number of attempts. Trial and error moves off you and runs in parallel.
47
66
 
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.
67
+ - **What it does not** — the model's ceiling. A harness lifts a model to its own ceiling, not past it.
68
+
69
+ - **How you can check** — it grades itself in public. It names **five things it claims to be**
70
+ (harness cluster · project incubator · governance gate · frontier → org propagation · amplifier) and grades each
71
+ one honestly in every [release](https://github.com/chrono-meta/forge-harness/releases). Any square
72
+ that is not green names the real run that is still missing.
73
+ <sub>Each of the five is spelled out further down, under «The five identities».</sub>
53
74
 
54
75
  ---
55
76
 
56
77
  <p align="center">
57
- <img src="docs/pillars.svg" alt="FORK - ADAPT - COLLABORATE - EMPOWER" width="680">
78
+ <img src="docs/pillars.svg" alt="HARNESS - FORGE - ACCELERATE - COMPOUND" width="680">
58
79
  </p>
59
80
 
60
81
  <p align="center">
61
- <b>Quality is the lever; speed is the result.</b> <i>Fork it. Rename it. Make it yours.</i><br>
82
+ <b>Quality is the lever; speed is the result.</b><br>
62
83
  <sub>If this is useful, a star helps others find it.</sub>
63
84
  </p>
64
85
 
@@ -118,7 +139,9 @@ cd ~/projects/forge-harness
118
139
  claude
119
140
  ```
120
141
 
121
- > ✅ Then **type a greeting ("hi")** — the 🐿️ door menu appears on a typed greeting, not on launch alone.
142
+ > ✅ Then **type a greeting** — `hi`, `안녕`, `こんにちは`, `你好`, whatever you actually think in; it
143
+ > tries to reply in that language (see the note above — it is right more often than not, not always).
144
+ > The 🐿️ door menu appears on a *typed* greeting, not on launch alone.
122
145
  > Say **"Connect a project"** → hub scans `../`, finds `.git` directories, creates `tracks/{project}/`.
123
146
  > For full initial setup (hooks · gates · baseline — each item individually approved, declining is
124
147
  > respected and recorded), ask for **`/install-wizard`**.
@@ -127,8 +150,8 @@ claude
127
150
 
128
151
  **Your first 15 minutes** — what success looks like, and what to do with it:
129
152
 
130
- 1. You'll know setup worked when a greeting ("hi") shows the 🐿️ door menu, and "Connect a project"
131
- creates `tracks/{your-project}/`.
153
+ 1. You'll know setup worked when a greeting in any language — shows the 🐿️ door menu, and
154
+ "Connect a project" creates `tracks/{your-project}/`.
132
155
  2. Then grab an immediate win in the same session: say **"accelerate this project"** (ranked plan of
133
156
  skills/plugins worth wiring, install-gated) or **"run /context-doctor"** (token-waste scan).
134
157
  3. One honest note: FH's core payoff is **compounding** — session records, harvested learnings,
@@ -347,11 +370,25 @@ harness is actually used.
347
370
 
348
371
  **The three-stage process** — this is an *order of investment*, not a menu:
349
372
 
373
+ ```mermaid
374
+ flowchart LR
375
+ S["① Circuit<br/>before design"]
376
+ P["② Parallel decorrelation<br/>in the middle"]
377
+ B["③ Burn it down<br/>on six axes"]
378
+ A(["⟹ It accelerates"])
379
+ S --> P --> B --> A
380
+ style A fill:#0f766e,stroke:#0f766e,color:#fff
381
+ ```
382
+
383
+ **Speed is the arrow at the end, not a fourth box.** And ② is **two dials, turned separately** —
384
+ *decorrelation* (reacts to blind-spot risk: a different model family ⓐ, a different standpoint ⓑ)
385
+ and *parallelism* (reacts to surface size: can one context hold it?). Do not multiply them, choose.
386
+
350
387
  ```
351
388
  ① Circuit before design the judgment circuit goes in FIRST — success · leaning · out-of-scope ·
352
389
  never-do — not written up afterwards as a record of what you did
353
390
 
354
- Decorrelate in the split the work into checks that fail DIFFERENTLY and run them at once.
391
+ Parallel decorrelation split the work into checks that fail DIFFERENTLY and run them at once.
355
392
  middle, to accelerate Choose which differences matter — a second reviewer of the same kind is
356
393
  not decorrelation, it is the same blind spot twice. Parallelism has no
357
394
  direction of its own; the judgment circuit from ① is what picks.
@@ -362,6 +399,12 @@ harness is actually used.
362
399
  riding it does not make that axis see what it cannot see
363
400
  ```
364
401
 
402
+ > 📖 **From here down is for whoever wants to go further — it is not needed to start using this.**
403
+ > If you came to install it and get going, the two-minute section at the top is the whole job; you can
404
+ > stop here and come back when a check surprises you. What follows is the reasoning behind the gates,
405
+ > written for someone already running the hub. Unfamiliar words →
406
+ > [`GLOSSARY.md`](knowledge/shared/GLOSSARY.md).
407
+
365
408
  **The six verification axes** — where "we reviewed it" usually turns out to mean only the first of them.
366
409
 
367
410
  🟥 **Axes are not divided by *how adversarial* they are. They are divided by *what they were given*.**
@@ -392,6 +435,22 @@ That is why the column that matters most below is *what it gets*:
392
435
  > beforehand vs claimed afterwards) is a **posture**, like adversariality, not an axis. Minting a
393
436
  > new one would have repeated the exact error the blind reclassification above found.
394
437
 
438
+ > **A peer session counts on ⓑ and ⓓ — decided 2026-08-21, and *which* peer you ask is the whole
439
+ > trick.** A parallel session of this same harness, running hot on a different branch of the work, is
440
+ > not a copy of you. At the point it got hot it has genuinely grown a second face: a real standpoint
441
+ > (ⓑ) and a real someone-else's-codebase (ⓓ). So peer findings are recorded on those two axes — no
442
+ > seventh axis was minted, and the marker's `axes-run` alphabet did not change.
443
+ >
444
+ > This is why the ⓓ row above says *someone else's codebase* rather than *another company's repo*:
445
+ > the boundary that matters is **whose working context produced the judgment**, not whose GitHub org
446
+ > owns the files. A peer hot on a different branch is across that boundary; a subagent you spawned
447
+ > from this context is not, however different the repo it reads.
448
+ >
449
+ > 🟥 The corollary is the part that bites. **Ask the peer about the axis it actually got hot on.**
450
+ > Anywhere else it wears your face and decorrelates nothing — same input, same blind spot. And a
451
+ > subagent cannot stand in for it, nor can re-reading your own work: the second face comes from that
452
+ > session having *done* different work, and a prompt cannot manufacture it.
453
+
395
454
  **You do not run all six every time, and that is the design** — do not multiply them, **choose**:
396
455
 
397
456
  ```
@@ -414,8 +473,9 @@ itself.
414
473
  **Why this is not superseded by base-model advances** — an axis is defined by its **input**, not by the
415
474
  *reviewer's ability*. A stronger model still **cannot see information it was not given.** Scaffolding
416
475
  sheds as models improve, but **input-boundary decorrelation does not**, and a single author cannot, by
417
- definition, step outside their own input. 🟥 Honest edge: if the agent **fetches more input by itself
418
- with tools**, the boundary blurs — an outside judgment held that "the store is never used in full" and
476
+ definition, step outside their own input.
477
+
478
+ 🟥 **Honest edge**: if the agent **fetches more input by itself with tools**, the boundary blurs — an outside judgment held that "the store is never used in full" and
419
479
  "the swallowed exception" are catchable by ⓐ and ⓒ as well, since those reviewers grep for themselves.
420
480
  Conversely, "a rule another repo retired long ago" **cannot be fetched by any tool** — there is no reason
421
481
  to have access to that project's review history in the first place. That is where ⓓ remains.
@@ -554,22 +614,42 @@ Full spec: [`fh_integration_contract.md`](knowledge/shared/harness-core/fh_integ
554
614
 
555
615
  ---
556
616
 
557
- ## The forge
617
+ ## The forge — where the name comes from
558
618
 
559
- forge-harness treats a project like steel and the metaphor is literal, not decoration. Work is shaped,
619
+ forge-harness treats a project like steel, and the metaphor is literal, not decoration. Work is shaped,
560
620
  hardened by attack, and only then does it ship faster, for having survived.
561
621
 
562
- | Movement | What happens | The commands |
622
+ > 🟥 **This is the name's origin, not a procedure — do not count it.** The smith's words below are a
623
+ > vocabulary, not a stage list. They are a **different layer** from the three-stage process, the four
624
+ > engines, the four-axis commit gate and the six verification axes above; nothing here lines up with a
625
+ > number in any of those, and reading it as a fifth numbered set is the one mistake this section can
626
+ > cause.
627
+
628
+ **Three at the anvil:**
629
+
630
+ | The smith's word | What it means here | The commands |
563
631
  |---|---|---|
564
632
  | **Forge** | shape the raw project into a harness — raise its floor | `install-wizard`, "harness-ify this project" |
565
633
  | **Quench** | harden it by attack — the cold pass leaves standing only what is sound | `steel-quench` · `phantom-quench` |
566
634
  | **Temper** | take the brittleness back out of the hardened asset | `steel-quench` Wave-T · `templates/temper_check.sh` |
567
- | → **Accelerate** | a blade that survived the forge cuts faster | `goal-quench` — *Pass → Accelerate* |
568
635
 
569
- All four movements ship. Temper was named before it was built — deliberately (see
570
- [`ETHOS.md`](docs/ETHOS.md#the-forge)) — and shipped once measurement runs validated it. Around the forge,
571
- two more signatures keep it running: `harvest-loop` (each session's lessons become permanent skills) and
572
- `agent-composer` (orchestrate the dispatch). The other skills wait until you need them — full list below.
636
+ ```mermaid
637
+ flowchart LR
638
+ F["Forge"] --> Q["Quench"] --> T["Temper"] --> A(["⟹ Accelerate"])
639
+ style A fill:#0f766e,stroke:#0f766e,color:#fff
640
+ ```
641
+
642
+ **⟹ And then it accelerates.** A blade that survived the forge cuts faster — `goal-quench`,
643
+ *Pass → Accelerate*. Speed is what the three above **produce**; it is not a fourth thing you do.
644
+ That is the same sentence as the tagline at the top of this page, said in the smith's words:
645
+ quality is the lever, speed is the result.
646
+
647
+ Every command named above ships today. Temper was named before it was built — deliberately (see
648
+ [`ETHOS.md`](docs/ETHOS.md#the-forge)) — and shipped once measurement runs validated it.
649
+
650
+ Around the forge, two more signatures keep it running: `harvest-loop` (each session's lessons become
651
+ permanent skills) and `agent-composer` (orchestrate the dispatch). The other skills wait until you need
652
+ them — full list below.
573
653
 
574
654
  ## 40 skills · 8 agents
575
655
 
package/README.zh.md CHANGED
@@ -18,14 +18,19 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <b>有需要就交给它。同一个请求反复出现时,它会主动提议把那件事本身做出来。</b>
21
+ <b>这是一个把质量门禁内置进去的元框架(meta-harness)。</b>
22
22
  </p>
23
23
 
24
24
  <p align="center">
25
- 你大概已经在对 Claude Code 反复说同样的话:要跑的检查、要守的规则、一次变更该有的样子。<br>
26
- <b>forge-harness 把这些变成可复用的东西</b>:住在你仓库里、会自己触发的技能、闸门和 agent。<br>
27
- 技能刻意保持通用,在使用过程中按你的场景当场锻造。
28
- <b>当同一种形状反复回来,它就提议出货</b> —— 作为独立技能,或独立框架。
25
+ 项目、技能、框架 —— 造出来、验过、再加速:这些都在这里交代。<br>
26
+ 它不会就这么把结果递还给你,而是先让这份工作穿过好几道会以 <i>不同方式</i> 失败的检查。<br>
27
+ <b>而当同一个请求反复回来,它就替你造出那个专门干这件事的框架。</b>
28
+ </p>
29
+
30
+ <p align="center">
31
+ 你大概已经在对 Claude Code 反复说同样的话:要跑的检查、要守的规则、一次变更该有的样子。
32
+ 变得可复用的正是这一部分,而它刻意保持通用的形态,好在使用过程中按你的场景当场锻造。<br>
33
+ <sub>长起来的是尝试的次数:试错从你身上剥离,并行地跑。</sub>
29
34
  </p>
30
35
 
31
36
  ---
@@ -39,22 +44,38 @@ git clone https://github.com/chrono-meta/forge-harness.git ~/projects/forge-harn
39
44
  cd ~/projects/forge-harness && claude
40
45
  ```
41
46
 
42
- **然后输入 `hi`。** 会出现一个带编号的菜单,之后由工具引导你:选一个入口,回答几个问题,
43
- 它会替你运行安装向导。这条线以下是需要时再查的参考资料,而不是开始前的作业。
47
+ **然后输入 `你好`** —— 或者用你真正在用的那门语言打招呼:`hi`、`안녕`、`こんにちは`、`hola`、
48
+ `bonjour`。**不管你用哪种语言问候,菜单都会打开**,并且它会尝试用那种语言回复。会出现一个带编号
49
+ 的菜单,之后由工具引导你:选一个入口,回答几个问题,它会替你运行安装向导。
50
+
51
+ <sub>🟥 <b>关于最后这一点,说实话</b>:语言对齐是一条 <b>背后没有任何机械兜底</b> 的散文规则,所以
52
+ 它并不总是成立。2026-08-21 在 floor 档做的盲测,跑在 <b>一个跟你刚建的那份一样的干净克隆</b> 上:
53
+ 中文和韩文的问候都完整地用同一种语言回来了,连门的标签都翻了。而在维护者自己那台
54
+ <b>把默认语言钉死了的机器</b> 上,中文 <b>5 次里只中了 1 次</b> —— 这条注脚之所以存在,就是因为它。
55
+ 现在仍然不稳的是 <b>菜单会不会弹出来</b>:有一种问候写法就没能唤出菜单。如果它回错了语言、或者
56
+ 没给你菜单,直接说一声,它就会切过来。这条残留被如实写在 <code>CLAUDE.md</code> §Voice/Tone 里,
57
+ 而不是被抹平。</sub>
58
+
59
+ 这条线以下是需要时再查的参考资料,而不是开始前的作业。
44
60
 
45
- **它放大什么**:尝试的次数。试错从你身上移开,并行运行。
46
- **它不放大什么**:模型的天花板。框架只把模型抬到它自己的天花板,不会更高。
47
- **如何验证**:它公开自己的评级。五个身份,如实记录在每一次
48
- [发布](https://github.com/chrono-meta/forge-harness/releases)中。未变绿的那些,会指名说出还缺哪一次真实运行。
61
+ - **它放大什么** —— 尝试的次数。试错从你身上移开,并行运行。
62
+
63
+ - **它不放大什么** —— 模型的天花板。框架只把模型抬到它自己的天花板,不会再往上推。
64
+
65
+ - **如何验证** —— 它公开自己的评级。它把 **自己声称是什么** 名列为五项(框架集群 · 项目孵化器 ·
66
+ 治理门禁 · 前沿 → 组织传导 · 放大器),并在每一次
67
+ [发布](https://github.com/chrono-meta/forge-harness/releases)里逐项如实打分。未变绿的那些,
68
+ 会指名说出还缺哪一次真实运行。<br>
69
+ <sub>这五项各自是什么,在下面的《五重身份》一节里展开。</sub>
49
70
 
50
71
  ---
51
72
 
52
73
  <p align="center">
53
- <img src="docs/pillars.svg" alt="FORK - ADAPT - COLLABORATE - EMPOWER" width="680">
74
+ <img src="docs/pillars.svg" alt="HARNESS - FORGE - ACCELERATE - COMPOUND" width="680">
54
75
  </p>
55
76
 
56
77
  <p align="center">
57
- <b>质量是杠杆,速度是结果。</b> <i>Fork 它。改名。让它成为你的。</i><br>
78
+ <b>质量是杠杆,速度是结果。</b><br>
58
79
  <sub>如果这对你有用,⭐ 一下能帮助更多人发现它。</sub>
59
80
  </p>
60
81
 
@@ -115,7 +136,9 @@ cd ~/projects/forge-harness
115
136
  claude
116
137
  ```
117
138
 
118
- > ✅ 然后 **打一句招呼("hi")** —— 🐿️ 门菜单是在你打出招呼时出现的,光是启动不会出现。
139
+ > ✅ 然后 **打一句招呼** —— `你好`、`hi`、`안녕`、`こんにちは`,用你习惯的语言就行,它会尝试用
140
+ > 那种语言回复(见上面的注记 —— 多数时候对,但不是每次)。
141
+ > 🐿️ 门菜单是在你 *打出* 招呼时出现的,光是启动不会出现。
119
142
  > 说 **"连接一个项目"** → 中枢扫描 `../`,找到 `.git` 目录,创建 `tracks/{project}/`。
120
143
  > 想做完整的初始设置(hooks · 门禁 · 基线 —— 每一项单独批准,拒绝会被尊重并记录),
121
144
  > 请要 **`/install-wizard`**。
@@ -124,8 +147,8 @@ claude
124
147
 
125
148
  **你的头 15 分钟** —— 成功长什么样,以及拿它做什么:
126
149
 
127
- 1. 当一句招呼("hi")能让 🐿️ 门菜单出现、而"连接一个项目"能建出 `tracks/{your-project}/` 时,
128
- 你就知道设置成功了。
150
+ 1. 当一句招呼(任何语言都可以)能让 🐿️ 门菜单出现、而"连接一个项目"能建出
151
+ `tracks/{your-project}/` 时,你就知道设置成功了。
129
152
  2. 然后在同一个会话里拿下一个即时收益:说 **"加速这个项目"**(一份值得接线的技能/插件排序方案,
130
153
  安装要过门禁),或者 **"跑一下 /context-doctor"**(token 浪费扫描)。
131
154
  3. 一条诚实说明:FH 的核心回报是 **复利累积** —— 会话记录、收割来的学习、跨会话记忆。它从
@@ -296,11 +319,24 @@ Project B ──→ 在 CLAUDE.md 中连接中枢
296
319
 
297
320
  **三段工序** —— 这是一个 *投入的顺序*,不是一份菜单:
298
321
 
322
+ ```mermaid
323
+ flowchart LR
324
+ S["① 立坐标系<br/>设计之前"]
325
+ P["② 并行去相关<br/>中段"]
326
+ B["③ 烧一遍<br/>六条轴上"]
327
+ A(["⟹ 于是它快起来"])
328
+ S --> P --> B --> A
329
+ style A fill:#0f766e,stroke:#0f766e,color:#fff
330
+ ```
331
+
332
+ **速度是末尾那支箭,不是第四个方框。** 而 ② 是 **两个分开拧的旋钮** —— *去相关*(应对盲点风险:
333
+ 换一个模型家族 ⓐ、换一个立场 ⓑ)与 *并行*(应对表面大小:一个上下文装得下吗)。别做乘法,要挑。
334
+
299
335
  ```
300
336
  ① 设计之前先立坐标系 判断坐标系「最先」进场 —— 成功 · 偏向 · 不在范围 · 绝不做 ——
301
337
  而不是事后补写成一份"我做了什么"的记录
302
338
 
303
- 中段做去相关,用来加速 把工作拆成会以「不同方式」失败的检查,然后一次性跑掉。要挑「哪些
339
+ 并行去相关 把工作拆成会以「不同方式」失败的检查,然后一次性跑掉。要挑「哪些
304
340
  差异算数」—— 再来一位同一种类的审阅者不是去相关,那是把同一个盲点
305
341
  看两遍。并行本身没有方向,挑方向的是 ① 里那套判断坐标系。
306
342
  这是一种「工作方式」,不是 ③ 里那道收尾检查。
@@ -310,6 +346,11 @@ Project B ──→ 在 CLAUDE.md 中连接中枢
310
346
  看不见的东西照样看不见
311
347
  ```
312
348
 
349
+ > 📖 **从这里往下,是给想再深入一点的人看的 —— 开始用它并不需要这些。**
350
+ > 如果你是来把它装上、直接开跑的,最上面那个「两分钟」小节就是全部;你可以在这里停住,等哪天
351
+ > 某道检查让你觉得意外了再回来。下面讲的是这些门禁为什么长成这样,是写给 **已经在跑这套中枢的人**
352
+ > 看的。碰到不认识的词 → [`GLOSSARY.md`](knowledge/shared/GLOSSARY.md)。
353
+
313
354
  **六条验证轴** —— 所谓"我们审过了",往往到头来只做了其中第一条。
314
355
 
315
356
  🟥 **轴不是按「有多对抗」来分的,是按「它拿到了什么」来分的。** 拿到的东西一样,你堆多少位审阅者,
@@ -317,13 +358,39 @@ Project B ──→ 在 CLAUDE.md 中连接中枢
317
358
 
318
359
  | 轴 | **它拿到什么** | 它抓到什么 | 典型手段 |
319
360
  |---|---|---|---|
320
- | **ⓐ 不同家族** | diff + 作者的框架叙述 | **实现** 错了 | 换一个模型家族的审阅者(`auto-decorrelation`) |
321
- | **ⓑ 立场 (standpoint)** | diff + **目标框架自己的正典** | **你引用的那条规约是不是真这么说** | 在那个框架自己的仓库与规则里去跑这份 diff ([`§7`](knowledge/shared/harness-core/field_verdict_crossfamily_gate.md)) |
322
- | **ⓒ 隔离接地** | 作者写下的那些句子 + 此刻的这棵树 | **主张** 错了 | 找一个没写过它的人,把它说的重新测一遍 |
361
+ | **ⓐ 不同家族** | 变更 + 作者的框架叙述 | **实现** 错了 | 换一个模型家族的审阅者(`auto-decorrelation`) |
362
+ | **ⓑ 立场 (standpoint)** | 变更 + **目标框架自己的正典** | **你引用的那条规约是不是真这么说** | 在那个框架自己的仓库与规则里去跑这份变更 ([`§7`](knowledge/shared/harness-core/field_verdict_crossfamily_gate.md)) |
363
+ | **ⓒ 隔离接地** | 作者写下的那些句子 —— 他的主张,*以及* 他在 **动手之前声明过的东西** —— + 此刻的这棵树 | **主张** 错了 · 增量与当初声明的对不上 | 找一个没写过它的人,把它说的重新测一遍。至于事前声明,那是一道把写下的成功定义拿回来对照增量的门禁 |
323
364
  | **ⓓ 第三方对面** | 问题 + **别人的代码库** | **这是不是早就被解过了** · 你的变更会碰到别人仓库的哪里 | 在一个无关的第三方仓库里看同一个问题 |
324
365
  | **ⓔ 首次真实使用** | 一个实打实的目标 | **你测量的方式** 错了 —— 量具的量具 | 拿一个真实目标真跑一次,然后动手核对那份结果 |
325
366
  | **ⓕ 撤回并观察** | 把接线删掉之后的那棵树 | **锚** 错了 —— 那道检查是装饰 | 把它所守护的东西删掉,确认 *正是那一条* 检查变红 |
326
367
 
368
+ > **ⓒ 在 2026-08-21 被拓宽了,而「怎么拓宽的」才是更有用的那一半。** 本仓库的提交标记自
369
+ > 2026-08-09 起就要求写上作者自己的 **事前声明** —— *什么算成功* 与 *什么绝不做* —— 而且必须写在
370
+ > 设计 *之前*。那天带着对照组一测:**没有任何代码在读它。** 消费它的代码整整零行,而兄弟字段在
371
+ > 21 处被检查;门禁规格甚至没有点过它的名。在真实语料里,**98 份标记中有 37 份根本没有那一行**
372
+ > —— 其中还包括一份跑过 28 条 lane、别的字段全部填满、并通过了评审面板的标记。这些轴全都朝
373
+ > *外* 看 —— 变更、目标仓库、先例、产物。**没有一条轴回头看那份记录自己的必填字段。**
374
+ > 一个没有消费方的槽位永远报告「完成」,**因为是「存在」本身在替你做判定。**
375
+ >
376
+ > 修法不是加第七条轴。ⓒ 本来就拿到 *作者写下的那些句子 + 此刻的这棵树*,而这与一次事前声明检查
377
+ > 所拿到的东西 **逐字相同**。时态(先声明的,还是事后主张的)和对抗性一样,是一种 **姿态**,
378
+ > 不是一条轴。真去新铸一条,就等于把上面那次盲判重分类抓到的错误再犯一遍。
379
+
380
+ > **同侪会话记在 ⓑ 和 ⓓ 上 —— 2026-08-21 决定,而「问哪一个同侪」才是全部诀窍。** 同一个框架分叉
381
+ > 出去、正在另一条支线上跑得火热的并行会话,不是你的副本。在它跑热的那一点上,它确实长出了
382
+ > **第二张脸**:一个货真价实的立场(ⓑ),一个货真价实的「别人的代码库」(ⓓ)。所以同侪的判定记在
383
+ > 这两条轴上 —— 没有新铸第七条轴,标记里的 `axes-run` 字母表也没有变。
384
+ >
385
+ > 上面那张表的 ⓓ 行之所以写的是「**别人的代码库**」而不是「别家公司的仓库」,原因就在这里:真正
386
+ > 起作用的边界是 **那份判定是在谁的工作脉络里产生的**,而不是这些文件挂在谁的 GitHub 组织名下。
387
+ > 一个在另一条支线上跑热的同侪,在这条边界 **之外**;而你从当前这个脉络里派发出去的子 agent,
388
+ > 不管它去读的是多么不相干的仓库,都仍然在这条边界 **之内**。
389
+ >
390
+ > 🟥 咬人的是那条推论。**要问同侪的,是它真正跑热的那条轴。** 出了这个范围,它戴的就是你的脸,
391
+ > 问了也去不了相关 —— 同样的输入,同样的盲点。而且子 agent 顶替不了它,重读一遍自己的文字也
392
+ > 顶替不了:那第二张脸来自那个会话真的 *做了* 不一样的事,靠提示词是造不出来的。
393
+
327
394
  **你不必每次都把六条跑满,这正是设计** —— 别做乘法,要 **挑**:
328
395
 
329
396
  ```
@@ -343,7 +410,9 @@ Project B ──→ 在 CLAUDE.md 中连接中枢
343
410
 
344
411
  **为什么这一套不会被基础模型的进步取代** —— 一条轴是由 **输入** 定义的,不是由 *审阅者的能力*
345
412
  定义的。模型再强,**「没拿到的信息」它依然看不见。** 脚手架会随着模型变好而脱落,但 **输入边界上的
346
- 去相关不会脱落**,而单个作者按定义就走不出自己的输入。🟥 诚实的边缘地带:如果 agent **自己用工具
413
+ 去相关不会脱落**,而单个作者按定义就走不出自己的输入。
414
+
415
+ 🟥 **诚实的边缘地带**:如果 agent **自己用工具
347
416
  去取更多输入**,这条边界就会变模糊 —— 外部判定确实认为「整个存储从未被完整使用」和「异常被吞掉」
348
417
  这两条 ⓐ · ⓒ 也能抓到(因为它们会自己 grep)。反过来,「别人的仓库当年废弃掉的某条规则」
349
418
  **用工具也取不到** —— 你压根没有理由去访问那个项目的评审历史。ⓓ 留下来的位置就在那里。
@@ -461,21 +530,37 @@ hooks 不会自动触发,M2 的 agent 派发步骤需要适配器(或交互
461
530
 
462
531
  ---
463
532
 
464
- ## 大锻炉 (The forge)
533
+ ## 大锻炉 (The forge) —— 名字的由来
465
534
 
466
- forge-harness 把项目当作钢来对待 —— 而这个隐喻是字面的,不是装饰。工作被塑形、以攻击淬硬,
535
+ forge-harness 把项目当作钢来对待,而这个隐喻是字面的,不是装饰。工作被塑形、以攻击淬硬,
467
536
  唯有如此才更快出炉,因为它挺过了考验。
468
537
 
469
- | 工序 | 发生了什么 | 命令 |
538
+ > 🟥 **这是名字的由来,不是流程 —— 不要数它。** 下面那些铁匠的用词是一套 **词汇**,不是阶段清单。
539
+ > 它与上文的 **三段工序 · 四大引擎 · 四轴门禁 · 六轴验证是不同的层**,不对应其中任何一个数字;
540
+ > 把它读成「第五个带编号的集合」,是本节唯一可能引起的误会,所以在这里先掐断。
541
+
542
+ **铁砧上的三道:**
543
+
544
+ | 铁匠的用词 | 在这里是什么意思 | 命令 |
470
545
  |---|---|---|
471
546
  | **锻造 (Forge)** | 把生坯项目塑形为框架 —— 抬高其下限 | `install-wizard`、"把这个项目框架化" |
472
547
  | **淬火 (Quench)** | 以攻击将其淬硬 —— 冷审阅只让健全的东西留存 | `steel-quench` · `phantom-quench` |
473
548
  | **回火 (Temper)** | 把淬硬资产里的脆性 (brittleness) 再退掉 | `steel-quench` Wave-T · `templates/temper_check.sh` |
474
- | → **加速 (Accelerate)** | 一把挺过锻炉的刀刃切得更快 | `goal-quench` —— *Pass → Accelerate* |
475
549
 
476
- 四道工序全部出货。回火 (Temper) 在被造出 *之前* 就先起了名字 —— 刻意为之(见
477
- [`ETHOS.md`](docs/ETHOS.md#the-forge))—— 并在测量运行验证之后出货。围绕这座锻炉,还有两个
478
- 签名部件让它持续运转:`harvest-loop`(每次会话的教训成为永久技能)与
550
+ ```mermaid
551
+ flowchart LR
552
+ F["锻造 Forge"] --> Q["淬火 Quench"] --> T["回火 Temper"] --> A(["⟹ 加速 Accelerate"])
553
+ style A fill:#0f766e,stroke:#0f766e,color:#fff
554
+ ```
555
+
556
+ **⟹ 然后,它自己就快起来了。** 一把挺过锻炉的刀刃切得更快 —— `goal-quench`,*Pass → Accelerate*。
557
+ 速度是上面这三道 **锻出来的东西**,不是你另外再做的第四件事。这和本页最上面那句标语说的是同一件事,
558
+ 只不过换成了铁匠的用词:质量是杠杆,速度是结果。
559
+
560
+ 上面点到名的命令,如今全部已经出货。回火 (Temper) 在被造出 *之前* 就先起了名字 —— 刻意为之
561
+ (见 [`ETHOS.md`](docs/ETHOS.md#the-forge))—— 并在测量运行验证之后出货。
562
+
563
+ 围绕这座锻炉,还有两个签名部件让它持续运转:`harvest-loop`(每次会话的教训成为永久技能)与
479
564
  `agent-composer`(编排派发)。其余技能等你需要时再出场 —— 完整清单见下。
480
565
 
481
566
  ## 40 skills · 8 agents
package/docs/ETHOS.md CHANGED
@@ -18,14 +18,21 @@ Everything below is **copyable**. None of it is a secret. The principles are the
18
18
  FH treats a project like steel — heat, shape, and shock, in named movements. The metaphor is literal,
19
19
  not decoration:
20
20
 
21
- | Movement | What it does | Today |
21
+ **Three at the anvil:**
22
+
23
+ | The smith's word | What it does | Today |
22
24
  |---|---|---|
23
25
  | **Forge** | shape the raw project into a harness — raise its floor | `install-wizard`, harness-ify |
24
26
  | **Quench** | harden it by attack — the cold pass leaves standing only what is sound | `steel-quench`, `phantom-quench` |
25
27
  | **Temper** | take the brittleness back out of the hardened asset | `steel-quench` **Wave-T** + `templates/temper_check.sh` |
26
- | → **Accelerate** | a blade that survived the forge cuts faster — pass, then run | `goal-quench` · *Pass → Accelerate* |
27
28
 
28
- All four movements now ship. **Temper** spent its first months named-but-unbuiltdeliberately, per
29
+ **⟹ And then it accelerates.** A blade that survived the forge cuts faster `goal-quench`,
30
+ *Pass → Accelerate*. Three at the anvil, and speed is what those three **produce**; it is not a
31
+ fourth thing you do at the anvil. Quality is the lever, speed is the result.
32
+
33
+ Every command named above ships today. (These are the smith's words — a **vocabulary**, not a stage
34
+ list, and a different layer from the three-stage process, the four engines, the four-axis commit gate
35
+ and the six verification axes. Do not count them against those.) **Temper** spent its first months named-but-unbuilt — deliberately, per
29
36
  principle 5 — and shipped only after measurement runs on independent quench convergences validated that
30
37
  the check flags over-hardening without punishing simplification. Quenched steel is hard but brittle;
31
38
  no smith ships it un-tempered, and now neither does FH: after convergence, Wave-T measures the complexity
@@ -91,6 +91,109 @@ API 키 대화창 기록 방지 — Write 툴로 `.env` 직접 생성 (대화창
91
91
 
92
92
  **Forbidden response**: "I can't do that — I'm not in that project's cwd." Always check if Agent dispatch covers it first.
93
93
 
94
+ 🟥 **A live peer session is a different thing from a subagent — and the default reading is wrong.**
95
+ Operator, 2026-08-21, correcting exactly that: *"이작업을 분할하라는게 아니라 논의를 해보라는
96
+ 뜻이었어 작업은 니가하고"* → *"주위피어에는 **두뇌를빌려서 네 수행에 대한 판단**을 도움받아보라는
97
+ 거였으니"*.
98
+
99
+ | | you dispatch it | you ask a peer |
100
+ |---|---|---|
101
+ | what moves | **the work** | **the judgment** |
102
+ | what comes back | a completed unit | a verdict on *your* execution |
103
+ | the peer's own work | — | keeps running; you did not take it |
104
+
105
+ The reflex is to read "talk to the peers" as "split the task across the peers", because a peer
106
+ looks like a bigger subagent. It is not. The operator's own framing, same day:
107
+
108
+ > *"예열되어 다른갈래로 뻗어있는 자신의 다른 면모들은 하나의 **별개하네스(동일맥락을 공유하는)**
109
+ > 로도 동작도가능하므로 인사이트를 얻을수있다"*
110
+
111
+ A peer is **pre-warmed on its own branch of the same context** — a separate harness that shares
112
+ your origin but not your recent path. The operator's sharper form, same day:
113
+
114
+ > *"동일 하네스에서 분화한 세션이라도 **그 세션으로 뜨거워진 지점에서는 다른 양상과 관점을
115
+ > 지니게 된다. 그 세션만큼은 두 얼굴이 생기는거다.**"*
116
+ >
117
+ > *"**자신에 대해서는 뜨겁게, 남에 대해서는 그만큼 차갑게** (동일 하네스라도)"*
118
+
119
+ The divergence is not in how context is *delivered* — the peer genuinely **holds a different
120
+ aspect** at the point it got hot. The second line names the mechanism, and it is the half that
121
+ is easy to miss: the same heat that makes a session sharp on **its own** thread makes it
122
+ correspondingly **cold on yours**. Both halves are load-bearing and they buy different things:
123
+
124
+ | | what it buys |
125
+ |---|---|
126
+ | **hot on its axis** | it sees what you structurally cannot — it did that work |
127
+ | **cold on yours** | it does not carry your optimism, your sunk cost, or your reading of your own claim |
128
+
129
+ The second is why "read it again, more carefully" never substitutes: **you cannot make yourself
130
+ cold about your own output.** Dividing the work destroys both properties at once — a peer given
131
+ part of your task becomes hot on it, and is then judging its own output.
132
+
133
+ 🟥 **Two operating consequences, which follow from the mechanism rather than from etiquette:**
134
+ - **Ask the peer about the axis it got hot on.** Off that axis a peer wears *your* face — asking
135
+ buys nothing and costs a round trip.
136
+ - **A subagent or your own re-read cannot substitute.** The second face comes from that session
137
+ having actually done the work; a prompt cannot manufacture heat, and nothing manufactures
138
+ coldness toward your own output.
139
+
140
+ **Measured, and it is not one good day.** Scanned this hub's own records for peer-attributed
141
+ catches: **119 mentions across 35 files spanning 13 distinct dates (2026-08-08 → 08-21)**;
142
+ cross-family sidecar catches count separately at **113** — comparable in size, a *different*
143
+ axis. Eight sampled hits were hand-verified as genuine peer attribution, and at least two run
144
+ the **other way** (a peer's misdiagnosis reversed by measurement here) — so the shape is mutual
145
+ contention, not one-way review.
146
+ ⚠️ Named residuals: these are *mentions*, not deduplicated incidents (one event can be described
147
+ in several files); attribution is self-reported in this hub's own records; the window is the
148
+ ~2-week parallel-session era only.
149
+
150
+ 🟥 **Whether this is a verification axis in its own right is an OPEN OPERATOR DECISION, not
151
+ settled here.** The operator also said *"이것도 6축검증법에 속한다"*, which places peer discussion
152
+ inside the canonical six axes — but which axis, or whether it is a seventh, is unresolved: it is
153
+ closest to ⓒ isolated-grounding (someone re-verifies *your record*), yet a peer is precisely
154
+ **not** isolated. Do not cite this paragraph as if the axis question were closed.
155
+ See `tracks/_meta/fh_signal_2026-08-21_peer-axis-canon-claim.md`.
156
+
157
+ **So the ask to a peer is a question, not a work item.** The operator's own modelling of the
158
+ boundary, same day, on a branch belonging to another session: *"그 브랜치는 08d6fe75 갈래
159
+ 것이고 **여기서 손댈 게 아니다. 판단만 낸다.**"* — when the artifact belongs to another
160
+ session, produce a verdict, never an edit. This is about **scope of authority** and is separate
161
+ from the shared-checkout rules (which are about not clobbering); both apply at once.
162
+
163
+ ### The effect that needs 2+ concurrent — and why it is not a preference
164
+
165
+ Operator, 2026-08-21, arriving at it against their own habit:
166
+
167
+ > *"내가 두개이상을 동시에 잘 쓰려고는 안하는데 아이러니하게도 **두개이상을 동시에 써야 얻을수
168
+ > 있는 효과**도있어보이네"* → *"**2명~3명이 하네스를 굴려서 경합시키는 모양새**가 나오니까"*
169
+
170
+ The shape is not "parallel work". It is **contention** — two or three sessions *driving the same
171
+ harness* and colliding. What that produces cannot be reached serially, because both halves of the
172
+ hot/cold table must exist **at the same time**: one session hot on a thread while another is cold
173
+ on it. Run them in sequence and you get one face twice.
174
+
175
+ Same day, in both directions: the wiring-hot session found a defect in this session's delta; this
176
+ session found a drift defect inside *that* session's delta — and the check that caught it fires on
177
+ *"did main change today"*, not *"did I change it"*, which is a contention-shaped trigger by
178
+ construction. Neither finding was self-caught by its author.
179
+
180
+ ⚠️ **An observed effect, not a promotion to default.** Concurrency costs coordination, and it is
181
+ where the same day's two shared-checkout accidents came from. The claim is narrow: *some* effects
182
+ are unobtainable without it.
183
+
184
+ **So how to hold it** (operator, 2026-08-21): *"디폴트 승격은 안 해도 되. 다만 병렬세션 띄워서
185
+ 운영자가 작업할 때 얻게 되는 **반사이익**이라고 보면 되지. 아니면 **네가 권유해도 괜찮음**.
186
+ 「병렬세션으로 나눠서 작업해도 좋을 것 같습니다」 이런 식으로"*.
187
+
188
+ Two things follow, and the second is a permission most sessions will not assume they have:
189
+ - **It is a by-product, not a reason.** The operator opens parallel sessions for their own reasons;
190
+ contention is what they *also* get. Do not argue for concurrency on the strength of this effect
191
+ alone.
192
+ - 🟥 **You may propose it.** When work has separable threads and a second face would help — a
193
+ decision you would otherwise ratify alone, a claim only its author has read — say so plainly:
194
+ *"병렬세션으로 나눠서 작업해도 좋을 것 같습니다."* Proposing is invited; deciding is not yours,
195
+ and the standing preference remains delegation-in-conversation over standing parallelism.
196
+
94
197
  **Context Card** (required for non-trivial dispatch):
95
198
  ```
96
199
  [Session Context Card]
@@ -120,6 +223,34 @@ Note: {constraints the agent must know}
120
223
 
121
224
  ---
122
225
 
226
+ ## Approval Must Be Evaluable — never hand over a blind stamp
227
+
228
+ Operator, 2026-08-21: *"내가 판단해야하는건 내가 알아볼수있게 쉽게 브리핑해줘 **승인하더라도
229
+ 블라인드 도장은 찍고싶지않아**."*
230
+
231
+ An approval request is not done when it is *complete*; it is done when the approver can **reach
232
+ the verdict themselves**. A dump of everything measured technically discloses more and decides
233
+ less — the approver ends up ratifying your conclusion rather than forming one.
234
+
235
+ **What a decision-ready item carries:**
236
+ ```
237
+ the decision stated as a choice, not as a status report
238
+ what it costs what becomes irreversible, what stays open
239
+ the evidence the number AND how it was measured (an uncalibrated number is not evidence)
240
+ your recommendation named as yours, so it can be rejected without re-deriving everything
241
+ what you did NOT check the residual, by name — this is the half that makes the rest trustworthy
242
+ ```
243
+
244
+ 🟥 **The failure mode is not withholding — it is volume.** Burying the one load-bearing fact in a
245
+ complete record is the same defect as omitting it: either way the approver cannot separate what
246
+ matters. If it takes the approver a re-derivation to decide, the briefing has handed them a blind
247
+ stamp with extra steps.
248
+
249
+ **Applies to every approval surface**, not only long briefs: a one-line "merge this?" still owes
250
+ the choice, the cost, and the residual.
251
+
252
+ ---
253
+
123
254
  ## Counter-Argument Protocol
124
255
 
125
256
  When the user pushes back on an AI recommendation ("is that right?", "something seems off"):