You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Proposal from @tiran to refactor release-age cooldown management around a single CooldownPolicy object owned by Settings, replacing today's split between WorkContext.cooldown, per-request resolve_package_cooldown(), and post-construction provider.cooldown mutation.
Post-construction mutation at 3 call sites (#1081)
BaseProvider.is_blocked_by_cooldown()
Per-candidate enforcement with provider-specific timestamp semantics
This makes cooldown hard to inspect, test in isolation, and easy to mis-wire (forgetting provider.cooldown = … silently disables enforcement).
Proposed architecture
Move cooldown configuration and filtering into one policy object on Settings:
CLI --min-release-age
│
▼
Settings.cooldown (CooldownPolicy)
├── min_release_age # global default
├── package_cooldowns # pre-loaded from resolver_dist.min_release_age
├── cooldown_exempt_versions # from top-level == pins (see #1123)
└── bootstrap_time # fixed reference time for the run
│
▼
filter_candidates(candidates) # single enforcement point after find_candidates
CooldownPolicy responsibilities
Configuration — hold global min_release_age, indexed per-package overrides, and version exemptions.
Initialization — set_package_cooldowns() pre-loads overrides from package settings once at startup (via Settings._reset()).
Summary
Proposal from @tiran to refactor release-age cooldown management around a single
CooldownPolicyobject owned bySettings, replacing today's split betweenWorkContext.cooldown, per-requestresolve_package_cooldown(), and post-constructionprovider.cooldownmutation.POC branch: https://github.com/tiran/fromager/tree/cooldown-policy
POC commit: tiran@aa7666d
Problem
Release-age cooldown (#877) works, but policy state and enforcement are scattered:
WorkContext.cooldownCooldownfrom--min-release-ageresolve_package_cooldown()==bypass)provider.cooldownBaseProvider.is_blocked_by_cooldown()This makes cooldown hard to inspect, test in isolation, and easy to mis-wire (forgetting
provider.cooldown = …silently disables enforcement).Proposed architecture
Move cooldown configuration and filtering into one policy object on
Settings:CooldownPolicyresponsibilitiesmin_release_age, indexed per-package overrides, and version exemptions.set_package_cooldowns()pre-loads overrides from package settings once at startup (viaSettings._reset()).add_cooldown_exempt_versions()registers(name, version)pairs from exact==pins.filter_candidates()returns only candidates that satisfy the effective minimum age.Integration points
--min-release-agepassed toSettings.from_files()instead of constructingCooldownonWorkContext.ctx.settings.cooldown.filter_candidates()afterfind_candidates(), eliminatingprovider.cooldownmutation.resolve_package_cooldown()and per-provideris_blocked_by_cooldown()logic retired once parity is verified.Benefits
settings.cooldownto see global default, all overrides, and exemptions.filter_candidates()is testable without network or resolvelib.resolver_dist; policy belongs onSettings.Related
==pin exemptions