배경
#167(PR #169)에서 스폰 implementer 의 self-verify 갭을 다루며 "검증 도구 자동허용"(Part A)을 검토했으나, Bash(node --check:*) allowlist 가 RCE 채널임이 실측 확인되어 폐기했다:
- node preload 플래그(
--require/--import/--experimental-loader)는 --check(구문검사 전용)에서도 코드를 실행한다.
node --check --import "data:text/javascript,…" ok.js → 파일 0건으로 인라인 실행, claude 가 prefix 규칙으로 무프롬프트 자동승인(실측 node v24.16.0 / claude 2.1.195).
- prefix allow 규칙은
--require/--import/--loader 부정 제약을 표현 불가 → 구조적으로 안전화 불가.
→ 현재 implementer 는 read-only 빌트인(Read/Grep/Glob)으로만 검토하고, JS 구문/타입 self-verify 는 못 한다(품질·신뢰 갭은 by-design 잔존). 실제 verify(typecheck/lint/test)는 Fleet 이 verify/run.ts 로 별도 실행하므로 정합성 자체는 보장되나, implementer 가 편집 중 즉석 sanity-check 를 못 해 수동 코드리뷰로만 납품하는 한계가 남는다.
제안 — preload 차단 검증 래퍼
self-verify 가 실수요로 떠오르면, 안전한 유일 경로는 Fleet 번들 검증 래퍼다:
- Fleet 이 번들한 스크립트(예:
resources/verify-syntax.mjs)를 절대경로로 두고, --allowedTools "Bash(node <abs-wrapper>:*)" 만 허용.
- 래퍼는 argv 를 sanitize: 인자는 워크스페이스 내 파일 경로 1개만 허용(선행
- 플래그·다중 인자·경로탈출 거부), 그 후 내부에서 preload 없이 node --check <file>(또는 vm 파싱)을 수행.
- prefix 매칭상
node --import … <wrapper> 는 node <wrapper> 프리픽스에 매칭되지 않아 차단되고, node <wrapper> --import … 는 래퍼가 인자 검증으로 거부 → preload 우회 불가.
- 컴파운드(
&&·|·;)는 claude 가 sub-command 분해 매칭, $() 명령치환은 검증단계서 거부(둘 다 #167서 실측 안전).
우선순위 / 트리거
tier:later — 트리거 = (a) dogfood 에서 implementer 자기검증 부재가 반복적 품질 저하로 실측되거나, (b) 다중 언어 워크스페이스에서 즉석 sanity-check 수요가 분명해질 때. 그 전엔 by-design 갭 유지.
수용 기준
참조
배경
#167(PR #169)에서 스폰 implementer 의 self-verify 갭을 다루며 "검증 도구 자동허용"(Part A)을 검토했으나,
Bash(node --check:*)allowlist 가 RCE 채널임이 실측 확인되어 폐기했다:--require/--import/--experimental-loader)는--check(구문검사 전용)에서도 코드를 실행한다.node --check --import "data:text/javascript,…" ok.js→ 파일 0건으로 인라인 실행, claude 가 prefix 규칙으로 무프롬프트 자동승인(실측 node v24.16.0 / claude 2.1.195).--require/--import/--loader부정 제약을 표현 불가 → 구조적으로 안전화 불가.→ 현재 implementer 는 read-only 빌트인(Read/Grep/Glob)으로만 검토하고, JS 구문/타입 self-verify 는 못 한다(품질·신뢰 갭은 by-design 잔존). 실제 verify(typecheck/lint/test)는 Fleet 이
verify/run.ts로 별도 실행하므로 정합성 자체는 보장되나, implementer 가 편집 중 즉석 sanity-check 를 못 해 수동 코드리뷰로만 납품하는 한계가 남는다.제안 — preload 차단 검증 래퍼
self-verify 가 실수요로 떠오르면, 안전한 유일 경로는 Fleet 번들 검증 래퍼다:
resources/verify-syntax.mjs)를 절대경로로 두고,--allowedTools "Bash(node <abs-wrapper>:*)"만 허용.-플래그·다중 인자·경로탈출 거부), 그 후 내부에서 preload 없이node --check <file>(또는vm파싱)을 수행.node --import … <wrapper>는node <wrapper>프리픽스에 매칭되지 않아 차단되고,node <wrapper> --import …는 래퍼가 인자 검증으로 거부 → preload 우회 불가.&&·|·;)는 claude 가 sub-command 분해 매칭,$()명령치환은 검증단계서 거부(둘 다 #167서 실측 안전).우선순위 / 트리거
tier:later— 트리거 = (a) dogfood 에서 implementer 자기검증 부재가 반복적 품질 저하로 실측되거나, (b) 다중 언어 워크스페이스에서 즉석 sanity-check 수요가 분명해질 때. 그 전엔 by-design 갭 유지.수용 기준
node --check(무실행) 한다.Bash(<abs-wrapper>:*)만 allow(범용node·Bash(node …)아님).node <wrapper> --import data:…·경로탈출·다중인자가 전부 거부됨(no-exec) 단언.참조
4e4cee6) — Part A 폐기 근거·실측.docs/superpowers/specs/2026-06-29-issue167-implementer-self-verify-design.md§3 Part A.