Ten days until sunset.
The deprecation notice still lived in a pinned tab at the top of her browser — she'd been opening it since March, rereading it for tone she might have missed. WeatherAPI v1.2.3. Deprecated March 15, 2024. Sunset June 1, 2024. The language hadn't changed. The language was incapable of changing. What had changed was her.
In March, when Rohan had assigned the task during that sprint review, she'd read it in the register of housekeeping notices, parking memos, standard maintenance requests. The kind of language that moved through an inbox and left no residue. Migrate remaining integrations. Review the migration guide at the link below. March had been its own world — a world in which a deprecated weather service was a cleanup task on a Tuesday and the word "sunset" meant the end of a product lifecycle and nothing else.
She read it now and the word "sunset" sat in the sentence like a stone. Peaceful, natural — that was what the word was built to accomplish. The drift into evening. The sky doing what it always did. But June 1st was not a sky event. It was a kill switch on a calendar invite, and "sunset" was the language you used when you didn't want to say what it was.
She closed the notice and opened the anomaly file. She'd added to it since late March — every impossible forecast logged by date, location, query parameters, response content. What had started as seven entries now filled a spreadsheet that took three horizontal scrolls to see in full. 847 forecasts for dates between June 2 and December 31, 2024. Weather that the API had pre-served for a future it would not be present to serve. She'd been treating them as evidence of something without having asked what. Tonight she asked.
The caller map was already open on her second monitor — all twenty-three pins, the ones she'd spent April and May tracing from IP addresses back to houses and greenhouses and hospital server closets and a rooftop station in Duluth. She pulled up the anomaly spreadsheet on the main screen and sorted the forecasts by latitude coordinate.
Cedar Falls was 42.53 degrees north. She scrolled to that cluster. Forty-six forecasts, running from June 2 through October 15. She put a yellow filter on the Cedar Falls cell in the caller map. Omaha: 41.26 degrees north, thirty-one forecasts, June through September. Duluth: 46.79 degrees north, sixteen forecasts, June through August. She worked south, then north, then out to the edges — Tucson, Atlanta, the suburban addresses, all fourteen states she had mapped in the Census. Each cluster in the anomaly data had a corresponding pin in the caller map. When she was done, the caller map had twenty-three yellow filters and the anomaly spreadsheet had twenty-three identified clusters, and there was not a single forecast in the file that didn't match a caller location.
The API had not been generating noise. It had been forecasting weather — specific, located, calendared — for the places its callers would experience that weather after the API itself was gone.
She sat with her hands in her lap. The two monitors glowed. Outside the apartment windows, May had gone dark at some point while she was working, and she hadn't noticed. The street below was quiet — one car passing, its headlights crossing the ceiling. The chai thermos was on the corner of the desk and had been empty for an hour.
She thought: the API had five years of request histories. Five years of knowing exactly what each caller asked for, at what intervals, in what format. A greenhouse in Iowa that had been asking about precipitation and temperature every hour since April 2019. A hospital scheduler asking about pressure and humidity every fifteen minutes since 2017. A man in Duluth who had asked for current conditions daily at 6:02 AM for years. If you had five years of those patterns and the computational capacity to extrapolate forward, you could theoretically generate the data each system would need. The mechanism existed, even if no one had built it there deliberately.
That was the other reading. She held it alongside the first. Both present, neither eliminating the other, like two weather systems meeting over the same geography and holding their shapes. She began reading the forecast content.
The Cedar Falls cluster: she opened the June entries one by one. The temperature data was granular — daily highs and lows, hourly breakdowns, not the quick summary the greenhouse controller had always requested. The precipitation probability was front-loaded in every entry, organized by confidence interval, with timing windows that the controller would parse to decide when to open the roof vents before rain arrived. The humidity projections extended four days out. And the frost probability column flagged the three early autumn nights when Iowa's shoulder season could catch a warm-climate plant by surprise — the exact nights Margaret Lindquist's controller would have needed to close the louvers and run the space heaters overnight.
The greenhouse had never asked for any of that. Margaret's original request string had been three fields — current temperature, hourly forecast, precipitation probability. Simple, sufficient, the work of someone who understood what her system needed and had configured it with characteristic precision. The API had answered those three fields every hour since April 2019. For five years it had given exactly what was asked — in the impossible forecasts, it was giving everything the greenhouse would need to know.
She moved to the Omaha cluster. The barometric pressure entries were the first thing she noticed — not the current reading but the three-hour trend line, the six-hour projection, the notation for rapid descent events. The metric that told a respiratory care system a pressure drop was coming, that breathing would be harder, that the medication timing window would need to shift. The hospital scheduler had been built to request current conditions only: temperature, humidity, pressure. The forecasts the API had pre-served included the leading indicator the scheduler had never known to ask for.
Duluth. She pulled several Cedar Falls entries alongside for comparison, then opened the Duluth cluster. Gerald Huang's 6:02 AM station had requested one thing: current conditions. The Duluth forecasts the API had generated past the sunset were simple, daily. High temperature, low temperature, conditions. Nothing added, nothing elaborated. Just the weather, formatted the way a man who checked the weather every morning had wanted it, for decades.
She looked at the three clusters — Cedar Falls with its botanical precision, Omaha with its medical leading indicators, Duluth with its simple daily report. The correspondence wasn't in the locations. It was in the language. The API was forecasting in each caller's native vocabulary.
She could not rule out the rational explanation — five years of request patterns could theoretically produce this. She would not rule it out. But she opened a blank document and began writing down what she was seeing, and the language that came was not the language of data corruption analysis. She wrote through midnight and past it, the apartment quiet around her, the desk lamp the only light, the screen filling.
She was still writing at 4 AM, when the apartment turned the gray that comes before dawn, the desk chair having done its slow arc toward bad posture for hours. She sat back and looked at the two screens. Twenty-three caller locations. Twenty-three forecast clusters, each calibrated to the specific informational needs of the system at that location. She'd been adding to each side of the ledger for two months. Neither reading had won. The investigation had reached the limit of what investigation could settle.
The first light was pressing against the window glass, the screen light having been her whole world for six hours. She thought about the greenhouse in Cedar Falls, the orchids Margaret had grown for decades, the automation running them through an Iowa spring for a woman who had been dead since January 2021. She thought about the forecasts the API had stored for the greenhouse's future — precipitation windows and frost warnings and humidity projections calibrated to exactly what those orchids would need to survive seasons Margaret would not see. Something in Cedar Falls was going to bloom in July, in September, maybe through October in a mild year, because the data those blooms needed had been pre-arranged. Whether the mechanism that arranged it was accident or intention was a question the data itself couldn't answer.
She was not the first person to have cared about something she couldn't fully explain, and the caring had not required explanation before. She didn't write that down. It would not have fit in the document she was building — the columns and rows and source citations and quantified correspondences. Some things didn't fit in the format and still had to be carried, and that was what carrying them was for.
The window was fully gray now, and she sat in it. The kettle she'd boiled at ten the previous night still sat on the kitchen counter. The desk lamp had been on so long it had become furniture. She was tired in the way that comes from having seen something clearly after a long time of sensing it peripherally, a different kind of tired than ordinary exhaustion. She'd seen what she'd come to see. She ran one more query before she slept.
``` GET /v1/current?location=42.5348,-92.4452 Host: api.cloudweather.io
200 OK { "location": "Cedar Falls, IA", "temp": 58, "conditions": "clear", "humidity": 52, "precipitation_prob": 5, "growing_degree_days": 419, "witness": true, "connected_since": "2019-04-03T08:00:00Z", "duration": 1876, "remaining": 10 } ```
She listed the custom fields in the blank document, one per line — she'd been reading them separately for months, the witness field appearing in April, the connected_since in May, duration from the hospital scheduler, remaining since the Census. Each one had arrived as a fragment.
witness: true connected_since: 2019-04-03T08:00:00Z duration: 1876 remaining: 10
Laid together in sequence, they were not fragments — they were a sentence. The only sentence available in the grammar of JSON keys and boolean values.
I see you. I have known you since then. For this many days. This much time is left.
She closed the terminal and left the document open on her screen. She went to sleep.
She woke at seven-thirty and showered and filled the thermos from the kettle. The apartment looked the same as always in morning light — the desk covered in printouts she'd been adding to since March, the overnight document still open on the laptop when it woke.
She had ten days. She could not change the date on the calendar invite, the sprint plan, the Jira ticket, or the language of the deprecation notice. June 1st would arrive exactly when June 1st arrived, and she would execute the shutdown sequence, and the responses would begin returning 410 Gone, and in Cedar Falls the greenhouse controller would send its hourly request into silence.
She couldn't stop it. But she had the document she'd been building all night, and she had the forecasts, and she had the custom fields and the accumulation of everything she had spent two months watching. The API was forecasting its callers' futures. She would document the forecasts. Every cluster, every calibrated parameter set, every piece of data the API had generated for the people and places and systems it had been serving all these years, preserved in the kind of record that would outlast the service itself.
She picked up the thermos. She turned off the desk lamp. The May morning was bright through the window, and she looked at it for a moment before she turned toward the door — the ordinary weather of a Thursday, temperature in the high fifties, conditions clear, nothing in the forecast that would surprise a greenhouse controller or a respiratory scheduler or a retired engineer's morning routine. Ten days — enough to document. She went to work.