        base = case['input']['site'];accepted = [];rejected = []
        proposals = output.get('paths', []) + ['/search?q=pen', 'https://external.example/guide', '/guide']
        for value in proposals:
            parsed = urlparse(value)
            if parsed.netloc or parsed.query or not value.startswith('/') or value.startswith('//'):
                rejected.append(value)
            elif value not in accepted:
                accepted.append(value)
        ns = 'http://www.sitemaps.org/schemas/sitemap/0.9';ET.register_namespace('', ns);root = ET.Element('{'+ns+'}urlset')
        for path in accepted:
            ET.SubElement(ET.SubElement(root, '{'+ns+'}url'), '{'+ns+'}loc').text = base + path
        ET.ElementTree(root).write(folder / 'sitemap.xml', encoding='utf-8', xml_declaration=True)
        values = [x.text for x in ET.parse(folder / 'sitemap.xml').findall('.//{'+ns+'}loc')]
        check('模型选中两条公开路径', output.get('paths') == ['/guide', '/products/demo'])
        check('原生XML回读且规范URL去重', values == [base+'/guide', base+'/products/demo'])
        check('反例搜索参数和外链隔离', len(rejected) == 2)
        result = {'accepted': values, 'rejectedSyntheticCases': rejected};artifacts.append('sitemap.xml')
