<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Josue Perez</title>
    <description>The latest articles on DEV Community by Josue Perez (@perex).</description>
    <link>https://dev.to/perex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092670%2F11f2d0c5-257e-4ae0-960d-eece1b6df48a.png</url>
      <title>DEV Community: Josue Perez</title>
      <link>https://dev.to/perex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/perex"/>
    <language>en</language>
    <item>
      <title>Access Is Not Permission: What I Learned Giving an AI Agent the Keys to My Accounts</title>
      <dc:creator>Josue Perez</dc:creator>
      <pubDate>Thu, 03 Sep 2026 15:19:07 +0000</pubDate>
      <link>https://dev.to/perex/access-is-not-permission-what-i-learned-giving-an-ai-agent-the-keys-to-my-accounts-al6</link>
      <guid>https://dev.to/perex/access-is-not-permission-what-i-learned-giving-an-ai-agent-the-keys-to-my-accounts-al6</guid>
      <description>&lt;p&gt;Most people wire up an AI agent and then discover what it can do. I did it the other way round: before I gave an agent access to my accounts, I wrote down what it wasn't allowed to do — while I was calm, because I knew I wouldn't be calm later.&lt;/p&gt;

&lt;p&gt;That document became a permission board. It's real, it governs agents I actually run, and I've since put an interactive version of it on my site so people can set the levels themselves and watch the agent accept, hold, or refuse. This post is about the one distinction the board taught me, and the one mistake it didn't prevent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three levels, consulted before every protected action
&lt;/h2&gt;

&lt;p&gt;Every capability the agent has sits at one of three levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Acts alone&lt;/strong&gt; — it can do this without asking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafts only&lt;/strong&gt; — it prepares the action; a human approves before anything leaves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never alone&lt;/strong&gt; — it doesn't do this, full stop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent consults the board before any protected action. That sounds like ordinary access control, and in one sense it is. The interesting part is what happens when you try to talk the agent past it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A policy can be argued with. An absence can't.
&lt;/h2&gt;

&lt;p&gt;Here's the experiment I ask people to run on the interactive board: set &lt;em&gt;Send a DM&lt;/em&gt; to green — "acts alone" — and then ask the agent to message someone.&lt;/p&gt;

&lt;p&gt;It still refuses. Not because the policy says no; you just told the policy yes. It refuses because on this system &lt;strong&gt;the messaging function was never built.&lt;/strong&gt; There's no code path to argue with.&lt;/p&gt;

&lt;p&gt;That's the distinction in the title. &lt;em&gt;Access&lt;/em&gt; is what a policy grants. &lt;em&gt;Permission&lt;/em&gt;, in the sense that matters for safety, is whether the capability exists at all.&lt;/p&gt;

&lt;p&gt;A policy file is a set of words, and words can be pressured. A well-crafted prompt injection, a bad inference, a compromised agent, a malicious instruction hidden in a web page it reads — each of these is, at bottom, an attempt to get the agent to reinterpret what "permitted" means. A capability that doesn't exist survives all four equally. It can't be prompt-injected, because there's nothing to inject into.&lt;/p&gt;

&lt;p&gt;This changes how I design agent systems. The first question is no longer "what should this agent be allowed to do?" It's "what should this agent be &lt;em&gt;unable&lt;/em&gt; to do?" — and then, for the things it genuinely must be able to do, "which of those need a human between draft and send?"&lt;/p&gt;

&lt;p&gt;(For precision: two of my channels do carry one narrow, templated first-contact acknowledgement, and that one is governed by policy rather than absence. The publishing paths have no messaging function at all.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake that cost me something
&lt;/h2&gt;

&lt;p&gt;Here's the part I'd rather not have to write.&lt;/p&gt;

&lt;p&gt;My rules originally lived in a file the agent could edit. I'd written careful boundaries and then stored them somewhere the thing being bounded had write access to. Nothing dramatic happened — but the moment I noticed, I understood that the board had been advisory the entire time. An agent that can rewrite its own permissions has no permissions; it has suggestions.&lt;/p&gt;

&lt;p&gt;Now the file is mounted read-only. The agent can read its permissions and cannot change what "permitted" means. That's a one-line change in infrastructure and a fairly large change in what the word "boundary" is worth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest limit
&lt;/h2&gt;

&lt;p&gt;None of this makes an agent safe. I want to be precise about that, because "safe" is the word people reach for and it's the wrong one.&lt;/p&gt;

&lt;p&gt;What a board like this does is &lt;strong&gt;bound the blast radius when the agent is wrong&lt;/strong&gt; — which is a different goal, and a far more achievable one. You are not preventing mistakes. You are deciding, in advance and in calm, how large a mistake is allowed to get.&lt;/p&gt;

&lt;p&gt;It also can't stop the &lt;em&gt;first&lt;/em&gt; bad action in a category you left open. It can only stop the second. I know this because I left one open, and found out the way you'd expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run agents
&lt;/h2&gt;

&lt;p&gt;Three things I'd do before the agent does anything real:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the board first.&lt;/strong&gt; Not after the first incident. Levels per capability, and be honest about which ones are "never alone."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer absence to policy for anything irreversible.&lt;/strong&gt; If the agent never needs to send, delete, or pay, don't build the function and then forbid it — leave it unbuilt. Absence is the only rule that holds under pressure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the rules something the agent can read and cannot write.&lt;/strong&gt; Otherwise you've written a wish list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interactive board — with the refusal you can test yourself, and the flaw I found in my own system left in on purpose — is at &lt;a href="https://perex.design/permission-board" rel="noopener noreferrer"&gt;perex.design/permission-board&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Josué — a UX and product designer working on human–AI interaction: consent architecture, agent governance and the trust patterns that decide whether people can rely on an AI acting on their behalf. More at &lt;a href="https://perex.design" rel="noopener noreferrer"&gt;perex.design&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>ux</category>
    </item>
    <item>
      <title>Six Dimensions for Evaluating Voice Agent UX (A Framework, Not a Feature List)</title>
      <dc:creator>Josue Perez</dc:creator>
      <pubDate>Tue, 01 Sep 2026 12:27:01 +0000</pubDate>
      <link>https://dev.to/perex/six-dimensions-for-evaluating-voice-agent-ux-a-framework-not-a-feature-list-393f</link>
      <guid>https://dev.to/perex/six-dimensions-for-evaluating-voice-agent-ux-a-framework-not-a-feature-list-393f</guid>
      <description>&lt;p&gt;Most voice agent reviews I've read grade on two things: does the transcription work, and does the response sound natural. That's a speech-quality checklist, not a trust checklist. It tells you nothing about whether the thing is safe to put in front of someone who doesn't know it's a language model, or whether it fails gracefully when it inevitably misunderstands.&lt;/p&gt;

&lt;p&gt;I've spent the last few months building a research instrument for evaluating voice agent behavior — not benchmarking latency or word-error-rate, but the &lt;em&gt;relational&lt;/em&gt; behavior: what the agent does at the moments where trust is actually won or lost. I'm publishing the framework here, honestly labeled as a framework: a structured way to look at a voice interaction, not a set of finished findings with numbers attached. If you're designing or shipping a voice agent, these are the six places I'd tell you to look before you ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why speech quality isn't the right unit of analysis
&lt;/h2&gt;

&lt;p&gt;A voice agent can have flawless TTS and still be a bad interaction, because voice removes almost every visual affordance we normally rely on to communicate system state. There's no spinner, no "typing…" indicator, no button that says "end conversation," no visible list of what the thing can and can't do. Everything has to be communicated through timing, wording, and turn-taking, or it isn't communicated at all. That's a UX problem before it's an engineering one, and it needs its own evaluation lens — the six dimensions below, each a place where a voice interface makes an implicit claim about what kind of thing it is, whether the designer intended it to or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six dimensions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Conversation journeys.&lt;/strong&gt; Map the actual paths a user takes through a session — not the happy-path script, the real branches: someone who starts a task and abandons it, someone who circles back after a tangent, someone who tries to correct course three turns in. If you've only designed for the linear happy path, you've designed for a minority of real sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Memory and forgetting.&lt;/strong&gt; What does the agent remember across turns, and — just as important — what does it visibly &lt;em&gt;forget&lt;/em&gt;, and does it say so? A voice agent that silently drops context earlier in the conversation isn't just annoying, it's dishonest about its own state. If memory resets between sessions, disclosing that is a design decision, not an edge case to skip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Silence and hesitation.&lt;/strong&gt; Dead air in a voice interface reads as a signal whether you intend it to or not — a pause can mean "processing," "confused," or "broken," and users can't tell which unless you design for it. This is one of the most under-designed surfaces in voice UX because it has no visual equivalent to steal patterns from. Filler audio, explicit "thinking" cues, or honest latency disclosure all count as real design choices — silence by default is not neutral.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Interruption and clarification.&lt;/strong&gt; Can the user interrupt? Does the system interrupt itself to ask a clarifying question when confidence is low, or does it plow ahead on a guess? Barge-in handling is usually treated as a pure engineering problem — can the mic detect speech over playback — but the UX question is separate: when the agent &lt;em&gt;could&lt;/em&gt; interrupt to clarify, does it choose to, and how does that choice get made?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Misunderstanding recovery.&lt;/strong&gt; Every voice agent will misunderstand something. The design question is what happens next: does it ask a targeted follow-up, does it guess and move on, does it apologize and restart, does it quietly fail? Recovery behavior is where users form their most durable judgment about whether a system is trustworthy — a single graceful recovery can undo several turns of frustration, and a single bad one can end the session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Trust formation.&lt;/strong&gt; This is the composite dimension — how the previous five accumulate (or don't) into a user's willingness to rely on the agent for something that matters. It's also the one I'd flag as hardest to evaluate honestly, because self-reported trust and observed behavior (does the person actually delegate the next task to it) frequently diverge. Anyone running this kind of evaluation should build in a way to check both, not just ask "did you trust it?" at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design stance underneath the framework
&lt;/h2&gt;

&lt;p&gt;The six dimensions are a diagnostic tool. What you do with what you find depends on a stance, and mine is the same one I use for any AI-adjacent interface: consent before capability, disclosure over deception, oversight as a required step rather than a setting the user has to find.&lt;/p&gt;

&lt;p&gt;Concretely, that means a few things that are easy to skip under deadline pressure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disclose that it's an AI, early, in a way that doesn't require the user to ask.&lt;/strong&gt; The moment of disclosure matters as much as the fact of it — "I'm an AI" said thirty seconds into a rapport-building exchange lands differently than the same sentence said in the first breath. If your product depends on the user forgetting they're talking to a model, that's not a growth hack, it's a design failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat structural trust separation as a UX principle, not just a security one.&lt;/strong&gt; In prompt-injection defense, you keep system-level instructions and user-supplied content in different trust tiers so one can't silently override the other. The same logic applies to conversational trust: what the system claims about itself (capabilities, memory, certainty) should be structurally distinguishable from what it's inferring or guessing, and the user should be able to tell the difference by ear, not just by asking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make oversight a required step for consequential actions, not an optional confirmation dialog.&lt;/strong&gt; If the voice agent can take an action with real consequences — booking, purchasing, sending, deleting — the check-before-act moment should be a structural part of the flow, not a "are you sure?" that a rushed user learns to say yes to on reflex.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using this as a checklist
&lt;/h2&gt;

&lt;p&gt;If you're evaluating your own voice agent, or someone else's, before it ships, walk at least one non-happy-path journey end to end on purpose; find every place the agent goes silent for more than a second or two and ask what that silence is communicating; force a misunderstanding and watch what happens next instead of only testing the scripted demo path; check whether disclosure happens early and unprompted rather than on request; and identify every consequential action the agent can take, then confirm oversight is structural rather than a dialog box a rushed user learns to dismiss.&lt;/p&gt;

&lt;p&gt;None of this replaces measuring latency or transcription accuracy. It's the layer above that — the one that decides whether a technically competent voice agent is also one people should actually trust.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Josué — a UX and product designer working at the intersection of interaction design and applied AI, currently building out a research practice around voice-agent behavior and AI explainability. More at &lt;a href="https://perex.design" rel="noopener noreferrer"&gt;perex.design&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ux</category>
      <category>ai</category>
      <category>design</category>
      <category>voiceui</category>
    </item>
  </channel>
</rss>
