Fago 文档 Fago 文档
首页
快速开始
后端手册
前端手册
规划备查
文档维护
首页
快速开始
后端手册
前端手册
规划备查
文档维护
  • 快速开始

    • 简介
    • 功能列表
    • 快速启动(后端)
    • 快速启动(前端)
    • 技术选型
    • 项目结构
    • 接口与错误码
  • 后端手册

    • 配置与环境
    • 登录与会话
    • 功能权限与菜单
    • 数据权限
    • 用户、部门、岗位与角色
    • 租户与安全策略
    • 异常处理与错误码
    • 参数、分页与响应
    • 数据库迁移
    • 日志、脱敏与请求加密
    • 平台租户与套餐
    • fago-cli 常用命令
    • 发布验证与恢复演练
    • 字典与参数配置
    • 文件与对象存储
    • 站内通知与执行恢复
    • 定时任务与运行恢复
    • 可靠消息后端与积压观测
    • 身份客户端与设备会话
    • 会员认证与账号管理
    • 服务账号与 scope
    • OIDC 提供方与外部绑定
    • 原生 SSO 验收客户端
    • 账号认证模式
    • 工作流 API 与运行目录
  • 前端手册

    • 本地启动
    • 菜单与路由
    • 请求合同
    • 页面与按钮权限
    • 浏览器单点登录
    • 审批中心与表单发起
    • 工作流定义与运行管理
  • 规划备查

    • Fago:架构与实施方案
    • 总体架构
    • 身份、权限与租户设计
    • Vben 5 前端与 API 合同
    • 数据库与消息后端适配
    • 纯 Go 通用工作流:文件、文档与业务流程
    • 核心数据模型
    • 分期、工作包与验收
    • 架构决策与风险
    • 参考来源与基线
    • 网络安全等级保护二级合规要求
    • M0 实施与验收
    • M1 身份与导航实施及验收
    • 项目配置、API 内容加密与敏感数据脱敏
    • M2 系统管理实施记录
    • M3 平台与 SaaS 实施记录
    • fago-cli 功能规划
    • 生产传输层 WARN 变更范围(2026-10-23)
    • M4 发布实施与验收
    • M4 加固检查归档(本地工程环境)
    • M5 通用平台与身份实施
    • M6 R3.1 正式工作流核心与基础审批
目录

M5 通用平台与身份实施

# M5 通用平台与身份实施

2026-10-28 更新。返回路线图。M5 本地工程与自动化验收已完成;下文逐日记录保留当时状态,最终结论见第26节。R1 本地发布候选已经完成;用户当前没有生产环境,不以生产部署阻塞本地实施,也不宣称已投产。

# 1. 工作顺序与当前状态

工作包 当前状态 验收范围
R2.1 数据范围扩展 首个增量已实现并通过本轮验证 用户与审计模块的 DEPT_AND_CHILDREN/CUSTOM_DEPTS、角色页面、v13 → v14 升级
R2.1 字典与参数 第二个增量已实现并通过本轮验证 全局模板/租户值来源、权限、版本、敏感参数出口、真实页面与双租户回归
R2.2 文件与对象存储 第三个增量已实现并通过本轮验证;通用 S3 本地联调 授权上传/下载、大小/类型、元数据状态及失败清理
R2.3 可靠消息与 worker 本地工程基线已通过;Event/Redis 入口、保留与组合恢复已验证 outbox/inbox、Event/Redis 能力检测、重试/死信/重放、租约及 fencing
R2.3 通知与定时任务 v18 通知与 v19 定时任务本地工程基线已通过 模板/渠道、业务幂等、超时恢复、可观测执行及管理入口
R2.4 代码生成 本地工程基线通过;同ZIP双库/三协议HTTP、真实浏览器CRUD/权限/租户及类型矩阵已验证 导入/配置/预览/下载、模板版本/差异、生成产物编译/类型/租户权限 E2E
R2 身份 v20–v26客户端/会员/服务身份/OIDC/认证模式已落地,Vben与macOS有限原生、真实双Web应用SSO及统一退出已验证 realm/client registry、会员/服务身份、多终端、OIDC 绑定与双应用 SSO/统一登出

阶段逐项证据见第26节;M5原4–7 AI工作日为执行前规划基线,本轮未对所有增量独立计量有效工时,不据自动运行墙钟时间推算AI工作日。M0 PoC不作为本阶段退出依据。

# 2. 数据范围增量

  • system_role_departments 用 (tenant_id,role_id,department_id) 主键及两组复合外键阻止跨租户关系;新增 0014_department_scopes.sql,保留 v1–v13 原字节。角色范围列扩大到 24 字符,CHECK 增加两种新枚举。
  • DEPT_AND_CHILDREN 从当前有效本部门展开全部下级,无部门则为空;CUSTOM_DEPTS 仅含显式有效节点,不隐含本人或下级。每个角色只扩展其实际授予的具体权限,同权限取并集,ALL 仍限于当前租户。
  • 在一万节点/64 层的既有组织容量内读取同事务树快照,先防环/悬空检查,再迭代展开;有序合并避免多个子树角色重复累积相同节点。此实现替代原规划的递归 CTE/closure 表,取舍见 ADR-017。
  • 用户列表、count、详情、更新/删除/关联和创建的目标部门校验使用同一集合。操作日志和登录日志按各自权限及主体当前部门过滤,主体移动后历史日志可见范围随之变化。
  • 授权替换、部门移动/删除、敏感写入共用租户锁,关系、角色版本、授权版本与审计同事务提交。被显式选择的部门须先解除引用再删除;遗留软删除关系在读取时过滤。
  • CUSTOM 必须显式提供 departmentIds;[] 才表示清空,省略/null 拒绝为 400002。其他范围必须为空,可省略以兼容旧客户端。跨租户/已删除/不存在的部门为 404001,整批保持原状态;版本冲突为 409001。
  • Vben 角色授权页增加范围与多部门选择,保留未加载的已选 ID;切换到其他范围提交空数组。口令仅存在弹窗内存,成功/失败/关闭均清空,所有写入沿用统一 Origin、权限及生产 JWE 出口。

操作步骤与接口边界见 数据权限,迁移恢复见 数据库迁移。

# 3. 验证与复验

本轮只连接 Docker 的随机专用测试库,测试随机双租户由 fixture 清理;身份与授权使用真实服务/事务。凭证只从容器元数据传入进程环境,不写入证据。

已执行并通过的首轮检查:

  • MySQL/PostgreSQL TestIntegrationDepartmentScopes、TestIntegrationDepartmentScopeAudit,含子树移动、自选不含下级、独立日志权限、创建范围及主体移动。
  • 两库真实 TestIntegrationUsersRolesHTTP 明文/JWE 范围写入与回读。
  • 两库 TestIntegrationDepartmentScopeConcurrency:部门移出子树与用户写入、删除叶节点与角色授权竞争。
  • 两库空库/v1 升级、v13 有角色/部门数据升至 v14、迁移失败保护及幂等重跑。
  • 18 个 workspace 成员 race/vet 和 18 个 GOWORK=off 独立模块验证;OpenAPI lint/类型生成、页面回归、Vben 类型检查与生产构建。

最终验证:MySQL/PostgreSQL 每库 34 项顶层完整业务集成通过(含 TCP/TLS 三套 E2E);每库 4 项范围专项通过,补齐同权限子树/自选并集、遗留软删除关系过滤及并发竞争。两库 v13 升级验证保留原角色版本、权限和菜单关系;CUSTOM 漏传/null 原子拒绝通过。364 条实际明文/JWE 响应通过 OpenAPI 校验(各 182 条),静态合同示例 659 条通过。

应用前端 7 个文件、92 项测试通过,类型检查/生产构建通过。MySQL/PostgreSQL 均构建单数据库 API/worker/CLI,并以包含一条自选部门关系的 32 表快照完成恢复、v13 回滚和序列新增;演练只覆盖本地专用库,不能替代生产 RPO/RTO。

文档 47 页同步、检查、构建及浏览器四分册/M5 页面渲染核对通过。本轮约 0.4 AI 小时(包含实施、排错、审查、等待测试与文档),不代表整个 M5 估算。结构化结果及日志摘要见 docs/evidence/m5-scope-verification.json。

使用仓库原入口复验(先配置专用测试库,不在命令中粘贴 DSN):

bash scripts/test-backend.sh
bash scripts/test-independent.sh
bash scripts/integration.sh
bash scripts/web.sh contract
bash scripts/web.sh typecheck
bash scripts/web.sh exec vitest run apps/web-antd/src
bash scripts/web.sh build

针对范围的 Go 用例按 TestIntegrationDepartmentScope 前缀筛选;Go 命令须先从外层根目录 source scripts/go-env.sh,进入 fago/apps/fago-server 后添加所选数据库标签和 -race。v13 升级用例位于迁移模块 TestIntegrationDepartmentScopeUpgrade。

审查发现并修复 CUSTOM 漏传/null 可清空旧选择的问题,服务与 HTTP 负向回归同步覆盖。当前没有 golangci-lint 可执行文件或既有配置,未安装工具或更改全仓库规则;相关模块 go vet 已通过。

额外尝试整个 Vben 仓库测试时,87 个文件通过,两个未修改的 form-ui 测试文件失败:一个硬编码的 Element Plus 虚拟存储路径无法解析,另一个原生表单提交断言未调用。该广域检查未通过,不能称作全仓库测试通过;保留原始日志 .cache/m5/frontend-tests.log,未夹带修改这些文件。

达梦 v14 迁移源码已追加,本轮尚未运行达梦验证;v13 的既有开发实例证据不替代新版本认证。Oracle/SQL Server、其他消息后端、完整 SSO 与生产环境仍没有本轮认证结论。

# 4. 字典与参数增量(2026-10-24)

独立 fago-infra 已装配真实 HTTP 和 Vben 页面,schema v15 追加三种方言 SQL。全局模板为迁移发布的只读快照,租户以明确编码/版本复制后独立维护;不隐式回退、不跨租户共享。新能力 infra.configuration 必须通过可编辑套餐显式开通,保留 legacy 和已有套餐的能力上限。操作、权限、容量和失败处理见 字典与参数配置。

消费者定义的 TenantGate 由 app 注入 system 同库授权/审计桥接。读取不更新会话,使用只读快照复核;写入在既有锁序内检查当前会话、租户状态、权限和版本,业务数据与元数据审计同事务提交。模板子项采用有界批量写入,任一批次或审计失败撤销整个副本。参数值不进入审计;敏感值 DTO 永远为 null,更新默认保留,敏感性创建后不可变。内部 ResolveConfig 独立受 use 权限控制,未挂 HTTP;原值仍在业务数据库,不把出口隐藏描述为静态加密。

专项验证已经通过:MySQL/PostgreSQL 真实模板复制、条目生命周期、版本冲突、两个租户隔离、敏感参数保留/替换、只读角色与能力降级;三种传输模式合计 174 条实际响应(116 条加密、58 条明文)通过 OpenAPI 合同检查。新增页面 7 项测试与原有 92 项应用测试通过,类型检查/生产构建通过;19 个 workspace 成员 race/vet、19 个独立模块检查通过。新增静态合同示例合计 787 条通过。

两库各自构建单数据库 API/worker/CLI,并通过 v14→v15 升级、幂等重跑、38 表全库恢复指纹、v14 快照回滚和恢复后序列新增。新表内有非空字典、条目及敏感参数演练行,自选部门关系也参与比较。专用临时库与私有 dump 均已清理;本地演练不是生产 RPO/RTO。

最终完整业务 race 回归 MySQL/PostgreSQL 各 38 项顶层用例通过,迁移专项各 10 项通过。新旧模块合计 844 条实际响应合同通过(502 加密、342 明文)。容量测试明确要求独立非 race 测量,本增量未重跑;不把跳过记为通过。

新增回归确认:已撤销写会话复用原服务 context 仍拒绝,审计失败会回滚已有参数的值/元数据/版本及模板整批副本。最初 MySQL 全量因新夹具漏传必填 sensitive 返回 400002,修正后专项与完整复跑均通过,未更改接口必填约束。48 页文档同步、检查、构建及新手册/四分册浏览器排版检查通过;通用 integration 入口现覆盖全部迁移专项,不再按函数白名单漏掉范围升级。

本增量从新模块首次落盘至归档约 0.7 小时,包含实施、排错、审查、测试和等待;前置方案阅读未单独计时,不是整个 M5 的已耗时。结构化结果与日志摘要见 docs/evidence/m5-infra-verification.json。达梦 v15 仅追加源码,尚未执行新版本认证;不沿用 v13 结论宣称支持 v15。

# 5. 文件与对象存储增量(2026-10-24)

本轮新增 infra_files 的 v16 三方言迁移、租户文件服务、持久清理器、受信 worker 循环和真实文件页面,已装配 API/worker。通用 fago-s3 使用固定 S3 SDK v1.114.5,显式 endpoint/region/桶/凭证与 path-style;不接入 AWS 专属服务或默认云凭证发现。配置、权限开通及失败处理见 文件与对象存储。

当前实现采用短事务预约 uploading → 事务外 Put → 短事务复核身份/权限/期限后 CAS ready。键和上传 token 永不复用。删除/过期改为 cleanup_pending,清理 CAS 租约防止旧 worker 覆盖新结果;成功清理后的 deleted tombstone 仍每小时重扫,避免超时 Put 迟到落盘而永久遗留对象。完成返回错误时先 CAS 非 ready 状态,已提交 ready 的对象不能盲删;取消/撤权后补偿不依赖旧用户会话。

原始文件上限 5 MiB,MIME 和 PNG/JPEG/PDF/TXT 后缀须对应,拒绝路径、控制字符和伪造 MIME。所有字节继续经 JSON/JWE;仅精确 POST /api/admin/v1/infra/files 扩大额度,并在解密前限制四个在途上传,其余路由保持原限额。下载在对象 IO 前后复核当前授权和 ready 版本,校验大小/SHA256,并在短事务内复核、写入不含原内容的下载审计后才形成响应;审计失败不能下发字节。文件是租户内权限资源,不把组织部门范围隐式当作文件 ACL;文档 ACL/版本与审批仍属后续工作流阶段。

双库已经验证生命周期、跨租户拒绝、伪造类型/超限、损坏对象拒绝、失败删除重试、迟到 Put 二次回收、审计回滚、提交成功但应答丢失时保留 ready、外部 Put 期间撤销会话后不发布且可补偿。另按等保设计提供可选 FileScanner 窄挂钩:先授权再扫描,威胁拒绝与扫描器故障都不创建元数据/调用 Put;未配置扫描器不表示文件无恶意代码,真实 ClamAV 等后端尚未联调。5 MiB 实际内容在明文/RSA-AES/SM2-SM4 完成往返;48 条实际响应合同通过(32 加密、16 明文)。819 条静态示例、103 项应用前端测试、类型检查和生产构建通过;前端另验证读取文件期间切换身份不能向新会话上传、卸载后迟到下载不能触发 Blob。v16 双库迁移专项各 10 项通过,完整业务 race 回归双库各 44 项顶层用例通过;容量用例按其约束在 race 模式跳过,本轮不把它记为容量测量通过。20 个 workspace 成员 race/vet、20 个 GOWORK=off 独立模块检查通过。

用户确认仅引入通用 S3 对象库后,已安装/锁定官方 AWS SDK for Go v2 S3 v1.114.5、核心 v1.47.4 和依赖校验和。适配器只调用 S3 协议端口。按官方容器固定 RustFS 1.0.3 镜像摘要,本地专用私有桶已实际验证 SigV4、自定义 path-style endpoint、5 MiB 完整往返、幂等删除,以及 Enabled/Suspended 桶拒绝。双库真实对象 HTTP 用例又分别跑通明文/RSA-AES/SM2-SM4,并由清理器确认远端字节已删除;48 条新实际响应合同通过。其他 S3 服务、虚拟主机寻址和生产部署未认证;不是对所有厂商的认证声明。SDK endpoint 文档 (opens new window)、RustFS 容器文档 (opens new window)。

SDK 与 server 的 govulncheck 均为 0 个可达漏洞、0 个导入包漏洞;依赖模块另报告 1 个未调用的漏洞,不能写成整个依赖图完全没有已知问题。go mod verify、模块边界与独立构建通过;golangci-lint 未安装,未宣称执行该工具。

MySQL/PostgreSQL 单数据库 API/worker/CLI 构建通过。v15→v16 升级、幂等迁移、39 表全库恢复指纹、v15 快照回滚和恢复后序列写入通过,包含非空字典/参数、自选部门和待清理文件元数据。数据库恢复不等于对象字节恢复;对象验证由专用真实 S3 环境承担。本地容器/临时库与测试数据都不进入生产初始化。达梦 v16 仅追加迁移源码,尚未执行该版本认证。

发布二进制另在专用库/桶/Redis 实际启动:worker 将待清理元数据置 deleted,远端 Get 拒绝;API readiness 与文件路由认证通过,两进程 SIGTERM 正常退出。完整新旧模块 892 条实际响应合同通过(534 加密、358 明文),另有 48 条真实 S3 响应通过同一合同。49 页文档同步/检查/构建及新手册/四分册浏览器核对通过。

结构化结果及日志摘要归档到 docs/evidence/m5-files-verification.json。R2.2 为本地已验证增量,M5 整体仍未完成。

# 6. 可靠消息底座进行中(2026-10-24)

新增独立 fago-messaging、fago-event 与 fago-redis 模块,v17 三方言迁移追加 infra_outbox、infra_inbox。该 v17 增量当时完成同业务库 API/worker 的持久执行原语与 transport;其后的 v18 站内通知及正式 Event worker 见第 7 节。定时任务、Redis 运行入口和完整积压指标仍待实施,R2.3 整体没有结项。

Append 只接受已开始的业务事务与可信租户上下文,调用者负责在同一授权/租户锁事务提交业务、审计和事件;不在事务中发送网络消息。envelope 不可变,包含 schema/聚合版本及有界 JSON 对象;wire 只带 eventId/digest/topic/key。消费者必须回查同库 envelope 并核对摘要/路由,外部 tenantId 不能成为身份。不可信 wire 返回明确 Rejected/Ack 终态,避免毒消息空转;本库 envelope 损坏则作为依赖故障保留恢复,不混同为外部坏消息。当前没有跨库或外部生产者认证入口,不把它当作已交付的跨服务信任协议。

白名单消费者从本库事件恢复受限范围。WorkerGate 由 app 注入 tenancy,先锁租户、检查当前状态/到期/能力,再进入 inbox 和业务行;不反向锁套餐。即使误传在线 context,也清除 Actor 和权限快照,保留取消/截止。消费者回调只能做同事务内的本地业务/审计;远程副作用必须另外进入持久任务并由渠道幂等/对账保障。

发送在 CAS 认领后执行 IO,确认后才记 sent。消费先取得持久 lease,再以本地业务与 inbox done 同事务提交;只有提交确认后 Ack。lease 从实际认领时刻计,token 和期限共同 fencing,旧执行不能覆盖新结果。确认丢失仍使用原 eventId 去重,失败执行整体回滚;参数/权限/不存在等业务拒绝直接进入 dead,冲突/限流/依赖故障最多五次、有界退避与原始一天截止,首次迟到消费不能另获一天。dead 重放保留原身份和已完成 inbox,要求目标当前版本;迟到人工请求不能重置新一轮失败。只派发当前 worker 登记类型,其余保留待正确处理器恢复。

Event 不声明持久或跨进程能力,只有当前各分组 Ack 后才确认 Publish;持久恢复来自 outbox/inbox。同组分摊、不同组广播,收发和背压都有界;Nack/取消/退出让原发送失败,库不启动游离 goroutine。Redis 使用 Streams/group/PEL 与 XAUTOCLAIM;确认脚本原子校验当前 owner,旧 owner 不能 Ack 已接管消息。每订阅只持有一条未确认投递,不在内存保存第二套重试状态。

Redis 启动要求 AOF、noeviction 和 WAITAOF 能力,不支持就拒绝。发布在同一物理连接追加并等待本机 AOF fsync,不把连接池另一连接的确认当作本次写入确认。固定 go-redis v9.16.0 的 WaitAOF 包装器返回 IntCmd,而协议回复是数组,因此使用同连接 raw 命令按数组核验;未新增或升级该既有外部依赖。当前仅验证 Redis 8.0.3 单节点本地 AOF,不表示复制/跨站灾备认证。WAITAOF (opens new window)、XAUTOCLAIM (opens new window)。

该 v17 增量中 stream 达到显式容量后拒绝新增,不自动 MAXLEN/XTRIM 删除其他组未消费内容,当时暂无自动保留期清理(后续见第 10 节)。旧 consumer/PEL 与 inbox done 不随进程关闭删除。运维/容量与保留策略仍须随管理入口继续实施,不能宣称无限队列或永久无成本积压。

专项覆盖原子回滚、确认丢失、并发去重、重试/dead/版本重放、租户停用/恢复、旧发送 lease、执行过期、原始截止、身份污染、真实 Event 和 Redis 的双库联动。Redis 专用实例另外验证广播/分摊、pending 接管、旧 owner Ack 拒绝、毒消息、背压、无 AOF 拒绝,以及实际容器重启恢复。最初重启测试把 Docker restart 返回当作服务已就绪并复用旧连接池,失败后改成明确的有界能力等待和新连接池;持久性断言保留并通过。

本阶段广域业务 race 回归 MySQL 55 项、PostgreSQL 56 项通过;两次运行之间新增了截止用例,不能把差异写成同一固定测试集。最终核心专项按最新源码双库各 15 项顶层用例通过,其中真实 SQL 事务覆盖 dead 更新失败、claim 提交失败/应答丢失和业务提交应答丢失。审查发现并修复了 claim 事务提交前发布 Ack 的缺陷,改为提交确认成功后才发布暂存结果;故障回归均通过。23 个 workspace 成员的 race/vet、23 个 GOWORK=off 独立模块检查通过,模块 DAG/内部边界通过;golangci-lint 未安装,未宣称执行该工具。

结构化进度见 docs/evidence/m5-messaging-progress.json。v17 尚未执行达梦认证;原 v16 文件增量的发布/恢复证据不代替整个 v17/R2.3 的发布验收。M5 其余 R2.4 与身份扩展继续保留原范围。

# 7. 站内通知与正式 worker 增量(2026-10-25)

schema v18 追加三方言通知模板、发送任务、站内回执和消息执行历史。当前真实渠道为站内信,满足本地业务幂等/回执基线;邮件、短信和外部回调没有接入。模板只支持有界简单占位符,不执行通用模板函数/循环;受理保存渲染快照,后续模板修改/停用/软删除不会改变它。发送唯一键是租户/发送账号/幂等键,精确重试返回原任务,不同输入复用键拒绝。

通知通过 RecipientGate 与 WorkerRecorder 消费系统公开窄口,infra 不读取身份表。后台从核对后的本库 envelope 和有效 inbox lease 恢复 WorkIdentity,清除在线 Actor/权限后检查当前租户/套餐与收件账号。后台审计使用 actor_id=0、固定动作和 worker:<eventId>,只留资源/版本/状态/渠道;正文只进受理快照和收件人本人回执,不进 broker、管理任务 DTO 或审计。回执、任务终态、后台审计、attempt done 和 inbox done 同事务提交。

执行历史由 messaging 核心维护,不在失败事务调用业务 outcome 回调。历史表只 FK inbox,不反向 FK 租户/任务以避免锁序环;公开投影明确过滤 tenant/event/consumer。唯一 (inbox_id,claim_version) 保证人工 Replay 即使重置本轮次数也保留旧记录。后续认领把过期 running 标为 expired(结果未确认),不能推断业务一定没有执行;提交应答丢失仍由原事件 done 去重。

正式 worker 当前装配 Event 的派发/订阅循环,并与可选文件清理统一取消、join 后关闭连接;对象存储关闭不再阻塞通知。Redis Streams 原语继续保持已验证状态,但尚未作为该运行入口选项。新增真实 HTTP/JWE 路由、三个 Vben 管理页面、人工取消与双版本死信恢复;收件箱即使同租户有管理权限也只返回本人正文,Vue 按纯文本展示,不解释 HTML。

结构化验证已归档于 docs/evidence/m5-notifications-progress.json。专项已覆盖精确幂等/快照不变、跨租户和同租户本人边界、失败回滚、并发投递、永久拒绝/重放、认领历史与真实 SQL 提交故障;HTTP 专项使用正式订阅/派发循环验证 plain/RSA/SM2。操作说明见 站内通知与执行恢复。

本轮双库各 11 项通知顶层专项、各 69 项完整业务 race 与各 10 项迁移专项通过;完整业务集均显式跳过真实 Redis 消费专项和容量计时,不能借此宣称重新认证它们。最终元数据/提交故障/收件账号专项双库各 3 项复验通过。66 条真实通知 HTTP 响应按 OpenAPI 校验,其中 44 条加密、22 条明文。23 个 workspace 成员 race/vet 与 23 个 GOWORK=off 独立模块检查通过,24 模块源码依赖/内部边界通过。

前端在支持的 Node 24.22.1 上通过 107 项测试(含 4 项新增通知页面边界)、类型检查和生产构建;最初 Node 25 原生 Storage 与测试环境冲突,切换到受支持运行时后通过,未修改生产会话存储策略。双库实际发布 API/worker/CLI 的受理幂等、API 单独排队、worker 重启恢复和 SIGTERM 退出通过;对象存储在这项运行检查中关闭,不作为组合 S3 场景证据。模板占位符在文档站曾被 VuePress 插值吞掉,浏览器检查发现后改为明确 v-pre 并复核可见;50 页同步、链接与构建通过。

v18 的双库工程检查与后续恢复演练分开报告。尚未完成定时任务、积压指标/告警、自动保留策略和完整 R2.3 发布恢复验收;达梦 v18 未认证,不承诺生产或远程渠道。M5 整体保持实施中。

# 8. 定时任务与运行恢复增量(2026-10-25)

schema v19 追加三方言计划、运行和执行历史表,正式 worker 接入一次性/固定间隔调度与本地处理器,新增真实管理页面及九组接口入口。内置处理器只持久受理站内通知;run done 与通知实际送达分开。没有 cron、动态脚本或任意网络处理器。开通、权限、幂等与恢复操作见 定时任务与运行恢复。

配置版本与后台游标版本分离;触发身份由计划版本/到期点确定,计划锁内插入运行并推进游标。错过多个周期只合并最早一次,再推进未来对齐点。审查发现保留已消费锚点修改间隔可能阻塞旧触发键,已改为保留锚点但跳到未来对齐点,并以配置版本区分新系列。人工新执行使用租户/计划/操作账号/幂等键,精确重试沿用原命令;死信恢复保留原运行和递增认领历史,二者不是同一个操作。

运行以租户→计划→运行锁序认领和执行,独立准入代次使禁用后重新启用也不能复活旧运行。普通编辑保留已有运行快照。30 秒租约、token、运行版本和最终期限共同 fencing;本地事务截止 10 秒,临时失败本轮最多五次并受 24 小时窗口限制。失败恢复只锁运行→历史,不反向进入租户/计划;提交应答丢失先读持久结果,旧执行者不能覆盖新租约。后台不伪造在线 Actor。

通知处理器在创建/替换内容时检查当前发送权限,保存渲染快照而非原变量;执行时复核当前能力和收件状态。通知任务/outbox/后台审计、job done 与 attempt done 同事务,使用原运行键确定通知业务身份。新增 AppendWork 窄口要求真实事务和受限 WorkIdentity,在线 Append 的租户契约保持不变。管理 DTO/审计不输出正文、摘要或租约凭据。

专项包含真实通知链路、精确幂等、双版本恢复、停用代次、并发调度、错过周期/轮巡、公用断言拒绝原始错误、真实 SQL 提交故障和十秒回滚。审查同时修复单条调度失败被吞掉的可观测缺口,批次保留固定错误码并返回依赖错误。其余已完成验证与日志见 docs/evidence/m5-jobs-progress.json。

本轮双库各 13 项不同的任务顶层专项、各 81 项完整业务 race、各 10 项迁移专项通过,另逐库复验并发任务错误检查。完整业务集显式跳过真实 Redis 消费专项与容量计时。共享成功断言现会拒绝未知原始 SQL/JSON 错误,失败诊断只留类型与稳定业务码;加强后双库完整集通过。78 条任务实际响应通过 OpenAPI(52 条加密、26 条明文),既有 OpenAPI 合同语义保持不变,979 个示例通过。23 个 workspace 成员 race/vet、23 个全新缓存独立模块检查及 24 模块依赖边界通过,最终 infra race/vet 与 app vet 复核通过。

前端累计 111 项测试、任务页面 4 项复验、类型检查和生产构建通过。当前源码的双库发布 API/worker/CLI 验证定时受理与通知回执关联、人工命令幂等、停机排队、重启恢复和 SIGTERM 退出;对象存储关闭,因此不作组合恢复证据。51 页文档同步、链接检查与构建通过,浏览器核对新手册、字面占位符、首页及四分册导航。本轮八个专用测试库及运行夹具库/Redis 已清理,保留原基线环境。后端 5def444 与前端 6b91dc6 已推送,外层仓库没有远程。

本增量没有将 R2.3 或 M5 标成完成。Redis 正式运行配置、完整积压指标/告警、保留策略及 R2.3 发布恢复仍待实施;达梦 v19 未认证,S3 与任务/通知组合恢复没有在本项运行检查中认证。

# 9. Redis 正式入口与积压观测增量(2026-10-25)

沿用 schema v19,不修改已发布迁移字节。messaging 通过当前环境 YAML/环境变量加载,worker 显式选择 Event 或 Redis Streams。Redis 使用独立客户端、关闭自动重试、启用 context 截止,启动检查 AOF/noeviction/WAITAOF;缺失可靠前提直接退出,不自动降级。不同业务库须显式选择不同部署前缀,同库 worker 保持一致;配置切换不迁移已确认消息。

API 每十秒在最多三秒的只读一致快照中调用 messaging/infra 各自公开聚合口,表/状态/标签均固定,不跨模块读取实现或返回业务身份。抓取只读内存,慢采样不持快照锁;独立 TryLock 拒绝重入,避免旧慢结果覆盖新快照。失败保留上一份完整数据并发布成功/最后成功时间指标,不把故障伪装成零积压。

due 明确采用调度点与租约截止的较大值,表示时间条件已满足,准入仍由执行器复核。审查发现首次 inbox 的 due_at=0 会吞掉旧等待年龄,已按有效租约时间修复并以零值/旧待办并存及单条过期记录复验。文件正常 deleted tombstone 只计到期复查,不作为失败重试;另观察通知 queued 业务总量/受理年龄,覆盖 outbox 已 sent、尚未进入 inbox 的窗口。说明、配置和告警表达式见 可靠消息后端与积压观测。

本轮 MySQL/PostgreSQL 各 85 项完整业务 race 通过,其中真实 Redis 消费专项和容量计时在完整集中显式跳过;真实 Redis 消费另在两个库各 1 项专用 AOF 环境复验通过。Redis 适配器 4 项真实 AOF/PEL、重启、毒消息/关闭和缺少 AOF 拒绝通过。聚合/中途失败、零 due/旧记录、有效与过期租约、业务排队窗口及慢采样并发在两个库各 3 项专项复验通过。

当前源码的双库 API/worker/CLI 发布程序通过 Redis 模式任务→通知回执、API 单独排队、worker 重启恢复、缺少 AOF/部署前缀拒绝及 SIGTERM 退出;API 实际指标观察到到期计划。23 个 workspace 成员 race/vet、23 个新缓存独立模块和 24 模块依赖边界通过;配置单元回归与 52 页文档同步、链接、构建及四分册浏览器检查通过。十个专用业务库及本轮临时 Redis/运行库已清理,保留基线。没有新增外部依赖或改动前端/JSON 合同。后端 cf6fa95 已推送,外层没有远程。

从本轮首个源码文件创建至归档约 0.45 小时,含集成测试、下载与等待;前置阅读及有效编码时数未单独计量,不能据此直接推算完整 M5 工期。

该增量验收时尚无外部告警渠道、broker XLEN/PEL/lag 全量指标、自动保留期清理或在线消息后端迁移。当时数据库去重/终态/历史持续保留,Redis 不自动裁剪,达到上限失败关闭;保留/恢复后续结果见第 10 节。双库及运行检查的实际结果归档于 docs/evidence/m5-operations-progress.json。

# 10. 引用保留与组合恢复(2026-10-25)

Redis 正式 worker 增加可选维护窄口,每 30 秒有界轮巡本进程订阅主题。默认保留 168 小时,配置 0 关闭;SDK 非零值必须为整数毫秒。只删除窗口外、所有现有组已读取且没有 PEL 的引用,服务端时间、全组检查和删除在同一 Lua 脚本完成。条目及主题双层轮巡避免前排 pending 或故障主题饿死后续记录。零组保留,元数据异常或超过 64 组拒绝回收;64 位序号用十进制字符串精确比较。达到容量仍失败关闭,不强裁未确认记录。SQL 业务快照、去重身份、终态和执行历史持续保留,未实现 SQL 自动归档或到期删除。

双库分别运行实际发布 API/worker/CLI,在两租户中创建通知、一次性任务及文件;停止并 join 全部写入进程后,备份 SQL、Redis AOF/PEL 和对象字节。恢复目标使用独立数据库、Redis、S3 服务与凭证。每库 48 表全指纹相同,3 个对象共 10,485,782 字节完整恢复;待执行任务、待确认通知和文件删除继续完成,跨租户下载仍拒绝。完成事件再次进入 Redis 并被消费后,原回执及认领历史仍各一条;各任务只有一次有效执行。恢复端 SIGTERM 正常退出,专用资源及私有快照随后清除。

另行验证带非空 v16 旧数据升级到 v19、九张新增表的离线一致历史、幂等迁移、全库恢复指纹、序列新增与唯一/跨租户外键拒绝。回滚 v16 快照后,校验过摘要的旧版 API 实际启动、ready 成功、匿名文件请求被拒绝、SIGTERM 返回 0,随后库指纹保持不变。离线种子不冒充实际投递;实际投递由上述组合演练证明。工具与复验前提见 发布验证与恢复演练。

受限对象恢复辅助程序只访问数字 loopback 地址、随机演练桶和私有目录,不使用云默认凭证链或环境 HTTP 代理。显式拒绝重定向;真实 SDK 的 307/308 回归证明不会转发到第二个服务。继续使用已批准的通用 S3 SDK,没有新增依赖、前端或 JSON 合同变更。

最终检查:MySQL/PostgreSQL 各 85 项顶层完整业务 race 通过;完整套件跳过真实 Redis 专项与非 race 容量场景,Redis 由单独的每库一项集成与十项真实适配器用例覆盖,容量本轮未测。23 个 workspace 成员 race/vet、23 个新缓存独立模块及 24 模块依赖边界通过;配置回归、受限 S3 SDK 重定向测试、双库发布构建通过。四个最终验证库已删除,演练工具各自清理其专用库、容器、匿名卷和私有快照,保留原基线。

52 页文档同步、链接检查、构建及首页/四分册/保留与恢复章节浏览器核对通过。后端 e1c2ccc 已提交;推送结果和日志摘要见 docs/evidence/m5-retention-recovery.json。R2.3 本地工程基线通过;外部告警渠道、broker XLEN/PEL/lag 全量指标、在线消息后端迁移、SQL 自动归档、达梦 v19 与生产 RPO/RTO 未认证,不扩展为其他消息后端或远程通知渠道支持。

# 11. 代码生成差异与退出审计(2026-10-25)

复核发现旧门禁没有连接“生成”与“运行”:handler/service/repository 为类型或常量占位,Vue 仅有 Page/BasicForm;server 工作区检查只编译未挂载的 codegenverify 包,HTTP 检查执行手写 widgets/posts。生成 migration 仍含 MySQL AUTO_INCREMENT,而旧数据库测试只执行权限/菜单种子,不执行生成业务表。多表 Vue/API 离线校验按 basename 落盘还可能漏检前一表。因此旧“已覆盖”不能作为 R2.4 产品完成依据,已更正 CLI 核对表。

本增量补充确定性 ZIP、实际内置模板版本、只读 diff 的新增/删除/修改与有界正文,以及 preview/export/import 的排他写入。完整产物集共用16MiB输入/解压总量、1MiB单项与512项限制,拒绝穿越、重复、未知条目和终端控制。审查发现 ProjectConfigFromZIP 可在 VerifyZIP 之前无界读取 manifest,现改为先走同一有界校验;裸回车显示伪装和末行标记少计行数也已修复并补回归。操作见 CLI 手册。

CLI 全包31项顶层单测 race/vet、23个 workspace 成员 race/vet、23个新缓存独立模块和24模块依赖边界通过。实际 CLI 二次导出字节相同、已有目标/符号链接拒绝且原字节保留、JSON与源码行差异、无变化空数组及旧包结构校验通过。旧 offline pipeline 也通过,但只记为预览工具兼容,不记作生成 CRUD 验收。可选 Node/工作区检查在普通单测中跳过,offline pipeline 另行运行其已定义步骤。没有数据库或 HTTP 新验收结论,没有新增外部依赖。结构化记录见 docs/evidence/m5-codegen-diff-progress.json。

R2.4 和 M5 仍未完成。后续补齐一个仓库中原本不存在的生成资源:同一 ZIP 的实际双库迁移、HTTP CRUD、页面与双租户/四类权限E2E,先修复多表互相覆盖及工作区临时文件保护,再验证生成代码而非空占位。身份与真实 IdP SSO 保留原范围。

# 12. 可执行生成包增量(2026-10-25)

新增生成器0.3.0的显式 tenant-crud-v1,默认 crud-v0 继续保持旧占位预览。当前模板只接受必填、已分类为plain的租户共享非敏感字段,限制受审表名/字段长度、宿主和派生Go符号冲突;拒绝可空列、凭证/个人信息及未分类资源。没有新增外部依赖。公开DTO去除服务端租户/审计字段,bool输入用指针区分漏传和false,bigint用规范int64字符串避免前端精度损失。

生成handler在正式fagoauth同包装配认证/Origin/权限/统一响应;service/repository在fago-system同包复用当前读授权和租户写锁。count/page为一致只读快照;更新/软删按租户、ID、版本、有效标记CAS,业务与仅含ID/版本的审计同事务提交。MySQL与PostgreSQL分别生成SQL:复合租户唯一键、外键、版本范围及活动分页索引。MySQL不允许CHECK引用自增ID,数据库约束删除标记非负,应用CAS保证标记等于服务端ID;PostgreSQL再增加0或当前ID约束,不把两种方言伪装为通用DDL。

每包保存原配置和逐文件摘要;执行前与当前受信模板逐字节比较,重算摘要的改写包仍拒绝。验收物化操作者的同一ZIP,不用重新生成或手写业务替换。Go/前端都在私有源码副本装配,前端只复用锁定依赖,真实路由清单不写入。SQL创建前先确认128位随机专用库名不存在,登记创建意图后再发送DDL;响应前中断仍清理。子进程组先关闭并join,再清理专用库和副本,已有库或工作树文件不进入清理清单。

从真实库导入配置增加 --format config,不自动填入安全分类;修复旧加载器把logical_type映射为空Type的问题,元数据专项增加具体逻辑类型/非空断言。双库从元数据导入、显式分类后生成与原包逐字节相同的ZIP;中文元数据使用UTF-8客户端。OpenAPI片段新增业务schema、分页/版本/错误/JWE合同;合并到内存宿主合同后,MySQL/PostgreSQL各72条实际响应校验通过(每库48加密、24明文),实际处理器覆盖plain/RSA-AES/SM2-SM4三套正式内容链路。

同一目录资源此前不存在于宿主业务代码。双库私有下一版迁移、真实HTTP CRUD race与实际API入口构建通过:跨租户读写拒绝、count/page、漏传bool、越界int64、true→false持久化、版本冲突、软删除标记和空列表、四类权限逐一撤销、不换token的当前授权、审计失败回滚。原正式Version=19及v1–v19迁移字节保持不动。Vben生成API通过正式admin客户端,生成页面含真实列表/分页/表单/写操作及按钮权限;临时登记清单后类型检查和生产构建通过。

本轮最终检查与提交证据归档于 docs/evidence/m5-codegen-executable-progress.json。此增量仍不结项R2.4:完整浏览器页面CRUD/按钮权限尚待执行,多表/边界类型的实际宿主矩阵、旧crud-v0临时工作区校验的覆盖保护仍需迁移;自定义资源须增加自己的业务夹具。生成迁移只在私有验收副本采用,不能称已部署业务表;达梦生成模板、关系/归属范围/可空或敏感字段、任意代码执行信任、真实生产负载均未认证。

# 13. 类型矩阵、元数据快照与旧门禁迁移(2026-10-25)

继续使用0.3.0生成器与tenant-crud-v1,不修改正式schema v19。新增四表验收配置 configs/codegen/type-matrix.project.json,分别覆盖单独varchar、boolean、bigint、text,包含最长合法项目/表/字段名称。该矩阵发现混合字段目录夹具没有暴露的未使用组件问题:纯布尔表单仍导入Input,纯文本表单仍导入Switch,宿主noUnusedLocals会拒绝。现按实际字段选择导入;同一四表ZIP通过MySQL/PostgreSQL实际API入口构建、Vben全量类型检查及生产构建,产物54项全部保留逐表身份。

旧crud-v0的server/vben工作区入口及CLI旧离线flag统一改为有界私有宿主路径,不再写真实codegenverify目录、前端临时文件或全局固定临时输出;JSON报告改为实际legacy私有门禁名称。前端每表独立API/Vue目录,孤立兼容API也加表名前缀,避免后表覆盖首表。双表旧包正向通过;只破坏首表的API、Vue或Go时,三次实际门禁均拒绝。旧占位模板仍不能作为真实CRUD验收。保留调用者的历史兼容函数签名,CLI传递cmd.Context,执行与清理继续使用有界进程组和私有目录生命周期。

LoadProject现在只接受未开始事务的GORM连接,并在repeatable-read只读事务中读取项目、表与列。明确拒绝外层事务,因为GORM嵌套savepoint会忽略新的隔离级别与只读选项。当前CLI租户键仍由操作者显式传入,未来在线调用须独立完成身份授权。查询、取消或提交失败返回零值,不导出半份结果,也不自动重试到另一个元数据版本。

双库race专项各4个顶层用例通过:精确逻辑类型映射、并发一致快照、外层事务拒绝、读后取消/列查询失败(失败项含两个子场景)。屏障先在项目读取后暂停,再让另一事务完整提交项目名/表说明/列类型和nullable修改;旧读取见完整旧版,新读取见完整新版。读取goroutine有取消、释放屏障和join清理,未将延时当作竞态证明。脚本故障测试增至8项,包括旧逐表路径与操作者历史临时文件保留。

最终检查与提交记录见 docs/evidence/m5-codegen-matrix-progress.json。此增量关闭类型矩阵、导入快照与旧工作区覆盖风险,R2.4仍需实际生成页面的浏览器CRUD/按钮与租户验收;任意自定义资源仍须自己的业务测试。身份、多终端和真实IdP SSO继续保留原范围,M5尚未完成。

# 14. 生成页面浏览器闭环(2026-10-25)

对同一受信目录ZIP启动两个独立环境,分别使用MySQL和PostgreSQL、真实Redis、实际API二进制和私有Vben源码。浏览器从正式租户登录与动态菜单进入生成资源,未使用mock、注入token或手写业务替代产物。每库准备20条分页数据,实际新增第21条并切到第二页;更新标题、描述、true→false及int64上下界,版本从1推进到2。

浏览器发现并修复两处生成页面缺陷:Ant Form未绑定model不会触发finish,因此保存没有发出请求;Vue表格默认不显示布尔VNode,因此显式渲染“是/否”。表单现在绑定独立draft,父页面继续负责请求与版本;所有布尔列按dataIndex分别渲染,四表类型矩阵增加第二个布尔列以验证连续分支,仍保留无布尔列的文本/整数页面。

每库使用同租户只读账号确认能够查看第二页且没有新增/编辑/删除按钮;退出后登录租户乙,初始列表为空,新增仅属于乙的资源;再次退出并登录甲,只看到甲的分页数据。删除甲资源后回到第一页,刷新仍不可见且下一页不可用。每次登录均使用仅存私有0600文件的随机测试口令,退出及服务join后才读回数据库。

最终数据库断言确认:甲资源version=3、deletion_marker=id、false及int64下界;乙资源version=1、活动状态、true及int64上界;两个tenant_id不同,20条分页夹具未改写,四条资源写审计齐全,只读账号写审计为零。读回断言自身另在两个库执行服务级自测,此自测不计入浏览器证据。真实浏览器的九项操作见证与数据库race检查全部通过。

最终ZIP还重跑双库元数据导入→显式配置→相同字节包、双方言迁移、实际生成HTTP CRUD及三协议144条响应合同、实际API入口构建、Vben类型检查及生产构建。布尔/无布尔与长名称四表矩阵通过双库宿主构建、Vben类型检查及构建。协调器12项测试覆盖见证身份/大小/链接拒绝,以及父进程已退出、子进程忽略TERM时的整组清理;实际运行完成后删除随机专用库、Redis和私有源码/口令。结构化结果见 docs/evidence/m5-codegen-browser-progress.json。

CLI全包race/vet、23个workspace成员race/vet、23个全新缓存独立模块及24模块依赖边界通过;52页文档同步、链接检查、构建及首页/四分册/新增章节锚点浏览器核对通过。CLI修复e5f7894已推送;外层仓库没有远程。本轮未重跑完整后端业务和生产容量测试,不把生成目录专项扩展为整个平台再认证。

R2.4的受限tenant-crud-v1本地工程退出条件通过。默认crud-v0仍为历史占位预览;任意自定义资源须自己的业务夹具,关系/可空/敏感字段、归属数据范围、达梦生成模板与生产负载未认证。正式schema仍为v19,没有把生成业务表部署到现有环境;没有新增外部依赖。M5整体仍需身份、多终端与真实IdP SSO。

# 15. 客户端注册与设备会话(2026-10-26)

schema v20发布四个固定realm元数据与客户端注册表,保留既有admin-web/platform-web的身份与默认期限;旧会话实际回填audience、subject_type/id与client_version。新外键和CHECK拒绝跨realm主体或未知历史client;非空v19升级、已知身份/令牌摘要保留、幂等和未知client的dirty/readiness拒绝均在MySQL/PostgreSQL通过。达梦仅追加源码,未执行v20认证。

系统模块持有配置实现并向身份签发/业务守卫提供窄策略合同,app显式注入平台身份守卫,无模块循环或跨internal导入。配置写先锁固定控制行,再锁平台账号/会话与目标client,低频配置串行化避免共享锁升级互锁。保存按版本CAS推进client_version,并在同事务追加只含realm/clientId/版本的平台审计。业务事务持有当前client共享读;停用、版本变更及重新启用后,旧token、refresh和旧业务context均不能复活或继续写入。

口令入口只接受同realm启用的web/password客户端。访问、刷新、绝对期限同时受应用上限、进程配置及安全策略约束。登录在账号锁内保留最新N-1条当前client有效会话,再签发新会话;deviceId只保存散列,展示标签不参与授权或绕过上限。本人指定设备撤销与全端撤销都在账号/当前会话锁内重新校验client与口令状态,审计失败整体回滚。配置存储暂时故障返回503,不持久撤销原有效会话。

审查发现并修复MySQL RR旧快照的上限漏洞:在等待账号锁前建立的快照可能看不到前一个登录刚提交的会话。保留集合改为当前锁定读,并通过四请求共同建立旧快照的屏障验证limit=2;私有模块副本移除修复后,该断言按预期失败。另修复单条撤销仅锁目标、不复核操作者client版本的窗口,并验证旧Principal不能撤销另一有效client会话。

平台新增“身份客户端”分页与编辑页,读写权限分开,页面明确标注未接入的会员/服务/授权码认证。工作台展示终端/标签并提供“退出所有设备”,前端对成功或失败迟到均保留新身份。MySQL/PostgreSQL均通过真实Redis、当前API与私有Vben副本的浏览器新增、停用/重新启用、只读按钮、租户导航隔离及全端退出,服务join后直接核对version=3、三条配置写审计、只读账号零写审计及租户全部会话已撤销。

双库各五项客户端顶层race专项与v19升级专项通过;三协议合计114条实际响应合同通过(76加密/38明文)。前端116项测试、类型与生产构建通过,OpenAPI 1019个样例通过。生成器宿主采纳改为读取当前连续迁移清单,在私有副本追加下一版;当前v20宿主中同ZIP双库生成CRUD/合同回归通过,正式迁移不写入生成业务表。结构化记录见 docs/evidence/m5-identity-clients-progress.json。

完整双库回归最终通过:每库90项应用顶层用例、14项迁移顶层用例,均开启race;每库明确跳过Redis Streams与容量两项opt-in,未计入通过数。首次完整运行器遗漏专用Redis导致五项失败,另有旧正常撤销夹具仍处于强制改密状态;后续补齐独立loopback Redis,并仅修正该测试场景的正常身份前提,双库定向及完整回归均通过,业务守卫未放宽。工作区23模块race/vet、23模块独立检查及24模块边界通过;13项Python验证器测试通过。文档同步、检查与构建为53页,首页、四分册、新手册及本节锚点在真实浏览器核对。专用数据库/Redis、私有凭据/前端副本及验证进程已清理,保留原有三台数据库容器。后端提交 3b4e8bd、前端提交 36f5f37,外层更新子模块指针;本轮未单独计量AI工作耗时。

复验使用专用测试库与独立Redis,在根目录先加载 source scripts/go-env.sh,再进入 fago/apps/fago-server 执行 go test -tags=fago_mysql -race -count=1 -v -run '^TestIntegration' -timeout=15m .,PostgreSQL改用 fago_postgres;迁移在 fago/fago-migrations 执行相同前缀。身份专项为 TestIntegrationIdentityClient*,非空升级为 TestIntegrationIdentityClientsUpgrade,真实浏览器读回夹具为 -tags=browser,fago_mysql -run '^TestBrowserIdentityClientsAcceptance$'(需要私有夹具文件与完成见证,不能单独将其输出视为浏览器操作)。Redis Streams与容量是现有显式opt-in场景,本轮完整race命令中的跳过不算通过。

该增量不结项R2身份或M5。会员账号/会话、服务凭证与scope、原生PKCE、provider配置与绑定、双应用真实IdP SSO及统一登出仍须继续实施;现有注册元数据不代表上述认证能力可用。没有新增外部依赖或JVM,也未做生产部署/容量或达梦v20认证。

# 16. 独立会员认证与管理(2026-10-26)

schema v21追加member_users/member_sessions/member_tokens/member_management_events,复合外键绑定租户与主体,member会话CHECK固定realm/audience/subjectType;auth_sessions仍只供已有admin/platform使用,不扩大validRealm或走userTable/PolicySnapshot的管理端回退。服务通过单独MemberPrincipal携带私有access证明,导出的主体ID被修改或凭空构造时也不能调用本人写操作。

同库身份窄口先共享锁租户,复核状态、session_version和identity.members套餐能力,随后锁会员、会话/token与client。会话上限使用当前锁定读;每个会员的认证活动、刷新、改密和撤销按账号锁串行。访问/刷新/绝对期限受client与进程上限约束,deviceId只存散列。refresh轮换原子消费旧摘要,重放的撤销与审计提交后才返回401。自然密码到期持久转为强制改密,放宽策略不能解除既有受限;锁定或停用恢复、租户恢复、密码/client版本变化均不能复活旧凭据。依赖故障只拒绝本次请求,不持久撤销。

管理端按当前admin权限维护本租户会员,创建/重置复用M2的保留管理员与本人再鉴别事务,失败计数及失败审计不回滚。账号、会话撤销与会员管理审计同事务;管理审计只记录定位键、状态和版本。新建/重置一律首次改密,重置清除会员锁定但不启用已停用账号。会员不继承后台角色/部门,也不占用原后台用户配额。操作见会员认证与账号管理。

新增/api/member/v1认证、自助和设备入口,以及admin域会员管理API。审查识别统一JWE原先仅覆盖admin/platform,现将member/service前缀纳入相同加密、请求绑定和防重放边界;service路径的加密覆盖不代表服务凭证handler已实现。另修复access到期早于client/当前idle失效的错误码优先级,命名用例证明只有单纯access过期才返回401001。

v20允许预登记member-web,因此v21只在缺失时追加默认密码client,保留既有同名client的版本、禁用或native/授权码策略,不将升级当作自动开通。非空v20自定义client及“未登记/已登记”两种迁移、幂等、无默认账号和不自动扩套餐能力均通过双库race专项。达梦只追加迁移源码,未运行v21认证。

本轮当前验证:双库各六项会员顶层race专项(初轮五项加跨租户专项),涵盖首次改密、跨realm/tenant、刷新重放、启停/租户恢复、limit=2并发、到期分类、自然到期后放宽策略、重置、锁定、审计回滚和数据库约束;三协议真实TCP/TLS、独立Redis与HTTP合计192条实际响应合同通过,其中128加密、64明文。前端应用120项测试通过,类型与生产构建通过;静态合同样例1115条。拓展monorepo扫描另有三个上游form-ui测试文件失败(两个断言及一处硬编码element-plus测试导入缺失),源文件不属本轮变更,未计入应用通过数,也不宣称全monorepo测试通过。

会员管理真实页面已在MySQL/PostgreSQL验证编辑/启停、只读按钮、双租户数据和平台导航隔离,服务join后核对version=3、三条管理事件、只读零写与另一租户version=1;完整业务race回归双库各96项应用、15项迁移通过;每库明确跳过Redis Streams与容量两个opt-in,未计入通过数。首轮迁移套件的v9历史断言仍固定旧授权版本17,现依据v21目录发布改为18;业务版本、会话版本和旧身份/自定义权限保留断言不变,修正后双库迁移通过。工作区23模块race/vet、23模块独立检查和24模块边界通过;同一canonical ZIP在当前v21宿主中追加私有v22业务迁移,双库生成CRUD/三协议144条合同与真实API入口编译通过,正式迁移不写入生成业务表。前端仅提供后台会员管理,不把会员token装入Vben后台身份;会员自身认证由实际HTTP测试客户端验证。完整Web/原生SSO客户端、账号注销与渠道登录、服务凭证/scope、provider与绑定、双应用真实IdP SSO及统一登出仍继续实施,M5不结项。

结构化结果与原始日志摘要见 docs/evidence/m5-member-identity-progress.json。54页文档已同步、检查、构建并核对首页/四分册/新手册与验收节目录。后端 220e625、前端 55c1903(功能提交ad01007)已提交并推送,外层更新两个子模块指针;本轮未单独计量有效AI工时,没有新增外部依赖或JVM,也不作生产/容量或达梦v21支持声明。

# 17. 会员本人注销(2026-10-26)

新增DELETE /api/member/v1/profile/me,仅接受当前正常会员access、本人currentPassword和confirm=true,不接受目标主体或租户参数。受限账号须先改密。租户→会员→当前会话/token→client栅栏内复核口令;错误口令提交失败计数、阈值锁定及失败审计后返回拒绝。成功将deletion_marker设为本人ID、status设为disabled,清空旧密码散列、推进账号/密码版本并撤销所有client会话,member域认证审计同事务提交;任何审计或数据库失败全部回滚,不自动重试。成功后统一清除当前与历史member刷新Cookie。

墓碑不再出现在活动管理列表,管理员启用或重置也不能恢复。旧access、refresh和缓存Principal全部拒绝,旧refresh退出仍幂等成功。同名重建须管理员再鉴别,产生新主体且仍强制首次改密,不能继承历史会话;外部绑定尚未接入,后续仍须按主体ID隔离。账号/会话历史与审计继续保留,不宣称个人数据已物理删除,也不提供恢复墓碑入口。操作与失败处理见会员手册。

固定时序测试发现MySQL锁反转:注销先持账号定位键锁,再更新用户名唯一索引的deletion_marker;旧Login先在用户名索引FOR UPDATE,可能与前者相互等待。仅记录驱动1213匹配布尔的诊断确认死锁,不输出错误链或凭据。Login现先无锁查定位ID,再按与本人命令一致的tenant/id锁定当前活动行并核对用户名。初始快照可能过时,但只会拒绝该次登录,不切换到同名新主体或签发旧凭据;不引入隐藏自动重试。

最终MySQL/PostgreSQL各12项会员顶层race专项通过,其中六项本人注销场景覆盖生命周期/同名新主体、审计失败、并发刷新、首次受限、自然到期和旧定位登录栅栏;其余六项复验既有会员认证/配额/启停/租户边界与HTTP。三协议实际响应252条通过(168加密、84明文),HTTP核对成功后当前及历史Cookie清除、错误来源/参数/密码与旧凭据拒绝。23个workspace模块race/vet、23个新缓存独立模块、24模块边界、OpenAPI1124样例及生成类型检查通过。golangci-lint本机不可用,已执行gofmt、go vet及定向只读审查。本轮没有前端运行逻辑改动,只更新生成合同类型;没有重复完整后端业务/迁移、前端应用/生产构建、浏览器功能或生产容量验收,不把会员专项当作整个平台再认证。

结构化证据为 docs/evidence/m5-member-closure-progress.json。首次HTTP测试误把多条历史Cookie清除判为失败,已改为核对当前名及逐条清除属性;死锁屏障的首次失败及诊断日志保留,不计入通过数。schema仍为v21,无迁移或新依赖。后端d2aa2c0、前端生成类型3fc9a17已提交并推送;外层更新子模块指针,外层无远程。全部随机测试库、Redis及工作进程已清理,原三个数据库容器保留;本轮未单独计量有效AI工时。文档同步/检查/构建与新增说明浏览器核对完成后归档。M5保持实施中。

# 18. 独立服务身份与 scope(2026-10-26)

schema v22追加service_accounts、service_credentials、service_tokens、service_account_scopes、service_scope_catalog和service_management_events。服务主体不适配为admin Actor,不继承人类角色/部门,也不从自然人密码或Cookie恢复。token到credential的复合外键同时绑定tenant/account/keyId,防止同租户跨账号拼接;固定realm/audience/subjectType与各版本。高熵secret只存域分离摘要,创建/轮换成功提交后仅返回一次;失败返回空值,不记录到审计、日志或浏览器持久存储。

创建、授权修改、启停和轮换复用M2保留管理员再鉴别事务。租户排他锁内保持最多100个账号(含停用)的固定上限,不冒充后台用户套餐配额。任何编辑撤销旧access,启停额外废弃secret;重新启用及client版本变化后须显式轮换。轮换、旧凭据/token撤销、版本和元数据审计同事务;审计失败全部回滚,再鉴别失败仍提交管理员失败保护。机器签发/消费按租户→账号→credential→token→client复核,访问时重验私有原access证明,旧Principal不能绕过停用或scope变化。

当前只发布有真实消费者的identity:self:read与infra:dict:read,申请必须显式为当前授权子集,并与当前套餐能力交集核对;后者还要求infra.configuration。scope快照固定在token内,任何scope失效时整token拒绝,不静默扩权/降权。infra新增消费者定义的同库只读窄口,仅获得权威tenantId和tx,复用父类型可见性、启用项过滤与1000项上限;业务只读,但认证行锁所在事务不是数据库ReadOnly事务。没有参数值、管理写权限或任意scope。

新增机器API与admin服务维护API,操作见服务账号与scope。机器请求要求service标记与JSON/JWE,拒绝Origin/Cookie/Referer/Fetch元数据和租户覆盖;独立Redis窗口限制每IP及client/key,依赖故障关闭入口。无浏览器refresh、自然人密码或通用OAuth2 token endpoint;现有client_credentials元数据只供本项目受控交换,不作标准授权服务器支持声明。

双库各七项服务顶层race专项通过,覆盖真实scope消费者、secret摘要、轮换/启停/期限、审计故障、旧证明、两个租户/同租户不同账号复合FK、client与租户恢复、能力撤回。四事务先建立旧RR快照再竞争账号,limit=2仍只有两枚有效token;签发审计故障同时回滚新token和限额淘汰。凭据自然到期交换拒绝另行在双库复验。首轮边界夹具固定clientVersion=1且沿用租户停用前管理员上下文,已改为读取当前注册版本并真实重新登录;业务CAS与认证守卫未放宽,首次失败不计为通过。

非空v21旧client/会员升级、已登记或缺失service-api两种路径、原身份/版本保留、无默认服务账号/凭据、无自动套餐扩权、幂等与ready在双库通过。v1–v21 SQL原字节不变;v9历史授权目录期望随v22新目录从18推进到19,旧业务/会话/口令等保留断言不变。达梦只追加v22源码,未执行新版本认证。

服务实际响应合同164条通过(80加密、84明文;其中44条为明文限流专项),覆盖三套真实TCP/TLS内容链路、无Cookie、失败再鉴别、版本冲突、scope拒绝及第21次限流;Redis缺失503另由真实HTTP验证,不计入164条采样。会员当前完整回归响应另有252条,身份增量合计416条通过。完整业务race双库各109项应用、16项迁移通过,每库跳过Redis Streams与容量两项显式opt-in,未计入通过数。23个workspace成员race/vet、23个新缓存独立模块、24模块边界通过;golangci-lint不可用,执行gofmt、go vet及定向审查。OpenAPI1188个静态样例、前端应用126项(12文件)、类型与生产构建通过;未重跑整个monorepo,§16的上游form-ui失败记录不因此清除。

Vben新增服务管理页和一次性secret视图,敏感输入结束即清空;六项页面回归覆盖失败不重发、当前版本、关闭清除、身份变化及迟到secret不发布。MySQL/PostgreSQL均在真实Redis/API/私有Vben中完成管理员列表、编辑取消、真实只读角色、双租户和平台导航隔离;API/Vite先join后核对两租户名称/version=2及各两条准备写审计、只读零写。浏览器没有执行创建、轮换或授权保存,写闭环由真实HTTP证明。首次PostgreSQL浏览器环境在见证前结束,未计为通过;清理后以新环境完整复验并读回通过,测试等待窗口调整为60分钟,不改变生产会话期限。

同一canonical ZIP在当前v22宿主中追加私有v23迁移,双库元数据导入→相同ZIP、实际生成HTTP CRUD race、三协议144条实际合同和真实API入口构建通过;正式schema不写入生成业务表。后端b73a66f、前端3871039已提交并推送;外层同步子模块指针,外层无远程。本轮没有新增依赖或JVM,未单独计量有效AI工时;不作生产容量、自动历史清理、DM或完整OIDC支持声明。结构化证据为 docs/evidence/m5-service-identity-progress.json。

# 19. OIDC 协议适配基础(2026-10-26)

身份模块新增内部受控OIDC客户端,复用仓库已经锁定的 coreos/go-oidc/v3 v3.16.0 与 oauth2 v0.32.0,在身份模块显式声明依赖,没有引入另一种IdP协议栈或JVM。当前尚未装配业务HTTP入口、数据库provider配置、外部绑定或本地SSO会话;本项不能当作原生客户端或双应用SSO已交付。

协议层固定授权码/S256/openid、一次性code不自动重试及显式token认证方式;校验签名、discovery与token的精确issuer、受众/azp、nonce、iat/nbf/exp、可选at_hash。登出证明独立校验事件、sid/sub、jti、五分钟iat窗口与禁止nonce;数据库去重和本地撤销仍由后续业务用例完成。网络层将后端访问origin与浏览器精确回跳白名单分开,逐次DNS解析后向批准IP拨号,禁用代理/重定向,保留完整TLS校验、超时及1 MiB解压后正文上限;公网默认拒绝私网/保留地址,企业私网与私有CA只能由部署信任配置显式批准。上游OAuth错误正文、code和token不进入错误链。开发HTTP仅允许显式批准的字面loopback IP。

九项协议/网络顶层race测试通过,覆盖真实TLS的三种token认证方式、签名/claim拒绝、code重放、JWKS轮换、未知CA、地址/回跳隔离、重定向及正文边界;这套签名攻击夹具不是生产IdP。固定 ZITADEL v4.20.0 (opens new window) 已在独占临时PostgreSQL与仅loopback发布端口中初始化,真实discovery与当前适配器的专项race检查通过。尚未验证真实登录、双应用SSO或统一退出,不能用能力声明代替端到端验收;服务端许可证为AGPL-3.0-only,不沿用旧Apache-only描述。临时容器、网络与随机凭据已清理,原三个数据库容器保留。

23个workspace成员race/vet、23个新缓存独立模块及24模块边界检查通过。首次直接关闭workspace复用旧私有模块缓存导致API不匹配,未记为通过;标准独立脚本的首次公网下载遇到unexpected EOF,保留失败记录后改用本机公共模块归档作为文件代理来源,Go仍校验公共模块摘要,私有模块全部从当前源码重新打包并使用新缓存。未修改业务认证、迁移或模块边界以迁就检查。结构化结果见 docs/evidence/m5-oidc-protocol-progress.json。

# 20. OIDC 提供方与绑定管理(2026-10-27)

schema v23追加三表、平台提供方/绑定及租户绑定共11项管理操作,前端实际API接入。进程统一配置批准issuer、网络origin、回跳、CIDR、CA与外部秘密引用;没有管理请求自定义网络/路径或秘密明文。配置realm/tenant/code/client/issuer不可变,任意编辑推进版本;专用关闭不依赖IdP、秘密或信任档案当前可用性。

绑定按realm/tenant/精确issuer/sub唯一,三个主体外键与CHECK防止跨租户/类型拼接;同issuer换provider仍不能重复认领。只绑定现有可用主体,不按邮箱合并,不自动建号。停用保留键,墓碑能解绑但不能恢复,同名重建不承接历史外部身份。DTO只返回范围指纹;fago-security增加有界opaque_id规则与OIDC协议材料全遮盖。

平台固定配置控制锁及ReadCommitted/CAS,避免并发等待后使用旧RR快照。首轮PostgreSQL并发出现40001导致503而非409;修复后双库专项重验,未添加敏感命令自动重试。配置/绑定与领域审计、平台第二份审计同事务;专项注入两种审计故障检查全部回滚。错误口令先于外部秘密文件读取,不能据此探测文件存在性。

本项仅为管理面,尚未签发SSO会话;认证模式、一次性state/nonce/verifier、本地会话最终事务、原生PKCE、真实双应用IdP SSO与RP/backchannel统一退出保持必做。管理元数据启用不是SSO登录认证证据。操作规则见OIDC管理手册。

双库各8项管理race专项及1项非空v22→v23升级专项通过;150条新实际响应合同通过,其中100条加密、50条明文。完整双库各117项应用与17项迁移race通过;容量和独立Redis可靠消息两项显式opt-in未开启,保留跳过,不计为通过。会员、服务与OIDC管理本轮合计566条实际响应合同通过(348加密、218明文),66份历史SQL字节保持不变。

23个workspace成员race/vet、23个新缓存独立模块、24模块边界、1276条OpenAPI示例通过,既有paths/components语义不变。Vben 134项测试/13文件、类型与生产构建通过。相同canonical ZIP在当前v23宿主追加私有v24业务迁移,双库真实生成CRUD race、144条合同与API构建通过;正式迁移仍为v23。

双库使用真实Redis/API与私有Vben完成provider列表/不可变编辑取消、平台绑定、租户绑定、真实只读角色与租户切换;停止API/Vite后读回6条provider、6条binding版本仍为1、领域审计仅12条准备写。没有在UI提交配置/绑定创建、启停或解绑,写操作由真实TCP/TLS三协议HTTP验证。浏览器发现长issuer/指纹挤压中文列,补充固定宽度、省略提示与横向滚动后重跑134项测试、类型、构建及双库实际页面/停服读回。首个浏览器准备夹具重用全局platform issuer/sub被唯一键正确拒绝,修正测试主体后以新环境完整验证,没有放宽产品唯一性。

后端3cb3016、前端7dd40f1已提交推送;外层更新子模块指针与合同。文档56页同步、检查、构建与子路径构建通过,首页/四分册、新手册和M5章节锚点已实际浏览器核对;开发与构建同时运行曾使开发缓存失效,构建结束后重启并复验锚点。临时库、Redis、随机凭据和服务全部清理,仅保留原三个数据库容器。当前没有新增外部依赖或JVM,未单独计量有效AI工时,不作生产、DM或完整SSO认证声明。结构化记录为 docs/evidence/m5-sso-registry-progress.json。

# 21. OIDC 状态、会话与协议入口(2026-10-27)

schema v24 追加短期登录state、本地外部会话映射、签名退出事件、退出栅栏与RP退出关联表,并给管理/会员会话增加明确auth_method来源。旧会话回填password;OIDC映射缺失不能退回口令认证。RP退出关联表只是后续主动退出的存储准备,本轮未发布RP退出命令或回调。

登录按“批准配置快照→事务外受控discovery→最终当前锁重验→state与开始审计提交”发起。state/cookie只存摘要,nonce、Web verifier、设备信息使用外部32字节密钥AES-GCM加密;AAD绑定用途、realm/tenant/client/provider/state及实际回调。原生只提交S256摘要并保管verifier;显式allow_native_loopback只批准公共原生回跳的字面loopback HTTP端口例外,不放宽后端issuer/token/JWKS的TLS和地址白名单。临时端口只替换批准模板的端口,主机与路径保持不变,换码使用持久化的同一redirect_uri。

Web与原生回调都先证明短期Cookie或verifier,再原子消费state并清空数据库材料;错误证明/错误回调路径不消耗合法state,正确消费后网络或最终事务失败都不能重试code。每个提供方使用独立 /oidc/{realm}/{tenantId}/{providerCode}/callback 路径;实际到达路径须与state一致,防止多个授权服务器混用回调。若响应含iss也必须精确匹配。授权证明最终仍在本库锁内确认租户、明确类型账号、client/provider/绑定当前状态和版本,签发本地会话、摘要、加密ID token映射及审计同事务,不按邮箱合并或自动建号。

API组合根先构造独立外部会话守卫,再把同一实例注入身份、会员和系统服务。普通认证、刷新及业务写继续在当前主库检查映射、provider/绑定及版本;写路径保持租户→账号→client→provider→binding→映射锁序。运行面关闭使用空守卫档案,旧OIDC会话立即拒绝,口令与配置管理仍独立工作。外部材料钥匙通过runtime_enabled、active_key、key_files显式配置及对应APP_SSO环境覆盖,不生成默认秘密;启动校验普通私有文件、32字节长度及最多三把保留钥匙。

发布15个业务JSON命令与6个固定协议路由,见OpenAPI。业务命令保留Origin/原生来源、Redis限流、JSON/JWE与统一响应;限流按IP及IP下的阶段/应用定位计数,专用真实Redis验证共享client不会锁出其他IP且转发头不能绕过;独立 /oidc/ 命名空间只登记精确GET回调和POST签名form通知,不修改全局业务加密白名单。HTTPS关联与刷新Cookie使用__Host前缀、Secure、根路径且无Domain;关联Cookie保持短期HttpOnly/Lax,开发HTTP保持专用路径。实际回调路径与Cookie传输标记同时由state核对,拒绝同名Cookie歧义及HTTPS向dev_名称降级。刷新Cookie按realm/client/精确Origin隔离,包含同host不同端口;主机内其他服务仍须属于同一信任边界。Cookie属性依据浏览器主机前缀规则 (opens new window)。初始access不进入跳转URL或HTML,SPA须用本应用专属refresh恢复内存access。原生仅在显式JSON/JWE响应交付refresh,拒绝浏览器Cookie/Origin/Referer/Fetch来源。原口令刷新入口拒绝OIDC来源,错误client/Origin不得消耗或撤销合法刷新凭据。

backchannel在事务外验证签名、issuer/audience、事件、iat/exp、jti及sid/sub,再在同一事务去重、推进退出栅栏、撤销映射和审计。SID一旦关闭不能被新iat的晚到同sid回调复活;sub级退出只关闭不晚于事件的证明;同时含sub和sid按二者交集撤销,不扩大成sub全设备退出。去重使用随机插入归属标记,避免MySQL clientFoundRows改变RowsAffected导致重复审计。PostgreSQL专项曾因复用GORM查询对象将SELECT/FROM带入UPDATE而返回42712,现克隆查询状态,未放宽事务或改用自动重试。

正式worker每30秒每张短期表最多清理200行、每次最多5秒,主流程取消并join后才关闭连接;运行面关闭仍清理到期state/退出去重。永久sid/sub栅栏、会话和身份审计不删除;历史容量与生产保留策略尚未认证。

已通过双库登录/并发state/签发回滚/当前撤销/精确上游client命名空间、Web与原生三种内容协议HTTP、签名退出并发去重/回滚和有界清理专项;MySQL另在clientFoundRows=true验证去重。非空v23旧口令会话/凭据升级及幂等重跑在双库通过。新增21条路径/7个schema,既有合同语义保留,1459条OpenAPI示例通过。完整MySQL应用128项、PostgreSQL应用130项race通过;MySQL额外独立通过新增到期等待与退出先后门闩,两个库各覆盖130个唯一应用用例。迁移两库各18项集成与2项单元race通过;两个opt-in集成项与仅供子进程运行的TestRecoveryChild明确跳过,不计通过数。新增84条实际响应合同通过(40条加密、44条明文),回调错误保持专用协议明文。23模块workspace race/vet、23模块新缓存独立检查与24模块边界通过;后续到期/来源限流/主机Cookie收紧后重新通过双库各21项SSO专项、23模块workspace/独立检查及真实Redis来源隔离;材料key id语法对齐另通过配置race/vet。69份历史SQL逐字节保留,相同canonical ZIP在当前v24宿主追加私有v25业务迁移,双库生成CRUD race、144条实际合同和API构建通过。

文档56页同步、链接检查、构建及首页/四分册、OIDC管理范围与新章节锚点浏览器核对通过。结构化结果见 docs/evidence/m5-sso-session-progress.json;后端 6a78ac7 已提交并推送,外层仅更新子模块指针与合同/文档,前端和CLI本轮未变更,外层无远程。本轮没有新增外部依赖、JVM或前端SSO登录页面。仍须完成认证模式/最后可用方式与break-glass保护、RP主动退出与失败补偿、原生系统浏览器/loopback测试程序、真实IdP双应用SSO与统一退出,以及相应页面和整体验收。当前协议夹具采用真实TLS、S256换码与ES256签名,但不是成熟IdP登录验收;不作完整SSO、DM v24、生产或容量认证声明。M5保持实施中。

# 22. RP主动退出与材料保留(2026-10-27)

v25追加材料存在标记与 (material_present,expires_at,id) 索引,维护扫描不遍历全部永久映射。非空v24升级按历史密文是否存在回填标记,并将映射期限收紧到真实auth/member会话绝对期限;不解密、不创建身份、不延长期限。v1–v24三方言SQL保持原字节,达梦只追加源码,尚未执行认证。

新增三域Web/原生logout命令与独立Web logout-callback。真实refresh只定位本人当前client;账号→本地会话→凭据→映射事务先撤销并写auth.logout。停用租户、墓碑账号或缺失映射仍能本地退出,审计失败整体回滚;重复退出不重复本地审计。该事务不访问IdP或材料密钥,不能因上游不可达恢复本地会话。

提交本地撤销后才读取当前批准provider、解密已有ID token并在事务外执行受控discovery。网络后再次锁当前配置并复核版本/启用和材料期限。local_only表示显式只退本地,unavailable表示本地已退但无法准备上游退出;redirect_ready仅表示可以跳转。Web使用固定精确批准退出回跳、独立state与短期HttpOnly/Lax关联Cookie;HTTPS采用__Host根路径、无Domain并拒绝开发Cookie降级。正确回调一次性消费关联、清除本client已批准Origin的失效刷新Cookie并303到固定SPA落点;不重新签发身份。

公共原生只发起携带已验证id_token_hint的标准RP请求,不附加post_logout_redirect_uri或state,也不建立原生退出回调。RP退出回跳必须精确登记,不能把RFC8252授权回跳的临时端口规则套用到退出;有回跳的公共客户端须HTTPS,显式批准HTTP只留给机密客户端。实际全局退出仍须签名backchannel与真实各应用会话检查,浏览器返回本身不构成证明。协议依据OIDC RP-Initiated Logout 1.0 (opens new window)。

失败时Web保留已经失效的HttpOnly刷新Cookie供操作者显式重试;localOnly或合法返回会清除。重试只复用当前绝对期限内的加密hint,不恢复access/refresh。上游URL按敏感协议材料整体脱敏,不含本地access/refresh。正式worker有界清空到期ID token密文与材料标记,保留永久映射/撤销/审计/退出栅栏。

审查发现自然口令到期缩短本地absolute而映射仍沿用旧期限,以及RP先撤销使backchannel跳过材料两项缺口,均已修正:自然到期在账号UPDATE锁、会话锁内同事务只缩短映射;有效通知按同issuer/client/sub/sid覆盖未撤销或仍有材料的映射并清空。账号锁序列化防止身份命令并发升级mapping SHARE;清理与backchannel不反取账号锁。回归通过真实策略保存和Authenticate触发admin/member自然到期,以及RP→真实签名通知→幂等重放→再次RP不可用,未用直接修改映射期限代替这两条状态链。

合入源码双库各14项应用race专项通过,包含9项RP/材料用例、2项原有backchannel用例与3项原有口令到期/注销用例;完整迁移两库各19项集成及2项单元race通过,无跳过。60条实际响应合同通过(32加密/28明文),覆盖三种内容协议以及错误Origin、Web body刷新凭据、原生浏览器来源、Cookie降级和回调重放。新增9条路径/3个schema,1537条静态示例通过,既有路径和schema语义保留;23模块workspace race/vet、23模块新缓存独立检查、24模块边界及72份历史SQL字节核对通过。本增量未重跑完整应用业务套件,上次完整结果仍以v24归档为准。56页文档已同步、检查、构建并完成首页/四分册、RP章节锚点和管理范围的真实浏览器核对。结构化记录见 docs/evidence/m5-sso-rp-progress.json。后端功能 864b58f 与迁移换行固定 fda8480 已提交并推送,外层更新指针与合同/文档;外层无远程。所有方言迁移统一固定LF,额外在私有目录以core.autocrlf=true/core.eol=crlf实际检出75份SQL,逐字节与Git比对无差异,不修改历史脚本或库内校验和。

专用测试库/Redis与文档浏览器/开发服务已清理,保留原有三个数据库容器。没有新增外部依赖,前端和CLI本轮未发布改动;原生loopback接收器仅在私有副本编写并通过真实TCP/race初测,不能当作系统浏览器验收。本轮未单独计量有效AI工时。真实成熟IdP、认证模式/最后可用方式、Vben实际SSO入口和原生系统浏览器程序仍属M5必做;本增量不结项M5。

# 23. 原生系统浏览器PKCE客户端(2026-10-27)

新增 fago-cli auth native 有限验收命令和 fago-security 客户端JWE能力,没有新外部依赖或schema变更。真实loopback监听先绑定127.0.0.1随机端口,冻结固定路径/端口/state后才打开系统浏览器;S256 verifier与access/refresh只在当前进程内存。错误路径/state/重复参数不夺取一次性回调,任何code只换一次;取消、超时和失败均有限关闭HTTP/监听器并等待goroutine退出。两个JWE套件与正式服务端互通,响应key/句柄成功或失败都消费;算法/rid/内容类型错配不能退回明文。

命令从明确HTTPS origin读取公开配置,额外公开CA仍校验证书/主机名;不使用环境代理、Cookie jar、HTTP跳转或自动重试。支持本人/设备读取、串行轮换refresh、有限wait、使用真实access观察API拒绝以及本地/RP退出。来源、租户/client/subject和本地版本仍由正式API裁决。进程结束在独立5秒期限尝试本地撤销再清除内存;撤销未获确认明确失败。原生RP不携带动态退出回跳;redirect_ready只表示发起,不能声称全局退出。详细配置与失败处理见原生手册。

合入源码的MySQL/PostgreSQL各五组独立CLI+真实API race专项通过:member的plain/RSA/SM2、admin的RSA、platform的SM2。子CLI不继承APP_*服务凭据;后端读回确认准确tenant/subject/client、真实本地及OIDC会话撤销、一次state消费/一次换码。协议夹具的自动授权只服务合同测试,不作为成熟IdP或OS浏览器证据。23模块workspace race/vet、23模块新缓存独立测试和24模块边界均通过;本增量未重跑完整应用业务套件,不沿用专项数量冒充完整回归。

另在独占MySQL/Redis与固定官方ZITADEL v4.20.0上登记公共原生应用(devMode=false),运行实际二进制及macOS系统浏览器。既有测试账号认证后,三种内容协议各完成登录、本人/设备、刷新、本人及撤销六步;后两次复用同一IdP登录会话无需再输入口令,最后实际RP退出页显示成功。数据库读回3个会话全部撤销、3个state全部消费且密文清空。这是同一个原生应用的三协议验收,仍不构成两个独立应用或签名backchannel全局退出验收。Linux提供xdg-open但尚未真实桌面验收,Windows明确拒绝。

首轮真实流程的数据库读回成功,但多监听器夹具的Redis清理闭包捕获后续覆盖字段,造成重复关闭而整项失败。已改为逐监听器捕获自己拥有的句柄,重新分配库/Redis与原生IdP应用、复跑三个真实浏览器流程并完整清理,整项race通过。原有三个数据库容器保留;测试IdP的两个容器/网络/秘密文件、独占业务库/Redis及验收浏览器页均已清理。证据为 docs/evidence/m5-native-sso-progress.json,截图只显示IdP退出完成,不包含协议URL或账号资料:

真实IdP退出完成

57页文档已同步、检查和生产构建,首页/四分册、新原生手册、M5第23节锚点和证据图加载已在浏览器核对;临时开发服务已停止。后端 f7f347b、CLI 0ff4b60 已依次提交并推送,外层更新子模块指针和文档,外层无远程。

本轮仍不结项M5;认证模式、最后可用方式与break-glass保护、Vben实际SSO入口、真实两个应用的SSO/统一登出和阶段完整回归继续必做。本轮未单独计量有效AI工时,不作生产、容量或达梦v25认证声明。

# 24. 自然人认证模式与恢复保护(2026-10-27)

v26给平台、租户后台及会员主体追加精确的password/hybrid/sso_only策略;历史及新账号默认hybrid,服务凭据不套用本策略。口令入口、OIDC最终签发、当前access/refresh和业务消费者共同检查实际持久来源;禁用口令入口仍执行bcrypt但不累计失败次数。sso_only保留本地再鉴别、锁定及必须改密规则,真实OIDC受限会话可以完成改密后重新SSO登录,不是无口令主体。

管理命令使用账号Version CAS、当前管理员口令和实时权限。实际变更推进账号/凭据版本,撤销全部client的本地会话与外部映射并清空加密材料,同事务写类型化历史;平台另写平台审计,任一失败全部回滚。相同模式是无变化操作;失败返回空DTO,不能泄漏已回滚的新策略。操作见账号认证模式。

计划sso_only或解绑最后方式时,按当前明确realm/tenant/subject及精确issuer/sub计算,而非仅看SourceProviderID;先锁全部相关client,再provider、binding,当前部署批准且回调可路由才计入入口。只检查结构,不在事务内探测IdP。平台与租户注册表敏感写采用READ COMMITTED,固定控制/租户/账号排序锁保护恢复人数与当前候选。紧急关闭最后provider/client仍允许并保持拒绝;已无有效入口时可清理坏绑定,不自动开放口令。

恢复保护同时覆盖模式、租户管理启停/注销与角色替换:租户至少保留一名enabled、非墓碑、真正保留tenant_admin角色且允许口令的管理员;平台按权威platform_admin角色同样保留一名。临时锁定/密码到期不取消这一结构性身份,也不承诺网络、租户或紧急停用client可用。故障恢复必须由已有恢复管理员显式提交,不新增通用密码或自动降级。

专项发现迟到Authenticate失效写可能撤销模式恢复后新登录的会话。已改为账号/当前会话锁内重验,已撤销旧会话直接结束,扩大撤销也仅限旧password_version。用原实现的独立副本运行确定性门闩,确实复现新access被401002拒绝;修复后相同门闩在双库通过。注册表旧快照门闩以同issuer已有provider恢复为竞争方;最初新增provider的设计被父租户外键锁串行化,不把该次超时称为生产缺陷。

非空v25→v26保留三类旧主体的状态、必须改密、原散列与版本,重跑幂等;75份历史SQL字节不变。MySQL模式列采用ASCII二进制排序和精确长度,拒绝大小写/尾空格变体,防止损坏值计入口令恢复人数。达梦仅追加源码,尚未运行v26认证。

双库专项覆盖三来源矩阵/全client撤销、最后方式、恢复管理员、审计回滚、旧epoch迟到请求、真实OIDC受限改密、同issuer替代provider、并发解绑、注册表当前读及两平台管理员竞争。admin/member/platform三种内容协议HTTP通过,120条实际响应合同通过(80加密/40明文);1569条静态示例通过。Vben140项测试、类型与生产构建通过。

真实MySQL/PostgreSQL专用库、Redis、API与Vben页面完成管理员读取/编辑取消、只读无写按钮、双向租户隔离与平台独立范围检查。浏览器没有输入新口令或提交策略变更;写入由真实HTTP和事务测试证明。API/Vite停止并join后,以race测试读回两个会员模式/版本及准备审计未变;专用库、Redis和私有凭据已清理,原三个数据库容器保留。截图只含策略与合成ID:

MySQL认证模式读取

PostgreSQL只读认证模式

完整双库各152项应用集成race通过,迁移各20项集成和2项单元race通过;容量/独立消息两个opt-in及仅供子进程的TestRecoveryChild明确跳过,不计通过数。完整套件在私有副本最终纯版式整理前执行;明确32文件合入后逐字节核对来源,23模块workspace race/vet、23个新缓存独立模块及24模块边界通过。58页文档同步、检查、构建与首页/四分册、新手册、章节锚点和图片加载的浏览器核对通过。证据摘要为 docs/evidence/m5-authentication-modes-progress.json。后端 f7de18d、前端 a10d1cc 已提交并推送,外层随后更新指针,外层无远程。本增量没有新增外部依赖,不单独计量有效AI工时,不作生产、容量或达梦支持声明。M5仍须Vben实际SSO入口、真实两个独立应用SSO/签名统一退出及阶段最终验收。

# 25. Vben SSO与真实双应用统一退出(2026-10-28)

Vben追加租户/平台SSO入口、固定返回页、当前来源绑定的刷新/重载、本地退出及RP失败补偿。部署只公开本地client/provider数字定位和浏览器IdP origin;上游secret与材料钥匙仍是服务端外部文件。业务JSON继续共用统一JWE/Origin/限流,开发代理额外固定转发/oidc;固定落地不读取code/state/token,也不接受任意return URL。操作见浏览器SSO。

浏览器只保存公开的方法/client提示与本标签短期动作/退出重试定位。已配置SSO而来源未知、损坏或配置变化时拒绝自动恢复;已验证SSO失败不能删除提示后重试口令。access仍只在内存,HttpOnly refresh仍由当前应用Cookie交付。受限登录先进入固定改密页,403/401002不刷新。平台与租户的client/入口/返回路径分离,两个真实应用的Origin与Cookie名称也分别绑定。

代码审查与确定性回归发现:同realm新身份可能加入旧身份的single-flight,随后被旧来源失败清掉。协调键现包含本地身份revision,排队旧刷新/显式登录在发HTTP前重验;跨标签Cookie锁仍按realm串行。将旧协调器放回独立副本,新增用例确实失败;当前实现通过。本人刷新保留内存来源,不因公开提示被更改而换client。

真实浏览器采用固定官方ZITADEL v4.20.0、独占MySQL/Redis/API、两个不同的Web上游应用和本地client/provider/Origin。实际完成首次IdP认证、第二应用复用IdP会话、两应用重载、实际access到期后本人读取;停止IdP后A先本地撤销而B仍有效,数据库阶段读回证实该边界。恢复同一IdP后A显式重试RP,完成固定回跳;B的当前业务请求收到401002并返回登录页。

API停止并join后的race读回确认:2个OIDC映射均撤销并清空材料、2条真实签名退出去重事件;共7次SSO恢复/刷新,口令刷新0次。实际B拒绝发生于签名通知之后,未使用本地广播跨origin清掉B。资源清理独立核对,专用库、Redis、IdP的两个容器/网络、secret/PAT/合成口令文件和浏览器页全部回收,原三个数据库容器保留。

IdP故障时本地先退出

RP固定返回

第二应用当前会话被拒绝

准备与验证过程的失败全部保留:旧协调器的在途刷新反例;AS默认私网拒绝(仅独占测试实例批准一个Docker主机IPv4,其他私网CIDR继续拒绝);公共none客户端HTTP RP被既有安全规则拒绝(改为机密Web/basic与外部secret,不放宽协议规则);容器停止即删除导致无法恢复(测试实例改为显式清理);跨轮超时导致未完成读回;阶段夹具误用provider_id查询全局事件表(改为issuer/upstream-client摘要并增加就绪前预检)。只有最后完整成功的运行计入验收。

合入前后前端161项/17文件、类型及生产构建通过;23模块workspace race/vet、23个新缓存独立模块与24模块边界通过。当前v26宿主同ZIP生成包已完成双库实际元数据导入/配置、CRUD race、API入口编译,以及前端类型/生产构建;144条生成资源实际合同通过(96加密/48明文)。完整应用双库最终结果在下一节登记。实际IdP场景使用显式开发loopback HTTP及机密Web模式,不作生产HTTPS、任意IdP、Linux/Windows桌面或容量认证。本增量没有新外部依赖和schema变更。真实IdP成功场景由测试装配根运行实际Gin handlers/services/GORM/Redis与Vben,不冒称cmd/api进程;另以发布版API/worker启用SSO在双库完成就绪、未知提供方401002、缺少Origin403004及SIGTERM退出0,证明正式入口装配。结构化记录见浏览器SSO证据。

# 26. 阶段最终验收与交接(2026-10-28)

M5本地工程与自动化退出条件已通过。最终源码为后端e0bc02b、前端885dc9e、CLI 0ff4b60,子仓库均已提交并推送;外层无远程,随后更新子模块指针和验收档案。实际结果见阶段结构化验收,本次没有生产环境、没有执行生产部署。

退出要求 证据与核对结果
R2.1 数据范围与字典参数 子部门/自选集合、移动/删除/授权竞争、读写和审计;模板显式复制、租户版本和敏感出口,见第2–4节
R2.2 文件 5 MiB/类型限制、授权与状态清理、通用S3显式endpoint和真实RustFS;用户只授权通用S3依赖,见第5节
R2.3 消息、通知与任务 outbox/inbox、Event/Redis、幂等/租约/fencing/死信重放、正式worker与管理/积压,见第6–10节
R2.4 代码生成 同ZIP导入配置预览下载、双库/三协议CRUD与合同、前端编译;四表类型矩阵和真实双库浏览器CRUD历史证据,见第11–14节
多用户与多终端 realm/client当前守卫、设备/全端撤销、会员生命周期、服务凭据/scope,见第15–19节
OIDC与策略 部署信任、精确绑定、S256/一次性状态、当前来源、RP/backchannel和材料清理、认证模式与最后恢复方式,见第20–24节
实际客户端与双应用SSO macOS系统浏览器有限原生三协议;Vben两个真实Web应用、恢复/到期刷新、故障补偿和签名统一退出,见第23、25节

最终合入根目录源码直接执行完整双库应用race,各152项集成通过;迁移各20项集成及2项单元race通过,无迁移跳过。应用每库明确跳过独立消息opt-in、容量opt-in及仅供子进程的TestRecoveryChild,不计为通过项。原生独立CLI五组也随完整应用执行。23模块workspace race/vet、23个新缓存独立模块和24模块边界通过;75份历史SQL逐字节保持,当前三方言共78份,schema v26。

Vben web-antd应用161项/17文件、类型与生产构建通过;1569条静态合同、120条认证模式实际合同(80加密/40明文)通过。相同SHA256为f853ad192bad4909449c4b20557331c66b2aab0fe7f4eecc89623d929861254a的生成包,在当前v26私有宿主重新导入配置、双库CRUD race/API入口构建、前端类型与生产构建通过,144条实际生成响应通过(96加密/48明文);真实浏览器生成CRUD是第14节v19证据,本轮没有冒称重跑。

当前双数据库API/worker/CLI发布构建通过;发布二进制完成v26停写组合恢复,逐库69表完整指纹、3对象共10,485,782字节、Redis AOF/PEL、待办任务/通知/清理恢复、重复不增回执、租户文件拒绝及SIGTERM退出0。报告schema从本次实际迁移库读取并拒绝dirty,不再硬编码旧v19。两驱动API/worker源码和CLI漏洞扫描均为可达0、导入包0;required-module未调用发现仍为server3/CLI1,不表述为所有依赖无漏洞。

59页文档已同步、链接检查与生产构建;首页/四分册、新SSO手册、第25节锚点及三张证据图自然尺寸加载已在浏览器核对。专用库/Redis、IdP/对象存储容器与网络、私有secret/快照、浏览器页和文档开发服务均清理,原有三个数据库容器保留。结构化摘要只发布白名单事实与日志摘要,不复制原始请求、协议材料或凭据。

边界保持明确:真实双Web应用为MySQL开发loopback HTTP与机密上游,使用实际处理器的测试装配根;发布入口另以双库启用SSO的启动/拒绝/停止验证。原生实际系统浏览器认证限macOS有限命令,Linux/Windows桌面及长期安全凭据缓存SDK未认证;具体商业小程序渠道、公开注册/邀请和恶意文件扫描供应商未实现。当前权威权限直接查主库,Redis权限结果缓存仍属规划。整个Vben上游广域测试曾有两个未修改form-ui测试失败,当前应用级161项通过不覆盖该失败。

生产拓扑/HTTPS/容量与RPO/RTO、任意IdP、DM v26及其余数据库/消息后端、通用工作流仍须各自后续验收。M5完成不代表M6/M7完成;后续按用户指示进入M6,不自动扩展本轮范围。

2026-10-28 后续 BUG 审查确认并修复三项 P1/P2。客户端只对精确 POST /api/admin/v1/infra/files 放宽到 8 MiB JSON 正文及 4 KiB 上下文,RSA/国密均支持完整 5 MiB 原始文件;普通正文保留 16 KiB。参数编辑器增加本轮详情成功标记,读取失败或重新打开后不沿用列表/上轮详情的保存资格,主动清空公开值和敏感值默认保留合同不变。nginx 为精确文件路径设置 16 MiB 上限,其余 API 保持 1 MiB 代理限额,业务层仍校验权限、方法及文件大小。

新增 18 项前端回归,bash scripts/web.sh exec vitest run apps/web-antd/src --reporter=dot 为 17 文件/179 项通过,覆盖两套加密的 32 KiB 与 5 MiB 文件完整往返、相邻路径/错误方法/超额拒绝,以及详情失败、重开和主动清空。bash scripts/web.sh typecheck、bash scripts/web.sh build、node scripts/check-web-bundle.mjs 通过;四个修改文件的 ESLint 为 0 错误,视觉测试替身原有的多组件/未声明 prop 类型共 28 条警告仍保留。python3 scripts/test-proxy-upload.py 在本机实际 nginx 上通过 1 项测试的 7 组边界:10/16 MiB 到达临时上游,超额及相邻路径返回 413,小请求仍通过;监听器、线程和临时文件均清理。手册同步了 参数读取失败处理 的页面操作示例与 文件代理限额 的 nginx/验证命令示例。本增量没有 Go/schema 变更,未重新运行真实数据库、对象存储或生产拓扑验收。

2026-10-28 后续菜单分组:通过本地 menu-groups.ts 把已登记授权叶节点整理为租户五组、平台三组,sidebar-menu.vue 使用真实 Ant Design SubMenu 展示二级导航,工作台/个人中心保持固定一级入口。未改变原页面路径、动态路由白名单或服务端授权目录;空组隐藏,新接入但未分类的已授权页面保留在「其他功能」。当前 URL 的父组自动展开,用户仍可手动折叠;授权快照变化与 realm 切换会清理失效展开键,状态不持久化。

新增六项真实 Ant Design 菜单及 Vue Router 挂载测试,覆盖二级直达/高亮/点击、手动折叠与历史返回、授权撤销与固定入口、通知/示例按权限归组、平台切换、未来页面兜底。完整应用为 18 文件/185 项通过,类型检查、四个修改/新增文件 ESLint(0 错误/0 警告)、生产构建及产物检查通过。浏览器另以当前 28 个发布菜单的合成授权快照加载实际侧栏组件,核对租户系统组、平台身份组展开和仅文件权限时的空组隐藏;没有登录真实账号或写入业务数据,临时预览入口、服务与页签已清理。手册增加完整分组表和文件页面操作示例。本增量没有后端或 schema 变更,未重跑真实数据库集成,不替代既有账号与生产验收。

2026-10-28 按用户明确确认「恢复官方 vue-vben-admin 完整布局,保留现有业务」继续调整。源码仍来自已锁定的官方 vbenjs/vue-vben-admin 快照,保留现有 fago-vben5 工程路径和版本,不切换到旧版。删除简版布局与自定义侧栏,接入官方 BasicLayout、UserDropdown、AuthPageLayout 及其样式、国际化和偏好入口;原生侧栏、面包屑、多标签、搜索、全屏、主题与布局选择现在共同工作,现有业务组件和 API 未替换成演示页面。品牌使用同源 Fago 图标,通知仍走原业务菜单。来源及接入差异登记在应用 UPSTREAM.md。

Fago 的既有白名单授权快照适配成官方菜单树,租户五组、平台三组保持不变。为原生搜索与混合导航增加本地分组重定向,目标固定为该组首个已授权页面;清理动态路由时同时撤销分组路由。三个真实 Router 测试验证授权目标、撤销和非法组件拒绝。Vue、Router 与 Pinia 统一运行时实例,避免锁定依赖的不同 peer 组合导致布局内注入失效。

Pinia 不装持久化插件,access/refresh 不写入上游身份 store;本人资料、菜单、标签和搜索历史仅驻留内存。身份 revision、realm 或权威授权版本变化会重建布局并清理旧标签与缓存,权限重载完成前阻止把旧路由重新登记为标签。同身份 access 轮换保留标签。登录页使用官方布局包裹原有真实表单,排除演示 KeepAlive 并在卸载时清理口令;原有改密、SSO、退出补偿和晚到退出的身份栅栏保留。

八项真实官方布局组件测试覆盖业务挂载/导航、撤权、平台切换、普通凭证轮换、内存存储与卸载清理、主题切换不重建业务 DOM,以及退出网络失败和旧退出晚到。旧简版侧栏的六项组件测试随组件删除,原菜单分类测试保留;当前完整应用为 21 文件/194 项通过。bash scripts/web.sh typecheck、bash scripts/web.sh build、node scripts/check-web-bundle.mjs 通过。浏览器另以当前 28 个发布菜单的合成授权快照核对原生后台布局、两域导航、搜索、亮暗主题及设置面板,并以真实应用入口核对租户/平台登录布局;没有输入真实账号或口令,也未写入业务数据。

官方后台布局与现有个人中心

官方暗色布局与业务组件主题

真实应用登录入口的官方布局

本次修改文件 ESLint 为 0 错误/0 警告,文档 57 篇源文件同步、59 页链接检查、生产构建及构建后复检通过。临时预览入口、Vite 服务和浏览器验证页均已清理。本增量没有 Go、schema 或后端授权接口变更,未重新运行真实数据库、IdP 或生产部署验收;截图中的受保护页面身份为合成验证数据,不作为实际登录证据。读者操作与配置入口同步到 前端本地启动、菜单与路由 和 浏览器单点登录。

同日根据用户反馈补齐主内容区留白。原配置只写总 padding,官方组件的四个单边零值将其覆盖;现在四边显式统一为 20px,正式启动只覆盖这组间距,保留旧缓存中的主题、布局等其他选择。另修正布局父级透传的 paddingBottom,保留内容下间距并叠加固定页脚高度。合成授权的真实个人中心浏览器测量确认四边均为 20px、卡片左/右/上间距均为 20px,且无横向溢出。8 项官方布局回归、修改文件 ESLint、类型检查、生产构建与产物检查通过;未增加后端或业务数据变更,临时夹具及服务已清理。

主内容区四周20px留白

# 27. 平台基础设施分层与 cron 扩展(本地验收通过)

2026-10-28用户要求实现前述全部建议并设为目标,2026-10-29完成本增量本地验收。原M5历史结项只证明原范围,本节单独记录新增交付。操作步骤、请求/响应和失败处理分别见字典与参数配置、定时任务与运行恢复,结构化记录见 docs/evidence/platform-infra-cron-progress.json。

平台新增公共标准/字典模板、平台业务参数、公开租户默认参数模板和系统任务四个入口;租户保留原入口与独立资源。模板按明确版本显式复制,不隐式回退,不随平台更新覆盖租户副本。内置标准只读,代码状态机枚举不开放编辑;数据库、加密材料和安全策略仍经部署/专用入口。私有参数不回显,编辑时未明确替换即保留原值,公开模板拒绝秘密用途和保留配置键。

用户后续要求去掉固定间隔、只保留cron,已覆盖早期一次/间隔调度设计。当前公开合同、前端编辑器和调度器只接受五段cron、独立IANA时区;明确DST缺失/重复分钟、合并/跳过/有界补执行和未来五次服务端预览,字段变化立即使旧预览失效。人工“执行一次”仍是独立幂等命令。v27保留旧字段和执行历史,将旧非cron计划停用待配置,清零下次触发并推进版本/准入代次;重新配置合法cron后才能启用,旧代次未完成运行不能复活,61秒等间隔不被静默近似转换。

v28增加独立平台字典/参数目录,v29增加平台父计划、父运行、真实租户子运行、各自attempt和结果表。平台表没有虚假tenant_id;平台与租户复用同一日历、持久运行、租约、幂等、fencing、重试和死信状态机。在线命令复核当前平台操作者/会话并原子审计;后台不继承在线身份,以同事务运行/attempt持久记录执行。

正式API和worker注册平台目录统计、显式目标租户统计、平台系统维护三类固定处理器,不自动创建/启用计划。租户拆分一次最多100个明确目标,父事务不锁所有目标租户;各子运行检查真实租户当前状态/套餐能力,独立限额、每分钟领取上限、重试、死信与重放,不因一个租户失败重复已成功租户。父done只表示拆分已受理。维护仅清理90天前平台/平台所属租户统计结果,每表每轮最多100条,删除、结果和done同事务;业务配置、计划、SQL运行/attempt及审计历史保留,不冒充完整历史归档或通用业务清理。

专项测试实际发现并修复:MySQL RR父模板当前读配旧子项快照(父/子均改为当前锁定读);PostgreSQL复用Count Statement再Update产生重复目标表(计数克隆查询);测试清理复用Pluck残留选列;关闭运行视图后迟到结果请求重开弹层(关闭/切换均使结果序号失效,补确定性回归)。两处公开API旧一次/多调度说明也已修正并重新生成schema。失败轮未计入通过。

验收范围 最终实际证据
MySQL 8.4.13、PostgreSQL 16.6完整应用 每库170项顶层集成测试race通过;Redis专项opt-in和发布容量2项明确跳过,不计通过。显式30分钟整组限时,分别1653.635秒、1607.887秒
两库完整迁移 每库23项顶层测试race通过,含非空v26→v29重跑、旧计划fencing、平台目录版本和已有租户副本不覆盖;历史v1–26原字节未改
并发与故障 模板发布/复制交错、父并发只拆分一次、不获取目标租户锁、真实套餐撤销、子租约过期接管、限流/容量、原死信恢复、审计/拆分/结果写入失败回滚、维护删除失败回滚等双库通过
模块工程 24个workspace模块race/vet、24个新缓存GOWORK=off独立模块通过;26个含嵌套驱动的模块依赖DAG/internal边界通过
合同与前端 1881条静态示例;378条真实HTTP响应合同通过(252加密、126明文,三个内容协议);22文件213项前端测试、类型检查、生产构建/无mock产物及修改生产文件ESLint零错误
发布包 MySQL/PostgreSQL各一套API/worker/CLI,仅链接所选数据库驱动;保留robfig/cron v3.0.1 MIT原文并打包,18项许可证正常/缺失/篡改/符号链接/manifest核验及Python编译通过
真实浏览器 实际Vben、Gin中间件/服务/GORM/MySQL,合成已认证会话仅在同源内存引导,不mock业务API,不冒称登录页或cmd/api进程验收。四个平台入口、租户独立菜单/参数、敏感编辑不回显、cron每5分钟预览/修改失效、维护及真实租户子结果可见
文档与资源 57篇源页同步为59页,检查/构建通过;首页、四分册、字典/任务锚点、M5图片加载核对。专用测试库/容器/匿名卷、浏览器副本/缓存/临时HTML均回收;保留无关用户资源

最终全应用首轮采用Go默认10分钟限时,整组到期且此前无单项失败;改为显式30分钟后双库完整通过。系统Node25的Storage行为和误选上游包测试导致一轮失败,最终使用项目支持的Node24.22.1并选择实际web-antd测试范围。工具链sumdb临时网络EOF后使用已验证的官方Go1.27.3执行文件重跑,未关闭校验。私有浏览器装配的模块sum/参数类型两次准备失败均已修正,只最终race成功轮计入证据。

仅Cron编辑与每5分钟预览

平台公共标准与模板

真实租户子运行结果

旧计划升级说明

本增量只声明上述MySQL/PostgreSQL本地工程证据;没有生产部署、当前v29 SQL/Redis/S3联合恢复或容量认证,达梦v29仅有脚本而未认证。工作流定时器、自动SQL历史归档、自定义任意脚本/URL/命令处理器和M6/M7不在本次完成声明内。已有历史版本恢复证据不作为当前v29认证。

应用提交 c84a1a9 已推送到 fago 的 origin/master;外层提交同时更新API合同、根文档、站点副本、发布校验脚本和唯一子模块指针。外层未配置远程,不宣称已推送外层。

# 28. 空值与 SQL 查询性能修复(2026-10-29)

本次修复前一轮审查确认的问题:菜单授权按普通角色批量读取、保留角色目录只读一次;租户/套餐当前页关联及用量批量分组读取;服务账号 scope、字典模板条目和代码生成列按父键批量读取。保留原有租户条件、RR/写事务快照、排序、空数组、每模板1000项边界及失败回滚,不缓存旧权限或把超量结果静默截断。

独立临时 PostgreSQL 16.6 的真实模块调用计数如下;SQL 次数不含事务开始/提交及外层 HTTP 鉴权,不以此推算生产吞吐:

场景 修复前 修复后
租户列表20条 42 4
套餐列表20条 42 4
授权读取1/20/100普通SELF角色(无部门) 4/23/103 4/4/4
代码生成20张表 22(原路径按表数增加) 3(真实双库回归断言)

schema v30 只追加索引迁移,未改旧迁移字节。三方言补齐通知 (state,created_at);PostgreSQL/达梦补齐用户角色 (tenant_id,role_id,user_id);MySQL复用原外键自动建立的反向索引。独立临时 PostgreSQL 中使用20万通知(100条queued)和200001条用户角色关系(目标1条)执行 EXPLAIN (ANALYZE,BUFFERS),新索引均被采用,数据访问缓冲块分别从6897→8、1274→7。此为合成数据、本机有界证据,不声称生产延迟或MySQL/达梦执行计划已认证。

PoC工作流遇到合法JSON中的缺失/null Completed 返回内部业务码500001并回滚;不创建命令收据、不改变实例状态/版本、不执行业务副作用,也不静默初始化损坏状态。本次不扩展M0 PoC为生产工作流支持。

新增真实数据库回归覆盖查询数、不同租户的2/1/0用量与软删除排除、重复/跨租户菜单并集、原scope保留/空scope、20个模板完整分组与超量拒绝、批量读取故障不返回部分数据、20表列排序/类型/空值与既有一致快照/取消/失败,以及真实非空v29→v30升级、重复迁移和索引存在性。

验证状态与最终命令结果记录在 本次修复证据。迁移步骤、维护窗口与dirty恢复规则见 数据库迁移。达梦本次只验证构建和脚本嵌入,v30真实迁移/业务/执行计划尚未认证;没有生产部署或当前版本组合恢复声明。旧版staticcheck不支持当前Go导出格式,golangci-lint未安装,不将两者记为通过。

本轮最终结果:PostgreSQL应用全量175项通过,MySQL全量173项通过,两库各显式跳过Redis消息专项和容量基准。双库并发共用Redis时,MySQL服务HTTP/SSO运行HTTP的两项测试命中共享限流窗口;服务HTTP夹具复用固定无效key的问题已改为每夹具随机公开无效key,保留原20次失败/第21次限流断言,两项在独立Redis上按三种内容协议补验通过。生产限流策略未修改,不把首轮失败命令写成整套一次通过。

两库各23项完整迁移race通过;24个workspace模块race/vet、24个新缓存GOWORK=off独立模块和24个nilness检查通过,新增测试夹具最后一次应用nilness复验通过。57篇源页同步为59页,文档检查/构建与迁移v30锚点/四分册浏览器核对通过。测试准备过程中曾遗漏构建标签/Redis,且中断遗留测试账号影响人数断言,最终有效结果使用重建的本次专用库;这些准备失败不计为通过。文件HTTP沿用内存故障存储,S3/真实外部IdP/容量与生产环境本轮未重验。

应用提交 74baf2e 已推送 fago 的 origin/master;外层更新根文档、在线副本、证据登记与唯一子模块指针。外层未配置远程,不声明已推送外层。

最后更新: 2026/10/29 09:37:42
M4 加固检查归档(本地工程环境)
M6 R3.1 正式工作流核心与基础审批

← M4 加固检查归档(本地工程环境) M6 R3.1 正式工作流核心与基础审批→

Theme by Vdoing | Copyright © 2026-2026 Fago 项目文档
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式