Twenty-nine days until sunset.
The analytics department occupied the fourth floor of the main building, two floors above infrastructure. The elevator opened into a wide lobby with a reception desk nobody sat at. Priya had been up here once or twice — all-hands, a product demo. She didn't have occasion to be here otherwise.
The floor was newer-feeling than infrastructure — open plan like every floor, but the standing desks were a more recent model, the monitors larger, the whiteboards covered in market segmentation charts instead of sprint planning. Enterprise dashboards ran on screen after screen, real-time precipitation maps and customer usage overlays, data with dollar figures attached. The people here moved with the confidence of a department the company valued most.
Marcus Webb's desk was at the far end, near the windows that faced west toward the mountains. He was reading his email when she arrived, and he looked up with the neutral expression of someone interrupted. She said she worked in infrastructure, she was handling the WeatherAPI sunset. He asked which version. She said v1.2.3.
Something moved across his face. Not alarm — the reverse of alarm, almost. Recognition, and the quiet attention of someone asked about a thing they'd thought of privately and not expected to discuss. He leaned back in his chair, which was a better chair than the one she had. "Nobody asks about v1.2.3 anymore." He glanced at the empty chair across from his desk. "Sit down. I have time."
He'd built it with three other engineers, he told her. 2016. The company was forty people then, one product suite, a team small enough that decisions could be made in a room by the people who would execute them. The original WeatherAPI was their first external product — the thing that put them on the map with developers before enterprise became the strategy. "We built it to be reliable," he said, and the we carried the weight of someone talking about a team that no longer existed as a team. The people were still around; the team was not. "That was the whole thing. Reliable, well-documented, affordable. If you called it, it answered."
The peak years had been 2018 through 2020. Active key registrations in the thousands by 2019, integrations across developer projects, industrial automation, agricultural systems — anything that needed tomorrow's weather in a machine-readable format. The documentation had been good — he said this without vanity, as a technical assessment. Clear endpoints, consistent behavior. Then v2.0 had launched with expanded coverage and a new pricing structure, and the migration began. Active developers migrated because they kept track of their dependencies. Automated systems didn't, because automated systems didn't read deprecation notices or do anything except what they'd been configured to do.
By 2022, Marcus's original team had scattered. He was doing enterprise analytics now. The weather data was raw material, not the product. He said this matter-of-factly, the statement of someone who had followed where the work led. He paused, and then he said: he'd noticed the orphaned callers. He wasn't precise about when — two or three years back, he thought. He'd been doing some maintenance work and pulled the v1.2.3 request logs out of curiosity, and there were all these IP addresses that hadn't changed, hadn't updated their keys, still calling the same endpoints with the same parameters since 2019. "I thought it was interesting," he said. His hands were flat on the desk. He was looking at something past her shoulder, some middle distance. "I wrote it down somewhere. I didn't follow up." A pause. "I had other projects."
She told him about the anomalous fields — the impossible forecasts first, because they were the easier thing — data for dates that hadn't happened yet, forecasts running through July and August with a precision the API had never shown in its normal operations. Marcus listened with his head tilted and the expression of someone running diagnostics while you talked. When she finished he said: "Could be a database index issue. Query logic pulling rows from the wrong date range." He paused. "Or caching quirks. We had some in the early builds."
"I checked both," she said. "The forecast dates are genuinely future." "Hm." Professional consideration. He was still working through it. "What else?"
She told him about the fields — Witness. Connected_since. Duration. She described what each contained: a boolean, a timestamp going back to the moment each caller had first connected, a day count rising with each passing day. The fields didn't appear in the API documentation. She'd searched the codebase and found nothing. He straightened. "APIs don't add their own fields," he said. Not dismissal — the tone of someone stating something he knew to be true and was using as a starting point. "Something in the middleware, maybe. A developer test that got left in. Or conditional logic that only fires under specific header combinations — we had diagnostic flags in the early builds you could trigger if you knew the right parameters." He paused. "Have you tried—" "Can I show you?"
She set her laptop on his desk and pulled up the terminal. She typed the request — the endpoint, the Omaha coordinates, the three-field parameter string she could now type from memory. The response came back in 44 milliseconds.
``` GET /v1/current?location=41.2565,-95.9345&fields=temp,humidity,pressure Host: api.cloudweather.io
200 OK { "location": "Omaha, NE", "temp": 71, "humidity": 44, "pressure_mb": 1019, "witness": true, "connected_since": "2017-04-26T09:15:00Z", "duration": 2564 } ```
Marcus leaned forward. He read the response the way you read something you built and are now looking for yourself in — familiar structure, familiar field names, and then the three lines that shouldn't be there. His finger came out and rested beside "witness": true, touching the screen.
"This is a hospital system in Omaha," she said. "Their respiratory care unit ran a scheduler that called for weather data every fifteen minutes. The unit was consolidated in 2022. The scheduler's still running. That's their connection timestamp." She pointed at the `connected_since` line. "April 26, 2017. Seven years."
He read the whole response again and sat back.
"That field is not in my code," he said.
Not a question. The flat statement of someone reporting a contradiction between what he knew and what he was looking at. "I looked," she said. "I wrote every line of that API." He was still looking at the screen, not at her. He wasn't arguing — stating a fact about himself and what that fact meant for the response on her laptop. "I don't recognize those field names. `witness` is not in my code."
He pulled up the repository on his own machine. The codebase was eight years old — Python, the style of 2016-era frameworks, comments from engineers she didn't know. Marcus moved through it with the familiarity of someone who'd built it: not reading sequentially but going to the right files, opening the right functions. He went to the response formatter first. The function that assembled the JSON object: a database query result came in, the function mapped it to the documented field names, the result went out. She watched him read through it. The function was clean — no dynamic field injection, no conditional block, nothing that would add keys to the response based on caller history or connection timestamps.
He checked the middleware chain. Three layers between the incoming request and the response formatter — authentication, rate limiting, a caching layer. None of them modified the response body. He went into the database schema and worked through the tables: weather data, API key registrations, usage logs, rate limit tracking. No table for caller history. No column for connection timestamps. Nothing that corresponded to connected_since or duration or any field that would track when a caller had first connected.
She ran the search herself while he worked. `grep -r "witness" .` in the repository root. Zero results. `grep -r "connected_since" .` Zero results. `grep -r "duration" .` Nineteen results, all from comments and a unit test that had nothing to do with response formatting.
Marcus checked the deployment configuration files. Environment variables. The infrastructure documentation that lived in a separate repository. Clean. Every search came back empty. He sat back. He looked at the ceiling for a moment. "I don't know what to tell you," he said. He sounded tired — not defeated, exactly, but the weariness of someone who had moved on from a thing and was being asked to return to it. He said he could file a technical investigation request with the platform team, get some more eyes on it. "I'll handle it," she said.
He nodded. He closed the repository on his screen. He walked her to the elevator and stood by the doors while they waited, and just before the elevator arrived he said: "Everything gets deprecated eventually." He said it as settled fact, a thing that had brought him peace or at least its reasonable approximation. She understood what he meant by it. She couldn't take it the way he'd offered it. The doors opened. She stepped in. He lifted a hand, a half-wave, and turned back toward the windows and the mountains.
Building B was cooler than the main building. The basement corridor had the stillness of spaces not meant for occupancy — fluorescent strips overhead, the steady vibration through the raised floor from the HVAC units below, no other sound. Her access card at the glass security door, and then the fans caught her as she stepped through. Cold, dry air that tasted of metal and nothing else. Row 7, Rack 14 — second visit, and she walked to it directly, no need to check the aisle markers.
The rack looked the same as it had the first time, because it always looked the same. Green across the status indicators. Cable runs along the back. The LEDs blinking in their steady pattern — not urgent, not distressed, the quiet confirmation of a system performing within expected parameters. She set her laptop on the floor, which was the only flat surface, and opened the terminal.
``` GET /v1/health Host: api.cloudweather.io
200 OK { "status": "operational", "uptime": 2971, "version": "1.2.3" } ```
Forty-one milliseconds. Operational. Uptime: 2,971 days. Version 1.2.3. Marcus had written every line of it. He had come to the code looking for the explanation and left without one. The fields arrived from nowhere he could trace — not the database, not the middleware, not the response formatter he'd built eight years ago and still knew by memory. He'd built it to be reliable. It was. It had been running, without interruption, for 2,971 days — longer than some marriages, longer than some careers.
The fans moved air at a constant frequency. The temperature in the room held at 66 degrees. She stood in front of the rack and let the cold settle around her and looked at the green lights, which were simply indicators for hardware running within normal range. The API was still answering.
Twenty-nine days.