@chrono-meta/fh-gate 1.4.32 → 1.4.34

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.32",
3
+ "version": "1.4.34",
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": [
@@ -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
 
@@ -78,6 +113,13 @@ Routing conclusion:
78
113
 
79
114
  After confirming routing path, auto-generate a new skill SKILL.md skeleton.
80
115
 
116
+ > **Reuse — need-driven scaffold**: this skeleton is also the template for Full-Harness Mode's
117
+ > field-asset scaffold (`auto_project_mapping.md §6`). There the entry is not a conflict but a
118
+ > **skill-worthy recurring pattern** (3+ reps · `#skill-candidate` · `field-harvest`); set
119
+ > `origin: field-scaffold` and replace `contention-parents` with the source pattern pointer. An
120
+ > **agent** variant emits `.claude/agents/{name}.md` (`name`/`description`/`tools` + self-contained
121
+ > prompt) instead of this SKILL.md frontmatter. The field team fills domain content; FH only scaffolds.
122
+
81
123
  ```markdown
82
124
  ---
83
125
  name: {slug}
@@ -106,13 +148,14 @@ After generating skeleton: **"I will place this draft at {path}. Shall I proceed
106
148
 
107
149
  ```
108
150
  [Contention Harvest Report]
109
- Conflicting skills: {A} vs {B}
110
- Conflict type: {Criteria / Scope / Order / Philosophy}
151
+ Conflicting sources: {A} vs {B}
152
+ Conflict type: {Criteria / Scope / Order / Philosophy / Track}
111
153
  Harvest Gate: Pass / Fail
112
154
  └ Reason: {1 line}
113
155
  New skill candidate: {name or none}
114
156
  Routing path: {fh-meta / commons / field / n/a}
115
- Next action: {generate draft / exclude / recommend improving existing skill}
157
+ Track-conflict resolution: {memory-hygiene / publishable-delta / phantom / n/a} # only for Track conflicts (Step 1-b)
158
+ Next action: {generate draft / exclude / recommend improving existing skill / route track-conflict terminal}
116
159
  ```
117
160
 
118
161
  ## Done When
@@ -122,6 +165,9 @@ All steps 1–4 completed
122
165
  + [Contention Harvest Report] output (Harvest Gate Pass/Fail stated)
123
166
  + If new skill candidate exists: SKILL.md skeleton generated + user confirmation gate complete
124
167
  + If no new skill candidate: "Exclude / recommend improving existing skill" stated and exit
168
+ + If Track conflict (Step 1-b): terminal stated — memory-hygiene (stale grounded claim) OR
169
+ publishable-delta (frontier was noise, our claim holds) OR phantom-quench (unsupported frontier
170
+ assertion). A track conflict resolving to a terminal is NOT an "exclude" — it is a routed outcome.
125
171
  ```
126
172
 
127
173
  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)
@@ -40,6 +40,34 @@ Check current cwd harness file structure and determine if FH environment (tracks
40
40
  | `.claudeignore` | S-tier — context-doctor execution recommended |
41
41
  | `.claude/` directory | M-tier (when rule files exist) |
42
42
 
43
+ ### Step 2-E. L1-E — ETCLOVG Layer Coverage *(functional-layer lens — orthogonal to the file-presence table above)*
44
+
45
+ A harness is not only files; it is **seven functional layers** (ETCLOVG — arXiv:2606.06324, a component
46
+ taxonomy *orthogonal* to FH's 6-axis process model; cross-audit
47
+ `tracks/_audit/session_2026_06_19_harnessfix-etclovg-cross-audit.md`). FH adopts only the **taxonomy as a
48
+ coverage lens** — not the paper's scoring model. A **coverage checklist, not a mandate**: not every
49
+ harness needs all seven (a read-only doc harness needs no Execution or Governance). For each layer ask
50
+ "is there an asset covering it?"; surface gaps, let the human judge if each is real for *this* harness.
51
+
52
+ | Layer | Covers | Typical FH asset | If the gap is judged real → priority hint |
53
+ |---|---|---|---|
54
+ | **E** Execution | isolated/reproducible env, bounded autonomy | Agent-dispatch isolation · goal-quench budget | advisory |
55
+ | **T** Tooling | tool discovery / selection / gating | mcp_tool_gating · plugin-recommender | advisory |
56
+ | **C** Context | what the model sees: card, memory, retrieval | session card · CATALOG · context-doctor | advisory |
57
+ | **L** Lifecycle | loops, retries, orchestration, termination | agent-composer · goal-quench | advisory |
58
+ | **O** Observability | traces / logs / cost to diagnose failures | subagent_invocations_log · audit logs · activity log | advisory |
59
+ | **V** Verification | readiness · intermediate · final · regression checks | 4-axis gate (steel/phantom/regression_guard) | higher-stakes |
60
+ | **G** Governance | permissions · approvals · audit trails | HITL gates · public-surface gate | higher-stakes |
61
+
62
+ **Relationship to the Harness-Defect Taxonomy (below)**: ETCLOVG = *component coverage* (is the layer
63
+ present?); the Defect Taxonomy = *failure modes* (is a present layer degrading?). Orthogonal — coverage vs health.
64
+
65
+ **Check class**: judged (advisory) — the presence test is mechanical, but "is this gap real for this
66
+ harness's purpose?" is a judged call, **paired** with the human review at Step 7's M-tier gate. **Never
67
+ auto-tier a missing layer into the M/S/R report** — the priority column is a *hint only if a human
68
+ confirms the gap*, never a verdict the report emits on its own; surface each gap tagged "(human-confirm)".
69
+ (FH's own weak layer is **Observability** — retrospective audit only, no runtime layer; named in the cross-audit.)
70
+
43
71
  ### Step 3. L2 — Complexity Diagnosis
44
72
 
45
73
  | Check | Verdict |
@@ -184,6 +212,11 @@ coverage (laziness) · judged-pairing rule (bias) · pre-compaction completion l
184
212
  ### 🟧 S-tier (Strongly Recommended)
185
213
  ### 🟩 R-tier (Recommended)
186
214
 
215
+ ---
216
+ ## ETCLOVG Layer Coverage (L1-E)
217
+ - Covered: [layers with an asset, e.g. E·T·C·L·V·G]
218
+ - Gaps (surfaced, never auto-tiered — each "(human-confirm)"): [e.g. "O Observability (human-confirm) — retrospective audit only, no runtime layer"] or "full coverage"
219
+
187
220
  ---
188
221
  ## L5 Pattern Analysis
189
222
  - Activity (L5-A): [list]
@@ -195,7 +228,7 @@ coverage (laziness) · judged-pairing rule (bias) · pre-compaction completion l
195
228
  - HIGH (spec-only — missing Done When): [list or "none"]
196
229
  - LOW (language patterns): [file: L{N}: "{text}" → {suggestion}]
197
230
 
198
- Diagnostic scope: L1~L3 [· L4 · L5 (FH only)] [· --lint]
231
+ Diagnostic scope: L1 (+L1-E ETCLOVG coverage) ~L3 [· L4 · L5 (FH only)] [· --lint]
199
232
  ```
200
233
 
201
234
  M-tier 0 → output "Structure healthy. Maintaining simplification trend."
@@ -255,6 +288,7 @@ Verdict: ✅ CONSISTENT · 🟧 INCONSISTENT (fix before push) · 🟩 REVIEW (i
255
288
  | Stage | Completion |
256
289
  |---|---|
257
290
  | Step 7 M/S/R prescription report output | ✅ Diagnosis complete |
291
+ | Step 2-E ETCLOVG coverage line in report (covered layers + gaps, or "full coverage") | ✅ Layer-coverage lens applied |
258
292
  | M-tier 0 + "Structure healthy" output | ✅ Diagnosis complete (no prescription needed) |
259
293
  | Step 8 weekly_audit section proposed | ✅ Integration proposal complete |
260
294
  | Step 9 Eval-First verdict output (when requested) | ✅ Promotion verdict complete |