"""Documentation contracts only; runtime collector coverage is separate.""" from pathlib import Path import re import unittest from harness.tests._support.paths import HARNESS DISCOVERY = HARNESS / 'agents/spec/skills/gitea-discovery-review/SKILL.md' IMPLEMENTATION = HARNESS / 'agents/spec/skills/gitea-implementation-spec-review/SKILL.md' README = HARNESS / 'docs/discovery/README.md' class PriorityReviewContracts(unittest.TestCase): def test_issue_body_provider_revision_documentation_contract(self): access = (HARNESS / 'operations/gitea-access.md').read_text() contract = access.split('### Issue body update의 provider-derived readback', 1)[-1] for required in ('content_version', 'updated_at'): self.assertIn(required, contract) authoring = (HARNESS / 'agents/spec/skills/gitea-discovery-authoring/SKILL.md').read_text() for text in (DISCOVERY.read_text(), authoring): self.assertIn('Issue body update의 provider-derived readback', text) self.assertIn('content_version', text) self.assertIn('post-comment snapshot을 body update 직전 baseline', authoring) def test_rework_report_documentation_contract_requires_categories_and_counting_rules(self): text = IMPLEMENTATION.read_text() section = text.split('### Named test 근거와 재작업 보고', 1)[1].split('\n## ', 1)[0] for rule in ('해소:', '잔여:', '신규:', '문서 보완:', '해당 없음'): with self.subTest(rule=rule): self.assertIn(rule, section) def test_changed_readback_helper_documentation_contract_is_conditional_and_precreate(self): text = IMPLEMENTATION.read_text() heading = '### 비정본·변경된 readback helper 호출 계약' self.assertIn(heading, text, 'conditional readback invocation guidance is missing') section = text.split(heading, 1)[1].split('\n## ', 1)[0] for rule in ('native create 이전', 'inspect.signature', '.bind('): with self.subTest(rule=rule): self.assertIn(rule, section) step = text.split('17. 호출 전에', 1)[1].split('\n18.', 1)[0] self.assertIn('비정본·변경된 readback helper 호출 계약', step) self.assertLess(step.index('비정본·변경된 readback helper 호출 계약'), step.index('Native review create를')) def test_discovery_checker_documentation_contract_preserves_bytes_and_bounded_transformations(self): text = DISCOVERY.read_text() heading = '### 임시·변경된 Discovery checker 준비' self.assertIn(heading, text, 'bounded Discovery checker preparation guidance is missing') section = text.split(heading, 1)[1].split('\n## ', 1)[0] for rule in ('LF/CRLF', 'splitlines', 'flags='): with self.subTest(rule=rule): self.assertIn(rule, section) step = text.split('11. trusted workflow directory', 1)[1].split('\n12.', 1)[0] self.assertIn('임시·변경된 Discovery checker 준비', step) def test_local_links_resolve_and_procedures_reference_new_rules(self): for path in (DISCOVERY, IMPLEMENTATION, README): text = path.read_text() for link in re.findall('\\]\\(([^)]+)\\)', text): if not link.startswith(('http:', 'https:', '#')): self.assertTrue((path.parent / link.split('#')[0]).exists(), link) if __name__ == "__main__": unittest.main()