{
  "categories": [
    {
      "name": "HTTP API operations",
      "page": "developers/api",
      "source": "router (routes::inventory)",
      "total": 795,
      "covered": 795,
      "missing": []
    },
    {
      "name": "Cancellable request hook points (mutating routes)",
      "page": "developers/cancellable",
      "source": "POST/PUT/PATCH/DELETE routes under /api/v1 (not /api/v1/addons/)",
      "total": 459,
      "covered": 459,
      "missing": []
    },
    {
      "name": "Events",
      "page": "developers/events",
      "source": "pelty_extensions::events::REGISTRY",
      "total": 38,
      "covered": 38,
      "missing": []
    },
    {
      "name": "Cancellable / modifiable events",
      "page": "developers/cancellable",
      "source": "REGISTRY (cancellable or modifiable)",
      "total": 4,
      "covered": 4,
      "missing": []
    },
    {
      "name": "Event payload keys",
      "page": "developers/events",
      "source": "REGISTRY payload",
      "total": 113,
      "covered": 113,
      "missing": []
    },
    {
      "name": "Pre-events in hooks",
      "page": "developers/hooks",
      "source": "REGISTRY (kind Pre)",
      "total": 4,
      "covered": 4,
      "missing": []
    },
    {
      "name": "Hook phases",
      "page": "developers/hooks",
      "source": "pelty_wasm::PHASES",
      "total": 4,
      "covered": 4,
      "missing": []
    },
    {
      "name": "Mixin positions",
      "page": "developers/hooks",
      "source": "pelty_api::addon_events::MIXIN_AT",
      "total": 4,
      "covered": 4,
      "missing": []
    },
    {
      "name": "Hook / Mixin fields",
      "page": "developers/hooks",
      "source": "runtime.rs Hook, Mixin",
      "total": 9,
      "covered": 9,
      "missing": []
    },
    {
      "name": "UI page slots (one route key per page)",
      "page": "developers/widgets",
      "source": "frontend/src/App.tsx routes",
      "total": 109,
      "covered": 109,
      "missing": []
    },
    {
      "name": "Named UI slots",
      "page": "developers/widgets",
      "source": "<PluginSlot>/<PluginWidgets> calls",
      "total": 11,
      "covered": 11,
      "missing": []
    },
    {
      "name": "Layout slot positions",
      "page": "developers/widgets",
      "source": "ui_schema::LAYOUT_POSITIONS",
      "total": 4,
      "covered": 4,
      "missing": []
    },
    {
      "name": "UI node types",
      "page": "developers/ui",
      "source": "ui_schema::NODE_TYPES",
      "total": 54,
      "covered": 54,
      "missing": []
    },
    {
      "name": "Capabilities fields",
      "page": "developers/capabilities",
      "source": "runtime.rs Capabilities",
      "total": 19,
      "covered": 19,
      "missing": []
    },
    {
      "name": "Package permissions",
      "page": "developers/capabilities",
      "source": "pelty_api::addons::PERMISSIONS",
      "total": 6,
      "covered": 6,
      "missing": []
    },
    {
      "name": "Manifest fields",
      "page": "developers/manifest",
      "source": "addons.rs Manifest",
      "total": 18,
      "covered": 18,
      "missing": []
    },
    {
      "name": "WIT host/guest functions",
      "page": "developers/wit",
      "source": "crates/pelty-wasm/wit/pelty.wit",
      "total": 18,
      "covered": 18,
      "missing": []
    },
    {
      "name": "Environment variables",
      "page": "developers/configuration",
      "source": "extract::env_vars (string literals in crates/*/src)",
      "total": 32,
      "covered": 32,
      "missing": []
    },
    {
      "name": "Settings keys",
      "page": "developers/settings-keys",
      "source": "settings::get/set calls + raw SQL",
      "total": 36,
      "covered": 36,
      "missing": []
    },
    {
      "name": "General settings fields",
      "page": "developers/settings-keys",
      "source": "general_settings.rs structs",
      "total": 31,
      "covered": 31,
      "missing": []
    },
    {
      "name": "Email templates",
      "page": "developers/email-templates",
      "source": "pelty_notifications::template::TEMPLATES",
      "total": 49,
      "covered": 49,
      "missing": []
    },
    {
      "name": "Scheduled tasks",
      "page": "developers/scheduled-tasks",
      "source": "automation::TASKS",
      "total": 9,
      "covered": 9,
      "missing": []
    },
    {
      "name": "Background job kinds",
      "page": "developers/scheduled-tasks",
      "source": "JOB_KIND consts",
      "total": 17,
      "covered": 17,
      "missing": []
    },
    {
      "name": "Migrations",
      "page": "developers/migrations",
      "source": "migrations/",
      "total": 104,
      "covered": 104,
      "missing": []
    },
    {
      "name": "Addons (one page each)",
      "page": "developers/addon-*",
      "source": "extensions/*/*/addon.json",
      "total": 66,
      "covered": 66,
      "missing": []
    },
    {
      "name": "Addon settings and module fields",
      "page": "developers/addon-*",
      "source": "addon.json settings, SettingField / module fields in the source",
      "total": 256,
      "covered": 256,
      "missing": []
    },
    {
      "name": "Admin pages listed (user docs)",
      "page": "admin-map",
      "source": "frontend navRegistry ADMIN_NAV",
      "total": 71,
      "covered": 71,
      "missing": []
    },
    {
      "name": "Client pages listed (user docs)",
      "page": "client-map",
      "source": "frontend navRegistry CLIENT_NAV_TREE",
      "total": 21,
      "covered": 21,
      "missing": []
    },
    {
      "name": "Setup checklist steps",
      "page": "admin-setup",
      "source": "setup_wizard.rs steps",
      "total": 8,
      "covered": 8,
      "missing": []
    }
  ],
  "api_schema": {
    "operations": 795,
    "with_schema": 638,
    "stubs": 157,
    "stubs_by_group": {
      "": 11,
      "account": 6,
      "addons": 2,
      "admin": 99,
      "auth": 9,
      "captcha": 2,
      "client": 6,
      "compat": 1,
      "oauth": 2,
      "openapi.json": 1,
      "plugins": 2,
      "public": 9,
      "sso": 4,
      "store": 2,
      "themes": 1
    }
  },
  "not_covered": [
    "157 of 795 HTTP operations have no hand-written request/response schema (marked \"registered route\"): method, path, handler and source file only.",
    "Admin pages only listed in the admin area map, without a guide section: `/admin`, `/admin/customers`, `/admin/users`, `/admin/client-groups`, `/admin/client-fields`, `/admin/csv-import`, `/admin/campaigns`, `/admin/coupons`, `/admin/tracked-links`, `/admin/affiliates`, `/admin/website`, `/admin/themes`, `/admin/addons`, `/admin/plugins`, `/admin/api-keys`, `/admin/developer-docs`, `/admin/oauth-clients`, `/admin/saml`, `/admin/email-templates`, `/admin/translations`, `/admin/notifications`, `/admin/reports`, `/admin/system-health`, `/admin/jobs`, `/admin/audit`, `/admin/backups`.",
    "Client pages only listed in the client area map, without a guide section: `/dashboard`.",
    "Admin routes that are not in the navigation (reached from other pages) are not described in the user docs: `/admin/settings`.",
    "Routes outside `/api/v1` are listed in the API reference but have no request events or mixins (the addon hook layer only wraps `/api/v1`): `/.well-known/openid-configuration`, `/api/openapi.json`, `/docs`, `/docs/`, `/docs/{*path}`, `/healthz`, `/includes/api.php`, `/oauth/jwks`, `/oauth/revoke`, `/oauth/token`, `/oauth/userinfo`, `/readyz`.",
    "Plugins (`extensions/plugins/*/plugin.json`) and themes (`extensions/themes/*`) have no per-item reference page; they are covered by the Plugins and Themes guides.",
    "User-guide prose (what a button does, how a flow works) is written by hand and checked by review, not by tests; only the tables in it are generated."
  ]
}