[verified] Define re-review convergence escalation contract

This commit is contained in:
2026-10-12 11:51:19 +00:00
parent d6b70a24b2
commit 64b5746879
2 changed files with 34 additions and 0 deletions
@@ -113,6 +113,14 @@ Finding마다 `F-001` 같은 ID, 파일·행, 발생 조건, 영향·심각도,
재리뷰에서 새 차단 finding을 추가할 때는 계약·변경 경로와의 관계 및 이번 승인 전에 해결해야 하는 이유를 입증한다. 발견 시점이나 severity만으로 차단하지 않는다. 재리뷰에서 새 차단 finding을 추가할 때는 계약·변경 경로와의 관계 및 이번 승인 전에 해결해야 하는 이유를 입증한다. 발견 시점이나 severity만으로 차단하지 않는다.
### 재리뷰 수렴과 에스컬레이션
재리뷰는 이전 finding의 수정 matrix, source delta와 영향 경로를 중심으로 진행한다. 미변경 evidence는 이전 source와 현재 head와 실행 입력(코드·설정·fixture·dependency·실행 도구)의 관계를 확인한 유효 범위에서만 재사용하고, 과거 실행을 현재 head의 새 실행으로 표현하지 않는다. Delta 밖의 실제 승인 계약 위반도 무시하지 않으며 새 blocker에는 위 late-finding 근거 규칙을 적용한다.
Main reviewer는 이전 review/finding과 현재 exact head를 대조해, 미변경 코드의 첫 리뷰 누락 blocker가 재검토 회차에서 재차 반복되는지 확인한다. 이는 단순히 같은 finding이 아직 미해결인 경우나 새 변경이 만든 결함과 구분한다. 반복이 확인되면 자동 rework handoff를 중단하고 소유자에게 exact head·계약, 관련 review/finding ID와 영향 경로, 남은 findings·확인 한계 및 최소 closure plan을 묶어 보고한다. 근거가 확인 불가이면 반복이 입증됐다고 단정하지 말고 수렴 판단의 불확실성을 보고하며 자동 handoff 재개 결정을 소유자에게 요청한다.
Closure plan은 필요한 수정·검증 범위와 종료 조건을 명시하고, 소유자의 명시적 조정·승인 전에는 자동 handoff를 재개하지 않는다. 이는 임의의 N회 후 자동 승인 규칙이 아니며 blocker를 면제하거나 finding을 삭제·dismiss하는 조건도 아니다. 기존 verdict와 현재 head의 spec·code pass 조건을 유지하고, 안전한 검토가 불가능하면 기존 blocked/partial 규칙으로 보고한다. 소유자의 조정은 승인 계약의 묵시적 축소나 추가 POST 권한을 의미하지 않는다. 기존 journal, lease 및 cleanup·불확실한 publication의 readback 계약을 유지한다. 새 counter·상태 저장·자동 반복 탐지기·publisher 변경은 추가하지 않는다.
## 주의 및 완료 보고 ## 주의 및 완료 보고
- Source·test·Discovery 수정, commit·push·merge, Issue 변경, review dismiss, release·deployment를 하지 않는다. - Source·test·Discovery 수정, commit·push·merge, Issue 변경, review dismiss, release·deployment를 하지 않는다.
@@ -0,0 +1,26 @@
"""Static documentation contracts, not agent behavior or automatic loop detection."""
from pathlib import Path
import unittest
ROOT = Path(__file__).resolve().parents[3]
SKILL = ROOT / 'harness/agents/review/skills/gitea-code-review/SKILL.md'
class ReviewConvergenceDocumentationTests(unittest.TestCase):
def test_documentation_contract_requires_recurrence_escalation_and_bound_evidence(self):
text = SKILL.read_text()
heading = '### 재리뷰 수렴과 에스컬레이션'
self.assertIn(heading, text)
section = text.split(heading, 1)[1].split('\n## ', 1)[0]
for rule in ('수정 matrix', 'source delta', '영향 경로',
'head와 실행 입력', '미변경 코드', '첫 리뷰 누락',
'재차 반복', '자동 rework handoff를 중단', '소유자',
'남은 findings', 'closure plan', '확인 불가',
'자동 승인', 'blocker를 면제', '현재 head의 spec·code pass',
'새 counter', '자동 반복 탐지기', '기존 journal'):
with self.subTest(rule=rule):
self.assertIn(rule, section)
if __name__ == '__main__':
unittest.main()