feat(active-content): raw HTML graded on carrier, and a tag naming no target is inert
Two changes that had to ship together, because they co-occur. `active:raw-html-link` (MEDIUM) splits the click-required carriers out of `active:raw-html`. The same URL was LOW as `[t](url)` and HIGH as `<a href="url">` — an asymmetry produced by syntax, not by affordance, on a carrier the markdown path has graded MEDIUM since 0.3.1. The event-handler test runs first, so `<a onclick=...>` stays HIGH. The url-attribute branch stays HIGH too: a name outside the active set has unknown rendering, and grading `<Card src=...>` as a link would be reasoning rather than measurement. The no-URL narrowing makes `</a>`, `<Frame>`, `<video />` and `<img alt=...>` without `src` inert — `<base />`'s argument from 0.6.0 applied to the rest of the name branch. It tests for the URL attribute's PRESENCE, not for a readable value, so the fail-secure gap `_url_attr_is_external` leaves open is not reopened here. WHY TOGETHER: the narrowing strips a document's `</a>`/`<Frame>` and what remains is the `<a href=...>` the split grades down, so each alone leaves the document blocked by the other's residue. `active_tag_class` is now the classification point and `is_active_tag` wraps it. The census patches the former: a boolean could only express a narrowing, never a regrade, so every carrier candidate would have measured equal to PRODUCTION — silently, and in the direction that reads as "no change helps". TWO COSTS, BOTH RECORDED RATHER THAN GLOSSED: - The split TIGHTENS the trusted tier. One finding becomes two, and >=2 findings at MEDIUM+ trip the compound overlay, so a document carrying both an `<img src>` and an `<a href>` goes WARN -> quarantine_review on PRESET_TRUSTED_SOURCE. On that preset it is the only direction the split can move anything. The census now reports a TIGHTENS column on both trust tiers against the previously shipped row — "frees N" without "tightens M" is a one-sided number. - `count` drops on documents containing `</a>`, a published field moving under a meaning that did not change. MEASURED: reference-corpus (389) 54 -> 53 fail_secure, tightens 0/0, and the census `PRODUCTION` row equals its `C1 + D` candidate row for row. The census also reproduces 133/3/13/108/25 exactly, so it is calibrated against every published historical number. The two wiki corpora are NOT yet re-measured; the tree says so explicitly in the docstring, LIMITATIONS and CHANGELOG rather than carrying probe numbers as fact. 791 tests (was 759), coverage 129/129, 6/6 documented gaps holding. Version bumped to 0.7.0 across every surface; no tag is set until the measurement lands.
This commit is contained in:
parent
0df7e87c2f
commit
fcfaee4589
18 changed files with 544 additions and 99 deletions
52
CHANGELOG.md
52
CHANGELOG.md
|
|
@ -10,6 +10,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
Nothing yet.
|
||||
|
||||
|
||||
## [0.7.0] — 2026-08-12
|
||||
|
||||
### Added — `active:raw-html-link`, a click-required carrier class for raw HTML
|
||||
|
||||
Raw HTML graded on activity alone: every active tag was HIGH. So the *same URL*
|
||||
was LOW as `[t](https://example.com/guide)` and HIGH as
|
||||
`<a href="https://example.com/guide">` — an asymmetry produced by syntax, not by
|
||||
affordance. Following an anchor needs a human, exactly like the markdown inline
|
||||
link that has been MEDIUM since 0.3.1.
|
||||
|
||||
`<a>` and `<area>` now report as **`active:raw-html-link` at MEDIUM**. Everything
|
||||
a renderer fetches or executes unattended keeps `active:raw-html` at HIGH, and the
|
||||
event-handler test runs *first*, so `<a onclick=...>` is graded as the
|
||||
execute-class carrier it is rather than downgraded with the anchors.
|
||||
|
||||
The URL-attribute branch deliberately stays on the HIGH side: a name outside the
|
||||
active set has unknown rendering, and `href` is not the only URL attribute it may
|
||||
carry. Grading `<Card src="...">` as a link would be reasoning, not measurement.
|
||||
|
||||
**This is a new label, and labels are a contract surface consumers pin against.**
|
||||
A document that previously produced one `active:raw-html` finding may now produce
|
||||
two findings, one per carrier class.
|
||||
|
||||
### Changed — a tag whose whole affordance is a URL it does not carry is inert
|
||||
|
||||
`</a>`, `<Frame>`, `<video />` and `<img alt="...">` without `src` were active by
|
||||
*name* while naming no target at all. This is `<base />`'s argument from 0.6.0 —
|
||||
"attribute-less, therefore no affordance in any renderer" — applied to the rest of
|
||||
the name branch. The test is for the URL attribute's **presence**, not for a
|
||||
readable value: a value the parser cannot resolve keeps the tag active, mirroring
|
||||
the fail-secure gap `_url_attr_is_external` already leaves open.
|
||||
|
||||
Every other member of the active name set does something a URL cannot describe —
|
||||
`<script>` executes its body, `<style>` restyles, `<form>` submits — and stays
|
||||
active with no attributes at all.
|
||||
|
||||
### Changed — `active_tag_class` is the classification point; `is_active_tag` wraps it
|
||||
|
||||
`docs/rawhtml-census.py` measures candidates by patching this symbol, and a
|
||||
boolean could only express a narrowing, never a regrade. Left as a boolean, every
|
||||
carrier candidate would have measured equal to PRODUCTION — silently, and in the
|
||||
direction that reads as "no change helps".
|
||||
|
||||
### Known behaviour change
|
||||
|
||||
**`count` drops on documents containing `</a>`.** Through 0.6.1 an end tag was
|
||||
active by name, so `count` ran roughly 1.6× the opening-tag total and a start/end
|
||||
pair counted 2. It is now the opening-tag total. The field's meaning did not
|
||||
change and the finding count is unaffected — the class still collapses to one
|
||||
finding per class per document.
|
||||
|
||||
|
||||
## [0.6.1] — 2026-08-11
|
||||
|
||||
### Fixed — the zero-width check tested identity, so emoji-composed documents were hard-blocked
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue