docs(balance): ADR 0015 + guide + architecture + CHANGELOG (#218) #227
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#227
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-218-docs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Resolves #218
Final docs link of the Étape 2 (per-security detail) stack. Stacked on #226 (issue-217-tests).
What changed (docs-only — no production TS/Rust logic touched)
docs/adr/0015-balance-detail-par-titre.md, Accepted): holdings-per-snapshot model; the aggregated-line-is-source-of-truth invariant (value = SUM(holdings.value), why Étape 2 is non-breaking — every aggregator + Modified Dietz per account reads only thisvalue, cites ADR 0008); transaction-based alternative rejected (cites PP PR #779); latent gain (value − book_cost) vs per-security Modified Dietz (out of scope, needs dated per-lot flows);detailed_sinceauthoritative pivot; security-immortal-once-referenced (ON DELETE RESTRICT, mirror ofbalance_account_transfers). Mirrors ADR 0014 structure.docs/guide-utilisateur.md(per-security entry, detail-account wizard, latent gain) and matchingdocs.balance.*i18n keys (FR + EN) — the in-app guide renders from those keys, so both surfaces were updated. FR/EN array parity verified.balance_securities,balance_snapshot_holdings) + 2 indexes + migrations v14/v15/v16. Backfilled v10-v16 in the migrations table, fixed the ADR table (0012 Proposed→Rejected, added 0013/0014/0015), documented the new service surface (securities CRUD, transactional detailed save, latent gain).[Unreleased]: extended (did not duplicate #214) with #215 (detail-account wizard, frozen history), #216 (drill-down + latent gain), #211 (existing priced accounts auto-converted to detailed 1-position). Bilingual parity.Quality gate
npm run build(tsc + vite): PASSnpm test(vitest): PASS — 627/627 across 36 filesdocs.balance.*FR/EN parity verifiedGenerated autonomously by /autopilot run of 2026-06-06
Adversarial review — PR #227 (issue #218) · docs(balance): ADR 0015 + guide + architecture + CHANGELOG
Verdict : APPROVE ✅ — Link 9/9 (docs-only). Toutes les réconciliations de compteurs et les affirmations factuelles de l'ADR 0015 sont vérifiées exactes contre le code. Aucun blocant. Un seul should-fix (liens spec morts) sans impact sur l'exactitude technique.
Vérifié contre la réalité (head
issue-218-docs)Compteurs BDD — tous corrects :
grep -c CREATE TABLE consolidated_schema.sql= 20grep -c CREATE INDEX= 24 (15 existants + 7 v9 + 2 v14)lib.rs: 16 déclarationsversion:distinctes (v1→v16)balance_tables, 9idx_balanceindexLa correction des compteurs périmés (CLAUDE.md « 13/15/7 », architecture.md « 18/16 ») est exacte.
ADR 0015 — exactitude confirmée :
compute_account_returnprésent dansbalance_commands.rs, enregistré danslib.rs) ✅detailed_sincepivot faisant autorité ✅ · titre immortel ON DELETE RESTRICT ✅consolidated_schema.sql:security_id … ON DELETE RESTRICT,snapshot_line_id … ON DELETE CASCADE,symbol TEXT NOT NULL COLLATE NOCASE UNIQUE,currency DEFAULT 'CAD',asset_type CHECK IN ('stock','crypto'),UNIQUE(snapshot_line_id, security_id)✅category.kind='priced'→account.kind='detailed') et v16 (conversion 1-position, garde anti-perte) conformes àlib.rs✅validateDetailedSnapshot,computeUnrealizedGain,findOrCreateSecurity,getHoldingsForLatestSnapshot, etc.) toutes présentes dansbalance.service.ts✅CHANGELOG :
[Unreleased]existant, ne duplique pas #214 (#214 = saisie par titre ; #216 = drill-down + agrégation gain latent → surfaces distinctes) ✅CHANGELOG.mdetCHANGELOG.fr.md; en-tête FR[Non publié]correct ✅i18n
docs.balance.*:fr.jsoneten.jsonvalides (JSON parse OK) ✅overview+titleprésents des deux côtés ✅Should-fix (non-blocant)
docs/adr/0015-balance-detail-par-titre.md(ligneSpec:+ section « Liens ») — référence deux fichiers spec inexistants :spec-decisions-bilan-detail-titres.mdetspec-plan-bilan-detail-titres.md. Vérifié absents àhead, surmain, et sur les 9 branches du stack (issue-210→218). Liens morts. L'ADR 0014 (le miroir structurel) ne cite aucun fichier spec — donc ce n'est pas imposé par le précédent ; le stack Étape 2 n'est apparemment pas passé par/spec. Impact nul sur l'exactitude technique (la vraie source de design,docs/audit-bilan-2026-05.md, existe et est correctement liée). Correctif : soit supprimer ces deux références, soit committer les specs si elles existent ailleurs. Reportable à une PR de suivi — ne bloque pas ce merge.Note d'observation (hors PR)
docs/adr/0012-balance-two-level-model.mdporte désormaisStatus: **Rejected**en tête (cohérent avec architecture.md), mais conserve plus bas une ligne historique**Status: Proposed.**. Incohérence interne dans l'ADR 0012, pas dans cette PR — à nettoyer un jour, hors scope ici.Bilan : docs/i18n uniquement, zéro logique TS/Rust de production touchée. Documentation rigoureuse, fidèle à l'implémentation. Merge OK.
Review adversariale automatisée.