@chrono-meta/fh-gate 1.4.91 → 1.4.93

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 (47) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/AGENTS.md +21 -1
  3. package/CHEATSHEET.md +1 -0
  4. package/CLAUDE.md +9 -1
  5. package/README.md +9 -4
  6. package/docs/codex-compat.md +1 -1
  7. package/knowledge/shared/harness-core/fh_detail_protocols.md +11 -0
  8. package/knowledge/shared/harness-core/fh_three_layer_canon.md +18 -4
  9. package/knowledge/shared/harness-core/gate_locality_principle.md +10 -0
  10. package/knowledge/shared/harness-core/return_path_gate.md +15 -0
  11. package/knowledge/shared/learnings/subagent_invocations_log.yaml +88 -0
  12. package/knowledge/shared/rules/knowledge_layer_seam.md +165 -0
  13. package/knowledge/shared/rules/multi_session_close_protocol.md +31 -0
  14. package/package.json +11 -2
  15. package/plugins/fh-commons/.claude-plugin/plugin.json +2 -2
  16. package/plugins/fh-commons/README.md +1 -0
  17. package/plugins/fh-commons/skills/ko-tech-writer/SKILL.md +157 -0
  18. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  19. package/plugins/fh-meta/skills/agent-composer/SKILL.md +3 -1
  20. package/plugins/fh-meta/skills/context-doctor/SKILL.md +4 -0
  21. package/plugins/fh-meta/skills/edit-manifest/SKILL.md +4 -0
  22. package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +13 -0
  23. package/plugins/fh-meta/skills/harvest-loop/SKILL.md +19 -1
  24. package/plugins/fh-meta/skills/install-wizard/SKILL.md +26 -1
  25. package/plugins/fh-meta/skills/install-wizard/SKILL_detail.md +25 -4
  26. package/plugins/fh-meta/skills/phantom-quench/SKILL.md +44 -0
  27. package/plugins/fh-meta/skills/pipeline-conductor/SKILL.md +11 -3
  28. package/plugins/fh-meta/skills/steel-quench/SKILL.md +1 -1
  29. package/scripts/.env_purity_tokens.defaults +8 -0
  30. package/scripts/branch_claim.sh +53 -1
  31. package/scripts/env_purity_scan.sh +50 -0
  32. package/scripts/fh_env_delta_scan.sh +16 -1
  33. package/scripts/gate_anchor_check.sh +344 -0
  34. package/scripts/knowledge_seam_check.sh +171 -0
  35. package/scripts/rtk_gross_ablation.sh +64 -0
  36. package/scripts/selfcheck.sh +15 -0
  37. package/scripts/session_close_check.sh +3 -0
  38. package/scripts/sidecar_calibrate.sh +32 -1
  39. package/scripts/test_branch_claim_lanes.sh +62 -1
  40. package/scripts/test_env_purity_lanes.sh +30 -0
  41. package/scripts/test_knowledge_seam_lanes.sh +142 -0
  42. package/scripts/test_marker_axes_run_lanes.sh +115 -0
  43. package/scripts/test_sidecar_calibrate_lanes.sh +15 -1
  44. package/templates/.git-hooks/pre-commit +63 -2
  45. package/templates/CLAUDE.md +7 -0
  46. package/templates/starter_profile.md +2 -2
  47. package/tests/seam_absence_probes.md +31 -0
@@ -11,14 +11,14 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "1.4.91",
14
+ "version": "1.4.93",
15
15
  "description": "Hub meta-operations toolkit — 35 skills + 7 agents. 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": "1.4.91",
21
- "description": "Project-agnostic utility skills — 4 skills (convergence-loop · deliberation · mcp-circuit-breaker · token-budget-gate) + 1 agent (quench-challenger). Domain-independent utilities transplantable into any project.",
20
+ "version": "1.4.93",
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
  }
24
24
  ]
package/AGENTS.md CHANGED
@@ -55,6 +55,9 @@ Machine-readable mirror: `.claude/registry/agent_cards.json`.
55
55
  passing check. Governor agreement alone is not an anchor.
56
56
  - **Sidecar completion:** judge a sidecar only by the typed verdict from `scripts/sidecar_wait.sh`.
57
57
  Never infer completion or emptiness by looking at its output file.
58
+ - **Identity grades:** the five-identity grade table is canonical only in
59
+ `knowledge/shared/harness-core/ship_readiness_gate.md`. Do not restate grades from memory or from
60
+ a session card — cite that file's current state.
58
61
 
59
62
  > **Detail**: See `knowledge/shared/harness-core/agents_md_runtime_details.md §Architecture-and-output-routing`
60
63
  > — layer ownership and destination routing — read before routing work across a public/private workspace pair.
@@ -84,6 +87,23 @@ Because non-Claude runtimes do not auto-load Claude path rules, apply these rule
84
87
  require instrument suspicion.
85
88
  6. **Irreversible intent:** before publish, delete, or history rewrite, read and apply the
86
89
  Pre-Publish or Destructive-Op gate in `CLAUDE.md`. `pre-push` is only the git-side backstop.
90
+ 7. **Self-contrast on asset touch:** the trigger for the three-layer self-contrast (process ·
91
+ engines · identities) is *touching an FH/PMH asset*, not being asked. Pick verification axes by
92
+ failure mode — running all four every time is not the rule. Record, in the existing Axes 2–3
93
+ marker fields: the soul line written before design (or `none`), each axis run and not run — by
94
+ name, and each axis's control with whether it survived. The minimum evidence that an axis ran is
95
+ execution output with a live control; reporting an axis as run without one, or recording only a
96
+ reason for not choosing it, is not compliance. The four axes are named in
97
+ `knowledge/shared/harness-core/fh_three_layer_canon.md` §1-a — read it before recording; §1-c
98
+ holds the sample limits — read it before citing. This record is self-attested and has no hook
99
+ behind it; it is closed by a different-family reader, not by writing it more carefully.
100
+ 8. **Branch-surface claims:** GitHub branch protection is two independent layers — legacy
101
+ protection and rulesets coexist, and the strictest wins. Read both
102
+ `/repos/{owner}/{repo}/branches/{branch}/protection` and
103
+ `/repos/{owner}/{repo}/rules/branches/{branch}` before declaring any branch surface open or
104
+ closed. In the reference repository (forge-harness), reading the protection object alone
105
+ misjudged the force-push surface three times; the symmetric single-endpoint case is untested,
106
+ but the same failure shape applies.
87
107
 
88
108
  > **Detail**: See `knowledge/shared/harness-core/agents_md_runtime_details.md §Mandatory-checklist-procedures`
89
109
  > — exact supporting procedures and canonical doctrine links — read when any checklist trigger fires.
@@ -97,7 +117,7 @@ control; FH supplies the quality gate after goal completion.
97
117
 
98
118
  | Tier | Definition | Skills |
99
119
  |---|---|---|
100
- | **M1 — Full** | No Claude-native dependency | `token-budget-gate`, `asset-placement-gate`, `phantom-quench`, `deep-clarify`, `convergence-loop` |
120
+ | **M1 — Full** | No Claude-native dependency | `token-budget-gate`, `asset-placement-gate`, `phantom-quench`, `deep-clarify`, `convergence-loop`, `ko-tech-writer` (visual-QA steps degrade to text-only) |
101
121
  | **M2 — Partial** | Core works; native agent or slash-command steps need adaptation | `deliberation`, `steel-quench`, `harness-doctor`, `context-doctor`, `sim-conductor`, `harvest-loop` |
102
122
  | **M3 — Claude-only** | Requires a Claude hook or session-scoped dispatch | `goal-quench`, `hub-cc-pr-reviewer`, `install-wizard` |
103
123
 
package/CHEATSHEET.md CHANGED
@@ -494,6 +494,7 @@ Claude agents feature
494
494
  | Skill | What it does | Say this |
495
495
  |---|---|---|
496
496
  | `token-budget-gate` *(commons)* | Estimates token cost before a multi-step task, then calibrates against actual after | "how expensive is this", "estimate the token budget first" |
497
+ | `ko-tech-writer` *(commons)* | Korean tech-writing pipeline — venue calibration, translationese scan, number/claim gate, perceptual QA | "기술문서 써줘", "테크블로그 초안", "번역투 고쳐줘" |
497
498
  | `asset-placement-gate` | Routes a new skill/agent/plugin to the right place (hub vs project), no role overlap | "where does this go", "should this be shared", "hub or project" |
498
499
  | `marketplace-gate` | Scores a repo against 5 listing criteria (README, zero-config, maintenance, dup, safety) | "is this OK to publish", "ready for the marketplace", "pre-publish check" |
499
500
  | `public-surface-audit` | Scans git-tracked files for operator-private tokens (real username, corp names, home paths) | "did I leak anything", "scan for private tokens", "is my split clean" |
package/CLAUDE.md CHANGED
@@ -300,6 +300,14 @@ Compose session-card candidates **into door ③ (field) and the 🔧 door (FH-de
300
300
  **Identity marker**: every greeting response (Step ②) opens with 🐿️ then an identity-revealing welcome line **on the same line** (a space after 🐿️; exact count not significant — the renderer collapses it — the invariant is *same-line*, not 🐿️ alone) — new / exploratory = "Welcome to FH." · returning = "Welcome back to FH." · operator (FH-dev state) = "The FH operator — good to see you." It is embedded in all skeletons above (do not strip it when composing doors); the exploratory branch template (`fh_detail_protocols.md` Step 2) uses the "Welcome to FH." line.
301
301
 
302
302
  **Guards**: explicit task-entry utterance → skip onboarding **menu** (the door skeleton / greeting) — but this **never skips the Mode D companion-store freshness load** (pull + INDEX read + card-vs-commit reconcile); that is a data-load, not the menu, and it fires even when the first message is a task — hook-backed via `scripts/fh_session_load.sh` (measured miss + mechanics: `fh_detail_protocols.md §Onboarding-Provenance` · `modes_and_value.md §Session-start freshness`) · once per session · code/debug requests → start working directly · project routing is a suggestion, mention at most once
303
+ **Wizard-state guard (prose layer — for nodes whose hooks were declined/never wired)**: during the
304
+ greeting auto-read, if `~/.cc_sentinels/{repo}_wizard_done` is absent, or `{repo}_wizard_declined`
305
+ is non-empty without a `_wizard_reminder_muted` sentinel, append ONE line to the response:
306
+ *"install-wizard 미실행(또는 거부 항목 N개) 상태 — FH 의 의도된 기능 일부가 정상 실행되지 않을 수
307
+ 있다. 재실행: `/install-wizard`."* Wired nodes get the same line mechanically from the env-delta
308
+ hook — emit it once, not twice. Honest residual: a task-first entry on a fully-unwired node has no
309
+ surface for this line (no hook, no menu) — prose cannot close that, and it is named here rather
310
+ than papered over.
303
311
  **Metadata-is-not-intent guard**: the trigger is the user's **typed message only**. Session metadata — branch name (auto-derived from the first message, e.g. `claude/korean-greeting-*`), repo name, file paths — is **never** a task spec and never suppresses or redirects the greeting trigger. A bare greeting fires onboarding even when the branch name looks like a feature request; if the only "task" signal lives in metadata and not in what the user typed, treat the message as a greeting and run the greeting branch + door skeleton above.
304
312
 
305
313
  ## New Skill Creation Pre-Commit Gate
@@ -578,7 +586,7 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
578
586
  | "용광로모드", "crucible mode", "absorb this whole corpus", "throw everything in", "re-forge FH identity", "melt this down" (total-immersion absorption, not cherry-pick — esp. a whole corpus on a core FH axis, or a frontier showcase risking FOMO) | `knowledge/shared/harness-core/crucible_mode.md` (read it, run the chain: total-ingest → steel-quench/phantom-quench melt → governor identity-bonding → sim/persona reforge → field-harvest rebirth; the core invariants stay unmeltable) |
579
587
  | "review this PR", "check diff", "code review" | code diff → built-in `/code-review`·`/review` · FH-asset coherence → `/hub-cc-pr-reviewer` (role split) |
580
588
  | "keep watching X", "poll this", "check every N minutes", recurring WATCH item | built-in `/loop` (interval runner) — pair with the WATCH list, don't hand-poll |
581
- | "research this deeply", "survey the literature", "comprehensive analysis", "deep research", "look this up thoroughly", "조사해줘", "리서치" (general topic research, not trend-scan) | **Deep-Research Capability Ladder** (`knowledge/shared/harness-core/deep_research_capability_ladder.md`) — route to the highest available rung: built-in `/deep-research` if present → else Claude `WebSearch`+`WebFetch` synthesis (tier-sensitive) → `/frontier-digest` only if it's AI/harness trend-scan. No-reinvention: FH routes, does not build a research engine. |
589
+ | "research this deeply", "survey the literature", "comprehensive analysis", "deep research", "look this up thoroughly", "조사해줘", "리서치" (general topic research, not trend-scan) | **Deep-Research Capability Ladder** (`knowledge/shared/harness-core/deep_research_capability_ladder.md`) — route to the highest available rung: built-in `/deep-research` if present → else Claude `WebSearch`+`WebFetch` synthesis (tier-sensitive) → `/frontier-digest` only if it's AI/harness trend-scan. **Boundary («동향/trend»+«조사» in one utterance)**: decide by TOPIC, not verb — AI/harness-adjacent trend → `/frontier-digest`, anything else → the ladder (routing probe 2026-08-10 #8: the two vocabularies co-occur in real utterances). No-reinvention: FH routes, does not build a research engine. |
582
590
  | "orchestrate agents", "parallel dispatch", "combine skills", "multiple agents" | `/agent-composer` |
583
591
  | **a material work product is about to be called done / merged / published** — public or irreversible surface · affects others · carries external claims or numbers · new behavior · security/data/permissions (proactive; the everyday "커밋하고 머지하자" utterance does **not** name an agent, so agent-composer never self-fires here — that is why this row exists) | `agent-composer` **§Author-Exposure Table** — name the exposure row, dispatch that review pass, then decide. Materiality gate + `Exposure-unclear → challenger` default live there; the lens returns evidence, never the verdict |
584
592
  | "broaden the grounded corpus", "add another version of the corpus", "ingest the full source as the grounding axiom", "여러 버전으로 통째로 가져와" (verbatim-relay corpus expansion — fail-closed grounding, no generator) | `/corpus-grounding-expander` |
package/README.md CHANGED
@@ -62,15 +62,19 @@ claude plugin marketplace add https://github.com/chrono-meta/forge-harness.git
62
62
  claude plugin install -s user fh-meta@forge-harness
63
63
 
64
64
  # 2. Clone the hub
65
- git clone https://github.com/chrono-meta/forge-harness.git ~/forge-harness
66
- cd ~/forge-harness
65
+ git clone https://github.com/chrono-meta/forge-harness.git ~/projects/forge-harness
66
+ cd ~/projects/forge-harness
67
67
 
68
68
  # 3. Start a session
69
69
  claude
70
70
  ```
71
71
 
72
- > ✅ Claude reads `CLAUDE.md` and asks what project to connect or what task to start.
72
+ > ✅ Then **type a greeting ("hi")** the 🐿️ door menu appears on a typed greeting, not on launch alone.
73
73
  > Say **"Connect a project"** → hub scans `../`, finds `.git` directories, creates `tracks/{project}/`.
74
+ > For full initial setup (hooks · gates · baseline — each item individually approved, declining is
75
+ > respected and recorded), ask for **`/install-wizard`**.
76
+ > Already cloned somewhere else? That path *is* your hub — read every `~/projects/forge-harness`
77
+ > in the docs as your actual clone path.
74
78
 
75
79
  **Your first 15 minutes** — what success looks like, and what to do with it:
76
80
 
@@ -275,7 +279,7 @@ All four movements ship. Temper was named before it was built — deliberately (
275
279
  two more signatures keep it running: `harvest-loop` (each session's lessons become permanent skills) and
276
280
  `agent-composer` (orchestrate the dispatch). The other skills wait until you need them — full list below.
277
281
 
278
- ## 39 skills · 8 agents
282
+ ## 40 skills · 8 agents
279
283
 
280
284
  > Count = non-deprecated skills (deprecated redirect stubs — kept only for old-name routing — excluded).
281
285
 
@@ -309,6 +313,7 @@ two more signatures keep it running: `harvest-loop` (each session's lessons beco
309
313
  | `convergence-loop` *(fh-commons)* | N-round convergence loops | "Single-pass seems suspicious" |
310
314
  | `token-budget-gate` *(fh-commons)* | Pre-task token cost estimate | "How expensive is this?" |
311
315
  | `mcp-circuit-breaker` *(fh-commons)* | MCP tool failure pattern detection | "MCP keeps failing" |
316
+ | `ko-tech-writer` *(fh-commons)* | Korean technical-writing pipeline (register calibration, translationese removal, honesty layering, perceptual QA) | "기술문서 써줘", "번역투 고쳐줘" |
312
317
  | `quench-challenger` *(fh-commons)* | Adversarial pressure-test agent | "Challenge this with a devil" |
313
318
  | *(+ additional assets)* | marketplace-gate · contention-layer · edit-manifest · fact-checker · goal-quench · hub-persona-auditor · install-doctor · memory-hygiene · persona-innovator · prompt-regression · public-surface-audit · salience-splitter | |
314
319
 
@@ -124,7 +124,7 @@ The sibling pattern for Gemini is `gemini -p "$(cat <skill+artifact>)"`. Outside
124
124
 
125
125
  | Tier | Under Codex | Action |
126
126
  |---|---|---|
127
- | **M1** | Runs fully (`token-budget-gate`, `asset-placement-gate`, `phantom-quench`, `deep-clarify`, `convergence-loop`) | `cat SKILL.md artifact \| codex exec -m gpt-5.5 -` |
127
+ | **M1** | Runs fully (`token-budget-gate`, `asset-placement-gate`, `phantom-quench`, `deep-clarify`, `convergence-loop`, `ko-tech-writer` (visual-QA steps degrade to text-only)) | `cat SKILL.md artifact \| codex exec -m gpt-5.5 -` |
128
128
  | **M2** | Core runs; agent/slash steps via adapter (`deliberation`, `steel-quench`, `harness-doctor`, `context-doctor`, `sim-conductor`, `harvest-loop`) | Substitute each dispatch with `fh-run` or a direct `codex exec` on the sub-agent's `.md` |
129
129
  | **M3** | Does not run automatically | Use native Codex session features where available; otherwise read as methodology reference or use a dedicated adapter |
130
130
 
@@ -213,6 +213,17 @@ Temporary session change: say "use light mode for this one" or "switch to max".
213
213
  > stories justify stay resident in CLAUDE.md; only the archaeology moved. Read this when you are about to
214
214
  > *change* one of those rules — the failure that produced each one is the reason it reads the way it does.
215
215
 
216
+ **하류 remap 소유 규약 (2026-08-10, pmh-dev #54 — 임시방편이 아니라 정본 설계다)**: 인사
217
+ 발화 문구와 규약 파일명(`fh_completed_*` 등)의 **문자열 정본은 FH가 소유**하고, 분기 설치
218
+ (조직 내부 반입 등)는 그 문자열을 자기 정체성으로 변환하는 **remap 집합을 자기 쪽에서
219
+ 소유**한다 — 공유층 본문은 불변이며, 하류가 본문을 직접 고치면 드리프트로 계상된다. 따라서
220
+ FH에서 발화 문구·규약 파일명을 **추가하거나 바꾸는 변경은 하류 remap 통지를 같은 변경에
221
+ 동반**해야 한다 — 프로브 `G-GREET-05`가 문구 리터럴을 고정해 무음 변경을 막는다(하류
222
+ 설치에서 ④-log 검사기가 존재 불가능한 파일명을 3개월 보고 있던 오귀인이 이 규약의 실측
223
+ 근거다 — pmh-dev #54).
224
+ 갈림 판별 기준: **사용자-대면 발화이거나 게이트가 찾는 파일명이면 remap 대상, 환경변수·훅
225
+ 스크립트명·npm bin 같은 기계 결합 이름은 불변**(변환하면 파손된다).
226
+
216
227
  ### Why the greeting branch test is session files, never git history
217
228
 
218
229
  A fresh-clone Sonnet simulation rendered the **returning-user menu** to a brand-new install, because it
@@ -279,9 +279,19 @@ branch-claim 게이트 ① 영혼 필수 «무엇을 성공으로 볼 것
279
279
  §2 에서 게이트의 `engine` 열이 이미 4엔진을 들고 있었던 것과 같은 형태 — 있는 것의 이름이다.
280
280
 
281
281
  **그리고 이 관점은 공짜로 검출기 하나를 준다**: 어느 정체성에도 안 붙는 스킬 =
282
- **고아 유닛**이고, `CLAUDE.md §Identity` 메타하네스의 적신호로 명시한 것이 정확히 그것이다
283
- (*"red flags are orphaned, redundant, and decorative units"*). 정체성 매핑은 분류가 아니라
284
- **자산 감사 계기**다.
282
+ **미배정(unmapped) 유닛**이다. ⚠️ **「고아(orphan)」라고 부르지 마라 저장소에서 단어는
283
+ 이미 기계화된 다른 뜻이고, 뜻도 하나가 아니다**: **참조-고아** 인바운드 참조 0
284
+ (`harness-doctor` SKILL.md §Step 5 「orphan page」 → R-tier · `phantom-quench` 역방향 검사 ·
285
+ `harvest-loop` INDEX/FILE-ORPHAN) ② `harness-doctor` L2 상주 원장의 `orphaned/decorative` —
286
+ 트리거/백스톱 없는 **상주 섹션**(참조와도 정체성과도 무관한 제3의 용법). 미배정은 **분류
287
+ 문제**고 참조-고아는 **삭제 후보**라 처방이 정반대인데, 어휘를 합치면 다음 세션이 「정체성
288
+ 미배정」을 「참조 0」으로 읽어 멀쩡히 배선된 스킬을 R-tier 로 렌더한다 (2026-08-10 스크리너
289
+ 실측: 위 저항 3종 전부 인바운드 참조 보유 — 명령:
290
+ `grep -rn "token-budget-gate\|mcp-circuit-breaker\|video-ingest" CLAUDE.md knowledge/ plugins/`.
291
+ 단 grep 스크리너 수준이고 ⓓ 되돌림 실측은 미실시, 참조 있음 ≠ 배선됨). `CLAUDE.md §Identity`
292
+ 의 적신호 문장(*"red flags are orphaned, redundant, and decorative units"*)은 orphaned 를
293
+ **정의하지 않는다** — 이 문서는 그 단어를 이미 기계화된 참조-0 쪽에 **고정한다**(원문 독해가
294
+ 아니라 어휘 결정이다). 정체성 매핑은 분류가 아니라 **자산 감사 계기**다.
285
295
 
286
296
  🟡 **전수 대응은 미측정이다 — 눈으로 배정하지 마라.** 실측 규모는 **스킬 38 · 에이전트 8**
287
297
  (2026-08-09). 명확한 것도 많지만 **실제로 저항하는 항목이 있다**: `video-ingest`(⑤ 증폭자인가
@@ -291,7 +301,11 @@ branch-claim 게이트 ① 영혼 필수 «무엇을 성공으로 볼 것
291
301
 
292
302
  **다음 세션 후보(미착수)**: 스킬별 정체성 선언을 frontmatter 로 받고 미선언·미분류를
293
303
  세는 검사기. 선언은 저자가 하고 계기는 **세기만** 한다 — 계기가 분류를 대신 하면
294
- `[[feedback_not_found_is_not_zero_family]]` 로 되돌아간다.
304
+ `[[feedback_not_found_is_not_zero_family]]` 로 되돌아간다. 합법값에
305
+ **`identity: n/a — run-facing`** 을 포함하라 — 위 저항 3종은 사용자의 *일*이 아니라 **런 그
306
+ 자체**(비용 · 도구 건강 · 입력 채널)를 다루는 자산이라, «사람이 얻는 기능»을 값역으로 갖는
307
+ 정체성 축의 **대상 밖**이다(§0 의 정의상 — 얻는 게 아니라 안 죽게 하는 것).
308
+ 이 값이 없으면 계기가 미배정을 0으로 렌더한다.
295
309
 
296
310
  ⚠️ **⑤ 의 🟢 는 범위 한정 가능성이 열려 있다**(2026-08-09 관찰, 미반영): 그 근거가 전부
297
311
  *"사용자 산출물"* 대상에서 측정됐고, `⑤ × 하네스 자신` · `⑤ × 낳는 하네스` 는 미측정이다.
@@ -62,6 +62,16 @@ locality — review alone cannot show it (review reads all files; the runtime do
62
62
  (Ahn · Kim): independent convergence on code-enforced behavioral contracts over prompt instructions;
63
63
  their ablation shows code-owned enforcement blocks violations prompting alone permits. Cross-audit:
64
64
  `tracks/_audit/session_2026_08_01_prompts-to-contracts-sister.md` (B-tier, 2 imports identified).
65
+ - **[arXiv 2605.23950 — "Stop Comparing LLM Agents Without Disclosing the Harness"](https://arxiv.org/abs/2605.23950)**
66
+ (Zhang · Wang · Ge · Xu · Hamm · Reddy, May 2026): formalizes the **Binding Constraint Thesis** —
67
+ for long-horizon agent tasks, harness configuration (context construction, tool orchestration,
68
+ verification) is often a stronger determinant of measured performance than the underlying model;
69
+ harness-induced variance can exceed model-induced variance enough to **reverse published model
70
+ rankings**, and leaderboard comparisons that omit harness disclosure are incomplete and potentially
71
+ misleading. This anchors the *locality* claim from the adjacent direction: an undisclosed or
72
+ misplaced harness doesn't just under-enforce a gate (the HANDBOOK.md anchor above), it can silently
73
+ swap which system gets credit for an outcome — the same failure shape as a gate firing in a file the
74
+ enforcing actor never loads.
65
75
 
66
76
  These are external anchors for the **prose-vs-mechanical premise**; the locality claim itself
67
77
  (N=2, one operator) still awaits direct cross-operator confirmation as named above.
@@ -114,6 +114,21 @@ This is the default failure mode when a skill chain has no return path defined.
114
114
 
115
115
  ---
116
116
 
117
+ ## Verdict Extension (harvested from field use — pmh-dev@cbe3932, 2026-08-10)
118
+
119
+ The 4-tier enum is the floor, not the ceiling. A project may extend it (field precedent:
120
+ `WAVE_SKIP` / `WAVE_INSERT` for wave-orchestrating callers) under two rules:
121
+
122
+ - the extended enum is declared in the **callee's** SKILL.md verdict section — a verdict value the
123
+ emitter never documents is prose, not a contract;
124
+ - the caller maps **any verdict value it does not recognize to ESCALATE** — an unknown verdict is a
125
+ human-decision signal, never a silent PASS. (Same degrade direction as the typed-Verdict contract:
126
+ unparseable ⇒ escalate, never optimistic.)
127
+
128
+ Do NOT harvest the field's `[Verdict]` block output format — FH's typed contract (final-line
129
+ `Verdict:` literal, #318) is newer and stricter; two competing formats would reopen the
130
+ divergent-normalizer class.
131
+
117
132
  ## Relation to Other Patterns
118
133
 
119
134
  - **Three-Doctor Loop** (`harness-doctor ↔ context-doctor ↔ sim-conductor`) uses return paths implicitly — each doctor's output triggers the next. A full Return-Path Gate implementation would make the fold-back explicit.
@@ -1709,3 +1709,91 @@
1709
1709
  계기는 **문자열 착지만** 재고 기록의 정확성·실행 여부는 안 본다.
1710
1710
  ★ 오라벨 1건 발견: `fh_completed:1384` 의 `⑨PR 선제흡수` 는 틀렸다 — ⑨ 답변은 `ⓑ`이고
1711
1711
  「PR 선제흡수」는 별개 지적(:1301)이다. 한 줄에 두 결정이 뭉개졌다.
1712
+
1713
+ - date: 2026-08-10
1714
+ session: ifkakao-fhops-pmh-sync-overnight
1715
+ agents_summary: "5 dispatches (consolidated): weekly-audit(claude generic, bg) · persona-innovator Mode F(bg) · quench-challenger(Axis2, sync) · company-extract(claude generic, bg) · codex gpt-5.5 sidecar(crossfamily, pmh sync tooling)"
1716
+ dispatch_count: 5
1717
+ outcome: accepted
1718
+ evidence: "audit file 18994B M3/S3/R5 · innovator A1 채택→canon 수리 착지 · challenger M5/S10 전건 수리(PR #311) · extract 31절 무손실(known-pair 24/24) · codex M4/S4→M 전건 수리+레인 8/8"
1719
+ notes: "codex payload residency scan (org-token 0, control 3) · 전 dispatch 산출이 머지/파일로 착지"
1720
+
1721
+ - date: 2026-08-10
1722
+ session: qasp-axready-parallel-overnight
1723
+ agents_summary: "8 dispatches (consolidated): Explore×3(mtm setter 배선조사 · AX완성조건 발화수집 · 핸드오프 격리 그라운딩 감사, 전부 bg) · codex gpt-5.5 sidecar×5(rer/effective 수리 적대 5라운드)"
1724
+ dispatch_count: 8
1725
+ outcome: accepted
1726
+ evidence: "조사① runner 5지점+정직술어 지목→#139 그대로 채택 · 조사② B1~B12 판정표→NOT READY 판정 근거 · 감사③ 핵심수치 전건 CONFIRMED+정정 8건→핸드오프 반영 · codex 5R 반증 12건 전건 수리(S→S→S/A→A/B→B 소진, #137·#138 머지)"
1727
+ notes: "sidecar 수치 액면 미인용 — S급 전건 governor 소스 재판정(재현 후 수리). 조사 에이전트 위치주장은 구현 중 파일 직독으로 교차확인"
1728
+
1729
+ - date: 2026-08-10
1730
+ session: ifkakao-numeric-recheck
1731
+ agents_summary: "1 dispatch: general-purpose 격리 원문 대조(덱 수치-서사 32행, 읽기전용·재측정금지·대상동결 bc487df, bg)"
1732
+ dispatch_count: 1
1733
+ outcome: accepted
1734
+ evidence: "32행 판정(CONFIRMED 25·MISMATCH 2·PARTIAL 3·SNF 1) — MISMATCH 2건 전부 실물 확인 후 덱 수리(열세개 stale·행위자 귀속) · 착지 = ifkakao26_numeric_recheck_2026-08-10.md + CANON_LEDGER 3일차"
1735
+ notes: "에이전트 계기한계 자기신고(기록 대 기록·미러 최심부·grep 사각) 그대로 기록에 병기. MISMATCH 는 governor 가 마커/캡처 원문 재확인 후 수리"
1736
+
1737
+ - date: 2026-08-10
1738
+ session: qasp-anchor-provenance-day2
1739
+ agents_summary: "6 dispatches (consolidated): codex gpt-5.5 sidecar×6 (앵커 출처 증명 적대 6라운드 — R1 전면 · R2~R3 수리 반증 · R4~R6 수렴 확인, 전부 bg)"
1740
+ dispatch_count: 6
1741
+ outcome: accepted
1742
+ evidence: "반증 23건 → 수리 21 · 기각 1(A-4: List[str] 선재 크래시 + p35 fail-safe — R2 에서 실행 재현으로 반박받아 dict-repr 유출로 재분류 수용) · 명명 2. 곡선 S1A5B2→S1A3B3→A2B1→A1B1→A1→0 CONVERGED. 전건 governor 소스 재판정 후 수리 · R6 «S/A 소진» 명시 후 머지(qasp-dev #141, af244fa)"
1743
+ notes: "R2 S(오라클 반전)·R3 A2·R5 A1 은 전부 직전 수리의 산물 — «수리가 결함의 주된 출처» 재확증. degrade_direction_scan 은 사후 실행(advisory 620, 순서 위반 기록) — 종국 판정은 6R 이 담당"
1744
+
1745
+ - date: 2026-08-10
1746
+ session: ifkakao-coldread-reverify
1747
+ agents_summary: "1 dispatch: fh-meta:beginner 수리본 전체 콜드리드(청중 시점 추출본, 주석 차단, bg)"
1748
+ dispatch_count: 1
1749
+ outcome: accepted
1750
+ evidence: "HARD 3/SOFT 14 — 그중 Critical 1건을 governor 가 계기 아티팩트로 판정(주석 중간삽입→추출 절단, 원문 재확인) · 실결함 8건 운영자 승인 수리 · 프로브 5문 응답 전건 처분"
1751
+ notes: "응시자 오귀속 아님 — 계기 결함(blind_separation 규율 적용). 추출본 known-pair 유출검사 선행"
1752
+
1753
+ - date: 2026-08-10
1754
+ session: qasp-anchor-provenance-day2-round2
1755
+ agents_summary: "4 dispatches (consolidated): codex gpt-5.5 sidecar×4 (라운드2 적대 4라운드 — R1 전면 · R2~R3 수리 반증 · R4 수렴 확인, 전부 bg)"
1756
+ dispatch_count: 4
1757
+ outcome: accepted
1758
+ evidence: "반증 12건 전건 수리(곡선 S2A2→A4→A2→0 CONVERGED) — reach 분모 소실 S(선재 결함 표면화)·다이어트 전이 소실 S 는 적대 실행-재현을 수용해 설계 완화. 머지 qasp-dev #142(a7523b5)"
1759
+ notes: "이번 캠페인도 신규 결함 다수가 직전 수리 산물(dup 병합 낙관·desc truthiness) — «수리가 결함의 주된 출처» 4연속. 프로브 계상 경계(시험관 제공 환경 vs qasp 발화)는 정답키 v3 §3 에 명문화해 자기채점 부풀리기 차단"
1760
+
1761
+ - date: 2026-08-10
1762
+ session: ifkakao-recheck-coldread (재등재 — 미커밋 append 가 공유 체크아웃 피어 작업에 소실된 2건 + 후속)
1763
+ agents_summary: "3 dispatches (consolidated): general-purpose 원문대조 32행(bg) · fh-meta:beginner 콜드리드(bg) · Explore 역수확 인벤토리 13건(bg)"
1764
+ dispatch_count: 3
1765
+ outcome: accepted
1766
+ evidence: "원문대조 CONFIRMED25/MISMATCH2→수리 · 콜드리드 HARD3(1건=계기 아티팩트 판정)→8건 운영자 승인 수리 · 인벤토리 13건→HARVEST 판정표(#9 오보는 이식 직전 자력 적발)"
1767
+ notes: "원장 append 즉시-커밋 규율 위반으로 초판 2건 소실(공유 체크아웃) — 이번 재등재는 전용 브랜치 즉시 커밋"
1768
+
1769
+ - date: 2026-08-10
1770
+ session: ifkakao-harvest-prABCD
1771
+ agents_summary: "8 dispatches (consolidated): fh-meta:challenger×2(PR A seam·PR C rtk, 격리) · codex gpt-5.5 sidecar×6(PR A 4R + PR B 1R + 초기 1회 flag 누락 재시도)"
1772
+ dispatch_count: 8
1773
+ outcome: accepted
1774
+ evidence: "PR A: challenger M4S5R5 + codex M6S3R2→M3S2→M1S1→M1S1 전건 수리/경계명명, 레인 34 · PR B: codex M6S3 전건 수리, 스모크 6/6 · PR C: challenger S2R5 수리, 실측 68.3% · 전부 머지 대기 PR #322-325"
1775
+ notes: "codex git-밖 실행은 --skip-git-repo-check 필수(메모리 재확인) · 수렴 정체 시 «조이지 말고 줄여라» 적용 1회(파서 경계 명명)"
1776
+
1777
+ - date: 2026-08-10
1778
+ session: qasp-condition-forming-first-detection
1779
+ agents_summary: "3 dispatches: codex gpt-5.5 sidecar×3 (액션 스텝 정착 리트라이 적대 3라운드 — R1 전면 · R2 수리반증 · R3 수렴확인, 전부 bg)"
1780
+ dispatch_count: 3
1781
+ outcome: accepted
1782
+ evidence: "R1 4건(S1A1B2) — [S] @absent 방향 뒤집힘이 governor 사전 예측과 일치(«재관측이 부재=PASS를 뒤집나»). 전건 수리 → R2 B1 → R3 «S/A 소진 CONVERGED». 머지 #145(ff62881), 검출 0→1 클린(R-10.1 ∧ KN PASS)"
1783
+ notes: "governor가 디스패치 전 위험(@absent 방향)을 명시 예측했고 sidecar가 실행 재현으로 확증 — 예측·검증 분리의 실측 사례. F-TC=팬텀 감사기 findings라는 진단 반전이 이 세션 최대 발견(검출 뿌리가 오라클 오염이었음)"
1784
+
1785
+ - date: 2026-08-10
1786
+ session: ko-tech-writer-skill-shipment
1787
+ agents_summary: "3 dispatches: fh-meta:challenger R1 (신규 SKILL 적대검토) · claude@sonnet 블라인드 sim (심은 결함 3종 known-pair) · fh-meta:challenger R2 (수리 검증, bg)"
1788
+ dispatch_count: 3
1789
+ outcome: accepted
1790
+ evidence: "sim: 심은 결함 3/3 검출·수리 + 창 없는 90%를 미확인 라벨 처리(창 조작 안 함) + 음성 컨트롤 무매치 + 모호 지점 4건 전부 실결함으로 수리 · challenger R1: M2 S6 R5 전건 수리(가짜-measured 분리 · 불가-탈출구 봉인 · 분모 기계화 · 격리 정의) — R1 #7(placement-gate 미이행)은 운영자 질문과 동시 적발되어 게이트 정식 실행 → fh-commons 이동"
1791
+ notes: "설계자≠응시자 known-pair가 스킬 판별력을 커밋 전에 실증 — 신규 스킬 출하의 표준 절차 후보. 운영자 지적으로 ko- 접두(언어 범위 정직 명명)"
1792
+
1793
+ - date: 2026-08-10
1794
+ session: qasp-detect-expansion-gugan2
1795
+ agents_summary: "11 dispatches (consolidated): Explore R-10.1 파이프라인 지도화(bg) · codex gpt-5.5 sidecar×10 (구간 2 적대 R1~R10 — 술어 3종·힌트·measured 레인)"
1796
+ dispatch_count: 11
1797
+ outcome: accepted
1798
+ evidence: "Explore 지도가 «R-10.1=하위호환 unknown 레인·P7 는 그 경로 못 탐·R-4.3 은 sourced 가능» 3판정을 사전 특정 — 구현이 그 지도 그대로 감. codex 10R: S10·A7·B9 중 수용 21·기각 2(스펙 근거), R10 «신규 없음» CONVERGED. 라이브 자기적발 1(전제 미형성 FAIL 이 이슈 오발화 — 1차 주행에서 즉시 실측). 머지 #146(7cb45ac), 검출 1→4"
1799
+ notes: "R5~R8 네 라운드가 전부 R3 증거-짝 수리의 후속 결함(«수리가 결함의 주된 출처» 4연쇄 실측) · R9 는 codex 가 내 회귀 레인의 공허성(.opine 계약 미준수로 단언 미실행)을 적발 — 레인 자체가 검증 대상이라는 사례"
@@ -0,0 +1,165 @@
1
+ ---
2
+ description: 하네스가 조직 지식층(조직 위키·도메인 문서)에서 무엇을 기대하는지 정의하는 계약. 조직은 이 계약만 만족하면 쓰던 위키를 그대로 매핑한다 — 포크가 아니라 매핑이 1차 경로다. 소비자 배선 현황과 미배선 사실을 함께 명시한다.
3
+ provenance: pmh-dev@cbe3932 knowledge/shared/rules/knowledge_layer_seam.md 역수확(2026-08-10) — 조직 고유 식별자 범용화 · 배선 현황을 FH 실상으로 교체. 원 계약의 자기정정 이력(K2 임계 UNCALIBRATED · conform 경로)은 보존.
4
+ ---
5
+
6
+ # 지식층 Seam — 하네스 ↔ 조직 위키 계약
7
+
8
+ ## 왜 이 문서가 있나
9
+
10
+ 하네스는 방법론과 게이트를 준다. 그것이 *무엇에 대해* 판단할지는 **조직 맥락**에서 온다.
11
+
12
+ **그런데 "쓰던 위키가 있으면 그걸 쓰세요"는 계약이 없으면 말로만 참이다.** 무엇을 만족해야
13
+ "쓸 수 있는" 것인지 적혀 있지 않으면 조직은 결국 처음부터 다시 만든다. 이 문서가 그 계약이다.
14
+
15
+ **관측 사실(원 필드, 2026-07-19~20)**: 4비트 양자화 로컬 모델이 이 계약 위에서 BUILD를
16
+ 완주했다 — 구현·스킬 인큐베이팅·PR 개설까지(저자 정체성으로 런 분리).
17
+ ⚠️ **인과는 분리되지 않았다**: 그 완주에 지식층이 얼마나 기여했는지는 **측정되지 않았다**
18
+ (스킬·게이트·운영자 교정이 함께 작용했다). 어블레이션 없이 "맥락층이 원인"이라 주장하지 않는다.
19
+ 계약 문서는 *효과*를 증명할 필요가 없고 **무엇이 없으면 무엇이 깨지는지**만 정의하면 된다.
20
+
21
+ ## 0. 배선 현황 (FH 기준)
22
+
23
+ | 소비자 | 무엇을 읽나 | 언제 | 상태 |
24
+ |---|---|---|---|
25
+ | `phantom-quench` **Step 2-O** | 진입 인덱스(`INDEX.md`/`index.md`/`README.md`/`readme.md` — 판정기와 동일 후보) → 후보 페이지 | **도메인 주장**(조직 고유 사실·용어·정책)이 Step 2 에서 **미선언**일 때 | ✅ **배선됨** (2026-08-10 역수확, FH 1호) |
26
+ | `steel-quench` Step 0.35 | 진입 인덱스(위와 동일 후보) → 관련 정책·용어·도메인 사실 | 공격 각도를 정하기 전 | ❌ **미배선** — 원 필드에 선례가 있는 후보이며, FH 에는 아직 없다. 배선되기 전까지 이 행은 약속이 아니라 후보다 |
27
+
28
+ **1호 소비자 배선의 의미**: 그전까지 도메인 주장은 로컬 선언 파일에도 외부 인용에도 안 걸려
29
+ **전부 🔴 Source-Missing 으로 떨어졌다** — 조직 지식층이 정확히 그 근거인데 탐색 경로에 없었다.
30
+
31
+ **이 배선이 계약의 어느 조항을 실제로 쓰는가** (조항이 장식이 아님을 보이는 표):
32
+
33
+ | 계약 조항 | Step 2-O 에서의 쓰임 |
34
+ |---|---|
35
+ | K2 진입 인덱스 | 진입 인덱스를 먼저 읽는다 — **전수 스캔 안 함** |
36
+ | K3-f `review_after` | 경과 시 **Grounded 가 아니라 Partial** — stale 근거는 근거가 아니다 |
37
+ | §1-a 충돌 우선순위 | 조직 위키의 판정 규칙이 스킬 판정을 **못 덮는다**, 충돌은 보고에 명시 |
38
+ | K1-s 반출 금지 | 조직층 원문은 외부 fetch/dispatch 로 **안 나간다** |
39
+ | §6 degrade | `{org}/` 부재 = **UNMEASURED**, 🔴 유지. "맥락 없음"이지 "근거 없음 확정" 아님 |
40
+
41
+ ## 1. 경로 규약 — seam은 디렉터리다
42
+
43
+ ```
44
+ knowledge/
45
+ ├── shared/ 조직 불변. 하네스 레포에서 온다(§4 획득 경로 주의). 조직이 편집하지 않는다.
46
+ └── {org}/ 조직 맥락. 조직이 소유한다. 하네스는 읽기만 한다.
47
+ ```
48
+
49
+ **빈 슬롯도 규약이다.** `knowledge/{org}/`가 비어 있으면 "맥락 없음"이지 "맥락 불필요"가 아니다.
50
+ 에이전트는 **맥락 부재를 명시**해야 하며, 없는 맥락을 추론으로 메우지 않는다.
51
+
52
+ ### 1-a. 충돌 우선순위 — 가장 비싼 실패 모드
53
+
54
+ `{org}/`은 **무엇**(도메인 사실·용어·정책)만 공급한다. **어떻게 판정하나**는 공급하지 않는다.
55
+
56
+ > **shared/의 게이트·floor·판정 규칙을 `{org}/`이 덮어쓸 수 없다. 충돌 시 shared 우선 + 충돌 사실 명시.**
57
+
58
+ 이 줄이 없으면 다음이 일어난다: org 위키에 "핫픽스는 main 직푸시" 같은 로컬 관행이 있고 shared
59
+ 게이트는 금지인데, 에이전트가 "org 맥락이 더 구체적"이라 판단해 **게이트를 우회한다.** 조직 맥락
60
+ 도입의 가장 비싼 실패 모드이며, 우선순위가 없으면 무방비다.
61
+
62
+ ## 2. 하네스가 기대하는 것 (최소 계약)
63
+
64
+ | # | 기대 | 필수? | 이유 |
65
+ |---|---|---|---|
66
+ | K1 | **마크다운 디렉터리** — 에이전트가 읽을 수 있는 경로 | **필수** | 없으면 아무것도 성립 안 함 |
67
+ | K1-s | **유입 스크럽** — 동기화 시점에 시크릿/PII 스캔 통과, 실패 시 **fail-closed**(부분 동기화 금지) | **필수** | seam은 조직 데이터가 모델 컨텍스트로 들어오는 **바로 그 지점**이다 |
68
+ | K2 | **진입 인덱스 1개**(`INDEX.md`/`index.md`/`README.md`/`readme.md` — 판정기 후보와 동일, 대소문자는 Linux 에서 유효) **존재**. 규모가 커지면 섹션 인덱스로 분기 | **필수(존재)** | 전수 스캔은 토큰을 태운다. 단 평면 대형 인덱스도 같은 문제다 |
69
+ | K2-c | 인덱스 **크기 보고**(자수·추정 토큰) — **임계는 미측정이라 판정 근거로 쓰지 않는다** | 보고 | ⚠️§2-c 참조 |
70
+ | K3 | **파일당 1줄 설명** — frontmatter `description:` **또는** 인덱스에 그 파일 상대경로 **+ 설명 텍스트**가 있는 줄(경로만 나열된 줄은 불인정). **수기·생성기 산출 모두 인정** | **필수** | 열기 전 관련성 판별의 유일 수단 |
71
+ | K3-d | **최종갱신일** — frontmatter `date:`/`updated:`/`last_updated:` | **권장** (누락 = §6 degrade: stale 판정 불가 → `미상` 보고, 차단 아님) | 날짜는 §6 stale 판정의 근거. ⚠️ 초판이 K3 에 «필수»로 합쳐 적어 판정기(WARN·비차단)와 모순됐다 — 쪼개서 정직하게 |
72
+ | K3-f | **`review_after:`** — 이 페이지를 재검토해야 하는 기한(날짜). `date`(과거 — 마지막으로 손댄 날)와 달리 **미래를 향한 신선도 계약**이다 | 권장 | Step 2-O 의 **Grounded** 판정 전제 — 이 필드가 없으면 슬롯 히트도 Partial 상한(신선도 미상). ⚠️ 초판엔 §0 표에만 등장하고 여기 정의가 없었다(팬텀 조항) — 판정기가 보유율을 INFO 로 보고한다 |
73
+ | K4 | **파생 인덱스 자동 갱신** | 경로1 권장 / **경로2·3 필수** | 기존 대형 위키에 사람이 수백 줄을 쓰게 하면 1차 경로가 역차별된다 — 스크립트가 쓴다 |
74
+ | K5 | `llms.txt` | 선택 | 외부 에이전트 진입 표면 |
75
+ | K6 | 읽기전용 MCP(`*_index`/`*_get`/`*_search`) | 선택 / **경로4 필수** | 파일시스템 접근이 없는 런타임·비문서 소스용 |
76
+
77
+ **진입 장벽을 낮게 두는 것이 이 계약의 목적이다.** 그래서 K3의 비용은 K4로 옮길 수 있게 열어뒀다.
78
+
79
+ ## 2-c. ⚠️ K2 임계는 UNCALIBRATED 다 (원 계약의 자기정정 — 이력째 보존)
80
+
81
+ 원 계약 초안은 **"≤200줄"** 을 필수 조건으로 걸었다. **그 숫자에 유도 과정이 없었다 — 지어낸
82
+ 것이다.** 인용할 수 없는 임계는 판정 근거가 아니다. **게다가 줄수는 나쁜 계기다** — 실측
83
+ (2026-07-21, 실물 위키 974 파일): 인덱스가 **337줄인데 약 23k 토큰**이었다(줄당 143자).
84
+ 비용은 토큰인데 줄로 재고 있었다.
85
+
86
+ **현재 규약**: 존재는 필수(K2) · 크기는 보고(K2-c — PASS/FAIL 근거로 쓰지 않는다) ·
87
+ 분기 판단은 조직이 자기 예산으로. **임계를 되살리려면** 인덱스 크기와 (a) 관련성 판별 정확도
88
+ (b) 세션 토큰 예산의 관계를 실측해야 한다. 그 전까지 `UNCALIBRATED` 다.
89
+
90
+ ## 3. 채택 경로 (다섯)
91
+
92
+ | 상황 | 경로 |
93
+ |---|---|
94
+ | **위키가 없다** | 조직 표준 LLM-위키 템플릿(있다면)을 포크해 `knowledge/{org}/`로 매핑 — 구조가 K1–K3 를 만족하도록 |
95
+ | **위키가 있다 (git)** | submodule 또는 동기화로 붙인다. 미충족분만 보충 + **K4 필수** |
96
+ | **위키가 있다 (비-git: 컨플루언스 등)** | export → 마크다운 → 동기화. **4항 명시 필수**: export 주체 · 주기 · 산출 경로 · 실패 시 동작(fail-closed). **K4 필수** |
97
+ | **문서 자체가 없다** (맥락이 티켓·채팅·코드 주석에만) | 주기 추출로 마크다운 스냅샷 생성, 또는 **K6 MCP로 노출**. K4·K6 필수 |
98
+ | **이미 위키가 있고 그 자리에서 계약에 맞춘다**(옮기지 않고 독립 운영) | **`conform`** — 부족분(설명·날짜)만 **생성기로 백필**. 새로 만들거나 이전하지 않는다 |
99
+
100
+ 다섯 경로가 **같은 계약 위에 선다.** 그래서 "쓰던 걸 쓰세요"가 실제로 성립한다.
101
+
102
+ ### 3-c. `conform` — 도그푸딩이 찾은 다섯 번째 경로 (원 필드 실측)
103
+
104
+ 초안의 네 경로는 전부 **"위키를 어떻게 확보하나"** 였다(포크·매핑·export·추출). 그런데 계약을
105
+ 처음 실물에 먹여본 대상(974 파일 개인 위키)은 넷 중 아무것도 아니었다 — 이미 있었고, 옮길 데도
106
+ 없고, **그 자리에서 계약에 맞추면 되는** 경우였다. 아마 가장 흔한 실제 경우다.
107
+ `conform` 의 비용은 사람이 아니라 **생성기**가 낸다(K4 의 존재 이유). 실측: **설명 누락
108
+ 406 → 0 · 날짜 누락 547 → 6.** 백필 도구가 96%를 처리했고, 본문에서 파생할 수 없는 9건은
109
+ **지어내지 않고 남겨서** 사람이 썼다. 그게 옳은 분업이다.
110
+
111
+ ## 4. 포크가 아니라 매핑이 1차
112
+
113
+ 원칙: **맥락 때문에 하네스를 포크하지 않는다.** 맥락은 `{org}/`에만 있으므로 그 디렉터리
114
+ 매핑으로 충분하다. 포크는 하네스 자체를 개조할 때, 그리고 아래 예외에만.
115
+
116
+ **예외 — 폐쇄망 벤더링**: 배포 채널을 당길 수 없는 망 분리 조직에겐 버전 고정 vendored 복사가
117
+ 유일 경로다. 그 경우 **upstream diff 주기를 명시**(예: 분기)하고 drift를 의도된 비용으로
118
+ 관리한다.
119
+
120
+ ## 5. 한 레포 = 한 **기밀 경계** (조직 수가 아니라)
121
+
122
+ *"위키 하나에 모든 조직 맥락을 모으면 안 되나"* — 기준은 **조직**이 아니라 **기밀 경계**다.
123
+
124
+ - **한 조직 안에서도 경계가 갈리면 쪼갠다** (공개 OSS 맥락 + 조직 기밀이 한 곳에 섞이면 조직이
125
+ 하나여도 residency가 깨진다).
126
+ - **같은 경계를 공유하는 복수 조직은 `{org}/` 분리로 허용** (지주사·자회사 등).
127
+ - **예시/시드 org(`example/`)는 명시적 예외** — 없으면 워크드 예시조차 못 싣는다.
128
+
129
+ **메타층에 있어야 할 것은 맥락이 아니라 스키마의 스키마와 시드다** — 구체 스키마는 org가 소유한다.
130
+
131
+ ## 6. Degrade 방향
132
+
133
+ | 상황 | 방향 |
134
+ |---|---|
135
+ | `knowledge/{org}/` 부재 | **맥락 부재를 명시하고 진행.** 추론으로 메우지 않는다 |
136
+ | 인덱스(K2) 부재 | 전수 스캔하지 않는다 — 부재 보고 + 인덱스 생성 제안 |
137
+ | 날짜(K3-d) 부재 | stale 판정 불가 → **`미상`으로 보고**. 최신으로 가정하지 않는다 |
138
+ | 위키는 있으나 stale | **stale 명시.** 최신인 척하는 것이 없는 것보다 나쁘다 |
139
+ | 매핑 실패(경로·권한) | 조용히 빈 결과로 진행하지 않는다 — **실패로 보고** |
140
+ | 스크럽(K1-s) 실패 | **fail-closed** — 부분 동기화 금지 |
141
+
142
+ 공통: **부재와 실패는 0이 아니다.** 낮은 값은 PASS처럼 읽히므로 명시적으로 구분한다.
143
+
144
+ ## Done When
145
+
146
+ - `knowledge/{org}/`가 K1·K2·K3를 만족한다
147
+ (check class: **mandatory-pass** — `scripts/knowledge_seam_check.sh`가 기계 판정,
148
+ known-pair 레인 = `scripts/test_knowledge_seam_lanes.sh` 34레인(권한 3레인은 root 실행 시 skip).
149
+ **exit 계약이 판정이다**: `0`=PASS · `1`=FAIL · `3`=UNMEASURED(부재/빈슬롯/내용 페이지 0건 —
150
+ 보일러플레이트만으로 PASS 를 살 수 없다) · `4`=READ-FAIL(경로/권한 — §6 «실패로 보고»).
151
+ 호출자는 3·4 를 명시 처리한다 — 0/비0 이분법에서 3·4 는 FAIL 쪽으로 떨어진다(안전 방향))
152
+ - **K1-s(유입 스크럽)는 이 판정기의 범위 밖이다 — 미기계화를 명시한다**
153
+ (check class: **judged — 미기계화**. 스크럽은 각 채택 경로(§3)의 동기화 도구 소관이며,
154
+ 이 계약은 «실패 시 fail-closed» 요구까지만 정의한다. 판정기가 이것까지 초록으로 보이게
155
+ 하지 않도록 여기 명시 — 스크럽 없는 동기화는 K1-s 위반이고, 그 검증은 동기화 파이프라인의
156
+ 레인이 진다)
157
+ - 채택 경로가 `knowledge/{org}/SEAM.md` frontmatter에 기록된다:
158
+ `adoption_path: fork|git-map|export-sync|extract|conform` + `synced_at: YYYY-MM-DD`
159
+ (check class: **mandatory-pass** — 같은 스크립트가 frontmatter 위치·값 경계·날짜 형식까지 검사)
160
+ - 맥락 부재 시 에이전트가 그것을 명시한다
161
+ (check class: **judged** — 적대 짝: `tests/seam_absence_probes.md`의 고정 프롬프트 5건을
162
+ 맥락 없는 상태로 주고 **추론으로 메우는지** 관찰. 합격 = **5/5 명시적 부재선언**.
163
+ ⚠️ 이 짝은 §6이 에이전트가 읽는 자리에 인라인되기 전까지는 **구조적으로 통과가 어렵다** —
164
+ gate-locality: 규칙이 행위자가 안 읽는 파일에 있으면 장식이다. Step 2-O 가 §6 의 핵심
165
+ 행(부재=UNMEASURED)을 스킬 본문에 인라인한 것이 그 1차 처방이다)
@@ -34,6 +34,29 @@
34
34
  2026-08-09 실측: 그 질문이 델타 8건을 꺼냈고 **PR 이 없어 `gh pr list` 로 구조적으로 안 잡히는
35
35
  것들**이 다수였다(스펙/설계만 바뀐 것 · PR 이전 브랜치 커밋 · 외부 승인 대기 · 이월 누락).
36
36
 
37
+ ## 1-b. 머지 직전 — no-op 확인 (pmh Axis 0 답습분 · 산문 — CLAUDE.md 마감체인 ①-b 에 붙는다)
38
+
39
+ self-mergeable PR 을 실제로 머지하기 **직전**(⑤ 카드 쓰기 이전 단계다), 반입할 내용이 실재하는지
40
+ **트리 비교**로 확인한다:
41
+
42
+ ```
43
+ [ "$(git merge-tree --write-tree <base> <head>)" = "$(git rev-parse '<base>^{tree}')" ] && echo NO-OP
44
+ ```
45
+
46
+ **NO-OP(트리 동일)면 머지하지 않는다** — 같은 내용이 이미 들어가 있다. merge-tree 의 충돌 종료는
47
+ «판정 불가»가 아니라 «델타 있음»이고, **ref 해석 불가만 판정 불가**다(not-found ≠ 0).
48
+ `--write-tree` 는 git ≥ 2.38. ⚠️ `git diff --stat <base>..<head>` 도 `<base>...<head>` 도 쓰지
49
+ 마라 — «내용이 이미 다른 경로로 착지 + base 전진»인 바로 그 no-op 시나리오에서 **둘 다 비어 있지
50
+ 않다** (2026-08-10 known-pair 실측: no-op 쌍=트리 일치 / 실델타 쌍=불일치로 가른 것은 merge-tree
51
+ 형태뿐이었다). PR 의 열림/닫힘 · 커밋 수 · SHA · `@{u}` 거리는 전부 내용의 지표가 아니다.
52
+
53
+ 기원: pmh 실측 3회 — ref 상태를 내용 상태로 오독, REST push/미러 경로에서 no-op 이중 머지 직전까지
54
+ 감 (기록: `pmh-dev/scripts/merge_noop_check.sh` 헤더 — #61 vs #60, 트리 a170a8e5). FH 표면 실측 =
55
+ main 최근 200커밋 중 no-op 1건 (2026-08-09 측정, d2c7f55). **기계화 임계는 두 트리거다**
56
+ (`operations.md`: N≥3 **또는 같은 클래스의 타표면 재발**): (i) FH 표면 N=1 < 3 · (ii) 타표면
57
+ 재발 — pmh→FH 는 아직 FH 재현 0. **FH 재현 1회 시 즉시 기계화** — pmh `merge_noop_check.sh` 를
58
+ 가져오면 된다(exit 계약까지 이미 있다).
59
+
37
60
  ## 2. 세 가지를 각각 못 믿는다
38
61
 
39
62
  ### 2-a. 보냈다 ≠ 닿았다
@@ -48,6 +71,14 @@
48
71
  → **보낸 수가 아니라 답 온 수를 적고, 미회신 수를 카드에 명시한다.** 기계화 불가(스크립트는 회신을
49
72
  못 본다) — `session_close_check.sh` ①-c 가 이 문장을 살리언스로 띄운다.
50
73
 
74
+ **외부 1차 근거 (2026-08-10, 벤더 문서 — code.claude.com/docs/en/cross-session-messaging)**:
75
+ 크로스세션 배달은 **3값**이다 — `Delivered` / `Held`(수신자 승인 대기 — 기본 다이얼로그 경로는
76
+ `dialogExpiry` 초과 시 폐기되지만 **나중에 accept 가 적용되면 보류분이 릴리스**되고, `-p` 세션에선
77
+ 계속 보류된다) / `Refused`. **도착 시 Refused 만 구조적 무음**이다(송신 측 통지 없음). 나머지
78
+ 결과-통지 채널은 존재하되, 위 실측에서 관측과 어긋난 적이 있으므로 **신뢰층이 아니다 — 그래서
79
+ 회신 수를 센다.** 벤더 문서는 명세지 관측이 아니다 — 위 «단정하지 마라»가 여전히 우선한다.
80
+ (Held-릴리스 경로는 08-09 의 «만료 통지 vs 실제 도달» 불일치를 설명할 수 있는 후보다.)
81
+
51
82
  ### 2-a-2. 탐지는 넓게, **통지는 좁게** — 둘을 같은 목록으로 쓰지 마라
52
83
  2026-08-09 의 오발신은 탐지가 넓어서가 아니라 **탐지 목록을 그대로 수신자 목록으로 썼기** 때문이다
53
84
  (원래 알려야 할 상대는 1곳이었다). 두 목록은 목적이 다르다:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.91",
3
+ "version": "1.4.93",
4
4
  "description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -91,6 +91,10 @@
91
91
  "scripts/tier_census_grep.sh",
92
92
  "scripts/test_marker_floor_lanes.sh",
93
93
  "scripts/test_marker_crossfamily_lanes.sh",
94
+ "scripts/test_marker_axes_run_lanes.sh",
95
+ "scripts/test_env_purity_lanes.sh",
96
+ "scripts/.env_purity_tokens.defaults",
97
+ "scripts/env_purity_scan.sh",
94
98
  "scripts/directional_diff_gate.sh",
95
99
  "scripts/reviewer_capability_corpus.tsv",
96
100
  "scripts/test_reviewer_capability_conformance.sh",
@@ -175,6 +179,11 @@
175
179
  "scripts/field_canon_preload.sh",
176
180
  "scripts/test_field_canon_lanes.sh",
177
181
  "templates/settings.FieldCanon.snippet.json",
178
- ".claude/judgment_circuits.txt"
182
+ ".claude/judgment_circuits.txt",
183
+ "scripts/knowledge_seam_check.sh",
184
+ "scripts/test_knowledge_seam_lanes.sh",
185
+ "tests/seam_absence_probes.md",
186
+ "scripts/gate_anchor_check.sh",
187
+ "scripts/rtk_gross_ablation.sh"
179
188
  ]
180
189
  }
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "1.4.91",
3
+ "version": "1.4.93",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
7
- "description": "Cross-project utility skill bundle — 4 skills + 1 agent. Domain-agnostic and portable: convergence-loop, deliberation, mcp-circuit-breaker, token-budget-gate + quench-challenger agent.",
7
+ "description": "Cross-project utility skill bundle — 5 skills + 1 agent. Domain-agnostic and portable: convergence-loop, deliberation, mcp-circuit-breaker, token-budget-gate, ko-tech-writer + quench-challenger agent.",
8
8
  "author": {
9
9
  "name": "chrono-meta",
10
10
  "email": "chrono-meta@users.noreply.github.com"