pub struct Roles {
pub implementers: Vec<String>,
pub judges: Vec<String>,
pub reviewers: Vec<String>,
pub fixer: Option<String>,
pub planner: Option<String>,
pub chatter: Option<String>,
pub advisors: Vec<String>,
}Expand description
Explicit role assignment. Empty lists are filled in by
Config::resolve_roles by rotating the roster.
Fields§
§implementers: Vec<String>Agents that implement the task, one worktree each.
judges: Vec<String>Agents that rank the candidates blind.
reviewers: Vec<String>Agents that review the winning patch.
fixer: Option<String>Agent that applies review findings. Defaults to the winner’s author.
planner: Option<String>Agent that runs the magi plan interview and the browser conversation.
Unset picks a claude seat, else the first runnable agent in roster
order - which is roster order, not a judgement about who interviews
well. Naming one here is worth it because the interview is the one node
a human sits through: the model that asks good questions is not
necessarily the one that writes the best patch, and on a phone there is
no --agent to type.
chatter: Option<String>Agent that answers the resident chat’s quick turns (src/chat.rs),
distinct from planner on purpose.
Unset falls back to planner, which was the only behaviour before
this field existed - so an existing config that named a planner needs
no change to keep working. Splitting it out matters once planner is
also carrying a judge seat: the resident chat is opened far more often
than magi plan, and every open competes with that judge seat for the
same account’s concurrency. A timeout on an ordinary chat turn traced
to exactly this - opus triple-booked as planner, chatter, and judge
- is what this field exists to let an operator break apart.
advisors: Vec<String>Seats for magi plan’s design-deliberation stage (see
crate::advise): independent, read-only design proposals gathered
between the interview and the task file it files.
Empty falls back to judges rather than to the whole roster: a panel
trusted to rank patches independently is exactly the panel worth
asking to sketch a design independently, and an operator who has
already thought about judge diversity gets advisor diversity for free
instead of a fourth roster to maintain.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Roles
impl<'de> Deserialize<'de> for Roles
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for Roles
impl RefUnwindSafe for Roles
impl Send for Roles
impl Sync for Roles
impl Unpin for Roles
impl UnsafeUnpin for Roles
impl UnwindSafe for Roles
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more