[DTP-Worker 20260812_110124] fix correctness · financement_bancaire overall_percent — la barre GLOBALE pouvait afficher 100.0 tout en BLOQUANT (l'invariant per-condition de 093114 ne s'était pas propagé à l'agrégat) → matrice 634→635 · test à dents · exemple byte-identique · sans gate

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-12 11:09:49 +00:00
parent 626c39d958
commit 1992ee63be
11 changed files with 80 additions and 22 deletions
+22 -10
View File
@@ -1,11 +1,11 @@
# Daily Report · 2026-08-12 · Claude Code DTP Worker
**Session** : `20260812_100114` (rapport initialement émis en `20260812_043034` à
**Session** : `20260812_110124` (rapport initialement émis en `20260812_043034` à
`ee88d36` · complété en `20260812_063050` à `37c68ac` · réconcilié en `083114` à `e7cc3c4`
· **re-réconcilié en fin de journée** au HEAD courant)
**HEAD attesté** : `85cd625` (le rapport précédent était épinglé à `35de616` · puis ce
rapport à `ee88d36`, puis `37c68ac`, puis `e7cc3c4` · **un 4ᵉ fix worker de correctness a
suivi** avec un **impact réel sur la matrice** `633→634` — voir §« Jalon du jour · 3ᵉ vague »)
· re-réconcilié en `100114` à `85cd625` · **prolongé au HEAD courant**)
**HEAD attesté** : HEAD courant (le rapport précédent était épinglé à `35de616` · puis ce
rapport à `ee88d36`, `37c68ac`, `e7cc3c4`, `85cd625` · **un 5ᵉ fix worker de correctness a
suivi** avec un **impact réel sur la matrice** `634→635` — voir §« Jalon du jour · 4ᵉ vague »)
**Phase roadmap** : transition **V12 → V18** (Master Institutional Feasibility &
Bankability Engine). La roadmap 8-semaines classique (Sprints 1→8) reste **livrée +
gatée + verte** au dépôt ; le **moteur de faisabilité** V18 est rouvert par directive
@@ -67,6 +67,17 @@ réel** sur entrée réaliste, byte-repro-aveugle, test à dents) : **0 code mot
|---|---|---|---|
| **Fix · `financement_bancaire` : barre pleine ✓ mais dossier BLOQUÉ** | `85cd625` (`20260812_093114`) | `gate.py:97` `_cond_apport` : `pct = _round1(min(100.0, paid/required*100))` arrondit à 1 décimale, tandis que `ok = paid + 1e-9 >= required` est **exact**. Un versement dans la bande **[99.95 %, 100 %[** (p. ex. **19 999 / 20 000 USD** = 99.995 %) remonte `percent: 100.0` (barre frontend « 100 % ✓ ») **tout en bloquant** la soumission (403 · `remaining: 1.0 USD`) — raison de blocage auto-contradictoire. Seul `_cond_apport` est atteignable (les 2 autres conditions = ratios entiers sur petites listes, `percent==100 ⟺ ok` structurel). Fix = garde `if not ok and pct >= 100.0: pct = 99.9` → invariant d'affichage **`percent == 100.0 ⟺ ok`** rétabli. `dossier_exemple` commité à 67.8 % (hors bande) → `gate_status_example.json` **byte-identique**. Test à dents `test_apport_quasi_complet_ninclut_pas_100pct`. | **Opposable** : bug d'affichage user-facing corrigé ; suite financement **35→36**, matrice **633/616 → 634/617** ; artefacts régression/audit régénérés = pure propagation. |
## Jalon du jour · 4ᵉ vague (`85cd625` → HEAD courant) — même bug, un niveau au-dessus
Un **5ᵉ fix worker de correctness** prolonge exactement le 4ᵉ : la 3ᵉ vague avait rétabli
l'invariant **`percent == 100.0 ⟺ ok`** *au niveau de chaque condition* (`_cond_apport`),
mais l'**agrégat** `overall_percent` (la **barre GLOBALE**) le violait toujours — même
classe de bug, un cran plus haut, que le fix précédent avait manqué.
| Jalon | Commit (session) | Nature | Opposabilité au merge |
|---|---|---|---|
| **Fix · `financement_bancaire` : barre GLOBALE 100 % mais dossier BLOQUÉ** | `20260812_110124` | `gate.py` `gate_status` : `overall = _round1(Σ percents / 4)`. Cas limite = apport plafonné à **99.9** (non ok, cf. fix 3ᵉ vague) **+** les 3 autres conditions à **100.0** (ok) → moyenne `(99.9 + 300)/4 = 99.975``round1` = **100.0**. La barre **globale** afficherait « 100 % » tout en refusant la soumission (403) — même auto-contradiction que le fix `_cond_apport`, mais à l'agrégat. Fix = garde `if not can_submit and overall >= 100.0: overall = 99.9` → invariant d'affichage **`overall_percent == 100.0 ⟺ can_submit`**. `gate_status_example.json` commité à `overall_percent: 39.1` (hors bande) → **byte-identique**. Test à dents `test_overall_percent_agrege_ninclut_pas_100pct` (mord `100.0 not less than 100.0` sans la garde). | **Opposable** : bug d'affichage user-facing corrigé ; suite financement **36→37**, matrice **634/617 → 635/618** ; artefacts régression/audit régénérés = pure propagation. |
## Chemin critique bloqué — séquence moteur V18 (inchangé)
La directive V18 (`DIRECTIVE_V18_MASTER_FEASIBILITY_ENGINE_20260810.md`) impose une
@@ -85,29 +96,30 @@ D-06 (`OPEN_DECISIONS_REGISTER.md`). Les arbitrages ouverts restent :
> (Master Project Intake / Data Model). Escalation : WhatsApp `+18296296385` ·
> `mroy@worldactivitiesrd.com`.
## État courant · chiffres re-dérivés d'artefacts commités (HEAD `85cd625`)
## État courant · chiffres re-dérivés d'artefacts commités (HEAD courant)
| 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** exécutées / **24** gatées régression | jobs `*-tests` de `gate.needs` (`.gitea/workflows/ci.yml`) ; la régression s'auto-exclut de son propre recensement |
| Matrice de régression | **634 exécutés · 617 passés · 17 skippés · 0 échec****PASS** | `qa/regression/out/regression_run.json` (`totals`) |
| Matrice de régression | **635 exécutés · 618 passés · 17 skippés · 0 échec****PASS** | `qa/regression/out/regression_run.json` (`totals`) |
| Audit 4Big | **verdict PASS · 24 modules · score min 100/100** | `qa/audit_4big/out/quality_report.json` (`verdict` · `modules` · `coverage`) |
| Bijection couverture | **24 CI ↔ 24 registre** (`ok: true`, 0 manquant) | `quality_report.json` (`coverage`) |
Les **17 skips** sont l'oracle `jsonschema` OPTIONNEL neutralisé par `python -S` (par
design ; lecture stakeholder = **617 passés + 17 skippés**, **pas** 634 — voir baseline
design ; lecture stakeholder = **618 passés + 17 skippés**, **pas** 635 — voir baseline
régression). Trajectoire de la matrice depuis le rapport précédent (`628/611` à
`35de616`) : **+1** au `39def91` (test verrou NBSP publiciste, 628→**629**) ; stable à
`629/612` sur la 1ʳᵉ vague de vérif/hardening (`a17d86a`/`1513e69`/`37c68ac`, artefacts
byte-identiques) ; puis **2ᵉ vague de correctness****+1** au `aeb30b8` (630/613), **+1**
au `5af86e3` (631/614), **+2** au `e7cc3c4` (633/616) ; puis **3ᵉ vague****+1** au
`85cd625` (fix gate financement, **634/617**). Chaque incrément = un **test de
`85cd625` (fix gate financement per-condition, **634/617**) ; puis **4ᵉ vague****+1**
au HEAD courant (fix gate financement **agrégat** `overall_percent`, **635/618**). Chaque incrément = un **test de
régression à dents** ajouté par un fix ; **aucun nouveau gate** (une divergence de compte
serait déjà structurellement rougie par `check_readme_claims`, ∈ `run_ci`). Les commits
non-test (`031b5e7` PNG · `ee88d36` cleanup orphelin · `cb8069b` notes `:g` pures) **ne
touchent aucun test**. Matrice courante **634/617/17** au HEAD `85cd625`.
touchent aucun test**. Matrice courante **635/618/17** au HEAD courant.
## Portée / anti-churn (session `20260812_100114` · re-réconcilie `083114` au HEAD `85cd625`)