# Scert 整改任务执行清单 > 本清单依据《Scert整改合并优化清单.md》建立,用于跟踪实际代码整改、自动化验证、隔离环境验证和生产验收。 > > 当前日期:2026 年 9 月 27 日 > > 状态定义:`[ ]` 未开始;`[~]` 进行中;`[x]` 已完成,等待复审;`[✓]` 复审通过;`[!]` 暂缓或存在阻塞。 ## 一、执行规则 1. 代码实现、自动化测试、隔离环境验证和生产验收分开记录。 2. 构建成功、接口返回 HTTP 200 或单元测试通过,不直接等同于生产验收通过。 3. 真实 DNS、ACME、HTTPS、SSH 主机指纹、备份恢复和远程部署必须保留可复核证据。 4. 不使用 `-k`、`--insecure`、跳过 SSH 主机指纹或强制 IP TLS 的方式替代正式验证。 5. 不将密码、RAM 密钥、Token、私钥、真实证书或 Cookie 写入代码、文档、日志和 Git。 6. 每个任务完成后先标记为 `[x]`,复审和对应范围的验收证据齐全后才能标记为 `[✓]`。 逐项规格入口:《整改任务规格与验收约定.md》。P0/P1/P2/P3 分别见《基础整改任务规格.md》《核心能力任务规格.md》《运维验收任务规格.md》《增强能力任务规格.md》,共 44 项;每项具备全部原定字段及独立六阶段状态。汇总状态与规格同步更新,原始清单保留为需求基准。 ## 二、当前基线证据 | 项目 | 当前事实 | 证据或命令 | 结论 | |---|---|---|---| | Git 工作区 | `main` 与 `Scert/main` 同步,工作区干净 | `git status --short --branch` | 已建立基线 | | 后端模块 | `backend/go.mod` 声明 Go `1.26.6`,模块内实际使用 `go1.26.6` | 在 `backend` 执行 `go version`、`go env GOVERSION GOTOOLCHAIN` | `GOTOOLCHAIN=auto`;根目录的 `1.26.2` 不代表后端构建版本 | | Node.js | `v24.19.0` | `node --version` | 已记录 | | npm | `11.17.0` | `npm.cmd --version` | 已记录 | | Vue | 锁文件实际版本 `3.5.41` | `frontend/package-lock.json` | 已记录 | | Vite | 锁文件实际版本 `6.4.3` | `frontend/package-lock.json` | 已记录 | | 数据库驱动 | SQLite、MySQL、PostgreSQL 均有代码和迁移目录 | `backend/internal/database/` | 正式支持范围仍需确认 | | SSH | 已有主机指纹、密钥部署和安全测试代码 | `backend/internal/deployment/` | 远程实机仍需复核 | | 生产门禁 | 现有文档明确正式验收尚未全部通过 | `doc/生产部署与运维说明.md` | 不能宣称生产放行 | ## 三、P0 基础整改和阻塞项 | 编号 | 状态 | 任务 | 当前问题 | 下一步交付 | 验证证据 | |---|---:|---|---|---|---| | P0-01 | [x] | 明确产品范围 | 正式发布仅含 Web/服务端,桌面源码保留;CLI 已收敛且实际 Windows 产物验证通过 | 等待最终复审;Windows/Linux 实机安装仍归对应验收项 | 双平台归档及 SHA256、独立克隆、命令树及实际退出码 | | P0-02 | [x] | 建立完整任务清单 | 44 项逐项规格、原始编号名称、字段、六阶段、引用和汇总状态核对通过 | 等待最终复审,随实现同步状态和证据 | 四份规格、统一验收约定及 `fab98d1` 独立克隆 | | P0-03 | [x] | 整理源码、构建产物和部署产物 | 全仓库及子目录规则、目录说明、正式回归和独立克隆构建校验通过 | 等待最终复审,后续提交继续执行边界检查 | 正式 Go 回归、完整索引、双平台 33 项清单及解包校验 | | P0-04 | [~] | 统一开发和构建版本 | 精确工具链、安装策略、发布前后校验、系统清单及固定换行已实现,双独立克隆和完整自动化通过 | Linux 原生构建与双平台实际运行环境记录,不以交叉编译替代 | `94237b8`、175 项前端测试、后端完整回归、4 个 Web 文件一致、33 项清单和解包校验 | | P0-05 | [~] | 确认数据库正式支持矩阵 | 已修复迁移 BOM 及 Windows 空闲连接恢复,MySQL 5.7.44/8.0.45 各 55 项隔离实库测试通过 | 补 Linux 实库恢复、MySQL 备份恢复、PostgreSQL 当前复测及 SQLite 并发锁;正式服务验收仍缺 | `9cf3a3b`、双版本严格 TLS、29 个重入边界、结构快照、冷重启与在线连接恢复 | | P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 | | P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 | | P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 | | P0-09 | [~] | 强化 SSH 主机身份验证 | 已有指纹校验和安全测试,人工确认、更新与远程公钥部署需逐项复核 | 完成指定服务器上的密码部署、公钥登录和指纹复核 | 指纹、授权文件、公钥登录日志 | | P0-10 | [~] | 统一任务、部署和回滚事务模型 | 部署事务已有实现,不代表所有长操作、项目关联和八类状态已经实现 | 将申请、部署、回滚、重试统一关联任务记录 | 事务测试、失败回滚证据 | | P0-11 | [!] | 建立生产验收门禁 | 现有自动化证据不能替代 DNS、HTTPS、ACME 和远程验收 | 固化准入清单、证据目录和阻塞规则 | 生产验收记录逐项复核 | | P0-12 | [~] | 完成备份和恢复方案 | 已有 CLI 备份恢复,自动备份、列表、下载、确认和审计仍需逐项核查 | 补齐完整备份能力并进行隔离恢复演练 | 隔离数据库恢复报告 | ## 四、P1 核心产品能力 | 编号 | 状态 | 任务 | 当前判断 | 主要验收 | |---|---:|---|---|---| | P1-01 | [~] | 统一证书中心 | 已有证书申请、导入和列表能力,统一详情和状态仍需复审 | 申请、导入、续期、部署、回滚 | | P1-02 | [~] | 证书详情和版本管理 | 已有证书相关模型,版本、SAN 和历史展示需复核 | 版本切换、SAN 变化、旧证书保留 | | P1-03 | [~] | ACME 和 DNS 管理 | 已有多 DNS Provider 和 DNS 账户能力,真实授权范围需复核 | Production/Staging、DNS-01、泛域名、CNAME | | P1-04 | [~] | 任务中心 | 已有任务和执行记录基础,取消、重试和日志展示需复核 | 长任务、失败重试、取消、执行历史 | | P1-05 | [~] | 续期策略 | 已有续期相关代码,重复申请保护和调度验收需补齐 | 到期阈值、锁、幂等、失败保留旧证书 | | P1-06 | [~] | 服务器和部署目标中心 | 已有服务器管理和 SSH 密钥展示 | 服务器归属、验证、密钥登录、部署目标 | | P1-07 | [~] | 多服务器部署策略 | 已有部署客户端和回滚测试 | 多目标顺序、失败回滚、部分成功状态 | | P1-08 | [~] | 通知中心 | 已有 Smail 系统账户发信接入方向 | 成功、失败、重试、脱敏和系统账户调用 | | P1-09 | [~] | 审计中心 | 已有审计仓储和接口基础 | 登录、密码、凭据、证书和部署危险操作 | | P1-10 | [ ] | 证书监控仪表盘 | 页面和监控口径尚未完成复审 | 到期、失败、部署状态、异常统计 | | P1-11 | [~] | 备份恢复页面 | CLI 和文档已有,Web 操作和权限需补齐 | 备份列表、恢复确认、审计和失败保护 | | P1-12 | [~] | API 契约和权限矩阵 | 已有后端接口说明文档,需与实际路由同步 | 接口字段、角色、项目和错误码一致 | ## 五、P2 Web、运维和验收 | 编号 | 状态 | 任务 | 当前判断 | 主要验收 | |---|---:|---|---|---| | P2-01 | [~] | 统一 Web 页面结构 | 已按页面拆分,仍需逐页检查一页完整显示和中文布局 | 桌面页面、响应式、导航和空状态 | | P2-02 | [~] | 统一中文显示和错误信息 | 已有中文界面,需扫描 HTML 实体和英文残留 | 页面、接口、日志错误信息 | | P2-03 | [~] | 长操作任务化 | 部分部署/证书操作已有任务基础 | 页面不阻塞、刷新可恢复、任务状态可追踪 | | P2-04 | [~] | 幂等和重复操作保护 | 已有部分锁和事务测试 | 重复提交、并发操作、幂等键 | | P2-05 | [~] | 日志、指标和追踪 | 有日志和任务记录,Request ID/脱敏需复核 | 请求 ID、任务 ID、敏感信息审查 | | P2-06 | [~] | 接口和前端测试 | 已有后端及前端测试,覆盖面需按清单补齐 | 全量测试、关键页面、越权和失败路径 | | P2-07 | [~] | 升级、降级、卸载和回滚 | 已有安装器和发布说明,实机闭环未完成 | 升级、降级、卸载、失败恢复 | | P2-08 | [!] | Windows Service 实机验收 | 当前证据不足以标记通过 | 安装、启动、升级、卸载和日志 | | P2-09 | [!] | Linux systemd 实机验收 | 有 unit 和历史测试,当前版本需重新核对 | 安装、启动、重启、日志、Nginx、回滚 | | P2-10 | [~] | 安全基线 | 已有 SSH、凭据和数据库安全测试,仍需完整门禁 | TLS、Cookie、CSRF、越权、路径和命令注入 | ## 六、P3 后续增强 | 编号 | 状态 | 功能 | |---|---:|---| | P3-01 | [ ] | 多租户支持 | | P3-02 | [ ] | API Token 管理 | | P3-03 | [ ] | Webhook 事件订阅 | | P3-04 | [ ] | 更多 DNS Provider 插件 | | P3-05 | [ ] | 证书标签和批量操作 | | P3-06 | [ ] | 多实例高可用 | | P3-07 | [ ] | 分布式任务队列 | | P3-08 | [ ] | Prometheus 指标接口 | | P3-09 | [ ] | OpenAPI 自动生成 | | P3-10 | [ ] | 移动端适配 | ## 七、本轮执行记录 ### 2026-09-27:建立整改执行基线 - 已检查 `main` 分支和工作区,当前无未提交代码变更。 - 已确认 Go、Node.js、npm 和前端锁文件实际版本。 - 已确认数据库代码同时包含 SQLite、MySQL 和 PostgreSQL 适配,但正式支持矩阵尚未统一。 - 已发现桌面二进制和桌面前端构建入口仍在 Git 索引中,暂不直接删除,列入 P0-03 复审。 - 已补强 `.gitignore`,覆盖桌面构建产物、部署暂存目录、发布/证据目录和本地数据库/密钥文件。 ## 八、下一轮优先顺序 1. 继续 P0-04 工具链固定、锁文件安装策略及构建机/运行机版本记录;独立安装仍有 esbuild 脚本批准策略警告,不自动批准绕过审查。 2. 继续 P0-05 三数据库正式版本矩阵、真实迁移和恢复验证,明确非跳过证据。 3. 推进 P0-06/P0-07 领域模型和项目隔离;用户分组不能替代项目权限。 4. 继续定位 SSH 公钥自动部署实机失败阶段,完成密码安装和密钥登录双路径验收。 5. 将生产验收门禁与当前远程部署、DNS、HTTPS 和 ACME 证据逐项对应;P0-01/P0-02/P0-03 保持待最终复审,不重做已取得的同提交证据。 ### 2026-09-27:自动化基线验证 | 验证项 | 命令 | 结果 | |---|---|---| | 后端单元和集成测试 | `go test -p 1 -count=1 -timeout=3m ./...` | 通过 | | 后端静态检查 | `go vet -p=1 ./...` | 通过 | | Go 模块完整性 | `go mod verify` | 通过 | | 前端测试 | `npm.cmd test` | 150 项通过,0 失败 | | 前端生产构建 | `npm.cmd run build` | 通过 | | 前端生产依赖审计 | `npm.cmd audit --omit=dev --audit-level=high` | 0 个漏洞 | 以上结果仅证明当前代码在本地自动化层通过,不替代 Windows Service、Linux systemd、真实 DNS、ACME、HTTPS、SSH 和备份恢复验收。 ### 2026-09-27:P0-03 生成物索引清理 - 已确认 `desktop/scripts/build-frontend.mjs` 从根目录 `frontend/dist` 重新构建并复制桌面资源。 - 已将 `desktop/desktop.exe` 和 `desktop/frontend/dist/index.html` 从 Git 索引移除;本地文件仍保留,未物理删除。 - `deploy/tests/install-linux-test.py` 保留为可复用测试代码。 - 本项仍需在独立克隆中验证正式发布包和生成物边界;按 P0-01 的范围调整,不再以桌面构建作为正式门禁。 ### 2026-09-27:P0-04、P0-05、P2-07 版本和迁移保护 - 纠正工具链误报:`backend` 模块内实际为 Go `1.26.6`,`GOTOOLCHAIN=auto`。没有降低模块版本要求。 - 新增《构建版本与数据库支持矩阵》,区分本地代码检查、SQLite 实测和外部数据库实机验收。 - 新增迁移目录/嵌入/版本登记一致性检查,以及七类反例测试。 - `Migrate` 拒绝新版数据库和不连续的迁移历史,避免旧程序误用更新后的数据库。 - 数据库定向测试通过:五类异常历史拒绝后原数据不变;SQLite 从 0~9 版本升级并重复执行通过。 - 仅使用测试临时库,没有访问或清空外部业务数据库。三种数据库兼容性不能据此标记全部通过。 ### 2026-09-27:P0-01 正式发布范围收敛 - 依赖:原始整改清单 P0-01,已推送的 `8b33282` 作为修改前检查点;未删除桌面源码或本地生成物。 - 涉及文件:`build/build-release.ps1`、`backend/internal/releasearchive/verify_test.go`、根目录及各模块 README、生产和历史测试文档。 - 正式发布已移除 Wails 调用和桌面打包;清单新增 `delivery_scope=[web,server]`,兼容字段 `desktop_requested=false`。 - 旧参数 `SkipDesktop` 仅警告并兼容,显式设假也不能恢复桌面构建;传入 `DesktopDirectory` 在构建前报错。 - 保留路径扫描、Go `-trimpath`、文件及归档 SHA256、拒绝覆盖旧输出、源码提交和脏状态记录。 - 已通过 PowerShell 语法解析、`go test -count=1 -timeout=3m ./internal/releasearchive ./cmd/scert-release`、`git diff --check`。 - 发布范围验证已完成,证据见下节;这仍是构建层验证,不代表 Windows/Linux 实机安装验收。 - 历史业务 CLI 的执行入口及最终产物检查已由后续批次完成,见本节末尾的范围验收记录。 ### 2026-09-27:双平台和独立克隆发布验证 - 源码提交:`25fd4cf`,已推送。默认双平台构建成功,`manifest.json` 的 `source_dirty=false`、`delivery_scope=[web,server]`、`desktop_requested=false`、路径检查通过。 - 输出:`build/release-scope-20260927-25fd4cf/`。清单共 33 项(31 个包内文件、2 个归档),逐项文件长度和 SHA256 匹配。 - 真实解包核对:Windows 9 个文件、8 条包内校验和;Linux 22 个文件、21 条包内校验和。解包内容与清单一致,无桌面产物。 - `DesktopDirectory` 反例返回退出码 1,且没有创建输出目录。 - 独立克隆:`build/checkout-scope-20260927-25fd4cf/`。执行 `npm.cmd ci --no-audit --no-fund`、`npm.cmd test`,150 项通过;显式 `-SkipDesktop:$false` 构建双平台通过,33 项清单的长度和 SHA256 再次匹配。 - 独立克隆保留 `desktop/main.go`,不包含 `desktop/desktop.exe` 或桌面 dist。跟踪清单没有 `.runtime`、`node_modules`、dist、可执行文件、数据库或私钥后缀文件;克隆工作区仍干净。 - `npm ci` 提示 esbuild 的安装脚本尚未列入批准清单,但命令、前端测试及构建均退出成功;未自动批准额外脚本。可复现安装策略仍归 P0-04 后续审查。 ### 2026-09-27:CLI 运维范围收敛 - 依赖 P0-01 正式范围;涉及 `backend/internal/cli/root.go`、根命令/范围/运维测试、README 和《命令行运维范围说明》。 - `domain`、`server`、`ssh-key`、`renew`、`deploy` 不再注册业务实现;仅保留隐藏的中文迁移提示,返回错误,不解析或回显旧凭据参数。 - 保留初始化、服务启动、状态、证书诊断、DNS 诊断、配置、日志、备份恢复及系统服务运维;服务端自动续期未更改。 - 新增命令树白名单和 11 类旧入口拒绝测试;用无效配置和模拟凭据证明拒绝先于配置读取,配置内容不变且没有新增运行数据。 - CLI 定向测试、后端全量 `go test -p 1 -count=1 -timeout=3m ./...` 和 `go vet -p=1 ./...` 已通过。使用测试临时目录,没有清空或连接生产数据库。 - 本批实际 Windows 可执行文件的帮助和旧入口退出码已在后续干净发布包中验证;Linux 安装及服务运行仍需独立实机验证。 ### 2026-09-27:CLI 实际产物复核修正 - `d90ddaa` 已推送并完成干净工作区双平台构建,产物位于 `build/release-scope-20260927-d90ddaa/`。 - 实际 Windows 可执行文件的默认帮助仅显示运维命令;旧 `domain add` 返回退出码 1,没有执行旧业务。 - 实测发现框架先输出英文 `Error:`,入口随后又输出中文错误,造成重复提示。已设置根命令 `SilenceErrors=true`,由 `Execute` 统一输出中文错误;新增无重复输出断言。 - 修正后 CLI 和发布模块定向测试及静态检查通过;最终复核使用修正后的 `885478a` 干净发布包,没有用之前的二进制代替。 ### 2026-09-27:P0-01 范围验收记录 | 验收点 | 当前证据 | 结论 | |---|---|---| | 正式范围只有 Web 和服务端 | 根 README、构建/部署说明、当前执行清单和历史范围声明一致;无额外 CI 或发布入口调用 Wails | 本地复核通过 | | 桌面历史源码保留 | 桌面目录及开发说明仍在;原本机桌面二进制和 dist 未物理删除 | 符合不删除要求 | | 双平台实际发布包 | `build/release-scope-20260927-885478a/`;源码 `885478a7e0dfc3832cdd094ed388891c41062eb9`,`source_dirty=false` | 构建层通过 | | 清单及归档一致 | 33 项长度和 SHA256 一致;Windows 解包 9 文件/8 校验项,Linux 22 文件/21 校验项,均无桌面产物 | 构建层通过 | | Linux 可执行权限 | 归档内 `scert`、`scert-admin`、`scert-nginx`、`scert-storage` 和安装器均为 `0755` | 归档层通过,不代表 Linux 已运行 | | 实际 CLI 帮助 | 从最终 Windows ZIP 解出的 `scert.exe help` 返回 0,仅公开运维入口 | 本机执行通过 | | 实际旧 CLI 拒绝 | `domain`、`server`、`ssh-key`、`renew`、`deploy` 均返回 1;仅一条中文错误,无模拟凭据回显,无运行目录创建 | 本机执行通过 | | 自动化回归 | 最终应用代码通过后端全量测试、全量 vet 和 `go mod verify`;前端独立克隆 150 项通过,源码未再修改 | 本地自动化通过 | | 归档测试范围 | Linux 测试改用 `scert-storage`,不再要求桌面;Windows 测试逐项核查实际平台文件,不再仅判断 Web 入口存在 | 发布模块测试和 vet 通过 | P0-01 标记 `[x] 已完成,等待复审`,不标记生产放行。整体 44 项整改未完成:P0-02 执行规格、P0-03 全仓库边界、三数据库实机验证、项目权限、统一任务、备份页面及生产门禁等仍需继续。上述输出均在忽略目录内,没有提交二进制、运行数据或辅助测试脚本。 ### 2026-09-27:P0-02/P0-03 规格与产物边界验收记录 本批从北京时间约 17:40 开始,基线 `96883b3`;修改前已推送中文检查点 `61b8cac`。实现提交为 `fab98d1069c29729959c031ce6cf112512751017`,随后仅更新本批证据与状态。没有 SSH、真实 DNS、生产数据库清理或浏览器操作,也没有删除工作区既有文件、添加临时辅助验收脚本。 | 验证项 | 实际结果 | 边界 | |---|---|---| | 44 项执行规格 | P0 12、P1 12、P2 10、P3 10;编号和名称与原始清单一致,每项有 12 个必需字段及独立六阶段 | 规格齐全不代表 44 项功能完成 | | 结构和引用 | 显式依赖编号、既有文件路径、汇总状态核对通过;拟新增路径明确标注 | 使用只读核对,没有生成辅助脚本 | | 目录及忽略边界 | 新增发布、证据、测试及辅助目录说明;通用二进制、归档、缓存、补丁、数据库旁路和私钥规则;公共 CA 和迁移仍保留 | 忽略规则不是内容级秘密扫描器 | | 正式边界回归 | `source_boundary_test.go` 在隔离 Git 仓库核对根/子目录规则和所有受跟踪路径,屏蔽调用者 Git 配置 | 不依赖 `.git/info/exclude`,不把已有被跟踪产物自动放过 | | 后端完整回归 | `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 均通过 | 当前 Windows 主机自动化,不是 Linux 平台专用代码实机测试 | | 边界测试开销 | 改为一次空字节分隔的批量 Git 查询;发布模块完整回归约 2.48 秒,独立克隆约 3.75 秒 | 保持相同路径及索引断言,避免逐文件启动 Git 的约 32 秒开销 | | 独立克隆 | `git clone --no-local --no-hardlinks` 到 `build/checkout-boundary-20260927-fab98d1/`,当前提交及规格齐全 | 不共享源仓库硬链接或专属排除配置 | | 干净前端安装与测试 | 克隆内 `npm.cmd ci --no-audit --no-fund` 成功,`npm.cmd test` 150/150 通过,0 跳过 | esbuild 安装脚本批准策略警告仍属 P0-04,不自动放行 | | 双平台候选 | 克隆内正式脚本输出至 `release/boundary-20260927-fab98d1/`,Web、Windows amd64、Linux amd64 构建和路径检查通过 | `source_dirty=false`,范围为 web/server,无桌面产物 | | 实际清单与解包 | 33 项 manifest 长度/SHA256 一致;Windows 9 文件/8 校验项,Linux 22 文件/21 校验项全部一致,无额外包内文件 | 本批没有将包部署到远端运行 | | 构建后源码边界 | 独立克隆安装依赖、构建和解包后 `git status --short` 为空,发布及证据输出由仓库规则忽略 | 没有二进制、归档、数据库、密钥进入本批提交 | 本批将 P0-02、P0-03 标记为 `[x] 已完成,等待复审`。连同 P0-01,共 3 项处于待复审状态,不标为 `[✓]`。其余任务及全部生产门禁继续保留,整体整改目标尚未完成。 ### 2026-09-27:P0-04 固定工具链、安装策略与重复构建记录 本批北京时间约 18:12 开始。先核查当前工作区,没有待提交改动;修改前检查点 `5fdb5e4`,主要实现 `410ce75`;发现换行差异后检查点 `510a854`,修复后最终候选为 `94237b8e7da37f6242fa115aaf60fef0a88392c2`。所有代码提交已推送,后续仅补充本批证据文档。 本批没有 SSH、真实 DNS、浏览器、生产数据库清理或外部数据库连接;只使用正式构建入口和正式回归。没有增加临时辅助验收脚本,没有删除既有发布包和证据目录。`npm ci` 按正式安装语义重建对应克隆的前端依赖目录。 | 验证项 | 实际证据 | 边界 | |---|---|---| | 精确工具链 | 模块内 Go `1.26.6`;Node `24.19.0`、npm `11.17.0`;Vue `3.5.41`、Vite `6.4.3`、插件 `5.2.4` | 不升级依赖图,只固定已有版本并检查声明与锁文件一致 | | 安装策略 | `.npmrc` 与正式命令均显式禁用安装脚本;构建包含开发及平台可选依赖 | esbuild 安装警告不再被误当作脚本未执行的证明 | | 真实安装正反对照 | 离线本地依赖和根项目的生命周期标记在正式安装下均不出现,主动放行对照能出现;环境尝试关闭限制仍被命令行覆盖 | 使用正式 Node 回归中的隔离夹具,不是对生产服务的攻击测试 | | 嵌套 npm 回归 | 首次完整测试暴露用户级白名单被 npm 导出后导致项目安装拒绝;修复为仅隔离子进程该变量,随后 175 项全部通过 | 未改用户 npm 配置,未开启脚本绕过错误 | | 发布前拒绝 | 版本、锁文件、策略、外部 esbuild、Go 覆盖等拒绝回归;实际 PowerShell 入口拒绝后未创建发布目录 | 前端 175 项中含 25 项工具链回归,0 跳过 | | 换行问题与修复 | `410ce75` 在 CRLF 克隆中产生不同 Web 哈希;`.gitattributes` 固定文本 LF,正式 Go 测试实际签出 `true/false/input` 三种配置且保护二进制原样 | 没有用终端脚本批量改写中文源码或重写主工作区 | | 最终候选完整回归 | `94237b8` 独立克隆中 `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 均通过;前端 175/175 通过 | PostgreSQL 真实测试未显式启用,跳过的数据库集成门禁不算实机通过 | | 双独立克隆 | 分别用 `core.autocrlf=true/false` 与 `--no-local --no-hardlinks` 创建;两份均按新策略干净安装 | 不共享源仓库硬链接或专属排除配置;构建机和工具缓存相同,不称两台独立机器 | | 前端重复构建 | 两份克隆输出共 4 个文件,路径与 SHA256 全部一致;5 份依赖/策略输入哈希也全部一致 | 不宣称带时间戳的全部发布归档逐字节一致 | | 构建机证据 | Windows 11 Home China,系统 `10.0.26200`,amd64,PowerShell `5.1.26100.9444` | manifest 不含用户名、主机名或本地绝对路径;Linux 原生构建尚未验证 | | 最终候选清单 | `source_dirty=false`,`dependency_install=npm-ci`,`dependency_scripts=disabled`;33 项长度和 SHA256 全部正确 | 正式范围仅 Web/服务端,没有桌面产物 | | 实际解包 | Windows 9 文件/8 条包内校验,Linux 22 文件/21 条包内校验;逐项与 manifest 一致且无额外文件 | 包已解出但未在远端或 Windows Service 中安装运行 | | 源码边界 | 两份克隆安装、构建和解包后 Git 工作区均干净 | 构建产物及证据没有进入源码提交 | 最终候选与证据路径: ```text build/checkout-toolchain-lf-20260927/ release/toolchain-94237b8/ artifacts/toolchain-94237b8/ build/checkout-toolchain-lf-control-20260927/frontend/dist/ ``` P0-04 保持 `[~] 进行中`;代码实现与自动化阶段标 `[x]`,Windows 隔离构建证据已齐,但 Linux 原生构建、双平台实际运行系统及最终复审未齐。不得据此宣称 44 项整改或生产部署验收完成。下一批继续 P0-05 的真实数据库版本、迁移与恢复矩阵;不清空现有共享 MySQL 服务中的业务库。 ### 2026-09-27:P0-05 双版本 MySQL 隔离迁移与编码修复 本批北京时间约 18:39 开始,修改前检查点 `fd4929c`,代码候选 `ee9ac857a9855fd1993deb3b03498ca921a5b559`,均已推送。使用本机 MySQL 程序启动全新独立实例,没有连接、停止或清空原有 MySQL57/MySQL80 服务,没有 SSH、DNS、浏览器或生产部署操作;没有新增临时辅助脚本。 首次 MySQL 5.7.44 实测在第 7 号迁移报 1064。实际原因是嵌入 SQL 文件头存在 UTF-8 BOM,原解析器将其直接发给数据库,也使字段重入匹配失败。修复仅在解析入口去掉文件头编码标记,保留 SQL 字面量内部字符;没有批量改写迁移文件和中文。新增两项常规编码回归及正式隔离实库测试。 | 验证项 | 本批结果 | 证据边界 | |---|---|---| | MySQL 5.7.44 | `ee9ac85`:48 项子测试通过,0 失败、0 跳过;包测试约 29.8 秒 | Windows 本机独立真实数据库,不是远端生产实例 | | MySQL 8.0.45 | 同候选:48 项子测试通过,0 失败、0 跳过;包测试约 42.8 秒 | 单独初始化与验证,没有以 5.7 代替 8.0 | | 空库及历史升级 | 0~9 共 10 个起点,重复迁移无报错 | 历史结构由仓库旧迁移构造,不声称覆盖全部历史程序导出的生产库 | | 迁移中断重入 | 9 份迁移共 29 个语句边界逐一落盘后重入,包括 DDL 全部执行但版本号未写入 | 模拟已落盘的中间状态,不是电源故障或操作系统崩溃演练 | | 结构和数据 | 每条成功路径的表引擎、字符集、字段、默认值、索引与全新迁移快照一致;中文哨兵和用户、域名、服务器关联保留 | 不替代所有应用业务或权限 API 回归 | | 连接安全 | 严格 TLS;不可信 CA、错误主机名、明文连接均被对应校验拒绝;业务账户无跨库及账户表权限 | 测试注册的 TLS 信任不等于正式配置、证书轮换及连接 UI 已验收 | | 异常迁移历史 | 缺首项、缺中间项、零、负数和新版历史全部拒绝,保留数据、不创建业务表 | 不删除迁移记录绕过版本检查 | | 冷重启 | 正常停止独立数据库,重新启动并重新打开应用连接后,数据和结构一致 | 不等于 Windows Service、systemd 或在线断线恢复验收 | | 环境收尾 | 所有本测试启动的数据库已正常退出;原服务仍运行,进程号未变;随机监听已关闭,bootstrap 文件为空 | 数据目录和日志留在被忽略的产物目录,未删除既有文件或提交产物 | | 常规回归 | 同候选 `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 全部通过 | 常规测试默认跳过外部实库门禁;MySQL 以本批两份显式运行日志为准,PostgreSQL 未启用;前端未改,本批未重跑前端 | 开发阶段曾在保留旧连接池后重启数据库,首次迁移收到 `invalid connection`。此项作为在线断线恢复待办保留,没有用自动重试掩盖 SQL 执行结果不确定性。最终冷重启用例明确关闭并重新打开应用连接,不将其算成该待办通过。TLS 反向测试也修正了错误码假设:账户的 `REQUIRE SSL` 可先返回认证拒绝,测试同时检查全局安全传输开关及严格证书错误类型,没有放宽加密要求。 正式命令在 `backend/` 执行,设置各版本独立的 `SCERT_MYSQL_TEST_BIN` 和共用产物根 `SCERT_MYSQL_TEST_ROOT`,然后运行 `go test -count=1 -v -timeout=8m -run '^TestMySQLRealMigrations$' ./internal/database`。每次运行自行新建数据目录与随机端口,完整参数见《构建版本与数据库支持矩阵.md》。最终非跳过日志: ```text artifacts/mysql-matrix-20260927/mysql57-ee9ac85.log artifacts/mysql-matrix-20260927/mysql80-ee9ac85.log ``` P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全部 44 项原始范围保持不变。下一步需继续处理在线数据库连接恢复、MySQL 备份恢复及完整业务初始化,再补 PostgreSQL 当前候选和 SQLite 并发锁证据。 ### 2026-09-27:P0-05 Windows MySQL 在线连接恢复 整改前检查点 `f0a9475`;实现候选 `9cf3a3b`。新增正式 Go 回归首先在未修复代码的 MySQL 5.7.44 重现:保留应用池、重启独立数据库后,第一条业务写入返回 `invalid connection`。没有用额外健康请求、重开应用池或业务重试绕过问题。 - `[x]` 根因与修复:Windows 驱动空闲检查缺位;在业务发送前增加单次最多 2 秒的复用探测,失败淘汰连接。Linux 不增加额外往返;查询、写入及提交错误保持原样。 - `[x]` 安全边界单测:探测截止时间、取消、失败关闭、仅在写入前替换连接,以及查询、写入、提交不确定时不自动重放。 - `[x]` 双版本隔离实库:每个版本原有 48 项迁移及安全测试,加 7 项连接恢复、预编译、参数转换和事务测试,合计 55 项通过,0 失败、0 跳过。 - `[x]` 后端回归:`go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 通过;Linux 数据库测试包交叉编译通过。本批没有改前端,未重跑前端测试。 - `[ ]` 尚缺:Linux 实库恢复、真实网络提交确认丢失演练、MySQL CLI 备份恢复、正式 Web 初始化和业务回归;不能用上述测试替代服务部署验收。 实现、命令、行为成本及更完整的覆盖边界见《构建版本与数据库支持矩阵.md》第六节。最终日志位于 `artifacts/mysql-matrix-20260927/mysql57-9cf3a3b.log`、`mysql80-9cf3a3b.log`,测试产物不提交。共享 MySQL 服务不在测试操作范围。 本批只关闭 Windows 隔离环境中已复现的首次请求故障,不把 P0-05 或全部 44 项标记完成。下一批继续 MySQL 备份恢复的实库一致性与失败回滚门禁。