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)
sup_best— Unsubstantiated superlative 'best' requires verifiable third-party proof (awards, published rankings); otherwise it risks disapproval under ...sup_number_one— '#1 / No.1 / number one' is a ranking claim. Without a named source and date it is treated as an unsubstantiated superlative....sup_top_rated— 'Top-rated' is a superlative claim that needs a verifiable source (review platform, award body, year)....- ...and 14 more
absolute_guarantees (7 patterns)
gua_money_back— 'Money back' promises are absolute financial guarantees. They need clear, visible terms and conditions or they are treated as exaggerated gu...gua_100_percent— '100% guaranteed' is an absolute guarantee with no possible qualification....gua_ironclad— 'Iron-clad guarantee' or 'iron-clad promise' is an absolute guarantee claim requiring visible terms....- ...and 4 more
financial_claims (7 patterns) — UK ASA CAP Code — Pricing (3.17–3.22)
fin_save_up_to— 'Save you up to $[price]' is a projected-savings claim that needs a disclosed basis (typical customer, study, or timeframe)....fin_save_amount— A specific savings amount ('save $500') presented as fact needs substantiation of how the figure was calculated....fin_money_pocket— 'Money back in your pocket' implies a guaranteed financial return, which needs proof....- ...and 4 more
fair_housing (4 patterns) — Fair Housing Act (42 U.S.C. 3601-3619)
fh_familial_status— Indicates a preference or limitation based on familial status — one of the seven classes protected by the federal Fair Housing Act (HUD). 'N...fh_disability— Indicates a limitation based on disability — protected under the Fair Housing Act (HUD). Service animals are not pets; refusing them is unla...fh_religion— Using proximity to a house of worship as a selling point signals a religious preference — religion is a protected class under the Fair Housi...- ...and 1 more
dental_ads (4 patterns) — State dental board advertising rules (CA B&P 1680; TX Occ. Code 254.002)
dent_guarantee— Guaranteeing a dental service or outcome. CA B&P 1680(l) expressly prohibits advertising to guarantee any dental service — results depend on...dent_painless— 'Painless dentistry' is expressly prohibited by CA B&P 1680(l). Pain experience varies by patient; the claim is unverifiable....dent_unjustified_expectations— Promises of specific cosmetic outcomes ('perfect smile, guaranteed') create unjustified expectations — prohibited under TX Occ. Code 254.002...- ...and 1 more
legal_ads (3 patterns) — ABA Model Rules of Professional Conduct 7.1, 7.2, 7.4
legal_specialist— Claiming specialist/expert status in a field of law. ABA Model Rule 7.4: a lawyer may not state or imply certification as a specialist unles...legal_guaranteed_outcome— Guaranteeing case outcomes. ABA Model Rule 7.1 prohibits false/misleading communications — no lawyer can guarantee a result, and implying on...legal_testimonial— Client testimonials citing dollar outcomes. Many states (e.g. NY Rule 7.1) allow these only with a prominent disclaimer that prior results d...
personal_attributes (6 patterns)
pa_direct_question— Direct second-person questions asserting the viewer's personal attributes, situation, or struggles ('Do you own a home...', 'Are you struggl...pa_tired_your— Phrases like 'tired of YOUR old AC' assert the viewer's personal situation — a personal-attributes violation....pa_youre_overpaying— Telling the viewer 'you're overpaying' asserts their vulnerable financial status — prohibited by Meta's Personal Attributes policy....- ...and 3 more
safety_claims (10 patterns) — UK ASA CAP Code — Substantiation (3.7)
saf_100_safe— '100% safe' is an absolute safety claim. For pest/chemical treatments, EPA/FTC prohibit absolute safety or risk-free claims....saf_completely_safe— Absolute safety qualifiers ('completely safe') are prohibited for treatments and health-adjacent claims....saf_harmless— 'Harmless to children/pets' is an absolute safety claim about a treatment product....- ...and 7 more
google_editorial (6 patterns)
ed_caps— Excessive capitalization ('FREE QUOTE NOW') violates Google's Editorial policy: "Capitalization that isn't used correctly or for its intende...ed_punct— Repeated punctuation ('!!') violates Google's Editorial policy: "Punctuation or symbols repeated consecutively, like 'flowers!!'." Use a sin...ed_symbols— Emoji and gimmicky symbols ('*free*') violate Google's Editorial policy: symbols "that don't adhere to their true meaning or purpose." Remov...- ...and 3 more
us_free_claims (4 patterns) — FTC Guides on 'Free' — 16 CFR Part 251
us_free_inflated— A 'free' item with a purchase is allowed only if "he is paying nothing for that article and no more than the regular price for the other" (1...us_free_disclosure— When making 'Free' offers, "all the terms, conditions and obligations... should be set forth clearly and conspicuously at the outset of the ...us_free_regular_price— "Regular" price means the price "at which the seller... has openly and actively sold the product... for a reasonably substantial period of t...- ...and 1 more
uk_pricing (2 patterns) — UK ASA CAP Code — Pricing (3.17–3.22)
uk_vat_excluded— Prices quoted excluding VAT risk violating CAP 3.18 unless clearly addressed to VAT-registered businesses — add 'inc VAT' or state the VAT a...uk_price_from— 'From £X' price claims must not exaggerate availability (CAP 3.22) — make sure the advertised price is genuinely available....
uk_free_claims (2 patterns) — UK ASA CAP Code — 'Free' claims (3.23–3.24)
uk_free_vague_conditions— A 'free' offer with vague or hidden conditions risks violating CAP 3.24 — the extent of the commitment must be made clear. 'Ask in store for...uk_free_extra_charges— Charging packing, handling, or admin fees on a 'free' item risks violating CAP 3.23.1 — 'free' must mean no more than the unavoidable cost o...
uk_testimonials (2 patterns) — UK ASA CAP Code — Testimonials & endorsements (3.45–3.48)
uk_testimonial_unsourced— Testimonial claims must be genuine and traceable — {match} names no review platform (e.g. Google, Trustpilot, Checkatrade) the claim can be ...uk_stars_unsourced— Star ratings need a named source (review platform and date) to be verifiable — {match} has no named source, so it reads as an unsubstantiate...
uk_estate_agents (2 patterns) — CAP Code (Ed. 12); National Trading Standards Estate Agency Guidance; Consumer Protection from Unfair Trading Regulations 2008
ukre_sold_status— In the UK, 'Sold' may only be used after contracts have exchanged (NTS guidance). Using it for 'sold subject to contract' is misleading....ukre_years_experience— ASA enforcement: 'years of experience' must not misleadingly imply the business itself has traded that long (CAP 3.1, 3.7)....
urgency_scarcity (4 patterns) — UK ASA CAP Code — Misleading advertising (3.1)
urg_only_x_left— 'Only X left/spots' is a scarcity claim. If the limit isn't real, it's deceptive under FTC and CAP misleading-advertising rules....urg_offer_ends— A deadline ('offer ends tonight') is a factual claim. If the offer doesn't actually end, it's a false urgency claim....urg_limited_time— 'Limited time' implies a deadline that may not exist. Vague urgency without a real end date risks misleading....- ...and 1 more
license_bare (2 patterns) — UK ASA CAP Code — Misleading advertising (3.1)
lic_insured_bare— 'Licensed and insured' with no credential shown is an unverifiable trust claim. Readers can't check it....lic_bonded_bare— 'Bonded' with no bond details is unverifiable. A bare bond claim can't be checked....
ca_drip_pricing (2 patterns) — Competition Act (Canada) — Drip pricing (s. 74.01(1.1))
ca_drip_plus_fees— In Canada, advertising a price that cannot actually be paid because fixed mandatory fees are added later is deemed a false or misleading rep...ca_drip_price_excludes— A price presented as excluding mandatory charges is not an attainable price, which the Competition Act deems a false or misleading represent...
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_perf_percent_efficacy— A performance or efficacy claim must be based on an adequate and proper test carried out before the claim is made, and the advertiser carrie...ca_env_benefit_claims— Environmental benefit claims about a product need an adequate and proper test, and claims about the business itself need adequate and proper...
ca_reference_pricing (2 patterns) — Competition Act (Canada) — Ordinary selling price (s. 74.01(2)–(3))
ca_ref_anchor_price— A reference price must be a genuine ordinary selling price: Canadian law tests it against how long the product was actually sold at that pri...ca_ref_percent_off_regular— A percentage off a 'regular' or list price is only as honest as the reference price behind it, which must pass the ordinary selling price te...
ca_testimonials (2 patterns) — Competition Act (Canada) — Tests and testimonials (s. 74.02)
ca_testimonial_unsourced— Using a testimonial that is untrue, misleading or unauthorized is prohibited (Competition Act s. 74.02). {match} names no source, such as Go...ca_stars_unsourced— Star ratings need a named source (review platform and date) to be verifiable, and unauthorized or misleading use of testimonials is prohibit...
License formats recognized
| State / region | Board / scheme | Format | Example | Number required in ads? |
|---|---|---|---|---|
| AK | AK DCCED, Division of Corporations, Business and Professional Licensing | Format not verified — name recognition only ⚠️ AK license number format not confirmed from an official source; do not pattern-match | — | Yes |
| AL | AL Home Builders Licensure Board | HBLB # + digits | HBLB #12345 | Yes |
| AZ | AZ Registrar of Contractors (ROC) | ROC # + digits (commonly 6) | ROC #276078 | Yes |
| CA | Contractors State License Board (CSLB) | CSLB # + 6–8 digits | CSLB #531728 | Yes |
| CO | CO DPO Plumbing Board — plumbing | Format not verified — name recognition only ⚠️ CO plumbing number format not confirmed; do not pattern-match | — | Yes |
| CO | CO Dept. of Regulatory Agencies (DORA) — electrical | EC. or ME. + 7 digits | EC.0002742 | No |
| CT | CT Dept. of Consumer Protection | HIC. + 7 digits | HIC.0643874 | Yes |
| FL | FL Dept. of Business & Professional Regulation (DBPR) | 2–3 letter prefix + 6–8 digits (CGC, CBC, EC, …) | CGC058377 | Yes |
| GA | GA State Licensing Board for Residential & General Contractors | Prefix (GCQA, RBQA, …) + 6 digits | GCQA006043 | No |
| HI | HI DCCA Contractors License Board | Format not verified — name recognition only ⚠️ HI license number format not confirmed from an official source; do not pattern-match | — | Yes |
| IA | IA Plumbing and Mechanical Systems Board | Format not verified — name recognition only ⚠️ IA contractor license number format not confirmed from an official source; do not pattern-match | — | Yes |
| ID | ID 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 |
| IL | IL 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 |
| IN | IN Professional Licensing Agency, Plumbing Commission | Format not verified — name recognition only ⚠️ IN plumbing license number format not confirmed from an official source; do not pattern-match | — | Yes |
| KS | KS 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 |
| KY | KY Dept. of Housing, Buildings and Construction | Format not verified — name recognition only ⚠️ KY HVAC license number format not confirmed from an official source; do not pattern-match | — | Yes |
| MA | MA 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 |
| MD | MD Home Improvement Commission | MHIC # + digits (prefix verified by regulation) | MHIC #123456 | Yes |
| MN | MN Dept. of Labor and Industry | Format not verified — name recognition only ⚠️ MN license number format not confirmed from an official source; do not pattern-match | — | Yes |
| NC | NC Licensing Board for General Contractors | NC License # + 4–6 digits (requires 'License' or '#') | NC License #73785 | No |
| NJ | NJ Division of Consumer Affairs | Format not verified — name recognition only ⚠️ NJ license number format not confirmed from an official source; do not pattern-match | — | Yes |
| NV | NV State Contractors Board (NSCB) | NV License # + 5–6 digits | NV License #80253 | Yes |
| OH | OH Construction Industry Licensing Board (Dept. of Commerce) | OH LIC# + digits (display format prescribed by rule) | OH LIC#12345 | Yes |
| OK | OK Construction Industries Board | Format not verified — name recognition only ⚠️ OK roofing registration number format not confirmed from an official source; do not pattern-match | — | Yes |
| OR | OR Construction Contractors Board (CCB) | CCB # + 6 digits | CCB #123456 | Yes |
| PA | PA Attorney General, Bureau of Consumer Protection | PA + 6 digits | PA123456 | Yes |
| RI | RI Contractors' Registration and Licensing Board | Format not verified — name recognition only ⚠️ RI registration number format not confirmed from an official source; do not pattern-match | — | Yes |
| TN | TN Board for Licensing Contractors | Format not verified — name recognition only ⚠️ TN license number format not confirmed from an official source; do not pattern-match | — | Yes |
| TX | TX Dept. of Licensing & Regulation (TDLR) — HVAC/refrigeration | TACL + A/B + digits + E/R/C endorsement | TACLA12345C | Yes |
| TX | TX Dept. of Licensing & Regulation (TDLR) — electrical | TECL # + 5–6 digits | TECL #19787 | Yes |
| TX | TX State Board of Plumbing Examiners (TSBPE) — plumbing | M / MPL / RMP + 5–6 digits | M-12345 | Yes |
| UK | Gas Safe Register | Gas Safe registration number, 1–6 digits | Gas Safe registered 123456 | No |
| UK | MCS (Microgeneration Certification Scheme) | Format not verified — name recognition only ⚠️ MCS certificate reference format not confirmed from an official source | — | No |
| UK | NICEIC | Format not verified — name recognition only ⚠️ NICEIC enrolment number format not confirmed from an official source | — | No |
| UK | OFTEC | Format not verified — name recognition only ⚠️ OFTEC registration number format not confirmed from an official source | — | No |
| UK | TrustMark | Format not verified — name recognition only ⚠️ TrustMark not covered by policy research; format and ad rules unverified | — | No |
| WA | WA Dept. of Labor & Industries (L&I) | 6–8 letters + 3 digits + 2 letters (contractor registration) | MORTESL763NR | Yes |
| WV | WV Contractor Licensing Board | Format not verified — name recognition only ⚠️ WV license number format not confirmed from an official source; do not pattern-match | — | Yes |
| CA | CA Dept. of Real Estate (DRE) | DRE # + 8 digits | DRE #01992777 | Yes |
| TX | TX Real Estate Commission (TREC) | Format not verified — name recognition only ⚠️ Format not confirmed from an official source; do not pattern-match | — | No |
| FL | FL Real Estate Commission (FREC), Dept. of Business and Professional Regulation | 2-letter prefix + 6-7 digits (BK broker, SL sales associate, CQ corporation) | SL3629488 | No |
| FL | FL Board of Dentistry, Dept. of Health | DN + 4-5 digits | DN26577 | No |
| NY | NY Dept. of State, Division of Licensing Services | Format 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 |
| NY | NYSED Office of the Professions, State Board for Dentistry | 6 digits (optional -# suffix disregarded); requires license context nearby | 000456 | No |
| IL | IL Dept. of Financial and Professional Regulation, Division of Real Estate | 3-digit type code + 6 digits (475 broker, 471 managing broker, 473 leasing agent, 478/481 firm) | 475-111694 | No |
| IL | IL Board of Dentistry, Dept. of Financial and Professional Regulation | 019 dentist / 020 hygienist / 021 specialist + 6 digits | 019-024667 | No |
| AZ | AZ 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 |
| AZ | AZ State Board of Dental Examiners | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| WA | WA Dept. of Licensing, Real Estate program | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| WA | WA Dental Quality Assurance Commission, Dept. of Health | Format 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 |
| GA | Georgia Real Estate Commission (GREC) | Legend + six-digit number (e.g. GA R. E. Lic. #000001); number appears only within the legend | GA R. E. Lic. #000001 | No |
| GA | Georgia Board of Dentistry | Format not verified — name recognition only ⚠️ Dental license-number format not confirmed from an official source — do not pattern-match | — | No |
| NC | North 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 |
| NC | North Carolina State Board of Dental Examiners | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| OH | OH Division of Real Estate & Professional Licensing, Dept. of Commerce | SAL. + 6-10 digits (salesperson) | SAL.2010009100 | No |
| OH | Ohio State Dental Board | Format not verified — name recognition only ⚠️ Dental license-number format not confirmed from an official source — do not pattern-match | — | No |
| PA | PA State Real Estate Commission | Format not verified — name recognition only ⚠️ License-number format (RB/RS/AB + 6 digits observed) from third-party mirrors only — do not pattern-match | — | No |
| PA | PA State Board of Dentistry | Format not verified — name recognition only ⚠️ License-number format (DS + 6 digits observed) from NPI self-reported data only — do not pattern-match | — | No |
| NJ | NJ Real Estate Commission (NJREC), Dept. of Banking and Insurance | 7-digit reference number (per NJDOBI Licensee Search); requires license context nearby | — | No |
| NJ | NJ State Board of Dentistry, Division of Consumer Affairs | 22DI + 5-8 digits | 22DI 01414200 | No |
| MA | MA Board of Registration of Real Estate Brokers and Salespersons | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| MA | MA Board of Registration in Dentistry | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| VA | Virginia Real Estate Board | 0225 (individual) or 0226 (firm) + 6 digits, no dashes | — | No |
| VA | Virginia Board of Dentistry | Format not verified — name recognition only ⚠️ Dental license-number digit pattern not confirmed from an official source — do not pattern-match | — | No |
| TN | Tennessee Real Estate Commission (TREC), Dept. of Commerce & Insurance | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| TN | Tennessee Board of Dentistry, Dept. of Health | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source (single official example ‘8415’ only) — do not pattern-match | — | No |
| MO | Missouri Real Estate Commission (MREC) | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| MO | Missouri Dental Board | Format not verified — name recognition only ⚠️ License-number format not confirmed from an official source — do not pattern-match | — | No |
| CO | Colorado Real Estate Commission, Division of Real Estate (DORA) | 2-letter license-type prefix + 9 digits (e.g. EC.100089583) | EC.100089583 | No |
| CO | Colorado Dental Board, Division of Professions and Occupations (DORA) | DEN. + 8 digits (observed on official DORA verification pages) | DEN.00008340 | No |
| QC | Régie du bâtiment du Québec (RBQ) | RBQ licence number — 10 digits, shown as XXXX-XXXX-XX | RBQ : 5678-1234-01 | Yes |
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.