feat(prices): PriceFetchControl + consent modal + best-effort UX (#158) #167
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#167
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-158-pricefetchcontrol"
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?
Summary
PriceFetchControl.tsxcomponent with button + consent modal + spinner + attribution + best-effort warning (stock only)useIsPremium() === falseorcategoryKind !== 'priced'user_preferences.price_fetching_consent({consented_at, version: 1}shape)_bestEffortDismissedThisSession)Decisions
@testing-library/reactor jsdom — tests are pure unit tests of logic/mocks, not DOM rendering (logged indecisions-log.md)asset_typenot inbalance_categoriesschema — defaulting to'stock'with// TODOcomment (follow-up needed)user_preferencesis per-profile by architecture (separate SQLite DB per profile), noprofile_idneeded in keyStacked on (must merge first)
This branch contains merges from upstream autopilot PRs that have not yet landed:
After those land, this PR will rebase down to only the PriceFetchControl-specific changes.
Closes #158
Generated autonomously by /autopilot run of 2026-04-27
- prices.fetchPrice wraps invoke('fetch_price', ...) with local rate-limit (1/2s), in-flight dedup, exp backoff on 5xx (2/4/8s, max 3 retries), no retry on 4xx/429, hard 100/session cap - 9 vitest tests with vi.useFakeTimers() (happy, 401/403/404, 429 no-retry, 5xx retries, dedup, pacing, session cap) - Annexe B i18n mapping wired (PriceError → balance.priceFetching.errors.* keys) - Session cap checked before rate-limit/dedup; failures do not consume budget (MEDIUM decision) Closes #156 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>