AMR 生产发布影响报告

生成时间:2026-10-13 10:05(本地,UTC+8);EKS 观察时刻 2026-10-13T02:02:02Z;分析对象:如果现在从 origin/main(HEAD aea58ea9b)发布 Web、API、Link、Admin、DB migration 与 Model Routing Catalog 的影响分析。四个服务以 EKS Pod 实际运行镜像为生产发布点,DB migration 与 Catalog 以对应 Forgejo workflow 最近一次成功运行的 commit_sha 为生产发布点;六个维度分别计算变更范围。

当前生产发布点(EKS 实态 + Forgejo workflow 记录)

Web、API、Link、Admin 的发布点来自 Grafana / Prometheus 观察到的 Ready EKS Pod 镜像(namespace nexu,datasource prometheus,由 kube-state-metrics 采集,全部样本新鲜度在 31 秒内);DB migration 与 Catalog 的发布点来自对应 Forgejo workflow 最近一次成功运行。四个服务均已校验:同一服务所有 Ready Pod 的 commit 与 digest 一致、副本数 spec = updated = available(无滚动中 / 回滚中的混合状态)、Ready Pod 数等于 spec 副本数。四个服务的 workflow 最近成功记录与 Pod 实态全部一致(仅作审计对照)。 feature 表里只列出发布点之后的变更;发布点之前的内容属于已生效,归入「已在生产生效」一节。目标 commit 为 aea58ea9b(feat(admin): add resumable batched Coding Plan quota resets (#243),2026-10-12 14:48,mrcfps),本地 main 与 origin/main 相同。

本轮采样说明:本次采样一次成功,四个服务均处于稳定状态(无滚动 / 回滚中的混合状态,无旧新 Pod 并存),直接采用该快照作为发布点。与上一份报告(2026-10-12 20:20)相比,六个维度的生产发布点全部没有变化(Web 27e00e635、API 3b3ea92c1、Link e9d02aa9b、Admin 92ef6744c、DB f1b0d7643、Catalog f3ab9fccd),变化的只有 origin/main 从 e9d02aa9b 前进到 aea58ea9b(新增 1 个 commit:#243)。因此本报告相对上一份的增量就是 #243,其余待发布项保持不变。

Web · EKS Pod 实态
Workload:nexu/amr-web · container web
观察时间:2026-10-13T02:02:02Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-web:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:2 / 2(updated 2,available 2)
实际 commit:27e00e635
镜像 digest:sha256:c6ebddff8785fdb76204581b287a6c31585b9c4475c0eebc39ab4b805c917c17
Pod:amr-web-6d455cd695-2vnlk, amr-web-6d455cd695-7lr7z
Workflow 审计(仅供参考):deploy-web-eks-prod.yml 最近成功 run #4457 @ 27e00e635;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(27e00e635...aea58ea9b):2 commits,其中 0 个触及该服务目录的变更
本轮 Web 无待发布内容:发布点之后 2 个 commit(e9d02aa9b,#242;aea58ea9b,#243)没有一个触及 apps/web/。Web 自昨日 05:58Z 的滚动起一直停留在 27e00e635,本次采样未观察到任何滚动。 Web 于 2026-10-12T05:58:30Z 由 run #4457 滚动到该 commit(Deployment amr-web-6d455cd695),该 commit 是 HEAD 之前最后一个触及 Web 的变更。
API · EKS Pod 实态
Workload:nexu/amr-api · container api
观察时间:2026-10-13T02:02:02Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-api:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:2 / 2(updated 2,available 2)
实际 commit:3b3ea92c1
镜像 digest:sha256:6599559c5f91bdad4c73298152779034a2938f27d32c74bc8808dee470f0a002
Pod:amr-api-cb7b56b95-bz9ln, amr-api-cb7b56b95-dw5q7
Workflow 审计(仅供参考):deploy-api-eks-prod.yml 最近成功 run #3477 @ 3b3ea92c1;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(3b3ea92c1...aea58ea9b):21 commits,其中 f755e70dc fix(cms): complete Test discovery, context identity and receipt handoff (#164)、aea58ea9b feat(admin): add resumable batched Coding Plan quota resets (#243)
发布点之后 21 个 commit 中 2 个触及 services/api/:f755e70dc(#164 API 侧:Test deployment 游标分页、上下文身份绑定、acceptance 错误分类,feature 表第 2 行)与 aea58ea9b(#243 codingPlanAnchorKind = manual_reset 的 anchor 保留,feature 表第 1 行)。 API 发布点仍是六个维度中最旧的(2026-09-30T14:07:02Z,run #3477),发布点之后到 HEAD 的其余 19 个 commit 全部落在其它目录(已随对应的 Web / Link / Admin / Catalog 发布生效)。
Link · EKS Pod 实态
Workload:nexu/amr-link · container link
观察时间:2026-10-13T02:02:02Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-link:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:6 / 6(updated 6,available 6)
实际 commit:e9d02aa9b
镜像 digest:sha256:b08e1972e5edfa2d4b38ae988517602b5457400437cd08001efeb75dcd100726
Pod:amr-link-5d5c986f6f-l2m8f, amr-link-5d5c986f6f-95c62, amr-link-5d5c986f6f-htlm7, amr-link-5d5c986f6f-tsp29, amr-link-5d5c986f6f-vbt9m, amr-link-5d5c986f6f-84kzw
Workflow 审计(仅供参考):deploy-link-eks-prod.yml 最近成功 run #4555 @ e9d02aa9b;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(e9d02aa9b...aea58ea9b):1 commits,其中 aea58ea9b feat(admin): add resumable batched Coding Plan quota resets (#243)
发布点之后 1 个 commit 中 1 个触及 services/link/:aea58ea9b(#243 个人订阅准入前的 shared advisory lock 屏障 + 无窗口时按 manual_reset anchor 回填 entitlement),即 feature 表第 1 行。注意本轮 Link 已扩到 6 个副本(此前 4 个),新版本必须全部副本滚动完成后再打开重置开关。 Link 自昨日 11:47:30Z 的 run #4555 起停留在 e9d02aa9b(#242 Haiku 5.5 adaptive thinking 与低预算 reasoning 修复),本次采样未观察到滚动。更早的 92ef6744c(#235)、5b655e207(#170 按后端上限 clamp 输出预算)、cb6e014f4(#159 Link 内部目录校验 / reload / 后端诊断)、23cfe2099(#144 媒体与异步任务失败观测)、f80c686e0(#230 DeepSeek Chat developer role 归一)同样已生效。
Admin · EKS Pod 实态
Workload:nexu/amr-admin · container admin
观察时间:2026-10-13T02:02:02Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-admin:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:2 / 2(updated 2,available 2)
实际 commit:92ef6744c
镜像 digest:sha256:976e18773ceb66047c21941fd19957f0c24d748460b4bcc4e30820bae44fcad7
Pod:amr-admin-69767c6876-jvs78, amr-admin-69767c6876-wqs9d
Workflow 审计(仅供参考):deploy-admin-eks-prod.yml 最近成功 run #4436 @ 92ef6744c;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(92ef6744c...aea58ea9b):5 commits,其中 f755e70dc fix(cms): complete Test discovery, context identity and receipt handoff (#164)、aea58ea9b feat(admin): add resumable batched Coding Plan quota resets (#243)
发布点之后 5 个 commit 中 2 个触及 apps/admin/:f755e70dc(#164 Admin 侧:Activities 列表三层拆分、BFF 路由、i18n,feature 表第 2 行)与 aea58ea9b(#243 Admin 侧:重置预览 / 执行 / 续跑 / 放弃 UI 与 BFF,feature 表第 1 行)。 其余 3 个 commit(4bbdb8f7e、27e00e635、e9d02aa9b)不触及 apps/admin/。92ef6744c(#235 Token 管理收敛 / 模型接入与发布阶段拆分)、af748c660(#229 CLI SSO 与 Token 管理)、cb6e014f4(#159 目录 CRUD / 路由工作台)等已随 03:35Z 的滚动生效。
DB migration · workflow 记录
最近成功:run #4289 @ 2026-10-10T09:48:00Z(trigger workflow_dispatch)
发布点 commit:f1b0d7643
本次新增(f1b0d7643...aea58ea9b):8 commits,其中触及 db/migrations/ + db/schema/ 的变更 1 个
数据源:Forgejo run 列表(tea api /repos/core/amr/actions/runs),不使用 GitHub Actions。 发布点之后 1 个 migration / schema 变更:db/migrations/20261012113538_coding_plan_quota_resets.sql(aea58ea9b,#243)。本次需要重新运行该 workflow;此前仓库最新 migration 是 db/migrations/20261010060924_admin_cli_credentials.sql(af748c660,#229),已随本基线 apply。
Model Routing Catalog · workflow 记录
最近成功:run #3923 @ 2026-10-08T06:37:30Z(trigger workflow_dispatch)
发布点 commit:f3ab9fccd
本次新增(f3ab9fccd...aea58ea9b):16 commits,其中触及 data/json/ + db/seeds/ 的变更 2 个
数据源:Forgejo run 列表(tea api /repos/core/amr/actions/runs),不使用 GitHub Actions。 发布点之后 2 个 commit 触及 catalog 源:cb6e014f4(#159 bootstrap 守卫)与 5b655e207(#170 输出上限 metadata)。两者都是 seed / 生成器侧改动,对已初始化生产目录是 no-op。

此次发布真正新增的 feature 和影响面

feature 表只包含「各维度生产发布点之后」的变更:四个服务以 EKS Pod 实态为基线,DB migration 与 Catalog 以 workflow 记录为基线。发布点之前已生效的内容见 「已在生产生效」。

结论:六个维度里有 五个维度(API、Link、Admin、DB migration、Catalog)还有待发布内容,共 3 个 feature: ① aea58ea9b(#243,mrcfps)Coding Plan 可恢复批量额度重置——本次唯一跨 4 个维度(Admin + API + Link + DB)且唯一需要 apply migration 的变更,必须按 migration → API / Link → Admin 的顺序上线,并由开关 ADMIN_CODING_PLAN_RESET_ENABLED 控制真正启用; ② f755e70dc(#164,heggria)CMS Touchpoint 链路修复的 API + Admin 两个维度——同一 PR 的 Web 侧早已上线(见「已在生产生效」),属同一 feature 的部分上线状态; ③ Catalog seed / 生成器侧改动(cb6e014f4 #159 + 5b655e207 #170 的 db/seeds/、data/json/ 部分)——对已初始化的生产目录是 no-op,重跑 workflow 只会打印跳过提示; Web 净新增为 0(发布点 27e00e635 与 HEAD 之间的 e9d02aa9b、aea58ea9b 都不触及 apps/web/)。按影响面排序:#243(XXL,4 维度 + migration)> #164(XL,API + Admin)> Catalog seed(S,no-op)。

Feature / Author / Commits Web API Link Admin DB schema / migration DB catalog(seed)
XXLCoding Plan 可恢复批量额度重置(#243)

在 Admin 里新增「恢复个人 Coding Plan 额度并把计费周期重新锚定」的可恢复批量操作,一次事务最多处理 100 个订阅,并用按用户的准入屏障取代全局准入暂停。这是本次唯一需要 migration、唯一同时改到 Admin / API / Link / DB 四个维度的 feature,且真正启用由开关控制。行为要点:

① 可恢复的批量作业:冻结的目标清单、批次身份、进度与原始结果存放在新建的 public.coding_plan_quota_resets 表;额度变更、批次结果与 append-only 审计事件在同一事务提交,审计行永不为记录进度而被 UPDATE。关掉页面只停止继续调度(当前请求完成),任意 owner/admin 重新打开预览即可续跑;没有后台 worker。

② 全局唯一运行中作业:start lock + 部分唯一索引保证全局同时只有一个 running 的 bulk 作业;重复请求回放原始结果;目标订阅或策略发生变化时停止批次而不是静默跳过。

③ 显式放弃:需填写原因并二次确认;已完成的批次保持提交、剩余订阅不重置;放弃与批次执行在同一 job 行上串行化。

④ 预留 reset_card 来源:requesting-user / target-subscription / card 三引用 + source_check 形状约束 + 唯一索引(每张卡绑定一次执行、每个订阅同时只允许一个 running 卡片执行)。本轮 Admin 端点只操作 bulk 记录,卡片的发放 / 过期 / 兑换 / 用户确认流程是后续工作。

⑤ 快照与上限:单次 bulk 快照上限 5,000 订阅 / 50 批次,快照冻结后只更新进度、结果摘要与状态;预览与创建作业都会先校验该上限。

⑥ Link 准入屏障按用户收敛:个人订阅的准入在采样时间之前加 pg_advisory_xact_lock_shared(76124, hashtext(app_user_id))(非排队、3 秒 SQL 预算、1 秒 lock timeout),替代「全局准入暂停」;因为加锁发生在采样时间之前,即使 entitlement 被缓存,重置后等待中的准入也能读到新窗口;无窗口时按 manual_reset anchor 回填 entitlement.AnchorAt。在途请求的结算沿用原窗口,普通订阅同步保留手工 anchor。

⑦ API 侧 anchor 语义:upsertCurrentSubscription 的 anchor 判定由「仅 upgrade」放宽为 in ('upgrade', 'manual_reset'),即手工重置后同步订阅不再把周期拉回 Stripe 创建时间。

⑧ 文案修复:六个重置提示原先落在错误的 i18n namespace,本次修正并在 UI 测试里断言真实中英文案;预期与意外失败都保留表单输入。

Author:mrcfps

  • aea58ea9b feat(admin): add resumable batched Coding Plan quota resets(#243)

PR 自述的验证范围:本地 PostgreSQL 上 Atlas migration 已 apply 并通过 checksum 校验;24 个聚焦重置测试(含 1,962 个合成订阅 / 20 批次、跨 admin 续跑、冲突 / 放弃 / 回放、不可变审计、未来窗口回滚、card 来源隔离)通过;Admin 全量 1,227 passed / 40 skipped;Link make check 与 3 个真实 PostgreSQL Link 场景(TestCodingPlanMultiPolicyEAG、TestCodingPlanAdmissionsDoNotBlockAcrossUsers、TestCodingPlanManualResetWithCachedEntitlement)通过;API subscription-anchor E2E 2 passed。这些都是聚焦的数据库 / 并发集成测试,不是浏览器驱动的「重置 → 网关」端到端验收;Admin CI 在没有 E2E_DATABASE_URL 时会跳过 PG 重置测试。

无(未改 apps/web/)。 待发布:services/api 2 files,+16 / −1:src/billing/infra/postgres.ts(+1 / −1,anchor 判定加入 manual_reset)、test/e2e/coding-plan-subscription-anchor.test.ts(+15,新增手工重置 anchor 保留断言)。改动极小但属订阅周期语义,需与 Link 屏障一起上线。 待发布:services/link 4 files,+202 / −8:internal/modellimit/model_limit.go(+6,AdmissionTransaction 新增 LockPersonalCodingPlanReset,个人订阅准入前加共享 advisory lock)、internal/repositories/model_limit.go(+23,lock 实现 + 无窗口时按 manual_reset anchor 回填 entitlement.AnchorAt)、model_limit_test.go(+40 / −8)、model_limit_e2e_test.go(+133,3 个真实 PostgreSQL 场景)。
必须 6 个副本全部滚动完成后再打开重置开关。
待发布:apps/admin 16 files,+2113 / −6:新增 lib/server/admin/coding-plan-reset.ts(460,预览 / 创建 / 续跑 / 放弃 + 每批 3 秒 SQL 预算)、features/coding-plan/reset-quota-button.tsx(348)、测试 coding-plan-reset.e2e.test.ts(543)、coding-plan-reset-ui.test.tsx(238)、coding-plan-reset-messages.test.tsx(139)、coding-plan-reset-actions.test.ts(82);改 app/coding-plan-actions.ts(+72 / −3)、lib/api/types.ts(+26)、lib/audit-action-catalog.ts(+5)、lib/server/admin/core.ts(+4 / −1)、router.ts(+9)、coding-plan 页面(+4)、i18n en / zh(各 +31 / −1)、README.md(+118)、.env.example(+3,ADMIN_CODING_PLAN_RESET_ENABLED=0)。
POST 变更全部被开关挡住,owner/admin 的 GET 预览在开关关闭时也可用。
待发布:新增 migration db/migrations/20261012113538_coding_plan_quota_resets.sql(34 行:新建 public.coding_plan_quota_resets 表,含 source / progress / status 三个 CHECK、one_running_idx / one_personal_running_idx / reset_card_id_key 三个部分唯一索引、4 个 ON DELETE RESTRICT 外键);db/schema/public.hcl(+128,Atlas schema 同步);db/migrations/atlas.sum(+2 / −1)。
纯新增表 / 索引,无数据回填、无破坏性 DDL,但必须先于 Admin 新版本 apply。
无 catalog 变更。
XLCMS Touchpoint:Test 活动完整发现 + 上下文身份绑定 + 回执交接(#164)

CMS「Test / Open Design 活动」链路的一次完整性修复,跨 Web + API + Admin 三个维度。Web 侧已在生产生效(发布点 27e00e635 已包含 f755e70dc),本轮待发布的是 API 与 Admin 两个维度——同一 feature 的「部分上线」状态。修掉的问题与新增行为:

① 活动发现不再截断在最新 50 个 deployment(OPEND-3298):runtime 侧 GET /v1/touchpoints/test-deployments 由「一次返回最新一批」改为游标分页——不透明且保留微秒精度的 (created_at, id) 游标 + 确定性 ID 排序,先筛出合格的 Test 活动再分页;响应在原有 deployments 之外新增 nextCursor,仍保留 ?activityIds= 精确 ID 查询路径(Admin 的精确 ID 查询兼容)。查询参数白名单收紧:未知 key、重复 key、activityIds 与 cursor / limit 混用、非法 limit、无法解码的 cursor 一律在访问数据库之前返回 400 invalid_test_deployment_query。

② Test 上下文身份改为不可变绑定(OPEND-3298):由「已认证的 tester + deployment + 已校验的完整快照」派生版本化的 contextId、不可变 revision generation 与 contextToken,context POST 与 runtime GET 共用同一 identity helper,不再依赖「重连时间戳」做匹配。请求可带可选 token:仅在当前授权、撤回状态与内容检查通过后才返回带类型的 409 不一致诊断;旧客户端可不传,无新 epoch 轮转操作、无数据库 migration。

③ 回执(receipt)交接(OPEND-3328):最新回执时间、宿主版本、locale 与 tester 取自同一条最新记录,重复计数与唯一 placement 完成度保持区分,补齐刷新与本地化旧字段回退。

④ Web 宿主体验(OPEND-3448,已生效):Vela Web 生产 Campaign 浮层保留按模态区分的焦点恢复与可见键盘焦点环(新增真实浏览器 Escape 断言);test-campaign-console 的 acceptance 提交改为带 10 秒超时 / AbortController 的队列式重试(1s / 5s / 15s 退避),区分 HTTP 错误状态,并随 Test session / selection key 变化重置重试计数。

⑤ API acceptance 错误分类:只有已知的业务拒绝(test_deployment_inactive、test_schedule_not_active、invalid_test_acceptance_scenario、placement_not_in_snapshot、host_compatibility_unverified、legacy_artifact_projection_required)才返回 400,其它异常改为抛出交给统一错误处理(宿主对 5xx 重试,不再把内部错误误判成业务 400)。

Author:heggria

  • f755e70dc fix(cms): complete Test discovery, context identity and receipt handoff(#164)

配套客户端改动在同组织其它仓库(Open Design #8527);PR 自述「未合并、未部署、未宣称 QA 验收」,真实 Test Admin QA 与 Windows / 客户端回归仍是显式待办。

已上线(见已生效一节):apps/web 5 files,+774 / −126 已随 2026-10-12 05:58Z 的 Web 滚动生效(test-campaign-console.tsx、production-campaign-float.tsx 与浏览器测试)。
本轮 Web 无待发布变更。
待发布:services/api 7 files,+1330 / −58:src/touchpoints/routes.ts(+104 / −13,test-deployments 分页参数白名单 + nextCursor + acceptance 错误分类)、src/touchpoints/persistence.ts(+238 / −12,listTestDeploymentPage / decodeTestDeploymentCursor / 状态过滤),测试 +988(新增 touchpoints-test-deployment-list.test.ts 382 行、touchpoints-activity-list.test.ts 139 行,扩充 browser-runtime / test-context / restore-lifecycle)。
API 发布点之后共 2 个 commit 触及 services/api/,本 PR 是其中之一(另一个是 #243)。
不涉及(该 PR 未改 services/link/)。 待发布:apps/admin 23 files,+2887 / −366:新增 features/touchpoints/activity-list-loader.ts(71)/ activity-list-query.ts(83)/ activity-list-url.ts(108)三层与 test/activity-list-url.test.tsx(202)、test/cms-classic-delivery.test.tsx(610)、test/touchpoint-activity-list-bff.test.ts(215)、test/manual-cms/* 手工验证 harness;重写 features/touchpoints/activity-manager.tsx(+634 / −216)与 activity-sandbox-preview.tsx、(protected)/activities/page.tsx;BFF 路由 app/api/admin/touchpoints/activities/route.ts(+31)与 test-deployments/route.ts(+15);lib/server/admin/touchpoints.ts(+66);中英文案 i18n/messages/{zh,en}.json(+99 / −41)。 无 schema / migration(PR 明确不引入新 migration;上下文身份不落新表)。 无 catalog 变更。
SCatalog seed 退化为「仅初始化」+ 后端输出上限 metadata(#159 seed 部分、#170 seed 部分)

目录配置的契约已定为「Admin + 数据库是配置源」(#159 的 Admin / Link 主体与 #170 的 Admin / Link 主体均已上线),因此仓库里的 catalog seed 必须从「可重复 apply 的同步脚本」退化为「只初始化空环境、绝不覆盖既有配置」,并顺带把 #170 的输出上限写进初始化 metadata。本轮只有 seed / 生成器 / workflow 命名部分待发布。

生成的 seed-model-routing-catalog.sql 整体包进 bootstrap 守卫:先对 link.providers / backend_models / public_models / public_model_routes / public_model_release_gates / public_model_admin_overrides / route_realisations 取 SHARE ROW EXCLUSIVE 锁,若任一目录表已有数据则打印 RAISE NOTICE 'Catalog already initialized; seed skipped. Manage configuration in Admin.' 后直接返回;test-activation overlay 与本地 smoke fixture 被 vela.catalog_bootstrapped 会话变量限制在「真正初始化该库的那一次事务」内。catalog workflow 的 apply job 同步改名为 Initialize Empty Prod Model Catalog(步骤 Initialize empty model catalog (preserve Admin configuration))。

输出上限 metadata:provider_routes.json 新增 max_output_tokens(Xiaomi mimo-v2.6-flash / mimo-v2.6-pro = 131072,BytePlus deepseek-v4-1-flash-260910 = 393216),生成器校验 16..2147483647 并写入 backend metadata;这些值只用于初始化空环境,已生效的 Link clamp 仍以 Admin 数据库中的配置为准。

Author:mrcfps

  • cb6e014f4 feat(admin): manage model catalog via UI and CLI(#159)— 本轮仅其 db/seeds/ + workflow 命名部分待发布(Admin / Link 主体已生效)
  • 5b655e207 fix(link): clamp output budgets with Admin-configured backend limits(#170)— 本轮仅其 seed / JSON metadata 部分待发布(Link / Admin 主体已生效)
无。 无。 无(#170 的 Link clamp 主体已随 Link 上一次滚动 92ef6744c 生效)。 无(#159 的 Admin CRUD / 诊断 UI 与 #170 的 Admin 输出上限字段已随 2026-10-12 03:35Z 的 92ef6744c 生效)。 无 schema / migration。 7 files,+105 / −12:db/seeds/generate_model_routing_catalog.py(+45 / −2,bootstrap_guard() + max_output_tokens 校验)、db/seeds/seed-model-routing-catalog.sql(重新生成,+22 / −3,bootstrap DO 块与三条 backend metadata)、db/seeds/seed-model-routing-catalog-test-activation.sql(+12)、db/seeds/model_routing_catalog.py(+2 / −2)、db/seeds/generate_model_routing_catalog_rules_test.py(+16)、data/json/provider_routes.json(+6 / −3)、.forgejo/workflows/deploy-model-routing-catalog-prod.yml(+2 / −2,job / step 改名,功能不变)。
对已初始化的生产目录无净变更:重新触发只打印 skip notice,不会写入任何行。

范围内其余 commit 不产生六个维度的净变更:API 的 compare range(3b3ea92c1...aea58ea9b)覆盖 21 个 commit,跨 apps/admin/、apps/web/、services/link/、db/seeds/、data/json/、.forgejo/workflows/ 与文档,其中只有 f755e70dc 与 aea58ea9b 触及 services/api/;Admin 的 compare range(92ef6744c...aea58ea9b)覆盖 5 个 commit(f755e70dc、4bbdb8f7e、27e00e635、e9d02aa9b、aea58ea9b),只有 f755e70dc 与 aea58ea9b 触及 apps/admin/;Web 的 compare range(27e00e635...aea58ea9b)覆盖 2 个 commit(e9d02aa9b、aea58ea9b),没有一个触及 apps/web/;Link 的 compare range(e9d02aa9b...aea58ea9b)只有 1 个 commit(aea58ea9b),即 feature 表第 1 行;DB 的 compare range(f1b0d7643...aea58ea9b)覆盖 8 个 commit,其中只有 aea58ea9b 触及 db/migrations/ + db/schema/。

已在生产生效(发布点之前,本次不重复发布)

以下 feature / commit 均在对应生产发布点之前,已在生产运行。四个服务以 EKS Pod 实态为基线,DB migration 与 Catalog 以 Forgejo workflow 记录为基线;若从 main 重新发布,只分析各自基线之后的净新增。

发布建议

  1. Migration 判断:本次需要跑 migration(与上一份报告不同)。BASE_DB f1b0d7643(10-10 apply)之后到 main 的 8 个 commit 中,aea58ea9b(#243)新增了 db/migrations/20261012113538_coding_plan_quota_resets.sql(新建 public.coding_plan_quota_resets 表 + 3 个部分唯一索引 + 4 个 ON DELETE RESTRICT 外键,db/schema/public.hcl / atlas.sum 同步)。纯新增、无数据回填、无破坏性 DDL,但必须先于 Admin 新版本 apply:触发 deploy-db-migrations-prod.yml(workflow_dispatch),确认 apply 成功且 atlas.sum checksum 校验通过后再继续。
  2. 服务发布顺序(本轮):两个 feature、三个服务,依赖关系比上一轮更强:
    • 1) DB migration:先跑 deploy-db-migrations-prod.yml(见上)。重置表不存在时 Admin 的重置端点无法工作。
    • 2) API:触发 deploy-api-eks-prod.yml,发布 f755e70dc(#164 API 侧分页 / 身份 / 错误分类)与 aea58ea9b(#243 manual_reset anchor 语义)。API 发布点最旧(2026-09-30)、契约最底层,且 #243 要求 API 先于开启开关。
    • 3) Link:触发 deploy-link-eks-prod.yml,发布 aea58ea9b(#243 个人订阅准入屏障)。必须确认全部 6 个副本都滚动完成(同一 commit、同一 digest、spec = updated = available = 6)——只滚动一部分会让「每用户屏障」在旧副本上缺失。
    • 4) Admin:触发 deploy-admin-eks-prod.yml,同时发布 f755e70dc(#164 Admin 侧 Activities 列表与 BFF)与 aea58ea9b(#243 重置预览 / 执行 / 续跑 / 放弃 UI 与 BFF)。Admin 依赖 API 的新分页 / 身份接口,也依赖已 apply 的重置表,因此放在最后。发布时保持 ADMIN_CODING_PLAN_RESET_ENABLED=0(.env.example 默认值即为 0)。
    • 5) 开启重置能力:低峰期把 ADMIN_CODING_PLAN_RESET_ENABLED=1 打开(该开关只挡 POST 变更,owner/admin 的 GET 预览在关闭时也可用于发布前核对)。开启前重新核对目标订阅数量与策略;回滚时先关闭该开关,再回滚 API / Link。
    • Web 不需要滚动:发布点 27e00e635 之后的两个 commit 都不改 apps/web/,重发不会带来运行时变化。
  3. Catalog / seed 判断:不需要触发 deploy-model-routing-catalog-prod.yml。发布点之后的两个 catalog 变更(#159 bootstrap 守卫、#170 输出上限 metadata)对已初始化生产目录是 no-op,重跑只会打印 Catalog already initialized; seed skipped. Manage configuration in Admin.。注意:#170 的 seed 值不会回填既有环境,若 Admin 里尚未给 provider_xiaomi 的 mimo-v2.6-flash / mimo-v2.6-pro(131072)与 provider_byteplus 的 deepseek-v4-1-flash-260910(393216)配置输出上限,Link 的 clamp 对这些后端就不生效;请在 Admin 中核对该配置(保留已核实的既有上限,不要启用非 active 的 backend / route),不要用 seed 或手工 SQL 去「回填」。
  4. 跨仓库依赖:#164 的宿主客户端改动在 Open Design 仓库的配套 PR(#8527)中,其 Web 宿主已随 Web 发布上线;API 侧对旧客户端保持兼容(activityIds 路径保留、token 可选、nextCursor 为新增字段),但新增了查询参数白名单与 400 / 5xx 语义变化,API 发布后应与 OD 客户端联调确认 Test 活动发现能翻到 50 条以外的旧活动。#243 的 reset_card 来源只是预留(表结构 + 唯一索引),卡片发放 / 兑换 / 用户确认尚未实现,前端与客户端不应依赖该能力。#242 已收紧 Messages 侧非法 / 冲突 thinking 组合的错误契约(部分输入从静默 200 变为 400),若有调用方依赖旧行为需提前通知。
  5. 发布后观测:
    • Pod 实态:API、Link、Admin 的镜像 tag 都应变为 prod-aea58ea9b…(三者镜像均由 HEAD aea58ea9b 构建),Ready 分别恢复为 2/2、6/6、2/2 且 spec = updated = available;Web 应保持 prod-27e00e635…(digest sha256:c6ebddff8785fdb7…)不变。
    • #243 重置链路(DB → API / Link → Admin):migration apply 后确认 public.coding_plan_quota_resets 表与 3 个部分唯一索引存在;开关关闭时 GET 预览可用、POST 返回拒绝;开关打开后在低峰期跑一次小批量重置,确认每批 ≤ 100 订阅、进度可跨 admin 续跑、重复请求回放原结果、放弃后剩余订阅未被重置;观察 Link 侧 pg_advisory_xact_lock_shared(76124, …) 的等待 / 1 秒 lock timeout 与 3 秒 SQL 预算是否触发告警,并确认没有出现全局准入暂停(跨用户不应互相阻塞);确认手工重置后的订阅周期不再被 Stripe 同步拉回创建时间。
    • #164 CMS 链路(API / Admin):Admin Activities 页 Test 活动列表能取到 50 条以外的旧 Open Design 活动(构造 > 50 条合格记录,确认 cursor 连续翻页、无重复 / 无跳过、末页 nextCursor 为 null);contextId / generation 在 context POST 与 runtime GET 间一致,可选 token 不匹配时返回带类型的 409;非法查询参数稳定返回 400 invalid_test_deployment_query 且不产生额外数据库压力;关注 API 5xx 比例是否因 acceptance 错误改抛而上升;Vela Web 生产 Campaign 浮层的键盘焦点环与 Escape 焦点恢复(已上线,回归即可)。
    • catalog(仅核对,无需发布):确认 Admin 后端模型表单里的 Output token limit 与供应商实际约束一致;若触发 workflow,日志应出现跳过 notice,且 link.providers / backend_models / public_models / public_model_routes 内容与时间戳不变。

备注:本报告所有 workflow、commit、PR 与 compare range 均指向 Forgejo code.powerformer.net/core/amr,不使用 GitHub Actions。四个服务的 compare range 基于 Grafana / Prometheus 观察到的 Ready Pod 镜像 commit(而非 GitOps / workflow 最近成功记录);DB migration 与 Catalog 的 compare range 基于各自 workflow 最近一次成功运行的 commit_sha;四个服务维度另附对应 deploy-*-eks-prod.yml 最近成功记录作为审计对照,本次四者与 Pod 实态全部一致。