Every rule id the classifier can emit, the class it emits, what triggers it and what it means for a caller — with one worked example from the record where one exists. The ids and classes belong to the Flanj collector’s contract/diff package; this page explains them and re-interprets none.
29 rulesclassifier github.com/flanj-io/collector@v0.1.1-0.20260919060923-be6283b7ffcfas of 2026-10-15
01 / rules, in the order the classifier declares them
Operations, inputs, outputs, wording.
Every rule has a kind (what moved) and a severity (how much it matters), and one does not imply the other. breaking can break a caller already in production; warning is worth a caller’s attention before it bites; info is information a caller acts on in their own code. Additive rules are listed for completeness and never reach the record.
operation-removedbreakingcatalog38 rows on the index#
Triggers when A tool present in the earlier contract is absent from the later one.
Consequence. Every call to that tool now fails; an agent that learned it yesterday has nothing to call today.
catalog-moved-behind-meta-toolsinfocatalog1 row on the index#
Triggers when A server's tools moved behind discovery meta-tools: tools/list now lists a search or toolset tool in their place.
Consequence. The tools still exist, reached a different way. Recorded as ONE event, never as one removal per tool no longer listed.
worked example · Sentry · 2026-09-19 · f-sentry-2026-09-19-d684680d{"tools_listed":9}≠{"completeness":"none","meta_tools":["search_sentry_tools","execute_sentry_tool"],"strategy":"none"}
Triggers when A tool is present in the later contract and was not in the earlier one.
Consequence. Nothing that worked before is affected; the surface grew. Not reported.
worked exampleAdditive: rows under this rule are in changes.jsonl, not on the index.
input-required-property-addedwarninginput10 rows on the index#
Triggers when A property joined a tool's input schema and is listed as required.
Consequence. A caller that does not send the new field is rejected, with no change on its own side.
worked example · BetSlipDoctor · 2026-09-23 · f-betslipdoctor-2026-09-23-261472e2grade_slip · input.actionabsent≠{"enum":["quote","start","cancel"],"type":"string"}
Triggers when A property joined a tool's input schema and is not required.
Consequence. Existing calls keep working; the new field is accepted if sent. Not reported.
worked exampleAdditive: rows under this rule are in changes.jsonl, not on the index.
input-property-renamedinfoinput86 rows on the index#
Triggers when A property left a tool's input schema and a same-typed one arrived under a name that normalises to the same key (branchId, branch_id and branch-id are one name).
Consequence. Callers still sending the old name must switch to the new one; the parameter itself is unchanged.
worked example · Neon · 2026-08-29 · f-neon-2026-08-29-a1c16cb1compare_database_schema · input.branchId{"name":"branchId","schema":{"description":"The ID of the branch","type":"string"}}≠{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
input-required-property-removedinfoinput8 rows on the index#
Triggers when A property callers were required to send left a tool's input schema.
Consequence. Callers can stop sending it; a server that rejects unknown fields rejects callers that do not.
worked example · Neon · 2026-10-01 · f-neon-2026-10-01-1d3e231dcreate_trigger · input.body.function_slug{"pattern":"^[a-z0-9]{1,20}$","type":"string"}≠absent
input-optional-property-removedinfoinput30 rows on the index#
Triggers when A property callers could send left a tool's input schema.
Consequence. Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which.
worked example · Microsoft · 2026-10-10 · f-microsoft-learn-2026-10-10-69cb65d1microsoft_code_sample_search · input.SessionId{"const":"f6cceafe-1ace-451b-adf7-a1ab2a0ded1c","default":"f6cceafe-1ace-451b-adf7-a1ab2a0ded1c","description":"The logical session identifier provided by tools…≠absent
Triggers when The declared type of an input property now accepts less than it did (number to integer, a union that lost a member).
Consequence. A caller sending the dropped type is rejected.
worked example · Microsoft · 2026-10-10 · f-microsoft-learn-2026-10-10-cb7d5e70microsoft_code_sample_search · input.language{"type":["null","string"]}≠{"type":"string"}
Triggers when The declared type of an input property was replaced outright.
Consequence. Values that validated yesterday do not today; the caller's code has to change to keep calling.
worked exampleNo row under this rule in the record yet.
input-enum-value-removedinfoinput1 row on the index#
Triggers when A value left an input property's enum.
Consequence. A caller still sending that value is rejected.
worked example · Karanteli · 2026-09-26 · f-bykaranteli-2026-09-26-17e24ba4get_tokenized_stocks · input.issuer{"enum":["reality","superstate","figure"]}≠{"enum":[]}
Triggers when A value joined an input property's enum.
Consequence. Existing calls keep working; one more value is accepted. Not reported.
worked exampleAdditive: rows under this rule are in changes.jsonl, not on the index.
input-enum-value-replacedinfoinput1 row on the index#
Triggers when Values left and arrived in an input property's enum in one revision.
Consequence. A caller still sending a departed value is rejected.
worked example · Aave · 2026-09-18 · f-aave-2026-09-18-0b671befget_vault_activity · input.window{"enum":["day","sixMonths"]}≠{"enum":["max"]}
output-required-property-removedbreakingoutput0 rows on the index#
Triggers when A property the output schema listed as required is gone.
Consequence. A field the consumer could rely on being present can now be absent; code that reads it unconditionally breaks.
worked exampleNo row under this rule in the record yet.
output-optional-property-renamedwarningoutput0 rows on the index#
Triggers when An output property the schema declared without requiring it left, and a same-typed one arrived under a name that normalises to the same key.
Consequence. A consumer reading the old name finds nothing there; the row says what it is called now.
worked exampleNo row under this rule in the record yet.
output-optional-property-removedwarningoutput3 rows on the index#
Triggers when A property the output schema declared, without requiring it, is gone.
Consequence. A field the consumer may have been reading is no longer declared.
worked example · Microsoft · 2026-10-10 · f-microsoft-learn-2026-10-10-4e056715microsoft_code_sample_search · output.SessionId{"type":["null","string"]}≠absent
output-property-renamedbreakingoutput0 rows on the index#
Triggers when A required output property left and a same-typed one arrived under a name that normalises to the same key.
Consequence. Consumer code reading the old name finds nothing there.
worked exampleNo row under this rule in the record yet.
Triggers when A property joined a tool's output schema.
Consequence. A consumer that ignores unknown fields is unaffected. Not reported.
worked exampleAdditive: rows under this rule are in changes.jsonl, not on the index.
output-property-type-widenedbreakingoutput0 rows on the index#
Triggers when The declared type of an output property now admits more than it did.
Consequence. The consumer may receive a type it never handled.
worked exampleNo row under this rule in the record yet.
output-property-type-narrowedbreakingoutput0 rows on the index#
Triggers when The declared type of an output property now admits less than it did.
Consequence. A branch the consumer wrote for the dropped type is dead, or the field's data is gone.
worked exampleNo row under this rule in the record yet.
output-property-type-changedbreakingoutput1 row on the index#
Triggers when The declared type of an output property was replaced outright.
Consequence. Consumer code that parsed the old type breaks on the new one, silently if it does not validate.
worked example · Dim Hour · 2026-10-07 · f-dimhour-catalog-2026-10-07-587ac499list_cities · output.cities.items.children.items{"type":"string"}≠{"type":"object"}
output-enum-value-removedbreakingoutput0 rows on the index#
Triggers when A value left an output property's enum.
Consequence. A value the consumer's code may branch on has disappeared from the declared set.
worked exampleNo row under this rule in the record yet.
output-enum-value-addedwarningoutput1 row on the index#
Triggers when A value joined an output property's enum.
Consequence. Responses may carry a value the consumer has no branch for; nothing it already handles stopped being valid.
worked example · RoxyAPI · 2026-09-23 · f-roxyapi-docs-2026-09-23-18b3a3a4search_docs · output.hits.items.source_type{"enum":[]}≠{"enum":["component"]}
output-enum-value-replacedbreakingoutput1 row on the index#
Triggers when Values left and arrived in an output property's enum in one revision.
Consequence. A value the consumer branches on is gone, and one it has never seen can arrive.
worked example · Dim Hour · 2026-09-07 · f-dimhour-catalog-2026-09-07-9ff4fd80list_cities · output.cities.items.kind{"enum":["region"]}≠{"enum":["state"]}
output-schema-removedbreakingoutput0 rows on the index#
Triggers when A tool that declared an outputSchema no longer does.
Consequence. A consumer validating responses against the declared shape has nothing to validate against.
worked exampleNo row under this rule in the record yet.
Triggers when A tool that declared no outputSchema now does.
Consequence. The response shape is now stated where it was not. Not reported.
worked exampleAdditive: rows under this rule are in changes.jsonl, not on the index.
description-changedwarningwording470 rows on the index#
Triggers when A tool's description text differs between the two contracts — beyond whitespace, case and punctuation, and at most once per tool per day.
Consequence. The wording an agent reads to choose and call the tool changed; its behaviour may or may not have.
List or get project/initiative status updates. updates with their body, health, author, and parent project or initiative. Pass `id` id to get a specific update, or filter one update and ignore list filters; omit id to list.