Conversation
- 채점기: 정답지·채점 중립에 없는 ID 보고 시 자동 미달(오탐 게이트) + BOM(utf-8-sig) 허용, pytest 8→10건
- 정답지: leaky에 "추가 보고 허용(SEC-02 이력 사본)" 절, 양쪽 통과 기준에 게이트 명문화
- report-template: 죽은 문구("S2에서 확정") 제거 — 카탈로그 등급 규칙 절 직접 지시
- EVALS: 한계 4번(ID 일치 채점) + v2.0.1 측정 기록(기본검진 3·재방문 3·구버전 1·공개전 3·초진 1 = 독립 세션 11회, 전 회차 탐지율 100%·오탐 0·키 값 노출 0·시드/픽스처 무변경)
- README: 채점 기준·모델 의존 리스크 구매자 고지
Co-authored-by: Ps-Neko <207958392+Ps-Neko@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…고정표, 톤 정합 규칙, 교차 참조 6문서 갱신, 드라이런 14/14)
- 처방 실행 게이트: 파일 목록 → 파일 목록+전/후 변경 내용 미리보기 (일상 언어 설명, 미리보기 밖 변경 시 중단·재제시) - tests/verify_report_format.py 신설 (pytest 11건): 표지·버전 줄·등급 고정표 정합·4요소 개수·기계 판독 블록·비밀키 값 노출 검사, v1.x 보고서는 숙제 줄 검사 제외 - SKILL.md 보고서 공통 의무에 "내보내기 전 자가 점검" 추가, 루트 README 버전 표기 정합(v2.0.1→v2.2.0) - 검증: pytest 22건 통과 + 실보고서 8장 전수 형식 통과 + 신선 드라이런 2종(checkup 14/14·오탐 0·형식 0건 / 처방 게이트 미리보기 선행·미승인 10파일 해시 불변)
- references/report-formats.md 신설: 형식 질문(1회)·해석 표, HTML 자기완결 골격(인라인 CSS, 외부 리소스·script 금지, 기계 판독 줄 보존), pandoc 감지 시에만 docx(설치 유도 금지), PDF는 브라우저 인쇄 안내 - SKILL.md: 동작 원칙 2번에 형식 문서 포인터, 절대 규칙 7 형식 변형(.md+.html)=보고서 1건 보정 - 검증: 신선 드라이런 1회 — "PDF도 필요" 요청을 md+HTML로 처리, md 채점 14/14·오탐 0(STRUCT-03 중립)·형식 위반 0, HTML 기계 검사 12항목 전부 통과(자기완결·내용 보존·BOM 없음) - 보고서 내용·채점 계약 무변경 — 형식은 겉포장만
- 등급 원형 배지·건수 칩·판정 알약·처방 강조 상자·심각도별 색 테두리 카드(4요소 표) - CSS 골격·클래스를 report-formats.md에 디자인 계약으로 고정 (회차 간 모양 흔들림 차단) - 자기완결(외부 리소스·script 금지)·인쇄 규칙 유지, 표본 기계 검사 통과
- HTML 결과지를 "클리니컬" 디자인으로 확정 (시안 3종 사용자 비교 선택): 타이포그래피 위계·가는 괘선 중심, 이모지·아이콘 장식 금지, 색은 판정·심각도에만 — CSS 골격을 디자인 계약으로 고정 - PDF 직접 출력: Edge/Chrome headless 감지(레지스트리 App Paths) → HTML→PDF 자동 변환, 부재/실패 시 인쇄 안내 폴백. 형식 질문에 ③ PDF 추가, .md+.html+.pdf=보고서 1건 - 형식 검증기 보완: 발견ID 블록의 코드 펜스 표기(템플릿 9절 예시) 허용 (+pytest 1건, 총 12건) - 검증: pytest 23건 + 신선 드라이런(채점 14/14·오탐 0·형식 0, HTML 클리니컬 재현·이모지 0, PDF 146KB 자동 생성)
- tools/check_write_boundary.py + 단위 테스트 7건 + prescription-protocol 도구 안내 - 외부 리뷰 B묶음: BL-15(CI)·BL-16(검증 러너)·BL-18(쓰기 경계) 반영, BL-17(위치 채점) 보류 - 진단·보고·채점 계약 무변경
…위, 직전 v2.5.0 작업 누락 교정)
외부 코드 리뷰 발견 6건을 코드로 검증 후 실재만 수정, 거짓양성은 기각. 독립 skeptic 적대 검증 통과(6/6 CONFIRMED, REFUTED 0). - [P1] 발견ID 펜스 계약 통일: verify_report_format이 코드펜스 안 발견ID를 실제 블록으로 오인(통과)하던 것을 raw-line만 인정하도록 수정 — compare_report (펜스 무시)와 일치. 같은 보고서가 "형식 통과·채점 0%"로 갈리던 모순 제거. - [P1] 보안 문서 충돌 해소: release-checklist SEC-02의 "이력 스캔서 EXPECTED.md 제외"를 SKILL v2.7.1 규칙9와 정합(보안 스캔은 EXPECTED도 검사, 채점만 제외). - [P2] 발견 제목 카탈로그 ID 필수 검사(TITLE_ID_RE → FORM-09). - [P2] check_homework outside_fence 기반 + 중복 검출(펜스 예시 우회 차단). - [P3] check_links 저장소 밖 상대링크 검출(relative_to ROOT). - [Low] compare parse_revisit_lines 펜스 정합. - [CI] golden 보고서 E2E 추가(tests/golden/checkup-report.md verify+compare 동시). 회귀 테스트 +3(제목ID·숙제펜스·저장소밖링크). pytest 59 passed. 거짓양성 기각: check_cover 표지 메타는 report-template상 코드블록 안 배치라 outside_fence 적용 시 정상 보고서가 깨짐(실측) → 현행 유지가 정확. 검사기·CI·보안 문서만 변경. 카탈로그·픽스처·정답지 무변경. CI 5종 로컬 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
collect_found_id_lines·find_last_content_line이 코드펜스 순회 상태기계를 인라인으로 재구현하고 있었다 — 같은 파일의 check_grade/check_body_sections/ check_homework/detect_mode가 이미 쓰는 outside_fence() 헬퍼로 위임해 펜스 처리 로직의 4·5번째 복제를 제거한다. 동작 동치(outside_fence가 동일 펜스 로직 수행) — 기존 59개 테스트 무수정 통과, golden E2E(verify+compare) 통과로 확인. 외부 리뷰 Nit 후속(v2.7.2 계약 통일과 분리). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
parse_report_ids·parse_revisit_lines가 코드펜스 순회를 각각 인라인으로 재구현하고 있었다 — 지역 outside_fence() 헬퍼로 위임해 같은 상태기계 2벌을 이름 붙은 부품 하나로 합친다. sibling인 verify_report_format.outside_fence와 동일 계약·동일 이름이라 두 검사기 코드가 같은 모양으로 읽힌다. 줄 수는 +4(헬퍼 docstring)지만 이득은 감소가 아니라 명명·일관성이다. 동작 동치 — 기존 59개 테스트 무수정 통과, golden E2E·채점 회귀 통과로 확인. verify 정리(27cc38b)의 compare 짝 후속. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
다각도 검증(공개판 v1.7.2 미러)이 찾은 golden 머리말 버전 staleness 해소. 계약상 무해(verify는 major>=2만 숙제 게이팅)하나 릴리스 버전과 일치시킨다. 공개판도 동일하게 v1.7.2로 정합 완료. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
install.ps1(UTF-8 BOM — PS5.1 한글/정규식 정확 판독, -Check 점검 모드, SKILL.md 버전 추출 + 설치 후 인식 확인)·install.sh(LF·--check)· .gitattributes(*.sh eol=lf). README 설치 절을 자동 스크립트 우선으로 갱신 (수동 설치는 details 로 보존). 비개발자 설치 마찰 제거. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
check_location_sampling.py: EXPECTED '심은 문제' 표 상위 5개 ID 에 대해 보고서의 해당 발견 구간에 정답지 위치의 기대 파일명이 등장하는지 확인한다 (ID 는 맞는데 엉뚱한 파일을 가리키는 위치 오진을 가볍게 방어 — 보고서의 자유 서술 형식은 강제하지 않음). run_checks.py 에 [3/3] 로 통합(정답지가 있을 때만 작동 → 실사용 보고서 false-fail 없음). pytest 7건. 파이썬 \w 가 한글을 포함해 utils.py의 추출에 실패하던 것을 ASCII 클래스 + 영숫자-아님 lookahead 로 수정(회귀 테스트 고정). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tests/external-corpus/ — 외부(타인) 실제 프로젝트로 검진 품질을 측정하는 틀: README(수집·익명화·라벨링 절차) + _TEMPLATE/EXPECTED.md·NOTES.md + 타인 코드 비커밋 .gitignore(정답지·메모·틀만 추적). 외부 평가가 짚은 'n=1·자기 프로젝트' 공백의 그릇 — 외부 사용자 확보 후 채운다. BACKLOG: BL-22·BL-28 완료·BL-14 틀 추가, P0 hook·표현완화 '반영 안 함' 판정 기록. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
검진 보고서의 사람용 본문/부록 ID 집합과 기계용 `발견ID:` 줄의 ID 집합이 정확히 일치하는지 verify가 강제한다 — report-template 9절 "발견ID 블록에는 본문·부록 구분 없이 이번 검진의 모든 발견 ID를 빠짐없이" 계약의 자동화. - collect_body_catalog_ids: `### 발견 제목` + `## 부록` 항목의 [ID]만 수집. 재검진 비교표(4절)·처치 경과 줄의 과거 인용 ID는 범위 밖(거짓양성 방지). - check_four_fields: machine_set vs body_set 차집합으로 only_machine/only_body 양방향 검출. 제목 ID 누락(FORM-09) 시엔 본문 집합 불완전이라 교차검사 보류 (제목 ID부터 채워야 의미를 가지며 같은 뿌리를 두 번 보고하지 않음). - 기존엔 발견ID 블록이 비었거나(`(없음)`) 본문 발견 0개인 '존재 수준' 단방향만 잡았음 — 양쪽에 값이 있을 때의 set 불일치 검사가 부재했다. 회귀 테스트 +3 (기계줄 단독 ID / 본문 단독 ID / 부록 ID 정합 가드). 버전 v2.7.2→v2.7.3 정합 (SKILL·README×2·CHANGELOG·golden). 로컬 CI 5스텝 전부 green (버전정합·pytest 69·채점회귀·링크 92파일·golden E2E). 검사기·테스트·문서만 변경. 진단 카탈로그·채점기·픽스처·정답지 무변경. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
install.sh는 rm -rf 후 복사라 재설치가 깨끗한데 install.ps1은 merge-only(Copy-Item)라
업데이트에서 사라진/개명된 참조 문서가 Windows 설치본에만 stale로 남아 스킬이 구버전
절차를 읽을 위험이 있었다. Copy 전 기존 폴더를 비워 install.sh와 동작을 맞춘다.
- install.ps1: Copy-Item 전에 `if (Test-Path $Dst) { Remove-Item -Recurse -Force $Dst }`.
$DstRoot(다른 스킬들이 든 ~/.claude/skills)가 아니라 $Dst(project-doctor)만 삭제.
격리 임시폴더 검증: stale 제거·new 복사·인접 스킬 보존 PASS. AST 파싱 OK.
- README/SPEC 수동 설치 안내에 '업데이트 시 폴더 먼저 삭제' 주석(수동 경로도 merge-only).
- README 필수 고지에 '정적 분석기 아님 — 모델/프로젝트 구조 따라 결과 달라짐' 4번 항목
(한계가 후미·EVALS에만 있던 걸 앞쪽으로 승격).
- BACKLOG BL-28 후속 기록.
검증: 버전 정합·링크(92파일)·pytest 69 green. 스킬 계약 무변경이라 버전 bump 없음.
(.pyc stale 주장은 거짓양성 — __pycache__·*.pyc 이미 .gitignore.)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
외부 v2.7.3 재평가(8.6/10)의 권고 5개를 4에이전트 경험검증으로 코드 대조 후 선별 반영. 채택 2건(P0 EVALS·BL-30 README), 보류/기각 3건. - EVALS.md: v2.7.2~v2.7.3 "CI 게이트 통과 기록" 행 추가(골든 E2E 형식0·채점 14/14·오탐0·위치5/5, run_checks 직접 실행 확인) + 탐지 영향 분석 v2.7.3 연장 + 위치 샘플링 한계 명시. 새 측정 아님, 코드/버전 무변경. - skills/project-doctor/README.md(BL-30): 수동 Copy-Item만 안내 + 'automation-main' 옛 이름 → 루트 install.ps1/install.sh 권장 + 수동 fallback <details> 보존 + 이름 정정. - BACKLOG.md: L 묶음 추가. BL-29(한글 본체 파일명 정규식 — 제안안이 회귀 유발 config.json→config.js·한글접두 흡수 실측, TDD 선행 보류), BL-30(완료), 보류 3건(release-check 문구·심각도 샘플링·한글 정규식). 진단 카탈로그·채점기·검사기·픽스처 무변경 = 버전 bump 없음.
본문 ### 발견 항목이 0개이고 ## 부록에만 카탈로그 ID가 있을 때, check_four_fields의
`if not ids: return`이 FORM-12 교차검사에 도달하기 전에 반환해 "부록 전용 ID ↔ 발견ID:(없음)"
모순을 위반 0·통과로 흘려보내던 빈틈을 봉합한다. report-template 9절("발견ID 블록엔 본문·부록
구분 없이 모든 발견 ID를 빠짐없이") 위반.
- verify_report_format.py: `if not ids:` 분기에 `elif machine_ok:` 추가 —
collect_body_catalog_ids로 부록 ID를 교차검사. 사각지대 조건은
(발견ID:(없음)) AND (### 0개) AND (부록 ID ≥1)로 좁다.
- 회귀 테스트 +1 (부록 전용 [BIG-02] + 발견ID:(없음) → FORM-12). 총 70.
- 재검진 비교표/처치경과의 과거 [OLD-01]은 수집 범위 밖이라 거짓양성 없음(적대 입력 실증).
- 버전 v2.7.3→v2.7.4 정합(SKILL·README×2·CHANGELOG·golden).
검증: 버전 정합·pytest 70·채점 회귀·링크·golden E2E 전부 green.
검사기·테스트·문서만 변경. 카탈로그·채점기·픽스처·정답지 무변경 → 탐지율 불변.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
전체 코드 5축 리뷰(Optional) + 성능 실측에서 나온 두 행동불변 정리. 카탈로그·채점 절차 무변경, 70 테스트 green, golden E2E 통과 → 탐지율·계약 불변. - verify_report_format: 자기 복제하던 outside_fence(8줄)·read_lines·EMPTY_MARK를 제거하고 compare_report에서 import. 두 검사기의 펜스 계약이 단일 출처가 되어 한쪽만 고쳐 갈라지는 위험 제거(코드 주석이 'verify 통과/compare 0% 모순'이라 못박던 결합). check_location_sampling· check_scoring_regression이 이미 compare_report에서 import하는 관행과 통일. 미사용 pathlib.Path import 제거. - compare_report: main()의 채점에서 set(report_ids)·set(expected_ids)|set(neutral_ids)를 컴프리헨션 안에서 매 반복 재생성하던 O(n²)를, 불변 집합 4개를 루프 밖 1회 생성으로 호이스트. 실측 N=5000: 2192 ms → 1.06 ms (행동 동일). 검증: pytest 70 green · golden E2E(형식+채점+위치) 통과 · 버전 정합 유지(코드만 변경, bump 없음). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
전체 코드 5축 리뷰 + 성능 실측의 Optional/Nit를 TDD로 반영. 검사기 하드닝 + 회귀 가드 확장. 진단 카탈로그·채점기·픽스처·정답지 무변경 → 탐지율 불변. pytest 84 green. - verify_report_format: cover_block() 신설 — check_cover(FORM-02/03/04)·detect_major_version이 표지 첫 코드블록만 보게 해, 본문 펜스 안 '스킬 버전: v1.0.0' 예시가 표지를 대신해 FORM-03을 충족·major를 v1로 오판→숙제(FORM-10) 우회하던 구멍 봉합(제목 헤딩은 펜스 밖이라 detect_mode 별도). - check_version.find_version: 첫 마커 줄에서 판정 확정(없으면 BROKEN). CHANGELOG 최신(첫) 헤딩이 깨졌을 때 그 아래 과거 정상 헤딩으로 새던 누락 수정. docstring '첫 줄을 보고'와 일치. - check_location_sampling: MAX_LOC_LEN(2000) 상한으로 FILENAME_RE catastrophic backtracking (10만 자 122초·O(n²)) 차단. 현실 셀(<100자) 무영향. - 테스트 +14(총 84): test_check_version(4분기)·test_run_checks(게이트 합성)· test_check_scoring_regression 신설 + 표지펜스·위치상한 회귀. 5개에만 있던 test_*.py 규율을 check_version/scoring/run_checks까지 확장. - 버전 v2.7.4→v2.7.5 정합(SKILL·README×2·CHANGELOG·golden). 검증: 버전 정합·pytest 84·채점 회귀·링크·golden E2E 전부 green. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5차 외부 평가(P1/P2/P3) 7건 중 신규·실재 갭만 반영(나머지 5건은 반복 기각 또는 이미 정당화된 설계). 검사기 로직 무변경, 카탈로그·채점기·정답지 무변경 → 탐지율 불변. - [Security] release-check SEC-01에 Google `AIza`·`sk-` 2종 추가 — 보고서 자가점검기 FORM-11은 잡는데 1차 탐지 지시문 SEC-01엔 없던 비대칭 해소. (평가의 'Slack·개인키 누락' 지적은 사실 아님 — 이미 SEC-01에 존재. 실제 갭은 2종.) - [Fix] 백업 복원 명령 OS 분기(prescription-protocol) — PowerShell Copy-Item 단일 → Windows/POSIX(cp -R) 병기, 실행 OS에 맞는 한 줄만 인쇄. 비-Windows 복원 깨짐 방지. - [CI] check_write_boundary symlink 회귀 테스트 +2 (루트 밖 심링크→exit1·루트 안→exit0, 권한 없으면 skip). TOCTOU는 도구 범위 밖(문서화)이라 검사 시점 분류만 잠금. - 버전 v2.7.5→v2.7.6 정합(SKILL·README×2·CHANGELOG·golden). 미반영(반복/설계): HTML 렌더러(2차 기각)·쓰기 강제화(BL-18/K절)·실행검사(BL-16)· 위치/심각도 전면채점(BL-17·4차 기각)·git add -A 체크포인트(line 38이 이미 정당화). 검증: 버전 정합·pytest 84(+2 skip)·채점 회귀·링크·golden E2E 전부 green. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
실행 전 체크포인트가 미추적·비gitignore 파일까지 사용자 모르게 로컬 커밋에 쓸어담던 것을, 포함될 미추적 파일을 먼저 보여주고 비밀키·개인정보 의심 시 경고·확인 후 -A 진행하도록 보강. 비개발자가 흔히 gitignore 안 한 민감 파일을, 비밀키를 git 이력에서 찾아내는 도구가 거꾸로 이력에 넣던 자기모순 해소. ★복원 완전성(왜 -A인가)은 유지 — 제거가 아니라 silent sweep만 차단. - prescription-protocol 1장 체크포인트: ① git status로 포함될 미추적 파일 표시 → ② SEC-01/PII-01 의심 시 경고·확인(값 아닌 파일명·유형만) → ③ git add -A 진행. line 38 정합. - 버전 v2.7.6→v2.7.7 정합(SKILL·README×2·CHANGELOG·golden). 절차 문서만 변경. 검사기·진단 카탈로그·채점기·정답지 무변경 → 탐지율 불변. 검증: 버전 정합·pytest 84(+2skip)·링크·golden E2E green. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
세션 시작 재평가가 지목한 'HTML/PDF 렌더러 코드화'를 report-formats.md· 백로그 대조 후 검토. 두 선택지 분리: - (A) 결정적 렌더러 = 기각 유지 (승인 기반 하네스 포지셔닝 충돌, 3번째 기각) - (B) HTML 검증기(verify_html_report.py) = 철학 일관한 유일안이나 외부 0명 위 과잉건축이라 보류 채택 트리거: 외부/신뢰불가 제3자 레포에 HTML/PDF 내보내기 시작, 또는 외부 수요(BL-14). 그때 TDD 선행. BACKLOG M 섹션 신설. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
report-formats.md §5가 자인한 갭(HTML/PDF는 형식검증기 검사 밖, '사람이 직접 대조')을
코드화. 허용목록 fail-closed 검사기를 skills/project-doctor/tools/에 배포하고, HTML 생성
후 저장 전에 호출하도록 절차화.
- HTML-01 허용목록 밖 태그 · HTML-02 이벤트 핸들러 속성 · HTML-03 외부 리소스(CSS
@import/url·인라인 style·meta refresh) · HTML-04 위험 URI · HTML-05 charset 부재 ·
HTML-06 비밀키 값 노출
- html.parser(stdlib)·의존성 0. 비밀키 패턴은 verify_report_format과 동기화(단위 테스트 고정).
- report-formats.md §2/§5 호출·코드 검사 반영. SKILL/README(루트·스킬)/CHANGELOG/EVALS v2.7.8 정합.
- 골든 + 악성 16테스트, 전체 100 passed/2 skipped, CI 게이트(version·links·채점회귀·E2E) green.
- 사후 검사이지 완전강제 아님을 docstring·문서에 정직하게 명시. 탐지 카탈로그·채점 무변경.
설계/계획: docs/superpowers/{specs,plans}/2026-06-14-html-report-verifier*.md
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
보류·트리거 조건부였으나 사용자가 트리거 전 빌드 결정 → (B) 검증기 v2.7.8 구현·머지 완료로 갱신. (A) 결정적 렌더러는 기각 유지. 빌드 결과·미채택 범위(YAGNI) 기록. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
#11) 8-에이전트 워크플로로 7개 주장을 코드대조+처방 적대실행검증(PowerShell/python 실측). "처방 절반이 함정" 패턴 재확인 — 적대검증이 평가 처방의 함정 2건을 실측으로 적발. 채택 4 / 기각 3 / 보류 1. 채택 4건 모두 진단 탐지 로직 불변 → 검진 회귀 불가능. [P1a] HTML 검사기 CSS url() 전면금지 (verify_html_report.py) 스킴 한정 정규식이 url(file:/data:/blob:/behavior:)를 놓치던 갭(실측 미검출)을 url( 자체 금지(CSS_URL_RE)로 교체. 골격이 url()을 0건 써 false-fail 0(16테스트 green). 인라인 style·<style> 양 경로 적용. 회귀 테스트 +4. [P2a] 버전 줄 통째 삭제 차단 (check_version.py) main()이 MISSING(마커/파일 부재)을 '건너뜀'으로만 처리해 핵심문서 버전줄 삭제 시 CI exit 0(false-pass 실측)을 차단 — MISSING도 실패 집계. find_version 불변. 회귀 +2. [P2b] ci.yml timeout-minutes: 10 (무한루프 러너 점유 방어) SHA pinning 기각(contents:read뿐+Dependabot 부재→stale·마찰), pytest 고정 보류(BL-32). [P0] 스킬 README 수동설치 명령 교정 (BL-30 후속) summary("스킬 폴더만")↔명령(skills/project-doctor 경로) 자기모순을 현재 폴더(.) 복사로 수정. 평가 처방 'Copy-Item . dest'의 PS5.1 중첩 버그(실측)를 피해 .\* 와일드카드 사용. 기각: P1b atomic-move(검사기 읽기전용→강제 불가)·외부코퍼스(=BL-14 수요게이트·자작=편향)· 대문제① 결정적실행기(=A 렌더러 4번째 기각, 승인기반 진단 하네스 포지셔닝). CI 게이트 5종 로컬 green: 버전정합 v2.7.9 4곳 일치·pytest 106 passed/2 skipped· 채점회귀·링크 0깨짐·golden E2E 전부통과. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
스킬 README 수동 설치(<details>)의 수동 복사(Copy-Item .\*·cp -r .)는 병합이라 옛 파일이 삭제/개명돼도 ~/.claude/skills/project-doctor에 stale로 남는다. 루트 README엔 이미 있던 '업데이트 시 기존 폴더 먼저 삭제' 경고를, P0(v2.7.9)로 동작하게 고친 스킬 README의 수동 fallback에도 정합. 자동 스크립트(install.ps1/sh)는 clean install이라 무관 — 수동 fallback만의 잔여 리스크 해소. 문서만 변경. 검사기·진단 카탈로그·채점기·픽스처·정답지 무변경 → 탐지율 불변. CI 게이트 5종 로컬 green: 버전정합 v2.7.10 4곳 일치·pytest 106 passed/2 skipped· 채점회귀·링크 0깨짐·golden E2E 전부통과. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
심층 방어 2건 (탐지 로직·검사기 무변경 → 탐지율 불변): - .gitignore에 .env·*.pem·*.key 추가. 이 저장소엔 진짜 비밀이 없지만 향후 기여자의 실수 커밋을 예방. 테스트 픽스처 .env.backup(의도된 가짜 비밀)은 보존하려고 .env.* 대신 .env 리터럴을 사용 — git check-ignore로 픽스처 비무시·진짜 .env 무시를 실측 확인. - prescription-protocol §2(검증 사다리 공통)·release-checklist §1(셸 명령 공통)에 "신뢰 불가 제3자 경로는 따옴표로 감싸고 파일 내용은 argv로만 넘긴다" 주의 명문화 — 악의적 파일명·내용의 명령 둔갑(명령 인젝션) 방어. SEC-01(Select-String)·SEC-02(git log/grep) 모두 커버. 버전 v2.7.10 → v2.7.11 (SKILL.md·루트/스킬 README·CHANGELOG 정합). 검증: check_version 통과 · pytest 106 passed/2 skipped · check_links 0 · 3-렌즈 적대 검증(회귀·보안·회의론) 전부 safe (critical/required 0). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: 파이썬 3.10/3.11/3.12 매트릭스 추가 — SPEC "3.10+" 약속 검증 SPEC.md는 보조 스크립트를 Python 3.10+로 약속하지만 CI는 3.11만 돌렸다. 하한·중간·상한 3버전 × 2 OS = 6잡으로 그 약속을 실제 검증한다. (외부 평가 4순위) * test: HTML 결과지 ↔ .md 정본 내용 동기화 회귀 추가 HTML 보안 검증(verify_html_report)과 별개로, HTML이 .md 정본의 발견ID·버전·판정을 빠짐없이 담는지 골든 쌍으로 검사한다. check_html_md_parity.py(대조 검사기) + golden/checkup-report.html(정본 HTML 쌍) + test_html_md_parity.py(회귀). 기존 pytest 단계가 자동 수집하므로 ci.yml 추가 변경 없음. (외부 평가 5순위)
_TextExtractor가 style/script만 제외하고 <title>·<head> 텍스트는 포함해, 본문엔 없고 머리말에만 있는 값이 거짓 통과할 여지가 있었다. 제외 영역을 head·title·style·script로 넓히고, 중첩(<head> 안의 <title>/<style>) 안전을 위해 단일 boolean을 깊이 카운터로 교체. title-only 거짓통과를 잠그는 회귀 테스트 추가. (외부 평가 후속)
8개 영역 적대 평가 → 실측 검증 → 채택 9·기각 3·보류 17. 채택 9건 전부 진단 탐지 로직 불변(문서·테스트·픽스처·골든·EVALS 한정 → 검진 회귀 불가). - [P1 보안] verify_html_report: 허위 종료 주석(<!-->)으로 XSS가 검사기를 우회하던 갭 차단 — handle_comment(주석 내 허용목록 밖 태그/이벤트핸들러 fail-closed) + ABRUPT_COMMENT_RE 이중 방어. 회귀 테스트 +3. - [P0] 골든 보고서 v2.7.7 동결 차단 — check_version에 골든 표지 단언 추가, 골든·parity 하드코딩·전 버전 마커를 v2.7.12로 정합. - [P2] leaky 보안 픽스처 골든 신설 + CI/pytest 3게이트 E2E(SEC/PII 위치 포함). - [docs] EVALS v2.7.11 게이트 기록·README 측정시점(v1.0.0/v2.0.1) 단서· report-formats §5 미배포 도구 문구·messy --deep 채점중립(HIST/DEP)· README 카탈로그 35→기본 22 정정. 검증: pytest 118 passed·버전정합·채점회귀·문서링크·messy/leaky 골든 E2E 전부 통과. 기각 3(함정 1·이미기각 2)·보류 17 상세: BACKLOG.md 섹션 O.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
유료(오픈코어) 계획 폐기 결정에 따라 비공개 dev 에디션의 전체 기능을 공개판으로 통합한다.
이후 project-doctor 단일 저장소로 운영하며 project-doctor-dev는 삭제 예정.