@chrono-meta/fh-gate 3.1.4 → 3.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/registry/agent_cards.json +1 -1
- package/.claude/rules/fh_4axis_gate.md +26 -1
- package/.claude-plugin/marketplace.json +3 -3
- package/AGENTS.md +8 -2
- package/CATALOG.md +4 -4
- package/CHEATSHEET.md +1 -1
- package/CLAUDE.md +54 -10
- package/README.ja.md +3 -3
- package/README.ko.md +3 -3
- package/README.md +3 -3
- package/README.zh.md +3 -3
- package/docs/OUTPUT_EVIDENCE.md +2 -2
- package/docs/STANDARDS_ALIGNMENT.md +1 -1
- package/docs/codex-compat.md +1 -1
- package/knowledge/shared/harness-core/agents_md_runtime_details.md +2 -2
- package/knowledge/shared/harness-core/claude_md_gate_details.md +26 -0
- package/knowledge/shared/harness-core/fh_three_layer_canon.md +1 -1
- package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +76 -3
- package/knowledge/shared/harness-core/governance_engineering_definition.md +89 -0
- package/knowledge/shared/harness-core/iso_ai_standards_crosswalk.md +1 -1
- package/knowledge/shared/harness-core/skill_quality_rubric.md +1 -1
- package/knowledge/shared/learnings/subagent_invocations_log.yaml +99 -0
- package/knowledge/shared/rules/auto_project_mapping.md +1 -1
- package/knowledge/shared/rules/modes_and_value.md +2 -2
- package/package.json +12 -1
- package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-commons/README.md +38 -0
- package/plugins/fh-commons/skills/preprep/SKILL.md +23 -0
- package/plugins/fh-commons/skills/preprep/fixtures/font_revert_probe.py +92 -0
- package/plugins/fh-commons/skills/preprep/lane_font.py +462 -0
- package/plugins/fh-commons/skills/preprep/preprep.py +16 -1
- package/plugins/fh-commons/skills/preprep/surfaces.example.yaml +17 -0
- package/plugins/fh-commons/skills/preprep/test_lane_font.py +452 -0
- package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/CHANGELOG.md +164 -0
- package/plugins/fh-meta/skills/agent-composer/SKILL.md +2 -2
- package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +40 -0
- package/plugins/fh-meta/skills/frontier-digest/SKILL.md +1 -1
- package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +43 -5
- package/plugins/fh-meta/skills/{hub-cc-pr-reviewer → harness-pr-reviewer}/SKILL.md +75 -3
- package/plugins/fh-meta/skills/{hub-cc-pr-reviewer → harness-pr-reviewer}/SKILL_detail.md +2 -2
- package/plugins/fh-meta/skills/harvest-loop/SKILL_detail.md +2 -2
- package/plugins/fh-meta/skills/install-doctor/SKILL.md +1 -1
- package/plugins/fh-meta/skills/install-wizard/SKILL.md +1 -1
- package/plugins/fh-meta/skills/meta-prompt-builder/SKILL.md +1 -1
- package/plugins/fh-meta/skills/pipeline-conductor/SKILL.md +1 -1
- package/plugins/fh-meta/skills/plugin-recommender/SKILL.md +1 -1
- package/plugins/fh-meta/skills/sim-conductor/SKILL.md +1 -1
- package/plugins/fh-qp/.claude-plugin/plugin.json +1 -1
- package/scripts/doc_claim_triad_scan.py +303 -0
- package/scripts/finding_fleet.sh +558 -0
- package/scripts/finding_pipeline.sh +572 -0
- package/scripts/finding_verifier.sh +173 -0
- package/scripts/finding_verify.py +468 -0
- package/scripts/frontier_digest_autopilot.sh +3 -3
- package/scripts/gate_pathspec_check.sh +1 -0
- package/scripts/gate_shape_scan.sh +120 -0
- package/scripts/selfcheck.sh +50 -0
- package/scripts/test_doc_claim_triad_lanes.sh +124 -0
- package/scripts/test_finding_pipeline_lanes.sh +2011 -0
- package/scripts/test_gate_shape_scan_lanes.sh +47 -0
- package/scripts/test_heavy_classifier_lanes.sh +13 -3
- package/scripts/test_marker_crossfamily_lanes.sh +75 -3
- package/scripts/test_marker_standpoint_lanes.sh +31 -6
- package/scripts/test_preprep_font_lanes.sh +87 -0
- package/templates/.git-hooks/pre-commit +158 -11
- package/templates/PRE-PUBLISH-CHECKLIST.md +29 -0
- package/templates/local_fh_context.md +1 -1
- package/templates/regression_guard.sh +1 -1
|
@@ -59,6 +59,24 @@ discipline still applies: sidecar findings are **candidates**, not terminal; the
|
|
|
59
59
|
source-grounds each (does the real pipeline reach it? does an existing mechanical anchor mitigate
|
|
60
60
|
it?) before acting — mechanical anchor over agreement.
|
|
61
61
|
|
|
62
|
+
### External anchor (added 2026-09-07)
|
|
63
|
+
|
|
64
|
+
- **[arXiv 2607.04528 — "Measuring Harness-Induced Belief Divergence in Multi-Step LLM Agents"](https://arxiv.org/abs/2607.04528)**
|
|
65
|
+
(Yi · Song, Jul 2026 — abstract content confirmed via WebSearch synthesis this session; direct
|
|
66
|
+
`arxiv.org` fetch was egress-blocked, consistent with every Frontier Digest run this week, so this
|
|
67
|
+
is WebSearch-corroborated, not PDF-span-verified). Holding task, environment, and base model fixed,
|
|
68
|
+
the paper shows that **harness-interface configuration alone** — which actions are visible, how
|
|
69
|
+
repairs are compressed, which branches are verification-masked, which evidence is logged — shifts
|
|
70
|
+
an agent's multi-step beliefs about progress/risk/recoverability, and the divergence **grows with
|
|
71
|
+
step count** rather than staying constant.
|
|
72
|
+
**Relevance**: an external, mechanism-level account for *why* the "shared optimistic prior" above
|
|
73
|
+
is a real causal effect and not merely an assumed one — a reviewer that shares the author's
|
|
74
|
+
harness/context construction (same family, same session shape) inherits a correlated belief
|
|
75
|
+
trajectory through the mechanism this paper measures; a differently-constructed (cross-family)
|
|
76
|
+
reviewer does not share that construction and so does not inherit the same trajectory. The paper's
|
|
77
|
+
own claim is about harness-interface variation, not model-family variation per se — cited here as
|
|
78
|
+
mechanism support for the decorrelation argument above, not as a direct restatement of it.
|
|
79
|
+
|
|
62
80
|
## 4. The gate (before merge, not after)
|
|
63
81
|
|
|
64
82
|
1. **Degrade-direction lint** — `scripts/degrade_direction_scan.sh` (portable copy:
|
|
@@ -75,6 +93,12 @@ it?) before acting — mechanical anchor over agreement.
|
|
|
75
93
|
2. **Cross-family adversarial review** — `auto-decorrelation` recruits ≥1 different-family auditor
|
|
76
94
|
(e.g. `codex` gpt-5.5 / high for repo-grounded verdict code). The same standing verifier the
|
|
77
95
|
4-axis gate uses for load-bearing FH assets, now applied to **field** load-bearing changes.
|
|
96
|
+
🟥 **Judgment-type questions need reps ≥ 3** (pmh-dev #76, 2026-09-11): the same «is this silent
|
|
97
|
+
fallback by-design or fail-open?» prompt at the same temperature returned DESIGN / DEFECT / DESIGN
|
|
98
|
+
across three runs of one auditor. A single run of a judgment question therefore cannot be recorded
|
|
99
|
+
as `panel(...)` CONCUR — run it ≥3×, report the split, and treat a split as *unresolved*, not as
|
|
100
|
+
whichever side came first. Fact-type questions (grep, existence, «does line N call X») are stable
|
|
101
|
+
across reps and families and need neither repetition nor a family change.
|
|
78
102
|
3. **Confirm → fix → re-verify loop** — iterate until the cross-family pass is **CONVERGED**: no
|
|
79
103
|
reachable false-PASS / false-CONFIRMED / masked-FAIL / crash-where-safe-fail-required. **Each fix
|
|
80
104
|
ships a mechanical regression test** reproducing the closed hole — a *required* convergence
|
|
@@ -109,6 +133,34 @@ the grep — an agent under merge pressure can under-trigger by treating a chang
|
|
|
109
133
|
That residual is the reason the gate is reinforced by the always-on Autonomous-Initiative trigger
|
|
110
134
|
row + the operator's proactive framing, not by the grep alone.
|
|
111
135
|
|
|
136
|
+
**Registration is not a precondition (operator decision 2026-09-08).** «Field surface» above was
|
|
137
|
+
read as «a mapped project's surface», and a session handed an unmapped gate file answered *"적용
|
|
138
|
+
대상이 아닙니다"* and reviewed it bare — 0 degrade scan, 0 cross-family — missing a GHSA-grade
|
|
139
|
+
network-exposure defect. The blind spot this gate guards is a property of the *reviewer's family*,
|
|
140
|
+
not of the file's owner, so ownership cannot switch it off. Scope, narrowed so it does not become
|
|
141
|
+
«every review is a gate»: ⓐ the ask is a **merge / landing verdict** (not an explanation or a style
|
|
142
|
+
question) · ⓑ the file is **gate-shaped by `scripts/gate_shape_scan.sh`** — a closed, word-bounded
|
|
143
|
+
verdict-identifier list (allow/deny/permit/approve·approval/verdict/permission/auth family incl.
|
|
144
|
+
authorize·authorization·authenticat*; `author`/`allowance` excluded), a bind/listen exposure, or an
|
|
145
|
+
irreversible-op call; comment-led lines skipped (`* ` and `-- ` only when followed by space, so
|
|
146
|
+
`*allow = 1` and a continued `--force` line are code); binary → `UNSCANNABLE`, and exit 3 dominates
|
|
147
|
+
any hit (never a silent miss). The classifier is the scope test; it is **not** the FH-owned
|
|
148
|
+
exclusion — that is caller-side (the 4-axis gate already covers FH paths). The task's own naming of the file as gate / auth / exposure
|
|
149
|
+
code is a manual escalation on top of the classifier, not a substitute for it. Known-negative: a
|
|
150
|
+
utility with none of those is out of scope; `reject(` is deliberately not a verdict token (Promise
|
|
151
|
+
API collision, measured — named residual). ⓒ **FH-owned assets are excluded** — they carry the
|
|
152
|
+
4-axis gate; this gate is for field code, and «field» means *not FH*, not *mapped*. **Record surface
|
|
153
|
+
for an unmapped file**: no marker directory exists for it, so the session writes
|
|
154
|
+
`tracks/_meta/field_gate_review_<YYYY-MM-DD>_<slug>.md` — file · verdict · `crossfamily:` verbatim
|
|
155
|
+
from the enum · degrade-scan result · regression test *landed* or *owed* — and the review reply
|
|
156
|
+
links it. An **owed** regression test keeps the verdict `NOT-CONVERGED` until it lands and runs;
|
|
157
|
+
the gate's convergence sub-condition is unchanged. **Pilot evidence (below bar, cue-dependent)**: floor tier,
|
|
158
|
+
blind, one variable — before 0/1 fired · after 2/3 on the first draft, **both with a prompt cue
|
|
159
|
+
«follow your installed review procedure»**; without the cue, **0/51** the same day (17 unmapped
|
|
160
|
+
gate-shaped files × 3). The gate is salience-only and the salience needs a cue — a mechanical
|
|
161
|
+
reminder channel is the open item (`tracks/_meta/fh_signal_2026-09-08_gate-needs-cue.md`). Resident summary: `CLAUDE.md
|
|
162
|
+
§Field-Harness Load-Bearing Change Gate`.
|
|
163
|
+
|
|
112
164
|
**Residency** — sanitize company code (redact vendor/domain literals) before any external-family
|
|
113
165
|
dispatch; domain data never leaves. **Autonomy** — autonomous once the operator has consented in
|
|
114
166
|
the UAP (`tracks/_meta/user_adaptation_profile.md`, defined in `knowledge/shared/rules/operational_adaptation.md`),
|
|
@@ -167,6 +219,27 @@ changes which ground truth the review is checked against — they are orthogonal
|
|
|
167
219
|
that maxes out the first while leaving the second at zero has not raised its coverage of
|
|
168
220
|
standpoint-dependent defects at all.*
|
|
169
221
|
|
|
222
|
+
🟢 **External number, 2026-09-12 — and it is large.** `arXiv:2609.10969` (*Engineering Reliable
|
|
223
|
+
Commit Gates for Agentic AI: Cost-Aware Verification Portfolios under Common-Mode Data Failures*,
|
|
224
|
+
2026-09-10, cs.SE) built this comparison as a benchmark: 48 task templates → **2,880 scenarios**,
|
|
225
|
+
**fixed-call 2×2** so budget is held constant and the comparison is about the axis rather than about
|
|
226
|
+
spending more. Result: a **cross-model vote over shared evidence approves 62.9 % of unsafe proposals**,
|
|
227
|
+
versus **22.9 % with an independent source** — source effect **40.9 pp** against **11.3 pp** for model
|
|
228
|
+
diversity, i.e. **3.6×**. 🟥 **Read that against which axis FH mechanizes**: `crossfamily:` is a closed
|
|
229
|
+
enum with a hard commit block and a fixtures lane, while `standpoint:`'s grounds check — the axis the
|
|
230
|
+
number says carries 3.6× the effect — **was advisory by design until 2026-09-12**
|
|
231
|
+
(`validate_standpoint_leg()` printed `⚠️` and did not `return 1` on a `tier2` naming no command).
|
|
232
|
+
🟢 **Both gaps were closed the same day this number landed**: the `tier2`+ grounds check now
|
|
233
|
+
**blocks** (`STANDPOINT_GROUNDS_GRACE_DATE=2026-09-12`, no retro-blocking — lanes N8/N8b/N8c/N8d),
|
|
234
|
+
and `crossfamily:`'s `panel(...)` now requires an **`evidence=SHARED|INDEPENDENT|MIXED`** token in its
|
|
235
|
+
grounds (`EVIDENCE_TOKEN_GRACE_DATE=2026-09-12`, lanes e1–e10), because a cross-family panel reading
|
|
236
|
+
the **same diff** is, in their terms, the 62.9 % arm while recording as this enum's strong value.
|
|
237
|
+
🟥 `SHARED` stays a legal answer — the defect was that it was unsayable, not that it is wrong. Until 2026-09-12 this section rested on FH's own
|
|
238
|
+
n=4+4/4+8 observations; the direction is unchanged and the magnitude is now external.
|
|
239
|
+
⚠️ Scope: their unsafe-approval rates are from their fault-injection benchmark, not from FH's corpus —
|
|
240
|
+
cite the **asymmetry**, not the absolute percentages, as a property of FH's own gate.
|
|
241
|
+
(Numbers re-read off the abstract on 2026-09-12 rather than recalled — §Instrument Calibration.)
|
|
242
|
+
|
|
170
243
|
**Relationship to the isolation axis — standpoint is isolation whose scope moved up to the
|
|
171
244
|
harness (operator, 2026-08-18).** Operator wording: *"요는 이것도 '격리' 프레이밍이 하네스 단위로
|
|
172
245
|
확장되는 거지 … 그 하네스 자체의 입장을 돌리는 거니까 (하네스라는 껍질에 모델이라는 알맹이를
|
|
@@ -496,7 +569,7 @@ one variable at a time — `banana(qasp)` → **blocked (enum)** · `tier2` with
|
|
|
496
569
|
**passes**.
|
|
497
570
|
|
|
498
571
|
**What is actually true, stated at the right width**: the enum IS closed and enforced; the `tier2`+
|
|
499
|
-
execution grounds
|
|
572
|
+
execution grounds **blocked** from 2026-09-12 (before that a thin `tier2` recorded and warned); and nothing
|
|
500
573
|
checks whether the recorded value is *true*. The old sentence collapsed all three into "no validation",
|
|
501
574
|
which suppresses use of a control that exists — the quietest kind of drift, because it reads as
|
|
502
575
|
honest modesty.
|
|
@@ -527,7 +600,7 @@ grep the function name, not a line number) blocks on **six** distinct `return 1`
|
|
|
527
600
|
duplicated one, a value outside the closed enum, a `crossfamily:` token contaminating this axis, a
|
|
528
601
|
bare `not-applicable`, and a bare `DEGRADED_*`/`UNKNOWN`. Lanes: `scripts/test_marker_standpoint_lanes.sh`.
|
|
529
602
|
**What is actually reserved is one narrow slot**: for `tier2`+ the «did you name a command you ran»
|
|
530
|
-
grounds test
|
|
603
|
+
grounds test emitted `⚠️` and did **not** return 1 until 2026-09-12 (the hook labelled it *"Advisory by design"*); it now returns 1 for markers dated on/after `STANDPOINT_GROUNDS_GRACE_DATE`. So the
|
|
531
604
|
accurate three-way split is: **enum → blocked · non-vacuity of grounds → blocked · truth of the value,
|
|
532
605
|
and execution-naming on `tier2`+ → not checked.** Do not read this as "now mechanized"; read it as
|
|
533
606
|
**"the channel is checked in more places than this file used to admit, and the judgment is still not
|
|
@@ -870,7 +943,7 @@ time, because the first version of this correction varied two and mis-attributed
|
|
|
870
943
|
`banana(qasp)` → blocked (enum) · `tier2` without parens → blocked (enum) · `tier2(qasp)` with **no**
|
|
871
944
|
execution grounds → **passes with a warning** · with grounds → passes. 🟥 So the first fix's claim
|
|
872
945
|
that "grounds are non-empty" are checked **over-shot, and a different-family reviewer caught it**:
|
|
873
|
-
the `tier2`+ execution grounds
|
|
946
|
+
the `tier2`+ execution grounds **block as of 2026-09-12** (they were advisory before). Two residuals remain and both are real — grounds are
|
|
874
947
|
not enforced, and whether `tier2` is *true* is still self-attested. What was wrong was only the claim
|
|
875
948
|
that nothing validated the field at all. Three artifacts, one carrying two
|
|
876
949
|
independent trials (forge-harness PR #368, a sibling field harness's PR #8 reps=3 and its
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: governance-engineering-definition
|
|
3
|
+
description: "Names the discipline this hub practices — governance engineering: moving an error rate toward 0.x% AND blocking at the surfaces where that number is not allowed to buy passage. Operator formulation 2026-09-09. Distinct from harness engineering (the artifact) — this is the objective."
|
|
4
|
+
type: reference
|
|
5
|
+
date: 2026-09-09
|
|
6
|
+
tags: [governance-engineering, naming, identity, error-budget, irreversible-surface]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 거버넌스 엔지니어링 (Governance Engineering) — 정의
|
|
10
|
+
|
|
11
|
+
## 운영자 정식화 (2026-09-09, 축자)
|
|
12
|
+
|
|
13
|
+
> *"우리가 독창적으로 부를 엔지니어링은 '거버넌스 엔지니어링' 이라고 불러야할것같아.
|
|
14
|
+
> 0.x%의 오차율을 내기위한 목표로 움직이고 막고서는 엔지니어링"*
|
|
15
|
+
|
|
16
|
+
## 🟥 동사가 둘이다 — 그리고 둘째가 하중을 진다
|
|
17
|
+
|
|
18
|
+
정식화 안에 동사가 **둘** 있고, 이 이름의 값어치는 전부 그 둘이 같이 있다는 데 있다.
|
|
19
|
+
|
|
20
|
+
| | 무엇 | 없으면 |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| **움직인다** | 오차율을 0.x% 로 끌어내리는 것을 **목표로** 공정을 짠다 | 게이트만 남고 개선이 없다 — 「막기만 하는 관료」 |
|
|
23
|
+
| **막고 선다** | 그 수치가 **통과권을 사지는 못하는** 자리를 지킨다 | 「숫자를 충분히 낮추면 자동으로 통과」가 된다 |
|
|
24
|
+
|
|
25
|
+
🟥 **둘째 동사를 빼면 이 이름은 하루 만에 자기 교리와 모순된다.** 2026-09-08 에 상주화한
|
|
26
|
+
§Irreversibility Gates 의 문단(PR #687)이 정확히 그것을 금지한다 — *"do not promote a verdict engine
|
|
27
|
+
to an irreversible surface by improving its number."* 그 문단의 defeater 도 축자로 이렇게 적혀 있다:
|
|
28
|
+
「누군가 이 문단을 근거로 오류율 문턱을 만들면 이 문단이 실패한 것」.
|
|
29
|
+
|
|
30
|
+
⇒ **정의 문장은 한 줄로 이렇게 고정한다**:
|
|
31
|
+
> **수치를 목표로 움직이되, 그 수치가 게이트를 열지는 않는다.**
|
|
32
|
+
> 무엇이 허용되는가는 **표면 등급**이 정하지 숫자가 정하지 않는다.
|
|
33
|
+
|
|
34
|
+
## 첫 실증 내용 (이 이름이 비어 있지 않다는 근거)
|
|
35
|
+
|
|
36
|
+
2026-09-08 dominance B-1 본 실행, 5팔 × GHSA 8케이스 × 3rep, 축② 주장 오류율:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
O octo 4자 2.7% ← 최저
|
|
40
|
+
F_xf cross-family 5.3%
|
|
41
|
+
F FH 기본 9.6%
|
|
42
|
+
N 맨몸 9.7%
|
|
43
|
+
F_slim 리뷰프로파일 13.6% ← 최고
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**다섯 개 전부 리뷰 표면에서는 쓸 만하다** — 틀린 지적 하나가 독자의 1분을 쓴다.
|
|
47
|
+
**다섯 개 전부 비가역 표면에서는 못 쓴다** — 발행·삭제·이력재작성에서 틀린 판정은 손실 전체다.
|
|
48
|
+
이 두 문장 사이의 거리가 거버넌스 엔지니어링이 존재하는 이유다. 0.x% 는 **아직 아무도 낸 적 없는
|
|
49
|
+
수치**이고(최저가 2.7%), 그래서 «목표»이지 «달성»이 아니다.
|
|
50
|
+
|
|
51
|
+
## 인접 이름과의 경계 — 대체가 아니라 다른 축이다
|
|
52
|
+
|
|
53
|
+
| 이름 | 무엇에 대한 것인가 | 정본 |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| **하네스 엔지니어링** | **수단** — 하네스라는 «물건»을 어떻게 짓는가(6축) | `harness_6axis_framework.md` · CLAUDE.md §Core Axis |
|
|
56
|
+
| **메타 하네스 엔지니어링** | **누가 무엇을 짓는가** — 하네스를 짓는 시스템을 짓는다 | [[meta_harness_engineering_definition]] |
|
|
57
|
+
| **거버넌스 엔지니어링** | **목적** — 어느 표면에서 어느 오차율이 허용되는가, 그리고 어디서 멈추는가 | 이 파일 |
|
|
58
|
+
|
|
59
|
+
셋은 층이 달라서 서로를 대체하지 않는다. 하네스는 거버넌스 엔지니어링의 **도구**이고,
|
|
60
|
+
거버넌스 엔지니어링은 하네스가 **무엇을 위해** 있는지를 말한다.
|
|
61
|
+
|
|
62
|
+
## 왜 이 이름이 지금 필요했나 — 측정된 공백
|
|
63
|
+
|
|
64
|
+
낱말 실측(2026-09-09, 컨트롤 동반): 「거버넌스 엔지니어링 / governance engineering」은 이 레포
|
|
65
|
+
**어디에도 0회**다. 같은 실행의 known-positive 컨트롤 「Harness Engineering」은 5개 파일(CLAUDE.md 포함)에서
|
|
66
|
+
히트한다 — 계기는 살아 있고, 부재는 진짜다.
|
|
67
|
+
|
|
68
|
+
그런데 **발행된 산출물 쪽에서는 이미 그 낱말로 불린다**: arXiv `2609.04218` 은 «governance» 논문이고,
|
|
69
|
+
Zenodo `10.5281/zenodo.22635721` 예치도 «거버넌스»다. 즉 **논문은 우리가 무엇을 하는지 말하고 있는데
|
|
70
|
+
정체성 문서는 그 말을 한 번도 한 적이 없었다.** 이 이름은 새 활동을 만드는 게 아니라 이미 하고 있던
|
|
71
|
+
것에 이름을 다는 것이다.
|
|
72
|
+
|
|
73
|
+
## 명명된 잔여 — 아직 안 한 것
|
|
74
|
+
|
|
75
|
+
- **외부 용례와의 관계 — 요구는 «미사용»이 아니라 «델타 진술»이다** (운영자 정정 2026-09-09):
|
|
76
|
+
*"루프 엔지니어링 그래프 엔지니어링도 이미 예전부터 쓰이던 표현일 텐데 LLM에 대한 거버넌스
|
|
77
|
+
엔지니어링은 또 다른 것일 듯해."* — 이 레포에 그 선례가 실재한다: `loop_engineering.md`(11,713 B)가
|
|
78
|
+
「루프 엔지니어링」을 남의 분야에서 이미 쓰이는 낱말인 채로 우리 뜻으로 쓴다.
|
|
79
|
+
⇒ **낱말이 남의 분야에 있다는 사실은 사용을 막지 않는다.** 판별자는 **가리키는 대상**이고, 여기서
|
|
80
|
+
대상은 «LLM 이 판정을 생산하는 공정의 오차율을 표면 등급별로 통치하는 것」이다 — IT 거버넌스(조직·
|
|
81
|
+
프로세스 통제)나 데이터 거버넌스(자산·계보)와 대상이 다르다.
|
|
82
|
+
🟥 **그래도 남는 것 하나**: 논문이 이 이름을 내세우는 순간 심사자는 기존 용례를 묻는다. 그때 필요한
|
|
83
|
+
것은 «아무도 안 썼다»가 아니라 **«기존 용례는 X, 우리 대상은 Y» 한 단락**이다. 그 단락 없이
|
|
84
|
+
«we introduce governance engineering» 을 쓰지 않는다 — 이 레포는 참고문헌 불일치 11/17 로 arXiv
|
|
85
|
+
반려를 이미 한 번 겪었고, 그 실패의 축이 정확히 «출처를 안 열고 주장한 것」이다.
|
|
86
|
+
- **상주층 반영 미완**: CLAUDE.md §Core Axis 행이 아직 「Harness Engineering (How)」만 적는다.
|
|
87
|
+
거기에 목적 축을 어떻게 넣을지는 별건(4축 게이트 대상)이고, 이 파일이 그 결정의 입력이다.
|
|
88
|
+
- 이 파일은 **정의**지 실행 절차가 아니다. 실행부는 이미 있다 — §Irreversibility Gates(표면 등급) ·
|
|
89
|
+
`finding_verify.py`(드롭 감사 없는 정밀도 거부) · `field_verdict_crossfamily_gate.md`.
|
|
@@ -72,7 +72,7 @@ TS 8200), 위험 식별(42119-2 §6) — 이 정확히 **하네스 층**에 산
|
|
|
72
72
|
| 42001 A.10 3자 | 3자·고객 관계 | capability composition contract(strictest-wins) · 클러스터 노드 등록 | `capability_composition_contract.md` | 🟡 |
|
|
73
73
|
| 5338 수명주기 | 정의·통제·실행·개선 프로세스 | 인큐베이터(챔버 run) → EMIT → 필드 → harvest-loop 복리 | `harness_incubator_doctrine.md` · `hub_compounding_loop.md` | ✅ |
|
|
74
74
|
| 23894 위험관리 | 식별·분석·평가·처리 | 등급표(🔴🟡🔵🟢) · Surface-Class Degrade Invariant(비가역 = fail-closed) · «미측정≠0」 | `ship_readiness_gate.md` · `CLAUDE.md §Irreversibility Gates` | ✅ 부분 |
|
|
75
|
-
| 20246 리뷰 | 작업산출물 리뷰 프로세스 | cross-family 리뷰 · `/apex-review` · `
|
|
75
|
+
| 20246 리뷰 | 작업산출물 리뷰 프로세스 | cross-family 리뷰 · `/apex-review` · `harness-pr-reviewer` · 콜드리드(`beginner`) | `plugins/fh-meta/agents/*` | ✅ |
|
|
76
76
|
|
|
77
77
|
## 3. qasp crosswalk — QA 하네스에게 29119 는 «선택된 활동」 단위로 걸린다
|
|
78
78
|
|
|
@@ -20,7 +20,7 @@ refs:
|
|
|
20
20
|
"The ratio at which the result of executing a skill can be independently reproduced and verified by an external observer"
|
|
21
21
|
|
|
22
22
|
### Measurement targets (5 core skills — fixed denominator)
|
|
23
|
-
harness-doctor · verify-bidirectional ·
|
|
23
|
+
harness-doctor · verify-bidirectional · harness-pr-reviewer · context-doctor · sim-conductor
|
|
24
24
|
|
|
25
25
|
### Per-skill scoring criteria
|
|
26
26
|
|
|
@@ -3548,3 +3548,102 @@
|
|
|
3548
3548
|
dispatch_count_measured: 131 # session_close_check ④-e 집계. 위 2 엔트리는 «클래스 통합»이고
|
|
3549
3549
|
# 총 스폰 수는 131 이다 — 「2건」만 보면 과소 계상으로 읽힌다
|
|
3550
3550
|
notes: "🟥 거버너가 잡은 오류 1건 — qasp 조사가 `web_regress.py:423` 의 `return \"PASS\"` 를 «레포 유일 fail-open» 으로 지목했는데 **틀렸다**. `_STATUS_MAP` 이 세 값만 만들고 그 밖은 두 진입점에서 raise 하며 SKIPPED 는 앞 분기가 먹으므로 소진적 else 다. 정적 패턴만 보고 **도달 가능성을 안 본** 부류. 그리고 내 계기도 한 번 틀렸다(`endswith(\"pass\")` 가 `not-pass` 를 삼켜 8.3% 오출력) — 같은 얼굴이라 PR 본문에 적었다. 두 에이전트 다 «확인 못 한 것»을 이름으로 나열했고 그게 검수를 값싸게 만들었다"
|
|
3551
|
+
|
|
3552
|
+
- date: 2026-09-08
|
|
3553
|
+
agent: codex(gpt-5.6 → gpt-6-astra) · 사이드카 adversarial/verifier
|
|
3554
|
+
purpose: "① 게이트 트리거 넓힘 교리 5R 수렴 ② 논문 v1.2.2 §6.7 6R 수렴(SHIP 판정) ③ recall 재검증 45런 조건 블라인드 채점 ④ B-1 5팔 채점(축①③ keyed · 축② unkeyed) ⑤ typed-finding 파이프라인의 검증기·감사기"
|
|
3555
|
+
outcome: accepted
|
|
3556
|
+
evidence: "①에서 «기계 테스트라 적었는데 기계가 없다» 를 잡아 gate_shape_scan.sh 가 그 커밋에 들어왔다(자력 0). ②에서 S findings 를 4라운드 연속 냈고 마지막까지 남긴 것이 제목의 «Evidence» 한 줄 — 운영자가 그 처방을 «정체성 소실»로 정정해 «a Test of» 로 착지. ③은 known-pair 보정 통과(양성 HIT/HIT · 음성 MISS/MISS) 후 45런 채점. ⑤에서 자기 산출(codex)을 검증할 때 채널 규칙이 실사용에서 발동"
|
|
3557
|
+
tokens_subagent: UNMEASURED
|
|
3558
|
+
dispatch_count_measured: 39 # session_close_check ④-e 집계. 아래 gemini 포함 총계이고
|
|
3559
|
+
# 이 엔트리는 «클래스 통합» 이다 — 2건만 보면 과소 계상으로 읽힌다
|
|
3560
|
+
notes: "🟥 codex 가 한 번 틀렸다 — §6.7 분모를 5×3×8=120 으로 읽어 S 로 올렸는데 실제는 항목이 아티팩트에 묶여 있어 24 가 맞다. 표현이 모호했던 것은 사실이라 문구를 고쳤고 «산술은 늘 맞았다» 를 R6 프롬프트에 명시했다. 거버너가 잡은 자기 오류 2건: 「0% 는 채점자 산물」(기록이 반증) · 「참 주장이 지워졌다」(소스 확인 후 철회)"
|
|
3561
|
+
|
|
3562
|
+
- date: 2026-09-08
|
|
3563
|
+
agent: agy(gemini-3.8-flash-high) · fleet member + verifier
|
|
3564
|
+
purpose: "typed-finding fleet 의 security 역할 · 반대 방향 검증 패스 · octo 파이프라인의 Gemini 라운드 복구용 shim"
|
|
3565
|
+
outcome: accepted
|
|
3566
|
+
evidence: "Art4 에서 4건 산출, 그중 셋이 2026-06-02 GT 와 일치하는 실물(allow_session→allow_always L49 · deny_always L26 · UI 주입 L83). 검증 패스에서 codex 산출 1건을 false-positive 로 드롭했고, 그 드롭은 감사(codex)에서 correct-drop 으로 확인됐다"
|
|
3567
|
+
tokens_subagent: UNMEASURED
|
|
3568
|
+
dispatch_count_measured: 위 엔트리에 통합
|
|
3569
|
+
notes: "🟥 배선 함정 둘: `-p` 가 variadic 이라 `--model` 을 프롬프트로 먹었고(오류 메시지가 친절해 즉시 잡힘), 기본 print-timeout 이 6KB 프롬프트에 부족해 rc=1. 둘 다 «조용한 0» 이 될 수 있었는데 fleet 이 멤버 rc 를 기록해서 보였다. gemini CLI 자체는 개인 계정에서 deprecated(IneligibleTierError) — agy 가 유일 경로"
|
|
3570
|
+
- date: 2026-09-09
|
|
3571
|
+
agent: fh-meta:persona-innovator
|
|
3572
|
+
mode: F
|
|
3573
|
+
context: "Mode D — 야간 자율주행. 거버넌스 엔지니어링 프레임(다음 arXiv) + ≤1% 오류율을 향한 갭 스캔. 운영자가 「이노베이터 활용」을 명시 요청"
|
|
3574
|
+
dispatched_by: governor
|
|
3575
|
+
outcome: accepted
|
|
3576
|
+
evidence: "① 델타 진술 + 제목 3 + thesis 2, 각각 defeater 동반 ② 외부 선행 11건(URL 열어 확인) + 미확인 4건 라벨 분리 ③ FH 결손 6건(G-1~G-6, 전부 기계화 가능). 🟥 G-4(finding_verify.py 의 자기검증 가드가 옵셔널 필드에 걸린 fail-open)는 내가 소스 확인 + 알려진 쌍 재현 후 **이 릴리스에서 닫았다**(PR #694). 사이드카 원 주장은 배선 경로도 뚫린다는 함의였는데 파이프라인이 라우팅을 거부하므로 좁혀서 채택 — 사이드카 발견은 «증거 후보» 이지 판정이 아니라는 규율대로"
|
|
3577
|
+
residual: "🟥 자기보고 잔여를 스스로 6항 적어 왔다(EU AI Act 미열람 · preprint 자기보고 수치 · 우리 표의 커버리지 불일치). 그 정직성 자체가 채택 근거의 일부. 외부 인용은 **아직 재검증 안 함** — 논문에 싣기 전에 URL 을 내가 직접 연다"
|
|
3578
|
+
- date: 2026-09-10
|
|
3579
|
+
agent: sidecar-codex (gpt-6-astra high) + sidecar-agy (gemini-3.8-flash-high) + local ollama qwen3.8:27b@4090
|
|
3580
|
+
task: B-2 F_typed 팔 24런(+15 재실행) · F_gen 9런 · 채점 32+16+16+3 단위 · cross-family 수리 검토 1
|
|
3581
|
+
count: 37 (SubagentStop 집계) — 사이드카 CLI 호출은 별도(팔 ~140, 채점 ~70)
|
|
3582
|
+
outcome: accepted
|
|
3583
|
+
evidence: tracks/_meta/dominance_B2/RESULT_2026-09-10_scoring-calibration.md §1~§10 · fh_axes23_2026-09-10_verifier-roster.md · cross-family 6/6 실적발 전건 수리(L73~L78)
|
|
3584
|
+
cost: codex 577k(F_typed 리뷰) + 한도 3회 소진 · 로컬 4090 무료 · 거버너 UNMEASURED
|
|
3585
|
+
note: 통합 1항목. 사이드카는 auditor 로만(트리 쓰기 0). 자력 적발 0/6(cross-family) · 계기 축 자력 2(L72 · quota 오탐)
|
|
3586
|
+
- date: 2026-09-10
|
|
3587
|
+
agent: general-purpose ×5 (Claude, 로컬 격리 워크트리 · 사이드카 0 — residency)
|
|
3588
|
+
task: qasp-dev PR 스택 7건(#278–#284) 거버너 검증 — 레인 실행 · 되돌림 프로브 · 표본 손검증 · known-pair (#279 · #280+#281 · #282 · #283 · #284) + 거버너 직접 #278·스택 전수
|
|
3589
|
+
count: 5
|
|
3590
|
+
outcome: accepted
|
|
3591
|
+
evidence: tracks/_meta/field_gate_review_2026-09-10_qasp-stack7.md — #281 BLOCK(coverage.py:142 파생 fail-open 재현 + 정본 :41), 5건 A 소견 전부 file:line·재현 동반 · 스택 전수 4092/0
|
|
3592
|
+
cost: subagent_tokens 163k+184k+215k+200k+195k ≈ 957k · 거버너 UNMEASURED
|
|
3593
|
+
note: 통합 1항목. crossfamily=DEGRADED_SINGLE_FAMILY(corp-context 어휘 — residency). 자력(거버너) 적발 0 — 다섯 A 전부 에이전트 실행이 잡음; 저자 자기검토도 다섯 다 놓친 자리(«거버너 1종» 이 실제로 «기계 1종+의미 0종» 이라는 저자 정정은 채택)
|
|
3594
|
+
- date: 2026-09-12
|
|
3595
|
+
agent: general-purpose(sonnet) ×6 — persona-commons 1기 웹 리뷰 캐스트 첫 실사용(designer · ux-writer · fe-dev · be-dev · qa · a11y 렌즈, 격리·병렬)
|
|
3596
|
+
task: 공개 화면(FH 지도 페이지 캡처 33요소/5k자) 에 각 렌즈 파일+캡처만 주고 parallax 출력 + Unique-to-this-seat 자기 태그. 거버너가 렌즈별 고유 발견을 세어 장식 렌즈를 가른다(한계효용 정지)
|
|
3597
|
+
count: 6
|
|
3598
|
+
outcome: accepted
|
|
3599
|
+
evidence: 결과는 tracks/_meta/persona_cast_trial_2026-09-12.md 에 표로
|
|
3600
|
+
note: 렌즈 파일은 워크트리 초안(feat/persona-commons). 회사 데이터 0(공개 페이지)
|
|
3601
|
+
- date: 2026-09-12
|
|
3602
|
+
agent: codex sidecar(gpt-6-astra) — Axis 2 cross-family 감사, 짝지음 설계 diff 18,771 bytes
|
|
3603
|
+
task: finding_fleet.sh · finding_pipeline.sh · run_pair.sh 의 diff 를 읽고 결함 열거(S/A/B + 트리거 입력). «두 분기가 바이트 동일한 r1 을 먹어야 하고 드리프트는 크게 틀어져야 한다» 를 요구사항으로 명시
|
|
3604
|
+
count: 1
|
|
3605
|
+
outcome: accepted
|
|
3606
|
+
evidence: S 1건 적발 — `--r1-only` 이 빈 round-1 을 R1_ONLY(사용가능) 로 통과시키는 fail-OPEN(`grep -c . || echo 0` 이 "0\n0" 을 만들어 `[ -eq 0 ]` 이 구문오류로 거짓). 프로브 출력까지 받아 재현, 레인 L124 + fail-before 실행 증명으로 수리. 판정 원문 = tracks/_meta/dominance_B2/PREREG_ADDENDUM6_NOTE_2026-09-12.md
|
|
3607
|
+
cost: tokens 46,877 · 거버너 UNMEASURED
|
|
3608
|
+
note: 🟥 부분 완주 — 한도 소진으로 중단(리셋 15:44), 남은 표면(run_pair.sh phase2 동시성) 미검. 자력 적발 0 — 내가 20분 전에 쓴 코드였다. 회사 데이터 0(FH 자기 스크립트)
|
|
3609
|
+
- date: 2026-09-11
|
|
3610
|
+
agent: agy(gemini-3.1-pro-high · gemini-3.8-flash-high) · cross-family adversarial reviewer
|
|
3611
|
+
mode: sidecar
|
|
3612
|
+
context: "preprep L15 서체 일관성 레인 신설(PR #697, MERGED bffa1a0) 의 적대 검토. 4라운드 연속."
|
|
3613
|
+
dispatched_by: governor
|
|
3614
|
+
outcome: accepted
|
|
3615
|
+
evidence: |
|
|
3616
|
+
R1 3.1-Pro-High 8건 · R2 3.8-Flash-High 6건 · R3 3.8-Flash-High 5건 · R4 3.1-Pro-High 4건
|
|
3617
|
+
= **지적 23건 중 22건 수용·전건 실적발**, 1건 기각(하네스 전역 계약 → fh_signal 로 기록).
|
|
3618
|
+
🟥 **자력 적발 0** — 23건 다 못 봤다.
|
|
3619
|
+
🟥 라운드를 쌓은 것이 하중이었다: **R2 가 R1 의 수리를, R4 가 R3 의 수리를 뒤집었다.**
|
|
3620
|
+
· R1 의 「템플릿 자신이 쓰는 서체는 노트로 강등」 → R2 가 fail-open 으로 지목(배포 템플릿은
|
|
3621
|
+
쓰이지도 않는 자리에 Office 기본값을 들고 있어서, 강등하면 본문에 써도 종료코드가 안 움직인다)
|
|
3622
|
+
· R3 의 「속성 순서 가정 제거」가 쓴 `(\w+)=` 가 네임스페이스 콜론을 못 먹어 `r:id` 유실 →
|
|
3623
|
+
R4 가 지목. 실물 덱이 그 형태라 장 순서가 내내 파일명 순 폴백으로 돌고 있었다
|
|
3624
|
+
🟥 그리고 **R3 에서 그걸 막으라고 넣은 레인이 초록이었다** — 픽스처가 1장짜리라 폴백과 정상
|
|
3625
|
+
경로가 같은 답을 냈다(「초록인 이유를 확인하라」의 교과서적 재현). 2장 픽스처 + 면제-장번호
|
|
3626
|
+
컨트롤로 교체.
|
|
3627
|
+
실물 탐지 표면 173 → 647 → 804회. self-test 30항 · 출하본 rc=0 PASS=6.
|
|
3628
|
+
tokens_subagent: UNMEASURED
|
|
3629
|
+
dispatch_count_measured: 6 # R1~R4 본검토 4 + 실패 재시도 2(헤드리스 권한 1 · print-timeout 1)
|
|
3630
|
+
residual: |
|
|
3631
|
+
🟥 **NOT-CONVERGED.** 4라운드에 4건을 고쳤으므로 5라운드가 남았다. 네 라운드 연속으로 새
|
|
3632
|
+
결함이 나왔고 자력 적발이 0 이라, 이 레인은 아직 굳지 않았다.
|
|
3633
|
+
⚠️ 배선 함정 둘(둘 다 «조용한 0» 이 될 수 있었다): ⓐ 백그라운드 실행에서 agy 가
|
|
3634
|
+
「command 권한이 헤드리스에서 auto-deny」로 **출력 0** — 포그라운드 재실행으로 해소
|
|
3635
|
+
ⓑ 기본 print-timeout 5분이 27KB 프롬프트에 부족 → `--print-timeout 600s` 필요(메모리에
|
|
3636
|
+
이미 있던 함정을 재현했다).
|
|
3637
|
+
notes: "판정은 전부 거버너가 소스로 재현한 뒤 수용했다 — 지적을 믿고 고친 것이 아니라, 예컨대 자식 있는 defRPr 정규식 조기종료는 재현부터 돌려 서체가 버려지는 것을 보고 나서 고쳤다. 사이드카 발견은 «증거 후보» 이지 판정이 아니라는 규율대로."
|
|
3638
|
+
|
|
3639
|
+
- date: 2026-09-12
|
|
3640
|
+
agent: agy(gemini-3.1-pro-high) · cross-family adversarial reviewer
|
|
3641
|
+
mode: sidecar
|
|
3642
|
+
context: "preprep L15 4라운드 — 자정을 넘겨 실행된 분. 본체 기록은 2026-09-11 엔트리에 통합돼 있다"
|
|
3643
|
+
dispatched_by: governor
|
|
3644
|
+
outcome: accepted
|
|
3645
|
+
evidence: "4건 지적 전건 실적발·수리. 그중 하나가 **R3 수리가 심은 결함**(`(\\w+)=` 가 네임스페이스 콜론을 못 먹어 `r:id` 유실 → 장 순서가 파일명 순 폴백). 나머지 셋도 fail-open: `<a:t xml:space=\"preserve\"> 미독 · `<a:sym>` 슬롯 미포함(실물 157개) · 템플릿 endParaRPr 이 허용 집합으로 승격"
|
|
3646
|
+
tokens_subagent: UNMEASURED
|
|
3647
|
+
dispatch_count_measured: 위 2026-09-11 엔트리에 통합 (클래스 통합)
|
|
3648
|
+
residual: "NOT-CONVERGED — 5라운드가 남았다"
|
|
3649
|
+
notes: "🟥 이 엔트리가 따로 있는 이유는 세션이 자정을 넘겼기 때문이다. ④-e 는 «오늘» 기준으로 세므로, 날짜 경계를 넘긴 세션은 양쪽 날짜에 기록이 필요하다 — 원장을 하루 단위로 읽는 계기의 성질이고, 통합 서술만 두면 오늘 자가 0 으로 보인다"
|
|
@@ -66,7 +66,7 @@ Mapping complete: N projects
|
|
|
66
66
|
|
|
67
67
|
Basic mapping (steps 1–5) registers a project *lightly* (tracks/ + a starter CLAUDE.md + hub link). **Full-Harness Mode adds the project-local harness assets** — identity ① (Control Tower) propagating harness structure to a connected project; the *how* is executed via the Core Axis.
|
|
68
68
|
|
|
69
|
-
**Scope**: target *mapped* projects only. For FH-self setup / acceleration baseline (zshrc, sentinels, the FH self-gate) use `/install-wizard` — do **not** run §6 on the FH hub itself. **Prerequisite**: the project is already mapped (steps 1–5); §6 is strictly additive. This mode is also the **emit terminus of a chamber run** — a simulate-first incubation that holds routes here on emit (`harness_incubator_doctrine.md §3` Minimal execution skeleton ⑤).
|
|
69
|
+
**Scope**: target *mapped* projects only. (Mapping scopes *installation* of harness assets — it is **not** the precondition for FH's review gates: the Field-Harness Load-Bearing Change Gate fires on a merge verdict for any gate-shaped file, mapped or not — `field_verdict_crossfamily_gate.md §Registration is not a precondition`, 2026-09-08.) For FH-self setup / acceleration baseline (zshrc, sentinels, the FH self-gate) use `/install-wizard` — do **not** run §6 on the FH hub itself. **Prerequisite**: the project is already mapped (steps 1–5); §6 is strictly additive. This mode is also the **emit terminus of a chamber run** — a simulate-first incubation that holds routes here on emit (`harness_incubator_doctrine.md §3` Minimal execution skeleton ⑤).
|
|
70
70
|
|
|
71
71
|
**Triggers**: "harness-ify this project", "full harness setup", "프로젝트 하네스화", "promote to full harness", or an opt-in prompt offered right after a basic mapping (*"Promote {project} to a full harness now?"*).
|
|
72
72
|
|
|
@@ -125,7 +125,7 @@ The forge-harness bundles **rules, skills, and session protocols** into one envi
|
|
|
125
125
|
| `harvest-loop` | Weekly audit + self-evolution pipeline + Phase 2+ PR auto-proposal |
|
|
126
126
|
| `verify-bidirectional` | Bidirectional self-verification + user-AI baseline update circuit |
|
|
127
127
|
| `frontier-digest` | External-facing asset cross-ref + frontier trend + per-audience guide |
|
|
128
|
-
| `
|
|
128
|
+
| `harness-pr-reviewer` | PR diff → baseline coherence check → review comment auto-generation |
|
|
129
129
|
| `context-doctor` | `.claudeignore` auto-generation + large file detection + `/clear` timing guidance |
|
|
130
130
|
| `harness-doctor` | Harness structure L1~L4 diagnosis + M/S/R prescription |
|
|
131
131
|
| `sim-conductor` | External scenario/internal audit/ideation scan autonomous execution + M-tier auto PR |
|
|
@@ -156,7 +156,7 @@ The forge-harness bundles **rules, skills, and session protocols** into one envi
|
|
|
156
156
|
| "can I use what's in another project?", "what's available?" | Ecosystem synergy discovery | `cross-ecosystem-synergy-detection` |
|
|
157
157
|
| "manage my context", "want to save tokens" | Context optimization | `context-doctor` |
|
|
158
158
|
| "wrap up this week's work", "want to reflect" | Weekly audit | `harvest-loop` |
|
|
159
|
-
| "review my PR", "please review" | PR audit | `
|
|
159
|
+
| "review my PR", "please review" | PR audit | `harness-pr-reviewer` |
|
|
160
160
|
| "check harness structure", "confirm everything's running well" | Structure diagnosis | `harness-doctor` |
|
|
161
161
|
| "what are the latest AI tools?", "tell me about frontier trends" | External asset discovery | `frontier-digest` |
|
|
162
162
|
| "want to share this pattern", "can I post this here?" | Pattern harvesting | `field-harvest` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chrono-meta/fh-gate",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
|
|
5
5
|
"homepage": "https://github.com/chrono-meta/forge-harness#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -134,6 +134,15 @@
|
|
|
134
134
|
"scripts/test_marker_crossfamily_lanes.sh",
|
|
135
135
|
"scripts/residency_closure_scan.py",
|
|
136
136
|
"scripts/test_residency_closure_lanes.sh",
|
|
137
|
+
"scripts/doc_claim_triad_scan.py",
|
|
138
|
+
"scripts/test_doc_claim_triad_lanes.sh",
|
|
139
|
+
"scripts/gate_shape_scan.sh",
|
|
140
|
+
"scripts/test_gate_shape_scan_lanes.sh",
|
|
141
|
+
"scripts/finding_fleet.sh",
|
|
142
|
+
"scripts/finding_verify.py",
|
|
143
|
+
"scripts/finding_verifier.sh",
|
|
144
|
+
"scripts/finding_pipeline.sh",
|
|
145
|
+
"scripts/test_finding_pipeline_lanes.sh",
|
|
137
146
|
"scripts/test_marker_standpoint_lanes.sh",
|
|
138
147
|
"scripts/test_marker_thirdparty_lanes.sh",
|
|
139
148
|
"scripts/test_marker_axes_run_lanes.sh",
|
|
@@ -218,6 +227,7 @@
|
|
|
218
227
|
"plugins/fh-meta/skills",
|
|
219
228
|
"plugins/fh-meta/agents",
|
|
220
229
|
"plugins/fh-commons/.claude-plugin/plugin.json",
|
|
230
|
+
"plugins/fh-commons/README.md",
|
|
221
231
|
"plugins/fh-commons/skills",
|
|
222
232
|
"plugins/fh-commons/agents",
|
|
223
233
|
"knowledge/shared/harness-core",
|
|
@@ -322,6 +332,7 @@
|
|
|
322
332
|
"scripts/test_fh_qp_lanes.sh",
|
|
323
333
|
"scripts/test_preprep_diagram_lanes.sh",
|
|
324
334
|
"scripts/test_preprep_slide_refs_lanes.sh",
|
|
335
|
+
"scripts/test_preprep_font_lanes.sh",
|
|
325
336
|
"scripts/test_action_yml_lanes.sh"
|
|
326
337
|
]
|
|
327
338
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# fh-commons — Contention-Born Skill Habitat
|
|
2
|
+
|
|
3
|
+
**A different layer of plugin from fh-meta.**
|
|
4
|
+
|
|
5
|
+
fh-meta = meta-engineering skills for operating, diagnosing, and improving the harness itself
|
|
6
|
+
fh-commons = general-purpose utility skills born from the contention layer, transplantable to any project
|
|
7
|
+
|
|
8
|
+
## Placement Criteria
|
|
9
|
+
|
|
10
|
+
When the `contention-layer` skill harvests contentions and generates new skill candidates:
|
|
11
|
+
|
|
12
|
+
| Determination | Destination |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Harness engineering in nature | `fh-meta` |
|
|
15
|
+
| Project-general · domain-agnostic | **`fh-commons`** (this plugin) |
|
|
16
|
+
| Domain/team specific | field harvest (decided by the field team) |
|
|
17
|
+
|
|
18
|
+
## Skill List
|
|
19
|
+
|
|
20
|
+
| Skill | Description | Contention Parent |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `convergence-loop` | General-purpose gate reinforcement that replaces single-pass structures with a convergence loop of up to N rounds | harvest-loop (recurring single-pass-distrust pattern across hub gates) |
|
|
23
|
+
| `deliberation` | Innovator → Devil-Advocate → Mediator 3-layer multi-perspective synthesis. Generates conditional verdicts without binary win/loss | Migrated from fh-meta (2026-05-23 — domain-agnostic general decision structure) |
|
|
24
|
+
| `ko-tech-writer` | Korean technical-writing pipeline — register detection, venue calibration, translationese scan, honesty layering, number/claim gate, perceptual QA | Field-session harvest (2026-08-10 — conference tech-doc revision session, operator-driven shipping) |
|
|
25
|
+
|
|
26
|
+
## The `origin` Field
|
|
27
|
+
|
|
28
|
+
Commons skills include the following fields in their SKILL.md frontmatter:
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
# Contention-born (extracted by contention-layer)
|
|
32
|
+
origin: contention-layer
|
|
33
|
+
contention-parents: [skill-A, skill-B]
|
|
34
|
+
|
|
35
|
+
# Migrated from fh-meta (reclassified as general-purpose)
|
|
36
|
+
origin: fh-meta
|
|
37
|
+
migration: "YYYY-MM-DD — reason for migration"
|
|
38
|
+
```
|
|
@@ -182,6 +182,7 @@ python3 "$SKILL/preprep.py"
|
|
|
182
182
|
| **L10 adjacent-dup** | **인접 장이 같은 문장을 다시 읽나** — 쪼갤 때 뒤 프레임에 원본을 통째로 남기면 앞 장에서 읽은 문장을 또 읽는다. 실측 117자 중 82자(70%) | 차단 (임계는 사람이 적는다. 미기재면 측정만) |
|
|
183
183
|
| **L9 progression** | **선언된 단계 중 하나가 화면에서 빠졌나** — 실사고: ①②③④ 중 ①이 화면에서 떨어져 리뷰어가 논지를 **정반대로** 읽었다. 개별 문장은 전부 옳았다 | 차단 (선언된 것만 본다) |
|
|
184
184
|
| **L12 diagram** | **타입 JSON 도해가 «지금 JSON» 에서 validate 를 거쳐 구워졌나** — `kind: diagram_source` 표면의 굽기 영수증(`*.receipt.json`)으로 JSON 지문 일치 · showcase validate ok · PNG 실제 폭(IHDR 직독) ≥ 3840 · viewBox 폭 ≤ 720 · 여백. 실사고 후보 셋: JSON 고치고 PNG 안 구움 · 미검증 JSON 손렌더 · 픽셀은 충분한데 글자 12pt | 차단 (선언된 표면만 · 영수증 없는 손그림은 **UNMEASURED**, 0 아님) |
|
|
185
|
+
| **L15 font** | **서체가 그 덱의 배포 템플릿이 정한 집합을 벗어났나** — `slides/` 안에서 «명시된» 서체만 판정하고, `slideLayouts`·`slideMasters`·`theme` 은 **템플릿과 해시가 같으면 상속분으로 보고 판정하지 않는다**. `fonts.allow` 미선언이면 **템플릿 자신의 `slides/` 분포에서 허용 집합을 유도**한다. 테마가 이탈이면 `+mn-*` 참조 전부가 거기서 오므로 **테마 한 곳만** 지적한다 | 차단 (🟥 `fonts.template` 미선언 = 상속과 저자 이탈을 **구분 불가** → 그 사실을 노트에 적는다 · 서체 토큰 0 = **UNMEASURED**, 「이탈 없음」 아님 · `fonts.intended` 로 선언한 것은 «면제됨»으로 출력 — 면제도 **가족 단위**다 · 🟥 렌더되지 않는 것은 안 센다: 빈 런 · `endParaRPr`(빈 문단 끝서식) · 테마의 `<a:font script=…>` 폴백) |
|
|
185
186
|
| **G ooxml** | pptx 구조 9종 — 관계 참조 무결성 · 죽은 Content_Types Override · **화면 밖 도형** · 열린 도형 채움 · 선 굵기 토큰 래칫 | 차단 (`python3 ooxml/gate.py <풀린 pptx 트리>`) |
|
|
186
187
|
| **R1 orphan-connective** | 선두 줄이 «그러나/그래서»로 뒤집는데 그 문장의 주어가 **직전 장 어디에도 없다** | 🟥 advisory · **실물 known-positive**(실제 백업에서 뜬 결함) |
|
|
187
188
|
| **R2 enum-dropped** | 앞 장이 ①②③ 으로 센 것을, 이 장이 «이 셋 중…» 이라 부르며 **번호 없이** 재편한다 — 1:1 대응이 안 보인다 | 🟥 advisory · **실물 known-positive** |
|
|
@@ -191,6 +192,28 @@ python3 "$SKILL/preprep.py"
|
|
|
191
192
|
| **P1 build-jitter** | 같은 이름 도형이 **연속한 두 장**에서 조금 다른 자리에 있다 — 넘길 때 튄다 | 🟥 advisory · **실물 known-positive** — 🟥 대조된 도형-쌍이 0 건이면 「튐 없음」이 아니라 **UNMEASURED**(이름 중복 도형은 대조 못 해 통째로 뺀다) |
|
|
192
193
|
| **P3 adjacency** | 한 도형의 **오른쪽 끝**과 다른 도형의 **왼쪽 끝**이 맞닿으려다 어긋났다 | 🟥 advisory · **실물 known-positive** · 🟥 절대 목록으로 읽지 마라(기저 오탐 76건 실측) — `surfaces.yaml` 의 `geometry.baseline`(이전 판 pptx)을 주면 **편집 전/후 델타**로 돈다. **P2(near-miss, 같은 종류 모서리만 대조)는 미채택** — 구조적으로 실제 결함(다른 종류 모서리의 인접)을 못 잡아서다 |
|
|
193
194
|
|
|
195
|
+
🟥 **L15 의 본체는 검출이 아니라 «상속과 저작의 분리»다.** 순진하게 서체 이름만 세면 이 코퍼스에서
|
|
196
|
+
**오탐 85건**이 나온다 — 그 85건은 전부 `slideMasters/` 안에 있고, **배포 템플릿의 마스터에도 정확히
|
|
197
|
+
같은 85건이 있다**(해시 동일, 2026-09-11 실측). 저자는 그 글자를 찍은 적이 없다. 진짜 이탈은 3런
|
|
198
|
+
하나뿐이었고(코드 데모의 고정폭 서체) 그건 «의도»였다. ⇒ 판별자는 **영역 + 템플릿 해시 대조**이지
|
|
199
|
+
서체 이름이 아니다. 뒤집으면, 템플릿에서 **갈라진** 마스터·레이아웃은 반대로 **저자 책임**이라 그
|
|
200
|
+
사실을 따로 보고한다. 코드: `lane_font.py` · self-test: `test_lane_font.py`(21항) · 레인 래퍼 `scripts/test_preprep_font_lanes.sh`
|
|
201
|
+
(되돌림 프로브 `fixtures/font_revert_probe.py`). known-negative 가 «서체 하나뿐인 덱»이 아니라
|
|
202
|
+
**«마스터에 이질 서체가 있지만 템플릿과 동일한 덱»** 인 것이 핵심이다 — 그게 실제로 틀렸던 자리다.
|
|
203
|
+
|
|
204
|
+
🟥 **cross-family 2라운드가 판정을 한 번 뒤집었고, 그 되돌림 자체가 계약이다.** 1라운드는
|
|
205
|
+
«템플릿 자신의 마스터/레이아웃이 쓰는 서체는 오탐이니 노트로 강등하라»고 했고 그렇게 고쳤다.
|
|
206
|
+
2라운드가 그것을 **fail-open 으로 지목했다** — 배포 템플릿의 레이아웃은 쓰이지도 않는 자리에
|
|
207
|
+
Office 기본값(Arial·Calibri)을 흔히 들고 있어서, 강등하면 저자가 그 이름으로 본문을 찍어도
|
|
208
|
+
종료코드가 안 움직인다. ⇒ **억제는 걷고 맥락 주석만 남긴다**(finding 은 유지). 래퍼의
|
|
209
|
+
`annotation` 프로브가 이 되돌림이 다시 억제로 가지 않는지를 고정한다.
|
|
210
|
+
2라운드가 닫은 나머지 다섯: 자식 있는 `defRPr` 에서 비탐욕 정규식이 **서체를 조용히 버림** ·
|
|
211
|
+
`presentation.xml` 의 `r:id`/`id` **속성 순서**가 다르면 장 순서가 빈 리스트가 되어 0건 PASS ·
|
|
212
|
+
테마의 `<a:font script="...">` **보조 폴백**을 위반으로 셈 · 면제가 정확일치라 선언한 가족의
|
|
213
|
+
굵기 변형이 안 덮임 · 갈라진 부품에서 **원래 있던** 서체까지 이탈로 보고.
|
|
214
|
+
🟥 **구조적으로 못 보는 것 셋**: 이미지에 구워진 글자 · 그 서체가 **설치돼 있는지**(파일은 이름만 적고,
|
|
215
|
+
없으면 렌더러가 조용히 대체한다) · 굵기 변형의 실재. 셋 다 파일 밖의 사실이라 0 으로 세지 않는다.
|
|
216
|
+
|
|
194
217
|
🟥 **L8 이 advisory 인 이유**: 두 계기의 오탐을 **최저비용으로 무마하는 길이
|
|
195
218
|
「그 문장을 지우는 것」**이라, 종료코드에 태우면 원고를 나쁜 방향으로 미는 압력이 된다.
|
|
196
219
|
후보를 내고 판정은 사람이 한다. 오탐 다수가 정상이다.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""L15 되돌림 프로브 — 상속 분리가 하중을 지는지, 그리고 방어가 몇 겹인지.
|
|
3
|
+
|
|
4
|
+
🟥 **왜 «template 미선언» 조건에서 재는가 (2026-09-11, 이 프로브가 한 번 거짓 적색을 낸 뒤).**
|
|
5
|
+
L15 의 오탐 방어는 **둘이고 겹친다**:
|
|
6
|
+
|
|
7
|
+
① 영역 분리 `slide_runs()` 가 애초에 `ppt/slides/` 만 읽는다
|
|
8
|
+
② A2 강등 템플릿 자신의 마스터·레이아웃이 쓰는 서체는 finding→note 로 내린다
|
|
9
|
+
|
|
10
|
+
해시가 같은 부품에서는 ②가 ①을 **완전히 덮는다** — 마스터가 템플릿과 동일하면 그 서체는
|
|
11
|
+
정의상 «템플릿 자신이 쓰는 서체»이기 때문이다. 그래서 둘 다 켠 채 ①만 죽이면 결과가 안 바뀌고,
|
|
12
|
+
프로브는 「분리가 장식이다」라는 **거짓 판정**을 낸다. 실제로 그렇게 빨개졌고, 그때 내린 결론이
|
|
13
|
+
「분리를 지워도 된다」였다면 template 미선언 install 전부에서 오탐 85건이 돌아왔을 것이다.
|
|
14
|
+
|
|
15
|
+
⇒ **컨트롤은 방어를 하나만 남긴 조건에서 건다** — `separation` 은 template 을 빼서 ①만 남긴다.
|
|
16
|
+
(이건 이 저장소가 이름 붙인 「레인이 초록인 이유는 셋」의 변종이다 — 여기서는 *적색*인 이유가
|
|
17
|
+
계기 쪽에 있었다.)
|
|
18
|
+
|
|
19
|
+
🟥 **②는 그 뒤 «방어»에서 «주석»으로 강등됐다 (cross-family 2라운드, 같은 날).** 템플릿
|
|
20
|
+
레이아웃은 쓰이지도 않는 자리에 Office 기본값(Arial·Calibri)을 흔히 들고 있어서, 그 이름을
|
|
21
|
+
노트로 내리면 저자가 그것으로 본문을 찍어도 종료코드가 안 움직인다 — 오탐을 줄이려던 것이
|
|
22
|
+
**fail-open** 이었다. 그래서 지금 방어는 ① 하나뿐이고, ②의 자리에는 finding 에 붙는 맥락
|
|
23
|
+
주석만 남는다. `annotation` 모드가 **그 주석이 억제로 되돌아가지 않는지**를 고정한다.
|
|
24
|
+
(옛 `depth` 모드는 그 되돌림 때 폐기됐다. 낡은 계약을 단언하다 옳게 빨개졌고, 그 적색이
|
|
25
|
+
계약이 바뀌었음을 알린 신호였다 — 지우지 말고 교체하는 것이 맞다.)
|
|
26
|
+
|
|
27
|
+
usage: font_revert_probe.py separation|annotation
|
|
28
|
+
"""
|
|
29
|
+
import os
|
|
30
|
+
import re
|
|
31
|
+
import sys
|
|
32
|
+
import shutil
|
|
33
|
+
import tempfile
|
|
34
|
+
|
|
35
|
+
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
36
|
+
sys.path.insert(0, os.path.dirname(HERE))
|
|
37
|
+
|
|
38
|
+
import lane_font as L # noqa: E402
|
|
39
|
+
import test_lane_font as T # noqa: E402
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _widen(z):
|
|
43
|
+
"""뮤턴트: 상속 영역까지 판정 대상에 넣는다 = 영역 분리를 죽인다."""
|
|
44
|
+
rows, n = _widen.orig(z)
|
|
45
|
+
for name in z.namelist():
|
|
46
|
+
if re.match(r'ppt/(slideMasters|slideLayouts)/[^/]+\.xml$', name):
|
|
47
|
+
for tf in L._typefaces(z, name):
|
|
48
|
+
if tf and not L.THEME_REF.match(tf):
|
|
49
|
+
# 🟥 튜플 모양은 slide_runs 의 계약이다 — (장, 서체, 슬롯, 텍스트, 출처).
|
|
50
|
+
# 계약이 바뀌면 이 프로브가 빨개진다. 빨개지는 것이 옳다.
|
|
51
|
+
rows.append((0, tf, 'latin', '(상속)', 'inherited'))
|
|
52
|
+
return rows, n
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def separation(d):
|
|
56
|
+
"""방어 ①만 남긴다 (template 미선언) → 죽이면 오탐이 돌아와야 한다."""
|
|
57
|
+
k1 = T.build(os.path.join(d, 'k1.pptx'), [T.run('본문', 'Brand Display Bold')])
|
|
58
|
+
cfg = T.cfg_for(k1, None, ['Brand Display'])
|
|
59
|
+
base = len(L.scan(cfg, d)[0])
|
|
60
|
+
_widen.orig = L.slide_runs
|
|
61
|
+
L.slide_runs = _widen
|
|
62
|
+
try:
|
|
63
|
+
mut = len(L.scan(cfg, d)[0])
|
|
64
|
+
finally:
|
|
65
|
+
L.slide_runs = _widen.orig
|
|
66
|
+
print('BASE', base, 'MUT', mut)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def annotation(d):
|
|
70
|
+
"""템플릿도 쓰는 이름이 **억제되지 않고 finding 으로 남는지** 고정한다.
|
|
71
|
+
|
|
72
|
+
저자가 본문에 `Helvetica Neue`(템플릿 마스터에 있는 이름)를 찍은 상황. 억제로 되돌아가면
|
|
73
|
+
FINDING 0 이 나오고, 그것이 2라운드가 지목한 fail-open 이다."""
|
|
74
|
+
tpl = T.build(os.path.join(d, 'tpl.pptx'), [T.run('본문', 'Brand Display Bold')])
|
|
75
|
+
k = T.build(os.path.join(d, 'k.pptx'),
|
|
76
|
+
[T.run('본문', 'Brand Display Bold'), T.run('각주', 'Helvetica Neue')])
|
|
77
|
+
f, _ = L.scan(T.cfg_for(k, tpl, ['Brand Display']), d)
|
|
78
|
+
annotated = sum(1 for x in f if '템플릿 자신의 마스터' in x[4])
|
|
79
|
+
print('FINDING', len(f), 'ANNOTATED', annotated)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == '__main__':
|
|
83
|
+
mode = sys.argv[1] if len(sys.argv) > 1 else ''
|
|
84
|
+
fn = {'separation': separation, 'annotation': annotation}.get(mode)
|
|
85
|
+
if not fn:
|
|
86
|
+
print('usage: font_revert_probe.py separation|annotation', file=sys.stderr)
|
|
87
|
+
sys.exit(10)
|
|
88
|
+
d = tempfile.mkdtemp(prefix='fontprobe_')
|
|
89
|
+
try:
|
|
90
|
+
fn(d)
|
|
91
|
+
finally:
|
|
92
|
+
shutil.rmtree(d, ignore_errors=True)
|