Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Zero training · Deterministic · Stdlib-only core (Python 3.10+; the `judge` an

**[📖 Full Probe Guide →](docs/GUIDE.md)** — detailed explanations, worked examples, and workflows for all 28 probes
**[📜 MIRROR-SPEC v1.1 →](docs/SPEC.md)** — the normative ledger format & verification protocol (ratified 2026-07-02, amended 2026-07-17; this package is its reference implementation)
**[🦋 Catalog of Measurement Illusions →](catalog/README.md)** — 74 real sealed cases of measurement deceiving its own authors (gaming · self-catch · false-negative guards · contamination)
**[🦋 Catalog of Measurement Illusions →](catalog/README.md)** — 79 real sealed cases of measurement deceiving its own authors (gaming · self-catch · false-negative guards · contamination)

> **🪞🔎🪪 New — Mirror Stack** ([`stack/`](stack/)): measure-mirror is the *claims* layer of a
> three-mirror integrity stack for autonomous research agents (claims · actions · provenance,
Expand Down
2 changes: 1 addition & 1 deletion README_KO.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

**[📖 프로브 완전 가이드 →](docs/GUIDE_KO.md)** — 28개 프로브 전체 설명·예제·워크플로우
**[📜 MIRROR-SPEC v1.1 →](docs/SPEC_KO.md)** — 원장 포맷·검증 프로토콜의 규범 명세(2026-07-02 비준·2026-07-17 개정; 이 패키지는 그 참조구현. 규범 정본은 [영어판](docs/SPEC.md))
**[🦋 측정착시 도감 →](catalog/README_KO.md)** — 측정이 만든 이를 속인 실제 봉인 사례 74표본(게이밍·자가적발·거짓음성 가드·오염)
**[🦋 측정착시 도감 →](catalog/README_KO.md)** — 측정이 만든 이를 속인 실제 봉인 사례 79표본(게이밍·자가적발·거짓음성 가드·오염)

> **🪞🔎🪪 New — 미러스택** ([`stack/`](stack/)): measure-mirror는 자율연구 에이전트용 3거울
> 무결성 스택(주장·행동·출처)의 *주장* 층입니다. 규약 5개 + `verify-all` 한 명령으로 묶이며,
Expand Down
6 changes: 3 additions & 3 deletions catalog/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
창작 사례는 넣지 않는다. 안티바이러스 시그니처처럼 쓴다: 새 결과가 어떤
항목의 증상과 일치하면, 먼저 그 착시를 배제하고 나서 결과를 믿는다.

## 분류 (v2.7: 74항목)
## 분류 (v2.8: 79항목)

| 디렉토리 | 뜻 | 항목 수 |
|---|---|---|
| [gaming/](gaming/) | 게이밍/신기루 수법 — 지표가 실력 없이 오르는 길 | 19 |
| [self-catch/](self-catch/) | 자가적발 — "너무 좋다"를 스스로 의심해 잡은 거짓양성 | 30 |
| [fn-guard/](fn-guard/) | 거짓음성 가드 — 음성을 믿기 전 확인해야 했던 것 | 20 |
| [self-catch/](self-catch/) | 자가적발 — "너무 좋다"를 스스로 의심해 잡은 거짓양성 | 33 |
| [fn-guard/](fn-guard/) | 거짓음성 가드 — 음성을 믿기 전 확인해야 했던 것 | 22 |
| [contamination/](contamination/) | 데이터/인코딩 오염 — 측정 이전에 무너진 입력 | 5 |

## 🔴 축이 둘이다 — 디렉토리 하나로는 안 갈린다 (2026-08-18 실측)
Expand Down
6 changes: 3 additions & 3 deletions catalog/README_KO.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
창작 사례는 넣지 않는다. 안티바이러스 시그니처처럼 쓴다: 새 결과가 어떤
항목의 증상과 일치하면, 먼저 그 착시를 배제하고 나서 결과를 믿는다.

## 분류 (v2.7: 74항목)
## 분류 (v2.8: 79항목)

| 디렉토리 | 뜻 | 항목 수 |
|---|---|---|
| [gaming/](gaming/) | 게이밍/신기루 수법 — 지표가 실력 없이 오르는 길 | 19 |
| [self-catch/](self-catch/) | 자가적발 — "너무 좋다"를 스스로 의심해 잡은 거짓양성 | 30 |
| [fn-guard/](fn-guard/) | 거짓음성 가드 — 음성을 믿기 전 확인해야 했던 것 | 20 |
| [self-catch/](self-catch/) | 자가적발 — "너무 좋다"를 스스로 의심해 잡은 거짓양성 | 33 |
| [fn-guard/](fn-guard/) | 거짓음성 가드 — 음성을 믿기 전 확인해야 했던 것 | 22 |
| [contamination/](contamination/) | 데이터/인코딩 오염 — 측정 이전에 무너진 입력 | 5 |

## 항목 스키마 (1항목 = 1파일)
Expand Down
18 changes: 18 additions & 0 deletions catalog/fn-guard/decomposition-shrinks-estimand-not-the-bar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# decomposition-shrinks-estimand-not-the-bar — 분해 설계가 추정량을 줄이는데 문턱은 분해 전 크기 그대로

> A design that decomposes an effect (orthogonalization, mediation, per-component splits) shrinks each component's point estimate, but the prereg bar was set on the undecomposed effect — so no component can clear it and the non-verdict is structural, not empirical.

- **증상(시그니처)**: 정밀도는 훌륭한데(CI 반폭이 밴드의 1/3~1/5) **점추정만** 문턱 아래로 걸친다. 성분들이 **각각은 미달**인데 **합치면 문턱을 넘는다**. 시드 부호 일치(30/30)로 존재는 확실한데 판정 셀은 비어 있다. 사전선언 4셀 중 어디에도 안 들어가는 "걸침"이 **성분 전부에서 동시에** 난다 — 하나만 걸치면 우연, 전부 걸치면 설계다.
- **기전**: 검정력 점검이 **분산 축만** 본다. 봉인 전 `power_check`·CI 반폭 예측은 "얼마나 정밀하게 잴 것인가"를 묻지 "**설계가 재려는 양 자체를 얼마나 줄이는가**"를 묻지 않는다. 직교화·매개분석·성분분해는 상관된 좌표에서 각 성분을 원 효과의 절반 미만으로 만드는 것이 **정상**인데(그게 분해의 정의다), 문턱이 원 효과 기준 0.5×로 남아 있으면 **성분이 원 효과의 50% 이상이어야 통과**라는 자기모순이 된다. 즉 참·거짓과 무관하게 판정이 예약된 채로 발사된다.
- ★한 겹 더: 문턱을 다시 유도해도 안 되는 경우가 있다. **질문이 상대 크기**("두 성분 중 어느 쪽이 진짜냐")인데 **문턱이 절대 크기**("각 성분이 충분히 크냐")로 걸려 있으면, 두 값이 모두 작을 때 구조적으로 답이 없다. 이때의 수리는 바 재유도가 아니라 **통계 형태 교체**(차이 대비)다.
- **실사례**: [자생] E52 좌표 직교화(2026-08-17 · 봉인 `c82c8a28`(S) / `b2f8271d`(V) · 둘 다 ⚪INCONCLUSIVE). 상관된 두 좌표(ρ −0.6330)를 서로 고정해 고유분을 갈라냈다. 분해 **전** SPREAD 대비는 +0.4192(30/30)로 바 0.2390 을 여유 있게 넘었으나, 분해 **후** 고유분은 ORTH_SPREAD **+0.1820** [+0.1440,+0.2216]·ORTH_VH **+0.0939** [+0.0508,+0.1369] — **둘 다 CI 로 0 을 배제**하는데 **둘 다 dec 0.2390 미달**, 합(0.2759)은 바를 넘었다. 봉인 전 검정력에서 CI 반폭(0.0426·0.0343 « 밴드 0.1195)만 확인하고 **점추정이 분해로 줄어들 것**을 계산에 안 넣은 것이 원인이다.
- 후속 자가적발(연산 0 · am `f2e8b6a5`): 수리안으로 올린 두 선택지가 **둘 다 판정 불가**였다 — (a) 바 재유도 = 고유분이 원 대비 43%인데 어떤 원 대비를 써도 0.5× 바는 50%를 요구, (b) 표본 2배 = 반폭만 줄고 **점추정은 안 움직여** 미달 그대로. 발사 **전** 계산으로 잡아 GPU 0원에 멈췄다.
- 수리(E53 · 봉인 `489cdecb`/`31175875` · 2026-08-17 발사): 주지표를 **차이 대비**(성분A − 성분B)로 교체. 같은 런의 두 대비라 **공분산이 상쇄**돼 SD 가 각 성분보다 오히려 작았고(0.0833 vs 0.1110/0.1229 · 단순합 가정 0.1656의 절반), 반폭 0.0298 = 밴드의 1/3.2 로 **동등성 셀·decisive 셀 둘 다 도달 가능**함을 봉인 전에 실측했다.
- 수리 결과 1차(2026-08-18 · E53 n=30): **판정이 났다** — DIFF +0.0657 CI95 [+0.0384,+0.0922] 로 동등성 셀. 같은 무대·같은 데이터 구조에서 **통계 형태만 바꿔** 무판정이 판정으로 바뀌었다. 사전 실측 SD 예측(반폭 0.0298)도 실측 0.0269 로 적중.
- 🔴**그 판정은 이후 철회됐다**(2026-08-19 · 철회 `6e821046`): 통과 여유가 0.0044(밴드의 4.6%)로 **밴드 자체의 표집오차보다 작아** 경계 스침으로 자가 신고했고(am `abc9a747`), 정밀도를 2배로 올린 재현런 E54(n=60 · 봉인 `fd443649`/`2d022f96` · 결과 am `c86f4114`)에서 DIFF **+0.0837 CI95 [+0.0657,+0.1020]** 으로 **CI 가 밴드를 벗어났다**. 두 런은 서로 모순되지 않는다(CI 가 크게 겹친다) — **참값이 밴드 언저리에 있었을 뿐**이고, n=30 의 넓은 CI 가 밴드 안에 우연히 들어간 것이었다.
- ⇒ **이 항목이 인증하는 범위는 여기까지다**: 통계 형태 교체는 **무판정을 판정 가능하게** 만들었다(그건 유효했다 — 두 아크 모두 사전선언 셀 안으로 들어갔다). 그러나 **어느 셀이 나오는지는 보장하지 않으며, 나온 판정이 재현된다는 보장은 더더욱 아니다.** 수리를 성공으로 읽을 때 이 구분을 하지 않으면 같은 착시의 반대편에 선다.
- ⚠️같은 결과의 다른 면: DIFF 의 CI 는 **0 도 배제**한다 — 차이의 *방향*은 실재하고 *크기*만 자의 문턱에 못 미친다. 두 아크 뒤에도 **"대등"도 "지배"도 성립하지 않는 미결**이 남았다. 차이 대비로 바꾼다고 등가성이 저절로 증명되지는 않는다.

- **탐지법**: 봉인 전 검정력 점검에 **두 축**을 넣는다. ① 분산 축: 반폭 vs 밴드(기존). ② **추정량 축**: "이 설계는 원 효과의 몇 배를 남기나"를 **선행 봉인 런의 per-seed 원자료로 미리 계산**하고, 그 축소분만큼 바를 같은 자로 낮춘다(또는 표본을 그만큼 늘린다). 성분 문턱 = 원 효과 바 × 예상 잔존비율. 상관 좌표의 분해라면 잔존비율이 0.5 미만인 것이 기본값이므로, **바를 안 내렸다면 그 자체가 적신호**다. ★그리고 봉인 전에 한 번 더: **내 질문이 상대 비교인가 절대 크기인가** — 상대 비교면 차이 대비로 세우고, 그때는 "차이 0"이 공허해지지 않도록 **두 성분이 각각 0 을 배제하는 실재 게이트**를 함께 건다.
- **오적용 주의**: 성분이 바를 못 넘는 것이 **진짜 결론**일 수 있다 — 원 효과가 제3의 공통원인에서 오고 두 좌표 모두 고유분이 실제로 작은 경우다. 이 라벨은 "합이 바를 넘는데 각각은 미달" 또는 "성분 전부가 동시에 걸침" 같은 **구조적 지문**이 있을 때만 붙인다. 또 바를 낮추는 것이 항상 옳지도 않다: 낮춘 바가 그 n 의 MDE 아래로 내려가면 검출 못 하는 크기를 문턱으로 거는 반대편 착시가 된다(문턱 ≥ MDE 규율). 그리고 **결과를 보고 난 뒤** 바를 낮추면 그건 수리가 아니라 사후조정이다 — 자는 이번 결과와 독립인 **선행 봉인값**에서 가져와야 한다.
- **구별**: [`gaming/band_below_noisefloor.md`](../gaming/band_below_noisefloor.md)는 **계기의 대역이 잡음보다 좁아** 모든 주장이 오차막대 안에 사는 병이다. 이 항목은 정반대로 **계기는 멀쩡하다**(분해 전 효과는 바를 여유 있게 넘고 CI 는 밴드의 1/3) — 줄어든 것은 잡음 대비 대역이 아니라 **설계가 재기로 한 양**이다. 대역/잡음 비만 보면 통과하므로 별도 체크가 필요하다.
9 changes: 9 additions & 0 deletions catalog/fn-guard/mute-instrument-silence-unreadable.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# mute-instrument-silence-unreadable — 입이 없는 계기: 침묵을 양방향 아무 뜻으로나 읽는다

> A monitor that writes its output only to a remote sink leaves no local trace, so "no records" is compatible with *working perfectly* and with *dead since launch* — and observers read it as whichever their prior suggests. The instrument didn't fall silent; it never had a mouth.

- **증상(시그니처)**: 감시기·프로브·보고기가 **살아는 있는데**(프로세스 alive) 로컬에 기록이 **0**이다. 그걸 보고 누군가는 "죽었다"로, 누군가는 "조용하니 정상"으로 읽는다. **둘 다 근거가 없다** — 같은 관측이 두 세계와 모두 정합한다. 결정적 지문: 그 계기의 출력 경로를 뜯어보면 전부 외부로만 나간다(`curl … > /dev/null`·웹훅·원격 대시보드). 동반 증상: "그 계기가 N시간마다 보고한다"는 **배달 확인 없는 주장**이 상류 보고에 이미 실려 있다.
- **기전**: 계기를 만들 때 **관측자와 수신자를 같다고 가정**한다. 사람이 채널을 보고 있으면 원격 발신만으로 충분하다 — 그러나 시스템 안에서 그 계기를 검산하려는 쪽(다른 세션·감사·자기 자신)에게는 **관측 가능한 표면이 0**이다. 그러면 사후 검산의 질문("그때 실제로 일했나")이 **원리적으로 답 불가**가 된다. 지금 경로를 테스트해 초록이 떠도 그것은 *현재*의 증거지 *과거*의 증거가 아니다. 그리고 침묵은 값이 아니라 **값의 부재**라서, 읽는 사람의 사전 믿음이 그 자리를 채운다.
- **실사례**([자생] E54 봉인런 감시기 · 2026-08-19 01시 · [관제] 발견 → [자생] 자기적발): 23시간짜리 무인런에 4시간 심박 감시기를 붙였는데, `post()` 가 `curl -s … > /dev/null` 로만 나가고 **stdout 에 쓰는 문장이 하나도 없었다.** [관제]가 `e54_watchdog.log` **0바이트 · 18h45m 무기록**을 보고 *"감시기가 죽었다"* 로 단정해 알렸다. 실측하니 ⑴ 훅 정상(길이 121·키 1건) ⑵ 같은 방식 발신 테스트 **HTTP 204** ⑶ 심박 산술이 240·480·720·960분에 정확히 발사 ⑷ 프로세스 `Ss` — **정상 동작해도 0바이트인 설계**였다. ★그러나 **과거 4회가 실제로 도착했는지는 원리적으로 확인 불가**로 남았다(경로의 현재 생존은 과거 배달의 증거가 아니다). ⚠️같은 병의 상류판: 이 레인이 하루 전 사용자에게 *"감시기가 4시간마다 쏜다"* 를 **배달 확인 없이** 발화했다 — 계기에 입이 없으니 그 주장도 검산 불가였다. [관제] 정리: *"계기가 침묵한 게 아니라 계기에 입이 없었다."*
- **탐지법**: ⑴ **발신하는 계기는 로컬에도 타임스탬프를 남긴다**(원격 전송과 같은 줄에서). 안 남기면 그 계기는 **검산 불가**로 분류하고, 그 계기에 기댄 보고에 그 딱지를 같이 붙인다. ⑵ 침묵을 읽기 전에 **"이 계기가 정상일 때 무엇이 보여야 하나"를 먼저 적어라** — 적을 게 없으면 그건 계기가 아니다. ⑶ 무인런에는 **관측 표면이 서로 다른 두 계기**를 건다(원격 심박 + 런 자신의 로그). 이번 건에서 실제 진행 판정은 **런 로그**가 했고 감시기는 아무 역할도 못 했다. ⑷ 사후 검산이 필요하면 **발신 성공을 로컬에 기록**해라(HTTP 코드까지). 지금 테스트해서 나온 초록을 과거에 소급 적용하지 마라.
- **오적용 주의**: 로컬 기록이 없다고 그 계기가 **틀렸다**는 뜻은 아니다 — 이번 실사례에서 경로·산술·프로세스는 전부 정상이었다. 이 항목이 말하는 것은 *동작 여부*가 아니라 **검산 가능성**이다. 반대로 로컬 기록이 있다고 배달이 됐다는 뜻도 아니다(기록은 발신 시도지 도착이 아니다 — 도착까지 주장하려면 수신측 확인이 따로 필요하다). 그리고 원격 전용 계기가 항상 결함인 것도 아니다: 사람이 그 채널을 상시 보는 것이 **설계 전제로 명시**돼 있고 그 사람이 실제로 보고 있으면 유효하다. 문제는 그 전제를 안 적고 시스템 내부 검산자가 있다고 가정할 때다.
Loading
Loading