Flanj drift.flanj.io · daily contract watch

drift.flanj.io / rules

Glossary · the classifier’s rule ids

Rules

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-removed breaking catalog 38 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.

worked example · Auteng · 2026-10-05 · f-auteng-docs-2026-10-05-ce13f6c9 auteng_publish_markdown "auteng_publish_markdown" ≠ absent

operation-renamed breaking catalog 12 rows on the index #

Triggers when A tool disappeared and one with an identical input schema appeared under another name.

Consequence. Callers using the old name fail until they are updated; the capability itself is still there.

worked example · DocImprint · 2026-09-30 · f-docimprint-2026-09-30-d8cf4421 bundle.notarize "bundle.notarize" ≠ "notarize_bundle"

catalog-moved-behind-meta-tools info catalog 1 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"}

operation-added additive catalog not reported #

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-added warning input 10 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-261472e2 grade_slip · input.action absent ≠ {"enum":["quote","start","cancel"],"type":"string"}

input-optional-property-added additive input not reported #

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-renamed info input 86 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-a1c16cb1 compare_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-removed info input 8 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-1d3e231d create_trigger · input.body.function_slug {"pattern":"^[a-z0-9]{1,20}$","type":"string"} ≠ absent

input-optional-property-removed info input 30 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-69cb65d1 microsoft_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

input-type-widened additive input not reported #

Triggers when The declared type of an input property now accepts more than it did.

Consequence. Every argument sent before still validates. Not reported.

worked exampleAdditive: rows under this rule are in changes.jsonl, not on the index.

input-type-narrowed info input 7 rows on the index #

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-cb7d5e70 microsoft_code_sample_search · input.language {"type":["null","string"]} ≠ {"type":"string"}

input-type-changed info input 0 rows on the index #

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-removed info input 1 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-17e24ba4 get_tokenized_stocks · input.issuer {"enum":["reality","superstate","figure"]} ≠ {"enum":[]}

input-enum-value-added additive input not reported #

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-replaced info input 1 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-0b671bef get_vault_activity · input.window {"enum":["day","sixMonths"]} ≠ {"enum":["max"]}

output-required-property-removed breaking output 0 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-renamed warning output 0 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-removed warning output 3 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-4e056715 microsoft_code_sample_search · output.SessionId {"type":["null","string"]} ≠ absent

output-property-renamed breaking output 0 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.

output-optional-property-added additive output not reported #

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-widened breaking output 0 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-narrowed breaking output 0 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-changed breaking output 1 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-587ac499 list_cities · output.cities.items.children.items {"type":"string"} ≠ {"type":"object"}

output-enum-value-removed breaking output 0 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-added warning output 1 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-18b3a3a4 search_docs · output.hits.items.source_type {"enum":[]} ≠ {"enum":["component"]}

output-enum-value-replaced breaking output 1 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-9ff4fd80 list_cities · output.cities.items.kind {"enum":["region"]} ≠ {"enum":["state"]}

output-schema-removed breaking output 0 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.

output-schema-declared additive output not reported #

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-changed warning wording 470 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.

worked example · Linear · 2026-10-15 · f-linear-2026-10-15-3c51ff83 get_status_updates · description
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.