By Sagar Shankaran, Founder of CallSphere
Create a structured AI ethics review process with impact assessments, stakeholder analysis, evaluation checklists, and approval workflows for responsible agent deployment.
Key takeaways
Most organizations approach AI ethics reactively — someone raises a concern, a meeting is scheduled, opinions are shared, and a vague consensus is reached. This ad-hoc approach fails for three reasons: it is inconsistent (different reviewers apply different standards), incomplete (it misses issues that nobody thought to raise), and undocumented (there is no record of what was considered and decided).
A structured ethics review process transforms ethics from an afterthought into an engineering discipline with clear criteria, repeatable procedures, and auditable outcomes.
Design your review process as a pipeline with four stages, each with defined inputs, outputs, and decision criteria:
flowchart LR
INPUT(["User intent"])
PARSE["Parse plus<br/>classify"]
PLAN["Plan and tool<br/>selection"]
AGENT["Agent loop<br/>LLM plus tools"]
GUARD{"Guardrails<br/>and policy"}
EXEC["Execute and<br/>verify result"]
OBS[("Trace and metrics")]
OUT(["Outcome plus<br/>next action"])
INPUT --> PARSE --> PLAN --> AGENT --> GUARD
GUARD -->|Pass| EXEC --> OUT
GUARD -->|Fail| AGENT
AGENT --> OBS
style AGENT fill:#4f46e5,stroke:#4338ca,color:#fff
style GUARD fill:#f59e0b,stroke:#d97706,color:#1f2937
style OBS fill:#ede9fe,stroke:#7c3aed,color:#1e1b4b
style OUT fill:#059669,stroke:#047857,color:#fff
┌─────────────┐ ┌─────────────────┐ ┌────────────────┐ ┌──────────────┐
│ Stage 1 │───►│ Stage 2 │───►│ Stage 3 │───►│ Stage 4 │
│ Screening │ │ Impact Analysis │ │ Stakeholder │ │ Decision │
│ │ │ │ │ Review │ │ & Approval │
└─────────────┘ └─────────────────┘ └────────────────┘ └──────────────┘
│ │ │ │
Risk tier Detailed Feedback from Go / No-go /
assignment impact report affected parties Conditional
Every agent deployment begins with a screening questionnaire that determines the depth of review required:
Hear it before you finish reading
Talk to a live CallSphere AI voice agent in your browser — 60 seconds, no signup.
from dataclasses import dataclass, field
from enum import Enum
class RiskTier(Enum):
LOW = "low" # Standard review (self-service checklist)
MEDIUM = "medium" # Team review (peer ethics review)
HIGH = "high" # Board review (ethics committee)
CRITICAL = "critical" # External review (independent audit)
@dataclass
class ScreeningQuestion:
id: str
question: str
risk_weight: float
category: str
SCREENING_QUESTIONS = [
ScreeningQuestion("s1", "Does the agent make or influence decisions about individuals?", 3.0, "autonomy"),
ScreeningQuestion("s2", "Does the agent handle personal or sensitive data?", 2.5, "privacy"),
ScreeningQuestion("s3", "Could the agent's errors cause financial harm?", 2.5, "harm"),
ScreeningQuestion("s4", "Does the agent operate in a regulated industry?", 3.0, "compliance"),
ScreeningQuestion("s5", "Does the agent interact with vulnerable populations?", 3.0, "vulnerability"),
ScreeningQuestion("s6", "Can the agent take irreversible actions?", 2.0, "reversibility"),
ScreeningQuestion("s7", "Does the agent replace human judgment in consequential decisions?", 2.5, "displacement"),
ScreeningQuestion("s8", "Could the agent's outputs be used to discriminate?", 3.0, "fairness"),
ScreeningQuestion("s9", "Is the agent's decision process opaque to affected individuals?", 2.0, "transparency"),
ScreeningQuestion("s10", "Does the agent operate across cultural or jurisdictional boundaries?", 1.5, "scope"),
]
def compute_risk_tier(answers: dict[str, bool]) -> RiskTier:
"""Compute risk tier from screening answers."""
score = sum(
q.risk_weight for q in SCREENING_QUESTIONS
if answers.get(q.id, False)
)
if score >= 15:
return RiskTier.CRITICAL
elif score >= 10:
return RiskTier.HIGH
elif score >= 5:
return RiskTier.MEDIUM
else:
return RiskTier.LOW
For medium-risk and above, conduct a structured impact assessment:
@dataclass
class ImpactDimension:
name: str
description: str
affected_groups: list[str]
severity: str # "negligible", "minor", "moderate", "severe", "catastrophic"
likelihood: str # "rare", "unlikely", "possible", "likely", "certain"
mitigation: str
residual_risk: str
@dataclass
class EthicsImpactAssessment:
agent_id: str
agent_name: str
assessor: str
assessment_date: str
risk_tier: RiskTier
purpose_statement: str
dimensions: list[ImpactDimension] = field(default_factory=list)
data_flows: list[dict] = field(default_factory=list)
alternative_approaches: list[dict] = field(default_factory=list)
def add_dimension(self, dimension: ImpactDimension) -> None:
self.dimensions.append(dimension)
def get_high_risk_dimensions(self) -> list[ImpactDimension]:
high_severity = {"severe", "catastrophic"}
high_likelihood = {"likely", "certain"}
return [
d for d in self.dimensions
if d.severity in high_severity or d.likelihood in high_likelihood
]
def generate_summary(self) -> str:
high_risks = self.get_high_risk_dimensions()
lines = [
f"# Ethics Impact Assessment: {self.agent_name}",
f"**Risk Tier**: {self.risk_tier.value}",
f"**Assessor**: {self.assessor}",
f"**Date**: {self.assessment_date}",
f"",
f"## Purpose",
self.purpose_statement,
f"",
f"## High-Risk Dimensions ({len(high_risks)} identified)",
]
for d in high_risks:
lines.append(f"- **{d.name}**: {d.description}")
lines.append(f" Severity: {d.severity}, Likelihood: {d.likelihood}")
lines.append(f" Mitigation: {d.mitigation}")
return "\n".join(lines)
Always require the assessor to document alternative approaches — ways to achieve the same goal with less risk. This forces teams to justify why an AI agent is the right solution rather than assuming it is.
Identify everyone affected by the agent and gather their input:
@dataclass
class Stakeholder:
name: str
role: str
relationship: str # "direct_user", "affected_party", "operator", "regulator"
concerns: list[str] = field(default_factory=list)
feedback: str = ""
consulted_date: str = ""
@dataclass
class StakeholderAnalysis:
stakeholders: list[Stakeholder] = field(default_factory=list)
def get_unconsulted(self) -> list[Stakeholder]:
return [s for s in self.stakeholders if not s.consulted_date]
def get_unresolved_concerns(self) -> list[dict]:
unresolved = []
for s in self.stakeholders:
for concern in s.concerns:
unresolved.append({
"stakeholder": s.name,
"role": s.role,
"concern": concern,
})
return unresolved
def is_review_complete(self) -> bool:
"""All stakeholders must be consulted before proceeding."""
return len(self.get_unconsulted()) == 0
The most commonly missed stakeholder group is indirect affected parties — people who do not use the agent but are affected by its decisions. For example, a hiring agent's stakeholders include not just recruiters (direct users) but also job candidates (affected parties) who never interact with the agent directly.
Formalize the decision with clear criteria and documented reasoning:
@dataclass
class EthicsDecision:
decision: str # "approved", "approved_with_conditions", "rejected", "deferred"
conditions: list[str] # Required changes before deployment
monitoring_requirements: list[str] # Ongoing obligations
review_interval_days: int # When to re-review
decided_by: list[str] # Names of decision-makers
decision_date: str
reasoning: str # Why this decision was made
dissenting_opinions: list[str] # Record disagreements
def make_ethics_decision(
assessment: EthicsImpactAssessment,
stakeholder_analysis: StakeholderAnalysis,
) -> EthicsDecision:
"""Generate a decision recommendation based on assessment and stakeholder input."""
high_risks = assessment.get_high_risk_dimensions()
unresolved = stakeholder_analysis.get_unresolved_concerns()
if not stakeholder_analysis.is_review_complete():
return EthicsDecision(
decision="deferred",
conditions=["Complete stakeholder consultation"],
monitoring_requirements=[],
review_interval_days=0,
decided_by=[],
decision_date="",
reasoning="Cannot decide until all stakeholders are consulted.",
dissenting_opinions=[],
)
if any(d.severity == "catastrophic" for d in high_risks):
return EthicsDecision(
decision="rejected",
conditions=[],
monitoring_requirements=[],
review_interval_days=90,
decided_by=[],
decision_date="",
reasoning="Catastrophic risk dimension identified without adequate mitigation.",
dissenting_opinions=[],
)
if high_risks or unresolved:
conditions = [
f"Address risk: {d.name} — {d.mitigation}" for d in high_risks
] + [
f"Resolve concern from {c['stakeholder']}: {c['concern']}" for c in unresolved
]
return EthicsDecision(
decision="approved_with_conditions",
conditions=conditions,
monitoring_requirements=[
"Monthly bias audit",
"Quarterly stakeholder feedback review",
"Continuous incident monitoring",
],
review_interval_days=90,
decided_by=[],
decision_date="",
reasoning="Approved contingent on addressing identified risks and concerns.",
dissenting_opinions=[],
)
return EthicsDecision(
decision="approved",
conditions=[],
monitoring_requirements=["Quarterly review"],
review_interval_days=180,
decided_by=[],
decision_date="",
reasoning="No high-risk dimensions or unresolved concerns identified.",
dissenting_opinions=[],
)
An ethics review process that takes weeks will be circumvented. Design for speed:
Still reading? Stop comparing — try CallSphere live.
CallSphere ships complete AI voice agents per industry — 14 tools for healthcare, 10 agents for real estate, 4 specialists for salons. See how it actually handles a call before you book a demo.
Automate the screening stage entirely. Pre-populate the impact assessment with data from the agent's configuration. Use templates for stakeholder analysis. The goal is to make doing the right thing the path of least resistance.
Frame ethics review as risk management, not moral judgment. Engineers understand that shipping a bug to production is expensive — shipping an ethical failure is catastrophic. Show concrete examples of companies that faced regulatory fines, PR crises, or user exodus due to AI ethics failures. Integrate the review into existing workflows (pull request checklists, sprint planning) rather than creating a separate process. Most importantly, make low-risk reviews fast — if answering ten questions takes 15 minutes, teams will comply.
Set review intervals based on risk tier: quarterly for critical and high-risk agents, semi-annually for medium-risk, and annually for low-risk. Trigger immediate re-review when the agent's scope changes, when a significant incident occurs, when the underlying model is updated, or when regulations change. Maintain a review calendar and assign responsibility for initiating each review.
Include at least one representative from engineering (who understands the technical capabilities and limitations), product (who understands the use case and user needs), legal (who understands regulatory requirements), and a domain expert from the area the agent operates in. For agents affecting external users, include a user advocate — someone whose explicit role is to represent the interests of people affected by the agent's decisions. Rotate committee membership to prevent groupthink.
#AIEthics #Governance #ReviewProcess #ImpactAssessment #ResponsibleAI #AgenticAI #LearnAI #AIEngineering

Written by
Sagar Shankaran· Founder, CallSphere
LinkedInSagar Shankaran is the founder of CallSphere, where he builds production AI voice and chat agents deployed across healthcare, hospitality, real estate, and home services. He writes about agentic AI, LLM engineering, and shipping voice agents that handle real calls in production.
See how AI voice agents work for your industry. Live demo available -- no signup required.
ServiceNow's Knowledge 2026 bet is to be the enterprise AI control plane — the layer that governs every agent. Why the positioning matters for 2026 buyers.
Microsoft's Responsible AI Standard operationalizes six AI principles into concrete engineering requirements. Forty Transparency Notes have shipped since 2019. Here is how voice AI vendors can mirror the practice without Microsoft's headcount.
Google's 2026 Responsible AI Progress Report (February 18, 2026) added a new Critical Capability Level focused on harmful manipulation. For voice AI builders, that single change reshapes red-teaming priorities for the year.
OSTP's 2022 Blueprint for an AI Bill of Rights was non-binding then and is still non-binding now. But its five principles inform agency rule-making, FTC enforcement theories, and procurement language across blue-state buyers.
AI Verify is Singapore's open-source AI governance testing toolkit, and the foundation behind it now drives the world's first ISO standard for testing generative AI. Here is what the framework checks and why US/EU vendors are adopting it.
Analysis of Gartner's prediction that 40% of enterprise apps will embed AI agents by late 2026, with a practical implementation guide covering governance, risk management, and architecture.
© 2026 CallSphere Inc. All rights reserved.
Made within San Francisco
Watch how CallSphere handles real customer calls, schedules appointments, and processes payments — live.
Try Live DemoBook a DemoCalculate Your ROI