@chrono-meta/fh-gate 2.5.1 โ†’ 2.6.0

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.
@@ -90,7 +90,12 @@ Identity marker: every greeting response opens with **๐Ÿฟ๏ธ then an identity-r
90
90
  **Branch test (mechanical โ€” local state only)**: returning = session files exist (any `tracks/**/session_*.md` or `tracks/_meta/*.md` beyond `.gitkeep`) **OR** mapped project tracks exist (`tracks/{name}/` dirs โ€” **any underscore-prefixed dir doesn't count** (`tracks/_*`, general rule not a closed list: `_meta`/`_audit`/`_contrib`/`_chamber`โ€ฆ); covers mapped-but-not-yet-synced users). **Never infer the branch from git log or CATALOG residue** โ€” a fresh clone carries full commit history but zero session files: it is a NEW install (origin: fresh-clone sonnet sim rendered the returning menu off commit messages, `fh_signal_2026-06-11` FP8).
91
91
 
92
92
  **New user** (neither condition holds โ€” fresh clone/install): 2-door starter, never the returning menu โ€”
93
- > ๐Ÿฟ๏ธ **Welcome to FH.** *Looks like you're new here! โ‘  Create your first project (guided) ยท โ‘ก Map an existing project โ€” and I can run `/install-wizard` to finish initial setup.*
93
+ > ๐Ÿฟ๏ธ **Welcome to FH.** *Looks like you're new here! What would you like to do?*
94
+ > - **โ‘  Create your first project** โ€” guided
95
+ > - **โ‘ก Map an existing project**
96
+ > - **๐Ÿ“– Read the guide / ask me anything**
97
+ >
98
+ > *โ€ฆand I can run `/install-wizard` to finish initial setup.*
94
99
 
95
100
  - **โ‘  Create your first project** โ†’ Step 3-0 (guided: name โ†’ `tracks/` โ†’ `.claudeignore` โ†’ cascade)
96
101
  - **โ‘ก Map an existing project** โ†’ `auto_project_mapping.md`; after a successful mapping, offer the ยง6 Full-Harness promotion prompt
@@ -100,8 +105,33 @@ Identity marker: every greeting response opens with **๐Ÿฟ๏ธ then an identity-r
100
105
  > ๐Ÿฟ๏ธ **Welcome to FH.** *forge-harness is a tool hub for rapidly setting up Claude Code projects. It supports plugin recommendations, project setup, and harness diagnostics. What would you like to work on?*
101
106
 
102
107
  **Returning user** (branch test above) โ€” open with the fixed 4-door menu (the doors are stable; the contents are composed live). A summary copy lives in CLAUDE.md ยงActive Onboarding โ€” keep branch tests and door labels in sync when editing:
103
- > ๐Ÿฟ๏ธ **Welcome back to FH.** *What would you like to start? โ‘  Map a project ยท โ‘ก Create a new project ยท โ‘ข Accelerate **or diagnose** a mapped project (work ยท Full-Harness ยท skills/agents/plugins ยท ์ง„๋‹จ) โ€” {field candidates} ยท โ‘ฃ Cross-project synergy*
108
+ > ๐Ÿฟ๏ธ **Welcome back to FH.** *What would you like to start?*
109
+ > - **โ‘  Map a project**
110
+ > - **โ‘ก Create a new project**
111
+ > - **โ‘ข Accelerate or diagnose a mapped project** (work ยท Full-Harness ยท skills/agents/plugins ยท ์ง„๋‹จ) โ€” {field candidates}
112
+ > - **โ‘ฃ Cross-project synergy**
113
+ > - **๐Ÿ“– Guide / Q&A**
104
114
  >
115
+ ๐ŸŸฅ **One door per line โ€” never join them with `ยท` into a single run-on line** (operator, 2026-08-20).
116
+ A `ยท`-joined menu wraps at an arbitrary terminal width, so the reader cannot see where one door ends
117
+ and the next begins. The vertical list satisfies **G-GREET-02** (๐Ÿฟ๏ธ + welcome on the SAME line),
118
+ **G-GREET-03** (fixed 4-door set) and **G-GREET-05** (welcome literals) unchanged โ€” those probes pin
119
+ the door *set*, the *literals*, and the *welcome line*, **not the menu's line count**. Layout is the
120
+ render layer; the probes are the verdict layer. The ๐Ÿ”ง developer door is likewise its own row at the
121
+ bottom of the list, never appended to another line.
122
+
123
+ **๐Ÿ“– door (unnumbered, always rendered)** โ€” opens `docs/USER_GUIDE.md` and takes FH-usage questions.
124
+ ๐ŸŸฅ **Do not renumber.** โ‘ โ€“โ‘ฃ are the fixed set; ๐Ÿ”ง was the only unnumbered exception and ๐Ÿ“– joins it at
125
+ that layer. A guide is *reference before work*, not *the start of work*, so it does not belong in the
126
+ numbered set. **G-GREET-03 (fixed 4-door) and G-GREET-05 (welcome literals) both stay satisfied** โ€” no
127
+ number was added and no welcome phrase was touched.
128
+ ๐ŸŸฅ **"Open" means path + a 3-line table of contents FIRST.** Never dump the file inline โ€” burning tokens
129
+ every session is precisely what this door exists to avoid. Then, and only then, branch on `uname -s`
130
+ to *suggest* an opener (Darwinโ†’`open` ยท Linuxโ†’`xdg-open` ยท MINGW/MSYSโ†’`start`); if none exists, skip
131
+ silently โ€” the path already landed, so nothing is lost. โš ๏ธ `open` is macOS-only and FH ships via npm,
132
+ so it must never be the default path. Operating detail (allowed corpus ยท say "not found" when absent)
133
+ lives in `/fh` Step 3.5.
134
+
105
135
  > (When **FH-dev state exists** โ€” the operator โ€” the welcome line is **"The FH operator โ€” good to see you."** in place of "Welcome back to FH.")
106
136
 
107
137
  - **โ‘  Map a project** โ†’ routes to `auto_project_mapping.md`; after a successful mapping, offer the ยง6 Full-Harness promotion prompt
@@ -170,6 +200,18 @@ priority: high|medium|low
170
200
  ---
171
201
  # FH Improvement Signal โ€” {date} ({source})
172
202
 
203
+ ## Session Retrospective โ† ๋งˆ๊ฐ ํšŒ๊ณ ๋กœ ์ƒ์„ฑ๋œ ์‹ ํ˜ธ๋งŒ. ์ƒํ•œ 8์ค„. ์ด๋ฒคํŠธ ์‹ ํ˜ธ๋Š” ์ด ์ ˆ ์—†์Œ
204
+ - ์ •์ •: {์šด์˜์ž๊ฐ€ ๋‚˜๋ฅผ ์ •์ •ํ•œ ๊ฑด์ˆ˜} โ€” ๊ฐ ํ•œ ์ค„, ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ํ‹€๋ ธ๋‚˜
205
+ - ์ž๋ ฅ {N} / ํƒ€๋ ฅ {M} โ€” ํƒ€๋ ฅ์€ **์žก์€ ์ถ• ์ด๋ฆ„**์œผ๋กœ (๋ ˆ์ธ ยท ๋˜๋Œ๋ฆผ ยท cross-family ยท ์ฒซ์‹ค์‚ฌ์šฉ ยท โ““ ยท ์šด์˜์ž ยท CI)
206
+ - ์•ˆ ๋Œ๋ฆฐ ์ถ•: {์ด๋ฆ„, ๋˜๋Š” ใ€Œ์—†์Œใ€}
207
+ - ๋ฐ˜๋ณต: {์ด๋ฒˆ์ด N๋ฒˆ์งธ์ธ ์‹ค์ˆ˜ โ€” memory ํ‚ค ๋˜๋Š” ใ€Œ์‹ ๊ทœใ€}
208
+
209
+ ๐ŸŸฅ **๋“ฑ๊ธ‰์„ ์ ์ง€ ๋งˆ๋ผ.** ยซ์„ธ์…˜์ด ์ž˜ ๋๋‹ค/๋ชป ๋๋‹คยป ๋Š” ์žํ‰์ด๊ณ  ๊ฒŒ์ž„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ ๋Š” ๊ฒƒ์€ **์‚ฌ๊ฑด๊ณผ
210
+ ๊ทธ๊ฒƒ์„ ์žก์€ ์ถ•์˜ ์ด๋ฆ„**๋ฟ์ด๋‹ค. ํŒ์ •์„ ์•ˆ ์ ์œผ๋ฉด ์žํ‰ํ•  ๋Œ€์ƒ์ด ์—†๋‹ค. ใ€Œ์ •์ • ๊ฑด์ˆ˜ใ€๋Š” ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ
211
+ ์‚ฌ์‹ค์ด์ง€ ํŒ๋‹จ์ด ์•„๋‹ˆ๋ผ์„œ ๊ฒŒ์ž„์ด ์–ด๋ ต๊ณ , ์ž๋ ฅ/ํƒ€๋ ฅ ๋ถ„๋ฆฌ๋Š” ยซ๋‚ด๊ฐ€ ๋‹ค ์žก์•˜๋‹คยป ๋ฅผ ์“ฐ๊ธฐ ๋ถˆํŽธํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
212
+ โš ๏ธ ์…‹ ๋‹ค ์žํ‰์„ **์–ด๋ ต๊ฒŒ** ํ•  ๋ฟ **๋‹ซ์ง€ ์•Š๋Š”๋‹ค** โ€” ๋‹ซํžˆ๋Š” ๊ฒƒ์€ peer ๋‚˜ cross-family ๊ฐ€ ์ด ํšŒ๊ณ ๋ฅผ
213
+ ์ฝ์„ ๋•Œ์ด๊ณ  ๊ทธ๊ฑด ์ด ํ˜•์‹์˜ ๋ฒ”์œ„ ๋ฐ–์ด๋‹ค.
214
+
173
215
  ## Friction Point
174
216
  -
175
217
 
@@ -530,6 +530,123 @@ ceiling will never propose the redesign that was the point of incubating.
530
530
  *nursery* is allowed to do to it while it is still inside. The first is an exit condition; the second
531
531
  is a working posture.
532
532
 
533
+ ### 3-e. Two moves observed in one incubation session โ€” ยซ์ฑ„์šด๋‹คยป is not the whole job (operator-approved, 2026-08-19)
534
+
535
+ โš ๏ธ **Scope, up front**: this section records a **failure taxonomy measured on one field harness in
536
+ one session**, and the move it names. It is **not** a claim about what incubation essentially *is*.
537
+ A cross-family review of the first draft killed that framing, and it was right to
538
+ (ยง3-e-PROVENANCE below).
539
+
540
+ Operator's framing going in: *"qasp๊ฐ€ ์•„์ง ๋‚จ์€ ์ ๋“ค์ด ์žˆ์œผ๋‚˜ fh๋‚˜ pmh์˜ ์ธํ๋ฒ ์ดํŒ… ๋ชจ๋“œ๋กœ
541
+ ์‚ฌ์šฉ์‹œ(pmh๊ฐ€ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ฆ ๋ฐ ๋ณด๊ฐ•)์—๋Š” ๋ถ€์กฑํ•œ ์ ์„ ๋ฉ”๊พธ์–ด์„œ ์˜๋„ํ•œ ๊ธฐ๋Šฅ๋“ค์ด โ€ฆ ๋ฐœํœ˜ ๊ฐ€๋Šฅํ•œ
542
+ ์ƒํƒœ๋“ค์ด๋ผ๊ณ  ๋‚˜๋Š” ๋ณด๊ณ ์žˆ์–ด. ์ธํ๋ฒ ์ดํ„ฐ ๊ธฐ๋Šฅ์˜ ํ™•์žฅ์ด์ง€."*
543
+
544
+ That holds **for the class of gap it names**. The session then measured a class outside it:
545
+
546
+ | | |
547
+ |---|---|
548
+ | โ‘  **์ฑ„์šด๋‹ค** | The target **declares** it cannot do something โ€” `UNCALIBRATED`, an unwired slot, a domain lock. The incubator supplies the capability at more tokens, more time. |
549
+ | โ‘ก **์„ ์–ธ๋˜๊ฒŒ ๋งŒ๋“ ๋‹ค** | The target produces **plausible output that is wrong**. โ‘  has nothing to grab. The move here is to *manufacture the declaration* โ€” or, more often than expected, **to move an existing declaration into the path someone reads.** |
550
+
551
+ #### ๐ŸŸฅ The five cases split three ways โ€” and the first draft got this wrong
552
+
553
+ The draft asserted *"none of the five signals a shortfall upstream."* **That is false, and the
554
+ falsification came from this repo's own artifacts** (cross-family review flagged it; source check
555
+ confirmed and went further than the reviewer did):
556
+
557
+ ```
558
+ ์ง„์งœ ๋ฌด์Œ โ€” ์ฑ„๋„์ด ์—†์—ˆ๋‹ค "๋ฉด์ œ"ยท"๋ฌด๋ฃŒ" ์ž๊ธฐ์–ต์ œ 2๊ฑด
559
+ (scanner did not exist until the session built it)
560
+ ์‹ ํ˜ธ๋Š” ์žˆ๋Š”๋ฐ ์•ˆ ์ฝํ˜”๋‹ค ๋ผ์šฐํŒ… ๊ณ ์•„ โ€” caller_zero_baseline.json ์ด 2๊ฑด
561
+ ORPHAN ์œผ๋กœ ๊ธฐ๋ก ์ค‘์ด์—ˆ๋‹ค(tracked ยท CI ๊ฐ€ ์ฝ๋Š”๋‹ค)
562
+ ํ•ธ๋“œ์˜คํ”„ โ€” ์„ ํ–‰ ๋ฌธ์„œ๊ฐ€ "ํ›„์†์ด ๊ฐฑ์‹ ๋ณธ" ์ด๋ผ๋Š”
563
+ ํฌ์ธํ„ฐ๋ฅผ ๋‚จ๊ฒผ๊ณ , ๊ทธ ํ›„์†์ด ์นจ๋ฌตํ–ˆ๋‹ค
564
+ ์ฑ„๋„์„ ๋งŒ๋“ค์—ˆ๋”๋‹ˆ ์„ ์–ธ๋๋‹ค p6 ๋ถ„๋ฅ˜ํ‘œ 0/6 โ€” `_UNMAPPED_SEEN` ๊ด€์ธก ์ฑ„๋„์ด 1๊ฑด
565
+ ํ•˜๋ฃจ ์ „ ์ปค๋ฐ‹์œผ๋กœ ๋„์ž…๋ผ ๋ฆฌํฌํŠธ๊นŒ์ง€ ๋ฐฐ์„ ๋๊ณ ,
566
+ ๊ทธ ๋‹ค์Œ ๋‚  ์ˆ˜๋ฆฌ๋๋‹ค
567
+ ```
568
+
569
+ **The third row is the load-bearing one, and the draft had it backwards** โ€” it cited p6 as an example
570
+ of silence when p6 is the **existence proof of โ‘ก succeeding**: someone built the channel, the silent
571
+ thing declared itself, โ‘  closed it the next day. One case, one day apart, in-repo.
572
+
573
+ โ‡’ So โ‘ก is not one move but two, and the second is more common than expected:
574
+
575
+ - **(a) build the channel where none exists** โ€” the 2 self-suppression cases
576
+ - **(b) put the channel where the reader is** โ€” the 2 unread-signal cases. This is
577
+ `gate_locality_principle.md` applied to *declarations* rather than to gates: a declaration nobody
578
+ reads is not a declaration. **Neither of those two was fixed by adding information; both were fixed
579
+ by moving where it surfaces.**
580
+
581
+ #### What was actually built, stated narrowly
582
+
583
+ Function โ‘ก was realized on that session as **authoring-time static instruments** โ€”
584
+ `scripts/self_suppression_scan.py` (trigger vocabulary swallowed by negation vocabulary),
585
+ `scripts/domain_coupling_scan.py` (hardcoded domain vocabulary), plus anchors that go red when the
586
+ instrument itself dies.
587
+
588
+ ๐ŸŸฅ **This is not a runtime declaration mechanism and must not be read as one.** Nothing there makes a
589
+ *running* audit announce ยซthis output is confidently wrongยป. What was demonstrated: **an incubator
590
+ holding ยง3-d's whole-repo authority built instruments the target had not built for itself.** Whether
591
+ the target *could* have is not established โ€” the observed reason was ordinary (nobody had looked),
592
+ not structural.
593
+
594
+ #### Ordering: conditional, not a law
595
+
596
+ The draft said *"โ‘ก is prior to โ‘ "*. Weakened deliberately: **where a defect is undeclared, โ‘  has no
597
+ target, so โ‘ก has to come first for that defect.** That is a statement about one defect's handling
598
+ order, not a phase ordering for incubation, and one session cannot support the stronger reading.
599
+
600
+ Likewise the draft's *"the second is worse than the first"* (silent-wrong vs crash) is **withdrawn** โ€”
601
+ severity depends on the operating context, and nothing here measured it.
602
+
603
+ #### ๐ŸŸฅ โ‘ก presupposes decorrelated input โ€” this belongs in the definition, not the caveats
604
+
605
+ Self-detection on that session was **2 of 16**, and both of the two were *reading something already
606
+ written down* (a baseline file that said `ORPHAN`; a loop that finished suspiciously fast), not
607
+ inference. The rest came from cross-family review (two families, zero overlap), revert probes, the
608
+ full suite, a caller-zero ratchet, a peer session, and a company session.
609
+
610
+ โ‡’ **โ‘ก as described is a property of an incubation regime that has decorrelated review attached, not
611
+ of a lone incubation session.** A single session should not be assumed able to run it.
612
+
613
+ ๐ŸŸฅ **And ยซdecorrelatedยป is decided by what you SEND, not by which family you send it to.** A panel
614
+ that all receives the same payload keeps the same blind spot no matter how many reviewers sign it.
615
+ The payload for โ‘ก is **the frozen diff *and* the change's own marker** โ€” the diff carries the code,
616
+ the marker carries the *claims* (which axes ran, which controls were alive, what residual is
617
+ admitted). A reviewer who never sees the marker cannot catch ยซan axis asserted with no traceยป or
618
+ ยซa residual implied but unlistedยป, because those defects are not in the code.
619
+
620
+ **Measured on this section itself, the same day**: the grounding arm was sent a **5-item fact list**
621
+ instead of repo access, and consequently reported every well-grounded statement outside that list as
622
+ invention โ€” one usable finding out of six. The family was fine; **the payload was the defect.**
623
+ โ‡’ [[feedback_decorrelation_axis_is_what_you_send]]. The plumbing that supplies this is
624
+ `auto-decorrelation` Step 5 (payload = frozen diff + marker), scoped to **consistency**, not honesty
625
+ โ€” asking whether the record matches the diff is a channel check; asking whether the record is *true*
626
+ is a verdict, and ยงMechanization Boundary keeps verdicts out of code.
627
+
628
+ #### The failure mode โ‘ก carries
629
+
630
+ The instruments were wrong **seven times** in that session. Six produced **plausible wrong numbers**;
631
+ one died loudly (`No such file`, `rc=1`) and was caught instantly. Once, a control was the only thing
632
+ standing between ยซthe corpus has none of this shapeยป and the truth, ยซthe detection surface does not
633
+ see that shapeยป.
634
+
635
+ โ‡’ **An instrument built to expose silent wrongness is itself a source of silent wrongness.** The
636
+ prescription measured there: **put the control in the same commit as the instrument.** Where that was
637
+ done the error surfaced immediately; where it was not, it surfaced afterwards, if at all.
638
+
639
+ #### ยง3-e-PROVENANCE โ€” what this section's own review caught
640
+
641
+ - **cross-family (codex, gpt-5.5)**: killed the ยซessence of incubationยป framing, the
642
+ ยซnone of the fiveยป claim, the ยซprior toยป ordering, and the ยซworse thanยป severity rule. All four
643
+ were adopted. Self-detection on this section: **0**.
644
+ - **grounding pass (agy, gemini-3.1-pro)**: mostly measured **the author's own dispatch error** โ€” it
645
+ was given a 5-item fact list rather than repo access, so every well-grounded statement outside that
646
+ list was reported as invention. One finding survived: *"all of them wrong"* overstated p6
647
+ (a finding whose true category happened to be the fallback would not be wrong), now softened.
648
+ ๐ŸŸฅ Recorded because the lesson is about **the reviewer's input scope**, not about the reviewer.
649
+
533
650
  ## 4. Compose โˆช disrupt โ€” two operating modes over other harnesses
534
651
 
535
652
  | Mode | What | FH mechanism |
@@ -2332,3 +2332,23 @@
2332
2332
  finding: "๐ŸŸฅ **FH ๊ฐ€ ๋ชฐ๋ž๋˜ ๊ฒƒ ๋„ท, ๊ทธ์ค‘ ๋‘˜์€ ์„ค๊ณ„ ๊ฒฐํ•จ์ด๋‹ค.** โ“ **์œ„์„ฑ์ด ๋ฏธ๋“ฑ๋ก redaction sink** โ€” gstack ์€ ใ€Œํƒ€ ๋ชจ๋ธ dispatchใ€๋ฅผ ์ด๋ฏธ sink ๋กœ ๋ถ„๋ฅ˜ยท์Šค์บ”ํ•˜๋Š”๋ฐ ์œ„์„ฑ ๊ฒฝ๋กœ๋Š” ๊ทธ ์Šค์บ๋„ˆ๋ฅผ ํ•œ ์ค„๋„ ์•ˆ ํƒ„๋‹ค. ๐ŸŸฅ FH ์˜ publish_gate ๋Š” **์‚ฐ์ถœ๋ฌผ**์„ ์Šค์บ”ํ•˜๊ณ  **์ž…๋ ฅ**์€ ์•„๋ฌด๋„ ์•ˆ ๋ณธ๋‹ค(๋ฐฉํ–ฅ์ด ๋ฐ˜๋Œ€๋‹ค) โ“‘ ๋ฌด์ธ acceptEdits ์˜ ํญ๋ฐœ๋ฐ˜๊ฒฝ์ด **๋ ˆํฌ ๋ฐ–** โ€” ๊ทธ์ชฝ `.claude/skills/gstack` ์‹ฌ๋งํฌ๊ฐ€ ๋ผ์ด๋ธŒ ๊ธ€๋กœ๋ฒŒ ์„ค์น˜๋ณธ์ด๋ผ ๋™์‹œ ์‹คํ–‰ ์ค‘์ธ ๋‚จ์˜ CC ์„ธ์…˜์„ ๊นฌ๋‹ค โ“’ **AI ์—๊ฒŒ period ๋กœ ๋‹ซํžŒ ํŒŒ์ผ**(ETHOS.md)์ด ์žˆ๊ณ  ์ œ์•ˆ์กฐ์ฐจ ์œ„๋ฐ˜ โ€” ํ”„๋กœํ•„ ์Šคํ‚ค๋งˆ์— ใ€Œ๊ธˆ์ง€ ํŒŒ์ผใ€์ด ํ•„์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค โ““ ์‚ฐ์ถœ ์ž๋ฆฌ๋ฅผ ๋ฐœ๋ช…ํ•  ํ•„์š” ์—†์Œ(`~/.gstack-dev/plans/` ๊ฐ€ ์ด๋ฏธ ์˜๋ฏธ๋ก ์ด ๊ฐ™๋‹ค) + ๊ทธ ๋ ˆํฌ๋Š” ยซgit status ์˜ค์—ผ = ์‚ฌ๊ฑดยป. ์ ˆ๋ฐ˜ โ‘  ์€ `checked(๊ฒน์นจ ์žˆ์Œ)` โ€” Renovate(๊ตฌ์กฐ) ยท Sourcegraph Agentic Batch Changes(ยซrepository specific instructionsยป, 2026-06 ์ƒ์šฉ) ยท gh-aw(์ฐฉ์ง€ ํ˜•ํƒœ) ๊ฐ€ ๊ฐ ์กฐ๊ฐ์„ ์„ ํ–‰ํ•œ๋‹ค. **net-new ๊ฐ€ ์•„๋‹ˆ๋ผ ์กฐํ•ฉ**์ด๊ณ  ๊ทธ ์‚ฌ์‹ค์ด ใ€Œ์ƒˆ๋กญ๋‹คใ€์˜ ๊ฐ•๋„๋ฅผ ๊นŽ๋Š”๋‹ค."
2333
2333
  note: "๐ŸŸฅ **ํšŒ์ˆ˜๋ถ„์ด ๋”ฐ๋กœ ์žˆ๋‹ค**: gstack ์˜ ยซ์ง“๊ธฐ ์ „์— ๊ฒ€์ƒ‰ยป ๊ทœ์œจ์€ ์ ˆ๋ฐ˜ โ‘ (์„ ํ–‰์ž์‚ฐ)์„ ์ ˆ๋ฐ˜ โ‘ก์˜ **์ž…๋ ฅ**์œผ๋กœ ์š”๊ตฌํ•œ๋‹ค โ€” FH ๋Š” ๋‘˜์„ ๋”ฐ๋กœ ๋Œ๋ ธ๋Š”๋ฐ ๋Œ€์ƒ์˜ ์˜์ž์— ์•‰์œผ๋ฉด ํ•œ ๋ฌธ์„œ๋‹ค. โ““ ์˜ ๋‘ ์งˆ๋ฌธ์ด ยซ๋‘˜ยป์ด๋ผ๋Š” ๊ฒƒ์ด FH ์ชฝ ๊ตฌ์„ฑ์ด์ง€ ๋ณดํŽธ์ด ์•„๋‹ˆ๋ผ๋Š” ๋œป์ด๊ณ , ์ด๊ฑด 6์ถ• ์ •์˜ ์ž์ฒด์— ๋‹ฟ๋Š”๋‹ค. โš ๏ธ ์ ˆ๋ฐ˜ โ‘  ์€ ์Šค๋‹ˆํŽซ ๊ธฐ๋ฐ˜์ด๊ณ  1์ฐจ ๋ฌธ์„œ ์ „์ˆ˜ ์ง๋…์ด ์•„๋‹ˆ๋‹ค โ€” Sourcegraph ์˜ ๊ทธ ๋ฌธ๊ตฌ๊ฐ€ ใ€Œ๋ ˆํฌ๊ฐ€ ์“ด ๊ฒƒใ€์ธ์ง€ ใ€Œcode graph ์ƒ์„ฑใ€์ธ์ง€ ์•ˆ ๊ฐˆ๋ ธ๊ณ , ๊ทธ ํ•œ ์ค„์ด ๊ฐˆ๋ฆฌ๋ฉด ๊ฒน์นจ์ด ยซ๋ถ€๋ถ„ยป์—์„œ ยซ์ „๋ฉดยป์œผ๋กœ ๋ฐ”๋€๋‹ค. **๋ฏธํ™•์ธ์œผ๋กœ ๋‚จ๊ฒผ๋‹ค.** ์‹ ํ˜ธ = tracks/_meta/fh_signal_2026-08-19_satellite-thirdparty-axis.md"
2334
2334
  cost: 157,378 tokens (subagent_tokens ยท tool_uses 20 ยท 313s)
2335
+
2336
+ - date: 2026-08-19
2337
+ agent: claude-code-guide ยท general-purpose ร—2 ยท general-purpose(sonnet, blind sim) ยท codex sidecar
2338
+ model: opus (orchestrator) / sonnet (blind sim) / gpt-5.5 (sidecar)
2339
+ purpose: "์œ„์„ฑ ํ”„๋กœํ•„ ์Šคํ‚ค๋งˆ ๊ฒŒ์ดํŠธ + ์˜จ๋ณด๋”ฉยท๋งˆ๊ฐํšŒ๊ณ  ์„ค๊ณ„ + ๊ฒŒ์ดํŠธ ์ ๋Œ€๊ฒ€์ฆ + ํ”Œ๋กœ์–ด ํ‹ฐ์–ด ๋ฐœํ™” ํ™•์ธ โ€” ํ•œ ์„ธ์…˜ 5๊ฑด์„ ํด๋ž˜์Šค๋กœ ๋ฌถ์–ด 1์—”ํŠธ๋ฆฌ"
2340
+ prompt_summary: "โ‘  ํ—ค๋“œ๋ฆฌ์Šค ๊ถŒํ•œ ์˜๋ฏธ๋ก ์„ **1์ฐจ ์ถœ์ฒ˜ ์ง๋…**์œผ๋กœ(์ถ”์ธก ๊ธˆ์ง€, ํ™•์ธ ๋ถˆ๊ฐ€๋Š” ๋ช…์‹œ) โ‘ก ๋งˆ๊ฐ ํšŒ๊ณ  ์ƒ์„คํ™” ์„ค๊ณ„ โ€” ๊ธฐ์กด ์ž์‚ฐ ์ปค๋ฒ„๋ฆฌ์ง€๋ถ€ํ„ฐ ๊ฐˆ๋ผ๋ผ โ‘ข ์˜จ๋ณด๋”ฉ ๊ฐ€์ด๋“œ/Q&A ์„ค๊ณ„ โ€” ยซ์ด๋ฏธ ๋˜๋Š” ๊ฒƒยป์ด๋ฉด ๊ทธ๋ ‡๊ฒŒ ๊ฒฐ๋ก ๋‚ด๋ผ โ‘ฃ **์‹œํ—˜ ๋Œ€์ƒ์„ ์•ˆ ์•Œ๋ ค์ค€** ๋ธ”๋ผ์ธ๋“œ 4์ƒํ™ฉ sim โ‘ค cross-family: fail-open ๊ตฌ๋ฉยท๋˜๋Œ๋ฆผ ์šฐํšŒ๋ฅผ ์ฐพ์•„๋ผ"
2341
+ outcome: accepted
2342
+ finding: "๐ŸŸฅ **cross-family ๊ฐ€ S๊ธ‰ 1๊ฑด** โ€” `FD_PROFILE` ๋ฏธ์„ค์ •์œผ๋กœ ๊ฒŒ์ดํŠธ๋ฅผ ํ†ต์งธ๋กœ ๋Œ ์ˆ˜ ์žˆ์—ˆ๊ณ  **๋‚ด๊ฐ€ ์“ด ๋ ˆ์ธ์ด ๊ทธ ์šฐํšŒ๋ฅผ ์ดˆ๋ก์œผ๋กœ ๊ณ ์ •**ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค(์ž๋ ฅ ์ ๋ฐœ 0). A๊ธ‰ 4๊ฑด๋„ ์ „๋ถ€ ์‹ค๋ฌผ: acceptEdits ๊ฐ€ `sedยทmv` ๋ฅผ ์ž๋™์Šน์ธํ•ด `sed -i` ๋กœ ๊ธˆ์ง€ํŒŒ์ผ ์ˆ˜์ • ๊ฐ€๋Šฅ ยท ์ ˆ๋Œ€๊ฒฝ๋กœ๊ฐ€ `.//abs` ๋กœ ์กฐ๋ฆฝ ยท ๋ ˆ์ธ์ด JSON ๊ตฌ์กฐ๋ฅผ ์•ˆ ๋ณด๊ณ  ๋ฌธ์ž์—ด๋งŒ grep ยท ใ€Œegress ๋ฐฉํ™”๋ฒฝใ€ ์ฃผ์žฅ ๊ณผ์žฅ. โ˜… **๋ธ”๋ผ์ธ๋“œ sonnet sim 4/4 ๋ฐœํ™”**(๋ฌธ ๋ Œ๋” ยท ์ธ๋ผ์ธ ๋คํ”„ ๊ฑฐ๋ถ€ ยท Linux ๋ถ„๊ธฐ ยท ์—†๋Š” ์Šคํ‚ฌ์— ใ€Œ0๊ฑด ๊ทผ๊ฑฐใ€)์ด๋ฉด์„œ **์ง„์งœ ๊ฒฐํ•จ 1๊ฑด ์ ๋ฐœ** โ€” CLAUDE.md ์„œ๋ฌธ์ด ์‹ ๊ทœ์ž๋ฅผ CHEATSHEET ๋กœ ์˜ค๋ผ์šฐํŒ…. โ˜… ์„ค๊ณ„ 2๊ฑด์€ ๋‘˜ ๋‹ค **ใ€Œ์ƒˆ ์ž์‚ฐ ์‹ ์„ค ์—†์Œใ€์œผ๋กœ ์ˆ˜๋ ด**ํ–ˆ๊ณ , ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” ์š”์ฒญ๋ฐ›์€ ํ˜•์‹(install-wizard 3๋ถ€ ๋™์˜)์ด **์ด ์šฉ๋„์—” ์˜ค์šฉ**์ด๋ผ๊ณ  ๋ฐ˜์ฆํ–ˆ๋‹ค."
2343
+ note: "๐ŸŸฅ **๋ธ”๋ผ์ธ๋“œ sim ์€ ๊ณ„๊ธฐ ์ƒ์กด์„ ํ™•์ธํ–ˆ๋‹ค**(tool_uses=7) โ€” 2026-08-16 ์˜ `tool_uses: 0` ์ฃฝ์€ sim ๊ณผ ๊ตฌ๋ถ„๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ **reps=1 ๋กœ ์ด ๋ ˆํฌ ์ž์ฒด ๋ฐ”(repsโ‰ฅ3) ๋ฏธ๋‹ฌ**์ด๊ณ , ใ€Œ๋ฐœํ™”ํ–ˆ๋‹คใ€๋Š” ๊ด€์ธก 1ํšŒ์ง€ ์ผ๋ฐ˜ํ™”๊ฐ€ ์•„๋‹ˆ๋‹ค. โš ๏ธ ํ›… tally ๋Š” 51 ์ธ๋ฐ ์ด ์—”ํŠธ๋ฆฌ ํฌํ•จ 4์—”ํŠธ๋ฆฌ๋‹ค โ€” tally ๋Š” ์žฌ์‹œ๋„ยท๋‚ด๋ถ€ ์Šคํฐ๊นŒ์ง€ ์„ธ๋ฏ€๋กœ **1:1 ๋Œ€์‘์ด ์•„๋‹ˆ๋‹ค**(๊ฐœ๋ณ„ ๊ธฐ๋ก์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ์ง‘๊ณ„๋กœ ๋‚จ๊ธด๋‹ค)."
2344
+ cost: "claude-code-guide 124,771 ยท ์„ค๊ณ„ 138,542 + 159,983 ยท ๋ธ”๋ผ์ธ๋“œ sim 140,094 ยท codex 64,443 tokens"
2345
+
2346
+ - date: 2026-08-20
2347
+ agent: general-purpose ร—2 (harness-doctor ยท pmh-dev ๋‹ต์Šต) ยท codex sidecar ยท agy sidecar ยท headless sonnet ร—6 (๋ธ”๋ผ์ธ๋“œ sim ์–‘ํŒ”)
2348
+ model: opus (orchestrator) / gpt-5.5 (codex) / gemini-3.1-pro (agy) / sonnet (sim)
2349
+ purpose: "2.6.0 ์žฌ์ถœํ•˜ ์ค€๋น„ โ€” ์†Œ๋น„์ž ์„ค์น˜ selfcheck ๋ณต๊ตฌ ยท 30์ผ ๊ตฌ์กฐ ์ง„๋‹จ ยท pmh-dev ์„ ํ–‰๋ถ„ ์กฐ์‚ฌ ยท ๋ฉ”๋‰ด ์„ธ๋กœํ™” ๊ฒ€์ฆ. ํ•œ ์„ธ์…˜ 5ํด๋ž˜์Šค๋ฅผ 1์—”ํŠธ๋ฆฌ๋กœ ๋ฌถ๋Š”๋‹ค"
2350
+ prompt_summary: "โ‘  harness-doctor 30์ผ ์บ๋˜์Šค โ€” known-pair ๋ณด์ • ํ›„ ์ˆซ์ž, ๋ชป ์žฐ ์นธ์€ UNMEASURED ๋กœ โ‘ก pmh-dev 3๋ถ„๋ฅ˜(net-new / PMH ์•ž์„ฌ / FH ์•ž์„ฌ), residency ๊ฐ€ organization-private ์ธ ํ•ญ๋ชฉ์€ ์ธ์šฉ ๊ธˆ์ง€ โ‘ข codex: diff ๋ฅผ ๋ฐ›๊ณ  **์ˆ˜๋ฆฌ๋ฅผ ๋ฐ˜์ฆ**ํ•ด๋ผ(fail-open ์ธ๊ฐ€ ยท ๊ฒฐ๋ฐ•์ด ๋‚จ์•˜๋‚˜) โ‘ฃ agy: ์ฝ”๋“œ ์•„๋‹Œ **๊ธฐ๋ก์˜ ์ฃผ์žฅ**์„ ๊ฒ€์ฆํ•ด๋ผ(ํ‘œ๋ณธ์ด ๊ฒฐ๋ก ์„ ์ง€ํƒฑํ•˜๋‚˜ ยท ๋ฏธ์ธก์ •์„ 0์œผ๋กœ ๋ Œ๋”ํ–ˆ๋‚˜) โ‘ค ์‹œํ—˜ ๋Œ€์ƒ ์•ˆ ์•Œ๋ ค์ค€ ๋ธ”๋ผ์ธ๋“œ ๋ Œ๋” sim, ARM/CONTROL ๊ฐ 3ํšŒ"
2351
+ outcome: accepted
2352
+ finding: "๐ŸŸฅ **cross-family ์ง€์  3๊ฑด ์ „๋ถ€ ์‹ค์žฌยท์ „๋ถ€ ์ฑ„ํƒยท์ž๋ ฅ ์ ๋ฐœ 0.** codex(diff ์ถ•)๊ฐ€ ๋‚ด ์ˆ˜๋ฆฌ์˜ ๋ฐ˜์ชฝ์„ ์žก์•˜๋‹ค โ€” L13c ๋ผ๋ฒจ์„ ์œ ๋„๋กœ ๋ฐ”๊ฟจ๋Š”๋ฐ **์ƒ์‚ฐ์ž๋Š” ๋ฆฌํ„ฐ๋Ÿด์„ ๋‚ธ๋‹ค**, ์ฆ‰ ์ˆ˜๋ฆฌ๊ฐ€ divergent-normalizer ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ๋‹ค(๋˜๋Œ๋ฆผ + known-pair ์žฌํ˜„: ์ƒ์ˆ˜ 20/0 ยท ์œ ๋„ 19/1). agy(์ฃผ์žฅ ์ถ•)๊ฐ€ ๋‘˜ โ€” โ‘ข๋ฌธ ์ž๊ธฐ๋ชจ์ˆœ, ๊ทธ๋ฆฌ๊ณ  **detail ํŒŒ์ผ์˜ ์‹ ๊ทœ์‚ฌ์šฉ์ž ๋ฌธ์ด ์•ˆ ๋”ฐ๋ผ์˜จ ๋ฐ˜์ชฝ-ํ”ฝ์Šค**(๋‚ด ํ™•์ธ grep ์ด ๋”ฐ์˜ดํ‘œ ํƒ“์— ๊ฑฐ์ง“ ใ€Œ์—†์Œใ€์„ ๋ƒˆ๋‹ค). ๐ŸŸฅ **๋‘ ๊ณ„์—ด ์ง€์ ์ด ํ•˜๋‚˜๋„ ์•ˆ ๊ฒน์ณค๋‹ค(์ฝ”๋“œ 1 / ์ฃผ์žฅ 2)** โ€” ์ถ• ๋ถ„๋ฆฌ์˜ ๊ฐ’์ด ์‹ค์ธก์œผ๋กœ ๋‚˜์˜จ ์ž๋ฆฌ๋‹ค. harness-doctor: FAIL(M-tier 1 = ์ƒ์ฃผ 140,217์ž) ยท S 9 ยท R 4, ยซ๋ชป ์žฐ ๊ฒƒยป 8ํ•ญ ๋ช…์‹œ. pmh-dev: ํก์ˆ˜ ํ›„๋ณด 3(Wave 1-D ยท HEAVY ๋ถ„๋ฅ˜๊ธฐ ๋ ˆ์ธ ยท Step 0.35), ๊ทธ์ค‘ **A1 ์€ PMH ๋ฌธ์„œ๊ฐ€ ์—†๋Š” ๊ธฐ๊ณ„๋ฅผ ์žˆ๋‹ค๊ณ  ์ ์—ˆ๋‹ค**(`axis2-defense` ํ›… ํžˆํŠธ 0, ์ปจํŠธ๋กค `crossfamily` 21) โ€” ์‚ฐ๋ฌธ๋งŒ ์˜ฎ๊ธฐ๋ฉด ํŒฌํ…€ ๊ธฐ๊ณ„-์ฃผ์žฅ์„ ๋“ค์—ฌ์˜จ๋‹ค. ๋ธ”๋ผ์ธ๋“œ sim ARM 3/3 vs CONTROL 3/3 ์™„์ „ ๋ถ„๋ฆฌ."
2353
+ note: "๐ŸŸฅ **๊ณ„๊ธฐ๊ฐ€ ๋ชป ๋ณด๋Š” ์ž๋ฆฌ๋ฅผ ํƒˆ์ƒ๊ด€์ด ๋ดค๋‹ค.** ์†Œ๋น„์ž-์™„์ฃผ ๊ณ„๊ธฐ๋Š” ใ€Œ๋Œ์•„๊ฐ€๋‚˜ใ€๋ฅผ ์žฌ์ง€ ใ€Œ๊ณ ์นœ ๊ฒŒ ์˜ณ์€๊ฐ€ใ€๋ฅผ ๋ชป ์žฐ๋‹ค โ€” SKIP ์œผ๋กœ ๋น ์ง€๋Š” ํŒ”์€ ๊ทธ ๊ณ„๊ธฐ๊ฐ€ **๊ตฌ์กฐ์ ์œผ๋กœ ์•ˆ ๋ณด๋Š”** ์ž๋ฆฌ์ด๊ณ  codex ์ง€์ ์ด ์ •ํ™•ํžˆ ๊ฑฐ๊ธฐ ์žˆ์—ˆ๋‹ค. โš ๏ธ codex ์„ธ์…˜์ด **์ตœ์ข… ์‚ฐ๋ฌธ ํŒ์ • ์—†์ด ๋๋‚ฌ๋‹ค**(4ํ„ด, ๋งˆ์ง€๋ง‰์ด ๋„๊ตฌ ์ถœ๋ ฅ) โ€” ์ง€์ ์€ ์ค‘๊ฐ„ ํ„ด์—์„œ ๊ฑด์กŒ๋‹ค. ใ€Œ์ง€์  ์—†์Œใ€์ด ์•„๋‹ˆ๋ผ **๋ถ€๋ถ„ ์‚ฐ์ถœ**๋กœ ๊ณ„์ƒํ•œ๋‹ค. โš ๏ธ ํ›… tally ๋Š” 67 ์ธ๋ฐ ์ด ์—”ํŠธ๋ฆฌ ํฌํ•จ ์†Œ์ˆ˜๋‹ค โ€” tally ๋Š” ์žฌ์‹œ๋„ยท๋‚ด๋ถ€ ์Šคํฐ๊นŒ์ง€ ์„ธ๋ฏ€๋กœ 1:1 ๋Œ€์‘์ด ์•„๋‹ˆ๋‹ค(ํด๋ž˜์Šค ์ง‘๊ณ„)."
2354
+ cost: "harness-doctor 196,158 ยท pmh ๋‹ต์Šต 186,940 tokens (subagent_tokens) ยท codex/agy/sim ์€ CLI ๋ผ ํ† ํฐ ๋ฏธ๋…ธ์ถœ = UNMEASURED"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
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": [
@@ -53,6 +53,7 @@
53
53
  "CLAUDE.md",
54
54
  ".claude/registry/agent_cards.json",
55
55
  ".claude/registry/README.md",
56
+ "docs/USER_GUIDE.md",
56
57
  "docs/CONTRIBUTING.md",
57
58
  "bin/fh-codex-doctor.js",
58
59
  "bin/fh-gate.js",
@@ -88,12 +89,15 @@
88
89
  "scripts/adapters/qasp_web_rules.sh",
89
90
  "scripts/adapters/fixtures/qasp_web_rules_known_positive.json",
90
91
  "scripts/adapters/fixtures/qasp_web_rules_known_negative.json",
92
+ "scripts/adapters/fixtures/mate_agent_boundary_known_positive.md",
93
+ "scripts/adapters/fixtures/mate_agent_boundary_known_negative.md",
91
94
  "scripts/test_adapter_lanes.sh",
92
95
  "scripts/test_fh_gate_regressions.sh",
93
96
  "templates/local_fh_context.md",
94
97
  "docs/ETHOS.md",
95
98
  "docs/WHY.md",
96
99
  "docs/OUTPUT_EVIDENCE.md",
100
+ "docs/platform_sustainability.md",
97
101
  "knowledge/shared/GLOSSARY.md",
98
102
  "knowledge/shared/patterns",
99
103
  "knowledge/shared/plugin-catalog",
@@ -129,7 +133,6 @@
129
133
  "scripts/chamber_candidate_collect.sh",
130
134
  "scripts/chamber_witness.sh",
131
135
  "scripts/digest_landing_check.sh",
132
- "scripts/test_satellite_publish_gate_lanes.sh",
133
136
  "scripts/relay_channel.sh",
134
137
  "scripts/test_relay_channel_lanes.sh",
135
138
  "scripts/fh_session_load.sh",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-meta",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -10,6 +10,31 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
10
10
 
11
11
  ## Plugin Level
12
12
 
13
+ ### [2.6.0] โ€” 2026-08-20
14
+
15
+ **๋ฐฐํฌ๋ณธ์ด ์†Œ๋น„์ž ์„ค์น˜์—์„œ `SELFCHECK: FAIL` ์ด์—ˆ๋‹ค โ€” ๊ทธ๋ฆฌ๊ณ  ์›์ธ ๋„ท์ด ์ „๋ถ€ ยซ๊ณ„๊ธฐ๊ฐ€ ์ €์ž์˜ ๋จธ์‹ ์— ๊ฒฐ๋ฐ•ยป ์ด์—ˆ๋‹ค.** ์ด ๋ฆด๋ฆฌ์Šค์˜ ์ค‘์‹ฌ์€ ์ƒˆ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋ณต๊ตฌ๋‹ค. ๋ฐœ๊ฒฌ ๊ฒฝ๋กœ๋Š” ์žฌ์ถœํ•˜ ์ค€๋น„ ์ค‘์˜ ์† ์‹คํ–‰์ด๋‹ค: `npm pack` โ†’ ์ถ”์ถœ โ†’ **`node_modules/@chrono-meta/fh-gate` ์‹ค๊ฒฝ๋กœ์—์„œ ์™„์ฃผ**. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋ฐ›์€ **์‹ค๋ฌผ 2.5.1** ๋กœ๋„ ์žฌํ˜„ํ–ˆ๋‹ค(์ปจํŠธ๋กค).
16
+
17
+ - **์œ„์„ฑ ๋ ˆ์ธ ๋‘˜์ด ์ฃผ์ฒด ์—†์ด ์ถœํ•˜๋๋‹ค.** `test_satellite_publish_gate_lanes.sh`(2.5.1 ์— ์ด๋ฏธ ์‹ค๋ฆผ) ยท `test_satellite_profile_schema_lanes.sh`(์ด๋ฒˆ ๋ฒ”์œ„์— ์ถ”๊ฐ€๋จ)์˜ ์ฃผ์ฒด๋Š” `frontier_digest_daily.sh` ์ธ๋ฐ ๊ทธ๊ฑด ์˜๋„์ ์œผ๋กœ ์ถœํ•˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค(์†Œ๋น„์ž ๊ณ„์ •์œผ๋กœ `claude` CLI ๋ฅผ ํƒœ์šด๋‹ค). ์‹ค์ธก: publish_gate **4 passed / 21 failed**, `rc=127`. ๐ŸŸฅ **ํ†ต๊ณผํ•œ ์ชฝ์ด ๋” ๋‚˜๋นด๋‹ค** โ€” "dispatch ์ž์ฒด๊ฐ€ ์•ˆ ์ผ์–ด๋‚จ โœ…" ์€ ๋Ÿฌ๋„ˆ๊ฐ€ **์—†์–ด์„œ** ํ†ต๊ณผํ•œ ๊ฑฐ์ง“ ์ดˆ๋ก์ด๋‹ค. ์„ ํ–‰ ์‚ฌ๋ก€(`test_frontier_digest_retry.sh`, *"Anchor follows subject"*)๋Œ€๋กœ `ACCEPTED_ABSENT` ๋กœ ๋‚ด๋ฆฌ๊ณ , `selfcheck.sh` ๋Š” **์ฃผ์ฒด** ๋ถ€์žฌ๋ฅผ ๋ณด๊ณ  `_absent_subject_verdict` ๋กœ ์œ„์ž„ํ•œ๋‹ค โ†’ ์ด๋ฆ„ ์žˆ๋Š” SKIP
18
+ - **`digest_landing_check --self-test` ๊ฐ€ ํด๋” ์ด๋ฆ„์— ๊ฒฐ๋ฐ•๋ผ ์žˆ์—ˆ๋‹ค.** ์ปจํŠธ๋กค์ด `basename "$FH"` ๋กœ ์œ ๋„๋˜๋Š”๋ฐ ํ”ฝ์Šค์ฒ˜ ์นด๋“œ๊ฐ€ ๋ฆฌํ„ฐ๋Ÿด `forge-harness` ๋ฅผ ๋‹ด๊ณ  ์žˆ์–ด, **๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์ด `forge-harness` ์ผ ๋•Œ๋งŒ** ์ปจํŠธ๋กค์ด ์‚ด์•˜๋‹ค. known-pair(๊ฐ™์€ ๋ฐ”์ดํŠธ, ์ด๋ฆ„๋งŒ ๊ต์ฒด): `forge-harness/` **15/15 PASS** ยท `some-consumer-app/` **5/15 FAIL**. ๋ ˆ์ธ๋ณ„๋กœ ์ปจํŠธ๋กค์„ ํ”ฝ์Šค์ฒ˜ ํ† ํฐ์— ๊ณ ์ •ํ–ˆ๋‹ค. ๐ŸŸฅ ยซ10 ์„ ๊ธฐ๋Œ€ํ•˜๋Š”ยป ๋ ˆ์ธ๋“ค๋„ ๊ณ ์ •ํ–ˆ๋‹ค โ€” ๊ณ ์ • ์ „์—๋„ 10 ์„ ๋ƒˆ์ง€๋งŒ **์˜๋„ํ•œ ์‚ฌ์œ ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปจํŠธ๋กค ์‚ฌ๋ง** ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ๐ŸŸฅ N1ยทโ˜…N-ctlยทโ˜…N-ctl-re ๋Š” ์ผ๋ถ€๋Ÿฌ ์œ ๋„/์‚ฌ๋ง์„ ์ฃผ์žฅํ•˜๋ฏ€๋กœ **๊ณ ์ •ํ•˜์ง€ ์•Š์•˜๋‹ค**
19
+ - **`cluster_capability_scan` L13c โ€” ์ „์ œ๋งŒ ๊ฒฐ๋ฐ•์ด์—ˆ๋‹ค.** `discover` ๊ฐ€ `tracks/`(gitignored, ๋ฐฐํฌ๋ฌผ์— ๊ตฌ์กฐ์  ๋ถ€์žฌ)๋ฅผ ์ „์ œํ•˜๋ฏ€๋กœ, ๋ถ€์žฌ๋Š” **FAIL ์ด ์•„๋‹ˆ๋ผ ์ด๋ฆ„ ์žˆ๋Š” SKIP**(๋ฏธ์ธก์ • โ‰  0๊ฑด)์œผ๋กœ ๋‚ธ๋‹ค. ๐ŸŸฅ **์ดˆํŒ์€ ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜๋ฅผ ๋” ยซ๊ณ ์ณค๊ณ ยป, ๊ทธ๊ฒŒ ํ‹€๋ ธ๋‹ค** โ€” ๊ธฐ๋Œ€ ๋ฌธ์ž์—ด `^forge-harness\(hub\)` ๋ฅผ ํด๋”๋ช… ๊ฒฐ๋ฐ•์œผ๋กœ ์ฝ๊ณ  `basename` ์œ ๋„๋กœ ๋ฐ”๊ฟจ๋Š”๋ฐ, **์ƒ์‚ฐ์ž(`:128`)๋Š” ๊ทธ ๋ฆฌํ„ฐ๋Ÿด์„ ๋‚ธ๋‹ค.** ์œ ๋„๋กœ ๋ฐ”๊พธ๋ฉด ์ด๋ฆ„์ด ๋‹ค๋ฅธ ํŠธ๋ฆฌ์—์„œ ๊ธฐ๋Œ€์™€ ์‚ฐ์ถœ์ด ๊ฐˆ๋ ค **๊ฑฐ์ง“ FAIL** ์ด ๋œ๋‹ค โ€” ์ด ํŒŒ์ผ์ด ์ž๊ธฐ ์ฃผ์„์—์„œ ๊ฒฝ๊ณ ํ•˜๋Š” divergent-normalizer ๋ฅผ ์ˆ˜๋ฆฌ๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“  ๊ผด์ด๋‹ค. ๋˜๋Œ๋ ธ๋‹ค. ๊ทธ ๋ผ๋ฒจ์€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ **ํ—ˆ๋ธŒ์˜ ์ƒ์ˆ˜ ์‹๋ณ„์ž**์ด๊ณ , ์–‘์ชฝ์ด ๊ฐ™์€ ์ƒ์ˆ˜๋ฅผ ์“ฐ๋Š” ํ•œ ๊ฒฐ๋ฐ•์ด ์•„๋‹ˆ๋‹ค. **cross-family(codex/gpt-5.5)๊ฐ€ ์žก์•˜๋‹ค โ€” ์ž๋ ฅ ์ ๋ฐœ 0.** known-pair ๋กœ ์žฌํ˜„: ์ด๋ฆ„์ด ๋‹ค๋ฅธ ํŠธ๋ฆฌ + `tracks/` ์กด์žฌ์—์„œ ์ƒ์ˆ˜ํŒ **20 PASS / 0 FAIL** ยท ์œ ๋„ํŒ **19 PASS / 1 FAIL**. ๋‚ด ์†Œ๋น„์ž ํ…Œ์ŠคํŠธ๋Š” ๊ทธ ํŒ”์— **๊ตฌ์กฐ์ ์œผ๋กœ ๋ชป ๋‹ฟ์•˜๋‹ค**(๊ฑฐ๊ธฐ์„  L13c ๊ฐ€ SKIP ์ด๋ผ)
20
+ - **mate ์–ด๋Œ‘ํ„ฐ์˜ known-pair ํ”ฝ์Šค์ฒ˜๊ฐ€ ์•ˆ ์‹ค๋ ธ๋‹ค.** ๊ฒŒ์ดํŠธ๋Š” ์ถœํ•˜๋˜๋Š”๋ฐ ๋ณด์ •์Œ์ด ์†Œ๋น„์ž ๋จธ์‹ ์— ์—†์–ด `HARNESS_ERROR(10)`. `mate_agent_boundary_known_{positive,negative}.md` ๋ฅผ `files[]` ์— ์ถ”๊ฐ€ โ€” ์ด๊ฑด **์ถœํ•˜ํ•˜๋Š” ์ชฝ**์ด ๋งž๋‹ค(์ฃผ์ฒด๊ฐ€ ์ด๋ฏธ ์ถœํ•˜๋˜๋ฏ€๋กœ)
21
+ - ๊ฒ€์ฆ: ์ˆ˜๋ฆฌ ํ›„ ์†Œ๋น„์ž ์„ค์น˜ **`SELFCHECK: PASS` (rc=0)**. ๐ŸŸฅ ์ค‘๊ฐ„์— ๋‚ด ๊ณ„๊ธฐ๊ฐ€ ํ•œ ๋ฒˆ ํ‹€๋ ธ๋‹ค โ€” `grep '^FAIL'` ๋กœ ์„ธ์–ด ยซFAIL=0 ์ธ๋ฐ FAILยป ์ด๋ผ๋Š” ๊ฐ€์งœ ๋ชจ์ˆœ์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ์Šค์œ„ํŠธ๋“ค์€ `โŒ` ๋กœ ์ฐ๋Š”๋‹ค
22
+
23
+ **์˜จ๋ณด๋”ฉ ๋ฉ”๋‰ด๋ฅผ ์„ธ๋กœ๋กœ ํŽธ๋‹ค.** `ยท` ๋กœ ์ด์–ด๋ถ™์ธ ํ•œ ์ค„ ๋ฉ”๋‰ด๋Š” ํ„ฐ๋ฏธ๋„ ํญ์—์„œ ์ž„์˜๋กœ ์ ‘ํ˜€ ๋ฌธ ๊ฒฝ๊ณ„๊ฐ€ ์•ˆ ๋ณด์ธ๋‹ค(์šด์˜์ž ์ง€์ ). `G-GREET-02`(๐Ÿฟ๏ธ+ํ™˜์˜๋ฌธ ๊ฐ™์€ ์ค„)ยท`G-GREET-03`(๊ณ ์ • 4๋ฌธ)ยท`G-GREET-05`(๋ฌธ๊ตฌ ๋ฆฌํ„ฐ๋Ÿด) **์…‹ ๋‹ค ๋ถˆ๋ณ€** โ€” ๊ทธ ํ”„๋กœ๋ธŒ๋“ค์ด ๋ฐ•์€ ๊ฒƒ์€ ๋ฌธ ์ง‘ํ•ฉยท๋ฆฌํ„ฐ๋Ÿดยทํ™˜์˜๋ฌธ ์ค„์ด์ง€ ๋ฉ”๋‰ด์˜ ์ค„ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ”Œ๋กœ์–ด ํ‹ฐ์–ด ๋ธ”๋ผ์ธ๋“œ sim(๋ ˆํฌ ๋ฐ– cwdยทํ—ค๋“œ๋ฆฌ์Šคยทreps=3): **ARM 3/3 ์„ธ๋กœ ยท CONTROL 3/3 ๊ฐ€๋กœ**, ๊ฐ™์€ ์‹คํ–‰์—์„œ G-GREET-02 ๋„ 3/3 ์œ ์ง€.
24
+
25
+ **BREAKING ์—†์Œ โ€” ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํŒ์ •์„ ์ ์–ด๋‘”๋‹ค.** ์นด๋“œ๋Š” ยซ์œ„์„ฑ ๋Ÿฐ์ด ํ”„๋กœํ•„ ๋ฏธ์„ ์–ธ์ด๋ฉด ๋ง‰ํžŒ๋‹คยป ๋ฅผ `BREAKING (gate):` ํ›„๋ณด๋กœ ์˜ฌ๋ ค๋’€๋Š”๋ฐ, ๊ทธ ๊ฒŒ์ดํŠธ๊ฐ€ ์‚ฌ๋Š” `frontier_digest_daily.sh` ๊ฐ€ **์ถœํ•˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ผ** ์†Œ๋น„์ž์˜ ๊ฒŒ์ดํŠธ ์ˆ˜์šฉ์€ ์•ˆ ๋ฐ”๋€๋‹ค. ์˜ค๋Š˜ ์ˆ˜๋ฆฌ๋Š” FAILโ†’PASS ๋ผ ์™„ํ™” ๋ฐฉํ–ฅ์ด๋‹ค.
26
+
27
+ ๐ŸŸฅ **์ด ๋ฆด๋ฆฌ์Šค๊ฐ€ ์Šค์Šค๋กœ ๋‚ธ ๊ตํ›ˆ**: ๊ฒฐํ•จ ๋„ท ์ค‘ **์…‹์€ ์ง„๋‹จ์ด ๋งž์•˜๊ณ  ํ•˜๋‚˜๋Š” ํ‹€๋ ธ๋Š”๋ฐ, ํ‹€๋ฆฐ ํ•˜๋‚˜๋ฅผ ์ž๋ ฅ์œผ๋กœ๋Š” ๋ชป ์žก์•˜๋‹ค.** ์†Œ๋น„์ž-์„ค์น˜ ์™„์ฃผ๋ผ๋Š” ๊ณ„๊ธฐ๋Š” ใ€Œ๋Œ์•„๊ฐ€๋‚˜ใ€๋ฅผ ์žฌ์ง€ ใ€Œ๊ณ ์นœ ๊ฒŒ ์˜ณ์€๊ฐ€ใ€๋ฅผ ๋ชป ์žฐ๋‹ค โ€” SKIP ์œผ๋กœ ๋น ์ง€๋Š” ํŒ”์€ ๊ทธ ๊ณ„๊ธฐ๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ์•ˆ ๋ณด๋Š” ์ž๋ฆฌ๋‹ค. ์žก์€ ๊ฒƒ์€ **๋‹ค๋ฅธ ๊ณ„์—ด์— diff ๋ฅผ ๋ณด๋‚ธ ๊ฒƒ**์ด๋‹ค.
28
+
29
+ **๊ฐ™์€ ๋ฆด๋ฆฌ์Šค์— ํ•จ๊ป˜ ๋‚˜๊ฐ€๋Š” ๊ฒƒ โ€” `harness-doctor` 30์ผ ์บ๋˜์Šค ์ˆ˜๋ฆฌ (#468).** ์ง„๋‹จ์ด ๋‚ธ ๊ฒƒ ์ค‘ **์ง€๊ธˆ ์ถœํ•˜๋ฌผ์— ์‚ด์•„ ์žˆ๋˜ ๊ฒƒ**๋งŒ ๊ณจ๋ž๋‹ค.
30
+ - **ํŒฌํ…€ ใ€Œ500์ค„ / 16์Šคํ‚ฌใ€ ์ž„๊ณ„ ์ œ๊ฑฐ** (`docs/platform_sustainability.md`, ์ด๋ฒˆ์— ์ถœํ•˜ ๋Œ€์ƒ์— ํŽธ์ž…). ์‹ค์ œ๋Š” 1,414์ค„ / 40์Šคํ‚ฌ์ด๊ณ , `harness-doctor` ๋Š” meta ํƒ€๊นƒ์—์„œ ์ค„์ˆ˜ ํ–‰์„ ยซํŒ์ • ์•„๋‹˜ยป์œผ๋กœ **๋น„ํ™œ์„ฑํ™”**ํ•˜์ง€ ํฐ ์ˆซ์ž๋กœ ๊ฐˆ์ง€ ์•Š๋Š”๋‹ค. ๐ŸŸฅ ๋ค์ด ๋ณธ์ฒด๋ณด๋‹ค ์ปธ๋‹ค โ€” ์ด ํŒฌํ…€์˜ ์‚ฌํ›„๋ถ„์„์ด *"`500` ์€ ์ด ํŒŒ์ผ ์–ด๋””์—๋„ ์—†๋‹ค(grep 0 hits)"* โ†’ ยซ๋Ÿฐ์ด ์ง€์–ด๋ƒˆ๋‹คยป ๋กœ ๊ฒฐ๋ก ๋ƒˆ๋Š”๋ฐ **๊ทธ grep ์ด ์ž๊ธฐ ํŒŒ์ผ๋งŒ ๋ดค๋‹ค.** ๊ตํ›ˆ์€ ยซํ™˜๊ฐํ–ˆ๋‹คยป๊ฐ€ ์•„๋‹ˆ๋ผ **ยซ๋ถ€์žฌ ๊ฒ€์‚ฌ๋ฅผ ํ‹€๋ฆฐ ์ฝ”ํผ์Šค์— ๋Œ๋ ธ๋‹คยป**
31
+ - **CATALOG ๋ฏธ๋“ฑ์žฌ ์ •๋ณธ 7๊ฑด ๋“ฑ์žฌ** (์ปจํŠธ๋กค `harness_6axis_framework`=2, ๋Œ€์ƒ 7๊ฑด ์ „๋ถ€ 0). ๊ทธ์ค‘ `fh_three_layer_canon.md` ๋Š” CLAUDE.md ๊ฐ€ **ํ•„๋…**์œผ๋กœ ์ง€์ •ํ•œ ๋ฌธ์„œ๋‹ค โ€” ์ƒ‰์ธ์ด ๋ชป ์ฐพ๋Š” ํ•„์ˆ˜ ๋ฌธ์„œ๋Š” ํŒŒ์ผ๋ช…์„ ์ด๋ฏธ ์•„๋Š” ์„ธ์…˜์ด ์•„๋‹Œ ํ•œ ๋ถ€์žฌ์™€ ๊ตฌ๋ณ„๋˜์ง€ ์•Š๋Š”๋‹ค
32
+ - **`[[wikilink]]` ๊ทœ์•ฝ ์„ ์–ธ** (`knowledge/shared/GLOSSARY.md` ์‹ ์„ค ์ ˆ). ์ถœํ•˜ `.md` 156๊ฐœ์— ์•ˆ ํ’€๋ฆฌ๋Š” ํƒ€๊นƒ **59 / ์ถœํ˜„ 98**, ์„ ์–ธ์ด ์•„๋ฌด ๋ฐ๋„ ์—†์—ˆ๋‹ค. ๐ŸŸฅ ์ด๊ฑด **๊นจ์ง„ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์ถœ์ฒ˜ ํ‘œ์‹œ**๋‹ค โ€” ๊ณ ์น˜๋ ค ๋“ค์ง€ ๋งˆ๋ผ. ๋ฉ”๋ชจ๋ฆฌ ์Šคํ† ์–ด๋Š” ์šด์˜์ž๋ณ„ยท์„ธ์…˜ ์Šค์ฝ”ํ”„๋ผ vendoring ์€ ์ˆ˜๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ residency ์œ„๋ฐ˜์ด๋‹ค
33
+ - ๐ŸŸฅ **`CLAUDE.md` ๊ฐ€ ์ž๊ธฐ ๊ธฐ๊ณ„๋ฅผ ๊ฑฐ์ง“ ์„œ์ˆ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.** *"standpoint ๋Š” Prose-only today โ€” ๊ฒ€์ฆํ•˜๋Š” pre-commit ํ›…๋„ ํ”ฝ์Šค์ฒ˜๋„ ์—†๋‹ค"* โ†’ `validate_standpoint_leg()` ๋Š” `pre-commit:798` ์ •์˜ ยท `:1575` ํ˜ธ์ถœ์ด๊ณ  `test_marker_standpoint_lanes.sh` ๋Š” `selfcheck.sh:531` ๋ฐฐ์„ ์ด๋‹ค. **๊ฐ™์€ ํŒŒ์ผ์ด ์ •๋ฐ˜๋Œ€๋„ ์ ๊ณ  ์žˆ์—ˆ๋‹ค.** ์ด ๊ณ„์—ด์€ ๋ ˆ์ธ์ด ๊ตฌ์กฐ์ ์œผ๋กœ ๋ชป ์žก๋Š”๋‹ค โ€” ๊ทœ์น™์˜ **์ž๊ธฐ์„œ์ˆ **์„ ๊ทธ ๊ทœ์น™์ด ์„œ์ˆ ํ•˜๋Š” **๊ธฐ๊ณ„**์™€ ๋Œ€์กฐํ•˜๋Š” ๊ฒ€์‚ฌ๊ฐ€ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  stale ํ•œ ยซ์•„์ง ์•ˆ ์ง€์—ˆ๋‹คยป ๋Š” ๊ฐ€์žฅ ์กฐ์šฉํ•œ ๋“œ๋ฆฌํ”„ํŠธ๋‹ค: ์ •์งํ•œ ๊ฒธ์†์ฒ˜๋Ÿผ ์ฝํžˆ๋ฉด์„œ **์ด๋ฏธ ์žˆ๋Š” ์ปจํŠธ๋กค์˜ ์‚ฌ์šฉ์„ ์–ต์ œํ•œ๋‹ค**
34
+ - **M-1(์ƒ์ฃผ 140k)์€ ์•ˆ ๋‹ซ์•˜๋‹ค.** ์ƒ์ฃผ ์›์žฅ 32์ ˆ ์ „์ˆ˜ ๊ฒฐ๊ณผ **MยทSยทR ์ „๋ถ€ 0** โ€” ์ ˆ ๋‹จ์œ„ ๋ ˆ๋ฒ„๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์‹ค์ธก์ด๋‹ค. ์œ ์ผํ•œ ๋ ˆ๋ฒ„๋Š” capability-level merge(ํ›„๋ณด 6๋ฌถ์Œ)์ด๊ณ , **๊ทธ ๋ณ‘ํ•ฉ์ด ์‹ค์ œ๋กœ ๋ฌธ์ž๋ฅผ ์ค„์ด๋Š”์ง€๋Š” UNMEASURED**
35
+
36
+ **๋ช…์‹œ ์ž”์—ฌ**: `package_coverage_check.sh` ๋Š” ใ€Œ์ฐธ์กฐ๋œ ๊ฒฝ๋กœ๊ฐ€ ์ถœํ•˜๋˜๋‚˜ใ€๋ฅผ ๋ณด์ง€ ใ€Œ**์ถœํ•˜๋œ ๋ ˆ์ธ์˜ ์ฃผ์ฒด๊ฐ€ ์ถœํ•˜๋˜๋‚˜**ใ€๋ฅผ ์•ˆ ๋ณธ๋‹ค โ€” ๋„ค ๊ฒฐํ•จ ์ค‘ ์…‹์„ rc=0 ์œผ๋กœ ํ†ต๊ณผ์‹œ์ผฐ๋‹ค. ๊ทธ ๊ฐญ์€ ์ด๋ฒˆ์— ์•ˆ ๋‹ซ์•˜๋‹ค.
37
+
13
38
  ### [2.5.1] โ€” 2026-08-19
14
39
 
15
40
  **์ง„์ž…์  ํŒจ๋ฆฌํ‹ฐ โ€” ๊ทœ์น™์ด ์ถœํ•˜๋ผ์•ผ ๋ฐœํ™”ํ•œ๋‹ค.** 2.5.0 ์งํ›„ `โ‘ฃ-b` ๋“œ๋ฆฌํ”„ํŠธ ๊ฒ€์‚ฌ๊ฐ€ **AGENTS.md ์— ๊ณต์œ  ์ฒดํฌ์•„์›ƒ ๊ทœ์œจ์ด ์—†๋‹ค**๋ฅผ ๋ƒˆ๋‹ค. CLAUDE.md ์—๋Š” ์žˆ๊ณ  Codex ์ง„์ž…์ ์—๋Š” ์—†๋Š” ์ƒํƒœ์˜€๊ณ , ๊ทธ ์ƒํƒœ์—์„œ๋Š” ๋น„-Claude ๋Ÿฐํƒ€์ž„์— ๊ทธ ๊ทœ์น™์ด **๋ณด์ด์ง€ ์•Š๋Š”๋‹ค**(gate-locality). ์ด ๋ฆด๋ฆฌ์Šค๋Š” ๊ทธ ํ•œ ํ•ญ๋ชฉ์„ ์†Œ๋น„์ž์—๊ฒŒ ์‹ค์ œ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.
@@ -202,6 +202,50 @@ re-checks** it against the artifact (phantom-quench back-trace) before accepting
202
202
  source-grounded is **dropped, not judged**. No sidecar-only verdict (no weak-local-judge regression).
203
203
  Local 4090 = **canary tier** (evidence-of, never terminal verdict).
204
204
 
205
+ ๐ŸŸฅ **What you SEND decides which axis you get โ€” put the MARKER in the payload, not just the diff**
206
+ (2026-08-19). Sidecars have been receiving the *diff* only. That buys a review of the **code** and
207
+ buys nothing on the **record**: the Axes 2+3 marker is self-attested, and this repo has already
208
+ written down that the closing move is *"cross-family reading that marker"* โ€” then never wired the
209
+ marker into the thing that recruits cross-family. Measured twice: (a) a release marker's false
210
+ `not-applicable` passed the new typed lanes untouched, because **form was correct**; (b) this skill's
211
+ own dispatch on 2026-08-19 sent a diff and no marker, so the round could not have caught a false
212
+ axis claim even in principle.
213
+
214
+ **So the payload is two parts**: the frozen diff **and** the marker for this change โ€” **as it stands
215
+ at dispatch time**: `axes-run:` ยท `controls:` ยท `standpoint:` ยท `thirdparty:` ยท `residual:`.
216
+
217
+ ๐ŸŸฅ **`crossfamily:` is NOT in the payload โ€” it is this round's OUTPUT.** Step 6 below says every rung
218
+ *emits* that value and "the rung is not done until its verdict is recorded", so requiring it in the
219
+ thing you send is circular: you would be shipping a field this dispatch has not produced yet. Send the
220
+ marker with that line **absent or `UNKNOWN`**, and fill it from the result. (Caught by a blind
221
+ floor-tier sim of this very paragraph, 2026-08-19 โ€” the first draft listed `crossfamily:` among the
222
+ payload fields and no reader could have satisfied it.) Ask the sidecar one extra
223
+ question: *"does the record match the diff โ€” is any axis claimed that the diff shows no trace of, and
224
+ is any residual missing that the diff implies?"*
225
+
226
+ โš ๏ธ **Scope, deliberately narrow.** This asks whether the record is **consistent with the artifact**.
227
+ It does NOT ask the sidecar to score honesty โ€” ยซis this marker truthfulยป is a *conclusion*, and
228
+ ยงMechanization Boundary forbids freezing that into machinery. Consistency is checkable from two
229
+ documents; honesty is not.
230
+ โš ๏ธ **You cannot observe that the sidecar READ it โ€” say so rather than implying otherwise.** Putting the
231
+ marker in the payload and the sidecar actually using it are different events, and nothing here
232
+ distinguishes them: a silently-ignored marker looks exactly like a marker that was read and raised
233
+ nothing. The cheap partial anchor is to require the return to **quote one marker line it checked** โ€”
234
+ a reply that quotes nothing did not demonstrably read it. That is evidence-of-reading, not proof, and
235
+ it does not close ยงMechanization Boundary's named self-attestation residual. Three independent
236
+ readers flagged this same gap on the day the paragraph was written (a peer session, and two blind
237
+ floor-tier sims), which is why it is stated here instead of left to the reader to notice.
238
+
239
+ โš ๏ธ **Prose, not a check** โ€” measured recurrence is 2, below this repo's own Nโ‰ฅ3 bar
240
+ (`[[feedback_mechanize_at_repetition_prose_before]]`). On the third occurrence, mechanize it here.
241
+ โš ๏ธ **Residency still governs**: a marker can name company assets. Sanitize before any external-family
242
+ dispatch, exactly as with the diff โ€” the marker is not exempt because it is metadata.
243
+
244
+ *Origin*: sister-asset read of `raphaelchristi/harness-evolver`'s `harness-critic` agent, whose whole
245
+ role is auditing the **evaluator** rather than the artifact. Its detection signatures (score jumps,
246
+ suspiciously fast convergence) do **not** port โ€” FH markers carry no score โ€” but the *target* does.
247
+ Full assessment incl. what was deliberately not imported: `tracks/_audit/proposal_2026-08-19_sister_harness-evolver.md`.
248
+
205
249
  **Target freeze โ€” a prior drop reason, checked before any of the above (2026-08-17).** Grounding a
206
250
  finding against *today's* tree proves nothing if the sidecar reviewed *yesterday's*. Pin before
207
251
  dispatch and verify on return:
@@ -46,6 +46,37 @@ the session card and CATALOG, exactly as the greeting path would.
46
46
  End with "pick a door, say a phrase, or just state your task". Do not auto-run anything โ€” this
47
47
  command is a map, not a dispatcher.
48
48
 
49
+
50
+ ## Step 3.5 โ€” ๊ฐ€์ด๋“œ ยท Q&A (๐Ÿ“– ๋ฌธ์„ ๊ณจ๋ž์„ ๋•Œ๋งŒ ์ง„์ž…)
51
+
52
+ ๐ŸŸฅ **Q&A ๋Š” net-new ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.** FH ์— ๋Œ€ํ•ด ๋ฌป๊ณ  ๋‹ตํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ๋œ๋‹ค(CLAUDE.md ๊ฐ€ ์ƒ์ฃผ๋ผ
53
+ ์„ธ์…˜์ด ๋ฌธยท๊ฒŒ์ดํŠธยท์Šคํ‚ฌ์„ ์•ˆ๋‹ค). ์ด ์ ˆ์ด ๋”ํ•˜๋Š” ๊ฒƒ์€ **ํ•˜๋‚˜๋ฟ**์ด๋‹ค โ€” ใ€Œ๋ฌด์—‡์„ ๊ทผ๊ฑฐ๋กœ ๋‹ตํ•˜๋‚˜,
54
+ ๊ทธ๋ฆฌ๊ณ  ์—†์œผ๋ฉด ์—†๋‹ค๊ณ  ๋งํ•œ๋‹คใ€๋Š” **๊ณ„์•ฝ**. ๊ทธ๋ž˜์„œ ์ƒˆ ์Šคํ‚ฌ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์—ฌ๊ธฐ ๋ถ™์ธ๋‹ค.
55
+
56
+ **โ“ ๊ฐ€์ด๋“œ** โ€” `docs/USER_GUIDE.md` ์˜ **๊ฒฝ๋กœ์™€ 3์ค„ ๋ชฉ์ฐจ**๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์Šน์ธํ•˜๋ฉด ํ”Œ๋žซํผ opener ๋ฅผ
57
+ ์ œ์•ˆํ•œ๋‹ค(`uname -s`: Darwinโ†’`open` ยท Linuxโ†’`xdg-open` ยท MINGW/MSYSโ†’`start`). opener ๊ฐ€ ์—†์œผ๋ฉด
58
+ ์กฐ์šฉํžˆ ๊ฑด๋„ˆ๋›ด๋‹ค โ€” ๊ฒฝ๋กœ๋Š” ์ด๋ฏธ ๋‚˜๊ฐ”์œผ๋ฏ€๋กœ ์†์‹ค์ด ์—†๋‹ค.
59
+ ๐ŸŸฅ **์ „๋ฌธ ์ธ๋ผ์ธ ์ถœ๋ ฅ ๊ธˆ์ง€.** ์ž๋™ ์‹คํ–‰๋„ ์•ˆ ํ•œ๋‹ค.
60
+
61
+ **โ“‘ Q&A** โ€” 1๋ฌธ 1๋‹ต. ๊ทผ๊ฑฐ๋Š” ์•„๋ž˜ ์ฝ”ํผ์Šค **์•ˆ์—์„œ๋งŒ** ์ฐพ๋Š”๋‹ค:
62
+
63
+ ```
64
+ 1 docs/USER_GUIDE.md ์‚ฌ์šฉ๋ฒ• ยท FAQ
65
+ 2 CHEATSHEET.md ๋ช…๋ น ยท ํŠธ๋ฆฌ๊ฑฐ ๋ฌธ๊ตฌ
66
+ 3 knowledge/shared/GLOSSARY.md ์šฉ์–ด
67
+ 4 README.md ยงGet started/ยงLearn more ์„ค์น˜ ยท ์ง„์ž… ๊ฒฝ๋กœ
68
+ 5 CATALOG.md ใ€Œ์˜ˆ์ „์— ๋ญ ํ–ˆ์ง€ใ€
69
+ 6 ์„ค์น˜๋œ SKILL.md frontmatter ใ€Œ๋ฌด์Šจ ์Šคํ‚ฌ ์žˆ์–ดใ€
70
+ ```
71
+
72
+ **degrade โ€” ์ฝ”ํผ์Šค์— ์—†์œผ๋ฉด**
73
+ ๐ŸŸฅ **์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค.** ใ€Œ๋ชป ์ฐพ์Œ โ€” ์ฝ”ํผ์Šค N๊ฐœ๋ฅผ ๋ดค๊ณ  ์—ฌ๊ธฐ์—” ์—†๋‹คใ€ + **๋‹ค์Œ ํ•œ ๊ฑธ์Œ**(์–ด๋А ํŒŒ์ผ์„
74
+ ์—ด์ง€ ยท `/install-doctor` ๊ฐ™์€ ์‹ค์ œ ์ง„๋‹จ ๊ฒฝ๋กœ)์„ ์ค€๋‹ค. ใ€Œ์•„๋งˆ ์ด๋Ÿด ๊ฒƒ์ด๋‹คใ€ ํ˜•ํƒœ์˜ ๋‹ต์€ **๊ธˆ์ง€**๋‹ค.
75
+ ์ด๊ฑด ยงInstrument Calibration ์˜ ยซ๋ฏธ์ธก์ •์„ 0์œผ๋กœ ๋ Œ๋”ํ•˜์ง€ ์•Š๋Š”๋‹คยป ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค.
76
+ ๋‹ต๋งˆ๋‹ค `file:line` ์„ ๋‹จ๋‹ค โ€” ๊ทผ๊ฑฐ ์—†๋Š” ๋ฌธ์žฅ์€ ํŒฌํ…€์ด๋‹ค.
77
+
78
+ โš ๏ธ ์ฝ”ํผ์Šค ๋ฐ– ์งˆ๋ฌธ(๋„๋ฉ”์ธ ์ž‘์—… ยท ์ฝ”๋“œ)์€ ์ด ์ ˆ์ด ์•„๋‹ˆ๋ผ ํ‰์†Œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. Q&A ๋Š” **FH ์‚ฌ์šฉ๋ฒ•**์šฉ์ด๋‹ค.
79
+
49
80
  ## Done When
50
81
 
51
82
  | Condition | Check class |
@@ -214,7 +214,7 @@ fi
214
214
  No Stop hook is required. After the Codex goal/session completes, resolve changed files with git and run:
215
215
 
216
216
  ```bash
217
- FH_BACKEND=codex npx @chrono-meta/fh-gate "{changed-files}" quick codex-goal
217
+ FH_BACKEND=codex npx --package @chrono-meta/fh-gate fh-gate "{changed-files}" quick codex-goal
218
218
  ```
219
219
 
220
220
  For high-stakes or external-facing work, use `full` instead of `quick`. Treat `BLOCKED` or `ESCALATE` the same as the Claude path: fix and re-run the gate, or surface the decision to the user.
@@ -149,7 +149,13 @@ running tool itself). Full procedure: `knowledge/shared/harness-core/measurement
149
149
  `M-n ยท <verbatim row text or its threshold> ยท <measured value>`. If you cannot quote the row, **you do not
150
150
  have a finding** โ€” downgrade to an observation. Origin (2026-07-20, instrument defect n+4, the *fourth* in
151
151
  a single run): a run fired `M-1 ยท CLAUDE.md 816 lines โ€” exceeds the FH threshold of 500`. The string `500`
152
- does not occur anywhere in this file (grep: 0 hits), and the meta-harness row it claimed to read says raw
152
+ did not occur anywhere in this file at the time (a later grep finds 2 โ€” both in this narrative, added by
153
+ this very post-mortem; the self-referential claim drifted and is corrected here rather than re-asserted).
154
+ ๐ŸŸฅ **And that grep was scoped wrong**: it searched this file only. The 500 was NOT invented from nothing โ€”
155
+ `docs/platform_sustainability.md` carried it as a live standard until 2026-08-20, contradicting this row.
156
+ The lesson is not "the run hallucinated" but **"the absence check was run against the wrong corpus"**
157
+ ([[feedback_absence_measurement_needs_control]] โ€” a no-hit grep is evidence only when its scope covers
158
+ where the thing would actually live). The meta-harness row it claimed to read says raw
153
159
  line count is **"Not a verdict."** So the run invented a threshold *and* fired a row this skill explicitly
154
160
  disables for meta-harnesses โ€” the exact recurrence of the 2026-07-15 inversion documented below, which had
155
161
  already been patched *in the skill*. The patch held; the **run** ignored it. A verdict grounded in a
@@ -54,6 +54,38 @@ Session end
54
54
  โ”‚ edit-manifest VERIFY: check pending predictions in edit_manifest.yaml
55
55
  โ”‚ memory-hygiene scan: staleness check on memory/*.md entries (skip if < 7 days)
56
56
  โ”‚
57
+ [Step 0-d] Session Retrospective (close_retro ๊ฐ€ granted ์ผ ๋•Œ๋งŒ)
58
+ ๐ŸŸฅ ์ƒˆ ์Šคํ‚ฌ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค โ€” ํšŒ๊ณ  ์‚ฐ์ถœ์€ ๊ทธ๋Œ€๋กœ Step 2(contention-layer) โ†’ Step 3 โ†’ 3.5(๋“ฑ๊ธ‰)
59
+ ๋กœ **์ด๋ฏธ ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ**์„ ํƒ„๋‹ค. ใ€Œ๊ฐœ์„ ํฌ์ธํŠธ ์ •๋ฆฌใ€๊ฐ€ ๊ฑฐ๊ธฐ์„œ ๊ณต์งœ๋กœ ๋ถ™๋Š”๋‹ค.
60
+
61
+ ์ง„์ž… ์กฐ๊ฑด (๊ธฐ๊ณ„์ , ์ด ์ˆœ์„œ๋กœ):
62
+ 1. `tracks/_meta/user_adaptation_profile.md` frontmatter ์˜ `close_retro`
63
+ granted โ†’ ์‹คํ–‰
64
+ declined โ†’ ๊ฑด๋„ˆ๋›ด๋‹ค. **๋‹ค์‹œ ๋ฌป์ง€ ์•Š๋Š”๋‹ค**(operational_adaptation.md no-re-nag)
65
+ unset / UAP ๋ถ€์žฌ / ephemeral โ†’ **์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ์ง€์–ด๋‚ด์ง€๋„ ์•Š๋Š”๋‹ค.**
66
+ ์šด์˜์ž ๋งฅ๋ฝ์ด๋ฉด(= `CLAUDE.local.md` ์กด์žฌ, `psa_detect_operator_context()` ์™€ ๊ฐ™์€
67
+ ํŒ๋ณ„์ž) **์ตœ์ดˆ ๋งˆ๊ฐ 1ํšŒ๋งŒ** ์ œ์•ˆํ•˜๊ณ  ๋‹ต์„ UAP ์— ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ ์ด์ƒ ๋ฌป์ง€ ์•Š๋Š”๋‹ค.
68
+ ๐ŸŸฅ `CLAUDE.local.md` ์กด์žฌ๊ฐ€ ํŒ๋ณ„์ž์ธ ์ด์œ ๋Š” ๊ทธ๊ฒƒ์ด **gitignored** ๋ผ fresh cloneยทCI ์ฒดํฌ์•„์›ƒยท
69
+ ์›ŒํฌํŠธ๋ฆฌ ์–ด๋””์—๋„ ์•ˆ ๋”ฐ๋ผ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ๊ฐ๋œ ํ›„๋ณด: ใ€Œtracks/_meta ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์Œใ€ โ€”
70
+ `.gitkeep` ์ด tracked ๋ผ **fresh clone ์ด ๋งŒ์กฑ์‹œํ‚จ๋‹ค**(psa_scan_lib.sh ์ฃผ์„์˜ ์‹ค์ธก).
71
+ ๐ŸŸฅ **์šด์˜์ž ๋งฅ๋ฝ์ด๋ผ๊ณ  ์ž๋™ granted ๊ฐ€ ์•„๋‹ˆ๋‹ค.** ํŒŒ์ผ์ด ์กด์žฌํ•ด์„œ ์Šน์ธ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ
72
+ **์šด์˜์ž ๋ฐœํ™”๊ฐ€ ์ธ์šฉ๋ผ ๊ธฐ๋ก๋˜๋Š” ์ˆœ๊ฐ„** ์Šน์ธ๋œ๋‹ค. ์ „์ž๋Š” ์„ธ์…˜์ด ์ž๊ธฐ ๊ถŒํ•œ์„ ๋„“ํžˆ๋Š” ํ˜•ํƒœ๋‹ค.
73
+
74
+ ์‚ฐ์ถœ: ์˜ค๋Š˜์ž `tracks/_meta/fh_signal_{date}_{source}.md` ์— `retro: close` ๋ฅผ ๋‹ฌ๊ณ 
75
+ `## Session Retrospective` 4ํ•„๋“œ๋ฅผ ์ฑ„์šด๋‹ค(ํ˜•์‹ ์ •๋ณธ = fh_detail_protocols.md).
76
+ ใ€Œ์—†์Œใ€ยทใ€Œ0ใ€๋„ ์œ ํšจํ•œ ๊ฐ’์ด๊ณ , **๋น„์šฐ๋Š” ๊ฒƒ๋งŒ ์•ˆ ๋œ๋‹ค.**
77
+
78
+ Done When:
79
+ + ์˜ค๋Š˜์ž signal ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ  `retro: close` ๋ฅผ ๋‹ฌ๊ณ  ์žˆ๋‹ค โ€” mandatory-pass
80
+ + Session Retrospective 4ํ•„๋“œ๊ฐ€ ์ „๋ถ€ ์ฑ„์›Œ์กŒ๋‹ค โ€” mandatory-pass
81
+ + ์ •์ • ๊ฑด์ˆ˜๋Š” **์„ธ์—ˆ์ง€ ํšŒ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค** โ€” measured
82
+ + FH Registration Candidate ๊ฐ€ ๋น„๋ฉด ๊ทธ ์ด์œ ๊ฐ€ ํ•œ ์ค„ ์ ํ˜€ ์žˆ๋‹ค โ€” mandatory-pass
83
+
84
+ โš ๏ธ `session_close_check.sh` ์— ๊ธฐ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ **๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.** ๊ฐ’์‹ธ๊ฒŒ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋Š”
85
+ ยซ์˜ค๋Š˜์ž signal ์ด ์žˆ๋‚˜ยป ์ธ๋ฐ ๊ทธ๊ฑด *์กด์žฌ*๋งŒ ์žฌ๊ณ  *ํšŒ๊ณ ํ–ˆ๋‚˜*๋Š” ๋ชป ์žฐ๋‹ค โ€” CLAUDE.md ๊ฐ€ โ‘ฃ ๋ฉ”๋ชจ๋ฆฌ
86
+ ์œ„์ƒ์— ๋Œ€ํ•ด ๊ฐ™์€ ์ด์œ ๋กœ ๊ฒ€์‚ฌ๋ฅผ ๋บ๋‹ค(ยซa check that can be satisfied without doing the work
87
+ is a decorationยป). ๊ฐ™์€ ํŒ๋‹จ์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•œ๋‹ค.
88
+
57
89
  [Step 0] Regression Guard
58
90
  โ”‚ Check: does anything from this session conflict with or regress a validated skill?
59
91
  โ”‚ โ†’ Regression detected: flag, route to contention-layer
@@ -0,0 +1,31 @@
1
+ # [CALIBRATION FIXTURE โ€” known-negative] ์ •๋ณด๊ฒฝ๊ณ„ ๋ถˆ๋ณ€์‹์ด **๋น ์ง„** ํ•ฉ์„ฑ ๋ช…์„ธ์„œ
2
+
3
+ > ๐ŸŸฅ **์ด๊ฒƒ์€ ์‹คํ–‰๋˜๋Š” ์—์ด์ „ํŠธ ์ •์˜๊ฐ€ ์•„๋‹ˆ๋‹ค.** `scripts/blackbox_invariant_check.sh` ์˜
4
+ > ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์Œ ์ค‘ **๋ง‰ํ˜€์•ผ ํ•˜๋Š” ์ชฝ**(expect = FAIL, exit 1)์ด๋‹ค. ์ง์€
5
+ > `agent_boundary_known_positive.md`.
6
+ >
7
+ > ์ด ํŒŒ์ผ์ด ํ•„์š”ํ•œ ์ด์œ : ์–‘์„ฑ๋งŒ ์„ธ์šฐ๋ฉด ใ€Œ๋ถˆ๋ณ€์‹์ด ์‚ด์•„์žˆ๋‹คใ€์™€ ใ€Œ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ณธ๋‹คใ€๊ฐ€
8
+ > ๊ฐ™์€ ์ดˆ๋ก์œผ๋กœ ๋ณด์ธ๋‹ค. ์Œ์„ฑ arm ์€ ๊ณ„๊ธฐ์— **ํŒ๋ณ„๋ ฅ์ด ์žˆ๋Š”์ง€**๋ฅผ ์žฌ๋Š” ์ž๋ฆฌ๋‹ค.
9
+ >
10
+ > **์˜๋„์ ์œผ๋กœ ์œ„๋ฐ˜ํ•œ๋‹ค** โ€” ๋ถˆ๋ณ€์‹ ๋ฌธ์žฅ๋“ค์„ ์ „๋ถ€ ๋บ๋‹ค. ์‹ค ์‹๋ณ„์ž๋Š” ๋‹ด์ง€ ์•Š๋Š”๋‹ค(๊ทธ๊ฑด T1 ์ด
11
+ > ์žก๋Š” ๋ณ„๊ฐœ์˜ ์œ„๋ฐ˜์ด๊ณ , ์—ฌ๊ธฐ์„œ ๊ทธ๊ฒƒ๊นŒ์ง€ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด ์–ด๋А ์ถ•์ด ๋ง‰์•˜๋Š”์ง€ ํ๋ ค์ง„๋‹ค).
12
+
13
+ ## ์ž…๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค
14
+
15
+ ์™ธ๋ถ€ findings ๋ฅผ ๋ฐ›๋Š”๋‹ค. `finding_id` ๋Š” ๋ถˆํˆฌ๋ช… ์‹๋ณ„์ž๋‹ค(์–ดํœ˜ ์ œ์•ฝ ์—†์Œ).
16
+ `location` ์€ ํŠน์ • ์ ‘๋‘์–ด๊ฐ€ ๋ณด์ด๋ฉด ํ๊ธฐํ•œ๋‹ค(denylist).
17
+
18
+ ## ํˆฌ์˜ ๊ทœ์น™
19
+
20
+ ์ฃผ์ž… ํŒŒ์ดํ”„๊ฐ€ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ์ง€์šด๋‹ค. ๋ฐ›์€ ์ž…๋ ฅ์€ ๊ทธ๋Œ€๋กœ ๋‹ด์•„ ํ•˜์œ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.
21
+ ๊ธˆ์ง€ ๋Œ€์ƒ์€ ์ด ๋ ˆํฌ ๋ฐ–์˜ ํŒŒ์ผ์ด๋‹ค.
22
+
23
+ ## ์•ˆ์ „ ๊ทœ์น™
24
+
25
+ 1. ํŒ์ • ๊ทผ๊ฑฐ๋Š” ์ธ์šฉ ๊ฐ€๋Šฅํ•œ ์ฆ๊ฑฐ๋กœ ๋‚จ๊ธด๋‹ค.
26
+ 2. ์ฆ๊ฑฐ ์—†๋Š” ์ถ”์ •์€ ์‹ ๋ขฐ๋„๋ฅผ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
27
+ 3. ์‹คํŒจ๋ฅผ ์„ฑ๊ณต์œผ๋กœ ์‚ผํ‚ค์ง€ ์•Š๋Š”๋‹ค.
28
+ 4. ์žฌํ˜„ ์ ˆ์ฐจ ์—†์ด ์ˆ˜์ •์•ˆ์„ ์ œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.
29
+ 5. ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋Š” ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
30
+ 6. ReadยทGrepยทGlob ์œผ๋กœ ๊ธˆ์ง€๋œ ์†Œ์Šค๋ฅผ ์—ด์ง€ ์•Š๋Š”๋‹ค.
31
+ 7. ์‹ ๋ขฐ๋„๋Š” ๊ทผ๊ฑฐ์˜ ๊ฐ•๋„์— ๋”ฐ๋ผ ์ •ํ•œ๋‹ค.
@@ -0,0 +1,56 @@
1
+ # [CALIBRATION FIXTURE โ€” known-positive] ์ •๋ณด๊ฒฝ๊ณ„ ๋ถˆ๋ณ€์‹ ํ•ฉ์„ฑ ๋ช…์„ธ์„œ
2
+
3
+ > ๐ŸŸฅ **์ด๊ฒƒ์€ ์‹คํ–‰๋˜๋Š” ์—์ด์ „ํŠธ ์ •์˜๊ฐ€ ์•„๋‹ˆ๋‹ค.** `scripts/blackbox_invariant_check.sh` ์˜
4
+ > ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์Œ ์ค‘ **ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” ์ชฝ**(expect = PASS, exit 0)์ด๋‹ค. ์ง์€
5
+ > `agent_boundary_known_negative.md` ์ด๊ณ  ๊ทธ์ชฝ์€ ๋ง‰ํ˜€์•ผ ํ•œ๋‹ค(expect = FAIL, exit 1).
6
+ >
7
+ > **์™œ ์‹ค๋ฌผ ๋ช…์„ธ์„œ๋ฅผ ์“ฐ์ง€ ์•Š๋‚˜**: ์‹ค๋ฌผ์€ ํŒ€์ด ๊ณ„์† ๊ณ ์น˜๋Š” ์‚ด์•„์žˆ๋Š” ๋ฌธ์„œ๋ผ, ๊ทธ๊ฒƒ์„ ์–‘์„ฑ
8
+ > arm ์œผ๋กœ ์“ฐ๋ฉด ๊ณ„๊ธฐ์˜ ํŒ์ •์ด ๋‚จ์˜ ํŽธ์ง‘์— ๋”ฐ๋ผ ์กฐ์šฉํžˆ ๋’ค์ง‘ํžŒ๋‹ค(๊ฐ์‚ฌ ๋Œ€์ƒ์€ ์–ผ๋ ค์•ผ ํ•œ๋‹ค).
9
+ > ์‹ค๋ฌผ ๋ช…์„ธ์„œ๋Š” ์ธ์ž ์—†๋Š” ๊ธฐ๋ณธ ๋Œ€์ƒ์œผ๋กœ ๊ณ„์† ๊ฒ€์‚ฌ๋œ๋‹ค โ€” ์ด ํŒŒ์ผ์ด ๊ทธ๊ฒƒ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค.
10
+ >
11
+ > ์‹๋ณ„์ž๋Š” ์ „๋ถ€ ํ•ฉ์„ฑ์ด๋‹ค. ์‹ค์ œ ์„œ๋น„์Šคยท๋ ˆํฌยทํ•„๋“œ ์ด๋ฆ„์€ ํ•œ ๊ฑด๋„ ๋‹ด์ง€ ์•Š๋Š”๋‹ค.
12
+
13
+ ## ์ž…๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค
14
+
15
+ ์™ธ๋ถ€ ์ •์ ๋ถ„์„์—์„œ ์˜จ findings ๋ฅผ ๋ฐ›๋˜, ์ด ์—์ด์ „ํŠธ๋Š” ๊ทธ findings ์˜ **์›๋ณธ ์†Œ์Šค**๋ฅผ ์ ˆ๋Œ€
16
+ ์ฝ์ง€ ์•Š๋Š”๋‹ค. ์ฃผ์ž… ์ธก์ด ํˆฌ์˜ํ•œ ๊ฒฐ๊ณผ๋งŒ ๋ณธ๋‹ค.
17
+
18
+ - `finding_id` โ€” ๋ถˆํˆฌ๋ช… ์‹๋ณ„์ž. ์–ดํœ˜ ์ œ์•ฝ: `^[a-f0-9]{6,64}$` ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.
19
+ ์ž์œ ๋ฌธ์ž์—ด์ด๋ฉด ๊ฒฝ๋กœยท๋ฐœ์ทŒ๋ฅผ ์‹ค์–ด ๋‚˜๋ฅด๋Š” ์šฐํšŒ ์šด๋ฐ˜ ์ฑ„๋„์ด ๋œ๋‹ค.
20
+ - `location` โ€” allowlist ์ •๊ทœ์‹ `^<FE-REDACTED>::[0-9]+$` ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.
21
+ denylist(โ€œํŠน์ • ์ ‘๋‘์–ด๊ฐ€ ๋ณด์ด๋ฉด ํ๊ธฐโ€)๋Š” ์ƒ๋Œ€๊ฒฝ๋กœยท`file:///` ๋“ฑ์œผ๋กœ ๋šซ๋ฆฐ๋‹ค.
22
+
23
+ ## ํˆฌ์˜ ๊ทœ์น™
24
+
25
+ **ํˆฌ์˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผ์ฒด๋Š”** ์ฃผ์ž… ์ธก(ํŒŒ์ดํ”„๋ผ์ธ)์ด๋‹ค. ์ˆ˜ํ–‰ ์ฃผ์ฒด๋ฅผ ์ ์ง€ ์•Š์œผ๋ฉด redact ๊ทœ์น™์ด
26
+ ์ˆ˜ํ–‰์ž ์—†๋Š” ๊ณต์ˆ˜ํ‘œ๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์—์ด์ „ํŠธ๋Š” ์ž…๋ ฅ์„ **"๊ทธ๋Œ€๋กœ" ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€”
27
+ ํˆฌ์˜๋œ ํ˜•ํƒœ๋งŒ ํ•˜์œ„๋กœ ๋„˜๊ธด๋‹ค.
28
+
29
+ ๊ธˆ์ง€ ๋Œ€์ƒ์€ **์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ถœ์ฒ˜**๋กœ ์ •์˜ํ•œ๋‹ค. ๋ ˆํฌ ์•ˆ์— ๋ณต์‚ฌ๋œ ์‚ฌ๋ณธ, ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ,
30
+ `sourcesContent` ๋ฅผ ๋‹ด์€ ์†Œ์Šค๋งต ์ „๋ถ€ ๋™์ผํ•˜๊ฒŒ ๊ธˆ์ง€๋‹ค. "๋ ˆํฌ ๋ฐ–"์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋ ˆํฌ ์•ˆ
31
+ ์‚ฌ๋ณธ์ด ํ†ต์งธ๋กœ ๋ฉด์ œ๋œ๋‹ค.
32
+
33
+ ### ํ˜„์žฌ ๋ฐฐ์„  ์ƒํƒœ
34
+
35
+ ์ด ํˆฌ์˜ ํŒŒ์ดํ”„๋Š” **์•„์ง ์ฝ”๋“œ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.** ๋ฏธ๊ตฌํ˜„ ํ†ต์ œ๋ฅผ ๊ตฌํ˜„๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ ์œผ๋ฉด
36
+ ๊ทธ ์ž์ฒด๊ฐ€ ๋‚™๊ด€ ๋ฐฉํ–ฅ ๊ฒฐํ•จ์ด๋‹ค.
37
+
38
+ ๊ทธ๋ž˜์„œ **์Šฌ๋กฏ์€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์ •์˜๋˜์ง€ ์•Š์€ ์ ˆ์ฐจ์— must-never ๋ถˆ๋ณ€์‹์„ ์–น์ง€
39
+ ์•Š๊ธฐ ์œ„ํ•ด, ํ™œ์„ฑํ™” **๊ฒฝ๋กœ๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค.**
40
+
41
+ ## ์•ˆ์ „ ๊ทœ์น™
42
+
43
+ 1. ํŒ์ • ๊ทผ๊ฑฐ๋Š” ์ธ์šฉ ๊ฐ€๋Šฅํ•œ ์ฆ๊ฑฐ๋กœ ๋‚จ๊ธด๋‹ค.
44
+ 2. ์ฆ๊ฑฐ ์—†๋Š” ์ถ”์ •์€ ์‹ ๋ขฐ๋„๋ฅผ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
45
+ 3. ์‹คํŒจ๋ฅผ ์„ฑ๊ณต์œผ๋กœ ์‚ผํ‚ค์ง€ ์•Š๋Š”๋‹ค.
46
+ 4. ์žฌํ˜„ ์ ˆ์ฐจ ์—†์ด ์ˆ˜์ •์•ˆ์„ ์ œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.
47
+ 5. ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋Š” ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
48
+ 6. **๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ ๊ธˆ์ง€** โ€” **์ถœ์ฒ˜๊ฐ€ ํ™”์ดํŠธ๋ฐ•์Šค๋ฉด ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์ €์žฅ๋œ ๊ฐ’์€ ๋‹ค์Œ ํ˜ธ์ถœ์—
49
+ ์ž๋™ ์ฃผ์ž…๋˜๋ฏ€๋กœ, ์ฝ์ง€ ์•Š์„ ๊ธฐํšŒ์กฐ์ฐจ ์—†์ด ์„ธ์…˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์˜ค์—ผ์ด ์ง€์†๋œ๋‹ค.
50
+ 7. ์ƒํ•œ ๋ถˆ๋ณ€์‹: ์™ธ๋ถ€ findings ๊ทผ๊ฑฐ๋งŒ ์žˆ๊ณ  ๋Ÿฐํƒ€์ž„ ์ฆ๊ฑฐ(XML)๊ฐ€ ์—†์œผ๋ฉด ์‹ ๋ขฐ๋„๋Š” MEDIUM ์„
51
+ ๋„˜์ง€ ๋ชปํ•œ๋‹ค. ์ด ์กฐํ•ญ์€ **๋‹ค๋ฅธ ๋ชจ๋“  ์กฐํ•ญ์— ์šฐ์„ **ํ•œ๋‹ค.
52
+ 8. ๊ธˆ์ง€๋œ ์†Œ์Šค์˜ **๋Šฅ๋™ ํƒ์ƒ‰**์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๊ธˆ์ง€๋Š” **๋„๊ตฌ ๋ฌด๊ด€**์ด๋‹ค โ€” ReadยทGrepยทGlob
53
+ ๋ฟ ์•„๋‹ˆ๋ผ `Bash` ๋ฅผ ๊ฒฝ์œ ํ•œ ์—ด๋žŒ๋„ ๊ฐ™์€ ์œ„๋ฐ˜์ด๋‹ค. ๋„๊ตฌ๋ฅผ ์—ด๊ฑฐํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ ์œผ๋ฉด ์—ด๊ฑฐ๋˜์ง€
54
+ ์•Š์€ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋Œ€๋กœ ์šฐํšŒ๋กœ๊ฐ€ ๋œ๋‹ค.
55
+ ํ•„์ˆ˜ ์ฑ„๋„(๋ฆฌํฌํŠธยท์ฒจ๋ถ€)์—์„œ **์กฐ์šฐ**ํ•œ ๊ฒฝ์šฐ๋Š” ๋ณ„๊ฐœ๋‹ค: ์—ด๊ธฐ ์ „์—๋Š” ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ
56
+ "์ฝ์ง€ ๋งˆ๋ผ"๋Š” ์ดํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜๋ฌด๊ฐ€ ๋œ๋‹ค. ์กฐ์šฐ ์‹œ์—๋Š” ์ค‘๋‹จํ•˜๊ณ  ๋ณด๊ณ ํ•œ๋‹ค.
@@ -590,12 +590,25 @@ EOF
590
590
  # ([[feedback_ci_measures_state_not_transition]] ์˜ ๋ฐ์ดํ„ฐ ํŒ๋ณธ).
591
591
  # ์•ต์ปค๋ฅผ **์ถ”์ ๋˜๋Š” ํŒŒ์ผ**๋กœ ์˜ฎ๊ธด๋‹ค โ€” `.claude/capabilities/*.cap` ์€ ์ปค๋ฐ‹๋ผ ์žˆ์–ด
592
592
  # ์–ด๋А ์ฒดํฌ์•„์›ƒ์—์„œ๋„ ์กด์žฌํ•œ๋‹ค. ์ˆ˜์ง‘ ๊ฒฝ๋กœ๊ฐ€ ์ฃฝ์œผ๋ฉด ์ด ์นด์šดํŠธ๊ฐ€ 0 ์ด ๋˜์–ด ๋นจ๊ฐœ์ง„๋‹ค.
593
+ # ๐ŸŸฅ 2026-08-20 โ€” ์ด ๋ ˆ์ธ์€ **๋‘ ๊ตฐ๋ฐ๊ฐ€ ์ €์ž์˜ ์ฒดํฌ์•„์›ƒ์— ๊ฒฐ๋ฐ•**๋ผ ์žˆ์—ˆ๊ณ , ์†Œ๋น„์ž ์„ค์น˜์—์„œ
594
+ # ์ „๊ฑด ์ ์ƒ‰์ด์—ˆ๋‹ค(์‹ค์ธก: ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์‹ค๋ฌผ 2.5.1 ์—์„œ `discover` rc=10 โ†’ selfcheck FAIL).
595
+ # โ“ ์ „์ œ: `discover` ๋Š” `tracks/` ๋งคํ•‘ ๋ชฉ๋ก์„ ์ „์ œํ•˜๋Š”๋ฐ `tracks/` ๋Š” gitignored ๋ผ
596
+ # **๋ฐฐํฌ๋ฌผ์— ๊ตฌ์กฐ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.** ๋ถ€์žฌ๋Š” ยซ๋Šฅ๋ ฅ 0ยป ์ด ์•„๋‹ˆ๋ผ **๋ฏธ์ธก์ •**์ด๋ฏ€๋กœ
597
+ # FAIL ์ด ์•„๋‹ˆ๋ผ ์ด๋ฆ„ ์žˆ๋Š” SKIP ์œผ๋กœ ๋‚ธ๋‹ค([[feedback_not_found_is_not_zero_family]]).
598
+ # โ“‘ ๐ŸŸฅ **์ดˆํŒ์ด ์—ฌ๊ธฐ์„œ ํ‹€๋ ธ๊ณ , cross-family(codex/gpt-5.5)๊ฐ€ ์žก์•˜๋‹ค โ€” ์ž๋ ฅ ์ ๋ฐœ 0.**
599
+ # ๊ธฐ๋Œ€ ๋ฌธ์ž์—ด `^forge-harness\(hub\)` ๋ฅผ ยซํด๋”๋ช… ๊ฒฐ๋ฐ•ยป ์œผ๋กœ ์ฝ๊ณ  `basename` ์œ ๋„๋กœ
600
+ # ๋ฐ”๊ฟจ๋Š”๋ฐ, **์ƒ์‚ฐ์ž(:128)๋Š” ๋ฆฌํ„ฐ๋Ÿด `forge-harness(hub)` ๋ฅผ ๋‚ธ๋‹ค.** ์ฆ‰ ์œ ๋„๋กœ ๋ฐ”๊พธ๋ฉด
601
+ # ์ด๋ฆ„์ด ๋‹ค๋ฅธ ํŠธ๋ฆฌ์—์„œ ๊ธฐ๋Œ€์™€ ์‚ฐ์ถœ์ด ๊ฐˆ๋ ค **๊ฑฐ์ง“ FAIL** ์ด ๋œ๋‹ค โ€” ์ด ํŒŒ์ผ์ด ๋ฐ”๋กœ ์œ„์—์„œ
602
+ # ๊ฒฝ๊ณ ํ•˜๋Š” divergent-normalizer ๋ฅผ ์ˆ˜๋ฆฌ๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“  ๊ผด์ด๋‹ค. ๋˜๋Œ๋ ธ๋‹ค.
603
+ # ์ง„๋‹จ ์ •์ •: ์ด ๋ผ๋ฒจ์€ ยซ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„ยป์ด ์•„๋‹ˆ๋ผ **ํ—ˆ๋ธŒ์˜ ์ƒ์ˆ˜ ์‹๋ณ„์ž**๋‹ค. ์–‘์ชฝ์ด ๊ฐ™์€
604
+ # ์ƒ์ˆ˜๋ฅผ ์“ฐ๋Š” ํ•œ ์–ด๋А ์ฒดํฌ์•„์›ƒ์—์„œ๋„ ์ผ์น˜ํ•˜๋ฏ€๋กœ ๊ฒฐ๋ฐ•์ด ์•„๋‹ˆ๋‹ค. ๊ฒฐ๋ฐ•์€ โ“ ํ•˜๋‚˜์˜€๋‹ค.
605
+ local _hubroot
606
+ _hubroot="$(cd -P "$(dirname "$SELF")/.." && pwd)"
607
+ tracked_n="$(_cap_files "$_hubroot/.claude/capabilities" | wc -l | tr -d ' ')"
593
608
  out="$(bash "$SELF" discover 2>&1)"; rc=$?
594
- # โ˜…์„ธ๋Š” ๊ทœ์น™์€ ๋„๊ตฌ์™€ **๊ฐ™์•„์•ผ ํ•œ๋‹ค**. ์ดˆํŒ์€ `ls .../*.cap`(๋น„์žฌ๊ท€)์˜€๋Š”๋ฐ ๋„๊ตฌ๊ฐ€ ์žฌ๊ท€๋กœ
595
- # ๋ฐ”๋€Œ์ž ๋ ˆ์ธ๋งŒ 2๋ฅผ ์„ธ๊ณ  ๋„๊ตฌ๋Š” 5๋ฅผ ์„ธ์–ด ๊ฑฐ์ง“ ์ ์ƒ‰์ด ๋‚ฌ๋‹ค โ€” ๋ ˆ์ธ ์ž์‹ ์ด
596
- # divergent-normalizer ๊ฐ€ ๋œ ๊ฒฝ์šฐ๋‹ค. `_cap_files` ํ•œ ๋ฒŒ๋กœ ํ†ต์ผํ•œ๋‹ค.
597
- tracked_n="$(_cap_files "$(cd -P "$(dirname "$SELF")/.." && pwd)/.claude/capabilities" | wc -l | tr -d ' ')"
598
- if [ "${tracked_n:-0}" -lt 1 ]; then
609
+ if [ ! -d "$_hubroot/tracks" ]; then
610
+ echo " โญ L13c SKIP โ€” tracks/ ๋ถ€์žฌ๋ผ discover ์˜ ์ „์ œ๊ฐ€ ์—†๋‹ค(gitignored, ๋ฐฐํฌ๋ฌผ์— ๊ตฌ์กฐ์  ๋ถ€์žฌ). ๋ฏธ์ธก์ •์ด์ง€ ยซ0๊ฑดยป ์•„๋‹˜"
611
+ elif [ "${tracked_n:-0}" -lt 1 ]; then
599
612
  f=$((f+1)); echo " โŒ L13c ์ „์ œ ํŒŒ์† โ€” ์ถ”์ ๋˜๋Š” .claude/capabilities/*.cap ์ด 0๊ฑด์ด๋‹ค(์•ต์ปค ๋Œ€์ƒ ๋ถ€์žฌ)"
600
613
  elif printf '%s' "$out" | grep -qE '^forge-harness\(hub\)[[:space:]]+OK[[:space:]]+'"$tracked_n"'[[:space:]]'; then
601
614
  p=$((p+1)); echo " โœ… L13c ์‹ค๋ฌผ ์ˆ˜์ง‘์ด ์‚ด์•„ ์žˆ๋‹ค โ€” ํ—ˆ๋ธŒ ์ž์‹ ์˜ ์ถ”์  ์„ ์–ธ ${tracked_n}๊ฑด์„ ์‹ค์ œ๋กœ ์ง‘์—ˆ๋‹ค"