feat(gating): routes + Sidebar (budget, rapports avancés, bilan) #305
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#305
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-299-routes-sidebar"
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?
2e maillon de la pile feature-gating (base =
issue-298-require-feature, PR #304).Contenu
<RequireFeature feature=… />(rendu<Outlet/>) —balancegroupe/balance+/balance/accounts+/balance/snapshot;reports-advancedgroupe/reports/highlights|compare|category|cartes;budgetsur/budget;adjustmentssur/adjustments. Le hub/reportset/reports/trendsrestent Free, hors de tout gate (caveat CRITIQUE du /review-spec respecté).src/shared/types) : champ optionnelfeature?: FeatureKey(import type-only, pas de cycle) ; renseigné dansconstants/index.tssur budget, adjustments, balance UNIQUEMENT — pasreports.NavLock(hookuseEntitlementau top-level du composant, jamais dans le map callback) → cadenas affiché seulement siready && !allowed(aucun flash au boot) ; l'item reste cliquable et mène à l'upsell via la route gatée. Tooltip + aria réutilisentnav.locked.useEntitlement("reports-advanced"), flaglockedpropagé aux 4 tuiles avancées via une prop additivelocked?surHubReportNavCard(badge cadenas, tuile cliquable) ; la tuile Tendance n'est jamais verrouillée.HubReportNavCardnon listé dans l'issue mais requis pour rendre le badge dans la tuile — prop optionnelle, sans impact sur l'autre consommateur (BalancePage).Tests / build
reports+ modules Free jamais gatés, exactement 3 items gatés sur 9).npm run build(tsc + vite) propre.Aucune nouvelle chaîne i18n (
nav.lockedlivré par #298). Aucune migration DB. CHANGELOG intentionnellement non touché (centralisé dans #302).Resolves #299
Generated autonomously by /autopilot run of 2026-07-20
Review adversariale — APPROVE
Résumé : Gating par route + badge Sidebar implémentés exactement selon #299. Le caveat CRITIQUE du
/review-specest respecté (hub/reportset/reports/trendshors de tout gate) et verrouillé par un test de contrat. Aucune route perdue dans le remaniement d'App.tsx, aucun piège de hooks, aucun cycle d'import, anti-flash correct des deux côtés.Vérifications (contre la base
issue-298-require-feature)RequireFeaturerend<Outlet/>quandchildrenest omis → usage layout-route pathless valide ; les 4 clés (adjustments,budget,balance,reports-advanced) sont toutes membres deFeatureKey.App.tsx: les 18 routes préexistantes sont conservées ;/reports,/reports/trends,/settings/*, docs et changelog restent hors gate.NavLock: hook au top-level d'un vrai composant —item.feature && <NavLock/>est du rendu conditionnel de composant, pas un hook conditionnel ;!ready → nullsupprime le flash au boot. LeNavLinkparent estflex items-center, leml-autodu badge fonctionne.LicenseProvidermonté dansmain.tsxau-dessus d'AppShell→ Sidebar/ReportsPage ne peuvent pas crasher sur le contexte.types/index.ts → entitlementsest type-only,licenseServicen'importe que@tauri-apps/api/core.nav.lockedprésent en FR et EN (livré par #298).BalancePage(autre consommateur deHubReportNavCard) intact — proplocked?additive..test.tsco-localisés préexistants) ;strictsansnoUncheckedIndexedAccess→byKey.x.featurecompile. Pas deskip/only.Suggestions (non bloquantes)
NetWorthTile(dashboard Free) reste visible après un downgrade avec d'anciens snapshots et linke vers/balance(→ upsell au clic). Cohérent avec « données conservées », mais un badgelocked(patternHubReportNavCard) unifierait le langage visuel. Suivi hors scope #299.NavLocketHubReportNavCard— extraire unLockBadgepartagé si une 3e surface apparaît.Rappel process (pas un défaut de la PR) : maillon intermédiaire ciblant une base non-
main→ jamais vu parcheck.yml; valider le tip cumulé en local avant le merge de la pile.Mergé en fast-forward sur main (pile #304→#308), voir commit
553da0c. Verdict /pr-review : APPROVE. Fermeture manuelle : le merge local ff n est pas détecté comme merged par Forgejo.Pull request closed