[DTP-Worker 20260730_085719] Auto exec · session 20260730_085719
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 / 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 / E2E baseline Playwright (manuel) (push) Has been cancelled
CI / Gate qualité (agrégat) (push) Has been cancelled

This commit is contained in:
Claude Code DTP Worker
2026-07-30 09:12:19 +00:00
parent c06e15c058
commit 0d3b2420c3
20 changed files with 5082 additions and 1 deletions
+120
View File
@@ -0,0 +1,120 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://oto.dtp/schemas/seo/seo.schema.json",
"title": "Contrat de sortie du generateur SEO (bundle keywords + schema.org + hreflang)",
"description": "Valide par le validateur maison Publiciste (draft-07, sous-ensemble). La cross-coherence fine (sources resolubles, anti-invention, mapping projets) est verifiee par les invariants de seo_gen.py.",
"type": "object",
"required": ["keywords", "schema_org", "hreflang", "manifest"],
"additionalProperties": false,
"properties": {
"keywords": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["term", "lang", "scope", "projet", "intent", "category", "sources"],
"additionalProperties": false,
"properties": {
"term": { "type": "string", "minLength": 1 },
"lang": { "type": "string", "enum": ["fr", "en", "es"] },
"scope": { "type": "string", "enum": ["global", "projet"] },
"projet": { "type": ["string", "null"] },
"intent": { "type": ["string", "null"] },
"category": { "type": ["string", "null"] },
"sources": {
"type": "array",
"minItems": 1,
"items": { "type": "string", "minLength": 1 }
}
}
}
},
"schema_org": {
"type": "object",
"required": ["@context", "@graph"],
"additionalProperties": false,
"properties": {
"@context": { "type": "string", "const": "https://schema.org" },
"@graph": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["@type", "@id"],
"additionalProperties": true,
"properties": {
"@type": { "type": "string", "minLength": 1 },
"@id": { "type": "string", "pattern": "^https://" }
}
}
}
}
},
"hreflang": {
"type": "object",
"required": ["base_url", "x_default_lang", "pages"],
"additionalProperties": false,
"properties": {
"base_url": { "type": "string", "pattern": "^https://" },
"x_default_lang": { "type": "string", "minLength": 1 },
"pages": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["page", "canonical", "alternates"],
"additionalProperties": false,
"properties": {
"page": { "type": "string", "minLength": 1 },
"canonical": { "type": "string", "pattern": "^https://" },
"alternates": {
"type": "array",
"minItems": 2,
"items": {
"type": "object",
"required": ["hreflang", "href"],
"additionalProperties": false,
"properties": {
"hreflang": { "type": "string", "minLength": 1 },
"href": { "type": "string", "pattern": "^https://" }
}
}
}
}
}
}
}
},
"manifest": {
"type": "object",
"required": ["deliverable", "base_url", "langs", "default_lang", "counts", "targets"],
"additionalProperties": true,
"properties": {
"deliverable": { "type": "string", "const": "seo" },
"base_url": { "type": "string", "pattern": "^https://" },
"langs": { "type": "array", "minItems": 1, "items": { "type": "string" } },
"default_lang": { "type": "string", "minLength": 1 },
"counts": {
"type": "object",
"required": ["keywords_total", "schema_org_nodes", "hreflang_pages", "projects"],
"additionalProperties": true,
"properties": {
"keywords_total": { "type": "integer", "minimum": 0 },
"schema_org_nodes": { "type": "integer", "minimum": 0 },
"hreflang_pages": { "type": "integer", "minimum": 0 },
"projects": { "type": "integer", "minimum": 0 }
}
},
"targets": {
"type": "object",
"required": ["min_keywords_total", "min_keywords_per_lang"],
"additionalProperties": false,
"properties": {
"min_keywords_total": { "type": "integer", "minimum": 0 },
"min_keywords_per_lang": { "type": "integer", "minimum": 0 }
}
}
}
}
}
}