AMR 生产发布影响报告
当前生产发布点(EKS 实态 + Forgejo workflow 记录)
Web、API、Link、Admin 的发布点来自 Grafana / Prometheus 观察到的 Ready EKS Pod 镜像(namespace nexu,datasource prometheus,由 kube-state-metrics 采集,最大样本年龄 23.1 秒,无终止中 Pod);DB migration 的发布点来自对应 Forgejo workflow 最近一次成功运行。
四个服务均已校验:同一服务所有 Ready Pod 的 commit 与 digest 一致、spec = updated = available(Web 2 / API 2 / Link 8 / Admin 2)、无滚动中或回滚中的混合状态;四个服务的 workflow 最近成功记录与 Pod 实态全部一致(仅作审计对照,不作为生产版本来源)。
feature 表里只列出各自发布点之后的变更;发布点之前的内容属于已生效,归入「已在生产生效」一节。目标 commit 为 0cc709a90(feat(preview): unify runtime environments and wildcard origin support (#418),2026-10-18 16:19,mrcfps),本地 main 与 origin/main 相同。
nexu/amr-web · container webkube_pod_container_info;image 过滤 amr-web:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)83b616f67sha256:77c15b24ea6a87a08e5eab39be3cf83637f4d5789b8e5df8e27e4344fc3cd6b0amr-web-995bb7d8f-xzfzt, amr-web-995bb7d8f-pjv8h83b616f67;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)83b616f67...0cc709a90):34 commits,其中触及 apps/web/ 的 11 个nexu/amr-api · container apikube_pod_container_info;image 过滤 amr-api:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)d70fe4f61sha256:01d36151c56d2107ab65d03ce10eb727af410f47d8c3a397479dfbfbb5fc7a77amr-api-5744cf876c-rnnr4, amr-api-5744cf876c-nfr2xd70fe4f61;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)d70fe4f61...0cc709a90):3 commits,其中触及 services/api/ 的 1 个nexu/amr-link · container linkkube_pod_container_info;image 过滤 amr-link:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)6458f5b2esha256:3773eb9957680f281077eca9ca2bf19b1625e624656fc0abff5c7ce76aa43d86amr-link-7966696987-njbzb, amr-link-7966696987-c8r82, amr-link-7966696987-7b64k, amr-link-7966696987-rgznk, amr-link-7966696987-zjhvs, amr-link-7966696987-x6j5v, amr-link-7966696987-qffpr, amr-link-7966696987-pf5s46458f5b2e;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)6458f5b2e...0cc709a90):5 commits,其中触及 services/link/ 的 1 个nexu/amr-admin · container adminkube_pod_container_info;image 过滤 amr-admin:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)71c209702sha256:19e33765000d842717153b00b49c2df76f0e737379d321958793f6eb211ec4e7amr-admin-cddbc888b-vbv65, amr-admin-cddbc888b-bwc4k71c209702;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)71c209702...0cc709a90):29 commits,其中触及 apps/admin/ 的 2 个此次发布真正新增的 feature 和影响面
| Feature / Author / Commits | Web | API | Link | Admin | DB schema / migration |
|---|---|---|---|---|---|
|
XL工作区用量明细页与账单读取链路(Web 侧交付,#302 / #326 / #328 / #333 / #336 / #353)
把「工作区用量」从简表做成可用的明细页,并把外观、筛选与状态口径一次收敛: ① 新页面(#302):Owner 财务中心与 Member 侧新增 Workspace usage 明细路由(模型 / 发起人筛选、费用与 token 汇总、明细分页),导航与 billing client 同步接入。 ② 个人资金漏展示修复与 Member 入口(#326):默认工作区与其 owner 的个人资金桶支付的请求此前被用量与账单读取隐藏;现在按资金归属分支读取(工作区资助 + 合规的默认 owner 个人桶),个人 → Team 转换后仍只归属默认工作区,混合资金的历史 NULL-workspace 请求按单行、单次 token、完整分摊返回;同时补齐 Member 入口(个人 API Keys、只读成员目录、受 ③ 查询与状态(#328 / #333 / #336):先按合格资金候选与已证实零费请求收敛数据库候选,再对当页补全成员 / 定价 / 分摊;筛选候选覆盖完整空间与时间范围(不受当前筛选 / 页影响,7 天与 30 天分别保存),时间范围只保留 7/30 天、默认 10 条 / 可选 10·20·50 条、显示筛选后总数与总页数;缓存页后台刷新时仍可翻页,加载骨架 / 后台刷新 / 空结果 / 错误重试状态与「上次成功读取」提示统一收敛到表格既有状态区域;套餐抵扣区分模型原价、套餐贡献倍率与实际抵扣(不再用原价冒充)。 ④ 视觉与总数兜底(#353):去掉用量页多余的白色面板、汇总条与「表格 + 分页」各自卡片化、筛选器直接复用账单页下拉组件的默认样式(36px 圆角胶囊 / 最小宽 140px / 间距 8px)、表头收敛为 Author:覃栋(#302 / #326 / #328 / #333 / #336)、eli(#353)
|
6 commit,全部触及 apps/web/:新增 src/routes/workspace-usage-detail.tsx / usage-cost-detail.tsx / workspace-usage-detail.css、src/lib/billing-client.ts、src/lib/workspace-usage-pagination.ts,改 src/app.tsx、src/components/layout/nav-items.ts、src/components/workspace/owner-financial-route.tsx、src/components/ui/dropdown-select.tsx、packages/shared/src/index.ts;配套浏览器回归(usage-detail-layout、usage-followup、admin-usage、member-entry-points、loading-shell 等)与单测。合计 6 个 PR、+4.9k / −0.8k 行(含测试)。 |
无。该 feature 的 API 侧已在生产生效(#326 / #328 / #333 的读取口径、#339 五分钟共享读取缓存及回滚 #359、#342 / #355 / #357 / #358 / #360 / #365 的 scope totals 与 15 分钟投影都早于 API 发布点 d70fe4f61)。 |
无。 | 无 runtime 变更:仅 apps/admin/test/touchpoint-activity-manager.test.tsx(#328 的 Admin CI 回归,不改生产行为)。 |
无 schema / migration(本组 6 个 commit 均无 db/ 变更)。 |
|
L预览运行时环境统一与通配 origin 支持(#418)
让动态预览 lane 不再从 Web hostname 推断服务地址,改为「一份经过校验的运行时环境配置」,并让 API 接受经过校验的通配来源: ① Web 运行时配置:Web 在应用启动前同步加载 ② API 通配来源:认证与带凭据 CORS 通过可选环境变量 Author:mrcfps |
1 commit,apps/web/ 生产面改动:index.html(插入 environment.js)、nginx.conf(/environment.js no-store + CSP 使用 $vela_api_origin)、runtime-csp.conf 与 public/environment.js(新增)、src/lib/environment.ts(新增 98 行解析器)、src/lib/gateway-url.ts(删除)、src/lib/auth-client.ts、src/routes/api-keys.tsx、Dockerfile(新增 VITE_PUBLIC_LINK_BASE_URL 构建参数);另含 deploy/charts/web/{values.yaml,templates/deployment.yaml,templates/environment.yaml,ENVIRONMENT.md} 与三个 Web 部署 workflow 的显式 Link 配置(.forgejo/workflows/deploy-web-eks-{prod,test,feature-test}.yml)。 |
1 commit:新增 src/web-origins.ts(matchesWebOrigin),改 src/config.ts(WEB_TRUSTED_ORIGINS 加入可选环境变量并做严格校验)、src/app.ts(凭据 CORS 从列表匹配改为按 origin 回调匹配)、src/collab/public-share-comments.ts、src/resources/routes.ts(share viewer CORS 由精确集合改为 pattern 匹配)、.env.example;配套 apps/web 单测、tools/tests/web-environment-helm.test.mjs 与 services/api/test/preview-origins.test.ts。 |
无。 | 无。 | 无 schema / migration(纯运行时配置与 CORS 策略)。 |
|
L分享评论持久身份与 Viewer 浮层移除(Web 侧,#300 / #281,OPEND-3516)
补齐服务端评论身份语义在浏览器侧的最后一段:#299 已让「评论」与「被评论文件」在成员分享与公开分享里保持同一不可变身份,本组让 Viewer 使用该身份、并按产品要求撤掉重同步入口: ① 持久评论身份(#300):把作者写入的 ② 移除重同步浮层(#281):完整移除右上角「重新同步评论」入口(标签、图标、隐藏按钮与占位都不保留),删除未再使用的 busy 状态,保留预算失败定时器清理、source / nonce / readiness 校验、身份撤销、完整 pin 快照与真实文档加载重置。 Author:zhangchi |
2 commit:packages/shared/src/share-viewer-bridge-runtime.ts(bridge 运行时,随 Web 产物发布——Web 镜像 Dockerfile 显式 COPY packages/shared)、apps/web/src/components/shared-artifact/ArtifactFrame.tsx(移除 resync 浮层与 busy 状态),其余 5 个文件为单测与受控 Chromium 回归(share-comment-identity、share-bridge-retry、shared-artifact-comment-identity、shared-artifact-no-resync、shared-artifact-comment-cursor)。 |
无。服务端侧 #299(评论文件生命周期 / publication authority)已在生产生效(早于 API 发布点 d70fe4f61),本组只是让浏览器侧对齐该语义。 |
无。 | 无。 | 无(#299 的 migration 已在 DB 发布点之前 apply)。 |
|
MDB migration:为已在生产运行的账单优化补齐 schema(#357 / #358)
这两份 migration 的对应代码已经随 API 发布点在生产运行,但按 workflow 记录尚未 apply,因此本轮 DB 维度的净新增就是「补 schema + backfill 就绪」: ① 账单可见用量索引(#357):在 ② 15 分钟用量投影表(#358):新增 Author:mrcfps |
无。 | 无(对应 services/api/ 代码已在发布点 d70fe4f61 之前生效,本组不新增 API 变更)。 |
无。 | 无。 | 2 份 migration + schema 声明:db/migrations/20261016145951_ledger_visible_scope_usage_indexes.sql、db/migrations/20261016155002_credit_usage_scope_buckets.sql,同步 db/schema/public.hcl 与 db/migrations/atlas.sum;均为纯新增(新索引 / 新表),不改既有列、不需要数据改写。 |
|
MWeb 启动兜底 UI 移除(#346)
移除 Author:zhangchi |
1 commit:index.html(−46 行兜底页)、src/components/BootBoundary.tsx(1 行调整)、删除 3 个 browser-agent spec。这是用户可见的行为变化,需在滚动后确认启动失败场景的表现符合产品预期。 |
无。 | 无。 | 无。 | 无。 |
|
SCI / 发布链路收尾(#420)
退役 GitHub Actions、统一使用 runner registry 镜像并迁移到 Forgejo actions(84 个文件、净 −6252 行)。本组在五个维度中唯一的生产面残留只有 Link 的 Helm chart 元数据与两个测试文件,属发布链路整理,不改变运行时行为。 Author:mrcfps |
仅 apps/web/tests/unit/share-csp.test.ts(测试;其断言已被 #418 再次改写)。 |
无(不触及 services/api/)。 |
仅 services/link/charts/link/{.gitignore,Chart.lock,Chart.yaml}(chart 元数据,无 services/link/internal/ 代码变更)。 |
仅 apps/admin/test/edit-public-model-drawer.test.tsx(测试)。 |
无。 |
已在生产生效(发布点之前,本次不重复发布)
以下内容均在各维度生产发布点之前,已在生产运行。四个服务以 EKS Pod 实态为基线,DB migration 以 workflow 记录为基线。
- Web(发布点
83b616f67,10-15 09:16 UTC 滚动):分享链接 / 评论 / 跨站登录合入及随后的 Viewer 交互修复(#265、#279 评论输入背景锁、#280 评论 pin 光标);#300 / #281 / #302 等apps/web/变更不在其中。 - API(发布点
d70fe4f61,10-16 17:21 UTC):collab 私有文件发布与项目可见性(#298)、评论文件生命周期(#299)、workspace-events 通知 outbox 批量化(#304)、用量读取口径与五分钟共享读取缓存(#326 / #328 / #333 / #339 + 单独回滚 #359)、账单 scope totals 与 15 分钟投影的写入与读取(#342 / #355 / #357 / #358 / #360 / #365)、Stripe 发票索引(#347)。 - Link(发布点
6458f5b2e,10-16 16:33 UTC):thinking 参数失败证据链(#301)、一个 public model 多影子 backend(#303)、BytePlus 路由兼容(#305)、OpenRouter Messages/Responses 提示缓存保留(#330)、token 四元组与缓存解析(#331)、影子请求关联与失败诊断(#332)、早期流式提交扩展到 Responses/Messages(#334)、边界失败与请求生命周期日志关联(#335)、DeepSeek Harness 原生 web search(#338)、API key last-used 更新节流(#348)。 - Admin(发布点
71c209702,10-16 02:28 UTC):Admin 服务代码随 #302 对应 commit 发布(含多影子 backend 策略编辑器等此前变更);本轮发布点之后的 Admin 变更只有测试文件,无 runtime 内容待发布。 - DB migration(发布点
26e1aec02,workflow 最近成功 run #6199 @ 10-16 14:13 UTC):到credit_usage_scope_totals为止的 migration 均已 apply;#357 / #358 两份不在其中(见 feature 表第 4 行)。
发布建议
- 先核验 DB 实态,再跑 migration:需要先跑 migration。基线
26e1aec02之后有 2 份 additive migration(26e1aec02...0cc709a90,净新增 2 个 commit):20261016145951_ledger_visible_scope_usage_indexes.sql(#357):两条CREATE INDEX CONCURRENTLY,注意 workflow 需要非事务执行(文件已带-- atlas:txmode none)。20261016155002_credit_usage_scope_buckets.sql(#358):新建credit_usage_scope_days与credit_usage_scope_buckets。
6458f5b2e的那次 migration 运行是 failure(10-16 16:06 UTC,run #6272),且这两份 migration 依赖的对象可能已被上一次尝试部分创建;实施前必须由人工确认生产库实际 schema 状态(例如 atlas 版本记录与两张credit_usage_scope_*表是否存在、索引是否已建),再决定是整批重跑还是走恢复流程;deploy-db-migrations-prod.yml 已在 #361(59ff49be0)加入专用超时与 resumed revision / post-migrate ANALYZE 处理,重跑时按该 workflow 的新行为执行。不要假定 workflow 记录等于库内实态。 - 服务发布顺序:按「schema → 后端 → 前端 / 网关」并照顾跨服务契约:
- 1) DB migration:核验后触发 deploy-db-migrations-prod.yml apply 上述两份。
- 1b) backfill(migration 之后、可选但建议):migration 成功后按
docs/ops/credit-usage-hourly-projection.md用pnpm exec tsx scripts/backfill-credit-usage-scope-day.ts --apply --writers-ready初始化相关 UTC 日(优先当前账单日涉及时区,含昨日 / 今日 / 明日);所有写入方(API)已支持 bucket 写路径(API 发布点d70fe4f61晚于 #358),因此该顺序成立;未初始化的日会走精确明细回退,不会算错数,只是没有性能收益。 - 2) API:deploy-api-eks-prod.yml,一次发布 1 个
services/api/commit(#418,d70fe4f61...0cc709a90)。WEB_TRUSTED_ORIGINS是可选变量:不配置时行为与现在一致(只有精确WEB_URL/ 既有来源),配置了非法值会直接启动失败——因此如果要开预览通配来源,先在部署侧写好合法值再滚动;生产固定部署不需要该变量。 - 3) Web:deploy-web-eks-prod.yml,一次发布 11 个
apps/web/commit(83b616f67...0cc709a90:用量明细页 6 个 + Viewer 2 个 + #346 + #418 + #420 的测试残留)。必须放在 API 之后(API 已经就绪,无需等待);用量页依赖已在生产的服务端读取,#418 的生产形态保持environment.enabled=false(固定部署走构建期设置,工作流已显式带VITE_PUBLIC_LINK_BASE_URL=https://amr-link.open-design.ai),不需要同时改 GitOps values。这是本轮体量最大、用户可见度最高的一次滚动。 - 4) Link:deploy-link-eks-prod.yml,本组只有 chart 元数据变化(#420),没有必须发布的 runtime 变更;若要保持 GitOps 与仓库一致可跟随一次滚动,属于低风险操作。
- 5) Admin:deploy-admin-eks-prod.yml 发布点之后只有 2 个测试文件变更,没有必须发布的 runtime 变更,无需为功能滚动。
- 跨仓库与客户端依赖:#300 与 #299 对应的 Open Design 侧生产者(提交自述为 OD
#8768/#8764)不在本报告五元组内,本报告未核验其生产状态;若 OD 侧尚未发布,Web 侧新的评论身份解析会在缺少data-od-comment-id时按设计拒绝挂载(不猜测),需要与 OD 侧发布节奏对齐。 - 发布后观测:
- Pod 实态:各服务滚动后镜像 tag 应等于发布 commit 的
prod-<sha>,Ready 数与spec = updated = available一致(Web 2、API 2、Link 8、Admin 2);滚动收敛期间kube-state-metrics可能短暂多报终止中 Pod,需按deletionTimestamp排除后再判断一致性。 - DB(第 4 行):migration 后确认两张
credit_usage_scope_*表与两个 partial index 存在且 ANALYZE 完成;观察/billing/summary与snapshot在初始化日 / 未初始化日两条路径上的数值一致(未初始化的日仍走明细回退),以及结算写入不再报错。 - 用量页(第 1 行):默认工作区能读到个人资金支付的既有请求(不重复计数、不重复 token 汇总、混合资金请求单行单次);筛选候选不随已选条件与分页收缩,7/30 天分别保存,分页「共 N 条」不再为空(含
totalCount缺失时的兜底计算);套餐抵扣显示实际贡献而非原价;用量页视觉与账单页一致(无多余白色面板)。 - 预览环境与 CORS(第 2 行):固定部署下
/environment.js与运行时配置路径不应改变现有行为(environment.enabled=false时 chart 不挂载文件),确认 Web 登录 / API 调用仍走构建期地址;若同时启用了WEB_TRUSTED_ORIGINS,确认精确来源行为不变、通配只匹配配置的子域(拒绝攻击性后缀 / HTTP / 非白名单端口),且响应回显具体 origin。 - 分享 / 评论与启动兜底(第 3、5 行):成员(无本地发布)与公开分享看到同一文件的评论且归属不可变;Viewer 不再出现「重新同步评论」浮层;缺失 / 重复评论身份时按设计拒绝挂载而不是误挂;确认移除启动兜底页后,脚本失败场景与
vela:boot-ready/vela:boot-failed事件仍按预期工作。
- Pod 实态:各服务滚动后镜像 tag 应等于发布 commit 的
备注:本报告所有 workflow、commit、PR 与 compare range 均指向 Forgejo code.powerformer.net/core/amr,不使用 GitHub Actions。四个服务的 compare range 基于 Grafana / Prometheus 观察到的 Ready Pod 镜像 commit(而非 workflow / GitOps 最近成功记录),DB migration 的 compare range 基于 migration workflow 最近一次成功运行的 commit_sha;四个服务维度另附对应 deploy-*-eks-prod.yml 最近成功记录作为审计对照,本次四者与 Pod 实态全部一致。本报告只分析影响,不执行发布或配置变更。