@chrono-meta/fh-gate 1.4.31 → 1.4.33

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.md CHANGED
@@ -506,7 +506,13 @@ Closing phrase detected ("wrap up", "done", "good work", "end session", etc.)
506
506
  → ④ Memory hygiene — update stale entries + record new session findings
507
507
  → ④-b npm freshness — if any npm-shipped asset changed this session (the `package.json` `files[]`
508
508
  surface: skills · agents · README · AGENTS.md · CLAUDE.md · CHEATSHEET), **propose an npm
509
- republish**: version bump + Pre-Publish Surface Gate (`/public-surface-audit` + `/marketplace-gate`
509
+ republish**: version bump and the **same bump MUST propagate in lockstep to every
510
+ `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` version** (single-source =
511
+ `package.json`). The Codex plugin loader keys its cache path on the *plugin.json* version
512
+ (`~/.codex/plugins/cache/forge-harness/{plugin}/{version}/`), so a frozen plugin.json serves
513
+ **stale cached skills to Codex/AGENTS.md users** even after content ships (this exact 3-way
514
+ drift — fh-meta 1.4.1/1.4.11 vs npm 1.4.32 — was found + fixed 2026-06-17). Then Pre-Publish
515
+ Surface Gate (`/public-surface-audit` + `/marketplace-gate`
510
516
  Check 5) + `npm publish` + **`git tag vX.Y.Z` on the bump commit + `git push origin vX.Y.Z`**
511
517
  (tag at publish time, in lockstep with the version — keeps git tags aligned with npmjs.com so
512
518
  Releases/Tags never drift). The npm-served README and shipped skills/agents freeze at publish
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.31",
3
+ "version": "1.4.33",
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": [
@@ -66,9 +66,14 @@ Classify failure type:
66
66
  | `NOT_FOUND` | 404 / tool not available | Server down / tool removed |
67
67
  | `MALFORMED` | Parse error on response | Schema mismatch / API change |
68
68
  | `RATE_LIMIT` | 429 / quota exceeded | Too many calls |
69
+ | `ADMIN_GATED` | "instance admin approval required" / server pending org enablement / tool unavailable until approved | Capability exists; the **MCP mount** is gated behind instance/admin permission — not a transport failure. Retrying never recovers it (an admin must act) |
69
70
 
70
71
  If failure type cannot be determined: classify as `UNKNOWN`.
71
72
 
73
+ > **`ADMIN_GATED` is not a retry case.** Distinguish *capability unavailable* from *MCP transport
74
+ > unavailable*: when the block is an org/admin approval dependency, do not burn retries — route straight
75
+ > to the lower-permission substitute in Step 4 (Priority 1b).
76
+
72
77
  ---
73
78
 
74
79
  ### Step 2. Trip Decision
@@ -81,6 +86,11 @@ Count consecutive failures of the identified tool in the current session context
81
86
  | 2 | Escalate warning. Suggest checking server status. |
82
87
  | 3+ | **TRIP CIRCUIT** → output circuit open notice, block further calls to this tool |
83
88
 
89
+ > **Non-transient types trip at count 1, not 3.** `ADMIN_GATED`, `AUTH`, and `NOT_FOUND` do not recover
90
+ > on retry (an admin must act / credentials must change / the tool is gone), so counting to 3 only wastes
91
+ > calls. On the first failure of one of these types, trip immediately and go to Step 4. The 1→2→3 ramp is
92
+ > for *transient* types (`TIMEOUT`, `RATE_LIMIT`) where a later call may succeed.
93
+
84
94
  Circuit open notice format:
85
95
  ```
86
96
  ⚡ CIRCUIT OPEN — {tool-name}
@@ -113,14 +123,22 @@ Log entry format:
113
123
 
114
124
  ### Step 4. Propose Alternatives
115
125
 
116
- Present 3 fallback options ranked by effort:
126
+ Present the relevant fallback options ranked by effort (at least 3):
117
127
 
118
128
  | Priority | Alternative | When to Use |
119
129
  |---|---|---|
120
130
  | **1 — Substitute tool** | Use a different MCP tool or built-in tool that covers the same task | Tool-specific failure (NOT_FOUND, AUTH) |
131
+ | **1b — Lower-permission API / workflow substitute** | The MCP mount is gated, but the underlying capability is usually still reachable through a member-scoped path: a Personal-Access-Token REST API call, or a workflow-automation runner. Before relying on it, confirm **credential scope** (a member-level token suffices?), **audit parity** (logged where the MCP path would log?), and **behavior gap** (what the MCP path does that this does not — e.g. natural-language workflow creation vs hand-written JSON). | `ADMIN_GATED` |
121
132
  | **2 — Degrade gracefully** | Skip the MCP step, note the gap, continue with available information | TIMEOUT / RATE_LIMIT |
122
133
  | **3 — Pause and retry** | Wait for server recovery (HALF-OPEN probe after cooldown) | Transient failure (TIMEOUT, RATE_LIMIT) |
123
134
 
135
+ > **Gating carries over to the substitute** (cross-ref the external-MCP tool-gating rule
136
+ > `mcp_tool_gating.md`). A REST/API or
137
+ > workflow-automation tool adopted under Priority 1b is still an external-action surface: classify its
138
+ > calls under the same ask/allow tiers — reads are `allow (untrusted-read)` only after behavior
139
+ > confirmation; any write / send / delete / permission-change stays `ask`. Trading a gated MCP mount for
140
+ > an ungated REST token does not lower the action's risk — only its permission barrier.
141
+
124
142
  Output format:
125
143
  ```
126
144
  ## Fallback Options for {tool-name}
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: contention-layer
3
- description: When two skills or agents produce conflicting verdicts on the same output, reads the conflict as a signal rather than an error and harvests new skill candidates. Routes skills born from contention to fh-meta if they are meta-layer, to commons plugin if project-agnostic, or to field harvest if domain-specific. Triggered by "two skills conflict", "they produce different conclusions", "contention-layer", "contention harvest".
3
+ description: When two skills, agents, or independent research tracks produce conflicting verdicts on the same output, reads the conflict as a signal rather than an error and harvests new skill candidates or insight deltas. Also accepts a Dual-Track Grounding conflict — an open-frontier research track vs an internally-grounded recall track disagreeing — as a research-layer partial analogue of Non-Model Ground (the grounded track is a time-decorrelated anchor, not a non-model one). Routes skills born from contention to fh-meta if they are meta-layer, to commons plugin if project-agnostic, or to field harvest if domain-specific. Triggered by "two skills conflict", "they produce different conclusions", "contention-layer", "contention harvest", "open vs grounded contradiction", "research tracks disagree".
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Bash", "Grep", "Write"]
6
6
  model: sonnet
@@ -20,16 +20,21 @@ When two skills conflict, **harvest the signal** instead of discarding one. Find
20
20
  /contention-layer --skills A B # specify two skills for contention analysis
21
21
  ```
22
22
 
23
- Phrase triggers: "two skills conflict" · "weird when used together" · "they produce different conclusions" · "contention harvest" · "contention"
23
+ Phrase triggers: "two skills conflict" · "weird when used together" · "they produce different conclusions" · "contention harvest" · "contention" · "open vs grounded contradiction" · "research tracks disagree" · "dual-track grounding **+ conflict/disagree/contradict**" (the phrase "dual-track grounding" alone collides with `phantom-quench` on the word "grounding" — measured Step-0.5 probe #3, 2026-06-17; it fires this skill only when a conflict word co-occurs)
24
+
25
+ ```
26
+ /contention-layer --tracks open=<deep-research result> grounded=<memory/CATALOG recall> # Dual-Track Grounding
27
+ ```
24
28
 
25
29
  ## Step 1. Collect Conflict Points
26
30
 
27
- Record clearly which skills conflicted on which output, and in which direction.
31
+ Record clearly which sources conflicted on which output, and in which direction. The conflicting
32
+ **sources** may be two skills/agents, or two independent **research tracks** (Dual-Track Grounding).
28
33
 
29
34
  ```
30
- Conflicting skill A: {skill name} — verdict: {conclusion}
31
- Conflicting skill B: {skill name} — verdict: {conclusion}
32
- Conflicting output: {TC / diagnostic report / design document / ...}
35
+ Conflicting source A: {skill name / "open-frontier research"} — verdict: {conclusion}
36
+ Conflicting source B: {skill name / "internally-grounded recall"} — verdict: {conclusion}
37
+ Conflicting output: {TC / diagnostic report / design document / a factual claim / ...}
33
38
  Conflict point: {which item, by which criteria difference}
34
39
  ```
35
40
 
@@ -38,6 +43,36 @@ Conflict point: {which item, by which criteria difference}
38
43
  - `Scope conflict`: A includes, B excludes a certain domain
39
44
  - `Order conflict`: Same goal approached with different preconditions
40
45
  - `Philosophy conflict`: The measurement purpose itself differs (e.g., risk reduction vs coverage maximization)
46
+ - `Track conflict` (Dual-Track Grounding): The same claim is asserted by an **open-frontier** track
47
+ (deep-research / WebSearch over external sources) and contradicted — or unsupported — by an
48
+ **internally-grounded** track (memory / CATALOG / past-session recall). The disagreement is the signal.
49
+
50
+ ### Step 1-b. Dual-Track Grounding — Non-Model Ground at the research layer
51
+
52
+ When the input is two research tracks rather than two skills, the contention IS the mechanism: two
53
+ **time-decorrelated** anchors disagreeing exposes the agreement-bias gap that judge-only synthesis
54
+ hides (a single track, however strong, can be confidently wrong with nothing to contradict it). This is
55
+ a research-layer **partial analogue of Non-Model Ground** (`[[fh_propagation_nonmodel_ground]]`) — the
56
+ grounded track is a **time-decorrelated, provenance-bearing** anchor (written in a prior session against
57
+ recorded sources, so the present session's agreement-bias cannot silently overwrite it). It is **not** a
58
+ true non-model anchor: memory/CATALOG are model-written, so the independence is temporal + provenance,
59
+ not lineage. The honest bias-reduction is that contradicting a provenance-bearing past claim **forces an
60
+ explicit source check** (the challenger-verify pairing below) rather than a silent overwrite.
61
+
62
+ ```
63
+ Open track (frontier): deep-research / WebSearch — what the external world currently asserts
64
+ Grounded track (internal): memory + CATALOG + past-session recall — what we already established
65
+ → AGREE : low signal (corroboration) — log confidence, no harvest
66
+ → DISAGREE : HIGH signal — the open track may be newer (our claim is stale → memory-hygiene),
67
+ OR our grounded claim is right and the frontier is noise (→ a publishable delta).
68
+ Direction is a judged call; pair it with challenger-verify-before-act (source-verify
69
+ BEFORE rewriting either side — never let recency alone win) and route to harvest.
70
+ → UNSUPPORTED: the open track asserts what the grounded track has no record of, and back-trace
71
+ (phantom-quench) finds no source → treat as Phantom, not as a new fact.
72
+ ```
73
+
74
+ Dispatch shape: the two tracks run as independent calls (deep-research ∥ grounded recall — agent-composer
75
+ can parallelize), then their outputs enter Step 2 as source A / source B. The harvest gate below is unchanged.
41
76
 
42
77
  ## Step 2. Contention Essence — Harvest Gate
43
78
 
@@ -106,13 +141,14 @@ After generating skeleton: **"I will place this draft at {path}. Shall I proceed
106
141
 
107
142
  ```
108
143
  [Contention Harvest Report]
109
- Conflicting skills: {A} vs {B}
110
- Conflict type: {Criteria / Scope / Order / Philosophy}
144
+ Conflicting sources: {A} vs {B}
145
+ Conflict type: {Criteria / Scope / Order / Philosophy / Track}
111
146
  Harvest Gate: Pass / Fail
112
147
  └ Reason: {1 line}
113
148
  New skill candidate: {name or none}
114
149
  Routing path: {fh-meta / commons / field / n/a}
115
- Next action: {generate draft / exclude / recommend improving existing skill}
150
+ Track-conflict resolution: {memory-hygiene / publishable-delta / phantom / n/a} # only for Track conflicts (Step 1-b)
151
+ Next action: {generate draft / exclude / recommend improving existing skill / route track-conflict terminal}
116
152
  ```
117
153
 
118
154
  ## Done When
@@ -122,6 +158,9 @@ All steps 1–4 completed
122
158
  + [Contention Harvest Report] output (Harvest Gate Pass/Fail stated)
123
159
  + If new skill candidate exists: SKILL.md skeleton generated + user confirmation gate complete
124
160
  + If no new skill candidate: "Exclude / recommend improving existing skill" stated and exit
161
+ + If Track conflict (Step 1-b): terminal stated — memory-hygiene (stale grounded claim) OR
162
+ publishable-delta (frontier was noise, our claim holds) OR phantom-quench (unsupported frontier
163
+ assertion). A track conflict resolving to a terminal is NOT an "exclude" — it is a routed outcome.
125
164
  ```
126
165
 
127
166
  Verdict: PASS (Harvest Gate Pass — new skill skeleton generated or no candidates confirmed) | CONDITIONAL_PASS (candidates found, user confirmation pending) | FAIL (Harvest Gate Fail — collision unresolvable, no new skill justified) | ESCALATE (role boundary ambiguous, requires human judgment)
@@ -1,6 +1,16 @@
1
1
  ---
2
2
  name: phantom-quench
3
- description: The grounding member of the quench series — extracts proper nouns, numerical values, and branching conditions from artifacts (TCs, analysis reports, design documents), back-traces them to declared source files — local files by literal grep, and external cited sources (arXiv/DOI/URL and version claims) by fetch-and-support-check (the Non-Model Ground pass: a claim is grounded only when its anchor is non-model — a grep hit or a literal span from a fetched source — never another model's agreement) — and marks anything not found as a Phantom Claim (ungrounded — present in the artifact but not traceable to a declared source; not a claim that it is necessarily false), and a cited source that exists but does not support the claim as Unsupported. If steel-quench attacks output patterns (self-declarations, cushion language), phantom-quench attacks input tracing (where did this come from?). Renamed from source-grounding-audit (2026-06-06, quench-series); the old name appears here so legacy references still route to this skill (alias stub directory removed 2026-06-12). Triggered by "phantom detection", "phantom-quench", "phantom claim", "hallucinated claim detection", "source back-trace", "source audit", "verify source", "TC evidence tracing", "where did this come from", "grounding audit", "source grounding audit", "false claim detection", "citation support check", "does the source support this claim", "cited but not verified", "claim to source".
3
+ description: >-
4
+ Input-tracing grounding audit for artifacts such as test cases, analysis reports,
5
+ and design docs. Extracts proper nouns, numbers, citations, version claims, and
6
+ branching conditions, then back-traces each to declared local files by grep or to
7
+ external sources by fetch-and-support checks. Marks missing anchors as Phantom
8
+ Claims and cited-but-unsupporting anchors as Unsupported. A claim is grounded only
9
+ by non-model evidence: a local hit or literal source span, never another model's
10
+ agreement. Renamed from source-grounding-audit; old-name references still route
11
+ here. Triggered by: "phantom detection", "phantom claim", "source back-trace",
12
+ "where did this come from", "verify source", "does the source support this claim",
13
+ "grounding audit", "source grounding audit", "citation support check".
4
14
  user-invocable: true
5
15
  allowed-tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "WebFetch", "WebSearch"]
6
16
  model: sonnet
@@ -1,7 +1,16 @@
1
1
  ---
2
2
  name: steel-quench
3
3
  description: >-
4
- A meta-skill that concretizes a designer's anxiety into AI-driven all-angle challenger attacks (via fh-commons:quench-challenger) and shakes off flaws through defensive rounds. Systematically surfaces root weaknesses of near-complete projects wave by wave, guaranteeing near-human-review quality without direct human deep inspection. Wave 4 (Meta-Aware Adversary) is an advanced mode where the challenger uses its own AI nature — hallucination, context collapse, prompt injection, tool lock-in — as attack vectors. Wave-P3 (gate-passage re-attack) re-attacks an artifact on Coverage/Narrative/False-confidence right after an upstream gate declares PASS. Built-in fh-commons:quench-challenger agent outputs harness structure 6-axis attack+prescription pairs; after convergence, fh-meta:persona-innovator auto-extracts new patterns. Triggered by: "quench this", "devil's judgment", "all-angle review", "end-to-end verification", "steel quench", "deep pre-completion inspection", "shake out design anxiety", "attack from the root", "did it really pass?".
4
+ All-angle verification meta-skill for near-complete artifacts. Turns vague design
5
+ anxiety into structured challenger waves using fh-commons:quench-challenger, then
6
+ drives defense and convergence until root weaknesses, residual risks, and added
7
+ complexity are explicit. Covers standard attack/defense rounds, optional
8
+ Meta-Aware Adversary mode for AI-specific risks such as hallucination, context
9
+ collapse, prompt injection, and tool lock-in, and Wave-P3 re-attack after an
10
+ upstream gate declares PASS. Built-in outputs emphasize attack-plus-prescription
11
+ pairs and can feed fh-meta:persona-innovator after convergence. Triggered by:
12
+ "quench this", "devil's judgment", "all-angle review", "end-to-end verification",
13
+ "steel quench", "deep pre-completion inspection", "did it really pass?".
5
14
  user-invocable: true
6
15
  allowed-tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "WebSearch", "Agent"]
7
16
  model: opus