문서 / docs/task-reports/us2-evidence.md

US2 공개 근거 아틀라스 보고서

공개 근거 아틀라스의 구현 기록.

작업 범위: T022–T034
기준일: 2026-08-13 UTC
상태: DONE
manual-impact: affected

매뉴얼 영향

공개 /5240lab 경로를 placeholder에서 검증된 근거 아틀라스로 교체했다. 근거 관리자용 docs/evidence-maintenance.md도 추가해 선별, 공개 안전성 검토, 실패 복구, 계층 상태 변경 절차를 설명한다. 개발자 README와 운영자 매뉴얼은 각각 T051, T052 범위이며 이번 단계에서는 수정하지 않았다.

RED

production 모듈과 UI를 만들기 전에 T022–T025 계약 테스트를 먼저 추가했다.

명령 결과
npm run test:unit FAIL — 기존 3개 unit file은 PASS, evidence-schema.test.tsCannot find module '../../lib/evidence-schema', evidence-validator.test.ts는 validator 모듈 누락
npm run test:integration 테스트 선작성 시 placeholder page에 범례, 8계층, 검증 metadata, 전체 근거 SSR이 없어 실패하도록 계약 작성
npx playwright test tests/browser/evidence.spec.ts (첫 UI 실행) 5/7 PASS, 2 FAIL — Next dev server가 127.0.0.1 origin의 client chunk를 차단해 hydration이 발생하지 않았고 필터 상태가 19개에 머묾

첫 browser 실패는 상호작용이 동작하지 않는 사용자 관찰 RED였다. 로컬 Next.js 문서의 allowedDevOrigins 계약에 따라 Playwright의 127.0.0.1 origin을 명시한 뒤 같은 테스트를 다시 실행했다.

GREEN

명령 결과
node --import tsx --test tests/unit/evidence-schema.test.ts tests/unit/evidence-validator.test.ts PASS — 2/2 files
npm run verify:evidence PASS — 공개 안전 근거 19개, 기준일 2026-08-13
npm run test:unit PASS — 5/5 files
npm run test:integration PASS — 4/4 files
npm run typecheck PASS
npm run lint PASS
npm run build PASS — evidence 검증 선행, /5240lab 포함 정적 페이지 5개 사전 렌더
npx playwright test tests/browser/evidence.spec.ts PASS — 7/7; 키보드 필터, 초기화, 빈 상태, JS 비활성 전체 목록, 375/768/1024/1440px overflow
npx playwright test PASS — US1 회귀 포함 12/12 browser tests

구현 결과

  • manifest의 안정 ID, policy|enforced|execution, 여덟 계층 참조, 실제 ISO 날짜, 양수·순서·40행 제한, POSIX 상대 경로와 공개 snapshot 구조를 검증한다.
  • 5240lab 루트 안의 실제 경로만 허용하고 심볼릭 링크 escape도 realpath 경계 검사로 거부한다. CRLF/CR을 LF로 바꾼 뒤 지정 행과 expected excerpt를 완전 일치시킨다.
  • 절대 서버 경로, private key, credential assignment, Authorization/Bearer, DB URL, 이메일, 사설 IP, 외부 URL을 공개 필드에서 차단한다. 모든 검증 뒤 임시 파일과 rename으로 snapshot을 교체하며 실패 시 이전 파일을 보존한다.
  • Superpowers 작업 규율, 독립 감사, 88/88 패리티와 버그 검출, 역방향 변경 감시, 데이터베이스·worktree 격리, SQL 실행 가드, 배포 스크립트를 포함한 19개 근거를 선별했다.
  • 페이지는 생성 snapshot과 정적 계층 설명만 import한다. 원본 workspace 파일은 build-only validator만 읽으며 runtime은 읽지 않는다.
  • JavaScript 없이 19개 카드 전체가 HTML에 보인다. hydration 뒤 유형·계층 필터, keyboard button, aria-live 결과, reset과 empty state가 점진적으로 활성화된다.
  • 실행 가드, 배포, 매뉴얼 동기화를 partial로 표시하고 루트 전체 CI, 자동 롤백, 외부 헬스 검증이 존재한다고 주장하지 않는다.

남은 우려와 task 상태

  • 공개 snapshot은 2026-08-13에 선별한 시점 근거다. 원본 이동이나 변경 시 build가 실패하며 관리자가 claim과 발췌를 재검토해야 한다.
  • 공개 안전 패턴은 방어선이지 사람 검토의 대체물이 아니다. 유지보수 가이드의 생성 JSON 직접 검토 절차를 계속 적용해야 한다.
  • T022–T034는 RED→GREEN, unit/render/browser, typecheck/lint/build 검증을 완료했다.

명세 리뷰 보완 RED→GREEN

초기 완료 뒤 공개 안전·snapshot 계약 리뷰에서 네 가지 누락을 발견해 테스트를 먼저 보강했다.

단계 명령 결과
RED node --import tsx --test tests/unit/evidence-schema.test.ts tests/unit/evidence-validator.test.ts FAIL — item status가 결과에서 사라지고 누락·pending을 허용, 시스템 설정 절대 경로 허용, 선택 행 옆 secret 허용
GREEN 같은 두 unit test files 재실행 PASS — 2/2 files
snapshot npm run verify:evidence PASS — 주변 2행 검사에 안전한 범위로 조정한 19개 item과 item별 status: verified 재생성
회귀 npm run test:unit && npm run test:integration && npm run typecheck && npm run lint && npm run build PASS — unit 5/5, integration 4/4, typecheck, warning 없는 lint, evidence 선행 정적 build
browser npx playwright test tests/browser/evidence.spec.ts PASS — 7/7

검증기는 이제 선택 범위 앞뒤 각 2행을 공개 안전성 검사에 포함하되 snapshot에는 선택 행만 담는다. 절대 서버 경로 검사는 시스템 설정·설치·임시·로그 경로를 포함하고 공개 route /guide는 허용한다. 원자성 테스트는 실제 evidence.public.json.tmp- prefix를 디렉터리에서 검사하며, temp write 뒤 rename을 의도적으로 실패시킨 경우에도 catch cleanup이 동작함을 확인한다.

추가 안전성 리뷰에서 사설 IPv4 정규식이 link-local, 172.16/12, 192.168/16 prefix 뒤에 octet을 하나 더 요구하는 결함을 발견했다. 새 테스트는 10.1.2.3, 127.0.0.1, 169.254.1.2, 172.16.1.2, 172.31.255.254, 192.168.1.2가 모두 거부되고, 10.1.2 같은 버전형 숫자, 8.8.8.8, 110.1.2.3은 오탐하지 않음을 요구했다. 기존 구현에서 RED를 확인한 뒤 각 대역을 완전한 네 octet 대안으로 수정했다. affected unit, 19개 근거 검증, 전체 unit/integration, typecheck, lint, build를 모두 다시 통과했다.