@chrono-meta/fh-gate 1.4.35 → 1.4.36
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 **🐿️
|
|
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
|
-
>
|
|
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
|
|
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.
|
package/package.json
CHANGED
|
@@ -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 →
|
|
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
|
-
②
|
|
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 [
|
|
117
|
-
challenger → [installed agent: challenger] OR [
|
|
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
|
-
②
|
|
216
|
+
② Container fill — fill 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 —
|
|
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
|
-
|
|
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 =
|
|
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.
|