SalesPlayLibrary is the workspace where Brain Agents draft sales plays for human co-definition. It is the operational mechanism for the architectural commitment in the v26 evaluation: brains propose, RevOps and sales leaders refine into a small curated set, then AGT-302 executes. The hard volume cap on active plays per segment is the safety mechanism that prevents quiet play proliferation.
active rows are canonical — but only RevOps + SLM can transition state, never a Brain Agent.| State | Meaning | Who can write/transition |
|---|---|---|
| draft | Brain Agent has proposed a play. Lives in workspace for human review. Not visible to AGT-302. | Brain Agent (AGT-901 / AGT-902) inserts. No one else writes to draft rows. |
| under_review | RevOps or sales leader has picked up a draft and is co-defining it into a candidate active play. May edit hypothesis, target, cadence. Not visible to AGT-302. | RevOps + sales leader (manual transition from draft). Edits permitted. |
| active | Play approved and live. AGT-302 reads only active plays. Subject to hard volume cap per segment. | SLM + RevOps joint approval (both must approve; tracked in approval fields). Hard volume cap enforced at write time. |
| retired | Play removed from active execution. AGT-302 stops new sequence generation; in-flight sequences complete. Outcomes recorded for retrospective. | RevOps. Retiring a play frees capacity under the volume cap. |
Allowed transitions:
draft → under_review (manual human pickup)draft → retired (rejected without further work)under_review → active (joint approval)under_review → retired (rejected after review)active → retired (RevOps decision; play has run its course or replaced)retired is terminal. To re-launch a retired play, copy it into a new draft row.Per the v26 architecture commitment: too many plays overwhelm reps and managers; sales leaders only commit to plays they helped define. The cap is enforced at the database level — not advisory.
| Scope | Default cap | Configurable by |
|---|---|---|
| Per segment (SMB / MM / Ent / strategic / etc.) per quarter | 3 to 8 active plays simultaneously | RevOps via SalesPlayLibraryConfig (L0 table). Per-segment override permitted; default is 5. |
| Per account (account-specific plays from AGT-902) | 1 active per account | Hard cap. Account-specific plays must complete or retire before another can activate. |
| Per quarter total (across all segments) | Soft monitoring; no hard cap | RevOps dashboard surfaces total active count. Sustained drift past 30 active triggers a quarterly playbook review. |
active when the cap is already met is rejected at write time. The blocking transition surfaces an error to RevOps suggesting they retire an existing play first. No silent overflow.| Field | Type | Req | Notes |
|---|---|---|---|
play_id | UUID | REQ | Primary key. |
state | ENUM | REQ | draft / under_review / active / retired. State transitions enforced via trigger. |
scope | ENUM | REQ | segment (cross-account, segment-targeted) / account_specific (per-account from AGT-902). |
segment | VARCHAR(64) | opt | Required when scope = segment. Free-text segment label (e.g., commercial_mm, enterprise_strategic) matching segment taxonomy in TerritoryDefinitions. |
account_id | UUID | opt | Required when scope = account_specific. FK to Accounts. |
name | VARCHAR(128) | REQ | Human-readable play name. Editable in under_review. |
hypothesis | TEXT | REQ | The thesis the play tests. Editable in under_review. |
target_definition | JSONB | REQ | Target audience criteria: ICP tier, vertical, intent signals, lifecycle stage. JSON schema validated. |
suggested_cadence | JSONB | REQ | Sequence steps, channel mix, touch counts — in the format AGT-302 expects. May reference existing cadence templates by ID. |
success_criteria | JSONB | REQ | Measurable outcomes: target meeting rate, target opp create rate, target ACV. How the play will be retrospectively evaluated. |
originating_proposal_id | UUID | REQ | FK to BrainAnalysisLog.proposal_id of the brain output that drafted this play. Lineage anchor for cohort retrospective. |
writer_agent_id | VARCHAR(16) | REQ | Brain Agent that drafted: AGT-901 or AGT-902. |
created_at | TIMESTAMPTZ | REQ | DEFAULT NOW(). |
picked_up_by_user_id | UUID | opt | Set on draft → under_review transition. The human who picked up the draft. |
picked_up_at | TIMESTAMPTZ | opt | Set on draft → under_review. |
edits_during_review | JSONB | opt | Diff log of edits during under_review. Captures what humans changed from brain draft — valuable signal for brain calibration. |
slm_approver_user_id | UUID | opt | Required to transition to active. SLM identity. |
revops_approver_user_id | UUID | opt | Required to transition to active. RevOps identity. |
activated_at | TIMESTAMPTZ | opt | Set on under_review → active. |
active_period_start | DATE | opt | Required when active. When AGT-302 begins executing. |
active_period_end | DATE | opt | Optional sunset date. Beyond this, play auto-retires. |
retired_at | TIMESTAMPTZ | opt | Set on transition to retired. |
retired_by_user_id | UUID | opt | Set on transition to retired. |
retire_reason | ENUM | opt | Set on retire. completed / replaced / poor_performance / rejected_at_review / rejected_at_draft / auto_sunset. |
retrospective_outcomes | JSONB | opt | Measured success vs. success_criteria. Populated quarterly by RevOps from cohort data. Read by AGT-901 in next play-refresh batch. |
| Element | Definition | Why |
|---|---|---|
| Primary key | play_id | Surrogate. |
| Index 1 | (state, segment) WHERE state = 'active' | AGT-302 hot path: read active plays per segment. Fast. |
| Index 2 | (state, account_id) WHERE state = 'active' AND account_id IS NOT NULL | Account-specific play lookup. |
| Index 3 | (state, created_at DESC) WHERE state IN ('draft','under_review') | Workspace UI: show pending drafts/reviews to humans. |
| Index 4 | (originating_proposal_id) | Cohort retrospective lookup. |
| Index 5 | (writer_agent_id, created_at DESC) | Per-brain draft history (eval, brain calibration). |
| CHECK: scope ↔ segment/account_id | (scope = 'segment' AND segment IS NOT NULL AND account_id IS NULL) OR (scope = 'account_specific' AND account_id IS NOT NULL) | Mutual exclusion: a play targets either a segment or a single account, never both. |
| CHECK: active requires approvers | If state = 'active' THEN slm_approver_user_id IS NOT NULL AND revops_approver_user_id IS NOT NULL AND activated_at IS NOT NULL | Activation gate — both approvers required. |
| CHECK: state machine | Trigger validates allowed transitions only. Backward transitions blocked. | Auditability + integrity. |
| CHECK: volume cap (segment) | Trigger: on transition to active for scope=segment, count of existing active plays in that segment must be < cap from SalesPlayLibraryConfig. | Hard cap enforcement. |
| CHECK: volume cap (account) | Trigger: on transition to active for scope=account_specific, no other active play exists for the same account_id. | One active per account. |
| CHECK: writer_agent_id | writer_agent_id IN ('AGT-901','AGT-902') (extensible) | Brain identity discipline. |
| FK | originating_proposal_id → BrainAnalysisLog.proposal_id; account_id → Accounts; user IDs → Users. | Referential integrity. |
AGT-302 Cadence Coordinator is the execution engine. It reads SalesPlayLibrary WHERE state = 'active' at sequence-generation time. Plays in any other state are invisible to AGT-302 — the workspace is hidden from production execution by design.
| AGT-302 read | What's used |
|---|---|
target_definition | Filters which accounts/leads receive the play's sequence. |
suggested_cadence | Sequence steps + cadence type. AGT-302's existing 3-touch/week cap and ABM backstop still apply on top. |
play_id | Written to CadenceEventLog.play_id for every event generated under this play. |
originating_proposal_id | Written to CadenceEventLog.originating_proposal_id for cohort retrospective lineage. Per BrainAnalysisLog spec. |
active_period_end | If reached, AGT-302 stops generating new sequences from this play. AGT-302 can also auto-transition the play to retired with retire_reason = 'auto_sunset' if RevOps configures auto-sunset. |
SalesPlayLibrary closes the loop on brain quality. Three signals matter:
| Signal | What it measures | Brain calibration use |
|---|---|---|
Promotion rate (active / draft ratio per quarter, per brain) | How often brain drafts make it through co-definition to activation | Per AGT-901 eval criteria target ≥ 30%. Below that → brain not aligned with leadership criteria. |
Edit volume in edits_during_review | How heavily humans rewrite brain drafts during review | Heavy edits → brain drafts are starting points, not finished products. Light edits → brain is calibrated. Used to tune system prompt + few-shot examples. |
| Retrospective outcomes vs success_criteria | Did active plays hit their stated success criteria? | Cohort-level lift on brain-co-designed plays vs. plays without brain involvement. Reads by AGT-901 in next play-refresh batch. |
| Tier | Window | Access |
|---|---|---|
| Hot | Active or recently retired (last 90 days) | Operational reads (AGT-302, workspace UI, dashboards) |
| Warm | Retired 90 days to 18 months | Quarterly retrospectives, brain calibration analysis |
| Cold | 18 months to 7 years | Audit access for any audit period covering brain-influenced actions |