[verified] Define re-review convergence escalation contract
This commit is contained in:
@@ -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()
|
||||||
Reference in New Issue
Block a user