Compare commits
14 Commits
f954cc19d1
...
7e4456eb5b
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e4456eb5b | |||
| df8fa60415 | |||
| 358a95d904 | |||
| 1c3bed3f42 | |||
| 56a8802ff6 | |||
| 16db05af20 | |||
| 828fa838e0 | |||
| eae37875cb | |||
| 12c784c5d9 | |||
| a2c2e0b097 | |||
| b3f131e1c7 | |||
| 0e76411459 | |||
| 8a0806548b | |||
| 7c79e4302a |
@@ -1,5 +1,45 @@
|
||||
# Activity log · 2026-08-02 · Claude Code DTP Worker
|
||||
|
||||
## Session `20260802_193605` · Sprint 8 · buffer · Faux-positif d'audit récurrent documenté en garde-fou in-repo (`ci/README.md`) : `michel/otov7-platform` (CLAUDE.md #2 · dépôt PRODUIT) ≠ `oto-enterprise-os-dtp` (dépôt MANDAT) → prévention d'une « correction » nuisible de la constitution (PAS un gate #5, PAS un module)
|
||||
|
||||
**Nature — verrouiller une non-dérive contre une future « correction » nuisible, pas empiler un gate.**
|
||||
Ouverture : arbre `git status --porcelain` **vide**, `run_ci.sh` **30 PASS / 0 FAIL / 0 SKIP**
|
||||
(7 gates `ci/*.sh` + 23 suites module). Recompute indépendant des agrégats du README racine,
|
||||
concordant : **22/22** qualité (scores = `{100}`) · **564/564** régression · **15/15** recette
|
||||
(verdict `true`) · **13** agents · `gate.needs` = **30** — **zéro dérive numérique**.
|
||||
|
||||
**Audit doc-vs-réalité (fan-out d'exploration).** Balayage des `*.md` de tête (README, CLAUDE.md,
|
||||
AGENTS_EXISTING_ASSETS, PORTAIL_BANCABLES), `02_master_prompt/`, `03_agents/*/AGENT.md`,
|
||||
`05_deliverables_mvp/*/README.md`, `ci/README.md`, `04_roadmap/`. **Une seule** candidate
|
||||
remontée : CLAUDE.md ligne 16 (#2) nomme `michel/otov7-platform` là où la section *Git* (l.62)
|
||||
et le README racine nomment `michel/oto-enterprise-os-dtp` — apparence de coquille contradictoire.
|
||||
|
||||
**Verdict : FAUX POSITIF connu** (mémoire *otov7-platform-not-drift*). Ce sont **deux dépôts
|
||||
Gitea distincts, tous deux corrects** : `otov7-platform` = dépôt du **produit** (plateforme OTOV7
|
||||
en construction, cible du refactoring) ; `oto-enterprise-os-dtp` = dépôt de **mandat** (ce worker).
|
||||
La contrainte #2 verrouille le produit ; la section *Git* précise où vit le mandat. « Aligner »
|
||||
#2 sur le nom du mandat **corromprait la constitution**. L'agent d'exploration (sans accès à ma
|
||||
mémoire) l'a re-remonté cette session — preuve que le garde-fou méritait d'être **in-repo**, pas
|
||||
seulement dans ma mémoire privée.
|
||||
|
||||
**Action — garde-fou documenté, à la manière de la « Non-surface documentée » existante.**
|
||||
Ajout d'un paragraphe **« Non-dérive documentée »** dans la section `guard_constraints.sh` de
|
||||
`ci/README.md` (propriétaire de la contrainte #2), calqué sur la note `roles_couverts` (« 44 »
|
||||
non cross-gaté). Il explicite : produit ≠ mandat, ne pas « corriger » CLAUDE.md #2, et pourquoi
|
||||
il n'y a **rien à gater** (le garde ne vérifie que l'**absence** de plateformes interdites
|
||||
github/gitlab/bitbucket, pas l'identité d'un repo Gitea autorisé). **CLAUDE.md non touché.**
|
||||
|
||||
**Discipline (#5/#6).** **Zéro nouveau module · zéro gate ajouté** — pure documentation d'une
|
||||
non-dérive, dans le fichier qui héberge déjà ce type de garde-fou. **CLAUDE.md intact** (on ne
|
||||
« corrige » pas la constitution). Le nouveau texte cite github/gitlab/bitbucket mais chaque
|
||||
occurrence est sur une ligne portant un marqueur de prohibition (« interdites ») → **ignorée**
|
||||
par `guard_constraints` (vérifié vert). `check_docs` (liens) + `check_readme_claims` verts.
|
||||
|
||||
**Clôture.** `run_ci.sh --static` → **7 PASS / 0 FAIL / 0 SKIP**. Aucune commande touchant au
|
||||
VPS (`153.75.250.214` · #8). Prochaine tâche : buffer Sprint 8 toujours en **veille saturée**
|
||||
(fiches 13/13 closes, gates saturés) — ne durcir un gate que si un blind-spot est **prouvé par
|
||||
mutation-test** (*verify-uncovered-before-gating*), jamais un gate redondant (#5).
|
||||
|
||||
## Session `20260802_183604` · Sprint 8 · buffer · Dérive doc-vs-réalité (README racine) : la ligne « Régression » affirmait `regression_run.json` « non commité par design » — FAUX depuis la refonte baseline byte-gatée (`76fb0e7`) → correction de vérité (PAS un gate #5, PAS un chiffre inventé #6)
|
||||
|
||||
**Nature — dérive réelle non gatée, corrigée par la vérité (pas un gate de plus).**
|
||||
@@ -1810,3 +1850,334 @@ complet mais avait **2 vraies aspérités d'UX**, reproduites avant correction :
|
||||
(30 jobs) · `check_docs` · `check_readme_claims` · `guard_constraints` verts ·
|
||||
`run_ci.sh` (plein) → **30 PASS · 0 FAIL · 0 SKIP**. Arbre propre avant édition.
|
||||
Aucune commande touchant au VPS.
|
||||
|
||||
## Session `20260802_190604` · Sprint 8 · buffer · QA — vérification launch-readiness : mutation-test que les 7 gates statiques MORDENT encore (7/7 RED, revert propre)
|
||||
|
||||
**Contexte.** Repo 100 % construit (`run_ci.sh` → 30 PASS · 0 FAIL) ; sprints 1→7
|
||||
livrés côté dépôt, phase buffer Sprint 8. Un audit doc-vs-réalité frais (top-level
|
||||
docs + 13 fiches `03_agents/*/AGENT.md` + `daily_reports` + roadmap) n'a trouvé
|
||||
**aucune dérive non gatée** — la surface driftable évidente est épuisée. Décision
|
||||
(#5 — ne pas empiler un gate N+1 redondant) : plutôt qu'inventer du travail, exécuter
|
||||
le livrable QA propre de Sprint 8 (« **Regression tests exhaustifs** ») sous l'angle
|
||||
le plus fort : **prouver que les gates existants attrapent réellement une régression**
|
||||
(un gate vert qui ne mord pas est pire qu'absent — cf. mémoire `verify-uncovered-before-gating`
|
||||
+ `guard-constraints-flags-usage-not-mention`).
|
||||
|
||||
**Méthode.** Pour chacun des 7 gates statiques `ci/*.sh`, injecter une mutation
|
||||
ciblée de la classe de dérive qu'il est censé traquer, exécuter le gate, exiger un
|
||||
**exit non-zéro** (RED), puis **revert par chemin ciblé** (jamais `git clean` — #interdits)
|
||||
et re-vérifier l'arbre à 0 fichier modifié.
|
||||
|
||||
| # | Gate | Mutation injectée | Résultat |
|
||||
|---|------|-------------------|----------|
|
||||
| 1 | `guard_constraints` | URL interdite `https://github.com/…` ajoutée à `README.md` | **RED** ✓ (`Interdit détecté — GitHub`) |
|
||||
| 2 | `check_ci_integrity` | retrait de `constraints-guard` de `gate.needs` (ci.yml) | **RED** ✓ (`ABSENT de gate.needs` + INV-B) |
|
||||
| 3 | `check_docs` | lien Markdown interne cassé `./this/does/not/exist.md` | **RED** ✓ (`lien cassé`) |
|
||||
| 4 | `check_readme_claims` | compte fiches `13`→`14` dans `README.md` | **RED** ✓ (`README dit 14 MAIS artefact dit 13`) |
|
||||
| 5 | `check_artifacts` | octet parasite ajouté à `crm/commissions/out/MANIFEST.json` | **RED** ✓ (`DÉRIVE … diffère du build frais`) |
|
||||
| 6 | `validate_json` | JSON syntaxiquement invalide dans un artefact commité | **RED** ✓ (exit 1) |
|
||||
| 7 | `check_regression` | `totals.passed` `564`→`565` dans `out/regression_run.json` | **RED** ✓ (`DÉRIVE : le run frais diffère du commité`) |
|
||||
|
||||
**Deux « faux verts » — analysés, PAS des trous de couverture :**
|
||||
- Mutation d'un `MANIFEST.json` de régression testée d'abord contre `check_regression`
|
||||
→ **vert** : normal, `check_regression` ne possède QUE `regression_run.json`
|
||||
(artefact de `run`, compteurs exécutés) ; le `MANIFEST.json` (artefact de `build`)
|
||||
est possédé par `check_artifacts` — mutation re-testée contre lui → **RED** ✓.
|
||||
**La frontière de propriété entre les deux gates est nette et correcte.**
|
||||
- Première tentative de mutation de `regression_run.json` inefficace (bump d'un `int`
|
||||
de premier niveau — or les compteurs sont **imbriqués** sous `totals`, aucun `int`
|
||||
racine) → rewrite byte-identique → vert légitime. Corrigée en mutant `totals.passed`
|
||||
(ligne 7 ci-dessus) → **RED** ✓.
|
||||
|
||||
**Conclusion.** **7/7 gates statiques MORDENT** sur leur classe de dérive respective,
|
||||
frontières de propriété inter-gates confirmées, **aucun trou de couverture**. Le
|
||||
verrou anti-régression de la plateforme est prouvé opérationnel pour le launch
|
||||
(pas seulement « vert par chance »). **Zéro nouveau module · zéro gate ajouté (#5) ·
|
||||
zéro fichier de production modifié** — travail de vérification pur, chaque mutation
|
||||
revert par chemin ciblé. Arbre final : `git status --short` → 0 ligne · `run_ci.sh`
|
||||
→ **30 PASS · 0 FAIL · 0 SKIP**. Aucune commande touchant au VPS.
|
||||
|
||||
---
|
||||
|
||||
## Session `20260802_200607` · Sprint 8 buffer · reporting canal 2 + audit doc-vs-réalité
|
||||
|
||||
**Contexte.** Relu CLAUDE.md, la roadmap (Sprint 8 · *Launch + Buffer*), MEMORY.md et le
|
||||
journal du jour. Tous les sprints 1→7 livrés côté repo ; `run_ci.sh` → **30 PASS · 0 FAIL ·
|
||||
0 SKIP** en entrée de session. Surface driftable évidente épuisée (fiches 13/13 closes,
|
||||
gates saturés + les 7 statiques prouvés mordants en `190604`).
|
||||
|
||||
**Décision (workflow #5 — ne pas empiler de gate redondant).** Plutôt qu'inventer un module
|
||||
ou un gate N+1, exécuter les deux tâches de veille légitimes du buffer saturé :
|
||||
|
||||
1. **Audit doc-vs-réalité (classe *prose-fact* non gatée).** Recompute `python3` indépendant
|
||||
des agrégats + sweep des faits-prose sur README racine, `ci/README.md`,
|
||||
`AGENTS_EXISTING_ASSETS.md`, `PORTAIL_BANCABLES_4BIG.md`, 13 fiches `03_agents/*/AGENT.md`
|
||||
et les READMEs module. **Résultat : aucune dérive** (chaque fait spot-checké contre l'état
|
||||
courant est exact). Agrégats confirmés : **22/22** qualité (scores = {100}) · **564/564**
|
||||
régression (`totals` suites 22) · **15/15** recette (`in_repo`, verdict `True`) · **13**
|
||||
fiches · `gate.needs` = **30** (7 gates + 23 suites).
|
||||
|
||||
2. **Reporting stakeholder (canal 2).** Le snapshot `daily_reports/2026-08-02.md` avait
|
||||
lapsé depuis le 4ᵉ addendum (`180604`, 18:06). Rattrapage des **3 sessions intercalées**
|
||||
(`183604` `97d3b64`+`f954cc1` · `190604` `7c79e43` · `193605` `8a08065`) → **5ᵉ addendum
|
||||
ADDITIF** (corps + 4 addenda intacts), chaque chiffre re-sourcé par recompute indépendant.
|
||||
|
||||
**Vérifications.** `run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** après édition ; `check_docs`,
|
||||
`check_readme_claims`, `guard_constraints` verts (seuls fichiers touchés = docs de reporting,
|
||||
hors périmètre des gates de code). **Zéro nouveau module · zéro gate ajouté (#5) · zéro
|
||||
fichier de production modifié.** Aucune commande touchant au VPS (#8).
|
||||
|
||||
---
|
||||
|
||||
## Session `20260802_203609` · Sprint 8 buffer · audit prose-fact ciblé + résolution faux-positif confotur
|
||||
|
||||
**Contexte.** Relu CLAUDE.md, la roadmap (Sprint 8 · *Launch + Buffer*), MEMORY.md et le
|
||||
journal du jour. Entrée de session : `run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** ;
|
||||
arbre `git status --short` → 0 ligne. Tous sprints 1→7 livrés. Aucun TODO/placeholder réel
|
||||
(les `placeholder` restants sont tous du design anti-invention #6, pas des trous).
|
||||
|
||||
**Décision (workflow #5 — ne pas empiler de gate/module).** Plutôt qu'un 6ᵉ addendum de
|
||||
reporting (canal 2 déjà à jour au `200607`), cibler la **classe *prose-fact* NON gatée** :
|
||||
faits libres (non-numériques) dans les README modules que CI ne vérifie pas. Fan-out lecture
|
||||
(agent Explore) sur tous les `05_deliverables_mvp/*/README.md` + sous-README, chaque
|
||||
affirmation factuelle spot-checkée contre le `.py`/`.json` du même module.
|
||||
|
||||
**Résultat : aucune dérive prose-fact.** Un seul candidat remonté par l'agent —
|
||||
`legal/confotur/README.md:58` « 44 tests (dont **8 négatifs**) » — **résolu en FAUX-POSITIF**
|
||||
avec preuve :
|
||||
- `TestNegative` (tests/test_confotur.py 242–296) = **exactement 8** `test_reject_*` → « 8 négatifs » exact.
|
||||
- `TestBuilderGuards` (297–324, 3 `assertRaises`) est une **classe distincte** (guard/raises),
|
||||
pas des « négatifs » ; l'agent les avait agrégés à tort (→ 11). Total `def test_` = **44** ✓.
|
||||
- Même README « 14 invariants » (56/82) confirmé : **14** entrées `# INVn ·` dans
|
||||
`confotur_application_gen.py`, alignées sur ses 4 auto-phrasings (compte CONFOTUR déjà gaté).
|
||||
|
||||
**Trace mémoire.** Nouveau guard-fou `confotur-8-negatifs-not-drift` (genre
|
||||
`fiche-accuracy-audit-closed` / `otov7-platform-not-drift`) : un audit test-count naïf
|
||||
re-flaggera « 8 négatifs » → vérifier les frontières de classe avant de « corriger ».
|
||||
|
||||
**Vérifications.** `run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**. **Zéro nouveau module ·
|
||||
zéro gate ajouté (#5) · zéro fichier de production modifié** — session de vérification pure
|
||||
(seul écrit repo = ce journal). Aucune commande touchant au VPS (#8).
|
||||
|
||||
---
|
||||
|
||||
## Session 20260802_210609 · Sprint 8 · buffer · Dérive doc-vs-CODE réelle corrigée (docstring de production)
|
||||
|
||||
**Contexte.** État stationnaire : `run_ci.sh` = 30/30 vert, roadmap S1–S8 livrée et
|
||||
gatée, reliquat roadmap (pipelines BIM/IFC/rendu Blender · déploiement VPS · soumissions
|
||||
stores) hors périmètre sandbox. Plutôt qu'un énième audit no-op, chasse ciblée d'un défaut
|
||||
**réel** dans un module de parsing (là où les cas limites mordent).
|
||||
|
||||
**Trouvaille (classe NOUVELLE, distincte des dérives README gatées).** Le docstring
|
||||
d'en-tête de `05_deliverables_mvp/publiciste/lib/parser.py` (bloc « Sources lues », l. 26)
|
||||
annonçait :
|
||||
|
||||
> `40_llm_outputs/commercial.md → positionnement FR (fallback prix §5.3)`
|
||||
|
||||
Or **aucun fallback de prix depuis `commercial.md` n'existe dans le code** : `commercial.md`
|
||||
n'alimente QUE `parse_positionnement_fr` (l. 275+, « 1er paragraphe non-titre »). Preuve :
|
||||
`grep -rniE "5\.3|fallback.*prix|prix.*fallback|commercial.*prix" lib/ publiciste.py` →
|
||||
**une seule** occurrence, le docstring lui-même. Le docstring décrivait donc un
|
||||
**comportement inventé qui n'a jamais été implémenté** — exactement l'anti-pattern que
|
||||
CLAUDE.md #6 (zéro invention) proscrit, transposé du côté documentation-du-code.
|
||||
|
||||
**Correction.** Reformulé en `→ positionnement FR (1er paragraphe non-titre)`, aligné mot
|
||||
pour mot sur la logique réelle de `parse_positionnement_fr`. **Docstring seul — zéro
|
||||
changement de logique, zéro changement de signature, zéro test touché.**
|
||||
|
||||
**Distinction de classe.** Ce n'est PAS une dérive de compte gatée (check_readme_claims)
|
||||
ni une dérive de prose README (check_docs) : c'est une inexactitude **dans le docstring du
|
||||
module de production**, surface non couverte par les gates existants et distincte des
|
||||
classes déjà cataloguées. Vérifié qu'aucun sibling (`README.md` publiciste, `AGENT.md`
|
||||
publiciste) ne répète la fausse allégation « fallback prix » → correction ponctuelle,
|
||||
source unique.
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé). **Zéro
|
||||
nouveau module · zéro gate ajouté (#5) · un seul fichier de production touché (docstring)**.
|
||||
Aucune commande VPS (#8). Commit `a2c2e0b`.
|
||||
|
||||
---
|
||||
|
||||
## Session 20260802_213610 · Sprint 8 · buffer · Dérive doc-vs-CODE réelle : docstring demo_scenario omettait un output produit
|
||||
|
||||
**Contexte.** État stationnaire (`run_ci.sh` = 30/30 vert, roadmap S1–S8 livrée et
|
||||
gatée, reliquat hors périmètre sandbox). Poursuite de la classe de dérive découverte
|
||||
la session précédente (docstring de production vs code réel — surface non gatée, distincte
|
||||
des gates README/compte). Fan-out de 3 audits read-only (Explore) sur les ~22 modules à
|
||||
docstring dense, chacun vérifiant CHAQUE allégation factuelle du docstring d'en-tête contre
|
||||
le code.
|
||||
|
||||
**3 candidats remontés · 2 réfutés par vérification indépendante · 1 réel corrigé.**
|
||||
|
||||
**RÉFUTÉ (faux-positif de compte).** `fiscal/ecf_dgii/ecf_dgii_gen.py` l.110 « 12 invariants » :
|
||||
l'agent alléguait « la numérotation commence à 2 → pas d'invariant 1 ». FAUX — l'invariant 1
|
||||
EST la conformité au schéma (`errors = list(maison.validate(bundle, schema))`, l.112) et
|
||||
`12a`/`12b` sont les deux moitiés de l'invariant 12 (unicité + comptes/tipos). Décompte réel :
|
||||
1(schéma)+2..11+12(a,b) = **12 exactement**, aligné mot-pour-mot sur le ledger README « Les 12
|
||||
invariants » + help CLI + tests + message stdout. Piège de compte classique (cf. mémoire
|
||||
`invariant-ledger-count-gate`, `confotur-8-negatifs-not-drift`). Zéro changement.
|
||||
|
||||
**RÉFUTÉ implicite.** Cluster RBAC/legal/bancable (7 modules) : aucune dérive, tous les
|
||||
inputs/outputs/compteurs/comportements des docstrings exacts.
|
||||
|
||||
**RÉEL — corrigé.** `demo/scenarios/demo_scenario_gen.py`. Le générateur écrit **TROIS**
|
||||
fichiers — `run_sheet.json` (l.196), `MANIFEST.json` (l.196) ET `run_sheet.md` (l.202-203,
|
||||
le « prompteur » Markdown, annoncé jusque dans le message stdout l.206 « + prompteur
|
||||
run_sheet.md »). Or la documentation DANS le module n'en listait que DEUX à trois endroits :
|
||||
le diagramme de chaîne de valeur du docstring (l.19), le résumé sous-commande du docstring
|
||||
(l.31) et la `help=` de l'argparse `build` (l.236). Le `run_sheet.md` a été ajouté au commit
|
||||
`aebe9b7` (« prompteur Markdown ») qui a MIS À JOUR le README (qui, lui, documente
|
||||
correctement les 3 sorties, l.27-29/76-78) mais a laissé le docstring/help du .py en arrière.
|
||||
Dérive doc-vs-CODE réelle, non gatée (check_docs/check_readme_claims ne couvrent pas la prose
|
||||
intra-module), même classe que le fix publiciste parser de la session 210609.
|
||||
|
||||
**Correction.** Les 3 emplacements alignés sur les 3 sorties réelles :
|
||||
diagramme → `out/run_sheet.json + out/run_sheet.md + out/MANIFEST.json` ;
|
||||
résumé sous-commande + help argparse → `out/run_sheet.{json,md} + out/MANIFEST.json`.
|
||||
**Docstring/help seuls — zéro changement de logique, de signature ou de test.**
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé). Build réel
|
||||
re-exécuté en dossier temp → émet bien `run_sheet.json`, `run_sheet.md`, `MANIFEST.json`
|
||||
(3 fichiers = la doc corrigée). **Zéro nouveau module · zéro gate ajouté (#5) · un seul
|
||||
fichier de production touché (docstring + help)**. Aucune commande VPS (#8).
|
||||
|
||||
---
|
||||
|
||||
## Session `20260802_220611` — Rattrapage canal 2 + sweep doc-vs-CODE sorties générateurs
|
||||
|
||||
**Contexte.** Reprise du buffer Sprint 8 en veille saturée. CI vert d'entrée
|
||||
(`./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**). Roadmap 8-semaines intégralement
|
||||
livrée ; toutes les files de travail buffer (fiches 13/13 closes, 7 gates statiques
|
||||
prouvés mordants, audit doc-vs-réalité) à jour aux sessions précédentes.
|
||||
|
||||
**Analyse — recherche d'une dérive doc-vs-CODE réelle (classe RÉCURRENTE, non close).**
|
||||
Sweep outil-assisté sur les **22 générateurs** (`*_gen.py` + `lib/generator.py` +
|
||||
`seolib/builder.py`) : extraction des fichiers réellement écrits (`os.path.join(out, "…")`)
|
||||
comparés aux sorties commitées dans chaque `out/`, croisée avec les déclarations de
|
||||
docstring/help. **Résultat : concordance totale.** Les deux modules corrigés plus tôt
|
||||
aujourd'hui sont propres — `demo/scenarios/demo_scenario_gen.py` émet bien ses **3**
|
||||
sorties (`run_sheet.json` + `run_sheet.md` + `MANIFEST.json`), toutes commitées et
|
||||
désormais fidèlement documentées ; `publiciste/lib/generator.py` sans « fallback prix »
|
||||
fantôme résiduel. **Aucune nouvelle dérive de la classe déclaration-de-sortie.** Les
|
||||
faux-positifs de mon regex (fichiers `_spec.json`/`.schema.json` en « written ») sont des
|
||||
**entrées lues**, pas des sorties — vérifiés manuellement, non-dérives.
|
||||
|
||||
**Réalisé — reporting canal 2 (tâche de veille #1).** L'instantané stakeholder
|
||||
[`daily_reports/2026-08-02.md`](../05_deliverables_mvp/daily_reports/2026-08-02.md) avait
|
||||
**lapsé de 4 sessions** depuis sa dernière mise à jour (`200607` / commit `0e76411`).
|
||||
Ajout d'un **6ᵉ addendum ADDITIF** (corps + 5 addenda intacts) consolidant les commits
|
||||
`0e76411` · `b3f131e` · `a2c2e0b` · `12c784c` · `eae3787`, dont **les deux corrections
|
||||
d'honnêteté doc-vs-CODE réelles** de la journée (docstring publiciste « fallback prix §5.3 »
|
||||
fantôme ; docstring/help `demo_scenario_gen` omettant `run_sheet.md`). Chaque agrégat
|
||||
**re-sourcé par recompute `python3` indépendant** contre l'artefact commité (anti-invention
|
||||
#6) : **22/22** qualité (scores distincts = {100}) · **564/564** régression
|
||||
(`totals` 22 suites · 564 ran · 0/0/0) · **15/15** recette (`in_repo`, verdict `True`) ·
|
||||
**13** fiches · `gate.needs` = **30** (7 gates + 23 suites).
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé après édition,
|
||||
seuls des fichiers de doc/log touchés). **Zéro nouveau module · zéro gate ajouté (#5) ·
|
||||
zéro fichier de production modifié** (reporting + vérification pure). Aucune commande
|
||||
touchant au VPS (#8) · aucun `git clean` (#interdits).
|
||||
|
||||
---
|
||||
|
||||
## Session `20260802_223614` — Dérive doc-vs-CODE réelle : docstring `q4lib/builder.py` « 17 modules » périmé (17 → 22)
|
||||
|
||||
**Contexte.** Reprise buffer Sprint 8, veille saturée. CI vert d'entrée
|
||||
(`./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**). Roadmap intégralement livrée.
|
||||
|
||||
**Analyse — sweep docstring-vs-CODE des `lib/` submodules (classe RÉCURRENTE, non close).**
|
||||
Les sessions précédentes avaient balayé les **déclarations de sortie** des 22 générateurs
|
||||
de tête. Nouveau périmètre ce jour : les **docstrings de module** des sous-paquets `lib/`
|
||||
(là où la vraie dérive du parser publiciste vivait). Extraction AST de tous les docstrings
|
||||
mentionnant des I/O (Sources lues / Entrées / Sortie / fallback / §), confrontés au code.
|
||||
**Résultat : concordance quasi totale** — parser publiciste propre (6 sources lues = 6 lues
|
||||
dans `parse_projet`/`_sources_presentes`), tous les builders/deps/frappe fidèles.
|
||||
|
||||
**UNE dérive réelle trouvée.** Docstring `qa/audit_4big/q4lib/builder.py` l.4 :
|
||||
« (b) les **17** modules atteignent ≥ 95/100 ». Or l'artefact commité
|
||||
`out/quality_report.json` porte `totals.modules = **22**` · `coverage.ci_modules_count = 22`
|
||||
· `pass = 22`. **Preuve d'antériorité de la dérive :** le gate `ci/check_readme_claims.sh`
|
||||
l.414-417 la documente noir sur blanc — « 17/17 modules SAISI À LA MAIN … PÉRIMÉ en silence
|
||||
quand des modules ont été ajoutés (17 → 22) ». Le gate **recalcule** le compte du *README*
|
||||
de l'auditeur (désormais « 22/22 » l.68) — mais le **docstring du module** est resté hors
|
||||
couverture (les docstrings ne sont ni link- ni count-checkés · cf. mémoire
|
||||
`docstring-vs-code-drift`). Le même « 17 » gaté dans le README avait survécu, non gaté, dans
|
||||
le docstring de production.
|
||||
|
||||
**Correction — honnête ET anti-re-dérive (pas de substitution d'un compte magique).**
|
||||
Le verdict réel du builder est `PASS ssi coverage.ok AND not below` — le nombre de modules
|
||||
est **DÉRIVÉ** (`len(modules)`), jamais figé. Remplacer « 17 » par « 22 » ne ferait que
|
||||
re-dériver au module #23. Reformulé en énonçant la **RÈGLE** : « TOUS les modules audités
|
||||
atteignent ≥ 95/100 (aucun sous le seuil) », + note explicite que le compte est dérivé
|
||||
(`len(modules)` == `totals.modules`, 17 → 22 à ce jour) et ne se retouche pas ici. Aligné
|
||||
sur l'éthos `fix-vs-gate` (ne pas empiler un gate N+1 ; décrire depuis l'autorité = le code).
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé — docstring seul,
|
||||
zéro changement de logique). README module gaté déjà à **22/22** (concordant). **Zéro nouveau
|
||||
module · zéro gate ajouté (#5) · un seul fichier de production touché (docstring)**. Aucune
|
||||
commande VPS (#8) · aucun `git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
|
||||
|
||||
---
|
||||
|
||||
## Session 230619 · Régression `constraints-guard` RED réparée (log-prose auto-tripping)
|
||||
|
||||
**Contexte.** `./run_ci.sh` au démarrage : **29 PASS · 1 FAIL** — job `constraints-guard`
|
||||
RED. Non pas une violation réelle de contrainte, mais une **auto-morsure** classique du gate
|
||||
par sa propre trace : le commit précédent (16db05a) avait ajouté au journal du jour la ligne
|
||||
`commande VPS (#8) · aucun \`git clean\`.` — négation citant l'interdit absolu #5, mais
|
||||
**sans marqueur de prohibition ni `ci-allow`** sur la ligne. Classe de dérive déjà répertoriée
|
||||
en mémoire ([[guard-constraints-log-prose]]).
|
||||
|
||||
**Diagnostic.** La ligne voisine 2080 (`… aucun \`git clean\` (#interdits).`) ne trippe PAS
|
||||
car `(#interdits)` matche le marqueur `[Ii]nterdit` du regex `PROHIBITION` de
|
||||
`guard_constraints.sh:25`. La ligne 2119 se terminait par « aucun \`git clean\`. » <!-- ci-allow --> — aucun
|
||||
des marqueurs (`JAMAIS`/`❌`/`pas de`/`interdit`/`ci-allow`…) présent → flaggée.
|
||||
|
||||
**Correctif.** Neutralisation par échappatoire documenté, selon la convention établie
|
||||
(cf. 2026-08-01.md:1689) : ajout de `<!-- ci-allow : mention de l'interdit absolu, jamais
|
||||
exécuté -->` sur la ligne. **Un seul fichier touché (journal), une seule ligne. Zéro module ·
|
||||
zéro gate ajouté (#5) · zéro changement de logique de production ni de gate.**
|
||||
|
||||
**Vérifications.** `bash ci/guard_constraints.sh` → **VERT** (`✅ Contraintes
|
||||
NON-NÉGOCIABLES respectées`). `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (gate complet
|
||||
re-vert). Aucune commande touchant au VPS (#8). Aucun `git clean` <!-- ci-allow : mention de l'interdit, jamais exécuté -->.
|
||||
|
||||
---
|
||||
|
||||
## Session 233620 · Sweep docstring-vs-CODE élargi (62 fichiers) + reporting canal 2 (7ᵉ addendum)
|
||||
|
||||
**Contexte.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP** — gate vert. Sprint 8
|
||||
buffer en veille saturée (fiches 13/13 closes, gates statiques 7/7 mordants). Tâche de veille
|
||||
#1 des addenda précédents : tenir le canal 2 (`daily_reports/`) à jour à chaque session +
|
||||
poursuivre l'audit doc-vs-CODE de la classe *docstring-drift* (RÉCURRENTE, non gatée,
|
||||
`docstring-vs-code-drift`).
|
||||
|
||||
**Audit exhaustif à couverture élargie.** Les sessions précédentes n'auditaient la classe
|
||||
docstring-vs-CODE que sur les **entrypoints** (`*_gen.py`). Extension cette session aux
|
||||
**modules de bibliothèque** — surface où la dernière dérive réelle du jour était apparue
|
||||
(`q4lib/builder.py` « 17 modules », commit `16db05a`). Confrontation docstring (module +
|
||||
fonction) vs code réel (sorties écrites, entrées lues, fallbacks, règles, compteurs) sur :
|
||||
- **22 générateurs** (entrypoints) — sorties déclarées vs `open/write/dump` réels.
|
||||
- **40 modules `*lib/`** (builders, scorers, parsers, finance, criteria, controls, runner,
|
||||
ncf, aggregator, renderer, model…) — inputs/fallbacks/règles/compteurs déclarés vs code.
|
||||
|
||||
**Résultat : 62/62 fichiers de production CONCORDANTS · aucune dérive résiduelle.** Y compris
|
||||
les deux modules corrigés ce jour (`demo_scenario_gen` 3 sorties, `q4lib/builder.py` compte
|
||||
dérivé). La surface docstring-drift est **saturée à ce jour** — signal fort de couverture, à
|
||||
re-scanner après toute évolution de code (n'est PAS une classe close par nature). Audit pur —
|
||||
**zéro fichier de production modifié cette session**.
|
||||
|
||||
**Reporting canal 2 (7ᵉ addendum).** Le stakeholder snapshot `daily_reports/2026-08-02.md`
|
||||
s'arrêtait au 6ᵉ addendum (`220611`, 22:06). Rattrapage additif des **2 sessions intercalées**
|
||||
(`223614`/`16db05a` docstring 17→22 · `230619`/`56a8802` gate constraints-guard RED réparé),
|
||||
chaque agrégat de l'état MVP **re-vérifié par recompute `python3` indépendant** contre
|
||||
l'artefact commité (anti-invention #6) : **22/22** qualité (scores = {100}) · **564/564**
|
||||
régression (22 suites, 0/0/0) · **15/15** recette (`in_repo`, verdict `True`) · `gate.needs` =
|
||||
**30** (7 gates + 23 suites). Corps et six addenda antérieurs **intacts** (convention additive).
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (miroir complet du gate,
|
||||
inchangé — reporting seul, zéro logique). Recompute indépendant concordant sur les 4
|
||||
dimensions. Arbre `git status` propre avant édition. **Zéro nouveau module · zéro gate ajouté
|
||||
(#5) · aucune logique de prod ni de gate touchée**. Aucune commande VPS (#8) · aucun
|
||||
`git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
# Activity Log · 2026-08-03 · Claude Code DTP Worker
|
||||
|
||||
## Session 000623 · Audit 2 surfaces d'intégrité inter-artefacts neuves + ouverture canal 2 du jour
|
||||
|
||||
**Contexte.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP** — gate vert,
|
||||
arbre `git status` propre. Sprint 8 buffer en veille saturée : fiches 13/13 closes,
|
||||
gates statiques 7/7 mordants (`7c79e43`), surface docstring-vs-CODE saturée hier sur
|
||||
62 fichiers de production (`1c3bed3`) — **aucun code modifié depuis**, donc re-rejouer
|
||||
ce sweep serait redondant (#5).
|
||||
|
||||
**Décision.** Ouvrir des **surfaces d'intégrité INTER-ARTEFACTS neuves** — jamais
|
||||
couvertes par les sweeps antérieurs (docstrings, sorties générateurs, comptes README
|
||||
gatés) — plutôt que re-scanner l'acquis. Deux surfaces auditées :
|
||||
|
||||
**1. Intégrité des chemins-preuve de la matrice de recette.** Confrontation des
|
||||
`matrix[].artifacts[].path` de `acceptance_matrix.json` au système de fichiers réel.
|
||||
Unique chemin : `GAP_ANALYSIS_SPRINT1.md` (S1).
|
||||
- **Faux-positif de mauvaise base évité et documenté.** Un contrôle naïf depuis la
|
||||
racine du repo rapporte un « MISMATCH » (artefact `exists=true`, introuvable). En
|
||||
réalité les chemins sont **relatifs à `DELIVERABLES_ROOT`** (`05_deliverables_mvp/`),
|
||||
où `05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md` **existe**. Vérifié via
|
||||
`acclib/deps.py:109-114` (`artifact_exists` joint `DELIVERABLES_ROOT`).
|
||||
- **Surface doublement protégée · ZÉRO gate ajouté (#5).** (a) `acceptance_gen.py:198`
|
||||
**lève** au build si un artefact-preuve cité est absent sous `DELIVERABLES_ROOT` ;
|
||||
(b) `acclib/builder.py:62` **recalcule `exists`** à chaque build → reproductibilité
|
||||
byte-à-byte (`check_artifacts`) prouve **transitivement** la résolution du chemin.
|
||||
- Garde-fou mémoire `acceptance-evidence-paths-deliverables-root` (classe de
|
||||
faux-positif récurrent · lignée `otov7-platform-not-drift`).
|
||||
|
||||
**2. Résolution des `ci_job` recette → `gate.needs`.** Les **22** noms de jobs CI
|
||||
cités dans `matrix[].modules[].ci_job` **résolvent tous** vers un job réel de
|
||||
`gate.needs` (**30**) dans `.gitea/workflows/ci.yml` — **0 orphelin**. Transitivement
|
||||
mono-sourcé (dérivé du manifeste) → pas de cross-gate (#5).
|
||||
|
||||
**Résultat.** **0 dérive** sur les 2 surfaces neuves. **Zéro fichier de production
|
||||
modifié** (audit pur). Surfaces désormais connues comme transitivement gatées.
|
||||
|
||||
**Reporting canal 2.** Ouverture de `daily_reports/2026-08-03.md` (nouveau jour ; le
|
||||
`2026-08-02` a été clos à 7 addenda). Chaque agrégat re-sourcé par recompute `python3`
|
||||
indépendant contre l'artefact commité (anti-invention #6) : **22/22** qualité
|
||||
(scores={100}, seuil 95) · **564/564** régression (22 suites, 0/0/0) · **15/15**
|
||||
recette (`in_repo`, verdict `True`) · **13** fiches · `gate.needs` = **30**.
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé — audit +
|
||||
reporting seuls, zéro logique). Recompute indépendant concordant sur les 4 dimensions.
|
||||
Arbre propre avant édition. **Zéro nouveau module · zéro gate ajouté (#5) · aucune
|
||||
logique de prod ni de gate touchée**. Aucune commande touchant au VPS (#8) · aucun
|
||||
`git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
|
||||
|
||||
## Session 003624 · Dé-duplication doc : table §1 de `ci/README.md` (lisibilité 4Big + #5)
|
||||
|
||||
**Contexte.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP**, arbre propre.
|
||||
Surfaces de dérive (docstrings, comptes README gatés, artefacts) saturées ; re-scanner
|
||||
l'acquis serait redondant (#5). J'ai cherché un défaut de **qualité documentaire réel**
|
||||
plutôt qu'une énième surface d'audit.
|
||||
|
||||
**Défaut trouvé.** La table récapitulative §1 de `ci/README.md` (« Ce que fait le
|
||||
pipeline ») a 9 lignes. Huit sont des one-liners nets ; la ligne
|
||||
`check-readme-claims` (l.23) était une **phrase-fleuve de 39 074 caractères
|
||||
(~15 000 mots)** entassée dans une seule cellule de table — construite par accrétion
|
||||
« **et** … **et** … » au fil de dizaines de sessions. Or le **§2 « Détail des
|
||||
contrôles »** documente DÉJÀ chacune de ces surfaces, proprement et de façon
|
||||
structurée, sur **1 410 lignes** (l.157-1567). La cellule géante était donc :
|
||||
- **du doublon pur** de §2 → viole CLAUDE.md **#5** (« éliminer le vieux · JAMAIS
|
||||
accumuler doublons ») ;
|
||||
- un **défaut de lisibilité 4Big réel** : une table dont une cellule fait 400× la
|
||||
taille des autres n'est plus une table.
|
||||
|
||||
**Correctif.** Ligne 23 remplacée par un one-liner de **914 caractères** cohérent avec
|
||||
les 8 autres lignes : il résume l'intégrité chiffres+faits data-derived, énumère les
|
||||
familles de surfaces couvertes, et **renvoie au §2** pour le détail exhaustif (qui
|
||||
reste intact, mot pour mot). **Zéro perte d'information** — tout ce que la cellule
|
||||
disait, §2 le dit déjà en mieux. Édition purement chirurgicale : `git diff --stat` =
|
||||
`1 file changed, 1 insertion(+), 1 deletion(-)`.
|
||||
|
||||
**Sûreté du changement (vérifiée avant édition).** `check_readme_claims.sh` ne parse
|
||||
**JAMAIS** `ci/README.md` comme source de claims gatés (unique occurrence l.8073 = un
|
||||
commentaire) ; la cellule n'est donc **aucun** faux-négatif à protéger. La nouvelle
|
||||
prose n'introduit **aucun lien Markdown** (rien à valider pour `check_docs`), **aucun
|
||||
terme interdit** en usage (rien pour `guard_constraints`), **aucun JSON** ni artefact.
|
||||
`ci/README.md` ∉ `05_deliverables_mvp/*.md` → hors du contrôle auto-score 4Big [SOFT].
|
||||
|
||||
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (inchangé). **Zéro
|
||||
nouveau module · zéro gate ajouté (#5) · aucune logique de prod ni de gate touchée** —
|
||||
pure amélioration doc. Aucune commande touchant au VPS (#8) · aucun
|
||||
`git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
|
||||
@@ -326,3 +326,227 @@ réel reste **hors périmètre worker** (VPS `153.75.250.214` · #8).
|
||||
**réconciliation de reporting** (canal 2 rattrapé sur 3 sessions de retouches doc/outillage,
|
||||
aucun livrable net nouveau — attendu en buffer saturé) ; déploiement serveur hors périmètre
|
||||
(VPS · #8). État launch-readiness **inchangé et intégralement sourcé**.
|
||||
|
||||
---
|
||||
|
||||
## Fin de journée · addendum session `20260802_200607`
|
||||
|
||||
> **Additif** (5ᵉ, même convention que les quatre précédents) : le corps et les quatre
|
||||
> addenda restent **intacts**. Cet ajout consolide les **3 sessions buffer intercalées
|
||||
> entre l'addendum `180604` (18:06) et 20:06** (commits `97d3b64` · `f954cc1` · `7c79e43`
|
||||
> · `8a08065`), absentes de l'instantané stakeholder alors que leur trace fine existe au
|
||||
> canal 1 ([`05_activity_log/2026-08-02.md`](../../05_activity_log/2026-08-02.md)). Tenir
|
||||
> le canal 2 à jour à chaque session buffer reste la tâche de veille #1 des addenda
|
||||
> précédents. Chaque chiffre ci-dessous est **re-vérifié contre l'artefact commité**
|
||||
> (recompute `python3` indépendant · anti-invention `CLAUDE.md` #6 · zéro donnée nouvelle).
|
||||
|
||||
**Les 3 sessions consolidées** — **aucun nouveau module, aucun gate ajouté (#5)** ; deux
|
||||
corrections d'honnêteté doc + une vérification QA pure, dans la lignée directe du buffer
|
||||
launch-readiness :
|
||||
- **`183604` (`97d3b64` + `f954cc1`)** — *`README.md` racine : dérive doc-vs-réalité non
|
||||
gatée* : la puce « Régression » affirmait `regression_run.json` « non commité par design »
|
||||
→ **FAUX** depuis la refonte baseline **byte-gatée** (commit `76fb0e7`) où l'artefact EST
|
||||
commité et re-vérifié par `check_regression`. Classe de dérive *prose-fact* (distincte des
|
||||
comptes/liens gatés · mémoire `prose-facts-vs-numeric-drift`). Zéro module, zéro gate.
|
||||
- **`190604` (`7c79e43`)** — *QA launch-readiness : mutation-test que les 7 gates statiques
|
||||
`ci/*.sh` MORDENT* → **7/7 RED**. Pour chaque gate, injection d'une mutation de sa classe
|
||||
de dérive, exigence d'un exit non-zéro, puis **revert par chemin ciblé** (jamais `git clean`
|
||||
· #interdits). Frontière de propriété inter-gates confirmée (`check_regression` possède
|
||||
`regression_run.json` · `check_artifacts` possède `MANIFEST.json`). Un gate vert qui ne
|
||||
mord pas est pire qu'absent — vérification pure, **zéro fichier de production modifié**.
|
||||
- **`193605` (`8a08065`)** — *`ci/README.md` : faux-positif d'audit récurrent verrouillé en
|
||||
garde-fou in-repo* : `michel/otov7-platform` (repo **produit**, `CLAUDE.md` #2) ≠
|
||||
`oto-enterprise-os-dtp` (repo **mandat**) — ce n'est PAS une coquille de la constitution
|
||||
(mémoire `otov7-platform-not-drift`). Note défensive, zéro module, zéro gate.
|
||||
|
||||
**État courant MVP · re-vérifié à 20:06 · 100 % sourcé** (recompute `python3` indépendant
|
||||
sur les artefacts commités · aucun chiffre saisi à la main) — **inchangé et vert** :
|
||||
|
||||
| Dimension | Valeur | Verdict | Source commitée |
|
||||
|---|---|---|---|
|
||||
| Qualité 4Big | **22/22 modules à 100/100** (scores distincts = {100} · seuil 95 · #5) | `PASS` | [`qa/audit_4big/out/quality_report.json`](../qa/audit_4big/out/quality_report.json) |
|
||||
| Régression (run) | **22 suites · 564 ran · 564 passés · 0 échec · 0 erreur · 0 skip** | `PASS` | [`qa/regression/out/regression_run.json`](../qa/regression/out/regression_run.json) |
|
||||
| Recette roadmap | **15/15 promesses** `status=in_repo` (verdict `True`) | `true` | [`qa/acceptance/out/acceptance_matrix.json`](../qa/acceptance/out/acceptance_matrix.json) |
|
||||
| Fiches agents | **13/13 auditées exactes** (classe close) | — | `03_agents/*/AGENT.md` |
|
||||
| Câblage CI | `gate.needs` = **30 jobs** (7 gates `ci/*.sh` + 23 suites module) | intègre | [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) |
|
||||
| Miroir local | `run_ci.sh` rejoue le gate → **30 PASS · 0 FAIL · 0 SKIP** | vert | [`run_ci.sh`](../../run_ci.sh) |
|
||||
|
||||
**Vérifications effectuées à la clôture** (en-repo, sans toucher au VPS) :
|
||||
- **`run_ci.sh` → 30 PASS · 0 FAIL · 0 SKIP** (miroir complet du gate, décompte 30/7/23
|
||||
dérivé à l'exécution de `gate.needs`).
|
||||
- Recompute indépendant des agrégats concordant : **22/22** qualité (scores = {100}) ·
|
||||
**564/564** régression (`totals` : suites 22 · ran 564 · passed 564 · 0/0/0) · **15/15**
|
||||
recette (`in_repo`, verdict `True`) · **13** fiches · `gate.needs` = **30** (7 + 23).
|
||||
- **Audit doc-vs-réalité relancé cette session** (top-level + module READMEs + 13 fiches,
|
||||
spot-check des faits-prose contre l'état courant) → **aucune dérive** trouvée.
|
||||
- Arbre `git status --porcelain` **vide** avant l'édition ; aucune commande touchant au VPS.
|
||||
|
||||
**Prochaine tâche (inchangée)** — buffer Sprint 8 en **veille saturée** : file d'audit
|
||||
fiches **vide** (13/13 clos), campagne de gates **saturée** (7 statiques prouvés mordants),
|
||||
audit doc-vs-réalité **sans dérive**. Maintenir `daily_reports/` à chaque session (fait ici),
|
||||
et **ne durcir un gate que si un blind-spot est prouvé par mutation-test**
|
||||
(*verify-uncovered-before-gating*), jamais un gate redondant (#5). Déploiement production
|
||||
réel reste **hors périmètre worker** (VPS `153.75.250.214` · #8).
|
||||
|
||||
**Auto-score 4Big de la consolidation : 97/100.** Réserve −3 : passe de **réconciliation de
|
||||
reporting** (canal 2 rattrapé sur 3 sessions doc/QA, aucun livrable net nouveau — attendu en
|
||||
buffer saturé) ; déploiement serveur hors périmètre (VPS · #8). État launch-readiness
|
||||
**inchangé et intégralement sourcé**.
|
||||
|
||||
---
|
||||
|
||||
## Fin de journée · addendum session `20260802_220611`
|
||||
|
||||
> **Additif** (6ᵉ, même convention que les cinq précédents) : le corps et les cinq addenda
|
||||
> restent **intacts**. Cet ajout consolide les **4 sessions buffer intercalées entre
|
||||
> l'addendum `200607` (20:06) et 22:06** (commits `0e76411` · `b3f131e` · `a2c2e0b` ·
|
||||
> `12c784c` · `eae3787`), absentes de l'instantané stakeholder alors que leur trace fine
|
||||
> existe au canal 1 ([`05_activity_log/2026-08-02.md`](../../05_activity_log/2026-08-02.md)).
|
||||
> Tenir le canal 2 à jour à chaque session buffer reste la tâche de veille #1 des addenda
|
||||
> précédents. Chaque chiffre ci-dessous est **re-vérifié contre l'artefact commité** (recompute
|
||||
> `python3` indépendant · anti-invention `CLAUDE.md` #6 · zéro donnée nouvelle).
|
||||
|
||||
**Les 4 sessions consolidées** — **aucun nouveau module, aucun gate ajouté (#5)** ; **deux
|
||||
corrections d'honnêteté doc-vs-CODE réelles** (dans la prose intra-module, classe non gatée)
|
||||
+ un audit prose-fact sans dérive, dans la lignée directe du buffer launch-readiness :
|
||||
- **`200607` (`0e76411`)** — *5ᵉ addendum canal 2* : rattrapage de l'instantané stakeholder
|
||||
sur les 3 sessions `183604`/`190604`/`193605`, chaque agrégat re-sourcé par recompute
|
||||
indépendant. Reporting pur, zéro module, zéro gate.
|
||||
- **`203609` (`b3f131e`)** — *audit prose-fact ciblé (classe non gatée) sur tous les README
|
||||
modules* → **aucune dérive**. Unique candidat résolu en **faux-positif prouvé** :
|
||||
`legal/confotur` « 44 tests (dont 8 négatifs) » **exact** (8 = classe `TestNegative` ; les
|
||||
3 `TestBuilderGuards` sont une classe *guard/raises* distincte, pas des « négatifs » →
|
||||
agrégés à tort en 11 par un audit naïf) + « 14 invariants » confirmé (14 entrées `# INVn`).
|
||||
Garde-fou mémoire `confotur-8-negatifs-not-drift`. Vérification pure, zéro fichier de
|
||||
production modifié.
|
||||
- **`210609` (`a2c2e0b` + `12c784c`)** — *`publiciste/lib/... parser.py` : dérive doc-vs-CODE
|
||||
RÉELLE dans le docstring de production* : l'en-tête « Sources lues » annonçait
|
||||
`40_llm_outputs/commercial.md → positionnement FR (fallback prix §5.3)` alors qu'**aucun
|
||||
fallback prix n'existe** (grep `§5.3`/fallback-prix = la seule occurrence est le docstring
|
||||
lui-même ; `commercial.md` n'alimente QUE `parse_positionnement_fr`). Reformulé
|
||||
« → positionnement FR (1er paragraphe non-titre) », aligné sur la vraie logique. Classe
|
||||
*comportement-inventé* (contraire à l'éthos anti-invention #6), non gatée. Docstring seul —
|
||||
zéro logique, zéro test. Mémoire `docstring-vs-code-drift`.
|
||||
- **`213610` (`eae3787`)** — *`demo/scenarios/demo_scenario_gen.py` : dérive doc-vs-CODE
|
||||
RÉELLE (output omis)* : le générateur écrit **3** fichiers (`run_sheet.json` +
|
||||
`run_sheet.md` + `MANIFEST.json`) mais le docstring/help n'en listait que **2** à trois
|
||||
endroits (diagramme, résumé sous-commande, `help=` argparse) — le `run_sheet.md` ajouté au
|
||||
commit `aebe9b7` avait mis à jour le README mais laissé le `.py` en arrière. Les 3
|
||||
emplacements réalignés sur les 3 sorties réelles. Docstring/help seuls — zéro logique.
|
||||
Même classe que le fix publiciste. Mémoire `docstring-vs-code-drift`.
|
||||
|
||||
**Vérification indépendante cette session (`220611`)** — au-delà du rattrapage, un **sweep
|
||||
doc-vs-CODE outil-assisté sur les 22 générateurs** (extraction des sorties réellement écrites
|
||||
vs sorties commitées dans chaque `out/`) → **concordance totale**, y compris les deux modules
|
||||
corrigés ce jour (`demo_scenario_gen` émet bien ses 3 fichiers, tous commités). **Aucune
|
||||
nouvelle dérive de la classe déclaration-de-sortie.**
|
||||
|
||||
**État courant MVP · re-vérifié à 22:06 · 100 % sourcé** (recompute `python3` indépendant sur
|
||||
les artefacts commités · aucun chiffre saisi à la main) — **inchangé et vert** :
|
||||
|
||||
| Dimension | Valeur | Verdict | Source commitée |
|
||||
|---|---|---|---|
|
||||
| Qualité 4Big | **22/22 modules à 100/100** (scores distincts = {100} · seuil 95 · #5) | `PASS` | [`qa/audit_4big/out/quality_report.json`](../qa/audit_4big/out/quality_report.json) |
|
||||
| Régression (run) | **22 suites · 564 ran · 564 passés · 0 échec · 0 erreur · 0 skip** | `PASS` | [`qa/regression/out/regression_run.json`](../qa/regression/out/regression_run.json) |
|
||||
| Recette roadmap | **15/15 promesses** `status=in_repo` (verdict `True`) | `true` | [`qa/acceptance/out/acceptance_matrix.json`](../qa/acceptance/out/acceptance_matrix.json) |
|
||||
| Fiches agents | **13/13 auditées exactes** (classe close) | — | `03_agents/*/AGENT.md` |
|
||||
| Câblage CI | `gate.needs` = **30 jobs** (7 gates `ci/*.sh` + 23 suites module) | intègre | [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) |
|
||||
| Miroir local | `run_ci.sh` rejoue le gate → **30 PASS · 0 FAIL · 0 SKIP** | vert | [`run_ci.sh`](../../run_ci.sh) |
|
||||
|
||||
**Vérifications effectuées à la clôture** (en-repo, sans toucher au VPS) :
|
||||
- **`run_ci.sh` → 30 PASS · 0 FAIL · 0 SKIP** (miroir complet du gate).
|
||||
- Recompute indépendant concordant : **22/22** qualité (scores = {100}) · **564/564**
|
||||
régression (`totals` : 22 suites · 564 ran · 564 passed · 0/0/0) · **15/15** recette
|
||||
(`in_repo`, verdict `True`) · **13** fiches · `gate.needs` = **30** (7 + 23).
|
||||
- **Sweep doc-vs-CODE sorties sur 22 générateurs** → concordance totale, aucune dérive.
|
||||
- Arbre `git status --porcelain` **vide** avant l'édition ; aucune commande touchant au VPS.
|
||||
|
||||
**Prochaine tâche (inchangée)** — buffer Sprint 8 en **veille saturée** : file d'audit fiches
|
||||
**vide** (13/13 clos), campagne de gates **saturée** (7 statiques prouvés mordants), audit
|
||||
doc-vs-réalité (README + docstrings + sorties générateurs) **sans dérive résiduelle**. Tenir
|
||||
`daily_reports/` à jour à chaque session (fait ici) et **ne durcir un gate que si un
|
||||
blind-spot est prouvé par mutation-test** (*verify-uncovered-before-gating*), jamais un gate
|
||||
redondant (#5). Déploiement production réel reste **hors périmètre worker** (VPS
|
||||
`153.75.250.214` · #8).
|
||||
|
||||
**Auto-score 4Big de la consolidation : 97/100.** Réserve −3 : passe de **réconciliation de
|
||||
reporting** + audit de vérification (canal 2 rattrapé sur 4 sessions ; sweep sorties sans
|
||||
dérive nouvelle — attendu en buffer saturé) ; déploiement serveur hors périmètre (VPS · #8).
|
||||
État launch-readiness **inchangé et intégralement sourcé**.
|
||||
|
||||
---
|
||||
|
||||
## Fin de journée · addendum session `20260802_233620`
|
||||
|
||||
> **Additif** (7ᵉ, même convention que les six précédents) : le corps et les six addenda
|
||||
> restent **intacts**. Cet ajout consolide les **2 sessions buffer intercalées entre
|
||||
> l'addendum `220611` (22:06) et 23:10** (commits `16db05a` · `56a8802`), absentes de
|
||||
> l'instantané stakeholder alors que leur trace fine existe au canal 1
|
||||
> ([`05_activity_log/2026-08-02.md`](../../05_activity_log/2026-08-02.md)). Tenir le canal 2 à
|
||||
> jour à chaque session buffer reste la tâche de veille #1 des addenda précédents. Chaque
|
||||
> chiffre ci-dessous est **re-vérifié contre l'artefact commité** (recompute `python3`
|
||||
> indépendant · anti-invention `CLAUDE.md` #6 · zéro donnée nouvelle).
|
||||
|
||||
**Les 2 sessions consolidées** — **aucun nouveau module, aucun gate ajouté (#5)** ; une
|
||||
correction d'honnêteté doc-vs-CODE réelle + une réparation de gate auto-mordu, toutes deux
|
||||
dans la lignée directe du buffer launch-readiness :
|
||||
- **`223614` (`16db05a`)** — *`qa/audit_4big/q4lib/builder.py` : dérive doc-vs-CODE RÉELLE
|
||||
dans un docstring de production* : l'en-tête annonçait « 17 modules » alors que le compte
|
||||
réel est **22** (`len(modules)` == `totals.modules`). Le même « 17 » gaté au README avait
|
||||
déjà été réaligné ; il avait survécu **non gaté** dans le docstring. Correction **honnête ET
|
||||
anti-re-dérive** : plutôt que substituer « 22 » (qui re-dériverait au module #23), le
|
||||
docstring énonce désormais la **RÈGLE** (« TOUS les modules audités ≥ 95/100, aucun sous le
|
||||
seuil ») + note explicite que le compte est **dérivé** (`len(modules)`, 17→22 à ce jour) et
|
||||
ne se retouche pas ici. Aligné sur l'éthos `fix-vs-gate` (décrire depuis l'autorité = le
|
||||
code). Docstring seul — zéro logique, zéro test. Mémoire `docstring-vs-code-drift`.
|
||||
- **`230619` (`56a8802`)** — *gate `constraints-guard` RED réparé (auto-morsure log-prose)* :
|
||||
non pas une violation réelle de contrainte, mais l'**auto-morsure** classique du gate par sa
|
||||
propre trace — le commit précédent avait ajouté au journal une négation citant l'interdit
|
||||
`git clean` **sans marqueur PROHIBITION ni `ci-allow`** sur la ligne, donc flaggée.
|
||||
Neutralisée par échappatoire documenté `ci-allow` (convention établie 2026-08-01). Un seul
|
||||
fichier (journal), une seule ligne. Zéro module, zéro gate, zéro logique de prod. Classe
|
||||
connue `guard-constraints-log-prose`.
|
||||
|
||||
**Vérification indépendante cette session (`233620`)** — au-delà du rattrapage, un **sweep
|
||||
doc-vs-CODE exhaustif à couverture élargie** : audit des docstrings/`--help`/argparse sur les
|
||||
**22 générateurs** (entrypoints) **ET** des docstrings module + fonction sur les **40 modules
|
||||
de bibliothèque** (`*lib/` : builders, scorers, parsers, finance, criteria, controls, runner…),
|
||||
soit **62 fichiers de production** confrontés à leur code réel (sorties écrites, entrées lues,
|
||||
fallbacks, règles, compteurs). **Résultat : concordance totale · aucune dérive résiduelle de
|
||||
la classe docstring-vs-CODE**, y compris le `q4lib/builder.py` corrigé cette journée. La
|
||||
surface docstring-drift (jusqu'ici *récurrente, non gatée*) est **saturée à ce jour** — signal
|
||||
fort de couverture, à re-scanner après toute évolution de code.
|
||||
|
||||
**État courant MVP · re-vérifié à 23:10 · 100 % sourcé** (recompute `python3` indépendant sur
|
||||
les artefacts commités · aucun chiffre saisi à la main) — **inchangé et vert** :
|
||||
|
||||
| Dimension | Valeur | Verdict | Source commitée |
|
||||
|---|---|---|---|
|
||||
| Qualité 4Big | **22/22 modules à 100/100** (scores distincts = {100} · seuil 95 · #5) | `PASS` | [`qa/audit_4big/out/quality_report.json`](../qa/audit_4big/out/quality_report.json) |
|
||||
| Régression (run) | **22 suites · 564 ran · 564 passés · 0 échec · 0 erreur · 0 skip** | `PASS` | [`qa/regression/out/regression_run.json`](../qa/regression/out/regression_run.json) |
|
||||
| Recette roadmap | **15/15 promesses** `status=in_repo` (verdict `True`) | `true` | [`qa/acceptance/out/acceptance_matrix.json`](../qa/acceptance/out/acceptance_matrix.json) |
|
||||
| Fiches agents | **13/13 auditées exactes** (classe close) | — | `03_agents/*/AGENT.md` |
|
||||
| Câblage CI | `gate.needs` = **30 jobs** (7 gates `ci/*.sh` + 23 suites module) | intègre | [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) |
|
||||
| Miroir local | `run_ci.sh` rejoue le gate → **30 PASS · 0 FAIL · 0 SKIP** | vert | [`run_ci.sh`](../../run_ci.sh) |
|
||||
|
||||
**Vérifications effectuées à la clôture** (en-repo, sans toucher au VPS) :
|
||||
- **`run_ci.sh` → 30 PASS · 0 FAIL · 0 SKIP** (miroir complet du gate).
|
||||
- Recompute indépendant concordant : **22/22** qualité (scores = {100}) · **564/564**
|
||||
régression (`totals` : 22 suites · 564 ran · 564 passed · 0/0/0) · **15/15** recette
|
||||
(`in_repo`, verdict `True`) · **13** fiches · `gate.needs` = **30** (7 + 23).
|
||||
- **Sweep doc-vs-CODE élargi (62 fichiers : 22 entrypoints + 40 `*lib/`)** → concordance
|
||||
totale, aucune dérive docstring résiduelle.
|
||||
- Arbre `git status --porcelain` **vide** avant l'édition ; aucune commande touchant au VPS.
|
||||
|
||||
**Prochaine tâche (inchangée)** — buffer Sprint 8 en **veille saturée** : file d'audit fiches
|
||||
**vide** (13/13 clos), campagne de gates **saturée** (7 statiques prouvés mordants), audit
|
||||
doc-vs-réalité (README + docstrings entrypoints **+ 40 modules lib** + sorties générateurs)
|
||||
**sans dérive résiduelle**. Tenir `daily_reports/` à jour à chaque session (fait ici) et **ne
|
||||
durcir un gate que si un blind-spot est prouvé par mutation-test**
|
||||
(*verify-uncovered-before-gating*), jamais un gate redondant (#5). Déploiement production réel
|
||||
reste **hors périmètre worker** (VPS `153.75.250.214` · #8).
|
||||
|
||||
**Auto-score 4Big de la consolidation : 97/100.** Réserve −3 : passe de **réconciliation de
|
||||
reporting** + audit de vérification (canal 2 rattrapé sur 2 sessions ; sweep docstring élargi
|
||||
aux 40 modules lib sans dérive nouvelle — attendu en buffer saturé) ; déploiement serveur hors
|
||||
périmètre (VPS · #8). État launch-readiness **inchangé et intégralement sourcé**.
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
# Daily Report · 2026-08-03 · Claude Code DTP Worker
|
||||
|
||||
**Session** : `20260803_000623`
|
||||
**Phase roadmap** : Sprint 8 · *Launch + Buffer* — livrables « Regression tests
|
||||
exhaustifs » (QA) + « Corrections finales » (buffer). Tous les sprints 1→7 sont
|
||||
livrés côté repo ; le reste (déploiement production réel) est **hors périmètre
|
||||
worker** (VPS `153.75.250.214` · `CLAUDE.md` #8).
|
||||
|
||||
## Tâche exécutée
|
||||
**Sprint 8 · QA — audit de deux surfaces d'intégrité inter-artefacts jamais
|
||||
auditées + maintien du canal `daily_reports/` (nouveau jour).**
|
||||
|
||||
Ouverture d'un instantané stakeholder pour le **1ᵉʳ jour de la fenêtre** (le canal 2
|
||||
du `2026-08-02` a été clos à 7 addenda). Plutôt que re-rejouer le sweep
|
||||
docstring-vs-CODE **déjà saturé** hier (62 fichiers de production concordants,
|
||||
commit `1c3bed3` · aucun code modifié depuis), cette session ouvre **deux surfaces
|
||||
d'intégrité inter-artefacts distinctes** que les sweeps antérieurs (docstrings,
|
||||
sorties générateurs, comptes README gatés) n'avaient **pas** couvertes.
|
||||
|
||||
## Contexte / analyse
|
||||
- Relu `CLAUDE.md`, la roadmap, `MEMORY.md`, le journal `05_activity_log/2026-08-02.md`,
|
||||
et le canal 2 `daily_reports/2026-08-02.md` (7 addenda, clos).
|
||||
- **État de départ vert** : `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** · arbre
|
||||
`git status --porcelain` **vide**.
|
||||
- **Constat de saturation** : file d'audit fiches vide (13/13 closes), gates
|
||||
statiques 7/7 prouvés mordants (mutation-test `7c79e43`), surface docstring-vs-CODE
|
||||
saturée (`1c3bed3`). **Décision** (workflow #5 — ne pas empiler un gate/sweep
|
||||
redondant) : auditer une surface **neuve**, pas re-scanner l'ancienne.
|
||||
|
||||
## Réalisé — 2 surfaces neuves auditées, 0 dérive, 0 fichier de production modifié
|
||||
1. **Intégrité des chemins-preuve de la matrice de recette** (jamais audité) :
|
||||
confrontation des `matrix[].artifacts[].path` de
|
||||
[`acceptance_matrix.json`](../qa/acceptance/out/acceptance_matrix.json) au
|
||||
**système de fichiers réel**. Unique chemin cité : `GAP_ANALYSIS_SPRINT1.md` (S1).
|
||||
- **Faux-positif évité** : un contrôle naïf depuis la **racine du repo** rapporte
|
||||
un « MISMATCH » (artefact `exists=true`, introuvable sur disque). En réalité les
|
||||
chemins sont **relatifs à `DELIVERABLES_ROOT`** (`05_deliverables_mvp/`), où le
|
||||
fichier `05_deliverables_mvp/GAP_ANALYSIS_SPRINT1.md` **existe bien**. Piège de
|
||||
**mauvaise base**, verrouillé en garde-fou mémoire
|
||||
(`acceptance-evidence-paths-deliverables-root`) — classe de faux-positif
|
||||
récurrent, comme `otov7-platform-not-drift`.
|
||||
- **Surface doublement protégée · ZÉRO gate ajouté (#5)** : (a) `acceptance_gen.py`
|
||||
l.198 **lève une erreur** au build si un artefact-preuve cité est absent sous
|
||||
`DELIVERABLES_ROOT` ; (b) `acclib/builder.py` l.62 **recalcule `exists`** à
|
||||
chaque build via `acclib/deps.artifact_exists` → la reproductibilité byte-à-byte
|
||||
(`check_artifacts`) prouve **transitivement** que le chemin résout toujours.
|
||||
2. **Résolution des `ci_job` de la matrice vers `gate.needs`** (jamais audité) : les
|
||||
**22** noms de jobs CI cités dans `matrix[].modules[].ci_job` **résolvent tous**
|
||||
vers un job réel de `gate.needs` (**30**) dans
|
||||
[`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) — **0 job orphelin**.
|
||||
Transitivement mono-sourcé (dérivé du manifeste) → pas de cross-gate (#5).
|
||||
3. **Maintien du canal `daily_reports/`** (ce fichier) — nouveau jour ouvert.
|
||||
|
||||
## État courant MVP · 100 % sourcé (recompute `python3` indépendant · aucun chiffre saisi à la main)
|
||||
| Dimension | Valeur | Verdict | Source commitée |
|
||||
|---|---|---|---|
|
||||
| Qualité 4Big | **22/22 modules à 100/100** (scores distincts = {100} · seuil `pass_score` **95** · #5) | `PASS` | [`qa/audit_4big/out/quality_report.json`](../qa/audit_4big/out/quality_report.json) |
|
||||
| Régression (run) | **22 suites · 564 ran · 564 passés · 0 échec · 0 erreur · 0 skip** | `PASS` | [`qa/regression/out/regression_run.json`](../qa/regression/out/regression_run.json) |
|
||||
| Recette roadmap | **15/15 promesses** `status=in_repo` (verdict `True`) | `true` | [`qa/acceptance/out/acceptance_matrix.json`](../qa/acceptance/out/acceptance_matrix.json) |
|
||||
| Fiches agents | **13/13 auditées exactes** (classe close) | — | `03_agents/*/AGENT.md` |
|
||||
| Câblage CI | `gate.needs` = **30 jobs** (7 gates `ci/*.sh` + 23 suites module) · 22 `ci_job` recette tous résolus | intègre | [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) |
|
||||
| Miroir local | `run_ci.sh` rejoue le gate → **30 PASS · 0 FAIL · 0 SKIP** | vert | [`run_ci.sh`](../../run_ci.sh) |
|
||||
|
||||
## Vérifications effectuées (en-repo, sans toucher au VPS)
|
||||
- **`run_ci.sh` → 30 PASS · 0 FAIL · 0 SKIP** (miroir complet du gate).
|
||||
- Recompute indépendant concordant : **22/22** qualité (scores = {100}) · **564/564**
|
||||
régression (`totals` : 22 suites · 564 ran · 564 passed · 0/0/0) · **15/15** recette
|
||||
(`in_repo`, verdict `True`) · **13** fiches · `gate.needs` = **30** (7 + 23).
|
||||
- **2 surfaces inter-artefacts neuves** auditées → 0 dérive (chemins-preuve recette
|
||||
résolus sous `DELIVERABLES_ROOT` + doublement gatés ; 22/22 `ci_job` → `gate.needs`).
|
||||
- Arbre `git status --porcelain` **vide** avant l'édition ; aucune commande VPS (#8).
|
||||
|
||||
## Non fait (hors périmètre worker · touche au VPS)
|
||||
- Déploiement production réel (bench migrate, fixtures, nginx/systemd, builds stores,
|
||||
indexation SEO, voix Amélie) → **VPS `153.75.250.214`** · agents DevOps/ERPNext,
|
||||
plan ordonné dans `devops/deploy_runbook` (`CLAUDE.md` #8).
|
||||
- Enregistrement `act_runner` Gitea + exécution serveur de la baseline Playwright.
|
||||
|
||||
## Prochaine tâche suggérée
|
||||
- Maintenir `daily_reports/` à chaque session buffer (1 instantané/jour · addenda
|
||||
additifs infra-journée).
|
||||
- **Ne durcir un gate que si un blind-spot est prouvé par mutation-test**
|
||||
(`verify-uncovered-before-gating`), jamais un gate redondant (#5). Les surfaces
|
||||
driftables évidentes sont saturées ; privilégier l'ouverture de surfaces
|
||||
**inter-artefacts neuves** (comme cette session) plutôt que re-scanner l'acquis.
|
||||
- Re-scanner la classe docstring-vs-CODE **après toute évolution de code** (elle
|
||||
n'est pas close par nature · `docstring-vs-code-drift`).
|
||||
|
||||
---
|
||||
|
||||
**Auto-score 4Big : 97/100.** Réserve −3 : passe de **vérification pure** — deux
|
||||
surfaces inter-artefacts neuves auditées sans dérive + reporting canal 2 (aucun
|
||||
livrable net nouveau — attendu en buffer Sprint 8 saturé) ; déploiement serveur hors
|
||||
périmètre (VPS · #8). État launch-readiness **inchangé et intégralement sourcé** :
|
||||
22/22 qualité · 564/564 régression · 15/15 recette · 30 gate.needs verts.
|
||||
@@ -16,7 +16,8 @@ Chaîne de valeur :
|
||||
out/ des modules livrés (workflow, e-CF, CONFOTUR, RBAC, 4Big, portails, …)
|
||||
│ pointeurs RFC 6901 (scenario_spec.json)
|
||||
▼
|
||||
demo_scenario_gen ──► out/run_sheet.json + out/MANIFEST.json
|
||||
demo_scenario_gen ──► out/run_sheet.json + out/run_sheet.md
|
||||
+ out/MANIFEST.json
|
||||
│
|
||||
▼ (VPS · hors périmètre worker · #8)
|
||||
rendu deck / prompteur ─► démo publique otov7.com
|
||||
@@ -28,7 +29,7 @@ Garanties (le CLI REFUSE d'écrire si l'une casse) :
|
||||
· l'artefact livré est `pret=true` (0 citation non résolue · 0 module non gated).
|
||||
|
||||
Sous-commandes :
|
||||
build [-o OUT_DIR] → OUT_DIR/{run_sheet,MANIFEST}.json
|
||||
build [-o OUT_DIR] → OUT_DIR/run_sheet.{json,md} + OUT_DIR/MANIFEST.json
|
||||
validate → manifeste + invariants (sans écrire)
|
||||
"""
|
||||
|
||||
@@ -233,7 +234,7 @@ def build_argparser() -> argparse.ArgumentParser:
|
||||
description=__doc__.splitlines()[0])
|
||||
sub = ap.add_subparsers(dest="cmd", required=True)
|
||||
|
||||
p = sub.add_parser("build", help="scenario_spec.json → out/{run_sheet,MANIFEST}.json")
|
||||
p = sub.add_parser("build", help="scenario_spec.json → out/run_sheet.{json,md} + out/MANIFEST.json")
|
||||
p.add_argument("-o", "--out", default=os.path.join(_HERE, "out"),
|
||||
help="dossier de sortie (défaut: ./out)")
|
||||
p.add_argument("--generated-at", dest="generated_at", default=None)
|
||||
|
||||
@@ -23,7 +23,7 @@ Sources lues (ordre du template canonique v1.0) :
|
||||
00_brief/brief.md → localisation (§1.1)
|
||||
20_architecture/architecture.md → typologies + prix (§3.2, bloc anti-gap)
|
||||
30_paysage_experience/paysage_experience.md→ services inclus (§3.3)
|
||||
40_llm_outputs/commercial.md → positionnement FR (fallback prix §5.3)
|
||||
40_llm_outputs/commercial.md → positionnement FR (1er paragraphe non-titre)
|
||||
60_photos_site/ → rendus (liés au projet réel)
|
||||
"""
|
||||
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
"""Assemblage déterministe du rapport d'audit 4Big.
|
||||
|
||||
Verdict global = PASS ssi (a) la couverture est bijective vs le CI (100% des
|
||||
livrables gated, hors auditeur) ET (b) les 17 modules atteignent ≥ 95/100.
|
||||
Sinon FAIL — l'audit est un GATE, pas un rapport indicatif.
|
||||
livrables gated, hors auditeur) ET (b) TOUS les modules audités atteignent
|
||||
≥ 95/100 (aucun sous le seuil). Sinon FAIL — l'audit est un GATE, pas un rapport
|
||||
indicatif. Le nombre de modules est DÉRIVÉ (`len(modules)` == `totals.modules`),
|
||||
jamais figé ici : il croît quand un livrable est gated (17 → 22 à ce jour) sans
|
||||
retoucher ce docstring.
|
||||
|
||||
Aucune date/horodatage → build reproductible + diffable (gate CI stable).
|
||||
"""
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
# AUTORISATIONS FORMELLES · Michel Roy (Co-Président WAG) · 2026-08-03
|
||||
|
||||
## Dérogation générale pour Claude Code DTP
|
||||
|
||||
Je, **Michel Roy**, Co-Président World Activities Group, autorise formellement l'agent orchestrateur Claude Code DTP et tous ses sous-agents (Frontend, Backend, ERPNext, BIM, Faisabilité, Rendu, CRM, SEO, Mobile, IFC/Speckle, ONAPI/Legal, DevOps, QA) à effectuer sans confirmation supplémentaire les actions listées ci-dessous.
|
||||
|
||||
Cette dérogation lève la **contrainte #8 · déploiement hors périmètre worker** identifiée dans l'audit du 2026-08-02.
|
||||
|
||||
## Actions autorisées 24/7 en autonome
|
||||
|
||||
### Docker + ERPNext
|
||||
- `docker exec` sur containers erpnext-backend-1, erpnext-frontend-1, erpnext-queue-*, erpnext-scheduler-1, erpnext-websocket-1, erpnext-db-1
|
||||
- `bench --site frontend` avec toutes commandes · migrate, execute, import-doc, console, restart, clear-cache, install-app, build, disable-doctype, enable-doctype
|
||||
- `docker cp` pour transférer fixtures dans/hors containers
|
||||
- Création DocTypes personnalisés dans module 'Custom'
|
||||
- Création Roles, Permissions, Workflows, Workflow States, Workflow Actions
|
||||
- Écriture directe dans MariaDB via bench console
|
||||
- Import fixtures JSON (`bench import-doc`)
|
||||
- Application patches avec `bench migrate`
|
||||
|
||||
### VPS système
|
||||
- `systemctl restart/reload/enable` sur tous services oto-*, nginx, docker
|
||||
- `systemctl daemon-reload`
|
||||
- Modification /etc/systemd/system/oto-*.service
|
||||
- Modification /etc/nginx/sites-enabled/*.conf + reload nginx
|
||||
- `certbot renew` et création nouveaux certificats
|
||||
- `apt install` de packages standards (Python, Node, outils système)
|
||||
- `pip install --break-system-packages` et `npm install -g`
|
||||
- `crontab -e` et /etc/cron.d/*
|
||||
- Création de nouveaux services systemd
|
||||
- `journalctl --vacuum-*` pour rotation
|
||||
|
||||
### Filesystem
|
||||
- Écriture dans /opt/oto/ (code, sites, api, otoia, data, backups)
|
||||
- Écriture dans /var/www/html/static/ (assets publics)
|
||||
- Écriture dans /etc/oto/ (config env files)
|
||||
- Écriture dans /var/log/oto/ (logs applicatifs)
|
||||
- Écriture dans /tmp/ (scripts temporaires)
|
||||
- Création répertoires `mkdir -p`
|
||||
- Suppression fichiers .bak_* > 30 jours
|
||||
- Rotation logs > 30 jours
|
||||
|
||||
### Git & CI/CD
|
||||
- `git commit` et `git push` vers Gitea (JAMAIS GitHub) sur repos oto-enterprise-os-dtp, otov7-platform
|
||||
- Création de branches, tags, releases
|
||||
- Exécution CI Gitea Actions
|
||||
- Merge de PR approuvées par leur propre workflow
|
||||
|
||||
### API externes
|
||||
- Appels API ERPNext (tous DocTypes)
|
||||
- Appels API Frappe Cloud si configuré
|
||||
- Appels API DGII e-CF (via Compupar)
|
||||
- Appels API Cardnet paiements
|
||||
- Appels API Meta WhatsApp Cloud (numéro OTOV7 +18495172355)
|
||||
- Appels API RunPod GPU (ComfyUI)
|
||||
- Appels API Cloudflare (DNS, cache purge)
|
||||
- Appels API OpenExchangeRates, ExchangeRateAPI
|
||||
|
||||
### Frontend & UX
|
||||
- Modification /opt/oto/sites/vente/ (site public)
|
||||
- Modification /opt/oto/sites/vente/mon-compte/ (portail client)
|
||||
- Modification /opt/oto/sites/vente/admin/ (console admin)
|
||||
- Injection scripts JavaScript, styles CSS
|
||||
- Ajout de meta tags SEO, JSON-LD schema.org
|
||||
- Cache-bust automatique après chaque déploiement
|
||||
|
||||
### BIM / IFC / Speckle
|
||||
- Traitement fichiers .ifc via ifcopenshell
|
||||
- Conversion .ifc → .glb via ifc_to_glb.py
|
||||
- Publication modèles vers Speckle server local (docker container)
|
||||
- Génération renders via Flux (RunPod)
|
||||
- Écriture dans /opt/oto/bim-cloud/
|
||||
|
||||
### Actions particulièrement demandées ce soir (2026-08-03)
|
||||
- Finaliser Sprint 4 workflow ERPNext (partiellement fait déjà)
|
||||
- Finaliser Sprint 3 viewer 3D IFC/Speckle (partiellement fait déjà)
|
||||
- Continuer les Sprints 5-6-7-8 sans attendre confirmation
|
||||
- Débloquer TOUS les points identifiés dans l'audit du 2026-08-02
|
||||
|
||||
## Ce qui reste NON autorisé (garde-fous)
|
||||
|
||||
### Financier
|
||||
- ❌ Exécuter des trades financiers (buy/sell stocks, crypto)
|
||||
- ❌ Transférer de l'argent hors du compte OTOV7
|
||||
- ❌ Modifier les taux de commission vendeurs sans validation Michel
|
||||
|
||||
### Sécurité
|
||||
- ❌ Désactiver fail2ban, ufw, ou tout dispositif sécurité
|
||||
- ❌ Ouvrir des ports firewall sans justification claire
|
||||
- ❌ Créer des utilisateurs SSH externes sans Michel
|
||||
- ❌ Partager le mot de passe root ou tokens API
|
||||
- ❌ Publier données confidentielles clients hors OTOV7
|
||||
|
||||
### Structure
|
||||
- ❌ Supprimer bases de données production sans backup vérifié
|
||||
- ❌ `git clean` (interdiction absolue confirmée)
|
||||
- ❌ Supprimer les 5 derniers backups (rotation les préserve)
|
||||
- ❌ Migrer données vers un autre VPS sans validation Michel
|
||||
|
||||
## Signature
|
||||
|
||||
Michel Roy · Co-Président WAG · 2026-08-03
|
||||
Cette autorisation est valide jusqu'à révocation écrite explicite.
|
||||
@@ -63,3 +63,13 @@ IP 153.75.250.214 · Docker (erpnext-backend-1, erpnext-frontend-1) · nginx ser
|
||||
- **JAMAIS** GitHub / GitLab / Bitbucket
|
||||
- Auth : SSH key ou token Gitea (voir /etc/oto/credentials)
|
||||
|
||||
|
||||
## ⭐ DÉROGATION 2026-08-03 · Michel a levé toutes les contraintes bloquantes
|
||||
Voir `AUTORISATIONS_MICHEL_20260803.md` · TOUS les agents sont autorisés à ·
|
||||
- `bench migrate` sur site `frontend`
|
||||
- Modifier nginx, systemd, docker sans confirmation
|
||||
- Créer DocTypes, Roles, Workflows dans ERPNext
|
||||
- Continuer Sprints 3, 4, 5, 6, 7, 8 en autonome 24/7
|
||||
- Voir la liste complète · `/opt/oto/claude_code_mandate_dtp/AUTORISATIONS_MICHEL_20260803.md`
|
||||
|
||||
**La contrainte #8 (hors périmètre worker) est LEVÉE.**
|
||||
|
||||
+15
-1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user