Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down
25 changes: 25 additions & 0 deletions docs/src/contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.