# Changelog

> What's new in Forma, newest first.

New features, improvements and fixes across the API, the oracles and the MCP
server, newest first. Each entry says what changed and, when you need to act,
what to do. If something changed and it is not here, tell us — we treat a
missing entry as a bug.

**Two version numbers, and they never move each other.** The API's major
version is in the URL (`/v1`); each release that changes its endpoints or request
bodies gets its own version (`0.x.y` while in preview), reported in `info.version`
of `GET /v1/openapi.json`. The rules an answer was checked against are versioned
per answer, in `verified_by` — see [Citations](https://docs.formalogic.io/citations). A rules update never
changes the API, and an API change never invalidates a citation you already
hold.

## Where Forma is today

Forma is in **preview**. Until the first general release is dated here, any
part of the API may still change, so don't pin to it yet.

- **Six endpoints** — `GET /v1/oracles`, `POST /v1/oracles/{name}/ask`,
  `GET /v1/me`, `POST /v1/figures/render`, `GET /v1/news` and
  `POST /v1/feedback`.
- **Two oracles** — `chart` for Vega-Lite, gnuplot, Plotly, ECharts and
  Chart.js, and `vector-graphics` for TikZ, PicTeX and MetaPost.
- **Published rate limits** — `requests_per_minute` for every plan, in
  [Limits and credits](https://docs.formalogic.io/limits#requests-per-minute).
- **Honest figures** — `vector-graphics` says no, with an `invalid` that names
  the feature, when a drawing needs something it cannot draw (gradients, images,
  animation, patterns, transparency, shading) rather than drawing something
  close. Titles and labels can be up to 60 characters, captions up to 160.
- **Figures that follow your description** — `vector-graphics` draws the
  relations you describe (orthogonal, tangent, parallel, perpendicular), lengths
  given as distances, and axes. Drawings match your description: points sit on their lines, and descriptive
  sentences become the caption.

## 2026-10-02

### Charts are drawn only from values you give

**Changed** · A chart request without its values now answers
`422 DATA_REQUIRED`, and you are not charged, instead of returning a chart of
made-up values. Every valid chart says where its numbers came from in `data`
(`supplied` or `generated`). See [Ask an oracle](https://docs.formalogic.io/ask).

**What to do:** send your values, or add `"allow_generated_data": true` when
illustrative values are fine. Agents: update the MCP server so it can pass the
flag.

### Refusals say why, and the catalogue says what can be drawn

**New** · An `invalid` answer now carries `reason` — `unsupported_feature`,
`chart_type_mismatch` or `no_valid_answer` — so your code can branch on it; see
[Verdicts](https://docs.formalogic.io/verdicts). A chart of a different kind from the one you asked for is
now `invalid`. Every answer carries a `request_id` to quote when you contact us,
and `GET /v1/oracles` lists each oracle's `drawable_formats`.

## 2026-10-01

### Every error has a code

**Fixed** · A request that fails validation now answers `422`
`VALIDATION_FAILED`, with `context.parameter` naming the field, instead of a
list with no code. A figure that cannot be drawn because of a problem on our
side now answers `503 UPSTREAM_UNAVAILABLE` — wait and send it again — instead of
a `422` that blamed your request. See [Errors](https://docs.formalogic.io/errors).

## 2026-09-29

### News and feedback endpoints

**New** · `GET /v1/news` lists what's new, newest first, and `POST /v1/feedback`
tells us what worked and what didn't. Both are free. See
[News and feedback](https://docs.formalogic.io/news-feedback).

## 2026-09-28

### Figures render in the chat

**New** · The MCP `show_figure` tool shows a figure inline in ChatGPT and other
hosts that support MCP Apps, with the figure and its source on separate tabs.

### Connect an agent with OAuth

**New** · The hosted MCP server signs agents in with OAuth, so connecting one
needs no API key. See [Connect your agent](https://docs.formalogic.io/connect).

### Faster vector-graphics answers

**Improved** · `vector-graphics` answers about a second faster.

## Our versioning promise

Every entry is tagged **New**, **Improved**, **Changed**, **Fixed**,
**Deprecated** or **Removed**, and says what you need to do — usually nothing.

**New** — a new field, oracle or format. Within `/v1` it is additive: clients
that ignore fields they don't recognise need no change.

**Improved** — the same behaviour, better: faster, clearer, or more often right.
We say what got better and by how much.

**Changed** — behaviour that is different but compatible. We describe the old
behaviour next to the new one.

**Fixed** — something that did not work as documented now does. We say what was
wrong.

**Deprecated** — still works, has an end date, and names what to move to.

**Removed** — only ever in a new major version. Within `/v1` we will not remove a
field, change a field's type, or narrow an enum you already receive.
