# 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.6.0] — 2026-08-13 **A seventh active-content case, and the whole raw-HTML classifier moves forward with it. Adopting one new label meant adopting the function that produces it — `active_tag_class` is one function with three branches, and publishing the label on top of the old predicate would have shipped a contract that looks complete and is wrong.** ### Added - `conformance/active__raw-html-link` — the seventh case scoped to `signatures/active-content.json`, one per published id. Corpus goes 93 → **94**. Input `t`, taken **verbatim** from the seed runtime's own coverage matrix (`coverage.py`, extracted from its AST, not retyped), so this case sits inside the corpus's usual provenance rather than under `authored_payloads`. Measured at `be9759b` (v0.7.0) through `scan_output(text, source=Source.OUTPUT)`: one in-scope finding, `active:raw-html-link` at MEDIUM, no residue. **One input witnesses both halves of the upstream change.** The opening `` is the carrier split; the closing `` is the no-URL narrowing and is inert, which is why the finding's count is 1 and not 2. - `signatures/active-content.json` `0.2.0` → `0.3.0` — the id `active:raw-html-link`, adopted verbatim. **No name was chosen and neither runtime was asked to choose one**: the seed runtime shipped the class string, and this file's own derivation rule (`"active:"` + the `constructs` key) turns it into an id mechanically. Only one runtime implements this table, so unlike `codepoints/carriers.json` there was no second namer to consult and no decision to ratify. New in the same file: `html.algorithm` (the classifier as four ordered steps), `html.url_affordance_tags`, `html.link_tags`, `html.mutator_tags`, `html.url_attr_external_test`, and `pass_order.raw_html_pass_is_one_scan_two_buckets`. ### Changed - **`signatures/active-content.json` is no longer a single-pin extraction.** Everything outside the raw-HTML classifier stays at v0.3.4 / `0bf0729`; the classifier is re-pinned to v0.7.0 / `be9759b`. Two pins, stated as two, because one pin would misdescribe both halves. The v0.1.0 behaviour-preservation invariant covered the *extraction* and does not forbid tracking the seed runtime forward. - **The drift was measured field by field, not assumed.** Every regex, severity, tag list and numeric floor the file publishes was compared against the v0.7.0 module by importing it and reading the compiled objects — after stripping Python's inline-flag rendering and applying the file's own declared `redundant-quote-escape` normalisation, so a spelling difference could not masquerade as drift. **Exactly one published field had drifted**, and it is not the one this release set out to change: `html.active_tags` was publishing the **mutator's** name set (23 entries, with `base`) where the `active_tag` gate means the **scanner's** (22, without). Correct at the 0.3.4 pin, when the runtime had one set; wrong from the runtime's 0.6.0, when the two diverged. The full 23 are preserved as `html.mutator_tags` rather than deleted — a consumer that also defangs needs them, and it is the value this key used to carry. Everything else — every construct pattern, both gate patterns, all of `url_shape`, `defang`, `evidence` and the opacity floors — is byte-identical at 0.3.4 and at 0.7.0. - **`active:raw-html` narrows, and a new `behaviour_change` block in the file says how.** ``/`` move out into `active:raw-html-link` (HIGH → MEDIUM, and a different label); tags whose whole affordance is a URL they do not carry (``, ``, `