[bmdpat]
All writing
8 min read

Designing for Agency: Building Trustworthy AI Agents in a Shifting World

As the AI industry heats up with legal battles and ethical debates, discover how to engineer AI agents that prioritize user control, privacy, and adaptability, ensuring they remain valuable on your hardware.

Share LinkedIn

Designing for Agency: Building Trustworthy AI Agents in a Shifting World

The air around AI development feels particularly charged right now. We're in what many are calling the "Long Hot A.I. Summer" - a period marked by intense innovation, significant investment, but also considerable turbulence. Recent news cycles have underscored this, from high-stakes legal clashes between industry titans like Elon Musk and OpenAI, to major companies like Meta reassigning thousands of employees to double down on AI initiatives. It's a clear signal: AI is no longer a niche; it's central to the future.

But amidst this whirlwind of competition and corporate maneuvering, a more fundamental question arises for us, the developers building agents on consumer hardware: How do we ensure our AI creations remain reliable, ethical, and, most importantly, trustworthy? How do we design for user agency in a world that often seems to prioritize growth above all else?

This isn't just about building smarter algorithms; it's about building agents that respect users, protect their data, and adapt to their needs without hidden agendas. Let's unpack some recent events and draw practical lessons for our agent development practices.

The Shutterstock Settlement: A Warning on User Control

The recent news about Shutterstock paying $35 million to settle FTC allegations over hard-to-cancel subscriptions offers a potent reminder for anyone building automated systems. It highlights a critical point: user control is paramount.

When we develop AI agents, it's easy to focus on efficiency and automation. But what happens when an agent, designed to automate a task, becomes difficult to stop, modify, or even understand? This is a digital dark pattern in agent form. For agents operating on your personal hardware, this translates directly to:

  1. Clear "Off" Switches: Agents should have easily accessible, unambiguous methods for pausing, stopping, or uninstalling. No hidden menus, no multi-step confirmation loops. It should be as simple as a single click, reminiscent of the clarity clickclickclick.click advocates for user interaction.
  2. Transparent State and Actions: An agent shouldn't be a black box. Users need to understand what the agent is doing, why it's doing it, and what its current status is. This might mean detailed logs, clear UI indicators, or even plain language explanations of its reasoning.
  3. Easy Configuration: Changing an agent's parameters or objectives should be straightforward. If an agent is designed to manage your photos, changing its upload frequency or privacy settings shouldn't require an advanced degree.

Practical Tip: When designing your agent's interface, ask yourself: "Could a non-technical user quickly and easily revoke all permissions or change its primary objective?" If the answer is no, revisit your design.

The FBI and License Plate Readers: Guarding Against Data Overreach

The news that the FBI wants to buy nationwide access to license plate readers raises significant privacy concerns. For AI agent developers, this serves as a powerful cautionary tale about data collection and privacy.

While we build agents primarily for personal use on consumer hardware, the principles remain the same: minimize data collection and maximize privacy. Our agents often interact with sensitive personal data - financial information, schedules, communication patterns.

Here's how to build agents with privacy in mind:

  1. "Privacy by Design" Principle: From the very first line of code, consider data privacy. Only collect data absolutely necessary for the agent's function. If an agent manages your calendar, it likely doesn't need access to your microphone.
  2. Local First: One of the biggest advantages of developing agents for consumer hardware is the ability to keep data local. Emphasize this. Processing data on-device reduces the risk of third-party breaches or government requests for data.
  3. Explicit Consent for External Calls: If your agent must communicate with an external API or service (e.g., for real-time information), ensure the user gives explicit, informed consent for that specific data exchange. They should know what data is leaving their device and why.

Code Insight: Consider data flow diagrams during your agent's design phase. Visually map out where data originates, where it's stored, and where it's transmitted. This helps identify potential privacy weak points.

The AI Encyclical: Ethical Foundations for Agent Behavior

The upcoming presentation of an AI encyclical by Anthropic's co-founder alongside Pope Leo XIV might seem far removed from practical engineering. However, it signifies a growing global discourse around the ethical implications of AI. This isn't just for large language models; it applies to every agent we build, no matter how small.

Ethical considerations translate to practical design choices:

  • Fairness and Bias: Are your agents making decisions that could inadvertently discriminate? Even simple automation scripts can inherit biases from the data they're trained on or the rules they're given. Regularly audit your agent's outputs for unintended consequences.
  • Accountability: If an agent makes a mistake, who is responsible? Designing agents with clear logging, explainable decision paths, and the ability to revert actions makes accountability easier to establish.
  • Beneficence: Does your agent genuinely serve the user's best interest? Or is it subtly nudging them towards actions that benefit something else?

Engineering for the Unforeseen: Adaptability with Lisp Principles

The ongoing volatility in the AI industry - the constant shifts, the rapid pace of development - demands agents that are not just smart, but also highly adaptable. This is where principles from languages like Lisp, highlighted by Hyperpolyglot's deep dive into Common Lisp, Racket, Clojure, and Emacs Lisp, become particularly relevant.

Lisp's power lies in its metaprogramming capabilities and its emphasis on symbolic computation, making it incredibly flexible. While you might not be writing your entire agent in Clojure, the philosophy of building highly introspectable, modifiable, and extensible systems is invaluable.

How do we apply this to our agents on consumer hardware?

  1. Modular Design: Break your agent into small, independent modules. This makes it easier to update, replace, or reconfigure specific components without bringing down the whole system. Imagine swapping out a 'planning' module without touching the 'perception' module.
  2. Clear State Management: Define your agent's internal state clearly and make it observable. When something goes wrong, you want to easily inspect why the agent made a particular decision. This means avoiding deeply nested, opaque logic.
  3. Configuration over Code: Whenever possible, allow behavior to be modified via configuration files or user-defined rules rather than requiring code changes. This empowers users to adapt the agent to their specific needs without needing to be a programmer.

Code Sketch (Conceptual Python example, reflecting Lisp's modifiability spirit):

# Instead of hardcoding behavior def process_email_legacy(email): if "urgent" in email.subject: send_notification("High priority email!") # ... more complex, hardcoded rules # Design for configuration and extensibility class EmailAgentRule: def __init__(self, condition_func, action_func): self.condition = condition_func self.action = action_func def check_subject_urgent(email): return "urgent" in email.subject.lower() def notify_high_priority(email): print(f"Agent: High priority email from {email.sender}!") def archive_and_label(email): print(f"Agent: Archiving and labeling email from {email.sender}.") # User-defined rules can be loaded dynamically email_rules = [ EmailAgentRule(check_subject_urgent, notify_high_priority), EmailAgentRule(lambda e: "newsletter" in e.subject.lower(), archive_and_label), # ... easily add more rules from a config file ] def process_email(email, rules): for rule in rules: if rule.condition(email): rule.action(email) # An agent should know its current action, making it observable print(f"Agent applied rule: {rule.action.__name__}") # Example usage: class MockEmail: def __init__(self, sender, subject): self.sender = sender self.subject = subject process_email(MockEmail("boss@company.com", "Urgent Project Update"), email_rules) process_email(MockEmail("marketing@spam.com", "Our weekly newsletter"), email_rules)

This simple conceptual example shows how declarative rules and functional separation make agents more adaptable and their actions more inspectable, aligning with the "design for agency" principle.

Building for the Long Haul on Your Hardware

The AI Summer may bring intense competition and shifting priorities, but for those of us building agents for individual users and consumer hardware, it's a call to focus on fundamental engineering principles. By prioritizing user control, data privacy, ethical decision-making, and architectural adaptability, we build agents that aren't just intelligent, but also truly dependable.

These are the agents that will stand the test of time, proving their worth by respecting their users and delivering consistent value. They are the agents that empower, rather than constrain.

To help ensure your AI agents meet these high standards for security, reliability, and user control, explore our /tools/agentguard resource. It provides guidance and frameworks for building agents that you and your users can truly trust. Embrace the challenge, build with integrity, and let's craft the next generation of truly empowering AI agents.

Want more like this?

AI agent builds, real costs, what works. One email per week. No fluff.

PH

Patrick Hughes

Building BMD HODL — a one-person AI-operated holding company. Nashville, Tennessee. Twenty-Two agents.

More writing