symfonic.services.conversation.horizon¶
horizon ¶
Resumability horizons: how long legacy-format state stays migratable.
Two horizons, because there are two deployments and they cannot share a clock:
- :class:
CalendarHorizonโ the operated platform. The operator publishes a cutoff date, notifies tenants inside a notice window, and after the cutoff legacy-format state expires. A calendar is meaningful because there is an operator who ships upgrades on it. - :class:
PackageVersionHorizonโ library mode. An adopter's local state has no operator and no shared calendar; an artifact written in 2020 is still perfectly valid if the adopter is still inside the supported package version range. Keying library-mode expiry on a date would expire state that nothing has actually stopped supporting.
Both answer the same three-valued question, and every negative answer carries a reason and a support route. An expiry an adopter cannot act on is indistinguishable from a bug.
CalendarHorizon
dataclass
¶
Operated-platform horizon: a published cutoff and a notice window.
HorizonDecision
dataclass
¶
The horizon's answer for one artifact.
PackageVersionHorizon
dataclass
¶
Library-mode horizon: keyed by package version, never by the calendar.
ResumabilityHorizon ¶
parse_version ¶
Parse major.minor.patch, tolerating a pre-release suffix.
Refuses anything it cannot read rather than sorting it low: a version that
silently compares as 0.0.0 would place every unparseable build inside
every support window, which is the wrong direction to fail.