"""Verify C4H Skill integration, override hierarchy, and removal of retired entry.""" from pathlib import Path import re import unittest ROOT = Path(__file__).resolve().parents[1] SKILLS = ROOT / '.agents/skills' MAIN = SKILLS / 'history-writing-workflow-c4h' REQUIRED_MAIN = [ 'stage1-problem-literature.md', 'stage2-reading-outline.md', 'stage3-draft-finalize.md', 'evaluation-rubrics.md', 'repository-map.md', 'provenance-and-audit.md', ] class IntegratedSkillsTests(unittest.TestCase): def test_renamed_only(self): self.assertFalse((SKILLS/'history-writing-workflow').exists()) self.assertFalse((ROOT/'agent.md').exists()) self.assertFalse((ROOT/'AGENT.md').exists()) self.assertTrue((ROOT/'AGENTS.md').is_file()) for name in ['history-writing-workflow-c4h','source-intake-c4h','discussion-to-topic-c4h']: skill=SKILLS/name/'SKILL.md' self.assertTrue(skill.is_file(),str(skill)) self.assertIn(f'name: {name}\n',skill.read_text(encoding='utf-8')) self.assertTrue((SKILLS/name/'readme.md').is_file()) def test_nine_steps_configurable_gates(self): main=(MAIN/'SKILL.md').read_text(encoding='utf-8') for step in ('I·1','I·2','I·3','II·4','II·5','III·6','III·7','III·8','III·9'): self.assertIn(step,main,step) for token in ('USERINFO.md', 'Q18', 'Q19', 'Q20', 'collaborative','training','95','50'): self.assertIn(token,main,token) topic=(ROOT/'topic.md').read_text(encoding='utf-8') for i in range(1,21): self.assertIn(f'**Q{i}.',topic,str(i)) self.assertEqual((ROOT/'USERINFO.md').stat().st_size,0) self.assertIn('USERINFO.md', (ROOT/'AGENTS.md').read_text(encoding='utf-8')) def test_references_resolve(self): for name in REQUIRED_MAIN: self.assertTrue((MAIN/'references'/name).is_file(),name) for dirname in ['history-writing-workflow-c4h', 'source-intake-c4h','discussion-to-topic-c4h']: folder=SKILLS/dirname text=(folder/'SKILL.md').read_text(encoding='utf-8') for rel in re.findall(r'\]\((references/[^)]+\.md)\)',text): self.assertTrue((folder/rel).is_file(),str(folder/rel)) def test_discussion_and_intake_routes(self): intake=(SKILLS/'source-intake-c4h/SKILL.md').read_text(encoding='utf-8') self.assertIn('01_sources/',intake) self.assertIn('02_evidence/',intake) self.assertIn('03_inquiry/',intake) self.assertIn('04_context/',intake) self.assertIn('05_historiography/',intake) self.assertIn('08_review/',intake) mapping=(SKILLS/'discussion-to-topic-c4h/references/question-map.md').read_text(encoding='utf-8') for q in range(1,21): self.assertIn('Q'+str(q),mapping) self.assertTrue((ROOT/'DISCUSSION_TO_TOPIC.md').is_file()) self.assertTrue((MAIN/'UPSTREAM.md').is_file()) def test_old_simplified_references_removed(self): obsolete=['ingest-and-provenance.md','evidence-and-source-criticism.md', 'inquiry-and-context.md','historiography-and-novelty.md', 'argument-writing-review.md'] for f in obsolete: self.assertFalse((MAIN/'references'/f).exists(),f) if __name__=='__main__': unittest.main()