[DTP-Worker] Sprint 8 · buffer · DevOps/deploy_runbook : IMPUTABILITÉ des CONFIRMATIONS préalables VPS (owner · réf-contrôle) ancrée sur out/deploy_runbook.json ⨯ qa/audit_5d
La ligne « Confirmations préalables VPS » du README `devops/deploy_runbook` annote CHAQUE confirmation réglementaire d'un COUPLE data-derived `nom` (OWNER · RÉF-CONTRÔLE) — ex. `taux_commission` (Direction · audit_5d D1.1) : QUI doit confirmer le paramètre avant déploiement + QUEL contrôle qa/audit_5d le trace. Sources faisant autorité (double, byte-gatées) : les `confirmations` de out/deploy_runbook.json (owner + source) CROISÉES avec qa/audit_5d/out/audit_report.json (chaque control D#.# porte son propre owner). Les blocs DevOps amont ne gataient que le COMPTE (2) et l'ENSEMBLE des noms — AVEUGLES à QUI porte chaque confirmation et à QUEL contrôle la trace. Piège #6 : réaffecter `taux_commission` de Direction à Ventes (mauvais responsable escaladé), misattribuer le contrôle (D1.1→D2.1) ou citer un contrôle FANTÔME (D9.9) laisse la prose périmée en silence pendant que l'artefact/l'audit disent autre chose → l'agent DevOps escaladerait le mauvais owner / contrôle ; aucune suite tests/ (FONCTIONS de graphe) n'attrape ce « vert trompeur ». État courant : aucune annotation périmée (anti-invention #6), le défaut est la surface ungated. Gate ajouté (ci/check_readme_claims.sh, bloc « 2ter ») : cross-anchor à trois — owner run-book ⊆ owner du contrôle audit_5d cité (tolère le suffixe « / UAF ») · owner README ⊆ owner run-book (tolère l'abréviation « Fiscaliste eCF » ⊂ « Compta Fiscaliste eCF ») · réf README == contrôle réel présent DANS audit_5d ET dans la source. Une confirmation tracée DOIT rester annotée (traçabilité #6) ; une annotation d'un nom fantôme échoue AUSSI. 9 morsures vérifiées (README réaffecte owner · misattribue D1.1→D2.1 · contrôle fantôme D9.9 · annotation retirée · artefact réaffecte owner = silent green · audit_5d owner divergent · source cite contrôle fantôme · annotation nom fantôme · réf textuelle absente de la source), restauré vert, 7 gates re-verts. ci/README.md (récap + paragraphe « 3ᵉ surface deploy_runbook — imputabilité des confirmations ») mis à jour. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -937,3 +937,77 @@ check_regression).
|
|||||||
**Vérif** : 13 confirmations vertes (9 noms + set codes + listings schema.org + MANIFEST + README) ; **7 morsures vérifiées puis restaurées** — CLAUDE.md rename P07 (bite b+d simultanés, l'ancre est vive) · fixture nom drift P03 · fixture drop P09 (set manquant) · fixture add fantôme P10 (set fantôme) · fixture strip `source.fichiers` P01 · artefact schema.org rename `Structure`→`Estructura` (le vrai silent-green public) · README retire la citation §Projets. Restauré vert. **7 gates CI re-verts** (`check_readme_claims`, `check_artifacts`, `check_docs`, `check_ci_integrity`, `guard_constraints`, `check_regression`, `validate_json`).
|
**Vérif** : 13 confirmations vertes (9 noms + set codes + listings schema.org + MANIFEST + README) ; **7 morsures vérifiées puis restaurées** — CLAUDE.md rename P07 (bite b+d simultanés, l'ancre est vive) · fixture nom drift P03 · fixture drop P09 (set manquant) · fixture add fantôme P10 (set fantôme) · fixture strip `source.fichiers` P01 · artefact schema.org rename `Structure`→`Estructura` (le vrai silent-green public) · README retire la citation §Projets. Restauré vert. **7 gates CI re-verts** (`check_readme_claims`, `check_artifacts`, `check_docs`, `check_ci_integrity`, `guard_constraints`, `check_regression`, `validate_json`).
|
||||||
|
|
||||||
- **Auto-score 4Big** : 96/100.
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|
||||||
|
## Session `20260801_083254` · Buffer S8 · DevOps/deploy_runbook — IMPUTABILITÉ des CONFIRMATIONS préalables VPS (owner + réf-contrôle) ancrée sur out/deploy_runbook.json ⨯ qa/audit_5d
|
||||||
|
|
||||||
|
**Domaine** : DevOps · `05_deliverables_mvp/devops/deploy_runbook/README.md:55-58`
|
||||||
|
(ligne « Confirmations préalables VPS ») ⨯ `out/deploy_runbook.json` (byte-gaté) ⨯
|
||||||
|
`05_deliverables_mvp/qa/audit_5d/out/audit_report.json` (byte-gaté).
|
||||||
|
|
||||||
|
**Tâche** : **Sprint 8 · buffer** (DevOps CI/CD · QA). Roadmap fonctionnellement
|
||||||
|
close ; poursuite de la série anti-dérive (CLAUDE.md #6). Même classe de « vert
|
||||||
|
trompeur » que la table run-book (2e surface `deploy_runbook`) ou l'identité du RÔLE
|
||||||
|
émetteur e-CF — appliquée à une **3e surface distincte du MÊME README `deploy_runbook`** :
|
||||||
|
non plus le COMPTE de confirmations ni l'ENSEMBLE de leurs noms (déjà gatés), mais
|
||||||
|
l'**imputabilité** de chacune — QUI la porte et QUEL contrôle audit_5d la trace.
|
||||||
|
|
||||||
|
**Dérive silencieuse fermée** :
|
||||||
|
- `devops/deploy_runbook/README.md:55-58` — la ligne « Confirmations préalables VPS »
|
||||||
|
annote CHAQUE confirmation réglementaire d'un COUPLE data-derived
|
||||||
|
`nom` (**owner** · **réf-contrôle**) : `taux_commission` (Direction · audit_5d D1.1) ·
|
||||||
|
`rnc_emisor` (Compta · D1.2) · `itbis_tipocambio` (Fiscaliste eCF · D1.3) ·
|
||||||
|
`seuil_uaf` (Oficial de Cumplimiento · D2.3) · `endpoint_otoia` (ERPNext Backend ·
|
||||||
|
session 19). L'OWNER = qui doit confirmer le paramètre avant déploiement ; la RÉF =
|
||||||
|
le contrôle qa/audit_5d (`D#.#`) — ou la session — qui en assure le suivi.
|
||||||
|
- Sources faisant autorité (double, byte-gatées par `check_artifacts`) : (a) les
|
||||||
|
`confirmations` de `out/deploy_runbook.json` — chaque item porte `owner` + `source` ;
|
||||||
|
(b) `qa/audit_5d/out/audit_report.json` — chaque `control` (`D1.1`..`D5.3`) porte
|
||||||
|
SON PROPRE `owner`. L'owner et le contrôle ne vivent PAS dans le MANIFEST
|
||||||
|
(`confirmations_ouvertes` n'est qu'une liste de NOMS) : ils ne sont vérifiables que
|
||||||
|
contre ces deux artefacts croisés.
|
||||||
|
- Piège #6 : les blocs DevOps amont ne gatent que le COMPTE (2) et l'ENSEMBLE des
|
||||||
|
noms — AVEUGLES à QUI porte chaque confirmation et à QUEL contrôle la trace.
|
||||||
|
RÉAFFECTER `taux_commission` de Direction à Ventes (mauvais responsable escaladé →
|
||||||
|
confirmation jamais obtenue · séparation des pouvoirs cassée), MISATTRIBUER le
|
||||||
|
contrôle (`D1.1`→`D2.1`, pointant un contrôle qui ne trace PAS ce paramètre) ou
|
||||||
|
citer un contrôle FANTÔME (`D9.9`, absent d'audit_5d) laisse la prose périmée EN
|
||||||
|
SILENCE pendant que l'artefact/l'audit disent autre chose → l'agent DevOps
|
||||||
|
escaladerait le mauvais owner / le mauvais contrôle. Aucune suite `tests/`
|
||||||
|
(FONCTIONS de graphe) n'attrape ce « vert trompeur ».
|
||||||
|
- **État courant** : aucune annotation périmée — les 5 couples owner/réf recoupent
|
||||||
|
`deploy_runbook.json`, et les 4 réf `D#.#` existent dans audit_5d avec un owner
|
||||||
|
compatible (`Oficial de Cumplimiento` ⊆ `Oficial de Cumplimiento / UAF`, `Fiscaliste
|
||||||
|
eCF` ⊂ `Compta Fiscaliste eCF`) (anti-invention #6, rien à réécrire). Le défaut est
|
||||||
|
la **surface ungated**.
|
||||||
|
|
||||||
|
**Gate ajouté** (`ci/check_readme_claims.sh`, bloc « 2ter) deploy_runbook —
|
||||||
|
IMPUTABILITÉ des CONFIRMATIONS » après le bloc table de phases) : confirmations
|
||||||
|
aplaties de `deploy_runbook.json` (unicité inter-phases), contrôle audit_5d résolu de
|
||||||
|
la `source` (`D#.#`), annotations README parsées `nom` (owner · réf), puis **(a)**
|
||||||
|
cross-module — chaque confirmation tracée porte un contrôle audit_5d RÉEL dont l'owner
|
||||||
|
est COMPATIBLE avec l'owner run-book (sous-ensemble de tokens · tolère « / UAF ») ET
|
||||||
|
elle reste ANNOTÉE au README ; **(b)** chaque annotation désigne une confirmation
|
||||||
|
RÉELLE (pas fantôme), owner README ⊆ owner run-book (tolère l'abréviation), et la réf
|
||||||
|
== contrôle réel (présent audit_5d + source) ou, pour une réf textuelle
|
||||||
|
(« session 19 »), présente dans la source. Un claim absent échoue AUSSI (traçabilité #6).
|
||||||
|
|
||||||
|
**9 morsures vérifiées** (4 côté README · 3 côté artefact · 2 réf) : README réaffecte
|
||||||
|
owner `Direction→Ventes` (mauvais responsable) · README misattribue `D1.1→D2.1`
|
||||||
|
(contrôle périmé vs source) · README cite contrôle fantôme `D9.9` · README retire
|
||||||
|
l'annotation de `taux_commission` (tracée par D1.1, INTROUVABLE) · **artefact**
|
||||||
|
réaffecte `taux_commission` owner→Ventes (README stale = le vrai *silent green* · mord
|
||||||
|
cross-module ET README⊆) · **artefact** audit_5d D1.1 owner `Direction→Finanzas`
|
||||||
|
(divergence inter-modules) · **artefact** source `seuil_uaf` `D2.3→D9.9` (contrôle
|
||||||
|
FANTÔME cité par la source) · README annotation fantôme (`endpoint_otoia→endpoint_xxx`) ·
|
||||||
|
README réf textuelle `session 19→session 42` (absente de la source) ; restauré = green :
|
||||||
|
5 couples owner/réf == artefacts croisés · 4 réf `D#.#` présentes audit_5d + source ·
|
||||||
|
exit 0. Working tree byte-restauré (`git checkout --`, **JAMAIS** `git clean`, interdit
|
||||||
|
absolu) · **7 gates re-verts** (`check_readme_claims`/`check_ci_integrity`/`check_docs`/
|
||||||
|
`guard_constraints`/`check_artifacts`/`check_regression`/`validate_json`).
|
||||||
|
|
||||||
|
- `ci/README.md` (clause de la table récap du pipeline + paragraphe détaillé « 3ᵉ
|
||||||
|
surface `devops/deploy_runbook` — imputabilité des confirmations ») mis à jour.
|
||||||
|
- **Hors périmètre worker (VPS · #8)** : néant (gate bash/python3 stdlib en-repo ;
|
||||||
|
édition **hors** `05_deliverables_mvp/*/out` ⇒ 0 dérive d'artefact ; l'obtention
|
||||||
|
réelle des 7 confirmations auprès de leurs owners reste côté agent DevOps / VPS).
|
||||||
|
- **Auto-score 4Big** : 96/100.
|
||||||
|
|||||||
+22
-1
File diff suppressed because one or more lines are too long
@@ -1803,6 +1803,120 @@ if dr_plan is not None:
|
|||||||
bad(f"DevOps · phase {o} — {DR_RD} « Dépend de » = {got_deps or '—'} MAIS "
|
bad(f"DevOps · phase {o} — {DR_RD} « Dépend de » = {got_deps or '—'} MAIS "
|
||||||
f"artefact dit {deps or '—'} → régénérer le README")
|
f"artefact dit {deps or '—'} → régénérer le README")
|
||||||
|
|
||||||
|
# 2ter) deploy_runbook — IMPUTABILITÉ des CONFIRMATIONS préalables VPS ------------
|
||||||
|
# La ligne « Confirmations préalables VPS » du README annote CHAQUE confirmation
|
||||||
|
# réglementaire d'un COUPLE data-derived : `nom` (OWNER · RÉF-CONTRÔLE), ex.
|
||||||
|
# `taux_commission` (Direction · audit_5d D1.1). L'OWNER = QUI doit confirmer le
|
||||||
|
# paramètre avant déploiement ; la RÉF = le contrôle qa/audit_5d (`D#.#`) — ou la
|
||||||
|
# session — qui en assure le suivi. Source faisant autorité : les `confirmations`
|
||||||
|
# de out/deploy_runbook.json (byte-gaté) — chaque item porte `owner` + `source` —
|
||||||
|
# CROISÉES avec le rapport qa/audit_5d (byte-gaté) : le contrôle cité y porte SON
|
||||||
|
# PROPRE `owner`. Les blocs DevOps amont ne gatent que le COMPTE de confirmations
|
||||||
|
# (2) et l'ENSEMBLE de leurs noms (bloc énumération) — AVEUGLES à QUI porte chaque
|
||||||
|
# confirmation et à QUEL contrôle la trace. Piège #6 : RÉAFFECTER `taux_commission`
|
||||||
|
# de Direction à Ventes (mauvais responsable relancé → confirmation jamais obtenue),
|
||||||
|
# MISATTRIBUER le contrôle (`D1.1`→`D2.1`, pointant un contrôle qui ne trace PAS ce
|
||||||
|
# paramètre) ou citer un contrôle FANTÔME (`D9.9`, absent d'audit_5d) laisse la
|
||||||
|
# prose périmée EN SILENCE pendant que l'artefact/l'audit disent autre chose →
|
||||||
|
# l'agent DevOps escaladerait le mauvais owner / le mauvais contrôle. La table
|
||||||
|
# phases (2bis) est aveugle aux confirmations ; aucune suite tests/ (FONCTIONS de
|
||||||
|
# graphe) n'attrape la prose. Cross-anchor à 3 : owner runbook COMPATIBLE avec
|
||||||
|
# owner du contrôle audit_5d (sous-ensemble de tokens · tolère le suffixe éditorial
|
||||||
|
# « / UAF ») · owner README ⊆ owner runbook (tolère l'abréviation « Fiscaliste eCF »
|
||||||
|
# ⊂ « Compta Fiscaliste eCF ») · réf README == contrôle réel (présent dans audit_5d
|
||||||
|
# ET dans la source). Une confirmation tracée par un contrôle DOIT rester annotée
|
||||||
|
# (disparition = régression de traçabilité #6). Une annotation d'un nom FANTÔME
|
||||||
|
# échoue AUSSI.
|
||||||
|
try:
|
||||||
|
a5_rep = load("qa/audit_5d/out/audit_report.json")
|
||||||
|
a5_owner = {c["id"]: c["owner"] for c in a5_rep["controls"]}
|
||||||
|
except (OSError, KeyError, ValueError) as e:
|
||||||
|
bad(f"DevOps · confirmations — rapport audit_5d illisible : {e}"); a5_owner = None
|
||||||
|
dr_rd2 = read_norm(DR_RD)
|
||||||
|
if dr_plan is not None and a5_owner is not None and dr_rd2 is not None:
|
||||||
|
def _toks(s):
|
||||||
|
return {t for t in re.split(r"\s+", s.strip()) if t}
|
||||||
|
def _ctrl(s):
|
||||||
|
m = re.search(r"D\d\.\d+", s)
|
||||||
|
return m.group(0) if m else None
|
||||||
|
# confirmations aplaties (id → item) + unicité inter-phases
|
||||||
|
conf_by_id, dups = {}, []
|
||||||
|
for p in dr_plan:
|
||||||
|
for c in p.get("confirmations", []):
|
||||||
|
if c["id"] in conf_by_id:
|
||||||
|
dups.append(c["id"])
|
||||||
|
conf_by_id[c["id"]] = c
|
||||||
|
if dups:
|
||||||
|
bad(f"DevOps · confirmations — id(s) DUPLIQUÉ(s) inter-phases "
|
||||||
|
f"{sorted(set(dups))} (plan incohérent)")
|
||||||
|
# tracked : confirmations dont la `source` cite un contrôle audit_5d `D#.#`
|
||||||
|
tracked = {cid: _ctrl(c["source"]) for cid, c in conf_by_id.items()}
|
||||||
|
# annotations README : `nom` (owner · réf)
|
||||||
|
ann = {}
|
||||||
|
seg = re.search(r"Confirmations préalables VPS\*\* \(consolidées, sourcées\) : "
|
||||||
|
r"(.+?) ## ", dr_rd2)
|
||||||
|
if seg is None:
|
||||||
|
bad(f"DevOps · {DR_RD} — ligne « Confirmations préalables VPS » INTROUVABLE "
|
||||||
|
f"(imputabilité non vérifiable)")
|
||||||
|
else:
|
||||||
|
for name, body in re.findall(r"`([a-z_]+)`\s*\(([^)]+)\)", seg.group(1)):
|
||||||
|
parts = [x.strip() for x in body.split("·")]
|
||||||
|
if len(parts) == 2:
|
||||||
|
ann[name] = {"owner": parts[0], "ref": parts[1]}
|
||||||
|
# (a) cross-module : chaque confirmation tracée porte un contrôle audit_5d RÉEL
|
||||||
|
# dont l'owner est COMPATIBLE avec l'owner du run-book (séparation des
|
||||||
|
# pouvoirs cohérente entre modules).
|
||||||
|
for cid, ctrl in sorted(tracked.items()):
|
||||||
|
if ctrl is None:
|
||||||
|
continue
|
||||||
|
c = conf_by_id[cid]
|
||||||
|
if ctrl not in a5_owner:
|
||||||
|
bad(f"DevOps · confirmation `{cid}` — source cite le contrôle `{ctrl}` "
|
||||||
|
f"ABSENT du rapport qa/audit_5d (contrôle FANTÔME)"); continue
|
||||||
|
if not _toks(c["owner"]) <= _toks(a5_owner[ctrl]):
|
||||||
|
bad(f"DevOps · confirmation `{cid}` — owner run-book « {c['owner']} » "
|
||||||
|
f"INCOMPATIBLE avec owner du contrôle {ctrl} audit_5d "
|
||||||
|
f"« {a5_owner[ctrl]} » (imputabilité divergente inter-modules)")
|
||||||
|
else:
|
||||||
|
good(f"DevOps · confirmation `{cid}` — owner « {c['owner']} » ⊆ owner "
|
||||||
|
f"contrôle {ctrl} audit_5d (imputabilité cohérente)")
|
||||||
|
if cid not in ann:
|
||||||
|
bad(f"DevOps · confirmation `{cid}` (tracée par {ctrl}) — annotation "
|
||||||
|
f"« (owner · réf) » INTROUVABLE dans {DR_RD} → régénérer le README")
|
||||||
|
# (b) chaque annotation README désigne une confirmation RÉELLE + owner/réf exacts
|
||||||
|
for cid, a in sorted(ann.items()):
|
||||||
|
c = conf_by_id.get(cid)
|
||||||
|
if c is None:
|
||||||
|
bad(f"DevOps · annotation README `{cid}` — confirmation FANTÔME "
|
||||||
|
f"(absente du run-book) → régénérer le README"); continue
|
||||||
|
if not _toks(a["owner"]) <= _toks(c["owner"]):
|
||||||
|
bad(f"DevOps · confirmation `{cid}` — README owner « {a['owner']} » "
|
||||||
|
f"n'est PAS un sous-ensemble de l'owner artefact « {c['owner']} » "
|
||||||
|
f"→ mauvais responsable")
|
||||||
|
else:
|
||||||
|
good(f"DevOps · confirmation `{cid}` — README owner « {a['owner']} » ⊆ "
|
||||||
|
f"artefact « {c['owner']} »")
|
||||||
|
ref_ctrl = _ctrl(a["ref"])
|
||||||
|
if ref_ctrl is not None:
|
||||||
|
# réf = contrôle audit_5d : doit == le contrôle de la source ET exister
|
||||||
|
if ref_ctrl != tracked.get(cid):
|
||||||
|
bad(f"DevOps · confirmation `{cid}` — README réf cite {ref_ctrl} MAIS "
|
||||||
|
f"la source artefact trace {tracked.get(cid) or '(aucun contrôle)'} "
|
||||||
|
f"→ contrôle audit_5d périmé")
|
||||||
|
elif ref_ctrl not in a5_owner:
|
||||||
|
bad(f"DevOps · confirmation `{cid}` — README réf cite le contrôle "
|
||||||
|
f"`{ref_ctrl}` ABSENT du rapport qa/audit_5d (fantôme)")
|
||||||
|
else:
|
||||||
|
good(f"DevOps · confirmation `{cid}` — réf README == contrôle "
|
||||||
|
f"{ref_ctrl} (présent audit_5d + source)")
|
||||||
|
else:
|
||||||
|
# réf textuelle (ex. « session 19 ») : doit apparaître dans la source
|
||||||
|
if a["ref"] not in c["source"]:
|
||||||
|
bad(f"DevOps · confirmation `{cid}` — README réf « {a['ref']} » ABSENTE "
|
||||||
|
f"de la source artefact « {c['source']} »")
|
||||||
|
else:
|
||||||
|
good(f"DevOps · confirmation `{cid}` — réf « {a['ref']} » == source artefact")
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Démo · run-sheet de pitch (nombre de modules cités) — même classe de « vert
|
# Démo · run-sheet de pitch (nombre de modules cités) — même classe de « vert
|
||||||
# trompeur », transcrit À LA MAIN dans le diagramme d'architecture du README du
|
# trompeur », transcrit À LA MAIN dans le diagramme d'architecture du README du
|
||||||
|
|||||||
Reference in New Issue
Block a user