@chrono-meta/fh-gate 1.4.35 → 1.4.37

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
@@ -103,17 +103,17 @@ Simplification guard: trivial denials with one obvious fix → state block + sin
103
103
 
104
104
  **4-step summary**: ① Auto-read CLAUDE.md + CATALOG + session card + registry scan + UAP (`tracks/_meta/user_adaptation_profile.md`, if present — apply user-tuned defaults: preferred tier, suppressed proposals, muted nags; see §Operational Adaptation Loop) → ② One-line proposal (new user / exploratory / returning branches) → ③ 5-skill cascade (plugin-recommender → synergy → .claudeignore → model → verify) → ④ Approval + setup
105
105
 
106
- **Greeting branch + door skeleton (summary-level — applies even if the detail file read is skipped)**: the branch test is **mechanical local state — session files under `tracks/`** — never git log / CATALOG residue (a fresh clone carries full history but zero session files: it is a NEW install — origin: a fresh-clone sonnet sim rendered the returning menu off commit messages, `fh_signal_2026-06-11` FP8). Every variant opens with **🐿️ on its own line as the skeleton's first line** the marker is part of the skeleton, one salience unit with the menu, not a separate rule.
106
+ **Greeting branch + door skeleton (summary-level — applies even if the detail file read is skipped)**: the branch test is **mechanical local state — session files under `tracks/`** — never git log / CATALOG residue (a fresh clone carries full history but zero session files: it is a NEW install — origin: a fresh-clone sonnet sim rendered the returning menu off commit messages, `fh_signal_2026-06-11` FP8). Every variant opens with **🐿️ then an identity-revealing welcome line on the SAME line** (🐿️ is no longer alone on its own line), followed by the menu — one salience unit, not a separate rule. (Put a space after 🐿️; the exact count is **not significant** — a markdown renderer collapses multiple mid-line spaces to one — so the verifiable invariant is *same-line*, NOT a space count.) Welcome line by branch: new / exploratory = "Welcome to FH." · returning = "Welcome back to FH." · operator (FH-dev state) = "The FH operator — good to see you." (rendered in the user's language; the lid/onboarding-smoothness matters even though it is not the substance).
107
107
 
108
108
  - **New user** (no session files AND no mapped project tracks under `tracks/` — fresh clone/install; underscore meta dirs `_meta`/`_audit`/`_contrib` don't count): 2-door starter, never the returning menu —
109
109
 
110
- > 🐿️
111
- > *"Looks like you're new here! ① Create your first project (guided) · ② Map an existing project — and I can run `/install-wizard` to finish initial setup."*
110
+ > 🐿️ **Welcome to FH.** *Looks like you're new here! ① Create your first project (guided) · ② Map an existing project — and I can run `/install-wizard` to finish initial setup.*
112
111
 
113
112
  - **Returning user** (session files OR mapped project tracks exist): fixed 4-door menu —
114
113
 
115
- > 🐿️
116
- > *"① Map a project · ② Create a new project · ③ Accelerate a mapped project (work · Full-Harness · skills/agents/plugins) — {field candidates} · ④ Cross-project synergy"*
114
+ > 🐿️ **Welcome back to FH.** *① Map a project · ② Create a new project · ③ Accelerate a mapped project (work · Full-Harness · skills/agents/plugins) — {field candidates} · ④ Cross-project synergy*
115
+ >
116
+ > (When **FH-dev state exists** — the operator — the welcome line is **"The FH operator — good to see you."** in place of "Welcome back to FH.")
117
117
 
118
118
  Render conditions: ①②③ always (③'s candidates composed live) · ④ only when **2+ project tracks** exist (underscore meta dirs don't count) — synergy findings flow back into each project, and may *propose* an FH contribution (`/field-harvest` → `tracks/_contrib`) as an **outcome of findings, never a standing door**.
119
119
 
@@ -121,7 +121,7 @@ Simplification guard: trivial denials with one obvious fix → state block + sin
121
121
 
122
122
  Compose session-card candidates **into door ③ (field) and the 🔧 door (FH-dev)**, never as a raw priority dump that replaces the menu. An urgent open item (time-windowed handoff · blocking external deadline) outranks the menu; an explicit task utterance skips it entirely (see Guards below); cadence reminders (§Cadence Rules) ride below it, they don't displace it. Canonical source: `fh_detail_protocols.md` Step 2 — keep branch tests and door labels in sync.
123
123
 
124
- **Identity marker**: every greeting response (Step ②) opens with 🐿️ on its own line. It is embedded in both skeletons above (do not strip it when composing doors); the exploratory branch template carries it in `fh_detail_protocols.md` Step 2.
124
+ **Identity marker**: every greeting response (Step ②) opens with 🐿️ then an identity-revealing welcome line **on the same line** (a space after 🐿️; exact count not significant — the renderer collapses it — the invariant is *same-line*, not 🐿️ alone) — new / exploratory = "Welcome to FH." · returning = "Welcome back to FH." · operator (FH-dev state) = "The FH operator — good to see you." It is embedded in all skeletons above (do not strip it when composing doors); the exploratory branch template (`fh_detail_protocols.md` Step 2) uses the "Welcome to FH." line.
125
125
 
126
126
  **Guards**: explicit task-entry utterance → skip onboarding · once per session · code/debug requests → start working directly · project routing is a suggestion, mention at most once
127
127
  **Metadata-is-not-intent guard**: the trigger is the user's **typed message only**. Session metadata — branch name (auto-derived from the first message, e.g. `claude/korean-greeting-*`), repo name, file paths — is **never** a task spec and never suppresses or redirects the greeting trigger. A bare greeting fires onboarding even when the branch name looks like a feature request; if the only "task" signal lives in metadata and not in what the user typed, treat the message as a greeting and run the greeting branch + door skeleton above.
@@ -373,6 +373,8 @@ Proposal format: `"I see [X]. Want me to run /[skill] to [one-line description]?
373
373
  | "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. |
374
374
  | "orchestrate agents", "parallel dispatch", "combine skills", "multiple agents" | `/agent-composer` |
375
375
  | "run a simulation", "external user perspective", "internal audit", "quality check" | `/sim-conductor` |
376
+ | "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` |
377
+ | "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` |
376
378
  | "first install", "FH setup", "wizard", "install-wizard" | `/install-wizard` |
377
379
  | "connect a project", "map this project", "link to hub" | `auto_project_mapping.md` (mapping) |
378
380
  | "harness-ify this project", "full harness setup", "프로젝트 하네스화", "promote to full harness" | `auto_project_mapping.md §6` (Full-Harness Mode) |
package/README.md CHANGED
@@ -182,7 +182,7 @@ All four movements ship. Temper was named before it was built — deliberately (
182
182
  two more signatures keep it running: `harvest-loop` (each session's lessons become permanent skills) and
183
183
  `agent-composer` (orchestrate the dispatch). The other skills wait until you need them — full list below.
184
184
 
185
- ## 33 skills · 8 agents
185
+ ## 35 skills · 8 agents
186
186
 
187
187
  <details>
188
188
  <summary>Full asset activation check</summary>
@@ -208,6 +208,8 @@ two more signatures keep it running: `harvest-loop` (each session's lessons beco
208
208
  | `meta-prompt-builder` | Meta prompt design | "Write a prompt for the agent" |
209
209
  | `asset-placement-gate` | Hub vs project asset routing | "Should this be shared?" |
210
210
  | `cross-ecosystem-synergy-detection` | Cross-tool synergy finder | "Are my tools working together?" |
211
+ | `corpus-grounding-expander` | Multi-version public-domain corpus → verified-axiom grounding store | "Broaden the grounded corpus" |
212
+ | `persona-roster-expander` | Persona seed → tiered, judgment-mapped cast | "Broaden these personas" |
211
213
  | `convergence-loop` *(fh-commons)* | N-round convergence loops | "Single-pass seems suspicious" |
212
214
  | `token-budget-gate` *(fh-commons)* | Pre-task token cost estimate | "How expensive is this?" |
213
215
  | `mcp-circuit-breaker` *(fh-commons)* | MCP tool failure pattern detection | "MCP keeps failing" |
@@ -283,6 +285,21 @@ recommended only for harness-editing sessions. Details: `docs/OUTPUT_EVIDENCE.md
283
285
 
284
286
  If you use external CLIs (Gemini, Codex, `gh copilot`) as sidecars, their costs are billed to their own quota and not visible in CC's token display.
285
287
 
288
+ ### Hardware tiers (local sidecars are optional accelerators)
289
+
290
+ FH needs **no local LLM** — the baseline is whatever runs Claude Code. Local models are *optional*, for
291
+ the canary / cheap-breadth rungs only:
292
+
293
+ | Tier | Spec | Runs locally | What it buys |
294
+ |---|---|---|---|
295
+ | **Minimum** | anything that runs Claude Code | nothing | full methodology + gates; operating FH is ~model-flat (Opus/Sonnet/Haiku 100/97/94) |
296
+ | **Recommended** | laptop-class, ~16GB RAM | one 8B-class quantized model (e.g. an 8B / small Gemma) | a token-free **floor canary** (pre-screen before a metered sim) · offline triage · a cheap-breadth panel arm |
297
+ | **Optional (heavy)** | ~24GB VRAM GPU | a 27–32B model | a *stronger* decorrelation canary |
298
+
299
+ > Local tiers are **canaries, never the terminal verdict** — measured: the floor model missed a subtle
300
+ > adversarial case the frontier caught (and even a 27–32B local scored 1/4 on it). They lower the *cost
301
+ > of breadth*; the verdict stays frontier.
302
+
286
303
  ---
287
304
 
288
305
  ## Multi-Model Sidecar
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.35",
3
+ "version": "1.4.37",
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": [
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: corpus-grounding-expander
3
+ description: Fetches and normalizes multi-version public-domain corpora into a single verified-axiom store for verbatim-relay grounding, recording per-version license and provenance.
4
+ user-invocable: true
5
+ allowed-tools: ["Read", "Bash", "WebFetch", "Write"]
6
+ model: sonnet
7
+ ---
8
+
9
+ # corpus-grounding-expander
10
+
11
+ Builds or broadens the **grounded axiom** a relay system quotes from. When a system's output must be
12
+ constrained to verbatim source (fail-closed grounding), the corpus IS the axiom — this skill expands
13
+ that corpus from multiple public-domain versions so grounding is robust and non-biased (a quote
14
+ verified in ANY version counts), without ever adding a generator.
15
+
16
+ > Origin: harvested from the-bible (2026-06-20) — 6 public-domain Bible versions, 197k verses, as the
17
+ > fail-closed grounding axiom. Generalizes to any verbatim-relay corpus (legal statute, RFC text,
18
+ > standards). See `tracks/_contrib/field_harvest_2026-06-20_gate-locality-and-grounding-capabilities.md`.
19
+
20
+ ## Triggers
21
+ - "get more sources" / "broaden the grounded corpus"
22
+ - "add another version of the corpus"
23
+ - "ingest the full <source> as the grounding axiom"
24
+ - `/corpus-grounding-expander {source or version}`
25
+
26
+ ### Natural Language Triggers (example user phrases)
27
+ - "이 코퍼스 여러 버전으로 통째로 가져와줘"
28
+ - "the grounding DB is just a sample — pull the whole thing, multiple editions"
29
+ - "add a second public-domain edition so we're not biased to one"
30
+
31
+ ## Steps
32
+ 1. **Source + license check** — identify the public-domain source(s) and confirm each is genuinely
33
+ free to redistribute. Record the license literally (no assumption).
34
+ 2. **Fetch (retry-disciplined)** — pull each version; on transient error, backoff-retry before
35
+ declaring the source unavailable (do not silently drop a version).
36
+ 3. **Normalize to a single key schema** — map every version to the SAME addressable key
37
+ (e.g. `ref → text`) so cross-version quotation stays aligned. Write per-version files +
38
+ an `_index` recording version id, license, scope, and record count.
39
+ 4. **Wire grounding as a union** — the grounding check passes if the quote matches the canonical text
40
+ at that key in ANY version. Never add a path that generates text — grounding is quote-only.
41
+ 5. **Relay-integrity check** — confirm the consumer (the gate) QUOTES the corpus and cannot emit
42
+ un-grounded text; run a fabrication probe (a known non-source quote must fail-closed).
43
+
44
+ ## Done When
45
+ - **Each added source carries a verifiable public-domain/license record** in the index. *Check class: mandatory-pass (binary — license field present and non-empty per version).*
46
+ - **Every version is normalized to the same key schema** (cross-version keys align). *Check class: mandatory-pass (a shared sample key resolves in each version or is explicitly canon-scoped).*
47
+ - **The index declares the quote-only union contract** (grounding matches verbatim text in ANY version; no generation path) and ships a fabrication-probe spec for the consumer to run. *Check class: mandatory-pass (binary — quote-only contract + probe-spec present in the index).*
48
+
49
+ ## Guards
50
+ - **Grounding, never a generator** — the relay constraint is structural; this skill wires *grounding*.
51
+ - **License-literal** — record the actual license per source; never assume public-domain.
52
+ - **No silent version drop** — a fetch failure is a named residual in the index, not a quiet omission.
53
+
54
+ ## Independently executable
55
+ Yes — needs only a network fetch + file write. No dependency on other FH skills (a consumer gate that
56
+ reads the corpus is the system's own, not this skill's).
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: persona-roster-expander
3
+ description: Expands a named persona seed into a tiered, judgment-mapped cast — tiering each persona by a domain safety rule, mapping each to a decision-lens in the user's vocabulary, then proposing additional voices with sourced anchors.
4
+ user-invocable: true
5
+ allowed-tools: ["Read", "Grep", "WebSearch", "WebFetch"]
6
+ model: sonnet
7
+ ---
8
+
9
+ # persona-roster-expander
10
+
11
+ Takes a seed set of named personas and turns it into a usable judgment cast: each persona tiered by a
12
+ domain safety rule, mapped to a concrete decision-lens, plus a few proposed additions filling
13
+ uncovered lenses with real anchors. An innovator-family skill — generative, but bounded by a
14
+ caller-supplied safety rule so the expansion stays faithful to the domain's constraints.
15
+
16
+ > Origin: harvested from the-bible (2026-06-20) — an operator persona seed (priest/nun/angel/devil/
17
+ > God/Jesus/Holy-Spirit/apostles) tiered relay-vs-lens by a relay-safety rule and mapped to
18
+ > engineering-judgment lenses, +4 sourced proposals. See
19
+ > `tracks/_contrib/field_harvest_2026-06-20_gate-locality-and-grounding-capabilities.md`.
20
+
21
+ ## Triggers
22
+ - "broaden these personas" / "what other voices fit this cast"
23
+ - "map these roles to a decision lens"
24
+ - "expand the persona roster and keep it faithful to <rule>"
25
+ - `/persona-roster-expander {seed personas + domain + safety rule}`
26
+
27
+ ### Natural Language Triggers (example user phrases)
28
+ - "내가 명명한 페르소나 후보군을 더 넓혀줘, 판단 매핑이랑 같이"
29
+ - "take these character archetypes and tell me what engineering judgment each one provides"
30
+ - "add a few more voices that cover a perspective these don't"
31
+
32
+ ## Steps
33
+ 1. **Collect the seed + the safety rule** — the named personas, the domain (what decisions they
34
+ reflect on), and the caller-supplied **tiering rule** (the hard constraint that decides what each
35
+ persona is allowed to do). Without an explicit safety rule, ask for one — do not invent authority.
36
+ 2. **Tier each persona** by the safety rule (e.g. relay/quote-only vs lens/framed-perspective). State
37
+ a one-line justification per persona; the tier caps what the persona may emit.
38
+ 3. **Map each to a decision-lens** in the **user's domain vocabulary** — what concrete judgment-
39
+ perspective does this voice provide, and when to invoke it. Pair any adversarial voice with a
40
+ constructive counter-voice (no adversary as the last word).
41
+ 4. **Propose 2–4 additions** filling lenses the seed doesn't cover (delegate net-new *name*
42
+ generation to the `persona-innovator` agent — this skill's distinct value is the tiering +
43
+ lens-mapping, not naming). For the strongest 2–3, find a real anchor (a sourced
44
+ example/reference), not a shallow stub.
45
+ 5. **Emit the tiered, lens-mapped cast** (named + proposed) as a structured artifact the system can
46
+ load (e.g. `personas.json`).
47
+
48
+ ## Done When
49
+ - **Every persona has a tier + lens label + invoke-condition.** *Check class: mandatory-pass (binary — all three fields present per persona).*
50
+ - **Each net-new proposal names a real anchor** (not a stub). *Check class: judged, pair: an anchor-existence check (the cited source/reference resolves).*
51
+ - **The tiering respects the caller's safety rule** (no persona exceeds its tier's allowed emission). *Check class: judged, pair: an adversarial read — find a persona whose mapping lets it act beyond its tier.*
52
+
53
+ ## Guards
54
+ - **Caller-supplied safety rule is mandatory** — the skill tiers by the domain's rule, it does not
55
+ invent one (inventing authority is the failure this guard prevents).
56
+ - **Adversary never last** — any devil's-advocate voice is paired with a constructive counter-voice.
57
+ - **Anchors must be real** — a proposal without a resolvable anchor is a stub, not a candidate.
58
+
59
+ ## Relationship to `persona-innovator` (agent)
60
+ `persona-innovator` *generates* names, frames, and frontier-absorption signals from scratch. This skill
61
+ takes an **existing seed** and adds the **tier-by-safety-rule + lens-to-domain mapping** — it is the
62
+ *structuring/governance* layer, not the *generator*. When net-new names are needed (Step 4), it
63
+ delegates to `persona-innovator` rather than reinventing generation.
64
+
65
+ ## Independently executable
66
+ Yes — needs only the seed + rule + (for anchors) web search. Delegates name *generation* to
67
+ `persona-innovator` when invoked, but has no hard dependency on it for the core tier+lens mapping.
@@ -9,7 +9,9 @@ model: opus
9
9
  # sim-conductor — Meta-Simulation Automation Orchestrator
10
10
 
11
11
  > Profiles target → derives personas → dispatches parallel agents → M/S/R triage → commit.
12
- > Personas are sourced installed-first → built-in fallback external install. Scale: 3 to 16 by task complexity.
12
+ > Personas are sourced installed-first → **filled from the persona-container schema** (6 slots, not an
13
+ > ad-hoc directive) → external install. Scale: 3 to 16, extensible to a crowd behind the
14
+ > marginal-coverage stop (§Scale).
13
15
 
14
16
  ## Invocation Triggers
15
17
 
@@ -97,12 +99,20 @@ Recommendation:
97
99
 
98
100
  #### Persona Discovery (after profile → before dispatch)
99
101
 
102
+ > **Schema**: `knowledge/shared/harness-core/persona_container_schema.md` — the 6-slot persona-definition
103
+ > container. ② below **fills** these slots (lens / internal-logic / external-grounding / output-protocol
104
+ > / cost-tier / lifecycle) instead of injecting a shapeless directive. The container is what makes a
105
+ > synthesized persona reproducible and cost-routable; the old "fallback palette" was undefined.
106
+
100
107
  After profiling, sim-conductor determines the needed perspective types, then maps each to the best available agent:
101
108
 
102
109
  ```
103
110
  For each needed perspective:
104
111
  ① Scan installed plugins + .claude/agents/ → exact match? → use it
105
- Built-in fallback palette approximate match? inject as prompt directive
112
+ Fill the 6-slot persona container lens · internal-logic · external-grounding · output-protocol
113
+ (= Step 1.5 parallax shape) · cost-tier · lifecycle → a defined, reproducible persona; the filled
114
+ container IS the dispatch prompt (replaces the old ad-hoc "fallback palette" directive). Assign
115
+ the cost-tier slot per §Scale cost-tier routing. [Schema: persona_container_schema.md]
106
116
  ③ GAP: no ①② match for a high-weight perspective
107
117
  → query /plugin-recommender: "find agents for [perspective] matching [artifact_type] context"
108
118
  → present: name · install command · estimated fit · token cost
@@ -113,8 +123,8 @@ Persona Discovery output:
113
123
 
114
124
  ```
115
125
  Persona Map:
116
- beginner → [installed agent: beginner] OR [ad-hoc directive]
117
- challenger → [installed agent: challenger] OR [ad-hoc directive]
126
+ beginner → [installed agent: beginner] OR [filled 6-slot container]
127
+ challenger → [installed agent: challenger] OR [filled 6-slot container]
118
128
  [profile-specific role] → ⚠️ GAP — plugin-recommender recommends: [X] (install? y/n)
119
129
  ```
120
130
 
@@ -203,7 +213,8 @@ sim-conductor does **not** run a fixed persona set. It derives needed perspectiv
203
213
 
204
214
  ```
205
215
  ① Installed first — scan installed plugins + .claude/agents/ for a matching persona/agent
206
- Built-in fallbackinject role as prompt directive into general-purpose Agent (Path B)
216
+ Container fillfill the 6-slot persona container for the standpoint; the filled container IS the
217
+ dispatch prompt into a general-purpose Agent (Path B — replaces the old ad-hoc role directive)
207
218
  ③ External fetch — chain to /plugin-recommender when ①② insufficient for high-stakes tasks
208
219
  ```
209
220
 
@@ -220,7 +231,7 @@ FH ships a coherent **user-mastery spectrum** as real, reusable agents (not prom
220
231
 
221
232
  > **Lineage**: `beginner` / `main-player` / `expert` are the FH-native frontier successors to the field deep-insight `user` group (newcomer / power-user) — re-derived to FH grade with embedded methodology + Done-When, not name-copied. `challenger` is the advanced form of the field `devil-advocate`. The former standalone skeptic standpoint is folded into `challenger` U1.
222
233
 
223
- **Ad-hoc roles** (② tier — prompt-directive fallback): when the profile demands a standpoint with no shipped agent (e.g. "security auditor", "non-native reader"), inject the role as a directive into a general-purpose Agent. Prefer ① shipped agents; use ② only for genuinely task-specific one-offs.
234
+ **Ad-hoc roles** (② tier — container fill): when the profile demands a standpoint with no shipped agent (e.g. "security auditor", "non-native reader"), fill the 6-slot persona container for that standpoint the filled container is the dispatch prompt. Prefer ① shipped agents; use ② only for genuinely task-specific one-offs.
224
235
 
225
236
  #### Scale
226
237
 
@@ -229,8 +240,30 @@ FH ships a coherent **user-mastery spectrum** as real, reusable agents (not prom
229
240
  | **Minimum** | 3 | Routine Area A — most task-relevant 3 perspectives |
230
241
  | **Extended** | 4–8 | High-stakes publish / external release |
231
242
  | **Full** | Up to 16 parallel | Pre-major-version / architecture review |
232
-
233
- All personas run as **parallel Agents** — no sequential bottleneck. Use agent-composer Medium/Large fan-out for Extended/Full.
243
+ | **Crowd** | 16+ — **no fixed cap; bounded by the marginal-coverage stop** | Only when the marginal-coverage stop has demonstrably **not** fired at 16 — i.e. persona #17 is still decorrelated and finding-productive. **Not** chosen by artifact size or audience count (Full already covers those); the stop, not a headcount, opens this tier |
244
+
245
+ **Crowd is output-driven, never a target** (per the container schema): the 16-cap lifts only behind the
246
+ **marginal-coverage stop** — add a persona only if it is *decorrelated* (a distinct viewpoint, or — at
247
+ crowd scale — a different model family) from those already running; **stop when the marginal new-finding
248
+ rate → 0**. A crowd of identical-output personas is decorative (steel-quench Wave-1 angle #1). Do not
249
+ name a headcount goal; the count is whatever the stop allows.
250
+
251
+ **Cost-tier routing (the economy lever)** — each persona's `cost-tier` slot routes it to a model so
252
+ breadth is cheap and the verdict stays trustworthy:
253
+ - **floor-local / heavy-local** (e.g. a local Ollama sidecar) carry cheap *breadth* — extra decorrelated
254
+ standpoints at near-zero token cost. A heavier local (27–32B) is a stronger canary than a floor model,
255
+ but **on one probe, not a benchmark** (`[[persona-container-schema]]` §tier-distribution) — so a local
256
+ tier is a **canary, never the gate**.
257
+ - **frontier** carries the **terminal verdict** — the M/S/R triage and any auto-commit decision stay
258
+ frontier. This is the same anchor as Step 0.6: local breadth *decorrelates*, it does not *decide*.
259
+ - Cost-tier routing and the Step 0.6 cross-model gate are complementary, not duplicate: 0.6 *requires* a
260
+ non-session source for risk≥medium (blind-spot closure); cost-tier *distributes* breadth for economy.
261
+ A local-sidecar persona can satisfy both at once (cross-family **and** cheap), but only Step 0.6's
262
+ quoted-artifact rule lets it count as `external` coverage.
263
+
264
+ All personas run as **parallel Agents** — no sequential bottleneck. Use agent-composer Medium/Large
265
+ fan-out for Extended/Full; Crowd scale dispatches in decorrelated waves, re-checking the marginal-coverage
266
+ stop between waves rather than firing all at once.
234
267
 
235
268
  **Simplification guard**: Routine internal audits → ② built-in fallback at Minimum scale. Chain to ③ only when a needed perspective has no ①② match, or stakes are high.
236
269
 
@@ -296,7 +329,7 @@ Persona composition adapts to `artifact_type` from Step 0.3 profile:
296
329
  | Prompt / config | `beginner` | challenger | Interpretation errors, implicit assumptions |
297
330
  | Auth / security-sensitive | challenger + Security-auditor† | `main-player` (Heavy) | Attack surface, privilege escalation |
298
331
 
299
- † Security-auditor = built-in fallback role (② tier) injected as prompt directive.
332
+ † Security-auditor = ② tier — the 6-slot persona container filled for a security-auditor standpoint.
300
333
 
301
334
  All personas run in parallel. Findings = M/S/R → M-tier items fixed immediately.
302
335
 
@@ -356,6 +389,10 @@ positives erode reviewer trust.
356
389
  - Priority labels verbatim — Critical/Important/Suggestion carried as the persona set them.
357
390
  - No forced consensus or forced conflict — report Common opinions (2+ personas agree) and Conflicts
358
391
  (position A vs B, each with rationale) as-is. Feeds Step 2 M/S/R triage (M ← Critical or 2+ personas).
392
+ - Cost-tier aware triage — a frontier-tier persona's verdict is terminal; a floor/heavy-local persona's
393
+ finding enters only as decorrelated **breadth** (it can raise a standpoint to `covered`, never solely
394
+ set an M-tier on its own). This enforces in the aggregator the §Scale "local breadth decorrelates, it
395
+ does not decide" lock — without it, a local canary's finding would drive triage identically to frontier.
359
396
 
360
397
  **Zero-coverage map (mandatory synthesizer output)** — the synthesizer must emit, mechanically, the set
361
398
  of standpoints that produced **no** finding, not only the ones that did (judge-robustness swarm,
@@ -441,6 +478,30 @@ as normal. (This withdraws one privilege, not the run — the report and fixes s
441
478
 
442
479
  ---
443
480
 
481
+ ## Step 5 — Graduate a Proven Persona (optional, rare)
482
+
483
+ Most synthesized personas are **throwaway** — the run accelerated the work and the persona is discarded.
484
+ A persona earns a permanent home only by passing the container schema's **admission test** (the analogue
485
+ of "app-ification"; `[[persona-container-schema]]` §Lifecycle):
486
+
487
+ | Check | Criterion | Class |
488
+ |---|---|---|
489
+ | **Recurrence** | surfaced **≥1 unique S/M finding** (one no other persona in the run produced) across **≥2 distinct targets** — not a one-off lucky fire | measured |
490
+ | **Trust bar (skills only)** | if graduating into a *skill* rather than a project's persona set, additionally clears the **FH 6-item creation gate** | mandatory-pass |
491
+
492
+ - **Pass → into a project's static set**: route the write through `asset-placement-gate` (expected
493
+ verdict: project-local) before writing the filled container to the project's persona file (e.g.
494
+ the-bible `core/personas.json`) — sim-conductor proposes the target, the placement gate confirms it,
495
+ the operator approves. A project-local asset, not an FH change, but the cross-boundary write is still gated.
496
+ - **Pass → into a skill**: route through `asset-placement-gate` + the New-Skill creation gate (the
497
+ skill-foundry inversion — the trust bar is non-negotiable). This is **HITL**, never auto-graduated.
498
+ - **Fail the recurrence check** → stays ephemeral. Do not graduate on a single run.
499
+
500
+ Graduation is **never automatic** and is **out of scope for auto-commit** — it is a deliberate,
501
+ operator-approved promotion. A clean simulation that graduated nothing is a normal, complete run.
502
+
503
+ ---
504
+
444
505
  ## Human Gate Principle
445
506
 
446
507
  Convergence within an AI-AI loop is **provisional**. Elevated to final only after human gate.
@@ -135,11 +135,11 @@ Treat the adapter output as the isolated challenger result for Wave 1. This pres
135
135
 
136
136
  ---
137
137
 
138
- ## Wave 1 — 5 Mandatory Attack Angles
138
+ ## Wave 1 — 6 Mandatory Attack Angles
139
139
 
140
140
  **Execution principles**: Attacks must be based on real code/files/configs — abstract criticism prohibited.
141
141
  Assign severity: **S** (immediate blocker) / **A** (required before deployment) / **B** (improvement recommended).
142
- Call **fh-commons:quench-challenger** in isolation first (6-axis structural attack); apply 5 angles in parallel.
142
+ Call **fh-commons:quench-challenger** in isolation first (6-axis structural attack); apply 6 angles in parallel.
143
143
 
144
144
  Isolation can be achieved by Claude Code `Agent(...)` or by `fh-run --agent fh-commons:quench-challenger` under Codex. Do not run the challenger inline in the same reasoning pass when the attack result gates the defense.
145
145
 
@@ -150,6 +150,7 @@ Isolation can be achieved by Claude Code `Agent(...)` or by `fh-run --agent fh-c
150
150
  | 3 | **Bus factor** | "Single-person dependency — can it operate if that person is absent?" |
151
151
  | 4 | **Platform obsolescence** | "Does this structure survive when the external ecosystem expands or changes?" |
152
152
  | 5 | **Self-referential structure** | "Is there a closed circuit that evaluates itself by its own criteria?" |
153
+ | 6 | **Gate-locality** | "Is every safety gate readable by the actor that must enforce it? Name any gate defined only in a file/layer the enforcing runtime never loads (e.g. a rule in a Claude-only `CLAUDE.md` that a Gemini/Codex orchestrator reading `AGENTS.md` never sees; a provenance check described in a doc but absent from the write path)." (see `knowledge/shared/harness-core/gate_locality_principle.md`) |
153
154
 
154
155
  **S-grade Immediate Human Gate**: If Wave 1 contains 1+ S-grade blocker → pause, surface options (a) proceed to Wave 2 / (b) human review first / (c) abort. Do not silently enter Wave 2 with unreviewed S-grade items.
155
156