TradesAd Suite

Rules & Changelog

Every deterministic check the suite runs, the license formats it recognizes, and what changed in each policy version. Library v2026-11-03.3.

Policy rules (90 patterns)

superlatives (17 patterns) — UK ASA CAP Code — Substantiation (3.7)

absolute_guarantees (7 patterns)

financial_claims (7 patterns) — UK ASA CAP Code — Pricing (3.17–3.22)

fair_housing (4 patterns) — Fair Housing Act (42 U.S.C. 3601-3619)

dental_ads (4 patterns) — State dental board advertising rules (CA B&P 1680; TX Occ. Code 254.002)

legal_ads (3 patterns) — ABA Model Rules of Professional Conduct 7.1, 7.2, 7.4

personal_attributes (6 patterns)

safety_claims (10 patterns) — UK ASA CAP Code — Substantiation (3.7)

google_editorial (6 patterns)

us_free_claims (4 patterns) — FTC Guides on 'Free' — 16 CFR Part 251

uk_pricing (2 patterns) — UK ASA CAP Code — Pricing (3.17–3.22)

uk_free_claims (2 patterns) — UK ASA CAP Code — 'Free' claims (3.23–3.24)

uk_testimonials (2 patterns) — UK ASA CAP Code — Testimonials & endorsements (3.45–3.48)

uk_estate_agents (2 patterns) — CAP Code (Ed. 12); National Trading Standards Estate Agency Guidance; Consumer Protection from Unfair Trading Regulations 2008

urgency_scarcity (4 patterns) — UK ASA CAP Code — Misleading advertising (3.1)

license_bare (2 patterns) — UK ASA CAP Code — Misleading advertising (3.1)

ca_drip_pricing (2 patterns) — Competition Act (Canada) — Drip pricing (s. 74.01(1.1))

ca_performance_claims (2 patterns) — Competition Act (Canada) — Performance claims (s. 74.01(1)(b)) and environmental claims (s. 74.01(1)(b.1)–(b.2))

ca_reference_pricing (2 patterns) — Competition Act (Canada) — Ordinary selling price (s. 74.01(2)–(3))

ca_testimonials (2 patterns) — Competition Act (Canada) — Tests and testimonials (s. 74.02)

License formats recognized

The tool pattern-matches these formats — it does not verify that a number is valid or belongs to the business. Always check with the issuing board. Formats marked ⚠️ are not confirmed from an official source.
State / regionBoard / schemeFormatExampleNumber required in ads?
AKAK DCCED, Division of Corporations, Business and Professional LicensingFormat not verified — name recognition only
⚠️ AK license number format not confirmed from an official source; do not pattern-match
—Yes
ALAL Home Builders Licensure BoardHBLB # + digitsHBLB #12345Yes
AZAZ Registrar of Contractors (ROC)ROC # + digits (commonly 6)ROC #276078Yes
CAContractors State License Board (CSLB)CSLB # + 6–8 digitsCSLB #531728Yes
COCO DPO Plumbing Board — plumbingFormat not verified — name recognition only
⚠️ CO plumbing number format not confirmed; do not pattern-match
—Yes
COCO Dept. of Regulatory Agencies (DORA) — electricalEC. or ME. + 7 digitsEC.0002742No
CTCT Dept. of Consumer ProtectionHIC. + 7 digitsHIC.0643874Yes
FLFL Dept. of Business & Professional Regulation (DBPR)2–3 letter prefix + 6–8 digits (CGC, CBC, EC, …)CGC058377Yes
GAGA State Licensing Board for Residential & General ContractorsPrefix (GCQA, RBQA, …) + 6 digitsGCQA006043No
HIHI DCCA Contractors License BoardFormat not verified — name recognition only
⚠️ HI license number format not confirmed from an official source; do not pattern-match
—Yes
IAIA Plumbing and Mechanical Systems BoardFormat not verified — name recognition only
⚠️ IA contractor license number format not confirmed from an official source; do not pattern-match
—Yes
IDID Contractors Board (Division of Occupational and Professional Licenses)Format not verified — name recognition only
⚠️ ID registration number format not confirmed from an official source; do not pattern-match
—Yes
ILIL Dept. of Financial and Professional Regulation (IDFPR)Format not verified — name recognition only
⚠️ IL roofing/plumbing license number formats not confirmed from an official source; do not pattern-match
—Yes
ININ Professional Licensing Agency, Plumbing CommissionFormat not verified — name recognition only
⚠️ IN plumbing license number format not confirmed from an official source; do not pattern-match
—Yes
KSKS Attorney General (Roofing Contractor Registration Act)Format not verified — name recognition only
⚠️ KS roofing registration number format not confirmed from an official source; do not pattern-match
—Yes
KYKY Dept. of Housing, Buildings and ConstructionFormat not verified — name recognition only
⚠️ KY HVAC license number format not confirmed from an official source; do not pattern-match
—Yes
MAMA Office of Consumer Affairs and Business Regulation (OCABR)Format not verified — name recognition only
⚠️ MA registration number format not confirmed from an official source; do not pattern-match
—Yes
MDMD Home Improvement CommissionMHIC # + digits (prefix verified by regulation)MHIC #123456Yes
MNMN Dept. of Labor and IndustryFormat not verified — name recognition only
⚠️ MN license number format not confirmed from an official source; do not pattern-match
—Yes
NCNC Licensing Board for General ContractorsNC License # + 4–6 digits (requires 'License' or '#')NC License #73785No
NJNJ Division of Consumer AffairsFormat not verified — name recognition only
⚠️ NJ license number format not confirmed from an official source; do not pattern-match
—Yes
NVNV State Contractors Board (NSCB)NV License # + 5–6 digitsNV License #80253Yes
OHOH Construction Industry Licensing Board (Dept. of Commerce)OH LIC# + digits (display format prescribed by rule)OH LIC#12345Yes
OKOK Construction Industries BoardFormat not verified — name recognition only
⚠️ OK roofing registration number format not confirmed from an official source; do not pattern-match
—Yes
OROR Construction Contractors Board (CCB)CCB # + 6 digitsCCB #123456Yes
PAPA Attorney General, Bureau of Consumer ProtectionPA + 6 digitsPA123456Yes
RIRI Contractors' Registration and Licensing BoardFormat not verified — name recognition only
⚠️ RI registration number format not confirmed from an official source; do not pattern-match
—Yes
TNTN Board for Licensing ContractorsFormat not verified — name recognition only
⚠️ TN license number format not confirmed from an official source; do not pattern-match
—Yes
TXTX Dept. of Licensing & Regulation (TDLR) — HVAC/refrigerationTACL + A/B + digits + E/R/C endorsementTACLA12345CYes
TXTX Dept. of Licensing & Regulation (TDLR) — electricalTECL # + 5–6 digitsTECL #19787Yes
TXTX State Board of Plumbing Examiners (TSBPE) — plumbingM / MPL / RMP + 5–6 digitsM-12345Yes
UKGas Safe RegisterGas Safe registration number, 1–6 digitsGas Safe registered 123456No
UKMCS (Microgeneration Certification Scheme)Format not verified — name recognition only
⚠️ MCS certificate reference format not confirmed from an official source
—No
UKNICEICFormat not verified — name recognition only
⚠️ NICEIC enrolment number format not confirmed from an official source
—No
UKOFTECFormat not verified — name recognition only
⚠️ OFTEC registration number format not confirmed from an official source
—No
UKTrustMarkFormat not verified — name recognition only
⚠️ TrustMark not covered by policy research; format and ad rules unverified
—No
WAWA Dept. of Labor & Industries (L&I)6–8 letters + 3 digits + 2 letters (contractor registration)MORTESL763NRYes
WVWV Contractor Licensing BoardFormat not verified — name recognition only
⚠️ WV license number format not confirmed from an official source; do not pattern-match
—Yes
CACA Dept. of Real Estate (DRE)DRE # + 8 digitsDRE #01992777Yes
TXTX Real Estate Commission (TREC)Format not verified — name recognition only
⚠️ Format not confirmed from an official source; do not pattern-match
—No
FLFL Real Estate Commission (FREC), Dept. of Business and Professional Regulation2-letter prefix + 6-7 digits (BK broker, SL sales associate, CQ corporation)SL3629488No
FLFL Board of Dentistry, Dept. of HealthDN + 4-5 digitsDN26577No
NYNY Dept. of State, Division of Licensing ServicesFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source (9-11 digit numerics observed in state open-data mirrors only) — do not pattern-match
—No
NYNYSED Office of the Professions, State Board for Dentistry6 digits (optional -# suffix disregarded); requires license context nearby000456No
ILIL Dept. of Financial and Professional Regulation, Division of Real Estate3-digit type code + 6 digits (475 broker, 471 managing broker, 473 leasing agent, 478/481 firm)475-111694No
ILIL Board of Dentistry, Dept. of Financial and Professional Regulation019 dentist / 020 hygienist / 021 specialist + 6 digits019-024667No
AZAZ Dept. of Real Estate (ADRE)Format not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
AZAZ State Board of Dental ExaminersFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
WAWA Dept. of Licensing, Real Estate programFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
WAWA Dental Quality Assurance Commission, Dept. of HealthFormat not verified — name recognition only
⚠️ Dentist credential prefix (DE, per DOH 2-letter + 8-digit convention) not quoted from an official source — do not pattern-match
—No
GAGeorgia Real Estate Commission (GREC)Legend + six-digit number (e.g. GA R. E. Lic. #000001); number appears only within the legendGA R. E. Lic. #000001No
GAGeorgia Board of DentistryFormat not verified — name recognition only
⚠️ Dental license-number format not confirmed from an official source — do not pattern-match
—No
NCNorth Carolina Real Estate Commission (NCREC)Format not verified — name recognition only
⚠️ License-number format not published by NCREC (5-6 digit bare numerics observed in official database; unsafe to pattern-match)
—No
NCNorth Carolina State Board of Dental ExaminersFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
OHOH Division of Real Estate & Professional Licensing, Dept. of CommerceSAL. + 6-10 digits (salesperson)SAL.2010009100No
OHOhio State Dental BoardFormat not verified — name recognition only
⚠️ Dental license-number format not confirmed from an official source — do not pattern-match
—No
PAPA State Real Estate CommissionFormat not verified — name recognition only
⚠️ License-number format (RB/RS/AB + 6 digits observed) from third-party mirrors only — do not pattern-match
—No
PAPA State Board of DentistryFormat not verified — name recognition only
⚠️ License-number format (DS + 6 digits observed) from NPI self-reported data only — do not pattern-match
—No
NJNJ Real Estate Commission (NJREC), Dept. of Banking and Insurance7-digit reference number (per NJDOBI Licensee Search); requires license context nearby—No
NJNJ State Board of Dentistry, Division of Consumer Affairs22DI + 5-8 digits22DI 01414200No
MAMA Board of Registration of Real Estate Brokers and SalespersonsFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
MAMA Board of Registration in DentistryFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
VAVirginia Real Estate Board0225 (individual) or 0226 (firm) + 6 digits, no dashes—No
VAVirginia Board of DentistryFormat not verified — name recognition only
⚠️ Dental license-number digit pattern not confirmed from an official source — do not pattern-match
—No
TNTennessee Real Estate Commission (TREC), Dept. of Commerce & InsuranceFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
TNTennessee Board of Dentistry, Dept. of HealthFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source (single official example ‘8415’ only) — do not pattern-match
—No
MOMissouri Real Estate Commission (MREC)Format not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
MOMissouri Dental BoardFormat not verified — name recognition only
⚠️ License-number format not confirmed from an official source — do not pattern-match
—No
COColorado Real Estate Commission, Division of Real Estate (DORA)2-letter license-type prefix + 9 digits (e.g. EC.100089583)EC.100089583No
COColorado Dental Board, Division of Professions and Occupations (DORA)DEN. + 8 digits (observed on official DORA verification pages)DEN.00008340No
QCRégie du bâtiment du Québec (RBQ)RBQ licence number — 10 digits, shown as XXXX-XXXX-XXRBQ : 5678-1234-01Yes

Policy changelog

The changelog is published on the rules page.

v2026-11-03.3 (2026-11-03)

**Canada rule pack added:** 8 new patterns across 4 region-gated categories (`ca_drip_pricing`, `ca_performance_claims`, `ca_reference_pricing`, `ca_testimonials`), every rule verified against the Competition Act (Canada) as published by the Competition Bureau: drip pricing (s. 74.01(1.1)), performance and environmental claims (s. 74.01(1)(b), (b.1)–(b.2)), ordinary selling price (s. 74.01(2)–(3)), and tests and testimonials (s. 74.02). License table gains a verified Quebec entry: the RBQ licence number (10 digits, XXXX-XXXX-XX), required on all advertising in Quebec. 90 patterns total (82 US/global + UK pack + 8 Canada-only). Quebec's French-language advertising rule ships as guidance on the Canada page, not as a pattern.

v2026-10-06 (2026-10-06)

**Adjective coverage (Meta Ad Library QA):** a real contractor ad promising "massive savings" scored NEEDS REVIEW (92/100) without flagging the adjective. Added keyword `massive` to the superlatives set with new pattern `sup_massive`. The same ad now re-scores HIGH RISK (72/100). Adversarial battery 6/6 pass; no other verdicts changed.

v2026-10-05.4 (2026-10-05)

**Fresh-category fixes (tenth pre-launch audit):** `fin_save_up_to` — "you" now optional and a numeric value required after "up to", so "Save up to 50% on HVAC!" fires (mirrors `fin_save_amount`; "Save up to date on…" stays quiet). `pa_like_most` / `pa_youre_overpaying` — `you'?re` widened to `you(\s+are|'?re)` so "If you are like most homeowners…" and "You are overpaying…" fire. Note: `legal_guaranteed_outcome` assessed as converged — no further word-level tweaks recommended.

v2026-10-05.3 (2026-10-05)

**Recall widening, refined (ninth pre-launch audit):** the we-win/never-lose outcome-noun gap widened from 0–1 to 0–2 words — "We never lose a single case." / "We win every single case we take." now fire. Gap words may not be "for", so "We win medals for trial advocacy." (outcome noun is the object of "for", not of "win") stays quiet. All known idioms stay quiet; "We win all of our cases." (3-word gap) remains a documented boundary. Removed two orphaned stale sample PDFs (pre-Batch-G naming leftovers, unlinked).

v2026-10-05.1 (2026-10-05)

**Structural we-win fix (eighth pre-launch audit):** the idiom/award lists were empirically exhausted (five extensions, zero convergence). The bare we-win/never-lose arms now fire iff the win/loss connects to a case-outcome noun (≤1 intervening word: cases, settlements, verdicts, trials, claims, lawsuits) or stands bare at sentence end. Award synonyms and idioms are quiet by construction — no lists to maintain. "We never lose focus on your case." quiet (focus blocks the gap); "We win kudos/medals." quiet; "We never lose." / "We win cases." / "We win big cases and also many industry awards." fire. Accepted trade-offs: "We win big." quiet (puffery); "We never lose track of your case." quiet (attentiveness copy).

v2026-10-04.32 (2026-10-05)

**Idiom list extension (seventh pre-launch audit):** never-lose lookahead + `focus|courage`; award-synonym lookahead + `trophies?|honors?|laurels?|distinctions?`. "We never lose focus on your case.", "We win trophies for our clients." quiet under legal; true positives intact.

v2026-10-04.31 (2026-10-05)

Idiom-cycle breaker + plural nouns (sixth pre-launch audit):

• `legal_guaranteed_outcome`: outcome nouns plural-tolerant in both arms (`settlements?`, `victor(y|ies)`, `dismissals?`, `acquittals?`) — "We guarantee big settlements." fires.

• `legal_guaranteed_outcome`: win-award and idiom exclusions moved from sentence-level into lookaheads scoped to the we-win arms only. "We guarantee huge settlements and win awards." now fires (was: fully suppressed); "We win every award." stays quiet. Ends the three-audit idiom enumeration cycle structurally.

• `legal_guaranteed_outcome`: idiom list extended (`heart`; `prizes?|accolades?|recognition`) — "never lose heart", "win prizes/accolades/recognition" quiet.

• `fh_familial_status`: `children(?!'s)` possessive guard ("No children's toys…" quiet).

v2026-10-04.30 (2026-10-04)

**Loosening fallout fixes (fifth pre-launch audit):** the v.29 within-vertical loosening worked (6/6 recall) but left four same-class gaps:

• `legal_guaranteed_outcome`: win-award exclusion broadened from adjacent-only to `\bwin\b.{0,20}\bawards?\b` ("win every/multiple awards" quiet); never-lose exclusion extended to "hope"/"faith" idioms.

• `dent_discount_no_total`: "spring" added to the non-dental cleaning-compound exclusion ("20% off spring cleaning" quiet).

• `dent_guarantee`: reverse-order lead-in extended with `implants?|crowns?|braces|whitening` ("Implants guaranteed for life!" fires).

• `legal_guaranteed_outcome`: new reverse arm `\b(wins?|victory|settlement)\b.{0,40}\bguarantee[sd]?\b` ("Win guaranteed!", "Settlement guaranteed in 90 days." fire).

• `dent_painless`: `extraction` → `extractions?` ("painless extractions" fires; same bug class as audit #3's plural fix).

• Report `vertical` stamp now normalizes invalid values to contractor (fail-closed); `.seg` wraps on narrow viewports; sample PDFs regenerated (v.29 stamp).

v2026-10-04.29 (2026-10-04)

**Within-vertical recall restoration (fourth pre-launch audit):** vertical gating (v.27) ended cross-vertical misfires, but the sentence-level context guards were left at full strength so the recall benefit never materialized — 0 of 6 realistic short-form violations fired even with the correct vertical selected. The guards are now loosened *within* the selected vertical, where the gate has already eliminated the cross-vertical ambiguity:

• `dent_guarantee`: bare `implants?` fires (was: required dental context). "Hair implants" stays excluded — unambiguously not dental.

• `dent_painless`: bare `painless … implants?` fires. "Hair implants" stays excluded.

• `dent_discount_no_total`: bare `% off exams?/implants?/cleaning` fires. "Eye exam", "hair implants", and non-dental cleaning compounds (gutter/tile/grout/carpet/duct/drain/house/window) stay excluded.

• `legal_guaranteed_outcome`: bare `guarantee … wins?/victory/settlement` and bare `we win|never lose` fire (was: required legal context). New exclusions: "win awards", "never lose sight of" (ordinary law-firm copy, audit #4 major).

• The v.28 "our lawyers/attorneys win|never lose" arm and teeth/tooth lead-in are retained.

v2026-10-04.28 (2026-10-04)

**Guard hardening (third pre-launch audit):** `legal_specialist` exclusion broadened to "criminal justice" (tutoring ads no longer cited under ABA 7.4); all context guards made plural-tolerant (`clients?`, `cases?`, `lawyers?`, `attorneys?`, `dentists?`, `lawsuits?`, `trials?`, `verdicts?`; `claims?` added); new "our lawyers/attorneys win|never lose" arm; `dent_guarantee` arm 2 lead-in accepts teeth/tooth. (Superseded by v.29's within-vertical loosening, which retains these improvements.)

v2026-10-04.27 (2026-10-04)

**Vertical gating (third pre-launch audit):** the structural fix for cross-vertical misfires. The user now picks a business vertical (Contractor / Real estate / Dental / Legal, default Contractor) on the ad audit, batch audit, landing-page audit, and competitor benchmark; only that vertical's rule categories run. Cross-vertical misfires are now impossible by construction — a plumber's ad is never judged by dental-board rules, no matter the phrasing. Sentence-level context guards remain as defense in depth for the selected vertical.

• Categories tagged: `dental_ads` → dental, `legal_ads` → legal, `fair_housing` + `uk_estate_agents` → real-estate (all region gates still apply: dental/legal/fair_housing are US-only).

• Reports stamp "Audited as: X" in the header; vertical pages deep-link with preselect (`audit.html?vertical=dental`).

• Pattern count is per-vertical: US ad 62 (contractor) / 66 (dental) / 65 (legal) / 66 (real-estate); UK ad 64 / 64 / 64 / 66.

• Guard hardening (same audit): `legal_specialist` exclusion broadened to "criminal justice" (tutoring ads no longer cited under ABA 7.4); all context guards are plural-tolerant (`clients?`, `cases?`, `lawyers?`, `attorneys?`, `dentists?`, `lawsuits?`, `trials?`, `verdicts?`; `claims?` added); new "our lawyers/attorneys win|never lose" arm; `dent_guarantee` arm 2 lead-in accepts teeth/tooth ("Teeth whitening guaranteed to last a year" fires).

v2026-10-04.26 (2026-10-04)

**Systematic vertical-context guards (second pre-launch audit):** the v.25 surgical fixes kept producing new instances of the same bug — vertical patterns firing on ambiguous keywords with no vertical context. Applied the standing rule (vertical patterns must use unambiguous keywords or require vertical context) across all dental/legal ambiguous terms:

• `dent_guarantee`: `implants?` now requires dental context in the sentence ("hair implants" no longer cites CA dental-board law; "dental implants" still fires). `crowns?`/`braces` keep full recall with extended exclusions: crown molding + wall/knee/back/ankle/wrist/elbow/shoulder/neck braces.

• `dent_painless`: `implants?` requires dental context ("painless hair implant" quiet; "painless dental implants" fires).

• `dent_discount_no_total`: `exam`/`exams?` and `implants?` require dental context ("20% off eye exam", "20% off hair implants" quiet; "20% off dental implants" fires).

• `legal_specialist`: excluded "criminal background checks" (background-check firms no longer cited under ABA 7.4).

• `legal_guaranteed_outcome`: `acquittal`/`dismissal` stay unambiguous; `wins?`/`victory`/`settlement` and the `we win|we never lose` arm now require legal context (`case|lawsuit|trial|verdict|client|attorney|lawyer|law firm`) — "settlement of cracked foundations", "never lose your luggage", "victory in every match" all quiet; "win for every client", "never lose a case" still fire.

• `legal_testimonial`: excluded giveaway/contest/raffle/sweepstakes/lottery ("client won $10,000 in our giveaway" quiet).

v2026-10-04.25 (2026-10-04)

**Cross-vertical false-positive fixes (pre-launch audit):** three vertical-specific patterns were firing on other industries' ordinary vocabulary, producing wrong verdicts with wrong-regulator citations.

• `dent_guarantee`: excluded "crown molding" — "Satisfaction guaranteed on all crown molding installs" no longer cites CA dental-board law. Genuine dental crown guarantees still fire.

• `legal_specialist`: dropped bare "estate" from the keyword list (now estate planning / probate / estate law) — "We specialize in luxury estate properties" no longer cites ABA Rule 7.4 on realtor ads.

• `dent_discount_no_total`: the discount keyword is now dental-anchored (`dental|dentist|teeth|tooth|whitening|implants?|exam`) instead of bare "cleaning" — "25% off tile and grout cleaning" and "20% off deep cleaning" no longer cite TX dental-board law. "20% off dental cleanings" still fires.

• `legal_guaranteed_outcome`: dropped generic "results?" (already caught by `gua_guaranteed_x`) so contractor ads aren't lectured on ABA Rule 7.1; fixed "guaranteed wins" plural miss (`wins?`).

• **Fix-merge parity:** the engine's `groupFindings` now uses the same ≥80% token-overlap merge as the sample PDFs — the live tool and sample reports render identical fix lists.

• **FL dental license entry:** surfaced the Sept 24, 2026 FAC 64B5-4.002 amendment caveat (full-name requirement not yet verified from an official source) in the user-facing text; confidence high → medium.

• Table now: 70 entries across 33 US states (+ UK schemes).

v2026-10-04.24 (2026-10-04)

Superseded before deployment: `dent_guarantee` briefly required dental-context words near "crowns"/"braces", which lost recall on standalone sentences ("We guarantee our crowns for 5 years."). Replaced in v2026-10-04.25 by the targeted "crown molding" exclusion. Never shipped to the live site.

v2026-10-04.23 (2026-10-04)

**False-positive fix:** `dent_discount_no_total` (dental discount without total fee) was firing on contractor ads — "50% off drain cleaning" matched the "cleaning" keyword meant for dental cleanings. Added three exclusions so non-dental cleaning compounds (drain/duct/dryer-vent, carpet/rug/upholstery, house/home/window/gutter/chimney/roof/siding + cleaning) no longer trigger the dental rule. Exclusions apply per sentence, so a mixed ad ("50% off drain cleaning. 20% off dental exams.") still flags the dental sentence.

v2026-10-04.22 (2026-10-04)

**Wording fix:** the `sup_award_winning` fix text used `[Award Name]` / `[Body]` placeholders, violating the library's single placeholder style (`[service]`, `[price]`, `[x]`, `[publication]`). Reworded to a plain-words example. No behavior change.

v2026-10-04.21 (2026-10-04)

Superlative coverage expansion (6 new patterns):

• A 19-claim adversarial battery across the new verticals (dental, UK real estate, legal) found 6 superlative-type claims slipping through: "leading", "premier", "ultimate", "world-class", "award-winning" (no award named), and "most trusted". All six added to the general `superlatives` category, so they apply US + UK and to every vertical (contractor, real estate, dental, legal). Each requires a verifiable source or specific fact as the fix.

• Cleanup: merged the duplicate `sup_cheapest` entries — the broader pattern (`cheapest` / `lowest rates` / `best deal`) fully subsumed the narrower one; behavior unchanged.

• Already covered and verified still firing: best, #1/number one, top-rated, finest, greatest, nobody beats, unbeatable, lowest prices, cheapest, fastest, painless (dental), expert/specialist (legal).

v2026-10-04.20 (2026-10-04)

License table: real estate + dental depth, batch 3 (10 entries, 5 states):

• All verified against official statute/regulation text. All 10 are ad_required=false — MA/VA/TN/MO/CO join the "NOT REQUIRED" bucket (now 22 states where RE/dental ads affirmatively need no license number).

• **MA:** real estate (254 CMR 3.00(9) — broker status + name required, number not; format unverified); dental (M.G.L. c.112 §52A + 234 CMR 5.18 — per-se ban on guarantee/cure promises, supports dent_guarantee HIGH; format unverified).

• **VA:** real estate (18VAC135-20-190 — firm name + contact required, number not; format 0225/0226 + 6 digits, no dashes); dental (18VAC60-21-80 — fee/discount disclosure rules, substantiation required; format unverified).

• **TN:** real estate (1260-02-.12 — firm name + phone required, number not; format unverified); dental (0460-02-.10 — name/address/phone + authorized title required, 30-day fee honor; format unverified).

• **MO:** real estate (20 CSR 2250-8.070 — broker business name required, number not; format unverified); dental (RSMo 332.321(14) — per-se bans promises of cure/relief from pain, supports dent_guarantee HIGH; format unverified).

• **CO:** real estate (4 CCR 725-1 Rule 6.10 — brokerage firm name required, number not; format EC/ER/IR/EI/II/FA + 9 digits, e.g. EC.100089583); dental (3 CCR 709-1 Rule 1.17 — approver name+number kept on file, not displayed; format DEN. + 8 digits, e.g. DEN.00008340).

• Collision check: CO RE's EC. prefix vs CO electrical's EC. + 7 digits — digit count (9 vs 7) disambiguates; verified no cross-match in either direction. CO electrical NOT REQUIRED (name-only rule) unaffected: keyword sets don't overlap.

• Table now 70 entries across 32 states (+ UK schemes). 3 new detectable formats (VA RE, CO RE, CO dental).

v2026-10-04.19 (2026-10-04)

License table: real estate + dental depth, batch 2 (10 entries, 5 states):

• All verified against official statute/regulation text. All 10 are ad_required=false — GA/NC/OH/PA/NJ join the "NOT REQUIRED" bucket (now 17 states where RE/dental ads affirmatively need no license number).

• **GA:** real estate (520-1-.09 — firm name + phone required, number not; format is legend + six digits, e.g. GA R. E. Lic. #000001); dental (150-10-.01 — fee-range ads must disclose min+max, fees honored 60 days; format unverified).

• **NC:** real estate (21 NCAC 58A .0105 — BIC consent + firm name, blind ads banned, number not; format unverified — bare 5-6 digit numerics unsafe to match); dental (21 NCAC 16P .0101-.0105 — name + designation required, discount amount must be stated; format unverified).

• **OH:** real estate (ORC 4735.16(B) — licensee name + brokerage name required, number not; format SAL. + 6-10 digits, e.g. SAL.2010009100; broker prefix unconfirmed); dental (ORC 4715.30 + OAC 4715-13-01(D) — owner's name required in every ad, deductible-waiver ads banned; format unverified).

• **PA:** real estate (49 Pa. Code § 35.305 — licensed business name required, number not; format unverified); dental (49 Pa. Code § 33.203 — name-a-dentist rule, minimum-fee disclosure + 60-day price hold; format unverified).

• **NJ:** real estate (N.J.A.C. 11:5-6.1(p) — licensure statement expressly optional; format 7-digit reference number with license-context guard); dental (N.J.A.C. 13:30-6.2 — name + 'General Dentist' required, fee/discount disclosure rules; format 22DI + 5-8 digits, e.g. 22DI 01414200; collective-advertising exception noted).

• Table now 60 entries across 32 states (+ UK schemes). 4 new detectable formats (GA RE legend, OH RE SAL., NJ RE 7-digit w/ context, NJ dental 22DI).

v2026-10-04.18 (2026-10-04)

**Fix:** IL real-estate license format regex — character class was `47[12378]`, missing `5` for the 475 broker code (would have missed `475-xxxxxx`). Now `47[123578]`. Caught by pre-deploy engine test before shipping.

v2026-10-04.17 (2026-10-04)

License table: real estate + dental depth (10 entries, 5 states):

• All verified against official statute/regulation text (no blog summaries). Every state in this batch affirmatively does NOT require the license number in ads — the engine now prints "NOT REQUIRED" instead of "NONE FOUND" for FL/NY/IL/AZ/WA real-estate and dental ads.

• **FL:** real estate (FAC 61J2-10.025 — brokerage name required, number not; format BK/SL/CQ + 6-7 digits, e.g. SL3629488); dental (466.019 F.S. + FAC 64B5-4.002 — no unjustified expectations, fee ads need minimum-fee disclaimer, ad must identify responsible dentist; format DN + 4-5 digits, e.g. DN26577). Note: 64B5-4.002 amended eff. 9/24/2026 (full-name disclosure); amended text not yet readable — flagged needs_verification.

• **NY:** real estate (19 NYCRR 175.25 — broker name + license type required, number not; format unverified, not pattern-matched); dental (8 NYCRR 29.1(b)(12) — bans guaranteed services, discounts only as reduction in established fee, fixed-price ads must disclose add-ons + time period; format 6 digits with license context, e.g. 000456).

• **IL:** real estate (225 ILCS 454/10-30(f) — broker + licensee name required, number not; format 47x/48x + 6 digits, e.g. 475-111694); dental (225 ILCS 25/45 — bans guarantees of success, superiority/painless claims; format 019/020/021 + 6 digits, e.g. 019-024667).

• **AZ:** real estate (AAC R4-28-502 — broker name required, number not; format unverified); dental (ARS 32-1201.01 + AAC R4-11-1101 — bans untrue cure guarantees, service ads need the "Arizona licensed general dentist" disclaimer; format unverified).

• **WA:** real estate (RCW 18.85.361(8) — firm name required, number not; format unverified); dental (RCW 18.32.665 — bans false/misleading + superiority claims, license display is premises-only; format unverified).

• Table now 50 entries across 32 states (+ UK schemes). 5 new detectable formats (FL RE, FL dental, IL RE, IL dental, NY dental with license-context guard).

v2026-10-04.6 (2026-10-04)

New detection (9 patterns across 4 areas):

• **Fake urgency/scarcity** (new `urgency_scarcity` category, 4 patterns): "only X left/spots", "offer ends", "limited time", "act now/don't miss out". NEEDS REVIEW — can't verify if the urgency is real. US cites FTC deceptive practices; UK cites CAP 3.1.

• **Bare "licensed & insured"** (new `license_bare` category, 2 patterns): flags unverifiable trust claims. Suppressed when a real license number is found on the page.

• **Bait pricing** (`fin_starting_at`): "starting at [price]" / "as low as [price]".

• **Superlative evasions** (`sup_cheapest`): "cheapest", "lowest rates", "best deal". ("No. 1" already covered by `sup_number_one`; sentence splitter now protects "No." abbreviations.)

• Pattern counts: 55 ad-US / 57 ad-UK / 49 landing-US / 51 landing-UK.

v2026-10-04.2 (2026-10-04)

Corrections (verified against official sources):

• TSBPE license search link: now https://tsbpe.texas.gov/pls (was: tdlr.texas.gov/LicenseSearch/ — wrong board). Verified live on tsbpe.texas.gov.

• UK testimonials CAP section: 3.45–3.48 (was: 3.47–3.50). Verified against CAP Code Edition 12, asa.org.uk.

• Google phone quote: period now follows the closing quotation mark ("...ad text". Use...) — the quoted text itself is verbatim.

• License "Checked N formats" now groups duplicates ("TX ×3").

v2026-10-04.1 (2026-10-04)

Follow-up fixes (user PDF review):

• License next step now infers the trade from the text: TX plumber → Texas State Board of Plumbing Examiners (was: first TX board, TDLR/HVAC). License table entries carry trade keywords for board selection.

• Google phone quote: period removed inside quotation marks (now verbatim).

• UK safety findings: card header now shows "UK ASA CAP Code — Substantiation (3.7)" (was: header omitted the CAP label).

• Trust signals: trailing punctuation stripped inside quotes (was: `reviews.".`).

v2026-10-04 (2026-10-04)

White-label report follow-ups (no rule logic changed — explanation wording only):

• Safety claims: UK findings now cite CAP Code Rules 3.1/3.7 (substantiation) instead of EPA/FTC; verified against CAP's "Types of claims: 'Safe'" guidance (asa.org.uk) and CAP Code Rules 3.1, 3.7, 12.9, 12.10. US findings drop pest/chemical wording unless the text indicates a pest-control trade (then EPA/FTC wording applies).

• Google "Phone number in ad text" quote verified verbatim against support.google.com/adspolicy/answer/6021546 ("Entering a phone number in ad text"); trailing period removed to match exactly.

• Northern Ireland 2004 regulations statement: verified — the Gas Safety (Installation and Use) Regulations (Northern Ireland) 2004 exist; kept.

• "Only plan usage is counted" privacy statement: verified — audits run client-side; the server records quota consumption only; kept and reworded to name TradesAd Suite (not "we") so it reads correctly in white-label PDFs. The privacy line is hidden in print.

v2026-10-03.3 (2026-10-03)

Item 7 — Meta/Google policy names re-verified (2026-10-03):

• Meta restructured Sep 9, 2026: "Prohibited Commercial Practices" is the current umbrella for deceptive commercial content (transparency.meta.com/policies). No family-specific Meta policy names exist for superlatives, absolute guarantees, financial claims, or safety claims in current official text — checked and confirmed absent. The umbrella label is the verified-correct citation, not a fallback; family-specific names are not invented.

• "Meta — Privacy Violations and Personal Attributes" re-verified current (transparency.fb.com/policies/ad-standards).

• Meta's retired "Unacceptable Business Practices" name: no references found in the library or site — nothing to purge.

• Google "Unreliable claims" and "Dishonest pricing practices" re-verified verbatim against support.google.com/adspolicy (Misrepresentation sub-sections). "Editorial" verified; it no longer carries a superlatives clause — none is cited.

• Unverified, not shipped: family-specific Meta names for superlatives / absolute_guarantees / financial_claims / safety_claims — Meta publishes none.

Follow-up round — landing report QA (2026-10-03; no rule-library changes, version not bumped):

• Pattern counts: "N patterns checked" is derived per region AND tool from the rule library (single source). Ad audits check 47 US / 49 UK patterns; landing audits check 41 US / 43 UK. Why 41 and not 47: the 6 Google Editorial patterns (caps, punctuation, symbols, repetition, phone-in-ad-text) are ad-copy-only and do not run on landing pages. A test asserts every tool reports its own context's count for the same version+region; homepage, features page, rules page and reports all read from the same source.

• Merged fixes: ad-audit finding groups label the merged block "How to fix (covers all N rules above)". Landing findings show each rule's own fix; the action summary shows every deduped fix per item.

• Business name: fallback chain is page title/heading → name entered in the form → first line of pasted text (name-like lines only). The report shows which source was compared. "Not applicable" only when no source yields a name.

• Trust signals: neutral ○ marker (not ✓) when the wording is also flagged by a policy rule.

• NEEDS REVIEW chip: spacing added between the chip and the policy label.

• Service area: "Dallas-Fort Worth", "Fort Worth", "Minneapolis-St. Paul", "St. Paul" added to the metro gazetteer. Regression test: "The #1 rated plumber in Dallas-Fort Worth." as the only location text still detects a service area.

• "pattern-matched" removed from all user-facing copy (plain wording instead).

• UK registration: recommendation reworded to verified facts only — the Brand Enforcement Policy v10.0 §3.1 citation is removed from user-facing copy (§3.1 verified on gassaferegister.co.uk: it grants registered businesses *permission* to display the brand/number, not a duty, so it does not support the old claim). Now reads: "Gas work in Great Britain requires Gas Safe registration (Gas Safety (Installation and Use) Regulations 1998; Northern Ireland has equivalent 2004 regulations). Stating your registration number lets visitors verify you." No official source requires — or forbids requiring — the number in ads, so neither is stated. Registration is said once (Page checks); the recommendation carries only reason + fix and renders inline under the check.

• UK priority box: readable per-family labels ("UK" capitalized, e.g. "UK \"free\" offer conditions", "UK star ratings & testimonials"); "Top 3 of N" shown when more than 3 scored findings exist.

• Editorial rules: landing reports state that capitalization/punctuation rules apply to ad copy only, not page text.

v2026-10-03.2 (2026-10-03)

Item 4 — license/registration:

• UK registration is a Recommendation (not scored, no points deducted). Basis: Gas Safe Register Brand Enforcement Policy v10.0 §3.1 grants registered businesses a licence to display the brand/number (a permission, not a duty); the Gas Safety (Installation and Use) Regulations 1998 criminalize unregistered gas work, not failure to display a number in ads. No Google/Meta policy requires it. Rendered in a separate "Recommendations" section in landing reports (PDF + web).

• Texas plumbing credential formats (M / MPL / RMP + 5–6 digits) now require license context near the number ("Master Plumber", "licensed", "TSBPE", "License", etc. within 120 characters) — "M-12345" as a bare model/part number no longer matches. Formats verified against the Texas State Board of Plumbing Examiners' published license types (tsbpe.texas.gov/license-types/). Applies to both ad and landing engines. Negative test added ("M-12345" as model number).

v2026-10-03.1 (2026-10-03)

Landing report round (items 1–3):

• Version bumps are now enforced: the build fails if any rule is added, removed or changed without a version bump (rules_hash in version-history.json). Intraday revisions use a `.1` suffix (e.g. v2026-10-03.1); the future-date gate compares the date part only.

• "N patterns checked" is derived per region AND tool: ad audits check 47 US / 49 UK patterns, landing audits check 41 US / 43 UK (the 6 Google Editorial patterns are ad-copy-only and do not run on landing pages). The homepage, features page, rules page and every report now show the same version and the count for their own tool.

• Landing reports have one structure: six page-check groups (phone, license/registration, business name consistency, calls to action, trust signals, service area), each with a result or "not applicable". Page-level findings sit under Page checks, labeled "Page-level" — never "SENTENCE ?". "No matches found" lists only policy families relevant to region+platform and never a positive result. US and UK use the same headings.

• Business name consistency: the page title/heading name is compared with body mentions (case and punctuation insensitive); the names compared are shown.

• Trust signals: years in business, insured/bonded wording, guarantees/warranties, reviews/ratings — each with its matched text. A phrase flagged elsewhere is shown as "present, see flags", not as a plain strength.

v2026-10-03 (2026-10-03)

Third-party audit remediation (29 findings) + version-date correction:

• Version date corrected: the v2026-10-04 stamp was dated ahead of its actual change date. The library version is now the change date (UTC); the build fails if a version is ever future-dated again, and every report date comes from the same UTC source.

• Every rule now ships its own fix text (52 rules) — the build fails if any rule lacks it, and the per-rule test suite renders every rule.

• Findings show the rule's own fix and its specific policy: Google Misrepresentation sub-policies (Unreliable claims / Dishonest pricing practices, verified against the official policy pages), Meta Prohibited Commercial Practices / Privacy Violations and Personal Attributes, Google Editorial sub-policies (Capitalization, Punctuation and symbols, Repetition, Phone number in ad text), and CAP Code sections in UK mode.

• UK mode header now reads "UK · ASA/CAP + Google/Meta"; UK credential checks name the trade schemes checked (Gas Safe, OFTEC, NICEIC, MCS) instead of asking for a generic license number.

• "Strengths" retired for ad copy — replaced by "No matches found", which states what the scan did not find and never says "compliant".

• New needs-review rule `ed_caps_word` (single all-caps word, genuine acronyms like HVAC excluded) — needs-review items are listed but never scored.

• Gray-zone note now lists only promotional triggers with no finding.

• Quotes are exact substrings of the input (em dashes, curly quotes preserved).

• Report header prints the score arithmetic (e.g. "100 − 3 × 20 (high) − 1 × 8 (medium) = 32").

• Landing page: "Call 0161 555 0134 today" now counts as a call CTA; "We cover Manchester" counts as a service area; UK postcodes and towns recognized; phone numbers display as written.

Follow-up fixes (2026-10-03, same version — report-layout review):

• New needs-review rule `us_free_unstated_conditions`: a "free" offer with no stated conditions ("Call now for a FREE estimate") now flags for human review, separate from the capitalization finding. Fix: "State who qualifies and what is included, next to the offer." Never scored; does not double-fire when the disclosure rule covers the sentence. (53 patterns total: 47 US / 49 UK.)

• "No matches found" now lists only families relevant to the selected region and platform (no UK-only families in US reports, no Google-editorial line in Meta-only reports). If the ad uses words related to a family but no rule fired (e.g. "free" with no free-offer rule triggered), the line is omitted — never a misleading "no matches" claim. A detected credential is reported under License check only.

• Sentences numbered by ad position; cards and the marked copy share the numbers. "N sentence(s) flagged" replaced by "N scored, M needs review" (computed from the findings).

• Finding cards keep together across pages (break-inside: avoid on the card and on each rule block).

• Fix examples use one placeholder style: [service], $[price], [x], [publication].

• Report date shows its timezone ("Oct 3, 2026 UTC"); version date is never later than the report date (same UTC source).

• License check reports one of three outcomes (recognized credential found / credential-like text not recognized / none found), lists the formats checked, names the state when the ad names a city or state (city→state mapping added; bare two-letter codes like "in"/"or" no longer misfire as Indiana/Oregon), and always carries "Format check only. Does not confirm a license is valid or active." The matched pattern's label and number format are shown instead of a bare confidence word. Gas Safe business registration format (1–6 digits) verified against the register's published "Check a business" page.

• UK findings now cite CAP + Google + Meta together (e.g. "UK ASA CAP Code — Pricing (3.17–3.22) · Google Ads — Misrepresentation: Dishonest pricing practices · Meta — Prohibited Commercial Practices"). Re-verified 2026-10-02: Meta has no family-specific policy names (the "Prohibited Commercial Practices" umbrella is the honest label); Google "Unreliable claims" / "Dishonest pricing practices" sub-policies and the Editorial capitalization wording re-confirmed verbatim.

• UK `uk_free_vague_conditions`: explanation/fix de-duplicated (why vs. what-to-change). When two rules fire on one sentence, their fixes merge to one line.

v2026-10-04 (2026-10-02)

Correction (2026-10-03): the v2026-10-04 stamp was future-dated relative to its change date. Corrected to v2026-10-03 above; no rule content changed in the correction itself.

License coverage expanded (20 new entries, 31 states/regions total):

• 50-state research: every state checked for license-number-in-advertising requirements, verified from statute/regulation text.

• Added 17 confirmed-required states: AL, AK, CT, HI, ID, IL, IN, IA, KS, KY, MD, MA, OH, OK, PA, RI, WV — plus NJ, MN, TN (confirmed earlier).

• Verified number formats added for AL (HBLB #), CT (HIC. + 7 digits), PA (PA + 6 digits), OH (OH LIC#), MD (MHIC # prefix).

• 15 entries have unverified formats — flagged `needs_verification`, never matched against page text; the "number required in ads" compliance check still works for these states.

• 20 states confirmed as no-requirement (AR, DE, LA, ME, MI, MS, MO, MT, NE, NH, NM, NY, ND, SC, SD, UT, VT, VA, WI, WY).

v2026-10-03 (2026-10-02)

Agency workflow (Phase 7):

• Batch audit: new batch-audit.html + server-side audit-batch function (up to 5 ads, 1 quota each, comparative table with score/verdict/top finding).

• Ad-to-page match: if an ad was audited in the same session, the landing report shows one named check comparing headline/offer/phone.

• Re-audit diff: ad audits store a localStorage snapshot; re-running shows "fixed X, new Y" vs the previous run. (Watchlist already diffs landing pages.)

• Page structure checks (3 new): title present & <60 chars, exactly one H1, at least one internal link. HTML only.

• Format honesty: pasted-text note now reads "Scored from text only — headings, buttons, images, and tap-to-call links were not reviewed."

• JS-shell guard tested: <400 visible chars refuses confident scoring.

New verified rules (Phase 6):

• Google Editorial (5 patterns, MEDIUM): excessive caps, repeated punctuation, gimmicky symbols/emoji, word repetition, phone in ad text — all quoted from the verified Editorial policy pages. 7-day warning, not immediate suspension.

• US FTC "Free" (3 patterns, MEDIUM): inflated qualifying purchase (16 CFR 251.1(b)(1)), hidden conditions (251.1(c)), invented "regular" price (251.1(b)(2)) — exact quotes in every explanation.

• Meta Personal Attributes explanation updated to verified "vulnerable financial status" language.

• **Parked (needs verification, NOT shipped):** financing/offer claims (0% APR, "no money down") — no verified Google/Meta policy text found in research; will not ship until verified against official sources.

License detection — data-driven table (Phase 5):

• Replaced hard-coded LICENSE_PATTERNS with `license_table` in policy_patterns.json (18 entries: 13 US covering WA, OR, CA, TX, FL, AZ, NC, CO, NV, GA; 5 UK schemes). Adding a state = editing JSON, no code changes.

• Each match reports matched text, state/board, format description, and confidence tier. Below the bar: "couldn't confirm — verify manually."

• UK: Gas Safe Register (1–6 digits) detected; NICEIC/OFTEC/TrustMark/MCS listed for name recognition only — formats not verified, never matched.

• FL §489.119 flagged as needs-verification (2024 statute text unavailable); not quoted verbatim.

• New rules.html lists all recognized license formats per state.

• 16 new regression tests (12 states + UK + 2 no-license + bare-word paths).

Detector fixes (Phase 4):

• CTA: "get your free estimate" (and "claim your/my") now count as quote CTAs.

• Service area: "Serving <City>" now hits via serving-verb + capitalized place; added a metro gazetteer, "areas we serve" / "where we work" phrases; strength message quotes the matched signal.

• Phone: "canonical" renamed to "matched" everywhere — digits matched by the text rules, never claimed as verified. "Consistent" is now only false when 2+ distinct numbers were compared; a single number yields null (vacuous consistency claim removed).

• Trust signals: strength now counts and quotes the items ("Trust signals found (3): years in business — ...") instead of bare labels; flagged wording still excluded.

• Negation: one shared tokenized `isNegated()` matcher in doc.js, used by the policy scan and all landing-page detectors. "We are not the cheapest", "no hidden fees" no longer flag.

Platform specificity (Phase 3):

• New "Where will this ad run?" selector on ad and landing audits: Google Ads, Meta, or Both (default). Only rules tagged for the selected platform(s) run — Meta-only Personal Attributes rules no longer fire on Google-only audits.

• Every rule tagged with applicable platforms; per-platform policy names replace the combined "Google/Meta" labels (e.g. "Google Ads — Misrepresentation" vs "Meta — Prohibited Commercial Practices"; Personal Attributes → "Meta — Privacy Violations and Personal Attributes").

• Each finding shows its platform; report header and white-label PDF show platform + region.

• UK mode: superlative findings cite ASA CAP 3.7 (substantiation).

UK "free" rule rewrite (research-verified):

• `uk_free_conditional` (HIGH) replaced by two MEDIUM rules: `uk_free_vague_conditions` (vague/hidden conditions like "ask in store for details" → CAP 3.24) and `uk_free_extra_charges` (packing/handling/admin fees on "free" items → CAP 3.23.1).

• "Free with purchase" at a non-inflated price is compliant (CAP 3.23.2) and no longer flagged.

• Citations corrected to 3.23.1–3.23.3 / 3.24.

Scoring overhaul (Phase 2):

• Findings are now grouped by sentence: one sentence appears once with every triggered rule beneath it. A sentence deducts once, at its highest severity.

• Score floor lowered from 40 to 0; the two-HIGH cap at 60 is retired. Very bad pages now score distinguishably lower than moderately bad ones.

• Formula: `100 − 20 × HIGH-severity sentences − 8 × MEDIUM-severity sentences`, floored at 0.

Severity calibration:

• `gua_money_back` ("money back" without visible terms): HIGH → MEDIUM. Unverifiable refund language is a review item, not a high disapproval risk.

Wording:

• UK `uk_vat_excluded` and `uk_free_conditional` explanations: "breach" → "risk violating" (risk language, not breach language).

v2026-10-02 (2026-10-02)

• UK/ASA policy pack added: 5 new patterns across 3 categories (`uk_pricing`, `uk_free_claims`, `uk_testimonials`). 42 patterns total (37 US, 5 UK-only).

• Engine accepts a `region` parameter (`us` default; behavior unchanged for US).

v2026-09-29 (2026-09-29)

• Initial versioned release: 37 patterns across 5 families (superlatives, absolute_guarantees, financial_claims, personal_attributes, safety_claims).

• Verdicts HIGH RISK / NEEDS REVIEW / CLEAR; gray-zone human-review bucket; deterministic license diagnostic.