Deprecation Warning and Tightening Schedule¶
Governance protocol — instantiates Asymmetric Interface Tolerance Calibration
Turns tightening into an announced, dated plan — warn about a tolerated variant, give producers time to migrate, then stop accepting it on a committed schedule.
A Deprecation Warning and Tightening Schedule turns "we should stop accepting that" into an announced, dated plan: name the tolerated variant, warn the producers still using it, give a migration window, then stop accepting it on a committed date. Its defining idea is that it makes tightening legible and pre-committed in time — the ecosystem learns exactly what will stop working and when, so a strictness increase arrives as a scheduled event rather than a surprise breakage. It is the calendar and the communication of a tightening, not the switch that flips it: where the Feature-Flagged Strictness Rollout enacts the change at runtime, this mechanism governs when and tells the world.
Example¶
A payments API has tolerated TLS 1.0 handshakes for years and now wants to require TLS 1.2 or above. Rather than cut it off overnight, the platform team publishes a schedule. At T+0 it announces the deprecation in the docs and starts returning a standard Sunset response header plus a log warning on any sub-1.2 call. At T+3 months it runs brief scheduled "brownouts" — short windows of real rejection — so integrators actually feel the change coming. At T+6 months the cutoff is hard. Throughout, a named owner fields extension requests: a hospital client stuck on legacy hardware gets a documented 60-day exception with a tracked end date. Setup to outcome: on cutoff day almost nothing breaks, because everyone was warned, measured, and given a path — and the handful of stragglers were known and handled rather than discovered in an incident.
How it works¶
- It names the specific variant being retired and the canonical replacement, so the target is unambiguous.
- It publishes a dated path — announce, warn, optional brownouts, enforce — with the enforcement date committed up front, not left open.
- It escalates the signal over time: from passive (docs, a
Sunsetheader) to active (warnings, brownouts) to terminal (rejection with a diagnostic that says what to change). - It names an owner who holds the date and adjudicates time-boxed exceptions, so the schedule is accountable rather than aspirational.
Tuning parameters¶
- Notice horizon — the time between first warning and enforcement. Longer is kinder to laggards but prolongs the costly dual-support window.
- Warning channel and escalation — response headers, logs, email, dashboards, brownouts; how loud, and how it ramps. Too quiet and no one migrates; too loud too early and it becomes noise.
- Enforcement mode at sunset — hard reject, soft-degrade, or sampled rejection. Sampling softens the cliff; hard reject is unambiguous.
- Trigger — calendar-date-driven or telemetry-threshold-driven ("tighten once under 1% of traffic still uses the old form"). Threshold triggers wait for reality; dates force it.
- Exception policy — whether extensions exist, who may request them, and how visible they are. Generous invisible exceptions quietly reset the deadline for everyone.
When it helps, and when it misleads¶
Its strength is that it converts a breaking change from an ambush into a governed, predictable event, and shifts the migration burden onto producers with fair warning instead of onto the receiver forever. The classic misuse is the deadline that always slips — enforcement is announced, then postponed, then postponed again, until the warning is background noise and producers correctly learn it will never bite, leaving the protocol ossified around the very variant you meant to kill.[1] Announcing without ever enforcing is the same failure wearing a plan. The discipline that keeps it honest is to commit the enforcement date and an owner accountable for holding it, gate any slip on real telemetry rather than complaint volume, and make brownouts real so the deadline is felt before it lands.
How it implements the components¶
The schedule fills the time-and-governance side of the archetype's machinery — the parts that manage when tolerance narrows and how producers are told:
tightening_and_deprecation_path— it is the dated trajectory from tolerated to refused: the announced sequence and its committed endpoint.rejection_and_diagnostic_policy— it defines what a producer sees at each stage, from the deprecation warning to the terminal rejection and the diagnostic telling them exactly what to change.strictness_owner_and_exception_path— it names who owns the schedule and how a producer requests, and is granted, a time-boxed exception.
It does not perform the runtime switch that actually flips the regime — that is the Feature-Flagged Strictness Rollout — nor measure the traffic that says when it is safe to tighten, which is the Malformation Rate Dashboard.
Related¶
- Instantiates: Asymmetric Interface Tolerance Calibration — this is how a tolerance regime narrows over time without breaking the ecosystem by surprise.
- Consumes: Malformation Rate Dashboard — its usage telemetry tells the schedule when the old variant is rare enough to sunset.
- Sibling mechanisms: Feature-Flagged Strictness Rollout · Adapter or Translation Shim · Tolerant Reader / Strict Writer Policy · Compatibility Matrix · Version Negotiation or Capability Probe · Strict-Mode Shadow Run
Notes¶
The schedule governs time and communication; it presupposes that some other mechanism — an Adapter or Translation Shim or a Lenient Parser with Canonicalizer — is what keeps laggards working during the window. A tightening schedule with no migration path underneath it is just a countdown to breakage.
References¶
[1] Protocol ossification — once a tolerated variant is widely relied upon, it hardens into a de-facto part of the contract that is thereafter very hard to remove (as when middlebox tolerance froze TLS versions and motivated TLS 1.3's redesign). A tightening schedule exists precisely to retire a variant before it ossifies; a schedule that never enforces guarantees the ossification it was meant to prevent. ↩