AMR 生产发布影响报告

生成时间:2026-10-15 10:11(本地,UTC+8);EKS 观察时刻 2026-10-15T02:06:52Z;分析对象:如果现在从 origin/main(HEAD c1bfe570d)发布 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 采集,全部样本新鲜度在 18 秒内);DB migration 的发布点来自对应 Forgejo workflow 最近一次成功运行。四个服务均已校验:同一服务所有 Ready Pod 的 commit 与 digest 一致、副本数 spec = updated = available(无滚动中 / 回滚中的混合状态)、Ready Pod 数等于 spec 副本数、镜像 tag 可解析出 40 位 SHA、digest 完整。四个服务的 workflow 最近成功记录与 Pod 实态全部一致(仅作审计对照,不用于判断生产版本)。 feature 表里只列出发布点之后的变更;发布点之前的内容属于已生效,归入「已在生产生效」一节。目标 commit 为 c1bfe570d(fix(test): remove custom share migration prerequisite (#278),2026-10-14 14:54,zhangchi),本地 main 与 origin/main 相同。

本轮采样说明:Link 正在缩容(8 → 4 副本),首次采样时 kube-state-metrics 仍对带 deletionTimestamp 的终止中 Pod 报 ready=1(spec=5 时出现 6 条 Ready 系列);终止中 Pod 已用 kube_pod_deletion_timestamp 识别并单独排除,末次采样已稳定为 4/4(spec = updated = available = 4)。全部 Pod(含缩容中的)commit 与 digest 完全一致,因此发布点判断不受缩容过程影响。与上一份报告(2026-10-14 17:48 本地,五个发布点均为 68f2de820)相比,五个生产发布点本轮完全没有移动:Web / API / Link / Admin 仍为 68f2de820,DB 仍为 68f2de820;差异只在上游代码:origin/main 从那以后前进了 8 个 commit(#272、#274、#275、#266、#265、#277、#276、#278),即本轮的全部待发布内容(5 个 feature)。上一份报告列出的 6 个 feature(#257、#233、#258、#248、#267、#263)随 2026-10-14T09:19–09:35Z 的集中发布上线,本轮不再重复。

Web · EKS Pod 实态
Workload:nexu/amr-web · container web
观察时间:2026-10-15T02:06:52Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-web:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:2 / 2(updated 2,available 2)
实际 commit:68f2de820
镜像 digest:sha256:c4b95dcc122c0a25e0866d3de93f6190dbbe3416a7c0d52efede040600fb95de
Pod:amr-web-67fc69bfb5-npfg7, amr-web-67fc69bfb5-nmdgf
Workflow 审计(仅供参考):deploy-web-eks-prod.yml 最近成功 run #4969 @ 68f2de820;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(68f2de820...c1bfe570d):8 commits;触及该服务目录的变更 e175b02fd(#265)
发布点之后 8 个 commit 中 1 个触及 apps/web/:e175b02fd(#265)—— 即 feature 表第 1 行(分享页 + 评论 + 跨站登录)的 Web 侧;Web 必须重新发布,/artifact/* 页面才存在。
API · EKS Pod 实态
Workload:nexu/amr-api · container api
观察时间:2026-10-15T02:06:52Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-api:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:2 / 2(updated 2,available 2)
实际 commit:68f2de820
镜像 digest:sha256:6dfaf1697217d1a4528ccdbdc2b6d369f267516bc18ccbe54e7e85638ed16f41
Pod:amr-api-cd9cf7787-npcfx, amr-api-cd9cf7787-h6wwg
Workflow 审计(仅供参考):deploy-api-eks-prod.yml 最近成功 run #4967 @ 68f2de820;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(68f2de820...c1bfe570d):8 commits;触及该服务目录的变更 e175b02fd(#265)、e204cf937(#276)、c1bfe570d(#278)
发布点之后 8 个 commit 中 3 个触及 services/api/:e175b02fd(#265,分享 / 跨站登录 / 测量)、e204cf937(#276,计费预检隔离)、c1bfe570d(#278,仅删除 test 脚本 services/api/scripts/test-share-release-database.mjs,无 runtime 变更)—— 即 feature 表第 1 / 3 行对应的 API 侧变更。
Link · EKS Pod 实态
Workload:nexu/amr-link · container link
观察时间:2026-10-15T02:06:52Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-link:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:4 / 4(updated 4,available 4)
实际 commit:68f2de820
镜像 digest:sha256:cbeac70b0b7057ade81338ca74bc28cc5ebdeb85816ac70703284a9d446a36e0
Pod:amr-link-577dd969fc-5qrd5, amr-link-577dd969fc-m5x2g, amr-link-577dd969fc-c9xc8, amr-link-577dd969fc-spvx7
Workflow 审计(仅供参考):deploy-link-eks-prod.yml 最近成功 run #4958 @ 68f2de820;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(68f2de820...c1bfe570d):8 commits;触及该服务目录的变更 d9cecb4ce(#275)、8942a62d2(#266)
发布点之后 8 个 commit 中 2 个触及 services/link/:d9cecb4ce(#275,OpenAI temperature 兼容名单)、8942a62d2(#266,采样影子测试)—— 即 feature 表第 2 / 4 行对应的 Link 侧变更。副本数已由 8 缩到 4(同一 commit / digest),本轮首次采样时仍能看到带 deletionTimestamp 的终止中 Pod,末次采样已稳定为 4/4。
Admin · EKS Pod 实态
Workload:nexu/amr-admin · container admin
观察时间:2026-10-15T02:06:52Z(Grafana / Prometheus kube_pod_container_info,image 过滤 amr-admin:prod-[0-9a-f]{40} 且仅取 Ready Pod)
Ready Pods:2 / 2(updated 2,available 2)
实际 commit:68f2de820
镜像 digest:sha256:3f2817ee67a9d00f7abb390a2968dc35def5badf83577c47ae9b7ca8c352df82
Pod:amr-admin-6c5bf77796-ds48c, amr-admin-6c5bf77796-brhkh
Workflow 审计(仅供参考):deploy-admin-eks-prod.yml 最近成功 run #4968 @ 68f2de820;与 Pod:一致(workflow 最近成功运行的 commit_sha 与 Pod 实态相同)
本次新增(68f2de820...c1bfe570d):8 commits;触及该服务目录的变更 cdcb803e3(#272)、f9af7e8fb(#274)、8942a62d2(#266)、e175b02fd(#265)
发布点之后 8 个 commit 中 4 个触及 apps/admin/:cdcb803e3(#272)、f9af7e8fb(#274,模型预算界面与校验)、8942a62d2(#266,影子策略界面)、e175b02fd(#265,仅 Admin 测试文件)—— 即 feature 表第 2 / 5 行对应的 Admin 侧变更。
DB migration · workflow 记录
最近成功:run #4957 @ 2026-10-14T09:19:04Z(trigger workflow_dispatch,started 2026-10-14T09:19:05Z)
发布点 commit:68f2de820
本次新增(68f2de820...c1bfe570d):8 commits,其中触及 db/migrations/ + db/schema/ 的变更 2 个:8942a62d2(#266)、e175b02fd(#265)
数据源:Forgejo run 列表(tea api /repos/core/amr/actions/runs),不使用 GitHub Actions。基线已包含到 db/migrations/20261014033649_stock_search_configuration.sql(#257);基线之后到 HEAD 新增两份 migration:db/migrations/20261014043452_model_shadow_testing.sql(#266)与 db/migrations/20261014123301_share_release.sql(#265)。

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

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

结论:本轮共 5 个 feature(对应 8 个 commit,其中 2 个是测试 / 发布闸门工具改动,无 runtime 变更),落在 Web / API / Link / Admin / DB migration 全部五个维度。按影响面排序:#265(XXL,分享链接 / 评论 / 跨站登录,Web + API + DB 三处联动,含 14 张新表与既有评论表改造)> #266(XL,Link + Admin + DB 三处联动的采样影子测试,默认关闭、有明确启用顺序)> #276(M,API 计费预检恢复原行为 + 新增受限资金提示路由)> #275(M,Link 扩展 OpenAI temperature 兼容名单,修掉 6 个旗舰模型的线上 400)> #272+#274(M,Admin 模型预算 K 单位编辑与单项保存校验)。

本轮有两份 migration、且彼此独立:#266 的 20261014043452_model_shadow_testing.sql(link schema 新建两张表)与 #265 的 20261014123301_share_release.sql(14 张新表 + 改造 collab.comment_events)。两者都必须在对应服务发布之前应用。

Feature / Author / Commits Web API Link Admin DB schema / migration
XXL分享链接 / 评论 / 跨站登录(share release)

把已验收的「分享」产品线一次性合入 main:项目 / 文件发布 → 稳定分享 slug → 公开只读分享页 https://<share-origin>/artifact/{projectId}/{slug}(Web 新增 /artifact/* 路由),分享页上可对具体元素发表评论,并有分页 / SSE / polling 同步、复制链接、Open in app、状态页(stopped / 失效 / 加载失败)。API 侧补齐:分享绑定与停止原因、公开评论读写、评论写入门禁与速率限制、幂等键、发布权威校验、分享测量(viewer / login attempts / update attribution),并新增 跨站登录:分享 shell 上没有 .ai 会话时,经 .app shell 走 OIDC(API 作为 provider,Better Auth 的 oauthClient / oauthAccessToken / oauthRefreshToken / oauthConsent + share_app_sessions + share_auth_transactions)登录后回跳,登录态落在分享域。CLI 侧新增 vela share ...(独立发布通道,不在本报告五元组内)。

必要依赖与先后关系(仅该 feature 有依赖):① 先应用 DB migration(API 的分享端点直接读写新表与改造后的 collab.comment_events);② 再发布 API 与 Web;③ 跨站登录与分享测量是显式 opt-in:SHARE_APP_ORIGIN + SHARE_AUTH_CLIENT_ID + SHARE_AUTH_CLIENT_SECRET 必须三项同时配置(三项全空即关闭分享登录;只配置其中一部分会让 API 启动直接失败),分享测量需 SHARE_MEASUREMENT_ENABLED=true(非法配置只关闭测量、不影响业务启动),另有可选的 BLOB_STORE_PUBLIC_ENDPOINT。本轮未核验生产是否已配置这组变量,也未核验分享 shell 域名(.app)与相关 GitOps / 资源现状;SHARE_APP_ORIGIN 未配置时分享接口会明确返回 link: {status: "unavailable"} 而不会给出一个错误地址 —— 因此代码 + migration 的发布结论成立,「分享链接可用、能跨站登录」还取决于第 ③ 步配置与分享域名资源。

Author:zhangchi

新增分享页:路由 routes/shared-artifact(/artifact/:projectId/:slug 与 /artifact/*)、components/shared-artifact/ 下 48 个新增文件(27 个组件 + 21 个样式)(ArtifactFrame / CommentComposer / CommentList / CommentFloatingCard / ShareModeDock / ShareStatusScreen / CopyCurrentLink / ShareUpdatePill / ShareModuleBoundary 等)、lib/ 下 39 个新增模块(share-auth-client、oauth-continuation、share-contract.gen.ts、share-analytics、share-comment-write-fence、i18n 等)、runtime/ 评论锚点与选择、BootBoundary 与 index.html 启动失败提示、nginx.conf 的 CSP 增加 frame-src(API 三个域 + Turnstile)。必须发布 Web,分享页才存在。 新增 share-auth/(OIDC provider、provider client / contract、sessions、transactions、rate-limit)、share-measurement/(batcher、canonical、context、postgres、visitor、budget、runtime)、collab/ 分享实现(share-bindings、public-share-comments、public-comment-pages、share-comment-rate-limit、publication-authority、project-share-status、share-binding-completion 等)、resources/ 分享端点 /api/v1/resources/{resourceId}/shares、/shares/bound、/shares/{slug},以及 collab 路由 /api/v1/collab/shares*、/api/v1/collab/projects/:projectId/comments*;config.ts 新增 share-auth / share-measurement 环境键与启动期校验,packages/shared 同步契约与 viewer URL parity。c1bfe570d 只删除 test 脚本 services/api/scripts/test-share-release-database.mjs,对 API 产物无 runtime 影响。 无。(该 commit 不改 services/link/;分享页只读预览由 Web + API 提供) 无 runtime 变更。(只改了 apps/admin/test/touchpoint-github-import.test.tsx 的轮询等待断言) 新增 migration db/migrations/20261014123301_share_release.sql(321 行,本次两份 migration 中唯一改动既有表的一份):新建 14 张表 —— collab.share_bindings / collab.share_rate_limits / collab.share_measurement_events / collab.share_measurement_login_attempts / collab.share_update_attributions / collab.file_publications、public.share_auth_transactions / public.share_app_sessions / public.oauthClient / public.oauthAccessToken / public.oauthRefreshToken / public.oauthConsent、resource_hub.snapshot_aliases / resource_hub.snapshot_alias_versions;并改造既有 collab.comment_events:新增 author_kind(NOT NULL,默认 'member')/ author_app_user_id / author_display_name / idempotency_key 四列,member_id 放开为可空,新增 author_kind 与作者形状两条 CHECK,重建评论分页索引为 (team_id, project_id, comment_id, seq)、并加 idempotency_key 部分唯一索引;db/schema/{collab,public,resource_hub,share_measurement}.hcl 与 atlas.sum 同步。全部为加表 / 加列(带默认值、无回填),但会在 comment_events 上做一次非 CONCURRENTLY 的索引重建,执行时注意锁等待。
XL模型路由采样影子测试(sampled model routing shadow testing)

为新 backend 接入提供实时小流量影子验证:Admin 新增默认关闭的总开关、按 public model × 协议(Chat Completions / Responses / Messages)配置的目标 backend 与采样概率;Link 在正式请求通过准入之后、从供应商改写前的原始字节复制一份独立副本,在独立 goroutine 异步重放,正式响应不等待影子结果。影子调用的终态只进模型指标与结构化日志(event=shadow_request_completed、event=shadow_sample_dropped、既有 provider_attempt_failed),不产生用户 usage、不扣额度、不写钱包、不触发结算(供应商侧仍会产生费用)。内部保护恒定且不可配:4 个进程内执行槽(无队列,满载丢弃)、210 秒 deadline、禁止跨 backend fallback、禁止递归采样、不执行工具;配置沿用 catalog 事务、校验、审计、revision 与逐副本 reload。

必要依赖与先后关系(仅该 feature 有依赖):① 先应用 DB migration;② 再发布 Link;③ 再发布 Admin;④ 只有全部相关 Link 副本都升级之后才在 Admin 打开总开关并配置规则(保存后按副本 reload 生效,不承诺保存瞬间全副本生效)。回退顺序为:先关闭总开关 → 确认副本已 reload → 再回退应用,新表保留不删。默认关闭,不配置即不影响任何正式流量。

Author:Liu Yi

  • 8942a62d2 feat(link): add sampled model routing shadow testing (#266)
无。(该 commit 不改 apps/web/ 的 runtime) 无。(该 commit 不改 services/api/;影子配置由 Admin 写入 catalog 表,Link 读取) 新增 internal/shadow/executor.go + execute.go(副本生命周期、4 槽、210s deadline、协议终态判定)、internal/catalog/shadow.go、internal/domain/shadow.go、internal/handlers/shadow.go 与 openai.go / anthropic.go 的接入点、internal/repositories/shadow.go、internal/bifrostengine/shadow_context.go(保留改写前原始请求)、runtimeconfig/manager.go 与 server/internal_catalog_configuration.go(配置装载与副本刷新)、server/internal_public_models.go、及其单测与 specs/change/20261014-model-routing-shadow-testing/* 验收材料。 新增 models/shadow-testing 页面 + shadow-policy-editor.tsx(728 行:总开关、按模型 / 协议的目标与概率编辑)、model-configuration-actions.ts / lib/server/admin/model-configuration.ts / model-configuration-repository.ts / lib/model-configuration.ts(影子策略走 catalog 事务、revision 冲突保留输入、审计)、app-shell / sidebar-nav / combobox 与 en / zh 文案;并顺带修掉 Admin candidate 对空 context budget 误补 output budget 的既有不一致(同一 PR 内的配套修复)。 新增 migration db/migrations/20261014043452_model_shadow_testing.sql:link.model_shadow_settings(单行表:id + enabled 默认 false,CHECK id = 1)与 link.model_shadow_rules(主键 (public_model_id, request_kind),backend_model_id 外键指向 link.backend_models,public_model_id 外键指向 link.public_models,probability CHECK 0–1,request_kind CHECK 仅 chat_completions / responses / messages);db/schema/link.hcl 与 atlas.sum 同步。纯新建两张表、无回填,是本轮较安全的一份,但 Link 与 Admin 都依赖它。
MAPI 计费预检恢复原行为 + 独立资金提示路由

修复一个已在线上的兼容性回归(OPEND-3880):#248 曾把「可选 early-hint 的降载、2 秒截止、5 秒正向缓存」加到既有 GET /api/v1/workspaces/{workspaceId}/billing/preflight 上,而该端点本来就用于配额展示与充值后恢复;生产池配置下第 6 个并发请求会被 503 拒绝,即使用户从未选择 early hint。本次把该端点恢复为 #248 之前的实现(新鲜读、无并发名额 / 截止 / 缓存、无额外资金约束查询,可选 fundingCheck 字段重新省略),把受限的提示处理器搬到新路由 GET /api/v1/workspaces/{workspaceId}/billing/funding-check(CLI:vela billing funding-check),并新增独立 HTTP 路由指标 vela_api_billing_funding_check_rejections_total{reason="busy"|"timeout"}(reason 取值有界、不含账户标识)。Link 准入、扣费、自动充值与 DB schema 均不变。

必要依赖:旧客户端无需升级即可恢复;要让 early hint 真正被用户侧使用,需要发布带 billing funding-check 的新 CLI 稳定版并更新外部 Open Design adapter(CLI / 外部仓库走独立通道,不在本报告五元组内,本轮未核验其现状)。该路由仍然会有 503(受限降载被刻意保留),只是不再影响 legacy 通路。

Author:lefarcen

  • e204cf937 fix(billing): isolate optional funding checks from legacy preflight (#276)
无。 既有预检端点行为回退 + 新增受限提示端点:services/api/src/billing/http/routes.ts(legacy handler 还原、新路由 /billing/funding-check、并发名额改名 fundingCheckLoad)、services/api/src/billing/preflight-load.ts、services/api/src/metrics.ts(新计数器);apps/cli/internal/client/billing_preflight.go 与 apps/cli/internal/commands/billing_preflight.go 属 CLI 独立通道;services/api/test/billing-preflight.test.ts 为回归用例。无 schema 变更。 无。 无。 无 schema / migration 变更(commit 说明明确 “No migration is needed”)。
MLink 扩展 OpenAI temperature 兼容名单(Sol / Astra / Terra / Luna)

修复 OPEND-3882:官方 OpenAI 的 GPT-6 Sol / GPT-6.1 Sol 在 medium reasoning 下携带 temperature 会返回 400;同链路排查还复现了 GPT-6 Astra 与 GPT-5.6 Sol / Terra / Luna 的同一问题。修复把原先只覆盖 Luna 的策略改名为 omitUnsupportedOpenAITemperature 并扩展到经真实验证的模型名单:命中「provider_openai + kind openai + 精确模型 + medium」时省略 temperature、改用模型默认采样,同时通过既有 ExtraParams 保留 reasoning(避免旧 Responses 能力表丢字段)。修复前 16/16 + 32/32 稳定 400,修复后 24/24 + 48/48 成功,端到端 84/84 通过。

边界:仅对真实复现过的模型生效,其他 provider / 模型 ID / effort / 采样字段不扩大范围;不再遵循调用方指定的温度;GPT-6 Astra high / xhigh 别名与已停用模型(5.3 Codex、5.4、5.5 等)不在名单内。

Author:Liu Yi

  • d9cecb4ce fix(link): 修复 Sol 及同类 OpenAI 模型的 temperature 400 (#275)
无。 无。 services/link/internal/providercompat/adapter.go(Chat / Responses 两条路径改为 omitUnsupportedOpenAITemperature,模型名单与注释更新);同步 specs/current/link/provider/providers/openai.md,并把 E2E 复现脚本 / fixture 由 Luna 扩展为 e2e/link/test-openai-temperature.py 与 e2e/link/fixtures/openai-temperature.sql。无 schema、无配置依赖;滚完全部副本即生效。 无。 无 schema / migration 变更(e2e/link/fixtures/*.sql 只是本地验证夹具,不进生产)。
MAdmin 模型预算:K 单位编辑 + 单项保存只校验关联配置

两个 Admin 侧修正一起看:① #272 统一上下文预算的展示与编辑口径 —— 公共模型编辑入口的上下文窗口、输入预算、输出预算全部以 K Token 编辑(1K = 1000),列表表头统一为「上下文预算」且输入 / 输出等权展示(此前输出预算是弱化小字),旧模型缺输出预算时按 32K 回显;校验复用现有规则(输入 ≥ 1K、输出 1–128K、总计 ≥ 128K 且不超过上下文窗口,两项同时留空即清除预算)。② #274 让单个公共模型的保存不再被无关模型 / 供应商的配置错误阻塞:校验范围收敛为「该模型 + 其完整路由依赖(模型 → 路由 → 后端 → 供应商,含发布状态、运营覆盖与 realisations)」,而不是整个模型目录;同时修掉预算投影默认值 bug —— 没有总预算的模型不再被自动补上 32K output_budget(改为 null,与 Link 数据库加载逻辑一致,此前会导致 Link 拒绝保存)。全局 revision 冲突检查、引用检查、事务与审计保持不变,共享供应商 / 后端修改、路由策略与 bundle 操作仍走全目录校验。

Author:Liu Yi

  • cdcb803e3 fix(admin): 统一上下文预算展示并支持 K 单位编辑 (#272)
  • f9af7e8fb fix(admin): 单模型保存仅校验关联配置并修正预算默认值 (#274)
无。 无。 无。(两处都不改 services/link/;Link 侧只是保存时被调用的校验接口) 模型列表与编辑抽屉:models/list/model-tables.tsx、models/list/page.tsx、models/model-configuration-editor.tsx(K 单位输入 + 预算规则);服务端:lib/server/admin/model-configuration-repository.ts(候选范围收敛 + 预算投影修正)、README.md;en / zh 文案与 3 个测试文件(191 + 239 行)。注意与 #266 同文件区域:影子策略与预算投影都在 model-configuration-repository.ts,两者一起发布时应按同一版本回归。 无 schema / migration 变更。

不在五个发布维度内但与本轮相关:① 816a6d7d1(#277)与 c1bfe570d(#278)是分享发布闸门(test release fence)工具修正:前者让 tools/test-share-release.mjs 正确解析 Atlas 的 bigint 计数(含回归测试),后者删除 test 通道里自定义的分享 migration 前置步骤与 services/api/scripts/test-share-release-database.mjs,改由普通 root migration workflow 承载 —— 两者只影响 tools/、.forgejo/workflows/deploy-api-eks-test.yml(test 通道)与一个 test 脚本,不进任何服务镜像、不影响生产 deploy / migration workflow(services/api/scripts/ 下的删除只让 API 镜像少一个测试脚本)。② #265 的 apps/cli/internal/{client,commands}/*.go(vela share / collab 命令)与 #276 的 apps/cli/(vela billing funding-check)属 Vela CLI 独立发布通道,不计入五个维度。③ 分享功能的发布还涉及 infra/apps 侧 GitOps 资源与分享 shell(.app)域名,以及外部 Open Design 侧调用方改造,均不在本报告五元组范围内,本轮未核验。

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

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

发布建议

  1. Migration 判断:本次需要先跑一次 migration,且里面有两份互相独立的 migration:db/migrations/20261014043452_model_shadow_testing.sql(#266,link.model_shadow_settings / link.model_shadow_rules 两张新表)与 db/migrations/20261014123301_share_release.sql(#265,14 张新表 + 改造 collab.comment_events)。两者都是本轮要发布的 feature 的硬前置(Link / Admin 读写 link.model_shadow_*;API / Web 读写分享相关表与新列),因此只要本轮发布包含 #266 或 #265 就必须先 dispatch deploy-db-migrations-prod.yml(Atlas 按 atlas.sum 顺序一并 apply)。两份都是加表 / 加列、无删表删列、无数据回填;唯一需要注意的是 comment_events 上的索引重建(DROP INDEX + CREATE INDEX,非 CONCURRENTLY)会短暂阻塞对该表的写入,建议低峰执行并观察 migration workflow 的锁等待与耗时。若本轮只发布 #275 或 #272+#274(纯 Link / Admin 代码),则不需要跑 migration。
  2. 发布前必须确认的配置(#265 的硬前置,本轮未核验):SHARE_APP_ORIGIN + SHARE_AUTH_CLIENT_ID + SHARE_AUTH_CLIENT_SECRET 三项必须同时配置——三项全空即关闭分享登录(分享链接接口会明确返回 unavailable,不会给出错误地址),只配置其中一部分会让 API 启动直接失败(启动期校验 SHARE_AUTH_CONFIG_INVALID);分享测量需 SHARE_MEASUREMENT_ENABLED=true(值非法只关闭测量,不影响启动)。请把这组变量与分享 shell(.app)域名 / GitOps 资源一起纳入发布检查单。
  3. 服务发布顺序(本轮):五个维度都有变更,按依赖分成「先 schema、再 Link、再 API、再 Admin、最后 Web」:
    • 1) DB migration:dispatch deploy-db-migrations-prod.yml 应用上述两份 migration;跑完确认 link.model_shadow_settings / link.model_shadow_rules 已建,分享相关 14 张表已建,且 collab.comment_events 已有 author_kind / author_app_user_id / author_display_name / idempotency_key 四列与新的分页索引。
    • 2) Link:触发 deploy-link-eks-prod.yml 发布 c1bfe570d,一次带上 #266(影子测试)与 #275(temperature 兼容名单)。必须确认全部副本滚动完成(同一 commit、同一 digest、spec = updated = available = 当前 4 副本)。#266 在 Link 侧默认不产生任何行为(总开关默认关闭),#275 则会立即改变命中名单模型的上游请求参数。
    • 3) API:触发 deploy-api-eks-prod.yml 发布 c1bfe570d,带上 #265 的分享 / 跨站登录 / 测量端点与 #276 的计费预检隔离。必须在 migration 之后、且分享相关环境变量按上面的要求配置好之后发布(否则启动失败或分享登录不可用)。
    • 4) Admin:触发 deploy-admin-eks-prod.yml 发布 c1bfe570d,带上 #266 的影子策略界面与 #272 / #274 的预算界面 / 校验修正;依赖 link.model_shadow_* 两张表。可与 API 并行。
    • 5) Web:触发 deploy-web-eks-prod.yml 发布 c1bfe570d,带上 #265 的分享页(/artifact/*)与 CSP frame-src 调整。Web 与 API 都上线后分享页才有数据可显示,建议排在 API 之后。
    • 6) 发布后再启用 / 收尾(不是 EKS 发布本身):① 确认全部 Link 副本已升级后,在 Admin 打开影子总开关并配置按模型 / 协议的目标与概率(回退时先关闭并确认 reload,再回退应用,保留新表);② 发布带 vela share 与 vela billing funding-check 的 CLI 版本,并更新外部 Open Design adapter 以消费新的资金提示路由(vela-cli-* 属独立通道,本轮未核验其现状);③ 确认分享 shell 域名与 GitOps 资源就绪后再对外开启分享入口。
  4. 发布后观测:
    • Pod 实态:Web / API / Admin 应从 68f2de820 / 68f2de820 / 68f2de820 滚动到 c1bfe570d,各 2/2;Link 从 68f2de820 到 c1bfe570d,4/4;四者都应满足同一 commit、同一 digest、spec = updated = available。注意 Link 近期在缩容,副本数变化要与发布区分开看。
    • #265(DB + API + Web):分享页 /artifact/{projectId}/{slug} 可打开(含无后缀与非法后缀都停留在分享错误面而不是落到 console);项目发布 → 稳定 slug → 只读预览 → 复制链接 / Open in app 路径可用;评论的发表 / 分页 / SSE / polling 同步、写入门禁与限流(collab.share_rate_limits)、幂等键唯一索引(重复提交不产生重复评论)、已停止分享进入 stop 页且不再返回地址(url / link 互斥);跨站登录:无 .ai 会话时跳转登录并正确回跳、登录态落在分享域、share_auth_transactions 过期清理;测量开启时确认 viewer / login attempt / update attribution 写入且窗口与桶符合预期;确认未配置 SHARE_APP_ORIGIN 时接口返回 link.status = unavailable 而不是错误地址。
    • #266(DB + Link + Admin):默认关闭时确认正式链路指标 / 日志不出现 shadow_request_completed;启用后按目标模型抽样,确认影子请求的 request_id 独立、success / latency_ms / token 计数可读,event=shadow_sample_dropped 在满载时出现且正式响应延迟不受影响(验收场景中 210 秒 deadline 下正式响应约 16 ms);确认没有 usage_events 写入、没有额度 / 钱包 / 结算变化(同一请求开关影子扣费应一致);确认关闭后逐副本 reload 生效、回退顺序(关闭 → 确认 reload → 回退应用)可执行;provider / backend 维度混合正式与影子流量时对照阅读指标。
    • #276(API):确认 GET .../billing/preflight 恢复为新鲜读、第 6 个并发请求不再是 503(此前 PG_POOL_MAX=20 时名额为 5),fundingCheck 字段不再出现于 legacy 响应;观察新路由 /billing/funding-check 的 vela_api_billing_funding_check_rejections_total{reason="busy"|"timeout"} 与 503 比例(该路由仍会有受限降载);确认旧版 CLI 走 legacy 路径成功、新版 CLI 在 404 / 503 时不重试不回退;确认 Link 准入与扣费不受影响。
    • #275(Link):对 GPT-6 Sol / GPT-6.1 Sol / GPT-6 Astra / GPT-5.6 Sol / Terra / Luna 在 medium + 携带 temperature 的 Chat 与 Responses(JSON / SSE)确认不再 400、成功终态带非零 usage;确认未列入名单的模型、其他 provider 与 high / xhigh 等 effort 行为不变;注意行为变化:命中名单时调用方指定的温度不再被遵循(改为模型默认采样),reasoning 字段保留。
    • #272 + #274(Admin):以 K Token 保存 240K / 64K → 校验接口与数据库应得到 304000 / 64000、重开表单回显 240 / 64;列表表头为「上下文预算」且输入 / 输出等权;保存公共模型 A 时不受无关模型 B 配置错误影响(共享供应商也不扩散),而 A 自身预算非法仍必须 400;无总预算的模型保存后 output_budget 为 null(不再被补 32K);并发编辑的 revision 冲突仍保留输入。因 #266 与 #272 / #274 改到同一仓库文件,建议发布后对影子策略与预算配置各走一遍真实保存。
    • 回归项(已生效,仅抽查):#257 的 Admin 股票搜索渠道与 API stock_search_unavailable 行为、#233 的 Opus 5.5 max_tokens 与 output_budget、#267 的复用 X-Request-Id 不再误报限额、#248 的 fundingCheck 三态(本轮开始由新路由承载)。

备注:本报告所有 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。