docs(protocol/kernel): config-resolution 的 email 示例改用真实存在的键与取值 (#5105) - #5113
Merged
Merged
Conversation
「Example 3: Development Overrides」的示例有三处不对应任何真实配置面:
`provider: 'sendgrid'` + `fromAddress`、开发覆盖 `provider: 'console'`、
env 覆盖 `OS_EMAIL_PROVIDER=mailhog`。对照
packages/spec/src/system/email-config.zod.ts:EmailProviderSchema 是
z.enum(['log','resend','postmark']),三个取值一个都不在里面;发件人键叫
defaultFrom(且是 { name?, address } 对象),不叫 fromAddress。
改用今天在 main 上就成立的取值:生产段 provider: 'resend' + defaultFrom,
并补上 apiKey(非 log provider 缺 key 时 serve.ts 会回落到 LogTransport);
开发覆盖 provider: 'log'。刻意不写 'smtp' —— 那要等 #5104 把它加进
EmailProviderSchema 之后才成立。
env 覆盖层顺带修实:单纯把 mailhog 改成 log 会与开发段重复、令
「further override」失去示范意义,故按本页 §Merge Strategies 自己教的深合并
语义补一行 OS_EMAIL_FROM 覆盖继承下来的 defaultFrom。层叠要点(生产 →
开发 → env 的优先级)因此比改之前更完整。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017MCKJaEomEqg4tvz4SzdNd
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
os-zhuang
marked this pull request as ready for review
August 4, 2026 05:46
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5105
纯文档单,只改一个文件面:
content/docs/protocol/kernel/config-resolution.mdx(外加一份 changeset)。未碰content/docs/releases/,未碰packages/spec。问题
「Example 3: Development Overrides」的示例有三处不对应任何真实配置面。对照
packages/spec/src/system/email-config.zod.ts(origin/main 实读):provider: 'sendgrid'EmailProviderSchema=z.enum(['log','resend','postmark']),无sendgridfromAddress: 'noreply@company.com'defaultFrom,且是{ name?, address }对象(EmailAddressConfigSchema),不是字符串provider: 'console'consoleOS_EMAIL_PROVIDER=mailhogmailhog后果是错误全部推迟到运行时:
fromAddress被静默丢弃,未知 provider 要到makeTransport才抛 unknown provider。属 Prime Directive #10 的「advertise a capability the runtime doesn't deliver」。值得说明的是这一页的 warn callout 救不了它:那条 callout 只把
database/http/secrets.provider列为意图示意,email不在豁免名单里,而且它是真实配置面 ——packages/cli/src/commands/serve.ts的cap === 'email'分支实打实读config.email.{provider,apiKey,defaultFrom,retries}并按OS_EMAIL_*覆盖。所以这段示例不该靠「示意」免责,它应当是真的。改法
保留原来的载体(email)与原来的层叠要点,只把取值换成今天在
main上就成立的:provider: 'resend'+defaultFrom: { name, address },并补上apiKey—— 非log的 provider 缺 key 时serve.ts会打 warning 并回落到 LogTransport,示例不写它等于示范一份「看着配好了、其实没发出去」的配置,是同一个缺陷换个方向再犯。provider: 'log'。OS_EMAIL_PROVIDER=log。刻意没有写
smtp。EmailProviderSchema目前仍是三值枚举,把smtp加进去是 #5104 的工作、尚未落地;此刻写它就是把本单刚修掉的 declared ≠ implemented 重新引入一遍。一处超出「逐字替换」的改动,理由
原文 env 层只有一行。若单纯把
mailhog改成log,而开发配置段已经选了log,这一层就退化成一条无效果的示例,「Developer can further override」讲不通 —— 取值修对了,机制却讲丢了,而 PM 分诊明确要求保住层叠要点。故按本页 §Merge Strategies 自己教的「对象深合并、原始值替换」把语义补全:开发文件只替换了
provider,apiKey/defaultFrom仍从生产配置继承,于是再加一行OS_EMAIL_FROM覆盖defaultFrom。该变量是真实的(content/docs/deployment/environment-variables.mdx有登记),serve.ts也确实解析addr与Name < addr >两种写法。结果是「生产 → 开发 → env」三层优先级比改之前更完整。未加
os:check该代码块把 shell 赋值行混在 typescript 围栏里,是伪代码片段、本就不可编译;加
{/* os:check */}只会让check:skill-examples变红。这也是它当年能悄悄烂掉的原因,但让它可编译需要重写整块(加 imports /defineStack包装),超出本单范围。验证
纯文档改动,按 PM 指示跑该页相关的 docs 门禁,未跑全仓构建/测试:
changeset:按 #5023(同类纯文档纠正)的先例给了一份空 frontmatter 的 changeset —— 不 bump 任何包,只进 release notes 编译。
🤖 Generated with Claude Code
https://claude.ai/code/session_017MCKJaEomEqg4tvz4SzdNd
Generated by Claude Code