왜 분리했나
감사 번들(docs/self-improving/petri-bundle/)과 docs 사이트는 같은 Pages 아티팩트로 배포됩니다. 검증까지 한 워크플로우에 묶여 있으면 site 빌드 결과가 번들 ratchet의 실행 여부를 좌우합니다. PR #1314가 검증을 분리했습니다. 번들, validator, hygiene ratchet을 건드리는 모든 PR에서 petri-publish.yml이 무조건 돌고, 매일 cron과 수동 dispatch로도 돌아갑니다. 이 워크플로우는 배포하지 않습니다. 실제 Pages 배포는 pages.yml에 남아 아티팩트 소스를 하나로 유지하고, 깨진 번들은 PR 게이트에서 머지 전에 잡힙니다.
구성 요소
| 파일 | 역할 |
|---|---|
.github/workflows/petri-publish.yml | 번들 전용 검증 게이트. docs/self-improving/petri-bundle/**, validator, hygiene, 워크플로우 자신이 바뀌면 가동. 매일 cron + 수동 dispatch. 배포는 하지 않습니다 |
.github/workflows/pages.yml | 실제 배포. validator를 npm install/build 앞에서 실행해 깨진 번들이 빌드 비용을 쓰기 전에 중단. 빌드 후 docs/self-improving/을 site/out/으로 복사 |
scripts/validate_petri_bundle.py | deep validator. .eval zip을 열어 header의 results 누락, 빈 scores[], 빈 metrics를 거부 |
scripts/check_repo_hygiene.py | PETRI_EVAL_FLOOR = 9 삭제 보호 ratchet. eval 파일 수가 바닥 아래로 내려가면 실패 |
zipfile-zstd (dev group) | Python 3.12와 3.13에서 zstd 압축 .eval을 여는 shim. 3.14+에서는 표준 라이브러리가 처리 |
운영자 트리거
# 로컬 검증 uv run python scripts/validate_petri_bundle.py uv run python scripts/check_repo_hygiene.py # 수동 workflow 실행 gh workflow run petri-publish.yml --ref main # 최근 실행 점검 gh run list --workflow=petri-publish.yml --limit=10
알려진 실패 패턴
inspect_ai 뷰어 #1747의 formatPrettyDecimal(g.metrics[i].value) TypeError가 원형입니다. header.json의 results=None, 빈 scores[], 빈 metrics 세 케이스가 트리거이고, validator가 셋 모두를 PR 게이트에서 차단합니다. 과거 사례는 PR #1129(partial archive)와 PR #1130(error archive)입니다. PR에서는 main 대비 사라진 .eval 파일도 경고로 표면화합니다.
참조: PR #1314, tests/test_validate_petri_bundle.py.