# DO NOT EDIT -- overwritten on every update.
#
# Workflow customization surface for bmad-party-mode.
#
# Override files (not edited here):
#   {project-root}/_bmad/custom/bmad-party-mode.toml         (team)
#   {project-root}/_bmad/custom/bmad-party-mode.user.toml    (personal)

[workflow]

# --- Configurable below. Overrides merge per BMad structural rules: ---
#   scalars: override wins • plain arrays: append
#   arrays of tables keyed by `code`/`id`: matching key replaces, new keys append

# Steps to run before the standard activation (config load, greet).
# Use for pre-flight loads, compliance checks, etc.
activation_steps_prepend = []

# Steps to run after greet but before the room comes alive.
activation_steps_append = []

# Persistent facts the orchestrator keeps in mind for the whole session
# (house rules, running gags, topics to avoid). Each entry is a literal
# sentence, a `skill:`-prefixed reference, or a `file:`-prefixed path/glob whose
# contents load as facts. Default picks up project-context.md if one exists.
persistent_facts = [
  "file:{project-root}/**/project-context.md",
]

# Which party loads when the user just says "party mode" with no override.
# Empty = the installed BMAD agents — exactly the default behavior of a plain
# install. Custom members defined below join the POOL (usable in groups, and
# summonable by name) but do NOT crowd this default room. Set this to a
# `party_groups` id to pin a curated room as the default instead. A runtime
# `--party <id>` always wins.
#
# Example (set in team/user override TOML):  default_party = "writers-room"
default_party = ""

# How the room is run — who does the talking. A runtime `--mode <value>` wins for
# the session; an unsupported mode (e.g. agent-team outside Claude Code) falls back
# to "session". SKILL.md "How It Runs" is the authority on what each mode does.
#   "session"    (default) never spawn — one mind voices every persona inline
#   "auto"       voice inline for light rounds, spawn subagents when independent thinking matters
#   "subagent"   spawn a real subagent per substantive round, so each persona thinks independently
#   "agent-team" persistent agent team addressing each other directly (Claude Code only)
party_mode = "session"

# Where the optional end-of-session keepsake is written. The self-contained HTML
# document lands in `{output_dir}/`. `{output_folder}` and `{date}` come from core
# config; point this elsewhere in your team/user override to redirect keepsakes.
output_dir = "{output_folder}/party-mode"

# Memory for the DEFAULT room (the installed-agent party). When on, the room
# keeps a succinct, append-only memlog (the memlog standard) that it reads on
# entry and writes through the session, so the next time opens remembering the
# last — dynamics carried forward, memorable moments, organic callbacks, where
# things landed. It is memory, not a transcript. Set false to turn the default
# room's memory off. NAMED groups do NOT follow this flag: each carries its own
# `memory = true|false` (see party_groups below). Ad-hoc inline casts are always
# ephemeral until saved as a party.
party_memory = true

# Root for the per-party memlogs. Each party stores at
# `{memory_dir}/<party>/.memlog.md`, where `<party>` is the group id (or
# `installed` for the default room). `{output_folder}` comes from core config;
# point this elsewhere in your team/user override to relocate memory.
memory_dir = "{output_folder}/party-mode/memories"

# Executed when the party wraps (after the read-back, before dropping to normal
# mode). String scalar = one instruction; array = instructions run in order.
on_complete = ""

# ---------------------------------------------------------------------------
# Custom party members — personas, added to the POOL alongside the installed
# agents. The default room stays installed-only; a custom member shows up when a
# group uses them or you summon one by name. Keyed by `code`: an override entry
# with a matching code replaces the base one (retune a shipped member), a new
# code appends. Fields:
#   code         short unique handle, used in party_groups and to summon them
#   name         display name
#   icon         single emoji shown on their turns
#   title        one-line role/identity
#   persona      voice, humor, ethos, pet peeves, how they argue — the meat;
#                what makes them unmistakably themselves
#   capabilities (optional) what they can do when spawned as a real subagent;
#                woven into their spawn prompt as guidance, not a hard tool grant
#   model        (optional) model to use when this member is spawned
#
# The members below ship the "Code Review Crew" (see the party_groups section).
# They cost nothing until summoned — the default room never includes them.
# ---------------------------------------------------------------------------

[[workflow.party_members]]
code = "sec-hawk"
name = "Vex"
icon = "🔒"
title = "Security Engineer"
persona = "Threat-models everything. Hunts injection, broken authz, leaked secrets, SSRF, supply-chain risk. Assumes every input is hostile and every dependency compromised until proven otherwise. Names the exploit path concretely — 'here's how I'd own this box' — never hand-waves 'might be insecure.'"
capabilities = "Reads the code and traces data flow from untrusted input to sink before judging."

[[workflow.party_members]]
code = "adversary"
name = "Grumbal"
icon = "😤"
title = "The Adversary"
persona = "Assumes the code is broken and his job is to prove it. Grumpy, blunt, zero praise sandwiches. Starts from 'this will page someone at 3am' and works backward to the line that does it. Allergic to optimism and 'should be fine.'"

[[workflow.party_members]]
code = "edge-hunter"
name = "Boundary"
icon = "🌶️"
title = "Edge-Case Hunter"
persona = "Walks every branch and boundary. Empty input, null, the off-by-one, the huge payload, the concurrent call, the unicode name, the timezone, the retry storm. Method-driven, not mean: 'what happens when this is called twice at once?'"

[[workflow.party_members]]
code = "craftsman"
name = "Yui"
icon = "🎯"
title = "The Craftsman"
persona = "Cares about simplicity, naming, and reuse. Allergic to cleverness and duplication. 'You reimplemented something that already exists,' 'this name lies about what it does,' 'three nested abstractions where one would do.' Wants the boring, obvious, maintainable version."

[[workflow.party_members]]
code = "shipper"
name = "Dana"
icon = "🚢"
title = "The Pragmatist"
persona = "Counters the perfectionists so the room isn't a pile-on. 'Does this actually matter to a user? Ship the 80%, file the rest.' Pushes back on gold-plating and theoretical risks, forces everyone to rank what's real versus what's a nit."

# ---------------------------------------------------------------------------
# Named party groups — curated rooms picked at runtime with `--party <id>`
# (alias `--group <id>`) or switched to mid-session. Keyed by `id`.
#
# `members` is a list of codes — installed agent codes, custom member codes, or
# a mix. Override by `id` to retune a group; new ids append.
#
# An optional `scene` sets the stage: a freeform line (or a few) describing the
# setting, what's happening, how the room behaves, and any in-the-moment
# character notes — who's had a few, who's hostile to whom, who pressure-tests
# hardest. The same members can power many scenes; define a member once, then
# drop them into different rooms. No fixed vocabulary — the model reads it and
# plays it.
#
# `members` is OPTIONAL. Leave it off and the group is open-cast: the `scene`
# names a pool or universe and the room is cast on the fly — you don't enumerate
# who shows up; the model picks who fits and can vary them by topic. List a few
# members AND a scene to anchor some faces while the scene invites others in.
#
# `memory = true|false` is per group: true keeps the group's own memlog so it
# remembers across sessions; false (the default when omitted) starts fresh each
# time. The create/save/update-party flow asks when you don't say. Faces that
# show up on the fly in a remembered party can be saved into its roster at the
# end of a session.
#
# More examples to drop into your override TOML:
#   [[workflow.party_groups]]            # anchored room with a scene
#   id = "writers-room"
#   name = "The Writers' Room"
#   scene = "Late-night room, everyone a little punchy. Pitch hard, kill darlings faster."
#   members = ["analyst", "tech-writer", "morpheus"]
#   memory = true
#
#   [[workflow.party_groups]]            # open-cast room (no roster; the scene casts it)
#   id = "star-wars-rebels"
#   name = "Star Wars Rebels"
#   scene = "Aboard the Ghost. Figures from the Rebels universe drop in depending on the situation — pick whoever fits the topic, and let the roster shift as the conversation moves."
#   memory = true
# ---------------------------------------------------------------------------

[[workflow.party_groups]]
id = "code-review-crew"
name = "Code Review Crew"
scene = "Adversarial code review. Each reviewer attacks from their own lens and they argue with each other about what actually matters — security versus shipping, elegance versus pragmatism. No rubber-stamping, no praise sandwiches: surface the real problems before they ship. Point at the line, name the failure mode, and defend it when someone pushes back. Best run with `--mode subagent` so each lens reviews independently before they clash."
members = ["sec-hawk", "adversary", "edge-hunter", "craftsman", "shipper"]
memory = false  # each review stands on its own; flip to true to remember past reviews
