Scert/doc/Scert整改任务执行清单.md

293 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 备份恢复的实库一致性与失败回滚门禁。