{"current":"32.0.1","policy":{"adoptedIn":"27.2.0","adoptedOn":"2026-10-26","breakingReleasesPerWindow":1,"nextBreakingWindowOpens":"2026-11-09","statement":"Breaking changes land at most once per ISO week (Monday to Sunday, UTC), counted from the release record. Between windows every release is compatible: a new tool or a widened input beside the old one, with the old one retired at the next window. Output schemas are closed, so a field added to an existing output is breaking and waits for a window. Only the operator may admit a second breaking release inside a week, and each such override is published here with its reason.","window":"iso-week-utc"},"releases":[{"classification":"compatible","date":"2026-11-02","note":"Wording only (ontology 25.5.1): tool and resource descriptions say snapshot for a finished, checked and frozen warehouse run, and publish for the act, where they said seal (operator, 2 November 2026). No input or output schema changed.","version":"32.0.1"},{"classification":"breaking","date":"2026-11-02","note":"The 2 November window (ontology 25.5.0). `query_objects` reads a new published set, control changes (`type: \"control-change\"`, /api/object-sets?type=control-change): every change main.control_changes holds in who controls an organization's treasury, token or governance settings or a program's upgrade authority, with its time, slot, subject, organization, kind, before and after values and the log's watch start, split by kind: `kind` is one of the eleven facts the log watches, filtered, counted and measured by like any field (`countBy: \"kind\"`), and the public metric `control-change-count` counts the changes. `get_object` resolves a control change by `changeId` from /api/control-changes and links it to its organization. The registry also gains `benchmark-run`, the record benchmark's runs, private by decision: `get_object` answers it unsupported, no set or public metric carries it, and no score is published. The loop counts are published (decided 30 October 2026): `stated-organization-count`, `updating-organization-count`, `captured-open-decision-count` and `labeled-decision-count`, each with its coverage count, join the public metrics. `get_metrics` gains `declared`: the agent decider and agent trader counts (zero of each as of 1 November 2026), stated with the day checked and the method from the registry, not measured by a seal. Breaking for a client validating the closed 31.x schemas: query_objects' set type, get_object's type, key and view unions, and link targets widen, and get_metrics gains a field.","version":"32.0.0"},{"classification":"compatible","date":"2026-11-01","note":"The decision set gains the trade ledger's coverage of each decision (ontology 25.2.0): `ledger_coverage`, one state from a closed set (repeat, not-collected, no-pool, incomplete-history, complete-no-trades, unvalued-trades, valued), with `history_read_at` (the ledger's last full history read), `earliest_trade_at` (with `last_trade_at`, the bounds of the history it holds), `unvalued_trades` and `quote_mint`; seven count metrics, one per state (`valued-decision-count`, `unvalued-trades-decision-count`, …), sum to `decision-count` by engine. A set published before the columns is read with them null until the next seal. Columns and metrics added; no tool schema changed.","version":"31.3.0"},{"classification":"compatible","date":"2026-11-01","note":"The organization, decision and trade sets gain columns (ontology 24.10.0), each null where unread, published from the first seal after the release and read as null before it: an organization's treasury signers and approval threshold, monthly spending limit (in its settlement token, and in dollars where that is a dollar stablecoin), and its token's mint and freeze authority (`treasury_signer_count`, `treasury_threshold`, `spending_limit_set`, `spending_limit_per_month`, `spending_limit_usd_per_month`, `mint_authority`, `mint_authority_revoked`, `freeze_authority`, `freeze_authority_revoked`, `vault_read_at`); a decision's token price at its close and 1, 7 and 30 days after, with each later price's change from the close (`close_price_usd`, `price_1d_usd`, `price_7d_usd`, `price_30d_usd`, `price_change_1d`, `price_change_7d`, `price_change_30d`); and a trade's `price_impact_basis`, with futarchy.fi impacts read from its pools' recorded states. No tool, input or output schema changes.","version":"31.2.0"},{"classification":"compatible","date":"2026-11-01","note":"The record benchmark's 28 October product findings (TODO B13). `get_object` states a decision's own parts (execution, outcome, impact, capital, parties) before its retained analysis, which comes last: every decision result the benchmark's model read was cut at 8,000 characters before `execution`, so an executed decision read as not checked. The listed descriptions and the initialize instructions say the same in fewer words, and the metering terms are stated once, on `pull_review_packet` (the tools/list result as JSON, 16,145 to 15,036 characters; the instructions, 2,120 to 1,614). `get_organization_diligence` and the diligence-answer limitations say that query_objects' diligence-answer set holds the answers sealed a cycle earlier. A decision whose stated close passed with no result reported reads `awaiting-result`, not `open`, in the decision set from the next seal (`state` is a string, so no schema moved). Key order, text and a value of an open string field only; no tool, input or output schema changed, so compatible.","version":"31.1.0"},{"classification":"breaking","date":"2026-10-30","note":"`query_objects` reads recording windows (`type: \"window\"`), published as a set from 30.2.0: each window's threshold, TWAPs, outcome and knowledge times, among them `finalization_known_at`, the time the record first knew the window had finalized; `search` finds their fields and `describe` gives the set, and a decision's or proposal's window is followable as a link. A new value in `query_objects`' closed output `type`, so breaking.","version":"31.0.0","windowOverride":{"date":"2026-10-30","reason":"The operator approved releasing query_objects' read of recording windows with the set it reads instead of in the next window: \"Can we ship B as well?\", then \"I approve\" (30 October 2026), after the record benchmark's R8 asked for a finalization's knowledge time no public read served; 28.0.0, 29.0.0 and 30.0.0 hold this week by the earlier overrides."}},{"classification":"compatible","date":"2026-10-30","note":"Recording windows are published as an object set (/api/object-sets?type=window, ontology 24.8.0): every column of main.window_outlook_windows but its ticks, including `finalization_known_at`, when the record first knew the window had finalized, beside `finalized_at`, the event, and the threshold, outcome and final TWAPs with their knowledge times. `describe` says the set is published and that `query_objects` reads it from 31.0.0: a new set widens query_objects' closed output, which is breaking and waits for the window that opens on 2 November 2026. No tool, input or output changed, so compatible.","version":"30.2.0"},{"classification":"compatible","date":"2026-10-30","note":"The initialize instructions say an unknown is never 0 and never today: a sum over no row that states the value, or a count whose coverage is 0, is answered unknown with the record's reason, and a date is the one the record states. On benchmark 1.6.0 three of 30.0.0's wrong answers were a value given where the record holds none. Instructions only; no tool, input or output changed, so compatible.","version":"30.1.0"},{"classification":"breaking","date":"2026-10-29","note":"`get_metrics` and `query_objects` measures publish two more units: `hours-per-object`, the mean or median of an hours field, and `ratio-per-object`, the mean or median of a field that is itself a share from 0 to 1. The median wait for a first trade (`median-hours-to-first-trade`) and the median largest-holder, top-ten-holder and circulating shares are public in them, and three metrics are new: `median-volume-per-counted-decision`, `median-window-hours` (a decision's stated open to stated close) and `median-organization-pass-share` (by the organization's `decision_engine`). The decision set gains `window_hours` and `last_trade_at` (an engine's latest trade is its decisions' newest, by ordering), the organization set `decision_engine` and `pass_share`, and a set published before a column was added is read with that column null until the next seal. `query_objects` reads a `countBy` sent as a list of one field. A widened output enum, so breaking for a client validating the closed 29.x schema.","version":"30.0.0","windowOverride":{"date":"2026-10-29","reason":"The operator, after the record benchmark's design pass named the medians an agent could not reach: \"Breaking changes fine, let's do it\" (29 October 2026); 28.0.0 and 29.0.0 hold this week by the earlier overrides."}},{"classification":"breaking","date":"2026-10-29","note":"`query_objects` reads the published object sets (/api/object-sets): every public object type's whole gold relation (organizations, DAO accounts, decisions, MetaDAO proposals, deciders, diligence answers, and trades one engine and day at a time), every column the ontology binds, under the contract's own column names (`slug`, `decision_id`, `traders`, …; were the dimensions document's `organization`, `decisionId`). It follows one-hop links (`<link>.<column>`), and measures any registry metric over the matching rows by up to three fields and a time grain together (`measure`); a trade question names its engine and a block_time window of at most 31 days. `search` finds fields too, each saying whether any published row holds it (`held`), and says when only weak matches were found; `describe` gives a type's fields with their coverage, meanings and links. Breaking for a client that sends the 28.x field names to `query_objects` or validates its 28.x output.","version":"29.0.0","windowOverride":{"date":"2026-10-29","reason":"The operator's plan for publishing the ontology's object sets, decision 3: \"new version we can break\", then \"Complete 1-5\" (29 October 2026); 28.0.0 holds this week by the earlier override."}},{"classification":"breaking","date":"2026-10-28","note":"`tools/list` carries seven tools, not 34: `search` (find a tool, object type, metric, organization or decision by its words), `describe` (one in full), `query_objects` (filter, count and group the published organizations, DAO accounts, decisions and deciders), `get_object`, `get_metrics`, `call_tool` (run any catalogued tool by name) and the metered `pull_review_packet`. The other 27 tools are unchanged and still answer `tools/call` by name; they are found by `search` rather than listed. `get_object`'s listed input is the type and every key field as a string (each type's exact key is `describe`'s, still enforced) and its listed output is outlined one level deep. A number, boolean, array or object sent as its JSON text is read as what the input schema declares. The listing fell from about 133,000 characters to about 12,700. Breaking for a client that expects the 27.x listing.","version":"28.0.0","windowOverride":{"date":"2026-10-28","reason":"The operator asked for the listing to be rebuilt as general verbs over the ontology and said \"Breaking changes fine\" (28 October 2026); the week already holds 25.0.0 to 27.0.0, recorded before the window was adopted."}},{"classification":"compatible","date":"2026-10-26","note":"`read_series` accepts four more series, Jupiter's 24h flow by side (`buy-volume-24h-usd`, `sell-volume-24h-usd`, `buys-24h-count`, `sells-24h-count`), as /api/organization-history serves them. A widened input enum, so compatible; no output changed.","version":"27.3.0"},{"classification":"compatible","date":"2026-10-26","note":"The release window: from this release a breaking change lands at most once per ISO week (UTC), and between windows a change is additive, with the old tool or field retired at the next window. The `mcp-changelog` resource (/ontology/mcp-changelog.json) publishes this record. A resource added; no tool contract changed.","version":"27.2.0"},{"classification":"compatible","date":"2026-10-26","note":"`read_series`, `read_outcome` and `read_decision_as_of`: point-in-time reads that each take `asOf`, an ISO 8601 instant answered from knowledge time, never backfilled. Tools added; no existing input or output changed.","version":"27.1.0"},{"classification":"breaking","date":"2026-10-26","note":"`inspect_playbook`'s case studies name the organization's registry slug `organization` (was `organizationSlug`) beside `organizationName`, so no tool output names a slug `organizationSlug`. A renamed field in a closed output, so breaking for any client that read `organizationSlug`.","version":"27.0.0"},{"classification":"breaking","date":"2026-10-26","note":"`get_metrics` metric units gain `usd-per-object`, the mean or median of a dollar field over the metric's object type, so `usd` stays a sum. A widened output enum, so breaking for a client validating the closed 25.x schema.","version":"26.0.0"},{"classification":"breaking","date":"2026-10-26","note":"The closed sector enumeration in the classification outputs widens from seven to eighteen (ontology 22.0.0), and `read_market` gains `allVenueVolume24hUsd` with its source and the live `treasury` beside `treasuryCashUsd`, which now counts every USD stablecoin in the vault. Breaking for a client validating the closed 24.x schema.","version":"25.0.0"},{"classification":"breaking","date":"2026-10-26","note":"`read_market` states each quote's pool depth (`{ poolLiquidityUsd }`) where it was withheld; the spread stays withheld. Its closed `depth` widens to a union, so breaking for a client validating the closed 23.x schema.","version":"24.0.0"},{"classification":"compatible","date":"2026-10-26","note":"`read_structure`: who trades each decider's markets, in aggregate, per decider and pooled per engine or organization. A tool added, so compatible.","version":"23.1.0"},{"classification":"breaking","date":"2026-10-25","note":"`get_object` resolves a `decider` (whoever put decisions to their markets, with the wallets that traded them in aggregate only), and `get_dimensions` gains the optional `deciders` collection. Breaking for a client validating the closed 22.x schema.","version":"23.0.0"},{"classification":"compatible","date":"2026-10-25","note":"`read_market` (each quoted organization's quote, its changes, treasury cash and the cohort FDV index) and `read_outlook` (both outlooks' open forecasts, records, baselines and MetaDAO's base rate). Tools added, so compatible.","version":"22.1.0"},{"classification":"breaking","date":"2026-10-23","note":"A decision's `analysis` on `get_object` is its analytical run, null where none is recorded yet, or `{status: \"withheld\", reason}` where no run can read it: the 192 decisions on MetaDAO's programs before Futarchy v0.6, which are not on the trade ledger and had served null. A widened output union, so breaking for a client validating the closed 21.x schema.","version":"22.0.0"},{"classification":"breaking","date":"2026-10-21","note":"`read_news` and `read_reports` items name their organization as every other surface does: `organization` is the registry slug (nullable) and `organizationName` the display name. They had returned the display name as `organization` beside an `organizationSlug`, which is gone. Breaking for every client reading either item.","version":"21.0.0"},{"classification":"breaking","date":"2026-10-20","note":"`get_metrics` metric units gain `count-per-object`, the mean or median of an integer count over the metric's object type; six averages and medians published as `count` move to it. A widened output enum, so breaking for a client validating the closed 19.x schema.","version":"20.0.0"},{"classification":"compatible","date":"2026-10-18","note":"`read_news` takes `sector` and `industry`. Inputs widened and the output unchanged, so compatible.","version":"19.2.0"},{"classification":"compatible","date":"2026-10-15","note":"`get_classifications`: sourced decision categories, action tags and organization sectors. A tool added; existing tool contracts are unchanged.","version":"19.1.0"},{"classification":"breaking","date":"2026-10-14","note":"Decision objects include independent analytical results and sourced interpretations, and `get_object` resolves an `analytical-run` and a `diligence-answer`; the closed object type and view enumerations widen. Review packet version 2 replaces the paid review roster with independent analyses and replay inputs. Breaking for a client validating the closed 18.x schemas.","version":"19.0.0"},{"classification":"compatible","date":"2026-10-13","note":"`get_organization_diligence`: each organization's answers to the fixed diligence questions, as sourced facts or a stated unknown, never a score. A tool added, so compatible.","version":"18.3.0"},{"classification":"compatible","date":"2026-10-13","note":"`read_reports`: the report listing the App's Reports page shows. A tool added, so compatible.","version":"18.2.0"},{"classification":"compatible","date":"2026-10-12","note":"`read_news`: the ranked news the App's News page lists. A tool added, so compatible.","version":"18.1.0"},{"classification":"breaking","date":"2026-10-12","note":"`get_object`'s window view states what its times are: its `basis` says it is the live snapshot's row, with the scheduled open and close the proposal account states. A changed output literal, so breaking for a client validating the closed 17.x schema.","version":"18.0.0"},{"classification":"breaking","date":"2026-10-11","note":"`get_metrics` values carry `through`, the UTC day a change's base row was valued through (null on every other row), and a metric with a time column has one such row beside its total: the total less it is the 30-day change. An added output field, so breaking for a client validating the closed 16.x schema; a reader that picked \"the row with no grain and no dimension\" must also require `through` null.","version":"17.0.0"},{"classification":"breaking","date":"2026-10-11","note":"The transition aliases 15.0.0 announced are dropped: get_live_proposals and get_object's DAO account view no longer return `organization` beside `organizationName`, and findings no longer carry `decision` beside `decisionId`. Breaking only for a client that read a deprecated alias.","version":"16.0.0"},{"classification":"breaking","date":"2026-10-11","note":"One vocabulary (ontology 15.0.0). The review envelope of the six review tools is `review` (was `lane`); an organization's display name is `organizationName` wherever `organization` had carried it beside a slug, so `organization` means the slug on every surface; the finding view's id is `decisionId`. Breaking renames on closed output schemas; the old fields stayed beside the new ones for one release.","version":"15.0.0"},{"classification":"breaking","date":"2026-10-09","note":"The registry gains organizations deciding on futarchy.fi, Umia and Butter, which carry no MetaDAO launch template, so `get_object`'s organization view states `defaultThresholdPct` as null for them. Breaking only for a client validating the closed 13.x output schema. Compatible beside it: a decision on those engines carries its `decision-for-organization` link.","version":"14.0.0"},{"classification":"compatible","date":"2026-10-09","note":"`enforce_scope`'s publishable claim is the decision record's filed attack reading where one is filed; the live thesis treats an oracle that has not recorded as unobserved, never a price; argument refusals name the path. Compatible.","version":"13.1.0"},{"classification":"breaking","date":"2026-10-09","note":"`get_object` takes a forecast key (answered `unsupported`, where it used to be refused) and an organization slug carrying a dot (`ordr.trade`). The view's `key` echoes the wider union, so breaking only for a client validating the closed 12.x output schema. Compatible beside it: the case tools carry the decision record's published reading where one is filed, malformed request ids are -32600, an unsupported MCP-Protocol-Version header is HTTP 400, and tools/list refuses a cursor it never issued.","version":"13.0.0"},{"classification":"breaking","date":"2026-10-08","note":"The forecast object type joins the closed output contracts. Breaking for a client validating the closed 11.x schemas.","version":"12.0.0"},{"classification":"compatible","date":"2026-10-08","note":"Every tool states its behaviour hints (read-only, non-destructive, closed-world), a missing or malformed argument is an isError result instead of a -32603 crash, and the live tools accept the collector's thirty-minute window. Compatible: a hint stated where none was only narrows the cautious default.","version":"11.1.0"},{"classification":"breaking","date":"2026-10-06","note":"A metric's `aggregate` may be `median`, and `get_metrics` serves the median trades and traders per decision and `trader-count`. `get_object` resolves a `trade` by engine, chain, market, transaction and position. Breaking only for a client validating the closed 10.x output schemas.","version":"11.0.0"},{"classification":"breaking","date":"2026-10-06","note":"`get_metrics` serves trading metrics (trades, dollar volume, trades and traders per decision), options per decision and organization-link metrics, and a metric's `unit` may be `usd`. Breaking only for a client validating the closed 9.x output schema, which does not list `usd`.","version":"10.0.0"},{"classification":"breaking","date":"2026-10-06","note":"Six reviews on every engine (ontology 12.0.0): `get_object` resolves a finding for a decision on any engine, and the finding view names its decision by `engine`, `chain` and `decision` with the `rosterVersion` it was filed under. Breaking for a client that reads a finding's `proposal` or validates the closed 8.x schemas.","version":"9.0.0"},{"classification":"breaking","date":"2026-10-06","note":"One type per thing (ontology 11.0.0): a MetaDAO proposal is a decision. `get_dimensions` drops its `proposals` collection (each MetaDAO decision row carries its proposal's `number`); `get_object` no longer serves another engine's decision as a `proposal`; window and finding links name the decision by engine, chain and id; `get_decision_context` takes a decision's identity beside a proposal's; `get_metrics` serves the retired proposal metrics as decision metrics. Breaking for a client that keys a proposal of another engine, reads `proposals`, or validates the closed 7.x schemas.","version":"8.0.0"},{"classification":"breaking","date":"2026-10-05","note":"`get_live_proposals` names an admin cancellation on the proposal it ended (`proposals[].cancelledAt`): the account still reads `failed`, but no market decided it. Breaking only for a client validating the closed 6.x output schema.","version":"7.0.0"},{"classification":"compatible","date":"2026-10-04","note":"`get_metrics`: every public metric's definition and its values at the newest seal, whole or narrowed to one metric by a dimension or a time grain. Additive.","version":"6.1.0"},{"classification":"breaking","date":"2026-10-04","note":"One model (ontology 9.0.0). `get_object` types `receipt-outcome` and `action-lineage` replace `decision-outcome` and `decision-record`, links named `-of-decision` replace their `-proposal` spellings, and `map_live_exposure` and `map_attack_surface` say `rule`, `published-rule` and `publishedRules` where they said `venue`, `venue-rule` and `implementations`. Every `get_object` view carries an `ontology` stamp. Breaking for a client matching the old spellings or validating the closed 5.x schemas.","version":"6.0.0"},{"classification":"breaking","date":"2026-10-02","note":"One word for one thing (ontology 8.0.0). The tracked entity is an organization and the futarchy account a proposal names a DAO account: `get_object` types `organization` and `dao-account` replace `protocol` and `organization`, a proposal key and every economic identity name the account `dao`, `get_dimensions` returns `organizations` and `daoAccounts` and narrows with `organization`, and every field spelled protocol or project is spelled organization. Breaking for every client; no aliases.","version":"5.0.0"},{"classification":"compatible","date":"2026-10-02","note":"tools/list advertises each output schema as a closed outline of its first two levels, and the full closed schemas move to the `tool-output-schemas` resource (/ontology/tool-output-schemas.json). Every output that satisfied the full schema satisfies the outline, so no validating client breaks.","version":"4.1.0"},{"classification":"breaking","date":"2026-10-02","note":"`get_object` resolves a `decision` (any engine's decision by engine, chain and decision id) in the ontology's form: purpose, knowledge, execution, outcome, each recorded or withheld. Breaking for a client validating outputs against the closed 3.x schema: `type` and `links[].target` may now be \"decision\". tools/list publishes every schema compacted: a sub-schema used more than once moves to the schema's own $defs and is referenced locally, with no change to what any schema accepts; a client that cannot resolve a local $ref must expand it first.","version":"4.0.0"},{"classification":"compatible","date":"2026-10-01","note":"`get_dimensions`: the warehouse's gold dimensions (tracked protocols, the organizations and proposals the sealed run knows), whole or narrowed to one protocol or DAO; `get_object` takes its protocol-organization links from the same published dimensions. Additive.","version":"3.2.0"},{"classification":"compatible","date":"2026-09-29","note":"`get_object` serves a decoded engine's decision (Combinator, Umia, Butter) by engine, chain and the engine's own decision id, as a new `engine-decision` object; such keys answered `unavailable` in 3.0.0, and a MetaDAO key resolves exactly as before. Additive.","version":"3.1.0"},{"classification":"breaking","date":"2026-09-29","note":"A decision's identity names its engine and chain. `identity.engine` is optional (absent means MetaDAO, as every earlier identity is) and `identity.chain` is any chain the engine registry lists; engines the record does not yet decode are refused by name. Breaking for a client validating outputs against the closed 2.x schema, which had no `engine` field.","version":"3.0.0"},{"classification":"compatible","date":"2026-09-22","note":"`get_object`: one read-only resolver over the object registry by exact key. Additive.","version":"2.10.0"},{"classification":"compatible","date":"2026-09-19","note":"The six reviews are named by discipline (Evidence, Attack, Market, Playbooks, Learning, Claims) in every title, summary and payload label; tool names, ids and schemas are unchanged.","version":"2.9.0"},{"classification":"compatible","date":"2026-09-16","note":"Exact-identity retained dossier discovery and inspection.","version":"2.8.0"},{"classification":"compatible","date":"2026-09-16","note":"Typed claim support verification against pinned evidence.","version":"2.7.0"},{"classification":"compatible","date":"2026-09-16","note":"Additive read-only decision context over pinned database revisions.","version":"2.6.0"},{"classification":"compatible","date":"2026-09-08","note":"Five source-scoped economic investigation instruments.","version":"2.5.0"},{"classification":"compatible","date":"2026-08-25","note":"`pull_review_packet`: the metered review packet joins the registry; the HTTP transport prices it per pull via the x402 v2 handshake.","version":"2.4.0"},{"classification":"compatible","date":"2026-08-24","note":"`map_live_exposure` joins the mechanism taxonomy to the open windows.","version":"2.3.0"},{"classification":"compatible","date":"2026-08-24","note":"Every tool advertises a closed `outputSchema`, so the no-composite refusal is client-verifiable rather than a property of this implementation.","version":"2.2.0"},{"classification":"compatible","date":"2026-08-24","note":"Every review payload, including inspect_playbook, carries its status.","version":"2.1.0"},{"classification":"breaking","date":"2026-08-21","note":"`get_ontology` (a whole-document dump) gives way to the MCP resources primitive plus `map_attack_surface`. Removing a tool is breaking.","version":"2.0.0"},{"classification":"compatible","date":"2026-08-21","note":"`get_ontology` returns the product ontology as one document. Adding a tool is compatible.","version":"1.1.0"},{"classification":"compatible","date":"2026-08-19","note":"The six review tools served as a remote, stateless MCP endpoint over Streamable HTTP.","version":"1.0.0"}],"version":1}