Files
orbit/docs/reports/phase-7-regression-status.md

66 lines
18 KiB
Markdown
Raw Permalink 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.
# P7 当前回归状态
验证日期:2026-09-20。本记录只汇总当前环境实际执行的回归,不把跳过或预条件失败写成通过。
## 已执行
| 检查 | 环境/命令 | 结果 |
| --- | --- | --- |
| 本地发布门禁统一入口 | 2026-09-20;`make release-local-check` | PASS;服务端、SDK、独立示例竞态测试、vet、build、当前协议门禁、146个 Markdown 本地链接和 SDK 独立依赖检查均通过;命令明确不替代真实 MySQL 集成与目标生产验收 |
| 发布物静态身份清单 | 2026-09-20;`make release-manifest`;无 `ORBIT_MYSQL_DSN` | PASS;输出构建/协议身份及28条迁移名称与SHA-256校验和,未读取数据库、凭据或业务数据;目标库仍需单独执行 `orbit-admin verify` |
| 发布物与管理二进制绑定校验 | 2026-09-20;`go test -race ./cmd/orbit-admin`;匹配/修改 revision/未知命令场景 | PASS;`verify --manifest` 在数据库连接前拒绝身份、协议或迁移校验和不一致的清单,匹配清单通过;不修改数据库 |
| 提交前事务死锁恢复 | `go test -race -run TestRetryableTransactionErrorOnlyMatchesPreCommitLockFailures ./internal/storage/mysql`;真实 MySQL `TestIntegrationWithTxRetriesPreCommitDeadlock` | PASS;两事务真实锁环触发 1213,失败事务仅在提交前按有界退避重试一次,最终两笔事务各提交一次,且真实集成断言重试计数增长;Begin/Commit 错误不重放,目标拓扑锁等待和死锁率仍需生产观测 |
| 提交前事务重试观测 | `internal/observability.TestRuntimeObservationDoesNotExposeErrors`;固定指标目录;`make release-local-check` | PASS;`orbit_db_transaction_retries_total` 与 `orbit_db_transaction_retry_exhausted_total` 以无标签固定计数器导出,重试只在退避成功后计数,提交回执不明不计入;目标拓扑告警阈值和跨节点聚合仍待生产验收 |
| 就绪探针排空门控 | `go test -race ./internal/transport/httpserver ./cmd/orbit`;`TestReadinessEntersDrainBeforeShutdown` | PASS;SIGTERM 关闭路径先将 `/health/ready` 置为 503,再进入限定优雅关闭窗口;响应不泄露内部错误 |
| 健康探针响应契约 | 2026-09-20;`go test ./internal/transport/httpserver && go test -race ./internal/transport/httpserver && make docs-check` | PASS;`/health/live` 与 `/health/ready` 返回 `Cache-Control: no-store`、`X-Content-Type-Options: nosniff`;未就绪和排空状态返回 `Retry-After: 1`,并由 HTTP 契约测试覆盖 |
| 数据模型中文注释门禁 | 2026-09-20;`go test ./internal/storage/mysql -run 'Test(FreshInstallBaselineHasChineseModelComments|FreshInstallBaselineContainsNoReferenceDDL|MigrationsAfterForeignKeyRemovalDoNotReintroduceReferences|PostRemovalMigrationGuard)$'` | PASS;当前无外键基线逐表、逐持久化字段检查中文 `COMMENT`,并继续阻止后续迁移重新引入引用约束 |
| 服务端单元与竞态、vet、构建 | Docker `golang:1.27.1`,仓库声明版本;`GOWORK=off go test -race ./... && go vet ./... && go build ./...` | PASS |
| 后台运行参数边界 | `internal/config.TestRuntimeDefaultsAndBoundedOverrides`;默认值与五个 `ORBIT_*` 覆盖项 | PASS;循环间隔限定100ms–1m,批量限定1–100,排空超时限定1s–5m,服务启动日志记录生效值 |
| 生效运行参数指标 | `internal/observability.TestRuntimeObservationDoesNotExposeErrors`;固定指标目录 | PASS;workflow/schedule/execution_recovery 间隔、批量上限和排空超时以固定基数指标导出;排空状态同步为固定 gauge,不进入业务或租户标签 |
| WebSocket Hub 背压参数 | 2026-09-20;`go test -race ./internal/config ./internal/observability ./internal/transport/httpserver ./cmd/orbit` | PASS;Worker/Event 连接上限、每个 Hub 的领取协程和有界内存排队可由环境配置,范围校验、应用和固定运行指标均有测试;持久化授权、租约和配额规则不由内存参数替代 |
| SDK 与独立示例竞态、vet、构建 | Docker `golang:1.27.1`;SDK 全 module、全部示例、`orbit-load`、`orbit-exec-load`、`orbit-schedule-load`、`orbit-workflow-load`,以及 result-inbox/task-outbox | PASS;健康/版本 SDK 契约包含 `Client.Version(ctx)`,返回协议身份且不暴露敏感响应 |
| 容器发布物构建 | `make image`;宿主平台 linux/arm64;显式 `docker build --platform linux/amd64`;带 `VERSION`、`REVISION`、`BUILD_TIME` 构建参数的版本化镜像;镜像内 `GOWORK=off` | PASS;native 与 amd64 镜像均构建成功,包含 `orbit`、`orbit-migrate`、`orbit-admin`,运行用户为非 root;版本化 amd64 二进制和 OCI 标签均包含注入的构建身份,`GET /version` 契约单测通过;无 DSN 时服务按预期拒绝启动 |
| 当前协议门禁 | `make protocol-check` | PASS,当前 v1 契约同步 |
| 历史 SDK / 服务端任务 API 双向演练 | Go 1.27.1、MySQL 8.4 一次性环境;`make mysql-compatibility`;历史提交 `a50d5fa` | PASS;旧服务端+当前 SDK、当前服务端+旧 SDK 均完成真实任务受理、幂等、查询、分页和取消;不是正式标签或全协议矩阵 |
| 外键迁移防回归 | `TestPostRemovalMigrationGuard`;服务端迁移运行时校验 | PASS;000008 以前仅保留兼容清理历史,后续迁移在执行前拒绝引用约束 DDL |
| Go 1.27.1 MySQL 存储集成 | MySQL 8.4.10,一次性容器;`go test -race -count=1 -run Integration -v ./internal/storage/mysql` | PASS,206.706 秒;包含空库无外键基线、v7升级、Pulse/Weave/API/观测/恢复、提交故障、凭据故障与W16竞争;未设置服务二进制时仅 `TestIntegrationWorkflowRuntimeProcess` 跳过 |
| Go 1.27.1 标准全量隔离回归(本轮) | 宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-mysql.sh`;Docker MySQL 8.4.10 | PASS,退出码0;存储与迁移263.017秒、指标进程6.731秒、流程全停接管45.636秒、SDK Worker/Event/任务进程组128.049秒、流程进程组13.812秒、Workflow SDK28.498秒、result-inbox34.628秒、task-outbox33.818秒;24个SDK示例、3个负载工具和两个独立业务模块均完成真实服务串跑,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(版本与观测标签变更后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-mysql.sh`;Docker MySQL 8.4.10 | PASS,退出码0;000028 迁移、`TestIntegrationOperationalSnapshot`、metrics 启停进程、流程全停接管、Worker/Event 故障组、SDK 全量集成、24 个示例、3 个负载工具及 result-inbox/task-outbox 均完成真实服务串跑,临时数据库已清理;最新构建身份标签和 `orbit_build_info` 变更未破坏链路 |
| Go 1.27.1 标准全量隔离回归(优雅下线排空门控后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-mysql.sh`;Docker MySQL 8.4.10 | PASS,退出码0;存储/迁移252.852秒、metrics进程6.762秒、Orbit流程全停接管45.696秒、SDK Worker/Event/任务/流程故障组、24个示例、3个负载工具及 result-inbox/task-outbox 均完成真实服务串跑;就绪排空门控未破坏租约恢复、流程接续或优雅退出,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(排空状态指标后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-mysql.sh`;Docker MySQL 8.4.10 | PASS,退出码0;存储/迁移249.882秒、metrics进程6.802秒、Orbit流程全停接管45.554秒、SDK Worker/Event/任务/流程故障组、24个示例、3个负载工具及 result-inbox/task-outbox 均完成真实服务串跑;`orbit_process_draining` 固定 gauge 和关闭路径未破坏既有行为,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(Hub 背压配置后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 make integration`;Docker MySQL 8.4.10 | PASS,退出码0;存储与迁移、metrics 启停、流程全停接管、Worker/Event 租约与 ACK 恢复、队列背压、优先级/键并发、重试与未知结果、定时任务、Weave 流程暂停/信号/定时器/查询/恢复、24 个 SDK 示例、3 个负载工具及 result-inbox/task-outbox 均完成真实服务串跑;Hub 连接上限、派发协程和有界队列配置未破坏既有行为,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(提交前事务重试后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 make integration`;Docker MySQL 8.4.10 | PASS,退出码0;存储/迁移254.604秒,其中真实 `TestIntegrationWithTxRetriesPreCommitDeadlock` 触发两事务锁环并确认 1205/1213 前提交重试;metrics进程7.156秒、流程全停接管45.734秒、SDK Worker/Event/任务进程组130.052秒、流程进程组14.121秒、Workflow SDK29.432秒、result-inbox35.737秒、task-outbox34.500秒,24个示例和3个负载工具均完成真实服务串跑;提交回执不明故障、租约恢复、Weave流程恢复和原幂等行为均保持,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(事务重试观测集成断言后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 make integration`;Docker MySQL 8.4.10 | PASS;存储/迁移254.028秒,真实锁环 `TestIntegrationWithTxRetriesPreCommitDeadlock` 输出 `Retries:1 Exhausted:0` 并确认两笔事务各提交一次;metrics进程6.775秒、流程全停接管45.672秒、SDK Worker/Event/任务进程组128.773秒、流程进程组13.740秒、Workflow SDK28.589秒、result-inbox34.871秒、task-outbox34.315秒,24个示例和3个负载工具均完成真实服务串跑;提交回执不明、租约恢复、Weave全停接管、慢消费者和两个独立业务模块均通过,临时数据库已清理 |
| 积压采样脚本与事务指标采集 | `ORBIT_BACKLOG_RUN_TIMEOUT=15s ORBIT_TEST_KEEP_ARTIFACTS=1 make schedule-backlog`;一次性 MySQL 8.4 | PASS;预期截止工具返回 `tool_exit=1`,校验仍确认256个触发/任务、外键0、计划全部暂停,保留5个数据库曲线点和 `metrics.jsonl`;每个指标样本包含服务 CPU/RSS、MySQL 资源、连接池等待、事务重试/耗尽计数和有界业务快照,短样本不作为容量结论 |
| MySQL COMMIT 包截断故障 | MySQL 8.4.10 与 Go 测试容器共享网络命名空间;`127.0.0.1` DSN;两组提交前/后切点 | PASS;`TestIntegrationWorkflowCommitFaults` 8个子场景与 `TestIntegrationCredentialCommitFaults` 均通过,预期 `unexpected EOF` 为故障注入结果 |
| Go 1.27.1 Orbit 控制进程全停/接管 | 同一共享网络命名空间;容器内构建 Linux Orbit 二进制;`ORBIT_TEST_SERVER_BINARY=/tmp/orbit go test -race -run '^TestIntegrationWorkflowRuntimeProcess$'` | PASS,42.958 秒;强杀、全停、定时器、轮询、信号、人工复核和双节点接管均通过 |
| Go 1.27.1 SDK Worker/Event 子进程故障 | 同一共享网络命名空间;容器内构建 Orbit 二进制;SDK `TestIntegration(Worker\|Event)Process` | PASS,121.600 秒;派发未送达、租约接管、ACK 提交回执丢失、慢消费者对等节点推进、重试未知结果、计划/优先级/键并发和任务接管均通过 |
| Go 1.27.1 SDK Workflow 子进程故障 | 同一共享网络命名空间;容器内构建 Orbit 二进制;SDK `TestIntegrationWorkflowProcess` | PASS,10.275 秒;流程暂停、信号/定时等待、任务结果和恢复后的版本/截止/预算均保持 |
| Go 1.27.1 SDK 应用配额子进程故障 | 独立双命名空间应用配额凭据;共享网络命名空间;`TestIntegrationWorkerProcessApplicationBackpressure` | PASS,1.055 秒;重启后共享额度、原回执和跨命名空间背压保持 |
| Go 1.27.1 SDK 可运行示例真实服务串跑 | MySQL 8.4.10 一次性库、真实 Orbit HTTP、Worker/Weave 凭据;24 个 SDK 示例及 `orbit-exec-load`、`orbit-schedule-load`、`orbit-workflow-load` | PASS;24 个示例和 3 个负载工具均完成实际受理、执行、结果/事件/流程核对,所有负载样本 `complete=true`、`unverified=0` |
| Go 1.27.1 result-inbox 真实业务集成 | 独立接收方 MySQL 8.4.10;真实 Orbit HTTP/WSS;`go test -race -run Integration ./...`,含 COMMIT 回执丢失、进程强杀后 Inbox 接管、并发去重及事务回滚 | PASS;测试包 34.183 秒,初始化与 demo 也完成;实际业务提交后才确认 ACK,最终业务效果只保留一次 |
| Go 1.27.1 task-outbox 真实业务集成 | 独立发送方 MySQL 8.4.10;真实 Orbit HTTP;`go test -race -run Integration ./...`,含 CLI、三处 COMMIT 回执丢失、HTTP 回执丢失、发送进程强杀后租约接管、预算和错误分类 | PASS;测试包 32.964 秒,初始化与 demo 也完成;原操作键恢复为单一平台任务 |
| Go 1.27.1 备份恢复脚本 | Go 1.27.1 交叉构建 macOS arm64 二进制;`scripts/test-backup-restore.sh`;MySQL 8.4 | PASS;源/恢复核心计数均为 `1,1,1,1,28`,迁移校验完整、固定索引6个、外键0 |
| Go 1.27.1 数据库短暂不可用脚本 | Go 1.27.1 交叉构建 macOS arm64 二进制;`scripts/test-db-recovery.sh`;MySQL 8.4 同卷重启 | PASS;readiness `200 → 503 → 200`,恢复后使用原凭据成功受理任务 |
| Go 1.27.1 MySQL GTID 复制与手工提升 | 两个一次性 MySQL 8.4 bridge 容器;真实 Orbit HTTP;`scripts/test-mysql-replication.sh` | PASS;复制 IO/SQL 均为 `Yes`,任务记录复制到副本,源库停止后手工提升、结构核验和原幂等键重放通过;自动切换未验证 |
| Orbit HTTP/metrics 子进程 | 同一共享网络命名空间;`TestIntegrationMetricsProcess`;metrics 启用/禁用各一组,禁用分支等待后台周期 | PASS,5.304 秒;监听隔离、隐私、后台采样、metrics 关闭后调度器持续运行和优雅退出均通过;服务就绪排空门控另有单元/竞态覆盖 |
| 真实Worker执行测量 | `orbit-exec-load`;最终短/混合/中长及截止不足四组,环境及原始JSON见[测量报告](phase-6-execution-load.md) | 96+96+6项全部逐项核验,长任务18次续租;24项截止负例按预期非零退出。SDK全模块竞态/vet/build通过,生产容量未验收 |
| 真实Weave流程测量 | `orbit-workflow-load`;24/100实例、固定发布版本双分支并行及24实例截止负例,见[流程测量报告](phase-6-workflow-load.md) | 124个正常实例、248个不同任务/唯一尝试和本地调用逐项关联;负例2成功/22未核验,非零退出。重新构建并保存源码/二进制哈希,替换旧证据;生产容量未验收 |
| 真实定时集中触发测量 | `orbit-schedule-load`;4×6及32×4触发,2×12截止负例,见[定时测量报告](phase-6-schedule-load.md) | 正常152项逐项核验;负例18个未观察点、4个未核验任务,非零退出;38个计划均暂停,实际库外键0。SDK全模块竞态/vet/build通过;生产容量未验收 |
| 长期积压与曲线 | `make schedule-backlog`;32×8共256个触发点,1 Worker/容量1,独立连接每2秒读取状态 | 最高等待249,180秒截止时173成功/83未核验,计划全部暂停,实际库外键0;目标硬件资源与生产容量未验收,见[积压报告](phase-6-backlog.md) |
| SDK 重连边界 | `TestEventConsumerReconnectStormUsesBoundedBackoff`,真实 TLS 测试服务器,4次连续断线 | 第5次连接恢复,重连4次、处理器调用1次、ACK1次;真实慢消费者/跨节点重连仍未验收,见[重连报告](phase-6-reconnect-storm.md) |
| 真实慢消费者背压 | MySQL 8.4.10 一次性库、真实 Orbit HTTP/WebSocket;单节点 `TestIntegrationEventConsumerSlowHandlerBackpressure` 与双进程 `TestIntegrationEventProcessSlowConsumerPeerProgress` | 容量1阻塞首个处理器时第二条交付保留在服务端;对等节点仍可推进,释放后2次处理/2次ACK、每条attempts=1;连接风暴、资源曲线和生产容量仍未验收,见[慢消费者报告](phase-6-slow-consumer.md) |
## 当前环境仍未覆盖
此前使用容器网络别名运行存储集成时,两组 COMMIT 故障测试曾因自身 `127.0.0.1` 明文连接前置条件被拒绝;本轮已改用共享网络命名空间单独复跑并通过,因此不再把它们列为未验证场景。共享网络命名空间只解决测试进程的 loopback 观察条件,不改变生产部署约束。
当前已完成仓库声明 Go 1.27.1 下的模块级门禁、MySQL 存储集成、关键 SDK/Orbit 进程故障组、24 个可运行 SDK 示例的真实服务串跑、两个独立业务模块的真实 MySQL/HTTP/进程故障集成、隔离 MySQL GTID 复制和手工提升演练,以及一个历史提交的稳定任务 API 双向 smoke;正式标签的完整 SDK/服务端跨版本矩阵仍未完成。新增长期积压和慢消费者样本见[报告](phase-6-backlog.md)与[慢消费者报告](phase-6-slow-consumer.md),仍未升级为生产容量结论。此前 Docker Go 1.25 共享网络结果作为历史对照保留,不替代 Go 1.27.1 集成回归、目标拓扑和版本兼容门禁。
历史 macOS arm64 + Go 1.27.1 + loopback MySQL 的完整切点记录见[故障边界报告](phase-6-fault-boundaries.md);该记录与本轮 Go 1.27.1 模块门禁互相独立,仍不能替代声明工具链下的无过滤 MySQL 集成复跑。
## 结论
本轮证明新增无外键空库基线、运维快照和协议门禁没有破坏现有服务端/SDK单元与真实 MySQL 存储行为。P7 仍未完成跨标签 SDK/服务端矩阵、宿主机进程全链路回归、目标拓扑容量、复制切换、RPO/RTO和生产发布审批。