@chrono-meta/fh-gate 1.4.95 → 1.4.97
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-plugin/marketplace.json +2 -2
- package/AGENTS.md +18 -0
- package/CHEATSHEET.md +1 -1
- package/CLAUDE.md +11 -4
- package/README.md +19 -0
- package/knowledge/shared/harness-core/fh_detail_protocols.md +12 -0
- package/knowledge/shared/harness-core/ship_readiness_gate.md +7 -4
- package/knowledge/shared/learnings/subagent_invocations_log.yaml +113 -1
- package/package.json +10 -2
- package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-commons/agents/quench-challenger.md +49 -23
- package/plugins/fh-commons/skills/convergence-loop/SKILL.md +14 -0
- package/plugins/fh-commons/skills/deliberation/SKILL.md +14 -0
- package/plugins/fh-commons/skills/mcp-circuit-breaker/SKILL.md +10 -1
- package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/CHANGELOG.md +36 -0
- package/plugins/fh-meta/agents/beginner.md +4 -1
- package/plugins/fh-meta/agents/challenger.md +7 -1
- package/plugins/fh-meta/agents/expert.md +1 -1
- package/plugins/fh-meta/agents/fact-checker.md +7 -1
- package/plugins/fh-meta/agents/hub-persona-auditor.md +2 -1
- package/plugins/fh-meta/agents/main-player.md +4 -1
- package/plugins/fh-meta/agents/persona-innovator.md +10 -2
- package/plugins/fh-meta/skills/agent-composer/SKILL.md +2 -2
- package/plugins/fh-meta/skills/apex-review/SKILL.md +5 -0
- package/plugins/fh-meta/skills/asset-placement-gate/SKILL.md +38 -8
- package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +16 -2
- package/plugins/fh-meta/skills/context-doctor/SKILL_detail.md +45 -10
- package/plugins/fh-meta/skills/corpus-grounding-expander/SKILL.md +14 -5
- package/plugins/fh-meta/skills/cross-ecosystem-synergy-detection/SKILL.md +93 -30
- package/plugins/fh-meta/skills/deep-clarify/SKILL.md +28 -9
- package/plugins/fh-meta/skills/fh/SKILL.md +4 -0
- package/plugins/fh-meta/skills/frontier-digest/SKILL.md +64 -8
- package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +20 -7
- package/plugins/fh-meta/skills/goal-quench/SKILL.md +48 -15
- package/plugins/fh-meta/skills/goal-quench/SKILL_detail.md +58 -11
- package/plugins/fh-meta/skills/harness-doctor/SKILL_detail.md +109 -33
- package/plugins/fh-meta/skills/harvest-loop/SKILL.md +6 -1
- package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL.md +126 -17
- package/plugins/fh-meta/skills/install-doctor/SKILL.md +50 -14
- package/plugins/fh-meta/skills/install-wizard/SKILL.md +26 -7
- package/plugins/fh-meta/skills/install-wizard/SKILL_detail.md +68 -21
- package/plugins/fh-meta/skills/memory-hygiene/SKILL.md +64 -17
- package/plugins/fh-meta/skills/meta-prompt-builder/SKILL.md +38 -4
- package/plugins/fh-meta/skills/persona-roster-expander/SKILL.md +15 -7
- package/plugins/fh-meta/skills/plugin-recommender/SKILL.md +39 -11
- package/plugins/fh-meta/skills/plugin-recommender/SKILL_detail.md +24 -7
- package/plugins/fh-meta/skills/prompt-regression/SKILL.md +54 -11
- package/plugins/fh-meta/skills/salience-splitter/SKILL.md +120 -7
- package/plugins/fh-meta/skills/salience-splitter/SKILL_detail.md +46 -13
- package/plugins/fh-meta/skills/sim-conductor/SKILL_detail.md +28 -3
- package/plugins/fh-meta/skills/steel-quench/SKILL.md +3 -1
- package/plugins/fh-meta/skills/verify-bidirectional/SKILL.md +72 -14
- package/scripts/compaction_probe.sh +153 -10
- package/scripts/consent_registry_check.sh +63 -0
- package/scripts/count_check.sh +47 -1
- package/scripts/degrade_direction_scan.sh +276 -6
- package/scripts/degrade_probe_capability.sh +105 -0
- package/scripts/lane_runner_check.sh +425 -0
- package/scripts/package_coverage_check.sh +190 -35
- package/scripts/psa_probe_capability.sh +78 -0
- package/scripts/psa_scan_lib.sh +164 -0
- package/scripts/public_surface_scan_files.sh +38 -0
- package/scripts/selfcheck.sh +346 -28
- package/scripts/test_capability_entrypoint_shipping.sh +132 -0
- package/scripts/test_consent_registry.sh +54 -0
- package/scripts/test_count_check_readme_format_lanes.sh +75 -0
- package/scripts/test_degrade_scan_shell_probes.sh +415 -0
- package/scripts/test_marker_crossfamily_lanes.sh +10 -1
- package/scripts/test_marker_floor_lanes.sh +25 -1
- package/scripts/test_psa_singlefile_lanes.sh +288 -0
- package/scripts/test_reviewer_capability_conformance.sh +10 -1
- package/scripts/test_selfcheck_state_lanes.sh +173 -0
- package/scripts/validate_yaml.sh +146 -0
- package/templates/degrade_direction_scan.sh +276 -6
- package/templates/goal-quench-settings-merged.json +30 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: salience-splitter
|
|
3
3
|
description: 'Splits an over-loaded always-loaded context asset — a SKILL.md, CLAUDE.md, or memory index — into a lean always-loaded layer + an on-demand layer, using a governance-semantic criterion (not length, but when the content is needed), connected by imperative pointers. Based on paper §9.5 Protocol-Priority Split pattern. Diagnoses, classifies, splits, and verifies in one pass. Renamed from skill-splitter (old name still routes here). Triggers: "SKILL.md too large", "split this skill", "skill is bloated", "skill file too long", "CLAUDE.md 너무 커".'
|
|
4
4
|
user-invocable: true
|
|
5
|
-
allowed-tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
|
|
5
|
+
allowed-tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "Agent"]
|
|
6
6
|
model: sonnet
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -46,6 +46,43 @@ model: sonnet
|
|
|
46
46
|
|
|
47
47
|
**One test**: *"If a consumer agent had only SKILL.md, could they recognize the trigger, understand the full step sequence, and make the key decisions?"* → Yes = correct split. No = something behavioral is missing from SKILL.md.
|
|
48
48
|
|
|
49
|
+
### Two floors this skill must not cross (behavioral — resident on purpose)
|
|
50
|
+
|
|
51
|
+
**① A cut is measured, never eyeballed** — and *which* measurement depends on what layer you are
|
|
52
|
+
cutting from. Both branches forbid the same thing ("I read it and it looks redundant" is not a
|
|
53
|
+
measurement); they differ in cost because the surfaces differ:
|
|
54
|
+
|
|
55
|
+
| Cutting from | Measurement | Why this one |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| **Resident layer** — CLAUDE.md, a memory index (loaded every session, for every task) | **Ablation harness**: pre-registered question set · **isolated arm B** · `reps>=3` · runner precondition `bash scripts/ablation_calibrate.sh` exits 0 (canon = `scripts/probe_scope_check.sh` header) · verdict line → `.claude/regression/ablation_verdicts.md` | A wrong cut here degrades *every* session silently, and the cost is unattributable after the fact |
|
|
58
|
+
| **SKILL.md → SKILL_detail.md** (loaded only when the skill is invoked) | **Cold-start sim**: `sim-conductor` Area D-skill on SKILL.md alone must reach grade F (see Done When) | The failure is scoped to one skill's invocation and the sim reproduces exactly that condition |
|
|
59
|
+
|
|
60
|
+
**Arm B answering confidently wrong is a KEEP, not a pass** — fluency is not recall, and that is the
|
|
61
|
+
whole reason the arm is isolated. The same reading applies to the sim: a consumer that improvises
|
|
62
|
+
plausibly without the moved rule is grade P, not F.
|
|
63
|
+
|
|
64
|
+
This skill is the one that executes resident removal, so the procedure is named *here* rather than
|
|
65
|
+
assumed — an earlier version left the judgment "mentally", which is exactly the eyeball path both
|
|
66
|
+
branches exist to replace. **Do not read the resident row onto the SKILL.md row**: requiring a full
|
|
67
|
+
ablation for every ambiguous SKILL.md section would price routine splitting out of existence, which
|
|
68
|
+
is how a floor turns into a bypass trainer (cross-family review 2026-08-11 flagged exactly that
|
|
69
|
+
over-block in the first draft of this section).
|
|
70
|
+
|
|
71
|
+
**② Every split must re-ask whether the destination is inside the gate.** Moving content to a new
|
|
72
|
+
path can move it **out of the 4-axis gate's pathspec** — the gate-locality class has recurred four
|
|
73
|
+
times, most sharply when `SKILL_detail.md` fell outside a literal `SKILL\.md` term and 27.7% of the
|
|
74
|
+
skill-spec surface went ungated (it leaked twice for real). `.claude/rules/fh_4axis_gate.md` names
|
|
75
|
+
*this skill* as the producer that **widens that hole every time the diet succeeds**. So coverage is
|
|
76
|
+
re-verified mechanically at split time, not assumed:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
bash scripts/gate_pathspec_check.sh # exit 0 = known-pair coverage holds, 1 = a pair broke
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
A destination path the gate does not match is not a "later" item: **ship the pathspec update in the
|
|
83
|
+
same commit as the split** — the split and its coverage are one change, and separating them is how
|
|
84
|
+
the surface silently shrinks.
|
|
85
|
+
|
|
49
86
|
---
|
|
50
87
|
|
|
51
88
|
## Step Overview
|
|
@@ -64,13 +101,57 @@ Step 3 — Draft SKILL_detail.md
|
|
|
64
101
|
One ## §SectionName header per pointer in SKILL.md
|
|
65
102
|
Move removed content under its section
|
|
66
103
|
Front-matter: name, description, load: on-demand
|
|
104
|
+
→ Gate check (Floor ②): destination path inside the 4-axis pathspec?
|
|
105
|
+
bash scripts/gate_pathspec_check.sh — not-matched = update the pathspec in THIS commit
|
|
67
106
|
|
|
68
107
|
Step 4 — Verify
|
|
69
108
|
phantom-quench: every §pointer in SKILL.md resolves to ## §SectionName in SKILL_detail.md
|
|
70
109
|
sim-conductor Area D-skill: consumer agent with SKILL.md only → must reach grade F
|
|
110
|
+
(grade scale — sim-conductor SKILL.md §Area-D: F = Functional/PASS · P = Partial · B = Broken)
|
|
71
111
|
→ Any pointer mismatch or grade P/B → fix before commit
|
|
72
112
|
```
|
|
73
113
|
|
|
114
|
+
**Step 4 pointer↔header comparison — run it, don't eyeball it.** Both sides need normalizing or the
|
|
115
|
+
check produces ~100% false positives: real headers are written `## §Name — description`, so a naive
|
|
116
|
+
compare never matches. And extraction must be anchored to the **declared pointer form**
|
|
117
|
+
(see "Imperative Pointer Format" below — a blockquote line whose bolded lead is followed by
|
|
118
|
+
`See`), not to "a mention of the
|
|
119
|
+
detail file": any prose that *discusses* a pointer, quoted or not, is otherwise collected as one.
|
|
120
|
+
That is not hypothetical — a paragraph on this page names an example section, and a
|
|
121
|
+
backtick-only filter counted it as a live pointer:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
S="plugins/{plugin}/skills/{name}" # the skill dir being split
|
|
125
|
+
# pointer side: any bolded-lead "See" line (the marker word varies — **Detail**, **Template**, …),
|
|
126
|
+
# and ALL §names on it (a documented variant puts two pointers on one line)
|
|
127
|
+
diff <(grep -E '^> \*\*[A-Za-z]+\*\*: See ' "$S/SKILL.md" \
|
|
128
|
+
| grep -oE '§[A-Za-z0-9_-]+' | sed 's/^§//' | sort -u) \
|
|
129
|
+
<(grep '^## §' "$S/SKILL_detail.md" | sed 's/^## §//; s/ *—.*//' | sort -u)
|
|
130
|
+
# rc=0 → every pointer resolves and every §header has a pointer. rc=1 → the diff names both directions
|
|
131
|
+
# ("<" = pointer with no section · ">" = section with no pointer, i.e. an orphan).
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Calibrate before trusting it** (this check was wrong twice while being written — each narrowing
|
|
135
|
+
looked reasonable and produced false orphans): run it across sibling skills and confirm it
|
|
136
|
+
*discriminates*. Measured 2026-08-11 over 6 FH skills: 5 exit 0, `steel-quench` exits 1 on a real
|
|
137
|
+
orphan (`§Phase0` — no pointer anywhere in its SKILL.md), and this page's own prose example is not
|
|
138
|
+
collected. A version of this check that flags everything, or nothing, is not measuring.
|
|
139
|
+
|
|
140
|
+
**Orphan check covers `^## `, not `^## §` — and the two checks have different jobs.** The diff above
|
|
141
|
+
compares §-prefixed headers against pointers; a header written *without* the `§` prefix is invisible
|
|
142
|
+
to it. Measured across this repo's `SKILL_detail.md` files: **139 `## ` headers vs 97 `## §`**, so 42
|
|
143
|
+
(30%) sit outside the comparison entirely and would pass forever. So run both, and read them as one
|
|
144
|
+
rule:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
diff (§ side) → pointer↔header agreement, both directions
|
|
148
|
+
grep '^## ' → coverage net: any header the diff could not see
|
|
149
|
+
resolution → give it the § prefix AND a pointer (then the diff covers it), or merge it away
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
A non-§ header listed by the grep and left alone is **not** a pass — it is the orphan the §-only
|
|
153
|
+
scan used to hide.
|
|
154
|
+
|
|
74
155
|
> **Detail**: See `SKILL_detail.md §Verification-Checklist` — pre-commit checklist table (8 checks) — read when running Step 4 verification.
|
|
75
156
|
|
|
76
157
|
> **Detail**: See `SKILL_detail.md §Split-Execution` — step-by-step trimming procedure, SKILL_detail.md front-matter format, orphan-section check — read when executing Steps 2–3.
|
|
@@ -120,17 +201,49 @@ Run on a SKILL.md when **any one** of:
|
|
|
120
201
|
|
|
121
202
|
## Done When
|
|
122
203
|
|
|
204
|
+
**Common to all three scopes** (§Scope declares SKILL.md · CLAUDE.md · memory index — the conditions
|
|
205
|
+
below are the ones that hold whatever was split; scope-specific conditions follow):
|
|
206
|
+
|
|
123
207
|
```
|
|
124
208
|
Step 1 classification table produced
|
|
209
|
+
(mandatory-pass — the table exists and every section carries a verdict)
|
|
210
|
+
+ Every AMBIGUOUS section carries the measurement its layer requires (Floor ①)
|
|
211
|
+
(measured — resident layer: ablation verdict line in .claude/regression/ablation_verdicts.md
|
|
212
|
+
(pre-registered set, isolated arm B, reps>=3) · SKILL.md layer: cold-start sim grade F.
|
|
213
|
+
Eyeball judgment = NOT met on either branch)
|
|
214
|
+
+ Gate coverage re-verified for every destination path introduced by the split
|
|
215
|
+
(mandatory-pass — `bash scripts/gate_pathspec_check.sh` exits 0, or the pathspec update
|
|
216
|
+
ships in the same commit)
|
|
217
|
+
+ No behavioral rule lives only in the on-demand layer
|
|
218
|
+
(judged — pair: an isolated consumer read that has ONLY the always-loaded layer and must reach
|
|
219
|
+
a decision the moved rule governs; author re-reading their own split does not satisfy this)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Scope-specific — SKILL.md split:**
|
|
223
|
+
```
|
|
125
224
|
+ SKILL.md trimmed: triggers · principles · step overview · decision tables · Done When retained
|
|
126
|
-
+
|
|
127
|
-
|
|
225
|
+
+ Imperative pointer for every removed section; SKILL_detail.md carries one ## §header per pointer
|
|
226
|
+
(mandatory-pass — Step 4 normalized diff exits 0, both directions)
|
|
128
227
|
+ phantom-quench: 0 phantoms (all §pointers resolve)
|
|
129
228
|
→ Fallback (skill unavailable): run §Verification-Checklist manually from SKILL_detail.md
|
|
130
229
|
+ sim-conductor Area D-skill: grade F (consumer completes core task from SKILL.md alone)
|
|
131
|
-
|
|
230
|
+
(measured — grade scale, sim-conductor SKILL.md §Area-D: F = Functional/PASS · P = Partial · B = Broken)
|
|
231
|
+
→ Fallback (skill unavailable): manually confirm "trigger → step overview → key decision → Done When" present
|
|
132
232
|
```
|
|
133
233
|
|
|
134
|
-
**
|
|
135
|
-
**
|
|
136
|
-
|
|
234
|
+
**Scope-specific — CLAUDE.md split:** the resident file keeps the rule *and* an imperative
|
|
235
|
+
`> **Detail**: See …` pointer; the detail destination is inside the gate pathspec (Floor ②); a cold
|
|
236
|
+
top-level session can still act on the rule without opening the detail file
|
|
237
|
+
(judged — pair: a blind sim at the tier the rule must survive on, **not** the author's re-read).
|
|
238
|
+
⚠️ Resident-footprint claims are measured only by a **fresh top-level `/context`** — file char counts
|
|
239
|
+
are not resident measurements, and an agent-view window cannot measure it at all.
|
|
240
|
+
|
|
241
|
+
**Scope-specific — memory index split:** every demoted entry is reachable from the archive by the
|
|
242
|
+
recall path the index declares (mandatory-pass — grep the archive for the demoted entry's own nouns
|
|
243
|
+
and hit it); the hot index keeps one line per surviving entry.
|
|
244
|
+
|
|
245
|
+
**Not done**: an on-demand section with no pointer from the always-loaded layer (orphan) — scan
|
|
246
|
+
`^## `, not `^## §` (30% of real headers carry no §).
|
|
247
|
+
**Not done**: consumer grade P (Partial) or B (Broken) after split — a behavioral rule was moved out
|
|
248
|
+
when it should have stayed.
|
|
249
|
+
**Not done**: a section CUT on "it looked redundant" with no ablation verdict line.
|
|
@@ -55,13 +55,28 @@ For each section in target SKILL.md:
|
|
|
55
55
|
|
|
56
56
|
### Ambiguous content test
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
The D-skill cold-start question frames the decision:
|
|
59
59
|
|
|
60
60
|
> *"If a consumer agent had only SKILL.md and typed the trigger phrase, would they need this content in the first 2 steps?"*
|
|
61
61
|
> - YES → Always-loaded
|
|
62
|
-
> - NO →
|
|
62
|
+
> - NO → **candidate** for on-demand — not yet a verdict
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
**Do not answer it in your head.** AMBIGUOUS is precisely the case where the eyeball answer is
|
|
65
|
+
unreliable, so the verdict is measured, per SKILL.md §Floor ① and CLAUDE.md's ablation procedure:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
bash scripts/ablation_calibrate.sh # runner precondition — must exit 0 before any arm runs
|
|
69
|
+
# then run the pre-registered arms per scripts/probe_scope_check.sh (header = canon:
|
|
70
|
+
# arms · isolation · reps>=3 · pre-registration · the two leak channels)
|
|
71
|
+
# verdict line → .claude/regression/ablation_verdicts.md
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Read the result correctly: a section is CUT only when the **isolated arm B answers the pre-registered
|
|
75
|
+
questions correctly**. Arm B answering **confidently wrong is a KEEP** — fluency is not recall, and
|
|
76
|
+
that is the failure the isolation exists to expose.
|
|
77
|
+
|
|
78
|
+
Behavioral rules skip the probe and stay Always-loaded (even if rarely triggered, the consumer needs
|
|
79
|
+
to know the constraint exists) — that is a KEEP by classification, not an unmeasured cut.
|
|
65
80
|
|
|
66
81
|
---
|
|
67
82
|
|
|
@@ -148,19 +163,35 @@ Opening line:
|
|
|
148
163
|
|
|
149
164
|
For each pointer in SKILL.md: create matching `## §SectionName` header, paste removed content under it.
|
|
150
165
|
|
|
151
|
-
Orphan check: every
|
|
166
|
+
Orphan check: every section header in SKILL_detail.md must have a corresponding pointer in SKILL.md.
|
|
167
|
+
Scan `^## ` — **not** `^## §`: measured across this repo, 139 `## ` headers vs 97 `## §`, so a §-only
|
|
168
|
+
scan is structurally blind to 42 (30%) of real sections and passes them forever. If a header has no
|
|
169
|
+
pointer → add the pointer or merge with an adjacent section.
|
|
152
170
|
|
|
153
171
|
### Step 4: Verification sequence
|
|
154
172
|
|
|
155
173
|
```bash
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
#
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
#
|
|
163
|
-
#
|
|
174
|
+
S=plugins/{plugin}/skills/{name}
|
|
175
|
+
|
|
176
|
+
# 1+2+3 in one comparison. Three normalizations, each one learned from a false positive:
|
|
177
|
+
# · headers are written "## §Name — description" → strip the em-dash tail
|
|
178
|
+
# · the marker word varies (**Detail**, **Template**) → match any bolded lead + "See"
|
|
179
|
+
# · one line may carry TWO pointers (documented variant, §Pointers)
|
|
180
|
+
# → collect ALL §names on the line
|
|
181
|
+
# Anchoring on the pointer LINE (not "any mention of the detail file") is what keeps prose that
|
|
182
|
+
# merely DISCUSSES a pointer out — measured: a backtick-only filter counted an explanatory
|
|
183
|
+
# example as a live pointer, and a **Detail**-only filter called two real pointers orphans.
|
|
184
|
+
diff <(grep -E '^> \*\*[A-Za-z]+\*\*: See ' "$S/SKILL.md" \
|
|
185
|
+
| grep -oE '§[A-Za-z0-9_-]+' | sed 's/^§//' | sort -u) \
|
|
186
|
+
<(grep '^## §' "$S/SKILL_detail.md" | sed 's/^## §//; s/ *—.*//' | sort -u)
|
|
187
|
+
# rc=0 → every pointer resolves AND every §header has a pointer (both directions in one run)
|
|
188
|
+
# rc=1 → the diff output names which side is missing what. Fix before commit.
|
|
189
|
+
|
|
190
|
+
# 4. Orphan scan over the WIDER header form (see above — §-only misses 30%)
|
|
191
|
+
grep -n '^## ' "$S/SKILL_detail.md"
|
|
192
|
+
|
|
193
|
+
# 5. Gate coverage for the destination path (SKILL.md §Floor ②)
|
|
194
|
+
bash scripts/gate_pathspec_check.sh
|
|
164
195
|
```
|
|
165
196
|
|
|
166
197
|
Then run:
|
|
@@ -180,6 +211,8 @@ Use before committing a completed split:
|
|
|
180
211
|
| All §pointers resolve | phantom-quench: 0 phantoms |
|
|
181
212
|
| Cold-start grade F | sim-conductor Area D-skill: consumer reaches core completion |
|
|
182
213
|
| No behavioral rule in SKILL_detail only | Any rule governing "what counts as X" present in SKILL.md |
|
|
183
|
-
| No orphan
|
|
214
|
+
| No orphan sections | Every `## ` header in SKILL_detail.md has a pointer from SKILL.md (scan `^## `, not `^## §` — §-only is blind to 30% of real headers) |
|
|
215
|
+
| Gate coverage holds | `bash scripts/gate_pathspec_check.sh` exits 0, or the pathspec update ships in the same commit |
|
|
216
|
+
| Ablation verdict for every AMBIGUOUS cut | Verdict line in `.claude/regression/ablation_verdicts.md`; arm B correct = CUT, arm B confidently wrong = KEEP |
|
|
184
217
|
| SKILL.md ≤ 50% of original | Line count check |
|
|
185
218
|
| SKILL.md flows without gaps | Reading SKILL.md alone gives complete step sequence understanding |
|
|
@@ -335,14 +335,39 @@ cross_model_coverage: [external | cross-session | NONE] # NONE on risk≥mediu
|
|
|
335
335
|
```bash
|
|
336
336
|
cd "$HARNESS_ROOT"
|
|
337
337
|
BRANCH="fix/sim-$(date +%Y%m%d)-m-tier"
|
|
338
|
-
git
|
|
339
|
-
# [process M-tier items]
|
|
340
|
-
|
|
338
|
+
git switch -c "$BRANCH"
|
|
339
|
+
# [process M-tier items] — collect the files this run actually edited
|
|
340
|
+
# Explicit list; never a glob, never -A, never `.`. Use an ARRAY, not a space-separated string:
|
|
341
|
+
# `git add -- $FILES` relies on bash word-splitting an unquoted parameter expansion, and zsh does
|
|
342
|
+
# NOT split one (SH_WORD_SPLIT off by default). Under zsh the whole string arrives as ONE pathspec,
|
|
343
|
+
# git errors "did not match any files", and the commit that follows stages nothing — the explicit-
|
|
344
|
+
# path discipline this line exists to enforce silently stops applying in the operator's own shell.
|
|
345
|
+
FILES=(path/to/edited1.md path/to/edited2.md)
|
|
346
|
+
git add -- "${FILES[@]}"
|
|
347
|
+
git diff --cached --name-only # confirm the staged set IS the intended set before committing
|
|
341
348
|
git commit -m "fix(sim-conductor): resolve M-tier findings from simulation YYYY-MM-DD"
|
|
342
349
|
git push -u origin "$BRANCH"
|
|
343
350
|
# PR creation requires explicit user request per CLAUDE.md PR principle
|
|
344
351
|
```
|
|
345
352
|
|
|
353
|
+
> **Never `git add -p` here — this skill runs to completion unattended.** `-p` is interactive: with
|
|
354
|
+
> no TTY it either blocks forever, or (with stdin closed) exits **0 having staged nothing**. Measured
|
|
355
|
+
> 2026-08-12 on the documented chain: `add -p` → rc 0, nothing staged → `git commit` → **rc 1**,
|
|
356
|
+
> while `git switch -c` had **already created the branch** — so the run leaves a branch behind, the
|
|
357
|
+
> fixes uncommitted, and a success-shaped exit on the staging step. A silent no-op in the middle of
|
|
358
|
+
> an auto-commit chain is worse than a hang, because only the hang is visible.
|
|
359
|
+
>
|
|
360
|
+
> **Why an explicit list rather than `-A` or `.`**: `sim-conductor` frequently runs in a checkout
|
|
361
|
+
> shared with other work. `git add -A` sweeps up whatever else is dirty — measured above: a
|
|
362
|
+
> co-resident `b.txt` was left untouched by `git add -- a.txt` and would have been swallowed by
|
|
363
|
+
> `-A`. Note the boundary: `git add -- <file>` stages **the whole file**, including lines this run
|
|
364
|
+
> did not write, so if another session has appended to a file you also edited, commit that append
|
|
365
|
+
> first rather than absorbing it.
|
|
366
|
+
>
|
|
367
|
+
> `git diff --cached --name-only` before the commit is the mechanical check that the staged set
|
|
368
|
+
> equals the intended set. Do not skip it — it is what turns "I passed the right paths" from a
|
|
369
|
+
> belief into an observation.
|
|
370
|
+
|
|
346
371
|
---
|
|
347
372
|
|
|
348
373
|
## §PathB-Detail — External Environment Fallback
|
|
@@ -43,7 +43,7 @@ A designer's anxiety is most dangerous when vague. steel-quench breaks that anxi
|
|
|
43
43
|
|
|
44
44
|
| Wave | Role | Termination |
|
|
45
45
|
|---|---|---|
|
|
46
|
-
| **Phase 0** (optional) | Counterexample calibration — extract patterns from external bad cases, merge into Wave 1 | No external case → skip |
|
|
46
|
+
| **Phase 0** (optional) | Counterexample calibration — extract patterns from external bad cases, merge into Wave 1 (→ `SKILL_detail.md §Phase0`) | No external case → skip |
|
|
47
47
|
| **Wave 1** | Challenger attack (quench-challenger) — surface critical flaws, no defense | — |
|
|
48
48
|
| **Wave 2** | Defense — defend or state as residual risk | — |
|
|
49
49
|
| **Wave 3+** | Convergence — repeat until a round is clean AND triggers no repair | Zero new S/A **and no repairs made in response, B included** (§Convergence Criteria) |
|
|
@@ -52,6 +52,8 @@ A designer's anxiety is most dangerous when vague. steel-quench breaks that anxi
|
|
|
52
52
|
| **Wave 5** (optional) | Multi-Team Adversarial Panel — external CLIs or cross-session Claude | Wave 3+ criterion, cross-team |
|
|
53
53
|
| **Wave-T** (after convergence) | Temper — measure complexity the quench *added*; flag over-hardening | τ-PASS or named τ-FAIL |
|
|
54
54
|
|
|
55
|
+
> **Detail**: See `SKILL_detail.md §Phase0` — counterexample calibration full spec (pattern extraction from an external bad case, merge rules into Wave 1) — read when an external bad case is supplied.
|
|
56
|
+
|
|
55
57
|
---
|
|
56
58
|
|
|
57
59
|
## Step 0.3 — Artifact Vulnerability Profile
|
|
@@ -107,13 +107,22 @@ First identify the list of affected assets. Actual file modification is performe
|
|
|
107
107
|
|
|
108
108
|
| Affected Asset | Update Location | Notes |
|
|
109
109
|
|---|---|---|
|
|
110
|
-
|
|
|
110
|
+
| This SKILL.md §Validation Ledger | Add cumulative count + new round entry | Self-perpetuation of this rule. (Was `memory feedback_bidirectional_self_validation.md` — **absent, verified 2026-08-12**; the rule body is this file.) |
|
|
111
111
|
| memory `project_*.md` (if affected) | Add relevant section | When naming, identity, or roadmap changes |
|
|
112
112
|
| `tracks/_audit/*.md` (if affected) | Add pre-design section | When this validation affects persistent assets |
|
|
113
113
|
| `CATALOG.md` | Add this session entry | For major decisions |
|
|
114
114
|
| `reference_next_session_starter.md` §1 | Merge this conclusion | Material for next session entry |
|
|
115
115
|
|
|
116
|
-
**Markdown editing discipline**
|
|
116
|
+
**Markdown editing discipline** — this skill's own rule, stated here rather than delegated:
|
|
117
|
+
|
|
118
|
+
> Use `Edit` for any `.md` that already exists. `Write` on an existing file replaces it whole and
|
|
119
|
+
> silently discards content this session never read — that is the failure mode the rule exists for,
|
|
120
|
+
> not a style preference. If a full rewrite is genuinely unavoidable, `Read` the file first, then
|
|
121
|
+
> verify immediately with `git diff` and report what changed.
|
|
122
|
+
|
|
123
|
+
(Previously cited as `feedback_markdown_edit_discipline` — that memory key is **absent, verified
|
|
124
|
+
2026-08-12**. The rule is live; only the pointer was dead, so it is written out here. A prohibition
|
|
125
|
+
that rests on a file nobody can open is not enforceable.)
|
|
117
126
|
|
|
118
127
|
### Step 4.5. Change `diff` Review (User Gate Required)
|
|
119
128
|
|
|
@@ -144,7 +153,9 @@ Skip this step if no compatibility enhancement found (no token-filler).
|
|
|
144
153
|
|
|
145
154
|
### Step 6. Update Trigger Count + Skill Update Review
|
|
146
155
|
|
|
147
|
-
Update trigger count in
|
|
156
|
+
Update the trigger count in the **§Validation Ledger** at the bottom of this file. (It formerly
|
|
157
|
+
pointed at `memory feedback_bidirectional_self_validation.md`, **absent, verified 2026-08-12** —
|
|
158
|
+
so the count had nowhere to land and this step could not actually be performed.)
|
|
148
159
|
|
|
149
160
|
- 5+ accumulated = Skill promotion review (already fulfilled by creating this skill ✅)
|
|
150
161
|
- 8+ accumulated = skill update review (rule refinement + round table compression + update this skill)
|
|
@@ -209,8 +220,8 @@ Speak up **before** entering implementation if any of these apply:
|
|
|
209
220
|
|
|
210
221
|
- **This skill = validation and recording automation. Core decisions belong to the user** — this harness AI has no independent decision authority
|
|
211
222
|
- **This harness AI self-catch cannot be applied alone** — follow `fact-checker` rule (narrow 1 / broad N+1)
|
|
212
|
-
- **Simplification guard compliance**
|
|
213
|
-
- **Markdown editing discipline obligation** (`feedback_markdown_edit_discipline`
|
|
223
|
+
- **Simplification guard compliance** — when creating or modifying this skill, update SKILL.md only. Do not spawn auxiliary files; a change that needs a new file needs a reason stated in the same edit. (Formerly cited `feedback_simplification_evidence` — **absent, verified 2026-08-12**)
|
|
224
|
+
- **Markdown editing discipline obligation** — `Edit` on existing `.md`; `Write` only after reading the file, and verified with `git diff` (full statement in Step 4 above). (Formerly cited `feedback_markdown_edit_discipline` — **absent, verified 2026-08-12**)
|
|
214
225
|
|
|
215
226
|
## External User Environment Adaptation
|
|
216
227
|
|
|
@@ -220,7 +231,7 @@ This skill's core essence = "channel for updating baseline when user refinement
|
|
|
220
231
|
|
|
221
232
|
| Origin Environment Dependency | External User Environment Fallback |
|
|
222
233
|
|---|---|
|
|
223
|
-
| `memory feedback_bidirectional_self_validation.md`
|
|
234
|
+
| Rule body — **this SKILL.md itself** (the origin environment's `memory feedback_bidirectional_self_validation.md` is **absent, verified 2026-08-12**; there is no origin-side file to fall back from) | User environment's own `memory/` or `notes/` bidirectional validation rule / if absent, this skill's own rule baseline — which is now the only baseline in either environment |
|
|
224
235
|
| `memory feedback_*.md` grep scope (Step 2 priority 1) | User environment's own `learnings/` · `docs/` · `CLAUDE.md` grep (user's own baseline) |
|
|
225
236
|
| `tracks/*/learnings/feedback_*.md` (Step 2 priority 2) | User environment's own learnings area (auto-detect naming variations) |
|
|
226
237
|
| `knowledge/shared/harness-core/*.md` (Step 2 priority 4) | User environment's own `docs/` or `knowledge/` grep |
|
|
@@ -245,17 +256,64 @@ This skill's core essence = "channel for updating baseline when user refinement
|
|
|
245
256
|
## Done When
|
|
246
257
|
|
|
247
258
|
```
|
|
248
|
-
Steps 1~6 all executed
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
259
|
+
☐ Steps 1~6 all executed — a step that produced no artifact is
|
|
260
|
+
not executed (measured: 6 steps, 6 artifacts)
|
|
261
|
+
☐ Step 1 baseline update applied BEFORE Step 2 grep runs — the
|
|
262
|
+
order is the point of the skill, not a formality (mandatory-pass)
|
|
263
|
+
☐ Step 2 consistency grep ran across all 4 priority scopes, and
|
|
264
|
+
each scope reports hits or an explicit "0 hits, scope exists"
|
|
265
|
+
— a scope that does not exist reports MISSING, never 0 (measured: 4 scopes reported)
|
|
266
|
+
☐ fact-checker self-catch mark output (mandatory-pass)
|
|
267
|
+
☐ Step 4.5 diff gate: user confirmation received (y/N) before
|
|
268
|
+
any file was modified; no answer == N (mandatory-pass, HITL)
|
|
269
|
+
☐ §Validation Ledger has one new row and the Count line matches
|
|
270
|
+
the row total (measured: rows == Count)
|
|
271
|
+
☐ Every memory/asset key cited in the round was confirmed to
|
|
272
|
+
RESOLVE before being used as grounds (mandatory-pass — an absent key
|
|
273
|
+
is cited as absent, never as
|
|
274
|
+
support)
|
|
275
|
+
☐ The counter-argument was actually re-examined rather than
|
|
276
|
+
conceded to (judged — adversarial pairing:
|
|
277
|
+
`fact-checker` (narrow 1 /
|
|
278
|
+
broad N+1) re-runs the grep
|
|
279
|
+
independently; agreement with
|
|
280
|
+
the user is not evidence the
|
|
281
|
+
user was right)
|
|
282
|
+
☐ External validation path available: harvest-loop's Critic
|
|
283
|
+
isolation pass can independently judge on the above criteria (judged — adversarial pairing:
|
|
284
|
+
Critic runs isolated, not in
|
|
285
|
+
this session's context)
|
|
253
286
|
```
|
|
254
287
|
|
|
288
|
+
> **Why the last two are judged, and paired.** This skill fires when the user pushes back, which is
|
|
289
|
+
> precisely the moment agreement is cheapest. A Done When that only counts steps is satisfied by a
|
|
290
|
+
> run that folded immediately. The pairing is the whole check: an isolated re-grep, and an isolated
|
|
291
|
+
> critic — neither of which has seen this session's reasoning.
|
|
292
|
+
|
|
255
293
|
Verdict: PASS (Step 4.5 diff gate confirmed, baseline updated) | CONDITIONAL_PASS (update applied, external validation still pending) | FAIL (counter-argument confirmed — AI recommendation was wrong, baseline requires redesign) | ESCALATE (counter-argument ambiguous, human judgment required)
|
|
256
294
|
|
|
257
295
|
## References
|
|
258
296
|
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
|
|
297
|
+
> **All memory keys below were checked on 2026-08-12 and every one is absent** (same-run
|
|
298
|
+
> known-positive control: `feedback_verify_before_downgrade.md` and `memory_intent_recall.md`
|
|
299
|
+
> both resolve, so the check is not misreporting). A struck entry here is not a fix if the same
|
|
300
|
+
> name is still load-bearing above — the rules those keys carried have been written into the body
|
|
301
|
+
> of this skill (Step 4 markdown discipline, §Constraints, §Validation Ledger), which is why the
|
|
302
|
+
> strikethroughs below are safe to leave as history.
|
|
303
|
+
|
|
304
|
+
- ~~Rule body: `memory feedback_bidirectional_self_validation.md`~~ — **absent (verified 2026-08-12)**. The rule body is **this file**; the cumulative count lives in §Validation Ledger.
|
|
305
|
+
- ~~Operating model text: `memory feedback_hub_cc_operating_model.md §2.5·§2.6`~~ — **absent (verified 2026-08-12)**. The live equivalent is `CLAUDE.md §Identity — 3-Layer Mission + Core Axis`; cite that, not this filename.
|
|
306
|
+
- ~~Consistency rules: `feedback_external_ai_github_recommendation_verification` · `feedback_reference_own_hub_assets_first` · `feedback_simplification_evidence` · `feedback_markdown_edit_discipline` · `feedback_impact_first_then_tune`~~ — **absent (verified 2026-08-12)**. The two that this skill actually depends on are restated in §Constraints above.
|
|
307
|
+
- Live, verified references (these resolve): `tracks/_meta/reference_next_session_starter.md` (session card, Step 4) · `CATALOG.md` · the `fact-checker` agent (Step 3).
|
|
308
|
+
|
|
309
|
+
## Validation Ledger
|
|
310
|
+
|
|
311
|
+
Cumulative trigger count for Step 6. Append one row per completed round; the count is the number of
|
|
312
|
+
rows. This section is the landing site that the absent memory key used to be.
|
|
313
|
+
|
|
314
|
+
| # | Date | Trigger (user's counter-argument, one line) | Verdict | Baseline change |
|
|
315
|
+
|---|---|---|---|---|
|
|
316
|
+
| — | — | (no rounds recorded in-file yet — prior rounds lived in the now-absent memory key and are not recoverable) | — | — |
|
|
317
|
+
|
|
318
|
+
**Count**: 0 recorded rounds. Do not restate a remembered historical total here; an unrecoverable
|
|
319
|
+
count is `unknown`, not a number carried over from a file nobody can open.
|