AMR 生产发布影响报告

生成时间:2026-10-19 10:03(Asia/Shanghai,定时任务 daily-release-impact);EKS 观察时刻 2026-10-19T02:02:09Z;分析对象:现在从 origin/main(HEAD 0cc709a90)发布 Web、API、Link、Admin、DB migration 的影响。四个服务以 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 采集,最大样本年龄 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 相同。

Web · EKS Pod 实态
Workload:nexu/amr-web · container web
观察时间:2026-10-19T02:02:09Z(Grafana / Prometheus kube_pod_container_info;image 过滤 amr-web:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)
Ready Pods:2 / spec 2(updated 2,available 2)
实际 commit:83b616f67
镜像 digest:sha256:77c15b24ea6a87a08e5eab39be3cf83637f4d5789b8e5df8e27e4344fc3cd6b0
Pod:amr-web-995bb7d8f-xzfzt, amr-web-995bb7d8f-pjv8h
Workflow 审计(仅供参考,不作为生产版本来源):deploy-web-eks-prod.yml 最近成功 run #5300 @ 83b616f67;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(83b616f67...0cc709a90):34 commits,其中触及 apps/web/ 的 11 个
发布点之后触及 apps/web/ 的 11 个 commit(本轮 Web 是唯一自 10-15 起未再滚动的服务,因此积压最多):用量明细页 71c209702 #302、f71cf53b4 #326、de1bbf11a #328、098336667 #333、78af0f960 #336、76444ec31 #353;Viewer/评论 496ecae29 #300、784eca52e #281;启动兜底 UI 移除 e71a209c7 #346;预览运行时环境 0cc709a90 #418;CI 切换残留 966e4a4d0 #420。 最近一次生产滚动为 2026-10-15 09:16 UTC 的 run #5300;其后 API / Link / Admin 均已在 10-16 前进,只有 Web 停留在 83b616f67。
API · EKS Pod 实态
Workload:nexu/amr-api · container api
观察时间:2026-10-19T02:02:09Z(Grafana / Prometheus kube_pod_container_info;image 过滤 amr-api:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)
Ready Pods:2 / spec 2(updated 2,available 2)
实际 commit:d70fe4f61
镜像 digest:sha256:01d36151c56d2107ab65d03ce10eb727af410f47d8c3a397479dfbfbb5fc7a77
Pod:amr-api-5744cf876c-rnnr4, amr-api-5744cf876c-nfr2x
Workflow 审计(仅供参考,不作为生产版本来源):deploy-api-eks-prod.yml 最近成功 run #6435 @ d70fe4f61;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(d70fe4f61...0cc709a90):3 commits,其中触及 services/api/ 的 1 个
发布点之后触及 services/api/ 的 1 个 commit:0cc709a90 #418(src/web-origins.ts 新增通配 origin 匹配器、src/config.ts 解析 WEB_TRUSTED_ORIGINS、src/app.ts 与 public-share-comments.ts / resources/routes.ts 的 CORS 改为按 pattern 匹配)。同范围 59ff49be0 #361 只改 DB migration workflow 与脚本(不计入服务维度),966e4a4d0 #420 不触及 services/api/。 API 发布点 d70fe4f61(10-16 17:21 UTC run #6435)已是本轮最新基线之一,所以待发布内容最少。
Link · EKS Pod 实态
Workload:nexu/amr-link · container link
观察时间:2026-10-19T02:02:09Z(Grafana / Prometheus kube_pod_container_info;image 过滤 amr-link:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)
Ready Pods:8 / spec 8(updated 8,available 8)
实际 commit:6458f5b2e
镜像 digest:sha256:3773eb9957680f281077eca9ca2bf19b1625e624656fc0abff5c7ce76aa43d86
Pod:amr-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-pf5s4
Workflow 审计(仅供参考,不作为生产版本来源):deploy-link-eks-prod.yml 最近成功 run #6307 @ 6458f5b2e;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(6458f5b2e...0cc709a90):5 commits,其中触及 services/link/ 的 1 个
发布点之后触及 services/link/ 的 1 个 commit:966e4a4d0 #420,且只改 Helm chart 元数据 services/link/charts/link/{Chart.yaml,Chart.lock,.gitignore},无 Link runtime 代码变更。 Link 发布点 6458f5b2e(10-16 16:33 UTC run #6307);#331/#334/#332/#338/#348 等 Link 变更均已在发布点之前生效。
Admin · EKS Pod 实态
Workload:nexu/amr-admin · container admin
观察时间:2026-10-19T02:02:09Z(Grafana / Prometheus kube_pod_container_info;image 过滤 amr-admin:prod-[0-9a-f]{40},只取 Ready Pod,并已排除 kube_pod_deletion_timestamp 命中的终止中 Pod)
Ready Pods:2 / spec 2(updated 2,available 2)
实际 commit:71c209702
镜像 digest:sha256:19e33765000d842717153b00b49c2df76f0e737379d321958793f6eb211ec4e7
Pod:amr-admin-cddbc888b-vbv65, amr-admin-cddbc888b-bwc4k
Workflow 审计(仅供参考,不作为生产版本来源):deploy-admin-eks-prod.yml 最近成功 run #5678 @ 71c209702;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(71c209702...0cc709a90):29 commits,其中触及 apps/admin/ 的 2 个
发布点之后触及 apps/admin/ 的 2 个 commit,且全部只改测试文件:de1bbf11a(#328 的 apps/admin/test/touchpoint-activity-manager.test.tsx)与 966e4a4d0(#420 的 apps/admin/test/edit-public-model-drawer.test.tsx),无 Admin runtime 变更。 Admin 发布点 71c209702(10-16 02:28 UTC run #5678)。
DB migration · Forgejo workflow 记录
最近一次成功:run #6199 @ 2026-10-16T14:13:42Z(trigger workflow_dispatch)
发布点 commit:26e1aec02
本次新增(26e1aec02...0cc709a90):8 commits,其中触及 db/migrations/ + db/schema/ 的 2 个
待 apply migration:20261016145951_ledger_visible_scope_usage_indexes.sql(e63dc01d6 #357)、20261016155002_credit_usage_scope_buckets.sql(6458f5b2e #358)
数据源:Forgejo run 列表(tea api /repos/core/amr/actions/runs),不使用 GitHub Actions。 审计提示:发布点之后还有一次针对 6458f5b2e 的 migration 运行 run #6272(2026-10-16T16:06:36Z,failure); 因此按 workflow 记录判断这 2 份 migration 尚未确认 apply,但库内实际 schema 状态无法从 workflow 记录判定,触发前需人工核验(见「发布建议」)。

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

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

结论:本轮共 6 组待发布 feature,跨 Web + API + Link + Admin + DB migration 五个维度,但绝大部分积压在 Web(11 个 commit 触及 apps/web/),因为 Web 是本轮唯一没有跟进的维度:Web 仍是 10-15 09:16 UTC 滚动的 83b616f67(#297),而 API(d70fe4f61 #365)、Link(6458f5b2e #358)、Admin(71c209702 #302)与 DB migration(26e1aec02 #355 对应的 workflow run)都已在 10-16 推进。要点: ① 工作区用量明细页是本轮最大的一组(Web 6 个 commit,含 #353 的视觉统一与总数兜底),服务端读取口径已在生产,只等 Web 滚动即可上线; ② 预览运行时环境与通配 origin(0cc709a90 #418)是本轮唯一的 API 侧变更,也是唯一需要额外配置依赖的 feature(生产固定部署可保持关闭,向后兼容); ③ 分享评论持久身份的 Web 侧(#300 / #281)补齐 #299 的服务端语义; ④ DB 有 2 份 migration 待 apply,其对应的 API 代码已在生产运行,且发布点之后的那次 migration 运行是 failure,触发前需先核验库内实态; ⑤ Admin 无 runtime 变更,Link 只有 chart 元数据变化。

与上一版报告(2026-10-16 17:16)对比:上一版列出 6 组待发布 feature。API / Link / Admin / DB 侧的大部分内容已在 10-16 当天滚动生效(API #326/#328/#333/#339+回滚 #359/#342/#347/#355/#357/#358/#360/#365;Link #331/#332/#334/#338/#348;Admin #303;DB 到 #355 的 migration),Web 侧 7 个 commit 未发布;本次新增待发布项为 Web 的 #346(启动兜底 UI 移除)、#353(用量页视觉对齐)、#418(预览运行时环境)、#420(CI 收起),以及 DB 侧 #357/#358 两份 migration。

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、只读成员目录、受 canViewUsage 控制的 Usage)。

③ 查询与状态(#328 / #333 / #336):先按合格资金候选与已证实零费请求收敛数据库候选,再对当页补全成员 / 定价 / 分摊;筛选候选覆盖完整空间与时间范围(不受当前筛选 / 页影响,7 天与 30 天分别保存),时间范围只保留 7/30 天、默认 10 条 / 可选 10·20·50 条、显示筛选后总数与总页数;缓存页后台刷新时仍可翻页,加载骨架 / 后台刷新 / 空结果 / 错误重试状态与「上次成功读取」提示统一收敛到表格既有状态区域;套餐抵扣区分模型原价、套餐贡献倍率与实际抵扣(不再用原价冒充)。

④ 视觉与总数兜底(#353):去掉用量页多余的白色面板、汇总条与「表格 + 分页」各自卡片化、筛选器直接复用账单页下拉组件的默认样式(36px 圆角胶囊 / 最小宽 140px / 间距 8px)、表头收敛为 #f7f7f7 浅灰底 + 13px 中等字重;响应缺 totalCount 时按「页码 × 每页 + 本页行数」兜底,分页左下角「共 N 条」不再为空。

Author:覃栋(#302 / #326 / #328 / #333 / #336)、eli(#353)

  • 71c209702 feat(billing): add workspace usage detail page(#302,23 files,+1951 / −168)
  • f71cf53b4 fix: 补齐 Member 入口并修复个人余额用量展示(#326,8 files,+455 / −39)
  • de1bbf11a fix: 优化用量查询并补齐筛选、分页和刷新状态(#328,15 files,+1061 / −85)
  • 098336667 fix(usage): 修复套餐抵扣明细、筛选缓存和分页状态(#333,14 files,+1098 / −174)
  • 78af0f960 fix(usage): 移除视觉稿外提示区域并复用表格状态(#336,4 files,+95 / −74)
  • 76444ec31 fix(usage): 用量页筛选器、表头和卡片样式对齐账单页,补齐总条数(#353,3 files,+249 / −240)

依赖关系:新页面的服务端读取(filterOptions / totalCount / 资金分支 / 套餐贡献)已随 API 发布点在 10-16 生效,#353 只改前端,因此本组没有跨维度的待发布依赖;#328 自述的 TEST 真实账号验收需在滚动后执行。

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 在应用启动前同步加载 environment.js(window.__VELA_ENVIRONMENT__,schemaVersion: 1,含 orbitEnvId 与 web / api / auth / link 端点);Helm chart 用 ConfigMap 挂载该文件与 nginx runtime-csp.conf,ConfigMap 变更通过 checksum 注解触发 Deployment 滚动,配置脚本 no-store 不缓存,nginx frame-src 追加配置的 API origin;运行时配置整体替换构建期配置,非法配置直接启动失败(不混用运行时与构建期端点),浏览器不再按 hostname 猜测回退;同一个 Web 镜像可服务不同 lane。固定部署(含生产)可保持 environment.enabled=false,由中央解析器读显式 Vite 构建设置,兼容既有部署。基础路径与 CMS 开关仍是构建期设置。

② API 通配来源:认证与带凭据 CORS 通过可选环境变量 WEB_TRUSTED_ORIGINS 接受校验过的 HTTPS 通配子域(例:https://*.open-design.powerformer.net),只支持「精确 origin」或「前导 *. 子域」两种形式(拒绝任意 URL glob、HTTP、带用户名密码、非 / 路径、明文非白名单端口),共享匹配器覆盖普通 API、公开评论与 share-viewer CORS,better-auth 拿到同一份信任源,响应回显具体 origin 而不是通配符。

Author:mrcfps

  • 0cc709a90 feat(preview): unify runtime environments and wildcard origin support(#418,28 files,+594 / −51)

必要配置依赖(仅此一处):① 生产固定部署保持 chart environment 关闭即可,不需要新增运行时配置;② 若要在预览 lane 上启用通配来源,需先完成 WEB_TRUSTED_ORIGINS 的一次性配置(提交自述对应 GitOps PR infra/apps#783,本报告未核验该 PR 是否已合入或已生效,因此不对「通配 origin 是否已可用」下确定结论);③ chart 校验要求 orbitEnvId 为 DNS label、各服务为 HTTPS URL,非法值在渲染期直接失败;④ deploy/charts/web/ENVIRONMENT.md 明确「旧镜像无法消费挂载设置」,chart 与镜像需一并发布;⑤ 提交自述「Live Test login 与产品验收仍待部署后执行」。

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):把作者写入的 data-od-comment-id="UUID" 识别为 cmt:UUID 及其精确 selector,要求所选节点自身身份 + 全文档唯一(含隐藏重复);缺失 / 非法 / 重复 / 不匹配时拒绝而不按路径或文本猜测、也不回退旧解析;保留既有 legacy / 动态能力与 bridge wire v2,运行时 revision 变为 25。

② 移除重同步浮层(#281):完整移除右上角「重新同步评论」入口(标签、图标、隐藏按钮与占位都不保留),删除未再使用的 busy 状态,保留预算失败定时器清理、source / nonce / readiness 校验、身份撤销、完整 pin 快照与真实文档加载重置。

Author:zhangchi

  • 496ecae29 fix(viewer): resolve durable comment identities(#300,3 files,+580 / −6)
  • 784eca52e fix(viewer): remove comment resync overlay(#281,4 files,+86 / −33)

跨仓库配套(本报告未核验):#300 自述对应生产者在 Open Design 仓库的 #8768;#299 的配对 OD PR 为 #8764。

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):在 credit_usages 上新增两个 partial index —— v1 口径 (app_user_id, created_at DESC, request_id DESC)(workspace_id IS NULL AND workspace_member_id IS NULL、排除 requestRole=auxiliary 与 publicModelVisibility=internal)与 v2 口径 (app_user_id, workspace_id, workspace_member_id, created_at DESC, request_id DESC);两处均为 CREATE INDEX CONCURRENTLY(-- atlas:txmode none),服务于已在生产的「账单读取收敛 / 可见用量扫描」优化。

② 15 分钟用量投影表(#358):新增 credit_usage_scope_days(scope × UTC 日的就绪标记,含 initialized 空日;projection_version),与 credit_usage_scope_buckets(UTC 15 分钟桶的 visible_consumed / usage_count,含 date_bin 对齐与数值 CHECK);写入路径(结算与零费内部测试用量、同一 scope 锁内、replay 不重复计数)已在生产,读取路径(今日用量优先读投影、缺失或未就绪的日回退精确明细)也已在生产。

Author:mrcfps

  • e63dc01d6 fix(billing): bound scoped ledger usage reads after invoice optimization(#357)
  • 6458f5b2e feat(billing): add write-only 15-minute usage projections(#358)

证据缺口(必须人工核验):发布点之后针对 6458f5b2e 的 migration 运行是 failure(见 DB 卡片),所以「这两份 migration 的对象在生产库里是否已存在」无法从 workflow 记录判断;本报告只按 SOP 口径给出「migration workflow 最近一次成功运行 = 26e1aec02,其后净新增 2 份 migration」这一结论,不推断库内实态。另外 #358 的 docs/ops/credit-usage-hourly-projection.md 规定 backfill 需要 --writers-ready 这一操作员显式断言,脚本自身不检查部署状态。

无。 无(对应 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)

移除 apps/web/index.html 中 #265 引入的全局启动加载兜底页(静态骨架屏),并删除为其编写的三个浏览器用例(share-script-recovery / share-failure-scene / share-built-script-recovery);vela:boot-ready / vela:boot-failed 事件与 BootBoundary 判定保留(share-comment-sync-live 等仍依赖)。用户可见影响:脚本加载异常时不再出现兜底提示页。

Author:zhangchi

  • e71a209c7 fix(web): remove global boot loading fallback UI(#346,5 files,+1 / −363)
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

  • 966e4a4d0 chore(ci): retire GitHub workflows and use runner registry mirrors(#420,84 files,+155 / −6252)
仅 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 记录为基线。

发布建议

  1. 先核验 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 记录等于库内实态。
  2. 服务发布顺序:按「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 变更,无需为功能滚动。
  3. 跨仓库与客户端依赖:#300 与 #299 对应的 Open Design 侧生产者(提交自述为 OD #8768 / #8764)不在本报告五元组内,本报告未核验其生产状态;若 OD 侧尚未发布,Web 侧新的评论身份解析会在缺少 data-od-comment-id 时按设计拒绝挂载(不猜测),需要与 OD 侧发布节奏对齐。
  4. 发布后观测:
    • 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 事件仍按预期工作。

备注:本报告所有 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 实态全部一致。本报告只分析影响,不执行发布或配置变更。