Run Actor 传播
wesgine 中 Actor 标识在 Run 生命周期内的传播机制。
Actor 是必填一等字段
cell.Runtime().Run(ctx, AppRunRequest{
Actor: "alice", // ★ 必填(空 → ErrActorRequired)
SessionID: "s1",
AgentID: "agent-legal",
Messages: []Message{...},
})
Actor 传播链路
AppRunRequest.Actor
→ RunParams.Actor // 引擎内部运行参数
→ Tags["actor"] // 自动同步到审计标签
→ MemoryEntry.Actor // 写入记忆时强制携带
→ Session.Actor // 会话归属
→ RunTrace.Tags.actor // 观测数据归因
→ TokenUsage.Tags.actor // 用量归因
委派子 Run 的 Actor 继承
delegate_task 创建的子 Run 必须继承父 Run 的 Actor:
// tool.go 同时写两处
pp.Actor = tc.Actor // 一等字段
pp.Tags["actor"] = tc.Actor // 审计标签
// runner.go 子 actor 为空时从父继承
if childParams.Actor == "" {
childParams.Actor = parentParams.Actor
}
无主 Run 的问题
Actor 漏传会导致"无主 Run":
| 后果 | 说明 |
|---|---|
| 记忆写入失败 | RequireActor 拒绝空 Actor |
| Run 记录不可见 | INV-OBS-10:无主 Run 隐藏 |
| 工具执行无归属 | 工具调用无法追溯到用户 |
| Cron 任务冒名 | INV-CRON-10:以别人身份执行 |
Actor 与 Token 的关系
| Token 类型 | Actor 来源 |
|---|---|
| Admin Token | 请求可选传 ?actor=(管理视图) |
| Cell Token | Token 内嵌 Actor(普通用户) |
| 无 Token | ErrUnauthorized |
产品侧 Actor 派生
| 产品 | Actor 值 |
|---|---|
| wesclaw 桌面 | authSvc.OwnerID() 或 "local" |
| wescode | "local"(单用户) |
| wescraft 个人版 | "local" |
| wescraft 团队版 | SSO user_id |
| teleclaw | JWT claim userId |
Actor 不可变性
Run 内 Actor 不可变——创建后不能切换。
切换 Actor = 新建 Run。
相关不变量
- SD-15:Actor 是一等必填字段
- INV-MEM-38~47:Actor 边界
- INV-OBS-10:无主 Run 隐藏
- INV-CRON-10:Cron 执行身份
相关文档
- Actor 模型 →
actor-model.md - 记忆 Actor 边界 →
memory-actor-boundary.md - 观测面边界 →
observe-boundary.md - 委派 →
delegation.md