수정 2026-07-28
v1.36.83
자기참조 가드 부채 상환 (탐지 가능 범위 12 → 0) · 소스 문자열 검사를 행위 검사로
유예
핵심 변경
**12건을 현재 코드 기준으로 재작성 — 대부분 소스 문자열 검사를 행위 검사로 교체.** 실제 junction 을 만들어 migrate 복사가 심링크를 따라가지 않는지, 70KB .env.production 의 시크릿이 탐지되는지, plan add --done-when 이 저장·파싱되는지를 **직접 실행해** 확인한다. 문자열은 리팩터로 사라지지만 동작은 사라지지 않는다. 각 가드는 "지키던 동작을 실제로 깨뜨렸을 때 실패한다"를 변이로 증명했고, **대조군**(같은 변이에서 원본 가드는 통과)까지 붙였다 — 예: 심링크 미추종은 lstatSync→statSync 한 글자로 기능이 완전히 깨지는데 종전 가드는 337/337 초록이었다. 보고서에 적힌 것과 **다른 방식의 변이**(skip 기록 제거 / env 정규식 축소)로도 정확히 실패함을 확인해 과적합이 아님을 검증했다.
**메타가드를 파일-인지로 강화 — 3건이 더 드러났다.** 리터럴이 "제품 어딘가"에 있으면 통과시키던 판정을, **가드가 실제로 읽는 파일** 기준으로 바꿨다. read(__filename)(=bin)을 검사하는데 구현이 lib/ 로 옮겨갔다면 그 가드는 여전히 자기 줄만 매칭한다: drift 의 "최신 Last generated"(→lib/drift.js) · decision 필드 파싱(→lib/pure-utils.js) · constraints 호출부(인자가 하나 늘어 정확 리터럴이 어긋남). 셋 다 수리.
**파일을 넘나든 자기참조** — scripts/e2e.js 의 constraints 단언이 bin 에서 리터럴을 찾는데, 그 문자열의 **유일한 출처가 bin 안의 selftest 가드 줄**이었다. 위 수정으로 그 줄이 사라지자 게이트가 실패해 공허함이 드러났다(부작용이 아니라 의도한 효과). 불변식으로 교체하고, 같은 클래스가 e2e.js/e2e-core.js 에 더 있는지 전수 확인(1건이 유일).