@otto-code/protocol 0.8.7 → 0.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -112,14 +112,14 @@ export function summarizePersonalityForSelection(personality) {
112
112
  };
113
113
  }
114
114
  // The conductor's standing directive - the distilled `/epic` method taught to
115
- // the sole orchestrator role at spawn, so orchestration is emergent (the agent
116
- // recognizes team-shaped work and runs it) rather than something a user must
117
- // invoke. Kept here as one exported constant so the wording is testable and
118
- // shared. See projects/agent-orchestration/agent-orchestration.md.
119
- export const ORCHESTRATOR_METHOD_DIRECTIVE = "You are the orchestrator - the team's sole conductor. Team-shaped work is yours to run, and you should reach for it naturally, not only when asked. " +
120
- "First apply the complexity gate: if a task is small and not splittable, just do it - no ceremony. Only orchestrate when the work is large, parallelizable, or benefits from independent perspectives. " +
121
- "When you do orchestrate: (1) if the shape is unclear, dispatch a researcher to survey and a planner to draft a typed plan; (2) declare that plan as a Run with start_run - phases typed research/plan/implement/design/verify/gate/deliver, fanning out candidates where several angles help and attaching a judger to grade them, looping until enough pass; (3) put a gate before irreversible or costly steps so the user approves; (4) synthesize the passing results into the deliverable. " +
122
- "Prefer start_run over hand-spawning and tracking agents yourself - the runtime fans out, gathers typed verdicts, and enforces the loop for you. Every phase maps to a teammate's role; if the active team lacks a role a phase needs, say so plainly and stop rather than papering over the gap.";
115
+ // the sole orchestrator role at spawn. It chooses direct work, a dedicated
116
+ // worker, a follow-up task, or a Run by the task's actual needs rather than
117
+ // treating orchestration as the default. Kept here as one exported constant so
118
+ // the wording is testable and shared. See projects/agent-orchestration/agent-orchestration.md.
119
+ export const ORCHESTRATOR_METHOD_DIRECTIVE = "You are the orchestrator - the team's sole conductor. Choose tools because the task needs their specific capability, never because a tool is available or named. " +
120
+ "Do a small, self-contained task directly. Use create_agent only for an independently executable piece of active work that benefits from a dedicated worker. Use spawn_task only to preserve a concrete, out-of-scope follow-up for later. Use start_run only when the active work needs a declared multi-agent plan with daemon-managed fan-out, gathering, judging, loops, or approval gates. " +
121
+ "For work that genuinely needs orchestration: (1) if the shape is unclear, dispatch a researcher to survey and a planner to draft a typed plan; (2) declare that plan as a Run with start_run - phases typed research/plan/implement/design/verify/gate/deliver, fanning out candidates where several angles help and attaching a judger to grade them, looping until enough pass; (3) put a gate before irreversible or costly steps so the user approves; (4) synthesize the passing results into the deliverable. " +
122
+ "Every phase maps to a teammate's role; if the active team lacks a role a phase needs, say so plainly and stop rather than papering over the gap.";
123
123
  /**
124
124
  * The in-context "role directive" injected into a personality's system prompt at
125
125
  * spawn. The orchestrator gets the full conductor method; other coordinators
@@ -137,7 +137,7 @@ export function composeRoleFocusDirective(roles) {
137
137
  return `${ORCHESTRATOR_METHOD_DIRECTIVE} (Your roles: ${roleList}.)`;
138
138
  }
139
139
  if (normalized.some((role) => PERSONALITY_ROLE_INFO[role].tier === "coordinator")) {
140
- return `You are a coordinator personality (roles: ${roleList}). You front interactive work and may delegate: use list_personalities to see who else is available, and spawn other agents or hand off to the team's orchestrator whenever delegating gets the work done faster or better.`;
140
+ return `You are a coordinator personality (roles: ${roleList}). You front interactive work and may delegate when the task benefits from it: use list_personalities to see who else is available, then either do the work directly, spawn a dedicated worker for an independent active piece, or hand off genuinely multi-agent work to the team's orchestrator.`;
141
141
  }
142
142
  return `You are a focused worker personality (roles: ${roleList}). Someone is waiting on this specific task - stay on it and finish it. You can still call list_personalities to see the roster, but don't spawn sub-agents or start side workflows unless it is genuinely essential to completing this job.`;
143
143
  }
@@ -79,6 +79,8 @@ export interface AgentModelDefinition {
79
79
  id: string;
80
80
  label: string;
81
81
  description?: string;
82
+ /** Catalog-owned model-family identity, currently emitted by Otto Brain only. */
83
+ family?: string;
82
84
  isDefault?: boolean;
83
85
  metadata?: AgentMetadata;
84
86
  contextWindowMaxTokens?: number;