Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 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
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

- **Un avoir pouvait viser une facture déjà réglée en partie ([#456](https://github.com/guycorbaz/kesh/issues/456)), et le compte du client devenait créditeur sans que rien ne le signale.** L'avoir était refusé sur une facture **payée**, mais pas sur une facture réglée **en partie** — qui, depuis le règlement partiel, n'est « payée » qu'une fois soldée. Comme l'avoir annule tout le montant de la facture, le client se retrouvait avec un crédit du montant déjà encaissé, que Kesh ne sait ni montrer, ni rembourser. L'avoir est désormais refusé dès qu'un règlement existe, avec un message qui dit quoi faire : annuler d'abord le règlement. *(Autoriser l'avoir sur une facture encaissée, avec le remboursement ou l'imputation qu'il appelle, est suivi par [#471](https://github.com/guycorbaz/kesh/issues/471).)*

- **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.

### 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
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,13 @@ Claude Opus 5.5.

## Change Log

- **2026-09-27** — ⚠️ **Rectification après livraison** (relevée en validation de 25-4-b1, P3-P4) :
l'AC 13 dit l'état « avoir après règlement partiel » atteignable **« que par l'import d'une
sauvegarde antérieure »**. C'est **faux par omission** : la **0.12.0 publiée** accepte cet avoir
(`git show v0.12.0:crates/kesh-db/src/repositories/credit_notes.rs:302`), si bien qu'une
installation **mise à jour sur place** peut le porter. Lire : « des données antérieures à la
0.12.1, restaurées ou mises à jour ». Les quatre commentaires de code qui reprenaient la
formulation sont rectifiés par 25-4-b1 (T0) ; le manuel disait déjà juste.
- **2026-09-27** — **revue de code P1** (Sonnet, diff `ab9b9448..9bf2bb2b`, prompt
`25-4-a-review-prompt-p1.md`) — **0 au-dessus de LOW, 1 LOW** : le compte rendu attribuait la
formule « réglée, même en partie » aux deux limites du manuel, la seconde dit « déjà encaissée,
Expand Down
467 changes: 467 additions & 0 deletions _bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Prompt — validation P1, Story 25-4-b1 (le résiduel aux agrégats)

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

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats` (empilée sur la 25-4-a,
PR #472). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`.
Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy : **ne pas les contester**). Sœur livrée :
`25-4-a-residuel-juste.md`. Issue : `gh issue view 416`. Contexte : `24-2-encaissement-client.md`
§ D3, D4, invariants. 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 somment le TTC là où le reste dû est la grandeur** — pars du symptôme,
pas de la liste de la fiche : `grep -rn "lt.ttc\|total_ttc\|totalTtc\|INVOICE_TTC" crates/ frontend/src`.
Pour chaque site, dis s'il est dans la b1, dans la b2 (rappels), ou légitimement au TTC. Un site
oublié est au moins MEDIUM.
3. **L'invariant de concordance (AC 5)** : est-il vrai en théorie ? Liste ce qui meut le compte
1100 hors factures (écritures manuelles, soldes d'ouverture, contre-passations, annulation de
règlement, avoir, facture annulée avec règlement hérité) et vérifie que le montage prescrit les
exclut ou les inclut à bon escient. Le « périmètre `validated AND paid_at IS NULL` » rend-il la
concordance possible (factures `cancelled` à reste dû négatif hérité ?).
4. **Le N+1 (AC 8)** : la liste utilise aujourd'hui la forme **corrélée** du TTC
(`INVOICE_TTC_SUBQUERY_SQL`) ; la fiche prescrit la forme jointe pour le reste dû — cohérence,
coût, et risque de divergence entre `total_ttc` (corrélé) et `amount_due` (joint) sur une même
ligne.
5. **Le frontend** : `statusOf` / `paymentStatus` partageables ? Le dialogue pré-rempli : que se
passe-t-il pour une facture à reste dû négatif ou nul ? Le filtre « payées » de l'échéancier
montre-t-il des factures dont `amountDue` = 0 ?
6. **Les tests** (AC 12) : chacun prouve-t-il ce qu'il annonce ? L'E2E modifié de la 24-3 : le
montage (facture partiellement réglée) est-il faisable depuis Playwright ? Les mutations sont-
elles tuables ?
7. **Le manuel** : lignes citées, et **PDF aplati**
(`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, vers
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`).
D'autres textes (admin-manual, api-external, README, website) promettent-ils le TTC ?
8. **Le découpage b1/b2** : quelque chose de b1 appartient-il à b2, ou l'inverse ? La PR de b1 en
`refs #416` est-elle juste ?

## Ce que tu rends

- **Findings** : sévérité, endroit exact, **preuve** (commande et résultat, code lu), correction.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.**

## 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,65 @@
# Prompt — validation P2, Story 25-4-b1 (le résiduel aux agrégats)

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

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats` (empilée sur la 25-4-a,
PR #472). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`.
Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy : **ne pas les contester**). Sœur livrée :
`25-4-a-residuel-juste.md`. Issue : `gh issue view 416`. Contexte : `24-2-encaissement-client.md`
§ D3, D4, invariants. 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 somment le TTC là où le reste dû est la grandeur** — pars du symptôme,
pas de la liste de la fiche : `grep -rn "lt.ttc\|total_ttc\|totalTtc\|INVOICE_TTC" crates/ frontend/src`.
Pour chaque site, dis s'il est dans la b1, dans la b2 (rappels), ou légitimement au TTC. Un site
oublié est au moins MEDIUM.
3. **L'invariant de concordance (AC 5)** : est-il vrai en théorie ? Liste ce qui meut le compte
1100 hors factures (écritures manuelles, soldes d'ouverture, contre-passations, annulation de
règlement, avoir, facture annulée avec règlement hérité) et vérifie que le montage prescrit les
exclut ou les inclut à bon escient. Le « périmètre `validated AND paid_at IS NULL` » rend-il la
concordance possible (factures `cancelled` à reste dû négatif hérité ?).
4. **Le N+1 (AC 8)** : la liste utilise aujourd'hui la forme **corrélée** du TTC
(`INVOICE_TTC_SUBQUERY_SQL`) ; la fiche prescrit la forme jointe pour le reste dû — cohérence,
coût, et risque de divergence entre `total_ttc` (corrélé) et `amount_due` (joint) sur une même
ligne.
5. **Le frontend** : `statusOf` / `paymentStatus` partageables ? Le dialogue pré-rempli : que se
passe-t-il pour une facture à reste dû négatif ou nul ? Le filtre « payées » de l'échéancier
montre-t-il des factures dont `amountDue` = 0 ?
6. **Les tests** (AC 12) : chacun prouve-t-il ce qu'il annonce ? L'E2E modifié de la 24-3 : le
montage (facture partiellement réglée) est-il faisable depuis Playwright ? Les mutations sont-
elles tuables ?
7. **Le manuel** : lignes citées, et **PDF aplati**
(`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, vers
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`).
D'autres textes (admin-manual, api-external, README, website) promettent-ils le TTC ?
8. **Le découpage b1/b2** : quelque chose de b1 appartient-il à b2, ou l'inverse ? La PR de b1 en
`refs #416` est-elle juste ?

## Ce que tu rends

- **Findings** : sévérité, endroit exact, **preuve** (commande et résultat, code lu), correction.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.**

## 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`.

## Contexte P1 — à vérifier, pas à re-signaler

La P1 a trouvé : l'invariant AC 5 sans portée (état hérité `cancelled`, soldes d'ouverture) et
trois passages « TTC » du manuel absents de l'AC 13 ; corrigés dans `git diff cfd2a779 73f72e8d`
(**diff unique, à lire en priorité**). Vérifie que ces corrections sont justes et complètes :
la portée de l'AC 5 énumère-t-elle **tout** ce qui meut le compte 1100 hors factures de Kesh
(lis `crates/kesh-db/src/repositories/opening_balances*.rs`, les contre-passations, l'import
fournisseurs n'y touche pas ?) ; les quatre passages du manuel sont-ils les seuls de la section et
du document (greppe `TTC`, `total dû`, `encours` dans le `.tex` ET le PDF aplati) ?

⛔ Pour chaque finding, cite la ligne exacte lue dans le fichier ACTUEL, et vérifie ton affirmation
par `grep -nF` avant de l'écrire.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Prompt — validation P3 CIBLÉE, Story 25-4-b1 (le résiduel aux agrégats)

*Versionné le 2026-09-27. **Une lentille** (Opus), contexte frais. Passe **ciblée** : la P2 (Haiku)
a rendu « 0 finding » sans exercer l'axe qu'on lui confiait ; l'orchestrateur l'a repris et a
trouvé un chemin oublié. Ce qu'il reste à relire : la **portée de l'AC 5**, et elle seule, contre le
code.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats`. Fiche :
`_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`, AC 5 (bloc « Portée de
l'invariant ») et AC 13 (réserve du manuel). Diff des remédiations : `git diff cfd2a779 58a874ab`.

## La lentille : inventaire des sites NON RÉSOLUS

L'AC 5 affirme : *total de la balance âgée = solde du compte débiteurs au grand livre*, sauf quatre
cas énumérés. ⛔ **Ne vérifie pas que les quatre cas sont vrais — cherche le cinquième.**

1. **Inventorie l'ensemble clos de ce qui écrit une ligne d'écriture** (`journal_entry_lines`) :
pars du symptôme — `grep -rn "create_in_tx\|journal_entries::create\|INSERT INTO journal_entry_lines" crates/ --include=*.rs`
hors tests. Pour **chaque** chemin, dis s'il peut imputer le compte débiteurs (le compte
`default_receivable_account_id` ou le compte de la ligne de débit d'une vente), et, s'il le
peut, s'il est (a) une facture, un règlement ou un avoir **visibles** de la balance âgée,
(b) un des quatre cas de la portée, ou (c) **un cas oublié**.
2. Pense aux chemins **de clôture et de réouverture d'exercice**, à la **dévalidation** d'une
facture, à l'**annulation d'un règlement**, à la **contre-passation** manuelle d'une écriture de
vente ou de règlement depuis sa fiche, à l'**import** de pièces, au **rapprochement** annulé.
3. Pour chaque cas oublié : sévérité, preuve (code lu), et formulation à ajouter à la portée.
4. La réserve prescrite pour le manuel (AC 13, `:1580-1581`) couvre-t-elle alors tous les cas, en
mots d'utilisateur ?

## Ce que tu rends

- **Findings** : sévérité, endroit, **preuve**, correction.
- ⛔ **La liste des chemins inventoriés** (fichier:fonction → classement a/b/c) — c'est elle qui
prouve l'axe — **et des axes non exercés.**

## 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`,
`cargo check`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Prompt — validation P4 CIBLÉE, Story 25-4-b1 (le résiduel aux agrégats)

*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais. Passe **ciblée** sur la
remédiation de la P3 : la portée de l'AC 5 a été **réécrite par une règle** après trois passes qui
trouvaient chacune des cas hors de la liste précédente.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats`. Fiche :
`_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`. Diff à relire :
`git diff 72255481 HEAD -- _bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`.
Issues sorties : `gh issue view 473`, `gh issue view 474`.

## La lentille

1. **La règle est-elle juste ?** Trop large (elle exclut un cas où l'égalité tient) ou trop étroite
(un mouvement qu'elle autorise rompt l'égalité) ? Éprouve-la contre : la **dévalidation** d'une
facture (l'écriture de vente disparaît), l'**annulation d'un règlement** (contre-passation +
suppression de la ligne), l'**annulation d'un rapprochement** de facture, une facture **soldée**
(`paid_at`) — hors du périmètre de la balance âgée mais ses mouvements restent au grand livre et
s'annulent-ils exactement ? —, un **reste dû négatif** sur une facture validée.
2. **« n'a jamais changé dans les réglages »** : formulation testable ? Le test peut-il la tenir ?
3. **Le test prescrit** (quatre états vivants, `as_of` ≥ toutes les pièces) : prouve-t-il la règle ou
passe-t-il par construction ? Quelle mutation de la requête de la balance âgée le ferait rougir ?
4. **T0** : les quatre sites cités existent-ils aux lignes dites, et la correction prescrite est-elle
juste (`git show v0.12.0:crates/kesh-db/src/repositories/credit_notes.rs`) ? En existe-t-il un
cinquième (greppe la **valeur** : `keshbackup`, `sauvegarde antérieure`, `import d'une sauvegarde`
dans `crates/`, `docs/`, les fiches 25-4-*) ?
5. **La réserve du manuel** : exacte, lisible par un utilisateur, cohérente avec la règle ?
6. **Propagation** : le mot « quatre » (cas), les références aux handlers, #473/#474 — cohérents
partout (fiche, fiche mère, `sprint-status.yaml`) ?

## Ce que tu rends

- **Findings** : sévérité, endroit, **preuve** (commande et résultat, code lu), correction.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.**

## 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`,
`cargo check`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Prompt — validation P5 CIBLÉE, Story 25-4-b1

*Versionné le 2026-09-27. **Une lentille** (Haiku), contexte frais. Passe ciblée sur la seule
remédiation de la P4.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats`. Diff **unique** à
relire : `git diff 5480b4f8 5824c048` (deux fiches : `25-4-b1-residuel-aux-agregats.md`,
`25-4-a-residuel-juste.md`).

## Ce que tu vérifies

1. **T0** liste cinq sites : chacun existe-t-il à la ligne dite, avec la formulation dite ? Commande
obligatoire, à recopier dans ton rapport : `grep -rnF "sauvegarde antérieure" crates/ _bmad-output/implementation-artifacts/25-4-a-residuel-juste.md`
et `grep -rnF "keshbackup" crates/`.
2. **La phrase ajoutée à la règle** (contre-passations dans la portée) : juste ? Lis
`invoice_settlements_write.rs` (`cancel_settlement_in_tx`) avant de répondre.
3. **La réserve du manuel reformulée** : chacun de ses cas correspond-il à un cas réel de la règle ?
En manque-t-il un par rapport à la règle ?
4. **La note datée dans la fiche 25-4-a** : exacte (`git show v0.12.0:crates/kesh-db/src/repositories/credit_notes.rs | grep -n "paid_at.is_some"`) ?

⛔ Une fiche `ready-for-dev` décrit du code **à écrire** : ne signale pas que le code ne le fait pas
encore. ⛔ Pour chaque finding, recopie la **sortie** de la commande qui le prouve.

## Ce que tu rends

Findings (sévérité, endroit, preuve recopiée, correction) et **la liste des axes exercés et non
exercés**.

## Interdits

⛔ Aucune écriture dans le dépôt ; aucune commande mutante — `scripts/*.sh`, `make`, `latexmk`,
`git commit`/`push`/`add`/`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`,
`cargo test`/`nextest`, `npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git show`/`diff`,
`gh issue view`.
Loading
Loading