diff --git a/doc/Scert开发任务清单.md b/doc/Scert开发任务清单.md index a8afd6a..5546e33 100644 --- a/doc/Scert开发任务清单.md +++ b/doc/Scert开发任务清单.md @@ -1,5 +1,7 @@ # Scert 开发任务清单 +> 最新执行状态:`7284958` 已交付域名/服务器归属、绑定约束与三库模式 11;`92c844f` 新增模式 12 修复 SQLite 替换目标行绕过引用保护,完整后端、三次竞态、MySQL 双版本及 Windows 独立程序回归均已通过。下方“归属仍未实现”只描述项目根实体历史批次。任务、审计等剩余资源与项目成员权限仍待接入,P0-06/P0-07 继续 `[~]`;全部 44 项范围不变。精确状态见《Scert整改任务执行清单》,证据及条件跳过见支持矩阵第十九节。 + > 2026 年 9 月 28 日当前进度:P0-06 项目根实体子项 `[x]`,已新增三库第 10 号迁移、默认项目、项目模型和仓储;SQLite、MySQL 5.7/8.0、竞态与后端全量测试,以及独立 Windows 程序项目备份恢复通过。资源归属字段、回填、引用保护及项目授权仍未实现,P0-06/P0-07 总项保持 `[~]`。新证据及命令见支持矩阵第十八节;旧模式 1~9 的历史证据不自动升级为模式 10 的全部数据库验收。 > 2026-09-27 任务规格:完整 44 项及六阶段验收规范见《整改任务规格与验收约定》和《Scert整改任务执行清单》。以下历史勾选不替代当前整改状态,不把旧测试结果当成新增需求已经实现。 diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index f832ed5..d48b4cd 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -1,5 +1,27 @@ # Scert 整改任务执行清单 +## 2026 年 9 月 28 日:资源归属与替换约束复核 + +### 已提交的第 11 号迁移(源码 `7284958`) + +- [x] 域名、服务器保存 `project_id`、`owner_id`、`created_by`、`updated_by`;历史资源回填默认项目,未知所有者和操作者保留空值,不编造历史身份。 +- [x] HTTP 从服务端会话填写归属,拒绝客户端伪造归属字段;普通更新保留项目、所有者和创建者,仅更新操作者。原 CLI 更新保持原归属,不重新开放已停用业务入口。 +- [x] 绑定替换在同一事务校验域名、服务器及项目一致性;失败保留旧绑定。MySQL/PostgreSQL 新增外键;SQLite 不重建业务表,以触发器保护引用且保留原有对象。 +- [x] 重新读取上一批最终日志:后端 1432 个叶子通过、含父项 1562 条,0 失败、47 项条件跳过;竞态三次共 114 个叶子通过、6 项条件跳过。不能把无测试文件包的 skip 事件算作测试跳过。 +- [x] 上一批 MySQL 5.7.44/8.0.45 专项各 37 个叶子通过、0 失败、0 跳过;每条命令包含 SQLite 用例,不能称为 37 个纯 MySQL 用例。Windows 独立程序含普通项目的资源和绑定备份恢复通过;当时程序是未提交源码构建,不称干净发行包。 + +### 本轮新增修复(修改前检查点 `cad238a`) + +- [x] 正式回归复现 20 个失败叶子:递归触发器关闭时,主键或隐藏行号冲突可通过 `UPDATE OR REPLACE` / `INSERT OR REPLACE` 删除被引用行;外键开关不能消除此缺口。保留 `artifacts/resource-replacement-20260928/before.jsonl`。 +- [x] 新增第 12 号迁移;SQLite 增加目标行替换保护和插入后引用检查,防止隐式删除绕过。MySQL/PostgreSQL 沿用外键,仅统一模式登记;不改写第 11 号历史迁移。 +- [x] 专项覆盖四种连接开关组合、十类替换、正常编辑、无引用替换及负行号后自动插入;版本登记故障、触发器重名及既有无效引用必须完整回滚并可修复重试。 +- [x] 修复源码已提交为 `92c844f`;完整后端 1480 个叶子通过、47 项条件跳过,三次竞态共 255 个叶子通过、6 项条件跳过,MySQL 双版本专项各 83 个叶子通过且无跳过。独立 Windows 产品程序两条路径均通过;构建来自当批未提交工作区,不称干净发行包。最终证据见支持矩阵第十九节。 +- [x] 同步合并清单、基础规格、开发清单、关系模型、测试记录、支持矩阵和运维说明;保留历史批次,不用新结果覆盖旧失败记录。 +- [ ] 任务、尝试与审计的项目关系继续实施;管理证书任务目前使用 `management-certificate` 特殊资源 ID,必须明确系统范围,不能伪造业务域名满足外键。历史已删除资源的任务和审计需要保留且区分未知归属,不自动删除。 +- [ ] PostgreSQL 当前实库、完整资源成员授权、Web/API 越权、Linux 原生、完整发行包、服务重启和生产门禁。 + +本轮优先封堵已复现的数据完整性缺口,再接下一批任务/审计关联。P0-06、P0-07、P0-05 总项均不提升;原始 44 项及验收要求不变。 + ## 2026 年 9 月 28 日:项目根实体最终验证结果 本节更新下方启动阶段记录;详细命令与限制见《构建版本与数据库支持矩阵》第十八节。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 863afce..f055835 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -1,5 +1,7 @@ # Scert 整改、合并与优化清单 +> 当前进度(2026 年 9 月 28 日):源码 `7284958` 已完成域名、服务器的四项归属字段、三库第 11 号迁移及同项目部署绑定约束;不是只有项目根实体。下方项目根实体段落属于上一批历史记录。复核进一步复现 SQLite 替换冲突可绕过引用保护,已由 `92c844f` 新增第 12 号迁移修复并通过本批回归,不能只修改旧迁移使已升级库漏修。最新状态见执行清单与支持矩阵第十九节。任务、审计等剩余资源关联、成员权限及生产验收未完成,P0-06/P0-07 均保持 `[~]`,全部 44 项范围不变。 + > 本批最终验证补充:项目根实体已通过 SQLite 专项、MySQL 5.7/8.0 实库、3 次竞态检测及完整后端回归;默认和普通项目也已进入独立 Windows 程序的备份恢复验证。下方“待汇总”为启动阶段快照,最新证据以执行清单的“项目根实体最终验证结果”及支持矩阵第十八节为准。项目资源归属、关联约束和权限隔离仍未实现,P0-06/P0-07 保持 `[~]`。 > 2026 年 9 月 28 日补充进度:P0-06 已进入项目根实体实施,新增项目模型、三库第 10 号迁移及仓储,本地专项通过;完整后端与 MySQL 隔离测试待汇总。当前资源尚未增加项目归属,不代表 P0-07 权限隔离完成。详细需求、后续关联和删除约束见《项目资源关联模型.md》,实际验证见《Scert整改任务执行清单.md》。全部 44 项原始要求及各项验收标准不变。 diff --git a/doc/全面审查测试与优化记录.md b/doc/全面审查测试与优化记录.md index 5b916e7..be56bdf 100644 --- a/doc/全面审查测试与优化记录.md +++ b/doc/全面审查测试与优化记录.md @@ -1,5 +1,7 @@ # 全面审查、测试与优化记录 +> 最新复核:资源归属实现已提交为 `7284958`,上一批最终日志重新统计为后端 1432 个叶子通过、47 项条件跳过。本轮正式用例复现 SQLite 在关闭递归触发器时的 20 个替换绕过失败,新增第 12 号迁移修复,包含主键/隐藏行号及项目替换。失败证据保留于 `artifacts/resource-replacement-20260928/before.jsonl`,回归、干净构建和数据库专项最终以支持矩阵第十九节为准。下方根实体批次为历史记录;不宣称项目授权或生产验收完成。 + > 2026 年 9 月 28 日最新批次:新增项目根实体、三库第 10 号迁移及仓储。最终后端 1409 个叶子通过、含父项 1535 条、0 失败、46 项条件跳过;54 个项目/迁移叶子用例连续 3 次竞态检测通过;MySQL 5.7.44/8.0.45 各 8 个叶子用例实库通过。独立 Windows 产品程序完成旧库升级及含普通项目的数据备份恢复。MySQL 8.0 首轮故障注入受触发器权限限制,已改用隔离管理连接注入并重测通过,没有降低安全配置或提高产品账号权限。证据见支持矩阵第十八节;项目资源字段和权限隔离仍未实现,生产未放行。 > 2026-09-27 证据索引:当前 44 项整改的逐项范围、命令、实机步骤和复审字段见《整改任务规格与验收约定》及四份分级规格;实际进展以《Scert整改任务执行清单》为准。本文历史结果须按当时源码与环境解释。 diff --git a/doc/基础整改任务规格.md b/doc/基础整改任务规格.md index 8a793e3..1d7e599 100644 --- a/doc/基础整改任务规格.md +++ b/doc/基础整改任务规格.md @@ -1,5 +1,7 @@ # 基础整改任务规格 +> 当前进度:域名/服务器归属、三库第 11 号迁移及绑定约束已随 `7284958` 提交;第 12 号迁移已随 `92c844f` 修复 SQLite 替换绕过并通过本批回归,详细状态见执行清单和支持矩阵第十九节。下方根实体批次与 46 项条件跳过为历史数据;资源批次全量是 47 项条件跳过,不能混用。任务、审计、其他资源及成员授权仍未完成,P0-05/P0-06/P0-07 总项均保持 `[~]`。 + > 2026 年 9 月 28 日最终验证:项目根实体的 SQLite、MySQL 5.7/8.0 实库及后端回归已通过,替代下方启动阶段“持续验证”的状态;仅该子项为 `[x]`。完整资源关联与 P0-07 权限隔离仍为 `[~]`。详细证据、46 项条件跳过及 PostgreSQL/生产缺口见支持矩阵第十八节。 ## 2026 年 9 月 28 日实施补充 @@ -149,7 +151,7 @@ P0-06 与 P0-07 均维持 `[~]`,六阶段中的隔离、生产和最终验收 - 整改内容:覆盖 users、roles、projects、domains、certificates、certificate_versions、certificate_orders、dns_accounts、dns_delegations、servers、deployment_targets、deployment_records、tasks、task_attempts、renewal_policies、notification_channels、notification_records、audit_logs、backup_records;定义外键、归属、引用删除策略、任务和审计关联。 - 验证命令:V06、V07;补关联完整性、迁移回填和删除约束测试。 - 实机验收步骤:迁移含历史资源的专用库,核对项目归属不丢失;从一次申请追踪订单、版本、任务、部署、通知和审计;删除仍被引用的资源必须拒绝。 -- 验收证据:现有模型只能证明部分实体存在;完整关系图、迁移回填与三库关联验证待补。 +- 验收证据:项目根实体、域名/服务器四字段、默认项目历史回填及事务绑定已有代码与 SQLite/MySQL 隔离证据;关系模型见《项目资源关联模型.md》。第 12 号迁移补强替换保护,完整任务/审计等关联、PostgreSQL 实库及生产闭环仍待补,当前结果见支持矩阵第十九节。 - 复审结果:未完成,禁止用相似名称替代缺失关联。 ## P0-07 增加项目级权限和资源隔离 @@ -163,7 +165,7 @@ P0-06 与 P0-07 均维持 `[~]`,六阶段中的隔离、生产和最终验收 - 整改内容:资源增加项目、所有者、创建人及更新人;制定系统管理员、项目管理员、证书/DNS/部署管理员、审计与只读角色矩阵;列表、详情、写操作、导出与后台任务均检查项目归属,普通用户不能读完整私钥。 - 验证命令:V07、V06、V03;补跨项目 ID 枚举、伪造归属、任务访问与私钥导出拒绝测试。 - 实机验收步骤:建立两项目和最小权限成员;分别测试证书、服务器、目标、DNS、任务、审计的跨项目读写、删除与回滚;撤权后现有会话及排队任务必须重新判权。 -- 验收证据:已有分组/角色测试不能证明项目隔离;项目矩阵和真实越权用例待补。 +- 验收证据:域名/服务器归属持久化和 HTTP 拒绝伪造归属已覆盖;已有分组/角色测试及资源外键仍不能证明项目成员隔离。项目角色矩阵、所有资源的跨项目读写和真实撤权用例待补。 - 复审结果:未完成。 ## P0-08 完善凭据和主密钥生命周期 diff --git a/doc/构建版本与数据库支持矩阵.md b/doc/构建版本与数据库支持矩阵.md index bce19ec..474876c 100644 --- a/doc/构建版本与数据库支持矩阵.md +++ b/doc/构建版本与数据库支持矩阵.md @@ -735,3 +735,59 @@ go test -json -count=1 -timeout=3m -run '^TestSQLiteBusinessUpgradeStandaloneCLI - [ ] 资源 `project_id` 及归属字段、历史回填、外键/引用删除保护、跨项目部署约束、成员授权、Web/API 与越权测试。 P0-06、P0-07 保持 `[~]`,P0-05 的完整支持矩阵也不提升;原始全部 44 项继续执行。本节不提供生产放行结论。 + +## 十九、资源归属与 SQLite 替换保护(2026 年 9 月 28 日) + +### 19.1 源码与修复范围 + +模式 11 源码为 `7284958`,本批修改前检查点为 `cad238a`;模式 12 修复源码为 `92c844f`。此前第十八节描述项目根实体历史批次,不能代表当前模式 12 的完整验收。 + +模式 11 已接入域名/服务器的项目、所有者、创建者和更新者字段,回填默认项目,并约束同项目部署绑定。后续正式用例发现,SQLite 关闭递归触发器时,主键及隐藏行号冲突的替换操作可能隐式删除被引用行;外键开关不能独立弥补原触发器约束缺口。 + +新增模式 12,不修改已登记的历史迁移。SQLite 在迁移事务中校验既有引用并安装七个保护触发器;遇到无效引用、触发器冲突或版本登记失败时整体回滚,不删除业务数据。MySQL/PostgreSQL 沿用模式 11 外键,本版仅统一版本登记,不据此声称已验证两库全部替换语义。 + +### 19.2 最终证据 + +本批证据目录为 `artifacts/resource-replacement-20260928/`,原始日志留在本地忽略目录,不纳入源码提交。下列统计已读取最终日志,并确认原运行会话退出码为 0;通过数按叶子用例计数,条件跳过不包括无测试文件包。 + +| 验证 | 日志或命令 | 最终结果 | +| --- | --- | --- | +| 修复前复现 | `before.jsonl` | 40 个组合叶子中 20 个失败、20 个通过;22 条失败事件包含父测试和包,不是 22 个失败用例 | +| 完整后端 | `backend-final.jsonl` | 1480 个叶子通过、含父项 1612 条,0 失败、47 项条件跳过 | +| 三次竞态 | `race-final.jsonl` | 三轮共 255 个叶子通过、含父项 276 条,0 失败、6 项条件跳过 | +| MySQL 5.7 | `mysql57-final.jsonl` | 83 个叶子通过、含父项 90 条,0 失败、0 跳过 | +| MySQL 8.0 | `mysql80-final.jsonl` | 83 个叶子通过、含父项 90 条,0 失败、0 跳过 | +| 独立 Windows 产品程序 | 完整后端日志中的 `TestSQLiteBusinessUpgradeStandaloneCLI` | 两条备份恢复路径通过,并实际拒绝恢复后的项目替换和域名行号替换 | +| 静态与模块 | `go vet ./...`、`go mod verify` | 同一顺序执行会话退出 0,模块校验显示全部通过 | + +MySQL 每条专项命令同时包含 SQLite 用例,不能称为 83 个纯 MySQL 用例。使用既有 Go 隔离夹具、临时实例、回环监听与严格 TLS,没有清空业务数据库。完整后端日志中的外部环境条件跳过不等于相应环境验收通过。 + +上一批模式 11 的独立证据位于 `artifacts/resource-project-20260928/`:后端 1432 个叶子通过、含父项 1562 条、47 项条件跳过;三次竞态共 114 个叶子通过、6 项条件跳过;MySQL 两版专项各 37 个叶子通过且无跳过,也包含 SQLite 用例。不得与模式 12 的数字混用。 + +### 19.3 实际验证命令 + +以下命令在 `backend/` 执行。产品程序在代码提交前构建,仅作本批独立程序验证,不称干净发行包。 + +```powershell +go build -o ..\build\review-scert-replacement-windows-amd64.exe ./cmd/scert +$env:SCERT_SQLITE_TEST_CLI = 'D:\Desktop\Scert\build\review-scert-replacement-windows-amd64.exe' +go test -json -count=1 -timeout=10m ./... +go test -race -json -count=3 -timeout=5m -run 'ResourceProject|ResourceScope|MigrationCatalog|SQLiteBusinessUpgradeFromEveryVersion' ./internal/database ./internal/repository ./internal/httpapi +go vet ./... +go mod verify +``` + +MySQL 专项分别设置 `SCERT_MYSQL_TEST_BIN` 为 `E:\DB\5.7\bin`、`E:\DB\8.0\bin`,隔离目录通过 `SCERT_MYSQL_TEST_ROOT` 指向本批证据目录下的 `mysql-isolated`,不连接业务实例。 + +```powershell +go test -json -count=1 -timeout=8m -run 'ResourceProject|SQLProjectRepositoryMySQLReal|MySQLRealProjectMigrationRetry' ./internal/repository ./internal/database +``` + +### 19.4 状态与未覆盖边界 + +- [x] 模式 12 引用保护、正常写入、四种连接开关组合、故障回滚与重试正式回归通过,等待复审。 +- [x] 文档与最终日志核对完成,保留修复前失败证据。 +- [ ] 干净源码发行包、Linux 原生运行、PostgreSQL 当前实库、完整三库备份恢复、服务重启及生产门禁。 +- [ ] 任务/审计等剩余资源项目关联、项目成员授权、跨项目 Web/API 越权验证和大规模性能准入。 + +本次整理只提交已有有效修复及必要文档,不部署生产,不提升 P0-05/P0-06/P0-07 总项状态,也不将 44 项整改目标标记为完成。 diff --git a/doc/生产部署与运维说明.md b/doc/生产部署与运维说明.md index 2708fcc..0723616 100644 --- a/doc/生产部署与运维说明.md +++ b/doc/生产部署与运维说明.md @@ -1,5 +1,9 @@ # Scert 生产部署与运维说明 +> 当前模式提示(2026 年 9 月 28 日):模式 11 已增加域名/服务器归属与同项目绑定;新增模式 12 用于修复 SQLite 替换冲突对引用保护的绕过。下方模式 10 提示是上一批历史记录。必须用支持模式 12 的程序升级已有模式 11 数据库;只改旧迁移文件不能修复已登记的库,也不能用只支持模式 10/11 的旧程序直接打开升级后的数据库。禁止删除迁移记录强行降级,回退必须使用兼容程序和已验证备份。 + +> 升级发现悬空绑定或资源引用缺失项目时应拒绝继续,保留原库及模式,先核查真实业务再修复;不能自动删除旧任务、资源或绑定来通过迁移。SQLite 触发器冲突、版本登记失败也必须整体回滚后重试。当前证据见支持矩阵第十九节;本次未执行生产部署,成员授权、完整发行包、实机服务与全部平台门禁仍待验收。 + > 2026 年 9 月 28 日模式版本提示:新增第 10 号项目根实体迁移,只建立项目表和默认项目,不代表旧资源已经完成项目归属或权限隔离。SQLite、MySQL 5.7/8.0 的局部验证及独立 Windows 程序备份恢复证据见支持矩阵第十八节;PostgreSQL 项目实库、完整发行包、服务重启和生产门禁仍未完成。不要直接用只支持模式 9 的旧程序打开已升级数据库,也不要删除迁移记录强行降级;升级回退仍需兼容版本及经过验证的备份恢复流程。该说明不是生产放行许可。 > 2026-09-27 验收入口:部署当前候选前,先按《整改任务规格与验收约定》及《Scert整改任务执行清单》核对版本、环境、授权与 12 层生产门禁。下文历史拓扑不是当前服务器状态,不因旧批次通过而跳过本次实机检查。源码、候选包与证据边界见《仓库目录与产物边界说明》。 diff --git a/doc/项目资源关联模型.md b/doc/项目资源关联模型.md index b1aaff8..d936cef 100644 --- a/doc/项目资源关联模型.md +++ b/doc/项目资源关联模型.md @@ -1,5 +1,7 @@ # 项目资源关联模型 +> 当前实现更新:第 11 号迁移及资源归属源码已提交为 `7284958`;第 12 号迁移正在修复复核发现的 SQLite 替换冲突绕过。下方第五节与第 10 号迁移说明是项目根实体批次的历史记录,不代表当前资源仍无归属。当前关系见第二、六、七节;最终证据见执行清单及支持矩阵第十九节。 + > 本批最终验证:SQLite、MySQL 5.7/8.0 项目专项、3 次竞态检测、完整后端及独立 Windows CLI 备份恢复已通过;第五节保留测试启动时状态,最终以执行清单和支持矩阵第十八节为准。P0-06/P0-07 仍为 `[~]`。 > 对应 P0-06、P0-07、P0-10;2026 年 9 月 28 日建立。本文区分已实现模型与后续目标,不以建表代替权限验收。 @@ -20,8 +22,8 @@ |---|---|---| | `projects` | 已新增模型、三库第 10 号迁移和 SQL 仓储 | 作为项目根实体,统一资源引用;尚无对外接口 | | `users`、`roles` | 既有用户和角色实现;项目成员与角色分配待补 | 用户经项目成员关系获得权限,不能按用户组名称推导项目权限 | -| `domains`、`servers` | 既有业务表;尚未增加项目字段 | 增加项目、所有者、创建人和更新人;历史数据回填默认项目 | -| `domain_servers` | 既有绑定表;尚未校验项目一致性 | 同一部署绑定的域名与服务器必须属于同一项目,失败须保持原绑定 | +| `domains`、`servers` | 第 11 号迁移已增加项目、所有者、创建人和更新人 | 历史数据回填默认项目,未知身份留空;第 12 号迁移补强 SQLite 替换保护;成员授权仍待完成 | +| `domain_servers` | 已保存项目并校验双方一致性 | 事务失败保持原绑定;三库引用约束已实现,PostgreSQL 当前实库待验 | | `tasks`、`task_attempts` | 既有任务与尝试表;尚未增加项目隔离 | 项目及资源归属、执行人、幂等与任务尝试关联;执行前重新判权 | | `certificates`、`certificate_versions`、`certificate_orders` | 证书业务已有实现;统一实体关系待补 | 项目、域名、订单、版本、任务和签发结果可追溯 | | `dns_accounts`、`dns_delegations` | DNS 配置业务已有实现;统一实体关系待补 | 项目、所有者、凭据引用、委派及验证任务关联 | @@ -31,7 +33,7 @@ | `audit_logs` | 既有审计表;尚未增加项目隔离 | 项目、操作者、资源、任务与危险操作结果可追踪;全局操作单独定义范围 | | `backup_records` | 数据库备份恢复已有实现;统一实体关系待补 | 区分系统备份与项目备份,记录范围、校验及恢复任务,不泄露私钥 | -## 三、当前第 10 号迁移 +## 三、第 10 号迁移历史记录 仅新增 `projects` 表和默认项目种子,不改写既有业务字段,不将不存在的资源归属伪装成已完成。 @@ -39,16 +41,16 @@ SQLite、PostgreSQL 迁移与版本记录使用同一事务。MySQL 不承诺 DDL 事务回滚:建表和种子写入之后登记版本失败时,保留已执行部分,重试补全版本且不覆盖现有项目资料。 -项目仓储提供创建、读取、列表、资料更新和删除。默认项目不能经仓储删除或重复创建;列表默认项目优先。创建/更新时间由仓储生成,更新不覆盖创建时间。当前没有业务资源引用项目,因此普通项目的引用删除保护须随资源迁移一起实现,不能提前标记完成。 +项目仓储提供创建、读取、列表、资料更新和删除。默认项目不能经仓储删除或重复创建;列表默认项目优先。创建/更新时间由仓储生成,更新不覆盖创建时间。第 10 号迁移交付时还没有业务资源引用项目;随后第 11 号迁移已接入域名和服务器引用保护,但不能推及尚未接入的其他资源。 ## 四、下一批关联迁移的验收条件 -- [ ] MySQL 项目外键的引用字段采用与项目主键一致的字符集和排序规则,不因既有表默认配置不同而导致部分迁移失败。 +- [x] 域名、服务器和绑定的 MySQL 项目引用采用与项目主键一致的字符集和排序规则,已验证旧表 Latin-1 场景;其他资源需继续遵守。 -- [ ] 域名、服务器、任务、审计等核心资源增加项目及归属字段,旧数据可确定地回填。 -- [ ] 三库外键或等效强约束保持一致;项目不存在、跨项目关联、删除仍被引用项目必须拒绝。 -- [ ] 域名服务器绑定的替换在同一事务中校验归属,失败不清空原绑定。 -- [ ] 全部相关 SQL 查询、写入、扫描和后台任务同步处理项目,不能仅增加 JSON 字段。 +- [~] 域名、服务器已增加项目及归属字段并回填;任务、审计等核心资源仍待完成。 +- [~] 域名/服务器三库约束已实现,SQLite 替换绕过已由模式 12 修复并通过本批回归;所有剩余资源及 PostgreSQL 实库仍需验证。 +- [x] 域名服务器绑定的替换在同一事务中校验归属,失败不清空原绑定。 +- [~] 域名/服务器 SQL 查询、写入、扫描和接口已接入归属;后台任务及其他资源继续接入,不能仅增加 JSON 字段。 - [ ] 原始证书、凭据、通知和备份状态全部能关联,禁止留下隐式共享全局资源。 - [ ] 两项目实测列表、详情、写入、导出、删除、回滚和撤权后的排队任务,覆盖 P0-07。 - [ ] 三库历史数据迁移、失败重试、备份恢复及独立发行程序验证完成后,再推进实机验收。 @@ -57,6 +59,24 @@ SQLite、PostgreSQL 迁移与版本记录使用同一事务。MySQL 不承诺 DD - [x] 项目模型、三库迁移及仓储实现,等待复审。 - [x] SQLite 独立临时文件库读写、关闭重开、迁移回滚重试和历史业务保留测试通过。 -- [~] MySQL 5.7/8.0 独立实库测试及完整后端回归正在执行,结果见执行清单后续记录。 -- [ ] PostgreSQL 原生实库项目验证、资源归属回填、成员授权、Web/API 和生产验收。 +- [x] MySQL 5.7/8.0 独立实库专项及完整后端回归已通过,条件跳过与精确计数见支持矩阵第十九节。 +- [ ] PostgreSQL 原生实库项目验证、剩余资源归属回填、成员授权、Web/API 和生产验收。 - [~] P0-06、P0-07 总状态均为进行中;第 10 号迁移不是完整统一领域模型交付。 + +## 六、第 11、12 号迁移的当前边界 + +第 11 号迁移为域名和服务器新增 `ResourceScope` 四字段,绑定表增加项目。HTTP 创建只取服务端会话身份,更新保留原始创建归属;普通更新不能迁移项目。历史所有者和操作者未知时为空,本地系统操作也不冒充用户。 + +SQLite 第 11 号迁移安装触发器,第 12 号迁移进一步保护替换冲突的目标行及隐藏行号,插入后检查剩余引用;不依赖 `foreign_keys` 或 `recursive_triggers` 开关。插入检查会读取绑定或资源索引,尚未做大规模性能准入,不据此提升性能整改项。无效历史引用拒绝迁移,不能擅自删除业务数据;触发器建立与版本登记失败必须回滚。 + +MySQL/PostgreSQL 第 11 号迁移建立项目外键与绑定复合外键,第 12 号只登记统一版本,不声称新增或验证两库特有的替换语义。项目字段和约束不是成员授权,现有跨项目列表、私钥、DNS 等权限门禁仍需单独交付。 + +## 七、下一批任务与审计关联约束 + +- [x] 确认三条实际任务入口:HTTP 申请任务、证书工作流任务和管理证书续期任务;审计另有登录、用户和本地重置等系统入口。 +- [ ] 区分业务项目任务、系统管理证书任务和历史未知归属;不能把 `management-certificate` 当作真实业务域名,也不能伪造历史操作者。 +- [ ] 确定已删除资源的任务与审计保留策略;迁移不清空历史记录,新增任务必须核对项目与资源,审计记录系统或项目范围及任务关联。 +- [ ] 任务尝试从所属任务继承范围;执行、取消、重试和撤权后的排队任务重新判权,不能以建字段代替授权。 +- [ ] 三库迁移、回滚/重试、仓储读写、接口及真实备份恢复完整覆盖后,才标记相应子项完成。 + +第 12 号已用于替换保护修复,后续新增结构从第 13 号迁移开始。上述待办没有因本批约束修复而取消。