AMR 生产发布影响报告

生成时间:2026-09-17(UTC 2026-09-17T02:03:00.009289Z 观察);分析对象:从 origin/main(HEAD ca0020856,feat(cms): production CMS launch — canary gate, promotion on the production API, runbook (#2053))发布 Web、API、Link、Admin、DB migration 与 Model Routing Catalog 的影响分析。注意:四个服务以 EKS Pod 实际运行镜像为生产发布点,DB migration 与 Catalog 以对应 workflow 最近成功运行的 head_sha 为生产发布点;六个维度必须分别计算变更范围。

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

Web、API、Link、Admin 的发布点来自 Grafana / Prometheus(datasource prometheus)观察到的 Ready EKS Pod 实际运行镜像;DB migration 与 Catalog 的发布点来自对应 workflow 最近一次成功运行。 越新的发布点意味着该维度已上线越多内容,feature 表里只允许列出发布点之后的变更;发布点之前的 commit 属于已生效,归入「已在生产生效」一节,不得重复出现在 feature 表。目标 commit 均为 ca0020856 (feat(cms): production CMS launch — canary gate, promotion on the production API, runbook (#2053),2026-09-16)。

观察口径:kube_pod_container_info(按业务容器 + amr-*:prod-<40 位 SHA> 镜像精确过滤)and on(namespace,pod) kube_pod_status_ready{condition="true"}==1,副本数用精确 deployment="amr-*" 的 spec/updated/available 指标。四个服务各自 Ready Pod 的 commit 与镜像 digest 均一致,副本 spec = updated = available,样本龄均 ≤ 20s。API CronJob、Link Redis、metrics exporter 已被排除。

Web · EKS Pod 实态
Workload:nexu/amr-web · container web
观察时间:2026-09-17T02:02:41Z(样本龄 18.7s,≤5 分钟)
Ready Pods:2 / 2(updated 2、available 2)
Pod:amr-web-5f9f864765-4r8qt、amr-web-5f9f864765-hfdhb
实际 commit:ae4b84f76
镜像 digest:sha256:321e7728c850b705aa6cedfafc381f862900719a6e65b4eb0606599a61098c56
审计对照:deploy-web-eks-prod.yml 最近成功 run 34496900207 · ae4b84f76 · 2026-09-10 15:45:48Z;与 Pod:一致(未发现 GitOps 手工回滚导致的差异)
本次新增(ae4b84f76...ca0020856):11 commits 触及该服务路径
46cab47fe(DS V4.1 多语言定价活动页)、0f5bf8525 的 Web 部分与 ae4b84f76 已在发布点之前生效。
API · EKS Pod 实态
Workload:nexu/amr-api · container api
观察时间:2026-09-17T02:02:44Z(样本龄 15.9s,≤5 分钟)
Ready Pods:2 / 2(updated 2、available 2)
Pod:amr-api-7f77b4bfc-9rq8s、amr-api-7f77b4bfc-dgljj
实际 commit:b6a6adafb
镜像 digest:sha256:8a5b8f37a1eeb5d28f17771f50710bd094f6e39e478db7ed5a571d8dd1e204cc
审计对照:deploy-api-eks-prod.yml 最近成功 run 34319196711 · b6a6adafb · 2026-09-09 06:35:23Z;与 Pod:一致(未发现 GitOps 手工回滚导致的差异)
本次新增(b6a6adafb...ca0020856):15 commits 触及该服务路径
发布点之后触及 services/api 的 commit 全部属于本次待发布内容(其中 eecb4434d46cab47fe463752395 仅测试改动)。
Link · EKS Pod 实态
Workload:nexu/amr-link · container link
观察时间:2026-09-17T02:02:46Z(样本龄 13.1s,≤5 分钟)
Ready Pods:2 / 2(updated 2、available 2)
Pod:amr-link-8596d5684f-scgm4、amr-link-8596d5684f-65cfl
实际 commit:eecb4434d
镜像 digest:sha256:28aa5dd46346cf723150ce708abce394b369ecd86baa45cec3e986aa7e34bd4b
审计对照:deploy-link-eks-prod.yml 最近成功 run 34331109088 · eecb4434d · 2026-09-09 08:50:26Z;与 Pod:一致(未发现 GitOps 手工回滚导致的差异)
本次新增(eecb4434d...ca0020856):8 commits 触及该服务路径
6ed3057a5(Coding Plan Go 档位下线)在发布点之前已生效。
Admin · EKS Pod 实态
Workload:nexu/amr-admin · container admin
观察时间:2026-09-17T02:02:49Z(样本龄 10.4s,≤5 分钟)
Ready Pods:2 / 2(updated 2、available 2)
Pod:amr-admin-b885c85ff-vr6wt、amr-admin-b885c85ff-c6bmd
实际 commit:eecb4434d
镜像 digest:sha256:ec024eb44eed002541226dbb73baf1f5dd06eccc79a2837c378909a2f0d10151
审计对照:deploy-admin-eks-prod.yml 最近成功 run 34331590202 · eecb4434d · 2026-09-09 08:59:20Z;与 Pod:一致(未发现 GitOps 手工回滚导致的差异)
本次新增(eecb4434d...ca0020856):9 commits 触及该服务路径
ff55214d71b5c7b6296ed3057a5 的 Admin 部分已在发布点之前生效。
deploy-db-migrations-prod.yml · workflow 记录
最近成功:2026-09-09T09:02:35Z → 09:07:00Z(run 34332462690)
发布点 commit:eecb4434d(head_sha eecb4434d0bd…
本次新增(eecb4434d...ca0020856):5 commits 触及 db/migrations + db/schema,新增 6 个 migration
已生效:20260909071815_retire_coding_plan_go_config.sql(Coding Plan Go 配置下线 phase 2);生产库因此尚无 touchpoints schema,CMS 提升第一次写入会失败。
deploy-model-routing-catalog-prod.yml · workflow 记录
最近成功:2026-09-10T07:39:07Z → 07:42:12Z(run 34451023331)
发布点 commit:21c79c6c6(head_sha 21c79c6c6d0b…
本次新增(21c79c6c6...ca0020856):4 commits 触及 data/ 或 db/seeds,其中 2 个为功能性 catalog 变更af7415d3577054ca19
已生效:DeepSeek V4.1 Flash 上线(21c79c6c6)及更早的模型/路由/定价。

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

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

Feature 聚合口径:按业务行为、用户路径、数据契约与部署依赖聚合;PR、分支、作者与目录只作为可点击的追溯证据,不构成划分依据。共 12 个 feature,按影响面从大到小排列。

Feature / Author / Commits Web API Link Admin DB schema / migration DB catalog(seed)
XXLCMS(Touchpoint)生产上线:不可变内容 → Test 跨环境验收 → 生产提升,带白名单 canary

把运营活动从「只能在 Test 发布」变成「可发布到生产」。Admin 在 /activities 走完导入 → 构建 → 选定不可变内容版本 → Test 启动 → 客户端完成全部 placement 验收 → Promote;提升改由生产 API 执行(不再要求 Test API 持有生产库写入凭据),Admin 新增独立的 CMS authoring origin/token。控制台 placement vela.web.console-overlayTOUCHPOINT_WEB_CONSOLE_ROLLOUT(off/allowlist/all,默认拒绝)做灰度;canary 拒绝时生产运行时返回 410 production_runtime_withdrawn,Web 立即清空已挂载内容。风险:TOUCHPOINT_ENVIRONMENT=production 使 store 模式/区域/桶/角色成为硬性启动要求(缺一项 API 直接起不来),提升请求有 5s 硬编码超时,且生产库当前还没有 touchpoints schema。

Author:Caprika

  • 0f5bf8525 feat(cms): add immutable content lifecycle and cross-host Test acceptance (#1943)
  • 8c2d0f95b fix(cms): use one artifact store for Test and promotion (#1953)
  • 02ce3dd9c fix(cms): accept safe ZIP directories and report storage failures (#1955)
  • de6ead823 fix(cms): select ready content and separate Test withdrawal (#1963)
  • 5eb9df7bf fix(touchpoints): enforce realtime test lifecycle and authorization leases (#1996)
  • 463752395 fix(admin): open activity actions in centered dialogs (#1968)
  • ca0020856 feat(cms): production CMS launch — canary gate, promotion on the production API, runbook (#2053)
只选 ready 内容、Test 撤下独立(de6ead823);canary 拒绝时按 production_runtime_withdrawn 清空浮窗(ca0020856)。 不可变内容生命周期 + 跨 host Test 验收(0f5bf8525);Test 与提升共用同一 CAS artifact store(8c2d0f95b);ZIP 目录白名单与存储失败上报(02ce3dd9c);就绪内容选择与撤下(de6ead823);realtime Test 生命周期与授权租约(5eb9df7bf);生产 API 提升 + canary gate + 证据端点(ca0020856)。 无 runtime 变更。 活动管理/内容库/发布记录重构(0f5bf8525)、上传与撤下(02ce3dd9cde6ead823)、活动操作改为居中弹窗(463752395)、promote/unpublish/restore 路由与 history 双环境合并、CMS authoring origin/token(ca0020856)。 3 个 migration20260909101013_cms_content_lifecycle.sql(新建 touchpoints schema,activities / content_versions / artifact_bytes / production_deployments / content_revocations 等)、20260909140436_cms_restore_host_evidence.sql20260914101138_touchpoint_test_context_realtime.sql0f5bf85255eb9df7bf)。 无。
XL管理员发起的 GDPR 账号删除(冻结 → 计费/内容处理 → 确认)+ 对账 CronJob

生产 Admin 可以对指定账号发起不可逆删除:API 侧新增 account-erasure 领域(freeze / billing / content / confirm / processors 步骤、指标、状态机与 7 天 deadline),并给 auth、billing、媒体、协作、资源、workspace 等模块补删除语义;Link 侧支持账号数据的删除/匿名化;API chart 新增 account-erasure 对账 CronJob。之后修正了确认邮件文案。

Author:open-design-crew[bot](主实现)、nettee(邮件修正)

  • 39abf116f feat(api): add admin-initiated GDPR account erasure (#2001)
  • 0d31e2d62 fix(api): update account erasure confirmation email (#2034)
无。 新增 services/api/src/account-erasure/*(路由、steps、指标、suppressions)与 app/auth/billing/media/collab/resources/workspaces 的删除语义(39abf116f);确认邮件修正(0d31e2d62)。含部署侧 deploy/charts/api/templates/account-erasure-reconciliation-cronjob.yaml services/link/internal/repositories/postgres.go 支持删除/匿名化(39abf116f)。 用户页账号删除表单、状态标签、恢复 UI、审计动作目录与 admin router 接线(39abf116f)。 1 个 migration20260914115313_account_erasure.sql(新建 account_erasure_operationsapp_users.status 增加 deleting/deleted、access_revoked_at;account/user/users deletedAt;team_project_catalog.deleted_atmedia.assets.deleted_at/object_deleted_at;image_tasks 增加 cancel_requested_at)。 无。
L长上下文(>272K input tokens)分档计费 + OpenAI GPT 价格同步

OpenAI 系模型(gpt-6-astra 家族、gpt-5.4 / 5.5 / 5.6 系列)在公开定价与路由目录中引入 long_context 档位:单次请求输入超过 272K token 时按更高费率(例如 gpt-6-astra input 10 → 20、output 50 → 75 每 1M token;gpt-5.6-luna input 1 → 0.2 基础价 + 0.4 长上下文价)。Link 计费与成本核算按档位取价,API 在公开模型价格响应里输出 longContext,Web 价格页展示档位说明。属于直接改变用户账单金额的变更。

Author:Marc Chan

  • af7415d35 feat(billing): add Astra billing and cost tiers above 272K input tokens (#1983)
  • 77054ca19 feat(billing): sync GPT prices and long-context tiers (#2024)
模型价格页与文案增加长上下文档位(af7415d3577054ca19 的 Web 部分;77054ca19 另含浏览器回归用例)。 公开模型价格 schema/响应新增 longContext 及字段一致性校验(af7415d35)。 internal/catalog/pricing.gointernal/usage 按 long_context 档位计费,并修正 IsExplicitlyZeroCost(零基础价 + 付费长上下文不得绕过钱包准入)(af7415d35)。 无。 无 schema/migration。 provider_openai.jsonpublic_pricing.jsondb/seeds/seed-model-routing-catalog.sqldata/scripts/build_model_json.py 新增 long_context 档位并同步 GPT 价格(af7415d3577054ca19)。
MWeb 端活动浮窗/控制台活动的展示行为

面向登录用户的 touchpoint 浮窗行为调整:控制台活动不再带测试控件、Test/Production 共享同一 realtime 生命周期、Test 模式下允许已注册活动导航、礼包入口与弹窗宽度对齐设计、控制台活动按「每用户每活动一次」展示,并按设计稿调整触发器位置。全部由生产运行时决策驱动,属于 Web 侧展示层收敛。

Author:Caprika

  • fbb3c53de fix(web): display dashboard campaigns without test controls (#1970)
  • a88eb8651 fix(web): allow registered campaign navigation in Test mode (#1993)
  • 2e589a9d1 fix(web): align campaign gift entry and preserve popup width (#1994)
  • 8bc9d356e fix(web): share realtime campaign lifecycle across Test and Production (#2009)
  • eb27bf64f feat(web): show the console campaign once per user per activity (#2039)
  • 92df166e0 style(web): align the console campaign trigger with the design spec (#2042)
fbb3c53de 仪表盘活动去掉测试控件;a88eb8651 Test 模式活动导航;2e589a9d1 礼包入口/弹窗宽度;8bc9d356e Test 与 Production 共享 realtime 生命周期;eb27bf64f 每用户每活动仅展示一次(新增 campaign-dismissal.ts);92df166e0 触发器与设计稿对齐。 无(对应 API 行为在本表 CMS 一行)。 无。 无。 无。 无。
MPlacement 归因透传到订阅/充值结账与回执

Open Design 活动归因链路新增 placementId:结账、订阅、升级请求与 Stripe metadata、pending 订阅升级证据都会携带 placement,充值/团队订阅路径同时保留原有归因字段。影响付费转化归因数据与后续对账分析。

Author:Caprika

  • 5c25f8b65 feat(billing): 透传 placement 订阅与充值支付归因 (#1987)
billing-client.tsopen-design-attribution.ts 透传 placement(5c25f8b65)。 billing core/http 的 checkout、subscription、team subscription、upgrade schema 与 pending 证据新增 placementId,openapi.json 同步(5c25f8b65)。 无。 无。 无。 无。
MAdmin 巡检(patrol)告警与小时报告多副本重复修复

amr-admin 双副本各自启动定时器,导致同一小时写入两条巡检报告、告警重复发送。修复后告警按签名去重(alert_sent_signatures),报告写入改为按 (env, reported_hour) upsert 并加唯一索引,历史重复行在同一次迁移里折叠。属于运营可信度修复。

Author:open-design-crew[bot]

  • 15de6f1b2 fix(admin): stop patrol alerts and reports duplicating across replicas (#1928)
无。 无。 无。 patrol client、alert-runner、alert-state、feishu-webhook、patrol-alert-scheduler 去重改造(15de6f1b2)。 2 个 migration20260910094000_add_alert_sent_signatures.sql20260910094001_add_patrol_reports_hourly_key.sql(含历史重复折叠 + 唯一索引)。 无。
M运行时配置变更触发 Pod 重载(Helm checksum 注解)

API、Admin、Link 的 Deployment 模板加入配置校验和注解,ConfigMap/Secret 运行时配置变化会触发滚动重启;发布配置时会出现 Pod 重启,属于发布流程可预期行为变化(Web chart 未改)。

Author:nettee

  • 4e54b8ff6 fix(deploy): reload pods on runtime config changes (#2012)
无(web chart 未改)。 deploy/charts/api/templates/deployment.yaml4e54b8ff6)。 services/link/charts/link/templates/deployment.yaml4e54b8ff6)。 deploy/charts/admin/templates/deployment.yaml4e54b8ff6)。 无。 无。
SAPI:返回被锁定的默认 Team

修复 owner 的默认 Team 被锁定时 GET /workspaces/current 的返回行为。

Author:lefarcen

  • c9daae41c fix(api): serve an owner's locked default Team from GET /workspaces/current (#2033)
无。 workspaces/core.tsworkspaces/postgres.tsworkspaces/routes.tsc9daae41c)。 无。 无。 无。 无。
SAdmin 控制台:亚分金额精度与共享表单组件

金额展示保留亚分精度(不再把 $0.004 之类抹成 0);同时把重复的表单/空态实现抽成共享组件(FormField、EmptyTableRow、InfoHint),覆盖会员、优惠券、消息中心、模型限额、退款、风控、工作区等页面。

Author:nettee

  • 7cbaeb015 fix(admin): preserve sub-cent amount precision (#1989)
  • 879e4079b refactor(admin): extract shared FormField and EmptyTableRow (#2051)
无。 无。 无。 7cbaeb015 金额格式化;879e4079b 组件抽取(行为等价重构)。 无。 无。
SLink:内部模型目录暴露 provider 名称

内部公开模型目录的 projection 与响应增加 provider 名称字段,供内部消费方展示/排障使用。

Author:lbjzz-hash

  • e736d1b3d fix(link): expose provider names in internal model catalog (#2049)
无。 无。 internal/catalog/projection.gointernal/server/internal_public_models.goe736d1b3d)。 无。 无。 无(未改 data/ 与 db/seeds)。
SCLI 客户端(不在本次四个服务范围内)

range 内包含两处 CLI 变更,但它们不随 Web/API/Link/Admin 镜像发布;若 CLI 有独立发布通道需单独处理。

Author:Ray Xi、open-design-crew[bot]

  • b75badfe3 fix(cli): preserve compaction continuation session and terminal state (#1952)
  • bb544d210 feat(cli): isolate model routing controls in evaluation entry (#1991)
无。 无。 无。 无。 无。 无。
SCI / 文档 / 规格归档(无 runtime 行为变更)

规格归档、文档校准与 CI 镜像来源调整。注意:Archive old specs (#2006) 虽触及 services/api、services/link、data/、db/seeds、db/schema 等路径,但内容是把 spec 引用替换为 ADR/现有文档的注释与 metadata.source 文案,无行为变更,不会改变 catalog 数据或服务逻辑;fix(ci): pull MinIO images from quay.io (#1988) 只改 CI 与本地容器镜像来源。

Author:nettee、github-actions[bot]、open-design-crew[bot]

  • 7f90ecef6 chore: archive old specs (#1896)
  • ecf3d3ddd chore: archive old specs (#1981)
  • e940830d1 fix(specs): archive old changes regardless of status (#1998)
  • d7c71485e Archive standalone change spec files (#2010)
  • 4d24db21a chore: archive old specs (#2023)
  • 6757faf2c chore: archive old specs (#2032)
  • e79b4324b chore(docs): remove obsolete QA records (#2007)
  • d65e7f81b docs: reconcile code evolution drift (#1982)
  • 497e7205e fix(ci): pull MinIO images from quay.io (#1988)
  • fa83eca6c Archive old specs (#2006)
无。 无 runtime 变更(fa83eca6c 仅注释)。 无 runtime 变更(fa83eca6c 仅注释)。 无。 不改动 db/migrations,不影响 migration workflow。 不改动 db/seeds 的 SQL/数据语义,不影响 catalog workflow。

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

以下内容在各维度生产发布点之前,已在生产运行,本次重新发布不会再次改变它们。四个服务以 EKS Pod 实态为基线,DB migration 与 Catalog 以 workflow 记录为基线;因此同一 commit 可能在某一维度已生效、在另一维度仍待发布(例如 0f5bf8525 的 Web 部分已上线,API/Admin/DB 部分仍在本次范围内)。

发布建议

  1. Migration 判断:必须先跑 migration。发布点 eecb4434d 之后共有 6 个待执行 migration:3 个 CMS(20260909101013_cms_content_lifecycle.sql20260909140436_cms_restore_host_evidence.sql20260914101138_touchpoint_test_context_realtime.sql)、2 个 patrol(20260910094000_add_alert_sent_signatures.sql20260910094001_add_patrol_reports_hourly_key.sql)、1 个账号删除(20260914115313_account_erasure.sql)。顺序约束:migration 必须在 CMS 提升之前完成(生产库当前没有 touchpoints schema,提升第一次写入即失败,且失败是静默的);同一 run 会连带执行 3 个非 CMS migration(patrol×2 + account_erasure),需要各自 owner 先确认。range 内无被回退的 migration。执行方式:gh workflow run deploy-db-migrations-prod.yml --ref main,不要用服务部署 workflow 跑迁移。
  2. 服务发布顺序(依据 CMS 生产发布 runbook:镜像先于 GitOps、Secrets 先于 GitOps、migration 先于提升): ① DB migration(6 个)→ ② Catalogdeploy-model-routing-catalog-prod.yml,2 个功能性 commit)→ ③ APIdeploy-api-eks-prod.yml,15 commits,含 CMS 生产提升与 canary gate)→ ④ Admindeploy-admin-eks-prod.yml,9 commits;注意 Admin 不在 amr-vela-deploy 脚本里,需单独触发)→ ⑤ Webdeploy-web-eks-prod.yml,11 commits)→ ⑥ Linkdeploy-link-eks-prod.yml,8 commits,与 catalog 长上下文定价配套;catalog 先上、Link 后上时旧 Link 会忽略 long_context 字段,务必确认两者同批完成)。 前置条件(非代码):Secrets Manager 4 个属性、生产 API 身份对 Test 桶 cms-cas/ 前缀的读权限 —— 缺任何一项都会造成启动失败或证据读取 404。
  3. 数据 seed / catalog 判断:catalog 变更(public_pricing、provider_openai、seed-model-routing-catalog.sql)由 deploy-model-routing-catalog-prod.yml 的 plan/apply 步骤覆盖,不需要额外手工 seed;CMS 与 GDPR 不经过 catalog workflow,走各自的 migration。发布前请对 catalog 变更单独跑一次 dry-run,确认 GPT 价格与 long_context 档位按预期写入。
  4. 发布后观测
    • API 存活amr-api 双副本 Ready 且无重启循环;TOUCHPOINT_ENVIRONMENT=productionCMS_ARTIFACT_STORE_MODE/_REGION/_BUCKET/_ROLE 任一缺失会导致 crash loop(配置错误应回滚而不是现场调试)。
    • CMS 提升链路:Admin /activities 走完导入 → 构建 → Test → 验收 → Promote;关注 promote 请求耗时是否逼近生产 API 证据客户端 5s 硬编码超时;history 页应同时显示 Test 生命周期与生产部署。
    • Canary:白名单账号能在生产看到 console placement,非白名单账号看不到;被撤下的账号收到 410 production_runtime_withdrawn 后浮窗立即清除。
    • 计费:Link long_context 档位计费与成本指标,重点核对 >272K token 请求的实际扣费与钱包准入(含零基础价 + 付费长上下文组合);Web 价格页展示与 public_pricing 一致。
    • 账号删除:erasure 指标与 account_erasure_operations 状态推进、对账 CronJob 正常运行、7 天 deadline 告警。
    • patrol:每环境每小时只有一条报告,告警不再重复推送。
    • Link:内部模型目录响应包含 provider 名称字段。

备注:所有 workflow、commit、compare range 均为可点击 GitHub 链接。四个服务的 compare range 基于 EKS Pod 观察到的 BASE(web ae4b84f76、api b6a6adafb、link/admin eecb4434d),DB migration、Catalog 的 compare range 基于各自 workflow 最近成功运行的 head_sha,未统一使用最旧基线,也未用 workflow SHA 替代 Pod 实态。四个服务最近的 workflow 记录与 Pod 实态完全一致(见上方审计对照)。