@chrono-meta/fh-gate 1.4.64 → 1.4.65
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-plugin/marketplace.json +2 -2
- package/AGENTS.md +12 -2
- package/CLAUDE.md +29 -2
- package/package.json +1 -1
- package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/skills/agent-composer/SKILL.md +44 -0
- package/plugins/fh-meta/skills/harness-doctor/SKILL.md +47 -0
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "fh-meta",
|
|
14
|
-
"version": "1.4.
|
|
14
|
+
"version": "1.4.65",
|
|
15
15
|
"description": "Hub meta-operations toolkit — 34 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.
|
|
20
|
+
"version": "1.4.65",
|
|
21
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.",
|
|
22
22
|
"source": "./plugins/fh-commons"
|
|
23
23
|
}
|
package/AGENTS.md
CHANGED
|
@@ -104,11 +104,11 @@ For complex multi-step tasks, run `/agent-composer` first to plan which agents t
|
|
|
104
104
|
|
|
105
105
|
The methodology layer (`tracks/`, `knowledge/`, `SKILL.md` docs) is Codex-compatible beta. Any AI model can follow skill workflows by reading SKILL.md files directly; the automation layer (hooks, plugin-channel agents under `plugins/*/agents/`, `/model`) is Claude Code-native and requires manual adaptation. FH's own agents are auto-loaded via the plugin channel when the plugin is enabled — `.claude/agents/` is the field-project override slot, not where FH ships its agents. Non-Claude runtimes use this `AGENTS.md`, `plugins/*/agents/*.md`, and `scripts/fh-run.sh` to apply the same methodology via adapter.
|
|
106
106
|
|
|
107
|
-
### Non-Claude runtimes:
|
|
107
|
+
### Non-Claude runtimes: three things CLAUDE.md holds that you will not auto-load
|
|
108
108
|
|
|
109
109
|
`.claude/rules/*.md` with `paths:` frontmatter is a **Claude Code platform feature** — those files are
|
|
110
110
|
auto-loaded into a Claude Code session when it reads a matching file, and **your runtime has no equivalent**.
|
|
111
|
-
So
|
|
111
|
+
So three things that govern behavior are not going to reach you on their own. Read them explicitly:
|
|
112
112
|
|
|
113
113
|
1. **FH asset changes run a mandatory 4-axis verification chain before the session's first commit.**
|
|
114
114
|
Detail (axis definitions · marker required fields · lightweight exception · substantive carve-out):
|
|
@@ -122,6 +122,16 @@ So two things that govern behavior are not going to reach you on their own. Read
|
|
|
122
122
|
approval plus a gitignored audit note. This binds every runtime, not just Claude Code — a leak does not
|
|
123
123
|
un-happen, and the guard is worth nothing if it only lives where one runtime reads.
|
|
124
124
|
|
|
125
|
+
3. **Before calling a material work product done, name what you are blind to.** CLAUDE.md routes the
|
|
126
|
+
everyday "commit and merge this" moment to `agent-composer` **§Author-Exposure Table** — a review
|
|
127
|
+
pass keyed on *what the author cannot self-detect* (cold entry → `beginner` · everyday friction →
|
|
128
|
+
`main-player` · outside currency → `expert` · optimistic self-verification → `challenger` +
|
|
129
|
+
cross-family · rebuilding what exists → `fact-checker` · ungrounded numbers → `phantom-quench`),
|
|
130
|
+
with a materiality gate and an `Exposure-unclear → challenger` default so "no row applies" is not
|
|
131
|
+
an exit. **This row exists because the triggering utterance names no agent** — nothing will fire it
|
|
132
|
+
for you. Your runtime *can* run these lenses: substitute `Agent(subagent_type=...)` per §M2 above
|
|
133
|
+
(`fh-run`, or `codex exec` reading the agent spec). The lens returns evidence, never the verdict.
|
|
134
|
+
|
|
125
135
|
The irreversible-surface gates (Pre-Publish · Destructive-Op) likewise live in CLAUDE.md and fire on
|
|
126
136
|
**intent**, not on a file — read them before any publish, delete, or history-rewrite. `pre-push` enforces
|
|
127
137
|
the git-side destructive surface mechanically for every runtime.
|
package/CLAUDE.md
CHANGED
|
@@ -176,10 +176,36 @@ The forge-harness hub has a dual identity: **(a) a seed for others** + **(b) you
|
|
|
176
176
|
- **Implementation:** Skills such as `harvest-loop` follow this principle — they generate skill drafts, prepare commits automatically, and propose PR creation. However, the final decision to submit a PR must always require the user's explicit approval (`y`). This ensures Human-in-the-loop while maximizing AI contribution.
|
|
177
177
|
|
|
178
178
|
**PR Creation Principle:**
|
|
179
|
-
- AI may commit and push automatically (when changes are approved)
|
|
179
|
+
- AI may commit and push automatically (when changes are approved) — **to a feature branch, never to the integration branch**
|
|
180
180
|
- **PR creation requires explicit user request** ("create PR", "PR 올려줘", "pull request")
|
|
181
181
|
- **Reason:** Prevents PR fragmentation — logical units should be grouped into meaningful PRs, not atomized per commit
|
|
182
|
-
- Default workflow: commit → push → wait for explicit PR request
|
|
182
|
+
- Default workflow: branch → commit → push branch → wait for explicit PR request
|
|
183
|
+
|
|
184
|
+
**Integration branch is PR-only** (operator decision 2026-07-20). Never `git push origin main`
|
|
185
|
+
directly. Normal path: `git switch -c <branch>` → push the branch → `gh pr create` → after review
|
|
186
|
+
`gh pr merge --squash --delete-branch --admin` (self-approval is impossible when you authored the PR,
|
|
187
|
+
so `--admin` after a completed review is the normal route, not a shortcut).
|
|
188
|
+
|
|
189
|
+
**Mechanically enforced** by `templates/.git-hooks/pre-push`, which blocks a direct push to
|
|
190
|
+
`main`/`master` unless the explicit `MAIN_PUSH_OK=1` acknowledgment is set (same channel shape as
|
|
191
|
+
`DESTRUCTIVE_OP_OK` / `PUBLIC_SURFACE_OK`). Known-pair calibrated: direct-to-main blocks,
|
|
192
|
+
feature-branch push passes untouched, override honored — over-blocking would just train the override
|
|
193
|
+
into muscle memory and disarm it.
|
|
194
|
+
|
|
195
|
+
> **Two layers, and which one is the floor**: the **hard floor is server-side** — this repo now runs
|
|
196
|
+
> `enforce_admins: true` with `required_approving_review_count: 0` (set 2026-07-20; the count must be
|
|
197
|
+
> `0`, because enabling `enforce_admins` while it is `1` locks a solo operator out of merging their
|
|
198
|
+
> own PRs — self-approval is impossible). The hook is the **shift-left layer**: it fails at push time
|
|
199
|
+
> and prints the actual remedy, and it keeps holding if the server setting is ever relaxed. It is
|
|
200
|
+
> deliberately not the floor — a client-side hook is bypassable with `--no-verify`.
|
|
201
|
+
> *Origin*: before that change the server had `enforce_admins: false`, so an admin push *satisfied*
|
|
202
|
+
> the rule and merely printed `Bypassed rule violations` — a notice, not a block. A rule that
|
|
203
|
+
> announces its own bypass is not a floor.
|
|
204
|
+
> ⚠️ **Unresolved residual**: `allow_force_pushes` on `main` is still `true`. Two documented API
|
|
205
|
+
> attempts to set it `false` were accepted without error and did **not** persist (verified by
|
|
206
|
+
> independent GET, not by the write response). Force/non-ff pushes are blocked locally by this same
|
|
207
|
+
> hook, so the honest-model case is covered — but the **server-side** history-rewrite surface on
|
|
208
|
+
> `main` remains open. Re-check before relying on it.
|
|
183
209
|
|
|
184
210
|
## Permission-Denial Guidance (When Auto-Mode Blocks an Action)
|
|
185
211
|
|
|
@@ -481,6 +507,7 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
|
|
|
481
507
|
| "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 |
|
|
482
508
|
| "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. |
|
|
483
509
|
| "orchestrate agents", "parallel dispatch", "combine skills", "multiple agents" | `/agent-composer` |
|
|
510
|
+
| **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 |
|
|
484
511
|
| "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` |
|
|
485
512
|
| "broaden these personas", "what other voices fit this cast", "map these roles to a decision lens", "페르소나 후보군 더 넓혀" (persona seed → tiered judgment-mapped cast; pairs with `persona-innovator` for naming) | `/persona-roster-expander` |
|
|
486
513
|
| "connect a project", "map this project", "link to hub" | `auto_project_mapping.md` (mapping) |
|
package/package.json
CHANGED
|
@@ -63,6 +63,50 @@ For each subtask in the composition plan:
|
|
|
63
63
|
| Code generation | `writes: true` + code tools | `writes: false` or no code tools |
|
|
64
64
|
| Audit-only | `writes: false` (safe) | `writes: true` (risky for audit) |
|
|
65
65
|
|
|
66
|
+
### Author-Exposure Table — a review pass, not a second executor
|
|
67
|
+
|
|
68
|
+
The table above picks **who does the subtask**. This one adds a different question at a different
|
|
69
|
+
stage: **what failure is the author structurally exposed to, now that the work is claimed done?**
|
|
70
|
+
It never replaces capability fit and never selects the agent that performs the work — it adds a
|
|
71
|
+
**review pass** before the work is released. A doc-writing subtask scores no "adversarial review"
|
|
72
|
+
fit, yet its author is blind to cold-entry failure, and capability fit never surfaces that.
|
|
73
|
+
|
|
74
|
+
**Materiality gate — run this pass only when the work product is material.** At least one of:
|
|
75
|
+
public or otherwise irreversible surface · affects users other than the author · carries external
|
|
76
|
+
claims, numbers, or citations · introduces new behavior · touches security, data, deletion, or
|
|
77
|
+
permissions. Internal notes, wording fixes, and one-line edits do **not** trigger it — an
|
|
78
|
+
unbounded trigger just trains the pass into being skipped.
|
|
79
|
+
|
|
80
|
+
| Failure the author cannot self-detect | Review mechanism | Type |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| Cold entry — first contact breaks (missing install step, undefined term, no success signal) | `beginner` | agent |
|
|
83
|
+
| Everyday-use friction invisible to the designer | `main-player` | agent |
|
|
84
|
+
| Currency vs the outside field (needs external citation, not assertion) | `expert` | agent |
|
|
85
|
+
| Self-verification only fails in the optimistic direction | `challenger` + `auto-decorrelation` | agent + pipeline |
|
|
86
|
+
| Rebuilding something that already exists | `fact-checker` · `asset-placement-gate` | agent · skill |
|
|
87
|
+
| Numbers/citations living in the artifact without grounding | `phantom-quench` | skill |
|
|
88
|
+
| **Exposure unclear** (material, but no row above fits) | `challenger` | agent — default, not a skip |
|
|
89
|
+
|
|
90
|
+
The `Type` column matters for the capability-fit checks above: `writes`/tooling scoring applies to
|
|
91
|
+
**agent** rows only; skill and pipeline rows are invoked, not scored.
|
|
92
|
+
|
|
93
|
+
**Behavioral rule — no silent skip, and "no row applies" is not an exit.** Name the row before the
|
|
94
|
+
agent. If you believe none applies, you must (a) state which rows you considered, (b) give a
|
|
95
|
+
one-line reason each is excluded, and (c) fall through to the **Exposure-unclear** row — the
|
|
96
|
+
default is `challenger`, never nothing. (Origin: 2026-07-21 — four dispatches in one session were
|
|
97
|
+
chosen by orchestrator judgment alone. They were right; that is luck, not a mechanism. In the same
|
|
98
|
+
session one `beginner` dispatch blocked a public-repo merge on 4 findings the author had not seen.)
|
|
99
|
+
|
|
100
|
+
**Behavioral rule — the lens does not hold the verdict.** A review pass returns `evidence`,
|
|
101
|
+
`risk`, and a `recommended decision` only. It may **not** emit a terminal `block`/`approve`; the
|
|
102
|
+
orchestrator declares the outcome, on its own stated grounds, and approval on an irreversible
|
|
103
|
+
surface stays with the human regardless of what the lens returned.
|
|
104
|
+
|
|
105
|
+
**Row-growth criterion (anti-case-crafting).** A new row is admissible only if the failure type has
|
|
106
|
+
been **observed more than once**, is **not coverable by an existing row**, and names a *verifiable
|
|
107
|
+
exposure axis* rather than a job title or a favorite tool. If rows keep accreting, that is the
|
|
108
|
+
signal to fold the table into a smaller set of principled axes — not to keep appending.
|
|
109
|
+
|
|
66
110
|
**Behavioral rule**: A `writes: false` agent (e.g. fact-checker, hub-persona-auditor) must NOT be assigned a task requiring edits. Capability fit scoring catches this statically before dispatch.
|
|
67
111
|
|
|
68
112
|
**Behavioral rule**: Degraded composition — when any required-weight role is filled with general-purpose fallback, output `⚠️ degraded: [role]` in the composition plan. Do not silently use general-purpose for a specialized role.
|
|
@@ -115,6 +115,7 @@ size instrument* is read. The footprint rows below apply to **both** scopes and
|
|
|
115
115
|
| **Pointer-illusion**: a CLAUDE.md "detail/detailed procedure" pointer whose target is itself an always-loaded `.claude/rules/*.md` | S-tier — the split saves zero context (rules/ auto-loads regardless); move the target out of auto-load, keep the pointer |
|
|
116
116
|
| weekly_audit 14~30 days elapsed | S-tier |
|
|
117
117
|
| weekly_audit 30+ days elapsed | M-tier |
|
|
118
|
+
| `tracks/_meta/*.md` **reference assets** (excluding dated chronological records — `fh_completed_*` · `fh_signal_*` · `frontier_digest_*` · `session_*` · `weekly_audit_*` · `*_log_*`, whose date lives in the filename by design) missing **both** a role/type tag and a version/date stamp | R-tier — taxonomy gap, not urgent. ⚠️ **Measured FP rate before you act on this**: run against FH itself 2026-07-21 it flagged **99/161 (61%)** un-narrowed and **19/26 (73%)** after narrowing — a row that flags most of a directory is noise, not signal. ⚠️ **No consumer**: grep found **no skill that reads `role`/`type` from these files**. Until one exists this is taxonomy for taxonomy's sake — treat as an inventory observation, never escalate |
|
|
118
119
|
|
|
119
120
|
**Per-unit ≠ aggregate — do not slide between them.** "Every section earns its scope" (the per-unit
|
|
120
121
|
doctrine test) and "the always-loaded total is affordable" (the budget test) are **different questions, and
|
|
@@ -229,6 +230,52 @@ FAIL, the safe direction); and the scope test reads directory *existence*, so th
|
|
|
229
230
|
field→meta (acceptable: the operator names the target, and the footprint rows apply to **both** scopes
|
|
230
231
|
regardless — but it does skip the field-only line rows).
|
|
231
232
|
|
|
233
|
+
**Context-File Taxonomy check** (mechanical grep, R-tier only — a coverage lens, not a mandate): L1 (Step 2)
|
|
234
|
+
checks `CLAUDE.md` / `.claudeignore` / `.claude/` existence, but nothing checks `tracks/_meta/*.md` context-file
|
|
235
|
+
existence or taxonomy — this adds both. Note: `tpa_schema.md` classifies this file class (`session_card`) as
|
|
236
|
+
**low** risk / "ephemeral state, low blast radius" — most `tracks/_meta/*.md` files are untagged by design, and
|
|
237
|
+
that is expected, not a defect. This check surfaces untagged files for optional triage on the subset that
|
|
238
|
+
function as durable references (e.g. `reference_next_session_starter.md`); it is not a mandate that every file
|
|
239
|
+
in the directory carry a tag.
|
|
240
|
+
|
|
241
|
+
Scan for two markers per file — a role/type tag (`role:` or `type:` in frontmatter, or a leading `# Role:`
|
|
242
|
+
line) and a version/date stamp (a `YYYY-MM-DD` date or a `version:` frontmatter key, either in the first 10
|
|
243
|
+
lines). A file missing either marker is untagged — report the file list and count; do not escalate past R
|
|
244
|
+
without a human judging whether the specific file's staleness is actually a problem.
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# find | while, not a glob — same reason as the always-loaded footprint scan above: an unmatched
|
|
248
|
+
# glob aborts under zsh, and a silent zero-match run must still report, not disappear.
|
|
249
|
+
TARGET="${1:?pass the target root explicitly — cwd is not the target}"
|
|
250
|
+
total=0; untagged=0
|
|
251
|
+
while IFS= read -r f; do
|
|
252
|
+
[ -n "$f" ] || continue
|
|
253
|
+
total=$((total + 1))
|
|
254
|
+
# 연대기 기록물은 파일명에 날짜가 있는 것이 설계다 — taxonomy 대상이 아니다(FP 원인의 78/99)
|
|
255
|
+
case "$(basename "$f")" in fh_completed_*|fh_signal_*|frontier_digest_*|session_*|weekly_audit_*|*_log_*) continue ;; esac
|
|
256
|
+
grep -qE '^(role|type):|^# ?Role:' "$f" && tag=yes || tag=no
|
|
257
|
+
head -10 "$f" | grep -qE '[0-9]{4}-[0-9]{2}-[0-9]{2}|^version:' && stamp=yes || stamp=no
|
|
258
|
+
if [ "$tag" = no ] || [ "$stamp" = no ]; then
|
|
259
|
+
untagged=$((untagged + 1))
|
|
260
|
+
echo "UNTAGGED: $f (role-tag=$tag version-stamp=$stamp)"
|
|
261
|
+
fi
|
|
262
|
+
done < <(find "$TARGET/tracks/_meta" -maxdepth 1 -name '*.md' 2>/dev/null)
|
|
263
|
+
echo "context-file-taxonomy: $untagged untagged of $total files"
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Named residuals of this scan**: `head -10` can miss a stamp in unusually long frontmatter; `^type:` is not
|
|
267
|
+
fence-scoped, so a stray body line starting `type:` outside frontmatter false-positives `tag=yes` — both push
|
|
268
|
+
toward under-reporting, not over-reporting.
|
|
269
|
+
|
|
270
|
+
Origin (2026-07-20, frontier-auto): surfaced via [Frontier Digest 2026-07-14](https://github.com/chrono-meta/forge-harness/issues/102#issuecomment-4964058520),
|
|
271
|
+
which described a durable-context-file pattern (role-tagged, versioned files shared across 50+ specialized
|
|
272
|
+
agents) citing `aimultiple.com/llm-orchestration` as its source. A `/phantom-quench` pass on 2026-07-20 found
|
|
273
|
+
that page's retrievable content does not actually discuss this pattern — the digest's citation is mis-attributed
|
|
274
|
+
and no verified primary source has been located. The qualitative taxonomy idea (role/version tagging on context
|
|
275
|
+
files) is adopted here on the digest's description alone and is `SPECULATIVE` per H1/H1-b until a verified
|
|
276
|
+
primary source is found; the "40% fewer tool calls" figure the digest also reported is not cited anywhere in
|
|
277
|
+
this check for the same reason.
|
|
278
|
+
|
|
232
279
|
### Step 3-L. Language Lint (`--lint` mode only)
|
|
233
280
|
|
|
234
281
|
> Activate with `/harness-doctor --lint` or when harvest-loop surfaces a P10-series signal. Skipped in standard runs.
|