{
  "version": "0.1.0",
  "updatedAt": "2026-07-02",
  "rules": [
    {
      "id": "guardrail.seo.project_ontology_not_global_truth",
      "severity": "error",
      "summary": "Per-project SEO ontology is versioned project evidence; it must not be silently promoted into global Ontology Core truth.",
      "entityIds": ["seo.project_ontology", "future.domain_package"]
    },
    {
      "id": "guardrail.seo.keywords_are_project_evidence",
      "severity": "error",
      "summary": "Keywords, Wordstat rows, SERP rows, and forecasts are project evidence, not reusable ontology roots.",
      "entityIds": ["seo.keyword", "seo.market_signal", "seo.project_ontology"]
    },
    {
      "id": "guardrail.seo.scope_contract_required",
      "severity": "error",
      "summary": "Semantic analysis, keyword map, rewrite, validation, and changeset must be bounded by an approved scope contract.",
      "entityIds": ["seo.scope_contract", "seo.scope_item", "seo.semantic_profile", "seo.change_set"]
    },
    {
      "id": "guardrail.seo.wordstat_requires_anchor_review",
      "severity": "error",
      "summary": "Wordstat/SERP collection must use only human-approved semantic anchors from anchor review, never raw site text or model auto proposals.",
      "entityIds": ["seo.semantic_anchor", "seo.anchor_review", "seo.wordstat_queue", "seo.market_signal"]
    },
    {
      "id": "guardrail.seo.strategy_requires_curated_keywords",
      "severity": "error",
      "summary": "Strategy and optimization plan must consume curated keyword role decisions, not raw provider rows or unreviewed normalization output.",
      "entityIds": ["seo.keyword_curation_board", "seo.keyword_role_decision", "seo.keyword_map", "seo.optimization_plan"]
    },
    {
      "id": "guardrail.seo.future_landing_gap_non_blocking",
      "severity": "error",
      "summary": "Future landing gaps are strategy context only; they must not force materialization, rewrite, or random existing page selection without explicit promotion.",
      "entityIds": ["seo.future_landing_gap", "seo.landing_section_mapping", "seo.rewrite_eligibility", "seo.rewrite_variant"]
    },
    {
      "id": "guardrail.seo.rewrite_requires_existing_binding",
      "severity": "error",
      "summary": "Rewrite variants require approved existing page/section/content-field bindings and must not be generated for unresolved future gaps.",
      "entityIds": ["seo.rewrite_eligibility", "seo.semantic_block", "seo.section", "seo.rewrite_variant"]
    },
    {
      "id": "guardrail.seo.apply_requires_validation",
      "severity": "error",
      "summary": "SEO apply/export requires explicit changeset, final validation, dry-run/backup boundary, and app-owned adapter execution.",
      "entityIds": ["seo.change_set", "seo.validation_result", "seo.apply_result", "assistant.action"]
    },
    {
      "id": "guardrail.seo.ontology_core_does_not_apply",
      "severity": "error",
      "summary": "Ontology Core may resolve SEO action context but must not mutate site sources or execute SEO apply.",
      "entityIds": ["seo.change_set", "assistant.action", "agent.scope", "agent.audit_event"]
    },
    {
      "id": "guardrail.seo.expansion_is_future_optional_branch",
      "severity": "warning",
      "summary": "Expansion opportunities are a future optional branch after core analysis and market evidence; they must not replace current site context by default.",
      "entityIds": ["seo.expansion_opportunity", "seo.market_signal", "seo.optimization_plan"]
    }
  ],
  "blockedConflations": [
    ["seo.project_ontology", "future.domain_package"],
    ["seo.keyword", "future.domain_package"],
    ["seo.semantic_anchor", "seo.market_signal"],
    ["seo.anchor_review", "seo.market_signal"],
    ["seo.market_signal", "seo.intent_cluster"],
    ["seo.keyword_curation_board", "seo.keyword_map"],
    ["seo.future_landing_gap", "seo.page"],
    ["seo.expansion_opportunity", "seo.optimization_plan"],
    ["seo.change_set", "assistant.action"]
  ]
}
