deprecated-api

The Orchids

Chapter 6 of 14

Forty-three days until sunset.

She found Margaret Lindquist's papers on Saturday morning, still in her pajamas, the chai thermos warm in both hands. Three in JSTOR, two in the Journal of the American Orchid Society, one in a Midwest botanical quarterly she'd never heard of. She'd located them through the faculty directory on Wednesday. She'd saved them for Saturday — her own time, not the company's.

The most recent paper was sixty-two pages on climate-adaptive automation for Midwestern orchid cultivation. She read it as an engineer, not a botanist, and found the thinking underneath familiar — the diagnostic framing, the decision to design against edge cases rather than optimize for median conditions. The system must anticipate, not react, Margaret had written. A controller that can only respond to what has already happened cannot provide stable conditions for organisms with narrow tolerances. Priya read that sentence twice and added a note to her second screen: M.L. understood the lag problem.

By noon she had mapped the greenhouse on the back of a printed caller log page — external inputs on the left, decision logic in the middle, output actions on the right. Three weather fields fed five primary decisions governing heaters, roof vents, and misting. The automation looked outward and adjusted present conditions based on what was coming — a system built for Iowa's variability, not its average. Margaret had designed it over six years, with the specific care that distinguished work built with intention from work built adequately. The controller was still running. The orchids were still alive. The API was still answering. She was diagramming a dead woman's greenhouse on a Saturday, and the task had been complete since she entered the Cedar Falls IP in the caller log.

Rohan stopped by her desk Monday morning during the quiet window before standup, coffee in a mug that read Cloudies 2023 Hackathon, leaning against the partition with the posture of someone who had a hundred small things to track.

"How's the sunset going?" He glanced at her screens — the caller log spreadsheet and a browser tab she'd moved away from. "On track for June first?"

"Still categorizing," she said. "More active connections than the initial audit flagged. I'm documenting each one before the final notices."

Rohan nodded. "Yeah, just flag the active ones and we'll run the standard notice cycle. Most of them have had two months. They know what's coming." He wasn't checking up so much as maintaining awareness. "How many connections are we talking?"

"More than two dozen."

"More than two dozen forgotten connections to a deprecated weather API." He smiled. "Classic."

"Classic," she agreed, and her voice was even and she was looking at him and not at the browser tab. He moved on. She updated the Jira ticket — still In progress, as it had been since March — and waited until he was back at his desk before tabbing back to the paper.

She ran the daily check against the Cedar Falls endpoint that afternoon. Not because she needed the data, but because the daily check had become a kind of monitoring she'd stopped justifying to herself. The response came back in forty-one milliseconds.

``` GET /v1/current?location=42.5348,-92.4452 Host: api.cloudweather.io

200 OK { "location": "Cedar Falls, IA", "temp": 57, "conditions": "overcast", "humidity": 63, "wind_mph": 7, "witness": true, "connected_since": "2019-04-03T08:00:00Z" } ```

The witness field — documented from the server room nine days ago. The second field was new. Connected_since. A timestamp. She copied it into the anomaly file and opened the API key registration records. Key wapi-legacy-73449. Created: 2019-04-03T08:00:00Z. The timestamps matched to the second.

The API was returning the date of the greenhouse's first connection — the moment when Margaret Lindquist had registered her account and configured her controller in April 2019. She searched the documentation index. She searched the response schema. The field existed nowhere — not in any version of the API spec, not in the codebase, not in any configuration she could trace. She queried the Duluth endpoint.

``` GET /v1/current?location=46.7867,-92.1005 Host: api.cloudweather.io

200 OK { "location": "Duluth, MN", "temp": 41, "conditions": "clear", "humidity": 52, "wind_mph": 12, "witness": true, "connected_since": "2020-02-15T14:02:00Z" } ```

She pulled the Duluth key registration. Created: 2020-02-15T14:02:00Z. Same match, down to the minute. She queried Atlanta, then Tucson, then Omaha, writing each response into the anomaly file. Every one returned the connected_since field. Every timestamp matched the registration date in the API key records — a separate database, maintained by CloudWeather's billing team, with no documented connection to the API's systems. Two records kept in separate places, neither aware of the other, both agreeing to the second.

The impossible forecasts were forward-reaching — a kind of anomaly she could at least classify. This was different. The API was not predicting what would happen. It was returning what had already been established — when each caller first connected, how long the relationship had existed. It had been holding these dates while the billing database held them separately, and no one had compared the two records until now. She did not file an incident report. She added a new section header in the anomaly file: Custom Field: connected_since. Observed 2024-04-19. Matches API key registration timestamps from billing records exactly. No source in code.

The caller log had two timestamp columns now — one from the registration records, one the API had provided. She spent the late afternoon verifying the correspondence across every entry she'd traced. The matches held without exception.

Standard server logs recorded every request with a timestamp. That was not this. Server logs were passive, append-only — they carried no awareness of what the logged data meant, retained nothing between requests, drew no connection between one hour's query and the next. The connected_since field appeared in the response itself, generated at the moment of the query, as if the API had been maintaining its own record alongside everyone else's. Her working theory for the impossible forecasts — corrupted forward-fill, future-dated artifacts — was still the most likely technical explanation, though she'd never traced it to a specific code path. Data artifacts were possible. Systems misbehaved.

She did not have a theory for connected_since. Fields did not add themselves to JSON responses. The timestamp could not come from nowhere and match a billing record in a separate system, unless something had been keeping its own count. She looked at the two columns. April 3, 2019. April 3, 2019. Margaret Lindquist, registering her account on a Wednesday morning in spring. The billing database had logged the account creation. The API had — in some way she could not account for — logged the relationship. She wrote: Undocumented mechanism. Source unidentified. Further investigation required. The cursor blinked; further investigation had not produced a further explanation in three weeks, and she went home.

Daniel Lindquist's phone number was on a printed property record folded into the back of the spiral notepad — Portland area code, found through county records cross-referenced with the obituary. She'd put it there two days ago. She stood in her kitchen with her phone in her hand. She had thought through the call in a loose way — the voice on the other end, the explanation she would have to give. Your mother's greenhouse in Cedar Falls is still running. The automation she built is still calling a weather service. I'm shutting it down in forty-three days. She didn't know what came after that. She set the phone on the counter.

She added the day's entries to the anomaly file — the connected_since field, the timestamp correspondences — and closed the laptop. Forty-three days. Still enough time to feel like time. She thought about the two columns. April 3, 2019. April 3, 2019.

The same morning. Two systems. Both keeping track.

← PreviousContentsNext →