<?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: Jorge Carrasosa</title>
    <description>The latest articles on DEV Community by Jorge Carrasosa (@oblivionwing26).</description>
    <link>https://dev.to/oblivionwing26</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%2F4242994%2F5d04f93d-f9d0-4f2a-8b22-4728a0db700c.jpg</url>
      <title>DEV Community: Jorge Carrasosa</title>
      <link>https://dev.to/oblivionwing26</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oblivionwing26"/>
    <language>en</language>
    <item>
      <title>Janus-Arena development</title>
      <dc:creator>Jorge Carrasosa</dc:creator>
      <pubDate>Fri, 13 Nov 2026 13:15:28 +0000</pubDate>
      <link>https://dev.to/oblivionwing26/janus-arena-development-1ce</link>
      <guid>https://dev.to/oblivionwing26/janus-arena-development-1ce</guid>
      <description>&lt;h1&gt;
  
  
  What synthetic users measure, and what they don't
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Janus Arena, gate G2 (November 2026). Every figure comes from real runs against ShopLab, a demo&lt;br&gt;
shop with three usability flaws seeded on purpose. The events, reports and exports are in the&lt;br&gt;
&lt;a href="https://github.com/oblivionwing26/janus-arena" rel="noopener noreferrer"&gt;repository&lt;/a&gt;, and the console's demo build replays&lt;br&gt;
them in your browser.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A "synthetic user" here is a language-model agent that plays a person (Carmen, a retired&lt;br&gt;
teacher; Javier, who wants to know the total cost before he pays; Lucía, who does not want to&lt;br&gt;
create yet another account) and navigates a website step by step in a real browser. It is tempting&lt;br&gt;
to sell this as a cheap way to predict what your customers will do. It is not. This text is about&lt;br&gt;
what we could measure, what we could not, and why the difference matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The starting rule: code measures, the model acts
&lt;/h2&gt;

&lt;p&gt;The model only decides the next action in the browser. Everything else is computed by&lt;br&gt;
deterministic code from an event log that cannot be edited:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;friction (dead clicks, backtracking, form errors, abandonment, extra steps compared with a
reference agent) is detected by pure functions;&lt;/li&gt;
&lt;li&gt;whether a task succeeded is decided by an oracle that reads the shop the way the buyer does
(their orders), not by what the agent says;&lt;/li&gt;
&lt;li&gt;rates carry confidence intervals, and comparisons between variants carry an explicit decision
rule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split is not an implementation detail. It is what lets you say something honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they do measure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Where friction concentrates, when someone trips on it.&lt;/strong&gt; We group signals by page and element,&lt;br&gt;
and each session counts once per zone. When we replayed the three seeded flaws on purpose (shipping&lt;br&gt;
cost hidden until payment, the coupon tucked behind "Other options", a registration form that wipes&lt;br&gt;
every field when it fails), all three ended up among the five zones with the most friction, and the&lt;br&gt;
registration one was pinned to the exact button. With eight personas and the task of using a&lt;br&gt;
coupon, the two hottest zones were the cart and the checkout: the loop of someone looking for a&lt;br&gt;
field they cannot see. The agents' own thoughts confirm it ("I don't see the coupon at checkout; I'll&lt;br&gt;
go back to the cart to find where to enter it").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Synthetic task success, with its uncertainty.&lt;/strong&gt; With an oracle, "buy two notebooks" is checked&lt;br&gt;
against the order, not against the agent's closing sentence. Before trusting any persona, we&lt;br&gt;
validated a competent agent with no biases: it completed 9 of 10 tasks according to the oracle. If&lt;br&gt;
the machinery cannot shop, no persona failure means anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it costs to measure.&lt;/strong&gt; About 2,850 input tokens per step, three quarters of them read from&lt;br&gt;
the cache; a persona session costs 0.002 to 0.004 €. Most of the spend is the reference agent, and&lt;br&gt;
above all its loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they don't measure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Revenue or conversion.&lt;/strong&gt; An agent has no wallet, no real hurry and no alternatives. We talk about&lt;br&gt;
"synthetic task success", never about a conversion improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flaws nobody trips on.&lt;/strong&gt; The registration form that wipes its fields only hurts if you make a&lt;br&gt;
mistake filling it in. In our runs every agent filled it in correctly the first time: the flaw is&lt;br&gt;
there and the heatmap does not see it. A synthetic user measures the path it walks, not the whole&lt;br&gt;
site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What lies outside their goals.&lt;/strong&gt; In the first real A/B, variant B fixed the hidden shipping cost&lt;br&gt;
and the hidden coupon. No persona wanted to use a coupon, so that fix could not show. The result&lt;br&gt;
was "no detectable difference" (B − A = −0.13 over 16 pairs, interval [−0.31, 0.00]), and it is the&lt;br&gt;
right answer to that question, not a failure of the method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent says about itself.&lt;/strong&gt; Javier, on variant B, read "total: 24.89 € with shipping of&lt;br&gt;
4.99 €" in the cart, bought, and at the end claimed that shipping had been hidden until after&lt;br&gt;
confirmation and called the session abandoned. Without an oracle, that sentence would have counted&lt;br&gt;
as a failure of B. A model's self-assessment is something to check, not evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits worth saying out loud
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small samples.&lt;/strong&gt; With 16 pairs the intervals are wide; only large effects show. Better to say
"not detectable" than to invent a difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traits that weigh more than the variant.&lt;/strong&gt; Lucía always abandons at the sign-in wall and Tomás
always runs out of his 12 steps, in A and in B. That is information about the shop (or the
persona), not about the change being evaluated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent loops.&lt;/strong&gt; An agent can go back and forth between cart and checkout dozens of times. We
count each session once per zone so a loop does not look like a crowd, but the cost is still
paid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What the agent sees.&lt;/strong&gt; It only perceives what we show it of the page (a pruned accessibility
tree). A purely visual problem (contrast, size, a confusing image) does not enter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changed when the A/B got a task and an oracle
&lt;/h2&gt;

&lt;p&gt;The A/B above had no task: success was the agent's word. In the next version every persona gets the&lt;br&gt;
same task ("buy a watercolour set using your coupon") and the oracle checks the order, including&lt;br&gt;
that the discount was applied. A UI-engineering agent then patched the two most intense friction&lt;br&gt;
zones into a variant B, each patch checked by the shop's own lint, typecheck and tests, and a paired&lt;br&gt;
run compared A and B.&lt;/p&gt;

&lt;p&gt;The result: synthetic task success went from 1 of 6 personas on A to 5 of 7 on B, a difference of&lt;br&gt;
+0.50 with an interval of [0.17, 0.83] over 6 pairs. That is an effect the method can see, because&lt;br&gt;
the task now crosses the flaws that B fixes. The paired run itself cost about 0.28 €. It is still&lt;br&gt;
synthetic task success on a demo shop, and the interval is wide: it says that B is better for these&lt;br&gt;
personas on this task, not by how much a real shop would gain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is for, then
&lt;/h2&gt;

&lt;p&gt;For what an automated test does well: detecting regressions and locating where it hurts, cheaply&lt;br&gt;
and repeatably, before they reach real people. A report that says "the cart and the checkout&lt;br&gt;
concentrate the friction of whoever is looking for the coupon" is useful to the team reviewing the&lt;br&gt;
change. A report that promised "+8 % conversion" would not be, because it would not be true.&lt;/p&gt;

&lt;p&gt;And that is the other half of the project: the same loop measures the UX cost of a security fix.&lt;br&gt;
A rate limit or an account lockout closes a hole and changes who can still buy. The next article&lt;br&gt;
is about that trade-off.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
