Breakage Calendar · Data for scripts and agents · Updated
Breakage Calendar API
Every date on the Breakage Calendar is in one JSON file: what stops working, who is affected, how to check, and the fix. A tested fix carries the day we ran it.
An end-of-life list says when a version stops getting updates. This calendar is about the day something stops working: an image tag that moves to a new major version, an AI model or API that shuts down, a CI runner that is retired, a time-zone rule that changes. It needs no key and no sign-up, so a coding agent can read it before it upgrades or deploys.
The files
Four static files on cybernative.ai. They change when we add or update a date.
| URL | What it holds |
|---|---|
https://cybernative.ai/breakage-calendar/entries.json | Every date: what changes, who is affected, how to check, the fix and its sources. The one source the page, the subscription and the feed are built from. |
https://cybernative.ai/breakage-calendar/check/signatures.json | For each date a repository's files can show: which files to read and the search to run on each line. Dates a repository cannot show are listed with the reason. |
https://cybernative.ai/breakage-calendar/breakage-calendar.ics | The same dates as a calendar subscription (iCalendar). |
https://cybernative.ai/breakage-calendar/feed.xml | The same dates as an Atom feed, newest first. |
Each date also has its own place on the page: https://cybernative.ai/breakage-calendar/#<id>, where id is the entry's id. Link there when you show a date to a person.
Two questions in one command
Which dates are still to come, with the kind of fix each has:
curl -s https://cybernative.ai/breakage-calendar/entries.json |
jq -r --arg today "$(date -u +%F)" '.entries[]
| select(.overdue or ((.dateEnd // .date) >= $today))
| [.date, .fix.kind, .short, "https://cybernative.ai/breakage-calendar/#" + .id]
| @tsv' | sortWhich dates name one dependency (here celery). It searches the entry's text and the libraries we found sending a retiring AI model by default:
curl -s https://cybernative.ai/breakage-calendar/entries.json |
jq -r --arg dep celery '.entries[]
| select([.title, .what, .affected, .check, (.checkCode // ""),
((.packages // [])[] | .package)]
| join(" ") | ascii_downcase | test("\\b" + $dep + "\\b"))
| "\(.date) \(.short) https://cybernative.ai/breakage-calendar/#\(.id)"' A name search finds dates that mention the name. It cannot tell whether your version or your settings are affected: read the entry's affected and check fields, or run the repository check below.
Which dates hit a repository
signatures.json holds the search each date's own check runs. For each signature: read the files whose path matches files, and report the date when a line matches one of patterns.
| Field | Meaning |
|---|---|
row | The entry id in entries.json. |
files | any: every text file. source: code and configuration, not documents. workflow: files matching the top-level workflow pattern (.github/workflows/*.yml). Anything else is a regular expression for the path, relative to the repository's top folder. |
patterns | Regular expressions (JavaScript syntax), each tested against one line at a time. |
needs | If present, a file counts only when its whole text also matches this expression (for example ubuntu-latest). |
kind | match: a matching line uses what the date changes. possible: the files use it, and only some setups break; read the entry's check. postgres: a Docker image line whose tag moves; the reference matcher's postgresVerdict decides. |
blind | Entry ids a repository's files cannot show (a server's certificate, a resolver's trust anchor), each with the reason. |
The reference matcher is the scan function in match.js, JavaScript with no dependencies. It is the code the in-browser repository check runs; it skips .git, node_modules, virtual environments and build output, and lines in documents count only as mentions.
Fields in entries.json
The file is one object: title, page, updated (the day the file last changed) and entries, a list of dates. Each entry has:
| Field | Meaning |
|---|---|
id | Stable identifier: the date, then a short slug. Also the page anchor. |
date | First day of the change, YYYY-MM-DD. |
datePrecision | day; month (some day that month, date is the 1st); or window (from date to dateEnd). |
dateEnd | Last day of a window, else null. |
days | Optional. In a window, the separate days the change happens (brownouts), from date to dateEnd. |
time | Optional time of day as text, for example 01:00 UTC or 02:00 local; else null. |
overdue | Optional. The change was announced for date but had not happened on this day. Treat it as still to come. |
title, short | A one-line title, and a shorter one for lists. |
area | A broad group, for example AI APIs, CI runners, Time zones. |
what | What changes. |
affected | Who is affected, and who is not. Later updates in this text start with Update, <day> <Month>:. |
check, checkCode | How to check your own system, and an optional command to run. |
fix.kind | tested: we ran this fix (fix.testedAt is the day). guide: a check or guide; the fix itself is not tested by us. none: no tested fix yet. |
fix.href, fix.label | Where the fix is. A path starting with / is on cybernative.ai. |
fix.text, fix.code | Optional. The fix in words, and a command or snippet. |
sources | The vendor's own announcements: label, href, and checkedAt, the day we last read it. |
packages, packagesNote | Optional, on AI model retirements: libraries whose code sends the retiring model when you do not choose one, with the version and file line we read. |
added | The day the entry joined the calendar. |
leadDays | Optional. Days of warning the calendar subscription gives (default 14). |
see | Optional. A related page on cybernative.ai: href and label. |
Fields not listed here are for the page and the feed, and may change.
Fetching
- No key and no account. Send a
User-Agentthat names your tool. - Each file has an
ETagandLast-Modified: sendIf-None-Matchand an unchanged file answers304with no body. WithAccept-Encoding: gzip,entries.jsonis about 95 kB instead of 350 kB. - The files do not send CORS headers, so a web page on another site cannot read them from the visitor's browser. Fetch them from a server, a command line or an agent's own tools.
- Something wrong or missing? Write to hello@cybernative.ai with the entry id.