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-17T02:04:18.461485+00:00This 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-v111 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).
| Plugin | Reference tool | Band | Agreement | Agreed / Compared | Comparison metric |
|---|---|---|---|---|---|
accessibility.axe | Pa11y (htmlcs runner) | ERR | — | — | https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'pa11y'; https://www.zalando.de/: |
compliance.iab_tcf | httpx + lxml + Set-Cookie scan | GREEN | 1.00 | 13 / 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_verified | Playwright + iab-tcf (TC-string decode) | PEND | — | — | Integration queued |
quality.api_test | schemathesis (OpenAPI / Swagger spec loader) | GREEN | 1.00 | 10 / 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_perf | Google PageSpeed Insights API | ERR | — | — | https://www.hepsiburada.com/: RuntimeError: lighthouse runner failed: lighthouse binary not on PATH; https://www.zalando |
quality.owasp_zap_scan | nuclei cve+exposure+misconfig templates | ERR | — | — | https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'nuclei'; https://www.zalando.de/: |
quality.responsive_test | Google 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_nuclei | OWASP ZAP REST API (baseline + passive) | PEND | — | — | Integration queued |
search.lighthouse_seo | Google PageSpeed Insights API | ERR | — | — | https://www.hepsiburada.com/: RuntimeError: lighthouse runner failed: lighthouse binary not on PATH; https://www.zalando |
security.exposed_files | nuclei http/exposures/{files,configs} templates | ERR | — | — | https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'nuclei'; https://www.zalando.de/: |
security.headers | Mozilla Observatory v2 (MDN) | RED | 0.64 | 9 / 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_deep | SSL Labs API | GREEN | 0.93 | 14 / 15 | A-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_links | linkchecker (W3C) | ERR | — | — | https://www.hepsiburada.com/: FileNotFoundError: [Errno 2] No such file or directory: 'linkchecker'; https://www.zalando |
seo.canonical_audit | lxml + httpx canonical-chain follower | GREEN | 1.00 | 13 / 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.freshness | httpx + lxml independent sitemap lastmod walker | GREEN | 0.91 | 10 / 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_validator | langcodes (BCP 47) + lxml | GREEN | 1.00 | 13 / 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_tags | Google 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_audit | Google robotstxt parser | YELLOW | 0.87 | 13 / 15 | boolean homepage indexability agreement (Protego vs plugin verdict on User-agent: *; empty/empty = both report no readable robots.txt) |
seo.sitemap | httpx + lxml inline-XSD sitemap.org 0.9 validator | YELLOW | 0.80 | 12 / 15 | sitemap 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_data | validator.schema.org | PEND | — | — | Integration queued |
tech.dns_health | dig +dnssec + Google DNS-over-HTTPS | GREEN | 1.00 | 15 / 15 | 7-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_detection | python-Wappalyzer (open-source fingerprint engine) | GREEN | 0.92 | 12 / 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.
| Region | When | Verdict | Reachable | Inconclusive | FP | FN |
|---|---|---|---|---|---|---|
| arab, europe, south_america, turkey, us | 2026-07-20 02:41 UTC | FAIL | 86 | 14 | 1 | 0 |
| arab, europe, south_america, turkey, us | 2026-07-19 02:37 UTC | FAIL | 88 | 12 | 1 | 0 |
| arab, europe, south_america, turkey, us | 2026-07-18 20:31 UTC | PASS | 85 | 15 | 0 | 0 |
| arab, europe, south_america, turkey, us | 2026-07-18 19:22 UTC | FAIL | 84 | 16 | 5 | 0 |
| arab, europe, south_america, turkey, us | 2026-07-18 18:18 UTC | PASS | 18 | 7 | 0 | 0 |
| arab, europe, south_america, turkey, us | 2026-07-18 18:00 UTC | FAIL | 20 | 5 | 3 | 0 |
| arab, europe, south_america, turkey, us | 2026-07-18 16:09 UTC | FAIL | 20 | 5 | 44 | 1 |
| arab, europe, south_america, turkey, us | 2026-07-04 06:08 UTC | FAIL | 20 | 5 | 1 | 1 |
| arab, europe, south_america, turkey, us | 2026-07-03 06:20 UTC | FAIL | 19 | 6 | 1 | 1 |
Latest run — 2026-07-20 02:41 UTC
| Plugin | Confirmed | FP | FN | Inconclusive |
|---|---|---|---|---|
accessibility.eaa_mapping | 0 | 0 | 0 | 155 |
compliance.accessibility_statement | 74 | 0 | 0 | 98 |
compliance.age_verification | 0 | 0 | 0 | 86 |
compliance.ai_disclosure | 0 | 0 | 0 | 86 |
compliance.child_consent | 0 | 0 | 0 | 86 |
compliance.cookie_consent | 0 | 0 | 0 | 210 |
compliance.cross_border_transfer | 0 | 0 | 0 | 172 |
compliance.dark_pattern | 86 | 0 | 0 | 172 |
compliance.data_subject_request | 8 | 0 | 0 | 78 |
compliance.dpo_contact | 0 | 0 | 0 | 86 |
compliance.eu_representative | 0 | 0 | 0 | 86 |
compliance.geo_consistency | 0 | 0 | 0 | 172 |
compliance.iab_tcf | 0 | 0 | 0 | 86 |
compliance.iab_tcf_verified | 6 | 0 | 0 | 80 |
compliance.legal_disclosure | 82 | 0 | 0 | 176 |
compliance.odr_link | 86 | 0 | 0 | 0 |
compliance.pay_or_consent_wall | 0 | 0 | 0 | 86 |
compliance.pricing_indication | 0 | 0 | 0 | 172 |
compliance.privacy_policy_content | 36 | 0 | 0 | 116 |
compliance.purchase_disclosure | 0 | 0 | 0 | 172 |
compliance.required_pages | 274 | 0 | 0 | 70 |
quality.api_test | 0 | 0 | 0 | 222 |
security.exposed_files | 157 | 0 | 0 | 13 |
security.headers | 608 | 0 | 0 | 303 |
security.tls_deep | 246 | 1 | 0 | 93 |
seo.broken_links | 38 | 0 | 0 | 28 |
seo.canonical_audit | 51 | 0 | 0 | 4 |
seo.duplicate_content | 0 | 0 | 0 | 85 |
seo.freshness | 34 | 0 | 0 | 28 |
seo.hreflang_validator | 74 | 0 | 0 | 5 |
seo.meta_tags | 158 | 0 | 0 | 0 |
seo.robots_txt_audit | 17 | 0 | 0 | 1 |
seo.sitemap | 84 | 0 | 0 | 3 |
seo.structured_data | 80 | 0 | 0 | 9 |
tech.dns_health | 344 | 0 | 0 | 172 |
tech.stack_detection | 0 | 0 | 0 | 86 |
Wrong findings — latest run (gate)
false_positivesecurity.tls_deep/tls.no_https — https://www.isbank.com.tr/ — TLS handshake succeeded independently