@chrono-meta/fh-gate 2.3.0 → 2.4.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 (31) hide show
  1. package/.claude/rules/fh_4axis_gate.md +25 -0
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/CLAUDE.md +51 -6
  4. package/README.ja.md +14 -2
  5. package/README.ko.md +14 -1
  6. package/README.md +16 -2
  7. package/README.zh.md +12 -1
  8. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +231 -7
  9. package/knowledge/shared/harness-core/harness_incubator_doctrine.md +215 -1
  10. package/knowledge/shared/harness-core/ship_readiness_gate.md +168 -1
  11. package/knowledge/shared/learnings/subagent_invocations_log.yaml +24 -0
  12. package/package.json +6 -1
  13. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  14. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  15. package/plugins/fh-meta/CHANGELOG.md +57 -0
  16. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +20 -0
  17. package/plugins/fh-meta/skills/steel-quench/SKILL.md +25 -2
  18. package/scripts/adapters/mate_agent_boundary.sh +27 -7
  19. package/scripts/capability_registry_check.sh +69 -3
  20. package/scripts/relay_channel.sh +151 -6
  21. package/scripts/selfcheck.sh +18 -0
  22. package/scripts/target_freeze.sh +239 -0
  23. package/scripts/test_adapter_lanes.sh +17 -0
  24. package/scripts/test_marker_standpoint_lanes.sh +83 -0
  25. package/scripts/test_marker_thirdparty_lanes.sh +73 -0
  26. package/scripts/test_regression_guard_ci_lanes.sh +170 -0
  27. package/scripts/test_relay_channel_lanes.sh +146 -17
  28. package/scripts/test_target_freeze_lanes.sh +203 -0
  29. package/templates/.git-hooks/pre-commit +242 -0
  30. package/templates/PRE-PUBLISH-CHECKLIST.md +22 -0
  31. package/templates/regression_guard.sh +32 -4
@@ -197,7 +197,32 @@ than only from the hook's absence.
197
197
  **`thirdparty:` — ⓓ3자 대면의 자기 필드 (2026-08-17 신설).** ⓑ가 `standpoint:` 를 갖는 것과
198
198
  같은 형태다: `axes-run` 에는 포인터(`ⓓ=→thirdparty`)만 두고 값은 이 필드가 나른다.
199
199
 
200
+ 🟥 **이 축은 반쪽이 아니라 둘이다 — 규격이 한쪽만 인코딩하고 있었다(2026-08-17 정정).**
201
+ 6축 정본(`knowledge/shared/harness-core/fh_three_layer_canon.md:243`)은 ⓓ가 받는 것을
202
+ **«문제 + 남의 코드베이스»**로 정의하고 **두 질문**을 묶는다:
203
+
204
+ | 반쪽 | 질문 | 값 |
205
+ |---|---|---|
206
+ | ① 선행자산 | **이미 풀린 문제 아닌가** | `checked` · `none-found` |
207
+ | ② **하네스 단위 적대검증** | **내 변경이 남의 레포/입장에서 어떻게 보이나** | `peer-review` ← **신설** |
208
+
209
+ ②의 정본 형태(운영자, 2026-08-17): *"qasp 개선건에 대해서 **지스택에 소넷을 넣고 지스택 하네스
210
+ 페르소나로** qasp 개선건을 리뷰하고 검증하는 것 — **계열을 넘어선 하네스 단위의 적대검증 스코프**."*
211
+ **FH 는 governor 로서 그 상황을 만들고·관측하고·판정한다.** 4축 게이트가 검증하는 대상은 그
212
+ 제3 하네스가 내놓은 **의견**이고, 그 판정은 **FH 로컬**에서 이뤄진다 — 남의 레포에 게이트를
213
+ 거는 것이 아니다.
214
+
215
+ ⚠️ **②가 왜 빠져 있었는지가 실측으로 드러났다**: 규격에 ①만 있으니 코퍼스 6건 중 peer 가 쓴
216
+ 4건은 전부 ① 형태였고, ②에 가까운 것을 적으려던 2건은 **enum 밖 자유 산문으로 샜다.** 이 필드가
217
+ 신설된 사유(*「적을 자리가 없다」를 벗는다*)가 **한 칸 안쪽에서 재발한 것**이다.
218
+
219
+ 🟥 **그리고 ②는 정의상 «남의 레포 스코프»다.** 게이트 스코프가 자기 자신으로 묶여 있으면 이 축은
220
+ **구조적으로 기록될 수 없다** — 정본 §170 의 «ⓓ 자기 스코프가 가장 나빴다» 실측과 같은 자리다.
221
+
200
222
  ```
223
+ thirdparty: peer-review(<하네스>/<페르소나> → <대상>, <무엇이 돌아왔나>)
224
+ ← ② 하네스 단위 적대검증. 계열을 넘는다
225
+ 예: gstack/harness-persona → qasp, 경계 가정 2건 반증
201
226
  thirdparty: checked(<무엇을 검색했고 무엇을 찾았나>)
202
227
  thirdparty: none-found(<무엇을 검색했나>) ← 찾았는데 선행 없음. «안 봤다»와 다른 명제다
203
228
  thirdparty: DEGRADED_NO_ACCESS(<사유>) ← 못 봤다 (검색 수단 부재)
@@ -11,13 +11,13 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "2.3.0",
14
+ "version": "2.4.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.3.0",
20
+ "version": "2.4.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/CLAUDE.md CHANGED
@@ -54,9 +54,18 @@ core invariants never melt). The nursery also **verifies what it births**: harne
54
54
  > · ③ **각 축의 컨트롤과 그 생사**. 축을 «돌렸다»의 **최소 증거 = 컨트롤이 살아 있는 실행 출력**
55
55
  > 이다 — 안 고른 이유만 적은 것은 준수가 아니다.
56
56
  > **비용 경계**: 넷을 매번 다 돌리지 않는다. 실패 모드에 맞춰 **고른다**.
57
- > 🟥 **자평이다 · 게임 가능하다 · 훅이 없다 닫혔다.** 지금 기계 앵커가 붙은 축은
58
- > 하나뿐이나 그건 **현 상태이지 원리적 한계가 아니다**(ⓐⓒ 기계화할 수 있다 — cross-family
59
- > 지목). 닫는 방향은 **cross-family 마커를 읽는 것**이지 자기 채점을 성실히 하는 게 아니다.
57
+ > 🟥 **자평이다 · 게임 가능하다 — 둘은닫혔다. 「훅이 없다」는 2026-08-17 부로 거짓이 됐고,
58
+ > 정정이 경계를 선명하게 만든다.** 그날 `standpoint:`(PR #429)와 `thirdparty:`(PR #434)에
59
+ > 검증 레인이 붙어, `crossfamily:` 함께 **세 필드가 훅에서 닫힌 enum + 비공허 근거로
60
+ > 검증된다**(`validate_{crossfamily,standpoint,thirdparty}_leg`). 🟥 **그러나 닫힌 것은 «형식»
61
+ > 이지 «진위»가 아니다** — 훅은 값이 목록 안에 있고 근거가 비어 있지 않은지를 보지, 그 값이
62
+ > **참인지**는 보지 않는다. 도그푸드 증거: 그 기계화를 촉발한 거짓값(어느 릴리스 마커의
63
+ > `not-applicable`)이 **새 레인을 그대로 통과한다.** 형식이 옳기 때문이다.
64
+ > 그래서 **자평·게임 가능성은 그대로 열려 있다.** 그건 결함이 아니라 §Mechanization Boundary 가
65
+ > 의도적으로 사람에게 남긴 자리다(판단을 코드로 굳히면 오늘의 판단이 내일의 천장이 된다).
66
+ > 닫는 방향은 여전히 **cross-family 가 그 마커를 읽는 것**이지 자기 채점을 더 성실히 하는 게
67
+ > 아니다 — 2026-08-17 실측이 그 근거를 강화했다(병렬 두 세션, 상호 정정 7건, **판단 축 자력
68
+ > 적발 0**, 둘 다 사전등록·컨트롤·되돌림을 다 돌리고도 각자 자기 쪽으로 접었다).
60
69
  > **근거·사례·표본 한계는 `fh_three_layer_canon.md` §1-c — 인용하기 전에 읽어라.** 이 규칙은
61
70
  > **n=1 세션 표본**에서 모든 install 로 일반화한 것이고, 그 절이 그 사실을 명시한다.
62
71
 
@@ -535,6 +544,27 @@ runtime (local wiring visible, not independent) · `tier3(<harness>)` a *differe
535
544
  target harness ran it · `not-applicable` · degrade triad `DEGRADED_NO_TARGET_ACCESS` could-not /
536
545
  `DEGRADED_NOT_RUN` did-not / `UNKNOWN` did-not-look — same shape as `crossfamily:`'s triad,
537
546
  **distinct literal values**, do not reuse crossfamily's tokens).
547
+ 🟥 **Settle the TARGET CLASS(es) before the tier — §7's `Q0`, added 2026-08-17 (operator decision).**
548
+ A consumer install **is** another harness; what the enum scopes is not who *receives* the change but
549
+ where it has to be **executed**. Q0 is **not first-match — it can return more than one target, and
550
+ each owes its own tier**: ⓐ a **named peer** whose local repo carries the changed surface, or which
551
+ the cluster registry / a `scripts/adapters/` entry names (decide by that test, not from a name list)
552
+ → the enum as written · ⓑ the delta changes **consumer-visible behavior** (what a consumer's gate
553
+ blocks or passes, what their session is told to do, what an install receives) → target = a *clean
554
+ install of the packed artifact*, and it binds **now, pre-push — never deferred to the eventual
555
+ release** · ⓒ neither → `not-applicable`. 🟥 Do **not** read «no cross-repo consumer contract» as
556
+ «this file is not shipped» — measured, **194/200 recent non-merge commits touch a shipped path (97%,
557
+ all 6 exceptions hand-verified)**, so shipped-ness cannot be the discriminator; the behavior clause
558
+ is. Pricing the axis at that rate is the **over-triggering** §7's own Trigger paragraph rejects.
559
+ ⚠️ 97% measures **the reach of the discarded shipped-path argument**, not the applicability rate —
560
+ how often ⓑ actually fires is **unmeasured in both tails** (it could also land near-universal, which
561
+ would be a rubber stamp — watch the next 20 markers). 🟥 Do **not** cite
562
+ `[[feedback_unreachable_done_when_trains_evasion]]` here: that memory concerns an unreachable *pass
563
+ condition*, and `not-applicable` is an *exemption* — the direction inverts. Three marker-audit legs all failed at that reading;
564
+ they were **not** decorrelated (same family · same prompt · same canon) so that is one observation,
565
+ not three. ⚠️ The consumer-install arm's *presence* half is mechanized at ship time; its
566
+ **execution** half (extract the tarball, run the gate, record command + output) has **no lane** —
567
+ do it by hand, and do not cite that arm as mechanized.
538
568
  🟥 **The execution is the load-bearing half** (operator decision 2026-08-16): a static standpoint
539
569
  read competes with cross-family review for the same defect classes and mostly loses — *running the
540
570
  target harness locally, to completion*, is the part with no substitute. Measured on one delta the
@@ -609,14 +639,28 @@ installed **FH assets** run the **4-axis gate**; **field scaffolds** run **`asse
609
639
  `steel-quench`** (the FH pre-commit hook is repo-local and does **not** reach a scaffold installed into another
610
640
  repo, so this routing is not redundant with it) · **autonomy floor** — discover/rank trusted at opus-tier+;
611
641
  below-floor, present the raw recommend and ask · **HITL per item**, and `"끝까지 해줘 / 자율로 완주"` → full-autonomy under the `/goal-quench`
612
- gate: autonomy removes the per-item *prompt*, **never the gate**. Honesty boundary that must not soften in
613
- summary: the chamber **overwhelmingly screens** — hand-counted 2026-08-08 from the run ledger:
614
- 9 full runs, **8 KILL, 1 EMIT**. It has birthed **once** (run #9 `forge-wiki`, shipped publicly), so
642
+ gate: autonomy removes the per-item *prompt*, **never the gate**.
643
+
644
+ 🟥 **Chamber outcome vocabulary changed 2026-08-17 (operator decision) the old count below is a
645
+ snapshot of a *different instrument*, not a current rate.** Re-routing, not softening:
646
+ `net-new` failure is no longer a KILL — it routes to **`CURATED`** (hand the maker the prior-art list
647
+ and the delta it does not cover; *"그 사람이 만들려는 걸 인큐베이터가 막을 필요가 있을까"*), and a
648
+ judgment-shaped candidate routes to **`NOT-APPLICABLE`**. **KILL survives for measured
649
+ precision-shortfall, hub-state dependence, and inability-to-run** — the screening that was actually
650
+ load-bearing is intact. Detail + the frozen known-pair that keeps the old instrument measurable:
651
+ `harness_incubator_doctrine.md §3-SCREEN-2026-08-17` · `tracks/_meta/chamber_taxonomy_knownpair_PREREG_2026-08-17.md`.
652
+
653
+ Honesty boundary that must not soften in summary — **under the old vocabulary**, hand-counted
654
+ 2026-08-08 from the run ledger: 9 full runs, **8 KILL, 1 EMIT** (13 runs · 11 KILL · 1 EMIT as of
655
+ 2026-08-17). It has birthed **once** (run #9 `forge-wiki`, shipped publicly), so
615
656
  "it has not birthed" — the earlier wording here — is no longer true. But do not upgrade the claim
616
657
  either: that run's workspace carries only a verdict file, with no intent/budget/blind-persona
617
658
  artifacts, so the **formal flow** is not what produced it. The first end-to-end formal run is #10 and
618
659
  it KILLed. Either way simulate-first stays a one-line HITL recommendation, never a push-button
619
660
  autonomous emit.
661
+ ⚠️ **Do not cite that ratio as "the chamber screens well" or "over-screens" going forward** — the
662
+ counts were produced by a rule set that no longer runs, and whether it over-screened is **exactly
663
+ what the frozen known-pair exists to measure and has not measured yet.**
620
664
 
621
665
  > **Detail**: See `knowledge/shared/harness-core/onboarding_acceleration_autopilot.md` — full Phase-0 branch
622
666
  > logic + `chamber_run.sh` scope, the per-phase skill composition, the remaining guards (no-reinvention
@@ -791,6 +835,7 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
791
835
  | "I don't know what to build", "how should I approach this", "organize this for me", "clarify this", "정리해줘" (ambiguous request before dispatch) | `/deep-clarify` |
792
836
  | **work-shaped request outside the harness domain** — "이 문서 만들어줘", "위키 페이지 써줘", "이 자료 표로 만들어줘", any general work ask no other row or skill catches (**fallback default** — a more specific row above/below always wins: 리서치→deep-research · ambiguous "정리해줘"→deep-clarify · heavy fleet→goal-quench) | **Intent-Marshaling loop** (§Intent Marshaling — mechanical capability scan → one-line compose proposal → run; gap → capability ladder) |
793
837
  | "memory feels bloated", "clean up memory", "memory too large", "memory hygiene" | `/memory-hygiene` |
838
+ | **사람이 읽을 산출물이 나가기 직전** — README·가이드·리포트·장표·PR 본문 등 «독자가 여는» 것 (proactive; 코드가 옳아도 걸린다 — 이 행이 잡는 건 정확성이 아니라 **가독성**이다) | **독자로서 한 번 읽어라** — 첫 8줄에 결론이 있나 · 본문이 고정 템플릿에 덮이지 않나 · 마지막 인상이 무엇인가. 렌즈는 이미 있다: `/sim-conductor` A-1(`beginner` cold-read) 또는 직접 렌더해서 읽기. 🟥 **정적 검사는 「없는 것」을 잡고 「안 읽히는 것」은 못 잡는다** — 실측 2건이 독립 수렴했다(qasp 축: 지적 12건 중 스캐너 적발 0 · gstack 3자대면: 배포된 리포트 본문 3줄 vs 고정 템플릿 21줄). pre-commit 이 같은 상기를 advisory 로 낸다(차단 아님) |
794
839
  | "ready to PR", "about to push", "merge this", "PR 올려줘", FH asset changed in session | 4-axis auto-gate (see above — runs automatically, no proposal needed) |
795
840
  | **field verdict/gate/safety/irreversible code changed** in a mapped project (function returning a verdict enum / gate exit code / safety-invariant · publish/delete/history path) — **proactive, before merge** | **Field-Harness Load-Bearing Change Gate** (see above → degrade-lint → cross-family review → converge; same rigor as FH assets, applied to field code) |
796
841
  | **a diff (yours or an unattended pipeline's) alters another harness's actual behavior, gate outcome, or interaction contract** — building automation that opens PRs autonomously, touching a synced/shared-body surface, or any change whose effect crosses a harness boundary (not merely a file-class match — most self-improvement is `not-applicable` here, which is the expected common case) — **proactive, before push, never as a post-PR comment** | **Standpoint axis** (`knowledge/shared/harness-core/field_verdict_crossfamily_gate.md §7` — orthogonal to `crossfamily:`; run the diff from the TARGET harness's own repo/standpoint via `tier2`/`tier2b`/`tier3`, or record `not-applicable`/`DEGRADED_*` on the closed enum. Missed once in-session while building `scripts/frontier_digest_autopilot.sh` 2026-08-15 — mis-routed to `fh-meta:hub-cc-pr-reviewer` (same-repo self-consistency, a different lens) before the operator caught it; this row exists so the next session connects the trigger without two rounds of correction.) |
package/README.ja.md CHANGED
@@ -206,14 +206,26 @@ Project B ──→ CLAUDE.md でハブを接続
206
206
  | **④** | **フロンティア → 組織への伝播** | 外から届いたものが、組織の*内側*まで届ききります |
207
207
  | **⑤** | **増幅器 (Amplifier)** | 短い意図が、完成した成果物まで鍛え上げられます |
208
208
 
209
+ **6つ目の行は、意図的にこの表にありません。** `Ⓑ` **プロジェクトブースター (Project Booster)**
210
+ — FH の機構が *相手のハーネス自身の開発* を加速すること — は実在し等級も付いていますが、
211
+ **5つと同じ層ではありません。** 番号ではなく文字 Ⓑ を使う理由がまさにそれです。5つはそれぞれ
212
+ ブースティングの **外側** に固有の範囲を持ちます: ⑤ は人の意図全般(ハーネスが一切絡まない仕事
213
+ まで)、① は逆方向(受益者が FH 側)、② はユニットを *産む* こと — ブースティングは産んだ
214
+ **後**に来ます。だから包含関係ではありません。
215
+
216
+ 🟥 **正典はここで止め、矢印を描きません。** 階層を固めるほど、表が実際の動き方から離れるから
217
+ です — 現場では一つの仕事が ① と ⑤ を同時に走らせ、その結果が ② へ流れます。「何が何の下か」
218
+ ではなく **「異なる範囲」** として読んでください。等級は Ⓑ の分も含めてファイル一つにあります:
219
+ [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md) §Ⓑ-layering。
220
+
209
221
  **5つが等しく仕上がっているわけではなく、この表を「5つの動く機能」として読んではいけません。** 成熟度は
210
222
  正体ごとに4段階(`aspirational → partial → RC (ラボで立った) → REALIZED (外を歩いた)`)で追跡され、
211
223
  それぞれに日付入りの証拠の行が付いています。その等級はここには**あえて写しません**: 2つのファイルに
212
224
  置かれた等級は片方が必ず腐りますし、このページは4言語で存在するので、ここに写せば写しは4つになります。
213
225
  上のどの行かに頼る前に、現在の等級を読んでください — それはファイル1つです:
214
226
  [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md)。1文だけ欲しいなら、
215
- **2026-08-15** 時点で: **③ ⑤ は緑 — ラボの外で実証済み。①, ②, ④ はリリース候補 — 作られ較正されて
216
- いますが、他人の手の中で歩くところはまだ示されていません。** この文とゲートファイルが食い違ったときは、
227
+ **2026-08-17** 時点で: **①, ③,と Ⓑ は緑 — ラボの外で実証済み。②, ④ はリリース候補 — 作られ較正
228
+ されていますが、他人の手の中で歩くところはまだ示されていません。** この文とゲートファイルが食い違ったときは、
217
229
  ゲートファイルが正しく、この行が古いということです。
218
230
 
219
231
  5つすべてを横断する性質が2つあり、どちらもオンにする機能ではありません:
package/README.ko.md CHANGED
@@ -203,13 +203,26 @@ Project B ──→ CLAUDE.md에서 허브 연결
203
203
  | **④** | **프런티어 → 조직 전파** | 밖에서 들어온 것이 조직 *안쪽까지* 내려앉음 |
204
204
  | **⑤** | **증폭자** | 짧은 의도가 완성된 산출물까지 벼려짐 |
205
205
 
206
+ **여섯 번째 행은 의도적으로 이 표에 없습니다.** `Ⓑ` **프로젝트 부스터** — FH 의 기계가 *상대
207
+ 하네스의 자체 개발*을 가속하는 것 — 는 실재하고 등급도 매겨져 있지만, **다섯과 같은 층이
208
+ 아닙니다.** 번호 대신 문자 Ⓑ 를 쓰는 이유가 정확히 그것입니다. 다섯 각각은 부스팅 **밖의**
209
+ 고유 범위를 지닙니다: ⑤ 는 사람의 의도 전반(하네스가 전혀 안 끼는 일까지)을, ① 은 반대 방향
210
+ (수혜자가 FH 다)을, ② 는 유닛을 *낳는* 것을 — 부스팅은 낳은 **뒤에** 옵니다. 그래서 포함
211
+ 관계가 아닙니다.
212
+
213
+ 🟥 **정본은 여기서 멈추고 화살표를 그리지 않습니다.** 위계를 못 박을수록 표가 실제 작업 방식과
214
+ 멀어지기 때문입니다 — 현장에서는 한 작업이 ①과 ⑤ 를 같이 태우고 그 결과가 ② 로 흐릅니다.
215
+ 「무엇이 무엇 밑」이 아니라 **「서로 다른 범위」**로 읽으세요. 등급은 Ⓑ 것까지 파일 하나에
216
+ 있습니다: [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md)
217
+ §Ⓑ-layering.
218
+
206
219
  **다섯이 똑같이 완성돼 있지 않으며, 이 표를 작동하는 기능 다섯으로 읽어서는 안 됩니다.** 성숙도는
207
220
  정체성별로 `지향 → 부분 → RC(실험실에서 섬) → REALIZED(밖에서 걸음)` 4단계로, 각각 날짜가 박힌
208
221
  증거 한 줄과 함께 추적합니다. 그 등급은 의도적으로 여기에 **옮겨 적지 않습니다**: 두 파일에 나눠 둔
209
222
  등급은 한쪽이 반드시 낡고, 이 페이지는 4개 언어로 존재하므로 여기에 복제하면 사본이 넷이 됩니다.
210
223
  위의 어느 행이든 믿고 쓰기 전에 현재 등급을 읽으세요 — 파일 하나입니다:
211
224
  [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md). 한 문장만 원한다면,
212
- **2026-08-15** 기준 요약: **③과 ⑤는 초록 — 실험실 밖에서 실증됨. ①·②·④는 릴리스 후보 —
225
+ **2026-08-17** 기준 요약: **①·③·⑤ Ⓑ 는 초록 — 실험실 밖에서 실증됨. ②·④는 릴리스 후보 —
213
226
  만들어지고 보정됐지만, 아직 남의 손에서 걷는 것이 확인되지 않음.** 이 문장과 게이트 파일이 다르면,
214
227
  게이트 파일이 옳고 이 줄이 낡은 것입니다.
215
228
 
package/README.md CHANGED
@@ -204,14 +204,28 @@ this page: that table is *symptoms you might arrive with*, this is *what the hub
204
204
  | **④** | **Frontier → org propagation** | What arrives from outside lands all the way *inside* the organization |
205
205
  | **⑤** | **Amplifier** | A short intent gets forged all the way to the finished artifact |
206
206
 
207
+ **A sixth row is deliberately absent from that table.** `Ⓑ` **Project Booster** — FH's machinery
208
+ accelerating *another harness's own development* — is real and graded, and it is **not on the same
209
+ layer as the five**. It carries a letter instead of a number for exactly that reason. Each of the
210
+ five keeps scope that sits outside boosting: ⑤ covers human intent generally (including work where
211
+ no harness is involved at all), ① runs in the opposite direction (FH is the beneficiary), and ②
212
+ births units — boosting comes *after* birth. So the relation is not containment.
213
+
214
+ 🟥 **The canon stops there on purpose and does not draw an arrow.** Pinning a hierarchy makes the
215
+ table drift from how the work actually runs, where one job rides ① and ⑤ together and the result
216
+ flows into ②. Read "different scopes", not "one sits under another". Grades — Ⓑ's included — live
217
+ in one file: [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md)
218
+ §Ⓑ-layering.
219
+
207
220
  **They are not equally finished, and you should not read the table as five working features.** Maturity is
208
221
  tracked per identity on a four-step scale — `aspirational → partial → RC (stood up in the lab) → REALIZED
209
222
  (walked outside)` — with a dated line of evidence for each. Those grades are deliberately **not** copied
210
223
  here: a grade kept in two files goes stale in one, and this page exists in four languages, so a copy here
211
224
  would be four copies. Before you rely on any row above, read the current grades — that is one file:
212
225
  [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md). The short version if you
213
- only want one sentence, as of **2026-08-15**: **③ and ⑤ are graded green — demonstrated outside the lab;
214
- ①, ② and ④ are release candidates — built and calibrated, not yet shown to walk in someone else's hands.**
226
+ only want one sentence, as of **2026-08-17**: **①, ③,and Ⓑ are graded green — demonstrated outside
227
+ the lab; ② and ④ are release candidates — built and calibrated, not yet shown to walk in someone
228
+ else's hands.**
215
229
  If that sentence and the gate file disagree, the gate file is right and this line is stale.
216
230
 
217
231
  Two properties cut across all five, and neither is a feature you switch on:
package/README.zh.md CHANGED
@@ -194,13 +194,24 @@ Project B ──→ 在 CLAUDE.md 中连接中枢
194
194
  | **④** | **前沿 → 组织传导 (Frontier → org propagation)** | 从外部到来的东西,一路落进组织 *内部* |
195
195
  | **⑤** | **放大器 (Amplifier)** | 一句简短的意图被一路锻造到成品 |
196
196
 
197
+ **第六行是刻意不放进这张表的。** `Ⓑ` **项目助推器 (Project Booster)** —— FH 的机制去加速
198
+ *对方harness自身的开发* —— 是真实存在且已被评级的,但它 **与这五项不在同一层**。用字母 Ⓑ
199
+ 而不是编号,理由正在于此。这五项各自都有落在助推 **之外** 的固有范围:⑤ 覆盖人的意图整体
200
+ (包括完全不涉及harness的工作),① 方向相反(受益者是 FH 自己),② 是 *生出* 单元 ——
201
+ 助推发生在生出**之后**。所以这不是包含关系。
202
+
203
+ 🟥 **正典到此为止,不画箭头。** 把层级钉死,表就会离实际的运作方式越来越远 —— 现场里一个任务
204
+ 同时跑 ① 和 ⑤,结果再流向 ②。请读成 **「不同的范围」**,而不是「谁在谁下面」。等级(含 Ⓑ 的)
205
+ 只在一个文件里:[`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md)
206
+ §Ⓑ-layering。
207
+
197
208
  **它们完成度并不齐平,你也不该把上面那张表读成五项能用的功能。** 成熟度按身份逐项跟踪,用一把
198
209
  四级刻度 —— `aspirational(构想)→ partial(部分)→ RC(在实验室里立起来了)→ REALIZED(走到
199
210
  外面去了)` —— 每一级都配一条带日期的证据。这些等级刻意 **没有** 被复制到这里:同一个等级放进
200
211
  两个文件,总会有一个先腐坏,而本页有四种语言版本,复制到这里就等于四份副本。在你依赖上表任何
201
212
  一行之前,请先读当前的等级 —— 那只有一个文件:
202
213
  [`ship_readiness_gate.md`](knowledge/shared/harness-core/ship_readiness_gate.md)。如果你只想要
203
- 一句话的版本,截至 **2026-08-15**:**③ 是绿灯 —— 已在实验室之外得到验证;①、② 与 ④ 是
214
+ 一句话的版本,截至 **2026-08-17**:**①、③、⑤ 是绿灯 —— 已在实验室之外得到验证;② 与 ④ 是
204
215
  候选发布 (RC) —— 已造出并校准,但还没在别人手上走过。** 如果这句话和那个门禁文件对不上,以门禁
205
216
  文件为准,这一行就是过期的。
206
217
 
@@ -224,6 +224,37 @@ pass):
224
224
  **🟥 DECIDE IN THIS ORDER — first match wins. Do not pick by matching a description.**
225
225
 
226
226
  ```
227
+ Q0. WHICH TARGETS? — settle the target CLASS(es) before reaching for a tier.
228
+ 🟥 NOT first-match. Q0 can return MORE THAN ONE target, and each one owes its own tier.
229
+ A release that also alters a named peer's contract owes both arms; recording only the
230
+ first shadows the second (caught by cross-family review, 2026-08-17).
231
+
232
+ ⓐ Does a NAMED PEER HARNESS carry this surface?
233
+ Mechanical test, in this order — do not decide from memory or from a name list:
234
+ · a local repo of a cluster peer carries the file this delta changes
235
+ (`for d in ~/projects/*; do test -f "$d/<changed-path>"; done`), OR
236
+ · the peer is declared in `.claude/capabilities` / the cluster registry, OR
237
+ the change edits an adapter under `scripts/adapters/` naming it
238
+ YES → target = that repo (one per peer) → run Q1 for each
239
+ ⓑ Does this delta change CONSUMER-VISIBLE BEHAVIOR — what a consumer's gate blocks or
240
+ passes, what a consumer's session is instructed to do, what an install receives?
241
+ YES → target = a CLEAN INSTALL of the packed artifact → run Q1
242
+ 🟥 This binds NOW, at the change, pre-push (§Sequencing) — NOT deferred to
243
+ the eventual release. Deferral was the first draft's hole: "not a release
244
+ yet" would have let a behavior change ship unexamined and left the releaser
245
+ holding a delta they did not write.
246
+ ⓒ Neither ⓐ nor ⓑ → `not-applicable` STOP.
247
+
248
+ 🟥 A consumer install IS another harness — settled, not open. What Q0 scopes is not WHO
249
+ RECEIVES the change but WHERE IT HAS TO BE EXECUTED, and 🟥 **not «is this file shipped»**:
250
+ almost everything here is shipped, so shipped-ness cannot be the discriminator (see
251
+ «Target class» below). The discriminator is ⓑ's *behavior* clause — the same effect-based
252
+ trigger this section already uses, applied to the consumer as a target rather than as an
253
+ audience.
254
+ Reading Q1/Q2 when the target is an install tree rather than a repo: Q1's "executed in the
255
+ target's repo" = "executed inside the extracted/installed tree"; Q2's local-wiring question
256
+ is answered NO for a bare extraction (`tier2`), YES only if a real consumer node's own
257
+ settings/state were in play (`tier2b`).
227
258
  Q1. Did anything EXECUTE in the target's repo — a command, a script, a suite?
228
259
  NO, I only read files → tier1b(<harness>) STOP.
229
260
  NO, I did not touch its repo → tier1 STOP.
@@ -269,6 +300,24 @@ tier1b(<target-harness>) STATIC standpoint read — the reviewer read the TA
269
300
  nearer value existed. A missing rung does not stay empty — it gets
270
301
  filled by the next one up. Real but weak: see «execution is the
271
302
  load-bearing half» below before crediting it.
303
+ 🟥 «FROM THE TARGET'S REPO» IS LOAD-BEARING, and a field case the
304
+ day this rung shipped shows why. A session changed FH code that would
305
+ make two peer harnesses' capability declarations start being REJECTED
306
+ — genuinely applicable — and reached for `tier1b` because it had
307
+ *read files*. The files it read were FH-local records ABOUT those
308
+ peers (`tracks/_meta/relay/*.cap`), not the peers' own files. Reading
309
+ your own repo's description of a peer is NOT a standpoint read; the
310
+ whole point of the axis is whose ground truth the review was checked
311
+ against, and that was still your own. The honest value there is
312
+ `DEGRADED_NOT_RUN(<peers>)` — applicable, target reachable, nothing
313
+ done at the target. Note the direction of the risk has INVERTED since
314
+ this rung was added: tier1b was created because a real static read had
315
+ no home and got recorded one rung too high; the new failure mode is
316
+ local reading being recorded as tier1b because "I read something"
317
+ feels the same. 🟥 Two different questions get merged here and must
318
+ not be: *does a target exist and is it affected* is **Q0**; *what did
319
+ you actually do at that target* is the **tier**. "The impact is real"
320
+ answers the first and says nothing about the second.
272
321
  tier2(<target-harness>) peer-simulated — the reviewer EXECUTED CODE in the TARGET's own repo
273
322
  (a local clone, real content) and observed the result.
274
323
  🟥 DISCRIMINATOR — «reading the target's real files is NOT this rung».
@@ -305,8 +354,18 @@ tier2b(<target-harness>) same operator, target's real runtime — the SAME h
305
354
  tier3(<target-harness>) actual peer — a DIFFERENT human operator of the target harness ran
306
355
  the change in their real runtime. The only tier with both local
307
356
  wiring AND reviewer independence from the author.
308
- not-applicable the change has no target-harness standpoint to borrow (no
309
- shared-body surface, no cross-repo consumer contract) distinct
357
+ not-applicable the change has no target-harness standpoint to borrow — Q0 found
358
+ neither a named peer harness NOR a release/publish surface, so there
359
+ is no repo and no install to run this from. 🟥 Read the second half
360
+ literally: «no cross-repo consumer contract» does NOT mean «this file
361
+ is never shipped». Almost everything here is shipped (measured
362
+ 2026-08-17: 192/200 recent commits touch an npm-shipped path, and that
363
+ 96% is a LOWER bound — `package.json` is packed without appearing in
364
+ `files[]`). Reading shipped-ness as the trigger makes this value
365
+ reachable in under 4% of commits, i.e. effectively unreachable, and an
366
+ unreachable value teaches authors to delete what they are counting
367
+ (`[[feedback_unreachable_done_when_trains_evasion]]`). The trigger is
368
+ the RELEASE, not the path — distinct
310
369
  from a degrade value; this is a scoping fact, not a miss. Carries the
311
370
  same substantive-grounds-on-the-same-line discipline as a degrade
312
371
  value below — asserting non-applicability without naming what was
@@ -382,11 +441,22 @@ data point.
382
441
  **Mechanization status — `standpoint:` is prose-only today, and this must not be read as more than
383
442
  that.** `crossfamily:`'s degrade triad is hard-blocked at commit (`templates/.git-hooks/pre-commit`,
384
443
  `scripts/test_marker_crossfamily_lanes.sh` — grep-verified: ~20 crossfamily references in the hook,
385
- validated fixtures). `standpoint:` has **zero** matches in that hook and no fixture suite — nothing
386
- stops an author from writing `not-applicable` with a thin justification, or omitting the field
387
- entirely, and no marker-shape check catches it. §Marker required fields in
388
- `.claude/rules/fh_4axis_gate.md` does not yet list `standpoint:` either (add it there when this
389
- mechanizes). This is the honest current state, not a placeholder apology: the field exists so a
444
+ validated fixtures). `standpoint:` has **no value-enum validation and no fixture suite** — nothing stops an author from
445
+ writing `not-applicable` with a thin justification, and no marker-shape check catches a wrong value.
446
+
447
+ 🟥 **Two sentences that stood here were STALE and are corrected (2026-08-17, re-measured a
448
+ cross-family reviewer flagged the second, the first fell out of checking it).** They read
449
+ *"`standpoint:` has **zero** matches in that hook"* and *"§Marker required fields in
450
+ `.claude/rules/fh_4axis_gate.md` does not yet list `standpoint:` either"*. Both are false as of this
451
+ date: `grep -c standpoint templates/.git-hooks/pre-commit` → **15**, and the hook *does* enforce one
452
+ property (when `axes-run` carries `ⓑ=→standpoint`, the `standpoint:` line must exist and be non-empty
453
+ — `pre-commit:780-782`); `.claude/rules/fh_4axis_gate.md` lists the field at **§133 and §192**.
454
+ **What is still true is the narrower claim**: the *value* is unvalidated — «the line exists» is
455
+ enforced, «the value is right» is deliberately reserved (§Mechanization Boundary). Do not read the
456
+ corrected sentence as "now mechanized"; read it as "the channel is checked, the judgment is not".
457
+ The distinction this stale text destroyed is exactly the one that matters here, and it destroyed it
458
+ in the *pessimistic* direction — under-claiming coverage is not a safe error either, because it
459
+ invites someone to rebuild a lane that already exists. This is the honest current state, not a placeholder apology: the field exists so a
390
460
  human reader can ask for it and so the *next* occurrence of a false `not-applicable` has something
391
461
  concrete to point at — mechanize on that first recorded false value
392
462
  (`[[feedback_mechanize_at_repetition_prose_before]]`), not before. **Ownership**: this field lives
@@ -449,6 +519,160 @@ proposal (pmh-dev issue #68, verified verbatim in that thread: *"대상 후보
449
519
  behavioral reading after that same review found the file-class reading false for at least one real
450
520
  pair.
451
521
 
522
+ **Target class — «누가 받나» is not the question; «어디서 돌려야 하나» is (operator decision,
523
+ 2026-08-17).** The trigger above says *effect, not file-class*, and that was still not enough: three
524
+ independent marker-audit legs, run the same day against three different markers, all failed at the
525
+ same place — each reasoned *"it ships, therefore there are consumers, therefore a cross-repo consumer
526
+ contract exists, therefore applicable"*. That reading is not obviously wrong; the enum's own words
527
+ (*"no cross-repo consumer contract"*) invite it. What kills it is the size: **192 of the last 200
528
+ commits touch an npm-shipped path (96%, a lower bound — `package.json` ships without being listed in
529
+ `files[]`, so at least one of the 8 remaining is a false negative too)**. A value reachable in under
530
+ 4% of commits is not a scoping value — it prices the axis at a rate this section's own **Trigger**
531
+ paragraph already rejects as over-triggering (*"almost every commit would qualify, which is the
532
+ over-pricing this trigger is trying to avoid, not invoke"*). That is the argument, and it was
533
+ already in this document.
534
+
535
+ ⚠️ **A citation is withdrawn here.** The first draft justified this with
536
+ `[[feedback_unreachable_done_when_trains_evasion]]` — *"an unreachable condition teaches people to
537
+ delete what they are counting"*. An adversarial round showed the direction is **inverted**: that
538
+ memory is about an unreachable **pass condition** a person must reach, whereas `not-applicable` is an
539
+ **exemption**. An unreachable exemption does not make anyone delete anything; it makes the obligation
540
+ fire almost always, and the failure mode is over-pricing and formality, not evasion. Same discomfort,
541
+ different mechanism — do not re-import the citation.
542
+
543
+ 🟥 **State precisely what that 96% does and does not establish — it is narrower than it looks, and a
544
+ cross-family reviewer caught the first draft overreaching on exactly this.** It is a *file-class*
545
+ count, which this very section rejects as a trigger. It is admissible for **one** claim: the legs'
546
+ argument *was* the file-class argument (*"it ships, therefore consumers, therefore applicable"*), so
547
+ the number measures **that argument's reach**, and shows that adopting it collapses `not-applicable`
548
+ to under 4%. It does **NOT** establish how often the *behavioral* trigger (Q0-ⓑ) actually fires —
549
+ that number is **unmeasured**, and the step from "touched a shipped path" to "a consumer standpoint
550
+ obligation arose" is precisely the step Q0-ⓑ exists to make someone take by hand. Anyone citing 96%
551
+ as the applicability rate is citing it wrong.
552
+
553
+ **Corrected figure, and the instrument defect behind it — surfaced only because an adversarial round
554
+ demanded the hand-check.** The first pass reported **192/200 (96%)** with 8 non-touching commits. Two
555
+ faults, in opposite directions:
556
+ - **Instrument**: the scan ran `--first-parent` *including merge commits*, and `--name-only` emits no
557
+ file list for a merge — so merges were silently scored *non-touching*. Re-run with `--no-merges`:
558
+ the ratio held at 192/200, but the non-touching set collapsed to **6 real cases** (2 commits
559
+ legitimately carry no files).
560
+ - **Hand-check of all 6** (this repo's own publish-a-number rule; N=6 made it trivially cheap):
561
+ **2 are `package.json`-only**, which npm packs regardless of `files[]` — they *are* shipped. The
562
+ other 4 are genuinely unshipped (`.gitignore` · `knowledge/shared/learnings/…` · two `scripts/`
563
+ paths absent from `files[]`).
564
+
565
+ ⇒ **Measured: 194/200 = 97%, every exception hand-verified.** ⚠️ One direction stays unexamined: the
566
+ scan applies **today's** `files[]` to **past** commits, and that manifest has only grown, so older
567
+ commits are over-counted as shipped. That FP direction is **unmeasured** — read 97% as *"under the
568
+ current manifest"*, never as a historical claim.
569
+
570
+ 🟥 **And read the reachability argument in BOTH directions, which the first draft did not.** It
571
+ measured only what the *rejected* reading does to `not-applicable` (collapses it to <4%). It never
572
+ measured what the *adopted* reading does — Q0-ⓑ is a judged behavioral test, so no scan settles it,
573
+ and the honest statement is that **the new rate is unknown in both tails**: the value could stay rare
574
+ (if most shipped-path commits do change consumer-visible behavior) or become near-universal (if most
575
+ do not), and a near-universal exemption is a rubber stamp, which is its own failure — not the one
576
+ this edit was fixing. Watch the next 20 markers rather than assuming this landed in the middle.
577
+ ⚠️ **The «unreachable ⇒ trap» premise is also weaker here than the first draft implied**: `tier1` is
578
+ explicitly *"NOT itself a failure"*, so even under the rejected reading an author had a cheap honest
579
+ value to write and was not cornered into deleting anything.
580
+
581
+ ⚠️ **Two different denominators, both of which happen to be 200 — do not merge them.** The 192/200 is
582
+ over the **last 200 commits**. The 177/200 below is over the **200 markers in
583
+ `tracks/_meta/.axes_23_passed_*.marker`**. Commits and markers are different populations (a marker
584
+ covers a delta, not a commit; unmarked commits exist), and their coincident size is an accident of
585
+ this corpus. No ratio may be carried from one to the other.
586
+
587
+ So the split is by **execution site**:
588
+
589
+ | Q0 target class | What discharges the standpoint arm | Binds at |
590
+ |---|---|---|
591
+ | named peer harness (qasp · pmh · mate · gstack · sibling hub) | the enum as written — `tier1b`/`tier2`/`tier2b`/`tier3` against that repo | the change, pre-push |
592
+ | generic consumer install | run the **packed artifact in a clean install** — see the split below; the *presence* half already runs at ship time, the *execution* half does not exist yet | the **release/publish** delta |
593
+ | neither | `not-applicable` | — |
594
+
595
+ **🟥 What that arm is actually covered by today — corrected in the same session that wrote it, by
596
+ reading the lanes instead of naming them.** The first draft of this table said the consumer-install
597
+ arm was *"already mechanized"* by `publish_freshness_check.sh` · `package_coverage_check.sh
598
+ --vs-tarball` · `test_capability_entrypoint_shipping.sh`. Reading those three shows they answer a
599
+ narrower question than the arm asks:
600
+
601
+ ```
602
+ covered, AT PUBLISH `prepublishOnly` = prepublish_scope_note · publish_freshness_check ·
603
+ version_lockstep_check · package_coverage_check --vs-tarball ·
604
+ public_surface_scan_files ← read from package.json, not recalled
605
+ covered, BUT IN CI test_capability_entrypoint_shipping.sh is NOT in that chain — it runs under
606
+ the selfcheck anchor loop (`npm test`/CI). Naming it as a ship-time lane was
607
+ wrong; a green CI is not a publish gate (§Local Execution First).
608
+ NOT covered (exec) extract the tarball into a clean directory, run the gate as a consumer would,
609
+ observe it behaves as intended. Measured 2026-08-17: of the lanes that invoke
610
+ `npm pack`, ZERO extract or execute the result — `--vs-tarball` compares a
611
+ FILE LIST (`npm pack --dry-run --json`), it never unpacks.
612
+ ```
613
+
614
+ This matters because it is the same asymmetry this section already argues for: *"execution is the
615
+ load-bearing half"*. An arm discharged by presence checks alone is a `tier1b`-shaped arm wearing a
616
+ `tier2` label — the exact substitution the `tier1b` rung was added to stop. **So: the presence half
617
+ is mechanized and free; the execution half is a named residual, discharged by hand
618
+ (`npm pack` → extract to a clean dir → run the gate → record the command and the output, per the
619
+ `tier2` discriminator) until a lane exists.** Do not cite this arm as fully mechanized. The
620
+ decision's «no new machinery» framing was correct about the *presence* half and overstated about
621
+ the whole — recorded here rather than quietly narrowed, because a reader reaching for this table
622
+ mid-release is exactly the reader who would otherwise skip the half that has no lane.
623
+
624
+ **What this decision costs, stated rather than hidden.** Of the three legs, **leg B was right and
625
+ the other two were wrong to generalize it**: the `release_2.3.0` marker's `not-applicable` IS a
626
+ defect under this closure (a release delta whose own grounds line concede *"소비자 install 의 게이트
627
+ 수용은 바뀐다 (BREAKING 2건)"* — that is the trigger being met, written out in the field that denies
628
+ it), while an ordinary commit touching a shipped script correctly stays `not-applicable`. Row 1
629
+ (PR #368) needs no reclassification: its target was a sibling hub with its own repo, a named peer.
630
+ ⚠️ Those three legs were **not decorrelated** — same family, same prompt shape, same canon — so their
631
+ 3/3 agreement is closer to one observation than three; it is cited here as *the pattern that exposed
632
+ the definitional hole*, never as three confirmations
633
+ (`[[feedback_decorrelation_axis_is_what_you_send]]`).
634
+
635
+ **Measured after this edit shipped, and it REFUTES the residual this paragraph first carried.** The
636
+ original text read: *"177 of the 200 corpus markers carry no `standpoint:` line at all … that pool is
637
+ larger than the one measured and remains unexamined."* It has now been examined, and the pool is not
638
+ larger — it barely exists:
639
+
640
+ ```
641
+ 201 markers · 24 carry `standpoint:` · 177 do not
642
+ 172 predate the field itself (born 2026-08-14, PR #370 landed 14:13) — structural, not a miss
643
+ 2 written the same day but BEFORE 14:13 (12:29 · 12:39) — also structural
644
+ 3 written after the field existed (16:41 · 19:10 · 21:06) ← the entire real pool
645
+ 0 absences dated 2026-08-15 or later — adoption is 100% from day two onward
646
+ ```
647
+
648
+ 🟥 **The first step was decomposition, not adjudication.** Counting "no field" as "not recorded"
649
+ folds *the field did not exist yet* into *the author skipped it* — the same `not-found ≠ 0` collapse
650
+ this session hit three separate times (`[[feedback_not_found_is_not_zero_family]]`). Splitting by the
651
+ field's own birth timestamp is what turned 177 into 3.
652
+
653
+ **Hand-check of all 3, judged from the real diffs** (their markers use the pre-2026-08-17 four-letter
654
+ `axes-run` notation, where `b` means first-real-use and NOT standpoint — reading the marker's own
655
+ self-description instead of the diff would have inverted two axes):
656
+
657
+ | commit | delta | verdict under Q0 |
658
+ |---|---|---|
659
+ | #375 `cedd8ac` | `version_lockstep_check.sh` +11 lines, **all comment** | `not-applicable` would have been correct — a **missing line**, not a wrong judgment |
660
+ | #374 `0690ba7` | 7 files, +409 — shipped gate scripts plus `templates/degrade_direction_scan.sh` | 🟥 **genuinely under-recorded** (Q0-ⓑ, and `templates/` propagates to field harnesses) |
661
+ | #373 `549a4bc` | `ko-tech-writer/SKILL.md` +63/−12 (shipped plugin) | 🟥 **genuinely under-recorded** (Q0-ⓑ) |
662
+
663
+ **The direction matches §6's earlier finding: over-claiming 0, under-recording only.** A gate that
664
+ tightens *"were you really tier2?"* cannot catch this direction by construction.
665
+
666
+ ⚠️ **Retroactive-application caveat**: Q0 was written 2026-08-17 and these three are 2026-08-14, so
667
+ their authors could not have applied it. What survives the caveat is narrower and still real — the
668
+ **field existed** by then, so the absent line is a gap independent of Q0.
669
+
670
+ **Consequence for sequencing**: the argument for postponing mechanization was *"absence is the
671
+ dominant reality, so validating values would only tighten a recording minority."* That premise is
672
+ **dead** — recording is 100% from 2026-08-15 onward. ⚠️ The refutation does **not** travel to peers:
673
+ pmh-dev's 42 markers carry the field 0 times, and whether that is late arrival or non-adoption is
674
+ **unmeasured** there. `thirdparty:` likewise stands at 2 corpus instances — unmeasured, not clean.
675
+
452
676
  **Relationship to `harness_verification_core_extended.md`'s core/extended axis**: tier2 and tier3
453
677
  are both "extended" in that document's sense (they require a cluster member's engine or repo to
454
678
  discharge) — this field does not compete with that doctrine, it subdivides one corner of it.