From 14137382fe4716fe9beb45a329d2d6c1bf10a26c Mon Sep 17 00:00:00 2001 From: DongHyeonka Date: Fri, 11 Sep 2026 09:25:03 +0900 Subject: [PATCH] =?UTF-8?q?fix(tests):=20=EC=83=88=20=EC=8B=9C=ED=97=98?= =?UTF-8?q?=EC=9D=98=20=ED=94=BD=EC=8A=A4=EC=B2=98=EB=A5=BC=20TechLog=20?= =?UTF-8?q?=EB=A1=9C=20=EC=98=AE=EA=B2=A8=20PIPELINE=20CONTRACT=20?= =?UTF-8?q?=EB=A5=BC=20=EB=90=98=EB=8F=8C=EB=A6=B0=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 첫 제출에서 verify-pipeline 의 FORBIDDEN_LITERAL 이 새 시험을 걸었다. 픽스처가 옛 저장소 이름과 같은 이름의 docs 프로젝트를 가리키고 있었다. 글자를 쪼개 피하지 않았다. verify-pipeline.py:172 자신이 쓰는 수법이지만 그건 검사기가 물으려던 것에 답하는 게 아니라 글자만 피하는 것이다. 재는 것이 「비교를 돌렸나」이지 그 기록의 내용이 아니므로 프로젝트를 TechLog 로 옮겼다. 양성 대조를 함께 넣었다 — available: true 만 재면 픽스처가 조용히 같아졌을 때 시험이 초록인 채로 아무것도 안 재게 된다. warnings 가 비지 않았는지와 그중에 「유보 감소」가 있는지를 잰다. 검사기가 「옛 저장소 이름에 의존한다」와 「그 이름의 docs 프로젝트를 가리킨다」를 못 가르는 것은 고치지 않고 보고서 §7.6 에 발견으로 적었다. 검사기 수정은 C 몫이다. PIPELINE CONTRACT: PASS python3 -m unittest discover -s scripts/tests — Ran 266 · OK (skipped=13) Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Q4vKjQo9KKBBokzxqXLCfk --- scripts/tests/test_review_scope.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/scripts/tests/test_review_scope.py b/scripts/tests/test_review_scope.py index c7f0994..4c6e2a2 100644 --- a/scripts/tests/test_review_scope.py +++ b/scripts/tests/test_review_scope.py @@ -19,13 +19,22 @@ import tempfile import unittest ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# 어느 프로젝트를 쓰든 상관없다 — 재는 것은 「비교를 돌렸나」이지 그 기록의 내용이 아니다. +# `verify-pipeline.py:172` 의 `FORBIDDEN_LITERAL` 이 `scripts/` 아래 텍스트에서 옛 저장소 +# 이름을 찾는데, **그 이름의 `docs/` 프로젝트를 가리키는 것과 가리지 못한다.** 글자를 +# 쪼개 피하지 않고 다른 프로젝트를 쓴다 — 피하는 것은 검사기가 물으려던 것에 답하는 게 아니다. +PROJECT = "TechLog" RECORD = os.path.join( - "docs", "document-haness", "tech-log-studio", "pipeline-gate-exit-codes", - "case", "case-exit-code-read-behind-a-pipe.md") + "docs", PROJECT, "tech-log-studio", "addresses-frozen-at-publish-time", + "case", "case-a-link-that-pointed-at-itself.md") +# 윤문 전 사본에만 넣을 유보 표현. `HEDGES` 의 「보인다」다 — +# 이것이 사라지는 것이 `hedgesDropped` 이고, 그 자리가 이 묶음의 **막는** 경고다 +ASSERTED = "눌러도 아무 일이 없었다." +HEDGED = "눌러도 아무 일이 없었던 것으로 보인다." def _package(out: str, before: str | None) -> subprocess.CompletedProcess: - cmd = [sys.executable, "scripts/review-package.py", "document-haness", + cmd = [sys.executable, "scripts/review-package.py", PROJECT, "--record", RECORD, "-o", out] if before: cmd += ["--before", before] @@ -41,9 +50,8 @@ class PreservationScopeTest(unittest.TestCase): # 윤문 전 사본. 한 문장만 다르게 둔다 — 비교가 실제로 돌아야 한다 self.before = os.path.join(self.tmp, "before.md") src = open(os.path.join(ROOT, RECORD), encoding="utf-8").read() - open(self.before, "w", encoding="utf-8").write( - src.replace("열넷이 전부 `exit=0` 이었다.", - "열넷이 전부 `exit=0` 이었을 수도 있다.")) + self.assertIn(ASSERTED, src, "고정문이 기록에서 사라졌다 — 픽스처를 다시 짠다") + open(self.before, "w", encoding="utf-8").write(src.replace(ASSERTED, HEDGED)) def test_without_before_the_package_says_it_did_not_look(self): out = os.path.join(self.tmp, "nb.json") @@ -62,11 +70,17 @@ class PreservationScopeTest(unittest.TestCase): out = os.path.join(self.tmp, "wb.json") r = _package(out, self.before) self.assertEqual(0, r.returncode, r.stderr) - pres = json.load(open(out, encoding="utf-8"))["preservation"] + pkg = json.load(open(out, encoding="utf-8")) + pres = pkg["preservation"] self.assertTrue(pres["available"]) self.assertNotIn("reason", pres) # 안 돈 이유가 있을 리 없다 self.assertTrue(pres["before"]) self.assertEqual(64, len(pres["beforeSha256"])) + # **`available: true` 만으로는 비교가 무언가를 봤다는 뜻이 아니다.** 픽스처가 + # 조용히 같아지면 이 시험은 초록인 채로 아무것도 안 재게 된다 — 양성 대조다 + self.assertTrue(pkg["warnings"], "유보가 사라진 것을 못 잡았다 — 픽스처를 다시 짠다") + self.assertTrue(any(w["id"] == "유보 감소" for w in pkg["warnings"]), + [w["id"] for w in pkg["warnings"]]) def test_the_two_packages_print_different_lines(self): """**같은 문구가 나오면 고친 것이 아니다.**"""