@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.
- package/.claude/rules/fh_4axis_gate.md +25 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CLAUDE.md +51 -6
- package/README.ja.md +14 -2
- package/README.ko.md +14 -1
- package/README.md +16 -2
- package/README.zh.md +12 -1
- package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +231 -7
- package/knowledge/shared/harness-core/harness_incubator_doctrine.md +215 -1
- package/knowledge/shared/harness-core/ship_readiness_gate.md +168 -1
- package/knowledge/shared/learnings/subagent_invocations_log.yaml +24 -0
- package/package.json +6 -1
- package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/CHANGELOG.md +57 -0
- package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +20 -0
- package/plugins/fh-meta/skills/steel-quench/SKILL.md +25 -2
- package/scripts/adapters/mate_agent_boundary.sh +27 -7
- package/scripts/capability_registry_check.sh +69 -3
- package/scripts/relay_channel.sh +151 -6
- package/scripts/selfcheck.sh +18 -0
- package/scripts/target_freeze.sh +239 -0
- package/scripts/test_adapter_lanes.sh +17 -0
- package/scripts/test_marker_standpoint_lanes.sh +83 -0
- package/scripts/test_marker_thirdparty_lanes.sh +73 -0
- package/scripts/test_regression_guard_ci_lanes.sh +170 -0
- package/scripts/test_relay_channel_lanes.sh +146 -17
- package/scripts/test_target_freeze_lanes.sh +203 -0
- package/templates/.git-hooks/pre-commit +242 -0
- package/templates/PRE-PUBLISH-CHECKLIST.md +22 -0
- 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.
|
|
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.
|
|
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
|
-
>
|
|
59
|
-
>
|
|
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**.
|
|
613
|
-
|
|
614
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
214
|
-
|
|
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-
|
|
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
|
|
309
|
-
|
|
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 **
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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.
|