@chrono-meta/fh-gate 1.4.97 → 1.4.98

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 (38) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CATALOG.md +19 -0
  3. package/CHEATSHEET.md +9 -1
  4. package/CLAUDE.md +28 -2
  5. package/README.ja.md +10 -0
  6. package/README.ko.md +10 -0
  7. package/README.md +11 -0
  8. package/README.zh.md +10 -0
  9. package/docs/pillars.svg +3 -7
  10. package/knowledge/shared/harness-core/fh_ecosystem_positioning.md +2 -0
  11. package/knowledge/shared/harness-core/fh_global_positioning_and_distribution_roadmap.md +136 -0
  12. package/knowledge/shared/harness-core/fh_three_layer_canon.md +20 -0
  13. package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +215 -2
  14. package/knowledge/shared/harness-core/ship_readiness_gate.md +112 -0
  15. package/knowledge/shared/learnings/subagent_invocations_log.yaml +55 -0
  16. package/package.json +5 -1
  17. package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
  18. package/plugins/fh-commons/skills/ko-tech-writer/SKILL.md +63 -12
  19. package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
  20. package/plugins/fh-meta/CHANGELOG.md +65 -0
  21. package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +30 -0
  22. package/scripts/degrade_direction_scan.sh +10 -1
  23. package/scripts/digest_landing_check.sh +20 -4
  24. package/scripts/fh_node_check.sh +60 -1
  25. package/scripts/fh_session_load.sh +22 -2
  26. package/scripts/frontier_digest_autopilot.sh +229 -0
  27. package/scripts/lane_runner_check.sh +237 -25
  28. package/scripts/package_coverage_check.sh +17 -0
  29. package/scripts/postinstall_notice.js +34 -0
  30. package/scripts/selfcheck.sh +111 -5
  31. package/scripts/test_degrade_scan_shell_probes.sh +75 -0
  32. package/scripts/test_field_canon_lanes.sh +29 -5
  33. package/scripts/test_lane_runner_lanes.sh +221 -0
  34. package/scripts/test_stale_clone_guard_lanes.sh +21 -7
  35. package/scripts/test_version_lockstep_lanes.sh +62 -0
  36. package/scripts/version_lockstep_check.sh +143 -1
  37. package/templates/.git-hooks/pre-commit +22 -1
  38. package/templates/degrade_direction_scan.sh +10 -1
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: field_verdict_crossfamily_gate
3
- description: Load-bearing field-project verdict/gate/safety code gets the same cross-family adversarial gate as FH assets — the correlated default-toward-PASS blind spot is model-family-level, not FH-specific.
3
+ description: Load-bearing field-project verdict/gate/safety code gets the same cross-family adversarial gate as FH assets — the correlated default-toward-PASS blind spot is model-family-level, not FH-specific. §7 adds the standpoint axis (orthogonal to family) for shared-body/cross-harness-boundary changes.
4
4
  type: reference
5
5
  date: 2026-07-03
6
- tags: [cross-family, decorrelation, verdict-binding, field-harness, degrade-direction, correlated-blindspot, mode-d]
6
+ tags: [cross-family, decorrelation, verdict-binding, field-harness, degrade-direction, correlated-blindspot, mode-d, standpoint-axis, cross-harness-boundary]
7
7
  ---
8
8
 
9
9
  # Field-Harness Load-Bearing Change Gate — cross-family, pre-merge
@@ -141,3 +141,216 @@ converge loop **before it is considered done**. The autonomy floor applies — t
141
141
  judgment on borderline cases is trusted only at opus-tier or above; a below-floor orchestrator
142
142
  runs the review or asks, never silently skips (`[[feedback_judge_robustness_mechanical_anchor]]`,
143
143
  CLAUDE.md §Floor governance).
144
+
145
+ ## §7 Standpoint axis — orthogonal to family, formalized 2026-08-14
146
+
147
+ **The gap this closes**: §3 above establishes that cross-family review decorrelates the
148
+ *reviewer's error distribution*. It does not decorrelate the *reviewer's ground-truth source*.
149
+ Three families reviewing a shared-body change (code authored in one harness, consumed by or
150
+ governing interaction with a different harness) all read the SAME artifact from the SAME
151
+ standpoint — the author's own repo, the author's own understanding of the target's rules — if none
152
+ of them ever executes as, or is run by, the target harness itself. A defect that only manifests
153
+ relative to the target's actual conventions is invisible from that standpoint regardless of how
154
+ many families read it, because the miss is not in *how the diff was read*, it is in *what the
155
+ review was grounded against*.
156
+
157
+ **One sentence**: *family diversity raises resolution within one standpoint; standpoint diversity
158
+ changes which ground truth the review is checked against — they are orthogonal axes, and a review
159
+ that maxes out the first while leaving the second at zero has not raised its coverage of
160
+ standpoint-dependent defects at all.*
161
+
162
+ **Why the same author cannot close this by working inside the target repo and opening the PR
163
+ there — corrected framing (2026-08-14, after a cross-harness standpoint review of this section
164
+ itself).** The claim is *not* "the author is structurally blind to their own work" — a controlled
165
+ same-repo trial recorded outside this repo found that authors explicitly asked to self-check their
166
+ own output largely close the gap themselves (a clean replication refuted the stronger
167
+ "non-self-administrable" reading). What that trial's surviving result actually supports is
168
+ narrower and still real: a **routinely-run rubric that checks against the target's own corpus**
169
+ does work the author's default self-review does not reliably do on its own — the value is in the
170
+ rubric being supplied and run as a matter of course, not in some inherent authorial blindness.
171
+ This is measured, not asserted, from a second angle too: a 2026-08-14 trial recorded a human
172
+ insider review approving a change that violated a directory convention its own governance
173
+ documents disagreed about — neither reviewer, human or AI, held both conflicting documents at
174
+ once. Standpoint-grounded review is a routine cross-check against the target's ground truth, not
175
+ a claim that the author (of any kind, including a human insider) is incapable of finding it alone.
176
+
177
+ **Field evidence — three artifacts, two organizations, three repos, one carrying two independent
178
+ trials, one day** (corrected count, 2026-08-14 — an earlier draft of this section said "four
179
+ independent instances"; row 2 and row 4 below are two trials of the *same* artifact, not two
180
+ artifacts, and internal project codenames in a sibling field harness's private tooling are
181
+ genericized here per that harness's own residency rule — the specific names are on record in FH's
182
+ private companion store, not in this shared-layer doctrine file):
183
+
184
+ | # | Where | What only-standpoint-review caught | What full-family review missed it |
185
+ |---|---|---|---|
186
+ | 1 | forge-harness PR #368 | Write-side namespace fix left the read side (`sync-from-be.sh`, `fh_session_load.sh`) completely unsuffixed — a sibling hub's first SessionStart would read the author hub's own data as its own. **Confound named, not smoothed over**: the file is FH-owned, so "different harness" and "not the original author" are not cleanly separated here — this instance supports *"a different-standpoint check caught it,"* not *"a different-standpoint check was structurally necessary"* (see `fh_three_layer_canon.md §1-b ⓑ` for the fuller hedge) | 2 Claude waves + codex(gpt-5.5), all reviewing from the author hub's own content-reading standpoint |
187
+ | 2 | a sibling field harness's black-box regression repo, PR #8 (reps=3, 2026-08-07) | First measurement of the **finding-class split** under this specific frame — peripheral finding class differs by harness even when core defects are harness-invariant. Not the first sample of the underlying axis: `harness_verification_core_extended.md` (PR #225, 2026-08-01) already doctrinized "verification dispatched from a different harness" as Extended, with its own N=2 evidence; this instance and `[[feedback_decorrelation_axis_matches_failure_mode]]` are additional samples of that same axis, not a new one | Same-model, same-prompt, harness-blind arm |
188
+ | 3 | qasp-dev PR #161 (`mirror_guard_check.sh`) | 67 tracked files sat unregistered in a real protected-path list for months; 50 existing regression fixtures were **synthetic**, built by the same process that wrote the implementation, so they shared its blind spot structurally. **Confound named**: this is a same-author/same-repo blind spot (synthetic fixtures written by the implementer), not a cross-harness-boundary case under this section's own trigger below — an *adjacent* axis to standpoint, not a direct instance of it; kept here as corroboration of the family, not as a fourth standpoint data point | The suite's own author, repeatedly, across its whole synthetic-fixture lifetime |
189
+ | 2b | the same sibling harness's PR #8, known-answer calibration trial (2026-08-14) | 9 confirmed findings beyond a 21-comment human review baseline (7 of them S-tier, verdict-input-corrupting); the trial's own hint-vs-no-hint arms scored identically, so **prompt** variation (the hint) contributed nothing the standpoint shift didn't already carry — the arms did not vary model family, so this instance is silent on the family axis specifically | A target-harness-native human reviewer, plus the same-repo author |
190
+
191
+ Instance 3 was found *by this session, independently,* while reviewing qasp PR #161 for merge —
192
+ not fed in from the sibling harness's thread — even though (per the confound above) it is adjacent
193
+ rather than a clean standpoint instance. The genuine standpoint pattern (rows 1, 2, 2b) reproduced
194
+ across two organizations the same day it was being formalized, and a fourth, retrospective data
195
+ point landed the same day too: a cross-harness standpoint review of *this very section*, run
196
+ against a sibling field harness's own repo, independently surfaced the residency and citation
197
+ defects this revision fixes — a second live demonstration of the same axis, folded into the fix
198
+ rather than tabulated as a fifth row (it reviewed this doctrine, not a code change). That same
199
+ review also revealed a *sequencing* defect, not just a content one — see **Sequencing** below;
200
+ one event, cited twice for two different things it showed.
201
+
202
+ **Formalization decision (operator, 2026-08-14)**: the evidence bar this repo requires before
203
+ mechanizing a judgment call (`[[feedback_evidence_threshold_build_discipline]]`,
204
+ `[[feedback_mechanize_at_repetition_prose_before]]`) is met — three artifacts (one with two
205
+ independent trials), cross-organization, with a named causal mechanism, not a recurrence count
206
+ alone. The prior hold on this (pmh-dev#68: *"1회 시행부터, 지금 게이트/마커를 늘리지 않는다"*) is
207
+ **lifted**. This section is that formalization.
208
+
209
+ **Naming note**: this field's name collides with FH's own existing use of "standpoint" as the
210
+ persona/viewpoint organizing noun (`fh-meta:beginner`/`main-player`/`expert`, "parallax-compatible"
211
+ output — a *different* axis: which persona is looking, not whose repo is the ground truth). Kept
212
+ as-is rather than renamed — the term is already load-bearing in this session's own conversation and
213
+ in cross-harness correspondence about it — but the two senses are genuinely different concepts and
214
+ must not be conflated: agent-registry "standpoint" = which persona reviews; this field's
215
+ `standpoint:` = whose repo the review is grounded against. If this collision causes real confusion
216
+ in practice, the fallback is renaming the *field* (not the section) to `ground_truth:` — the enum
217
+ values below are unaffected either way.
218
+
219
+ **The field**: `standpoint:` — sits alongside `crossfamily:` in the same load-bearing verification
220
+ marker, never replacing it. Closed enum, same discipline as `crossfamily:`'s three-way *could
221
+ not / did not / did not look* split (a free-prose field would let an unrun check read as a clean
222
+ pass):
223
+
224
+ ```
225
+ tier1 content-only review — no standpoint decorrelation (the default
226
+ unless upgraded; NOT itself a failure, most changes have no target
227
+ standpoint to borrow)
228
+ tier2(<target-harness>) peer-simulated — the reviewer instantiated/ran the TARGET's own repo
229
+ (a local clone, real content) and executed the change from that
230
+ standpoint. Closes shared-body-path defects; a BARE clone cannot see
231
+ the target's gitignored local wiring (settings, consent bindings,
232
+ node-local state) — that gap is inherent to a clone, not a defect in
233
+ a given run. Named exception, not a loophole: if the reviewer's own
234
+ node ALSO mirrors the target's gitignored state through some other
235
+ channel (e.g. a companion-store sync that carries `tracks/_meta`
236
+ across machines), that visibility is real and should be credited —
237
+ but state so explicitly on the marker line, since the default
238
+ assumption for an ordinary clone is still "local wiring invisible."
239
+ tier2b(<target-harness>) same operator, target's real runtime — the SAME human operator who
240
+ authored the change runs it in the target harness's actual runtime
241
+ (not just a clone's content), so local wiring IS visible, but the
242
+ reviewer is not an independent party. Distinct from tier2 (content
243
+ only, no local wiring) and from tier3 (independent party). Exists
244
+ because tier3 is structurally unreachable for a harness pair with a
245
+ single shared operator — see the residual below — and collapsing that
246
+ case into tier3 would overclaim independence it does not have.
247
+ tier3(<target-harness>) actual peer — a DIFFERENT human operator of the target harness ran
248
+ the change in their real runtime. The only tier with both local
249
+ wiring AND reviewer independence from the author.
250
+ not-applicable the change has no target-harness standpoint to borrow (no
251
+ shared-body surface, no cross-repo consumer contract) — distinct
252
+ from a degrade value; this is a scoping fact, not a miss. Carries the
253
+ same substantive-grounds-on-the-same-line discipline as a degrade
254
+ value below — asserting non-applicability without naming what was
255
+ checked is indistinguishable from UNKNOWN wearing a permissive label
256
+ DEGRADED_NO_TARGET_ACCESS could not — applicable, but no local clone/access to the target
257
+ harness existed
258
+ DEGRADED_NOT_RUN did not — target was accessible, standpoint review was skipped
259
+ UNKNOWN did not look — applicability itself was never assessed
260
+ ```
261
+
262
+ **Residual this enum split names rather than hides**: for a harness pair with one shared human
263
+ operator (this repo and a sibling field harness the same operator also runs), `tier3` is either
264
+ unreachable or collapses into "the same author ran it in the other repo" — which is exactly the
265
+ standpoint the "why the same author cannot close this" argument above says is insufficient on its
266
+ own. `tier2b` is the honest reachable rung for that pairing; do not inflate a `tier2b` run to
267
+ `tier3`, and do not undersell it to `tier2` either — it is a distinct, real, if operator-correlated,
268
+ data point.
269
+
270
+ **Mechanization status — `standpoint:` is prose-only today, and this must not be read as more than
271
+ that.** `crossfamily:`'s degrade triad is hard-blocked at commit (`templates/.git-hooks/pre-commit`,
272
+ `scripts/test_marker_crossfamily_lanes.sh` — grep-verified: ~20 crossfamily references in the hook,
273
+ validated fixtures). `standpoint:` has **zero** matches in that hook and no fixture suite — nothing
274
+ stops an author from writing `not-applicable` with a thin justification, or omitting the field
275
+ entirely, and no marker-shape check catches it. §Marker required fields in
276
+ `.claude/rules/fh_4axis_gate.md` does not yet list `standpoint:` either (add it there when this
277
+ mechanizes). This is the honest current state, not a placeholder apology: the field exists so a
278
+ human reader can ask for it and so the *next* occurrence of a false `not-applicable` has something
279
+ concrete to point at — mechanize on that first recorded false value
280
+ (`[[feedback_mechanize_at_repetition_prose_before]]`), not before. **Ownership**: this field lives
281
+ in FH's own shared-layer canon, so mechanizing it (hook lanes, fixtures) is FH's job — a sibling
282
+ field harness that syncs this file verbatim cannot add the check locally without its own sync
283
+ process rejecting the divergence, so do not expect the check to appear from the consuming side.
284
+
285
+ **Where the evidence itself lives — the same gate-locality problem, applied to this field.** A
286
+ sibling field harness's own governance doctrine already names this exact defect: verification
287
+ evidence recorded in a gitignored local marker is *"evidence placed where the reviewer cannot
288
+ read it"* — a reviewer on another session, repo, or runtime structurally cannot reach it. This
289
+ field inherits that problem in its sharpest form, because a `tier2`/`tier3` value is a claim
290
+ *about a second party*, and the only party positioned to falsify it is the party the field is
291
+ gitignored away from. Treat the local marker line as a private note, never the canonical evidence:
292
+ the canonical, reviewer-visible copy belongs in the sanitized PR-body evidence capsule
293
+ (`.claude/rules/fh_4axis_gate.md` §Reviewer-visible evidence — same discipline, not a new one), and
294
+ a `tier3`/`tier2b` claim should carry a counter-artifact reachable from the target side (a linked
295
+ issue/PR comment, not just an assertion in the author's own repo) whenever one exists.
296
+
297
+ **Sequencing — runs on the local diff before the first push, one rule, no risk-branch (added
298
+ 2026-08-14, self-correction).** §4 above titles the whole gate *"before merge, not after"* — this
299
+ field **tightens** that, it does not merely inherit it: a push to a public remote is itself a
300
+ publication event, so "before merge" is not early enough on its own (a PR can sit open, reviewed,
301
+ un-merged, and still have leaked). The retrospective review recorded above as the *"fourth,
302
+ retrospective data point"* — the cross-harness standpoint review of this very section — is the same
303
+ event this paragraph is about, cited there for its evidentiary weight, cited here for what it
304
+ revealed about *timing*: it ran on **PR #370**, the PR that introduced this field, **after** the PR
305
+ was already open and pushed to a public repo. That review found four S-tier findings; two were
306
+ residency leaks (an internal codename, a re-identifiable colleague anecdote), and by the time they
307
+ were caught, the leaking lines had already sat in a public, pushed commit — precisely the ordering
308
+ the repo's own Pre-Publish Surface Gate exists to prevent (*"scrub before publish, never
309
+ publish-then-scrub"*). Those specific lines were fixed forward in a later commit, not removed via
310
+ history rewrite (which would itself be a Destructive-Op-gated action) — the pushed commit that
311
+ originally carried them is still reachable in git history. Record which path was taken whenever
312
+ this recurs; do not let "fixed" imply the exposure itself was undone. (Findings recorded in PR
313
+ #370's sanitized evidence capsule; the specific leaked strings are in FH's private companion store,
314
+ not here.)
315
+
316
+ The fix is not a second risk-judgment ("is this specific change risky enough to justify running
317
+ pre-push instead of post-PR") — that would just add another judged branch point with its own cost
318
+ and its own failure mode. The fix is a single unconditional rule: whenever the §7 trigger below says
319
+ `standpoint:` applies at all, the review runs on the **local diff, before the first push to any
320
+ remote** — public or private, no visibility judgment to make. Axis 2/3 (steel-quench/phantom-quench)
321
+ run earlier still, at first commit (`.claude/rules/fh_4axis_gate.md`); run standpoint alongside them
322
+ when convenient, but the binding line for this field is the push, not the commit. Opening the PR is
323
+ the reviewer hand-off, and by that point this review should already be clean; if it is not clean
324
+ yet, the PR does not open yet.
325
+
326
+ **Trigger — narrower than §4's full gate, deliberately, and defined by effect, not by file-class.**
327
+ A file-class trigger ("touches `scripts/`, `knowledge/shared/`, `templates/`...") overtriggers for
328
+ a harness pair whose consumer contract already treats nearly the entire shared layer as
329
+ synced-verbatim — for such a pair almost every commit would qualify, which is the over-pricing
330
+ this trigger is trying to avoid, not invoke. The trigger is therefore the **behavioral** subset:
331
+ `standpoint:` is required when a change alters another harness's actual behavior, gate outcome, or
332
+ interaction contract — not merely when it touches a synced path. An ordinary load-bearing change
333
+ with no behavioral cross-harness surface is `not-applicable` by scope, not by degrade, even if the
334
+ file it lives in happens to be synced elsewhere. This mirrors a sibling harness's own scoping
335
+ proposal (pmh-dev issue #68, verified verbatim in that thread: *"대상 후보가 좁다 — 두 허브가 같은
336
+ 컴패니언·같은 스크립트를 공유하는 경로. 전면 도입이 아니라 이 클래스만"*) — narrowed here to the
337
+ behavioral reading after that same review found the file-class reading false for at least one real
338
+ pair.
339
+
340
+ **Relationship to `harness_verification_core_extended.md`'s core/extended axis**: tier2 and tier3
341
+ are both "extended" in that document's sense (they require a cluster member's engine or repo to
342
+ discharge) — this field does not compete with that doctrine, it subdivides one corner of it.
343
+ Extended asks *was a cluster instrument used*; `standpoint:` asks, given that a cross-harness
344
+ surface exists, *whose ground truth was the review checked against*. A verification can be
345
+ Extended (a field harness's own audit lens was dispatched) while still being `standpoint: tier1`
346
+ if that dispatch never executed as the *specific other harness on the other side of this exact
347
+ change* — Extended is about instrument sourcing, `standpoint:` is about whose repo the check ran
348
+ against.
349
+
350
+ **Named residual, honestly scoped**: the proven-uplift bar `auto-decorrelation` already requires
351
+ for the family axis (`tracks/_meta/decorrelation_calibration_*.md`, N≥3 before claiming *proven*
352
+ rather than *measured*) applies here too — three artifacts (one with two independent trials, plus
353
+ the retrospective standpoint review of this section itself) is enough to mechanize the **field**,
354
+ not enough to claim the standpoint axis's uplift is calibrated in the same statistical sense family
355
+ diversity is. Record accordingly: `standpoint:` entries accumulate toward that bar, they do not
356
+ presuppose it already cleared.
@@ -140,6 +140,23 @@ engine was precisely that **an identity declaration is not a judgment circuit**
140
140
  net loss; removing it recovered +0.67 on the weak tier). A one-word translation re-fuses exactly what the
141
141
  measurement separated.
142
142
 
143
+ **Numbering rule — engines are named, never numbered.** Write `context-continuity`, not "engine ④".
144
+ There is no canonical engine order: the table above reads *external-grounding · judgment-circuit ·
145
+ ship-gate · context-continuity*, and the prose further down this same file reads *judgment-circuit ·
146
+ ship-gate · context-continuity · external-grounding*. A number derived from one decodes to a different
147
+ engine under the other — and the two candidates for "④" are **context-continuity and
148
+ external-grounding**, which currently hold different grades, so the ambiguity is not cosmetic.
149
+ The collision is worse than one file's internal disagreement: **the identities are numbered ①–⑤ and the
150
+ engines are not numbered at all**, so a bare ① in any record is undecidable without its sentence. This
151
+ file shows it — a paragraph enumerating engines sits four lines above `③⑤ are 🟢, ①②④ are 🔵 RC`,
152
+ where those numerals mean *identities*.
153
+
154
+ > **Legacy decode (do not delete — session records already use numbers).** Records written before
155
+ > 2026-08-13 say 엔진 ①~④. They decode by the **engine table order above**:
156
+ > ① external-grounding(물어보기) · ② judgment-circuit(영혼) · ③ ship-gate(품질게이트) ·
157
+ > ④ context-continuity(맥락유지). That is the ordering those records were written under; it is
158
+ > recorded here so they stay readable, **not** to make the numbering canonical. New writing uses names.
159
+
143
160
  **Why engines gate the advertised capabilities**: the harness's most-advertised surfaces — incubating a new
144
161
  project, orchestrating a multi-harness cluster — are simultaneously *long, autonomous, novel and shipping*.
145
162
  They therefore load all four engines at once, which is why a harness with a mature ship-gate and little
@@ -151,6 +168,101 @@ else appears to fail *at* those surfaces while the cause is underneath them.
151
168
  > what is known. (The counterweight matters here: a mapping that looks tidy is the easiest thing to start
152
169
  > citing as a finding.)
153
170
 
171
+ ### Engine status (2026-08-13) — the first *measured* grades
172
+
173
+ These grade the **engines themselves**, on the same ladder as the identities (🔵 RC = implemented ∧
174
+ known-pair-calibrated ∧ its own self-test green · 🟢 = a real-situation firing artifact, n≥1). They were
175
+ **measured, not composed**: every leg-2 verdict comes from a **revert probe** — disable the mechanism,
176
+ re-run the suite, check that *exactly* the matching lane reddens — because a green suite is not evidence
177
+ that the suite measures the thing. **What a revert probe proves is lane discrimination** — that a
178
+ given branch has a lane which notices its removal. It does **not** prove that the engine's whole
179
+ instrument surface is covered; those are different claims, and ship-gate below is the row where
180
+ they visibly diverge. That method earned its place the same day: **three of the four engines
181
+ had at least one live branch that survived deletion with every lane still green.**
182
+
183
+ **Grade = the LOWEST leg that fails, never the highest leg reached.** A real-situation firing does
184
+ not lift a row whose leg 1 or leg 2 is broken. external-grounding below is exactly that case — it
185
+ *has* a genuine firing artifact and is still 🟡, because the layer that supervises the firing sits
186
+ under the RC bar. Reading the ladder as "highest leg wins" inverts every row in this table.
187
+ (Named by the cross-family reviewer as the one real inconsistency in the first draft, which stated
188
+ 🟢 = firing n≥1 without saying that the lower legs still gate it.)
189
+
190
+ ⚠️ **These are not identity grades, and they do not upgrade the mapping.** The identity↔engine column
191
+ above remains the unverified hypothesis it declares itself to be. An engine grade says what the harness
192
+ *can do*; it says nothing about which identity that unlocks.
193
+
194
+ | Engine | Grade | Leg 1 — implemented ∧ wired | Leg 2 — known-pair, revert-probed | Leg 3 — self-test | 🟢 real firing |
195
+ |---|---|---|---|---|---|
196
+ | **ship-gate** (품질게이트) | 🟢 **GREEN** | pre-commit + pre-push, `core.hooksPath` verified live | ✅ 37 cross-family fixtures · 30 branch-claim · marker-floor. **2 revert arms, each reddening only its own lane** (neutering the degrade-grounds check surfaced `'client error'` passing on the substring `cli`; restoring the `single-family` free exit surfaced two more) | ✅ 3 suites `rc=0` | ✅ **twice in one session (2026-08-13)** — a commit blocked as `🚫 BLOCKED — resolve failing axes`, and a branch-claim block that stopped a commit from landing on a **peer session's branch** in a shared checkout |
197
+ | **context-continuity** (맥락유지) | 🔵 **RC** | `compaction_probe` (PreCompact + UserPromptSubmit; snippet ships and `install-wizard` merges it by glob, not by name) · `session_close_check` (pre-push) · `digest_landing_check` · `utterance_landing_check` | ✅ 47 pairs after the 2026-08-13 fix, **4 revert arms**; session axis probed separately (deleting the card-last *verdict* — not its message — reddens its lane) | ✅ 47 · 10 · 8 · 8/8, all `rc=0` | ❌ **withheld, and the reason is the interesting part** — see below |
198
+ | **external-grounding** (물어보기) | 🟡 **PARTIAL** | `novelty_claim_check` wired (pre-commit + selfcheck) but **advisory, non-blocking** · `digest_landing_check` has **zero callers** · the daily digest launcher ships a **placeholder path** in its plist | ⚠️ split: novelty **8/8 arms anchored**; landing-check has **4 live branches that survive deletion**, one of which flips a genuine *miss* into a false *landed* | ✅ novelty 13 pairs · landing 10 lanes — but the latter only runs when a human types it | ✅ **exists** — 5 `frontier-auto:` commits (2026-06-22 → 07-28); one hand-verified, it labelled an unreachable source `UNCALIBRATED` instead of asserting through it |
199
+ | **judgment-circuit** (영혼) | 🔴 | ⚠️ the lint + registry exist and are wired, but the engine is a **6-step loop and only step ③ has a mechanical anchor (1/6)** | ⚠️ known-positive/negative both present; **5 arms unanchored**, including deleting the pre-commit block, the selfcheck wiring, and the registry file — none reddens anything | ✅ `rc=0`, 15 pairs | ❌ not found in this repo's tracked history (controls run) |
200
+
201
+ **Why ④ is held at RC rather than promoted.** Its three RC legs stand. The 🟢 leg is withheld for two
202
+ reasons that point the same way: (a) **the instrument that would evidence it is disproven** — the scoring
203
+ leg greps the transcript, and the transcript preserves history across a compaction, so that scorer reports
204
+ zero loss forever (fail-open); the isolated scorer that could answer *"can the model still answer?"* is
205
+ unbuilt; and (b) the one observed pre-fix real firing **delivered a false ledger** — a 5-day-old seal
206
+ announced as "the compaction just before this one," which misled the session that then fixed it. After the
207
+ fix the same path prints an honest *"cannot tell"*. Honest inability is not preserved continuity. **An
208
+ engine whose own measuring instrument is refuted cannot be promoted by argument.**
209
+
210
+ **What the four measurements found in common — one root, three engines.** The wiring of an anchor whose
211
+ lanes live *inside* the script (`--self-test`) is **structurally invisible to the repo's wiring checker**,
212
+ whose scope is the filename patterns `scripts/test_*.sh` / `*_lanes.sh`. So a caller line can be deleted
213
+ and nothing reddens: measured on the judgment-circuit lint (removing its pre-commit block, its selfcheck
214
+ entry, or its registry file each left seven checks green) and structurally true of the landing checker,
215
+ which has no caller at all. This is one rung above the debt the checker was built for: it catches *"a lane
216
+ that never runs"*, not *"a lane that runs, whose caller can vanish unnoticed."* Sharper still — the
217
+ selfcheck comment that closed this class on 2026-08-08 did so with a **hardcoded three-name list**, and the
218
+ landing checker was born the next day outside it. **A repair that enumerates instead of deriving reopens
219
+ itself on the next addition.**
220
+
221
+ **What blocks the next rung, per engine** — cheapest first, and none of it is a rewrite:
222
+
223
+ ```
224
+ ② judgment-circuit ①②(interview · form-forcing) have ZERO mechanism; ④'s mechanism exists and is
225
+ 🔴 → 🟡 simply not wired to this loop; the registry holds ONE entry (this repo's own
226
+ CLAUDE.md), so the instrument has no corpus to measure. Note the instrument
227
+ measures the PRESENCE of a declared form, never whether a circuit is real —
228
+ its own header says a "default to PASS" direction still earns credit.
229
+ ① external-grounding wire the landing checker (zero callers today), and anchor its four surviving
230
+ 🟡 → 🔵 branches — especially the self-reference filter, whose removal turns a real miss
231
+ into a false landing (optimistic direction).
232
+ ④ context-continuity build the isolated scorer. Nothing else moves this row: the question
233
+ 🔵 → 🟢 "was the thread preserved?" has no instrument, and a firing without one is an
234
+ anecdote either way.
235
+ ③ ship-gate already 🟢. The open work is not promotion but scope: its own axis-1 job is
236
+ 🟢 still not a required server-side check.
237
+ ```
238
+
239
+ **A 🟢 engine can still hold an instrument with a silent hole — say so rather than letting the grade
240
+ cover it.** This measurement's leg-2 probe for ship-gate covered the marker and branch-claim lanes, not
241
+ every instrument the engine owns. A parallel axis measured, the same day, that one of the others — the
242
+ package-coverage checker — was dropping **every `.json` reference** through an alternation-order bug
243
+ (`js` matching before `json` in a leftmost-first alternation, leaving a path that then fails an existence
244
+ test and is discarded in silence). That checker had never seen a JSON reference in the shipped docs;
245
+ repairing it surfaced three immediately — one of them a **consumer-facing defect**: a shipped
246
+ document instructs the user to copy a settings file that was not in the package at all. That is
247
+ the very class this checker exists for, and its own regex kept it invisible. The engine grade is unchanged — it is earned by blocks that
248
+ actually fired — but *grade* and *instrument coverage* are different claims and must not be read off
249
+ one another.
250
+
251
+ **And one failure mode this measurement did not anticipate, found the same day by a parallel axis.**
252
+ `npm publish` packs the **working tree, not the commit**. In a checkout shared by several concurrent
253
+ sessions, the session that publishes therefore ships every *other* session's uncommitted draft. It was
254
+ caught here by the pre-publish scan, not by anyone's care — an operator-private token sitting in an
255
+ uncommitted line of a shipped file. The shared-checkout hazard is usually stated as *"my git operation
256
+ moves your working surface"*, which is recoverable; this is the same hazard reaching an **irreversible**
257
+ surface. The fix is not "remove the token" but **publish from a clean tree at a committed state**.
258
+
259
+ **Named residuals of this measurement.** The registry/launcher state of *other* installs was not measured
260
+ (one machine, one tree). The daily launcher's real installation lives outside any git tree, so its liveness
261
+ is **UNMEASURED, not zero**. The judgment-circuit loop's canonical 6-step definition **does not exist in
262
+ this repository's public knowledge layer** (grep: 0 hits, control positive) — it lives in operator-private
263
+ notes, which is itself part of why five of its six steps have nothing here to anchor. And every arm ran
264
+ `reps=1`; the scripts are deterministic, but the convention is `reps≥3`.
265
+
154
266
  ## FH's own status (2026-07-14) — NOT yet all-green
155
267
 
156
268
  Engine column added 2026-08-08 (mapping is the unverified hypothesis flagged above; Status column is
@@ -1942,3 +1942,58 @@
1942
1942
  ★**H1 규율 이행 확인**: innovator 가 벤더 마케팅 출처의 수치 2건(cross-family 검출률 +40~60% · 공유맥락 온보딩 -35~50%)을 SPECULATIVE 로 격리하고 **어느 제안에도 인용하지 않았다**. 대신 «우리 자체 증거가 더 강하다 — 약한 외부 숫자로 강한 내부 실측을 장식하지 마라»를 명시.
1943
1943
  🟥 **codex 발주 비용 관측**: diff + 산문 프롬프트 1회로 충분했다(오전 축의 7회 352KB 대비). 같은 클래스 결함을 같은 채널로 두 번 보내지 않은 것이 차이다.
1944
1944
  ⚠️ **goal-quench 미발화** — 사이드카 3회 미달(2회)이라 카드 K 의 트리거 조건(3회 초과)엔 안 걸렸다. 이건 규율 준수이지 갭이 아니다."
1945
+
1946
+ - date: 2026-08-13
1947
+ session: fh-engine4-compaction-guards + qasp 병렬축 (Opus 5 1M)
1948
+ agents_summary: "4 dispatches: general-purpose×1 (qasp §5 계기 보정 — known-pair 전수, 별 체크아웃 qasp-dev) · fh-commons:quench-challenger×1 (Axis 2, compaction_probe diff) · codex gpt-5.5×1 (같은 diff cross-family, Bash 사이드카) · peer-session SendMessage×2 (재출하 축 파일경계 협상 — 디스패치 아님, 계수 제외)"
1949
+ dispatch_count: 3
1950
+ outcome: accepted
1951
+ evidence: "qasp 축 = 68%(미보정) 을 known-pair 로 보정해 **라우팅 정확도 2.9%(35 중 1)** 로 갈랐다. 신호어 21낱말 중 18 DEAD·1 LIVE(「누락」 혼자 −12) → **목록 튜닝 기대이득 ≈0** 을 실증해 무한달리기를 차단. 컨트롤 ⓑ(FN 16건) 없이 ⓐ만 했으면 한쪽만 쟀을 것 — FN 56%·팬텀 6건(도메인 무관 하드코딩 템플릿 발화)이 거기서 나왔다. 자기정정 2건 보고(자기 출처추적 프로브가 known-positive 를 놓친 것 포함). challenger = M5/R4, 그중 4건 채택 — **선행 0 타임스탬프가 `set -u` 아래 훅을 통째로 침묵시킨다**(불변식 파괴)와 **`>43200` 가지 무앵커**(가지 삭제해도 39쌍 초록)가 최상위. codex = ⓒ 미래 시각 음수 지목, 채택. 산출 = FH PR #359 + 동반 저장소의 계기-보정 핸드오프 1건(2026-08-13)."
1952
+ notes: "★**신규 결함 3건이 전부 «내가 그 세션에 방금 쓴 코드»에 있었고 자력 적발 0.** 수리가 신규 결함의 주된 출처라는 기록된 패턴의 n+1 이다. 되돌림 프로브를 넣지 않았으면 그중 둘은 레인이 초록인 채 통과했다.
1953
+ ★**되돌림 arm D 가 내 앵커 하나를 장식으로 지목했다** — `_age=0` 초기화는 `10#` 하에서 도달 불가라 지워도 47쌍 초록이었다. 지우는 대신 **레인 없음을 코드 주석에 명시**했다(있는 척하지 않기).
1954
+ ★**두 계열이 겹친 지점은 하나뿐이다**(미래 시각). codex=산술/이식성 · 같은-계열=레인 커버리지/주장 정확도 — 탈상관 축이 실제로 달랐고, 한쪽만 돌렸으면 절반을 놓쳤다.
1955
+ 🟥 **challenger 가 내 Added-Scope 판단의 «근거»를 정확히 반증했다**(결론은 유지): 사후 귀속이 «불가능»한 게 아니라 `rm`→`mv` 한 줄이면 살아나고, 내가 든 기계화 임계 논거는 그 종류에 적용되는 게 아니었다. 결론(별건 분리)은 그대로 두고 근거만 정정했다.
1956
+ ⚠️ **qasp 축의 자기신고 경계**: 손판정에 기계 앵커가 없어 「진짜 기획 문의 1건」은 자평이고, 정답키 대조(조건 ①)는 범위 밖이다. 경합 가설 2개(MTM ③ 부재 vs TC 자체 파손)를 안 갈랐다 — 그쪽이 스스로 적었다."
1957
+
1958
+ - date: 2026-08-13
1959
+ session: fh-reship-lane-debt-wiring (Opus 5 1M, 재출하 캠페인 축)
1960
+ agents_summary: "2 dispatches: fh-meta:challenger×1 (Axis 2, DEBT-12 배선 델타 — diff + 주장 C1~C6 동봉) · codex gpt-5.5×1 (같은 델타 cross-family, Bash 사이드카). peer-session SendMessage×8 (소유 선언 6 + 통지 2 — 디스패치 아님, 계수 제외)"
1961
+ dispatch_count: 2
1962
+ outcome: accepted
1963
+ evidence: "두 계열이 **상위 3건에서 독립 수렴**했다 — ⓐ 팬텀 4건(shipped selfcheck.sh 가 미출하 경로를 새로 참조 → package_coverage FAIL) ⓑ `--list-debt` 반쪽 픽스(bash 3.2 빈 배열, rc=1 재현) ⓒ anchor arm 이 `_ships_per_files` rc=2(UNKNOWN)를 SKIP 으로 접음. ★ challenger 는 **Bash 툴 없이 정적 추적만으로** ⓐ를 예측했고 실행이 그대로 재현했다(레포 selfcheck rc=1). ★ challenger 단독: S2 vendored git 트리 3스위트 거짓 FAIL(`git rev-parse --show-toplevel` 이 바깥 레포를 잡음) — **실측 재현 rc=1 → 수리 후 재측정** · M3 DEBT=0 의 분모가 이름 규약 한정(규약 밖 `--self-test` 4종 호출부 0, 전부 shipped) · M4 exit 2/126/127 무라벨. ★ codex 단독: 헤더 수치 11/8 vs 12/9 자기모순 · indirect-branch 바이패스를 **predicate 로 직접 재현**. 채택 = S1·S2·S3·M1·M2·M3·M4·M6·R1 (9건 수리) · R4 는 명명된 잔여 + 픽스처 고정(동작 유지)."
1964
+ notes: "★**주장(C1~C6)을 diff 와 함께 보낸 것이 결정적이었다.** 반환된 판정이 「부분 반증 5 · 반증 1」로 주장별로 갈렸고, 그중 C2(「소비자 거짓 FAIL 없다」)는 **두 방향에서 다르게 틀렸다** — 소비자가 아니라 소스트리가 먼저 빨개졌고(S1), 소비자 쪽은 plain tarball 이 아니라 **vendored git 트리**에서 터졌다(S2). diff 만 보냈으면 「주장이 틀렸다」는 축이 구조적으로 비었을 것이다([[feedback_decorrelation_axis_is_what_you_send]] 의 이득 쪽 얼굴).
1965
+ ★**두 계열의 겹침은 3건, 나머지는 안 겹쳤다.** challenger=실행환경/스코프 · codex=자기모순/predicate 재현. 탈상관 축이 실제로 달랐다.
1966
+ 🟥 **자력 적발 0.** 아홉 건 전부 남이 잡았다. 그중 M1 은 **같은 커밋이 20줄 아래에서 설명하는 바로 그 버그**를 세 번째 사이트에 남긴 것이고, S3 는 **그 fail-open 을 막으려고 만든 헬퍼 30줄 아래에서** 12번 재생산한 것이다. 둘 다 반쪽-픽스 전파경계.
1967
+ ★**배선이 가정을 표면화한다** — S2 는 «배선 전엔 안 돌았으니 틀린 루트가 비용 0이었다». 죽은 레인을 살리는 것은 그 레인이 품은 모든 환경 가정을 처음으로 실행에 노출시키는 일이다.
1968
+ ⚠️ **codex 와 내 tarball 실측이 갈렸다**: 내 plain-tarball 런은 `SELFCHECK: PASS`(rc=0), codex 의 런은 `test_ollama_panel_lanes.sh` 환경 실패로 FAIL. 이 델타 소관 아님(선재·환경 의존)이나 **편한 쪽을 고르지 않고 양쪽을 적는다** — flaky/환경의존 레인으로 잔여 등재."
1969
+
1970
+ - date: 2026-08-13
1971
+ session: fh-engine-four-grade-table (Opus 5 1M) — 같은 세션 후반, 위 엔트리의 후속
1972
+ agents_summary: "3 dispatches: general-purpose×2 (엔진① external-grounding · 엔진② judgment-circuit 의 RC 3다리 실측 — 각각 동결 워크트리에서 격리) · codex gpt-5.5×1 (등급표 절 본문 cross-family)"
1973
+ dispatch_count: 3
1974
+ outcome: accepted
1975
+ evidence: "엔진①② = 등급 판정의 **입력**을 격리로 뽑았다. 둘 다 동결 워크트리(bdb298e, 과녁 지문 대조 후 시작·clean 복원 확인)에서 돌았고, **되돌림 프로브를 각자 수행**했다 — ①: novelty 8/8 앵커 생존 ↔ digest_landing **4 arm 전부 무앵커**(자기참조 필터 제거가 진짜 미착지를 거짓 착지로 뒤집는 낙관 방향) + 호출부 0개 · ②: 15 arm 중 **5 무앵커**(pre-commit 블록 36줄·selfcheck 배선·등록부 파일을 통째로 지워도 7종 검사 rc=0) + **6단계 루프 중 기계 앵커 1/6** 을 정본 인용과 함께 계수. codex = 사다리 정의의 **실제 비일관 1건** 지목(🟢=실발화 n≥1 인데 ①이 실발화를 갖고도 🟡) → 「등급 = 실패한 가장 낮은 다리」 명시 규칙으로 반영 + 경계 2건. 산출 = PR #363."
1976
+ notes: "★**세 디스패치 전부 내 판정을 바꿨다.** ①②는 내가 「self-test 초록이니 RC 급」으로 읽었을 자리에 무앵커 9건을 들이밀었고, codex 는 내가 못 본 정의 모순을 잡았다. 자력 적발 0.
1977
+ ★**격리가 값을 한 지점이 명확하다** — 두 에이전트가 각각 자기 미측정 항목을 명시 라벨했고(①: launchd 실설치는 트리 밖이라 구조적 측정 불가 · ②: selfcheck 완주 미실행, W2 판정은 소스 근거이지 CI 재현 아님), 그 라벨 덕에 내가 그 칸을 «0»으로 렌더하지 않았다.
1978
+ 🟥 **계수 불일치를 정직하게 적는다**: `session_close_check` ④-e 훅은 오늘 **8 dispatch** 를 셌고, 내 두 엔트리 합은 **6**(위 3 + 여기 3)이다. 차 2건을 귀속하지 못했다 — 훅은 총계만 tally 하고 어떤 spawn 인지 남기지 않아 사후 대조가 불가능하다. **미상 2건으로 남긴다.** (재시도·백그라운드 Bash 가 세어졌을 가능성이 유력하나 미검증이고, 그 추정으로 숫자를 맞추는 것이 이 로그가 막으려는 형태다.)"
1979
+
1980
+ - date: 2026-08-14
1981
+ session: fh-pmh-sync-collision-fix (Sonnet 5, pmh-dev#68 field-request pivot)
1982
+ agents_summary: "2 dispatches: fh-commons:quench-challenger×2 (Wave 1 isolated attack on scripts/sync-to-be.sh HUB_SUFFIX fix, Wave 2 frozen-tree re-attack pinned to HEAD after Wave-1 remediation) · codex gpt-5.5×1 (auto-decorrelation cross-family sidecar via scripts/sidecar_wait.sh, operator-approved per-run spend gate, transcript captured)"
1983
+ dispatch_count: 3
1984
+ outcome: accepted
1985
+ evidence: "Wave 1 found [S] no serialization between FH/PMH now sharing one companion-store git worktree (a real hole this fix itself opens), [A] git-add-A fallback could stage the other hub's mid-sync files, [A] undifferentiated refuse exit code breaks Stop-hook cooldown, plus named residuals (two-FH-clone collision, fh_session_load.sh unsuffixed reads) — all S/A fixed and empirically verified (real 10-round/20-process concurrent race, git fsck clean). Wave 2 re-attacked the fix itself and found [S] the stale-lock reclaim was ITSELF race-prone (plain rmdir let two processes both reclaim, one stealing the other's live lock), [A] a date-r failure fell back to epoch-0 (fail-open — every lock reads as stale), [A] the tmp-sweep glob was too broad (real risk of silently deleting unrelated mapped-project content forever). codex independently corroborated the date-r fail-open in different words and separately caught that the lock was placed AFTER the mirror phase already touched $BE (moved earlier as a result). Direct 5-way isolated unit test of the atomic-mv reclaim fix: exactly 1 winner, 5/5 runs."
1986
+ notes: "★**Every S/A finding across both rounds was in code I had JUST written that same session — self-review missed all of it, standard pattern for this repo (feedback_repair_is_the_main_defect_source).**
1987
+ ★**Separately, the pre-commit hook itself (mechanical, not a dispatched agent) caught a real confidentiality leak** — my first design hardcoded the literal sibling-hub name into the public script's case-match and HUB_NAME variable; git grep confirmed zero prior occurrences anywhere in this repo, i.e. a genuinely NEW leak. Asked the operator (AskUserQuestion) rather than unilaterally deciding to override or genericize; operator chose genericize. Redesigned to read sibling-hub identity from a local, gitignored key=value config file instead of a hardcoded literal — and in TESTING that redesign, self-caught a second bug: the new helper function could abort the whole script under set -e/pipefail on the 'no local file' path, never reaching the intended exit-10 refuse message. Neither of these two defects came from any dispatched reviewer — both were self-caught by actually EXECUTING the known-pair suite after each change, not by reading the code.
1988
+ ⚠️ **Live production verification is a named, deliberate residual, not an oversight**: a real .fh-hub-identity.local file was written for this operator's own pmh-dev clone, but the first real cross-hub sync into the shared private companion store was NOT run this session (would be the first-ever real push of PMH content into a store this operator relies on for other tooling) — left explicit for the operator or a future session, not silently done."
1989
+
1990
+ - date: 2026-08-15
1991
+ session: fh-mbp-selfcheck-wiring (Sonnet 5, MacBook Pro machine, embedded --self-test DEBT wiring)
1992
+ agents_summary: "3 substantive dispatches: fh-commons:quench-challenger×1 (Wave 1 isolated attack on scripts/selfcheck.sh wiring diff) · fh-meta:challenger×1 (Axis 3 phantom-quench-style grounding audit, same diff) · codex gpt-5.5-xhigh×1 (auto-decorrelation cross-family re-check, live tool execution via scripts/sidecar_wait.sh). Plus 3 non-review codex diagnostic pings (model-identity probes, resolving an operator-flagged model-pin question — excluded from dispatch_count, same as this log's own SendMessage-exclusion precedent)."
1993
+ dispatch_count: 3
1994
+ outcome: accepted
1995
+ evidence: "Wave 1 found 1A+6B on a small diff wiring 4 undeclared embedded --self-test subjects into selfcheck.sh (feeds npm test + prepublishOnly). 5 of 6 B's + the A fixed same round: A(capability_registry_check.sh's calibration marker only appeared in a lane TITLE, not a terminal verdict line — a future rename would flip a real PASS to a false FAIL) · B(rc=10 harness-error mislabeled as 'dispatcher missing?') · B(missing timeout on the loop's largest suite — 45+ lanes, no time bound) · B(exec-failure on a missing sibling file mislabeled as a lane failure) · B(PASS-line rendering could leak cleanup-trap stderr). codex R2 (live tool execution against the post-fix diff, not read-derived) independently re-verified the same 4 subjects' real --self-test output and control/exit-code logic, converged with 0 new findings. A separate mechanical lint (test_selfcheck_state_lanes.sh, not a dispatched agent) then caught a regression the fixes themselves introduced — 2 new raw `tail` blocks bypassing this file's own `_show_failure` helper — fixed and re-verified 44/44."
1996
+ notes: "★**Self-caught 0, again** — the mechanical lint (not either dispatched reviewer) found the regression the S/A fixes themselves introduced, same shape as the pattern this log already tracks (feedback_repair_is_the_main_defect_source).
1997
+ ★**The phantom-quench audit flagged a claim PHANTOM by reading a stale illustrative comment as live ground truth** — the checker's own header names an old example subject (directional_diff_gate.sh) instead of the real live-computed one (relay_channel.sh). Re-derived ground truth by RUNNING the checker's own Python detection logic directly rather than trusting either the audit's reading or the comment: confirmed the diff's own claim was TRUE, but the investigation surfaced a genuinely separate, real bug — lane_runner_check.sh's self-test detector scans a subject's OWN file among its 'runners' search and misreads directional_diff_gate.sh's usage-example comment as a real caller (self-referential false positive), so that subject silently reads as wired when nothing actually calls it. Recorded, not fixed this session (different file/job) — tracks/_meta/fh_signal_2026-08-15_selfcheck-wiring.md.
1998
+ ⚠️ **A same-session self-correction on the codex dispatch itself**: an operator-preferred lighter codex tier (gpt-5.6-luna) was believed to have silently fallen back to a bare 'gpt-5' based on a self-report identity probe ('what model are you'). The operator flagged this as surprising given the CLI's own model picker showed it as a valid current tier. A live control (pinning a clearly-different, smaller model and repeating the same probe) got the identical 'gpt-5' self-report, while the tool's own `model:` banner line was correct every time — proving the self-report probe itself is not a discriminating identity signal for this CLI, not that the pin failed. The R2 dispatch had already redirected to gpt-5.5-xhigh before this was caught, so the cross-family result stands (a clean pass on a stronger model is not weakened by this), but the diagnosis that motivated the redirect was wrong and is corrected in the Axis-2 marker.
1999
+ 🟥 **Tally discrepancy, named not forced**: the mechanical SubagentStop tally counted 16 dispatches machine-wide for 2026-08-15; this entry accounts for 3 substantive + 3 diagnostic = 6. The remaining ~10 are unattributed — a live peer session shared this exact checkout for most of the day (confirmed via ListAgents/SendMessage during this session's own branch-claim conflict) and very likely contributed some of them, but the tally has no per-spawn attribution (same structural gap this log already named on 2026-08-13), so the split is not reconstructable after the fact. Recorded as unknown rather than estimated to fit."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.97",
3
+ "version": "1.4.98",
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": [
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "scripts": {
27
27
  "prepare": "chmod +x bin/fh-gate.js bin/fh-run.js bin/fh-goal.js bin/fh-codex-doctor.js scripts/fh-gate.sh scripts/fh-run.sh scripts/fh-goal.sh",
28
+ "postinstall": "node scripts/postinstall_notice.js",
28
29
  "test": "bash scripts/selfcheck.sh",
29
30
  "prepublishOnly": "bash scripts/version_lockstep_check.sh && bash scripts/selfcheck.sh && bash scripts/package_coverage_check.sh --vs-tarball && bash scripts/public_surface_scan_files.sh",
30
31
  "release": "bash scripts/public_surface_scan_files.sh && npm publish"
@@ -60,12 +61,15 @@
60
61
  "docs/codex-compat.md",
61
62
  "docs/pillars.svg",
62
63
  "scripts/fh-gate.sh",
64
+ "scripts/frontier_digest_autopilot.sh",
65
+ "scripts/postinstall_notice.js",
63
66
  "scripts/fh-run.sh",
64
67
  "scripts/fh-goal.sh",
65
68
  "scripts/count_check.sh",
66
69
  "scripts/selfcheck.sh",
67
70
  "scripts/version_lockstep_check.sh",
68
71
  "scripts/test_selfcheck_state_lanes.sh",
72
+ "scripts/test_lane_runner_lanes.sh",
69
73
  "scripts/test_version_lockstep_lanes.sh",
70
74
  "scripts/package_coverage_check.sh",
71
75
  "scripts/lane_runner_check.sh",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "1.4.97",
3
+ "version": "1.4.98",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },