[DTP-Worker] Sprint 8 · buffer L75 · Domaine Fiscal/e-CF : le CONTRAT DE FORMAT de l'e-NCF (« E + tipoeCF(2) + secuencia(10) » = 13) était retranscrit À LA MAIN dans QUATRE endroits de prose (README ×3 + fiche agent erpnext_backend) sans AUCUN gate d'IDENTITÉ. Le bloc racine de check_readme_claims ne gate que le COMPTE de tests e-CF (« 39 ») — surface distincte du MÊME module. Ce format — préfixe · longueur du segment tipo · longueur du segment secuencia · longueur TOTALE — est le CŒUR du module (le « composeur traçable ») et dérive du bloc e_ncf de fiscal/ecf_dgii/out/ecf_plan.json (byte-gaté par check_artifacts) : prefix (« E »), longueur (13), regex (^E[0-9]{12}$), structure (« E + tipoeCF (2 chiffres) + secuencia (10 chiffres) »). Format e-NCF standard DGII (Ley 32-23) porté avec source — pas un chiffre inventé (#6). Aucun gate ne comparait la LONGUEUR des segments à l'artefact : allonger la secuencia (rango DGII à 12 chiffres → longueur 15, regex 14 digits) OU changer le préfixe ferait dériver les QUATRE proses en silence pendant que l'ecf_plan byte-gaté dit autre chose — « vert trompeur » qu'aucune suite tests/ (qui teste les FONCTIONS compose_encf/parse_encf, pas la prose) n'attrape → nouveau bloc recomputant (prefix, tipo_len, seq_len, total) depuis le SEUL bloc e_ncf (zéro duplication du format du générateur #6) et exigeant que CHAQUE prose l'encode EXACTEMENT (4 sous-checks numérotés, patron du bloc DevOps). Cohérences croisées en bonus (mordent un artefact INTERNEMENT incohérent) : 1 + tipo_len + seq_len == longueur (1+2+10==13) ET |regex digits| == tipo_len + seq_len (12 == 2+10). Un claim absent échoue AUSSI. 5 morsures vérifiées : drift de l'artefact source (secuencia 10→12, les 4 proses mordues) · résumé README tipo 2→3 · invariant README total 13→14 (aveugle au segment) · fiche erpnext_backend secuencia 10→9 · composition README supprimée (INTROUVABLE) ; plus la morsure d'incohérence d'artefact (regex {11} désaligné du segment tipo+seq=12) ; restauré = green : E + tipo(2) + secuencia(10) = 13 == e_ncf. État courant : aucun segment périmé (anti-invention #6, rien à réécrire) — le défaut est la surface ungated. ci/README.md (table + détail) mis à jour · 7 gates re-verts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+28
-1
@@ -20,7 +20,7 @@ et manuellement (`workflow_dispatch`). Jobs statiques (+ une suite `unittest` pa
|
||||
| `check-artifacts` | `ci/check_artifacts.sh` | Reproductibilité : chaque `out/*.json` versionné == build frais | ✅ oui |
|
||||
| `check-regression` | `ci/check_regression.sh` | Fraîcheur : `qa/regression/out/regression_run.json` (`run`) == run frais + verdict PASS | ✅ oui |
|
||||
| `check-ci-integrity` | `ci/check_ci_integrity.sh` | Intégrité du câblage : `gate.needs` == tous les jobs non-manuels · chaque `ci/*.sh` câblé au gate | ✅ oui |
|
||||
| `check-readme-claims` | `ci/check_readme_claims.sh` | Intégrité des chiffres des docs d'entrée : chaque nombre de `README.md` « État courant », de la fiche QA « Verdict agrégé » **et** de la colonne « Tests » par suite des tables de fiches **et** des agrégats en prose (Total CRM / RBAC / e-CF) **et** des comptes par workspace des portails (cartes/liens/rôles, ×2 docs) **et** des comptes RBAC des 3 volets (table Nb rôles/profil, ligne agrégée apply_plan, ventilation userperm) **et** des comptes de mots-clés SEO (total + fr/en/es, ×2 docs) **et** du pipeline vente CRM (états/transitions, ×2 docs + énumération des transitions à séparation des pouvoirs `{action | allow_self_approval=0}` recomputée de `workflow.json`) **et** de l'app mobile Expo (onglets/rôles/langues/identifiants a_confirmer + énumération ordonnée des onglets recomputée de `role_navigation`, bijection onglet⇔portail) **et** du DocType CONFOTUR (champs/données/sections/rôles/évènements de dépôt, ×2 docs) **et** de l'audit 5D (contrôles/dimensions ×2 docs + ventilation verdict pass/fail/à-confirmer + énumération des open items `control→dimension→propriétaire` recomputée de `audit_report.open_items`) **et** du run-book de déploiement VPS (phases ×2 dans la fiche devops + confirmations préalables count & énumération dans le README) **et** du run-sheet de démo (nombre de modules cités dans le diagramme du README) **et** du montage Chat OTOIA par portail (`Custom Block`/configs runtime/portails, tous = 5 aujourd'hui, ×2 docs) **et** du module de recette `qa/acceptance` (couple livrables de sprint + métriques succès MVP, ×2 docs de module au-delà du README d'entrée) **et** du barème de l'auditeur 4Big (nombre de critères en prose + poids par critère de la table + « generator (N critères) », recomputés de `quality_report.criteria`) **et** de la carte de renormalisation par archétype de l'auditeur 4Big (critères EXCLUS de `data_room`/`parser`/`contract`, recomputés des `checks` par archétype de `quality_report.modules`) == artefact cité (#6) | ✅ oui |
|
||||
| `check-readme-claims` | `ci/check_readme_claims.sh` | Intégrité des chiffres des docs d'entrée : chaque nombre de `README.md` « État courant », de la fiche QA « Verdict agrégé » **et** de la colonne « Tests » par suite des tables de fiches **et** des agrégats en prose (Total CRM / RBAC / e-CF) **et** des comptes par workspace des portails (cartes/liens/rôles, ×2 docs) **et** des comptes RBAC des 3 volets (table Nb rôles/profil, ligne agrégée apply_plan, ventilation userperm) **et** des comptes de mots-clés SEO (total + fr/en/es, ×2 docs) **et** du pipeline vente CRM (états/transitions, ×2 docs + énumération des transitions à séparation des pouvoirs `{action | allow_self_approval=0}` recomputée de `workflow.json`) **et** de l'app mobile Expo (onglets/rôles/langues/identifiants a_confirmer + énumération ordonnée des onglets recomputée de `role_navigation`, bijection onglet⇔portail) **et** du DocType CONFOTUR (champs/données/sections/rôles/évènements de dépôt, ×2 docs) **et** de l'audit 5D (contrôles/dimensions ×2 docs + ventilation verdict pass/fail/à-confirmer + énumération des open items `control→dimension→propriétaire` recomputée de `audit_report.open_items`) **et** du run-book de déploiement VPS (phases ×2 dans la fiche devops + confirmations préalables count & énumération dans le README) **et** du run-sheet de démo (nombre de modules cités dans le diagramme du README) **et** du montage Chat OTOIA par portail (`Custom Block`/configs runtime/portails, tous = 5 aujourd'hui, ×2 docs) **et** du module de recette `qa/acceptance` (couple livrables de sprint + métriques succès MVP, ×2 docs de module au-delà du README d'entrée) **et** du barème de l'auditeur 4Big (nombre de critères en prose + poids par critère de la table + « generator (N critères) », recomputés de `quality_report.criteria`) **et** de la carte de renormalisation par archétype de l'auditeur 4Big (critères EXCLUS de `data_room`/`parser`/`contract`, recomputés des `checks` par archétype de `quality_report.modules`) **et** du contrat de format de l'e-NCF fiscal (`E + tipoeCF(2) + secuencia(10) = 13` : préfixe/longueurs des segments/longueur totale, ×3 README + fiche `erpnext_backend`, recomputés du bloc `e_ncf` d'`ecf_plan.json` + cohérences croisées `1+tipo+seq==longueur` & `|regex digits|==tipo+seq`) == artefact cité (#6) | ✅ oui |
|
||||
| `gate` | — | Agrégat vert = gate qualité 4Big franchi | ✅ oui |
|
||||
|
||||
Aucune dépendance réseau/marketplace hors `actions/checkout`. Tout tourne avec
|
||||
@@ -370,6 +370,33 @@ vérifiées : `data_room` « sans HANDOFF »→« sans CLI » (mauvais critère)
|
||||
exclusion `HANDOFF` retirée (sous-ensemble) · énumération `contract` supprimée ;
|
||||
restauré = vert.
|
||||
|
||||
Même classe enfin sur le **contrat de format de l'e-NCF** (livrable
|
||||
`fiscal/ecf_dgii`) : le format de l'identifiant fiscal électronique DGII
|
||||
« **E + tipoeCF(2) + secuencia(10)** » (= **13**) — préfixe, longueur du segment
|
||||
tipo, longueur du segment secuencia et longueur totale — est le CŒUR du module (le
|
||||
« composeur traçable ») et il est retranscrit **à la main** dans **quatre** endroits
|
||||
de prose : le résumé du README (`E + tipoeCF(2) + secuencia(10)`), l'invariant 7 du
|
||||
README (`E+tipo(2)+seq(10)=13`, seul à porter la longueur **totale**), la section
|
||||
composition du README (`e_ncf = "E" + tipo(2) + secuencia(10)`) et la fiche agent
|
||||
`erpnext_backend`. Le bloc racine ne gate que le **compte de tests** e-CF (« 39 ») ;
|
||||
ce format n'était recomputé par AUCUN gate. Or il est **data-derived** du bloc
|
||||
`e_ncf` d'`fiscal/ecf_dgii/out/ecf_plan.json` (byte-gaté par `check_artifacts`) :
|
||||
`prefix` (« E »), `longueur` (13), `regex` (« `^E[0-9]{12}$` ») et `structure`
|
||||
(« E + tipoeCF (2 chiffres) + secuencia (10 chiffres) »). Allonger la secuencia (un
|
||||
rango DGII à 12 chiffres → `longueur` 15) ou changer le préfixe ferait dériver les
|
||||
quatre proses en silence pendant que l'artefact dit autre chose — dérive qu'aucune
|
||||
suite `tests/` (qui teste les FONCTIONS `compose_encf`/`parse_encf`, pas la prose)
|
||||
n'attrape. On RECOMPUTE `(prefix, tipo_len, seq_len, total)` depuis le SEUL bloc
|
||||
`e_ncf` (zéro duplication du format du générateur · #6) et on exige que **chaque**
|
||||
prose l'encode exactement. Cohérences croisées en bonus (mordent un artefact
|
||||
**internement incohérent**) : `1 + tipo_len + seq_len == longueur` (1+2+10 == 13) ET
|
||||
le nombre de chiffres du `regex` == `tipo_len + seq_len` (12 == 2+10). 5 morsures
|
||||
vérifiées : drift de l'artefact source (secuencia `10→12`, les 4 proses mordues) ·
|
||||
résumé README `tipo 2→3` · invariant README total `13→14` (aveugle au segment) ·
|
||||
fiche `erpnext_backend` `secuencia 10→9` · composition README supprimée
|
||||
(INTROUVABLE) ; plus la morsure d'incohérence d'artefact (`regex` désaligné du
|
||||
segment) ; restauré = vert.
|
||||
|
||||
Un claim **absent** échoue aussi (la dérive de formulation qui ferait
|
||||
disparaître un chiffre est elle-même une régression de traçabilité). stdlib pur
|
||||
(bash/git/python3), zéro réseau.
|
||||
|
||||
Reference in New Issue
Block a user