{
  "name": "AI agent roster for customer data teams",
  "publisher": "PrivyCDP",
  "note": "Reference method, not a list of product features. Limits are described in words because each team sets its own values.",
  "levels": {
    "L0": "Off",
    "L1": "Read",
    "L2": "Propose",
    "L3": "Execute after approval",
    "L4": "Act within bounds"
  },
  "agents": [
    {
      "agent": "Segment Drafter",
      "slug": "segment-drafter",
      "function": "Marketing operations",
      "function_slug": "marketing-operations",
      "wave": 1,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Draft a segment definition from a plain-English request and return it with counts and reason codes.",
      "trigger": "A marketing-operations request routed by the Orchestrator; never on a schedule.",
      "data_scope": "Segmentation schema, consent-filtered counts and pseudonymised IDs; no direct identifiers, free-text fields or special-category data.",
      "tools_read": "Schema; existing segments; count estimates.",
      "tools_propose": "Versioned segment draft.",
      "tools_execute": "None.",
      "output_contract": "Draft definition, estimated count, overlap with live segments, reason codes, open questions.",
      "gate": "Marketing-operations reviewer, never the requester; approval binds to the definition hash.",
      "limits": "Runs per day, budget per run, and an audience size above which a second approver is needed.",
      "ledger": "Correlation ID, request hash, tools called, draft version and hash, counts, approver, outcome, model version.",
      "evaluation": "Past requests with accepted definitions, plus seeded sensitive-attribute traps.",
      "main_metric": "Override rate; sensitive-attribute failures caught.",
      "owner": "Head of marketing operations",
      "kill_switch": "Orchestrator pause; automatic pause after repeated rejections on one request.",
      "never": "Activate a segment; use special-category data or close proxies; read free-text fields.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/agent-assisted-segmentation-walkthrough",
      "profile_url": "/ai/rails/agents/segment-drafter"
    },
    {
      "agent": "Journey QA Reviewer",
      "slug": "journey-qa-reviewer",
      "function": "Marketing operations",
      "function_slug": "marketing-operations",
      "wave": 1,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Review one journey version before launch and report findings with severity and evidence.",
      "trigger": "A journey submitted for launch.",
      "data_scope": "Journey configuration, content, audience counts and rule-check results; no customer profiles.",
      "tools_read": "Journey configuration; rule-check results; audience counts; live journey list.",
      "tools_propose": "Findings report.",
      "tools_execute": "None.",
      "output_contract": "Findings with severity, location, evidence and suggested fix; a list of checks actually run.",
      "gate": "A person resolves every finding; unresolved high-severity findings stay blocked by the rule layer.",
      "limits": "Budget per run; one journey version per run.",
      "ledger": "Journey version hash, checks run, findings, who resolved each one and how, model version.",
      "evaluation": "Seeded-defect set covering audience, trigger, branch, link, consent and timing errors.",
      "main_metric": "Catch rate on seeded defects; escaped error rate.",
      "owner": "Head of marketing operations",
      "kill_switch": "Orchestrator pause; launches then return to manual QA.",
      "never": "Change a journey; launch; report a journey as passed; override a failed rule.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/use-cases/journey-qa-before-launch",
      "profile_url": "/ai/rails/agents/journey-qa-reviewer"
    },
    {
      "agent": "Anomaly Watcher",
      "slug": "anomaly-watcher",
      "function": "Marketing operations",
      "function_slug": "marketing-operations",
      "wave": 1,
      "typical_level": "L1, L4 pause",
      "max_level": "L4",
      "risk": "medium",
      "job": "Explain anomaly alerts in context and pause a send when a pre-approved threshold is crossed.",
      "trigger": "An alert from a statistical detector or threshold rule.",
      "data_scope": "Campaign metrics, campaign calendar and change log; no customer profiles; no free text on the pause path.",
      "tools_read": "Metrics; calendar; change log; data freshness.",
      "tools_propose": "Alert explanation with hypotheses.",
      "tools_execute": "Pause one send under a written rule.",
      "output_contract": "Explanation with hypotheses and evidence links; a pause record when the rule fires.",
      "gate": "The pause rule is approved in advance; only a person resumes a send.",
      "limits": "Written threshold, minimum send volume, exempt list for time-critical sends, cap on pauses per day; transactional mail excluded.",
      "ledger": "Metric values, threshold version, send paused, time, who resumed and why.",
      "evaluation": "Replay of past incidents and quiet periods.",
      "main_metric": "Alert precision; time to contain; false pauses.",
      "owner": "Head of marketing operations",
      "kill_switch": "Disable the pause rule; alerts continue to a person.",
      "never": "Detect anomalies by model judgement alone; cancel a send; resume a send; touch transactional mail.",
      "where_it_runs": "The action path uses rules only; a model, private by preference, writes the explanation.",
      "use_case_urls": "/ai/rails/use-cases/campaign-anomaly-detection",
      "profile_url": "/ai/rails/agents/anomaly-watcher"
    },
    {
      "agent": "Reporting Summariser",
      "slug": "reporting-summariser",
      "function": "Marketing operations",
      "function_slug": "marketing-operations",
      "wave": 1,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Write a plain-language summary from approved metric queries.",
      "trigger": "A schedule, or a request from the report owner.",
      "data_scope": "Aggregates above a minimum group size, metric definitions and the campaign calendar; no row-level data.",
      "tools_read": "Fixed metric queries; metric catalogue; calendar.",
      "tools_propose": "None; the summary is read-only output for review.",
      "tools_execute": "None; a separate service delivers the report.",
      "output_contract": "Summary, locked figures table, query references, hypotheses, and what the report does not show.",
      "gate": "The owner reviews each report at first, then samples.",
      "limits": "Budget per run; minimum group size; no export.",
      "ledger": "Query IDs, result hash, model version, report version, reviewer.",
      "evaluation": "Spot checks of figures and claims; automated number check on every run.",
      "main_metric": "Numeric errors on spot checks; share of claims with evidence.",
      "owner": "Analytics or marketing-operations lead",
      "kill_switch": "Stop the schedule; the last reviewed report stays available.",
      "never": "Calculate figures; state a cause as fact; deliver a report itself; read individual records.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/use-cases/reporting-summaries",
      "profile_url": "/ai/rails/agents/reporting-summariser"
    },
    {
      "agent": "Audience Sync Steward",
      "slug": "audience-sync-steward",
      "function": "Marketing operations",
      "function_slug": "marketing-operations",
      "wave": 1,
      "typical_level": "L3",
      "max_level": "L3",
      "risk": "high",
      "job": "Run an approved audience sync to an allow-listed destination.",
      "trigger": "A named approval bound to a segment hash and destination.",
      "data_scope": "Approved segment reference and hash, destination allow-list and sync status; the model session reads no profiles.",
      "tools_read": "Approval record; destination allow-list; sync status.",
      "tools_propose": "Sync plan with destination and count.",
      "tools_execute": "Start one approved sync through the execution service.",
      "output_contract": "Sync plan before approval; destination, count and consent-check ID after the run.",
      "gate": "Named approver for every sync; a second approver above a size threshold.",
      "limits": "Allow-listed destinations only; maximum audience size; syncs per day.",
      "ledger": "Approval hash, destination, count, consent-check ID, status, rollback reference.",
      "evaluation": "Dry runs in a test destination; checks that a changed hash voids approval.",
      "main_metric": "Sync errors; rollbacks; approval turnaround.",
      "owner": "Head of marketing operations",
      "kill_switch": "Orchestrator pause; the execution service refuses new syncs.",
      "never": "Change an audience; add a destination; sync without a fresh consent check.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/agent-assisted-segmentation-walkthrough;/ai/rails/use-cases/failed-sync-retry",
      "profile_url": "/ai/rails/agents/audience-sync-steward"
    },
    {
      "agent": "Claims Checker",
      "slug": "claims-checker",
      "function": "Lifecycle and CRM marketing",
      "function_slug": "lifecycle-marketing",
      "wave": 2,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Check marketing copy against an approved claims register and required disclosures.",
      "trigger": "Copy submitted for review.",
      "data_scope": "Draft copy, claims register, required-disclosure list and audience description; no customer data.",
      "tools_read": "Draft copy; claims register; disclosure rules.",
      "tools_propose": "Annotated findings with suggested wording.",
      "tools_execute": "None.",
      "output_contract": "Flagged claims, the rule each one relates to, suggested wording, and items needing legal review.",
      "gate": "Compliance reviewer signs off regulated claims; the copy owner resolves the rest.",
      "limits": "Budget per run; approved reference documents only.",
      "ledger": "Copy version hash, rule set version, findings, reviewer decision, model version.",
      "evaluation": "Seeded claims, both compliant and non-compliant, per regulated topic.",
      "main_metric": "Catch rate on seeded claims; false-flag rate.",
      "owner": "Head of lifecycle marketing, with compliance",
      "kill_switch": "Orchestrator pause; review returns to compliance.",
      "never": "Approve a regulated claim; publish copy; invent a substantiation; personalise from raw personal data.",
      "where_it_runs": "Works on draft copy, not customer data, so an external model is acceptable where the contract allows; a private model suits unreleased or regulated campaigns.",
      "use_case_urls": "/ai/rails/use-cases/copy-claims-compliance-check",
      "profile_url": "/ai/rails/agents/claims-checker"
    },
    {
      "agent": "Consent Conflict Reviewer",
      "slug": "consent-conflict-reviewer",
      "function": "Lifecycle and CRM marketing",
      "function_slug": "lifecycle-marketing",
      "wave": 1,
      "typical_level": "L2, L4 for hold only",
      "max_level": "L4",
      "risk": "high",
      "job": "Explain consent and suppression conflicts, propose fixes, and raise a hold where written criteria match.",
      "trigger": "A rule-check result or a reconciliation report.",
      "data_scope": "Conflict categories, counts, purpose and channel definitions, and pseudonymised samples only where a case needs them; no free text.",
      "tools_read": "Conflict reports; purpose and channel definitions; rule text.",
      "tools_propose": "Plain explanation and proposed fix.",
      "tools_execute": "Raise a hold on a launch.",
      "output_contract": "Conflict, plain explanation, rule reference, proposed fix, and any hold raised.",
      "gate": "A compliance reviewer clears holds and accepts fixes.",
      "limits": "Holds per day; no consent or suppression write tools exist for this agent.",
      "ledger": "Rule version, conflict ID, hold raised, who cleared it and why.",
      "evaluation": "The consent test cases plus seeded conflicts.",
      "main_metric": "Hold precision; conflicts caught before launch versus blocked at send.",
      "owner": "DPO or compliance lead",
      "kill_switch": "Disable the hold action; rule-based enforcement continues unchanged.",
      "never": "Decide who may be contacted; change consent or suppression state; release a hold; override a rule-based deny.",
      "where_it_runs": "Private model inside the customer environment; no external model for this data.",
      "use_case_urls": "/ai/rails/use-cases/consent-suppression-check-before-send",
      "profile_url": "/ai/rails/agents/consent-conflict-reviewer"
    },
    {
      "agent": "Frequency Advisor",
      "slug": "frequency-advisor",
      "function": "Lifecycle and CRM marketing",
      "function_slug": "lifecycle-marketing",
      "wave": 2,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Recommend frequency caps and send spacing from aggregate fatigue signals.",
      "trigger": "A monthly review, or a rise in unsubscribes or complaints.",
      "data_scope": "Aggregate send counts by cohort, unsubscribe and complaint rates, and the campaign calendar; no individual histories.",
      "tools_read": "Cohort aggregates; calendar; current caps.",
      "tools_propose": "Cap and spacing changes with expected trade-offs.",
      "tools_execute": "None.",
      "output_contract": "Recommendation, evidence, expected trade-off, and how to test it.",
      "gate": "Lifecycle lead accepts or rejects; caps change through normal configuration.",
      "limits": "Minimum cohort size; budget per run.",
      "ledger": "Query references, recommendation, decision, model version.",
      "evaluation": "Back-test on past periods; held-out cohorts for accepted changes.",
      "main_metric": "Unsubscribe and complaint rates in cohorts after accepted advice; acceptance rate.",
      "owner": "Head of lifecycle marketing",
      "kill_switch": "Stop the review schedule; existing caps stay in force.",
      "never": "Change caps itself; target people by vulnerability; override a suppression.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/lifecycle-marketing",
      "profile_url": "/ai/rails/agents/frequency-advisor"
    },
    {
      "agent": "Deliverability Watcher",
      "slug": "deliverability-watcher",
      "function": "Lifecycle and CRM marketing",
      "function_slug": "lifecycle-marketing",
      "wave": 2,
      "typical_level": "L1, L4 pause",
      "max_level": "L4",
      "risk": "medium",
      "job": "Watch mailbox-provider signals, explain changes, and pause a stream under a written rule.",
      "trigger": "A threshold rule or a change in provider signals.",
      "data_scope": "Postmaster data, complaint and bounce rates and authentication results by stream; no recipient-level data.",
      "tools_read": "Provider dashboards; bounce and complaint rates; authentication results.",
      "tools_propose": "Diagnosis with likely causes.",
      "tools_execute": "Pause one marketing stream under a written rule.",
      "output_contract": "Diagnosis with evidence; a pause record when the rule fires.",
      "gate": "The pause rule is approved in advance; the deliverability owner resumes.",
      "limits": "Written thresholds, minimum volume, exempt list; transactional streams excluded.",
      "ledger": "Signal values, rule version, stream paused, time, who resumed.",
      "evaluation": "Replay of past deliverability incidents.",
      "main_metric": "Time to contain; false pauses; spam rate against provider limits.",
      "owner": "Deliverability or email operations lead",
      "kill_switch": "Disable the pause rule; alerts continue to a person.",
      "never": "Resume a stream; change DNS or authentication records; suppress addresses; pause transactional mail.",
      "where_it_runs": "The action path uses rules only; a model, private by preference, writes the explanation.",
      "use_case_urls": "/ai/rails/use-cases/campaign-anomaly-detection",
      "profile_url": "/ai/rails/agents/deliverability-watcher"
    },
    {
      "agent": "Data Quality Triager",
      "slug": "data-quality-triager",
      "function": "Data and analytics",
      "function_slug": "data-and-analytics",
      "wave": 2,
      "typical_level": "L2 to L3",
      "max_level": "L3",
      "risk": "medium",
      "job": "Triage data-quality failures, propose fixes, and apply format-only fixes after approval.",
      "trigger": "A failed data-quality test or a data-steward request.",
      "data_scope": "Test results, schema and masked samples; no consent fields on the fix path.",
      "tools_read": "Test results; schema; lineage; masked samples.",
      "tools_propose": "Ranked triage list and proposed fixes.",
      "tools_execute": "Apply an approved format-only fix.",
      "output_contract": "Failure, likely cause, affected downstream uses, proposed fix, rollback plan.",
      "gate": "Data steward approves each fix batch.",
      "limits": "Format-only changes; batch size; approved tables only.",
      "ledger": "Test ID, proposed fix, approval, rows changed, rollback reference.",
      "evaluation": "Historic failures with known causes; seeded defects.",
      "main_metric": "Time to triage; rollbacks; recurring failures.",
      "owner": "Head of data or data steward",
      "kill_switch": "Orchestrator pause; the fix path is disabled and triage continues.",
      "never": "Change meaning of a field; delete records; edit consent or identity fields.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/use-cases/data-quality-triage",
      "profile_url": "/ai/rails/agents/data-quality-triager"
    },
    {
      "agent": "Identity Reviewer",
      "slug": "identity-reviewer",
      "function": "Data and analytics",
      "function_slug": "data-and-analytics",
      "wave": 2,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "high",
      "job": "Propose identity merges and splits with reason codes for a person to apply.",
      "trigger": "A review queue from the identity engine.",
      "data_scope": "Pseudonymised match features, match scores and review history; no sensitive attributes as match features.",
      "tools_read": "Candidate pairs; match features; merge history.",
      "tools_propose": "Merge or split proposal with reason codes.",
      "tools_execute": "None.",
      "output_contract": "Proposal, reason codes, confidence, and the effect on consent state.",
      "gate": "An identity steward applies or rejects every proposal.",
      "limits": "Queue size per run; no access to raw contact details.",
      "ledger": "Candidate IDs by reference, reason codes, decision, steward, model version.",
      "evaluation": "Labelled pairs, including known false merges.",
      "main_metric": "Precision on labelled pairs; merge reversal rate.",
      "owner": "Head of data or identity steward",
      "kill_switch": "Orchestrator pause; the queue returns to manual review.",
      "never": "Merge or split profiles itself; use sensitive attributes; combine consent scopes.",
      "where_it_runs": "Private model inside the customer environment; no external model for this data.",
      "use_case_urls": "/ai/rails/use-cases/identity-resolution-review",
      "profile_url": "/ai/rails/agents/identity-reviewer"
    },
    {
      "agent": "Schema Drift Sentinel",
      "slug": "schema-drift-sentinel",
      "function": "Data and analytics",
      "function_slug": "data-and-analytics",
      "wave": 2,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Detect and explain schema changes in sources and destinations.",
      "trigger": "A contract test failure or a scheduled schema comparison.",
      "data_scope": "Schema metadata and contract test results; no row data.",
      "tools_read": "Schema snapshots; data contracts; lineage.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "What changed, what depends on it, and who should act.",
      "gate": "None for alerts; the pipeline owner decides any change.",
      "limits": "Metadata only; budget per run.",
      "ledger": "Schema versions compared, alert, owner notified.",
      "evaluation": "Seeded schema changes across sources.",
      "main_metric": "Time to detect; missed drift found later.",
      "owner": "Data platform lead",
      "kill_switch": "Stop the schedule; contract tests still run.",
      "never": "Alter a schema or pipeline; read row data.",
      "where_it_runs": "Works on metadata, logs or metering rather than customer data, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/use-cases/data-quality-triage",
      "profile_url": "/ai/rails/agents/schema-drift-sentinel"
    },
    {
      "agent": "Metric Explainer",
      "slug": "metric-explainer",
      "function": "Data and analytics",
      "function_slug": "data-and-analytics",
      "wave": 2,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Explain why a metric moved, using lineage and approved definitions.",
      "trigger": "A question from a data consumer or an alert.",
      "data_scope": "Metric catalogue, lineage and aggregates above a minimum group size.",
      "tools_read": "Metric catalogue; lineage; fixed aggregate queries.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Plain explanation, contributing factors as hypotheses, query references.",
      "gate": "None for answers; the metric owner reviews a sample.",
      "limits": "Minimum group size; fixed queries only.",
      "ledger": "Question hash, queries, answer version, model version.",
      "evaluation": "Historic metric moves with known causes.",
      "main_metric": "Accuracy on known cases; share of answers with evidence.",
      "owner": "Analytics lead",
      "kill_switch": "Disable the agent; the metric catalogue stays available.",
      "never": "Change a metric definition; state a cause as fact; read individual records.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/data-and-analytics",
      "profile_url": "/ai/rails/agents/metric-explainer"
    },
    {
      "agent": "DSAR Assembler",
      "slug": "dsar-assembler",
      "function": "Compliance, privacy and security",
      "function_slug": "compliance-privacy-security",
      "wave": 2,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "high",
      "job": "Collect data for a verified access request and draft the response pack.",
      "trigger": "A request whose requester a person has verified.",
      "data_scope": "The data subject's records within the request scope, and the system map; no other subjects' data in the session.",
      "tools_read": "System map; in-scope records; response templates.",
      "tools_propose": "Response pack and draft reply.",
      "tools_execute": "None.",
      "output_contract": "Pack by system, gaps found, third-party data flagged, exemptions to consider, draft reply.",
      "gate": "A privacy analyst signs off every pack and decides exemptions.",
      "limits": "One subject per run; no outbound tools; retention of working copies limited to the request.",
      "ledger": "Request ID, systems searched, gaps, reviewer, sign-off date.",
      "evaluation": "Seeded requests with known records across systems.",
      "main_metric": "Days to complete against the legal deadline; missed-system rate on seeded requests.",
      "owner": "DPO",
      "kill_switch": "Orchestrator pause; requests return to the manual process with deadlines unchanged.",
      "never": "Verify identity; decide exemptions; close a request; delete data; send the reply.",
      "where_it_runs": "Private model inside the customer environment; no external model for this data.",
      "use_case_urls": "/ai/rails/use-cases/dsar-assembly",
      "profile_url": "/ai/rails/agents/dsar-assembler"
    },
    {
      "agent": "Evidence Packer",
      "slug": "evidence-packer",
      "function": "Compliance, privacy and security",
      "function_slug": "compliance-privacy-security",
      "wave": 2,
      "typical_level": "L1 to L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Assemble consent history, decision reason codes and agent runs to answer an audit question.",
      "trigger": "An audit or regulator question logged by compliance.",
      "data_scope": "Audit ledger, consent ledger with identifiers by reference, rail cards and policy versions.",
      "tools_read": "Ledger views; rail cards; policy versions.",
      "tools_propose": "Evidence pack with an index.",
      "tools_execute": "None.",
      "output_contract": "Question, evidence index, ledger references, gaps stated plainly.",
      "gate": "The compliance lead reviews and releases every pack.",
      "limits": "Read-only ledger views; identifiers by reference; no outbound tools.",
      "ledger": "Question hash, entries cited, pack version, releaser.",
      "evaluation": "Past audit questions with accepted answers; seeded gaps.",
      "main_metric": "Time to answer; packs returned by auditors; gaps found before an audit.",
      "owner": "Compliance lead",
      "kill_switch": "Orchestrator pause; ledger access continues for people.",
      "never": "Alter a ledger entry; release a pack; state a compliance conclusion.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/use-cases/audit-evidence-packs",
      "profile_url": "/ai/rails/agents/evidence-packer"
    },
    {
      "agent": "Policy Drift Checker",
      "slug": "policy-drift-checker",
      "function": "Compliance, privacy and security",
      "function_slug": "compliance-privacy-security",
      "wave": 2,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Compare rail cards with what the ledger shows agents actually did.",
      "trigger": "A schedule, or a rail or policy change.",
      "data_scope": "Rail cards, ledger metadata and policy versions; no payloads.",
      "tools_read": "Rail cards; ledger metadata; policy versions.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Differences found, severity, and the rail owner to notify.",
      "gate": "None for reports; the rail owner decides any change.",
      "limits": "Metadata only; budget per run.",
      "ledger": "Rail versions compared, findings, owner notified.",
      "evaluation": "Seeded out-of-scope tool calls and undocumented changes.",
      "main_metric": "Seeded drift found; time from drift to report.",
      "owner": "AI governance lead",
      "kill_switch": "Stop the schedule; the ledger keeps recording.",
      "never": "Change a rail; pause an agent; read customer payloads.",
      "where_it_runs": "Works on metadata, logs or metering rather than customer data, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/compliance-privacy-security",
      "profile_url": "/ai/rails/agents/policy-drift-checker"
    },
    {
      "agent": "Access Review Assistant",
      "slug": "access-review-assistant",
      "function": "Compliance, privacy and security",
      "function_slug": "compliance-privacy-security",
      "wave": 2,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Prepare access reviews and propose removal of unused scopes for people and agents.",
      "trigger": "A scheduled review cycle.",
      "data_scope": "Roles, agent identities, scope grants and scope usage logs.",
      "tools_read": "Identity records; scope grants; usage logs.",
      "tools_propose": "Revocation and review list.",
      "tools_execute": "None.",
      "output_contract": "Each grant, last use, owner, and a keep-or-remove proposal with a reason.",
      "gate": "The security owner decides every change.",
      "limits": "Read-only access to identity data; budget per run.",
      "ledger": "Review cycle, proposals, decisions, decider.",
      "evaluation": "Seeded dormant and excessive grants.",
      "main_metric": "Unused scopes removed; review completion time.",
      "owner": "Security lead",
      "kill_switch": "Orchestrator pause; the review returns to manual work.",
      "never": "Grant or revoke access; approve its own scope.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/functions/compliance-privacy-security",
      "profile_url": "/ai/rails/agents/access-review-assistant"
    },
    {
      "agent": "Context Briefer",
      "slug": "context-briefer",
      "function": "Customer support",
      "function_slug": "customer-support",
      "wave": 3,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "medium",
      "job": "Give a service agent a masked, consent-aware summary of the customer.",
      "trigger": "A case opened by an authenticated service agent.",
      "data_scope": "Masked profile summary in scope, recent interactions by type and consent flags; ticket free text excluded from the session.",
      "tools_read": "Masked profile view; interaction summary; consent flags.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Short summary, consent flags, and what the summary leaves out.",
      "gate": "The service agent decides what to do with it.",
      "limits": "One customer per run; field projection by purpose; no export.",
      "ledger": "Case reference, fields returned, service agent, model version.",
      "evaluation": "Spot checks by support leads; tests that masked fields stay masked.",
      "main_metric": "Handling time measured by the team; masked-field leaks (target zero).",
      "owner": "Head of customer support",
      "kill_switch": "Disable the summary panel; service agents use the normal record view.",
      "never": "Reply to a customer; reveal masked fields; make promises; use the data for marketing.",
      "where_it_runs": "Private model inside the customer environment; no external model for this data.",
      "use_case_urls": "/ai/rails/use-cases/customer-context-for-support",
      "profile_url": "/ai/rails/agents/context-briefer"
    },
    {
      "agent": "Case Classifier",
      "slug": "case-classifier",
      "function": "Customer support",
      "function_slug": "customer-support",
      "wave": 3,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Propose a category, priority and queue for a new support case.",
      "trigger": "A new support case.",
      "data_scope": "Case text, treated as untrusted, and category definitions; no profile data in the session.",
      "tools_read": "Case text; category definitions.",
      "tools_propose": "Category, priority and queue with confidence.",
      "tools_execute": "None.",
      "output_contract": "Proposal, confidence, and a reason in one sentence.",
      "gate": "A service agent or team lead accepts or changes the proposal; low confidence goes to a person.",
      "limits": "No outbound tools; budget per run.",
      "ledger": "Case reference, proposal, confidence, final category, model version.",
      "evaluation": "Labelled historic cases, including injection attempts in case text.",
      "main_metric": "Precision per category; share changed by people.",
      "owner": "Head of customer support",
      "kill_switch": "Disable the proposal; cases follow the normal queue.",
      "never": "Reply to a customer; close a case; read customer profiles.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/functions/customer-support",
      "profile_url": "/ai/rails/agents/case-classifier"
    },
    {
      "agent": "Escalation Spotter",
      "slug": "escalation-spotter",
      "function": "Customer support",
      "function_slug": "customer-support",
      "wave": 3,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "medium",
      "job": "Flag cases that may involve a complaint, a legal objection or a vulnerable customer.",
      "trigger": "A new or updated support case.",
      "data_scope": "Case text, treated as untrusted, and case status; no profile data in the session.",
      "tools_read": "Case text; status; flag definitions.",
      "tools_propose": "None; it raises a flag for a person.",
      "tools_execute": "None.",
      "output_contract": "Flag type, the passage that triggered it, and the team to notify.",
      "gate": "A team lead reviews each flag.",
      "limits": "No outbound tools; flags only.",
      "ledger": "Case reference, flag type, reviewer decision.",
      "evaluation": "Labelled cases, including objections written in plain language.",
      "main_metric": "Recall on labelled objections; flag precision.",
      "owner": "Head of customer support, with the DPO",
      "kill_switch": "Disable flags; existing escalation rules continue.",
      "never": "Decide an outcome; contact a customer; record a consent change itself.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/functions/customer-support",
      "profile_url": "/ai/rails/agents/escalation-spotter"
    },
    {
      "agent": "Account Signal Digest",
      "slug": "account-signal-digest",
      "function": "Sales and revenue operations",
      "function_slug": "sales-revenue-operations",
      "wave": 3,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Summarise account-level signals from unified profiles for sales teams.",
      "trigger": "A weekly schedule, or a request from an account owner.",
      "data_scope": "Account-level aggregates and firmographic fields; no individual browsing histories.",
      "tools_read": "Account aggregates; firmographics; open opportunities list.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Signals, evidence, and what changed since last time.",
      "gate": "The account owner decides any action.",
      "limits": "Minimum contact count per account; no export.",
      "ledger": "Account references, queries, digest version.",
      "evaluation": "Spot checks by account owners.",
      "main_metric": "Share of signals rated useful; numeric errors.",
      "owner": "Head of revenue operations",
      "kill_switch": "Stop the schedule.",
      "never": "Contact a prospect; score people on protected attributes; expose individual activity without a lawful purpose.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/sales-revenue-operations",
      "profile_url": "/ai/rails/agents/account-signal-digest"
    },
    {
      "agent": "Lead Routing Proposer",
      "slug": "lead-routing-proposer",
      "function": "Sales and revenue operations",
      "function_slug": "sales-revenue-operations",
      "wave": 3,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Propose routing for new leads with reasons, using territory and capacity rules.",
      "trigger": "A new lead, or a routing exception.",
      "data_scope": "Lead firmographic fields, territory rules and team capacity; no protected attributes.",
      "tools_read": "Lead fields; territory rules; capacity.",
      "tools_propose": "Routing proposal with reason.",
      "tools_execute": "None.",
      "output_contract": "Proposed owner, rule applied, reason, and exceptions.",
      "gate": "The revenue-operations lead accepts exceptions; rule changes go through change control.",
      "limits": "No outbound tools; approved fields only.",
      "ledger": "Lead reference, proposal, rule, decision.",
      "evaluation": "Labelled historic routing, plus bias checks across regions.",
      "main_metric": "Share of proposals accepted; time to first owner.",
      "owner": "Head of revenue operations",
      "kill_switch": "Disable proposals; rule-based routing continues.",
      "never": "Contact a lead; use protected attributes; rank named sales staff by behaviour or traits.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/functions/sales-revenue-operations",
      "profile_url": "/ai/rails/agents/lead-routing-proposer"
    },
    {
      "agent": "CRM Hygiene Fixer",
      "slug": "crm-hygiene-fixer",
      "function": "Sales and revenue operations",
      "function_slug": "sales-revenue-operations",
      "wave": 3,
      "typical_level": "L3",
      "max_level": "L3",
      "risk": "medium",
      "job": "Propose and, after approval, apply duplicate and formatting fixes in the CRM.",
      "trigger": "A scheduled hygiene run or a data-steward request.",
      "data_scope": "Scoped CRM objects and fields; no opportunity values and no consent fields on the fix path.",
      "tools_read": "CRM records in scope; duplicate candidates.",
      "tools_propose": "Fix batch with before and after values.",
      "tools_execute": "Apply one approved batch.",
      "output_contract": "Batch diff, count, rollback file, and exceptions.",
      "gate": "A revenue-operations approver signs each batch.",
      "limits": "Batch size; approved objects only; a rollback file is required.",
      "ledger": "Batch hash, approver, records changed, rollback reference.",
      "evaluation": "Seeded duplicates and false duplicates in a sandbox.",
      "main_metric": "Rollbacks; duplicates remaining; batch approval time.",
      "owner": "Head of revenue operations",
      "kill_switch": "Revoke the batch tool; proposals continue.",
      "never": "Edit opportunity values; delete records; change consent fields; contact anyone.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/functions/sales-revenue-operations",
      "profile_url": "/ai/rails/agents/crm-hygiene-fixer"
    },
    {
      "agent": "Experiment Reader",
      "slug": "experiment-reader",
      "function": "Product and growth",
      "function_slug": "product-and-growth",
      "wave": 3,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Read out experiments using the analysis plan set before launch.",
      "trigger": "A planned read-out date on an experiment.",
      "data_scope": "Experiment aggregates, the analysis plan and guardrail metrics; no individual records.",
      "tools_read": "Experiment results; analysis plan; guardrail metrics.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Result against the plan, guardrails, caveats, and what the data cannot show.",
      "gate": "The experiment owner and an analyst decide.",
      "limits": "Planned read-outs only; minimum group size.",
      "ledger": "Experiment ID, plan version, queries, read-out version.",
      "evaluation": "Past experiments with reviewed conclusions.",
      "main_metric": "Disagreement with analyst review; read-outs delayed.",
      "owner": "Head of product or growth",
      "kill_switch": "Stop read-outs; dashboards remain.",
      "never": "End an experiment; change allocation; add metrics after the fact without saying so.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/product-and-growth",
      "profile_url": "/ai/rails/agents/experiment-reader"
    },
    {
      "agent": "Onboarding Funnel Watcher",
      "slug": "onboarding-funnel-watcher",
      "function": "Product and growth",
      "function_slug": "product-and-growth",
      "wave": 3,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Watch onboarding funnels and explain drops by step and cohort.",
      "trigger": "A schedule, or a detector alert on a funnel step.",
      "data_scope": "Funnel aggregates by step and cohort, release notes; no individual sessions.",
      "tools_read": "Funnel aggregates; release notes; data freshness.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Step affected, size of change, likely causes as hypotheses.",
      "gate": "The product owner decides any change.",
      "limits": "Minimum group size; fixed queries only.",
      "ledger": "Queries, alert, summary version.",
      "evaluation": "Past funnel incidents with known causes.",
      "main_metric": "Time to notice a drop; alert precision.",
      "owner": "Head of product or growth",
      "kill_switch": "Stop the schedule.",
      "never": "Change a flow; target individuals; infer sensitive traits.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/product-and-growth",
      "profile_url": "/ai/rails/agents/onboarding-funnel-watcher"
    },
    {
      "agent": "Feature Adoption Explainer",
      "slug": "feature-adoption-explainer",
      "function": "Product and growth",
      "function_slug": "product-and-growth",
      "wave": 3,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Explain feature adoption by cohort in plain language.",
      "trigger": "A request from a product owner, or a monthly schedule.",
      "data_scope": "Cohort-level adoption aggregates and feature definitions; no individual records.",
      "tools_read": "Adoption aggregates; feature definitions.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Adoption by cohort, changes, hypotheses, and limits of the data.",
      "gate": "The product owner decides any action.",
      "limits": "Minimum group size; fixed queries only.",
      "ledger": "Queries, summary version, model version.",
      "evaluation": "Spot checks by analysts.",
      "main_metric": "Numeric errors; share of claims with evidence.",
      "owner": "Head of product",
      "kill_switch": "Stop the schedule.",
      "never": "Target individuals; change a feature flag; state a cause as fact.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/product-and-growth",
      "profile_url": "/ai/rails/agents/feature-adoption-explainer"
    },
    {
      "agent": "Sync Medic",
      "slug": "sync-medic",
      "function": "Platform operations",
      "function_slug": "platform-operations",
      "wave": 2,
      "typical_level": "L3 to L4",
      "max_level": "L4",
      "risk": "medium",
      "job": "Diagnose failed syncs, retry an already approved sync within limits, and propose other fixes.",
      "trigger": "A failed sync event.",
      "data_scope": "Sync logs, error codes and the approval record hash; no payload data.",
      "tools_read": "Sync logs; error codes; approval record; destination status.",
      "tools_propose": "Fix proposal for anything other than a retry.",
      "tools_execute": "Retry the same approved sync version with idempotency and a fresh consent check.",
      "output_contract": "Failure cause, retry record, or a fix proposal.",
      "gate": "No new approval for a bounded retry of the same approved hash; the platform on-call approves any other change.",
      "limits": "Retries per sync, backoff, same destination and audience hash only.",
      "ledger": "Sync ID, approval hash, retry count, consent-check ID, outcome.",
      "evaluation": "Replay of historic failures in a test destination.",
      "main_metric": "Mean time to recover; duplicate deliveries (target zero); failed retries.",
      "owner": "Platform lead",
      "kill_switch": "Disable retries; failures go to on-call.",
      "never": "Change a mapping or destination; retry a changed audience; exceed the retry limit.",
      "where_it_runs": "The action path uses rules only; a model, private by preference, writes the explanation.",
      "use_case_urls": "/ai/rails/use-cases/failed-sync-retry",
      "profile_url": "/ai/rails/agents/sync-medic"
    },
    {
      "agent": "Cost Watcher",
      "slug": "cost-watcher",
      "function": "Platform operations",
      "function_slug": "platform-operations",
      "wave": 2,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Track inference and infrastructure spend against the budget on each rail.",
      "trigger": "A daily schedule, or a budget threshold.",
      "data_scope": "Billing and usage metering by rail; no customer data.",
      "tools_read": "Usage meters; billing exports; rail budgets.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Spend by rail, budget variance, unusual runs.",
      "gate": "The rail owner and finance partner decide any change.",
      "limits": "Metering data only.",
      "ledger": "Period, rails reported, alerts raised.",
      "evaluation": "Reconciliation against invoices.",
      "main_metric": "Variance found before invoice; reconciliation differences.",
      "owner": "Platform lead, with finance",
      "kill_switch": "Stop the schedule; budgets still enforce at the gateway.",
      "never": "Change a budget; scale infrastructure; pause a rail.",
      "where_it_runs": "Works on metadata, logs or metering rather than customer data, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/platform-operations",
      "profile_url": "/ai/rails/agents/cost-watcher"
    },
    {
      "agent": "Connector Change Reviewer",
      "slug": "connector-change-reviewer",
      "function": "Platform operations",
      "function_slug": "platform-operations",
      "wave": 2,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Read diffs of integration configuration and flag risk before a person merges.",
      "trigger": "A proposed configuration change.",
      "data_scope": "Configuration diffs with secrets redacted, connector documentation and data classification.",
      "tools_read": "Configuration diffs; connector docs; data classification.",
      "tools_propose": "Review comments with risk rating.",
      "tools_execute": "None.",
      "output_contract": "Risk rating, new data flows, scope changes, and questions for the author.",
      "gate": "A platform engineer merges or rejects.",
      "limits": "Secrets redacted; no deployment tools.",
      "ledger": "Diff hash, findings, reviewer decision.",
      "evaluation": "Seeded risky changes such as new destinations and wider scopes.",
      "main_metric": "Catch rate on seeded changes; incidents traced to reviewed changes.",
      "owner": "Platform lead",
      "kill_switch": "Disable the review step; human review continues.",
      "never": "Apply or merge a change; hold secrets; change security settings.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/functions/platform-operations",
      "profile_url": "/ai/rails/agents/connector-change-reviewer"
    },
    {
      "agent": "Restore Drill Reporter",
      "slug": "restore-drill-reporter",
      "function": "Platform operations",
      "function_slug": "platform-operations",
      "wave": 2,
      "typical_level": "L1",
      "max_level": "L1",
      "risk": "low",
      "job": "Report on backup and restore drills, and flag gaps in evidence.",
      "trigger": "A completed restore drill or a schedule.",
      "data_scope": "Drill logs, recovery time and recovery point results, and the drill calendar; no restored data.",
      "tools_read": "Drill logs; targets; calendar.",
      "tools_propose": "None.",
      "tools_execute": "None.",
      "output_contract": "Result against target, gaps, overdue drills.",
      "gate": "The platform lead reviews each report.",
      "limits": "Log data only.",
      "ledger": "Drill ID, results cited, report version.",
      "evaluation": "Spot checks against drill logs.",
      "main_metric": "Overdue drills; report errors.",
      "owner": "Platform lead",
      "kill_switch": "Stop the schedule.",
      "never": "Trigger a restore; change a backup policy; read restored data.",
      "where_it_runs": "Works on metadata, logs or metering rather than customer data, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/functions/platform-operations",
      "profile_url": "/ai/rails/agents/restore-drill-reporter"
    },
    {
      "agent": "Orchestrator",
      "slug": "orchestrator-agent",
      "function": "Cross-cutting",
      "function_slug": "cross-cutting",
      "wave": 1,
      "typical_level": "L4 on routing only",
      "max_level": "L4",
      "risk": "medium",
      "job": "Route requests to rails, hold the approval queue and track work to close.",
      "trigger": "A request, schedule or event.",
      "data_scope": "Request metadata, redacted request text, rail catalogue and queue state; no customer tables.",
      "tools_read": "Rail catalogue; queue state.",
      "tools_propose": "None.",
      "tools_execute": "Start a run; notify; expire a request; broadcast a pause.",
      "output_contract": "Route, reason, confidence.",
      "gate": "None on routing; changes to the routing table go through change control.",
      "limits": "Rate per requester; combined limits across rails.",
      "ledger": "Correlation ID, request hash, route, confidence, state changes.",
      "evaluation": "Labelled past requests; sampled routing accuracy; share sent to human fallback.",
      "main_metric": "Queue time; routing errors; kill-switch drill time.",
      "owner": "Head of marketing operations, with a platform engineer",
      "kill_switch": "A human owner stops it; if it is down, no new work starts.",
      "never": "Read a customer record; approve anything; widen a scope.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/control-plane",
      "profile_url": "/ai/rails/orchestrator-agent"
    },
    {
      "agent": "Trainer",
      "slug": "trainer-agent",
      "function": "Cross-cutting",
      "function_slug": "cross-cutting",
      "wave": 1,
      "typical_level": "L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Keep evaluation sets and drills current, and propose rail changes.",
      "trigger": "A schedule, a rejection event or a proposed change.",
      "data_scope": "Masked samples, ledger entries with masked payloads, rail cards and evaluation sets.",
      "tools_read": "Masked samples; ledger views; rail cards.",
      "tools_propose": "Test cases; rail changes; training assignments.",
      "tools_execute": "Run tests in non-production only.",
      "output_contract": "Test results, drift alerts, proposed changes.",
      "gate": "The rail owner accepts each addition and change; the DPO for data scope.",
      "limits": "Non-production environment; budget for evaluation runs.",
      "ledger": "Set version, results, proposals.",
      "evaluation": "Escaped errors that a test should have caught.",
      "main_metric": "Time to competence by role; evaluation pass rate; drift alerts acknowledged.",
      "owner": "Head of marketing operations, with security for red-team drills",
      "kill_switch": "Stop runs; rails stay at their current version.",
      "never": "Edit a production rail; approve its own proposals; rank named staff.",
      "where_it_runs": "Private model preferred; an external model only with masking and contract cover.",
      "use_case_urls": "/ai/rails/control-plane",
      "profile_url": "/ai/rails/trainer-agent"
    },
    {
      "agent": "VP Marketing agent",
      "slug": "vp-marketing-agent",
      "function": "Cross-cutting",
      "function_slug": "cross-cutting",
      "wave": 1,
      "typical_level": "L1 to L2",
      "max_level": "L2",
      "risk": "medium",
      "job": "Produce a weekly readout and conflict list across marketing functions.",
      "trigger": "A schedule, or a request from the VP.",
      "data_scope": "Aggregates above a minimum group size, calendar, segment inventory, budget pacing, deliverability, consent health, data-quality status, queue stats and ledger entries without payloads.",
      "tools_read": "Aggregate views; ledger views; calendar; deadline tracker.",
      "tools_propose": "Priorities; draft sections.",
      "tools_execute": "None; a separate service delivers the readout.",
      "output_contract": "Claims with evidence link, freshness and confidence; a list of what it cannot tell.",
      "gate": "The VP reads it; nothing leaves without a person.",
      "limits": "Minimum group size; no export; no named staff.",
      "ledger": "Query references, readout version, model version.",
      "evaluation": "Spot checks; conflicts flagged compared with later post-mortems.",
      "main_metric": "Accuracy on spot checks; conflicts caught before launch; decisions made on time.",
      "owner": "VP of marketing",
      "kill_switch": "Stop the schedule; dashboards remain.",
      "never": "See an individual customer; change anything; report on named staff.",
      "where_it_runs": "Works on aggregates, so an external model is acceptable where the contract allows; a private model suits regulated teams.",
      "use_case_urls": "/ai/rails/control-plane",
      "profile_url": "/ai/rails/vp-marketing-agent"
    }
  ]
}