AMR 生产发布影响报告

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

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

Web、API、Link、Admin 的发布点来自 Grafana / Prometheus 观察到的 Ready EKS Pod 镜像(namespace nexu,datasource prometheus,由 kube-state-metrics 采集,最旧样本 15 秒内);DB migration 的发布点来自对应 Forgejo workflow 最近一次成功运行。四个服务均已校验:同一服务所有 Ready Pod 的 commit 与 digest 一致、副本数 spec = updated = available(无滚动中 / 回滚中的混合状态)、Ready Pod 数等于 spec 副本数、镜像 tag 可解析出 40 位 SHA、digest 完整、无终止中 Pod。四个服务的 workflow 最近成功记录与 Pod 实态全部一致(仅作审计对照,不用于判断生产版本)。 feature 表里只列出发布点之后的变更;发布点之前的内容属于已生效,归入「已在生产生效」一节。目标 commit 为 7ecafcf0a(fix(api): batch Coding Plan notifications outside settlement transactions (#304),2026-10-15 14:30,mrcfps),本地 main 与 origin/main 相同。

本轮五个发布点不再对齐:DB、API、Link 都已在 7ecafcf0a,Web 与 Admin 仍停在 83b616f67。差异来自 2026-10-15 14:37:47Z–15:22:43Z 的一次发布(mrcfps 手动触发):run #5498(DB,14:37:47Z)→ run #5499(API,14:42:56Z)→ run #5537(Link,15:22:43Z),把这三个维度推到 7ecafcf0a;Web 与 Admin 没有参与这次发布。与上一份报告(2026-10-15 21:41 本地,目标 89706716e,五维全在 83b616f67)相比:上一份报告要求发布 API(承载 #300 的 viewer bridge runtime)与 Link(#301),这两个动作已完成;随后 origin/main 又前进 2 个 commit(42321ac81 #303、7ecafcf0a #304),其中 #304 已随 API + DB 上线、#303 的 Link + DB 部分已上线、Admin 部分仍未发布。因此本轮真正待发布的只剩 Admin 一个维度。

Web · EKS Pod 实态
Workload:nexu/amr-web · container web
观察时间:2026-10-16T02:01:09Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-web:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 1 秒前)
Ready Pods:2 / 2(updated 2,available 2;终止中 Pod 0 个)
实际 commit:83b616f67
镜像 digest:sha256:77c15b24ea6a87a08e5eab39be3cf83637f4d5789b8e5df8e27e4344fc3cd6b0
Pod:amr-web-995bb7d8f-xzfzt, amr-web-995bb7d8f-pjv8h
Workflow 审计(仅供参考):deploy-web-eks-prod.yml 最近成功 run #5300 @ 2026-10-15T09:16:49Z,commit 83b616f67;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(83b616f67...7ecafcf0a):4 commits;触及该服务目录的变更 496ecae29(#300)
发布点之后 4 个 commit 里只有 496ecae29(#300)触及 apps/web/,且只新增两个测试文件(apps/web/tests/unit/share-comment-identity.test.ts、apps/web/tests/browser/shared-artifact-comment-identity.spec.ts),无 runtime 变更:该 commit 的生产改动落在此镜像不消费的 packages/shared/src/share-viewer-bridge-runtime.ts(运行时脚本文本与 revision 常量,只由 API 的 services/api/src/resources/routes.ts 注入到公开快照 HTML;apps/web 源码只用 @vela/shared 里的桥接契约常量,不引用 runtime body),已随 API 的 7ecafcf0a 生效。因此 Web 不需要重新发布。
API · EKS Pod 实态
Workload:nexu/amr-api · container api
观察时间:2026-10-16T02:01:09Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-api:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 5 秒前)
Ready Pods:2 / 2(updated 2,available 2;终止中 Pod 0 个)
实际 commit:7ecafcf0a
镜像 digest:sha256:dc606fc942d09c49b503756b68178dad948b17ec93e74aae7e01e5c258b3cdb2
Pod:amr-api-7d4d8469c-kzsp2, amr-api-7d4d8469c-hb8xr
Workflow 审计(仅供参考):deploy-api-eks-prod.yml 最近成功 run #5499 @ 2026-10-15T14:42:56Z,commit 7ecafcf0a;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(7ecafcf0a...7ecafcf0a):0 commits;触及该服务目录的变更 0 个
API 发布点已经是 origin/main,7ecafcf0a...7ecafcf0a 为 0 个 commit,services/api/ 无任何待发布变更 → API 不需要发布。它已经承载了 #300 的 viewer bridge runtime revision 24 → 25 与 #304 的结算 outbox 化,见「已在生产生效」。
Link · EKS Pod 实态
Workload:nexu/amr-link · container link
观察时间:2026-10-16T02:01:09Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-link:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 10 秒前)
Ready Pods:8 / 8(updated 8,available 8;终止中 Pod 0 个)
实际 commit:7ecafcf0a
镜像 digest:sha256:0128f72a39214b84110296fc8e9cdfc8f75cdb25e8d0ee6b6c79be5b9b61181c
Pod:amr-link-f47bf8b99-vtvmq, amr-link-f47bf8b99-vd425, amr-link-f47bf8b99-g2gfb, amr-link-f47bf8b99-rhbx7, amr-link-f47bf8b99-znjcx, amr-link-f47bf8b99-h7qr2, amr-link-f47bf8b99-rnk7d, amr-link-f47bf8b99-lkpkq
Workflow 审计(仅供参考):deploy-link-eks-prod.yml 最近成功 run #5537 @ 2026-10-15T15:22:43Z,commit 7ecafcf0a;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(7ecafcf0a...7ecafcf0a):0 commits;触及该服务目录的变更 0 个
Link 发布点也已经是 origin/main,7ecafcf0a...7ecafcf0a 为 0 个 commit,services/link/ 无任何待发布变更 → Link 不需要发布。#301 与 #303 的 Link runtime 都已在这次 8 / 8 Ready 的滚动中上线(spec = updated = available = 8,无终止中 Pod)。
Admin · EKS Pod 实态
Workload:nexu/amr-admin · container admin
观察时间:2026-10-16T02:01:09Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-admin:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 15 秒前)
Ready Pods:2 / 2(updated 2,available 2;终止中 Pod 0 个)
实际 commit:83b616f67
镜像 digest:sha256:9397d8ae11028499ccf4f7b3f3edaa2bc612248a9572d0891d28958b4f433245
Pod:amr-admin-7f96f9f9dd-zbhzf, amr-admin-7f96f9f9dd-42p79
Workflow 审计(仅供参考):deploy-admin-eks-prod.yml 最近成功 run #5299 @ 2026-10-15T09:09:35Z,commit 83b616f67;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(83b616f67...7ecafcf0a):4 commits;触及该服务目录的变更 42321ac81(#303)
发布点之后 4 个 commit 里有 1 个触及 apps/admin/:42321ac81(#303)—— 即 feature 表第 1 行,Admin 是本次唯一需要发布的服务。Admin 仍停在 83b616f67(run #5299 是 2026-10-15T09:09:35Z 的那次),因此同模型多 backend 的影子规则目前在后台配不出来(Link 与 DB 已具备该能力)。
DB migration · workflow 记录
最近成功:run #5498 @ 2026-10-15T14:37:47Z(trigger workflow_dispatch by mrcfps,started 2026-10-15T14:38:21Z)
发布点 commit:7ecafcf0a
本次新增(7ecafcf0a...7ecafcf0a):0 commits,其中触及 db/migrations/ + db/schema/ 的变更 0 个(0 份新 migration)
数据源:Forgejo run 列表(tea api /repos/core/amr/actions/runs),不使用 GitHub Actions。基线 run #5498(2026-10-15T14:37:47Z,mrcfps 手动触发)已把 db/migrations/20261015125416_multi_backend_shadow.sql(#303,影子规则主键扩到 backend)与 #304 的两份 outbox migration(20261015132325_workspace_usage_notification_outbox.sql、20261015135531_workspace_usage_notification_member_scope.sql)应用到生产;发布点之后到 HEAD 没有任何 migration / schema 变更。

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

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

结论:五个维度里只有 Admin 有真正待发布内容(1 个 commit:42321ac81 #303 的 Admin 部分),发布 Admin 即可补齐「同一 public model 多个影子 backend」这个 feature 的最后一个代码步骤;Web、API、Link、DB migration 四个维度本轮不需要动(API 与 Link 已在 origin/main;Web 发布点之后的唯一 commit 只含测试文件;DB 没有待应用的 migration)。本轮没有新 migration、没有必须的配置变更:影子多目标配置项由 Admin 升级后的操作步骤产生,不是发布前置配置。

Feature / Author / Commits Web API Link Admin DB schema / migration
M同一 public model 支持多个影子 backend(#303)

影子规则的唯一键从 public model + 请求协议 扩为 public model + 请求协议 + backend,同一个 public model 现在可以对多个 backend 分别配置影子规则:修复前添加第二个目标会被判定为「该模型已有影子规则」。每条规则覆盖 Chat Completions / Responses / Messages,各 backend 独立采样(采样率是各自的概率,不是合计 100% 的流量权重),每路影子调用独立 body / deadline / runtime lease,执行前只复核对应目标的规则;单路失败、规则删除或变更不影响其他目标,影子流量仍然不进入用户账务。

本次发布的范围(重要):该 feature 的 Link runtime 与 DB 主键已经在上一次 14:37:47Z–15:22:43Z 的发布中生效(Link 已在 7ecafcf0a、DB 基线也是 7ecafcf0a),本次待发布的只有 Admin 配置面:影子策略编辑器与校验放宽到按 backend 去重、中英文文案改写、配置读取排序补 backend_model_id。按 PR 自带的部署顺序 Atlas 迁移 → 所有 Link 副本升级 → Admin 升级 → 添加多目标规则,前两步已完成,Admin 升级是唯一剩余步骤。

必要操作与先后关系(仅该 feature 需要,且不是配置项):在 Admin 升级完成之前不要保存多目标配置——旧 Admin 的去重键仍是 model + kind,界面上添加第二个 backend 会直接被拒(提示「该模型已有影子规则」),其保存路径又是「全量删除 + 重插」,一旦存在多目标配置就会被改写成单目标。Admin 升级后再由运维/模型负责人逐个 model 添加第二个 backend 规则并观察采样与容量。

Author:Liu Yi

  • 42321ac81 feat(shadow): 支持一个 public model 多个影子 backend (#303)
无。(该 commit 不改 apps/web/) 无。(该 commit 不改 services/api/) 无待发布内容。internal/shadow/executor.go、internal/catalog/shadow.go(ShadowRules 变为 map[model+kind][]ShadowRule、去重键加 backend、随机化占槽顺序)、internal/repositories/shadow.go(读取按 backend 排序)等改动已在 Link 发布点 7ecafcf0a 生效,见「已在生产生效」;Link 本轮无待发布 commit。回滚口径提醒:若要回滚 Link,须先恢复为每 model / 协议至多一个目标并确认刷新,仅关闭总开关不够。 本次需要发布的就是这里。app/[locale]/(protected)/models/shadow-testing/shadow-policy-editor.tsx:新增规则时的重复判定由 public_model_id 单键改为 public_model_id + backend_model_id,提示由 duplicateModel 改为 duplicateTarget;lib/model-configuration.ts:shadowPolicySchema.superRefine 的去重 key 改为 [public_model_id, request_kind, backend_model_id];lib/server/admin/model-configuration-repository.ts:配置读取 ORDER BY 增加 backend_model_id(保持 revision / signature 稳定);i18n 中英文案(移除提示改为「仅停止此后端」、说明改为「可为多个后端分别添加规则、各后端独立采样、同一请求可发起多次影子调用,受可用并发容量限制」);test/shadow-policy.test.tsx 扩展多目标增改删与重复校验回归。Admin 必须发布。 无待发布内容。db/migrations/20261015125416_multi_backend_shadow.sql(DROP CONSTRAINT model_shadow_rules_pkey + ADD PRIMARY KEY (public_model_id, request_kind, backend_model_id),对应的 db/schema/link.hcl 主键同步扩大)已由 DB 基线 run #5498 应用;发布点之后没有新的 migration / schema 变更,发布 Admin 前不需要再跑 migration。
S分享评论持久身份解析(viewer bridge runtime 24 → 25,OPEND-3516)—— 本次无待发布服务

公开分享页里由 API 注入产物 HTML 的 bridge runtime 现在认得客户端写入的持久评论身份(data-od-comment-id="UUID" → cmt:UUID + 精确选择器,要求节点自身带该属性且全文档唯一,否则判「找不到」而不猜路径 / 文本),runtime revision 由 24 升到 25。该行为变更已随 API 的 7ecafcf0a 生效(上一份报告的发布建议已执行)。

为什么仍在表里:Web 维度的发布点(83b616f67)之后确实还有这个 commit,所以它的 Web 列必须交代清楚——该 commit 在 apps/web/ 只新增两个测试文件,发布 Web 不会带来任何行为变化,本轮不需要为它发布 Web。Author:zhangchi(Co-authored-by a1chzt)。

  • 496ecae29 fix(viewer): resolve durable comment identities (OPEND-3516) (#300)
只有测试:apps/web/tests/unit/share-comment-identity.test.ts(单测)与 apps/web/tests/browser/shared-artifact-comment-identity.spec.ts(受控 Chromium,HTTP 由 fixture 控制)。测试不进镜像,无 runtime 变更。 无待发布内容。运行时改动落在 packages/shared/src/share-viewer-bridge-runtime.ts(运行时脚本文本与 revision 常量,由 API 的 services/api/src/resources/routes.ts 注入到公开快照 HTML;apps/web 源码不引用 runtime body),已随 API 的 7ecafcf0a 生效(API 发布点即 origin/main)。 无。 无。 无 schema / migration 变更(该 commit 明确无 migration)。

本轮没有维度外的通道变更需要发布:origin/main 相对最旧发布点(83b616f67)的 4 个 commit 全部落在五元组内(apps/web、packages/shared、apps/admin、services/link、services/api、db/),没有 CLI、CI、tools、GitOps 或外部仓库改动。

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

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

发布建议

  1. Migration 判断:本轮不需要跑 migration。DB 发布点已经是 origin/main(deploy-db-migrations-prod.yml run #5498,2026-10-15T14:37:47Z),#303 的主键迁移与 #304 的两份 outbox migration 都已应用;feature 表两个 feature 在发布点之后都不读写新表。发布 Admin 时不要顺带重跑 migration workflow。
  2. 发布范围(本轮只有 Admin 需要动):
    • 必须发布 Admin:deploy-admin-eks-prod.yml,带上 7ecafcf0a(Admin 待发布 1 个 commit,#303 的多 backend 影子配置面)。这是本轮唯一需要执行的发布。
    • Web / API / Link 不需要发布:API 与 Link 已在 7ecafcf0a(待发布 0 个 commit);Web 发布点之后的唯一 commit 只新增测试文件,重发 Web 不会带来任何行为变化,不要为了「版本号对齐」空发布。
    • DB migration 不需要执行(见上一条)。
  3. 顺序与依赖:#303 自带部署顺序 Atlas 迁移 → 所有 Link 副本升级 → Admin 升级 → 添加多目标规则,前两步已完成(DB 7ecafcf0a、Link 8 / 8 在 7ecafcf0a),因此本轮只剩 Admin 升级;升级完成后才由运维 / 模型负责人添加第二个 backend 的影子规则。在 Admin 升级完成前不要保存多目标配置(旧 Admin 仍按 model + kind 去重,添加第二个 backend 会被拒;其保存路径为「全量删除 + 重插」,会把已存在的多目标配置改写成单目标)。影子总开关、采样率等由 Admin 管理,本报告不涉及配置变更,也没有本轮必须提前准备的配置项。
  4. 发布后观测:
    • Pod 实态:Admin 应从 83b616f67 滚动到 7ecafcf0a、2 / 2(spec = updated = available),所有 Ready Pod 同 commit、同 digest、无终止中 Pod。Web(83b616f67,2 / 2)、API(7ecafcf0a,2 / 2)、Link(7ecafcf0a,8 / 8)与 DB 基线(7ecafcf0a)本轮不应发生变化。
    • #303 Admin 配置面回归:同一 public model 可以分别对 backend A / backend B 新增、编辑、删除影子规则,三个请求协议各自独立;相同 model + protocol + backend 仍必须拒绝重复,中文提示「该模型已配置此后端的影子规则…」(英文 duplicateTarget);移除提示已改为「仅停止此后端」;保存后 revision 变化、重新打开页面规则顺序稳定(读取已按 backend_model_id 排序),另一名管理员并发保存时仍返回配置冲突而不是静默覆盖。回滚口径:Admin 回滚只影响配置面,已扩大的影子规则主键不需要回退。
    • #303 影子链路(Link 已在生产):确认多目标规则被 Link 接受并各自独立采样;观测影子调用占槽(每进程 4 槽上限、容量不足即丢弃并记录)与随机化占槽是否让后置目标不再饥饿;确认影子流量仍不进入用户账务、单路失败不影响其他目标与正式调用。
    • 本轮新上线项抽查(上一批次已生效):#304 结算 outbox —— 观测 outbox 队列数量 / 最老年龄、flush 错误率与 outbox bloat / autovacuum,确认结算事务里不再出现 pg_notify 锁等待,API 连接数每进程最多 +1;#301 Link 失败日志出现 thinking_parameters 四段摘要且成功请求日志不变长;#300 分享页注入脚本带 data-share-viewer-bridge="25"、现有评论路径行为不变。

备注:本报告所有 workflow、commit、PR 与 compare range 均指向 Forgejo code.powerformer.net/core/amr,不使用 GitHub Actions;workflow 链接指向可触发页面(actions?workflow=…)。四个服务的 compare range 基于 Grafana / Prometheus 观察到的 Ready Pod 镜像 commit(而非 GitOps / workflow 最近成功记录);DB migration 的 compare range 基于 deploy-db-migrations-prod.yml 最近一次成功运行的 commit_sha;四个服务维度另附对应 deploy-*-eks-prod.yml 最近成功记录作为审计对照,本次四者与 Pod 实态全部一致。口径固定为五元组:Web / API / Link / Admin / DB migration。