diff --git a/harness/agents/review/skills/gitea-code-review/SKILL.md b/harness/agents/review/skills/gitea-code-review/SKILL.md index 62b5f82..11386a9 100644 --- a/harness/agents/review/skills/gitea-code-review/SKILL.md +++ b/harness/agents/review/skills/gitea-code-review/SKILL.md @@ -89,6 +89,14 @@ Cleanup이 미확인이라는 이유로 완료한 검토·전체 테스트·Nati 안전한 대여가 불가능하면 CI·기존 근거를 사용하고 직접 실행 불가 사유를 보고한다. 필수 검증 근거가 부족하면 승인하지 않는다. 독립성은 reviewer의 판단과 직접 확인에 있으며 별도 checkout 자체가 필수는 아니다. +### Dependency provenance와 probe JSON framing + +기존 승인 환경을 사용할 수 없고 별도로 승인된 환경 준비가 필요한 경우, 실제 interpreter 경로·버전, 검증에 관련된 실제 resolved dependency 버전, source revision과 dependency/lockfile·설정 출처를 기존 evidence의 환경·command·확인 한계 기록에 결합한다. 실제 설치 상태를 조회한 값과 요구사항의 버전 범위를 구분하고, 실패한 resolution·collection의 command·exit code·안전한 bounded output을 보존한다. Baseline API/dependency 호환성은 기존 승인 환경·검증된 기록 또는 승인된 read-only 근거로 비교하며 제품 회귀, upstream/baseline drift와 reviewer 환경 오류를 구분한다. 비교할 수 없으면 확인 한계를 보고하고 필수 검증 부족은 기존 미검증/blocked 기준을 적용한다. 이 지침은 새 venv·checkout 생성이나 임의 설치·pinning 권한을 부여하지 않으며 source·requirements·lockfile을 바꾸거나 새 dependency manager·claim schema를 만들지 않는다. + +JSON probe는 실행 전에 producer와 consumer가 고유 marker와 record 경계를 합의한다. 예를 들어 합의한 marker prefix 뒤에 single-line JSON을 쓰는 경우, consumer는 정확한 prefix를 가진 행이 하나뿐인지 확인하고 그 행의 전체 payload를 strict JSON decode한다. 정확히 하나의 완전한 JSON record만 채택하고 누락·중복·malformed·truncation은 차단한다. 전체 stdout이 순수 JSON이라고 가정하거나 임의의 brace 구간·마지막 JSON 비슷한 행을 골라 복구하지 않는다. 합의된 framing이 없는 기존 출력은 자동 추정으로 성공 처리하지 않는다. + +Marker 밖의 warning과 exit status, timeout·출력 한도·termination 상태는 안전한 bounded context로 별도 보존·검토한다. 유효 JSON 한 개만으로 실패 exit 또는 미완료 실행을 성공으로 바꾸지 않는다. Parser/framing·환경 오류는 제품 assertion 실패나 TDD RED로 보고하지 않고 필수 근거 부족은 기존 판정 기준으로 처리한다. 모든 capture/artifact에는 기존 credential redaction·유출 fail-closed 규칙을 적용하며 marker가 인증·provenance·secret 안전성을 보장한다고 주장하지 않는다. 새 generic parser나 manifest schema는 추가하지 않는다. + ## 판정과 기록 - `approve`: 전체 diff, 관련 코드·테스트와 필요한 실행 근거를 검토했고 미해결 중요 결함이나 필수 검증 공백이 없다. 승인 전 필수로 분류한 matrix 행은 모두 통과하거나 근거 있는 비적용이어야 한다. 필수 행에 실패·미검증 또는 설명 없는 비적용이 남으면 승인하지 않는다. 전체 파일 열람이나 전체 테스트 통과만으로 이 조건을 충족했다고 간주하지 않는다. 선택적 검증의 미완료는 한계로 보고하며 자동으로 변경 요청하지 않는다. diff --git a/harness/tests/review/test_review_probe_contract_docs.py b/harness/tests/review/test_review_probe_contract_docs.py new file mode 100644 index 0000000..9580c61 --- /dev/null +++ b/harness/tests/review/test_review_probe_contract_docs.py @@ -0,0 +1,33 @@ +"""Static documentation contracts; no dependency resolver or probe parser is executed.""" +from pathlib import Path +import unittest + +ROOT = Path(__file__).resolve().parents[3] +SKILL = ROOT / 'harness/agents/review/skills/gitea-code-review/SKILL.md' + + +class ReviewProbeDocumentationTests(unittest.TestCase): + def test_documentation_contract_requires_dependency_provenance_and_failure_preservation(self): + text = SKILL.read_text() + heading = '### Dependency provenance와 probe JSON framing' + self.assertIn(heading, text) + section = text.split(heading, 1)[1].split('\n## ', 1)[0] + for rule in ('별도로 승인된', '실제 interpreter', 'resolved dependency 버전', + 'source revision', 'lockfile', '실패한 resolution·collection', + 'baseline', '제품 회귀', '새 venv', '설치·pinning 권한', + '기존 evidence'): + with self.subTest(rule=rule): + self.assertIn(rule, section) + + def test_documentation_contract_requires_exactly_one_framed_record_and_safe_errors(self): + section = SKILL.read_text().split('### Dependency provenance와 probe JSON framing', 1)[1].split('\n## ', 1)[0] + for rule in ('producer와 consumer', '고유 marker', '정확히 하나의 완전한 JSON record', + '누락·중복·malformed·truncation', '전체 stdout', 'brace', + 'warning', 'exit status', 'TDD RED', 'timeout', '출력 한도', + 'redaction', 'generic parser'): + with self.subTest(rule=rule): + self.assertIn(rule, section) + + +if __name__ == '__main__': + unittest.main()