{
  "generatedAt": "2026-10-07T04:33:45.556Z",
  "entries": [
    {
      "date": "2026-10-07",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "（未填写说明）",
      "summary": {
        "total": 0,
        "added": 0,
        "removed": 0,
        "changed": 0,
        "breaking": 0
      },
      "changes": []
    },
    {
      "date": "2026-10-07",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "（未填写说明）",
      "summary": {
        "total": 72,
        "added": 36,
        "removed": 0,
        "changed": 36,
        "breaking": 32
      },
      "changes": [
        {
          "target": "api",
          "kind": "changed",
          "key": "GET /api/admin/engines/trust",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "GET /api/admin/engines/trust",
          "breaking": true,
          "detail": "权限点 （无） → engine:install：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/:id/rollback",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/:id/rollback",
          "breaking": true,
          "detail": "权限点 （无） → engine:install：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/disable-third-party",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/disable-third-party",
          "breaking": true,
          "detail": "权限点 （无） → engine:install：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/install",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/install",
          "breaking": true,
          "detail": "权限点 （无） → engine:install：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/trust",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/engines/trust",
          "breaking": true,
          "detail": "权限点 （无） → engine:install：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/upload",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "POST /api/admin/upload",
          "breaking": true,
          "detail": "权限点 （无） → media:manage：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/engines/:id/license",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/engines/:id/license",
          "breaking": true,
          "detail": "权限点 （无） → engine:install：**已分配的角色需要重新分配**"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/home-content",
          "breaking": true,
          "detail": "访问要求 JWT → RBAC：原来能直接调的地方会开始失败"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/home-content",
          "breaking": true,
          "detail": "权限点 （无） → page:edit：**已分配的角色需要重新分配**"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminRole · 字段 /*",
          "breaking": true,
          "detail": "新增**必填**字段 /*（内置组排在前面（顺序即选项顺序，稳定）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminRole · 字段 sort",
          "breaking": true,
          "detail": "新增**必填**字段 sort（Int）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 （沿用角色的全部权限）✓。理由：站主给自己账号加了限制、或者批量给老账号一个默认值，",
          "breaking": true,
          "detail": "新增**必填**字段 （沿用角色的全部权限）✓。理由：站主给自己账号加了限制、或者批量给老账号一个默认值，（undefined）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 /*",
          "breaking": true,
          "detail": "新增**必填**字段 /*（指定语言。⚠️）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 ⚠️",
          "breaking": true,
          "detail": "新增**必填**字段 ⚠️（【空）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 不许让人以为设了就有用",
          "breaking": true,
          "detail": "新增**必填**字段 不许让人以为设了就有用（✓。）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 存的是",
          "breaking": true,
          "detail": "新增**必填**字段 存的是（CREATE）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 都可能**把自己关在外面**",
          "breaking": true,
          "detail": "新增**必填**字段 都可能**把自己关在外面**（✓）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 可空列的多",
          "breaking": true,
          "detail": "新增**必填**字段 可空列的多（NULL）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 取值见",
          "breaking": true,
          "detail": "新增**必填**字段 取值见（server/utils/admin/scopes.ts）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 取值见同一文件的",
          "breaking": true,
          "detail": "新增**必填**字段 取值见同一文件的（FEATURE_SCOPES）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 它挡的是\"两个管理员写同一个手机号",
          "breaking": true,
          "detail": "新增**必填**字段 它挡的是\"两个管理员写同一个手机号（⇒）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 下面三组字段回答的是同一个问题：**这个账号能碰什么**。",
          "breaking": true,
          "detail": "新增**必填**字段 下面三组字段回答的是同一个问题：**这个账号能碰什么**。（undefined）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 这一维现在**先落库**，存的是多语言功能开放后要用的判据（现在还没有任何出口读它）——",
          "breaking": true,
          "detail": "新增**必填**字段 这一维现在**先落库**，存的是多语言功能开放后要用的判据（现在还没有任何出口读它）——（界面上必须写明这一点）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 status",
          "breaking": true,
          "detail": "新增**必填**字段 status（String）：旧调用方不带它会被拒"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "NotifyLog · 字段 body",
          "breaking": true,
          "detail": "新增**必填**字段 body（String）：旧调用方不带它会被拒"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "DELETE /api/admin/backup/:name",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "DELETE /api/admin/staff/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/backup",
          "breaking": false,
          "detail": "新增接口（权限点 backup:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/backup/download",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/blocks",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/content-snippets",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/friend-links",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/members/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/members/export",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/metrics",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/staff",
          "breaking": false,
          "detail": "新增接口（权限点 staff:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/staff/options",
          "breaking": false,
          "detail": "新增接口（权限点 staff:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/developer/source",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/engine/packages",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/engine/packages/:type/:id/download",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/engine/packages/:type/:id/source",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/friend-links",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/member/messages",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/taxonomy/tags",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/taxonomy/tags/:slug",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PATCH /api/member/messages",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/backup/create",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/backup/restore",
          "breaking": false,
          "detail": "新增接口（权限点 backup:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/backup/restore-commit",
          "breaking": false,
          "detail": "新增接口（权限点 backup:restore）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/notify/broadcast",
          "breaking": false,
          "detail": "新增接口（权限点 notify:broadcast）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/notify/logs/:id/retry",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/staff",
          "breaking": false,
          "detail": "新增接口（权限点 staff:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/content-snippets",
          "breaking": false,
          "detail": "新增接口（权限点 page:edit）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/dashboard",
          "breaking": false,
          "detail": "新增接口（权限点 site:config）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/friend-links",
          "breaking": false,
          "detail": "新增接口（权限点 nav:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/staff/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminRole · 字段 label",
          "breaking": false,
          "detail": "新增可选字段 label（String?）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 email",
          "breaking": false,
          "detail": "新增可选字段 email（String?）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 lastLoginAt",
          "breaking": false,
          "detail": "新增可选字段 lastLoginAt（DateTime?）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "AdminUser · 字段 phone",
          "breaking": false,
          "detail": "新增可选字段 phone（String?）"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/backup",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/console/messages",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/tag/:slug",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/tags",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "spec",
          "kind": "added",
          "key": "清单字段 blocks",
          "breaking": false,
          "detail": "清单新增字段"
        }
      ]
    },
    {
      "date": "2026-10-05",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "补齐自 2026-09-30 以来未落账的清单（54 项）。内容基座：SiteText 文案覆盖、Term/TermLink 分类、SearchTerm 热搜词、首页内容接口；会员体系：Member 表与会员/开发者自助接口；通知中心：Notification 站内信表、NotifyLog 投递记录表、后台 4 条接口（channels/test/logs/messages），六条通道（站内信/邮件/企业微信/飞书/短信/公众号）；另含站点配置与侧栏治理相关接口。⚠️ 含 1 项破坏性变更：PUT /api/admin/pages/:key 新增必填字段 blocks（array[]），不带该字段的旧调用方会被拒 —— 影响面是后台接口，扩展若有调用需同步。",
      "summary": {
        "total": 54,
        "added": 50,
        "removed": 0,
        "changed": 4,
        "breaking": 1
      },
      "changes": [
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/pages/:key · 字段 blocks",
          "breaking": true,
          "detail": "新增**必填**字段 blocks（array[]）：旧调用方不带它会被拒"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/home-content",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/members",
          "breaking": false,
          "detail": "新增接口（权限点 member:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/notify/channels",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/notify/logs",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/notify/messages",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/search-terms",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/sidebar",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/site-pages",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/auth/me",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/developer/me",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/home-content",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/member/leads",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/search",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/search/hot",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/site-texts",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PATCH /api/admin/notify/messages",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PATCH /api/member/profile",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/notify/test",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/auth/forgot",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/auth/login",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/auth/logout",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/auth/register",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/auth/reset",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/developer/packages/commit",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/developer/packages/inspect",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/member/password",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/search/hit",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/home-content",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/members/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/site-texts/:key",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "Lead · 字段 memberId",
          "breaking": false,
          "detail": "新增可选字段 memberId（String?）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "Member",
          "breaking": false,
          "detail": "新增数据表 Member（9 个字段）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "Notification",
          "breaking": false,
          "detail": "新增数据表 Notification（10 个字段）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "NotifyLog",
          "breaking": false,
          "detail": "新增数据表 NotifyLog（10 个字段）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "PageContent · 字段 blocks",
          "breaking": false,
          "detail": "新增可选字段 blocks（Json?）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "PageContent · 字段 locale",
          "breaking": false,
          "detail": "新增可选字段 locale（String?）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "SearchTerm",
          "breaking": false,
          "detail": "新增数据表 SearchTerm（4 个字段）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "SiteText",
          "breaking": false,
          "detail": "新增数据表 SiteText（4 个字段）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "Term",
          "breaking": false,
          "detail": "新增数据表 Term（5 个字段）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "TermLink",
          "breaking": false,
          "detail": "新增数据表 TermLink（4 个字段）"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/account",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/account/security",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/home",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/members",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/notify",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/site-texts",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/console",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/console/demo",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/developer",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/login",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/register",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/reset-password",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/search",
          "breaking": false,
          "detail": "新增页面路由"
        }
      ]
    },
    {
      "date": "2026-09-25",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "M4 平台与运维：新增 GET /api/health（DB/Redis 探测，失败 503，compose 已挂 healthcheck）；表单基座（POST/GET/PUT/DELETE /api/admin/forms 与提交记录/CSV 导出，form:manage 权限；公开 GET /api/forms/{key} 与 POST /api/forms/{key}/submit，蜜罐+IP 限频）；请求日志中间件（≥400 或 ≥1s 才记）；通知抽成通用通道 notifyText",
      "summary": {
        "total": 11,
        "added": 11,
        "removed": 0,
        "changed": 0,
        "breaking": 0
      },
      "changes": [
        {
          "target": "api",
          "kind": "added",
          "key": "DELETE /api/admin/forms/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/forms",
          "breaking": false,
          "detail": "新增接口（权限点 form:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/forms/:id/export",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/forms/:id/submissions",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/forms/:key",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/health",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/forms",
          "breaking": false,
          "detail": "新增接口（权限点 form:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/forms/:key/submit",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/forms/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "Form",
          "breaking": false,
          "detail": "新增数据表 Form（7 个字段）"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/forms",
          "breaking": false,
          "detail": "新增页面路由"
        }
      ]
    },
    {
      "date": "2026-09-25",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "M3 内容与媒体：新增后台页面 POST /api/admin/pages 与 DELETE /api/admin/pages/{key}（page:edit；保留字与保护页限制）；公开 GET /api/pages 仅返回已发布页面；新增 GET /api/admin/pages（后台清单，此前缺失）；新增媒体库 GET /api/admin/media、PUT/DELETE /api/admin/media/{id}（删除前查引用，409 提示引用位置）；上传即登记 MediaAsset；sitemap 收录已发布内容页",
      "summary": {
        "total": 12,
        "added": 8,
        "removed": 0,
        "changed": 4,
        "breaking": 1
      },
      "changes": [
        {
          "target": "model",
          "kind": "changed",
          "key": "PageContent · 字段 published",
          "breaking": true,
          "detail": "新增**必填**字段 published（Boolean）：旧调用方不带它会被拒"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "DELETE /api/admin/media/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "DELETE /api/admin/pages/:key",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/media",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/pages",
          "breaking": false,
          "detail": "新增接口（权限点 page:edit）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/media/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/pages/:key · 字段 published",
          "breaking": false,
          "detail": "新增可选字段 published（boolean）"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/pages/:key · 字段 summary",
          "breaking": false,
          "detail": "新增可选字段 summary（string）"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "MediaAsset",
          "breaking": false,
          "detail": "新增数据表 MediaAsset（7 个字段）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "PageContent · 字段 summary",
          "breaking": false,
          "detail": "新增可选字段 summary（String?）"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/:slug",
          "breaking": false,
          "detail": "新增页面路由"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/media",
          "breaking": false,
          "detail": "新增页面路由"
        }
      ]
    },
    {
      "date": "2026-09-25",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "M2 设置统一：站点配置后台读取按注册表下发（修复 GET /api/admin/site-config 缺失导致后台页一直为空）；PageContent 新增页面级设置（PUT /api/admin/pages/{key} 可带 settings）；内容契约 v1.0.0 增补 pages.settings 与 mergeSettings（页面级 > 包级）；useEngineSettings 支持按页覆盖",
      "summary": {
        "total": 3,
        "added": 0,
        "removed": 0,
        "changed": 3,
        "breaking": 0
      },
      "changes": [
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/pages/:key · 字段 content",
          "breaking": false,
          "detail": "新增可选字段 content（string）"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/pages/:key · 字段 settings",
          "breaking": false,
          "detail": "新增可选字段 settings（record）"
        },
        {
          "target": "model",
          "kind": "changed",
          "key": "PageContent · 字段 settings",
          "breaking": false,
          "detail": "新增可选字段 settings（Json?）"
        }
      ]
    },
    {
      "date": "2026-09-25",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "M1 契约与导航：新增公开导航 GET /api/nav?scope=main|footer（空库回落内置默认结构；停用父项=整支隐藏）；新增后台导航管理 GET/POST /api/admin/nav、PUT/DELETE /api/admin/nav/{id}、POST /api/admin/nav/{id}/move（nav:manage 权限）；内容契约升级 v1.0.0（新增 nav 形状与类型，changelog 增加 updateType/content/items）",
      "summary": {
        "total": 8,
        "added": 8,
        "removed": 0,
        "changed": 0,
        "breaking": 0
      },
      "changes": [
        {
          "target": "api",
          "kind": "added",
          "key": "DELETE /api/admin/nav/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/admin/nav",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "GET /api/nav",
          "breaking": false,
          "detail": "新增接口（公开）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/nav",
          "breaking": false,
          "detail": "新增接口（权限点 nav:manage）"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/nav/:id/move",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "PUT /api/admin/nav/:id",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "model",
          "kind": "added",
          "key": "NavItem",
          "breaking": false,
          "detail": "新增数据表 NavItem（11 个字段）"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/nav",
          "breaking": false,
          "detail": "新增页面路由"
        }
      ]
    },
    {
      "date": "2026-09-25",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "M0 止血：上传从公开端点 /api/upload 收敛到 /api/admin/upload（写文件的端点不能公开）；删除与 WebVitalRecord 列不匹配、假成功的 /api/metrics 死接口（前端采集已改指 /api/metrics/web-vitals）；站点配置接入注册表（未注册键拒绝写入、secret 键不公开、bool/number 归一化、系统键只读）；新增自助改密 POST /api/admin/me/password",
      "summary": {
        "total": 8,
        "added": 3,
        "removed": 2,
        "changed": 3,
        "breaking": 5
      },
      "changes": [
        {
          "target": "api",
          "kind": "removed",
          "key": "POST /api/metrics",
          "breaking": true,
          "detail": "接口被移除"
        },
        {
          "target": "api",
          "kind": "removed",
          "key": "POST /api/upload",
          "breaking": true,
          "detail": "接口被移除"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/site-config/:key · 字段 create",
          "breaking": true,
          "detail": "新增**必填**字段 create（unknown）：旧调用方不带它会被拒"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/site-config/:key · 字段 update",
          "breaking": true,
          "detail": "新增**必填**字段 update（unknown）：旧调用方不带它会被拒"
        },
        {
          "target": "api",
          "kind": "changed",
          "key": "PUT /api/admin/site-config/:key · 字段 where",
          "breaking": true,
          "detail": "新增**必填**字段 where（unknown）：旧调用方不带它会被拒"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/me/password",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "api",
          "kind": "added",
          "key": "POST /api/admin/upload",
          "breaking": false,
          "detail": "新增接口"
        },
        {
          "target": "page",
          "kind": "added",
          "key": "/admin/account",
          "breaking": false,
          "detail": "新增页面路由"
        }
      ]
    },
    {
      "date": "2026-09-24",
      "engineVersion": "1.0.0",
      "siteVersion": "",
      "note": "建立变更记录基线",
      "summary": {
        "total": 0,
        "added": 0,
        "removed": 0,
        "changed": 0,
        "breaking": 0
      },
      "changes": []
    }
  ]
}
