测试台:抽键预检屏与收件箱格一并撤,台面改两栏对开

**抽键预检读数屏删了**。宽进之后它已经不是闸,只是一屏会亮会灭的字 ——
抽得出抽不出,进了活动由受理补全单说了算,不必在门口先演一遍。
镜像服务端正则的那份前端实现(`preflight`)随之退场:一套规则两处实现,
本就是迟早对不上的账。

**收件箱那一格删了**。投给哪个信箱是通道配置的事,不是造这封信的人该操心的 ——
契约里 `mail.to` 放宽为可空,空地址由服务端取在用的邮件通道(与线上真来一封信同一条路)。
信头从三行收成两行:发件人 / 主题 → 正文 → 附件签条。

**台面重排**:从「左读数屏 + 右两段」改成 **两栏对开** —— 左造信(01)、右派人(02),
起单条横跨两栏吸在底边,像仪器前面板压在桌沿上。被测流不再占一整栏:它是一次性的
决定,改成顶部一行卡片,且只在多于一条生效流时才出(没得选的选择器是纯占位)。

实测(丁子乔账号):不写收件箱照样起单成功,起后「停止仿真」连根销毁,
任务 0 / 工作流 0,试跑数据未留。五闸绿。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-29 22:51:09 +08:00
co-authored by Claude Opus 5
parent e5cfca638f
commit 18c3e3fd09
5 changed files with 67 additions and 182 deletions
+3 -1
View File
@@ -120,8 +120,10 @@ async function assembleFromMail(
mail: { from: string; to: string; subject: string; body: string; attachments: readonly { name: string }[] },
): Promise<Record<string, unknown>> {
const channels = await container.channel.list();
// 收件箱可以不写:界面已不出这一格 —— 空地址就取在用的邮件通道
const channel =
channels.find((ch) => ch.address === mail.to) ?? channels.find((ch) => ch.kind === 'mail' && ch.enabled);
(mail.to === '' ? undefined : channels.find((ch) => ch.address === mail.to)) ??
channels.find((ch) => ch.kind === 'mail' && ch.enabled);
if (channel === undefined) throw new Error(`没有可用的邮件通道 —— 收件地址 ${mail.to} 对不上任何通道`);
const triggers = await container.trigger.list();