v0.0.172
Released Nov 7, 2026
Release Notes
Three rule false positives are fixed (entity-conflicts, broken-anchors, mojibake), the entity map compares legal identifiers, and the REST API docs cover the rules catalogue, partial reports for rule-filtered runs and per-rule results.
Added
ax/content-without-jssays why it did not run when a hosted run has rendering switched off. A run configured withrender: falsenever asks the cloud render service, and the rule now skips with "render disabled by the run config" instead of "not applicable to this site type". No browser is paid for, as before; only the reason changed.- The REST API docs describe
GET /v1/rules(the rule catalogue withrequiresCloudandrequiresRender), the partial report of a rule-filtered run (report.partial, null scores), the typedresults[]list with its status and skip reason values, and a null run-levelhealthScorewithpartial: truefor such runs.
Fixed
schema/entity-conflictsno longer reports a localizedurlalias of one entity (#1615). A Service with one@id, the same name and provider, and a page-specificurlon reciprocal hreflang alternates was reported as a conflicting URL. That is now excused whenurlis the entity's only disagreement, eachurlis the address of a declaring page, every pair of pages with different values lists each other as hreflang alternates (reciprocal, neither page canonicalised elsewhere,x-defaultnever counts), at most 40 pages declare the entity, and the entity says the same thing aboutprovider,brand,publisher,creator,author,worksForandmemberon every page, whether as a reference, a nested object or a bare string. Other properties, such asoffersorareaServed, may differ per locale. Without reciprocal alternates it still warns, and a differing telephone, provider or legal identifier is never excused. The entity map still lists theurlconflict for an aliased entity; the rule is the verdict.links/broken-anchorsno longer calls an id that an inline script names definitely missing on an unrendered page (#1616). A server-rendered page can add a target id from inline script at init (el.id = "size"). Fetched without a browser, the id is not in the HTML, so the link was reported as broken. When a quoted string of up to 64 characters in an inline script of the target page equals the missing fragment, the link is now listed underunconfirmed-anchors(info). This is a name match, not a creation test, so a generic fragment such as#contactcan be unconfirmed by an unrelated mention. Reading is capped at 256 KB of script text and 1,024 distinct strings per page, and truncation demotes nothing: later strings are not read. A missing id no script names still warns, a static id still passes, and a rendered audit reads the initialized DOM as before. Theunconfirmed-anchorsmessage now reads "target a page that was not rendered and may add the id with JavaScript".content/mojibakeno longer flags valid uppercase Portuguese words (#1617).MANHÃ,IRMÃandMAÇÃbefore a space were reported asutf8-as-latin1corruption because the sequence foràwas written with a regular space. Decoding the UTF-8 bytes C3 A0 as latin1 givesÃplus a no-break space (U+00A0), so the rule now matches that, and the same forÂ. Genuine corruption such ascafÃplus a no-break space still reports.- A hosted run with rendering switched off no longer lists
ax/content-without-jsas a locked rule. The "render disabled by the run config" skip is the run's own choice, so it stays off the "check didn't run, re-run without--http" banner and the locked-rules list, asnot applicablealready did.
Changed
- The entity map compares six legal identifiers, which adds conflict rows (#1615).
legalName,vatID,taxID,leiCode,dunsandiso6523Codeare now compared per entity across pages, so two pages that declare one@idwith different values produce a conflict thatschema/entity-conflictsandsquirrel entities --problem conflictlist. Existing sites can see new rows. Values are compared without case, spaces, dots or hyphens, a page that omits one is not a disagreement, the conflict shows each page's own spelling, and alegalNametranslated per locale is a conflict on purpose. They are compared, not stored inproperties. A node that also has aurlconflict can carry an@identityentry inconflicts, a guard for the alias check that the rule does not report.
Update to this version
squirrelscan will auto-update, or run this command to update now:
$