# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Versioning note: the repository tag versions **the contract** (file set, key names, case ids, disposition semantics). Each JSON file additionally carries its own `"version"` field, bumped when that file changes. ## [0.7.0] — 2026-08-13 **The normative spec forbade, in as many words, a case the corpus has shipped since `0.3.0`.** `spec/conformance-corpus.md` §6 read *"Such a payload MUST NOT be given a discriminated case id; the derivation rule is the contract, and a suffix would break the reverse transform"* while `conformance/manifest.json` defined `case_id_derivation. variant_suffix` and `conformance/hybrid-xss__script-tag--src-no-close/` sat on disk under it. The manifest was the correct party; the spec was simply never updated when the derivation was extended. **No data moves in this release — only the normative text that describes it.** ### Fixed - **§6's derivation block now states the rule the corpus actually uses.** ``` before case_id = pattern_id with ":" replaced by "__" pattern_id = case_id with "__" replaced by ":" after case_id = pattern_id with ":" replaced by "__", optionally followed by "--" and a variant slug of [a-z0-9-] pattern_id = case_id truncated at the first "--" if present, then "__" replaced by ":" ``` The `--`-absence measurement moves into the spec as the reason the reverse transform stays **lexical**: a runtime MUST be able to recover a `pattern_id` by splitting the string, and MUST NOT need a lookup against the published id list to find where the id ends and the variant begins. Re-measured at this commit rather than copied from the manifest's 0.3.0 numbers: `--` occurs in none of the 83 lexicon ids, none of the three `carrier:` ids, none of the `active:` construct ids, none of the seven malware rule ids and none of the 19 secret-egress entry names — and in exactly one of the 94 case ids, the variant itself. It does occur inside *pattern* values (`