fix: 고친 자리에 같은 버그를 다시 넣었고, 게이트가 관측 창을 덮었다
한글 수사의 뒤 경계가 세는 말 다음의 조사를 낱말의 일부로 봤다. 「다섯 개다」·「다섯 건을」· 「여섯 장이」가 전부 안 걸린다. 아라비아 숫자 쪽에서 같은 이유로 「500행」·「5개다」를 놓쳤던 것을 고쳤는데, 그 고침을 한글로 옮기면서 다시 넣었다. 회귀가 초록이었던 건 시험 문구가 전부 조사 없이 끝나서다. 뒤 경계를 풀었더니 채택된 편집 둘이 새로 막혔다. 「여덟 자리 → 여덟 곳」이다. 숫자가 안 바뀌었고 세는 말이 바뀌었다 — spatial-metaphor 를 고치는 정상 편집이다. 그래서 잡는 것을 수사로 좁히고 세는 말은 문맥으로만 본다. 대안도 긴 것부터로 정렬했다. 대조군을 주변이 바뀌는 쌍으로 다시 짰다. 같은 문자열은 어떤 검사기든 조용해서 대조가 되지 않는다. 그 대조군이 없었으면 위 오탐을 못 봤다. 그리고 저장 게이트가 그림 붙은 기록을 전부 막고 있었다. 저장소의 그림에 종류 표시가 하나도 없어서 그림이 붙으면 무조건 경고가 하나 붙는다. 게이트가 틀린 게 아니라 그 경고가 어느 기록에 대한 정보도 아니다 — 모든 기록에 걸리는 경고는 어느 기록에 대해서도 아무 말을 하지 않는다. 저장소 전체의 미비는 세고 보고하되 저장을 막지 않는다. 조용히 빼지도 않는다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4vKjQo9KKBBokzxqXLCfk
This commit is contained in:
co-authored by
Claude Opus 5
parent
20c8535169
commit
16cbe141a0
+40
-1
@@ -31,6 +31,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import glob
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
@@ -133,9 +134,11 @@ def inspect_assets(package: dict) -> tuple[list[dict], list[dict]]:
|
||||
if kind is None:
|
||||
warnings.append({
|
||||
"id": "그림 종류가 표시돼 있지 않다", "asset": rel,
|
||||
"scope": "repository",
|
||||
"detail": 'data-figure-kind="evidence" 또는 "illustrative" 가 없다',
|
||||
"note": "실제 흐름을 그린 것인지 개념 설명인지 못 가린다. "
|
||||
"설명용을 증거로 읽는 것을 막을 수 없다",
|
||||
"이 기록의 결함이 아니라 저장소 전체의 미비라 저장을 막지 않는다 — "
|
||||
"모든 기록에 걸리는 경고는 어느 기록에 대해서도 아무 말을 하지 않는다",
|
||||
})
|
||||
elif kind == "illustrative":
|
||||
warnings.append({
|
||||
@@ -248,6 +251,24 @@ def build_input(record_path: str) -> dict:
|
||||
VERDICTS = ("PASS", "FAIL", "UNKNOWN")
|
||||
|
||||
|
||||
def _figure_kind_coverage() -> tuple[int, int]:
|
||||
"""(저장소의 그림 수, 종류 표시가 없는 그림 수).
|
||||
|
||||
세는 쪽 경고를 **조용히 빼지 않기 위해** 낸다. 저장을 막지 않는다는 것과 안 보인다는 것은
|
||||
다르다 — 안 보이면 그것이 또 「본 것만 같다」다.
|
||||
"""
|
||||
total = unmarked = 0
|
||||
for path in glob.glob(os.path.join(ROOT, "docs/*/final/assets/**/*.svg"),
|
||||
recursive=True):
|
||||
total += 1
|
||||
try:
|
||||
if not FIGURE_KIND.search(open(path, encoding="utf-8", errors="replace").read()):
|
||||
unmarked += 1
|
||||
except OSError:
|
||||
unmarked += 1
|
||||
return total, unmarked
|
||||
|
||||
|
||||
def _review_gate(warnings: list[dict], verdict_path: str | None,
|
||||
package_path: str) -> list[dict]:
|
||||
"""경고가 있으면 **검토 판정을 받고 전부 PASS 일 때만** 저장이 나간다.
|
||||
@@ -259,7 +280,25 @@ def _review_gate(warnings: list[dict], verdict_path: str | None,
|
||||
없었다 — **싣는 것과 막는 것은 다른 일이다.**
|
||||
|
||||
경고가 없으면 판정 파일이 없어도 그대로 나간다. 정상은 이 게이트에 안 걸린다.
|
||||
|
||||
**막는 것과 세는 것을 가른다.** `scope: "repository"` 인 경고는 이 기록에 대한 발견이
|
||||
아니라 저장소 전체의 미비다 — 그림 종류 표시가 그렇다. 저장소의 그림 어느 것에도 그
|
||||
표시가 없어서 그림 붙은 기록이면 무조건 걸린다. **모든 기록에 걸리는 경고는 어느 기록에
|
||||
대해서도 아무 말을 하지 않는다.** 그것으로 막으면 게이트의 첫 실사용에서 그림 붙은
|
||||
기록이 전부 막히고, 그러면 사람이 게이트를 우회하기 시작한다.
|
||||
|
||||
세는 쪽도 **조용히 빼지 않는다.** 몇 건인지 함께 낸다.
|
||||
"""
|
||||
blocking = [w for w in warnings if w.get("scope") != "repository"]
|
||||
counted = [w for w in warnings if w.get("scope") == "repository"]
|
||||
if counted:
|
||||
print(f"세는 경고 {len(counted)}건 — 저장소 전체의 미비라 저장을 막지 않는다: "
|
||||
+ " · ".join(sorted({w["id"] for w in counted})), file=sys.stderr)
|
||||
if any(w["id"] == "그림 종류가 표시돼 있지 않다" for w in counted):
|
||||
total, unmarked = _figure_kind_coverage()
|
||||
print(f" 이 저장소에 아직 표시 안 된 그림 {unmarked}장이 있다 (그림 {total}장 중). "
|
||||
f"조용히 빼지 않고 센다", file=sys.stderr)
|
||||
warnings = blocking
|
||||
if not warnings:
|
||||
return []
|
||||
if not verdict_path:
|
||||
|
||||
Reference in New Issue
Block a user