{
  "version": "0.1.0",
  "updatedAt": "2026-07-02",
  "apps": [
    {
      "id": "seo",
      "name": "NDC SEO mod",
      "authorityEntityIds": ["seo.project", "seo.site", "seo.scope_contract", "seo.change_set"],
      "adapterId": "adapter.seo.module_api",
      "summary": "Owns SEO project source/crawl, project ontology extraction, semantic analysis, market evidence, planning, validation, changesets, and apply/export."
    }
  ],
  "actions": [
    {
      "id": "seo.project.read_context",
      "app": "seo",
      "domain": "projects",
      "intentAliases": ["show seo project", "show site seo context", "покажи seo проект", "покажи сео проект", "покажи контекст сайта"],
      "entityIds": ["seo.project", "seo.site", "seo.scope_contract", "seo.project_ontology"],
      "capabilityIds": ["assistant.seo_read"],
      "riskLevel": "read",
      "confirmationMode": "none",
      "selfActionPolicy": "allowed",
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Read SEO project context visible to the actor."
    },
    {
      "id": "seo.project.scan",
      "app": "seo",
      "domain": "scan",
      "intentAliases": ["scan seo project", "scan site", "run seo scan", "просканируй сайт", "запусти seo scan", "запусти скан сайта"],
      "entityIds": ["seo.project", "seo.source", "seo.scan_version"],
      "capabilityIds": ["assistant.seo_run_analysis"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_run_scan"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Run SEO project scan and create a new scan_version artifact."
    },
    {
      "id": "seo.ontology.extract",
      "app": "seo",
      "domain": "ontology",
      "intentAliases": ["extract project ontology", "build site ontology", "определи онтологию сайта", "собери онтологию проекта"],
      "entityIds": ["seo.project", "seo.project_ontology", "seo.semantic_profile"],
      "capabilityIds": ["assistant.seo_run_analysis"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_run_analysis"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Extract per-project site ontology from approved source/scope evidence."
    },
    {
      "id": "seo.semantic.analyze",
      "app": "seo",
      "domain": "semantic",
      "intentAliases": ["run semantic analysis", "analyze seo semantics", "проанализируй семантику", "запусти semantic analysis"],
      "entityIds": ["seo.semantic_profile", "seo.intent_cluster", "seo.demand_universe", "seo.semantic_anchor"],
      "capabilityIds": ["assistant.seo_run_analysis"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_run_analysis"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Run semantic analysis bounded by ProjectOntologyInstance and scope contract."
    },
    {
      "id": "seo.anchor_review.approve",
      "app": "seo",
      "domain": "market",
      "intentAliases": ["approve seo anchors", "approve wordstat anchors", "зафиксируй ключи", "подтверди якоря", "зафиксируй смысловые якоря"],
      "entityIds": ["seo.semantic_anchor", "seo.anchor_review", "seo.wordstat_queue"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_collect_market_evidence"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Create or update the human-approved anchor review and Wordstat queue before provider collection."
    },
    {
      "id": "seo.market.collect_wordstat",
      "app": "seo",
      "domain": "market",
      "intentAliases": ["collect wordstat", "run wordstat", "собери wordstat", "собери частотности", "запусти вордстат"],
      "entityIds": ["seo.anchor_review", "seo.wordstat_queue", "seo.seed_query", "seo.market_signal", "seo.keyword"],
      "capabilityIds": ["assistant.seo_run_analysis"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_collect_market_evidence"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Collect Wordstat market evidence only for the human-approved Wordstat queue."
    },
    {
      "id": "seo.keyword.curate",
      "app": "seo",
      "domain": "keywords",
      "intentAliases": ["curate keywords", "sort keyword board", "распредели вес ключей", "разложи ключи", "отсортируй ключи"],
      "entityIds": ["seo.keyword", "seo.keyword_curation_board", "seo.keyword_role_decision"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_plan_changes"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Pre-sort external keyword candidates into unresolved, landing core, supporting core, differentiators, or long tail lanes for human review."
    },
    {
      "id": "seo.keyword.map",
      "app": "seo",
      "domain": "keywords",
      "intentAliases": ["build keyword map", "map keywords", "собери keyword map", "распредели ключи", "составь карту ключей"],
      "entityIds": ["seo.keyword", "seo.keyword_curation_board", "seo.keyword_role_decision", "seo.keyword_map", "seo.scope_item"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_plan_changes"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Build keyword map from curated keyword role decisions and approved scope items."
    },
    {
      "id": "seo.mapping.approve",
      "app": "seo",
      "domain": "plan",
      "intentAliases": ["approve landing mapping", "approve section mapping", "утверди посадочные", "утверди маппинг секций"],
      "entityIds": ["seo.keyword_map", "seo.landing_section_mapping", "seo.future_landing_gap", "seo.scope_item"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_plan_changes"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Approve keyword landing/section mapping and keep future landing gaps non-blocking until explicit promotion."
    },
    {
      "id": "seo.plan.build",
      "app": "seo",
      "domain": "plan",
      "intentAliases": ["build optimization plan", "prepare seo plan", "собери план оптимизации", "подготовь seo план"],
      "entityIds": ["seo.keyword_map", "seo.landing_section_mapping", "seo.future_landing_gap", "seo.optimization_plan", "seo.scope_contract"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_plan_changes"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Build SEO optimization plan before rewrite."
    },
    {
      "id": "seo.rewrite.propose",
      "app": "seo",
      "domain": "rewrite",
      "intentAliases": ["propose rewrite variants", "generate seo variants", "предложи варианты текста", "сгенерируй rewrite variants"],
      "entityIds": ["seo.optimization_plan", "seo.rewrite_eligibility", "seo.semantic_block", "seo.rewrite_variant"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_plan_changes"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Generate rewrite variants into working draft only."
    },
    {
      "id": "seo.validation.run",
      "app": "seo",
      "domain": "validation",
      "intentAliases": ["run seo validation", "validate seo changes", "проверь seo изменения", "запусти финальную проверку"],
      "entityIds": ["seo.validation_result", "seo.change_set", "seo.rewrite_variant"],
      "capabilityIds": ["assistant.seo_plan_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_validate_changes"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Run final SEO validation before changeset apply/export."
    },
    {
      "id": "seo.change_set.preview",
      "app": "seo",
      "domain": "changesets",
      "intentAliases": ["preview seo changeset", "show seo diff", "покажи seo diff", "покажи changeset"],
      "entityIds": ["seo.change_set", "seo.validation_result"],
      "capabilityIds": ["assistant.seo_read"],
      "riskLevel": "read",
      "confirmationMode": "none",
      "selfActionPolicy": "allowed",
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Preview SEO changeset and validation state without applying changes."
    },
    {
      "id": "seo.change_set.apply",
      "app": "seo",
      "domain": "changesets",
      "intentAliases": ["apply seo changes", "apply seo changeset", "примени seo изменения", "примени changeset"],
      "entityIds": ["seo.change_set", "seo.validation_result", "seo.apply_result"],
      "capabilityIds": ["assistant.seo_apply_changes"],
      "riskLevel": "write",
      "confirmationMode": "explicit",
      "selfActionPolicy": "allowed",
      "requiredScopes": ["seo.project.can_apply_change_set"],
      "adapterId": "adapter.seo.module_api",
      "adapterStatus": "future",
      "summary": "Apply an approved SEO changeset through SEO-owned adapter after validation, backup, idempotency, and explicit confirmation."
    }
  ]
}
