@chrono-meta/fh-gate 1.4.51 β†’ 1.4.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.claude/registry/README.md +26 -0
  2. package/.claude/registry/agent_cards.json +73 -0
  3. package/.claude-plugin/marketplace.json +25 -0
  4. package/AGENTS.md +2 -2
  5. package/CATALOG.md +6 -0
  6. package/CHEATSHEET.md +1 -0
  7. package/CLAUDE.md +21 -11
  8. package/README.md +12 -1
  9. package/bin/fh-codex-doctor.js +419 -0
  10. package/docs/codex-compat.md +18 -4
  11. package/knowledge/shared/harness-core/capability_escalation_consent.md +7 -0
  12. package/knowledge/shared/harness-core/claude_md_gate_details.md +15 -8
  13. package/knowledge/shared/harness-core/deep_research_capability_ladder.md +1 -1
  14. package/knowledge/shared/harness-core/fh_detail_protocols.md +4 -0
  15. package/knowledge/shared/harness-core/loop_engineering.md +80 -0
  16. package/knowledge/shared/harness-core/multi_model_sidecar_strategy.md +5 -1
  17. package/knowledge/shared/harness-core/self_evolution_routine.md +17 -12
  18. package/knowledge/shared/harness-core/sonnet_floor_doctrine.md +132 -0
  19. package/package.json +11 -3
  20. package/plugins/fh-commons/.claude-plugin/plugin.json +23 -0
  21. package/plugins/fh-commons/skills/deliberation/SKILL.md +1 -1
  22. package/plugins/fh-meta/.claude-plugin/plugin.json +36 -0
  23. package/plugins/fh-meta/skills/agent-composer/SKILL.md +1 -1
  24. package/plugins/fh-meta/skills/apex-review/SKILL.md +1 -1
  25. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +1 -1
  26. package/plugins/fh-meta/skills/context-doctor/SKILL.md +1 -1
  27. package/plugins/fh-meta/skills/harvest-loop/SKILL.md +1 -1
  28. package/plugins/fh-meta/skills/install-wizard/SKILL.md +1 -1
  29. package/plugins/fh-meta/skills/meta-prompt-builder/SKILL.md +1 -1
  30. package/plugins/fh-meta/skills/sim-conductor/SKILL.md +1 -1
  31. package/plugins/fh-meta/skills/steel-quench/SKILL.md +1 -1
  32. package/plugins/fh-meta/skills/verify-bidirectional/SKILL.md +1 -1
  33. package/scripts/count_check.sh +95 -0
  34. package/scripts/selfcheck.sh +27 -20
  35. package/templates/CLAUDE.md +87 -0
  36. package/templates/local_fh_context.md +18 -0
@@ -32,7 +32,7 @@ Three platform facts shape the design below:
32
32
  β†’ post the digest as a COMMENT on the standing Issue "πŸ›°οΈ Frontier Digest Log"
33
33
  β†’ no repo commit, no PR (cheap, ephemeral-safe)
34
34
 
35
- [Weekly Routine] (schedule: weekly, model: OPUS β€” required, see Β§4 floor note)
35
+ [Weekly Routine] (schedule: weekly, model: opus preferred / sonnet first-class, see Β§4 floor note)
36
36
  β‘  read the last 7 days of comments on the "πŸ›°οΈ Frontier Digest Log" issue
37
37
  β‘‘ persona-innovator Mode F β€” gap + external-frontier scan against current FH assets
38
38
  β‘’ pick AT MOST ONE concrete, scoped improvement candidate (or none β€” "no proposal this week" is valid)
@@ -79,17 +79,22 @@ bash templates/regression_guard.sh --pr "$(git branch --show-current)" # Axis
79
79
  # Axis 4 edit-manifest RECORD β†’ append today's predicted-impact line to tracks/_meta/edit_manifest.yaml
80
80
  ```
81
81
 
82
- **Floor note β€” why the weekly routine MUST be opus (load-bearing).** The pre-commit hook cross-checks
83
- the marker's `axis2-model` against `floor-status`: a `sonnet`/`haiku` model claiming `at-floor` or
84
- `above-floor` is **rejected**, and `below-floor` is rejected too **unless** a `below-floor-ack:` line
85
- quotes a live operator utterance. A routine runs with **no human online**, so there is no utterance to
86
- quote β€” meaning a Sonnet weekly run **cannot legally pass the gate and cannot commit**. That dead-end
87
- is itself a hazard: under "produce a draft PR" pressure a session may improvise an unsanctioned escape
88
- (fabricate an ack, mislabel the floor, `--no-verify`). **Pin the weekly routine to opus** so the
89
- honest marker is `floor-status: at-floor` and the gate passes unattended. (If opus is ever unavailable
90
- in routines, the sanctioned fallback is: do **not** commit β€” attach the proposed patch to a draft PR
91
- opened via the GitHub tools as a diff in the PR body / a patch file, bypassing the local hook, and
92
- label it `gate: deferred β€” opus re-run needed` for the operator. Never `--no-verify`.)
82
+ **Floor note β€” dispatch-first, Sonnet first-class (re-semanticized 2026-07-10, Sonnet-Floor
83
+ Doctrine).** The pre-commit hook cross-checks the marker's `axis2-model` against `floor-status`.
84
+ The routine's honest, unattended paths in preference order:
85
+ 1. **Dispatch the Axis-2 audit** (cross-family sidecar or an opus sub-agent, consent permitting) β€”
86
+ marker is `floor-status: at-floor` with the dispatched engine recorded; strongest and preferred.
87
+ 2. **Opus inline** (when the routine session itself runs at opus) β€” `at-floor`, as before.
88
+ 3. **Sonnet inline** β€” first-class, no operator utterance needed: `floor-status: sonnet-floor` +
89
+ an `axis2-anchor:` line naming the mechanical evidence that grounds the judged verdict (a
90
+ regression test, scan output, probe count). The marker auto-enters the weekly re-validation
91
+ queue (`below_floor_scan.sh`, R-tier advisory). The old dead-end β€” "a Sonnet run cannot legally
92
+ commit, so it improvises an escape" β€” is gone *because* the sanctioned lane exists; the anchor
93
+ requirement is what keeps the lane from being a free pass.
94
+ Sub-Sonnet tiers remain `below-floor` + operator ack (a routine with no human online genuinely
95
+ cannot pass there β€” that residual is intended). If no anchor can be produced at Sonnet either, the
96
+ fallback stays: do **not** commit β€” attach the patch to a draft PR opened via the GitHub tools,
97
+ label it `gate: deferred β€” floor re-run needed`. Never `--no-verify`.
93
98
 
94
99
  **Marker carve-out (the one sanctioned `tracks/**` write).** The two gate files
95
100
  (`tracks/_meta/.axes_23_passed_*.marker` and `tracks/_meta/edit_manifest.yaml`) live under gitignored
@@ -0,0 +1,132 @@
1
+ # Sonnet-Floor Doctrine β€” the harness's optimization target
2
+
3
+ > **Canonical axiom node** (operator-declared 2026-07-10). Short by design: this file names the
4
+ > invariant, its defect class, and the prescription ladder. The operating mechanics live in their
5
+ > existing homes β€” floor resolution & dispatch: `multi_model_sidecar_strategy.md Β§Tier-floor`
6
+ > (F1/F2, "Sonnet-main + Opus-dispatch"); escalation consent: `capability_escalation_consent.md`;
7
+ > mechanical enforcement: `templates/.git-hooks/pre-commit` (Axis-2 floor fields) +
8
+ > `scripts/below_floor_scan.sh`. Do not restate their details here; do not restate this axiom there.
9
+
10
+ ## The invariant
11
+
12
+ **FH's base operation must run 100% at Sonnet-tier.** Every gate, onboarding path, diagnostic,
13
+ close-chain step, and skill must fire and complete on Sonnet 5. A capability that is only
14
+ discoverable, or only fires, on Opus/Fable-tier is a **harness defect** β€” the same severity class
15
+ as a phantom reference. A harness exists to hold quality high *on weaker models*; if it needs the
16
+ strongest model to work at all, it has failed as a harness.
17
+
18
+ **Escalation is dispatch, never substrate.** Depth beyond Sonnet's ceiling is reached by
19
+ *recommending* a dispatch β€” an Opus/Fable same-family sub-agent, or a cross-family sidecar
20
+ (codex / agy) β€” consent-gated per `capability_escalation_consent.md`. The session substrate stays
21
+ whatever the operator chose. A Sonnet-only environment is a **first-class mode**: run everything at
22
+ Sonnet, extract the harness's maximum, and name residuals honestly (below-floor / sonnet-floor
23
+ markers) β€” never silently drop a capability.
24
+
25
+ ## Why this is the optimization target (measured, not aspirational)
26
+
27
+ - **H1 (2026-07-05)**: the anchor-emit harness reduced borderline verdict flips **more on weaker
28
+ models** β€” Flash βˆ’18.5pp vs Pro βˆ’11.1pp (within-model deltas, 3-measurement convergence). The
29
+ harness's value peaks exactly where the model is weakest; optimizing FH for the strong tier
30
+ optimizes it where it matters least.
31
+ - **Every confirmed Sonnet-tier miss in FH history was closed by mechanization or salience
32
+ hardening, never by requiring a stronger model**: the task-first companion-load miss (2026-07-05
33
+ β†’ SessionStart hook), the tone salience gap (2026-07-08 β†’ recorded, prompt-layer), the
34
+ card-reconcile blind spot (2026-07-10 β†’ mtime-independent STATUS map in the hook). The doctrine
35
+ is a name for what the fix pattern already was.
36
+ - **The value does not vanish at the top tier β€” the harness complements the strongest model too**
37
+ (operator observation, 2026-07-10, same-day measured): a Sonnet blind probe caught a SIGPIPE
38
+ silent-death defect in a script the top-tier session had just written (5/5 repro), and the new
39
+ close-chain checker blocked that same top-tier session's card-last violation twice on its first
40
+ day. Structure-enforcing checks are tier-blind by construction β€” so the harness raises the floor
41
+ for weak models *and* guards the ceiling for strong ones. Weak-model benefit is the larger term
42
+ (H1), top-tier benefit is the existence proof that the harness is not scaffolding-only.
43
+
44
+ ## The defect class: tier-gated capability
45
+
46
+ When auditing (harness-doctor, weekly audit, or a dedicated census), enumerate candidates with
47
+ `bash scripts/tier_census_grep.sh <files>` (word-boundary patterns + N/A-sense hints β€” mechanized
48
+ 2026-07-10 after a probe's naive grep false-positived on "fron**tier**"), then classify every hit:
49
+
50
+ | Class | Shape | Verdict |
51
+ |---|---|---|
52
+ | **Trust-floor** | a *judgment* (skip/run, compose/rank) is trusted only at opus+; below-floor = run the check anyway or ask | **Compatible** β€” Sonnet still runs everything; degrade direction is run-or-ask, never skip |
53
+ | **Availability-gate** | a capability is *absent, blocked, or dead-ended* below a tier (hard `model:` pin, "cannot pass", opus-only judge path) | **Defect** β€” fix via the ladder below |
54
+ | **Advisory** | recommends a tier, never blocks (Mode D Model Notice, depth-escalation notices) | Compatible β€” but the recommendation direction must be **dispatch-first** (keep Sonnet + dispatch the depth), with a session pin as the secondary option |
55
+
56
+ ## Prescription ladder (for a confirmed tier-gated capability)
57
+
58
+ 1. **Mechanize** β€” move the behavior to a hook / script / exit code. Tier-independent by
59
+ construction; the strongest fix. (SessionStart load, STATUS map, pre-commit gate.)
60
+ 2. **Salience-harden** β€” split, imperative pointers, turn-0 injection; then verify with a
61
+ **Sonnet blind sim** (the target-tier sim gate's default tier *is* Sonnet for this reason).
62
+ 3. **Reclassify as dispatch** β€” if the capability is irreducibly judgment-heavy (adversarial
63
+ depth, wide design synthesis), it becomes a *dispatch surface*: at Sonnet the harness surfaces
64
+ a one-line escalation recommendation (sidecar or floor-up, consent-gated) and proceeds at the
65
+ floor with a named residual. Silent absence is never an option.
66
+
67
+ ## Floor semantics under the doctrine
68
+
69
+ - **Sonnet = the base floor.** Meeting it is `at-floor` for base operation. Judged-class verdicts
70
+ produced at Sonnet on depth-critical roles remain **provisional** (`sonnet-floor` marker,
71
+ auto-queued for the weekly audit's re-run-or-write-off pass) β€” first-class β‰  free of residuals.
72
+ - **Sub-Sonnet (Haiku, local canaries)** stays `below-floor`: canary/producer roles only, explicit
73
+ ack required on gate surfaces. The doctrine raises no ceiling and lowers no guard rails there.
74
+ - **Depth ladder on a depth turn at Sonnet** (cheapest rung first β€” effort is depth, model is
75
+ ceiling, `[[feedback_workflow_stage_effort_routing]]`): β‘  **raise reasoning effort on the same
76
+ substrate** (Sonnet medium β†’ high β€” free, no consent needed, no boundary crossed) β†’ β‘‘ dispatch
77
+ an audit/research sidecar (consent permitting β€” cross-family preferred for decorrelation) β†’
78
+ β‘’ proceed at Sonnet-high with mechanical anchors + named residual. A hard model requirement is
79
+ never a rung.
80
+
81
+ ## Autonomy at Sonnet β€” run-first, ask-last (full-potential clause, 2026-07-10)
82
+
83
+ The intended FH surface β€” including its **full autonomous potential** (goal-quench max runs,
84
+ harvest-loop full mode, overnight loops, cluster orchestration) β€” must be *executable* at
85
+ Sonnet medium-high effort, not merely available-if-a-human-answers. Two rules make that safe:
86
+
87
+ - **Trust-floor degrade order is RUN β†’ ASK, never ask-first**: where a judgment is trusted at
88
+ opus+ ("skip/run", "compose/rank"), a Sonnet session's default is to **run the full check /
89
+ present the full result** β€” the conservative branch that needs no trust. Asking is reserved for
90
+ the case where no mechanical or anchored path exists at all (a pure-judged fork with no anchor).
91
+ A Sonnet loop that stalls on "ask" when running-the-check was available has mis-degraded.
92
+ - **The defense is the gate layer, not the model tier**: FH's mechanical floors β€” pre-commit
93
+ 4-axis, pre-push Destructive-Op, prepublish scan, consent protocol, HITL irreversibility floors β€”
94
+ are tier-independent hooks. They hold *regardless of who is driving*, which is precisely what
95
+ makes Sonnet full-autonomy safe: **autonomy removes the prompt, never the gate** (the same
96
+ clause the Autopilot's full-autonomy mode already carries). Irreversible-surface HITL floors are
97
+ surface-class rules and do not scale down with tier β€” a Sonnet loop gets the same hard walls,
98
+ not softer ones.
99
+
100
+ ## What survives model evolution β€” the durable-mechanization criterion (operator insight, 2026-07-10)
101
+
102
+ Sidecar dispatch is the *cheap* way to chase LLM evolution (swap the engine, keep the harness), and
103
+ internal mechanization could chase capability gaps forever β€” so which mechanization is worth
104
+ building? Split by **what the mechanization compensates for**:
105
+
106
+ | Class | Compensates for | Fate as models improve | Examples |
107
+ |---|---|---|---|
108
+ | **Capability-compensating** | the model being *weak* β€” reasoning depth, salience, attention discipline | **evaporates** β€” scaffolding to shed (`[[feedback_frontier_substrate_self_adaptation]]`); build only on measured misses, keep cheap to delete | salience splits Β· turn-0 imperatives Β· word-boundary grep discipline (partially β€” see note) |
109
+ | **Structure-enforcing** | what a *perfect* model still cannot see or is still incentivized to fumble: information outside the context boundary (cross-machine state, version drift), ordering invariants across ephemeral contexts, ship-pressure optimism, irreversible surfaces | **permanent** β€” model evolution never fixes "the card lives on another machine" or "the runner controls what the hook sees" | STATUS map (machine boundary) Β· card-last check (ordering invariant) Β· substrate-jump detector (out-of-context drift) Β· fail-closed gates Β· consent floors |
110
+
111
+ **The test question when proposing mechanization: "would an infinitely strong model still miss
112
+ this?"** Yes β†’ structure-enforcing, build it, it compounds. No β†’ capability-compensating, prefer
113
+ dispatch first, mechanize only on a measured miss, and tag it shed-eligible (the substrate loop's
114
+ shed/advance pass is its consumer).
115
+
116
+ *Note on determinism*: some capability-class tools survive anyway because they are **cheaper and
117
+ deterministic** (a grep never has an attention lapse and costs nothing) β€” determinism is a second
118
+ survival axis, orthogonal to capability. A deterministic check that replaces a per-session judged
119
+ step keeps paying even when the model no longer needs the help.
120
+
121
+ ## Done When (for any change citing this doctrine)
122
+
123
+ - No availability-gate remains in the touched surface *(check class: measured β€” tier-reference
124
+ census grep, classify per the table)*.
125
+ - Salience-dependent changes pass a Sonnet blind sim *(measured β€” sim verdict recorded in the
126
+ Axes 2–3 marker)*.
127
+ - Depth needs express as dispatch recommendations, not requirements *(judged, pair: adversarial
128
+ review asks "where does this silently require opus?")*.
129
+
130
+ Cross-refs: `[[feedback_tier_invariant_over_treadmill]]` Β· `[[feedback_harness_aerodynamics_perceived_perf]]`
131
+ Β· `[[feedback_fh_rides_on_cc_harness]]` Β· `[[feedback_h1_two_tier_closure]]` Β· `loop_engineering.md`
132
+ (PROSE legs are where Sonnet-tier misses live β€” the two lenses share one spine).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.51",
3
+ "version": "1.4.53",
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": [
@@ -20,10 +20,11 @@
20
20
  "bin": {
21
21
  "fh-gate": "bin/fh-gate.js",
22
22
  "fh-run": "bin/fh-run.js",
23
- "fh-goal": "bin/fh-goal.js"
23
+ "fh-goal": "bin/fh-goal.js",
24
+ "fh-codex-doctor": "bin/fh-codex-doctor.js"
24
25
  },
25
26
  "scripts": {
26
- "prepare": "chmod +x bin/fh-gate.js bin/fh-run.js bin/fh-goal.js scripts/fh-gate.sh scripts/fh-run.sh scripts/fh-goal.sh",
27
+ "prepare": "chmod +x bin/fh-gate.js bin/fh-run.js bin/fh-goal.js bin/fh-codex-doctor.js scripts/fh-gate.sh scripts/fh-run.sh scripts/fh-goal.sh",
27
28
  "test": "bash scripts/selfcheck.sh",
28
29
  "prepublishOnly": "bash scripts/selfcheck.sh && bash scripts/public_surface_scan_files.sh",
29
30
  "release": "bash scripts/public_surface_scan_files.sh && npm publish"
@@ -45,10 +46,13 @@
45
46
  },
46
47
  "files": [
47
48
  "AGENTS.md",
49
+ ".claude-plugin/marketplace.json",
48
50
  "CATALOG.md",
49
51
  "CHEATSHEET.md",
50
52
  "CLAUDE.md",
53
+ ".claude/registry/agent_cards.json",
51
54
  "docs/CONTRIBUTING.md",
55
+ "bin/fh-codex-doctor.js",
52
56
  "bin/fh-gate.js",
53
57
  "bin/fh-run.js",
54
58
  "bin/fh-goal.js",
@@ -57,9 +61,13 @@
57
61
  "scripts/fh-gate.sh",
58
62
  "scripts/fh-run.sh",
59
63
  "scripts/fh-goal.sh",
64
+ "scripts/count_check.sh",
60
65
  "scripts/selfcheck.sh",
66
+ "templates/local_fh_context.md",
67
+ "plugins/fh-meta/.claude-plugin/plugin.json",
61
68
  "plugins/fh-meta/skills",
62
69
  "plugins/fh-meta/agents",
70
+ "plugins/fh-commons/.claude-plugin/plugin.json",
63
71
  "plugins/fh-commons/skills",
64
72
  "plugins/fh-commons/agents",
65
73
  "knowledge/shared/harness-core",
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "fh-commons",
3
+ "version": "1.4.53",
4
+ "engines": {
5
+ "claudeCode": ">=1.0.0"
6
+ },
7
+ "description": "Cross-project utility skill bundle β€” 4 skills + 1 agent. Domain-agnostic and portable: convergence-loop, deliberation, mcp-circuit-breaker, token-budget-gate + quench-challenger agent.",
8
+ "author": {
9
+ "name": "chrono-meta",
10
+ "email": "chrono-meta@users.noreply.github.com"
11
+ },
12
+ "keywords": [
13
+ "commons",
14
+ "convergence-loop",
15
+ "gate-reinforcement",
16
+ "multi-round-validation",
17
+ "deliberation",
18
+ "multi-perspective-synthesis",
19
+ "forge-skill",
20
+ "domain-agnostic",
21
+ "cross-project"
22
+ ]
23
+ }
@@ -3,7 +3,7 @@ name: deliberation
3
3
  description: Multi-perspective synthesis structure β€” Innovator (propose) β†’ Devil-Advocate (challenge) β†’ Mediator (synthesize) 3-layer execution. Outputs conditional verdicts without binary win/loss. Activates on "deliberation", "battle this out", "weigh the pros and cons", "review from multiple angles", "which side is right?". Optional deep-insight persona jurors for domain-specific views. Designed for design decisions, skill proposals, and architectural choices.
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Bash", "Agent"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  origin: fh-meta
8
8
  ---
9
9
 
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "fh-meta",
3
+ "version": "1.4.53",
4
+ "engines": {
5
+ "claudeCode": ">=1.0.0"
6
+ },
7
+ "description": "Hub meta-engineering toolkit β€” 33 skills + 7 agents. 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 gains a command-output axis β€” routes to a command-output proxy/hook (rtk) to trim verbose CLI stdout, complementing .claudeignore; risk-gated to token-scarce environments (lossy filtering, off gate-input paths). 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 scaffolds the companion store as a queryable wiki (INDEX + session-start read + Raw/Wiki/Conversation ingest axis). New in 1.4.39: auto-decorrelation (cross-family verifier sidecar recruitment, calibration-gated) + video-ingest (capability-routed video ingestion). New in 1.4.37: corpus-grounding-expander + persona-roster-expander (field-harvested verbatim-relay capability skills). New in 1.3.0: public-surface-audit (git-tracked private-token leak scan), field-harvest Mode B session-end auto-trigger, 4-axis gate scope extension (docs/ + AGENTS.md). New in 1.2.0: pipeline-conductor (4-pipeline gated sweep), return-path-gate (chain closure audit), goal-quench (Stop hook + quality gate), steel-quench Wave 5 (multi-model sidecar challenger), 2-layer architecture docs, YAML validation script. Validated cross-CLI: Claude Code, Codex, Gemini.",
8
+ "author": {
9
+ "name": "chrono-meta",
10
+ "email": "chrono-meta@users.noreply.github.com"
11
+ },
12
+ "keywords": [
13
+ "hub-meta",
14
+ "fact-check",
15
+ "self-verification",
16
+ "bidirectional-validation",
17
+ "cross-ecosystem-synergy",
18
+ "plugin-recommender",
19
+ "pr-review",
20
+ "harness-engineering",
21
+ "ai-collaboration",
22
+ "token-efficiency",
23
+ "context-doctor",
24
+ "harness-doctor",
25
+ "install-doctor",
26
+ "install-conflict-detection",
27
+ "install-wizard",
28
+ "onboarding-automation",
29
+ "marketplace-gate",
30
+ "marketplace-readiness",
31
+ "meta-prompt-builder",
32
+ "prompt-delegation",
33
+ "circular-validation",
34
+ "2d-adversary"
35
+ ]
36
+ }
@@ -3,7 +3,7 @@ name: agent-composer
3
3
  description: Reads the current work context and plans the optimal agent dispatch. Clarifies direction with 1-2 questions when unclear; infers and proceeds immediately when execution path is unclear. Runs an automatic recording gate after each Wave completes. Triggered by "compose agents", "which agent should I use?", "run in parallel", or "agent-composer".
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Bash", "Glob", "Grep"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  ---
8
8
 
9
9
  # agent-composer β€” Agent Composition Layer
@@ -3,7 +3,7 @@ name: apex-review
3
3
  description: Reviews a technical proposal from the perspective of organizational decision-makers (CTO, technical lead, QA lead, conference reviewers, etc.) and generates an HTML presentation deck. Outputs approval gate results per persona and connects to sim-conductor for improvement suggestions.
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Write", "Bash", "Agent"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  ---
8
8
 
9
9
  # apex-review β€” Decision-Maker Review Layer
@@ -3,7 +3,7 @@ name: auto-decorrelation
3
3
  description: Recruits cross-family verifier sidecars (codex, agy, local 4090 over Tailscale) for adversarial verification of load-bearing changes, maximizing model-family diversity against the orchestrator. Mechanically discovers the available sidecar panel, recruits at least one cross-family verifier when present, and degrades gracefully when none are. The governor (Claude) keeps the terminal verdict; sidecar findings must be source-grounded before acceptance. Opt-in via one-time consent, stored in the UAP; fires only on load-bearing changes. Triggered by "recruit a cross-family check", "decorrelate this verification", "use the idle sidecars to verify", "auto-decorrelation".
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Bash", "Grep", "Glob"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  ---
8
8
 
9
9
  # auto-decorrelation β€” Cross-Family Verifier Recruitment
@@ -94,7 +94,7 @@ When context is near the limit and you want to *preserve state* rather than rese
94
94
 
95
95
  | Current task | Recommended | Command |
96
96
  |---|---|---|
97
- | Complex design decisions Β· architecture review | Opus | `/model opus` |
97
+ | Complex design decisions Β· architecture review | Opus β€” dispatch-first: package into an opus/sidecar agent dispatch (consent-gated); session pin secondary | dispatch Β· or `/model opus` |
98
98
  | Code writing Β· file editing Β· refactoring | Sonnet (default) | β€” |
99
99
  | Simple file lookup Β· short Q&A | Haiku | `/model haiku` |
100
100
 
@@ -3,7 +3,7 @@ name: harvest-loop
3
3
  description: A self-evolution pipeline that runs automatically after field sessions end. field-harvest (pattern extraction) β†’ contention-layer (collision signals) β†’ [Agent(subagent_type="challenger") + persona-innovator parallel] β†’ synthesizer (challenger/innovator collision harvest) β†’ Critic isolated Agent (SAGE automated critique) β†’ harness-doctor (health check) β†’ verify-bidirectional (consistency validation) β†’ curator (skill lifecycle management) β€” 8 steps. Session learnings are automatically absorbed back into the FH ecosystem so the harness evolves on its own. In the main development environment, runs automatically at session end. For external FH users, proposes execution first. Triggered by "session harvest", "learning absorption", "fh evolution", or "harvest-loop". (The phrase "run the pipeline" is ceded to pipeline-conductor to avoid a trigger collision β€” for end-to-end verification sweeps use pipeline-conductor.)
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Write", "Bash", "Grep", "Glob", "Agent"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  ---
8
8
 
9
9
  # harvest-loop β€” Field Session β†’ FH Self-Evolution Pipeline
@@ -3,7 +3,7 @@ name: install-wizard
3
3
  description: Run when setting up a new project for the first time or onboarding after installing FH (first setup, initial configuration, onboarding start, configure project, help me set up). Performs environment detection β†’ gap diagnosis β†’ item-by-item suggestions β†’ user approval β†’ execution β†’ acceleration baseline setup in sequence. Use --dry-run to output diagnosis report only (bg dispatch compatible).
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Write", "Bash", "Glob", "Grep", "Edit"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  category: Composability Gate
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: meta-prompt-builder
3
3
  description: Generates structured prompts to send to each agent in an agent dispatch plan. Triggered by "write the instructions", "what do I say to the agent?", "write the prompt for me", "meta-prompt-builder". Bridges agent-composer (which agents) and prompt content (what to say). Uses Goal/Context/Constraints/Done When structure.
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Bash", "Glob", "Grep"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  ---
8
8
 
9
9
  # meta-prompt-builder β€” Prompt Delegation Skill
@@ -3,7 +3,7 @@ name: sim-conductor
3
3
  description: Autonomously runs external user reaction simulations, internal audits, ideation scans, artifact validation, and quality reviews. Profiles the target artifact first, then derives task-appropriate personas, dispatches them as parallel agents, classifies findings into M/S/R tiers, and completes the pipeline through to commit automatically.
4
4
  user-invocable: true
5
5
  allowed-tools: ["Read", "Write", "Bash", "Grep", "Glob", "Agent"]
6
- model: opus
6
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
7
7
  ---
8
8
 
9
9
  # sim-conductor β€” Meta-Simulation Automation Orchestrator
@@ -13,7 +13,7 @@ description: >-
13
13
  "steel quench", "deep pre-completion inspection", "did it really pass?".
14
14
  user-invocable: true
15
15
  allowed-tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "WebSearch", "Agent"]
16
- model: opus
16
+ model-note: session-inherit β€” Sonnet base is first-class (sonnet_floor_doctrine.md); depth-critical judged steps route to dispatch (opus agent / cross-family sidecar, consent-gated), never a substrate requirement
17
17
  ---
18
18
 
19
19
  # steel-quench β€” All-Angle Verification Meta-Skill
@@ -10,7 +10,7 @@ complexity_routing:
10
10
  escalate_when:
11
11
  - full_revalidation
12
12
  - high_stakes
13
- - fail_verdict # AI recommendation was wrong β†’ baseline overwrite is high-stakes, never stay at sonnet
13
+ - fail_verdict # AI recommendation was wrong β†’ baseline overwrite is high-stakes: at Sonnet, bind the overwrite to a mechanical anchor (diff review + source re-check) and RECOMMEND an opus/sidecar dispatch (consent-gated) β€” Sonnet+anchor is a legitimate path (sonnet_floor_doctrine.md), silent judged-only overwrite is not
14
14
  ---
15
15
 
16
16
  # verify-bidirectional β€” Bidirectional Self-Validation Automation
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env bash
2
+ # count_check.sh β€” skill/agent count-consistency check (single source).
3
+ # Class: mandatory-pass (harness_6axis_framework.md Β§Axis 5) β€” exit 1 on drift.
4
+ #
5
+ # Called by ALL THREE count-consistency boundaries so one logic runs everywhere:
6
+ # - scripts/selfcheck.sh β†’ publish-readiness (prepublishOnly + npm test)
7
+ # - templates/.git-hooks/pre-commit β†’ local commit time, `--staged` (index mode)
8
+ # - .github/workflows/validate.yml β†’ PR/merge boundary (checked-out tree == committed)
9
+ #
10
+ # Origin (fh_signal_2026-06-21): the count check used to live ONLY at the publish boundary.
11
+ # But the actor that breaks it β€” a commit/merge that adds/removes a skill dir β€” acts at
12
+ # commit/merge time, so a skill-adding PR (#111) merged with stale counts and they sat
13
+ # undetected on main until the next publish. This is the gate-locality gap (a gate must
14
+ # live where the breaking action happens). One source, three boundaries, no reinvention.
15
+ #
16
+ # Modes:
17
+ # (default) count the WORKING TREE β€” selfcheck (publish; tree == HEAD) and CI
18
+ # (a checked-out PR IS the committed state). cat/glob the on-disk files.
19
+ # --staged count the INDEX (exactly what THIS commit will contain) β€” the pre-commit
20
+ # hook. Fixes steel-quench S1 (2026-06-21): a worktree-only count can
21
+ # FALSE-PASS a commit that stages a skill add but leaves the count-file
22
+ # updates unstaged β€” the gate would verify a different tree than it commits.
23
+ set -u
24
+ cd "$(dirname "${BASH_SOURCE[0]}")/.." || { echo "COUNT-CHECK: FAIL (cannot cd to repo root)"; exit 1; }
25
+
26
+ MODE="worktree"
27
+ [ "${1:-}" = "--staged" ] && MODE="staged"
28
+ fail=0
29
+
30
+ # Read a tracked file's content from the active tree (index in --staged, disk otherwise).
31
+ read_tree() { # read_tree <path>
32
+ if [ "$MODE" = staged ]; then git show ":$1" 2>/dev/null; else cat "$1" 2>/dev/null; fi
33
+ }
34
+ # List a plugin's top-level SKILL.md paths in the active tree.
35
+ list_skills() { # list_skills <plugin>
36
+ if [ "$MODE" = staged ]; then
37
+ git ls-files --cached -- "plugins/$1/skills" 2>/dev/null \
38
+ | grep -E "^plugins/$1/skills/[^/]+/SKILL\.md$"
39
+ else
40
+ local s
41
+ for s in plugins/"$1"/skills/*/SKILL.md; do [ -f "$s" ] && echo "$s"; done
42
+ fi
43
+ }
44
+ # Count a plugin's top-level agent .md files in the active tree.
45
+ count_agents() { # count_agents <plugin>
46
+ if [ "$MODE" = staged ]; then
47
+ git ls-files --cached -- "plugins/$1/agents" 2>/dev/null \
48
+ | grep -cE "^plugins/$1/agents/[^/]+\.md$"
49
+ else
50
+ ls plugins/"$1"/agents/*.md 2>/dev/null | wc -l | tr -d ' '
51
+ fi
52
+ }
53
+ # Active skill = SKILL.md whose head (first 20 lines) carries no deprecation marker
54
+ # (a whole-file grep false-positives on skills that merely mention the word).
55
+ count_active() { # count_active <plugin>
56
+ local n=0 s
57
+ while IFS= read -r s; do
58
+ [ -z "$s" ] && continue
59
+ read_tree "$s" | head -20 | grep -qE 'deprecated: true|DEPRECATED' || n=$((n+1))
60
+ done < <(list_skills "$1")
61
+ echo "$n"
62
+ }
63
+
64
+ meta_sk=$(count_active fh-meta); meta_ag=$(count_agents fh-meta)
65
+ com_sk=$(count_active fh-commons); com_ag=$(count_agents fh-commons)
66
+ total_sk=$((meta_sk + com_sk)); total_ag=$((meta_ag + com_ag))
67
+
68
+ # Impossible-zero guard (steel-quench A4 β€” fail CLOSED): fh-meta always has active skills.
69
+ # A 0 means the tree/glob resolved to nothing (wrong cwd, empty index, sh-as-bash shim) β€”
70
+ # a gate must never return "consistent" from an empty tree.
71
+ if [ "$meta_sk" -eq 0 ]; then
72
+ echo "COUNT-CHECK: FAIL (0 active fh-meta skills β€” empty/wrong tree, mode=$MODE)"
73
+ exit 1
74
+ fi
75
+
76
+ count_check() { # count_check <label> <file> <expected-string>
77
+ if read_tree "$2" | grep -q "$3"; then
78
+ echo "PASS count: $1"
79
+ else
80
+ echo "FAIL count: $1 β€” expected \"$3\" in $2 (actual: fh-meta ${meta_sk}sk/${meta_ag}ag, fh-commons ${com_sk}sk/${com_ag}ag)"
81
+ fail=1
82
+ fi
83
+ }
84
+ count_check "fh-meta plugin.json" plugins/fh-meta/.claude-plugin/plugin.json "${meta_sk} skills + ${meta_ag} agents"
85
+ count_check "fh-commons plugin.json" plugins/fh-commons/.claude-plugin/plugin.json "${com_sk} skills"
86
+ count_check "marketplace.json fh-meta" .claude-plugin/marketplace.json "${meta_sk} skills + ${meta_ag} agents"
87
+ count_check "README header" README.md "${total_sk} skills Β· ${total_ag} agents"
88
+ count_check "local_fh_context fh-meta" templates/local_fh_context.md "(fh-meta, ${meta_sk})"
89
+
90
+ if [ "$fail" -ne 0 ]; then
91
+ echo "COUNT-CHECK: FAIL"
92
+ exit 1
93
+ fi
94
+ echo "COUNT-CHECK: PASS (mode=$MODE)"
95
+ exit 0
@@ -25,6 +25,11 @@ for f in bin/*.js; do
25
25
  check "node --check $f" node --check "$f"
26
26
  done
27
27
 
28
+ # Codex adapter drift: the thin Codex runtime must keep reading canonical FH
29
+ # skill/agent surfaces without silently accepting Claude-native primitives as
30
+ # Codex-native.
31
+ check "fh-codex-doctor --strict" bash -c 'node bin/fh-codex-doctor.js --strict >/dev/null'
32
+
28
33
  # Bash surface: npm-shipped scripts + local bin wrappers + gate-chain infra
29
34
  for f in scripts/*.sh bin/fh-gate bin/fh-run bin/fh-goal \
30
35
  templates/regression_guard.sh templates/temper_check.sh templates/predelete_check.sh templates/.git-hooks/pre-commit; do
@@ -43,26 +48,28 @@ if ! bash scripts/count_check.sh; then
43
48
  fail=1
44
49
  fi
45
50
 
46
- # Referenced-path existence: backtick-quoted repo-relative file refs in the always-loaded
47
- # governance surface (CLAUDE.md + .claude/rules/*.md) must exist. Phantom-reference class
48
- # recurred N>=3 in the 2026-06-11 audit window (operations.md _scanner.sh, claude-chrono path,
49
- # stale templates ref) β€” instrument-not-habit. Globs/placeholders/{vars} are excluded by the
50
- # filter; tracks/ is machine-local and deliberately out of scope. Gitignored refs (e.g.
51
- # `.claude/settings.json` named in prose *about* gitignored files) are skipped β€” they exist
52
- # locally but not on a fresh clone, and "must exist" here means "must ship".
53
- while IFS= read -r p; do
54
- if git check-ignore -q "$p" 2>/dev/null; then
55
- echo "SKIP ref-path (gitignored): $p"
56
- elif [ -f "$p" ]; then
57
- echo "PASS ref-path: $p"
58
- else
59
- echo "FAIL ref-path: $p β€” referenced in CLAUDE.md/.claude/rules but missing"
60
- fail=1
61
- fi
62
- done < <(grep -hoE '\`[^\` ]+\`' CLAUDE.md .claude/rules/*.md 2>/dev/null \
63
- | sed 's/\`//g' \
64
- | grep -E '^(knowledge|templates|scripts|docs|plugins|\.claude)/[^*{}<>$]+\.(md|sh|ya?ml|jsonc|json)$' \
65
- | sort -u)
51
+ # Referenced-path existence is a source-tree check. The npm package intentionally
52
+ # ships a narrower runtime surface, so package-mode selfcheck skips this section.
53
+ if [ -d ".claude/rules" ]; then
54
+ # Backtick-quoted repo-relative file refs in the always-loaded governance surface
55
+ # (CLAUDE.md + .claude/rules/*.md) must exist. Phantom-reference class recurred
56
+ # N>=3 in the 2026-06-11 audit window β€” instrument-not-habit.
57
+ while IFS= read -r p; do
58
+ if git check-ignore -q "$p" 2>/dev/null; then
59
+ echo "SKIP ref-path (gitignored): $p"
60
+ elif [ -f "$p" ]; then
61
+ echo "PASS ref-path: $p"
62
+ else
63
+ echo "FAIL ref-path: $p β€” referenced in CLAUDE.md/.claude/rules but missing"
64
+ fail=1
65
+ fi
66
+ done < <(grep -hoE '\`[^\` ]+\`' CLAUDE.md .claude/rules/*.md 2>/dev/null \
67
+ | sed 's/\`//g' \
68
+ | grep -E '^(knowledge|templates|scripts|docs|plugins|\.claude)/[^*{}<>$]+\.(md|sh|ya?ml|jsonc|json)$' \
69
+ | sort -u)
70
+ else
71
+ echo "SKIP ref-path (package mode: .claude/rules absent)"
72
+ fi
66
73
 
67
74
  if [ "$fail" -ne 0 ]; then
68
75
  echo "SELFCHECK: FAIL"