This commit is contained in:
2026-10-18 16:21:54 +08:00
commit 5921378110
133 changed files with 4682 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
"""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()