@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
@@ -190,9 +190,32 @@ controls: n/a — no measurement in this delta (<reason>)
190
190
  ```
191
191
 
192
192
  **`standpoint:`** — closed enum, canonical spec in
193
- `knowledge/shared/harness-core/field_verdict_crossfamily_gate.md §7`. **Still validated by nothing**
194
- — zero hook lines, no fixture suite. Recorded here so the gap is visible from the rules side rather
195
- than only from the hook's absence.
193
+ `knowledge/shared/harness-core/field_verdict_crossfamily_gate.md §7`. 🟥 **CORRECTED 2026-08-20, then CORRECTED AGAIN the same hour.** This used to read "Still validated
194
+ by nothing — zero hook lines, no fixture suite", which is FALSE: `validate_standpoint_leg()` lives in
195
+ `templates/.git-hooks/pre-commit` (grep the function name — **line numbers are deliberately not cited
196
+ here; the first version of this fix cited `:798`/`:1575` and a commit landed the same hour that moved
197
+ them to `:878`/`:1665`**), and `scripts/test_marker_standpoint_lanes.sh` is wired through
198
+ `scripts/selfcheck.sh`.
199
+ 🟥 **But the first correction over-shot, and cross-family caught that too.** It said "the value enum
200
+ IS closed and the grounds ARE required". Only the first half holds. Measured by varying ONE variable
201
+ at a time — the original known-pair varied two and mis-attributed the result:
202
+
203
+ ```
204
+ standpoint: tier2(qasp) — ran <cmd>, saw <out> rc=0 ✅
205
+ standpoint: tier2(qasp) (no grounds) rc=0 ⚠️ warns, does NOT block
206
+ standpoint: tier2 (no parens) rc=1 ❌ not an enum member
207
+ standpoint: banana(qasp) rc=1 ❌ not an enum member
208
+ ```
209
+
210
+ So: **the enum is closed and enforced; the execution grounds for `tier2`+ are ADVISORY.** A marker can
211
+ still record `tier2` without naming a command and pass with a warning — that is the real remaining
212
+ gap, and it is narrower than "validated by nothing" and wider than "grounds are required". Neither
213
+ earlier sentence was accurate, and the accurate one required varying one variable at a time.
214
+ 🟥 **This same false claim stood in FIVE places**, not three — `CLAUDE.md` (twice), here, `AGENTS.md`,
215
+ and `field_verdict_crossfamily_gate.md`. Fixing one and stopping is the half-fix propagation failure;
216
+ fixing three and stopping was the same failure one round later. The question is never "is this
217
+ sentence wrong" but **"where else does this sentence live"** — and the answer came from a
218
+ different-family reviewer, not from me.
196
219
 
197
220
  **`thirdparty:` — ⓓ3자 대면의 자기 필드 (2026-08-17 신설).** ⓑ가 `standpoint:` 를 갖는 것과
198
221
  같은 형태다: `axes-run` 에는 포인터(`ⓓ=→thirdparty`)만 두고 값은 이 필드가 나른다.
@@ -11,13 +11,13 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "2.5.1",
14
+ "version": "2.7.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": "2.5.1",
20
+ "version": "2.7.0",
21
21
  "description": "Project-agnostic utility skills — 5 skills (convergence-loop · deliberation · mcp-circuit-breaker · token-budget-gate · ko-tech-writer) + 1 agent (quench-challenger). Domain-independent utilities transplantable into any project.",
22
22
  "source": "./plugins/fh-commons"
23
23
  }
package/AGENTS.md CHANGED
@@ -127,9 +127,14 @@ Because non-Claude runtimes do not auto-load Claude path rules, apply these rule
127
127
  2 of the 4 circled-key markers on disk are dated 2026-08-10 and carry the OLD meanings. Aligning
128
128
  the notation still helps going forward; it does not work backwards.
129
129
  `standpoint:` remains the canonical field for ⓑ (the `axes-run` entry
130
- is only a pointer to it, and a pointer at an empty field is blocked); **its value enum is still
131
- validated by nothing** — that is the one remaining gap, and it is not the same thing as the axis
132
- being unmechanized. Format spec: `.claude/rules/fh_4axis_gate.md §Marker axis fields`.
130
+ is only a pointer to it, and a pointer at an empty field is blocked). 🟥 **CORRECTED 2026-08-20.** This used to say
131
+ "its value enum is still validated by nothing" FALSE. `validate_standpoint_leg()` in the
132
+ pre-commit hook enforces a closed enum. Measured by varying one variable at a time:
133
+ `standpoint: banana(qasp)` → **blocked (enum)** · `standpoint: tier2` without parens → **blocked
134
+ (enum)** · `standpoint: tier2(qasp)` with no execution grounds → **passes with a warning** ·
135
+ with grounds → **passes**. So the enum is enforced and the `tier2`+ execution grounds are
136
+ **advisory** — a first version of this correction said grounds were required, which over-shot.
137
+ The hook also cannot check whether `tier2` is **true**. Those two, together, are the gap. Format spec: `.claude/rules/fh_4axis_gate.md §Marker axis fields`.
133
138
  (Two drift corrections landed here on 2026-08-17: first this sentence said "four" while its own
134
139
  next clause described the +1 — caught by the session-close ④-b CC↔Codex parity check — and then
135
140
  the machine layer moved to six the same day.)
@@ -144,6 +149,22 @@ Because non-Claude runtimes do not auto-load Claude path rules, apply these rule
144
149
  `❌`. Execution is the half with no substitute; see `field_verdict_crossfamily_gate.md §7`. Read it before recording; §1-c
145
150
  holds the sample limits — read it before citing. This record is self-attested and has no hook
146
151
  behind it; it is closed by a different-family reader, not by writing it more carefully.
152
+ 🟥 **`axis2-defense:` — a marker field added 2026-08-20 that a Codex-side author WILL hit.**
153
+ It is required when the marker records `floor-status: sonnet-floor` or `below-floor`, and it carries
154
+ three sub-answers (on one line, or across continuation lines — the hook reads both) about **your own findings and numbers**:
155
+ `axis2-defense: reproducibility=<exact command or file:line another session runs> fairness=<reps,
156
+ inputs and environment named for BOTH arms> estimation-layer=<per number: measured | estimate |
157
+ quotation; for a measurement, what showed the instrument works on this target>`.
158
+ The hook (`validate_defense_leg`) checks **presence · completeness · non-vacuity** — `ok`/`yes`/
159
+ `n/a` is rejected as a filled form rather than an answer, and all three sub-answers must exist.
160
+ It cannot check whether the answers are true. Why it exists: measured n=6 in the origin field, a
161
+ floor-tier pass runs the attack angles without defect but does **not** spontaneously ask these
162
+ three; that is a checklist gap, not a capability gap, and a harness whose behaviour depends on
163
+ which model drives it is defective by the Sonnet-Floor doctrine.
164
+ Fixtures: `scripts/test_marker_defense_lanes.sh`. Spec: `plugins/fh-meta/skills/steel-quench/SKILL.md`
165
+ §Wave 1-D. **Recorded here because a rule living in only one entry point is invisible to the other
166
+ runtime** — that is the gate-locality principle, and this line is it being applied rather than cited.
167
+
147
168
  8. **Branch-surface claims:** GitHub branch protection is two independent layers — legacy
148
169
  protection and rulesets coexist, and the strictest wins. Read both
149
170
  `/repos/{owner}/{repo}/branches/{branch}/protection` and
package/CATALOG.md CHANGED
@@ -4,6 +4,47 @@ AI reads this file first when searching past work. Open individual files for det
4
4
 
5
5
  ---
6
6
 
7
+ ## 2026-08-20 — Seven canonical `knowledge/` docs were missing from this index
8
+
9
+ Found by the 30-day `harness-doctor` cadence run. Seven files under `knowledge/` had **zero**
10
+ CATALOG entries, so the CATALOG-first recall path (CLAUDE.md §Autonomous Initiative — *"read
11
+ `CATALOG.md`, identify candidates by tag/date, then open only those files"*) could not reach them
12
+ at all. Measured with a live control in the same run (`harness_6axis_framework` → 2 hits, so the
13
+ grep was alive; each of the seven → 0).
14
+
15
+ 🟥 **The worst of the seven is `fh_three_layer_canon.md`** — CLAUDE.md names it a *mandatory*
16
+ pre-read before naming, re-scoping, or citing the 3-layer canon, and it was unreachable from the
17
+ index that the recall protocol reads first. A mandatory document that the lookup path cannot find
18
+ is, for any session that does not already know its filename, indistinguishable from absent.
19
+
20
+ - `knowledge/shared/harness-core/fh_three_layer_canon.md` — #canon, #3-stage, #4-engines,
21
+ #5-identities, #6-axis. The 3-layer canon (3-stage process · 4 engines · 5 identities) and the
22
+ definition of the **six verification axes** (ⓐ계열 · ⓑ입장 · ⓒ격리 그라운딩 · ⓓ3자대면 ·
23
+ ⓔ첫실사용 · ⓕ되돌림) that stage ③ actually consists of. **Read before citing any of the three.**
24
+ - `knowledge/shared/harness-core/capability_composition_contract.md` — #capability, #composition,
25
+ #strictest-wins. How a field harness's typed capability merges with hub constraints
26
+ (strictest-wins regardless of layer; an untyped or silent channel is `HARNESS_ERROR`, never PASS).
27
+ - `knowledge/shared/harness-core/dispatch_conditional_prohibition.md` — #dispatch, #subagent,
28
+ #conditional. The measured resolution order behind the runtime's *"do not call the AgentTool
29
+ unless the user requested it"* line — why it is a **conditional** a request satisfies, not an
30
+ override. Carries the calibrated where-it-is-not table and reproduction commands.
31
+ - `knowledge/shared/harness-core/agents_md_runtime_details.md` — #codex, #agents-md, #entrypoint.
32
+ Runtime detail for the non-Claude entry point.
33
+ - `knowledge/shared/harness-core/harness_terminal_correlation_and_recommendations.md` —
34
+ #correlation, #terminal, #recommendations.
35
+ - `knowledge/shared/rules/knowledge_layer_seam.md` — #seam, #org-knowledge, #unwired. Names FH's own
36
+ unwired candidates at the knowledge-layer seam (including `steel-quench` Step 0.35).
37
+ - `knowledge/shared/rules/multi_session_close_protocol.md` — #close, #multi-session, #parallel.
38
+ Canonical close discipline when two or more sessions run on one harness — order, discriminators,
39
+ write discipline. **Not replaceable by a `gh pr list` re-check** (that structurally misses deltas
40
+ with no PR).
41
+
42
+ - Decision: indexed as one consolidated entry rather than seven, because the finding is a *class*
43
+ (index drift on `knowledge/`), and splitting it would hide that they were all missed the same way.
44
+ - Open: nothing mechanically prevents the next `knowledge/` file from landing unindexed. A
45
+ `knowledge/**` → CATALOG coverage check is a candidate, not built (recurrence N=1 as a measured
46
+ class; the repo's own bar is N≥3 or a second surface before mechanizing).
47
+
7
48
  ## 2026-08-15 — Global positioning & distribution roadmap (Homebrew/npm compatibility)
8
49
 
9
50
  - **New doc** (`knowledge/shared/harness-core/fh_global_positioning_and_distribution_roadmap.md`):
package/CLAUDE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # forge-harness — Persistent Knowledge Hub
2
2
 
3
- > **This file is the operational ruleset for AI (Claude Code).** For human-facing guidance, see `README.md`. For command reference, see `CHEATSHEET.md`.
3
+ > **This file is the operational ruleset for AI (Claude Code).** For human-facing guidance, see `README.md`. For command reference, see `CHEATSHEET.md`. **For a first-time user asking «how do I use this»**, the answer is `docs/USER_GUIDE.md` — not CHEATSHEET (that is a reference to look things up in, not a document to read through). Blind floor-tier sim 2026-08-19 named exactly this: the header alone routes a beginner to CHEATSHEET, and only reading `fh_detail_protocols.md` corrects it.
4
4
  >
5
5
  ```
6
6
  forge-harness/
@@ -376,8 +376,18 @@ claim 이 `main` 인 동안 실제 HEAD 는 peer 브랜치였다 — 두 세션
376
376
  **남은 잔여 둘, 이름으로 남긴다**: ⓐ 게이트는 **커밋 시점**이라 `switch -c` 사고 자체는 못 막는다
377
377
  (그래서 위 두 줄이 여전히 사람 몫이다 — [[feedback_gate_binding_point_not_check_point]])
378
378
  ⓑ 반대 방향 — 내가 브랜치를 쥔 동안 남이 되돌리고 커밋하면 **내 staged 파일이 index 에 살아
379
- 있다.** 실측 사례에서 섞인 것은 세션이 파일 지정 `add` 를 썼기 때문이지 게이트 덕이 아니다.
380
- **공유 체크아웃에서 `git add -A` 금지**([[feedback_shared_checkout_ops_touch_others_work]]).
379
+ 있다.** 🟥 **2026-08-21 실제로 났고, 섞은 세션은 파일 지정 `add` 를 썼다**(초판은 여기 「파일
380
+ 지정 add 썼기 때문에 섞였다」고 적었는데 거짓이다). 파일 지정 add 는 «내가 무엇을
381
+ **추가**하나»만 통제하고 **index 에 이미 있는 것은 못 막는다.** ⇒ `git add -A` 금지는 필요조건
382
+ 이지 충분조건이 아니다. **커밋을 한 호출로 묶고 그 안에서 둘을 확인한다** — 확인은 점이고 위험은
383
+ 구간이라, 사이에 턴이 끼면 창이 다시 생긴다(같은 날 두 세션이 시점을 각각 `switch` 직전/직후로
384
+ 달리 골랐는데 **둘 다 뚫렸다**):
385
+ ```
386
+ B=$(git branch --show-current); [ "$B" = "<내 브랜치>" ] || exit 1
387
+ git diff --cached --name-only # 내 것만 있나 — 남의 것은 restore --staged
388
+ git commit …
389
+ ```
390
+ ([[feedback_shared_checkout_ops_touch_others_work]] · [[feedback_gate_binding_point_not_check_point]])
381
391
 
382
392
  **Integration branch is PR-only** (operator decision 2026-07-20). Never `git push origin main`
383
393
  directly. Normal path: `git switch -c <branch>` → push the branch → `gh pr create` → after review
@@ -457,17 +467,42 @@ Simplification guard: trivial denials with one obvious fix → state block + sin
457
467
 
458
468
  - **New user** (no session files AND no mapped project tracks under `tracks/` — fresh clone/install; **any underscore-prefixed dir** (`tracks/_*` — `_meta`/`_audit`/`_contrib`/`_chamber`…) doesn't count, general rule not a closed list — `_chamber` holds incubation chamber runs, never mapped projects): 2-door starter, never the returning menu —
459
469
 
460
- > 🐿️ **Welcome to FH.** *Looks like you're new here! Create your first project (guided) · ② Map an existing project — and I can run `/install-wizard` to finish initial setup.*
470
+ > 🐿️ **Welcome to FH.** *Looks like you're new here! What would you like to do?*
471
+ > - **① Create your first project** — guided
472
+ > - **② Map an existing project**
473
+ > - **📖 Read the guide / ask me anything**
474
+ >
475
+ > *…and I can run `/install-wizard` to finish initial setup.*
461
476
 
462
477
  - **Returning user** (session files OR mapped project tracks exist): fixed 4-door menu —
463
478
 
464
- > 🐿️ **Welcome back to FH.** *① Map a project · ② Create a new project · ③ Accelerate **or diagnose** a mapped project (work · Full-Harness · skills/agents/plugins · 진단) — {field candidates} · ④ Cross-project synergy*
479
+ > 🐿️ **Welcome back to FH.** *What would you like to start?*
480
+ > - **① Map a project**
481
+ > - **② Create a new project**
482
+ > - **③ Accelerate or diagnose a mapped project** (work · Full-Harness · skills/agents/plugins · 진단) — {field candidates}
483
+ > - **④ Cross-project synergy**
484
+ > - **📖 Guide / Q&A**
465
485
  >
466
486
  > (When **FH-dev state exists** — the operator — the welcome line is **"The FH operator — good to see you."** in place of "Welcome back to FH.")
467
487
 
468
- Render conditions: ①②③ always (③'s candidates composed live) · only when **2+ project tracks** exist (underscore meta dirs don't count) — synergy findings flow back into each project, and may *propose* an FH contribution (`/field-harvest` → `tracks/_contrib`) as an **outcome of findings, never a standing door**.
488
+ 🟥 **한 줄로 이어붙이지 마라 문은 줄에 하나다** (운영자 지적 2026-08-20). `·` 이어붙인
489
+ 한 줄짜리 메뉴는 터미널 폭에서 임의로 접혀서 **어디까지가 한 문인지 눈으로 안 갈린다**. 세로
490
+ 목록은 G-GREET-02(🐿️+환영문 **같은 줄**)·G-GREET-03(고정 4문)·G-GREET-05(문구 리터럴)를
491
+ **셋 다 그대로 만족한다** — 그 프로브들이 박은 것은 문 집합·리터럴·환영문 줄이지 **메뉴의 줄
492
+ 수가 아니다**. 세로로 펴는 것은 렌더 층이고 판정 층이 아니다.
493
+
494
+ **📖 문 (비번호, 항상)**: `docs/USER_GUIDE.md` 를 **띄우고**, FH 사용법 문답을 받는다.
495
+ 🟥 **번호를 늘리지 않는다** — ①~④ 는 고정 4문이고 🔧 만 비번호 예외였다(`fh_detail_protocols.md`
496
+ Step 2 가 문 집합 고정을 명시). 가이드는 「작업의 시작」이 아니라 「작업 전 참조」라 성격이 다르다.
497
+ 🟥 **띄운다 = 경로 + 3줄 목차 출력이 먼저다.** 전문을 인라인으로 뱉지 마라 — 매 세션 토큰을
498
+ 태우는 형태이고, 이 문이 존재하는 이유가 그걸 안 하기 위해서다. opener(`open`/`xdg-open`/`start`)는
499
+ `uname -s` 로 분기해 **제안만** 하고, 없으면 조용히 넘어간다(경로는 이미 나갔으므로 손실 0).
500
+ ⚠️ `open` 은 macOS 전용이다 — FH 는 npm 배포물이라 그걸 기본값으로 두면 안 된다.
501
+ 운용 상세(허용 코퍼스 · 모르면 「못 찾음」)는 `/fh` Step 3.5.
502
+
503
+ Render conditions: ①②③ always (③'s candidates composed live) · ④ only when **2+ project tracks** exist (underscore meta dirs don't count) — synergy findings flow back into each project, and may *propose* an FH contribution (`/field-harvest` → `tracks/_contrib`) as an **outcome of findings, never a standing door**.
469
504
 
470
- - **Developer door (unnumbered, outside the menu)**: when **FH-dev state exists** (session card `tracks/_meta/reference_next_session_starter.md` · open `fh_signal_*` files · `CLAUDE.local.md`), append to the menu line: ` · 🔧 FH self-development — {FH worklist}`. The hub operator always has this state, so the owner always sees it — no flag needed. Without dev state the door is **silently absent**; the user typing `developer` / `개발자` **as a standalone utterance or menu reply** (not a substring of a task sentence) opens it on demand (routes to `docs/CONTRIBUTING.md` + `tracks/_contrib/` + open `fh_signal_*` items).
505
+ - **Developer door (unnumbered, outside the menu)**: when **FH-dev state exists** (session card `tracks/_meta/reference_next_session_starter.md` · open `fh_signal_*` files · `CLAUDE.local.md`), append it as **its own row at the bottom of the menu list**, not tacked onto another line: `- **🔧 FH self-development** — {FH worklist}`. The hub operator always has this state, so the owner always sees it — no flag needed. Without dev state the door is **silently absent**; the user typing `developer` / `개발자` **as a standalone utterance or menu reply** (not a substring of a task sentence) opens it on demand (routes to `docs/CONTRIBUTING.md` + `tracks/_contrib/` + open `fh_signal_*` items).
471
506
 
472
507
  Compose session-card candidates **into door ③ (field) and the 🔧 door (FH-dev)**, never as a raw priority dump that replaces the menu. An urgent open item (time-windowed handoff · blocking external deadline) outranks the menu; an explicit task utterance skips it entirely (see Guards below); cadence reminders (§Cadence Rules) ride below it, they don't displace it. Canonical source: `fh_detail_protocols.md` Step 2 — keep branch tests and door labels in sync.
473
508
 
@@ -598,10 +633,26 @@ written — a static read was recorded as `tier2` because `tier1b` did not yet e
598
633
  gets filled by the next one up rather than staying empty.) Naming note: this collides in
599
634
  English with FH's own persona/viewpoint sense of "standpoint" (`fh-meta:beginner`/`main-player`/
600
635
  `expert`) — a different axis (which persona reviews, not whose repo is ground truth); kept as-is,
601
- not renamed, but do not conflate the two. **Prose-only today** unlike `crossfamily:`, no
602
- pre-commit hook or fixture suite validates this field yet, and mechanizing it is FH's own
603
- responsibility since a sibling harness that syncs this doctrine verbatim cannot add the check
604
- locally; mechanize on the first recorded false value, not before. Three artifacts, one carrying two
636
+ not renamed, but do not conflate the two. 🟥 **CORRECTED 2026-08-20this paragraph used to say
637
+ `standpoint:` was "Prose-only today — no pre-commit hook or fixture suite validates this field yet".
638
+ That is FALSE and was false in this same file**: `validate_standpoint_leg()` lives in
639
+ `templates/.git-hooks/pre-commit` and is called from the marker block, and its fixture suite
640
+ `scripts/test_marker_standpoint_lanes.sh` is wired through `scripts/selfcheck.sh`. (🟥 **Grep the
641
+ names, do not trust line numbers** — the first version of this correction cited `:798`/`:1575` and a
642
+ commit landed the same hour that moved them to `:878`/`:1665`. A hardcoded anchor in prose is a
643
+ phantom waiting for the next edit.) §자기 대조
644
+ above already said so (PR #429), so **one file carried both claims at once** and a reader landed on
645
+ whichever they reached first. Found by the residency-ledger pass, not by a lane — no check compares
646
+ a rule's self-description against the machinery it describes, which is why a stale "we have not
647
+ built this yet" is the quietest form of drift: it reads as honest modesty and it suppresses use of a
648
+ control that already exists. **What is validated is the ENUM** — measured by varying ONE variable at a
649
+ time, because the first version of this correction varied two and mis-attributed the result:
650
+ `banana(qasp)` → blocked (enum) · `tier2` without parens → blocked (enum) · `tier2(qasp)` with **no**
651
+ execution grounds → **passes with a warning** · with grounds → passes. 🟥 So the first fix's claim
652
+ that "grounds are non-empty" are checked **over-shot, and a different-family reviewer caught it**:
653
+ the `tier2`+ execution grounds are **advisory**. Two residuals remain and both are real — grounds are
654
+ not enforced, and whether `tier2` is *true* is still self-attested. What was wrong was only the claim
655
+ that nothing validated the field at all. Three artifacts, one carrying two
605
656
  independent trials (forge-harness PR #368, a sibling field harness's PR #8 reps=3 and its
606
657
  known-answer trial, qasp-dev PR #161 as adjacent corroboration) crossed this repo's own evidence
607
658
  bar the same day this was formalized — including one caught by this session's own qasp PR #161
@@ -790,7 +841,8 @@ deleted branch was carrying).
790
841
  **When this gate fires** — *before* any of: branch deletion (local or remote), history rewrite /
791
842
  force-push, scrub of tracked history, bulk deletion of session records / tracks content.
792
843
 
793
- 1. **Enumerate (measured)**: `bash templates/predelete_check.sh <repo> [base]` per branch: commits
844
+ 1. **Enumerate (measured)** 🟥 **this step is run BY A HUMAN; no hook executes it** (measured
845
+ 2026-08-20, residency-ledger pass): `bash templates/predelete_check.sh <repo> [base]` — per branch: commits
794
846
  off base + unique paths. Verdicts: SAFE (fully merged) · CHECK (0 unique paths but commits off
795
847
  base — shared files may hold *newer* content, e.g. an unmerged session card) · REVIEW (unique
796
848
  paths — recovery mandatory).
@@ -811,6 +863,15 @@ prose gate is now stopped); it does **not** close the injected/adversarial one
811
863
  or errors, this irreversible surface **fails closed** — the pre-push hook blocks (enumerate by hand or
812
864
  take the explicit `DESTRUCTIVE_OP_OK=1` override); a tooling-down enumerate step never silently degrades
813
865
  into "just delete it."
866
+ 🟥 **Read that precisely — the floor is the HOOK, not this script.** `templates/.git-hooks/pre-push`
867
+ implements the per-ref verdict **inline**; it does not call `predelete_check.sh`. Measured 2026-08-20
868
+ (control: the same scan finds `session_close_check` wired in that hook): every in-repo reference to
869
+ `predelete_check.sh` is a **mention, not an execution** — `pre-push:408` lists the path inside a *grep
870
+ pattern*, `destructive_pre_gate.sh:191` *prints the command* as advisory text, and `selfcheck.sh:192`
871
+ runs `bash -n` on it. So the script is the **operator's enumerate tool**, and step 1 above is a human
872
+ step that the machinery reminds you of rather than performs. Stating it the other way round is the
873
+ "prose-invoked floor" the 4-axis marker spec calls M-tier when a rule claims a floor its script has
874
+ no caller for — this section does not make that claim, and this note keeps it from drifting into one.
814
875
 
815
876
  > **Detail**: See `knowledge/shared/harness-core/claude_md_gate_details.md §Destructive-Op-Hook-Coverage`
816
877
  > — the per-ref verdict mechanics, what the hook does/does not close (honest scope + adversarial residual),
@@ -971,7 +1032,7 @@ Self-healing is not only FH-self-dev (Mode D 4-axis) and reactive (`verify-bidir
971
1032
 
972
1033
  ## Agent Dispatch Operation (FH cwd-Based)
973
1034
 
974
- > **Runtime authority (canonical):** one explicit governor per context + capability-routed sidecars; sidecar findings are evidence candidates, not terminal verdicts, until source-closed by the governor *via a mechanical anchor* — never governor agreement alone. CC=action/governor · Codex=repo-grounded audit sidecar · Gemini/agy=breadth/multimodal sidecar · other runtimes=portable `AGENTS.md` entrypoint only. Full doctrine + Maintenance-Cost Rule: `knowledge/shared/harness-core/multi_model_sidecar_strategy.md §Runtime Authority`.
1035
+ > **Runtime authority (canonical):** one explicit governor per context + capability-routed sidecars; sidecar findings are evidence candidates, not terminal verdicts, until source-closed by the governor *via a mechanical anchor* — never governor agreement alone. 🟥 **A sidecar audits; it does not WRITE to the target tree** — findings and at-most a proposed patch as text, applied by the governor (measured 2026-08-21: an auditor sidecar edited the tree and its fix introduced a self-referential fail-open that 41 lanes passed). CC=action/governor · Codex=repo-grounded audit sidecar · Gemini/agy=breadth/multimodal sidecar · other runtimes=portable `AGENTS.md` entrypoint only. Full doctrine + Maintenance-Cost Rule: `knowledge/shared/harness-core/multi_model_sidecar_strategy.md §Runtime Authority`.
975
1036
 
976
1037
  **Isolated delegation is a component of the identity, not an optional extra** (operator decision,
977
1038
  2026-08-08). FH/PMH are defined as governor + orchestrator; a harness that cannot dispatch is a
@@ -1249,7 +1310,8 @@ Closing phrase detected ("wrap up", "done", "good work", "end session", etc.)
1249
1310
  --state open` cross-repo). Classify, **surface-not-auto**: **self-mergeable** PR (own repo,
1250
1311
  checks green) → *propose merge now* (never auto-merge — HITL); **awaiting-external** →
1251
1312
  *surface for tracking only*. (Origin PR#111 + count-consistency pairing → §detail below.)
1252
- → ② If FH assets changed: harvest-loop
1313
+ → ② If FH assets changed, **or `close_retro` is granted**: harvest-loop
1314
+ (후자는 Step 0-d 세션 회고 — 자산 미변경 세션에도 회고는 의미가 있다)
1253
1315
  → ③ Sync local/gitignored session state to your durable companion store, if you keep one
1254
1316
  → ④ Memory hygiene — update stale entries + record new session findings.
1255
1317
  **Deliberately unmechanized, and stated so rather than left ambiguous**: hygiene is a judged
@@ -1282,7 +1344,7 @@ Closing phrase detected ("wrap up", "done", "good work", "end session", etc.)
1282
1344
 
1283
1345
  | Bump | Reserved for (operator's own wording, 2026-08-17) |
1284
1346
  |---|---|
1285
- | **major** `+1.0.0` | **any one of three**: ⓐ **완전히 새로 지음** — rebuilt from scratch, not extended · ⓑ **정체성이 확립됨** — an identity of the five (+Ⓑ) actually standing 🟢, not progressing toward it · ⓒ **기능이 혁신적으로 변경되거나 늘어남** — a capability *class* appears or is replaced, not a capability instance. 🟥 **Never** for tightening a gate that already existed |
1347
+ | **major** `+1.0.0` | **any one of three**: ⓐ **완전히 새로 지음** — rebuilt from scratch, not extended · ⓑ **정체성이 확립됨** — 🟥 **다섯이 «전부» 🟢** 인 순간이지 하나가 🟢 로 올라선 순간이 아니다(운영자 결정 2026-08-21). 초판은 *"an identity of the five actually standing 🟢"* 였고 **「하나만 초록이어도 major」로 읽혔다** — 실제로 그날 ②가 🟢 로 판정되면서 3.0.0 후보로 올라왔고, 그 애매함이 그때 닫혔다. 🟥 그리고 **정체성 등급은 npm 이 나르는 신호가 아니다** — 그건 `identity-v*` 계보의 사건이고, npm 이 또 나르면 같은 날 고친 「두 계보 한 이름」 결함을 번호에서 재생산한다. ⇒ major-ⓑ 는 **`identity-v1.0.0` 과 같은 사건**을 가리킨다 · ⓒ **기능이 혁신적으로 변경되거나 늘어남** — a capability *class* appears or is replaced, not a capability instance. 🟥 **Never** for tightening a gate that already existed |
1286
1348
  | **minor** `+0.1.0` | 미들급 — new assets, new gate lanes, doctrine that changes behavior; **including changes that break a consumer's gate acceptance**, which then carry a mandatory `BREAKING (gate):` line |
1287
1349
  | **patch** `+0.0.1` | 트리비아급 — fixes, wiring, docs that change no behavior |
1288
1350
 
package/README.ja.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>役に立ったら ⭐ が他の人の発見につながります。</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 へ同じことを繰り返し伝えているはずです。走らせる検査、守るべきルール、
26
+ 変更が満たすべき形。<br>
27
+ <b>forge-harness はそれを再利用できるものに変えます。</b> リポジトリの中に住み、自分から発火する
28
+ スキル・ゲート・エージェントとして。<br>
29
+ スキルはあえて汎用のままにし、使ううちにあなたの事例へ合わせて鍛えます。
30
+ <b>同じ形が何度も戻ってきたら、そこで出荷を提案します</b> — 独立したスキルとして、または独立したハーネスとして。
26
31
  </p>
27
32
 
28
- <p align="center">
29
- <b>品質が梃子であり、速度はその結果です。</b> あらゆる変更はゲートを通って自らの値打ちを証明します —<br>敵対的 (adversarial) · ファントム (phantom) · 回帰 (regression) — そして<i>それ</i>が次の変更をより速くします。
30
- </p>
33
+ ---
34
+
35
+ ## 2分で試せます — この文書を読み切る必要はありません
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
+ **そして `hi` と入力してください。** 番号付きのメニューが出て、そこからはツールが案内します。
45
+ 入口を選んでいくつか答えれば、インストールウィザードまで代わりに実行します。この線から下は
46
+ 必要になったときに見る参考資料であり、始める前の宿題ではありません。
47
+
48
+ **増幅するもの**: 試行の回数です。試行錯誤があなたから離れ、並列で回ります。
49
+ **増幅しないもの**: モデルの天井です。ハーネスはモデルを自分の天井まで引き上げるだけです。
50
+ **確かめ方**: 自分の評価を公開します。五つのアイデンティティを正直に、
51
+ [リリース](https://github.com/chrono-meta/forge-harness/releases)ごとに記します。緑でない欄は、
52
+ まだ足りていない実際の実行が何かを名前で述べます。
53
+
54
+ ---
31
55
 
32
56
  <p align="center">
33
- <i>フォークしてください。名前を変えてください。あなたのものにしてください。</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>品質が梃子であり、速度はその結果です。</b> <i>フォークしてください。名前を変えてください。あなたのものにしてください。</i><br>
62
+ <sub>役に立ったら ⭐ が他の人の発見につながります。</sub>
38
63
  </p>
39
64
 
40
65
  <p align="center">
@@ -137,7 +162,7 @@ cd ~/projects/{your-project} && claude
137
162
  |---|---|
138
163
  | 個人開発者、プロジェクト1つ、まず試したい | [`templates/starter_profile.md`](templates/starter_profile.md) — コマンド1つ、厳選された最初の5つのスキル |
139
164
  | プロジェクトが複数、複利で積み上がるハブが欲しい | ハブをクローン(上のクイックスタート) |
140
- | CI / 非 Claude ランタイム、ゲートだけ欲しい | `npx @chrono-meta/fh-gate`(インストール不要のガバナンスゲート) |
165
+ | CI / 非 Claude ランタイム、ゲートだけ欲しい | `npx --package @chrono-meta/fh-gate fh-gate`(インストール不要のガバナンスゲート) |
141
166
  | `npx`/`npm` より `brew` がいい | `brew tap chrono-meta/forge-harness && brew install forge-harness` — 内容は100%同一、インストール体験だけが違います(コミュニティ tap; まだ Homebrew Core には入っていないので、先に tap しないと `brew search` では見つかりません) |
142
167
 
143
168
  ---
package/README.ko.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>도움이 됐다면 하나가 다른 사람이 찾는 도움이 됩니다.</sub>
21
+ <b>필요한 시키세요. 같은 요청이 반복되면, 그걸 만들어 드리겠다고 먼저 제안합니다.</b>
21
22
  </p>
22
23
 
23
24
  <p align="center">
24
- <b>당신의 Claude Code 프로젝트를 벼려서 통과시키면, 빠르게 나옵니다.</b><br>
25
- 실무자의 <b>메타하네스</b> 당신의 프로젝트 하네스들이 사는 은하계.<br>각 프로젝트의 <b>바닥(floor)</b>을 올리고(설정을 하네스화) <b>천장(ceiling)</b>을 올린 뒤(작업을 가속), 그 이득을 포트폴리오 전체에 복리로 쌓습니다.
25
+ 이미 Claude Code 같은 말을 반복하고 계실 겁니다. 돌려야 할 검사, 지켜야 할 규칙,
26
+ 변경이 갖춰야 모양.<br>
27
+ <b>forge-harness 는 그걸 재사용 가능한 것으로 바꿉니다.</b> 저장소 안에 살면서 스스로 발화하는
28
+ 스킬과 게이트와 에이전트로요.<br>
29
+ 스킬은 일부러 범용으로 두고 쓰시는 동안 사례에 맞춰 벼립니다.
30
+ <b>같은 모양이 자꾸 돌아오면 그때 출하를 제안합니다</b> — 별도 스킬로, 또는 별도 하네스로.
26
31
  </p>
27
32
 
28
- <p align="center">
29
- <b>품질이 지렛대이고, 속도는 그 결과입니다.</b> 모든 변경은 게이트를 통과해 제 값을 증명합니다 —<br>적대(adversarial) · 팬텀(phantom) · 회귀(regression) — 그리고 <i>그것</i>이 다음 변경을 더 빠르게 만듭니다.
30
- </p>
33
+ ---
34
+
35
+ ## 2분이면 됩니다 — 이 문서를 다 읽지 않으셔도 됩니다
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
+ **그리고 `hi` 라고 입력하세요.** 번호가 붙은 메뉴가 뜨고 거기서부터는 도구가 안내합니다.
45
+ 문을 고르고 몇 가지에 답하면 설치 마법사까지 대신 돌려 줍니다. 이 아래는 필요할 때 찾아보는
46
+ 참고 자료이고, 시작하기 전에 읽어야 하는 숙제가 아닙니다.
47
+
48
+ **증폭하는 것**: 시도 횟수입니다. 시행착오가 당신에게서 떨어져 나가 병렬로 돕니다.
49
+ **증폭하지 않는 것**: 모델의 천장입니다. 하네스는 모델을 자기 천장까지 끌어올릴 뿐입니다.
50
+ **확인하는 법**: 자기 등급을 공개합니다. 다섯 정체성을 정직하게,
51
+ [릴리스](https://github.com/chrono-meta/forge-harness/releases)마다 적습니다. 초록이 아닌 칸은
52
+ 아직 없는 실제 실행이 무엇인지 이름으로 말합니다.
53
+
54
+ ---
31
55
 
32
56
  <p align="center">
33
- <i>포크하세요. 이름을 바꾸세요. 당신의 것으로 만드세요.</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>품질이 지렛대이고 속도는 결과입니다.</b> <i>포크하세요. 이름을 바꾸세요. 당신의 것으로 만드세요.</i><br>
62
+ <sub>도움이 됐다면 ⭐ 하나가 다른 분이 찾는 데 도움이 됩니다.</sub>
38
63
  </p>
39
64
 
40
65
  <p align="center">
@@ -135,7 +160,7 @@ cd ~/projects/{your-project} && claude
135
160
  |---|---|
136
161
  | 1인 개발자, 프로젝트 하나, 일단 써보는 중 | [`templates/starter_profile.md`](templates/starter_profile.md) — 명령 하나, 엄선된 첫 5개 스킬 |
137
162
  | 프로젝트 여럿, 복리 허브를 원함 | 허브 클론(위 빠른 시작) |
138
- | CI / 비-Claude 런타임, 게이트만 | `npx @chrono-meta/fh-gate` (무설치 거버넌스 게이트) |
163
+ | CI / 비-Claude 런타임, 게이트만 | `npx --package @chrono-meta/fh-gate fh-gate` (무설치 거버넌스 게이트) |
139
164
  | `npx`/`npm`보다 `brew`를 선호 | `brew tap chrono-meta/forge-harness && brew install forge-harness` — 100% 동일한 내용, 설치 UX만 다름(커뮤니티 탭; 아직 Homebrew Core에 없어서 탭을 먼저 추가하지 않으면 `brew search`로는 안 잡힙니다) |
140
165
 
141
166
  ---