Typed changes
How Havoptic splits AI coding tool releases into typed change items (feature, fix, breaking, deprecation, security…) with verbatim evidence and confidence, and what changes_available: false means for legacy releases.
Each release detected since 2026-10-19 is split into change items by an extraction step that must quote the vendor notes. Releases from before that date keep their notes and summary but have no typed items.
A change item
{
"id": "[email protected]#c3",
"release_id": "claude-code-2.1.302",
"kind": "breaking",
"title": "Hooks receive tool input as JSON on stdin",
"description": "Hook scripts that parsed arguments must read stdin instead.",
"areas": ["hooks"],
"evidence": "Hooks now receive tool input as JSON on stdin instead of as arguments.",
"confidence": 0.93
}
| Field | Meaning |
|---|---|
id | {tool}@{version}#c{n}, stable for a release. |
kind | One of the kinds below. |
title, description | Neutral wording written by Havoptic (not marketing copy). |
evidence | An exact quote from the raw release notes. Items whose quote cannot be found in the notes are dropped. Cite this, not the title. |
confidence | 0 to 1. Items below 0.6 are dropped; breaking and security items need 0.75. Webhook change.* events fire at 0.85 and above. |
areas | Free-form product areas (e.g. mcp, hooks, auth), when stated. |
Kinds
| Kind | Use it for |
|---|---|
breaking | You must change something to keep working after upgrading. |
security | A vulnerability fix or security-relevant behavior change. |
feature | New capability. |
model | Model added, removed or changed (defaults, versions). |
deprecation | Still works, scheduled to go away. |
removal | Gone in this release. |
pricing | Pricing, quota or plan changes. |
policy | Terms, data handling or usage-policy changes. |
improvement | Better behavior of something existing. |
performance | Faster or lighter. |
fix | Bug fix. |
Filter with kind=breaking,security on /v1/changes, or the shortcuts breaking=true / security=true. An unknown kind returns 400 invalid_parameter.
Fields on an enriched release
changes_available:truewhen the release has typed items.abstract: neutral one-line summary.summaryis the vendor-facing marketing line; do not cite it as fact.counts: items per kind, e.g.{ "feature": 4, "fix": 7, "breaking": 1 }.has_breaking,has_security:trueorfalse.quality.extraction_status:complete,pending,failed,skipped_no_notesorlegacy;sample(QA smoke sample) andbackfill(a legacy release enriched later by the offline backfill,provenance.source: "offline-backfill") carry typed changes likecomplete.ai: the model and prompt version that produced the AI-derived fields.
Legacy releases and changes_available
Typed extraction is forward-only since 2026-10-19 (intelligence_since in GET /v1/status). Releases first detected before then are *legacy*:
changes_available: false;changesandcountsare absent or null.has_breakingandhas_securityare null (unknown), not false. Do not read null as "no breaking changes".abstractis null; showsummaryor the notes instead.quality.extraction_statusislegacy.
Range endpoints (/v1/tools/{id}/upgrade, /v1/digest, MCP get_upgrade_notes and whats_changed_since) include legacy releases in their counts but only return typed items from enriched ones. They report meta.enriched_release_count and meta.legacy_release_count, and markdown output ends with a note when legacy gaps exist. For a legacy release, read its notes with GET /v1/releases/{id}?expand=notes.