PR #282 는 ApprovalGate 예외 열거를 기계 계약으로 만들면서 fs 능력 경계를 여덟 층으로 닫았다(ADR 없음 — AGENTS.md 「예외 = 엔진 인프라 쓰기」 불릿이 계약 본문). Codex 리뷰 17 라운드를 거치며 「이름 열거 → 형태 금지」 전환을 다섯 번 했고, 매 라운드 지적은 실제 우회였다.
이 이슈는 #282 에서 의도적으로 남긴 것을 추적한다. #282 의 목적은 「예외 열거가 실제와 어긋나지 않게 한다」였지 적대적 샌드박스가 아니고, 레포는 tools/(#174)에서 이미 "이 가드는 회귀 트립와이어이지 적대적 샌드박스가 아니다" 로 선을 그어뒀다.
1. Codex 17R 이 짚은 잔여 형태 2건 (실체 확인됨)
1-1. 내보내는 컨테이너의 중첩 항목
export const raw = { nested: { writeFileSync } }
현재 셀렉터는 ExportNamedDeclaration > VariableDeclaration > VariableDeclarator > ObjectExpression > Property[value.type=…] 로 직계 자식만 본다. 중첩 깊이 무제한이므로 자손 결합자로 바꾸는 것이 후보이나, 정상 상수(중첩 설정 객체가 식별자를 참조하는 경우)의 마찰이 얼마나 되는지 먼저 측정해야 한다 — #282 에서 얕은 형태만으로도 이미 ignored-baseline.ts 에 인라인 예외가 필요했다.
1-2. CommonJS 전역 module 을 통한 로더
// .cjs 코어 모듈에서
module.constructor._load('node:fs') // 쓰기 가능한 fs 반환
#282 는 node:module import 를 막았지만 CJS 는 module 을 전역으로 준다. 후보: _load·_resolveFilename 을 로더 이름 집합에 추가, 또는 코어에서 CommonJS 모듈 자체를 기계적으로 배제. 후자가 형태 기반이라 더 낫지만 확장자 사각(#282 8R)과의 상호작용을 봐야 한다.
2. 정적 분석의 원리적 한계 (봉쇄 대상이 아니라 명시 대상)
할 일
배경
PR #282 는
ApprovalGate예외 열거를 기계 계약으로 만들면서 fs 능력 경계를 여덟 층으로 닫았다(ADR 없음 — AGENTS.md 「예외 = 엔진 인프라 쓰기」 불릿이 계약 본문). Codex 리뷰 17 라운드를 거치며 「이름 열거 → 형태 금지」 전환을 다섯 번 했고, 매 라운드 지적은 실제 우회였다.이 이슈는 #282 에서 의도적으로 남긴 것을 추적한다. #282 의 목적은 「예외 열거가 실제와 어긋나지 않게 한다」였지 적대적 샌드박스가 아니고, 레포는
tools/(#174)에서 이미 "이 가드는 회귀 트립와이어이지 적대적 샌드박스가 아니다" 로 선을 그어뒀다.1. Codex 17R 이 짚은 잔여 형태 2건 (실체 확인됨)
1-1. 내보내는 컨테이너의 중첩 항목
현재 셀렉터는
ExportNamedDeclaration > VariableDeclaration > VariableDeclarator > ObjectExpression > Property[value.type=…]로 직계 자식만 본다. 중첩 깊이 무제한이므로 자손 결합자로 바꾸는 것이 후보이나, 정상 상수(중첩 설정 객체가 식별자를 참조하는 경우)의 마찰이 얼마나 되는지 먼저 측정해야 한다 — #282 에서 얕은 형태만으로도 이미ignored-baseline.ts에 인라인 예외가 필요했다.1-2. CommonJS 전역
module을 통한 로더#282 는
node:moduleimport 를 막았지만 CJS 는module을 전역으로 준다. 후보:_load·_resolveFilename을 로더 이름 집합에 추가, 또는 코어에서 CommonJS 모듈 자체를 기계적으로 배제. 후자가 형태 기반이라 더 낫지만 확장자 사각(#282 8R)과의 상호작용을 봐야 한다.2. 정적 분석의 원리적 한계 (봉쇄 대상이 아니라 명시 대상)
fs[name](name이 런타임 값)eval/new Function/vmDurableFs와 형태가 같아 원리적으로 구분 불가. docs(AGENTS): 드리프트 5건 정정 + ApprovalGate 예외 열거를 기계 계약으로 승격 #282 는 이런 의도적 seam 을 지정자 목록으로 추적하는 방식으로 다룬다(scripts/approval-gate-exceptions.test.ts의 seam 판정).할 일
배경
index.lock소유 기반 회수 — 같은 PR 에서 분리된 후속)