feat(orchestration,runtime): subagent_spawn 支持指定目标角色(以该角色 instructions + 记忆域运行)
design/22 §8-2(主人 2026-10-03 拍板):跨角色协作 = 把其他角色以子代理形式派出去,
该子代理以目标角色的 instructions 运行、并按目标角色的记忆作用域读写。
- AgentSpec / SubAgent / SubAgentResult 新增 PersonaID;Options.PersonaExists 作角色解析器
- scheduler:派发前校验角色(ErrUnknownPersona),批量 all-or-nothing;
run ctx 经 withPersonaEnv 只覆盖 SessionEnv.PersonaID —— ActorEnv/MemWritable 原样复制
(身份识别靠 channel 元数据,persona 决定她怎么答、不决定她能碰什么:项目红线)
- 记忆归属键改为 PersonaID 优先(回落 RoleID)→ 替班者写的是目标角色的记忆域
- spawntool:schema 顶层与 tasks[] 新增可选 persona;省略 = 与旧行为逐字节一致
- 分支根节点新增 props.persona(可观测性);SinkMemory 移入 memory.go(守 500 行红线)
- 组合根:personaExists(agent 池);cmd/cyrene/wire.go +5 行
契约:Docs/api-client.md -> v0.47(graph_update 新增可选 props.persona,纯增量)
验证:go build/vet ./... 绿;internal/runtime/orchestration + cmd/cyrene 测试绿;
go test -race ./internal/runtime/orchestration -run Persona 绿;
linux/amd64 + darwin/arm64 交叉编译绿
变异验证:① 目标角色换回父/默认角色(3 处断言 FAIL)② 关调度器侧角色校验 ③ 关工具侧预检
This commit is contained in:
1 parent
c7ecc3a249
commit
05d34853f0
14 files changed
+857
-36
No files matched your search
@@ -40,6 +40,17 @@ type AgentSpec struct {
|
||||
Goal string
|
||||
// RoleID selects the role/persona the sub-agent is bound to.
|
||||
RoleID string
|
||||
// PersonaID is the role the sub-agent actually runs as (design/22 §8-2): it
|
||||
// answers with that role's instructions and reads/writes that role's memory
|
||||
// scope — "她以该角色身份临时替班". Spawn stamps it onto the sub-agent run's
|
||||
// session env, which is the single input the loop resolves the prompt, the
|
||||
// memory namespace, the emotion and the thinking knobs from, so the four can
|
||||
// never disagree. Blank keeps the pre-existing behavior byte for byte: the
|
||||
// sub-agent inherits the spawning turn's env, i.e. the parent session's role.
|
||||
// The id must be one this process can run with its own agent
|
||||
// (*Scheduler).PersonaKnown; Spawn rejects an unknown one with
|
||||
// ErrUnknownPersona instead of silently falling back to the default role.
|
||||
PersonaID string
|
||||
// Mode selects the behavior mode (e.g. "engineer") for the role.
|
||||
Mode string
|
||||
// Context is the initial, isolated conversation context. Spawn deep-copies
|
||||
@@ -107,6 +118,12 @@ var (
|
||||
// ErrAgentNotFound is returned by Abort when the sub-agent id is unknown.
|
||||
ErrAgentNotFound = errors.New("orchestration: sub-agent not found")
|
||||
|
||||
// ErrUnknownPersona is returned by Spawn when a spec names a role this process
|
||||
// has no per-role agent for (design/22 §8-2). It is a rejection, not a
|
||||
// fallback: running the sub-agent with the default role's prompt while the
|
||||
// caller asked for another role would silently defeat the request.
|
||||
ErrUnknownPersona = errors.New("orchestration: unknown persona")
|
||||
|
||||
// ErrNoScheduler is returned by the spawn tool when it was built without a
|
||||
// scheduler (a wiring mistake, reported instead of panicking).
|
||||
ErrNoScheduler = errors.New("orchestration: no scheduler configured")
|
||||
|
||||
Reference in new issue
Block a user