Skip to content

send_email 写入 sys_activity.actor_name 仍是裸 user id — #673 的孪生缺陷(contact.actions.ts:77) #678

Description

@yinlianghui

#673 实施时发现的同型缺陷,按派发文件面边界未顺带修改,单独立单。Filed unassigned by the PM loop。

缺陷

src/actions/contact.actions.ts:77 的 send_email action 写 actor_name: ctx.user?.name ?? null —— 与 #673 逐字节相同的缺陷,写入同一张 sys_activity 表:联系人时间线上每封已记录邮件的操作者仍显示裸 user id。

平台侧根因同 #673(REST 派发路径把 ctx.user.name 硬编码为 userId,已上报 objectstack 侧,见 #673 验收评论中的上游链接)。

修法

一行级修复:#673 已在 src/actions/global.actions.ts 落地显示名解析块(经 sys_user.name 一次查询,id 兜底,失败不阻断日志,平台兑现 ctx.user.name 之日即可删除)。将该解析逻辑导出复用到 send_email body,或按相同形状内联。

验收

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Aug 5, 2026
  2. self-assigned this
    on Aug 5, 2026
  3. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    认领:PM 循环第 3 轮
    会话:session_0194QUW67v7vyLToEd9NSeRM
    分支:claude/hotcrm-bug-triage-ks55ze(维护者指定的统一开发分支)
    Worktree:hotcrm-issue-678(基于分支当前 head,不基于 main)
    文件面:src/actions/contact.actions.ts、src/actions/global.actions.ts(仅在需要导出复用解析逻辑时)、对应测试、changeset。不触碰 src/objects/、src/profiles/(#549 本轮持有)、src/flows/(#650 本轮持有)。

    必须基于分支当前 head 开工:#673 的显示名解析块已落在 global.actions.ts(提交 ec8f5d06),本单要复用它而不是另写一份;#548 又刚改过 actions 里的 owner_id 写入(那些显式写入是承重的,action body 跑在 isSystem 下不会自动打戳,不要以为冗余而删)。


    Generated by Claude Code

  4. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    验收 ACCEPT(PM 复核,对照远端分支):

    • 落地:提交 9b562b16(merge 04beeb5f),随 PR fix: bug 批次修复(PM 派发循环)— #606 #673 #610 #548 #678 #650 已落地 #677 评审。
    • 核验:src/ 中已无任何写入方 stamp 裸 id —— 唯一命中 actor_name: ctx.user 的是共享块自己的退休说明注释(指向 objectstack#5372),不是代码路径。
    • 验收要求的「不得漂移」以最强形式满足:解析逻辑不是复制两份,而是从 global.actions.ts 导出为 action body 的源文本 ACTOR_NAME_RESOLUTION_SOURCE,由 activityAction() 与 send_email 在编写期各自拼接;test/action-sandbox.test.ts:469 的守卫断言「每个 actor_name 写入方都拼接同一个块」,任何一方改成内联即变红。
    • 共享函数在这里不可行且是实测的而非假设的:action body 只带 body 进 QuickJS、无模块作用域,调导入即运行时 ReferenceError;dev 用「重构前后 crm_case:log_call 生成体逐字节对比(仅两行注释措辞不同)」证明该重构是惰性的。
    • 反向验证:预先声明方向为红,还原后恰好三条失败(显示名 pin、单次查询 pin、防漂移守卫),第四条(空值兜底)按其自身语义保持绿并已说明理由 —— 报告如实指出这一点,没有把它包装成回归护栏。
    • 另记一次守卫迭代:首版「禁止裸 ctx.user」检查会命中共享块自己引用缺陷写法的注释,已改为排除注释行 —— 守卫不该被它所修复的那段说明打中。
    • 全量 53 文件 / 1316 通过;typecheck / hygiene / validate / build 均绿。

    本单保持 open,待 PR #677 合并后由 Fixes #678 自动关闭。


    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

Labels

bugSomething isn't workingpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loop

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions