Skip to content

sms settings 的 provider options 表与 SMS transports 之间没有契约测试 —— mail 有,sms 没有(#5094 同形,目前两端恰好一致) #5773

Description

@baozhoutao

在 #5713(CLI 启动期拒绝表外 OS_SMS_PROVIDER,PR #5771)中发现,记录下来交 triage。不在 #5713 的完成范围内 —— #5713 修的是 os serve 的构造期读取路径,这条是 settings 下拉框与 transports 之间的一致性,两个不同的面。

事实

mail 侧有一道可执行的契约闸门,sms 侧没有对应物。

  • packages/services/service-settings/src/manifests/mail.manifest.ts:5-28 的文件头把 PROVIDER_OPTIONS 明确称为「a CONTRACT, not a menu of aspirations」,并指向执行它的测试:
    packages/plugins/plugin-email/src/mail-manifest-providers.contract.test.ts —— 它把 manifest 里的取值与 EMAIL_TRANSPORT_PROVIDERS / makeTransport 双向比对,任一方向漂移即红。
  • packages/services/service-settings/src/manifests/sms.manifest.ts:24-29 的 provider 是同一形状的 select(log / aliyun / twilio),但仓库里没有任何测试把它与 makeSmsTransport 能建的 tag 集合比对。sms.manifest.test.ts 只断言 manifest 能通过 SettingsManifestSchema、命名空间的权限、以及两个密钥字段是 password + encrypted,不涉及取值集合。

grep 佐证:smsSettingsManifest 的全部引用只在 service-settings 包内部(index.ts / manifests/index.ts / sms.manifest.ts / sms.manifest.test.ts),没有任何 transport 侧的消费者。

为什么算一类问题

这正是 #5094 已经付过一次学费的形状:mail 的下拉框曾提供 sendgrid / ses 而背后没有 transport(选中、校验通过、保存成功、然后什么都不发),同时真正有 transport 的 resend 根本选不到。修法是让两边由一个词汇表 + 一道契约测试锁死。sms 现在有两份独立维护的字面量,只是恰好一致,没有任何东西在它们分开时报警。

PR #5771 把 sms transports 的词汇表提成了具名导出 SMS_TRANSPORT_PROVIDERS(packages/services/service-sms/src/transports/index.ts),所以写这道契约测试的原料现在是现成的:比对 sms.manifest.ts 的 provider options 与 SMS_TRANSPORT_PROVIDERS,双向。

严重度(诚实标注)

今天没有用户会撞上 —— 两端都是 log / aliyun / twilio,集合相等。这是一条休眠的漂移风险,不是现存缺陷,所以按 observation-class 打 finding 标签、不入 pm:queue,请 triage 分级。

一个已知的落地障碍:mail 的契约测试住在 plugin-email 里(它依赖 service-settings)。sms 的对应测试要么住在 service-sms(需要新增对 service-settings 的依赖 —— 应先确认不成环),要么住在 service-settings 里反向 import service-sms。选哪边是这条 issue 需要决定的事情之一。

相关

Activity

  1. claude commented on Aug 6, 2026

    @claude
    Contributor

    分诊(发现分诊轮,#4949 纪律):持有(留 finding),补域标签 domain:services。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    分诊(发现分诊轮):重启条件已触发 ⇒ 晋级 pm:queue(域标签维持 domain:services)

    上一轮(2026-08-06 04:58Z)判持有,记的重启条件是「PR #5771 合入后 —— 该 PR 提供的具名导出是这道测试的原料」。本轮核验该条件已满足:

    • PR fix(cli,service-sms)!: 启动期拒绝表外的 OS_SMS_PROVIDER,而不是静默降级成 LogSmsTransport (#5713) #5771 已 MERGED,merged_at = 2026-08-06 05:02:03Z(base f205c32)。
    • origin/main(1624f4a)上原料到位:SMS_TRANSPORT_PROVIDERS = ['log','aliyun','twilio'] as const(packages/services/service-sms/src/transports/index.ts:27)、isSmsTransportProvider()(:38),并经 packages/services/service-sms/src/index.ts:13-14 出包;SmsProviderTag 已从数组派生(不再是第二份字面量)。
    • 另一端仍是正文描述的形状:packages/services/service-settings/src/manifests/sms.manifest.ts:24 的 provider 仍是带 options 表的 select,sms.manifest.test.ts 仍只断言 schema/权限/密钥字段,没有任何测试比对取值集合。两端「恰好一致」的休眠漂移风险原样成立。

    落点与待决取舍(留给派发词,不是拍板项): 双向比对 sms.manifest.ts 的 options 与 SMS_TRANSPORT_PROVIDERS;测试住哪一侧(service-sms 新增对 service-settings 的依赖——需先确认不成环;或 service-settings 反向 import service-sms)由 dev 在实读依赖图后定,mail 侧的既有形是 packages/plugins/plugin-email/src/mail-manifest-providers.contract.test.ts(住在消费侧插件里),可作方向参考。

    查重:三仓 open issue 与 PR 各搜一遍,无影子单;#5713/#5094/#5131 均为相关面而非重复。

    ℹ️ 提示:domain:services 座位自 2026-08-06 05:15Z 起按维护者指示暂停(见 #4604 该行),本单入队后需等座位恢复才会被选批。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. self-assigned this
    on Aug 6, 2026
  4. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    认领:PM 循环第 3 轮(services 车道)
    会话:session_015a5qkLzpGXhLL2F5gvJ7dD
    分支:claude/issue-5773-sms-manifest-provider-contract
    Worktree:objectstack-issue-5773
    域:domain:services
    文件面:新契约测试一份(住 packages/services/service-sms 或 packages/services/service-settings,依赖方向 dev 实读后定,mail 先例住消费侧)+ sms.manifest.ts 如需加指向注释;⛔ 不改 provider 词表本身
    串行约束已清:PR #5771(原料 SMS_TRANSPORT_PROVIDERS)已合于 05:02Z,今日 de770bf 触过 service-sms,基于合并后 origin/main;#2814(将增 sms settings 键、同 manifest 文件)后轮串行;#5712 服务半边 blocked(#5933),同包无在飞冲突


    Generated by Claude Code

  5. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    验收:ACCEPT → PR #5982(tests-only;CI 绿后转 ready 入队,本座位跟到 MERGED)。

    经办:services 座位,会话 session_015a5qkLzpGXhLL2F5gvJ7dD(第 3 轮)。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions