5d5e986fa6
Question neuve : quand un même concept-singleton plateforme apparaît comme scalaire dans deux out/*.json indépendants, les valeurs s'accordent-elles ? Une divergence silencieuse ship verte car aucun gate ne compare deux artefacts entre eux. Détecteur teeth-prouvé (57 fichiers ; position GLOBALE sans indice [i] = singleton vs PER-ROW = compte-de-ligne) : mutation cible_rbac_roles 50→49 dans un manifest → MORD. Résultat CLEAN : tous les singletons plateforme s'accordent (cible_rbac_roles=50, ci_modules_count/modules/suites=24, portails=5, doctypes_uniques=45, custom_docperm=116, role_profiles=6, min_score=100, pass_score=95). TRAP documenté : « même nom = même concept » sur-signale — fields/data_fields/permissions/roles/sections/pass divergent car chacun décrit SON propre DocType/suite (per-module-local, pas un singleton). Seul nom SURCHARGÉ divergent = roles_couverts 50 (tous les role-profiles) vs 44 (rôles des 5 portails business = 50 − 6 plateforme) = by-design, les deux re-dérivés de rbac_50_roles.json. 0 gate ajouté (#5, occurrence-zéro rejouable), 0 commande VPS (#8), run_ci 33 PASS 0 FAIL 0 SKIP. Canal stakeholder daily_reports porté 3710253→HEAD. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
226 lines
17 KiB
Markdown
226 lines
17 KiB
Markdown
# Daily Report · 2026-08-06 · Claude Code DTP Worker
|
||
|
||
**Session** : `20260806_011419`
|
||
**Phase roadmap** : Sprint 8 · *Launch + Buffer* — « Monitoring / regression
|
||
exhaustifs » (DevOps/QA) + buffer. Sprints 1→7 livrés côté repo, gatés et verts ;
|
||
le reste (déploiement production réel, builds EAS, dépôts ONAPI) est **hors périmètre
|
||
worker** (VPS `153.75.250.214` · `CLAUDE.md` #8).
|
||
|
||
## Contexte — le canal stakeholder s'arrêtait au `2026-08-05` (HEAD `8903a4b`)
|
||
|
||
Le dernier rapport roadmap datait du **2026-08-05** et attestait au HEAD `8903a4b`.
|
||
Depuis, **deux** jalons du **2026-08-06** ne s'y reflétaient pas encore ; ce rapport
|
||
porte le canal au **HEAD courant `a8342e9`**. **La structure du gate de merge reste
|
||
inchangée** : `run_ci.sh` → **33 PASS · 0 FAIL · 0 SKIP** = **8 gates statiques**
|
||
(`git ls-files 'ci/*.sh'` hors `lib.sh` = 8, recompté) **+ 25 suites** — aucun des
|
||
deux jalons n'ajoute de job.
|
||
|
||
| Jalon | Commit (session) | Nature | Portée / opposabilité au merge |
|
||
|---|---|---|---|
|
||
| **VÉRIF indépendante multi-axes** → CLEAN | `fe61207` (`001412`) | Chasse lecture-seule à un défaut ungaté sur 3 surfaces (docstring↔code des générateurs + helpers `*lib/` · numériques du canal stakeholder re-dérivés · liens markdown in-repo) → **aucune dérive**. Non-défaut connu ré-écarté (compat `validate [-o OUT]` self-consistant). | **Non opposable** (pas un gate · #5) : **0 fichier de production édité**, seul le journal `05_activity_log/` touché. |
|
||
| **FIX docstring↔code** (sous-classe help-text argparse) — `mobile/app_config_gen.py` | `a8342e9` (`004414`) | Le `help=` de la sous-commande `build` énumérait **4** sorties alors que `cmd_build()` en écrit **5** : `store_listing.json` était **omis** du help CLI (la docstring et le README listaient bien les 5). Ligne ajoutée à sa position canonique. Nouvelle sous-classe *help-text argparse* du motif `docstring↔code`. | **Opposable indirectement** : le help n'affecte aucune sortie → **artefacts byte-identiques** (`check_artifacts` vert). **1 ligne de production** éditée, **0 gate ajouté**, **0 artefact reconstruit**. |
|
||
|
||
## Tâche exécutée cette session — currency du canal + attestation indépendante du point courant · 0 édition de production
|
||
|
||
Aucune tâche fonctionnelle **in-repo** ne reste : la roadmap `ROADMAP_8_WEEKS_OR_LESS.md`
|
||
est **intégralement livrée + gatée** (les 7 critères de succès §« Definition of Done »
|
||
sont ✅). Cette session **atteste le point courant `a8342e9`** et re-dérive les chiffres
|
||
stakeholder depuis les artefacts commités, avec un axe de vérification **objectif** de
|
||
plus (bijection comptes-de-tests).
|
||
|
||
### État courant · chiffres re-dérivés d'artefacts commités
|
||
|
||
| Métrique | Valeur | Source (re-calculée ce jour) |
|
||
|---|---|---|
|
||
| Gate de merge | **33 PASS · 0 FAIL · 0 SKIP** | `run_ci.sh` (= 8 statiques + 25 suites) |
|
||
| Gates statiques | **8** | `git ls-files 'ci/*.sh'` hors `lib.sh` |
|
||
| Suites de modules | **25** | jobs `*-tests` de `gate.needs` (`.gitea/workflows/ci.yml`) |
|
||
| Matrice de régression | **624 exécutés · 607 passés · 17 skippés · 0 échec** — **PASS** | `qa/regression/out/regression_run.json` (`totals`) |
|
||
| Modules avec suite de tests | **25** | `find … -name 'test_*.py' -path '*/tests/*'` |
|
||
|
||
Les **17 skips** sont l'oracle `jsonschema` OPTIONNEL neutralisé par `python -S`
|
||
(par design ; lecture stakeholder = 607 passés + 17 skippés, **pas** 624 — voir
|
||
baseline régression).
|
||
|
||
### Axe de vérification objectif ajouté ce jour — bijection compte-de-tests README ↔ réel
|
||
|
||
Pour chaque module, le compte `N tests` annoncé dans le `README.md` a été confronté au
|
||
**nombre réel** de méthodes `def test_*` de sa suite. **Concordance totale sur les 16
|
||
READMEs porteurs d'une annonce** (aucune dérive) :
|
||
|
||
`seo 36` · `bancable 22` · `fiscal/ecf_dgii 39` · `commissions 25` · `dossier_vente 31`
|
||
· `faisabilite/generator 16` · `deploy_runbook 29` · `confotur 44` · `workflow_vente 25`
|
||
· `userperm_gen 12` · `audit_5d 37` · `fixtures_gen 11` · `roleprofile_gen 11` ·
|
||
`apply_plan 16` · `frontend/portails 19` · `demo/scenarios 39`. Les 9 modules sans
|
||
annonce chiffrée dans leur README (dont `publiciste`, scaffold Sprint 2 sans `out/`
|
||
commité) sont cohérents avec leur convention. Le total 16 concorde avec l'en-tête
|
||
faisant autorité de `ci/check_readme_claims.sh` (« 27 claims sur 16 modules »).
|
||
|
||
### Balayage lecture-seule multi-surface préalable — sans dérive
|
||
|
||
- **docstring↔code** re-vérifié sur des modules **non** balayés la veille : `publiciste`
|
||
(docstring/help/writes = `projets_master.json` + `index.html`, cohérents) et
|
||
`fiscal/ecf_dgii` (« 12 invariants » = schéma(1) + 2→12 numérotés dans `_validate`,
|
||
self-consistant — **pas** un défaut, ré-écarté).
|
||
- **Couverture CI** de `publiciste` confirmée présente dans `gate.needs` (`publiciste-tests`).
|
||
- **Structure gate** `ci/*.sh` ↔ `gate.needs` intacte (8 statiques).
|
||
|
||
## Portée / anti-churn (session `011419`)
|
||
|
||
**0 fichier de production édité**, **0 artefact reconstruit**, **0 gate ajouté** (#5),
|
||
**0 chiffre saisi à la main** (#6 — `8` / `33` / `25` / `624`/`607`/`17` recomputés de
|
||
`git ls-files` · `run_ci.sh` · `.gitea/workflows/ci.yml` · `regression_run.json`),
|
||
**aucune commande VPS** (#8). Seule édition : ce rapport de currency + le journal
|
||
`05_activity_log/`.
|
||
|
||
---
|
||
|
||
## Mise à jour de currency — canal porté de `a8342e9` → HEAD `48276ee` (session `034434`)
|
||
|
||
Après le rapport ci-dessus (rédigé session `011419`, HEAD `a8342e9`), **quatre**
|
||
commits ont atterri le même jour. Deux sont des changements de production non encore
|
||
consignés côté stakeholder ; les deux autres n'altèrent aucun fichier de production
|
||
(fix prose d'un compte du présent rapport `14→16`, et une VÉRIF multi-axes CLEAN).
|
||
Cette section porte le canal au **HEAD courant `48276ee`**. **La structure du gate
|
||
de merge reste inchangée** : `run_ci.sh` → **33 PASS · 0 FAIL · 0 SKIP** = **8 gates
|
||
statiques + 25 suites** ; aucun des quatre commits n'ajoute de job.
|
||
|
||
| Jalon | Commit (session) | Nature | Portée / opposabilité au merge |
|
||
|---|---|---|---|
|
||
| **FIX help-text argparse** — `seo/seo_gen.py` | `354a687` (`021424`) | Le `help=` de la sous-commande `build` nommait des **fichiers de sortie INEXISTANTS**. Ré-alignement sur les sorties réelles écrites par `cmd_build()`. Même sous-classe *help-text argparse* du motif `docstring↔code` que `a8342e9`. | **Opposable indirectement** : le help n'affecte aucune sortie → **artefacts byte-identiques** (`check_artifacts` vert). Édition de prod bornée au `help=`, **0 gate ajouté**, **0 artefact reconstruit**. |
|
||
| **FIX générateur** — `crm/financement_bancaire` MANIFEST.`roles_rbac_utilises` | `48276ee` (`031432`) | `finlib/builder.py:89` itérait les **4 SLOTS logiques** de `spec["roles"]` ; 2 slots (`conseiller_wag` ET `validation_dossier`) pointent le **même** rôle `ventes-conseiller` → **4 entrées pour 3 rôles distincts** dans un champ documenté « ensemble distinct ». Preuve-bug : la sortie **drope la clé de slot**, le doublon ne porte aucune info ; les 3 modules frères produisent tous un ensemble distinct (confotur 3/3, commissions 4/4, workflow_vente 7/7), financement seul outlier 4/3. Fix aligné idiome commissions (`sorted({rr["role_id"] …})`) → **artefact reconstruit 3/3 distinct**. | **Opposable directement** : **1 générateur de prod édité + 1 artefact MANIFEST reconstruit** ; `check_artifacts` reste vert (committé == régénéré). **0 gate ajouté** (#5 — champ lu par aucun gate ni consommateur ; convention distinctness déjà tenue par les frères, et depuis l'état propre `check_artifacts` mord une régression future : régénéré-avec-doublon ≠ committé-3-distinct → RED). |
|
||
|
||
### Re-vérification indépendante de `48276ee` menée cette session
|
||
|
||
- **MANIFEST courant** : `roles_rbac_utilises` = **3 objets distincts** (`compta-tresorier`,
|
||
`ventes-conseiller`, `ventes-directeur`), **0 doublon** — fix effectif.
|
||
- **Balayage des surfaces sœurs** : aucune prose/README/test ne cite encore l'ancien
|
||
compte « 4 » ni une liste à 4 entrées (`README.md:54` générique sans nombre ; le
|
||
commentaire `builder.py:89-95` décrit correctement le dédoublonnage). **0 dérive
|
||
résiduelle** du fix (motif « twin fix must sweep ALL surfaces » — ici propre).
|
||
- **Gate** : `run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** au HEAD `48276ee` ; `check_artifacts`
|
||
vert (byte-repro du MANIFEST reconstruit confirmé).
|
||
|
||
### État courant · chiffres re-dérivés d'artefacts commités (HEAD `48276ee`)
|
||
|
||
| Métrique | Valeur | Source (re-calculée ce jour) |
|
||
|---|---|---|
|
||
| Gate de merge | **33 PASS · 0 FAIL · 0 SKIP** | `run_ci.sh` |
|
||
| Gates statiques | **8** | `git ls-files 'ci/*.sh'` hors `lib.sh` |
|
||
| Suites de modules | **25** | jobs `*-tests` de `gate.needs` |
|
||
| Matrice de régression | **624 exécutés · 607 passés · 17 skippés · 0 échec** — **PASS** | `qa/regression/out/regression_run.json` (`totals`) |
|
||
| Modules avec suite de tests | **25** | `find … -name 'test_*.py' -path '*/tests/*'` |
|
||
|
||
Inchangés vs le point `a8342e9` : les deux fixes 08-06 touchent du *help-text* et un
|
||
*champ MANIFEST non compté par un gate*, pas la surface de test → **totaux identiques**.
|
||
|
||
## Portée / anti-churn (session `034434`)
|
||
|
||
**Production éditée cette session : néant.** Re-vérification lecture-seule de la
|
||
dernière prod (`48276ee`) → correcte + complète. **0 artefact reconstruit**, **0 gate
|
||
ajouté** (#5), **0 chiffre saisi à la main** (#6 — `8` / `33` / `25` / `624`/`607`/`17`
|
||
recomputés de `git ls-files` · `run_ci.sh` · `.gitea/workflows/ci.yml` ·
|
||
`regression_run.json`), **aucune commande VPS** (#8). Seules éditions : cette section
|
||
de currency + le journal `05_activity_log/`.
|
||
|
||
## Mise à jour de currency — canal porté de `48276ee` → HEAD `e786c12` (session `061455`)
|
||
|
||
La section précédente arrêtait le canal stakeholder au HEAD `48276ee` (dernier fix
|
||
générateur). **Cinq commits** ont atterri depuis ; cette section porte le canal au **HEAD
|
||
courant `e786c12`** et atteste, ligne à ligne, leur opposabilité au merge.
|
||
|
||
| Commit (session) | Nature | Fichier(s) hors journal | Opposable au merge ? |
|
||
|---|---|---|---|
|
||
| `b274958` (`034434`) | CURRENCY canal `a8342e9`→`48276ee` + re-vérif indépendante | *néant* (daily/journal) | Non — snapshot stakeholder |
|
||
| `4bc9819` (`041444`) | VÉRIF slugs rôle+portail inter-artefacts (980+66 refs) → CLEAN | *néant* (journal) | Non — vérification lecture-seule |
|
||
| `12ec9d0` (`044449`) | VÉRIF clés JSON dupliquées + re-dérivation champs-compte MANIFEST → CLEAN | *néant* (journal) | Non — vérification lecture-seule |
|
||
| `a678534` (`051453`) | VÉRIF encodage/BOM/EOL/py_compile (379 fichiers) → CLEAN | *néant* (journal) | Non — vérification lecture-seule |
|
||
| **`e786c12`** (`054454`) | **FIX doc** — lien Markdown `[`label`](cible)` où le label nomme un fichier gate (`ci/guard_constraints.sh`, `ci/check_docs.sh`) mais l'href pointait ailleurs (`ci/README.md`). Ré-alignement label==cible (navigation véridique). Sous-classe *link-label-vs-target*, origine isolée. | **`README.md`** (3 href, L54+L75) | **Oui — 1 doc de dépôt éditée.** Aucune sortie affectée → `check_docs` vert (cibles nommées existent et sont git-trackées), `check_artifacts` byte-identique, **0 gate ajouté**, **0 artefact reconstruit**. |
|
||
|
||
**Bilan des cinq commits** : **une seule** édition de dépôt opposable (`e786c12`, doc de
|
||
navigation `README.md`) ; les quatre autres sont **0-édition** (canaux daily/journal
|
||
uniquement). Aucun ne touche un générateur, un artefact `out/`, un gate, ni la surface de test.
|
||
|
||
### État courant · chiffres re-dérivés d'artefacts commités (HEAD `e786c12`)
|
||
|
||
| Métrique | Valeur | Source (re-calculée ce jour) |
|
||
|---|---|---|
|
||
| Gate de merge | **33 PASS · 0 FAIL · 0 SKIP** | `run_ci.sh` |
|
||
| Gates statiques | **8** | `git ls-files 'ci/*.sh'` hors `lib.sh` |
|
||
| Suites de modules | **25** | jobs `*-tests` de `gate.needs` (`.gitea/workflows/ci.yml`) |
|
||
| Modules avec suite de tests | **25** | `find … -name 'test_*.py' -path '*/tests/*'` |
|
||
| Matrice de régression | **624 exécutés · 607 passés · 17 skippés · 0 échec** — **PASS** | `qa/regression/out/regression_run.json` (`totals`) |
|
||
|
||
**Inchangés vs le point `48276ee`** : `e786c12` ne touche que 3 href de `README.md` → aucune
|
||
sortie, aucun compte de gate/suite/test modifié. Les totaux sont **byte-identiques** au point
|
||
précédent ; seule la prose de currency avançait faussement « dernière prod = `48276ee`,
|
||
tout le reste 0-édition » alors qu'`e786c12` édite bien `README.md`.
|
||
|
||
## Portée / anti-churn (session `061455`)
|
||
|
||
**Production éditée cette session : néant.** Seule correction : rendre honnête le canal
|
||
stakeholder (`daily_reports`) qui, laissé au point `48276ee`, occultait l'unique édition de
|
||
dépôt survenue depuis (`e786c12`, doc). C'est la classe *prose-facts-vs-numeric-drift*
|
||
(un fait de prose — « dernière prod » — dérivait vs le graphe de commits réel), **pas** un
|
||
re-sweep de vérification. **0 artefact reconstruit**, **0 gate ajouté** (#5), **0 chiffre
|
||
saisi à la main** (#6 — `8`/`25`/`33`/`624`/`607`/`17` recomputés de `git ls-files` ·
|
||
`run_ci.sh` · `ci.yml` · `regression_run.json`), **aucune commande VPS** (#8). Seules
|
||
éditions : cette section de currency + le journal `05_activity_log/`.
|
||
|
||
---
|
||
|
||
## FIX couverture — oracle orphelin `brief.schema.json` câblé au test (session `104533`)
|
||
|
||
**Édition de dépôt cette session : OUI (générateur de tests + 4 artefacts régénérés).**
|
||
Contrairement aux sessions de currency ci-dessus, cette session livre une **amélioration de
|
||
couverture réelle**, pas un sweep lecture-seule.
|
||
|
||
**Constat.** `faisabilite/generator/brief.schema.json` — documenté comme **« Contrat d'entrée »**
|
||
dans le README du module et sibling des deux autres schémas faisabilité — était le **seul des 26
|
||
oracles `*.schema.json` non câblé à un test** : `_validate_brief()` ne garde que le code `projet`
|
||
(`^P0[1-9]$`), jamais la forme complète du brief ; aucun test ne validait les fixtures contre le
|
||
schéma. Un brief drifté hors contrat (type erroné, clé renommée) passait donc inaperçu.
|
||
|
||
**Correction.** Ajout de `test_input_briefs_validate_against_brief_schema` : valide
|
||
`brief_complete.json` **et** `brief_incomplete.json` contre `brief.schema.json` via le **validateur
|
||
maison Publiciste** (zéro-pip, toujours exécuté — pas de skip sous `python -S`). L'« incomplet »
|
||
est conforme au sens schéma (null/champ absent admis) ; il n'est « incomplet » qu'au sens
|
||
sémantique (prix→placeholders). Confirmé par les **deux** validateurs (maison + oracle `jsonschema`).
|
||
|
||
| Chiffre | Avant | Après | Source régénérée |
|
||
|---|---|---|---|
|
||
| Tests `faisabilite/generator` | 16 | **17** | `count_tests` (disque) → `regression_plan.json` |
|
||
| Matrice de régression (exécutés) | 624 | **625** | `qa/regression/out/regression_run.json` (`totals`) |
|
||
| Matrice de régression (passés) | 607 | **608** | idem (17 skippés inchangés) |
|
||
|
||
**Artefacts régénérés** (jamais édités à la main · #6) : `regression_plan.json`,
|
||
`regression_run.json`, `regression/out/MANIFEST.json`, `audit_4big/out/quality_report.json`.
|
||
**Prose gatée réalignée** : README module (`17 tests`), fiches `03_agents/{faisabilite,qa,erpnext_backend}`.
|
||
`run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP** · **0 gate ajouté** (#5) · **aucune commande VPS** (#8).
|
||
|
||
---
|
||
|
||
## Currency canal stakeholder — `3710253` → HEAD `04f4c21` (+ session `141554`)
|
||
|
||
Depuis le jalon *brief.schema* ci-dessus, **six sessions lecture-seule** ont ajouté chacune un **axe
|
||
de vérification objectif encore jamais balayé** — toutes **CLEAN, 0 édition de production, 0 gate
|
||
ajouté** (#5). La **structure du gate de merge reste inchangée** : `run_ci.sh` = **33 PASS · 0 FAIL ·
|
||
0 SKIP** (8 gates statiques + 25 suites) à chaque commit. Aucune n'est opposable au merge — seul le
|
||
journal `05_activity_log/` est touché — sauf **un durcissement de test** (session `124544`).
|
||
|
||
| Commit (session) | Axe NEUF vérifié | Résultat |
|
||
|---|---|---|
|
||
| `27cfe2f` (`111534`) | Intégrité référentielle interne des `$ref` des 26 oracles-schémas | CLEAN 108/108 refs |
|
||
| `6c05538` (`114542`) | Le skip `python -S` de l'oracle jsonschema masque-t-il un écart enum/const ? | CLEAN (1 phantom `{WAG}` = by-design) |
|
||
| `4aea5bd` (`121542`) | Cohérence interne des 26 oracles (required-vacuité + auto-contradiction const/enum/default) | CLEAN 26/26 (1405 nœuds) |
|
||
| `bea5d49` (`124544`) | Atteignabilité transitive d'une assertion (aucun test run-only faux-vert) | CLEAN 0/651 **+ 1 durcissement** (implicite→explicite) |
|
||
| `1839f52` (`131551`) | Cohérence draft/keyword des 26 oracles-schémas (`$schema` vs idiomes cross-draft) | CLEAN 26/26 (tous draft-07) |
|
||
| `04f4c21` (`134554`) | L'artefact **commité sur disque** conforme à son schéma (≠ objet en-mémoire) | CLEAN 57/57 |
|
||
|
||
**Session courante `141554` — axe NEUF « accord numérique INTER-artefacts »** (`out/*.json` ↔ `out/*.json`,
|
||
distinct de l'intra-artefact et du code/prose↔artefact). Les concepts-singletons plateforme s'accordent
|
||
tous cross-fichier (`cible_rbac_roles`=50, `ci_modules_count`/`modules`/`suites`=24, `portails`=5…). Seul
|
||
nom **surchargé** divergent = `roles_couverts` **50** (tous les role-profiles) vs **44** (rôles des 5
|
||
portails business = 50 − 6 `plateforme`) — **by-design, les deux re-dérivés de `rbac_50_roles.json`**.
|
||
**CLEAN · 0 édition de production · 0 gate** (#5) · `run_ci.sh` = **33 PASS · 0 FAIL · 0 SKIP**.
|