EvidaLux Tools Validation Report

Every run of our 64 audit tools — behaviour lock, agreement with external references, and real-site oracles. Methodology over marketing — bad numbers publish too.
Generated: 2026-07-17T14:01:18.481216+00:00
This is an archived snapshot. For the latest, see here.

Section 1 — Cross-Tool Agreement

Diff against industry-reference tools on the same 10-site cohort. cohort: pool-v1
11 of 22 plugins measured · cohort coverage 89% · median agreement 0.93
PEND rows mean the reference-tool integration is queued. Each integration may use a different per-site match metric (see plugin.metric). Median agreement is taken across implemented rows only, and each row's agreement is over the sites that could be measured — read it next to coverage, not alone. A row whose coverage is at or below 50% cannot be GREEN (band_capped_by_coverage).
PluginReference toolBandAgreementAgreed / ComparedComparison metric
accessibility.axePa11y (htmlcs runner)ERR——https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'pa11y'; https://www.zalando.de/:
compliance.iab_tcfhttpx + lxml + Set-Cookie scanGREEN1.0013 / 13
2 of 15 sites unmeasured
boolean TCF-surface agreement (independent vantage: Set-Cookie inspection for euconsent-v2 + raw-text JS-marker scan + lxml DOM parse — plugin uses BeautifulSoup + script-body scan only; empty/empty = both agree page has no IAB CMP)
compliance.iab_tcf_verifiedPlaywright + iab-tcf (TC-string decode)PEND——Integration queued
quality.api_testschemathesis (OpenAPI / Swagger spec loader)GREEN1.0010 / 10
5 of 15 sites unmeasured
discovered-endpoint set-Jaccard ≥0.40 with mutual-empty match + |union| ≤2 small-set noise floor. Reference = schemathesis OpenAPI 2.0 / 3.x loader, probing 13 common spec locations (/openapi.json, /swagger.json, /v3/api-docs, /api-docs, /api/openapi.json, ...); spec content-sniffed (must contain `openapi`/`swagger` token) so HTML catch-alls don't false-positive. Plugin = quality.api_test's `_discover_endpoints` discovery sub-component called DIRECTLY (bypassing the registry runner) so the 50-request rate-limit burst probe doesn't fire — the cross-tool is comparing the discovery surface, and firing the burst against 10 cohort sites daily would add ~500 net-new requests/day of noise without signal. Paths normalised both sides: {param} placeholders + concrete digit / UUID / long-hex segments → {}, lowercased, trailing slash stripped — so spec-driven enumeration and convention-probe heuristics meet at the static-prefix shape. 0.40 threshold (vs 0.50 elsewhere) reflects fundamental engine heterogeneity (spec enumeration vs convention probing); most cohort sites hit mutual-empty match (no public OpenAPI spec AND no responding conventional /api* path).
quality.lighthouse_perfGoogle PageSpeed Insights APIERR——https://www.hepsiburada.com/: RuntimeError: lighthouse runner failed: lighthouse binary not on PATH; https://www.zalando
quality.owasp_zap_scannuclei cve+exposure+misconfig templatesERR——https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'nuclei'; https://www.zalando.de/:
quality.responsive_testGoogle PageSpeed Insights API (Lighthouse mobile-friendly audits subset)ERR——https://www.hepsiburada.com/: RuntimeError: GOOGLE_PSI_API_KEY env var is required for the PSI cross-tool integration (s
quality.vulnerability_nucleiOWASP ZAP REST API (baseline + passive)PEND——Integration queued
search.lighthouse_seoGoogle PageSpeed Insights APIERR——https://www.hepsiburada.com/: RuntimeError: lighthouse runner failed: lighthouse binary not on PATH; https://www.zalando
security.exposed_filesnuclei http/exposures/{files,configs} templatesERR——https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'nuclei'; https://www.zalando.de/:
security.headersMozilla Observatory v2 (MDN)RED0.649 / 14
1 of 15 sites unmeasured
overall score within ±15 of Mozilla Observatory v2 score. CAVEAT (#661): the two scores are not on the same scale — Mozilla grades 50 as C and 30 as D, the same numbers are D and E here — and Observatory v2 no longer exposes the per-test breakdown that would allow a header-by-header comparison. So ±15 across two different rulers is a rough proxy, not a like-for-like measurement, and this row should be read as weaker evidence than the others.
security.tls_deepSSL Labs APIGREEN0.9314 / 15A-F grade-band agreement within ±1 letter (Qualys SSL Labs API v3 vs plugin's score-deduction grader; engines disagree on HSTS-preload + OCSP-stapling weightings the plugin's v1.0 doesn't probe, so exact-grade equality would over-penalize — the broad health bucket is the defensible signal)
seo.broken_linkslinkchecker (W3C)ERR——https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'linkchecker'; https://www.zalando
seo.canonical_auditlxml + httpx canonical-chain followerGREEN1.0013 / 13
2 of 15 sites unmeasured
4-axis canonical classification agreement ≥3/4 (canonical_present / self_canonical / cross_host / chain_two_hop). Reference = vanilla httpx + lxml clean-room reimplementation of the plugin's chain-follow logic. Independent fetcher (no SharedFetcher etag/cache layer) and parser (lxml vs BeautifulSoup4). Plan §3.2 nominally maps this to Lighthouse SEO subset, but PSI's canonical audit doesn't follow chains — would silently drop the plugin's distinguishing checks; this row's purpose is to cross-tool exactly those.
seo.freshnesshttpx + lxml independent sitemap lastmod walkerGREEN0.9110 / 11
4 of 15 sites unmeasured
stale_ratio agreement within ±0.20 (httpx + lxml independent sitemap.xml lastmod walker vs plugin's combined sitemap + JSON-LD + HTTP Last-Modified scan; same 540-day stale cut-off, 50-URL cap; clean-room ref intentionally skips secondary signals so any plugin regression in sitemap parsing surfaces in the agreement number)
seo.hreflang_validatorlangcodes (BCP 47) + lxmlGREEN1.0013 / 13
2 of 15 sites unmeasured
set-equality on invalid hreflang codes (langcodes/BCP 47 vs plugin regex; same page parsed independently via lxml vs BeautifulSoup; empty/empty = no hreflang or all codes pass)
seo.meta_tagsGoogle PageSpeed Insights API (Lighthouse SEO audits subset)ERR——https://www.hepsiburada.com/: RuntimeError: GOOGLE_PSI_API_KEY env var is required for the PSI cross-tool integration (s
seo.robots_txt_auditGoogle robotstxt parserYELLOW0.8713 / 15boolean homepage indexability agreement (Protego vs plugin verdict on User-agent: *; empty/empty = both report no readable robots.txt)
seo.sitemaphttpx + lxml inline-XSD sitemap.org 0.9 validatorYELLOW0.8012 / 15sitemap presence boolean parity + URL count delta ≤ max(10% of larger, 2 small-set noise floor). Reference = vanilla httpx + lxml with inline sitemap.org 0.9 XSD (urlset + sitemapindex schemas embedded clean-room, not fetched). Independent fetcher (no SharedFetcher), independent XSD-validation pipeline (plugin only well-formedness-checks). Both sides mirror plugin discovery (robots.txt Sitemap: directives → /sitemap.xml fallback, cap 5 docs) and count top-level <loc> only — no recursion into sitemap-index children — so URL counts are apples-to-apples; ref XSD-valid count surfaced in per-site detail for schema-conformance transparency.
seo.structured_datavalidator.schema.orgPEND——Integration queued
tech.dns_healthdig +dnssec + Google DNS-over-HTTPSGREEN1.0015 / 157-axis DNS posture feature-vector agreement ≥6/7 (AAAA / NS≥2 / SPF / DMARC-present / DMARC-strong / CAA / DNSSEC). Reference = OR of dig (BIND binary, system resolver) and Google DoH (independent resolver via HTTPS); plugin = dnspython. DKIM excluded — selector probing is informational only (selectors are private, miss ≠ absence).
tech.stack_detectionpython-Wappalyzer (open-source fingerprint engine)GREEN0.9212 / 13
2 of 15 sites unmeasured
set-Jaccard ≥0.30 within the plugin-detectable tech universe (python-Wappalyzer 2,000+ fingerprints filtered to the ~40 techs our PATTERNS table claims to fingerprint, so detector-coverage gaps — databases, OSes, build tools — don't count as plugin failures; name aliases normalised; small-set floor when filtered union ≤2; full Wappalyzer detections surfaced in ours_only_outside_universe / ref_only_outside_universe for transparency)

Section 2 — Real-World Correctness

Plugin findings on random real sites (US/Europe/Turkey/Arab/South America) scored against a real-browser + HTTP ground truth. Unreachable sites are INCONCLUSIVE (never gate); a gate failure is a false positive/negative on a reachable site.
RegionWhenVerdictReachableInconclusiveFPFN
arab, europe, south_america, turkey, us2026-10-21 02:59 UTCFAIL851505
arab, europe, south_america, turkey, us2026-10-20 03:03 UTCFAIL871325
arab, europe, south_america, turkey, us2026-10-19 02:57 UTCFAIL871325
arab, europe, south_america, turkey, us2026-10-18 03:36 UTCFAIL861424
arab, europe, south_america, turkey, us2026-10-18 02:57 UTCFAIL871325
arab, europe, south_america, turkey, us2026-10-17 02:54 UTCFAIL871325
arab, europe, south_america, turkey, us2026-10-16 03:05 UTCFAIL861425
arab, europe, south_america, turkey, us2026-10-15 03:02 UTCFAIL871325
arab, europe, south_america, turkey, us2026-10-14 02:54 UTCFAIL851525
arab, europe, south_america, turkey, us2026-10-13 03:04 UTCFAIL871325
arab, europe, south_america, turkey, us2026-10-12 03:02 UTCFAIL851525
arab, europe, south_america, turkey, us2026-10-11 03:00 UTCFAIL841624
arab, europe, south_america, turkey, us2026-10-10 03:02 UTCFAIL851525
arab, europe, south_america, turkey, us2026-10-09 03:01 UTCFAIL841624
arab, europe, south_america, turkey, us2026-10-08 02:54 UTCFAIL861425
arab, europe, south_america, turkey, us2026-10-07 03:01 UTCFAIL841625
arab, europe, south_america, turkey, us2026-10-06 02:56 UTCFAIL841625
arab, europe, south_america, turkey, us2026-10-05 02:58 UTCFAIL851525
arab, europe, south_america, turkey, us2026-10-04 03:38 UTCFAIL861425
arab, europe, south_america, turkey, us2026-10-04 03:01 UTCFAIL851534
arab, europe, south_america, turkey, us2026-10-03 02:58 UTCFAIL851524
arab, europe, south_america, turkey, us2026-10-02 02:53 UTCFAIL851525
arab, europe, south_america, turkey, us2026-10-01 02:54 UTCFAIL871325
arab, europe, south_america, turkey, us2026-09-30 02:48 UTCFAIL861425
arab, europe, south_america, turkey, us2026-09-29 03:00 UTCFAIL861425
arab, europe, south_america, turkey, us2026-09-28 02:49 UTCFAIL861425
arab, europe, south_america, turkey, us2026-09-27 03:36 UTCFAIL861425
arab, europe, south_america, turkey, us2026-09-27 02:52 UTCFAIL861425
arab, europe, south_america, turkey, us2026-09-26 02:42 UTCFAIL861425
arab, europe, south_america, turkey, us2026-09-25 03:00 UTCFAIL861425

Latest run — 2026-10-21 02:59 UTC

PluginConfirmedFPFNInconclusive
accessibility.eaa_mapping000138
compliance.accessibility_statement580094
compliance.age_verification00085
compliance.ai_disclosure00085
compliance.child_consent00085
compliance.cookie_consent000207
compliance.cross_border_transfer000152
compliance.dark_pattern6700152
compliance.data_subject_request160069
compliance.dpo_contact00085
compliance.eu_representative00085
compliance.geo_consistency000170
compliance.iab_tcf00085
compliance.iab_tcf_verified50080
compliance.legal_disclosure7200147
compliance.odr_link670018
compliance.pay_or_consent_wall00085
compliance.pricing_indication000170
compliance.privacy_policy_content1400151
compliance.purchase_disclosure000152
compliance.required_pages15800128
quality.api_test000216
security.exposed_files1560012
security.headers58000324
security.tls_deep2390093
seo.broken_links190022
seo.canonical_audit46003
seo.duplicate_content00085
seo.freshness360025
seo.hreflang_validator71003
seo.meta_tags90050
seo.robots_txt_audit16002
seo.sitemap74008
seo.structured_data83009
tech.dns_health34000170
tech.stack_detection00085

Wrong findings — latest run (gate)

  • false_negative seo.meta_tags/meta.title.missing — https://www.imdb.com/ — oracle has no title; plugin didn't flag
  • false_negative seo.meta_tags/meta.title.missing — https://www.booking.com/ — oracle has no title; plugin didn't flag
  • false_negative seo.meta_tags/meta.title.missing — https://www.dw.com/ — oracle has no title; plugin didn't flag
  • false_negative seo.meta_tags/meta.title.missing — https://www.amazon.ae/ — oracle has no title; plugin didn't flag
  • false_negative seo.meta_tags/meta.title.missing — https://www.petra.gov.jo/ — oracle has no title; plugin didn't flag

Past reports

Legend — column meanings

Cross-Tool Agreement

Plugin
The audit tool we are validating (e.g. seo.lighthouse_seo).
Reference tool
The industry-standard tool whose findings we compare against on the same site (e.g. PageSpeed Insights, Pa11y, W3C linkchecker, Mozilla Observatory).
Band
Bucketed from the agreement score:
GREEN agreement ≥ 0.90.
YELLOW agreement ≥ 0.70.
RED below 0.70.
Agreement
How much our plugin and the reference tool produce the same verdict, on the same site, on the same 10-site cohort (0.00–1.00). High = strong industry consensus that we are seeing the same thing.
Agreed / Compared
On each of the 10 cohort sites, did our plugin and the reference tool give the same verdict? The left number is how many sites we agreed on; the right is how many sites we could actually compare (if either tool fails on a site — timeout, blocked, 5xx — that site does not count).
Comparison metric
Short description of how the agreement number is computed for this pair (e.g. "in-domain Jaccard", "score delta ≤ 5"). The metric is plugin-specific because each reference tool exposes its findings differently.