oh-my-muse/design-docs/后端-05-统一API契约-v1.md
zizi 0d0e1d4473 添加产品设计文档
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-20 10:38:31 +08:00

25 KiB
Raw Blame History

后端-05统一 API(接口) 契约-v1

  • 版本v5
  • 更新日期2026-05-13
  • 目标读者:前端/后端/架构/测试
  • 阅读时间35-55 分钟
  • 边界说明:本文件只定义外部 API(接口)分组、资源语义、关键请求/响应、错误模型与异步交互;底层表结构看 后端-04-统一数据库Schema-v1.md,生命周期与状态跳转看 架构-04-状态机与约束清单.md。本文描述目标 API不代表当前代码都已实现。

1. 目标

这份 API 只服务一个原则:管理员(Admin)控制系统能力,普通用户(User)控制作品事实AI 只能产出待审对象,用户显式决策后才会进入 Canonical(规范数据)。

因此 v1 API 明确拆成三组:

  • Admin APIs管理员控制台(Admin Console)接口管理元数据、Prompt、Agent、全局知识库、访问策略、New-API 用户同步、评测集、用户和系统日志。
  • User Workspace APIs用户工作区(User Workspace)接口,服务我的作品、作品工作台、写作、规划、局域知识库、授权全局知识检索、导入解析、导出交付和生成候选。
  • Personal Center APIs个人中心(Personal Center)接口服务个人信息、Token 使用、生成记录总览、配额、套餐和授权摘要。

普通用户不能访问 Admin APIs管理员接口也不能替普通用户确认单个作品的候选、写正文或做作品知识取舍。

2. 通用约定

2.1 Base URL

  • Base URL/api/v1
  • 数据格式:application/json; charset=utf-8
  • 文件上传:multipart/form-data

2.2 认证与权限

  • 认证授权基座Sa-Token。
  • 访问令牌传输方式仍使用 Authorization: Bearer {accessToken};令牌签发、校验、续期和失效由 Sa-Token 或 Sa-Token 适配层负责。
  • refreshToken 只存 HttpOnly + Secure + SameSite=Strict Cookie
  • /auth/refresh 不接受 body 里的 refreshToken
  • 现有自研 Bearer Token 能力必须逐步收敛为 Sa-Token 适配层,避免认证、权限、当前用户解析在多个地方重复实现。
  • Admin APIs 必须校验管理员角色或等价权限。
  • User Workspace APIs 必须先校验登录身份,再校验当前用户对作品、章节、文本块、局域知识库和授权全局知识库的访问权限。
  • Personal Center APIs 只能访问当前登录用户自己的资源。
  • System Job APIs 或后台任务入口必须使用明确服务身份,不得复用普通用户 token 绕过业务确认。
  • 前端隐藏菜单或按钮只做体验优化,不是安全边界。

权限错误统一返回:

{
  "code": "FORBIDDEN",
  "message": "Permission denied",
  "details": {
    "required": "admin",
    "resource": "admin.prompts"
  }
}

2.3 异步模式

  • 任何需要外部 AI、批处理、索引、导出或评测的操作默认返回 202 Accepted
  • 响应体必须包含 jobId 或等价任务 ID。
  • 前端轮询对应 job 端点获取结果。
  • 例外Accept Suggestion(接受建议)返回 200 OK,因为用户最关心的正文合并必须在本次提交内完成;如果触发重新提取,响应里附带 extractionJob

2.4 ID 契约

  • API 对外暴露的所有业务 ID 都是字符串 ID格式和生成规则以 后端-04 的自定义字符串 ID 规则为准。
  • API 不暴露迁移前的数字 ID 或 UUID。全量 ID 迁移完成后,路由参数、请求体和响应体一次性切到 string id。
  • S0-ID 采用停机清库/重建,不提供双写或公开兼容期。
  • 基于当前无重要数据的前提S0-ID 删除现有 schema重建 schema重新执行 migration并重建最小 smoke 数据;原有 ID 不保留、不映射、不进入公开 API 合同。
  • 本地、隔离测试库和当前远程开发库默认允许按 S0-ID 口径清理;执行前必须记录环境标识、数据库连接摘要、操作者和清理范围,不要求快照或备份。

2.5 成功 / 错误响应约定

成功响应可以继续使用领域对象包装;错误响应统一为顶层 code / message / details,不再包在 Result<T>error 节点内。

{
  "code": "REVISION_CONFLICT",
  "message": "Block revision mismatch",
  "details": {
    "currentRevision": 5,
    "blockContent": {
      "type": "doc",
      "content": []
    }
  }
}

3. Common APIs

POST /auth/register

注册并登录普通用户。创建用户后的 New-API 同步由后台或 Admin 配置链路处理,注册接口不直接暴露 New-API 细节。

请求体:

{
  "email": "user@example.com",
  "password": "plain-text-password",
  "displayName": "作者名"
}

响应:201 Created,返回 accessTokenexpiresIn 和当前用户摘要。

错误:400 VALIDATION_ERROR409 EMAIL_ALREADY_EXISTS

POST /auth/login

登录。响应结构同 register

POST /auth/refresh

使用 Cookie 中的 refreshToken 续期。请求体为空。

POST /auth/logout

清除 refresh cookie。响应204 No Content

GET /auth/me

返回当前登录用户、角色、权限摘要和默认入口。普通用户默认入口是我的作品(My Works),管理员可以进入管理员控制台(Admin Console)。

响应至少包含:

{
  "user": {
    "id": "string-id",
    "email": "user@example.com",
    "displayName": "作者名"
  },
  "roles": ["user"],
  "permissions": ["workspace:works:read"],
  "defaultEntry": "my_works"
}

/auth/me 不返回密码哈希、Sa-Token 内部状态、New-API token 或系统 Prompt secret。

4. Admin APIs

Admin APIs 只能由管理员访问。普通用户即使知道 URL也必须得到 403 FORBIDDEN

4.1 元数据 APIs

方法 路径 说明
GET /admin/meta-schemas 查询 MetaSchema 列表,支持 domainscopetargetTypestatus
POST /admin/meta-schemas 创建系统级或模板级 MetaSchema
GET /admin/meta-schemas/{schemaId} 查询 Schema 详情和字段继承结果
PATCH /admin/meta-schemas/{schemaId} 更新名称、描述、状态、可见性默认值
POST /admin/meta-schemas/{schemaId}/fields 新增 MetaField
PATCH /admin/meta-schemas/{schemaId}/fields/{fieldId} 更新字段、校验和可见性

MetaField 可见性字段:

{
  "fieldKey": "motivation",
  "fieldLabel": "角色动机",
  "fieldType": "text",
  "isRequired": false,
  "uiVisible": true,
  "aiContext": true,
  "userEditable": true,
  "userSearchable": true,
  "exportable": true
}

说明:

  • uiVisible=false 不代表不能进入 AI 上下文;是否进入上下文看 aiContext
  • 可见性变更必须触发用户可见投影(User-visible Projection)重建或失效标记。

4.2 Prompt APIs

方法 路径 说明
GET /admin/prompts 查询 Prompt 列表和 active 版本
POST /admin/prompts/{promptKey}/versions 创建 prompt_versions 新版本
GET /admin/prompts/{promptKey}/versions/{version} 查询版本详情
POST /admin/prompts/{promptKey}/versions/{version}/activate 激活版本
POST /admin/prompts/{promptKey}/versions/{version}/disable 停用版本
POST /admin/prompts/{promptKey}/versions/{version}/archive 归档版本

激活响应至少返回:

{
  "promptKey": "generation.default",
  "version": 3,
  "status": "active",
  "activatedAt": "ISO8601"
}

4.3 Agent APIs

方法 路径 说明
GET /admin/agents 查询 Agent 配置
POST /admin/agents/{agentKey}/configs 创建 agent_configs 新版本
POST /admin/agents/{agentKey}/configs/{version}/activate 激活配置
POST /admin/agents/{agentKey}/configs/{version}/disable 停用配置
POST /admin/agents/{agentKey}/test 连通性、超时、fallback 校验

Agent 配置只保存 Muse 侧编排策略,不保存模型供应商路由和成本策略。

4.4 全局知识库 APIs

方法 路径 说明
GET /admin/global-knowledge-bases 查询全局知识库(Global Knowledge Base)
POST /admin/global-knowledge-bases 创建全局知识库
POST /admin/global-knowledge-bases/{kbId}/import 导入资料或绑定外部 dataset
POST /admin/global-knowledge-bases/{kbId}/reindex 重建索引
POST /admin/global-knowledge-bases/{kbId}/activate 启用版本
POST /admin/global-knowledge-bases/{kbId}/disable 停用版本

全局知识库停用后,不得进入新的检索或生成上下文;历史记录保留引用来源。

4.5 全局知识访问策略 APIs

方法 路径 说明
GET /admin/global-knowledge-bases/{kbId}/access-policies 查询访问策略
POST /admin/global-knowledge-bases/{kbId}/access-policies 创建策略
PATCH /admin/global-knowledge-access-policies/{policyId} 更新草稿策略
POST /admin/global-knowledge-access-policies/{policyId}/activate 激活策略
POST /admin/global-knowledge-access-policies/{policyId}/disable 停用策略

请求体关键字段:

{
  "subjectType": "user_group",
  "subjectId": "vip-authors",
  "defaultBound": true,
  "uiVisible": true,
  "userSearchable": true,
  "aiContext": true,
  "userBindable": false,
  "userUnbindable": false,
  "readonly": true
}

没有 active 策略时,全局知识库不得展示、检索或用于生成。

4.6 New-API 用户同步 APIs

方法 路径 说明
GET /admin/new-api/user-bindings 查询 newapi_user_bindings
POST /admin/users/{userId}/new-api/sync 为用户创建或刷新 New-API 绑定
POST /admin/users/{userId}/new-api/retry 重试失败同步
GET /admin/new-api/plan-mappings 查询 newapi_plan_mappings
POST /admin/new-api/plan-mappings 新增 Muse 套餐到 New-API 分组/配额映射
POST /admin/new-api/plan-mappings/{mappingId}/activate 激活映射

说明:

  • 同步必须幂等;失败返回可重试状态和原因。
  • New-API 的模型供应商、路由、分组限流、成本策略和消耗日志不迁入 Muse。

4.7 评测集 APIs

方法 路径 说明
GET /admin/evaluation-datasets 查询评测集(Evaluation Dataset)
POST /admin/evaluation-datasets 创建固定场景、固定数据集和评分标准
POST /admin/evaluation-datasets/{datasetId}/activate 激活评测集
POST /admin/evaluation-datasets/{datasetId}/lock 锁定已用于正式评测的版本
POST /admin/evaluation-runs 启动评测运行(Evaluation Run)
GET /admin/evaluation-runs/{runId} 查询评测结果、置信度和风险结论

评测结论用于系统改进,不替代普通用户对正文和作品知识的最终确认。

首批固定评测场景必须覆盖:续写、改写、描写、作品规划、实体一致性、角色一致性、角色弧光、世界事实、大纲一致性、细纲一致性、叙事手法、伏笔与回收、张力曲线、节奏与信息释放、主题表达、文风匹配、全书解析和长程连载。新增评测场景必须绑定固定输入数据、评分标准、模型评审 prompt、聚合算法和版本。

4.8 用户与系统日志 APIs

方法 路径 说明
GET /admin/users 查询用户
PATCH /admin/users/{userId} 调整状态或封禁信息
GET /admin/roles 查询角色
POST /admin/roles 创建角色
PATCH /admin/roles/{roleId} 更新角色状态、名称或描述
GET /admin/permissions 查询权限点
POST /admin/users/{userId}/roles/{roleId} 给用户分配角色
DELETE /admin/users/{userId}/roles/{roleId} 移除用户角色
POST /admin/roles/{roleId}/permissions/{permissionId} 给角色分配权限
DELETE /admin/roles/{roleId}/permissions/{permissionId} 移除角色权限
GET /admin/system-service-identities 查询系统任务服务身份
POST /admin/system-service-identities 创建或登记服务身份
PATCH /admin/system-service-identities/{serviceIdentityId} 启停或调整服务身份权限范围
GET /admin/system-logs 查询系统日志、任务失败、同步失败
GET /admin/audit-logs 查询审计记录

系统日志不得返回正文全文、密钥、New-API token 或 Prompt secret。

管理员调整角色和权限只改变接口和后台能力边界,不替用户确认单作品正文、规划项、知识草稿或 AI 候选。

5. User Workspace APIs

User Workspace APIs 服务普通用户作品流程。所有接口都必须校验当前用户对 workId 的访问权限。

5.1 Works

方法 路径 说明
GET /works 获取当前用户作品列表,支持搜索、筛选、排序、分页
POST /works 创建作品
GET /works/{workId} 获取作品详情、导入解析摘要和待确认数量
PATCH /works/{workId} 修改标题、简介、状态、作品模板
DELETE /works/{workId} 删除作品及下游数据

GET /works 响应项至少包含:

{
  "id": "string-id",
  "title": "string",
  "status": "writing",
  "wordCount": 45200,
  "chapterCount": 12,
  "parseStatus": "parsed",
  "pendingSuggestionCount": 2,
  "pendingKnowledgeDraftCount": 5,
  "updatedAt": "ISO8601"
}

禁止通过作品接口修改 importedAtparseStatusparseProgressparsedAt 等系统字段。

5.2 Chapters / Blocks

方法 路径 说明
GET /works/{workId}/chapters 返回作品章节树
POST /works/{workId}/chapters 创建章节
PATCH /works/{workId}/chapters/{chapterId} 更新章节标题、摘要、排序
DELETE /works/{workId}/chapters/{chapterId} 删除章节与下属 Block
GET /chapters/{chapterId}/blocks 基于 orderIndex 的 cursor 分页
POST /chapters/{chapterId}/blocks 创建 Block
PUT /blocks/{blockId} 更新 Block必须带 expectedRevision
DELETE /blocks/{blockId} 删除 Block

PUT /blocks/{blockId} 请求体:

{
  "content": {
    "type": "doc",
    "content": []
  },
  "expectedRevision": 3
}

错误:400 EXPECTED_REVISION_MISSING409 REVISION_CONFLICT

5.3 作品规划 APIs

作品规划台(Planning Desk)面向作品设定、章节大纲、世界设定、角色关系和文风检查。底层优先复用 MetaSchema、narrative_states、knowledge_entities、knowledge_relations、Work、Chapter 和 Block不为每个 UI 面板建独立事实源。

方法 路径 说明
GET /works/{workId}/planning 获取当前作品可见规划结构和已确认规划数据
PUT /works/{workId}/planning/{sectionKey} 保存用户确认后的规划项
POST /works/{workId}/planning/{sectionKey}/ai-generate AI 生成、补全、整理、检查或给多组选项
GET /works/{workId}/planning-candidates 获取待确认规划候选
POST /works/{workId}/planning-candidates/{candidateId}/accept 确认规划候选
POST /works/{workId}/planning-candidates/{candidateId}/reject 丢弃规划候选

AI 规划候选仍进入 Shadow(待审层),确认后才成为后续生成上下文。产品语言可以使用“情节节拍 / 场景推进”API 不引入独立 Scene 资源。

5.4 AI Generation / Suggestions

方法 路径 说明
POST /ai/generate 触发续写、改写、描写、检查或规划候选生成
GET /ai/generation-jobs/{jobId} 轮询生成任务
GET /works/{workId}/suggestions 获取待审 Suggestion 列表
GET /works/{workId}/suggestions/{suggestionId} 获取单条待审 Suggestion
POST /works/{workId}/suggestions/{suggestionId}/accept 接受 Suggestion
POST /works/{workId}/suggestions/{suggestionId}/reject 丢弃当前建议

POST /ai/generate 请求体:

{
  "workId": "string-id",
  "targetBlockId": "string-id | null",
  "suggestionType": "continuation",
  "requestSource": "writing_desk",
  "contextBlockIds": ["string-id"]
}

POST /works/{workId}/suggestions/{suggestionId}/accept 语义:

  1. 校验 Suggestion 仍存在且未过期。
  2. expectedRevision 更新目标 Block。
  3. 把 Suggestion 迁入 Archive。
  4. 原样接受时,可在主事务内确认关联且未 stale 的 Knowledge Draft并写 outbox。
  5. 修改后合并时,旧 Draft 立即作废;事务提交后重新提取。

响应:

{
  "block": {
    "id": "string-id",
    "revision": 4,
    "content": {
      "type": "doc",
      "content": []
    }
  },
  "suggestion": {
    "id": "string-id",
    "disposition": "accepted",
    "archivedAt": "ISO8601"
  },
  "extractionJob": {
    "id": "string-id",
    "status": "queued"
  }
}

extractionJob 只在修改后合并触发重新提取时返回;原样接受场景可以为 null

5.5 NER Preview

方法 路径 说明
POST /ai/ner 命名实体识别(NER)预览,只返回高亮结果,不写数据库

/ai/ner 不写 Shadow不生成 Proposal不进入正式检索。

5.6 Knowledge Draft / Extraction

方法 路径 说明
GET /works/{workId}/extraction-jobs/{jobId} 轮询提取任务
GET /works/{workId}/proposals 获取待确认 Knowledge Draft / Proposal
GET /works/{workId}/proposals/{proposalId} 获取草稿详情和 diff
POST /works/{workId}/proposals/{proposalId}/accept 单条确认,写入正式作品知识
POST /works/{workId}/proposals/{proposalId}/reject 忽略或丢弃草稿

确认前必须校验来源快照(Source Snapshot)。来源失效或缺失返回 409 STALE_SOURCE_SNAPSHOT;缺 Source Snapshot 的历史 Draft 在本轮基线下必须作废并重新提取。

5.7 导入解析 APIs

方法 路径 说明
POST /works/{workId}/import 导入正文,直接写 Canonical 正文
POST /works/{workId}/parse 对已导入正文触发全书解析
GET /works/{workId}/parse-progress 查询解析进度
GET /works/{workId}/parse-jobs/{parseJobId}/chapters 章节级汇总
GET /works/{workId}/parse-jobs/{parseJobId}/chapters/{chapterId}/proposals 指定章节待确认详情
POST /works/{workId}/parse-jobs/{parseJobId}/chapters/{chapterId}/confirm 章节级确认
POST /works/{workId}/parse-jobs/{parseJobId}/chapters/{chapterId}/reject 章节级驳回

章节确认边界固定为 parse_job_id + chapter_id,并且同章节 all-or-nothing。批量选择和“一键确认全部可确认章节”必须拆成章节级提交后端按章节逐个事务循环执行某章失败不回滚已成功章节也不阻塞后续可确认章节不能变成跨章节不可解释写入。

5.8 局域知识库 APIs

方法 路径 说明
GET /works/{workId}/knowledge/projection 获取用户可见投影
GET /works/{workId}/entities 查询当前作品正式实体
POST /works/{workId}/entities 手动创建实体
GET /works/{workId}/entities/{entityId} 查询实体快照、关系和变更
PATCH /works/{workId}/entities/{entityId} 手动更新实体属性
DELETE /works/{workId}/entities/{entityId} 删除实体与下游关系
GET /works/{workId}/relations 查询关系
POST /works/{workId}/entities/search 在当前作品局域知识库中检索

用户可见投影只展示元数据允许展示、编辑、检索和导出的实体、关系、字段和摘要。投影不是事实源。

5.9 全局知识库授权检索 APIs

方法 路径 说明
GET /works/{workId}/authorized-global-knowledge-bases 查询当前作品/用户可见的授权全局知识库
POST /works/{workId}/global-knowledge/search 检索被授权全局资料

全局知识库是独立逻辑资料集。检索前必须根据当前用户、作品、套餐和访问策略计算允许使用的 globalKbIds;请求不得包含未授权或已撤销的全局知识库 ID。如果多个全局知识库共用同一个物理索引或数据库检索条件必须包含 global_kb_id IN allowedIds 或等价过滤条件。异步重建索引不能作为权限边界。

检索响应必须标明来源:

{
  "results": [
    {
      "sourceType": "global_knowledge_base",
      "globalKnowledgeBaseId": "string-id",
      "title": "平台规范摘要",
      "snippet": "string",
      "usableForGeneration": true
    }
  ]
}

全局知识库参与生成不等于成为作品正式知识。

5.10 导出交付 APIs

方法 路径 说明
POST /works/{workId}/exports 创建导出任务
GET /works/{workId}/exports/{exportJobId} 查询导出状态和下载信息

导出只读取已确认内容、用户有权访问且 exportable=true 的投影或正式数据。

5.11 作品记录与用量 APIs

方法 路径 说明
GET /works/{workId}/generation-records 查询单作品生成历史和候选历史
GET /works/{workId}/tasks 查询单作品任务历史、失败原因和可恢复动作
GET /works/{workId}/usage 查询单作品 Token 使用和成本提示摘要

Token 消耗明细和成本账本以 New-API 为准Muse 不提供 usage_logs 本地明细或本地汇总表查询,只返回用户可理解的 New-API 汇总、任务级 usage 摘要、引用或同步结果。

6. Personal Center APIs

Personal Center APIs 只能访问当前登录用户自己的信息,不承载单作品深层创作和管理员配置。

方法 路径 说明
GET /me 当前用户个人信息
PATCH /me 更新显示名、偏好等个人信息
GET /me/usage Token 使用、配额、套餐摘要
GET /me/generation-records 跨作品生成记录总览
GET /me/new-api-binding 当前用户 New-API 绑定状态摘要
GET /me/authorized-global-knowledge-bases 当前用户可见或可用的全局知识库授权摘要

GET /me/usage 响应示例:

{
  "quota": {
    "planKey": "pro",
    "period": "2026-05",
    "remainingTokens": 120000
  },
  "usageSummary": {
    "totalTokens": 380000,
    "generationCount": 142
  },
  "source": "new-api-summary"
}

7. 分页与轮询

7.1 分页

场景 策略
作品、实体、Proposal、Admin 列表 Offset-based(偏移分页)
Block 列表 Cursor-based(游标分页),按 orderIndex
Suggestion 列表 默认按 createdAt DESC,不做深分页
日志、生成记录、任务记录 Cursor-basedcreatedAt DESC

7.2 轮询

作业 轮询端点 默认间隔
生成 GET /ai/generation-jobs/{jobId} 2 秒
提取 GET /works/{workId}/extraction-jobs/{jobId} 2 秒
导入解析 GET /works/{workId}/parse-progress 2 秒
导出 GET /works/{workId}/exports/{exportJobId} 2 秒
评测 GET /admin/evaluation-runs/{runId} 5 秒

8. 错误码

Code HTTP 说明
VALIDATION_ERROR 400 参数错误
MISSING_REQUIRED_FIELD 400 缺少必填字段
EXPECTED_REVISION_MISSING 400 缺少 expectedRevision
UNAUTHORIZED 401 未认证
TOKEN_EXPIRED 401 access token 过期
FORBIDDEN 403 无权限;普通用户访问管理员接口也返回此错误
ADMIN_ONLY 403 需要管理员权限
SYSTEM_JOB_ONLY 403 需要系统任务服务身份
WORK_ACCESS_DENIED 403 无权访问该作品
BUILTIN_SCHEMA_IMMUTABLE 403 内置 Schema 不可修改
NOT_FOUND 404 资源不存在
SUGGESTION_NOT_FOUND 404 Suggestion 不存在
SUGGESTION_EXPIRED 404 Suggestion 已过期
PROPOSAL_NOT_FOUND 404 Proposal 不存在
PROPOSAL_EXPIRED 404 Proposal 已过期
WORK_ALREADY_IMPORTED 409 已导入,禁止再次导入
ORDER_INDEX_CONFLICT 409 排序冲突
REVISION_CONFLICT 409 Block revision 不匹配
ENTITY_NAME_CONFLICT 409 同类型同名实体冲突
STALE_SOURCE_SNAPSHOT 409 来源快照已失效
CHAPTER_BATCH_STALE 409 章节批量确认存在过期草稿
CHAPTER_BATCH_CONFLICT 409 章节批量确认存在冲突
GLOBAL_KB_NOT_AUTHORIZED 403 无权访问全局知识库
NEW_API_SYNC_FAILED 502 New-API 同步失败
RATE_LIMITED 429 限流
LLM_UNAVAILABLE 502 外部模型不可用
INTERNAL_ERROR 500 服务器内部错误

9. 非目标

v1 不做:

  • Webhook。
  • 多人协同写作冲突协商。
  • 前端离线同步协议。
  • 普通用户直接访问 Prompt、Agent、Pipeline 或系统日志。
  • 引入 Yudao / RuoYi 的完整后台系统。
  • 引入多租户、工作流、商城、支付、CRM 等通用平台能力。
  • Muse 复制 New-API 的模型供应商、路由、成本策略和消耗日志作为新的权威来源。
  • 把小说场景(Scene)作为独立一级 API 资源;近程叙事控制归入章节叙事规划。
  • 让 Sa-Token 直接决定作品正文、知识草稿、AI 候选是否进入 Canonical(规范数据)。

10. 关联阅读

  • 表结构:后端-04-统一数据库Schema-v1.md
  • 生命周期与状态机:架构-04-状态机与约束清单.md
  • 双轨模型:架构-02-核心数据结构与双轨模型.md
  • 模块职责:后端-02-工程结构与模块职责.md