@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.
Files changed (76) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/AGENTS.md +18 -0
  3. package/CHEATSHEET.md +1 -1
  4. package/CLAUDE.md +11 -4
  5. package/README.md +19 -0
  6. package/knowledge/shared/harness-core/fh_detail_protocols.md +12 -0
  7. package/knowledge/shared/harness-core/ship_readiness_gate.md +7 -4
  8. package/knowledge/shared/learnings/subagent_invocations_log.yaml +113 -1
  9. package/package.json +10 -2
  10. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  11. package/plugins/fh-commons/agents/quench-challenger.md +49 -23
  12. package/plugins/fh-commons/skills/convergence-loop/SKILL.md +14 -0
  13. package/plugins/fh-commons/skills/deliberation/SKILL.md +14 -0
  14. package/plugins/fh-commons/skills/mcp-circuit-breaker/SKILL.md +10 -1
  15. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  16. package/plugins/fh-meta/CHANGELOG.md +36 -0
  17. package/plugins/fh-meta/agents/beginner.md +4 -1
  18. package/plugins/fh-meta/agents/challenger.md +7 -1
  19. package/plugins/fh-meta/agents/expert.md +1 -1
  20. package/plugins/fh-meta/agents/fact-checker.md +7 -1
  21. package/plugins/fh-meta/agents/hub-persona-auditor.md +2 -1
  22. package/plugins/fh-meta/agents/main-player.md +4 -1
  23. package/plugins/fh-meta/agents/persona-innovator.md +10 -2
  24. package/plugins/fh-meta/skills/agent-composer/SKILL.md +2 -2
  25. package/plugins/fh-meta/skills/apex-review/SKILL.md +5 -0
  26. package/plugins/fh-meta/skills/asset-placement-gate/SKILL.md +38 -8
  27. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +16 -2
  28. package/plugins/fh-meta/skills/context-doctor/SKILL_detail.md +45 -10
  29. package/plugins/fh-meta/skills/corpus-grounding-expander/SKILL.md +14 -5
  30. package/plugins/fh-meta/skills/cross-ecosystem-synergy-detection/SKILL.md +93 -30
  31. package/plugins/fh-meta/skills/deep-clarify/SKILL.md +28 -9
  32. package/plugins/fh-meta/skills/fh/SKILL.md +4 -0
  33. package/plugins/fh-meta/skills/frontier-digest/SKILL.md +64 -8
  34. package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +20 -7
  35. package/plugins/fh-meta/skills/goal-quench/SKILL.md +48 -15
  36. package/plugins/fh-meta/skills/goal-quench/SKILL_detail.md +58 -11
  37. package/plugins/fh-meta/skills/harness-doctor/SKILL_detail.md +109 -33
  38. package/plugins/fh-meta/skills/harvest-loop/SKILL.md +6 -1
  39. package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL.md +126 -17
  40. package/plugins/fh-meta/skills/install-doctor/SKILL.md +50 -14
  41. package/plugins/fh-meta/skills/install-wizard/SKILL.md +26 -7
  42. package/plugins/fh-meta/skills/install-wizard/SKILL_detail.md +68 -21
  43. package/plugins/fh-meta/skills/memory-hygiene/SKILL.md +64 -17
  44. package/plugins/fh-meta/skills/meta-prompt-builder/SKILL.md +38 -4
  45. package/plugins/fh-meta/skills/persona-roster-expander/SKILL.md +15 -7
  46. package/plugins/fh-meta/skills/plugin-recommender/SKILL.md +39 -11
  47. package/plugins/fh-meta/skills/plugin-recommender/SKILL_detail.md +24 -7
  48. package/plugins/fh-meta/skills/prompt-regression/SKILL.md +54 -11
  49. package/plugins/fh-meta/skills/salience-splitter/SKILL.md +120 -7
  50. package/plugins/fh-meta/skills/salience-splitter/SKILL_detail.md +46 -13
  51. package/plugins/fh-meta/skills/sim-conductor/SKILL_detail.md +28 -3
  52. package/plugins/fh-meta/skills/steel-quench/SKILL.md +3 -1
  53. package/plugins/fh-meta/skills/verify-bidirectional/SKILL.md +72 -14
  54. package/scripts/compaction_probe.sh +153 -10
  55. package/scripts/consent_registry_check.sh +63 -0
  56. package/scripts/count_check.sh +47 -1
  57. package/scripts/degrade_direction_scan.sh +276 -6
  58. package/scripts/degrade_probe_capability.sh +105 -0
  59. package/scripts/lane_runner_check.sh +425 -0
  60. package/scripts/package_coverage_check.sh +190 -35
  61. package/scripts/psa_probe_capability.sh +78 -0
  62. package/scripts/psa_scan_lib.sh +164 -0
  63. package/scripts/public_surface_scan_files.sh +38 -0
  64. package/scripts/selfcheck.sh +346 -28
  65. package/scripts/test_capability_entrypoint_shipping.sh +132 -0
  66. package/scripts/test_consent_registry.sh +54 -0
  67. package/scripts/test_count_check_readme_format_lanes.sh +75 -0
  68. package/scripts/test_degrade_scan_shell_probes.sh +415 -0
  69. package/scripts/test_marker_crossfamily_lanes.sh +10 -1
  70. package/scripts/test_marker_floor_lanes.sh +25 -1
  71. package/scripts/test_psa_singlefile_lanes.sh +288 -0
  72. package/scripts/test_reviewer_capability_conformance.sh +10 -1
  73. package/scripts/test_selfcheck_state_lanes.sh +173 -0
  74. package/scripts/validate_yaml.sh +146 -0
  75. package/templates/degrade_direction_scan.sh +276 -6
  76. 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
- + SKILL.md has imperative pointer for every removed section (> **Detail**: See SKILL_detail.md §<X>)
127
- + SKILL_detail.md created: ## §SectionName header for every pointer in SKILL.md
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
- → Fallback (skill unavailable): manually confirm "trigger step overview key decision Done When" all present in SKILL.md
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
- **Not done**: SKILL_detail.md has a §section with no pointer from SKILL.md (orphan section).
135
- **Not done**: Consumer agent grade P/B after split a behavioral rule was moved to SKILL_detail.md when it should have stayed.
136
- **Not done**: Any behavioral rule present only in SKILL_detail.md.
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
- When unsure, apply the **D-skill cold-start test mentally**:
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 → On-demand
62
+ > - NO → **candidate** for on-demand — not yet a verdict
63
63
 
64
- Behavioral rules always pass this test (even if rarely triggered, the consumer needs to know the constraint exists).
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 `## §SectionName` in SKILL_detail.md must have a corresponding pointer in SKILL.md. If not → either add pointer or merge with adjacent section.
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
- # 1. Pointer extraction from SKILL.md
157
- grep -oE "SKILL_detail\.md §[A-Za-z0-9_-]+" plugins/{plugin}/skills/{name}/SKILL.md
158
-
159
- # 2. Section headers in SKILL_detail.md
160
- grep "^## §" plugins/{plugin}/skills/{name}/SKILL_detail.md
161
-
162
- # 3. Diff every pointer must have a matching section
163
- # Any pointer with no matching section = Phantom fix before commit
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 §sections | Every ## §SectionName in SKILL_detail.md has a pointer from SKILL.md |
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 checkout -b "$BRANCH"
339
- # [process M-tier items]
340
- git add -p
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
- | memory `feedback_bidirectional_self_validation.md` | Add cumulative count + new round table | Self-perpetuation of this rule |
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** (`feedback_markdown_edit_discipline`): Use Edit for existing `.md`. Write prohibited. If unavoidable, verify immediately with `git diff`.
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 `memory feedback_bidirectional_self_validation.md`:
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** (`feedback_simplification_evidence`) — when creating/modifying this skill, only update SKILL.md. Do not create additional auxiliary files
213
- - **Markdown editing discipline obligation** (`feedback_markdown_edit_discipline`)prefer Edit. Write prohibited
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` (rule body) | User environment's own `memory/` or `notes/` bidirectional validation rule / if absent, follow this skill's own rule baseline |
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
- + fact-checker self-catch mark output
250
- + Step 4.5 diff gate user confirmation complete (y/N response received)
251
- + Update trigger count updated
252
- + External validation path: harvest-loop's Critic isolation pass (SAGE automated critique) can independently judge based on above criteria (skill_quality_rubric.md verifiable criteria)
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
- - Rule body: `memory feedback_bidirectional_self_validation.md`
260
- - Operating model text: `memory feedback_hub_cc_operating_model.md §2.5·§2.6` — Insight 5 meta dimension + refinement challenge 4 patterns
261
- - 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`
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.