Files
document-haness/scripts/tests/test_code_anchors.py
T
DongHyeonkaandClaude Opus 5 845ee89054 feat(scripts): 놓친 8건을 코드로 막거나 검토로 보낸다
먼저 쟀다. 경고를 일괄 차단으로 올리면 채택된 편집 9건이 막힌다 — V-004 에서 고친 바로
그 9건이다. 그래서 경고는 검토로 보내고 차단은 검토가 판정할 때 일어나게 뒀다.

코드로 막은 것 셋. code[] 리비전 — check_evidence 는 리비전이 있는지만 보고 인용한 코드가
그 리비전에서 왔는지는 안 본다. 이 배치에서 실제로 났고 사람이 손으로 잡았다. 한글 수사와
그 경계 — 「다섯 개 → 여섯 개」는 결정적이다.

앵커 검사기의 오탐을 0 으로 만드는 데 시간의 절반이 갔다. 처음 판이 저장소 전체에서
401건을 냈고 전부 오탐이었다. code[] 는 한 모양이 아니다 — 심볼, 축약 경로, 줄 범위,
호스트 절대 경로, 설정 키가 섞여 있다. 축약 경로를 「없다」로 세면 있는 코드를 없다고 하는
것이고 그게 채택된 편집 아홉 건을 막았던 실패와 같은 모양이다. 판정할 수 있는 것만
판정하고 못 보는 것은 세어서 낸다.

검토로 보낸 것 다섯. D2 는 아무 계수도 안 움직이던 자리였다 — 수치도 인용도 없이 산문만
더하면 보호 구간 비교에 잡힐 것이 없다. 1인칭 표지가 늘어난 것만 보고 그 문장을 짚어 준다.
판정이 아니라 라우팅이다.

만들다 버그를 찾았다. 경고가 인용하는 문장이 파일 첫 문단에서 한 글자씩 깎이고 있었다.
rfind 가 -1 을 낼 때 +2 를 해서 1 이 됐다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4vKjQo9KKBBokzxqXLCfk
2026-09-10 15:47:54 +09:00

57 lines
2.3 KiB
Python

"""인용한 코드가 그 리비전에 실재하는지 보는 검사기.
`check_evidence.mjs --repo` 는 리비전이 **있는지**만 본다. 인용한 코드가 **그 리비전에서
왔는지**는 안 본다. 이 배치에서 실제로 그 결함이 났고 사람이 손으로 잡았다.
"""
import importlib.util
import os
import subprocess
import unittest
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
TOOL = os.path.join(ROOT, "scripts", "check-code-anchors.py")
_spec = importlib.util.spec_from_file_location("check_code_anchors", TOOL)
ca = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(ca)
class UndecidableTest(unittest.TestCase):
"""판정할 수 있는 것만 판정한다. 못 보는 것은 세어서 낸다."""
def test_a_plain_repo_path_is_decidable(self):
self.assertIsNone(ca._undecidable("scripts/audit-records.py"))
def test_shapes_this_checker_cannot_decide(self):
cases = {
"FeedPersistenceIT.l2EagerToOneFires": "심볼",
"`.../CaSkeletonApplication.java`": "축약 또는 백틱",
"/etc/letsencrypt/renewal-hooks/": "저장소 밖 절대 경로",
"tech-log-serving-contract.json": "폴더 없이 이름만",
"renewal-hooks/deploy/": "폴더를 가리킨다",
}
for anchor, why in cases.items():
with self.subTest(why=why):
self.assertIsNotNone(ca._undecidable(anchor), f"{anchor} 를 판정하려 든다")
class SweepTest(unittest.TestCase):
def _cli(self, *args):
return subprocess.run(["python3", TOOL, *args], cwd=ROOT,
capture_output=True, text=True)
def test_every_project_in_this_repository_passes(self):
"""대조군. 지금 저장소의 앵커에 하나라도 걸리면 정책이 과하다.
축약 경로를 「없다」로 세면 있는 코드를 없다고 하는 것이고, 그것이 이 배치에서
채택된 편집 아홉 건을 막았던 실패와 같은 모양이다.
"""
p = self._cli("--samples", "1")
self.assertEqual(0, p.returncode, p.stdout + p.stderr)
def test_a_missing_project_is_not_reported_as_clean(self):
self.assertEqual(2, self._cli("nosuchxyz").returncode)
if __name__ == "__main__":
unittest.main()