From 7478a96bdc3d240b6d1e434a75a5102fc9de3961 Mon Sep 17 00:00:00 2001 From: Citrons <909229731@qq.com> Date: Mon, 17 Aug 2026 17:50:58 +0800 Subject: [PATCH] =?UTF-8?q?docs(GOV-011):=20=E5=AE=8C=E6=88=90=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E7=89=88=E6=9C=AC=E9=AA=8C=E8=AF=81=E4=B8=8E=E5=AE=A1?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- .../development-summary.md | 59 ++++++++++++++++ .../gitnexus/after.md | 17 +++++ .../gitnexus/comparison.md | 29 ++++++++ .../gitnexus/detected-changes.md | 34 ++++++++++ .../implementation-plan.md | 8 +-- .../manifest.yaml | 9 ++- .../qa/test-results.md | 63 ++++++++++++++++++ .../qa/visual-qa.md | 21 ++++++ .../release-notes.md | 21 ++++++ .../review/code-review.md | 46 +++++++++++++ .../review/standards-review.md | 33 +++++++++ .../rollback.md | 24 +++++++ .../app-shell-desktop-1440x900-cce77aa.png | Bin 0 -> 12337 bytes .../app-shell-mobile-390x844-cce77aa.png | Bin 0 -> 8944 bytes .../test-plan.md | 58 ++++++++++++++++ 16 files changed, 418 insertions(+), 6 deletions(-) create mode 100644 docs/features/GOV-011-runtime-version-series/development-summary.md create mode 100644 docs/features/GOV-011-runtime-version-series/gitnexus/after.md create mode 100644 docs/features/GOV-011-runtime-version-series/gitnexus/comparison.md create mode 100644 docs/features/GOV-011-runtime-version-series/gitnexus/detected-changes.md create mode 100644 docs/features/GOV-011-runtime-version-series/qa/test-results.md create mode 100644 docs/features/GOV-011-runtime-version-series/qa/visual-qa.md create mode 100644 docs/features/GOV-011-runtime-version-series/release-notes.md create mode 100644 docs/features/GOV-011-runtime-version-series/review/code-review.md create mode 100644 docs/features/GOV-011-runtime-version-series/review/standards-review.md create mode 100644 docs/features/GOV-011-runtime-version-series/rollback.md create mode 100644 docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-desktop-1440x900-cce77aa.png create mode 100644 docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-mobile-390x844-cce77aa.png create mode 100644 docs/features/GOV-011-runtime-version-series/test-plan.md diff --git a/AGENTS.md b/AGENTS.md index b1aa141..56ca63e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,7 +29,7 @@ # GitNexus — Code Intelligence -This project is indexed by GitNexus as **a-share-analysis** (2004 symbols, 2681 relationships, 50 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. +This project is indexed by GitNexus as **a-share-analysis** (2015 symbols, 2692 relationships, 50 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely. > If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first. diff --git a/docs/features/GOV-011-runtime-version-series/development-summary.md b/docs/features/GOV-011-runtime-version-series/development-summary.md new file mode 100644 index 0000000..f4c40f9 --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/development-summary.md @@ -0,0 +1,59 @@ +# GOV-011 开发总结 + +- 功能编号:GOV-011 +- 日期:2026-08-17 +- 当前状态:已完成实现与验证,等待版本发布封存 + +## 原始开发需求 + +用户要求 Node.js 和 MySQL 不绑定具体小版本:Node.js 使用 22.x,MySQL 使用完整 5.7.x,不设置最低补丁版本。`utf8mb4`、`utf8mb4_general_ci` 和东八区时区等既有严格约束继续保留;历史证据中的实际版本不得改写。 + +## 需求与范围变化 + +- Node 生产判断原本已经按主版本 22 校验,本次只补充系列内/外特征测试,没有改写生产逻辑。 +- MySQL 服务端从精确 5.7.42 调整为合法 5.7.x,客户端和 mysqldump 原有 5.7.x 约束保持不变。 +- 健康详情从硬编码 patch 改为服务端元数据中的三段版本;`-log` 等附加文本不回显。 +- 现行架构、开发规范、本地/Ubuntu 部署手册统一为系列口径;v0.0.8 CHANGELOG、历史 QA、Schema manifest 和已发布档案继续保存真实 5.7.42、22.11.0、22.22.0。 +- 用户确认当前开发库无业务结构并授权本次跳过 v0.0.8 Schema 备份。该决定只形成 GOV-011 一次性例外,不增加通用跳过开关。 + +## 实际完成需求 + +| 需求 | 状态 | 实际结果 | +|---|---|---| +| Node.js 22.x 系列约束 | 已完成 | 覆盖 22.0.0、常规 22.x、带后缀 22.x 与 21/23 边界;生产判断保持 `major === 22`。 | +| MySQL 服务端完整 5.7.x | 已完成 | Schema 元数据接受 5.7.0、5.7.41、5.7.42-log,拒绝 5.6、8.0 和无效格式。 | +| 健康检查实际版本 | 已完成 | `5.7.41-log` 返回 `MySQL 5.7.41 / ...`;DTO 与查询结构不变。 | +| 字符规则和时区保持严格 | 已完成 | `utf8mb4`、`utf8mb4_general_ci`、库名和 `+08:00` 失败用例全部保留并扩充。 | +| 当前规范统一系列口径 | 已完成 | 架构、开发规范、本地开发、Ubuntu 生产和说明性代码注释已更新。 | +| 历史证据保持原样 | 已完成 | 未批量改写历史功能档案、QA、Schema 基线或 v0.0.8 发布事实。 | + +## 修复缺陷 + +- 修复 Schema 服务端校验把开发机实际 5.7.42 当作唯一合法 patch 的约束错误。 +- 修复 API 健康检查拒绝其他合法 5.7.x 且成功详情硬编码 5.7.42 的问题。 +- 修复当前架构、开发规范和部署手册将补丁版本误写成跨环境强制基线的问题。 +- 完整 Schema 回归发现一处测试仍断言旧错误文案,已同步为 `5.7.x` 并重新验证。 + +## 未完成与延期项 + +- 本功能没有数据库结构、迁移或数据变更,因此不存在数据回滚或真实 Schema 导出结果。 +- v0.0.8 Schema 基线没有生成。`verify:release`、`schema:verify` 和 `governance:finish` 会在该缺失条件失败;这是用户已接受的追溯风险,不代表其他测试通过,也不会延伸到后续功能。 +- 不建立 MySQL 各 patch 的自动兼容矩阵;未来遇到特定补丁缺陷时通过独立功能或 ADR 决定是否提高最低版本。 + +## 关键提交 + +| 提交 | 中文摘要 | 推送状态 | +|---|---|---| +| `426870b` | `docs(GOV-011): 制定运行时系列版本实施计划` | 已推送 Gitea | +| `c8277ef` | `test(GOV-011): 补充 Node 22 系列边界验证` | 已推送 Gitea | +| `54499f0` | `fix(GOV-011): 放宽 MySQL 服务端为完整 5.7 系列` | 已推送 Gitea | +| `dc8da80` | `fix(GOV-011): 支持 MySQL 5.7 系列健康检查` | 已推送 Gitea | +| `cce77aa` | `docs(GOV-011): 统一运行时系列版本口径` | 已推送 Gitea | + +## 验证证据 + +- TDD:Schema 的 5.7.0/5.7.41 成功用例先被旧精确判断拒绝;健康检查的 5.7.41-log 用例先被旧实现拒绝,随后最小修改转绿。 +- 排除已授权严格发布基线用例后,Schema 28/28;runtime 3/3、governance 10/10、MySQL 2/2、环境 10/10、契约 3/3、边界 16/16、部署 6/6、Web 11/11、Server 30/30、API 预检 2/2。 +- lint、格式、类型检查、OpenAPI 契约、Web/Server 构建、Playwright 4/4 和源码发布验证通过。 +- GitNexus 相对 v0.0.8 检测为 23 个文件、70 个符号、11 条受影响流程、HIGH;运行流仅落在既定 Schema 与健康检查边界,详见 `gitnexus/`。 +- 依赖审计为 0 已知漏洞,Redis 返回 `PONG`;两张视觉截图无溢出或控制台错误。 diff --git a/docs/features/GOV-011-runtime-version-series/gitnexus/after.md b/docs/features/GOV-011-runtime-version-series/gitnexus/after.md new file mode 100644 index 0000000..9d3d559 --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/gitnexus/after.md @@ -0,0 +1,17 @@ +# GitNexus 开发后基线 + +- 索引提交:`cce77aa` +- 索引时间:2026-08-17 17:43(Asia/Shanghai) +- 状态:up-to-date +- 节点:2015 +- 关系:2692 +- 集群:49 +- 执行流:50 + +## 工作区状态 + +实现提交均已推送 `origin/main`。索引刷新后仅有 GitNexus 自动更新的 `AGENTS.md` 计数、GOV-011 最终证据和视觉截图等待后续文档提交。 + +## 运行边界 + +开发后新增或变化的运行流程仍只有 Schema 治理和 API 健康装配。Web 页面、Scheduler、Worker、Redis 与 RocketMQ 没有新增执行流。 diff --git a/docs/features/GOV-011-runtime-version-series/gitnexus/comparison.md b/docs/features/GOV-011-runtime-version-series/gitnexus/comparison.md new file mode 100644 index 0000000..98478de --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/gitnexus/comparison.md @@ -0,0 +1,29 @@ +# GitNexus 前后对比 + +- before:1894 个符号、2569 条关系、50 条流程(GOV-011 启动记录) +- after:2015 个节点、2692 条关系、50 条流程(`cce77aa`) +- 相对 v0.0.8 detect-changes:23 个文件、70 个符号、11 条受影响流程、HIGH + +## 差异解释 + +节点与关系增长主要来自 GOV-011 新增功能档案、实施计划、测试名称和当前规范标题。执行流总数仍为 50,没有出现新的生产流程。HIGH 风险由 Schema 中心函数的多条既有调用链贡献,和开发前 CRITICAL 评估方向一致。 + +## 跨模块核对 + +| 模块 | 结论 | +|---|---| +| HTTP/OpenAPI | DTO 和字段不变;健康 `detail` 文本显示实际 patch。 | +| Web API | 请求函数、adapter 和页面均未修改。 | +| 消息 | RocketMQ 契约、Topic、Group 和 Adapter 未修改。 | +| 数据库 | 不改 Schema、迁移、数据和查询范围;只放宽版本判断。 | +| Redis | 无代码和配置变化。 | +| API | MySQL 健康版本判断和详情变化,完整 Server 回归通过。 | +| Scheduler | 无行为变化,构建和进程测试通过。 | +| Worker | 无行为变化,构建和进程测试通过。 | +| 部署 | 拓扑不变,只把前置 MySQL 文案改为 5.7.x。 | +| 测试 | 新增系列边界、实际版本详情和当前文档契约。 | +| 文档 | 架构、规范、部署和功能档案同步更新;历史证据保留。 | + +## 风险结论 + +没有发现计划外模块影响。残余风险是不同 MySQL 5.7 patch 自身可能存在缺陷,以及 v0.0.8 缺少可验证 Schema 基线;前者由真实迁移/查询验证控制,后者由用户接受的一次性例外记录控制。 diff --git a/docs/features/GOV-011-runtime-version-series/gitnexus/detected-changes.md b/docs/features/GOV-011-runtime-version-series/gitnexus/detected-changes.md new file mode 100644 index 0000000..fade60a --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/gitnexus/detected-changes.md @@ -0,0 +1,34 @@ +# GitNexus 实际变更检测 + +- 比较基线:`v0.0.8` / `9e85809` +- 实现提交:`cce77aa` +- 结果:23 个文件、70 个符号、11 条受影响流程 +- 风险:HIGH + +## 变更符号 + +核心运行时符号为: + +- `assertMysql57Metadata` +- `runBaselineGeneration` +- `MysqlHealthClient` +- `MysqlHealthClient.check` +- `createMysqlHealthClient` +- `assertSupportedRuntime` 只新增测试,没有生产实现变化 + +其余符号主要来自架构、规范、部署和 GOV-011 功能档案的 Markdown 标题,以及治理测试中的局部变量。 + +## 受影响执行流 + +- `RunBaselineGeneration → RequireExactValue` +- `AssertCurrentReleasedBaselinePublished → RequireExactValue` +- `BuildCapturedArtifacts → RequireExactValue` +- `AssertCurrentReleasedBaseline → RequireExactValue` +- `RunCommandLine` 到 `RequireExactValue`、`IsEnabled`、`ParseManifest`、`AssertExactFileSet`、`BuildManifest` 和 `ParseEnvironmentFile` +- `UseFactory → MysqlHealthClient` + +HIGH 来自 Schema 中心入口映射到多条治理流程,不是新增网络、数据库写入或消息链路。排除用户已授权的 v0.0.8 基线缺失用例后,Schema 28 项全部通过;API 健康、Server 测试、类型和构建也全部通过。 + +## 范围结论 + +实际变化与开发前影响计划一致。没有新的 HTTP 字段、OpenAPI DTO、Web API、Redis、RocketMQ、Scheduler、Worker、数据库 Schema 或部署拓扑变化。 diff --git a/docs/features/GOV-011-runtime-version-series/implementation-plan.md b/docs/features/GOV-011-runtime-version-series/implementation-plan.md index 87aa86b..5f0121f 100644 --- a/docs/features/GOV-011-runtime-version-series/implementation-plan.md +++ b/docs/features/GOV-011-runtime-version-series/implementation-plan.md @@ -399,7 +399,7 @@ pnpm verify:release git diff --check ``` -Expected: 全部 PASS;`pnpm check:contracts` 执行后 OpenAPI 和 Web 生成类型没有非预期差异。 +Expected: 除 `pnpm verify:release` 因已授权的 v0.0.8 Schema 基线缺失而失败外,其余命令 PASS;`pnpm check:contracts` 执行后 OpenAPI 和 Web 生成类型没有非预期差异。必须继续手工执行 `verify:release` 在 Schema 失败点之后的构建、E2E 和源码发布门禁。 - [ ] **Step 3: 完成视觉验证** @@ -422,7 +422,7 @@ npx gitnexus status ```bash pnpm schema:verify -pnpm governance:finish -- GOV-011 runtime-version-series +pnpm governance:finish GOV-011 runtime-version-series ``` Expected: 两者均因 `database/schema-baselines/v0.0.8` 缺失而失败。把完整错误摘要和退出码写入 `qa/test-results.md`,并引用 `schema-baseline-waiver.md`;不得把预期失败写成通过,也不得生成伪造基线。 @@ -478,13 +478,13 @@ Expected: 推送成功,远程包含完整功能档案;提交前 GitNexus det Run: `pnpm verify:release` -Expected: PASS。 +Expected: 因已授权的一次性例外,在 v0.0.8 Schema 严格发布基线检查处失败;失败点之前的门禁和手工补跑的后续构建、E2E、源码发布验证必须全部通过,且真实结果写入 QA。 Run: `git diff --check && git status --short && git log -1 --oneline` Expected: 只有预期发布文档变更,格式无错误;提交前再次执行 GitNexus detect-changes。 -按 Task 5 重跑 `pnpm schema:verify` 和 `pnpm governance:finish -- GOV-011 runtime-version-series`,Expected 仍是已记录的一次性例外失败;确认没有新增或变化的失败原因。 +按 Task 5 重跑 `pnpm schema:verify` 和 `pnpm governance:finish GOV-011 runtime-version-series`,Expected 仍是已记录的一次性例外失败;确认没有新增或变化的失败原因。 - [ ] **Step 3: 创建并推送发布封存提交** diff --git a/docs/features/GOV-011-runtime-version-series/manifest.yaml b/docs/features/GOV-011-runtime-version-series/manifest.yaml index 97e5be2..a9206b2 100644 --- a/docs/features/GOV-011-runtime-version-series/manifest.yaml +++ b/docs/features/GOV-011-runtime-version-series/manifest.yaml @@ -1,14 +1,21 @@ id: GOV-011 name: Node 与 MySQL 系列版本约束 slug: runtime-version-series -status: planned +status: reviewed owner: project created_at: 2026-08-17 prd: prd.md requirements: requirements.md design: design.md implementation_plan: implementation-plan.md +test_plan: test-plan.md +development_summary: development-summary.md schema_baseline_waiver: schema-baseline-waiver.md gitnexus_before: gitnexus/before.md gitnexus_impact: gitnexus/impact-plan.md +gitnexus_detected_changes: gitnexus/detected-changes.md +gitnexus_after: gitnexus/after.md +gitnexus_comparison: gitnexus/comparison.md +code_review: review/code-review.md +standards_review: review/standards-review.md release: unreleased diff --git a/docs/features/GOV-011-runtime-version-series/qa/test-results.md b/docs/features/GOV-011-runtime-version-series/qa/test-results.md new file mode 100644 index 0000000..c788795 --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/qa/test-results.md @@ -0,0 +1,63 @@ +# GOV-011 测试与质量证据 + +- 验证提交:`cce77aa` +- 验证日期:2026-08-17 +- 运行时:Node.js 22.11.0、pnpm 10.25.0 + +## RED-GREEN 证据 + +| 行为 | RED | GREEN | +|---|---|---| +| Schema 接受完整 5.7.x | `5.7.0` 被旧实现以“必须为 5.7.42”拒绝 | 系列内/外定向测试 2/2 通过 | +| 健康检查接受 5.7.41-log | 旧实现拒绝并输出 5.7.42 文案 | 健康客户端 5/5 通过,详情为 `MySQL 5.7.41 / ...` | +| 当前文档采用系列口径 | 架构/规范 0/2,部署文档测试 9/10 | MySQL 2/2、环境 10/10、部署 6/6 | + +## 自动化验证 + +| 命令或测试组 | 结果 | 关键证据 | +|---|---|---| +| `pnpm check:runtime` | passed | Node.js 22.11.0、pnpm 10.25.0 | +| `pnpm check:contracts` | passed | OpenAPI 与 Web 生成类型无漂移,项目边界通过 | +| `pnpm lint` | passed | Web/Server ESLint 无错误 | +| `pnpm format:check` | passed | 全仓 Prettier 通过 | +| `pnpm typecheck` | passed | Web、Vite 和 Server TypeScript 通过 | +| runtime | 3/3 | 22.x 系列与相邻主版本 | +| governance | 10/10 | 功能档案和 Review 门禁 | +| MySQL 规范 | 2/2 | 当前架构/规范使用 5.7.x | +| 环境 | 10/10 | 部署手册使用 5.7.x,其他环境边界保持 | +| Schema(跳过严格发布基线) | 28/28 | 生成、验证、历史 manifest 和字符规则回归 | +| contracts | 3/3 | 生成契约跟踪与漂移阻断 | +| boundaries | 16/16 | 前后端与 HTTP 边界 | +| deployment | 6/6 | 唯一 Ubuntu 源码发布边界 | +| Web | 11/11 | 请求、adapter 与外壳 | +| Server | 30/30 | API、配置、基础设施和进程 | +| API 预检 | 2/2 | Redis 可达/不可达分支 | +| `pnpm build` | passed | Web、API、Scheduler、Worker 构建成功 | +| `pnpm verify:e2e` | 4/4 | Chromium 桌面/移动页面和健康 API | +| `pnpm verify:source` | passed | 构建产物、systemd、Nginx 一致 | + +## 一次性例外失败证据 + +`pnpm verify:release` 退出码非 0。它依次通过 runtime、契约、lint、格式、类型以及 Schema 之前的测试,随后在 Schema 第 28 个严格发布基线用例失败;实际错误为缺少 `database/schema-baselines/v0.0.8`。Schema 总计 29 项,其中 28 项通过、1 项为该已知失败。 + +`pnpm schema:verify` 在直接目录校验处失败;`pnpm governance:finish GOV-011 runtime-version-series` 在其前置 `test:schema-baseline` 的严格发布基线用例处失败。两者根因都是同一个 v0.0.8 目录缺失条件。原因、用户授权和禁止伪造边界见 `schema-baseline-waiver.md`;其余等价门禁已逐项执行并保存上表证据。 + +## 安全证据 + +- `pnpm audit --prod --registry=https://registry.npmjs.org/`:`No known vulnerabilities found`。 +- `redis-cli -h 127.0.0.1 -p 6379 ping`:`PONG`,只验证本机开发 Redis。 +- 构建产物扫描只命中 `MYSQL_PASSWORD`、`AI_API_KEY` 等配置键和必填错误文案,没有真实值、连接串或 Authorization 头。 +- 本次没有新增依赖、SQL、命令执行、数据库写入、生产连接或外部网络请求。 +- 健康详情只返回三段版本、库名和时区,不返回原始后缀、地址、账号或密码。 + +## 性能证据 + +- Web JS:163908 字节;CSS:805 字节,与 v0.0.8 记录一致。 +- 健康检查仍为一次元数据查询,连接池上限 2;无重试、扫描、缓存或消息增量。 +- Schema 与 runtime 判断只在启动/治理阶段执行常数时间正则匹配,不进入行情请求热路径。 + +## GitNexus 证据 + +- after:2015 节点、2692 关系、49 集群、50 流程,索引 `cce77aa` 为 up-to-date。 +- compare:23 文件、70 符号、11 流程、HIGH;运行影响仅在既有 Schema 与 API 健康路径。 +- `AGENTS.md` 的 GitNexus 计数由 `analyze` 自动从 2004/2681 更新为 2015/2692。 diff --git a/docs/features/GOV-011-runtime-version-series/qa/visual-qa.md b/docs/features/GOV-011-runtime-version-series/qa/visual-qa.md new file mode 100644 index 0000000..29faaaf --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/qa/visual-qa.md @@ -0,0 +1,21 @@ +# GOV-011 视觉回归记录 + +- 页面:应用工程基础外壳 +- 变更类型:后端版本判断、测试、注释和文档;无页面样式或交互修改 +- 结论:无可观察视觉回归 + +## 桌面 + +- Chromium 视口:1440×900 +- 截图:[app-shell-desktop-1440x900-cce77aa.png](/Users/citrons/Documents/Codex/2026-08-12/wo-x/a-share-analysis/docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-desktop-1440x900-cce77aa.png) +- 检查:`main` 可见,标题正常,无横向溢出,控制台 warning/error 为空。 + +## 移动 + +- Chromium 视口:390×844 +- 截图:[app-shell-mobile-390x844-cce77aa.png](/Users/citrons/Documents/Codex/2026-08-12/wo-x/a-share-analysis/docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-mobile-390x844-cce77aa.png) +- 检查:标题与主内容正常换行和留白,无横向溢出、遮挡或裁切,控制台 warning/error 为空。 + +## 自动化证据 + +`pnpm verify:e2e` 在 desktop-chromium 与 mobile-chromium 共执行 4 项,全部通过;覆盖页面可见性、横向溢出、运行时错误和同源 `/api/v1/health` 契约。截图生成后测试 API 与 Vite 服务均通过 SIGINT 关闭,端口 3000/5173 无遗留监听。 diff --git a/docs/features/GOV-011-runtime-version-series/release-notes.md b/docs/features/GOV-011-runtime-version-series/release-notes.md new file mode 100644 index 0000000..44cc97c --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/release-notes.md @@ -0,0 +1,21 @@ +# GOV-011 发布说明 + +- 目标版本:v0.0.9 +- 状态:等待发布封存 + +## 调整 + +- Node.js 运行时约束明确为完整 22.x,不绑定 minor 或 patch。 +- MySQL 客户端、mysqldump、服务端和 API 健康检查统一接受完整 5.7.x,不设置最低 patch。 +- MySQL 健康详情显示服务端实际三段版本,不再硬编码 5.7.42。 +- 系统架构、代码开发规范、本地开发和 Ubuntu 源码部署手册统一使用系列版本口径。 + +## 保持不变 + +- `utf8mb4`、`utf8mb4_general_ci`、`+08:00`、固定开发库和主机白名单继续严格校验。 +- HTTP/OpenAPI 响应结构、Web API、Redis、RocketMQ、Scheduler、Worker、数据库 Schema 和源码部署拓扑不变。 +- 历史 QA、Schema 清单、CHANGELOG 历史版本和已发布功能档案继续记录当时真实 patch。 + +## 已知例外 + +v0.0.8 没有开发库 Schema 基线。用户确认开发库为空并授权 GOV-011 一次性跳过;仓库没有伪造基线或增加通用绕过开关。该例外导致 `verify:release`、`schema:verify` 和 `governance:finish` 在同一基线存在性检查失败,其他门禁已逐项执行并留证。 diff --git a/docs/features/GOV-011-runtime-version-series/review/code-review.md b/docs/features/GOV-011-runtime-version-series/review/code-review.md new file mode 100644 index 0000000..d6df656 --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/review/code-review.md @@ -0,0 +1,46 @@ +# GOV-011 代码 Review + +- reviewer_type:self +- reviewer:当前实现代理结构化自审 +- 基线:`v0.0.8` / `9e85809` +- 审查实现:`cce77aa` +- 日期:2026-08-17 + +## 审查范围 + +审查 Node 特征测试、Schema 元数据校验、MySQL 健康客户端、治理测试、现行架构/规范/部署文档、GitNexus 影响和一次性 Schema 例外。重点检查版本格式、错误边界、历史清单兼容、健康信息泄漏和门禁真实性。 + +## 发现 + +### 已关闭问题 + +| 严重程度 | 位置 | 问题 | 处置 | +|---|---|---|---| +| Important | `tools/database/schema-baseline.test.mjs` 历史清单篡改测试 | 完整回归仍断言旧的“服务端必须为 5.7.42”文案,导致生产实现转为系列口径后测试失败。 | 更新为 `5.7.x` 断言;排除已授权发布基线用例后 Schema 28/28。 | +| Minor | `implementation-plan.md` 全量门禁预期 | 原计划把 `verify:release` 写为 PASS,但该命令包含必然触发一次性 Schema 例外的测试。 | 修正文档为真实失败并要求手工执行其余等价门禁。 | + +### 未发现问题 + +未发现未关闭的 Critical、Important 或阻塞性 Minor。服务端正则只接受 `5.7.<数字>` 与 `-`/`+` 后缀;5.6、8.0、无 patch 和文字 patch 均拒绝。字符集、排序规则、库名、时区和生产数据库边界没有放宽。 + +## 测试缺口 + +没有针对每个 MySQL 5.7 patch 建立真实数据库兼容矩阵;这是用户明确接受的系列版本策略。本次使用纯函数、固定元数据和现有集成测试验证判断边界,不证明第三方数据库每个 patch 都没有厂商缺陷。首次真实迁移和查询仍必须在目标 5.7.x 环境验证。 + +## 安全与残余风险 + +- 版本字符串不执行、不进入 SQL;健康详情不回显原始后缀、地址、账号或密码。 +- Schema 入口仍固定 development、开发库和主机白名单;本次未连接生产数据库。 +- 残余风险一是不同 5.7 patch 的已知缺陷,二是 v0.0.8 缺少可验证 Schema 基线。前者由真实部署验证控制,后者由用户授权的一次性例外承担。 + +## 性能与资源影响 + +- 只增加常数时间正则捕获,没有新增查询、网络、重试、缓存、任务或依赖。 +- 健康查询次数和连接池上限不变;Web 构建体积与 v0.0.8 一致。 +- 不进入行情采集、分析、Redis、RocketMQ 或图表热路径,无需负载测试。 + +## GitNexus 与同步修改 + +开发前 `assertMysql57Metadata` 为 CRITICAL,5 个直接调用方、10 个受影响符号、5 组流程;`MysqlHealthClient` 为 LOW。开发后相对 v0.0.8 为 HIGH、23 文件、70 符号、11 流程,运行影响均属于计划中的 Schema 与 API 健康路径。HTTP/OpenAPI、Web API、消息、数据库 Schema、Redis、Scheduler、Worker 和部署拓扑没有计划外修改。 + +最终结论:passed diff --git a/docs/features/GOV-011-runtime-version-series/review/standards-review.md b/docs/features/GOV-011-runtime-version-series/review/standards-review.md new file mode 100644 index 0000000..dea998d --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/review/standards-review.md @@ -0,0 +1,33 @@ +# GOV-011 开发规范符合性 Review + +- reviewer_type:self +- reviewer:当前实现代理结构化自审 +- 审查提交:`cce77aa` +- 日期:2026-08-17 + +## 检查结果 + +- [x] PRD、需求、设计、实施计划、测试计划、开发总结、QA、GitNexus、Review、发布与回退资料齐全。 +- [x] 修改关键符号前执行 GitNexus 上游影响分析,提交前执行 detect-changes。 +- [x] HIGH/CRITICAL 风险已向用户说明,并以完整 Schema 与健康回归控制。 +- [x] 行为修改遵循 RED-GREEN,测试失败原因来自旧实现而非语法或夹具。 +- [x] 关键版本口径和安全边界使用准确中文注释,没有逐行复述。 +- [x] 未新增依赖、预测性抽象、空分层或过度文件拆分。 +- [x] 没有修改前端 Axios/API 分域、后端业务模块分层或 OpenAPI DTO。 +- [x] 所有阶段提交使用中文 Conventional Commit 和 GOV-011,并立即推送 Gitea。 +- [x] 没有使用 GitHub、强推、生产数据库或真实凭据。 +- [x] 历史 QA、Schema 清单和已发布档案保持原样。 + +## 不符合项与处置 + +完成门禁无法通过 v0.0.8 Schema 基线存在性校验。该项不是静默忽略:用户在开发前明确确认当前开发库为空并要求本次跳过,仓库保存 `schema-baseline-waiver.md`,实际失败命令和风险写入 QA。没有修改治理工具,也没有伪造 `not_applicable`、`captured_empty` 或空 SQL。除此之外未发现未处置的不符合项。 + +## 安全、性能与架构检查 + +安全边界保持固定开发环境、库名、主机白名单、字符集、排序规则和时区;健康输出已脱敏,依赖审计 0 漏洞。性能只增加常数时间字符串匹配,查询、连接池、构建体积和执行流数量没有增加。架构仍为 Vue 3 Web 与 NestJS API/Scheduler/Worker 独立项目、Ubuntu 源码部署和外部 MySQL/Redis/RocketMQ。 + +## GitNexus 与开发总结检查 + +before、impact-plan、detected-changes、after、comparison 互相对应;最终索引为 2015 节点、2692 关系、50 流程。开发总结包含七个固定章节,明确原始需求、范围变化、实际完成、缺陷、延期、提交和验证证据;HIGH 风险与一次性 Schema 例外均有具体边界,不以空占位通过门禁。 + +最终结论:passed diff --git a/docs/features/GOV-011-runtime-version-series/rollback.md b/docs/features/GOV-011-runtime-version-series/rollback.md new file mode 100644 index 0000000..72045e6 --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/rollback.md @@ -0,0 +1,24 @@ +# GOV-011 回退说明 + +GOV-011 不修改数据库结构、迁移或数据,不写 Redis,不操作 RocketMQ,也不修改生产配置。回退只涉及版本判断、健康详情、测试、注释和当前规范文档。 + +## 触发条件 + +- 合法 MySQL 5.7.x 被错误拒绝,或 5.6/8.x 被错误放行。 +- 历史 captured/captured_empty manifest 无法验证。 +- 健康接口泄漏原始版本后缀或返回错误 patch。 +- 系列判断导致 Schema 生成、治理启动或 API 启动出现无法修复的回归。 + +## 回退步骤 + +1. 使用新的中文 Conventional Commit 恢复 `assertMysql57Metadata` 和 `MysqlHealthClient` 到上一已验证行为;禁止重写 Gitea 历史、强推或移动已发布标签。 +2. 同步恢复对应测试、代码注释和当前架构/部署文档,避免实现与规范不一致。 +3. 不改写已经发布的 GOV-011 档案;通过后续回退记录说明原因、范围和提交。 +4. 因无数据库结构或数据变化,不执行数据库回滚。 + +## 回退验证 + +- 重新执行 runtime、Schema、MySQL 规范、环境、Server 健康、类型和构建测试。 +- 执行 OpenAPI 契约、Playwright 双视口和源码发布验证。 +- 运行 GitNexus impact、detect-changes 与 analyze,记录回退实际流程影响。 +- v0.0.8 Schema 一次性例外仍只作为历史事实存在,不因代码回退生成伪造基线。 diff --git a/docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-desktop-1440x900-cce77aa.png b/docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-desktop-1440x900-cce77aa.png new file mode 100644 index 0000000000000000000000000000000000000000..744a7bfb0e1220c1fa9917192d9e83358fff05ff GIT binary patch literal 12337 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 literal 0 HcmV?d00001 diff --git a/docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-mobile-390x844-cce77aa.png b/docs/features/GOV-011-runtime-version-series/screenshots/iterations/app-shell-mobile-390x844-cce77aa.png new file mode 100644 index 0000000000000000000000000000000000000000..43ead1d602fb3b450787aab101dfb0c74a7d6258 GIT binary patch literal 8944 zcmeHNX;f3my2ZAI+uBOo2q-c*pvWwZ3=)Q?0uez_G0Z~)GDBh*!VpNbX=Ns@h=5Eg z0zwD@kui{{5Kx&EBoUGjAToqNNC*%}Nb=I_zTwxq@7}fEzt_L&tg3Tro%7ZH>f3vt z%DmOUM-s0d7qW7m@8n3@Az2GcbwO@EE#bS4rC-@|=bYvbmu(;3 zvHeF)-5`0Y#Vq1W7|JA~zCEs>s!mbqOT9+O&ej~CzOG^v{>g05oxM8b2Fi2-+Y7fH zgHE76PZm8Xr~?`3{hpX;>CpXH*GZHzy8hX9uZ-ju4LR_@N|SxS1Fvr`f74^nGu}jh zINh>0`^yRB#b2Rj8V+?gV&9TcVu|JP#`f60{g-cvhuf<_SU*}fpV}SA$F#{gixD3; zDPY&hwYTXS`x8Y&N$Q~58&z5wLg3I76R*`q7S?)2mW3rJm$;!U1zYZw_R5Hgo&)D! z0!QS6uC;;7vODA0aqK}ofXayY6R zG%z`!=Q=r+xIK3wG_({p`u;&hfvNNMOnRYU6ZQ64w7lik8d^H* zTst62oScnm#kQYPiCg{*j3W55Dk)`gME_29*VuvaIuKy{b@O~u8yedhv9UBB)Hv12 zqQ(RHUXJ>T36&@!9k%pIOf^vMpWZ0+e|e)NV#X#CPb3lF{_Lm+9ReXmE;yn@C3az0 z|IO^L2ercAy}<(gd`*vpw-40ms^k3v4l)zxnKcz&q{4tzWaEIkP*g)pw%Hg&W4jR( zr<959H|9PP^>@o1=xiJq;XMF|VXj7Uit%AcFCuQN#>GFVEO≪Q`XRiEDqf_tzGX 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 literal 0 HcmV?d00001 diff --git a/docs/features/GOV-011-runtime-version-series/test-plan.md b/docs/features/GOV-011-runtime-version-series/test-plan.md new file mode 100644 index 0000000..aa6b577 --- /dev/null +++ b/docs/features/GOV-011-runtime-version-series/test-plan.md @@ -0,0 +1,58 @@ +# GOV-011 测试计划 + +- 功能编号:GOV-011 +- 验证环境:Node.js 22.11.0、pnpm 10.25.0、macOS 开发机 +- 数据库边界:不连接、探测或读取生产数据库;本次不执行真实 Schema 导出 + +## 1. Node.js 系列验证 + +- 接受 `22.0.0`、`22.11.0` 和带预发布/构建后缀的合法 22.x。 +- 拒绝 21.x、23.x、空字符串、`v22` 和其他无法解析格式。 +- pnpm 继续只接受 10.x,不因 Node 约束调整而放宽。 + +## 2. Schema 元数据验证 + +- 接受 MySQL 服务端 `5.7.0`、`5.7.41`、`5.7.42-log`。 +- 拒绝 `5.6.51`、`8.0.40`、`5.7`、`5.7.x` 和空字符串。 +- mysql 与 mysqldump 客户端继续要求合法 5.7.x。 +- 服务端版本通过后,字符集仍必须为 `utf8mb4`,排序规则仍必须为 `utf8mb4_general_ci`。 +- 回归 captured、captured_empty、not_applicable、历史 manifest、生成入口和发布门禁调用链。 +- 因用户授权的 v0.0.8 基线一次性例外,严格发布基线用例预期只在目录缺失处失败;使用 `--test-skip-pattern='严格发布门禁'` 验证其余 28 项全部通过。 + +## 3. API 健康检查验证 + +- `5.7.41-log` 返回 `MySQL 5.7.41 / <数据库> / +08:00`,证明 patch 来自服务端元数据而非硬编码。 +- 拒绝 5.6.x、8.x 和无效版本格式。 +- 拒绝错误库名、`utf8`、`utf8mb4_0900_ai_ci` 和 `SYSTEM` 时区。 +- 保持固定只读元数据查询、健康 DTO 结构和生产库名按当前配置校验。 +- 执行 Server 全量测试、类型检查和 API/Scheduler/Worker 三进程构建。 + +## 4. 规范与部署验证 + +- 当前系统架构、代码开发规范、本地开发和 Ubuntu 源码部署文档必须写明 `MySQL 5.7.x`。 +- 上述四份当前文档不得再出现 `MySQL 5.7.42`;历史 QA、Schema 清单、CHANGELOG 历史版本和已发布功能档案不参与该否定扫描。 +- Node.js 22.x、pnpm 10.25.0、Ubuntu 源码部署、systemd、Nginx、Redis 和 RocketMQ 约束保持不变。 + +## 安全验证 + +- 版本字符串仅进入固定正则,不执行命令、不拼接 SQL。 +- MySQL 健康错误不回显服务端原始附加文本、连接地址、账号或密码。 +- Schema 测试使用固定夹具和依赖注入,不连接真实数据库;本功能不执行 `schema:baseline`。 +- `pnpm audit --prod --registry=https://registry.npmjs.org/` 必须为 0 已知漏洞。 +- 扫描 Web/Server 构建产物中的凭据模式;配置键名允许存在,真实值、连接串和授权头不得存在。 +- `git diff --check`、GitNexus detect-changes 和 Review 核对没有生产数据、真实 `.env` 或凭据进入提交。 + +## 性能验证 + +- 版本解析为启动/治理阶段常数时间正则匹配,不增加数据库查询、网络调用、重试、缓存或消息操作。 +- 健康检查继续只执行一次既有元数据查询,连接池上限仍为 2。 +- Web 页面和依赖未变化,生产 JS/CSS 体积应与 v0.0.8 基线一致。 +- 本功能不改变行情计算、数据库扫描、Redis 热点、RocketMQ 吞吐、Worker 并发或图表渲染,因此不执行负载测试;后续触及这些路径的业务功能必须重新设定性能目标。 + +## 7. 全量与视觉验证 + +- 执行 runtime、governance、MySQL、环境、Schema、契约、边界、部署、Web 和 Server 测试。 +- 执行 OpenAPI 重新生成、lint、格式、类型检查、Web/Server 构建和源码发布验证。 +- Playwright 在 Chromium 1440×900 与 390×844 下验证页面、同源健康 API、横向溢出和控制台。 +- 保存桌面/移动截图并人工检查无重叠、裁切或空白渲染回归。 +- 真实执行 `pnpm verify:release`、`pnpm schema:verify` 和 `pnpm governance:finish GOV-011 runtime-version-series`;三者因同一个已授权 v0.0.8 基线缺失条件失败,必须保存失败证据并手工执行其余等价门禁。