docs: ADR-0008 数据库归属与实例拓扑、平台与业务能力边界、单机版口径

ADR-0008:库各自私有、允许共用实例、平台禁止直连 APS 库,并纠正「单机版」口径(客户端与平台服务同机,不含 APS)。新增 docs/spec/platform-vs-business.md 作为拆分判据(三分类 + 三个判据 + 四项已确认边界)。术语表修正 Pi 的描述(长驻子进程 + 扩展桥),补单机版/服务端版。实施设计 9.5 补进程创建时机:首次发消息时懒启动。
This commit is contained in:
zh 2026-09-24 13:51:39 +08:00
parent 84e4d6b504
commit 2d0fdd2c50
5 changed files with 86 additions and 1 deletions

View File

@ -0,0 +1,46 @@
# ADR-0008:数据库归属与实例拓扑
- **状态**:已接受
- **日期**:2026-09-24
- **决策人**:技术负责人
- **相关**:任务表 A0(决策 D13);设计文档《实施设计》1.5;ADR-0007
## 背景
ADR-0007 定了单机版用 SQLite、服务端版用 PostgreSQL,并留了一句「APS 侧数据库选型由 APS 自己定」。但它没回答三个问题:**库归谁、能不能共用一个 PostgreSQL 实例、怎么保证平台不越过 APS 直连它的库**。项目下一步既要拆数据库(B2)又要实现平台持久层(A3.7),不分清这三件事就会各写一半。
另有一处口径需要纠正:**「单机版」指客户端与平台服务在同一台机器上,不包含 APS。** APS 始终是独立系统——即使部署在同一台机器,也是独立进程、独立库、独立界面。
## 选项
| 选项 | 做法 | 代价 | 不选的理由 |
| --- | --- | --- | --- |
| A 各自私有库,可共用实例 | 平台库与 APS 库各自归属;开发期共用一个 PostgreSQL 实例的两个 database | 要账号与权限隔离,并加检查 | 选定 |
| B 单一共享库 | 两边的表放同一个库 | 运维最省事 | 破坏权威数据源边界:平台能读到甚至改到业务数据,门禁形同虚设 |
| C 强制不同实例 | 两边各起一个 PostgreSQL | 边界最清晰 | 单机与小型部署要维护两个数据库实例,成本不必要 |
## 结论
选 A。
| 项 | 结论 |
| --- | --- |
| 库归属 | 平台库归平台,APS 库归 APS:各自迁移、各自备份、各自账号 |
| 库内容 | 平台 7 张(项目、会话、消息、文件、审计、待确认动作、桌面授权);APS 6 张(主数据宽表、项目字典、工艺模板两表、排产执行与结果) |
| 实例拓扑 | 允许共用实例:开发期一个 PostgreSQL 跑两个 database;生产按部署拓扑定,不强制分离 |
| 访问规则 | **平台代码禁止直连 APS 库**,只能经 Provider 契约;反向同理,APS 不读平台库 |
| 隔离方式 | 不同 database + 不同账号;平台账号对 APS 库不授予任何权限 |
| 单机版 | 客户端 + 平台服务同机,平台库用 SQLite(ADR-0007);APS 仍以独立系统部署,用自己的库 |
| 检查方式 | CI 扫描连接串、表名与跨库查询;出现平台侧访问 APS 表的代码即失败 |
## 影响
- **对代码**:平台持久层只碰平台库;Provider 不接数据库,只调 APS 的接口
- **对任务**:B2 按「平台 7 / APS 6」执行;A3.7 会话落库只建平台侧表;A1.6 增加跨库访问检查
- **对文档**:术语表补「单机版 / 服务端版」定义;《实施设计》1.5 的权威数据源表以此为准
- **不这么做的后果**:共用一张表会让平台绕过门禁读到业务数据,等 B2 之后想再拆就更贵
## 遗留
- CI 跨库检查的具体实现(正则扫连接串,还是 AST 级检查)在 A1.6 定
- 生产是否分离实例:随部署拓扑在 A10 前后定,不影响代码

View File

@ -45,5 +45,6 @@ ADR 写完不再修改。要改结论就**新写一份**,并在两份里互相
| [0005](./0005-cutover-strategy.md) | 直接切换,不并行、不迁移 | 已接受 | 任务表 A0.9(决策 D7) |
| [0006](./0006-engine-as-subprocess.md) | 引擎以长驻子进程运行 | 已接受 | 任务表 A3(决策 D10) |
| [0007](./0007-storage-and-consistency.md) | 数据存储选型与双形态一致规则 | 已接受 | 任务表 A0(决策 D11) |
| [0008](./0008-database-ownership-and-topology.md) | 数据库归属与实例拓扑 | 已接受 | 任务表 A0(决策 D13) |
编号在写之前先在本表登记,避免多人并行时撞号。

View File

@ -11,8 +11,10 @@
| **平台服务** | 服务端进程:入口、应用服务、引擎适配、Core、Provider 接入 | 引擎在开发或部署期选定,服务端本身引擎中立 |
| **应用服务** | 会话与任务编排、能力查询、确认流转、事件推送 | 不做业务规则,不替引擎判断 |
| **Agent 引擎** | 驱动一轮智能体循环的实现,Pi 或 Codex 二选一 | 不等于平台,也不等于 Core |
| **Pi** | 进程内嵌入的 Node 库,工具由应用注册 | 核心不带工具,不带权限模型 |
| **Pi** | 以长驻子进程运行的引擎,平台用官方 RpcClient 驱动;工具由 Pi 侧扩展桥回调平台 | 不是进程内库;核心不带工具,不带权限模型 |
| **Codex** | 以子进程驱动的引擎实现 | 自带 shell 与文件类工具,接入时必须关闭 |
| **单机版** | 客户端与平台服务在同一台机器上运行的部署形态(平台库用 SQLite) | **不包含 APS**:APS 始终是独立系统,即使同机部署也是独立进程、独立库、独立界面 |
| **服务端版** | 客户端连远端平台服务的部署形态(平台库用 PostgreSQL) | 与单机版共用同一套代码,只换存储实现与部署拓扑 |
| **Core** | 平台控制面:身份、策略、确认、执行、审计五个模块 | 不是第二个智能体;不放业务规则与业务数据 |
| **身份** | 平台用户到各业务系统账号的映射 | 不复制业务系统的角色与权限 |
| **策略** | 用代码判断允许、拒绝或需确认 | 默认拒绝;每次执行前都查,不能只在展示工具列表时过滤 |

View File

@ -494,6 +494,7 @@ Provider 先写适配器,再以包的形式安装和管理。开发步骤与
| 项 | 首版做法 | 原因 |
| --- | --- | --- |
| 创建时机 | **首次发消息时懒启动**,不随平台启动预创建 | 建会话不需要引擎;懒启动让进程数跟着真实使用量走,避免为闲置会话养进程 |
| 进程粒度 | **一个会话一个引擎进程** | 会话间不串状态,崩溃互不影响 |
| 空闲回收 | A3.10 定:空闲时长与进程数上限 | 平台持有历史,进程随时可杀,下次按历史重建 |
| 进程复用 | 首版不做 | Pi 支持会话切换、Codex 支持多线程;进程数成为负担时再评估 |

View File

@ -0,0 +1,35 @@
# 平台基础能力与 APS 业务能力边界
> 用途:拆分判据。判断一段代码该放平台、放 APS,还是单独做成 Provider,看它落进哪一类;有争议时先改本文,再动代码。
## 判据(三个问题)
1. **与具体业务系统无关吗?** 换掉 APS 换成别的业务系统,这段逻辑还要不要?要 → 平台基础。
2. **它是业务事实的承载者吗?** 是不是「这家工厂的订单、工艺、排产结果」这类事实?是 → 业务系统。
3. **它是与第三个系统的对接吗?** 是不是在跟 ERP / EMS / MES 打交道?是 → 独立 Provider。
## 三分类
| 分类 | 内容 |
| --- | --- |
| **平台基础** | 会话、消息、工作区、项目、附件与产物(数据管理);能力目录与 Provider 契约;策略、确认卡、执行授权;审计;身份与租户映射;凭据代理;引擎适配与进程管理;协议 v1(HTTP / SSE);客户端壳与桌面壳;Provider 套件管理与可视化宿主;跨系统顺序流程;文件导入骨架(profile 机制) |
| **APS 业务** | 求解引擎(CP-SAT / GA / NSGA2 / 池 / 规则)与求解进程隔离;柔性排产、能力池、交期承诺;订单、主数据、MRP;工厂日历与换型字典;工艺路线模板;排产执行与结果;世界状态、检查点、分支、数据包;排产校验器;SAGA 与闭环运行时;APS 自己的治理与审计;排产类报告内容 |
| **独立 Provider** | 与 ERP / EMS / MES / WMS / SAP 的对接。现在这些代码混在 `aps_domain` 里(`mes.py`、`sap_sync.py`、`wms_events.py`),B 线拆分时搬成各自的 Provider |
## 已确认的边界项
| 项 | 归属 | 说明 |
| --- | --- | --- |
| 图纸与多模态 | 展示、上传、预览 → 平台基础;图纸解析成工艺信息 → APS | 2026-09-24 确认 |
| 知识库与 RAG | 检索能力 → 平台基础;工艺模板库 → APS | 工艺模板归 APS 见 D8 相关结论 |
| 报告 | 导出机制 → 平台基础;排产报告内容 → APS | 2026-09-24 确认 |
| 网格面板(`MeshPanel`) | 待查 | 需确认是开发调试用还是业务视图 |
## 与决策的对应
| 决策 | 对本文的影响 |
| --- | --- |
| D8 | 平台 TS 从零重写;APS 保持 Python 搬迁适配 |
| D9 | 权限与协作归业务系统;平台不做转派、委托、多人计数、角色策略 |
| D12 | **APS 不内置对话智能体**:只保留「智能体接入点」契约,需要对话时由平台驱动 |
| D13 / ADR-0008 | 库各自私有:平台库归平台,APS 库归 APS,平台禁止直连 APS 库 |