fix: TechLog 리비전 셋을 매니페스트에 맞추고, 「경고 0건」을 두 가지로 가른다
부채 ④. TechLog 의 tech-log-design-package 가 ca1bbfe·1aae8dc·ffa088b 를 적고 있었는데
매니페스트는 그 뒤 다시 만들어져 세 파일 모두를 tech-log-frontend @ 0d4d1e5 로 적는다.
옛 셋은 tech-log-frontend 에 없다 — 옛 매니페스트가 안 남아 그 사이 계약 내용이 바뀌었는지는
대조할 수 없고, 그 사실을 verified 에 적었다. 기록의 「검증 환경」이 적은 리비전은 그때 잰
조건이라 고치지 않는다. 파일 sha256 셋을 함께 적어 리비전 문자열이 아니라 내용에 못박는다.
check_evidence --repo TechLog exit 0 「문제 없음」 (3 → 0)
review-package.py TechLog exit 0 · 관문 10 전부 exit 0
R14. 이 묶음의 막는 경고는 전부 편집 전후 보존 비교에서 나오고(review-package.py 의
_warn 자리 둘이 모두 if preservation.get("available") 안이다) 그 비교는 --before 를 줘야
돈다. 빼면 검토 관문이 아무 줄도 안 남기고 통과한다.
- --before 를 필수로 만들지 않는다. 새로 쓴 기록엔 윤문 전 사본이 없어 첫 기록이 막힌다.
없다는 것을 적고 출력한다
- preservation.reason 으로 두 원인을 가른다 — NO_BEFORE · CHECKER_UNREADABLE
- 묶음이 자기 입력을 적는다. 줬으면 before·beforeSha256, 안 줬으면 명시적 null.
빠진 칸과 null 은 다르다
- 종료 코드는 양쪽 다 0 이다. 새 관문이 아니라 읽는 계약이라 갈리는 것은 문구다.
_review_gate 의 stderr 와 계획 한 줄 요약 둘 다 가른다
- B-B004c-plans/verdict.json 을 지웠다. 옛 묶음 53ce6a5b… 에 묶여 있는데 지금 계획은
0beb5420… 이라 읽히지 않는다 — 검토를 받은 것처럼 보이는 파일이 남는다
python3 -m unittest discover -s scripts/tests — Ran 266 · OK (skipped=13)
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
d2855d1e6c
commit
0f753c3be5
+30
-3
@@ -503,8 +503,14 @@ def _figure_kind_coverage() -> tuple[int, int]:
|
||||
return total, unmarked
|
||||
|
||||
|
||||
def _zero_note(pkg: dict) -> str:
|
||||
"""경고 0 건이 「봤는데 없었다」인지 「볼 것이 아직 없었다」인지 한 줄로 가른다."""
|
||||
pres = pkg.get("preservation") or {}
|
||||
return "(봤고 없었다)" if pres.get("available") else "(사정권 밖 — 편집 전후 비교를 안 돌렸다)"
|
||||
|
||||
|
||||
def _review_gate(warnings: list[dict], verdict_path: str | None,
|
||||
package_path: str) -> list[dict]:
|
||||
package_path: str, preservation: dict | None = None) -> list[dict]:
|
||||
"""경고가 있으면 **검토 판정을 받고 전부 PASS 일 때만** 저장이 나간다.
|
||||
|
||||
검토로 라우팅한다는 것은 **저장이 막힌다**는 뜻이어야 한다. 막지 않으면 라우팅이 아니라
|
||||
@@ -522,6 +528,12 @@ def _review_gate(warnings: list[dict], verdict_path: str | None,
|
||||
기록이 전부 막히고, 그러면 사람이 게이트를 우회하기 시작한다.
|
||||
|
||||
세는 쪽도 **조용히 빼지 않는다.** 몇 건인지 함께 낸다.
|
||||
|
||||
**경고 0 건에는 두 가지가 있다.** 「봤는데 없었다」와 「볼 것이 아직 없었다」다. 이 묶음의
|
||||
막는 경고는 전부 편집 전후 보존 비교에서 나오고(`review-package.py` 의 `_warn` 자리 둘이
|
||||
모두 `if preservation.get("available")` 안이다), 그 비교는 `--before` 를 줘야 돈다.
|
||||
빼면 이 게이트가 **아무 줄도 안 남기고 통과한다.** 종료 코드는 양쪽 다 0 이다 — 새
|
||||
관문이 아니라 **읽는 계약**이라, 갈리는 것은 찍는 문구다.
|
||||
"""
|
||||
blocking = [w for w in warnings if w.get("scope") != "repository"]
|
||||
counted = [w for w in warnings if w.get("scope") == "repository"]
|
||||
@@ -534,6 +546,17 @@ def _review_gate(warnings: list[dict], verdict_path: str | None,
|
||||
f"조용히 빼지 않고 센다", file=sys.stderr)
|
||||
warnings = blocking
|
||||
if not warnings:
|
||||
pres = preservation or {}
|
||||
if pres.get("available"):
|
||||
print("검토 관문 — 경고 0건. 편집 전후 비교를 돌렸고 걸린 것이 없다",
|
||||
file=sys.stderr)
|
||||
else:
|
||||
why = {"NO_BEFORE": "--before 를 안 줘서 편집 전후 비교를 안 돌렸다",
|
||||
"CHECKER_UNREADABLE": "check-preservation.py 를 못 읽었다"}.get(
|
||||
pres.get("reason"), "묶음이 왜 비었는지 적지 않았다")
|
||||
print(f"검토 관문 — 경고 0건이지만 **본 것이 없다**: {why}.\n"
|
||||
" 이 묶음의 막는 경고는 전부 편집 전후 비교에서 나온다. "
|
||||
"초록이 아니라 사정권 밖이다", file=sys.stderr)
|
||||
return []
|
||||
if not verdict_path:
|
||||
raise Refused(
|
||||
@@ -848,7 +871,8 @@ def main() -> int:
|
||||
raise Refused("그림 허용 정책에 걸린다 — 저장 단계에서 막는다\n " +
|
||||
"\n ".join(f"{e['asset']}: {e['detail']}" for e in asset_errors))
|
||||
all_warnings = list(pkg.get("warnings") or []) + asset_warnings
|
||||
cleared = _review_gate(all_warnings, args.verdicts, args.package)
|
||||
cleared = _review_gate(all_warnings, args.verdicts, args.package,
|
||||
pkg.get("preservation"))
|
||||
doc = build_input(args.record)
|
||||
if args.harness_test:
|
||||
doc = as_harness_test(doc)
|
||||
@@ -889,7 +913,10 @@ def main() -> int:
|
||||
open(args.out, "w", encoding="utf-8").write(text)
|
||||
ops = " · ".join(f"{s['op']} {s['method']}" for s in steps)
|
||||
print(f"{args.out} — {ops} · 그림 {len(pkg.get('assets') or [])}장 "
|
||||
f"· 경고 {len(all_warnings)}건(검토 통과 {len(cleared)}) "
|
||||
# **한 줄 요약도 「0건」을 두 가지로 찍는다.** 여기만 그냥 0 이면
|
||||
# 사람이 보는 마지막 줄에서 사정권 밖이 초록으로 돌아온다
|
||||
f"· 경고 {len(all_warnings)}건"
|
||||
f"{'(검토 통과 %d)' % len(cleared) if all_warnings else _zero_note(pkg)} "
|
||||
f"· 무인 저장 {'켬' if UNATTENDED_SAVE_ENABLED else '끔'}")
|
||||
if cleared:
|
||||
print(f"검토가 통과시킨 경고 {len(cleared)}건 — 판정 파일 {args.verdicts}",
|
||||
|
||||
Reference in New Issue
Block a user