Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
9c4df11
docs(25-4): découpée en a/b/c ; 25-4-a spécifiée — l'avoir compté TTC…
guycorbaz Sep 26, 2026
0f4b9ec
docs(25-4-a): prompt de validation P1 (refs #455, refs #456)
guycorbaz Sep 26, 2026
73172c8
docs(25-4): Q1 tranchée — QR sans montant sur une relance partielleme…
guycorbaz Sep 26, 2026
1ed7313
docs(25-4): le reste à payer figure aussi sur le PDF joint à la relan…
guycorbaz Sep 26, 2026
f288117
docs(25-4): le document joint est un rappel pour un montant partiel, …
guycorbaz Sep 26, 2026
b62db3c
docs(25-4-a): validation P1 — #455 exposé par l'API, bouton d'avoir a…
guycorbaz Sep 26, 2026
ca66c11
docs(25-4-a): prompt de validation P2 ; plages de monter harmonisées …
guycorbaz Sep 26, 2026
7503be9
docs(25-4): la QR du rappel porte le reste dû, une règle pour les deu…
guycorbaz Sep 26, 2026
5c337d6
docs(25-4): frais de rappel configurables, rien d'affiché à zéro (ref…
guycorbaz Sep 26, 2026
451e2cc
docs(25-4-a): validation P2 — facture auxiliaire du gabarit, amountDu…
guycorbaz Sep 26, 2026
1344b3a
docs(25-4-a): prompt de validation P3 ciblée (refs #455, refs #456)
guycorbaz Sep 26, 2026
9df357e
docs(25-4-a): validation P3 ciblée — propagation des corrections P1 (…
guycorbaz Sep 26, 2026
b18f7cd
docs(25-4): avoir sur facture réglée refusé en 25-4-a (levée : #471) …
guycorbaz Sep 26, 2026
5ed4a70
docs(25-4-a): prompt de validation P4 ciblée (refs #455, refs #456)
guycorbaz Sep 26, 2026
ab9b944
docs(25-4-a): validation P4 — close en 4 passes, prête pour le dev (r…
guycorbaz Sep 26, 2026
9bf2bb2
feat(25-4-a): le reste dû compte l'avoir TTC, et l'avoir est refusé s…
guycorbaz Sep 26, 2026
21ee264
docs(25-4-a): prompt de la revue de code P1 (refs #455, refs #456)
guycorbaz Sep 26, 2026
41e14e4
docs(25-4-a): revue P1 à zéro au-dessus de LOW — story done (refs #45…
guycorbaz Sep 26, 2026
8e8508b
docs(25-4-b): découpée en b1/b2 ; 25-4-b1 spécifiée — le reste dû à l…
guycorbaz Sep 26, 2026
cfd2a77
docs(25-4-b1): prompt de validation P1 (refs #416)
guycorbaz Sep 26, 2026
73f72e8
docs(25-4-b1): validation P1 — portée de l'invariant balance âgée = g…
guycorbaz Sep 26, 2026
9cbf960
docs(25-4-b1): prompt de validation P2 (refs #416)
guycorbaz Sep 26, 2026
58a874a
docs(25-4-b1): validation P2 — la portée de l'invariant oubliait le r…
guycorbaz Sep 26, 2026
7225548
docs(25-4-b1): prompt de validation P3 ciblée (refs #416)
guycorbaz Sep 26, 2026
861823e
docs(25-4-b1): validation P3 — la portée de l'invariant s'énonce par …
guycorbaz Sep 26, 2026
5480b4f
docs(25-4-b1): prompt de validation P4 ciblée (refs #416)
guycorbaz Sep 26, 2026
5824c04
docs(25-4-b1): validation P4 — cinquième site de l'état hérité, contr…
guycorbaz Sep 26, 2026
3287d33
docs(25-4-b1): prompt de validation P5 ciblée (refs #416)
guycorbaz Sep 26, 2026
8c5eebf
docs(25-4-b1): validation close en 5 passes (refs #416)
guycorbaz Sep 26, 2026
bd06e78
docs(25-4-b1): pas de découpage (Guy), dev lancé (refs #416)
guycorbaz Sep 27, 2026
87cbc8b
feat(25-4-b1): résiduel aux agrégats — balance âgée et échéancier (re…
guycorbaz Sep 27, 2026
e1713da
docs(25-4-b1): gate E2E tenu, story en review (refs #416)
guycorbaz Sep 27, 2026
0395196
fix(25-4-b1): revue P1 — la balance âgée ne perd plus un client compe…
guycorbaz Sep 27, 2026
8767635
docs(25-4-b1): revue close en 2 passes, gates verts, story done (refs…
guycorbaz Sep 27, 2026
1fb9b47
Merge origin/main (squash #472) dans story/25-4-b-residuel-aux-agregats
guycorbaz Sep 27, 2026
2ae8844
docs(25-4-b2): story créée — le rappel réclame le reste dû (refs #416)
guycorbaz Sep 27, 2026
8166d4f
docs(25-4-b2): arbitrages Q1 et Q2 de Guy (refs #416)
guycorbaz Sep 27, 2026
f2a8fb5
docs(25-4-b2): prompt de validation P1 (refs #416)
guycorbaz Sep 27, 2026
ac38508
docs(25-4-b2): validation P1 — refus classé en lot, locale, géométrie…
guycorbaz Sep 27, 2026
f9e72d6
docs(25-4-b2): prompt de validation P2 (refs #416)
guycorbaz Sep 27, 2026
9c5c8a6
docs(25-4-b2): validation P2 — variables de rappel à documenter, non …
guycorbaz Sep 27, 2026
47366e2
Merge origin/main (squash #475) dans story/25-4-b2-residuel-aux-rappels
guycorbaz Sep 27, 2026
9a6fbd1
docs(25-4-b2): prompt de validation P3 (refs #416)
guycorbaz Sep 27, 2026
6197bff
docs(25-4-b2): validation P3 — pas de ligne avoir, largeur, second si…
guycorbaz Sep 27, 2026
995af7a
docs(25-4-b2): pas de découpage (Guy) ; M5 précisé (refs #416)
guycorbaz Sep 27, 2026
b859b39
docs(25-4-b2): prompt de validation P4 ciblée (refs #416)
guycorbaz Sep 27, 2026
d06b5c6
docs(25-4-b2): validation P4 ciblée — citations qualifiées par leur c…
guycorbaz Sep 27, 2026
e33f9d2
docs(25-4-b2): prompt de validation P5 ciblée (refs #416)
guycorbaz Sep 27, 2026
e65dcf4
docs(25-4-b2): validation P5 ciblée — noms nus traités comme classe ;…
guycorbaz Sep 27, 2026
4608196
docs(25-4-b2): M5 hors périmètre (#477), validation close (refs #416)
guycorbaz Sep 27, 2026
7b20d68
feat(25-4-b2): le rappel réclame le reste dû — texte, PDF « Rappel » …
guycorbaz Sep 27, 2026
7541702
fix(25-4-b2): revue P1 — envoi refusé si le reste a changé depuis l'a…
guycorbaz Sep 27, 2026
f05285a
docs(25-4-b2): revue close en 2 passes, gates verts, story done (refs…
guycorbaz Sep 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

- **La balance âgée et l'échéancier comptaient le montant facturé, et non ce que le client doit encore ([#416](https://github.com/guycorbaz/kesh/issues/416)).** Depuis le règlement partiel, une facture de 1'000.— réglée à 900.— y pesait toujours 1'000.—. ⚠️ La balance âgée est l'outil qui dit **qui relancer et pour combien** : elle surévaluait chaque créance de tout ce qui avait déjà été encaissé, sans que rien ne le signale, et ne concordait plus avec le compte clients du grand livre. Elle répartit désormais le **reste dû**, dans la tranche de l'échéance de la facture — un acompte ne rajeunit pas la créance. L'échéancier montre une colonne **« Reste dû »** à côté du total, le statut **« Partiellement payée »**, des totaux au reste dû, et son dialogue de règlement se **pré-remplit** au reste dû ; l'export CSV porte la même colonne. Le manuel dit à quelles conditions le total de la balance âgée égale le solde du compte clients.

- **Un rappel réclamait le montant entier d'une facture déjà réglée en partie ([#416](https://github.com/guycorbaz/kesh/issues/416)).** Une facture de 1 081.— réglée de 900.— était relancée pour **1 081.— plus les frais**, et le PDF joint — la facture elle-même — portait une QR-facture à 1 081.— : le client qui la scannait **payait une seconde fois** ce qu'il avait déjà réglé. Le rappel réclame désormais le **reste dû** : le courrier l'annonce (plus les frais s'il y en a), et le PDF joint est un **rappel** — il en porte le titre, dit ce qui est déjà réglé et ce qui reste à payer, et sa QR demande le reste, avec la **même référence** que la facture, pour que le rapprochement reconnaisse le paiement.

**Un règlement arrivé pendant que l'aperçu est ouvert fait refuser l'envoi** : le courrier validé annoncerait un autre montant que la QR jointe. Il suffit de rouvrir l'aperçu.

**Les frais de rappel ne s'affichent plus quand ils sont nuls** — les modèles fournis écrivaient « frais de rappel de 0.00 ». Ils ne sont **jamais** dans la QR : ils ne sont pas comptabilisés ([#401](https://github.com/guycorbaz/kesh/issues/401)), et un versement qui les inclurait serait refusé comme trop-perçu ; le PDF les mentionne sur une ligne à part.

⚠️ **Le rappel PDF ne part qu'avec un rappel envoyé par e-mail.** Pour une mise en demeure envoyée hors de Kesh ou un contact sans e-mail, le PDF imprimable reste celui de la facture, au montant total ([#477](https://github.com/guycorbaz/kesh/issues/477)). ⚠️ **Un modèle de rappel personnalisé** qui écrit `{reminderFee}` en toutes lettres affiche toujours « 0.00 » sans frais : la nouvelle variable `{feeNotice}` est vide dans ce cas.

### Changed

- **Le bouton *Créer un avoir* s'affiche aussi sur une facture payée**, et c'est voulu. Il était masqué sur une facture payée mais pas sur une facture réglée en partie : l'écran ne couvrait que la moitié de la règle. Il reste désormais visible, et Kesh explique le refus dans le dialogue — comme le bouton *Dévalider*.
Expand Down
472 changes: 472 additions & 0 deletions _bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Prompt — validation P1, Story 25-4-b2 (le résiduel aux rappels)

*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels` (empilée sur la 25-4-b1,
PR #475). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`.
Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy, et ceux de la fiche Q1/Q2 : **ne pas les
contester**, en contester la mise en œuvre). Sœur : `25-4-b1-residuel-aux-agregats.md`. Issue :
`gh issue view 416`. Contexte : `24-2-encaissement-client.md`, les stories de l'Epic 21 sur les
rappels (`ls _bmad-output/implementation-artifacts/21-*`). Règles : `CLAUDE.md`. Checklist :
`.claude/skills/bmad-create-story/checklist.md`.

## Axes — tous obligatoires

1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme.
2. **Inventaire des sites qui disent un montant au client à l'occasion d'un rappel** — pars du
symptôme, pas de la liste de la fiche : `grep -rn "total_due\|totalDue\|invoice_total_ttc\|total_ttc\|reminderFee\|fee_amount" crates/ frontend/src`.
Pour chaque site : couvert par la fiche, légitimement au TTC, ou oublié (au moins MEDIUM).
Existe-t-il d'autres chemins d'envoi ou d'impression d'un rappel (manuel, renvoi, lot, aperçu,
export, page d'accueil) ?
3. **La QR (AC 7)** : la référence et le message sont-ils vraiment indépendants du montant ? Le
montant de la QR d'un rappel peut-il différer du total imprimé sans que le PDF se contredise ?
Arrondi : `amount_due` est en DECIMAL(19,4), la QR exige 2 décimales — où arrondir, et que
devient un reste de 0.004 ?
4. **Les frais (AC 2, 3, 8)** : « frais cumulés » = autres niveaux + niveau courant — cohérent avec
`sum_fees_deduped_excluding` et avec ce que dit `{totalDue}` ? `{feeNotice}` : la liste blanche,
la validation des gabarits personnalisés existants (un gabarit enregistré avec `{reminderFee}`
reste-t-il valide ?), l'éditeur de gabarits du frontend liste-t-il les variables (où ?).
5. **Le refus du reste nul (AC 9)** : le pattern batch du `CLAUDE.md` est-il respecté par la forme
actuelle de la réponse du lot (lis-la) ? L'éligibilité (`dunning_eligibility.rs`) devrait-elle
exclure ces factures en amont plutôt ?
6. **Le PDF (AC 5, 6, 8)** : géométrie (réserve, gardes), clés i18n et test positionnel, patron de
surcharge de l'avoir — la locale utilisée (contact vs configuration) est-elle la bonne ?
L'archivage #387 est-il vraiment hors d'atteinte ?
7. **Les tests (AC 10)** : chacun est-il faisable et prouve-t-il ce qu'il annonce ? L'E2E : peut-on
monter un règlement partiel puis un aperçu de rappel depuis Playwright ? Mutations tuables ?
8. **Le manuel** : lignes citées, et **PDF aplati**
(`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, idem `admin-manual.pdf`,
vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/4fb1e50e-3db4-4da6-9933-bcee4a186408/scratchpad/`).
D'autres textes (manuels de/en/it, api-external, README, website) disent-ils que le rappel ou sa
QR réclament le TTC ?
9. **Le périmètre** : cinq modules annoncés — recompte-les depuis les tâches. Quelque chose de la
b1 ou de la 25-4-c/d appartient-il ici, ou l'inverse ?

## Ce que tu rends

- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et
résultat, code lu), correction proposée.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle
ne compte pas.

## Interdits

⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base —
`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`,
`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/
`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`,
`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`,
`pdftotext` vers le scratchpad, `cargo check`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Prompt — validation P2, Story 25-4-b2 (le résiduel aux rappels)

*Versionné le 2026-09-27. **Une lentille** (Haiku), contexte frais.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels` (empilée sur la 25-4-b1,
PR #475). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`.
Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy, et ceux de la fiche Q1/Q2 : **ne pas les
contester**, en contester la mise en œuvre). Sœur : `25-4-b1-residuel-aux-agregats.md`. Issue :
`gh issue view 416`. Contexte : `24-2-encaissement-client.md`, les stories de l'Epic 21 sur les
rappels (`ls _bmad-output/implementation-artifacts/21-*`). Règles : `CLAUDE.md`. Checklist :
`.claude/skills/bmad-create-story/checklist.md`.

## Axes — tous obligatoires

1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme.
2. **Inventaire des sites qui disent un montant au client à l'occasion d'un rappel** — pars du
symptôme, pas de la liste de la fiche : `grep -rn "total_due\|totalDue\|invoice_total_ttc\|total_ttc\|reminderFee\|fee_amount" crates/ frontend/src`.
Pour chaque site : couvert par la fiche, légitimement au TTC, ou oublié (au moins MEDIUM).
Existe-t-il d'autres chemins d'envoi ou d'impression d'un rappel (manuel, renvoi, lot, aperçu,
export, page d'accueil) ?
3. **La QR (AC 7)** : la référence et le message sont-ils vraiment indépendants du montant ? Le
montant de la QR d'un rappel peut-il différer du total imprimé sans que le PDF se contredise ?
Arrondi : `amount_due` est en DECIMAL(19,4), la QR exige 2 décimales — où arrondir, et que
devient un reste de 0.004 ?
4. **Les frais (AC 2, 3, 8)** : « frais cumulés » = autres niveaux + niveau courant — cohérent avec
`sum_fees_deduped_excluding` et avec ce que dit `{totalDue}` ? `{feeNotice}` : la liste blanche,
la validation des gabarits personnalisés existants (un gabarit enregistré avec `{reminderFee}`
reste-t-il valide ?), l'éditeur de gabarits du frontend liste-t-il les variables (où ?).
5. **Le refus du reste nul (AC 9)** : le pattern batch du `CLAUDE.md` est-il respecté par la forme
actuelle de la réponse du lot (lis-la) ? L'éligibilité (`dunning_eligibility.rs`) devrait-elle
exclure ces factures en amont plutôt ?
6. **Le PDF (AC 5, 6, 8)** : géométrie (réserve, gardes), clés i18n et test positionnel, patron de
surcharge de l'avoir — la locale utilisée (contact vs configuration) est-elle la bonne ?
L'archivage #387 est-il vraiment hors d'atteinte ?
7. **Les tests (AC 10)** : chacun est-il faisable et prouve-t-il ce qu'il annonce ? L'E2E : peut-on
monter un règlement partiel puis un aperçu de rappel depuis Playwright ? Mutations tuables ?
8. **Le manuel** : lignes citées, et **PDF aplati**
(`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, idem `admin-manual.pdf`,
vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/4fb1e50e-3db4-4da6-9933-bcee4a186408/scratchpad/`).
D'autres textes (manuels de/en/it, api-external, README, website) disent-ils que le rappel ou sa
QR réclament le TTC ?
9. **Le périmètre** : cinq modules annoncés — recompte-les depuis les tâches. Quelque chose de la
b1 ou de la 25-4-c/d appartient-il ici, ou l'inverse ?

10. **Les corrections de la passe 1** (Change Log, entrée « Validation P1 », commit `ac38508f` :
`git show ac38508f`) : chacune est-elle juste, et a-t-elle introduit une contradiction ailleurs
dans la fiche ? En particulier : le refus classé en lot (AC 9) — `BatchItemError::failed` rend-il
bien la forme attendue par la réponse du lot ? La règle « un seul arrondi » (AC 7) est-elle
compatible avec `{totalDue}` qui ajoute des frais en DECIMAL(7,2) ? La fonction `amount_credited`
à créer : même contrat que ses deux voisines (scoping, signe) ?

⚠️ Pour toute affirmation qu'un code manque ou qu'une ligne dit autre chose, cite la sortie de
`grep -nF` ou de `sed -n` qui l'établit — sinon le finding ne sera pas retenu.

## Ce que tu rends

- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et
résultat, code lu), correction proposée.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle
ne compte pas.

## Interdits

⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base —
`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`,
`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/
`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`,
`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`,
`pdftotext` vers le scratchpad, `cargo check`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Prompt — validation P3, Story 25-4-b2 (le résiduel aux rappels)

*Versionné le 2026-09-27. **Une lentille** (Opus), contexte frais.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels` (empilée sur la 25-4-b1,
PR #475). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`.
Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy, et ceux de la fiche Q1/Q2 : **ne pas les
contester**, en contester la mise en œuvre). Sœur : `25-4-b1-residuel-aux-agregats.md`. Issue :
`gh issue view 416`. Contexte : `24-2-encaissement-client.md`, les stories de l'Epic 21 sur les
rappels (`ls _bmad-output/implementation-artifacts/21-*`). Règles : `CLAUDE.md`. Checklist :
`.claude/skills/bmad-create-story/checklist.md`.

## Axes — tous obligatoires

1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme.
2. **Inventaire des sites qui disent un montant au client à l'occasion d'un rappel** — pars du
symptôme, pas de la liste de la fiche : `grep -rn "total_due\|totalDue\|invoice_total_ttc\|total_ttc\|reminderFee\|fee_amount" crates/ frontend/src`.
Pour chaque site : couvert par la fiche, légitimement au TTC, ou oublié (au moins MEDIUM).
Existe-t-il d'autres chemins d'envoi ou d'impression d'un rappel (manuel, renvoi, lot, aperçu,
export, page d'accueil) ?
3. **La QR (AC 7)** : la référence et le message sont-ils vraiment indépendants du montant ? Le
montant de la QR d'un rappel peut-il différer du total imprimé sans que le PDF se contredise ?
Arrondi : `amount_due` est en DECIMAL(19,4), la QR exige 2 décimales — où arrondir, et que
devient un reste de 0.004 ?
4. **Les frais (AC 2, 3, 8)** : « frais cumulés » = autres niveaux + niveau courant — cohérent avec
`sum_fees_deduped_excluding` et avec ce que dit `{totalDue}` ? `{feeNotice}` : la liste blanche,
la validation des gabarits personnalisés existants (un gabarit enregistré avec `{reminderFee}`
reste-t-il valide ?), l'éditeur de gabarits du frontend liste-t-il les variables (où ?).
5. **Le refus du reste nul (AC 9)** : le pattern batch du `CLAUDE.md` est-il respecté par la forme
actuelle de la réponse du lot (lis-la) ? L'éligibilité (`dunning_eligibility.rs`) devrait-elle
exclure ces factures en amont plutôt ?
6. **Le PDF (AC 5, 6, 8)** : géométrie (réserve, gardes), clés i18n et test positionnel, patron de
surcharge de l'avoir — la locale utilisée (contact vs configuration) est-elle la bonne ?
L'archivage #387 est-il vraiment hors d'atteinte ?
7. **Les tests (AC 10)** : chacun est-il faisable et prouve-t-il ce qu'il annonce ? L'E2E : peut-on
monter un règlement partiel puis un aperçu de rappel depuis Playwright ? Mutations tuables ?
8. **Le manuel** : lignes citées, et **PDF aplati**
(`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, idem `admin-manual.pdf`,
vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/4fb1e50e-3db4-4da6-9933-bcee4a186408/scratchpad/`).
D'autres textes (manuels de/en/it, api-external, README, website) disent-ils que le rappel ou sa
QR réclament le TTC ?
9. **Le périmètre** : cinq modules annoncés — recompte-les depuis les tâches. Quelque chose de la
b1 ou de la 25-4-c/d appartient-il ici, ou l'inverse ?

10. **Les corrections des passes 1 et 2** (Change Log ; `git show ac38508f` et `git show 9c5c8a60`) : chacune est-elle juste, et a-t-elle introduit une contradiction ailleurs
dans la fiche ? En particulier : le refus classé en lot (AC 9) — `BatchItemError::failed` rend-il
bien la forme attendue par la réponse du lot ? La règle « un seul arrondi » (AC 7) est-elle
compatible avec `{totalDue}` qui ajoute des frais en DECIMAL(7,2) ? La fonction `amount_credited`
à créer : même contrat que ses deux voisines (scoping, signe) ?

11. ⚠️ **La passe 2 a rendu 0 finding sans preuve** et a manqué un MEDIUM sur l'axe 8 : ne te fie
à aucune de ses conclusions. En particulier, refais les axes 2, 4, 6 et 7 comme s'ils n'avaient
jamais été exercés. Cherche aussi ce que la fiche **n'énumère pas** : les tests existants que le
changement de `{totalDue}`, des gabarits par défaut et du PDF joint va casser (grep des
assertions sur ces textes dans `crates/*/tests`, `crates/*/src` et `frontend/tests/e2e`) —
la fiche doit les nommer.

⚠️ Pour toute affirmation qu'un code manque ou qu'une ligne dit autre chose, cite la sortie de
`grep -nF` ou de `sed -n` qui l'établit — sinon le finding ne sera pas retenu.

## Ce que tu rends

- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et
résultat, code lu), correction proposée.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle
ne compte pas.

## Interdits

⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base —
`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`,
`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/
`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`,
`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`,
`pdftotext` vers le scratchpad, `cargo check`.
Loading
Loading