feat(stack): 검증 범위를 기본 포함으로 뒤집는다 (대장님 94a) - #60
Merged
Conversation
`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>
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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
stack.json은 원장 4개를 이름으로 적고 있었고, 같은 디렉토리의 78개가 그 옆에서 검증 밖이었다.★ 원인은 판단이 아니었다 —
am_ledger·pm_ledger가 문자열 한 칸이라 들어갈 자리가 없었다. 아무도 "빼자" 고 고르지 않았으니 뒤집을 사람도 없었고, 그래서 그 범위가 12일(08-06~) 동안 안 움직였다.무엇이 바뀌나
ledger_dir아래*.jsonl은 전부 범위다. 빼려면 적어야 한다.recheck_probeam_ledger·pm_ledgerscope: N ledger(s) · D declared · A auto-included · E excluded실측 (우리 원장)
자동편입 76개 전부 linkage 정상 — 숨어 있던 파손은 없었다.
proxy_prescreen43줄 ·proxy_axes11줄)은 seal·prev_seal 키가 한 줄도 없는 비체인 로그다. 전달받은 목록은 "체인 없는 원장 1개" 였는데 전수 census 로 세니 2개였다(그 앞 전달은 4개). 한 줄짜리 정상 체인 원장 11개는 제외가 아니라 편입 대상이다 — 그 셋을 면제하면 정상 원장이 영구 면제된다.기각조건을 실제로 발동시켰다
초록만 보고 내는 게 이 레포가 잡으려는 병이라, 가드가 울리는 것을 먼저 봤다(시험으로 못 박음):
seal이 생기면exclusion is stale: a line now has 'seal'· exit 1decided_by빠진 제외the exclusion is incomplete — missing ['decided_by']· exit 1범위 밖
이건 수리 둘 중 첫째다. MCP
stack_verify_all은stack.json을 아예 안 읽어서 여기를 고쳐도 그 경로엔 아무 일도 안 일어난다 — 그건 mirror-stack-mcp#36 으로 따로 냈다.test_vacuous_pass3건은 로컬 통과(9 passed).