"""Assemblage du bundle SEO + manifeste (deterministe, sans horloge).""" from __future__ import annotations from . import hreflang, keywords, schemaorg def _manifest(spec: dict, master: dict, kws: list, sorg: dict, href: dict) -> dict: langs = spec["site"]["langs"] per_lang = {lang: sum(1 for k in kws if k["lang"] == lang) for lang in langs} listing_type = spec["schema_org"]["listing_type"] listings = [n for n in sorg["@graph"] if n.get("@type") == listing_type] offers = sum(len(n.get("offers", [])) for n in sorg["@graph"]) regime = spec["lexicon"].get("regime") confotur = bool(regime) and any( any(regime["requires_inclus"] in (s or "") for s in p.get("inclus", [])) for p in master["projets"] ) return { "deliverable": "seo", "sprint": "6", "roadmap_line": "L60", "source_input": "projets_master.json (sortie Publiciste · derivee de data_room/PXX)", "base_url": spec["site"]["base_url"], "langs": langs, "default_lang": spec["site"]["default_lang"], "x_default_lang": spec["site"]["x_default_lang"], "confotur_documented": confotur, "counts": { "keywords_total": len(kws), "keywords_per_lang": per_lang, "schema_org_nodes": len(sorg["@graph"]), "listings": len(listings), "offers": offers, "hreflang_pages": len(href["pages"]), "projects": len(master["projets"]), }, "targets": spec["targets"], "anti_invention": ( "Mots-cles = compositions de faits documentes (nom/localisation " "data_room) + lexique editorial generique ; un mot-cle ne peut " "porter que les chiffres presents dans son champ projet source. " "schema.org n'emet un prix que pour un projet 'disponible' dont la " "typologie porte un prix sourcE (USD · #10)." ), "hors_perimetre_vps": [ "Injection des balises +