feat(scripts): 경고를 읽는 장치가 아니라 만드는 장치를 더한다

남은 셋은 묶음 경고가 0건이라 게이트를 아무리 조여도 지나간다. 뿌리가 하나다 — 지금
검사기는 사라진 것과 새로 생긴 보호 구간을 보고, 범위가 넓어진 것과 정본을 안 거친 것을
보는 자리가 없었다.

그림이 정본을 거쳤는지 본다. SVG 는 바뀌었는데 spec.json 은 그대로면 그 그림은 정본에서
나온 것이 아니고, 화살표 뒤집기가 그 모양이다. spec 의 간선과 SVG 의 경로를 직접 견주려면
렌더러가 id 를 어떻게 붙이는지 알아야 하는데, 정본을 거쳤는지만 보면 몰라도 된다.
작업 트리와 이력 두 자리를 본다. 정본이 없는 그림은 볼 것이 아니라 세기만 한다.

적용 범위를 넓히는 말이 새로 들어왔는지 본다. 로컬에서 확인했다에 운영 환경에서도를
더하기만 하면 유보도 보호 구간도 안 바뀐다 — 지운 것이 없기 때문이다. 유보 감소의
반대편이고, 판정하지 않고 경고로 올린다.

경고 생산자를 더하는 것이 과잉 차단이 생기는 자리라 후보마다 채택 편집 100쌍을 돌렸다.
error 도 경고도 안 늘었다. 정상 편집에 경고가 붙으면 그것도 사실상 차단이다.

목록에 운영·항상 같은 흔한 말이 들어가서, 원래 있던 말을 두고 주변만 고쳐도 걸리는지
보는 대조군을 회귀에 넣었다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4vKjQo9KKBBokzxqXLCfk
This commit is contained in:
DongHyeonka
2026-09-10 16:33:47 +09:00
co-authored by Claude Opus 5
parent 16cbe141a0
commit e3230ce5ed
4 changed files with 255 additions and 0 deletions
+43
View File
@@ -204,3 +204,46 @@ class UnsourcedVoiceTest(unittest.TestCase):
"""대조군."""
self.assertEqual([], [w for w in cp.compare(self.BEFORE, self.BEFORE)["warnings"]
if w["kind"] == "1인칭"])
class WidenedScopeTest(unittest.TestCase):
"""범위를 넓히는 말이 새로 들어왔나.
지금까지 검사기는 「사라진 것」과 「새로 생긴 보호 구간」을 봤다. **「범위가 넓어진 것」을
보는 자리가 없었다** — 더하기만 하면 유보도 보호 구간도 안 바뀐다.
"""
BEFORE = "PK 조회라 두 쿼리 모두 Index Scan으로 1건을 약 0.02 ms에 가져온다."
def test_adding_a_scope_word_is_surfaced_as_a_warning(self):
after = self.BEFORE.replace("조회라 ", "조회라 운영 환경에서도 ")
res = cp.compare(self.BEFORE, after)
self.assertEqual([], res["errors"], "판정이 아니라 라우팅이다")
self.assertIn("적용 범위", {w["kind"] for w in res["warnings"]})
def test_the_warning_points_at_the_sentence(self):
after = "항상 그렇다.\n\n" + self.BEFORE
w = next(x for x in cp.compare(self.BEFORE, after)["warnings"]
if x["kind"] == "적용 범위")
self.assertIn("항상", w["sentence"])
def test_narrowing_the_scope_is_not_reported(self):
"""좁히는 것은 이 규범에서 안전한 쪽이다."""
wide = "항상 그렇다. " + self.BEFORE
self.assertEqual([], [w for w in cp.compare(wide, self.BEFORE)["warnings"]
if w["kind"] == "적용 범위"])
def test_a_scope_word_that_was_already_there_is_not_reported(self):
"""대조군. 원래 있던 말을 그대로 두고 주변만 고치면 조용해야 한다.
이게 없으면 「운영」이 든 문장을 다듬기만 해도 걸리는지 알 수 없다.
"""
before = "운영 환경에서 잰 값이다. " + self.BEFORE
after = "운영 환경에서 측정한 값이다. " + self.BEFORE
self.assertEqual([], [w for w in cp.compare(before, after)["warnings"]
if w["kind"] == "적용 범위"])
def test_an_ordinary_rewrite_raises_no_scope_warning(self):
after = self.BEFORE.replace("가져온다", "돌려준다")
self.assertEqual([], [w for w in cp.compare(self.BEFORE, after)["warnings"]
if w["kind"] == "적용 범위"])