-
Notifications
You must be signed in to change notification settings - Fork 0
feat: expand initial Meta Ads policy coverage #12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
9d956b0
feat: expand initial Meta Ads policy coverage
ftchvs 2c9e567
docs: clarify Meta Ads coverage scope
ftchvs 822e280
test: add Meta Ads false-positive guardrails
ftchvs ae6c1ba
docs: define OSS project goal
ftchvs 4686cb6
fix: apply Meta cross-vertical policy checks
ftchvs File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| # Meta Ads policy scope | ||
|
|
||
| AdLint's Meta module is an initial, conservative preflight surface for campaign | ||
| review. It is not a complete implementation of Meta's Advertising Standards and | ||
| it does not guarantee Meta approval. | ||
|
|
||
| ## What the current module covers | ||
|
|
||
| The bundled `platform_meta_ads.yml` rules focus on high-signal patterns that are | ||
| useful before a growth team sends creative to review: | ||
|
|
||
| - **Selected personal attributes**: health/body and vulnerable-finance wording that | ||
| can imply knowledge of the viewer's condition or status. The current module | ||
| does not yet cover every Meta personal-attribute class such as religion, race, | ||
| disability, gender identity, sexual orientation, or trade-union membership. | ||
| - **Health and appearance results**: transformation, weight-loss, and negative | ||
| self-perception framing. | ||
| - **Health/wellness age-targeting review**: weight-loss, cosmetic, sexual-health, | ||
| and reproductive-health terms that should trigger human review before launch. | ||
| - **Financial services authorization review**: credit, loan, insurance, | ||
| investment, refinance, and cash-advance offers that may require 18+ targeting, | ||
| disclosures, licensing, or authorization checks. | ||
| - **Special Ad Category review**: housing, employment, and financial-products | ||
| contexts that may require Meta campaign-level category settings and targeting | ||
| limits. This check is intentionally not gated by advertiser vertical because | ||
| healthcare, SaaS, education, or other advertisers can still run employment, | ||
| housing, or credit campaigns. | ||
| - **Private information requests**: ad copy asking for health, financial, or | ||
| similarly private information. This check is intentionally not gated by | ||
| advertiser vertical because sensitive-data requests can appear in otherwise | ||
| general campaigns. | ||
| - **Branded content disclosure**: sponsorship, affiliate, promo-code, and paid | ||
| partnership language. | ||
|
|
||
| ## Source references | ||
|
|
||
| Use these official Meta references when extending the module: | ||
|
|
||
| - Meta Advertising Standards overview: | ||
| <https://transparency.meta.com/policies/ad-standards/> | ||
| - Financial and Insurance Products and Services: | ||
| <https://transparency.meta.com/policies/ad-standards/restricted-goods-services/financial-services/> | ||
| - Discriminatory Practices and Special Ad Category context: | ||
| <https://transparency.meta.com/policies/ad-standards/unacceptable-content/discriminatory-practices> | ||
| - Marketing API Special Ad Categories: | ||
| <https://developers.facebook.com/docs/marketing-api/audiences/special-ad-category/> | ||
| - Branded Content Policies: | ||
| <https://www.facebook.com/business/help/221149188908254> | ||
|
|
||
| ## Deliberate limitations | ||
|
|
||
| - Rules are deterministic phrase and pattern checks, not a legal or platform | ||
| approval model. | ||
| - Synthetic benchmark rows are regression coverage, not production accuracy | ||
| claims. | ||
| - The module intentionally routes ambiguous regulated-category copy to | ||
| `needs_review` rather than trying to decide eligibility automatically. | ||
| - Campaign-level fields such as actual Meta objective, placement, age targeting, | ||
| country targeting, and `special_ad_categories` are not modeled yet. | ||
| - Landing-page mismatch is currently handled by AdLint's generic landing-page | ||
| module rather than a Meta-specific policy id. | ||
|
|
||
| ## Good next contributions | ||
|
|
||
| - Add public-source, paraphrased Meta Ad Library and Meta policy examples. | ||
| - Add explicit campaign metadata fields for age range, country, and special ad | ||
| category selection, then make review rules conditional on those fields. | ||
| - Add Meta-specific landing-page and destination-quality policy ids beyond the generic landing-page mismatch rule. | ||
| - Split regulated finance review into offer, education, and brand-awareness | ||
| subcases with stronger false-positive fixtures. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| # Open-source project goal | ||
|
|
||
| ## Working prompt | ||
|
|
||
| Make AdLint a legitimately useful open-source, local-first preflight tool for | ||
| growth and marketing teams before they ship ads or landing pages. | ||
|
|
||
| Prioritize work that makes the project more trustworthy to a stranger landing on | ||
| GitHub: | ||
|
|
||
| 1. **Useful out of the box**: clear install path, runnable examples, CLI/API/Web | ||
| UI workflows, and reports a marketer can understand. | ||
| 2. **Evidence-backed policies**: platform, disclosure, privacy, health, finance, | ||
| and brand-safety rules with source notes, scoped claims, and conservative | ||
| review language. | ||
| 3. **False-positive discipline**: every broad rule needs near-miss tests or eval | ||
| rows so benign education, tooling, or planning content is not overflagged. | ||
| 4. **Transparent quality gates**: benchmark, seed eval, real-case eval, policy | ||
| coverage, and PR preflight should make regressions obvious. | ||
| 5. **Local-first trust**: no default raw ad persistence, no secret data in tests, | ||
| no live ad-account mutations, and no legal/platform approval guarantees. | ||
|
|
||
| ## Near-term OSS roadmap | ||
|
|
||
| ### 1. Meta Ads credibility | ||
|
|
||
| - Keep the Meta module framed as initial heuristic coverage, not policy parity. | ||
| - Add source-linked docs and reviewed-date notes when new Meta rules land. | ||
| - Expand from synthetic triggers to paraphrased, public-source examples where | ||
| safe and legally usable. | ||
| - Split broad regulated-category checks into higher-precision subcases. | ||
|
|
||
| ### 2. Contributor-friendly policy work | ||
|
|
||
| - Add one example, one positive eval, and one near-miss eval for each new policy. | ||
| - Prefer policy IDs that describe the review reason, not a vague platform bucket. | ||
| - Require recommended actions that tell a marketer what to change or verify. | ||
|
|
||
| ### 3. Product relevance | ||
|
|
||
| - Improve first-run experience: demo configs, screenshots/GIFs, and concise | ||
| report examples. | ||
| - Make landing-page mismatch and disclosure checks easy to demo in the CLI and | ||
| Web UI. | ||
| - Keep README language practical: who uses this, what it catches, what it does | ||
| not promise. | ||
|
|
||
| ### 4. Research/eval credibility | ||
|
|
||
| - Treat synthetic benchmarks as regression tests, not accuracy claims. | ||
| - Keep adding real-case/adjudicated datasets without private data. | ||
| - Track false positives and false negatives explicitly in CI-facing checks. | ||
|
|
||
| ## Definition of solid | ||
|
|
||
| AdLint is “solid OSS” when a new contributor can clone it, run examples, trust | ||
| its privacy posture, understand policy scope, add a rule with tests, and see CI | ||
| catch both missed risky cases and noisy overtriggering. |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This signal is matched as an exact phrase, and
_signal_to_regexescapes literals before compiling the pattern, so only copy containingrefinance todaywill trigger this rule. That creates false negatives for common refinance ads such as “refinance your mortgage” that should still be covered bymeta_financial_services_authorization_reviewbased on its description.Useful? React with 👍 / 👎.