AMR 生产发布影响报告
当前生产发布点(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,其余待发布项保持不变。
nexu/amr-web · container webkube_pod_container_info,image 过滤 amr-web:prod-[0-9a-f]{40} 且仅取 Ready Pod)27e00e635sha256:c6ebddff8785fdb76204581b287a6c31585b9c4475c0eebc39ab4b805c917c17amr-web-6d455cd695-2vnlk, amr-web-6d455cd695-7lr7z27e00e635;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)27e00e635...aea58ea9b):2 commits,其中 0 个触及该服务目录的变更nexu/amr-api · container apikube_pod_container_info,image 过滤 amr-api:prod-[0-9a-f]{40} 且仅取 Ready Pod)3b3ea92c1sha256:6599559c5f91bdad4c73298152779034a2938f27d32c74bc8808dee470f0a002amr-api-cb7b56b95-bz9ln, amr-api-cb7b56b95-dw5q73b3ea92c1;与 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)nexu/amr-link · container linkkube_pod_container_info,image 过滤 amr-link:prod-[0-9a-f]{40} 且仅取 Ready Pod)e9d02aa9bsha256:b08e1972e5edfa2d4b38ae988517602b5457400437cd08001efeb75dcd100726amr-link-5d5c986f6f-l2m8f, amr-link-5d5c986f6f-95c62, amr-link-5d5c986f6f-htlm7, amr-link-5d5c986f6f-tsp29, amr-link-5d5c986f6f-vbt9m, amr-link-5d5c986f6f-84kzwe9d02aa9b;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)e9d02aa9b...aea58ea9b):1 commits,其中 aea58ea9b feat(admin): add resumable batched Coding Plan quota resets (#243)nexu/amr-admin · container adminkube_pod_container_info,image 过滤 amr-admin:prod-[0-9a-f]{40} 且仅取 Ready Pod)92ef6744csha256:976e18773ceb66047c21941fd19957f0c24d748460b4bcc4e30820bae44fcad7amr-admin-69767c6876-jvs78, amr-admin-69767c6876-wqs9d92ef6744c;与 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)workflow_dispatch)f1b0d7643workflow_dispatch)f3ab9fccd此次发布真正新增的 feature 和影响面
| Feature / Author / Commits | Web | API | Link | Admin | DB schema / migration | DB catalog(seed) |
|---|---|---|---|---|---|---|
|
XXLCoding Plan 可恢复批量额度重置(#243)
在 Admin 里新增「恢复个人 Coding Plan 额度并把计费周期重新锚定」的可恢复批量操作,一次事务最多处理 100 个订阅,并用按用户的准入屏障取代全局准入暂停。这是本次唯一需要 ① 可恢复的批量作业:冻结的目标清单、批次身份、进度与原始结果存放在新建的 ② 全局唯一运行中作业:start lock + 部分唯一索引保证全局同时只有一个 ③ 显式放弃:需填写原因并二次确认;已完成的批次保持提交、剩余订阅不重置;放弃与批次执行在同一 job 行上串行化。 ④ 预留 ⑤ 快照与上限:单次 bulk 快照上限 5,000 订阅 / 50 批次,快照冻结后只更新进度、结果摘要与状态;预览与创建作业都会先校验该上限。 ⑥ Link 准入屏障按用户收敛:个人订阅的准入在采样时间之前加 ⑦ API 侧 anchor 语义: ⑧ 文案修复:六个重置提示原先落在错误的 i18n namespace,本次修正并在 UI 测试里断言真实中英文案;预期与意外失败都保留表单输入。 Author:mrcfps |
无(未改 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 侧已在生产生效(发布点 ① 活动发现不再截断在最新 50 个 deployment(OPEND-3298):runtime 侧 ② Test 上下文身份改为不可变绑定(OPEND-3298):由「已认证的 tester + deployment + 已校验的完整快照」派生版本化的 ③ 回执(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 错误分类:只有已知的业务拒绝( Author:heggria |
已上线(见已生效一节):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 命名部分待发布。 生成的 输出上限 metadata: Author:mrcfps |
无。 | 无。 | 无(#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,不会写入任何行。 |
已在生产生效(发布点之前,本次不重复发布)
以下 feature / commit 均在对应生产发布点之前,已在生产运行。四个服务以 EKS Pod 实态为基线,DB migration 与 Catalog 以 Forgejo workflow 记录为基线;若从 main 重新发布,只分析各自基线之后的净新增。
- Web(BASE_WEB
27e00e635已生效,2026-10-12T05:58:30Z @ run #4457):2026-10-12 05:58:30Z 的一次滚动把 Web 推到27e00e635(#238 7 天窗口展示最高额度、与月额度统一口径),同一次发布也带上了4bbdb8f7e(#236 个人 / 团队 Pricing 默认年付)与f755e70dc(#164 CMS Test 链路的 Web 侧)。更早的e80d795a7(#222 DeepSeek V4.1 Flash Design Plan 额度翻倍)、4c9101650(#219 Design Plan 移除 Sol 并加入 Haiku 5.5)也已生效。发布点到 HEAD 之间的两个 commit(e9d02aa9b只改 Link 与 e2e / spec,aea58ea9b只改 Admin / API / Link / DB)都不触及 Web。本轮 Web 无待发布内容。 - Link(BASE_LINK
e9d02aa9b已生效,2026-10-12T11:47:30Z @ run #4555):2026-10-12 11:47:30Z 的 run #4555 把 Link 从92ef6744c推进到e9d02aa9b(#242 Haiku 5.5 adaptive thinking 与低预算 reasoning 修复,OPEND-3762 / OPEND-3763);Pod 滚动在当日 12:01Z–12:10Z 完成,本报告采样时已稳定(6/6 Ready、同一 commit、同一 digest)。因此 #242 已在上线,不再是待发布项;claude-haiku-5.5的合法loweffort 请求不再被转成上游不支持的旧式 thinking、小输出预算请求不再在本地被拒并暴露为 502 /upstream_error。更早的92ef6744c(#235)、5b655e207(#170 clamp)、cb6e014f4(#159 Link 内部目录校验 / reload / 后端诊断)、23cfe2099(#144 媒体与异步任务失败观测)、f80c686e0(#230 DeepSeek Chat developer role 归一)同样已生效。发布点之后只剩 #243 的 Link 屏障待发布。 - Admin(BASE_ADMIN
92ef6744c已生效,2026-10-12T03:35:56Z @ run #4436):2026-10-12 03:35:56Z 的一次滚动带上了92ef6744c(#235 Token 管理收敛到 Admin API Tokens 页、模型接入与发布阶段拆分set-release-phase、结构化configurationIssues校验),以及5b655e207(#170 Admin「输出 token 上限」字段)、69ffad4b0(#234 CLI SSO 同意页 / loopback 回调修复)。更早的af748c660(#229 CLI SSO 登录与 Token 管理)、5dfcbc41a(#228 只读 catalog CLI 查询)、058335840(#226)、cb6e014f4(#159 目录 CRUD / tier 路由工作台 / 后端诊断)、ed2fdcd97(#193 回退 #127)、724488f4b(#188)也已生效。基线之后只剩 #164 与 #243 的 Admin 侧待发布。 - API(BASE_API
3b3ea92c1已生效,2026-09-30T14:07:02Z @ run #3477):该基线的 subject 为fix(link): handle BytePlus history and DeepSeek request compatibility (#172),发布点停在 2026-09-30(六个维度中最旧),此后 21 个 commit 中只有f755e70dc(#164)与aea58ea9b(#243)触及services/api/,其余 19 个 commit 的改动全部落在apps/web/、apps/admin/、services/link/、db/seeds/、data/json/与文档,已随对应维度各自的发布生效。 - DB migration(BASE_DB
f1b0d7643已生效,2026-10-10T09:48:00Z @ run #4289):基线为f1b0d7643(#232 DB PR 门禁调整,纯 CI 改动),已在 2026-10-10 09:48Z 的 apply 运行中执行;当时仓库最新一份 migration 是af748c660(#229)的db/migrations/20261010060924_admin_cli_credentials.sql(CLI 凭据表,db/schema/public.hcl与atlas.sum同步),也已在该次运行中应用。注意:基线之后新增了 1 个待 apply 的 migration(#243 的coding_plan_quota_resets表),见 feature 表第 1 行。 - Model Routing Catalog(BASE_CATALOG
f3ab9fccd已生效,2026-10-08T06:37:30Z @ run #3923):基线停在f3ab9fccd(#209 Claude Haiku 5.5:新 public model + 双 route + 分层计价),已于 2026-10-08 06:37Z 的 apply 运行中生效。更早的940218638(#205 停用 BytePlus DeepSeek V4.1 Flash 路由)等同样已生效。发布点之后触及 catalog 源的两个 commit 都是 seed / 生成器侧改动(feature 表第 3 行),不改变既有生产目录数据。 - 范围内已回退(净变更归零):
ed2fdcd97(#193)完整回退了0dc3fc2fb(#127 公开模型状态 API + 发布阶段幂等),两者都在本次各维度发布点之前,本次发布不含任何回退。
发布建议
- 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.sumchecksum 校验通过后再继续。 - 服务发布顺序(本轮):两个 feature、三个服务,依赖关系比上一轮更强:
- 1) DB migration:先跑 deploy-db-migrations-prod.yml(见上)。重置表不存在时 Admin 的重置端点无法工作。
- 2) API:触发 deploy-api-eks-prod.yml,发布
f755e70dc(#164 API 侧分页 / 身份 / 错误分类)与aea58ea9b(#243manual_resetanchor 语义)。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/,重发不会带来运行时变化。
- 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 去「回填」。 - 跨仓库依赖:#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),若有调用方依赖旧行为需提前通知。 - 发布后观测:
- Pod 实态:API、Link、Admin 的镜像 tag 都应变为
prod-aea58ea9b…(三者镜像均由 HEADaea58ea9b构建),Ready 分别恢复为 2/2、6/6、2/2 且 spec = updated = available;Web 应保持prod-27e00e635…(digestsha256: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内容与时间戳不变。
- Pod 实态:API、Link、Admin 的镜像 tag 都应变为
备注:本报告所有 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 实态全部一致。