[DTP-Worker] Sprint 8 · buffer · Fiches agents/citation CLAUDE.md #10 : la prose « Anti-invention » de DEUX fiches — 03_agents/erpnext_backend/AGENT.md:57 (devises **USD + DOP** · format **Letter US** · paiements **Cardnet**, pas Stripe) et 03_agents/crm/AGENT.md:37 (devises **USD + DOP** · format **Letter US**) — RECOPIE À LA MAIN les valeurs canoniques de la contrainte NON-NÉGOCIABLE CLAUDE.md #10 en AFFIRMANT « cités depuis CLAUDE.md #10, jamais réinventés », mais AUCUN gate ne liait cette citation à #10. Le bloc « paramètres canoniques » faisabilite/generator n'ancre QUE genlib/model.py CANONICAL + son README (classe claude-md-constant-anchor), AVEUGLE à ces fiches ; aucune suite tests/ (FONCTIONS, jamais l'ancre à CLAUDE.md) n'attrape la prose. Piège #6 : RENOMMER le prestataire (Cardnet→Azul) ou changer une devise/format dans CLAUDE.md #10 laisse ces citations PÉRIMÉES en silence, contredisant le mandat pendant que la prose se réclame de « CLAUDE.md #10 » — « vert trompeur ». Gate ajouté (bloc « Fiches agents · CITATION des constantes CLAUDE.md #10 ») : réutilise les valeurs exp déjà recomputées de #9/#10 (zéro duplication) + le prestataire EXCLU ((pas X)) recomputé de #10 ; config table par-fiche du SOUS-ENSEMBLE de tokens qu'elle cite (crm omet le paiement) ; exige l'ancre « CLAUDE.md #10 » + chaque token en gras **<valeur>** == #10 (casse tolérée) + l'exclusion pour erpnext. 5 morsures vérifiées (Cardnet→Azul mord erpnext SEUL · devises mord les DEUX · exclusion Stripe→PayPal · fiche crm Letter US périmé · ancre #10 supprimée → INTROUVABLE), restauré vert, 7 gates re-verts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -513,3 +513,36 @@ absolu) · **7 gates re-verts** (`check_readme_claims`/`check_ci_integrity`/
|
|||||||
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'import réel
|
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'import réel
|
||||||
du DocType puis du Workflow reste côté agent ERPNext Backend / VPS).
|
du DocType puis du Workflow reste côté agent ERPNext Backend / VPS).
|
||||||
- **Auto-score 4Big** : 96/100.
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|
||||||
|
## Session `20260801_043224` · Buffer S8 · Fiches agents/citation CLAUDE.md #10 : la prose « Anti-invention » de DEUX fiches — `03_agents/erpnext_backend/AGENT.md:57` (devises **USD + DOP** · format **Letter US** · paiements **Cardnet**, pas Stripe) et `03_agents/crm/AGENT.md:37` (devises **USD + DOP** · format **Letter US**) — RECOPIE À LA MAIN les valeurs canoniques de la contrainte NON-NÉGOCIABLE CLAUDE.md #10 en AFFIRMANT « cités depuis CLAUDE.md #10, jamais réinventés », mais AUCUN gate ne liait cette citation à #10.
|
||||||
|
|
||||||
|
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement close ;
|
||||||
|
poursuite de la série anti-dérive d'ANCRAGE à CLAUDE.md (classe [[claude-md-constant-anchor-gate]]).
|
||||||
|
Même patron EXACT que le bloc « paramètres canoniques » faisabilite/generator (model.py
|
||||||
|
CANONICAL ↔ #9/#10) et publiciste/branding (4 tokens ↔ #4) — appliqué à une SURFACE
|
||||||
|
distincte : la prose des fiches agents qui se réclame de #10.
|
||||||
|
|
||||||
|
**Dérive silencieuse fermée** :
|
||||||
|
- `03_agents/erpnext_backend/AGENT.md:57` + `03_agents/crm/AGENT.md:37` — prose
|
||||||
|
« Anti-invention (#6) » citant en gras les tokens #10 (devises/format/paiement).
|
||||||
|
- Source faisant autorité : la contrainte NON-NÉGOCIABLE **CLAUDE.md #10**
|
||||||
|
(`**USD + DOP**` devises · `**Letter US**` format · `**Cardnet**` paiements (pas Stripe)).
|
||||||
|
- Le seul contrôle amont (bloc « paramètres canoniques ») n'ancre QUE
|
||||||
|
`faisabilite/generator/genlib/model.py` CANONICAL + son README — AVEUGLE à ces fiches.
|
||||||
|
Aucune suite `tests/` (FONCTIONS, jamais l'ancre à CLAUDE.md) n'attrape la prose.
|
||||||
|
- Piège #6 : RENOMMER le prestataire (`Cardnet`→`Azul`) ou changer une devise/format dans
|
||||||
|
CLAUDE.md #10 laisse ces citations PÉRIMÉES en silence, contredisant le mandat pendant
|
||||||
|
que la prose se réclame de « CLAUDE.md #10 » — « vert trompeur ».
|
||||||
|
|
||||||
|
**Gate ajouté** (bloc « Fiches agents · CITATION des constantes CLAUDE.md #10 ») :
|
||||||
|
réutilise les valeurs `exp` déjà recomputées de #9/#10 (zéro duplication) + le prestataire
|
||||||
|
EXCLU (`(pas X)`) recomputé de #10 ; config table par-fiche du SOUS-ENSEMBLE de tokens
|
||||||
|
qu'elle cite (crm omet le paiement) ; exige de chaque fiche l'ancre « CLAUDE.md #10 » +
|
||||||
|
chaque token en gras `**<valeur>**` == #10 (casse tolérée) + l'exclusion pour erpnext.
|
||||||
|
|
||||||
|
**5 morsures vérifiées** (restauré vert après chacune, 7 gates re-verts) :
|
||||||
|
1. CLAUDE.md #10 `Cardnet`→`Azul` → mord erpnext SEUL (crm ne cite pas le paiement) ✓
|
||||||
|
2. CLAUDE.md #10 devises `USD + DOP`→`USD + EUR` → mord les DEUX fiches ✓
|
||||||
|
3. CLAUDE.md #10 `(pas Stripe)`→`(pas PayPal)` → mord l'exclusion erpnext ✓
|
||||||
|
4. fiche crm `Letter US`→`Letter USA` → mord CRM (format) ✓
|
||||||
|
5. fiche erpnext supprime l'ancre `CLAUDE.md #10` → mord INTROUVABLE ✓
|
||||||
|
|||||||
@@ -2870,6 +2870,67 @@ if exp is not None:
|
|||||||
bad(f"Faisabilité canoniques · {FG_RD} — prose énumère {sorted(got)} MAIS "
|
bad(f"Faisabilité canoniques · {FG_RD} — prose énumère {sorted(got)} MAIS "
|
||||||
f"CLAUDE.md {sorted(want)}{detail} → régénérer le README")
|
f"CLAUDE.md {sorted(want)}{detail} → régénérer le README")
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Fiches agents · CITATION des constantes CLAUDE.md #10 (devises/format/paiement)
|
||||||
|
# — même classe d'ANCRAGE que le bloc « paramètres canoniques » ci-dessus, mais
|
||||||
|
# sur une SURFACE distincte : la prose « Anti-invention » des fiches agents.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Deux fiches RECOPIENT à la main les valeurs canoniques de CLAUDE.md #10
|
||||||
|
# (**USD + DOP** devises · **Letter US** format · **Cardnet** paiements, pas
|
||||||
|
# Stripe) en AFFIRMANT « cités depuis CLAUDE.md #10, jamais réinventés » :
|
||||||
|
# • 03_agents/erpnext_backend/AGENT.md:57 — devises **USD + DOP**, format
|
||||||
|
# **Letter US**, paiements **Cardnet** (pas Stripe)
|
||||||
|
# • 03_agents/crm/AGENT.md:37 — devises **USD + DOP** et format **Letter US**
|
||||||
|
# La prose PRÉTEND être une CITATION de #10, mais AUCUN gate ne la liait à #10 :
|
||||||
|
# le bloc « paramètres canoniques » ci-dessus n'ancre QUE genlib/model.py
|
||||||
|
# CANONICAL + le README generator — AVEUGLE à ces deux fiches. Piège #6 : RENOMMER
|
||||||
|
# le prestataire de paiement dans CLAUDE.md #10 (`Cardnet` → `Azul`) ou changer une
|
||||||
|
# devise/format laisse ces citations PÉRIMÉES en silence, contredisant le mandat
|
||||||
|
# pendant que la prose se réclame de « CLAUDE.md #10 » — « vert trompeur » qu'aucune
|
||||||
|
# suite tests/ (FONCTIONS, jamais l'ancre à CLAUDE.md) n'attrape. On RÉUTILISE les
|
||||||
|
# valeurs `exp` déjà recomputées depuis #10 (zéro duplication) + le prestataire
|
||||||
|
# EXCLU (`(pas X)`), et on exige de CHAQUE fiche les tokens en gras qu'elle cite
|
||||||
|
# EXACTEMENT + l'ancre « CLAUDE.md #10 ». Chaque fiche cite un SOUS-ENSEMBLE
|
||||||
|
# distinct (crm omet le paiement) → gate par-fiche ce que la fiche énonce.
|
||||||
|
# ============================================================================
|
||||||
|
if exp is not None:
|
||||||
|
_m_excl = re.search(r"\(pas\s+(.+?)\)", l10.group(1))
|
||||||
|
exp_excl = _m_excl.group(1).strip() if _m_excl else None
|
||||||
|
_lab10 = {"devises": "devises", "format_doc": "format", "paiement": "paiement"}
|
||||||
|
# (fiche, [clés #10 citées], cite l'exclusion « (pas X) » ?, libellé)
|
||||||
|
FICHE10 = [
|
||||||
|
("03_agents/erpnext_backend/AGENT.md",
|
||||||
|
["devises", "format_doc", "paiement"], True, "fiche ERPNext Backend:57"),
|
||||||
|
("03_agents/crm/AGENT.md",
|
||||||
|
["devises", "format_doc"], False, "fiche CRM:37"),
|
||||||
|
]
|
||||||
|
for path, keys, cites_excl, label in FICHE10:
|
||||||
|
txt = read_norm(path)
|
||||||
|
if txt is None:
|
||||||
|
continue
|
||||||
|
# ancrage : la citation DOIT se réclamer de CLAUDE.md #10
|
||||||
|
if not re.search(r"CLAUDE\.md #10", txt):
|
||||||
|
bad(f"Fiches #10 · {label} ({path}) — ancre « CLAUDE.md #10 » "
|
||||||
|
f"INTROUVABLE → la citation ne se réclame plus de la contrainte")
|
||||||
|
continue
|
||||||
|
drift = []
|
||||||
|
for k in keys:
|
||||||
|
# token en gras **<valeur>** == valeur recomputée de #10 (casse tolérée)
|
||||||
|
if not re.search(r"\*\*\s*" + re.escape(exp[k]) + r"\s*\*\*",
|
||||||
|
txt, re.IGNORECASE):
|
||||||
|
drift.append(f"{_lab10[k]} attendu **{exp[k]}**")
|
||||||
|
if cites_excl and exp_excl is not None:
|
||||||
|
if not re.search(r"\(pas\s+" + re.escape(exp_excl) + r"\)",
|
||||||
|
txt, re.IGNORECASE):
|
||||||
|
drift.append(f"exclusion attendue « (pas {exp_excl}) »")
|
||||||
|
if drift:
|
||||||
|
bad(f"Fiches #10 · {label} ({path}) — citation DÉRIVE de CLAUDE.md #10 : "
|
||||||
|
f"{' · '.join(drift)} → aligner la fiche (ou CLAUDE.md)")
|
||||||
|
else:
|
||||||
|
_cited = " · ".join(f"**{exp[k]}**" for k in keys) + \
|
||||||
|
(f" · (pas {exp_excl})" if cites_excl and exp_excl else "")
|
||||||
|
good(f"Fiches #10 · {label} — cite {_cited} == CLAUDE.md #10")
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Démo · run-sheet de pitch (2e surface du MÊME README) · la TABLE des SCÉNARIOS
|
# Démo · run-sheet de pitch (2e surface du MÊME README) · la TABLE des SCÉNARIOS
|
||||||
# — l'IDENTITÉ de chaque ligne (id · projet+libellé · audience), jamais gatée.
|
# — l'IDENTITÉ de chaque ligne (id · projet+libellé · audience), jamais gatée.
|
||||||
|
|||||||
Reference in New Issue
Block a user