docs(gating): ADR 0017 + architecture + guide + CHANGELOG #308
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#308
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-302-docs-gating"
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?
Documentation of the edition-gating work (#297-#301), written against the actual code of the stack.
features[]override fail-closed in Free (CWE-863), UI-only enforcement as an assumed GPL soft-paywall (server-enforced price fetching stays the only hard gate), non-destructive downgrade,dev-overrideCargo feature (CWE-489), rejected alternatives. Spec links point to the force-added root specs (checked: tracked in git).entitlements.rssection (auto-update now Base+, stale "open to free" note removed), gated routes listed in routing, hooks table updated (useLicenseremoved in #297 ->useEntitlement/useIsPremium), ADR index + header refreshed.docs.editions.*(FR/EN): new "Éditions" section with the Free/Base/Premium table, unlock flow, non-destructive locking tips. The keys are wired intoDocsContent.tsx(new SECTIONS entry — without it the keys would be dead).Validation: 871 vitest green,
npm run build(tsc + vite) clean. No Rust change.Resolves #302
Generated autonomously by /autopilot run of 2026-07-20
Review adversariale — APPROVE
Résumé : PR de documentation vérifiée claim-par-claim contre le code réel de la branche (pile #297-#301 incluse). Chaque affirmation de l'ADR 0017, de la section « Gating par édition » d'architecture.md et du guide utilisateur correspond au code.
Vérifications effectuées (lecture
git showsurissue-302-docs-gating, sans checkout) :src/shared/entitlements.ts:FeatureKey= les 5 clés documentées, matrice conforme (balance → premium seul), court-circuitif (edition === "free") return falseAVANT l'overridefeatures[](CWE-863),requiredTierFordérivé de l'appartenance — tout matche l'ADR.src-tauri/src/commands/entitlements.rs:FEATURE_TIERSréduit àauto-update → [base, premium](#271 absorbé),is_entitledavec le même court-circuit Free ;license_commands::current_entitlementsest bienpub(crate)(« interne, pas une commande ») et retourne("free", [])sur tout échec ; le chemin Compte Maximus ne porte pas defeatures[]— conforme au point « Neutre » de l'ADR.dev-override: horsdefault,#[cfg(feature = "dev-override")]surdev_override_edition()/SR_DEV_EDITION— conforme (CWE-489).LicenseContext.tsx:RETRY_BASE_MS = 1000/RETRY_MAX_MS = 30_000, retry uniquement surstatus === "error",validationErrororthogonal (ne touche jamaisstatus) — conforme.useEntitlementretourne{ allowed, ready };useLicense.tsabsent de la branche ;useIsPremium.tssubsiste — la table des hooks est exacte.main.tsx:LicenseProvider>ProfileProvider>ErrorBoundary(leBrowserRouter key={refreshKey}est dans App.tsx) — le claim « survit au remount » est exact.RequireFeaturecouvrent exactement les routes listées ;/reportset/reports/trendshors gate.NavLockrendnullsi!ready || allowed(badge seulement siready && !allowed) ; l'« invariant testé : reports n'est jamais gaté » existe réellement (src/shared/constants/index.test.ts:20).profileGate.tsexporteisProfileSwitchLocked/isProfileCreationLocked;ProfileFormModalporte le modeupsell(point unique de création) ;LicenseCardest dansUsersSettingsPage→ « Paramètres → Utilisateurs » exact.UpsellGate: CTAdisabled+ clé « bientôt » (ctaGetSoon), « J'ai déjà une clé » →/settings/users+onNavigate?— conforme.spec-*-feature-gating.mdsont trackées à la racine → les liens../../de l'ADR résolvent (le piège qui avait bloqué #295 est évité). ADR 0009/0011/0016 : noms de fichiers exacts. Index ADR mis à jour.## 11. Paramètres→## 12. Éditions, numérotation correcte ; matrice du guide = matrice du code.DocsContent.tsx: le rendu consommedocs.{key}.title/overview/features/steps/tipsviareturnObjects— la sectioneditionsfournit exactement ces 5 clés, symétriques FR/EN (4/4/3 items). Sans l'entrée SECTIONS les clés seraient mortes ; elle est là.### Addedavant### Changed(ordre Keep a Changelog), références #297-#301.docs(gating): ...,Resolves #302présent.Suggestions (non bloquantes) :
src/i18n/locales/fr.json—docs.editions.features[1]et[2]: « tout la Gratuite » / « tout la Base » est agrammatical → « tout de la Gratuite » / « tout de la Base » (chaîne user-facing dans la page Docs). Corrigeable au merge ou dans un maillon suivant.isEntitledde l'ADR omet la branche défensive!tiers(feature hors matrice → override signé seul) présente dans le code réel — la sémantique documentée reste exacte, rien à corriger.Review adversariale /pr-review — vérifiée contre le code de la pile, base
issue-301-rust-entitlements.Mergé en fast-forward sur main (pile #304→#308), voir commit
01da65c+6de9617(fix i18n). Verdict /pr-review : APPROVE. Fermeture manuelle : le merge local ff n est pas détecté comme merged par Forgejo.Pull request closed