--- title: Gitea知识库 v1.1 工程构建规格 date: 2026-08-07 type: 设计spec status: draft content_status: discussion owner: Verlit last_updated_at: 2026-08-10 last_updated_by: Codex hash: sha256:bcb8ad1f91c65098440d6d52606382c01e0f6cecc7227fe4298815ebb02b18bf hash_scope: Markdown 正文(从一级标题开始至文件末尾)的 UTF-8 SHA-256 belongs_to: - "[[3-业务线/Gitea知识库/_context|Gitea知识库]]" depends_knowledge: [] source_refs: - "[[3-业务线/Gitea知识库/公司共享 Context 项目仓库发布方案 v1|公司共享 Context 项目仓库发布方案 v1]]" - "[[3-业务线/Gitea知识库/公司共享 Context MCP-first 身份与审计方案 v1.1|公司共享 Context MCP-first 身份与审计方案 v1.1]]" - "[[3-业务线/Gitea知识库/v1-设计追溯与版本关系|v1 设计追溯与版本关系]]" - "[[3-业务线/Gitea知识库/v1-详细实施方案|v1 详细实施方案]]" - "0-收集箱/临时待归属/2026-08-03-公司共享Context发布与AI协同框架/2026-08-03-01-总体架构与模块边界.md" - "0-收集箱/临时待归属/2026-08-03-公司共享Context发布与AI协同框架/2026-08-03-11-接口契约数据模型与事件.md" --- # Gitea知识库 v1.1 工程构建规格 ## 1. 文档定位 本文件定义 v1 基线叠加 v1.1 MCP-first 身份与审计覆盖层后,未来进入代码开发时的工程边界、逻辑仓库结构、模块依赖、契约落点、配置安全模型和构建测试要求。当前只形成设计规格,不创建代码仓库、不选择服务器、不部署服务、不连接 Gitea,也不运行真实发布链。 它不替代 v1 主方案:主方案回答“为什么建、业务边界是什么”;本文件回答“工程代码应如何组织,模块之间如何保持可替换和可测试”。 ## 2. 当前构建阶段的完成定义 当前构建阶段完成时,应满足: 1. 每个必需模块的职责、输入、输出、禁止动作和依赖方向明确; 2. 平台代码仓库与项目 Context 仓库的概念完全分离; 3. 七类以上核心契约有固定逻辑落点、生产者、消费者和版本策略; 4. 发布事务、内容状态、技术状态和审核状态不混用; 5. 非敏感配置、项目控制配置和秘密引用分层; 6. 单元、契约、集成、安全、恢复和试点测试可以从任务映射到验收证据; 7. 未选择技术栈、服务器和试点项目时,工程方案仍然完整且不伪造环境参数; 8. 后续开发者可以按任务包开工,不需要重新设计 v1 核心架构。 达到这些条件只表示“具备未来开发条件”,不表示已经开始实施。 ## 3. 不可变工程边界 - 一项目一私有 Context 仓库;项目仓库是内容与权限容器,不是平台源代码仓库。 - 平台代码不能通过目录 ACL 替代 Gitea 项目级权限边界。 - 来源选择、构建和检查均不持有 Gitea 写凭据。 - 发布网关是受保护 `main` 的唯一写入者;Gitea 适配器只能被网关调用。 - `main/current` 是唯一默认读取面;读取模块不遍历 `.git`、历史、staging 或失败包。 - `discussion / confirmed` 只表示内容状态;release 事务使用独立状态机。 - Agent 默认 A1/A2;A3/A4 只通过用户绑定 MCP 和精确确认提交受控网关请求,不获得 Git 写、SSH 或管理员凭据。 - v1.1 以远程 MCP 作为全员 Agent 的唯一用户业务入口,以飞书登录绑定、内部权限数据库、Gitea 权限复核和强制审计作为必需链路;Skill Registry、飞书内容来源、通用审批和自建 Web 页面仍不进入本版本。 ## 4. 逻辑组件与依赖 ```mermaid flowchart LR C[contracts/domain] --> I[identity] C --> Z[authorization] C --> M[mcp-gateway] C --> S[selection] C --> B[builder] C --> V[validation] C --> P[policy] C --> R[release] C --> E[export] C --> Q[read/readback] I --> M Z --> M M --> S M --> B M --> R M --> Q S --> B --> V --> R P --> Z P --> R R --> G[gitea adapter] G --> E --> Q R --> A[audit ports] E --> A Q --> A M --> A ``` 只允许上图方向的依赖。模块通过版本化对象和端口连接,不得直接读取其他模块私有数据库、缓存或工作目录。 | 逻辑模块 | 单一职责 | 主要输入 | 主要输出 | 明确禁止 | |---|---|---|---|---| | `domain` | 稳定 ID、枚举、状态机、hash 与错误语义 | 无外部资源 | 领域类型和校验规则 | 依赖框架、Gitea 或数据库 | | `contracts` | schema、样例、兼容策略和契约测试 | 领域类型 | 版本化契约包 | 保存秘密或环境地址 | | `identity` | 飞书身份绑定、内部主体、Gitea 绑定和 AgentSession | 已验证登录声明、绑定记录 | 稳定 `user_id`、会话主体链 | 信任工具参数中的用户身份、保存明文 token | | `authorization` | 内部 ProjectGrant、动作策略和 Gitea 项目权限复核 | 稳定主体、project、action、resource | 双层授权决策和策略版本 | 任一层拒绝后降级到共享账号或高权凭据 | | `mcp-gateway` | 提供唯一用户业务工具面并强制身份、确认、鉴权和审计中间件 | 用户绑定 MCP 会话、工具请求 | 版本化工具结果、关联 ID | 暴露通用 Git/SQL/SSH/部署/审计写入能力 | | `selection` | 将人类明确选择固化为允许读取范围 | 本地来源标识、选择范围 | selection manifest | 扫描整个私人工作区、自动发布 | | `builder` | 确定性生成 artifact bundle | selection、标准化来源对象 | artifact manifest、bundle | 写 Gitea、改变业务状态 | | `validation` | 结构、链接、路径、凭据、隐私和策略检查 | artifact bundle、策略版本 | validation report | 静默修正业务语义、删除 finding | | `policy` | 读取受保护的项目策略和审核快照 | project、策略基线 | policy snapshot、决策结果 | 接受客户端传入的权威策略覆盖 | | `release` | 鉴权、幂等、CAS、事务编排和回执 | release request、validation、policy | release record、receipt、事件 | 直接读取私人来源、管理全局用户 | | `gitea-adapter` | 在最小权限下读写指定项目仓库 | 网关端口调用 | commit、ref、仓库状态 | 暴露 token、拥有全局管理员权限 | | `export` | 从指定 commit 构建 staging 并原子切换 current | release、commit | current manifest、切换结果 | 在服务中的 current 内逐文件覆盖 | | `read` | 按项目身份提供 current 和 manifest | project identity、读取请求 | 只读 artifact、版本元数据 | 暴露 Git 历史、控制配置和构建区 | | `readback` | 发布后从正式读取面验证版本与状态 | release、current endpoint | readback report | 使用构建缓存假装正式读回 | | `agent-session` | 约束哪个 Agent 代表哪个登录用户和 client | 已验证用户、Agent/Host、会话声明 | 短期 AgentSession 与主体链 | 切换用户、自签身份或持有发布凭据 | | `audit` | 自动追加三主体事件并提供授权只读查询 | MCP 与业务链路 audit event | 审计索引、关联查询和完整性证明 | 由 Agent 选择是否写入、修改/删除事件、成为业务或权限真源 | | `observability` | 指标、健康检查和告警适配 | 运行指标和事件 | 指标、告警通知 | 记录正文、token 或私钥 | `review` 在试点 `forced_off` 下不是独立人工审批服务;v1.1 仍保留策略快照与模拟 ON 的负面路径。远程 MCP 是生产目标的必需用户入口,STDIO 只用于本地开发;两者复用相同业务核心、双层授权与审计中间件。本项目不建设自定义业务 Web 页面。 ## 5. 代码仓库与目录规划 ### 5.1 两类仓库必须分离 | 仓库类型 | 作用 | 数量模型 | 是否在当前创建 | |---|---|---|---| | 平台代码仓库 | 保存上述模块、契约、测试和打包配置 | v1 可采用一个模块化代码仓库起步 | 否,待正式进入开发并确认归属后创建 | | 项目 Context 仓库 | 保存某个业务项目的 `main/current`、schema 和 Git 历史 | 一项目一私有仓库 | 否,待实施准入与试点确认后创建 | “一项目一仓”约束针对项目 Context 仓库,不要求把平台每个代码模块拆成独立 Git 仓库。v1 初期优先保持一个模块化平台代码仓库,只有出现独立生命周期、权限或发布节奏后才拆仓。 ### 5.2 平台代码仓库逻辑结构 以下是逻辑结构,不代表已经创建实际目录: ```text / ├─ README.md ├─ contracts/ │ ├─ v1/ │ │ ├─ common/ │ │ ├─ selection/ │ │ ├─ artifact/ │ │ ├─ validation/ │ │ ├─ release/ │ │ ├─ current/ │ │ └─ readback/ │ └─ v1.1/ │ ├─ identity/ │ ├─ authorization/ │ ├─ mcp/ │ └─ audit/ ├─ src/ │ ├─ domain/ │ ├─ identity/ │ ├─ authorization/ │ ├─ mcp/ │ ├─ selection/ │ ├─ builder/ │ ├─ validation/ │ ├─ policy/ │ ├─ release/ │ ├─ adapters/gitea/ │ ├─ export/ │ ├─ read/ │ ├─ readback/ │ ├─ agent-session/ │ ├─ audit/ │ └─ observability/ ├─ config/ │ ├─ defaults.example.yaml │ ├─ project.example.yaml │ ├─ policy.example.yaml │ ├─ identity.example.yaml │ ├─ mcp.example.yaml │ └─ audit.example.yaml ├─ tests/ │ ├─ contract/ │ ├─ unit/ │ ├─ integration/ │ ├─ identity/ │ ├─ mcp/ │ ├─ audit/ │ ├─ security-corpus/ │ ├─ recovery/ │ └─ fixtures/ ├─ packaging/ ├─ docs/ └─ tools/ ``` 目录名可以随技术栈调整,但职责边界、依赖方向和契约分层不能改变。 ### 5.3 项目 Context 仓库固定结构 ```text -context/ ├─ README.md ├─ current/ │ ├─ context.md │ ├─ decisions/ │ ├─ assets/ │ └─ _release.yaml ├─ schema/ │ └─ context.schema.yaml └─ .gitignore ``` 平台代码、运行日志、构建缓存、秘密和私人来源均不得写入项目 Context 仓库。 ## 6. 契约与数据所有权 | 对象 | 权威生产者 | 主要消费者 | 不可变性与落点要求 | |---|---|---|---| | UserIdentity/Bindings | `identity` | `authorization`、MCP | 内部稳定 ID;飞书/Gitea 绑定变更必须版本化并审计 | | ProjectGrant | `authorization` | MCP、`release`、`read` | 第一层权限真源;不能由工具参数或 release payload 覆盖 | | AgentSession | `identity` | MCP、审计 | 短期、绑定 user/agent/client;过期或撤销后立即拒绝 | | Selection Manifest | `selection` | `builder`、审计 | 创建后不可修改;变化产生新 `selection_id` | | Artifact Manifest/Bundle | `builder` | `validation`、`release` | 绑定 selection 与 builder version;内容由 hash 固定 | | Validation Report | `validation` | `release`、审计 | 绑定 bundle 与 policy version;例外单独留痕 | | Release Request | 发布客户端/未来入口 | `release` | 客户端提交意图,不得携带权威审核策略 | | Review Policy Snapshot | `policy` | `release` | 网关接受请求时读取并固化;发布物不可覆盖 | | Release Record | `release` | `export`、`readback`、审计 | 事务状态真源;同一 release 顺序转换 | | Git Commit/Tag | Gitea | `export`、恢复流程 | 内容版本真源;失败 commit 不等于 completed | | Current Manifest | `export` | `read`、`readback`、Agent | 唯一 current 的读取真源;原子切换 | | Readback Report/Receipt | `readback`/`release` | 发布者、审计 | 四段一致后才允许 final status 为 completed | | MCP Tool Request/Result | `mcp-gateway` | 业务模块、审计 | 从已验证会话派生主体;参数中的身份不具权威性 | | Audit Event | MCP 中间件与各模块 | `audit`、监控 | human+agent+service 三主体追加写;不含秘密、正文和私人绝对路径 | 所有对象必须包含或可追溯到:`schema_version`、稳定对象 ID、正式 `business_line_id`、`project_id`、RFC3339 时间、actor namespace、`correlation_id` 和声明 scope 的 SHA-256。 ## 7. 状态模型 ### 7.1 内容与技术状态 - 内容状态仅为 `discussion | confirmed`。 - 技术版本状态使用 `current | superseded | retired`。 - 两者是正交轴;进入 current 不等于 confirmed。 ### 7.2 Release 事务状态 ```text prepared → validating → ready → policy_evaluating ├─ not required ──────────────────────────┐ └─ required → pending_review → approved ──┤ ↓ committing → committed → exporting → switched → reading_back → completed ``` 终止或异常状态:`rejected`、`review_rejected`、`stale_policy`、`stale_base`、`validation_failed`、`commit_failed`、`export_failed`、`readback_failed`、`cancelled`。 状态机实现必须拒绝未知状态、跳跃转换和 completed 后回退。恢复旧内容必须创建新 release,不能改写历史状态。 ## 8. 稳定逻辑操作 传输协议、框架和命令名称可以在开发开工时选择,但下列操作语义必须稳定: | Operation ID | 调用者 | 输入 | 输出/错误 | |---|---|---|---| | `identity.get_current` | 登录用户/Agent | 已验证 MCP 会话 | 内部用户、绑定和会话摘要 | | `project.list_authorized` | 登录用户/Agent | 已验证 MCP 会话 | 双层授权后可见项目集合 | | `selection.create` | 人类入口 | project、来源版本、范围、排除项、目标状态 | selection manifest 或范围错误 | | `artifact.build` | 构建协调器 | selection manifest | bundle、artifact manifest 或确定性构建错误 | | `validation.run` | 构建协调器 | bundle、policy version | validation report | | `release.request` | publisher 入口 | release request、幂等键、`base_current` | release record 或权限/策略/CAS 错误 | | `release.get` | publisher/运维只读端 | release ID | 当前事务状态和可公开错误 | | `current.switch` | release 网关 | project、commit、release manifest | current manifest 或 export error | | `current.manifest.get` | 人/Agent 读取端 | project identity | 授权项目 current manifest | | `current.artifact.get` | 人/Agent 读取端 | project、artifact、current version | 授权 artifact 或统一拒绝 | | `readback.verify` | release 网关 | release、commit、manifest hash | readback report | | `audit.query` | 授权审计者 | correlation/release/project、时间范围 | 脱敏事件集合 | 上述业务操作通过 MCP 工具对用户和 Agent 暴露;模块内部仍可使用进程内端口、队列或受控 HTTP。不得另建面向用户的 Web/REST/CLI 业务入口,也不得因传输方式改变鉴权、状态和错误语义。运维控制面不属于普通 MCP 工具面。 ## 9. 配置与秘密边界 ### 9.1 配置分层 | 层级 | 示例 | 真源与写权限 | |---|---|---| | 编译/默认配置 | schema 版本、支持的状态、默认超时 | 平台代码仓库;代码评审后变更 | | 环境非敏感配置 | 日志级别、端口、工作目录、公开域名占位 | 部署配置;不含真实秘密 | | 项目控制配置 | project ID、仓库映射、成员角色、review mode、敏感级别 | 受保护控制面;publisher/Agent 不可写 | | 身份与授权配置 | 飞书 issuer/audience、MCP resource、binding policy、session TTL、Gitea 复核策略 | 身份/权限控制面;客户端和正文不可写 | | 审计配置 | 事件 schema、outbox、保留策略、脱敏策略 | 审计控制面;普通业务主体只读授权范围 | | 策略包 | 结构、链接、路径、秘密和 PII 检查规则 | 版本化策略真源;每次报告记录版本 | | 秘密引用 | Gitea project token、签名密钥、只读凭据 | 独立密钥系统;配置只保存引用,不保存值 | ### 9.2 必须禁止 - 不在 Markdown、schema、样例、环境文件、日志、测试夹具和 `_runtime` 中保存真实 token、cookie、私钥或密码。 - 不允许 release payload 修改 review mode、reviewer、权限矩阵或项目仓库映射。 - 不允许 Agent 通过正文提示改变项目路由、工具白名单或 credential reference。 - 不允许多个项目共享同一个可写凭据;只读凭据也必须能够独立撤销和轮换。 - 不使用客户端隐藏字段代替服务端鉴权和策略判断。 - 不接受工具参数自报 `user_id`、role、grant、AgentSession 或 review mode;主体只能从已验证会话派生。 - 不在飞书 token、MCP access token 和 Gitea 凭据之间做透传或复用。 - 不允许审计写入失败后继续执行业务动作,也不提供回退到共享账号、通用 CLI 或高权限 shell 的路径。 ## 10. 工程构建与测试流水线规格 未来代码仓库的本地/CI 流水线按以下顺序设计;当前不创建也不运行流水线: 1. 格式与静态检查; 2. schema 与样例校验; 3. 契约兼容性检查; 4. 身份绑定、双层授权、MCP schema 和三主体审计契约测试; 5. 领域状态机和模块单元测试; 6. 使用 synthetic identity、fake source、fake Gitea 和临时目录的集成测试; 7. 身份冒充、越权、审计中断和安全失败语料测试; 8. 并发、幂等、原子切换和读回失败测试; 9. 构建可复现性与制品清单生成; 10. 只有后续获得明确授权,才允许测试环境连接真实 Gitea 或飞书身份环境;生产环境永不作为普通 CI 测试目标。 每个测试必须记录用例 ID、契约版本、输入 fixture hash、结果、错误码和关联开发任务。详细用例分层以 `v1-验收与止损矩阵.md` 为准。 ## 11. 当前不需要确认的事项 以下参数留到正式开发或实施准入时决定,不阻断当前工程设计: - 编程语言、MCP SDK、依赖注入和测试框架; - 单体进程还是少量独立服务; - Agent Host 及其飞书登录集成方式; - 远程 MCP transport、OAuth/身份代理、协议版本和 token 生命周期; - 身份权限数据库、release 状态库和 append-only audit store 的具体产品; - Gitea 版本、部署方式、域名、端口和服务器目录; - current 使用 HTTP、挂载或两者兼有; - 日志、指标、告警和秘密系统的具体产品; - 首个试点项目、真实成员、账号和仓库名称。 这里没有 Web 框架选型项,因为 v1.1 不建设自定义业务 Web 页面;远程 MCP 的 HTTP transport 不等于业务 Web 应用。这些选择不得改变第 3 节的不可变边界。若某个技术选择无法满足边界,应更换技术方案,而不是修改 v1/v1.1 语义。 ## 12. 构建阶段交付清单 | 交付项 | 当前载体 | 状态 | |---|---|---| | v1 业务与架构基线 | `公司共享 Context 项目仓库发布方案 v1.md` | 已完成 | | v1.1 MCP-first 身份与审计覆盖层 | `公司共享 Context MCP-first 身份与审计方案 v1.1.md` | 已完成草案 | | v1.1 推荐技术栈与详细实施设计 | `v1.1-技术栈与详细实施设计.md` | Go/PostgreSQL/Gitea 推荐基线已形成;待 C1-00 验证 Agent Host | | 设计采用与防偏移追溯 | `v1-设计追溯与版本关系.md` | 已完成 | | 工程模块、仓库、契约与配置规格 | 当前文件 | 已完成初版 | | 未来开发任务包 | `v1-开发任务分解.md` | 与本规格配套 | | 工程测试与系统验收规格 | `v1-验收与止损矩阵.md` | 已形成,补充工程测试层级 | | 未来实施顺序 | `v1-详细实施方案.md` | 已完成环境无关部分 | | 未来实施准入参数 | `v1-实施参数与决策清单.md` | 待进入实施前确认 | ## 13. 进入代码开发前的检查门 只有 Verlit 明确宣布进入代码开发后,才需要: 1. 确认平台代码仓库的正式归属、名称和维护者; 2. 选择运行时、编程语言、MCP SDK 及最低支持版本,不选择自建 Web 前端框架; 3. 确认 Agent Host、飞书登录集成、远程 MCP 认证、身份权限库和审计存储的技术边界; 4. 确认开发环境只使用合成身份、合成数据和 fake adapter; 5. 将 `v1-开发任务分解.md` 中的首批任务正式下发; 6. 为代码修改建立独立任务、验收人和产物位置。 确认以上事项仍不等于授权部署。服务器、Gitea、真实账号和试点项目继续由未来实施准入门控制。