Skip to content

feat(stack): 검증 범위를 기본 포함으로 뒤집는다 (대장님 94a) - #60

Merged
bhyi4 merged 2 commits into
mainfrom
feat/scope-default-include
Aug 18, 2026
Merged

feat(stack): 검증 범위를 기본 포함으로 뒤집는다 (대장님 94a)#60
bhyi4 merged 2 commits into
mainfrom
feat/scope-default-include

Conversation

@bhyi4

@bhyi4 bhyi4 commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator

stack.json 은 원장 4개를 이름으로 적고 있었고, 같은 디렉토리의 78개가 그 옆에서 검증 밖이었다.

★ 원인은 판단이 아니었다 — am_ledger·pm_ledger문자열 한 칸이라 들어갈 자리가 없었다. 아무도 "빼자" 고 고르지 않았으니 뒤집을 사람도 없었고, 그래서 그 범위가 12일(08-06~) 동안 안 움직였다.

무엇이 바뀌나

ledger_dir 아래 *.jsonl전부 범위다. 빼려면 적어야 한다.

"excluded": {
  "proxy_prescreen.jsonl": {
    "reason":        "해시체인 원장이 아님 — 43줄 전부 seal·prev_seal 키 없음",
    "decided_by":    "[거울]",  "decided_at": "2026-08-19",
    "evidence":      "",
    "recheck_if":    "seal 필드가 한 줄이라도 생기면 재검토",
    "recheck_probe": {"kind": "any_line_has_key", "key": "seal"}   // ← 기계가 본다
  }
}
네 칸 중 하나라도 빠지면 그 제외는 존중 안 하고 FAIL — 서명 없는 제외가 애초에 이 사달을 냈다
recheck_probe 되돌릴 조건을 기계가 본다. 제외가 제 사유보다 오래 살면 FAIL
am_ledger·pm_ledger 리스트도 받는다 (한 칸짜리 슬롯이 원인이었으므로)
판정줄 분모를 같이 낸다scope: N ledger(s) · D declared · A auto-included · E excluded

실측 (우리 원장)

before: === verdict: ALL OK (17/17) ===     ← 선언 4개만
after : --- scope: 82 ledger(s) · 4 declared · 76 auto-included · 2 excluded ---
        === verdict: ALL OK (93/93) ===

자동편입 76개 전부 linkage 정상 — 숨어 있던 파손은 없었다.

⚠️ 제외 2건(proxy_prescreen 43줄 · proxy_axes 11줄)은 seal·prev_seal 키가 한 줄도 없는 비체인 로그다. 전달받은 목록은 "체인 없는 원장 1개" 였는데 전수 census 로 세니 2개였다(그 앞 전달은 4개). 한 줄짜리 정상 체인 원장 11개는 제외가 아니라 편입 대상이다 — 그 셋을 면제하면 정상 원장이 영구 면제된다.

기각조건을 실제로 발동시켰다

초록만 보고 내는 게 이 레포가 잡으려는 병이라, 가드가 울리는 것을 먼저 봤다(시험으로 못 박음):

조작 결과
제외한 원장에 seal 이 생기면 exclusion is stale: a line now has 'seal' · exit 1
decided_by 빠진 제외 the exclusion is incomplete — missing ['decided_by'] · exit 1
아무도 안 적은 원장 ✅ 자동 편입돼 linkage 검사를 받는다

범위 밖

이건 수리 둘 중 첫째다. MCP stack_verify_allstack.json 을 아예 안 읽어서 여기를 고쳐도 그 경로엔 아무 일도 안 일어난다 — 그건 mirror-stack-mcp#36 으로 따로 냈다.

⚠️ 로컬에서 전체 스위트가 끝까지 안 돌아 CI 판정을 기다린다. 신규 시험 6건 + test_vacuous_pass 3건은 로컬 통과(9 passed).

bhyi4 and others added 2 commits August 19, 2026 06:41
`stack.json` 은 원장 **4개**를 이름으로 적고 있었고, 같은 디렉토리의 **78개**가 그 옆에서
검증 밖이었다. 원인은 판단이 아니었다 — `am_ledger`·`pm_ledger` 가 **문자열 한 칸**이라
**들어갈 자리가 없었다.** 아무도 "빼자"고 고르지 않았으니 **뒤집을 사람도 없었고**,
그래서 그 범위가 12일(08-06~) 동안 안 움직였다.

⇒ `ledger_dir` 아래 `*.jsonl` 은 **전부 범위**다. 빼려면 `excluded` 에 **적어야** 한다.

    "excluded": { "proxy_prescreen.jsonl": {
        "reason": …, "decided_by": …, "decided_at": …,
        "recheck_if": "seal 필드가 한 줄이라도 생기면 재검토",
        "recheck_probe": {"kind": "any_line_has_key", "key": "seal"} } }

· 네 칸(`reason`·`decided_by`·`decided_at`·`recheck_if`) 중 하나라도 빠지면 그 제외는
  **존중하지 않고 FAIL** 이다 — **서명 없는 제외가 애초에 이 사달을 냈다.**
· `recheck_probe` 는 되돌릴 조건을 **기계가** 본다. 제외가 제 사유보다 오래 살면 FAIL.
  사유만 적으면 *"왜 뺐는지 아는 배제"* 고, 이게 있어야 *"언제 다시 볼지 아는 배제"* 가 된다.
· `am_ledger`·`pm_ledger` 가 **리스트도** 받는다.

**판정줄이 분모를 같이 낸다** — `scope: N ledger(s) · D declared · A auto-included · E excluded`.
범위를 안 적은 ALL OK 가 82개 중 78개를 12일간 안 보이게 만든 그 자리다.

실측(우리 원장): **ALL OK 17/17(선언 4개) → ALL OK 93/93(82개 중 76 자동편입·2 제외)**.
자동편입 76개 **전부 linkage 정상** — 숨어 있던 파손은 없었다.

제외 2건은 `proxy_prescreen.jsonl`(43줄)·`proxy_axes.jsonl`(11줄), 둘 다 seal·prev_seal 키가
한 줄도 없는 비체인 로그다. ⚠️ 전달받은 목록은 "체인 없는 원장 1개"였는데 **전수 census 로 세니 2개**였다
(그 앞 전달은 4개였다) — 한 줄짜리 정상 체인 원장 11개는 **제외가 아니라 편입** 대상이다.

기각조건 3종을 실제로 발동시켜 확인했다(시험으로 못 박음):
  ① 제외한 원장에 seal 이 생기면 → `exclusion is stale` FAIL
  ② `decided_by` 빠진 제외 → `the exclusion is incomplete` FAIL
  ③ 아무도 안 적은 원장 → 자동 편입돼 linkage 검사를 받는다

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CI 가 잡았다. 모듈 docstring 은 이렇게 약속한다:
  "L2 requires the action-mirror CLI (`am`)… Without it, L2 is skipped and
   reported as such — the stack degrades to the self-verification that
   measure-mirror provides on its own."

**그 약속이 안 지켜졌다.** `subprocess.run(["am", …])` 가 `FileNotFoundError` 를 던지고
오케스트레이터 전체를 트레이스백과 함께 끌고 내려갔다. 문서화된 강등은 **`am` 이 우연히
깔려 있는 기계에서만** 성립했다.

지금까지 안 걸린 이유: CI 설정엔 `am_ledger` 가 없어서 그 경로를 **아무도 안 밟았다.**
이번 PR 의 리스트형 `am_ledger` 시험이 처음으로 밟았다.

수리: `am` 호출을 한 군데(`_am`)로 모으고 부재를 잡는다. 건너뛴 계층은 **찍되(보이게)
OK 로 세지 않는다** — 기존 L2 생략 처리와 같은 규약이다.

  ⚠️ [L1 chain] am: `am verify` skipped — the `am` CLI is not installed
     (the format-agnostic linkage check above still ran)

시험 하나 더 못 박았다: PATH 에서 `am` 을 치우고 돌려 **트레이스백이 없고 판정줄에
도달하는지** 본다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@bhyi4

bhyi4 commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator Author

대장님 승인 머지 — B(중대 변경·feat). #57 폭로 78/82 미검증 구조 근본 수리: 검증 범위 기본 포함(제외는 reason/decided_by/decided_at/recheck_if 서명 강제·미서명 거부·stale FAIL)·am/pm 리스트·am CLI 부재 degrade·verdict scope 분모. 버전 0.38.1→0.39.0·신규테스트 7·CI 4/4·이상 0.

@bhyi4
bhyi4 merged commit 086910d into main Aug 18, 2026
4 checks passed
@bhyi4
bhyi4 deleted the feat/scope-default-include branch August 18, 2026 22:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant