[DTP-Worker 20260812_053034] vérif i18n · asymétrie cardinalité SEO fr=87·en=87·es=84 PROUVÉE NON-DÉFAUT · note by-design au dedup (anti re-flag, sans gate)
Angle frais jamais balayé (cohérence tri-lingue FR/EN/ES du module seo/). Un Explore a remonté « es manque 3 mots-clés projet P01 » ; refusé au mot (#6, verify-non-defects) et prouvé au byte-level un NON-DÉFAUT : l'artefact étant byte-repro-gaté, l'écart reflète la LOGIQUE du générateur. Preuve (repro du générateur sans dedup) : génération symétrique par langue → raw 115/langue identique. L'écart vient du seul dedup (lang,term). country[es] = « Republica Dominicana » == la localisation générique de 5 projets (P01/02/03/06/09) → le mot-clé global {type} Republica Dominicana absorbe le mot-clé projet identique de P01 (dedup correct, terme présent 1× en scope global). En fr/en country != localisation → pas de collision, P01 garde ses 7 termes. D'où +3 collisions en es → 87 vs 84. Rien n'est perdu ; invariants (≥ min_keywords_per_lang + unicité (term,lang)) tiennent ; es=84 déjà documenté et gaté README.md:15 (check_readme_claims). Sortie CORRECTE. Livrable = note explicative au point de dedup keywords.py:106 (asymétrie subtile non-évidente qu'un futur balayage refera l'enquête). Aucune logique/fixture/claim -gaté touché (gates byte visent out/*.json, pas la source). Style aligné ASCII + em-dash existant, NFC-clean. run_ci = 33 PASS/0/0 (inchangé). 0 code moteur V18 (#6), 0 logique modifiée, 0 artefact/fixture touché (#6), 0 gate ajouté (#5), 0 VPS (#8), 0 API externe. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -103,6 +103,21 @@ def generate(spec: dict, master: dict) -> list[dict]:
|
||||
|
||||
# --- Dedup (term, lang) en conservant la premiere occurrence, puis tri
|
||||
# deterministe.
|
||||
#
|
||||
# NOTE — asymetrie de cardinalite PAR LANGUE (by-design, pas un bug).
|
||||
# Le nombre de mots-cles UNIQUES peut differer d'une langue a l'autre
|
||||
# (ex. fr=87, en=87, es=84) sans qu'aucun mot-cle ne soit "manquant".
|
||||
# Cause : un projet dont la `localisation` coincide, dans une langue,
|
||||
# avec le `country[lang]` produit un mot-cle projet `{type} {loc}`
|
||||
# BYTE-IDENTIQUE au mot-cle global `{type} {country}` (emis avant) ;
|
||||
# la 2e occurrence est donc dedupliquee — le terme reste present une
|
||||
# fois (scope `global`). En espagnol `country[es]` == "Republica
|
||||
# Dominicana" == la localisation generique de 5 projets, d'ou 3
|
||||
# collisions global<->projet de plus qu'en fr/en (ou "Republique
|
||||
# Dominicaine"/"Dominican Republic" != la localisation). Les invariants
|
||||
# ne contraignent que `>= min_keywords_per_lang` + unicite (term, lang),
|
||||
# jamais l'egalite inter-langues : ne pas "corriger" en forcant une
|
||||
# symetrie (ce serait emettre un doublon strict).
|
||||
seen: set[tuple[str, str]] = set()
|
||||
deduped: list[dict] = []
|
||||
for k in acc:
|
||||
|
||||
Reference in New Issue
Block a user