AMR 生产发布影响报告
当前生产发布点(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 一个维度。
nexu/amr-web · container webkube_pod_container_info,image 过滤 amr-web:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 1 秒前)83b616f67sha256:77c15b24ea6a87a08e5eab39be3cf83637f4d5789b8e5df8e27e4344fc3cd6b0amr-web-995bb7d8f-xzfzt, amr-web-995bb7d8f-pjv8h83b616f67;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)nexu/amr-api · container apikube_pod_container_info,image 过滤 amr-api:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 5 秒前)7ecafcf0asha256:dc606fc942d09c49b503756b68178dad948b17ec93e74aae7e01e5c258b3cdb2amr-api-7d4d8469c-kzsp2, amr-api-7d4d8469c-hb8xr7ecafcf0a;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)7ecafcf0a...7ecafcf0a):0 commits;触及该服务目录的变更 0 个nexu/amr-link · container linkkube_pod_container_info,image 过滤 amr-link:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 10 秒前)7ecafcf0asha256:0128f72a39214b84110296fc8e9cdfc8f75cdb25e8d0ee6b6c79be5b9b61181camr-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-lkpkq7ecafcf0a;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)7ecafcf0a...7ecafcf0a):0 commits;触及该服务目录的变更 0 个nexu/amr-admin · container adminkube_pod_container_info,image 过滤 amr-admin:prod-[0-9a-f]{40} 且仅取 Ready Pod;最旧样本 15 秒前)83b616f67sha256:9397d8ae11028499ccf4f7b3f3edaa2bc612248a9572d0891d28958b4f433245amr-admin-7f96f9f9dd-zbhzf, amr-admin-7f96f9f9dd-42p7983b616f67;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)workflow_dispatch by mrcfps,started 2026-10-15T14:38:21Z)7ecafcf0a此次发布真正新增的 feature 和影响面
| Feature / Author / Commits | Web | API | Link | Admin | DB schema / migration |
|---|---|---|---|---|---|
|
M同一 public model 支持多个影子 backend(#303)
影子规则的唯一键从 本次发布的范围(重要):该 feature 的 Link runtime 与 DB 主键已经在上一次 14:37:47Z–15:22:43Z 的发布中生效(Link 已在 必要操作与先后关系(仅该 feature 需要,且不是配置项):在 Admin 升级完成之前不要保存多目标配置——旧 Admin 的去重键仍是 Author:Liu Yi |
无。(该 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 现在认得客户端写入的持久评论身份( 为什么仍在表里:Web 维度的发布点( |
只有测试: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 重新发布,只分析各自基线之后的净新增。
- 本轮新出现的已生效项(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,上线了 2 个 commit:7ecafcf0a(#304,mrcfps)Coding Plan 用量结算不再在结算事务里发 PostgreSQLNOTIFY(消除提交时的全局通知锁竞争),改为把 member 合并的 outbox 唤醒行与持久事件一起落库,再由独立 worker 池批量投递(一次最多 100 行、SKIP LOCKED、整批后让出 1 ms、部分批 / 失败等 1 s、每 30 s 采样积压并只记录非空队列);结算事实、每个持久事件与幂等性保持不变,付费钱包 / 计费与其他通知仍走即时路径。已随 API 生效,其两份 migration(20261015132325_workspace_usage_notification_outbox.sql、20261015135531_workspace_usage_notification_member_scope.sql)已由 DB 那次 apply 生效;worker 每进程最多新增 1 条连接(PR 内生产快照 147 / 1702 连接,API 2 副本 + 25% maxSurge)。42321ac81(#303,Liu Yi)的 Link 部分:ShadowRules由map[model+kind]ShadowRule改为map[model+kind][]ShadowRule(去重键加 backend、随机化占槽顺序、ShadowTarget按目标校验)、仓库读取与ShadowConfiguration加载按 backend 排序、执行器支持每目标独立 body / deadline / lease —— 已随 Link 生效;同 commit 的 DB 部分(影子规则主键扩到 backend)也已生效。其 Admin 部分仍是本轮唯一待发布内容,即 feature 表第 1 行。
- 上一份报告要求、现已完成的发布:上一份报告(2026-10-15 21:41 本地,目标
89706716e)给出的建议是「必须发布 API(#300 的 viewer bridge runtime 载体)+ 必须发布 Link(#301)」。现在 API 与 Link 都已在7ecafcf0a(≥ 那两个 commit),建议已执行完毕: - Web(
83b616f67及之前已生效):分享页(/artifact/*)、评论输入态锁定(#279)、固定蓝色评论光标(#280)等已随 2026-10-15T09:16:49Z 的 run #5300 上线。本轮 Web 侧没有需要发布的内容(发布点之后唯一 commit 只含测试)。 - API(
7ecafcf0a及之前已生效):分享 / 跨站登录 / 测量端点、计费预检隔离与新funding-check路由(#276)、#300 的 viewer bridge runtime revision 25、#304 的 outbox 化结算通知均已上线。本轮 API 侧无待发布内容。 - Link(
7ecafcf0a及之前已生效):影子测试(#266、#303)、temperature 兼容名单(#275)、流式可靠性修复(#155 / #295 / #269 / #179 / #138)、会员并发 finalized key TTL 30 天 → 1 小时(#297,注意旧 key 不会因应用升级自动缩短,需按docs/ops/membership-finalized-retention.md治理)、thinking 失败诊断(#301)均已上线。本轮 Link 侧无待发布内容。 - Admin(
83b616f67及之前已生效):影子测试首版策略界面(#266)、模型输入 / 输出预算配置与校验修正(#274 / #272)等已上线。Admin 与origin/main的差距只有 #303 的配置面改动。 - DB migration(
7ecafcf0a已生效,run #5498 @ 2026-10-15T14:37:47Z,triggerworkflow_dispatchbymrcfps):本次 apply 把83b616f67之后的三份 migration 应用到了生产 —— 影子规则主键扩到 backend(#303)+ outbox 两张表 / 成员一致性约束(#304)。发布点之后到 HEAD 没有任何 migration / schema 变更。 - 更早批次:2026-10-15T09:01:56Z–09:16:49Z 的一次集中发布把五个维度同时推到
83b616f67(run #5288 DB 09:01:56Z → run #5297 Link 09:07:25Z → run #5298 API 09:09:23Z → run #5299 Admin 09:09:35Z → run #5300 Web 09:16:49Z),上线内容见 2026-10-15 16:13 与 21:41 两份报告(分享 / 评论 / 跨站登录、影子测试首版、Link 流式可靠性修复等),已全部生效,本报告不重复展开。 - 范围内已回退(净变更归零):Web
83b616f67...7ecafcf0a、API7ecafcf0a...7ecafcf0a(0 个 commit)、Link7ecafcf0a...7ecafcf0a(0 个 commit)、Admin83b616f67...7ecafcf0a、DB7ecafcf0a...7ecafcf0a(0 个 commit)五个 compare range 内没有任何 revert commit,也没有「加了又删」的 migration。
发布建议
- 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。 - 发布范围(本轮只有 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 不需要执行(见上一条)。
- 必须发布 Admin:deploy-admin-eks-prod.yml,带上
- 顺序与依赖:#303 自带部署顺序
Atlas 迁移 → 所有 Link 副本升级 → Admin 升级 → 添加多目标规则,前两步已完成(DB7ecafcf0a、Link 8 / 8 在7ecafcf0a),因此本轮只剩 Admin 升级;升级完成后才由运维 / 模型负责人添加第二个 backend 的影子规则。在 Admin 升级完成前不要保存多目标配置(旧 Admin 仍按model + kind去重,添加第二个 backend 会被拒;其保存路径为「全量删除 + 重插」,会把已存在的多目标配置改写成单目标)。影子总开关、采样率等由 Admin 管理,本报告不涉及配置变更,也没有本轮必须提前准备的配置项。 - 发布后观测:
- 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"、现有评论路径行为不变。
- Pod 实态:Admin 应从
备注:本报告所有 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。