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.

URLWhat it holds
https://cybernative.ai/breakage-calendar/entries.jsonEvery 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.jsonFor 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.icsThe same dates as a calendar subscription (iCalendar).
https://cybernative.ai/breakage-calendar/feed.xmlThe 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' | sort

Which 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.

FieldMeaning
rowThe entry id in entries.json.
filesany: 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.
patternsRegular expressions (JavaScript syntax), each tested against one line at a time.
needsIf present, a file counts only when its whole text also matches this expression (for example ubuntu-latest).
kindmatch: 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.
blindEntry 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:

FieldMeaning
idStable identifier: the date, then a short slug. Also the page anchor.
dateFirst day of the change, YYYY-MM-DD.
datePrecisionday; month (some day that month, date is the 1st); or window (from date to dateEnd).
dateEndLast day of a window, else null.
daysOptional. In a window, the separate days the change happens (brownouts), from date to dateEnd.
timeOptional time of day as text, for example 01:00 UTC or 02:00 local; else null.
overdueOptional. The change was announced for date but had not happened on this day. Treat it as still to come.
title, shortA one-line title, and a shorter one for lists.
areaA broad group, for example AI APIs, CI runners, Time zones.
whatWhat changes.
affectedWho is affected, and who is not. Later updates in this text start with Update, <day> <Month>:.
check, checkCodeHow to check your own system, and an optional command to run.
fix.kindtested: 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.labelWhere the fix is. A path starting with / is on cybernative.ai.
fix.text, fix.codeOptional. The fix in words, and a command or snippet.
sourcesThe vendor's own announcements: label, href, and checkedAt, the day we last read it.
packages, packagesNoteOptional, 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.
addedThe day the entry joined the calendar.
leadDaysOptional. Days of warning the calendar subscription gives (default 14).
seeOptional. 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-Agent that names your tool.
  • Each file has an ETag and Last-Modified: send If-None-Match and an unchanged file answers 304 with no body. With Accept-Encoding: gzip, entries.json is 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.