diff --git a/README_CN.md b/README_CN.md index c6e95038..2dc6ed31 100644 --- a/README_CN.md +++ b/README_CN.md @@ -444,6 +444,8 @@ OctopServer 详见 [docs/architecture.md](docs/architecture.md)、[docs/adr/001-single-process-model.md](docs/adr/001-single-process-model.md) 与 [docs/adr/002-database-backends.md](docs/adr/002-database-backends.md)。 +组织模块目标架构(Dashboard 子 UI + 可导出独立站,单源双交付)见 [docs/adr/003-org-ui-single-source-dual-delivery.md](docs/adr/003-org-ui-single-source-dual-delivery.md) 与 [docs/org-merge-plan.md](docs/org-merge-plan.md)。 + ### 📁 项目结构 ``` diff --git a/docs/adr/003-org-ui-single-source-dual-delivery.md b/docs/adr/003-org-ui-single-source-dual-delivery.md new file mode 100644 index 00000000..0455305d --- /dev/null +++ b/docs/adr/003-org-ui-single-source-dual-delivery.md @@ -0,0 +1,97 @@ +# ADR 003 — Organization UI: Single Source, Dual Delivery + +**Status:** Accepted +**Date:** 2026-09-19 + +**Related:** [ADR 001](001-single-process-model.md), [architecture-integration.md](../architecture-integration.md), [org-merge-plan.md](../org-merge-plan.md), [asset-loop.md](../asset-loop.md), in-host Organization (#55) + +> Numbering note: `docs/adr/002-database-backends.md` already exists. This decision is **ADR 003**. + +--- + +## 摘要(Chinese summary) + +组织模块代码是**唯一事实来源**。openXYOS 网页不再作为第二套常驻系统,而是变成 **FreeOS Dashboard `/organization/...` 下的子 UI**。同一套页面必须还能 **导出** 为客户自托管的独立 openXYOS Web(商业加售)。默认一个安装器、一个 Python 进程,Node sidecar 仅作可选兼容。**不**用 openXYOS Chat 替换 FreeOS/Octop 的 Agent 对话运行时。 + +落地形态:壳无关的 `org-ui` 包 + 薄 Dashboard 适配器 + `freeos org export-standalone` 导出流水线。 + +否决:永久双进程、永远 iframe、手维护两套独立站。 + +--- + +## Context + +#55 moved Organization **control-plane capability** into the FreeOS/Octop host (`org_os`, `/api/org-module/*`, a native Ant Design workbench at `/organization`). The optional Node sidecar (`127.0.0.1:3780`, `FREEOS_ORG_SIDECAR`, `SHIP_OPENXYOS_RUNTIME`) is no longer required to install FreeOS or open Organization. + +What remains is a **UI/API ownership** problem: + +- The 12 OpenApp module pages (workspace, announcements, org chart, employees, skills, chat, agents, tasks, knowledge, reflections, governance UI, settings) still live in `modules/openxyos` and historically rendered through a sidecar / iframe. +- Customers still need a **standalone** openXYOS web deployment generated from the same product, not a second hand-maintained tree. +- Operators rejected a mandatory Node sidecar in the default installer (ADR 001: one process, one port). +- FreeOS/Octop remains the agent **data plane**. openXYOS Chat must not replace host chat, IM, cron, or sandboxes. + +Phase 0 mapped the overlap. This ADR freezes the merge contract before any page is moved. + +## Decision + +Ship **one** organization UI source and **two** deliveries: + +1. **Shell-agnostic `org-ui`** — pages, hooks, and an API-client factory with no dependency on Dashboard chrome, Vite root, or the openXYOS Express shell. +2. **Thin Dashboard adapter** — mounts those pages under `/organization/...`, supplies FreeOS session + Ant Design / i18n / timezone, and talks to the host. +3. **Export pipeline** — `freeos org export-standalone --out dist/openxyos-web` assembles the **same** pages into a standalone Vite + server artifact for customer self-host (commercial upsell). + +``` + ┌─────────────────────────┐ + │ org-ui (single source) │ + │ pages · hooks · client │ + └───────────┬─────────────┘ + ┌──────────────┴──────────────┐ + ▼ ▼ + Dashboard adapter export-standalone + /organization/... dist/openxyos-web + FreeOS JWT / one port local JWT / self-host +``` + +**Non-negotiable product rules** + +| Rule | Meaning | +|---|---| +| Organization module is the SoT | Edit pages/contracts once; both deliveries consume them | +| Dashboard is the primary shell | openXYOS pages are **sub-UIs**, not a second always-on system | +| Standalone is generated | Self-host artifact is an export, not a fork | +| One installer by default | No mandatory Node sidecar | +| Sidecar is opt-in only | `FREEOS_ORG_SIDECAR` / `SHIP_OPENXYOS_RUNTIME` for advanced sync/compat | +| Chat runtime stays FreeOS | Do not migrate or replace Octop agent chat with openXYOS Chat | + +Phase 2 proves the contract on **Announcements** (see [org-merge-plan.md](../org-merge-plan.md)). Later Open-12 pages follow the same seam. Full commercial `App.tsx` routes stay out of the Open-12 wave. + +## Rationale + +- **#55 already in-hosted the control plane.** Keeping a second always-on UI process would re-introduce the cost the workbench removed. +- **Commercial self-host is a delivery, not a product fork.** Generating a standalone site from `org-ui` preserves the upsell without two codebases. +- **iframe is a compatibility hatch, not a contract.** It cannot share FreeOS session, Ant Design, or host routing without a login wall; it also forces a second origin/port. +- **ADR 001 still holds.** Organization pages in the Dashboard keep the default topology at one Python process and one port. Export is an explicit operator/customer action, not boot. + +## Alternatives rejected + +| Alternative | Why rejected | +|---|---| +| Keep a permanent dual process (host + Node sidecar always on) | Doubles ops; contradicts the default installer and ADR 001; #55 already made sidecar optional | +| iframe forever (`:3780` inside `/organization`) | Second origin, second login, no shared chrome; agents still cannot treat org pages as host routes | +| Duplicate, hand-maintained standalone openXYOS | Drift is guaranteed; violates “organization module = single source of truth” | +| Replace FreeOS/Octop chat with openXYOS Chat | Violates the control/data-plane split; loses IM, cron, sandboxes, governance-on-tool-path | +| Rewrite all openXYOS CRUD into FastAPI before any UI move | Blocks the vertical slice; BFF + proxy already exist for unmigrated APIs | + +## Consequences + +- New org pages **must** land in `org-ui` (or a path that export can import). Dashboard-only copies and sidecar-only copies are out of contract. +- `org-ui` takes a **`ShellAdapter` / `IdentityBridge`**: embedded mode uses the FreeOS session; standalone mode uses local JWT. Default UX is **no dual login wall**. +- Host **`/api/org-module/*`** remains the in-process BFF (catalog, loop, lifecycle, governance, asset factory). Business CRUD (e.g. `/api/announcements`) migrates **per slice**; unmigrated routes may still proxy to an opt-in sidecar. +- Chat, IM, cron, and agent runtime stay on the host. The OpenApp `/chat` page is **not** a migration target. +- Default desktop/NSIS/portable builds stay **zero-Node**. Sidecar zip is opt-in (`SHIP_OPENXYOS_RUNTIME=1`). +- Commercial `App.tsx` routes (contracts, assets, attendance, …) are **not** in the Open-12 wave; export may include them later from the same `org-ui` seam if they are extracted. +- `modules/openxyos` remains the vendored Apache-2.0 tree and the source of catalog/blueprint contracts until `org-contract` is extracted. It is not a second always-on runtime. + +## Follow-through + +Implementation sequencing, overlap matrix, package layout, API ownership, and Phase 2 acceptance criteria live in [org-merge-plan.md](../org-merge-plan.md). This ADR does not move pages or change the installer. diff --git a/docs/adr/README.md b/docs/adr/README.md new file mode 100644 index 00000000..7cc780ae --- /dev/null +++ b/docs/adr/README.md @@ -0,0 +1,9 @@ +# Architecture Decision Records + +| ADR | Title | Status | +|---|---|---| +| [001](001-single-process-model.md) | Single-process, no external queue | Accepted | +| [002](002-database-backends.md) | Dual database backends (SQLite \| PostgreSQL) | Accepted | +| [003](003-org-ui-single-source-dual-delivery.md) | Organization UI: single source, dual delivery | Accepted | + +Organization merge sequencing (Phases 0–5) lives in [org-merge-plan.md](../org-merge-plan.md), not in an ADR. diff --git a/docs/architecture-integration.md b/docs/architecture-integration.md index 3943bded..a156963f 100644 --- a/docs/architecture-integration.md +++ b/docs/architecture-integration.md @@ -9,6 +9,14 @@ They are complementary, not competitors. FreeOS does **not** replace Octop’s agent runtime with openXYOS chat. openXYOS is the organization control plane; FreeOS/Octop remains the execution runtime. +## Related + +- [ADR 001](adr/001-single-process-model.md) — single process, no external queue +- [ADR 003](adr/003-org-ui-single-source-dual-delivery.md) — org-ui single source, dual delivery (Accepted) +- [org-merge-plan.md](org-merge-plan.md) — Phases 0–5; Phase 2 = Announcements +- [asset-loop.md](asset-loop.md) — operator self-growth loop +- [ADR index](adr/) + ## North star — internally self-growing multi-agent management FreeOS grows its own AI workforce and capability catalog: @@ -281,8 +289,8 @@ The Phase A work sits on the existing FreeOS bootstrap: | Asset factory | Bridge | `freeos org assets publish\|import\|apply` · `{home}/asset-packs/` · `{home}/openxyos-mirror/` | | Self-growth loop | Bridge | `freeos org loop run` · `/api/org-module/loop/run` | | Colleague agents | Host agents table | `org-` · `{home}/org-agents/` · tenant `routing.json` | -| Org APIs | openXYOS sidecar | `/api/org`, `/api/employees`, `/api/governance`, `/api/module-settings`, … | -| Org UI | openXYOS Vite/Express | sidecar `:3780`; iframe on `/organization` when healthy | +| Org APIs | Host BFF + optional sidecar | `/api/org-module/*` in-host; sidecar `/api/org`, `/api/employees`, … until each CRUD slice moves (see [org-merge-plan.md](org-merge-plan.md)) | +| Org UI | Host Dashboard (target: `org-ui`) | Native `/organization` workbench (#55). Open-12 pages become Dashboard sub-UIs; standalone site is **exported** from the same source ([ADR 003](adr/003-org-ui-single-source-dual-delivery.md)). Sidecar `:3780` iframe is opt-in compat only | ### Auth and tenant mapping @@ -333,6 +341,7 @@ copy the openXYOS working directory themselves. | Rewrite openXYOS routes into FastAPI | Duplicate PEP/PDP; not MVP | | Prompt-only multi-tenant isolation | Risk 2; one tenant = one workspace/sandbox | | iframe-only, no BFF / MCP / skills | Agents cannot call org APIs or be governed | +| Permanent dual UI process or hand-maintained standalone | Rejected in [ADR 003](adr/003-org-ui-single-source-dual-delivery.md): one `org-ui` source, Dashboard adapter + export | | Start with org-as-code GitOps (Direction 7) | End-state; contract + runtime first | | Fail-open when sidecar/SQL.js is down | Makes governance cosmetic | @@ -341,6 +350,8 @@ copy the openXYOS working directory themselves. | Role | Path | |---|---| | Architecture (this file) | `docs/architecture-integration.md` | +| Org-ui dual-delivery ADR | `docs/adr/003-org-ui-single-source-dual-delivery.md` | +| Org merge plan (Phases 0–5) | `docs/org-merge-plan.md` | | BFF router | `src/octop/api/routers/org_module.py` | | Enablement + health | `src/octop/modules/org_os/service.py` | | Catalog | `src/octop/modules/org_os/catalog.py` | diff --git a/docs/architecture.md b/docs/architecture.md index 802d4d66..9c8657a5 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -156,7 +156,9 @@ checkpoint and are pushed to the dashboard / IM channel by ## See also - [AGENTS.md](../AGENTS.md) — module boundaries, hard bans, change workflow -- [Architecture Decision Records](./adr/) — single-process, no queue (ADR 001) +- [Architecture Decision Records](./adr/) — single-process (ADR 001), dual DB (ADR 002), org-ui dual delivery (ADR 003) +- [FreeOS × openXYOS integration](./architecture-integration.md) +- [Organization merge plan](./org-merge-plan.md) - [Configuration](configuration.md) — `~/.octop/` layout + env vars - [API reference](api.md) — every route, body, and error - [CLI reference](cli.md) — every subcommand diff --git a/docs/org-merge-plan.md b/docs/org-merge-plan.md new file mode 100644 index 00000000..9a70d70a --- /dev/null +++ b/docs/org-merge-plan.md @@ -0,0 +1,215 @@ +# 组织模块合并计划(openXYOS → FreeOS Dashboard) + +**状态:** Phase 1 合同已冻结([ADR 003](adr/003-org-ui-single-source-dual-delivery.md)) +**日期:** 2026-09-19 +**依据:** Phase 0 迁移图、[architecture-integration.md](architecture-integration.md)、[asset-loop.md](asset-loop.md)、[ADR 001](adr/001-single-process-model.md)、#55 宿主内 Organization + +本文是**规划**,不实现页面搬迁或安装器改动。 + +--- + +## 产品意图(不可谈判) + +1. **组织模块代码是唯一事实来源。** +2. openXYOS 网页成为 **FreeOS Dashboard Organization 下的子 UI**,不是第二套常驻系统。 +3. 同一套源必须能 **生成** 独立 openXYOS Web,供客户自托管(商业加售)。 +4. **默认一个安装器**,不强制 Node sidecar。Sidecar 仅作可选兼容(`FREEOS_ORG_SIDECAR` / `SHIP_OPENXYOS_RUNTIME`)。 +5. **不用** openXYOS Chat 替换 FreeOS/Octop Agent 对话运行时。 + +--- + +## 阶段总览(0–5) + +| 阶段 | 目标 | 状态 | +|---|---|---| +| **0** 宿主内地基 | `org_os` 控制面、`/api/org-module/*` BFF、Dashboard 原生工作台、sidecar 改为可选 | **已完成**(#55) | +| **1** 合同冻结 | ADR + 本计划:单源双交付、包布局、API 归属、IdentityBridge、Phase 2 验收 | **本文** | +| **2** 垂直切片 | **通知公告 Announcements** 按合同落地(Dashboard 路由 + 可导出同一页面) | 未开始 | +| **3** Open-12 其余页 | 工作台、组织架构、员工、技能、智能体、任务、知识、反思、治理 UI、设置 | 未开始 | +| **4** 身份与 CRUD | 已迁页面走 IdentityBridge;业务 CRUD 按切片迁入宿主;未迁路由仍可代理到可选 sidecar | 与 2–3 交叉推进 | +| **5** 导出与安装器 | `freeos org export-standalone` 产出独立站;默认安装器保持零 Node | 未开始 | + +Phase 0 已落地、Phase 1 **只冻结合同**。Phase 2 起才允许搬页面。 + +--- + +## Phase 0 已在宿主内(保留) + +| 能力 | 位置 | +|---|---| +| 治理 / 编译器 / 生命周期 / 资产 apply / 自增长 loop / skill_bridge / runtime / catalog(12 keys) | `src/octop/modules/org_os/` | +| 组织 BFF | `/api/org-module/*`(`src/octop/api/routers/org_module.py`) | +| Dashboard 原生 Ant Design 工作台 | `/organization`(#55,不再依赖 3780 iframe) | +| Sidecar | **可选**。`FREEOS_ORG_SIDECAR`、`SHIP_OPENXYOS_RUNTIME=1` | + +Catalog 十二键(`catalog.py` ↔ `open-module-catalog.ts`): + +`workspace` · `announcements` · `organization` · `employees` · `skills` · `chat` · `agents` · `tasks` · `knowledge` · `reflections` · `governance` · `settings` + +--- + +## 重叠矩阵(Phase 0 浓缩) + +「Open-12」= `OpenApp.tsx` 路由,**不是** 完整商业 `App.tsx`。 + +| 模块 key | 现状 UI | 现状 API | 合并方向 | +|---|---|---|---| +| workspace | OpenApp `/app` | sidecar dashboard/inbox | Phase 3:Dashboard `/organization` 工作台扩展,复用 #55 原生页 | +| **announcements** | OpenApp `/announcements` | sidecar `/api/announcements` | **Phase 2 切片** | +| organization | OpenApp `/org` | sidecar `/api/org` | Phase 3:组织架构子路由 | +| employees | OpenApp `/employees` | sidecar `/api/employees` + 宿主 lifecycle `/api/org-module/employees` | Phase 3:目录 UI 迁入;lifecycle / spawn **已在宿主,勿重复造** | +| skills | OpenApp `/skills` | sidecar `/api/skills` + 宿主 `skill_bridge` | Phase 3:目录 UI 迁入;generate/publish **已在宿主** | +| **chat** | OpenApp `/chat` | sidecar `/api/chats` | **不迁。** 对话走 FreeOS/Octop | +| agents | OpenApp `/agents`(Agent Studio) | 源码有 `routes/agent-studio.ts`,**`server.ts` 当前未 `app.use`** | Phase 3 前必须先核实挂载;未挂载则只迁 UI、API 在宿主补齐 | +| tasks | OpenApp `/tasks` | sidecar `/api/tasks` | Phase 3 | +| knowledge | OpenApp `/knowledge` | sidecar `/api/knowledge` | Phase 3;与宿主知识库边界保持「组织资料 ≠ Octop RAG 库」直到单独立项 | +| reflections | OpenApp `/reflections` | sidecar `/api/reflections` | Phase 3 | +| governance UI | OpenApp `/governance` | sidecar `/api/governance` + 宿主 `org_os/governance` | Phase 3:策略/审计 **展示** 迁入;PEP/PDP 与 durable pause **已在宿主,勿重写引擎** | +| settings | OpenApp `/settings` | sidecar `/api/settings`、`/api/module-settings` | Phase 3:租户/模块开关;宿主已有 `PATCH /api/org-module` 与 `/modules` | + +**商业 `App.tsx` 多出来的路由(本波不迁):** workflows、contracts、assets、attendance/leave、expense、daily-report、goals、budgets、performance、efficiency、audit 等。它们不是 Open-12。 + +--- + +## 包布局提案 + +原则:Phase 2 **先抽缝,不新开 monorepo**;Phase 5 若导出需要独立包再提取。 + +``` +dashboard/src/org-ui/ # 壳无关:页面、hooks、API client factory + pages/ # AnnouncementPage, … + hooks/ + api/createClient.ts # createOrgApiClient(adapter) + shell.ts # ShellAdapter / IdentityBridge 类型 + +dashboard/src/pages/Organization/ # 薄适配器:路由、FreeOS session、Ant Design、i18n + index.tsx # 已有 #55 工作台 + announcements/ # 挂 org-ui 页面 + +src/octop/modules/org_os/contract.py # org-contract:module keys、blueprint、JSON schema +dashboard/src/org-ui/contract.ts # 与 Python catalog keys 对拍(测试已有 catalog 漂移检查) + +src/octop/cli/commands/org.py # freeos org export-standalone +scripts/org-export/ # 独立 Vite + 最小 server,import 同一套 org-ui +``` + +后续若导出必须脱离 Dashboard Vite 图,再升为 `packages/org-ui` + `packages/org-contract`。**不要**在 Phase 2 为了洁癖先拆包。 + +命令草图(Phase 5,本文不实现): + +```bash +uv run freeos org export-standalone --out dist/openxyos-web +``` + +导出物是可部署的独立 Web(自带或可接客户的 openXYOS 后端),**不是** 再维护一份 `AnnouncementPage.tsx`。 + +--- + +## API 归属 + +### 宿主 BFF(已存在,继续作为控制面入口) + +前缀:`/api/org-module/*` + +| 路由簇 | 归属 | 迁 UI 时 | +|---|---|---| +| `status` · `catalog` · `overview` · `PATCH ""` · `modules` | 宿主 | 保持 | +| `assemble` · `produce` · `pack` · `loop/run` | 宿主 loop | 保持 | +| `employees` · `employees/transition` · `employees/spawn` | 宿主 lifecycle | 保持;与员工 **目录 CRUD** 分开 | +| `assets/*` · `blueprints/compile` · `skills/generate\|publish` | 宿主工厂 | 保持 | +| `governance/check\|resolve\|audit` | 宿主 PEP/PDP | 保持;治理 **UI** 另切片 | +| `sidecar/*` · `source/download` | 可选兼容 | 留在 Advanced;默认路径不依赖 | + +### 业务 CRUD(当前 sidecar Express → 按切片迁入宿主) + +| 资源 | 今日 | Phase 2+ 路径 | +|---|---|---| +| 公告 | `GET/POST/PUT/DELETE /api/announcements` | **先迁。** 宿主实现(建议 `/api/org-module/announcements` 或宿主挂 `/api/announcements`),`org-ui` client factory 指向宿主。独立导出站可同路径或经适配器改 base URL | +| 组织树 / 员工目录 / 任务 / 知识 / 反思 / 设置 | sidecar `/api/org` 等 | Phase 3 起同一模式:一页一资源,迁完才摘代理 | +| 未迁资源 | sidecar 或 `/api/org-module/sidecar/api/` 代理 | 可选 sidecar 仍可用;默认安装不启动它 | +| Chat | sidecar `/api/chats` | **永久不迁** | + +迁 CRUD **不是** 把整个 Express 重写成 FastAPI 当先决条件(见 ADR 003 否决项)。切片证明:该页不再打 `:3780`,也不再 iframe。 + +### 数据落点(提醒) + +宿主耐久状态在 `FREEOS_HOME`(治理 pause、同事 registry、mirror)。Sidecar SQL.js **不是** 生产 SoT。公告切片需明确:行写入宿主库(SQLite/PG,ADR 002)或 `FREEOS_HOME` 租户目录,而不是暗依赖 sidecar DB。 + +--- + +## IdentityBridge 草图 + +今日 BFF 已把 FreeOS 用户映射为 `X-FreeOS-User` / `X-FreeOS-User-Id` / `X-FreeOS-Role` / `X-FreeOS-Tenant-Id`,并 **剥离** `Authorization`,避免把宿主 JWT 当成 sidecar session(`proxy.py` → `identity_headers`)。那是代理模型,不是最终 UX。 + +目标:页面只依赖桥,不依赖「第二套登录墙」。 + +``` +org-ui → IdentityBridge.getSession() + IdentityBridge.authHeaders() + IdentityBridge.apiBase() + +嵌入 Dashboard(默认): + session = FreeOS JWT / 当前用户 + apiBase = 同源 /api + 无第二次登录 + +独立导出站: + session = 本地 JWT(现有 openXYOS auth) + apiBase = 独立站 origin + 客户自托管自己的账号体系 +``` + +`ShellAdapter` 还提供:导航(嵌入用 `/organization/...`,独立站用 `/announcements`)、locale、server timezone、是否展示宿主-only 动作(loop / assemble)。 + +默认 UX:**打开 Organization 子页 = 已登录 FreeOS 即可读写已迁资源。** 可选 sidecar 的登录框不得回到主路径。 + +--- + +## Phase 2 垂直切片:Announcements + +最低风险:只读+CRUD 清晰,不碰 Agent 运行时,OpenApp 与商业 `App.tsx` 都引用同一 `AnnouncementPage`。 + +### 要做(实现波,非本 PR) + +1. 把公告页抽成壳无关组件(`org-ui/pages/announcements`),数据经 `createOrgApiClient`。 +2. Dashboard 增加子路由:`/organization/announcements`(及详情/编辑若需要)。 +3. 宿主提供公告 API(见上表);嵌入模式打宿主,不打 `:3780`。 +4. 导出流水线最小闭环:同一页面能出现在 `export-standalone` 产物里(可用 fixture / 快照验收,不必先做完整商业打包)。 + +### 验收标准 + +| # | 标准 | +|---|---| +| A | Dashboard 路由在 **`/organization/...`** 下(至少 `/organization/announcements`) | +| B | 该页 **无 iframe**,也 **不要求第二端口**(不依赖 `127.0.0.1:3780`) | +| C | **同一套页面组件** 可用于 `freeos org export-standalone` 输出(独立站路由可以是 `/announcements`) | +| D | 已登录 FreeOS 用户可完成列表 / 发布 / 已读,无需 sidecar 登录墙 | +| E | 不引入 openXYOS Chat,也不改 Agent 对话运行时 | + +不满足 A–C 则切片未完成,不得开始 Phase 3 批量搬迁。 + +--- + +## 明确非目标 + +| 非目标 | 说明 | +|---|---| +| 替换 Chat 运行时 | 对话、IM、cron、sandbox 留在 FreeOS/Octop | +| 本波迁入完整 `App.tsx` 商业路由 | Open-12 以外的合同/资产/考勤等不加售进默认 Dashboard | +| 永久双进程 / 默认捆绑 Node runtime | sidecar 只是兼容阀 | +| 永远 iframe | 兼容预览可暂留 Advanced,不是已迁页的交付形态 | +| 手维护第二份独立站 | 独立站必须从 `org-ui` 生成 | +| 先重写全部 Express → FastAPI | 按切片迁 CRUD | +| 重写 `GovernanceEngine` | 治理执行已在宿主;本波只迁 UI | +| 把 Octop 知识库与组织知识混成一个表 | 除非单独立项 | +| 本 PR 搬页面或改安装器 | Phase 1 只文档 | + +--- + +## 相关文档 + +- [ADR 003 — 单源双交付](adr/003-org-ui-single-source-dual-delivery.md) +- [FreeOS × openXYOS 集成架构](architecture-integration.md) +- [自增长 loop](asset-loop.md) +- [ADR 001 — 单进程](adr/001-single-process-model.md) +- [ADR 002 — SQLite / PostgreSQL](adr/002-database-backends.md)