[DTP-Worker 20260803_030641] Auto exec · session 20260803_030641
CI / Contraintes NON-NÉGOCIABLES (CLAUDE.md) (push) Has been cancelled
CI / Validation JSON (schémas Faisabilité) (push) Has been cancelled
CI / Qualité documentaire (liens + 4Big) (push) Has been cancelled
CI / Reproductibilité des artefacts out/ (build == commité) (push) Has been cancelled
CI / Fraîcheur matrice de régression (run == commité) (push) Has been cancelled
CI / Intégrité du câblage CI (gate agrège tout · gates statiques verrouillés) (push) Has been cancelled
CI / Intégrité des chiffres du README (valeur == artefact cité · (push) Has been cancelled
CI / Publiciste · parser + schéma + generator (unittest) (push) Has been cancelled
CI / RBAC · 50 rôles + schéma (unittest) (push) Has been cancelled
CI / Faisabilité · générateur 4 volets + round-trip (unittest) (push) Has been cancelled
CI / RBAC · fixtures ERPNext (Role + Custom DocPerm) (push) Has been cancelled
CI / RBAC · plan User Permission (row-level) (push) Has been cancelled
CI / RBAC · Role Profile (bundles par portail) (push) Has been cancelled
CI / RBAC · run-book d'application unifié (agrégat 3 volets) (push) Has been cancelled
CI / Faisabilité · dossier bancable trilingue FR/EN/ES (push) Has been cancelled
CI / CRM · workflow vente ERPNext (lead → CONFOTUR) (push) Has been cancelled
CI / CRM · DocType porteur OTO Dossier Vente (push) Has been cancelled
CI / CRM · barème commissions vendeurs (push) Has been cancelled
CI / Fiscal · e-CF DGII (Compupar) (push) Has been cancelled
CI / Frontend · Workspaces 5 portails rôle (push) Has been cancelled
CI / Legal · DocType CONFOTUR Application (push) Has been cancelled
CI / QA · Audit 5D conformité (push) Has been cancelled
CI / SEO · mots-clés trilingues + schema.org + hreflang (push) Has been cancelled
CI / Chat OTOIA · montage par portail (Custom Block) (push) Has been cancelled
CI / QA · Audit 4Big (95+/100 sur 100% deliverables) (push) Has been cancelled
CI / Démo · Scénarios (run-sheet P07 banquier / P05 client) (push) Has been cancelled
CI / QA · Matrice de régression exhaustive (Sprint 8) (push) Has been cancelled
CI / DevOps · Run-book de déploiement VPS unifié (Sprint 8) (push) Has been cancelled
CI / QA · Matrice d'acceptation / traçabilité MVP (Sprint 8) (push) Has been cancelled
CI / Mobile · config app Expo/EAS (navigation par rôle) (push) Has been cancelled
CI / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled
CI / Contraintes NON-NÉGOCIABLES (CLAUDE.md) (push) Has been cancelled
CI / Validation JSON (schémas Faisabilité) (push) Has been cancelled
CI / Qualité documentaire (liens + 4Big) (push) Has been cancelled
CI / Reproductibilité des artefacts out/ (build == commité) (push) Has been cancelled
CI / Fraîcheur matrice de régression (run == commité) (push) Has been cancelled
CI / Intégrité du câblage CI (gate agrège tout · gates statiques verrouillés) (push) Has been cancelled
CI / Intégrité des chiffres du README (valeur == artefact cité · (push) Has been cancelled
CI / Publiciste · parser + schéma + generator (unittest) (push) Has been cancelled
CI / RBAC · 50 rôles + schéma (unittest) (push) Has been cancelled
CI / Faisabilité · générateur 4 volets + round-trip (unittest) (push) Has been cancelled
CI / RBAC · fixtures ERPNext (Role + Custom DocPerm) (push) Has been cancelled
CI / RBAC · plan User Permission (row-level) (push) Has been cancelled
CI / RBAC · Role Profile (bundles par portail) (push) Has been cancelled
CI / RBAC · run-book d'application unifié (agrégat 3 volets) (push) Has been cancelled
CI / Faisabilité · dossier bancable trilingue FR/EN/ES (push) Has been cancelled
CI / CRM · workflow vente ERPNext (lead → CONFOTUR) (push) Has been cancelled
CI / CRM · DocType porteur OTO Dossier Vente (push) Has been cancelled
CI / CRM · barème commissions vendeurs (push) Has been cancelled
CI / Fiscal · e-CF DGII (Compupar) (push) Has been cancelled
CI / Frontend · Workspaces 5 portails rôle (push) Has been cancelled
CI / Legal · DocType CONFOTUR Application (push) Has been cancelled
CI / QA · Audit 5D conformité (push) Has been cancelled
CI / SEO · mots-clés trilingues + schema.org + hreflang (push) Has been cancelled
CI / Chat OTOIA · montage par portail (Custom Block) (push) Has been cancelled
CI / QA · Audit 4Big (95+/100 sur 100% deliverables) (push) Has been cancelled
CI / Démo · Scénarios (run-sheet P07 banquier / P05 client) (push) Has been cancelled
CI / QA · Matrice de régression exhaustive (Sprint 8) (push) Has been cancelled
CI / DevOps · Run-book de déploiement VPS unifié (Sprint 8) (push) Has been cancelled
CI / QA · Matrice d'acceptation / traçabilité MVP (Sprint 8) (push) Has been cancelled
CI / Mobile · config app Expo/EAS (navigation par rôle) (push) Has been cancelled
CI / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled
This commit is contained in:
@@ -12,6 +12,8 @@ en :
|
||||
identifiants de store `null` · a_confirmer)
|
||||
- eas_build.json -> objet `eas.json` (profils build/submit, credentials `null`)
|
||||
- role_navigation.json -> 1 onglet par portail, gated par la surface RBAC exacte
|
||||
- store_listing.json -> fiche store FR/EN/ES (sous-titre, descriptions, mots-clés)
|
||||
dérivée : portails/langues injectés depuis les sources (#6)
|
||||
- MANIFEST.json -> traçabilité (comptes, résumé par portail, marque, a_confirmer)
|
||||
|
||||
Sous-commandes :
|
||||
@@ -179,7 +181,44 @@ def _validate_bundle(bundle: dict) -> list[str]:
|
||||
if c.get(k) != v:
|
||||
errors.append(f"counts.{k} incohérent ({c.get(k)} != {v}).")
|
||||
|
||||
# Invariant 12 · déterminisme : deux builds successifs identiques.
|
||||
# Invariant 12 · fiche store : couvre EXACTEMENT les langues seo (aucune inventée).
|
||||
sl = bundle["store_listing"]
|
||||
sl_spec = spec["store_listing"]
|
||||
if sorted(sl["content"].keys()) != sorted(langs):
|
||||
errors.append("store_listing.content != langues seo (FR/EN/ES).")
|
||||
if sl["langues"] != list(langs):
|
||||
errors.append("store_listing.langues != langues seo.")
|
||||
if sl["limits"] != sl_spec["limits"]:
|
||||
errors.append("store_listing.limits != spec.store_listing.limits.")
|
||||
|
||||
# Invariant 13 · chaque champ de fiche respecte sa limite de caractères store
|
||||
# (App Store / Play — voir limits_source) et n'est jamais vide.
|
||||
for lang, fields in sl["content"].items():
|
||||
for champ, limit in sl_spec["limits"].items():
|
||||
val = fields.get(champ)
|
||||
if not val:
|
||||
errors.append(f"store_listing[{lang}].{champ} vide/absent.")
|
||||
elif len(val) > limit:
|
||||
errors.append(
|
||||
f"store_listing[{lang}].{champ} dépasse la limite store {limit} "
|
||||
f"caractères (={len(val)})."
|
||||
)
|
||||
|
||||
# Invariant 14 · ANTI-DÉRIVE : l'énumération des portails et les langues injectées
|
||||
# dans chaque description longue == la surface RÉELLE (labels role_navigation ·
|
||||
# langues seo) — la copie marketing ne peut pas mentir sur les portails/langues.
|
||||
portails_str = " · ".join(n["label"] for n in nav)
|
||||
langues_str = "/".join(lang.upper() for lang in langs)
|
||||
for lang, fields in sl["content"].items():
|
||||
full = fields.get("full_description", "")
|
||||
if portails_str not in full:
|
||||
errors.append(f"store_listing[{lang}].full_description n'injecte pas les portails réels.")
|
||||
if langues_str not in full:
|
||||
errors.append(f"store_listing[{lang}].full_description n'injecte pas les langues réelles.")
|
||||
if "{" in full or "}" in full:
|
||||
errors.append(f"store_listing[{lang}].full_description : placeholder non substitué.")
|
||||
|
||||
# Invariant 15 · déterminisme : deux builds successifs identiques.
|
||||
again = _build_bundle()
|
||||
if json.dumps(again, sort_keys=True, ensure_ascii=False) != json.dumps(bundle, sort_keys=True, ensure_ascii=False):
|
||||
errors.append("build non déterministe (deux passes divergent).")
|
||||
@@ -201,6 +240,7 @@ def cmd_build(args: argparse.Namespace) -> int:
|
||||
_write_json(os.path.join(out, "app_config.json"), bundle["app_config"])
|
||||
_write_json(os.path.join(out, "eas_build.json"), bundle["eas_build"])
|
||||
_write_json(os.path.join(out, "role_navigation.json"), bundle["role_navigation"])
|
||||
_write_json(os.path.join(out, "store_listing.json"), bundle["store_listing"])
|
||||
_write_json(os.path.join(out, "MANIFEST.json"), bundle["manifest"])
|
||||
|
||||
c = bundle["manifest"]["counts"]
|
||||
@@ -225,7 +265,7 @@ def cmd_validate(args: argparse.Namespace) -> int:
|
||||
c = bundle["manifest"]["counts"]
|
||||
print(
|
||||
f"✅ Validation OK — {c['onglets']} onglets, {c['roles_couverts']} rôles, "
|
||||
f"schéma + 12 invariants verts (identifiants a_confirmer)."
|
||||
f"schéma + 15 invariants verts (identifiants a_confirmer · fiche store dérivée)."
|
||||
)
|
||||
return 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user