# Layered Style Guidance Enforcement—Conflict Register (canonical)
#
# This is the canonical machine-readable register of every known cross-layer
# rule. Each entry conforms to the schema in _data/rules/schema.yaml and
# resolves per the algorithm in _data/rules/precedence.yaml.
#
# Human-readable view: docs/conflict-register.md
# Concept doc: docs/layered-enforcement.md (csa-content-standards §11)
# Schema: _data/rules/schema.yaml
# Algorithm: _data/rules/precedence.yaml
#
# To update: edit this file. The human-readable .md is hand-maintained as a
# twin (not auto-generated in v1.0); update both when adding rules.

register_version: "1.0.4"
last_updated: "2026-06-02"
default_precedence: [platform, format, persona, general]

# =============================================================================
# HEADLINE rules
# =============================================================================
rules:

  - id: headline.char_count
    domain: headline
    type: range
    description: H1 character count range
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: "80-100"
      source: "docs/brand-guidelines.md §1.2"
      rationale: Universal fallback for outlets without platform-specific guidance
    overrides:
      - selector: { format: everything-to-know }
        value: "80-150"
        source: "docs/everything-to-know.md"
        rationale: ETK is structurally longer; audience expects more discoverability headroom
      - selector: { platform: apple-news }
        value: "90-120"
        sweet_spot: "110-119"
        data_validated: true
        source: "docs/platform-apple-news.md §10.2"
        rationale: Apple News rewards longer heds; data-validated sweet spot 110-119
      - selector: { platform: smartnews }
        value: "70-90"
        data_validated: true
        source: "docs/platform-smartnews.md §10.1"
        rationale: SmartNews feeds favor short scannable heds; 70-79 acceptable (extends below universal minimum)
      - selector: { distribution: push-notification }
        value: "70-89"
        source: "api/reference.json (headlines section)"
        rationale: Most mobile devices truncate at ~80 chars; front-load the subject
      - selector: { publication: trend-hunter-b2c }
        value: "90-104"
        sweet_spot: "90-104"
        data_validated: true
        source: "docs/trend-hunter-b2c.md §10.4 (TH Headline Analysis 2026-06-02, 368 articles)"
        rationale: TH B2C headlines peak at 90-104 chars (614 avg PV vs 352 under-75 and 340 over-105); under-80 is worst. When built for a destination platform the TIGHTER range wins (see composites below).
      - selector: { platform: apple-news, publication: trend-hunter-b2c }
        value: "90-104"
        source: "docs/trend-hunter-b2c.md §10.4 + docs/platform-apple-news.md §10.2"
        rationale: TH-B2C built for Apple News—Apple's 90-120 is looser than the data-validated 90-104, so the tighter TH-B2C optimal holds (most-specific tie-break).
        kind: override
      - selector: { platform: smartnews, publication: trend-hunter-b2c }
        value: "70-90"
        source: "docs/platform-smartnews.md §10.1 + docs/trend-hunter-b2c.md §10.4"
        rationale: TH-B2C built for SmartNews—SmartNews 70-90 is tighter than 90-104, so the platform cap governs (most-specific tie-break).
        kind: override

  - id: headline.seo_title_char_count
    domain: headline
    type: range
    description: SEO title character count range
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: "50-70"
      source: "docs/brand-guidelines.md §1.2"
    overrides:
      - selector: { format: faq }
        value: "50-70"
        source: "docs/faq.md"
        rationale: Matches general; restated for emphasis on tier-of-service journalism queries
        kind: restate
      - selector: { format: recipe }
        value: "50-70"
        source: "docs/recipe.md"
        rationale: Format restates 50-70 explicitly to assert the floor against a hypothetical universal 60-70 drift
        kind: restate

  - id: headline.promo_title_char_count
    domain: headline
    type: range
    description: Promo / homepage title character count
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: "70-75"
      source: "docs/brand-guidelines.md §1.2"
      rationale: Must not get cut off on the homepage
    overrides: []

  - id: headline.meta_description_char_count
    domain: headline
    type: range
    description: Meta description character count
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: "100-155"
      source: "docs/brand-guidelines.md §1.2"
    overrides: []

  - id: headline.formula
    domain: headline
    type: pattern
    description: Required headline formula / template
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: "[Person/Topic] [Does/Is] [Thing] (open principles per §1.2)"
      source: "docs/brand-guidelines.md §1.2"
      rationale: Open principles; verb required unless roundup or relationship timeline
    overrides:
      - selector: { format: discover-explainer }
        value: "What Is [Topic]? / Who Is [Person]?"
        source: "docs/discover-explainer.md"
        kind: override
        format_status: retired
        retired_on: "2026-05-28"
        rationale: Format §3.1 retired 2026-05-28 (superseded by §3.12 What to Know Next); rule preserved for historical articles created under this format
      - selector: { format: everything-to-know }
        value: "[Subject]: Everything You Need to Know"
        source: "docs/everything-to-know.md"
        kind: override
      - selector: { format: faq }
        value: "[Topic] [Question Word]: [Specific Question Answered]"
        source: "docs/faq.md §3.11"
        kind: override
      - selector: { format: timeline }
        value: "[Subject]: A Complete Timeline | [Subject]: A Complete Breakdown"
        source: "docs/timeline.md"
        kind: override
        rationale: Verb-less heds permitted under §1.2 exception for relationship timelines
      - selector: { format: interview }
        value: "[Celebrity Name] on [Topic]: '[Quote]' (EXCLUSIVE)"
        source: "docs/interview.md"
        kind: override
        rationale: Includes embedded direct quote + exclusivity label in H1 (extends §1.2 SEO-title practice to the H1)
      - selector: { format: recap }
        value: "[Show/Movie Name] Recap: [Number] Biggest Moments From [Episode Title]"
        source: "docs/recap.md"
        kind: override
        notes: UsW-specific alternate—"[Show/Movie Name] Ending Explained"
      - selector: { format: obituary }
        value: "[Celebrity Name] Dead: [Descriptor] Was [Age]"
        source: "docs/obituary.md §3.8"
        kind: override
      - selector: { format: what-to-know-next }
        value: "[Subject]: What's Happening, Why, and What Could Be Next"
        source: "docs/what-to-know-next.md"
        kind: override
        notes: Forward-looking signal required; trigger-event variant available

  - id: headline.questions
    domain: headline
    type: enum
    description: Whether question-format headlines are encouraged, neutral, or discouraged
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: occasional
      source: "docs/brand-guidelines.md §1.2"
      rationale: Question-format heds can work occasionally (especially on Discover) but overuse undermines authority
    overrides:
      - selector: { platform: apple-news }
        value: avoid
        data_validated: true
        source: "docs/platform-apple-news.md §10.2"
        rationale: Underperform in organic algorithmic reach (data-validated); exception only for editorially-curated featured slots
      - selector: { platform: smartnews }
        value: avoid
        data_validated: true
        source: "docs/platform-smartnews.md §10.1"
        rationale: Read velocity rewards clarity and immediate payoff over curiosity gaps

  - id: headline.number_lead
    domain: headline
    type: enum
    description: Whether number-led headlines (e.g., "7 Ways to...") are encouraged, neutral, or discouraged
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: neutral
      source: "(no general rule)"
    overrides:
      - selector: { platform: apple-news }
        value: avoid
        data_validated: true
        source: "docs/platform-apple-news.md §10.2"
        rationale: Underperform on Apple News despite performing well on other platforms (data-validated)
      - selector: { platform: smartnews }
        value: positive
        data_validated: true
        source: "docs/platform-smartnews.md §10.1"
        rationale: Number-led headlines trend positive on SmartNews (data-validated)

  - id: headline.what_to_know_endings
    domain: headline
    type: enum
    description: Whether "What to Know" headline endings are permitted
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: permitted
      source: "(no general rule)"
    overrides:
      - selector: { platform: smartnews }
        value: avoid
        data_validated: true
        source: "docs/platform-smartnews.md §10.1"
        rationale: Worst-performing formula on SmartNews (pct_rank 0.37, p=3.0e-6, n=213)
      - selector: { platform: apple-news }
        value: avoid
        source: "docs/platform-apple-news.md §10.2"
        rationale: Avoid on both platforms for organic reach; favored only for editorially-curated featured slots

  - id: headline.did_you_miss
    domain: headline
    type: enum
    description: Whether "Did you miss" headline patterns are permitted
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: avoid
      source: "api/reference.json (headlines section)"
      rationale: Historically under 100 views median across all surfaces

  - id: headline.numerals_in_heds
    domain: headline
    type: enum
    description: Whether numerals (vs spelled-out numbers) are required in heds
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: spell-out-1-to-9
      source: "(no general headline numerals rule; body rule is spell out 1-9, numerals 10+)"
    overrides:
      - selector: { publication: us-weekly }
        value: always-numerals
        source: "docs/us-weekly.md"
        rationale: USW house style—"Use numerals in heds and H2's instead of spelling them out"
      - selector: { publication: womans-world }
        value: spell-out-1-to-9
        source: "docs/womans-world.md"
        rationale: Matches AP Compatible default; restated for clarity that WW follows AP here (USW is the exception)
        kind: restate

  - id: headline.quote_style
    domain: headline
    type: enum
    description: Quote style in headlines
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: per-destination
      source: "docs/headlines.md"
      rationale: AP rule generally; final call follows destination site style guide
    overrides:
      - selector: { publication: us-weekly }
        value: single
        source: "docs/us-weekly.md"
        rationale: USW house style—"Use single quotes in heds and H2s"
      - selector: { publication: womans-world }
        value: single
        source: "docs/womans-world.md"
        rationale: AMI Women's Group convention; matches USW

  - id: headline.periods
    domain: headline
    type: enum
    description: Whether periods are permitted at the end of heds
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: at-end-of-complete-sentences
      source: "docs/ap-compatible-quick.md"
      rationale: Period at end of complete sentences only; no period at end of fragment heds
    overrides:
      - selector: { publication: us-weekly }
        value: avoid
        source: "docs/us-weekly.md"
        rationale: "USW house style—refrain from using periods in heds"

  - id: headline.ampersands
    domain: headline
    type: enum
    description: Whether ampersands are permitted in heds
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: avoid-in-heds
      source: "docs/ap-compatible-thorough.md (Ampersand)"
      rationale: AP—"ampersands are used instead of 'and' in taglines, bylines and reporting credits. Avoid using in heds and text. Should only appear in such constructions as R&B, A&R and official or trademarked company names"
    overrides: []

  - id: headline.casing
    domain: capitalization
    type: enum
    description: Headline casing—title case, sentence case, or per-destination
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: per-destination
      source: "docs/ap-compatible-quick.md (Capitalization → Titles)"
      rationale: AP allows either; final call per destination site style guide
    overrides:
      - selector: { publication: us-weekly }
        value: title-case-seo
        source: "docs/us-weekly.md"
        rationale: SEO heds in title case (USW cheatsheet—"SEO heds should be title case, not lowercase")
      - selector: { publication: womans-world }
        value: title-case
        source: "docs/publishing-guidelines.md §6.1"
        rationale: USW + WW main heds in title case; CUE main heds in sentence case
      - selector: { distribution: cue }
        value: sentence-case
        source: "docs/publishing-guidelines.md §6.1"
        rationale: CUE main headlines are sentence case
      - selector: { publication: us-weekly, distribution: cue }
        value: sentence-case
        source: "docs/publishing-guidelines.md §6.1"
        rationale: USW published to CUE—CUE sentence-case wins over the USW title-case default (§6.1); most-specific tie-break.
        kind: override
      - selector: { publication: womans-world, distribution: cue }
        value: sentence-case
        source: "docs/publishing-guidelines.md §6.1"
        rationale: WW published to CUE—CUE sentence-case wins over the WW title-case default (§6.1); most-specific tie-break.
        kind: override

  - id: headline.h2_keywords
    domain: headline
    type: enum
    description: Whether the primary keyword must appear in at least one H2
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: required-primary
      source: "docs/brand-guidelines.md §1.2 Subheading (H2) Keyword Rules"
      rationale: Primary keyword must appear in at least one H2; secondary keywords should appear in other H2s when they fit naturally (don't force)
      introduced: "v1.8.3"
    overrides:
      - selector: { format: faq }
        value: "every-h2-includes-google-trends-or-paa-keyword"
        source: "docs/faq.md §3.11"
        rationale: FAQ structurally requires every H2 to include a keyword from Google Trends or People Also Ask
        kind: override

  - id: headline.intro_word_count
    domain: body
    type: range
    description: Article intro word count range
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "docs/changelog.md §1.8.1 (2026-04-23 retraction)"
      rationale: 80-120 word intro rule was retracted site-wide. SEO team broadly retracted the rule. Tool-side enforcement dropped (PGS-147, PGS-205 → WON'T DO)
    overrides:
      - selector: { format: recipe }
        value: "150-350 words"
        source: "docs/recipe.md"
        kind: additive

  - id: headline.front_load_keywords
    domain: headline
    type: integer
    description: How many leading words the front-loaded keyword(s) must occupy
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: 8
      source: "docs/brand-guidelines.md §1.2"
      rationale: First 8 words carry the most weight; applies to H1s and SEO titles
    overrides: []

  - id: headline.intent_advisory
    domain: headline
    type: boolean
    description: Advisory—label the headline's intent (What/Why/How) and what it drives. Flag-only, never gating.
    machine_evaluable: true
    enforcement_target: grader
    notes: "Advisory/flag-only. enforcement_target 'grader' per §11.5 denotes the deterministic post-hoc lane (regex), NOT a blocking gate—it is computed after drafting and surfaced as informational guidance, never scored, never gating, never auto-rewrite. (Contrast punctuation.banned_marks=writer, which IS injected into the drafting prompt.) Implemented: write-assist runHeadlineIntentAdvisory + variant grader headlineAdvisories."
    default:
      value: false
      source: "(advisory; TH B2C only)"
      rationale: No universal intent advisory; TH B2C surfaces it per the headline analysis
    overrides:
      - selector: { publication: trend-hunter-b2c }
        value: true
        source: "docs/trend-hunter-b2c.md §10.4 (TH Headline Analysis 2026-06-02)"
        rationale: What/Why drive reach; How drives engagement depth. Match intent to the article's job.

  - id: headline.name_expert_advisory
    domain: headline
    type: boolean
    description: Advisory—if the body cites a credentialed source/study the headline doesn't name, suggest surfacing it. Flag-only.
    machine_evaluable: true
    enforcement_target: grader
    notes: "Advisory/flag-only. enforcement_target 'grader' per §11.5 denotes the deterministic post-hoc lane (regex), NOT a blocking gate—computed after drafting, surfaced as informational guidance, never scored/gating/auto-rewrite. Implemented: write-assist runHeadlineNameExpertAdvisory + variant grader headlineAdvisories."
    default:
      value: false
      source: "(advisory; TH B2C only)"
      rationale: No universal expert advisory; TH B2C surfaces it
    overrides:
      - selector: { publication: trend-hunter-b2c }
        value: true
        source: "docs/trend-hunter-b2c.md §10.4"
        rationale: Naming a credentialed expert/study in the headline is the single strongest performance lever.

  - id: headline.etk_advisory
    domain: headline
    type: boolean
    description: Advisory—flag "Everything to Know" / "Everything You Need to Know" framing as a no-lift fallback. Flag-only.
    machine_evaluable: true
    enforcement_target: grader
    notes: "Advisory/flag-only. enforcement_target 'grader' per §11.5 denotes the deterministic post-hoc lane (regex), NOT a blocking gate—computed after drafting, surfaced as informational guidance, never scored/gating/auto-rewrite. Implemented: write-assist runHeadlineEtkAdvisory + variant grader headlineAdvisories."
    default:
      value: false
      source: "(advisory; TH B2C only)"
      rationale: No universal ETK advisory; TH B2C surfaces it
    overrides:
      - selector: { publication: trend-hunter-b2c }
        value: true
        source: "docs/trend-hunter-b2c.md §10.4"
        rationale: '"Everything to Know" shows no measurable lift and overpromises; use only with comprehensive coverage + a specific subject leading.'

# =============================================================================
# BODY rules
# =============================================================================

  - id: body.word_count
    domain: body
    type: range
    description: Total article body word count target
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general word count target)"
    overrides:
      - selector: { format: discover-explainer }
        value: "400-800 words"
        source: "docs/discover-explainer.md"
        kind: additive
        format_status: retired
        retired_on: "2026-05-28"
        rationale: Format §3.1 retired 2026-05-28 (superseded by §3.12 What to Know Next); rule preserved for historical articles created under this format
      - selector: { format: everything-to-know }
        value: "500-1500 words"
        source: "docs/everything-to-know.md"
        kind: additive
      - selector: { format: timeline }
        value: "500-2000 words"
        source: "docs/timeline.md"
        kind: additive
      - selector: { format: interview }
        value: "500-1500 words"
        source: "docs/interview.md"
        kind: additive
      - selector: { format: recap }
        value: "400-800 words"
        source: "docs/recap.md"
        kind: additive
      - selector: { format: fan-content }
        value: "300-500 words"
        source: "docs/fan-content.md"
        kind: additive
        rationale: Shortest of any format; padding explicitly prohibited
      - selector: { format: obituary }
        value: "300-600 words"
        source: "docs/obituary.md §3.8"
        kind: additive
      - selector: { format: obituary, publication: us-weekly }
        value: "500 words"
        source: "docs/obituary.md §3.8"
        kind: override
        rationale: USW-specific minimum
      - selector: { format: couple-baby }
        value: "200-500 words"
        source: "docs/couple-baby.md"
        kind: additive
      - selector: { format: couple-baby, publication: us-weekly }
        value: "500 words minimum"
        source: "docs/couple-baby.md"
        kind: override
      - selector: { format: cast }
        value: "400-500 words"
        source: "docs/cast.md"
        kind: additive
        rationale: Notably tight target
      - selector: { format: what-to-know-next }
        value: "700-1000 words with inverted proportionality (~25% / 30% / 45% across Sections 1/2/3)"
        source: "docs/what-to-know-next.md §3.12"
        kind: additive
        rationale: Word count widened from 600-900 to 700-1000 and proportionality switched from even to inverted (Section 3 longest by design) per content team lead 2026-05-28 final-draft spec (v1.9.13)
        introduced: "v1.9.13"

  - id: body.faq_block_word_count
    domain: body
    type: range
    description: FAQ per-question/answer block word count
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general rule; format-specific)"
    overrides:
      - selector: { format: faq }
        value: "100-200 words per H2 answer block"
        source: "docs/faq.md §3.11"
        kind: additive
        rationale: Tightened from 300-500 to 100-200 per content team lead 2026-05-08; tighter blocks read snippet-ready (v1.9.1)
        introduced: "v1.9.1"

  - id: body.paragraph_max_sentences
    domain: body
    type: integer
    description: Maximum sentences per paragraph
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general cap)"
    overrides:
      - selector: { format: faq }
        value: 3
        source: "docs/faq.md §3.11"
        kind: additive
        rationale: Paragraphs 2-3 sentences maximum
      - selector: { publication: trend-hunter-b2c }
        value: 3
        source: "docs/trend-hunter-b2c.md §10.4"
        kind: additive
        rationale: Short paragraphs (2-3 sentences max) for the Curious Optimizer audience

  - id: body.celebrity_names
    domain: body
    type: enum
    description: Whether celebrity names are bold and/or linked to tag pages in body copy
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: standard
      source: "docs/brand-guidelines.md §1.4 Internal Linking Rules"
      rationale: Standard inline linking—link to tag pages relevant to the article's focus
    overrides:
      - selector: { publication: us-weekly }
        value: bold-and-link-tag-pages
        source: "docs/us-weekly.md §10.3"
        rationale: USW house style—bold celebrity names; link tag pages where available (search "[name] Us Weekly")
        kind: override

  - id: body.italics_targets
    domain: italics
    type: list
    description: Categories of titles + entities italicized in body copy
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: [newspaper-names, magazine-names, films, books, tv-shows, album-titles, video-games, plays]
      source: "docs/ap-compatible-quick.md / docs/us-weekly.md / docs/womans-world.md"
    overrides:
      - selector: { publication: us-weekly }
        value: [newspaper-names, magazine-names, films, books, tv-shows, album-titles, video-games]
        source: "docs/us-weekly.md §10.3"
        rationale: USW spec—explicitly does NOT italicize websites, news agencies, blogs, TV networks; podcasts get quotes (not italics)
        notes: Same scope as default but with explicit non-italics list

  - id: body.italics_excluded
    domain: italics
    type: list
    description: Categories explicitly NOT italicized
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: [websites, news-agencies, blogs, tv-networks]
      source: "docs/us-weekly.md §10.3"
    overrides: []

  - id: body.podcasts_format
    domain: italics
    type: enum
    description: How podcast titles are formatted (italics vs quotes)
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: quotes
      source: "docs/us-weekly.md / docs/womans-world.md"
      rationale: Podcasts get quotes (not italics)—USW + WW agree

# =============================================================================
# PUNCTUATION rules—the "load-bearing" cross-publication divergences
# =============================================================================

  - id: punctuation.banned_marks
    domain: punctuation
    type: list
    description: Public-facing marks to flag for manual removal; empty by default (no universal ban)
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: []
      source: "(no general ban—em-dash spacing + per-publication style govern instead)"
      rationale: No universal ban. AP-default + per-publication punctuation rules (em_dash_surrounding_spaces, oxford_comma, etc.) govern other publications.
    overrides:
      - selector: { publication: trend-hunter-b2c }
        value: ["—", "–", ":", ";"]
        data_validated: true
        source: "docs/trend-hunter-b2c.md §10.4"
        rationale: "TH B2C bans em-dash, en-dash, colon, semicolon in public-facing headlines + body (colons underperform; em/en-dash read as an AI tell). Hyphen (-) allowed. Flag for manual removal; restructure rather than substitute. Avoid unless a destination platform requires the mark. EXCEPTION: a banned mark that is part of a proper noun, publication name, or work/study title (e.g., the colon in 'CA: A Cancer Journal for Clinicians') is intrinsic to the name and preserved verbatim; where a platform filter cannot keep it, substitute a comma ('CA, A Cancer Journal for Clinicians') as the defined fallback, never stripping the mark with no replacement."
    notes: Scoped to TH B2C only—Woman's World (no-space em-dash) and US Weekly (AP-spaced em-dash) keep their house styles via punctuation.em_dash_surrounding_spaces.

  - id: punctuation.em_dash_surrounding_spaces
    domain: punctuation
    type: boolean
    description: Whether em dashes have surrounding spaces
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: true
      source: "docs/ap-compatible-quick.md (Em Dash) + docs/ap-compatible-condensed.md (Em Dash)"
      rationale: 'AP standard—use a space on both sides of the em dash. ap-compatible-quick.md shows the spaced form as correct and the closed-up form as incorrect; ap-compatible-condensed.md flags em dashes without spaces as a common error.'
    overrides:
      - selector: { publication: us-weekly }
        value: true
        source: "docs/us-weekly.md §10.3"
        rationale: 'USW restated explicitly—matches AP default (em dashes with spaces). Restated rather than removed so future register readers see the policy without re-deriving from the AP default.'
        kind: restate
      - selector: { publication: womans-world }
        value: false
        source: "docs/womans-world.md §10.5 (lines 292, 340, 376)"
        rationale: 'WW house style deviates from AP—em dashes have NO surrounding spaces in Woman''s World. (The WW doc claims this "matches AP" but real AP uses spaces; the no-space form is a WW-specific style choice, not an AP match. Doc cleanup tracked separately.)'
        kind: override

  - id: punctuation.oxford_comma
    domain: punctuation
    type: boolean
    description: Whether the Oxford / serial comma is used
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: false
      source: "docs/ap-compatible-quick.md (Comma—No Serial Comma)"
      rationale: AP omits the comma before the conjunction in a simple series
    overrides:
      - selector: { publication: us-weekly }
        value: false
        source: "docs/us-weekly.md §10.3"
        rationale: Explicitly stated—"DO NOT use Oxford commas"
      - selector: { publication: womans-world }
        value: false
        source: "docs/womans-world.md §10.5"
        rationale: AMI Women's Group convention; matches AP

  - id: punctuation.ellipsis_surrounding_spaces
    domain: punctuation
    type: boolean
    description: Whether ellipses have surrounding spaces
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: true
      source: "docs/ap-compatible-condensed.md (Ellipsis)"
      rationale: AP convention—"Use three periods with spaces between them" and "Treat an ellipsis as a three-letter word with spaces before and after." Example format from the canonical doc—"word ... word".
    overrides:
      - selector: { publication: us-weekly }
        value: true
        source: "docs/us-weekly.md §10.3"
        rationale: USW restated explicitly—matches AP default (ellipses with spaces on both sides).
        kind: restate

# =============================================================================
# GRAMMAR rules
# =============================================================================

  - id: grammar.couple_verb_agreement
    domain: grammar
    type: enum
    description: Verb agreement for couples / pairs / duos (excluding mashups)
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: singular
      source: "docs/ap-compatible-condensed.md (Collective Nouns)"
      rationale: AP / standard collective noun treatment
    overrides:
      - selector: { publication: us-weekly }
        value: plural
        source: "docs/us-weekly.md §10.3"
        rationale: AMI Women's Group default for Us Weekly only—"couple takes plural for Us Weekly, including mashups (Brangelina, TomKat, etc.); also, duo, pair, etc. take plural (all other AMI titles can keep singular, except mashups should always be plural)"
        kind: override
      - selector: { publication: womans-world }
        value: singular
        source: "docs/womans-world.md §10.5"
        rationale: AMI default; mashups always plural. Restated for clarity that WW takes singular (USW is the exception)
        kind: restate
    notes: Mashups (Brangelina, TomKat) are always plural at every publication

  - id: grammar.contractions_avoided
    domain: grammar
    type: list
    description: Contractions to avoid (preferred to be written out)
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: []
      source: "(no general avoidance list)"
    overrides:
      - selector: { publication: us-weekly }
        value: ["we'd", "you'll", "you'd", "must've", "what'd"]
        source: "docs/us-weekly.md §10.3"
        rationale: Avoid; "It's" is OK; "he's" / "she's" / "who's" always present-tense (write out "he has" / "she has" / "who has")
        kind: additive
      - selector: { publication: womans-world }
        value: ["we'd", "you'll", "you'd", "must've", "what'd"]
        source: "docs/womans-world.md §10.5"
        kind: additive

# =============================================================================
# STRUCTURE rules
# =============================================================================

  - id: structure.sister_rule_heds
    domain: structure
    type: boolean
    description: Whether onpage / promo / SEO heds must be structurally similar with shared keywords (sister-rule)
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: false
      source: "(no general sister-rule mandate)"
    overrides:
      - selector: { publication: us-weekly }
        value: true
        source: "docs/us-weekly.md §10.3"
        rationale: USW house style—onpage / promo / SEO titles should be sisters, structurally similar with shared keywords; topic / celebrity name front-loaded
        kind: additive

  - id: structure.faq_answer_first
    domain: structure
    type: boolean
    description: Whether FAQ blocks must lead with a snippet-ready direct answer (1-2 sentences)
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: null
      source: "(format-specific only)"
    overrides:
      - selector: { format: faq }
        value: true
        source: "docs/faq.md §3.11"
        rationale: First sentence after each H2 must directly address the question; snippet-ready for Google featured snippet capture
        kind: additive

  - id: structure.required_article_structure
    domain: structure
    type: prose
    description: Whether the format prescribes a required article structure
    machine_evaluable: false
    enforcement_target: writer
    default:
      value: null
      source: "docs/brand-guidelines.md (no general structure prescribed)"
    overrides:
      - selector: { format: discover-explainer }
        value: required
        source: "docs/discover-explainer.md"
        kind: additive
        format_status: retired
        retired_on: "2026-05-28"
        rationale: Format §3.1 retired 2026-05-28 (superseded by §3.12 What to Know Next); rule preserved for historical articles created under this format
      - selector: { format: everything-to-know }
        value: required
        source: "docs/everything-to-know.md"
        kind: additive
      - selector: { format: faq }
        value: "[INTRO 1-2 sentences] → [H2 keyword-rich question] → [direct answer 1-2 sentences, snippet-ready] → [supporting context 2-4 sentences] → [repeat H2 + answer for each question] → [3-5 internal links embedded]"
        source: "docs/faq.md §3.11"
        kind: additive
      - selector: { format: timeline }
        value: "chronological structure required; per-entry photo requirements"
        source: "docs/timeline.md"
        kind: additive
      - selector: { format: interview }
        value: "Q&A or narrative structure"
        source: "docs/interview.md"
        kind: additive
      - selector: { format: recap }
        value: "plot-plus-analysis structure; pure plot summary explicitly prohibited; forward-looking implications required"
        source: "docs/recap.md"
        kind: additive
      - selector: { format: what-to-know-next }
        value: "three-section arc (what's happening / why / what could be next) with inverted proportionality (~25% / 30% / 45%); Status Bar italic line directly under H1; Forecaster Pull Quote in §2 or §3; Three Signals to Watch boxed callout closing §3; sourced causation in §2; paired prediction-plus-action in §3"
        source: "docs/what-to-know-next.md §3.12"
        kind: additive
        rationale: Reshaped to final-draft state per content team lead 2026-05-28 — added Status Bar + Forecaster Pull Quote + Three Signals to Watch as REQUIRED structural elements; proportionality switched from even to inverted with Section 3 longest (v1.9.13)
        introduced: "v1.9.13"
      - selector: { publication: trend-hunter-b2c }
        value: "incorporate four elements naturally—What It Is / Why It Matters / Who It's For / How to Experience It"
        source: "docs/trend-hunter-b2c.md §10.4"
        kind: additive

  - id: structure.status_bar
    domain: structure
    type: prose
    description: Whether the format requires a Status Bar element directly under the headline
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general rule; format-specific)"
    overrides:
      - selector: { format: what-to-know-next }
        value: "REQUIRED — italicized one-line directly under H1: `Stage: {Emerging|Building|Peaking|Cresting} · Momentum: {Low|Moderate|High} · Forecast confidence: {Low|Moderate|High}`; all three fields required, no 'TBD' values"
        source: "docs/what-to-know-next.md §3.12 Status Bar"
        kind: additive
        rationale: Net-new REQUIRED format element added per content team lead 2026-05-28 final-draft spec; forcing function (if writer can't fill it in confidently, topic is wrong for this format)
        introduced: "v1.9.13"

  - id: structure.forecaster_pull_quote
    domain: structure
    type: prose
    description: Whether the format requires a named-forecaster pull quote
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general rule; format-specific)"
    overrides:
      - selector: { format: what-to-know-next }
        value: "REQUIRED — one named-forecaster pull quote per article; named individual + title + institution all required; forward-looking (prediction/interpretation/directional read), NOT definitional; pull-quote visual treatment, NOT inline attribution; placed in Section 2 or Section 3"
        source: "docs/what-to-know-next.md §3.12 Forecaster Pull Quote"
        kind: additive
        rationale: Net-new REQUIRED format element added per content team lead 2026-05-28 final-draft spec; expert quote exists to give a directional read on where the trend is headed, not to define terms
        introduced: "v1.9.13"

  - id: structure.three_signals_to_watch
    domain: structure
    type: prose
    description: Whether the format requires a Three Signals to Watch boxed callout
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general rule; format-specific)"
    overrides:
      - selector: { format: what-to-know-next }
        value: "REQUIRED — boxed callout closing Section 3; exactly three signals (not two, not four); each signal must be concrete and monitorable (date, release, product launch, data point, or observable change); vague signals ('watch the market,' 'keep an eye on X') disqualify"
        source: "docs/what-to-know-next.md §3.12 Three Signals to Watch"
        kind: additive
        rationale: Net-new REQUIRED format element added per content team lead 2026-05-28 final-draft spec; turns the forecast into something the reader can actively monitor
        introduced: "v1.9.13"

# =============================================================================
# VOICE / TONE rules
# =============================================================================

  - id: voice.tone_north_star
    domain: voice
    type: prose
    description: A specific tone reference / archetype
    machine_evaluable: false
    enforcement_target: writer
    default:
      value: "Conversational, confident, specific, human-first—never stiff or institutional"
      source: "docs/brand-guidelines.md §1.1"
    overrides:
      - selector: { publication: womans-world }
        value: "Pretend you're talking to Dolly Parton—she's got an edge to her but isn't a people-pleaser. Other tone references: Ree Drummond, Ina Garten, Martha Stewart, Hoda Kotb, Jenna Bush Hager, Kathie Lee Gifford, the Royal Family, Trisha Yearwood, Reba McEntire, Emmy Lou Harris"
        source: "docs/womans-world.md §10.5"
        kind: override
      - selector: { publication: trend-hunter-b2c }
        value: "Smart, Approachable, Curious, Practical"
        source: "docs/trend-hunter-b2c.md §10.4"
        kind: override
      - selector: { publication: us-weekly }
        value: "Conversational, knowing, pop-culture-fluent; treat reader as already familiar with personalities"
        source: "docs/us-weekly.md §10.3"
        kind: override

  - id: voice.audience_framing
    domain: voice
    type: enum
    description: How the audience is framed—demographic vs psychographic
    machine_evaluable: false
    enforcement_target: writer
    default:
      value: either
      source: "(no general restriction)"
    overrides:
      - selector: { persona: curious-optimizer }
        value: psychographic-only
        source: "docs/curious-optimizer.md §4.2"
        rationale: "Never assume age, gender, income, or region. Frame benefits around motivations, not demographics: 'If you're optimizing for energy…' / 'For anyone curious about…'"
        kind: override
      - selector: { publication: trend-hunter-b2c }
        value: psychographic-only
        source: "docs/trend-hunter-b2c.md §10.4"
        rationale: "Never assume demographic attributes (age, gender, income, location, relationship status, parental status). Frame benefits psychographically"
        kind: override
      - selector: { publication: womans-world }
        value: psychographic-over-demographic
        source: "docs/womans-world.md §10.5"
        rationale: "Frame content by mindset and life-stage need, not strictly by age bracket"
        kind: override

  - id: voice.banned_words_aging
    domain: vocabulary
    type: list
    description: Words/phrases banned for negative aging framing
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: []
      source: "(no general aging-language ban)"
    overrides:
      - selector: { publication: womans-world }
        value: ["old", "struggling", "senior moments", "meno brain", "cankles", "blogger"]
        source: "docs/womans-world.md §10.5"
        rationale: Negative framing of aging is banned. "Meno brain" specifically—studies show companies avoid hiring women 40-60 because of stigma; WW does not contribute to that zeitgeist
        kind: additive

  - id: voice.banned_phrasing_demographic
    domain: vocabulary
    type: list
    description: Demographic-stereotyping phrasings banned
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: []
      source: "(no general restriction)"
    overrides:
      - selector: { persona: curious-optimizer }
        value: ["Millennials are obsessed with...", "Women over 40 should try...", "High-income shoppers prefer...", "Parents will love...", "Gen Z is all about..."]
        source: "docs/curious-optimizer.md §4.2"
        rationale: 'Curious Optimizer is a psychographic persona; demographic stereotyping contradicts the persona-by-design. Same banned list as TH B2C since TH B2C is the publication-side instantiation of CO.'
        kind: additive
      - selector: { publication: trend-hunter-b2c }
        value: ["Millennials are obsessed with...", "Women over 40 should try...", "High-income shoppers prefer...", "Parents will love...", "Gen Z is all about..."]
        source: "docs/trend-hunter-b2c.md §10.4"
        rationale: Demographic stereotyping in any form is the strongest anti-pattern—persona is psychographic, spans all demographics
        kind: additive

  - id: voice.banned_slang
    domain: vocabulary
    type: list
    description: Trendy / juvenile slang banned
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: []
      source: "(no general restriction)"
    overrides:
      - selector: { publication: trend-hunter-b2c }
        value: ["slay", "bestie", "vibes"]
        source: "docs/trend-hunter-b2c.md §10.4"
        rationale: Reads as inauthentic; will date quickly; violates voice attributes
        kind: additive
      - selector: { publication: womans-world }
        value: ["slay", "bestie", "vibes"]
        source: "docs/womans-world.md §10.5"
        rationale: Doesn't resonate with Gen X/Boomer demographic
        kind: additive

  - id: voice.politics
    domain: vocabulary
    type: enum
    description: Whether partisan / political framing is permitted
    machine_evaluable: false
    enforcement_target: writer
    default:
      value: standard-coverage
      source: "(political coverage standard for newsroom outlets)"
    overrides:
      - selector: { publication: womans-world }
        value: avoid
        source: "docs/womans-world.md §10.5"
        rationale: "Safe space for everyone; speak across lines with bipartisan, loving tone; frame stories from love; lens of hope so readers don't feel judged"
        kind: override

  - id: voice.preferred_substitutions_beauty
    domain: vocabulary
    type: list
    description: Preferred substitutions for beauty/aging vocabulary
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: []
      source: "(no general substitution list)"
    overrides:
      - selector: { publication: womans-world }
        value:
          - { from: "anti-aging", to: "age-defying / skin-firming / brighten / smooth" }
          - { from: "wrinkle-free", to: "smooth" }
          - { from: "reverse", to: "refresh" }
          - { from: "fix", to: "enhance / support" }
          - { from: "slimming", to: "flattering" }
        source: "docs/womans-world.md §10.5"
        kind: additive

# =============================================================================
# COMPLIANCE rules—system-wide; not all are overridable
# =============================================================================

  - id: compliance.byline
    domain: compliance
    type: enum
    description: Required byline form
    machine_evaluable: true
    enforcement_target: human
    default:
      value: named-individual
      source: "docs/brand-guidelines.md §1.5"
      rationale: Always use a named individual byline—never a staff or team byline. Generic bylines undermine site transparency
    precedence: [general]
    overrides: []
    notes: System-wide—never overridable

  - id: compliance.ai_disclosure
    domain: compliance
    type: prose
    description: AI disclosure requirements
    machine_evaluable: true
    enforcement_target: human
    default:
      value: "Required on CUE sites only. Exact text: 'This article was created by content specialists using various tools, including AI.' Place at top of article body. Also check 'Created With AI' checkbox in CUE General section."
      source: "docs/brand-guidelines.md §1.6"
    overrides:
      - selector: { distribution: cue }
        value: "Apply standard disclosure"
        source: "docs/publishing-guidelines.md §6.1"
      - selector: { platform: apple-news }
        value: "BEYOND general disclosure: AI-generated/assisted articles must include byline or co-byline + tag as AI-generated in News Publisher metadata + include explanation of how AI was used within the article"
        source: "docs/platform-apple-news.md §10.2"
        kind: restriction
        rationale: Apple's policy adds requirements beyond the general AI disclaimer
      - selector: { distribution: cue, platform: apple-news }
        value: "BEYOND general disclosure: AI-generated/assisted articles must include byline or co-byline + tag as AI-generated in News Publisher metadata + include explanation of how AI was used within the article"
        source: "docs/platform-apple-news.md §10.2 + docs/publishing-guidelines.md §6.1"
        kind: restriction
        rationale: CUE content distributed to Apple News—Apple's BEYOND-disclosure is additive on the standard CUE disclosure, so it supersedes for this tuple; most-specific tie-break.

  - id: compliance.no_unverified_facts
    domain: compliance
    type: boolean
    description: All facts must be verified; links must point to reputable sources only
    machine_evaluable: false
    enforcement_target: human
    default:
      value: true
      source: "docs/brand-guidelines.md §1.8"
    precedence: [general]
    overrides: []
    notes: System-wide—never overridable

  - id: compliance.human_review_required
    domain: compliance
    type: boolean
    description: No content publishes without human review and approval
    machine_evaluable: false
    enforcement_target: human
    default:
      value: true
      source: "docs/brand-guidelines.md §1.8"
    precedence: [general]
    overrides: []
    notes: System-wide—never overridable

  - id: compliance.helpful_content
    domain: compliance
    type: prose
    description: Google Helpful Content Standard—12 questions every piece must answer 'yes' to before publishing
    machine_evaluable: false
    enforcement_target: human
    default:
      value: "All 12 §1.7 questions must answer yes (original information, complete description, insightful analysis, etc.)"
      source: "docs/brand-guidelines.md §1.7"
    precedence: [general]
    overrides: []
    notes: System-wide—never overridable

  - id: compliance.no_keytakeaways_at_top
    domain: compliance
    type: boolean
    description: No "key takeaways" / TL;DR blocks at the top of articles
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: true
      source: "docs/brand-guidelines.md §1.8"
    precedence: [general]
    overrides: []

# =============================================================================
# LINKING rules
# =============================================================================

  - id: linking.internal_link_count
    domain: linking
    type: range
    description: Required internal link count per article
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: "3-5"
      source: "docs/brand-guidelines.md §1.4"
    overrides:
      - selector: { format: faq }
        value: "3-5"
        source: "docs/faq.md §3.11"
        rationale: Matches general; restated for emphasis in FAQ structural spec
        kind: restate

  - id: linking.anchor_text
    domain: linking
    type: list
    description: Anchor text rules
    machine_evaluable: true
    enforcement_target: grader
    default:
      value:
        do: ["full names", "show/movie titles", "platform names", "multi-word descriptive phrases"]
        dont: ["single generic words (exception: a single word that is a proper name—Vogue, Instagram, P!nk)", "entire or half sentences", "'click here' / 'read more'", "retailers (Walmart, Amazon, etc.) unless designated affiliate article"]
      source: "docs/brand-guidelines.md §1.4"
    overrides: []

# =============================================================================
# MEDIA rules
# =============================================================================

  - id: media.hero_image
    domain: media
    type: prose
    description: Hero image requirements
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(format-specific)"
    overrides:
      - selector: { format: faq }
        value: "1200px+ wide (1600px+ preferred); 16:9 aspect ratio; 300K+ pixels"
        source: "docs/faq.md §3.11"
        kind: additive

  - id: media.platform_thumbnail
    domain: media
    type: prose
    description: Platform-specific thumbnail requirements
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: null
      source: "(no general thumbnail spec)"
    overrides:
      - selector: { platform: apple-news }
        value: "300x300px minimum; 1:2 to 3:1 aspect ratio"
        source: "docs/platform-apple-news.md §10.2"
        kind: additive
      - selector: { platform: smartnews }
        value: "media:thumbnail in RSS; 4:3 aspect ratio; 320x240px"
        source: "docs/platform-smartnews.md §10.1"
        kind: additive

  - id: media.gifs
    domain: media
    type: boolean
    description: Whether GIFs are permitted
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: true
      source: "(no general restriction)"
    overrides:
      - selector: { platform: smartnews }
        value: false
        source: "docs/platform-smartnews.md §10.1"
        rationale: Prohibited—SmartView render environment limitations

  - id: media.subtitle_field
    domain: media
    type: enum
    description: Whether the subtitle/excerpt field must be populated
    machine_evaluable: true
    enforcement_target: human
    default:
      value: optional
      source: "(no general subtitle requirement)"
    overrides:
      - selector: { platform: apple-news }
        value: required
        source: "docs/platform-apple-news.md §10.2"
        rationale: Apple News pulls from first paragraph if subtitle blank—first paragraph is rarely excerpt-optimized
        kind: override

# =============================================================================
# CMS rules
# =============================================================================

  - id: cms.required_fields
    domain: cms
    type: list
    description: Required CMS fields per piece
    machine_evaluable: true
    enforcement_target: human
    default:
      value: []
      source: "(per-CMS)"
    overrides:
      - selector: { distribution: cue }
        value: ["AI Disclosure checkbox", "AI Disclosure text at top", "Credit line", "TH-CSA tag", "The Commons tag", "Dek (separate field)", "Section placement (no generic 'Local News' / 'Sports')"]
        source: "docs/publishing-guidelines.md §6.1"
        kind: additive
      - selector: { publication: us-weekly }
        value: ["Flavor text (label-locked)", "Category", "Tags (must match category)", "Content segment", "Vertical", "Audience category", "Featured image (resized; crops set)"]
        source: "docs/us-weekly.md §10.3"
        kind: additive
      - selector: { publication: us-weekly, distribution: cue }
        value: ["AI Disclosure checkbox", "AI Disclosure text at top", "Credit line", "TH-CSA tag", "The Commons tag", "Dek (separate field)", "Section placement (no generic 'Local News' / 'Sports')", "Flavor text (label-locked)", "Category", "Tags (must match category)", "Content segment", "Vertical", "Audience category", "Featured image (resized; crops set)"]
        source: "docs/publishing-guidelines.md §6.1 + docs/us-weekly.md §10.3"
        kind: additive
        rationale: USW piece in CUE needs BOTH field sets—the composite is their union (both base overrides are additive; the resolver picks one match, it does not merge); most-specific tie-break.

# =============================================================================
# FAITH rules
# =============================================================================

  - id: faith.god_word_permitted
    domain: faith
    type: enum
    description: Whether the word "God" is permitted in body copy
    machine_evaluable: false
    enforcement_target: writer
    default:
      value: editorial-judgment
      source: "(no general guidance)"
    overrides:
      - selector: { publication: womans-world }
        value: permitted-only-in-faith-pieces
        source: "docs/womans-world.md §10.5"
        rationale: '"God" permitted and encouraged when discussing faith topics. "In God We Trust" is important. Critical rule—apply faith-related guidelines ONLY when content is explicitly about faith, religion, spirituality, or values. Never force faith themes into unrelated content (recipes, beauty tips, etc.)'
        kind: override

# =============================================================================
# QUALITY rules—publication-level adds
# =============================================================================

  - id: quality.health_claim_sources
    domain: compliance
    type: prose
    description: Required source authority for health claims
    machine_evaluable: false
    enforcement_target: human
    default:
      value: "links must point to reputable sources only"
      source: "docs/brand-guidelines.md §1.8"
    overrides:
      - selector: { publication: womans-world }
        value: "cite board-certified physicians, registered dietitians, or peer-reviewed research within 5 years"
        source: "docs/womans-world.md §10.5"
        kind: restriction
        rationale: WW-specific tightening of source authority; specific to health content

  - id: quality.product_recommendations
    domain: compliance
    type: prose
    description: Constraints on product recommendations
    machine_evaluable: false
    enforcement_target: human
    default:
      value: null
      source: "(no general constraint)"
    overrides:
      - selector: { publication: womans-world }
        value: "only recommend products under $20 that actually work"
        source: "docs/womans-world.md §10.5"
        kind: additive
        rationale: WW reader is budget-conscious; brand contract is trustworthiness

# =============================================================================
# DISCOVERABILITY / PLATFORM rules
# =============================================================================

  - id: platform.content_categories
    domain: structure
    type: enum
    description: Whether platform-specific content categories must be selected
    machine_evaluable: true
    enforcement_target: human
    default:
      value: optional
      source: "(no general selection rule)"
    overrides:
      - selector: { platform: apple-news }
        value: required
        source: "docs/platform-apple-news.md §10.2"
        rationale: Apple News requires topic categories for discoverability (technology, lifestyle, sports, etc.)
        kind: additive

  - id: platform.publishing_cadence
    domain: structure
    type: prose
    description: Publishing cadence requirements
    machine_evaluable: false
    enforcement_target: human
    default:
      value: null
      source: "(no general cadence rule)"
    overrides:
      - selector: { platform: apple-news }
        value: "consistent publishing schedule rewarded; irregular cadence depresses algorithmic standing"
        source: "docs/platform-apple-news.md §10.2"
        kind: additive

# =============================================================================
# FORMAT-SPECIFIC PATTERNS
# =============================================================================

  - id: format.faq.pattern_h1
    domain: headline
    type: pattern
    description: Required FAQ H1 pattern
    machine_evaluable: true
    enforcement_target: writer
    default:
      value: null
      source: "(format-specific only)"
    overrides:
      - selector: { format: faq }
        value: "[Topic] [Question Word]: [Specific Question Answered]"
        source: "docs/faq.md §3.11"
        kind: additive
        notes: 'Examples—"Social Security 2025: When Will Checks Arrive This Month?" / "Biggest Questions About [Show Name] Answered"'

  - id: format.recipe.dek_format
    domain: structure
    type: prose
    description: Required Recipe dek format
    machine_evaluable: false
    enforcement_target: writer
    default:
      value: null
      source: "(format-specific only)"
    overrides:
      - selector: { format: recipe }
        value: required
        source: "docs/recipe.md"
        kind: additive

  - id: format.recap.previous_episode_link
    domain: linking
    type: boolean
    description: Whether internal link to previous episode's recap is required
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: false
      source: "(format-specific only)"
    overrides:
      - selector: { format: recap }
        value: true
        source: "docs/recap.md"
        rationale: Format-specific internal linking requirement
        kind: additive

  - id: format.couple-baby.relationship_timeline_link
    domain: linking
    type: boolean
    description: Whether internal link to the couple's relationship timeline is required
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: false
      source: "(format-specific only)"
    overrides:
      - selector: { format: couple-baby }
        value: true
        source: "docs/couple-baby.md"
        kind: additive

  - id: format.timeline.chronological_order
    domain: structure
    type: boolean
    description: Timeline-format H2 entries must be in chronological order (earliest first)
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: false
      source: "(format-specific only)"
    overrides:
      - selector: { format: timeline }
        value: true
        source: "docs/timeline.md (chronological-ordering requirement)"
        rationale: 'Timeline format prescribes a chronological arc; out-of-order H2s break the format contract'
        kind: additive

  - id: publication.us-weekly.brand_italicization
    domain: italics
    type: boolean
    description: Italicize "Us" and "Us Weekly" in body as brand references
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: false
      source: "(brand-italicization is USW-specific)"
    overrides:
      - selector: { publication: us-weekly }
        value: true
        source: "docs/us-weekly.md §10.3 (brand italicization)"
        rationale: '*Us* italicized with capital U whenever the word appears as a brand nod; *Us Weekly* italicized in body copy'
        kind: override

  - id: publication.us-weekly.tv_film_title_italics
    domain: italics
    type: boolean
    description: TV / film / album / book titles use single quotes in heds, italics in body
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: false
      source: "(USW-specific body convention)"
    overrides:
      - selector: { publication: us-weekly }
        value: true
        source: "docs/us-weekly.md §10.3 (titles in body)"
        rationale: 'USW house style—body uses italics for titles; heds use single quotes. Flag any body single-quoted Title-Cased phrase as a candidate for italics conversion.'
        kind: override

# =============================================================================
# CROSS-CUTTING—explicit-language policy
# =============================================================================

  - id: explicit.headlines_substitutions
    domain: vocabulary
    type: list
    description: Approved substitutes for "NSFW" and suggestive language in heds / SEO titles / URLs
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: ["risqué", "off-color", "cheeky", "racy", "immodest", "lewd", "provocative", "suggestive", "naughty", "bawdy"]
      source: "docs/brand-guidelines.md §1.3"
      rationale: Adult-themed content / vulgar language is suppressed by Google News, Discover, syndication partner feeds (incl. Apple News). NSFW + sex-acts-language banned in heds, SEO titles, URLs, og:titles, promo titles, meta descriptions
    precedence: [general]
    overrides: []
    notes: System-wide—never overridable

  - id: explicit.galleries_stricter
    domain: vocabulary
    type: enum
    description: Restricted-language policy in galleries
    machine_evaluable: true
    enforcement_target: grader
    default:
      value: stricter-than-articles
      source: "docs/brand-guidelines.md §1.3"
      rationale: Galleries—restricted language must be avoided at all times in body, heds, SEO titles, promo, URLs, meta descriptions. No exceptions
    precedence: [general]
    overrides: []

# =============================================================================
# LAYER-0 AP-COMPATIBLE DEFAULTS
# -----------------------------------------------------------------------------
# Toggle rules for the 52 AP-Compatible runners enforced by write-assist.
# Each defaults to value:true (rule fires). Override with value:false for a
# selector to disable that AP rule for that persona/format/platform/publication.
# Runner implementations live in write-assist/docs/js/engine/ap-compatible.js.
# =============================================================================

  - id: ap.double_hyphen_emdash
    domain: ap-compatible
    type: toggle
    description: Double hyphen emdash (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Em Dash"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.us_abbreviation
    domain: ap-compatible
    type: toggle
    description: Us abbreviation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.state_with_city
    domain: ap-compatible
    type: toggle
    description: State abbreviation after city name (AP default; "Calif." not "CA" after a city)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.uk_abbreviation
    domain: ap-compatible
    type: toggle
    description: Uk abbreviation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.un_abbreviation
    domain: ap-compatible
    type: toggle
    description: Un abbreviation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.month_with_day
    domain: ap-compatible
    type: toggle
    description: Month with day (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Months"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.date_ordinal_suffix
    domain: ap-compatible
    type: toggle
    description: Date ordinal suffix (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Dates"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.decade_apostrophe
    domain: ap-compatible
    type: toggle
    description: Decade apostrophe (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Plurals"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.standalone_city
    domain: ap-compatible
    type: toggle
    description: Standalone city (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Stand-alone Cities"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.time_format
    domain: ap-compatible
    type: toggle
    description: Time format (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Time"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.midnight_noon
    domain: ap-compatible
    type: toggle
    description: Midnight noon (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Times"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.age_hyphenation
    domain: ap-compatible
    type: toggle
    description: Age hyphenation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Compound Modifiers"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.quote_punctuation
    domain: ap-compatible
    type: toggle
    description: Quote punctuation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Quotation Marks"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.title_capitalization
    domain: ap-compatible
    type: toggle
    description: Title capitalization (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Titles"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.double_space
    domain: ap-compatible
    type: toggle
    description: Double space (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Whitespace hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.body_ampersand
    domain: ap-compatible
    type: toggle
    description: Body ampersand (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Ampersand"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.trailing_whitespace
    domain: ap-compatible
    type: toggle
    description: Trailing whitespace (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Whitespace hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.tabs_to_spaces
    domain: ap-compatible
    type: toggle
    description: Tabs to spaces (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Whitespace hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.nbsp_normalize
    domain: ap-compatible
    type: toggle
    description: Nbsp normalize (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Whitespace hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.body_numerals_1_to_9
    domain: ap-compatible
    type: toggle
    description: Body numerals 1 to 9 (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Numbers"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.spelling_preferences
    domain: ap-compatible
    type: toggle
    description: Spelling preferences (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Spelling"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.percent_symbol
    domain: ap-compatible
    type: toggle
    description: Percent symbol (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Percent (2019+)"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.century_lowercase
    domain: ap-compatible
    type: toggle
    description: Century lowercase (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Capitalization"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.president_no_abbr
    domain: ap-compatible
    type: toggle
    description: President no abbr (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Titles"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.time_zone_uppercase
    domain: ap-compatible
    type: toggle
    description: Time zone uppercase (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Time Zones"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.large_number_normalization
    domain: ap-compatible
    type: toggle
    description: Large number normalization (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Numbers / Money"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.en_dash_to_hyphen
    domain: ap-compatible
    type: toggle
    description: En dash to hyphen (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Dashes"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.time_range_word
    domain: ap-compatible
    type: toggle
    description: Time range word (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Times"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.adverb_ly_no_hyphen
    domain: ap-compatible
    type: toggle
    description: Adverb ly no hyphen (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Hyphenation"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.compound_modifier_hyphen
    domain: ap-compatible
    type: toggle
    description: Compound modifier hyphen (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Compound Modifiers"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.government_body_caps
    domain: ap-compatible
    type: toggle
    description: Government body caps (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Capitalization"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.regions_caps
    domain: ap-compatible
    type: toggle
    description: Regions caps (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Regions vs Directions"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.honorifics_abbreviate
    domain: ap-compatible
    type: toggle
    description: Honorifics abbreviate (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Titles"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.possessive_singular_s
    domain: ap-compatible
    type: toggle
    description: Possessive singular s (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Possessives"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.address_numerals
    domain: ap-compatible
    type: toggle
    description: Address numerals (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Addresses"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.seasons_lowercase
    domain: ap-compatible
    type: toggle
    description: Seasons lowercase (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Seasons"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.publication_italics
    domain: ap-compatible
    type: toggle
    description: Publication italics (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Italics"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.date_comma_format
    domain: ap-compatible
    type: toggle
    description: Date comma format (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Dates"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.inc_no_comma
    domain: ap-compatible
    type: toggle
    description: Inc no comma (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Company Names"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.double_period_cleanup
    domain: ap-compatible
    type: toggle
    description: Double period cleanup (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Typography hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.directions_lowercase
    domain: ap-compatible
    type: toggle
    description: Directions lowercase (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Regions vs Directions"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.brand_capitalization
    domain: ap-compatible
    type: toggle
    description: Brand capitalization (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Brand Names"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.department_caps
    domain: ap-compatible
    type: toggle
    description: Department caps (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Capitalization"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.common_idioms
    domain: ap-compatible
    type: toggle
    description: Common idioms (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Common-idiom correction"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.repeated_punctuation
    domain: ap-compatible
    type: toggle
    description: Repeated punctuation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Typography hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.space_before_punctuation
    domain: ap-compatible
    type: toggle
    description: Space before punctuation (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Typography hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.parens_no_inside_space
    domain: ap-compatible
    type: toggle
    description: Parens no inside space (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Typography hygiene"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.slash_no_spaces
    domain: ap-compatible
    type: toggle
    description: Slash no spaces (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Slash"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.less_vs_fewer
    domain: ap-compatible
    type: toggle
    description: Less vs fewer (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Word Usage"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.that_vs_who
    domain: ap-compatible
    type: toggle
    description: That vs who (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Word Usage"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.phone_number_format
    domain: ap-compatible
    type: toggle
    description: Phone number format (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Phone Numbers"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.currency_drop_zero_cents
    domain: ap-compatible
    type: toggle
    description: Currency drop zero cents (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "AP Stylebook—Money"
      rationale: AP Stylebook default; override with value:false to disable for a selector

  - id: ap.hashtag_camelcase
    domain: ap-compatible
    type: toggle
    description: Hashtag camelcase (AP default)
    machine_evaluable: true
    enforcement_target: rectifier
    default:
      value: true
      source: "Social-media style"
      rationale: AP Stylebook default; override with value:false to disable for a selector
