@chrono-meta/fh-gate 2.3.0 → 2.5.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 (39) hide show
  1. package/.claude/rules/fh_4axis_gate.md +25 -0
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/CLAUDE.md +107 -7
  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/fh_three_layer_canon.md +18 -6
  9. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +262 -7
  10. package/knowledge/shared/harness-core/harness_incubator_doctrine.md +215 -1
  11. package/knowledge/shared/harness-core/ship_readiness_gate.md +168 -1
  12. package/knowledge/shared/harness-core/sonnet_floor_doctrine.md +16 -0
  13. package/knowledge/shared/learnings/subagent_invocations_log.yaml +120 -0
  14. package/knowledge/shared/rules/multi_session_close_protocol.md +124 -2
  15. package/package.json +8 -1
  16. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  17. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  18. package/plugins/fh-meta/CHANGELOG.md +105 -0
  19. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +20 -0
  20. package/plugins/fh-meta/skills/steel-quench/SKILL.md +25 -2
  21. package/scripts/adapters/mate_agent_boundary.sh +27 -7
  22. package/scripts/capability_effect_probe.sh +173 -5
  23. package/scripts/capability_registry_check.sh +69 -3
  24. package/scripts/digest_landing_check.sh +168 -13
  25. package/scripts/fh_session_load.sh +71 -0
  26. package/scripts/relay_channel.sh +151 -6
  27. package/scripts/selfcheck.sh +47 -0
  28. package/scripts/target_freeze.sh +239 -0
  29. package/scripts/test_adapter_lanes.sh +17 -0
  30. package/scripts/test_evidence_root_psa_lanes.sh +78 -0
  31. package/scripts/test_marker_standpoint_lanes.sh +83 -0
  32. package/scripts/test_marker_thirdparty_lanes.sh +73 -0
  33. package/scripts/test_regression_guard_ci_lanes.sh +170 -0
  34. package/scripts/test_relay_channel_lanes.sh +146 -17
  35. package/scripts/test_satellite_publish_gate_lanes.sh +339 -0
  36. package/scripts/test_target_freeze_lanes.sh +203 -0
  37. package/templates/.git-hooks/pre-commit +306 -6
  38. package/templates/PRE-PUBLISH-CHECKLIST.md +22 -0
  39. 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.5.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.5.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
 
@@ -346,7 +355,29 @@ The forge-harness hub has a dual identity: **(a) a seed for others** + **(b) you
346
355
  - AI may commit and push automatically (when changes are approved) — **to a feature branch, never to the integration branch**
347
356
  - **PR creation requires explicit user request** ("create PR", "PR 올려줘", "pull request")
348
357
  - **Reason:** Prevents PR fragmentation — logical units should be grouped into meaningful PRs, not atomized per commit
349
- - Default workflow: branch → commit → push branch → wait for explicit PR request
358
+ - Default workflow: **claim** → branch → commit → push branch → wait for explicit PR request
359
+
360
+ 🟥 **공유 체크아웃에서는 브랜치를 «잡는» 단계가 별도로 있다 — 그리고 그 기계는 이미 있다**
361
+ (2026-08-18 실측 신설). 세션 여럿이 **한 체크아웃**을 쓰면 HEAD 는 하나뿐이라, 남이 옮기면
362
+ 내 발밑이 바뀐다. 순서는 이렇다:
363
+
364
+ ```
365
+ switch 직전 git branch --show-current ← 실시간 HEAD. claim 파일이 아니다
366
+ 자른 직후 git log main..HEAD --oneline ← 0 줄이 아니면 남의 커밋 위에 앉았다
367
+ 잡을 때 bash scripts/branch_claim.sh claim ← 이 줄이 없으면 pre-commit 이 막는다
368
+ 확인 bash scripts/branch_claim.sh check
369
+ ```
370
+
371
+ 🟥 **`.git/fh-claims/*` 를 읽는 것만으로는 못 막는다** — claim 은 lock 이 아니라 **쓰여진 시점의
372
+ 스냅샷**이고, 남이 브랜치를 옮겨도 내 파일은 안 바뀐다. **자기 세션에 대해서도 거짓말한다**(실측:
373
+ claim 이 `main` 인 동안 실제 HEAD 는 peer 브랜치였다 — 두 세션이 독립 재현). 그래서 판별자는
374
+ 파일이 아니라 **위 두 줄의 실시간 실행**이고, claim 은 *기록하는* 명령으로만 쓴다.
375
+
376
+ **남은 잔여 둘, 이름으로 남긴다**: ⓐ 게이트는 **커밋 시점**이라 `switch -c` 사고 자체는 못 막는다
377
+ (그래서 위 두 줄이 여전히 사람 몫이다 — [[feedback_gate_binding_point_not_check_point]])
378
+ ⓑ 반대 방향 — 내가 브랜치를 쥔 동안 남이 되돌리고 커밋하면 **내 staged 파일이 index 에 살아
379
+ 있다.** 실측 사례에서 안 섞인 것은 그 세션이 파일 지정 `add` 를 썼기 때문이지 게이트 덕이 아니다.
380
+ ⇒ **공유 체크아웃에서 `git add -A` 금지**([[feedback_shared_checkout_ops_touch_others_work]]).
350
381
 
351
382
  **Integration branch is PR-only** (operator decision 2026-07-20). Never `git push origin main`
352
383
  directly. Normal path: `git switch -c <branch>` → push the branch → `gh pr create` → after review
@@ -535,6 +566,27 @@ runtime (local wiring visible, not independent) · `tier3(<harness>)` a *differe
535
566
  target harness ran it · `not-applicable` · degrade triad `DEGRADED_NO_TARGET_ACCESS` could-not /
536
567
  `DEGRADED_NOT_RUN` did-not / `UNKNOWN` did-not-look — same shape as `crossfamily:`'s triad,
537
568
  **distinct literal values**, do not reuse crossfamily's tokens).
569
+ 🟥 **Settle the TARGET CLASS(es) before the tier — §7's `Q0`, added 2026-08-17 (operator decision).**
570
+ A consumer install **is** another harness; what the enum scopes is not who *receives* the change but
571
+ where it has to be **executed**. Q0 is **not first-match — it can return more than one target, and
572
+ each owes its own tier**: ⓐ a **named peer** whose local repo carries the changed surface, or which
573
+ the cluster registry / a `scripts/adapters/` entry names (decide by that test, not from a name list)
574
+ → the enum as written · ⓑ the delta changes **consumer-visible behavior** (what a consumer's gate
575
+ blocks or passes, what their session is told to do, what an install receives) → target = a *clean
576
+ install of the packed artifact*, and it binds **now, pre-push — never deferred to the eventual
577
+ release** · ⓒ neither → `not-applicable`. 🟥 Do **not** read «no cross-repo consumer contract» as
578
+ «this file is not shipped» — measured, **194/200 recent non-merge commits touch a shipped path (97%,
579
+ all 6 exceptions hand-verified)**, so shipped-ness cannot be the discriminator; the behavior clause
580
+ is. Pricing the axis at that rate is the **over-triggering** §7's own Trigger paragraph rejects.
581
+ ⚠️ 97% measures **the reach of the discarded shipped-path argument**, not the applicability rate —
582
+ how often ⓑ actually fires is **unmeasured in both tails** (it could also land near-universal, which
583
+ would be a rubber stamp — watch the next 20 markers). 🟥 Do **not** cite
584
+ `[[feedback_unreachable_done_when_trains_evasion]]` here: that memory concerns an unreachable *pass
585
+ condition*, and `not-applicable` is an *exemption* — the direction inverts. Three marker-audit legs all failed at that reading;
586
+ they were **not** decorrelated (same family · same prompt · same canon) so that is one observation,
587
+ not three. ⚠️ The consumer-install arm's *presence* half is mechanized at ship time; its
588
+ **execution** half (extract the tarball, run the gate, record command + output) has **no lane** —
589
+ do it by hand, and do not cite that arm as mechanized.
538
590
  🟥 **The execution is the load-bearing half** (operator decision 2026-08-16): a static standpoint
539
591
  read competes with cross-family review for the same defect classes and mostly loses — *running the
540
592
  target harness locally, to completion*, is the part with no substitute. Measured on one delta the
@@ -609,14 +661,28 @@ installed **FH assets** run the **4-axis gate**; **field scaffolds** run **`asse
609
661
  `steel-quench`** (the FH pre-commit hook is repo-local and does **not** reach a scaffold installed into another
610
662
  repo, so this routing is not redundant with it) · **autonomy floor** — discover/rank trusted at opus-tier+;
611
663
  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
664
+ gate: autonomy removes the per-item *prompt*, **never the gate**.
665
+
666
+ 🟥 **Chamber outcome vocabulary changed 2026-08-17 (operator decision) the old count below is a
667
+ snapshot of a *different instrument*, not a current rate.** Re-routing, not softening:
668
+ `net-new` failure is no longer a KILL — it routes to **`CURATED`** (hand the maker the prior-art list
669
+ and the delta it does not cover; *"그 사람이 만들려는 걸 인큐베이터가 막을 필요가 있을까"*), and a
670
+ judgment-shaped candidate routes to **`NOT-APPLICABLE`**. **KILL survives for measured
671
+ precision-shortfall, hub-state dependence, and inability-to-run** — the screening that was actually
672
+ load-bearing is intact. Detail + the frozen known-pair that keeps the old instrument measurable:
673
+ `harness_incubator_doctrine.md §3-SCREEN-2026-08-17` · `tracks/_meta/chamber_taxonomy_knownpair_PREREG_2026-08-17.md`.
674
+
675
+ Honesty boundary that must not soften in summary — **under the old vocabulary**, hand-counted
676
+ 2026-08-08 from the run ledger: 9 full runs, **8 KILL, 1 EMIT** (13 runs · 11 KILL · 1 EMIT as of
677
+ 2026-08-17). It has birthed **once** (run #9 `forge-wiki`, shipped publicly), so
615
678
  "it has not birthed" — the earlier wording here — is no longer true. But do not upgrade the claim
616
679
  either: that run's workspace carries only a verdict file, with no intent/budget/blind-persona
617
680
  artifacts, so the **formal flow** is not what produced it. The first end-to-end formal run is #10 and
618
681
  it KILLed. Either way simulate-first stays a one-line HITL recommendation, never a push-button
619
682
  autonomous emit.
683
+ ⚠️ **Do not cite that ratio as "the chamber screens well" or "over-screens" going forward** — the
684
+ counts were produced by a rule set that no longer runs, and whether it over-screened is **exactly
685
+ what the frozen known-pair exists to measure and has not measured yet.**
620
686
 
621
687
  > **Detail**: See `knowledge/shared/harness-core/onboarding_acceleration_autopilot.md` — full Phase-0 branch
622
688
  > logic + `chamber_run.sh` scope, the per-phase skill composition, the remaining guards (no-reinvention
@@ -791,6 +857,7 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
791
857
  | "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
858
  | **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
859
  | "memory feels bloated", "clean up memory", "memory too large", "memory hygiene" | `/memory-hygiene` |
860
+ | **사람이 읽을 산출물이 나가기 직전** — README·가이드·리포트·장표·PR 본문 등 «독자가 여는» 것 (proactive; 코드가 옳아도 걸린다 — 이 행이 잡는 건 정확성이 아니라 **가독성**이다) | **독자로서 한 번 읽어라** — 첫 8줄에 결론이 있나 · 본문이 고정 템플릿에 덮이지 않나 · 마지막 인상이 무엇인가. 렌즈는 이미 있다: `/sim-conductor` A-1(`beginner` cold-read) 또는 직접 렌더해서 읽기. 🟥 **정적 검사는 「없는 것」을 잡고 「안 읽히는 것」은 못 잡는다** — 실측 2건이 독립 수렴했다(qasp 축: 지적 12건 중 스캐너 적발 0 · gstack 3자대면: 배포된 리포트 본문 3줄 vs 고정 템플릿 21줄). pre-commit 이 같은 상기를 advisory 로 낸다(차단 아님) |
794
861
  | "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
862
  | **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
863
  | **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.) |
@@ -839,6 +906,39 @@ Sequence, in order, and do not skip to the end:
839
906
  3. **Then set the interval**, informed by (2). An expedition's cadence has to be derived from what one
840
907
  actually costs and yields — a number picked before the first run is a guess wearing a schedule.
841
908
 
909
+ 🟥 **개시 요건 — 과녁 정체성 한 줄 (2026-08-18, 원정 1차 답습이 만든 규칙).** 원정을 여는 카드는
910
+ **어느 정체성을 겨냥하는지**를 이름과 현재 등급으로 적는다. 판별은 기계적이다: `ship_readiness_gate.md`
911
+ 의 등급표를 **열어서** 비-🟢 를 읽고, 그중 무엇을 겨냥하는지 쓴다.
912
+
913
+ ```
914
+ 과녁: ② 인큐베이터 (🔵 RC) — 챔버 정식 EMIT 을 실상황에서 낸다
915
+ 과녁: 없음 — 이번은 ⓑ 전용(약점 강화). 비-🟢(②·④)는 안 겨냥한다
916
+ ```
917
+
918
+ **둘째 형태도 정당한 값이다** — 금지되는 것은 «안 적는 것»뿐이다. 이유: **선언 없는 선택은 사후에
919
+ 누락과 구분되지 않고, 저자는 언제나 「고른 것」이라고 회상한다.**
920
+
921
+ **근거 — 이 규칙은 실측에서 나왔다.** 원정 1차(2026-08-17)의 ⓐ 채점은 **0 건**이다(2026-08-18 답습,
922
+ 사전등록 봉인 후 cross-family 독립 수렴). 원인은 노력이 아니라 겨냥이었다: 세 갈래(기여·클러스터·약점)가
923
+ **전부 이미 🟢 인 정체성**(Ⓑ·①·③) 위에 떨어졌고, **비-🟢 인 ②·④ 를 건드린 산출이 하나도 없었다.**
924
+ 즉 ⓐ=0 은 **개시 시점에 구조적으로 예정돼 있었다.** 정본: `tracks/_meta/expedition_2026-08-18_absorption1.md`.
925
+ 🟥 ⓐ 를 «알아냈다»로 읽지 마라 — 완주선은 «알아냈나»가 맞지만 **ⓐ 는 «등급을 옮기는 조각»을 요구한다.**
926
+ 두 정의를 섞으면 과계상이 된다(cross-family 지목, 자력 적발 0).
927
+
928
+ **주기 — 1차 답습 후에도 아직 안 정한다, 그리고 그 이유가 기록이다 (2026-08-18, 운영자 승인).**
929
+ 위 3단계를 다 밟았는데도 숫자가 안 나온다: ⓐ 비용 입력이 **부분 계상**이고(거버너 토큰·벽시계 미측정 —
930
+ 1차 기록 §5 가 스스로 적었다) ⓑ 1차는 갈래가 셋이라 **대표성이 없으며** ⓒ 결정적으로 **겨냥이 틀린
931
+ 원정 1회**라, 그 비용/수확비로 주기를 세우면 틀린 표본으로 스케줄을 만든다.
932
+ ⇒ 주기는 **2차 이후**로 미룬다. 대신 **2차 개시에 계측 3항이 의무**다 — 방법까지 여기 적는다
933
+ (초안은 셋을 요구만 하고 ②③의 *방법*을 안 적었고, 플로어 티어 블라인드 sim 이 그 구멍을 지목했다):
934
+ - ① **과녁 정체성 선언** — 위 형식 그대로, 개시 카드에.
935
+ - ② **벽시계** — 개시 카드에 시작 시각, 완주 선언 줄에 완주 시각. 그냥 적는 것이고 계기가 필요 없다.
936
+ - ③ **거버너 토큰** — 🟥 **세션은 자기 소비를 직접 못 읽는다**(1차 §5 가 이미 실측한 제약). 그러므로
937
+ 의무는 «총액을 대라»가 아니라 **«읽히는 것을 다 적고, 안 읽히는 칸을 이름으로 남겨라»**다:
938
+ 서브에이전트 토큰(완료 알림의 `subagent_tokens`) · 사이드카 토큰(각 CLI 가 출력) · **거버너 = `UNMEASURED`**.
939
+ 🟥 **합계를 쓰지 마라** — 미측정 칸을 0 으로 접는 것이다([[feedback_not_found_is_not_zero_family]]).
940
+ 셋이 없으면 3차에서도 «못 정한다»가 나온다.
941
+
842
942
  ⚠️ **This deliberately does NOT use the `operations.md` `accepted ≥ 60%` promotion gate.** That gate
843
943
  measures how often a proposal class is *accepted*, which is the wrong quantity here: an expedition
844
944
  could be accepted every time and still not warrant a schedule, or be proposed once and clearly warrant
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
 
@@ -73,12 +73,24 @@ tags: [canon, three-layer, engines, identity, verification-axes]
73
73
  >
74
74
  > ✅ **2026-08-17 부로 마커도 이 배열이다** — 날짜 ≥ 2026-08-17 인 마커는 `axes-run` 이
75
75
  > **기호 여섯 글자(ⓐ~ⓕ)**를 요구하고, 그 이전 마커는 옛 ASCII 넷을 그대로 쓴다(소급 강제 없음).
76
- > **표기법이 배열 선언**이라 감사자가 grep 번으로 판별한다. 남은 어긋남은 **하나뿐**
77
- > `standpoint:` 값의 enum **검증하는 코드가 아직 0줄**이다. 아래 「옛 배열」 서술은 유예일
78
- > 이전 마커를 읽을 때만 유효한 이력이다.배열로 줄을
79
- > 기계가 **조용히 다른 축으로 읽으며 오류를 내지 않는다.** 확장은 기존 마커 전부를 무효화하므로
80
- > **운영자 결정 사항으로 열려 있다** 그때까지 마커를 때는 **옛 배열**을 쓰고, 산문으로
81
- > 논할 때는 §1-a-2 6축을 쓴다. 어긋남을 **알고** 쓰는 것이 규율이다.
76
+ > ⚠️ **표기법은 판별자가 아니다 줄의 초판이 그렇게 적었고 코퍼스 실측이 반증했다.**
77
+ > 초판은 *"표기법이 배열 선언이라 감사자가 grep 번으로 판별한다"* 였다. 실측: `axes-run`
78
+ > 보유 **53건 기호 키가 4건**인데 그중 **2건이 2026-08-10 자이면서 4축 의미로 기호를
79
+ > 쓴다**(`ⓑ 첫실사용` · `ⓓ 되돌림` 배열에선 각각 ⓔ·ⓕ), 혼용도 1건 있다. 훅은 그 셋을 안
80
+ > 읽으므로 **커밋은 막지만 감사자의 grep 거기서 틀린 답을 낸다.**
81
+ > **판별자는 마커 파일명의 날짜다** (`< 2026-08-17` = 4축). 이게 유일한 기계 판별자다.
82
+ >
83
+ > 🟥 **그리고 아래 문단은 삭제됐다 — 이 절이 스스로와 모순하고 있었다.** 삭제된 문장은
84
+ > *"확장은 기존 마커 전부를 무효화하므로 운영자 결정 사항으로 열려 있다 — 그때까지 마커를 쓸
85
+ > 때는 **옛 배열**을 쓰고…"* 였다. 바로 위 ✅ 줄(2026-08-17 착지)과 정면으로 어긋나고,
86
+ > **그 줄을 따라 읽은 세션은 오늘 옛 배열로 마커를 써서 훅에 막힌다.** 반쪽 픽스가 위 문단에만
87
+ > 착지하고 아래 문단이 살아남은 형태다(`[[feedback_half_fix_propagation_boundary]]`).
88
+ > 「전량 무효화」 전제 자체도 별도로 반증돼 있다 — 훅은 **오늘·이 브랜치 마커 한 개만** 검증하므로
89
+ > 190건 중 차단 0·재해석 51이었다(`CLAUDE.md` §명칭 충돌).
90
+ >
91
+ > **남은 어긋남은 하나뿐** — `standpoint:` 값의 enum 을 **검증하는 코드가 아직 0줄**이다.
92
+ > 옛 배열로 쓴 줄을 기계가 **조용히 다른 축으로 읽으며 오류를 내지 않는다** — 그래서 옛 마커를
93
+ > 읽을 때는 날짜부터 본다. 산문으로 논할 때는 언제나 §1-a-2 의 6축을 쓴다.
82
94
  >
83
95
  > 🟥 그리고 ③단계는 **「결정론적 기계 스크립트」가 아니다.** 여섯 축 중 다섯이 모델/에이전트
84
96
  > 판단이고, 기계 앵커가 붙은 축은 현재 **되돌림 하나뿐**이다(§ 아래 «자평이다» 절). ③을