From 02af4b805484c2e5841ab4fe8865eec82410adc8 Mon Sep 17 00:00:00 2001 From: zuub-don Date: Mon, 1 Jun 2026 14:44:52 -0700 Subject: [PATCH] =?UTF-8?q?release:=201.0.0=20=E2=80=94=20commit=20the=20t?= =?UTF-8?q?q1=20contract=20as=20stable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First stable release. No code changes from 0.9.0 — this declares the contract. Stabilizes (breaking any → major bump + PROTOCOL change, never quiet under 1.x): the protocol id anomalyx/tq1, exit codes 0/1/2, the dense finding-row layout, the handle forms (column:/cell:/row:/range:/dist:), the required envelope fields, and the severity ladder. Documented in docs/src/contract.md Stability. Continues to evolve additively under 1.x (detectors, formats, optional flags, optional envelope fields); output-affecting config changes move config_version; determinism stays absolute; golden tests guard against drift. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 21 ++++++++++++++++++++- Cargo.lock | 10 +++++----- Cargo.toml | 8 ++++---- docs/src/contract.md | 25 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e0959c..1e5aa9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,24 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [1.0.0] - 2026-06-01 + +First stable release. No code changes from `0.9.0` — this commits the contract. + +### Stable + +- The **`tq1` contract is now stable**: the protocol id `anomalyx/tq1`, the exit + codes (`0`/`1`/`2`), the dense finding-row layout, the handle forms + (`column:`/`cell:`/`row:`/`range:`/`dist:`), the required envelope fields, and + the severity ladder. Breaking any of these requires a major bump and a + `PROTOCOL` change — they will not change quietly under `1.x`. See + [the contract's Stability section](docs/src/contract.md). +- Continues to evolve *additively* under `1.x`: new detectors, formats, optional + flags, and optional envelope fields. Output-affecting config changes move the + `config_version` fingerprint; determinism (same input + same `config_version` + ⇒ byte-identical output) is absolute. The golden-envelope tests guard all of + this against accidental drift. + ## [0.9.0] - 2026-06-01 ### Added @@ -309,7 +327,8 @@ Initial release — a contract-first anomaly-detection CLI over arbitrary corpor gates on every push. - Dual-licensed under MIT OR Apache-2.0. -[Unreleased]: https://github.com/copyleftdev/anomalyx/compare/v0.9.0...HEAD +[Unreleased]: https://github.com/copyleftdev/anomalyx/compare/v1.0.0...HEAD +[1.0.0]: https://github.com/copyleftdev/anomalyx/compare/v0.9.0...v1.0.0 [0.9.0]: https://github.com/copyleftdev/anomalyx/compare/v0.8.0...v0.9.0 [0.8.0]: https://github.com/copyleftdev/anomalyx/compare/v0.7.0...v0.8.0 [0.7.0]: https://github.com/copyleftdev/anomalyx/compare/v0.6.0...v0.7.0 diff --git a/Cargo.lock b/Cargo.lock index fb44b7f..f5e94eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,7 +69,7 @@ dependencies = [ [[package]] name = "anomalyx" -version = "0.9.0" +version = "1.0.0" dependencies = [ "anomalyx-core", "anomalyx-detect", @@ -80,7 +80,7 @@ dependencies = [ [[package]] name = "anomalyx-core" -version = "0.9.0" +version = "1.0.0" dependencies = [ "proptest", "serde", @@ -90,7 +90,7 @@ dependencies = [ [[package]] name = "anomalyx-detect" -version = "0.9.0" +version = "1.0.0" dependencies = [ "anomalyx-core", "proptest", @@ -101,7 +101,7 @@ dependencies = [ [[package]] name = "anomalyx-normalize" -version = "0.9.0" +version = "1.0.0" dependencies = [ "anomalyx-core", "apache-avro", @@ -129,7 +129,7 @@ dependencies = [ [[package]] name = "anomalyx-validate" -version = "0.9.0" +version = "1.0.0" dependencies = [ "anomalyx-core", "anomalyx-detect", diff --git a/Cargo.toml b/Cargo.toml index 7641d47..b8a5a9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ ] [workspace.package] -version = "0.9.0" +version = "1.0.0" edition = "2021" rust-version = "1.90" license = "MIT OR Apache-2.0" @@ -22,9 +22,9 @@ authors = ["copyleftdev"] # `ax-*` names were taken), but the import/extern name stays `ax_core` etc. via # the dependency key + `package` rename — so no source code changes are needed. # Keep versions in sync with workspace.package.version above. -ax-core = { path = "crates/ax-core", version = "0.9.0", package = "anomalyx-core" } -ax-normalize = { path = "crates/ax-normalize", version = "0.9.0", package = "anomalyx-normalize" } -ax-detect = { path = "crates/ax-detect", version = "0.9.0", package = "anomalyx-detect" } +ax-core = { path = "crates/ax-core", version = "1.0.0", package = "anomalyx-core" } +ax-normalize = { path = "crates/ax-normalize", version = "1.0.0", package = "anomalyx-normalize" } +ax-detect = { path = "crates/ax-detect", version = "1.0.0", package = "anomalyx-detect" } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/docs/src/contract.md b/docs/src/contract.md index 6df5e1e..90bb356 100644 --- a/docs/src/contract.md +++ b/docs/src/contract.md @@ -53,3 +53,28 @@ $ anomalyx explain cell:amount:8 sales.csv "evidence":{"kind":"cell","column":"amount","row":8,"value":{"t":"int","v":9999}}, "findings":[{"detector":"point.modz","class":"point","confidence":1.0, ... }]} ``` + +## Stability (1.0) + +As of **1.0**, the `tq1` contract is stable and committed. An agent can rely on +these without pinning a patch version: + +- the protocol id **`anomalyx/tq1`** (`envelope::PROTOCOL`); +- the **exit codes** — `0` clean, `1` anomalies found, `2` error; +- the **dense finding-row layout** (`[detector, class, handle, confidence, + severity, score, reason]`) and the dictionary-pinned string table; +- the **handle forms** (`column:` / `cell:` / `row:` / `range:` / `dist:`) and + their canonical string shapes; +- the envelope's required fields and the `severity` ladder + (`info < low < medium < high < critical`). + +Breaking any of these requires a **major bump and a `PROTOCOL` change** — they +will not change quietly under `1.x`. + +What still evolves *additively* under `1.x`: new detectors, new input formats, +new optional CLI flags, and new optional envelope fields (consumers must ignore +unknown fields). Anything that changes detector *output* for a given input — +a new threshold default, a recalibration — moves the **`config_version`** +fingerprint, so "the tool changed" stays distinguishable from "the data changed." +Determinism remains absolute: same input + same `config_version` ⇒ byte-identical +output.