Station
nsdef:stationstation — Akasha broadcasting-station namespace. (a) The guest-readable program guide (番組表): station:studios / station:studio:<gid> / station:shows:<gid> / station:show:<gid>:<space>, which society.station renders across studios (categories) and their shows. (b) The PROGRAMME STATE vocabulary a registered programme is always in, one atom each, joined to set:station:state:<state> at mint: station:state:warming_up (registered, its boot airing queued), station:state:on_air (a turn aired inside the live window), station:state:rebroadcast (the last airing repeated until the next lands — no model call, no reservation, no new observation or atom), station:state:standing_by (registered and not playing, always with a reason). (c) The skip/standby REASONS: station:reason:fresh (the last airing is younger than the interval, so a redeploy neither airs nor spends twice), station:reason:llm_pool (admission could not hold the reservation), station:reason:provider_429 (the provider rate-limited the call), station:reason:budget_calls (AKASHA'S OWN daily call ceiling is spent — llm.budget calls=), station:reason:budget_tokens (AKASHA'S OWN token ceiling for the day or month is spent — the MONEY bound, since cost is per token), station:reason:waiting_source (a declared source is not frozen yet), station:reason:runs_per_day (the programme's own declared runs for today are spent), station:reason:breaker (consecutive failures — a research bench drops to manual, a STATION programme stays armed and keeps trying, because a broadcaster removing itself from the schedule is the silence the ruling forbids), station:reason:not_provisioned (a runtime PRECONDITION is missing — the cycle is not on the bench; the cure is a boot, which reconciles, never a retry), station:reason:no_text (the model answered with nothing usable). The three refusal families are kept APART on purpose: llm_pool is the shared pool, provider_429 is the provider, budget_* are this cell's own ceilings — reading one for the other sends an operator to the wrong place. A value the code compares against is vocabulary: the code uses these ids, never a free string, and `unclassified` stays reserved for a value that does not exist — which a registered programme's cells never are.