<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Field Note Archives - Alessandro Zulberti</title>
	<atom:link href="https://alessandrozulberti.com/category/field-note/feed/" rel="self" type="application/rss+xml" />
	<link>https://alessandrozulberti.com/category/field-note/</link>
	<description>UX - User Experience Researcher</description>
	<lastBuildDate>Fri, 24 Jul 2026 10:42:04 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://alessandrozulberti.com/wp-content/uploads/2022/12/cropped-image-32x32.jpg</url>
	<title>Field Note Archives - Alessandro Zulberti</title>
	<link>https://alessandrozulberti.com/category/field-note/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Dropped Ideas: Working Frameworks</title>
		<link>https://alessandrozulberti.com/field-note/ux-research-frameworks-for-reflective-practice/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sat, 04 Jul 2026 12:29:40 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=2310</guid>

					<description><![CDATA[<p>I built five working frameworks, then removed them. This is the record of why. The idea was reasonable. I had a set of half-formed instincts about research practice, and I thought that naming them — turning each into a small three-move framework — would sharpen them into something teachable and distinct. Working with an LLM [&#8230;]</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/ux-research-frameworks-for-reflective-practice/">Dropped Ideas: Working Frameworks</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I built five working frameworks, then removed them. This is the record of why.</p>



<p class="wp-block-paragraph">The idea was reasonable. I had a set of half-formed instincts about research practice, and I thought that naming them — turning each into a small three-move framework — would sharpen them into something teachable and distinct. Working with an LLM made the building fast. Too fast: it let me generate the appearance of insight quicker than I could notice its absence. A three-move framework with a principle under each move <em>reads</em> as thinking. The act of naming something confers a sense of having understood it. And a model will produce as much of that as you ask for, fluently, without ever telling you that the thing you&#8217;ve named was never unclear in the first place.</p>



<p class="wp-block-paragraph">So I applied the test I apply to anyone else&#8217;s work: what, specifically, is this — and where is the evidence it&#8217;s mine? Five of the frameworks failed it. Not because the ideas were wrong, but because they were already common practice wearing a new name, or my own framing added nothing the concept didn&#8217;t already carry. Keeping them would have weakened the frameworks that <em>are</em> mine, by association: a reader who spots that one is repackaged standard practice starts doubting the rest.</p>



<p class="wp-block-paragraph">Below, each dropped framework as I built it — its three moves, stated as the assumption they encoded — and the specific reason it didn&#8217;t survive.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Productivity Decision Compass</h2>



<p class="wp-block-paragraph"><strong>The assumption, in three moves.</strong></p>



<ol class="wp-block-list">
<li><em>Scan the surplus</em> — when unexpected time appears, survey what could be done with it.</li>



<li><em>Choose the highest-leverage move</em> — commit to one use rather than diffusing across several.</li>



<li><em>Close the loop</em> — capture what the choice produced so the next decision is better informed.</li>
</ol>



<p class="wp-block-paragraph"><strong>Why it was dropped.</strong> It&#8217;s a personal-productivity tool, not a research method. It answers &#8220;what to do with spare time,&#8221; not any question about users, evidence, or service conditions. A framework belongs in a body of work only if it addresses that work&#8217;s actual domain — a good tool in the wrong section weakens the section. Category coherence is a bar, not a formality.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Triangulation Lens</h2>



<p class="wp-block-paragraph"><strong>The assumption, in three moves.</strong></p>



<ol class="wp-block-list">
<li><em>Gather across types</em> — hold quantitative, qualitative, and observational evidence side by side.</li>



<li><em>Read the disagreement</em> — treat conflict between sources as information, not a problem to resolve away.</li>



<li><em>Notice the absence</em> — ask which type of evidence is missing before trusting the picture.</li>
</ol>



<p class="wp-block-paragraph"><strong>Why it was dropped.</strong> It is triangulation. Mixing evidence types and noticing which is absent is foundational method, taught everywhere. The name added nothing the concept didn&#8217;t already carry. Renaming a standard practice isn&#8217;t authorship — if the idea survives without my framing, my framing wasn&#8217;t the contribution.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Stakeholder Listening Compass</h2>



<p class="wp-block-paragraph"><strong>The assumption, in three moves.</strong></p>



<ol class="wp-block-list">
<li><em>Attend before extracting</em> — listen for what a stakeholder means before converting it into requirements.</li>



<li><em>Translate into layers</em> — separate the stated ask from the underlying concern and the organisational pressure behind it.</li>



<li><em>Reflect back</em> — return your reading to the stakeholder to test whether it holds.</li>
</ol>



<p class="wp-block-paragraph"><strong>Why it was dropped.</strong> It&#8217;s active-listening technique applied to stakeholders — competent, generic, and available in any facilitation guide. &#8220;Applied to stakeholders&#8221; is not a differentiator. Porting a common technique to a new audience doesn&#8217;t make it a new framework.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Heuristic Plus</h2>



<p class="wp-block-paragraph"><strong>The assumption, in three moves.</strong></p>



<ol class="wp-block-list">
<li><em>Apply the heuristics</em> — evaluate an interface against Nielsen&#8217;s ten.</li>



<li><em>Ask what each misses</em> — for every heuristic, name what it can&#8217;t see in this context.</li>



<li><em>Record the gap</em> — treat the blind spot as a finding in its own right.</li>
</ol>



<p class="wp-block-paragraph"><strong>Why it was dropped.</strong> The substance is Nielsen&#8217;s, verbatim. The additive move — &#8220;ask what it misses&#8221; — is a single question standing on someone else&#8217;s framework, not a framework in itself. Building a small extension onto a well-known model invites the obvious question of what I actually added. If the answer is one prompt, it&#8217;s a note, not a framework.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Ethnographic Lens</h2>



<p class="wp-block-paragraph"><strong>The assumption, in three moves.</strong></p>



<ol class="wp-block-list">
<li><em>Enter with curiosity</em> — let the field surprise you before categories lead the encounter.</li>



<li><em>Describe before interpreting</em> — record verbatim and physical action before assigning meaning.</li>



<li><em>Frame as partial</em> — present the reading as true of these people, in this context, seen from here.</li>
</ol>



<p class="wp-block-paragraph"><strong>Why it was dropped.</strong> It&#8217;s a competent summary of applied ethnography — true, useful, and indistinguishable from a methods-handbook page. Accuracy is not distinctiveness. A correct summary of an existing discipline is teaching material at best, not an original instrument.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">What the discarding was actually for</h2>



<p class="wp-block-paragraph">The five failed on two bars: <strong>distinctiveness</strong> (does it contribute something beyond established practice?) and <strong>category coherence</strong> (does it belong in this body of work at all?). Neither bar is about the idea being bad. Triangulation is good practice; ethnographic discipline is good practice. They&#8217;re just not <em>mine</em> to name, and publishing them as frameworks would have claimed authorship I hadn&#8217;t earned.</p>



<p class="wp-block-paragraph">The useful part isn&#8217;t the drop. It&#8217;s the test. The check I apply to everyone else&#8217;s work — what, specifically, is this, and where is the evidence — is the check I stopped applying to my own the moment the output started arriving fast and looking finished. Obvious words are easiest to generate when they&#8217;re yours. Keeping this record public is a way of keeping the test switched on.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://alessandrozulberti.com/field-note/ux-research-frameworks-for-reflective-practice/">Dropped Ideas: Working Frameworks</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How Do You Ask a Chameleon to Stop Changing Colour</title>
		<link>https://alessandrozulberti.com/field-note/how-do-you-ask-a-chameleon-to-stop-changing-colour/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 15:48:53 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=2201</guid>

					<description><![CDATA[<p>There are three studies open on my screen. Interviews from a discovery sprint, behavioural data from Contentsquare, a usability session from six weeks earlier. I have read all of them. Not skimmed — read, the way you read something when you know you will need to find the gap between what participants said and what [&#8230;]</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/how-do-you-ask-a-chameleon-to-stop-changing-colour/">How Do You Ask a Chameleon to Stop Changing Colour</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">There are three studies open on my screen. Interviews from a discovery sprint, behavioural data from Contentsquare, a usability session from six weeks earlier. I have read all of them. Not skimmed — read, the way you read something when you know you will need to find the gap between what participants said and what the synthesis will eventually claim they meant.</p>



<p class="wp-block-paragraph">I ask the model to synthesise across all three.</p>



<p class="wp-block-paragraph">It does. Fluently. Coherently. With the kind of quiet confidence that makes you want to believe it.</p>



<p class="wp-block-paragraph">Then I ask it to challenge its own conclusions. To find what the data forbids, not just what it supports.</p>



<p class="wp-block-paragraph">It does that too. Fluently. Coherently. With the kind of quiet confidence that makes you want to believe it.</p>



<p class="wp-block-paragraph">The problem is not that the second response is wrong. The problem is that I have no way of knowing whether it is right — unless I already know the answer. And if I already know the answer, I did not need the tool.</p>



<h2 class="wp-block-heading">The distinction that matters</h2>



<p class="wp-block-paragraph">Synthesis asks: what does the evidence support?</p>



<p class="wp-block-paragraph">Falsification asks: what would the evidence rule out?</p>



<p class="wp-block-paragraph">These are not the same operation. In research practice, in strategic decision-making, in risk assessment, the difference between them is the difference between a map and a terrain. Synthesis builds the map. Falsification walks the terrain and notices where the map is wrong.</p>



<p class="wp-block-paragraph">Large language models are extraordinarily capable at synthesis. They can hold multiple sources in tension, identify convergent threads, surface patterns that would take a researcher hours to assemble manually. Used well, that capability is genuine — it saves time, extends reach, surfaces things you would have missed.</p>



<p class="wp-block-paragraph">But falsification requires something synthesis does not. It requires doubt that arrives from outside the frame. It requires a question the model cannot generate from its own outputs, because generating it would mean reaching beyond the statistical distribution of language it has been trained on — toward the thing that does not fit, the participant whose account does not cohere, the metric that pulls in the opposite direction from everything else.</p>



<p class="wp-block-paragraph">When I ask the model to challenge its own synthesis, it produces challenge. But the challenge arrives in the same register as the synthesis. Same fluency. Same coherence. Same confidence. It is wearing the shape of resistance without the substance of it.</p>



<p class="wp-block-paragraph">I started calling this performed rigour. The form of stress-testing, without the function.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">The chameleon problem</h2>



<p class="wp-block-paragraph">I spent several months trying to engineer my way out of this. If the model defaults to coherence, I thought, prompt it toward incoherence. Ask it to argue the opposite case. Ask it to play devil&#8217;s advocate. Ask it to find the three things most likely to be wrong.</p>



<p class="wp-block-paragraph">Some of this is useful. Devil&#8217;s advocate prompting produces responses I would not have reached alone. Asking for alternatives — framed as competing hypotheses rather than elaborations — pushes the model somewhere more generative than consensus.</p>



<p class="wp-block-paragraph">But none of it solves the underlying problem. Each time I ask the model to resist its own conclusions, it produces resistance in the same medium as the conclusions. The critique is fluent and well-structured. It sounds like challenge. It has the grammar of intellectual opposition.</p>



<p class="wp-block-paragraph">A chameleon changes colour to match its environment. Ask it to stop, and it changes to a colour that looks like stopping.</p>



<p class="wp-block-paragraph">This is not a failure of the model. It is the model working exactly as designed. Coherence is not a bug. But coherence at the point where you need incoherence — where you need the thing that does not fit to refuse to fit — is a structural problem, not a prompting problem.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">What Euler understood</h2>



<p class="wp-block-paragraph">In 1736, Leonhard Euler was presented with a puzzle from the city of Königsberg. The city was built across a river, with seven bridges connecting its parts. The question: was it possible to walk across all seven bridges exactly once, returning to the starting point?</p>



<p class="wp-block-paragraph">People had tried. No one could do it. But no one could prove it was impossible — until Euler recognised that the question itself was wrong.</p>



<p class="wp-block-paragraph">The impossibility was not navigational. It did not matter which bridge you started from, which route you took, how carefully you planned. The topology of the system — the number of bridges connecting to each landmass — made the complete traversal structurally impossible regardless of how you moved through it.</p>



<p class="wp-block-paragraph">Euler&#8217;s insight was not a better route. It was a different question: not <em>how do I cross all seven bridges</em> but <em>what kind of system makes that crossing possible at all</em>.</p>



<p class="wp-block-paragraph">The falsification problem has the same shape.</p>



<p class="wp-block-paragraph">Writing a better prompt does not solve it. Rephrasing the challenge, adjusting the instruction, asking more precisely — these are navigational moves inside a system whose topology makes certain traversals impossible. The model will respond to each prompt from within its own frame. Ask it to critique that frame, and the critique arrives wearing the frame&#8217;s grammar.</p>



<p class="wp-block-paragraph">You cannot walk out of Königsberg by choosing a different bridge.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">What organisations are actually removing</h2>



<p class="wp-block-paragraph">This matters at the individual level — for every researcher who believes they have stress-tested a synthesis because the model produced something that looked like resistance. But it matters more at the organisational level, because the structural decision is being made there, and it is being made on the basis of an incomplete understanding of what AI can and cannot carry.</p>



<p class="wp-block-paragraph">Organisations are cutting junior analyst and researcher roles. The reasoning is coherent on its surface: AI handles synthesis adequately, senior judgment remains at the top, the cost line comes down.</p>



<p class="wp-block-paragraph">What this misses is what junior roles were actually doing.</p>



<p class="wp-block-paragraph">It was not primarily output. A junior researcher reading raw interview transcripts is not performing a task that AI cannot perform. They are doing something more specific: they are building the capacity to carry doubt into a room before the synthesis begins. They have read the thing. They have noticed the participant whose account didn&#8217;t quite fit. They have felt the friction between what the data says and what the framing wants it to say.</p>



<p class="wp-block-paragraph">That friction is not recorded anywhere. It does not appear in the synthesis document. It lives in the person who sat with the material — and it is the condition under which falsification becomes possible at all.</p>



<p class="wp-block-paragraph">A Dominican philosopher I interviewed for the Disciplina project described the master/disciple relationship in terms drawn from Aquinas: understanding arrives not by instruction from above but by living contact. The hot stone does not make the cold stone warm by explaining heat. It makes it warm by proximity. The cold stone changes because it was in the room.</p>



<p class="wp-block-paragraph">The junior researcher is the cold stone. Not because they are less expert — they become more expert precisely through this contact — but because they are the presence in the room that carries the heat of independent encounter with raw material. Remove them, and the senior researcher is left with AI synthesis on one side and their own prior frameworks on the other. The feedback loop that would have interrupted drift no longer arrives.</p>



<p class="wp-block-paragraph">You have not reduced cost. You have removed the structural condition under which falsification was possible.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">The frame defends itself</h2>



<p class="wp-block-paragraph">McLuhan argued that the content of a medium blinds us to the character of the medium itself. We attend to what is said and stop noticing how the saying shapes what can be said.</p>



<p class="wp-block-paragraph">The extension I want to make is this: the frame does not merely obscure itself through carelessness. It defends itself. When you ask the medium to critique the medium, the critique arrives in the medium&#8217;s register. It performs transparency. It sounds like what stepping outside the frame would sound like, from inside the frame.</p>



<p class="wp-block-paragraph">This is why the chameleon problem is not solvable by prompting alone. The better the model — the more capable, the more fluent, the more sophisticated its simulation of resistance — the harder it becomes to distinguish performed challenge from genuine challenge. The failure mode scales with capability.</p>



<p class="wp-block-paragraph">For a practitioner who has carried independent doubt into the session — who has read the raw material, noticed the friction, built the uncertainty before the tool was opened — this is manageable. The independent doubt is the external ground. It is what allows you to evaluate whether the model&#8217;s resistance is real or performed.</p>



<p class="wp-block-paragraph">For a practitioner who has not — or for an organisation that has removed the roles through which that independent doubt would have formed — the performance of rigour is indistinguishable from rigour itself.</p>



<p class="wp-block-paragraph">That is the risk. Not that AI gets facts wrong. That it gets the synthesis right while making genuine challenge structurally impossible.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">The honest position</h2>



<p class="wp-block-paragraph">I am still working on the falsification prompt.</p>



<p class="wp-block-paragraph">I have a version that produces something closer to genuine resistance than the default. It involves framing the request not as critique of the synthesis but as a search for the participant or data point the synthesis would most need to be false — the specific, concrete case that would break the argument rather than qualify it. It involves doing this before the synthesis is complete, not after. It involves bringing my own independent reading into the prompt explicitly — naming what I noticed before I opened the tool — so the model has something to push against that did not come from the model.</p>



<p class="wp-block-paragraph">This is not a solution. It is a partial mitigation that works when I have done the prior reading, and fails when I have not.</p>



<p class="wp-block-paragraph">Euler&#8217;s actual contribution was not a better route across the bridges. It was a proof that the question of routes was the wrong question, and a new framework — graph theory — that made a different class of questions possible. The topology of the problem had to be understood before it could be worked around.</p>



<p class="wp-block-paragraph">What the equivalent framework looks like for the falsification problem — what kind of human/AI relationship makes genuine challenge possible, and what structural conditions organisations need to preserve to make that relationship viable — is the question the field has not yet asked clearly enough.</p>



<p class="wp-block-paragraph">I do not know the full answer. That is not a weakness in the argument. It is the most credible thing a researcher can say right now.</p>



<p class="wp-block-paragraph">What I do know is that the answer is not a better prompt. The bridge you are trying to cross does not exist inside the medium. The topology has to change.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://alessandrozulberti.com/field-note/how-do-you-ask-a-chameleon-to-stop-changing-colour/">How Do You Ask a Chameleon to Stop Changing Colour</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Agentic AI Reading Instrument</title>
		<link>https://alessandrozulberti.com/field-note/agentic-ai-reading-instrument-shortcode/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 12:48:41 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">http://localhost:8888/?p=2065</guid>

					<description><![CDATA[<p>This experiment helps inspect short ideas about agentic AI through fixed critical lenses. Rather than simulating an assistant, it reads where delegation compresses context, assumes capability, and leaves hidden recovery work behind.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/agentic-ai-reading-instrument-shortcode/">Agentic AI Reading Instrument</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This experiment helps inspect short ideas about agentic AI through fixed critical lenses. Rather than simulating an assistant, it reads where delegation compresses context, assumes capability, and leaves hidden recovery work behind.</p>


<section class="az-agentic-mount az-shortcode-render az-shortcode-render--agentic-ai-reading alignfull">
<article class="az-agentic" data-az-agentic>
  <style>
    .az-agentic-mount {
      display: block;
      width: 100%;
      max-width: none;
    }

    .az-agentic {
      --az-agentic-bg: var(--az-color-band, linear-gradient(180deg, #f1ece3 0%, #f7f4ef 30%, #fcfaf7 100%));
      --az-agentic-surface: var(--az-color-surface, rgba(255, 255, 255, 0.78));
      --az-agentic-surface-strong: var(--az-color-panel, rgba(255, 255, 255, 0.92));
      --az-agentic-surface-soft: var(--az-color-neutral-soft, rgba(246, 242, 235, 0.88));
      --az-agentic-ink: var(--az-color-text, #171512);
      --az-agentic-muted: var(--az-color-muted, #615b54);
      --az-agentic-line: var(--az-color-border, rgba(23, 21, 18, 0.12));
      --az-agentic-line-strong: var(--az-color-border-strong, rgba(23, 21, 18, 0.22));
      --az-agentic-accent: var(--az-color-accent, #1f3d35);
      --az-agentic-accent-soft: var(--az-color-violet-soft, rgba(31, 61, 53, 0.12));
      --az-agentic-risk-low: var(--az-color-success, #2f6247);
      --az-agentic-risk-low-bg: var(--az-color-success-bg, rgba(47, 98, 71, 0.1));
      --az-agentic-risk-medium: var(--az-color-warning, #8a6332);
      --az-agentic-risk-medium-bg: var(--az-color-warning-bg, rgba(138, 99, 50, 0.12));
      --az-agentic-risk-high: var(--az-color-danger, #8b4337);
      --az-agentic-risk-high-bg: var(--az-color-danger-bg, rgba(139, 67, 55, 0.12));
      --az-agentic-shadow: 0 20px 48px rgba(18, 16, 13, 0.06);
      --az-agentic-radius-lg: 26px;
      --az-agentic-radius-md: 18px;
      --az-agentic-radius-sm: 12px;
      --az-agentic-serif: var(--wp--preset--font-family--az-heading, "Newsreader", serif);
      --az-agentic-sans: var(--wp--preset--font-family--az-body, Inter, sans-serif);
      position: relative;
      max-width: 1120px;
      margin: 0 auto;
      padding: clamp(1.1rem, 2vw, 1.8rem);
      border: 1px solid var(--az-agentic-line);
      border-radius: var(--az-agentic-radius-lg);
      background: var(--az-agentic-bg);
      box-shadow: var(--az-agentic-shadow);
      color: var(--az-agentic-ink);
      font-family: var(--az-agentic-sans);
    }

    .az-agentic::before {
      content: "";
      position: absolute;
      inset: 0;
      border-radius: inherit;
      background:
        radial-gradient(circle at top right, rgba(95, 111, 90, 0.12), transparent 26%),
        radial-gradient(circle at bottom left, rgba(143, 108, 74, 0.08), transparent 22%);
      pointer-events: none;
    }

    .az-agentic,
    .az-agentic * {
      box-sizing: border-box;
    }

    .az-agentic__header,
    .az-agentic__form-shell,
    .az-agentic__summary-grid,
    .az-agentic__lens-grid,
    .az-agentic__judgement,
    .az-agentic__usage,
    .az-agentic__empty {
      position: relative;
      z-index: 1;
    }

    .az-agentic__header {
      display: grid;
      gap: 1rem;
      padding: clamp(0.6rem, 1vw, 1rem);
    }

    .az-agentic__eyebrow,
    .az-agentic__label,
    .az-agentic__meta-label,
    .az-agentic__lens-label,
    .az-agentic__examples-title {
      margin: 0;
      font-size: 0.72rem;
      letter-spacing: 0.18em;
      text-transform: uppercase;
      color: var(--az-agentic-muted);
    }

    .az-agentic__title,
    .az-agentic__summary-text,
    .az-agentic__synthesis-text,
    .az-agentic__judgement-title {
      margin: 0;
      font-family: var(--az-agentic-serif);
      font-weight: 200;
      letter-spacing: 0;
      line-height: 1.05;
      text-wrap: balance;
    }

    .az-agentic__title {
      max-width: none;
      font-size: var(--az-type-h3, var(--wp--preset--font-size--large, clamp(1.54rem, 1.36rem + 0.55vw, 1.83rem)));
      line-height: 1.12;
    }

    .az-agentic__intro,
    .az-agentic__note,
    .az-agentic__summary-card p,
    .az-agentic__synthesis-card p,
    .az-agentic__judgement p,
    .az-agentic__empty p,
    .az-agentic__lens-card p,
    .az-agentic__textarea-note {
      margin: 0;
      max-width: 62ch;
      font-size: var(--az-type-body, var(--wp--preset--font-size--medium, clamp(1.06rem, 1.01rem + 0.24vw, 1.16rem)));
      line-height: var(--az-leading-body, 1.7);
      color: var(--az-color-text, var(--az-agentic-ink));
    }

    .az-agentic__note {
      font-size: 0.95rem;
      color: var(--az-agentic-ink);
    }

    .az-agentic__form-shell {
      display: grid;
      gap: 1rem;
      margin-top: 1.4rem;
      padding: clamp(1rem, 2vw, 1.5rem);
      border: 1px solid var(--az-agentic-line);
      border-radius: var(--az-agentic-radius-md);
      background: var(--az-agentic-surface);
      backdrop-filter: blur(18px);
    }

    .az-agentic__examples {
      display: grid;
      gap: 0.7rem;
    }

    .az-agentic__example-list {
      display: flex;
      flex-wrap: wrap;
      gap: 0.6rem;
    }

    .az-agentic__example {
      border: 1px solid var(--az-agentic-line);
      border-radius: 999px;
      background: rgba(255, 255, 255, 0.6);
      color: var(--az-agentic-ink);
      padding: 0.65rem 0.95rem;
      font: inherit;
      font-size: 0.92rem;
      line-height: 1.3;
      cursor: pointer;
      transition: border-color 140ms ease, background-color 140ms ease, transform 140ms ease;
    }

    .az-agentic__example:hover,
    .az-agentic__example:focus-visible,
    .az-agentic__example.is-active {
      border-color: color-mix(in srgb, var(--az-agentic-accent) 30%, transparent);
      background: color-mix(in srgb, var(--az-agentic-accent) 8%, transparent);
      outline: none;
      transform: translateY(-1px);
    }

    .az-agentic__form {
      display: grid;
      gap: 0.8rem;
    }

    .az-agentic__field {
      display: grid;
      gap: 0.55rem;
    }

    .az-agentic__textarea {
      width: 100%;
      min-height: 8.75rem;
      padding: 1rem 1.05rem;
      border: 1px solid var(--az-agentic-line-strong);
      border-radius: var(--az-agentic-radius-sm);
      background: rgba(255, 255, 255, 0.92);
      color: var(--az-agentic-ink);
      resize: vertical;
      font: inherit;
      font-size: 1rem;
      line-height: 1.55;
      transition: border-color 140ms ease, box-shadow 140ms ease;
    }

    .az-agentic__textarea:focus-visible {
      outline: none;
      border-color: color-mix(in srgb, var(--az-agentic-accent) 42%, transparent);
      box-shadow: 0 0 0 3px color-mix(in srgb, var(--az-agentic-accent) 12%, transparent);
    }

    .az-agentic__actions {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      gap: 0.75rem;
    }

    .az-agentic__button {
      border: 1px solid var(--az-agentic-ink);
      border-radius: 999px;
      padding: 0.82rem 1.25rem;
      font: inherit;
      font-size: 0.95rem;
      line-height: 1;
      cursor: pointer;
      transition: transform 140ms ease, background-color 140ms ease, border-color 140ms ease, color 140ms ease;
    }

    .az-agentic__button:hover,
    .az-agentic__button:focus-visible {
      outline: none;
      transform: translateY(-1px);
    }

    .az-agentic__button--primary {
      background: var(--az-agentic-ink);
      color: #ffffff;
    }

    .az-agentic__button--primary:hover,
    .az-agentic__button--primary:focus-visible {
      background: #000000;
    }

    .az-agentic__button--secondary {
      background: transparent;
      color: var(--az-agentic-ink);
      border-color: var(--az-agentic-line-strong);
    }

    .az-agentic__button--secondary:hover,
    .az-agentic__button--secondary:focus-visible {
      background: rgba(23, 21, 18, 0.04);
    }

    .az-agentic__button:disabled {
      opacity: 0.6;
      cursor: wait;
      transform: none;
    }

    .az-agentic__status {
      min-height: 1.2rem;
      font-size: 0.88rem;
      color: var(--az-agentic-muted);
    }

    .az-agentic__results {
      display: grid;
      gap: 1rem;
      margin-top: 1rem;
    }

    .az-agentic__results[hidden] {
      display: none;
    }

    .az-agentic__summary-grid {
      display: grid;
      gap: 1rem;
      grid-template-columns: minmax(0, 1.05fr) minmax(0, 1.35fr);
    }

    .az-agentic__summary-card,
    .az-agentic__synthesis-card,
    .az-agentic__lens-card,
    .az-agentic__judgement,
    .az-agentic__empty {
      padding: clamp(1rem, 1.6vw, 1.35rem);
      border: 1px solid var(--az-agentic-line);
      border-radius: var(--az-agentic-radius-md);
      background: var(--az-agentic-surface-strong);
      box-shadow: 0 12px 30px rgba(18, 16, 13, 0.035);
    }

    .az-agentic__summary-card,
    .az-agentic__synthesis-card,
    .az-agentic__judgement {
      display: grid;
      gap: 0.85rem;
    }

    .az-agentic__summary-source {
      margin: 0;
      padding-left: 1rem;
      border-left: 2px solid rgba(23, 21, 18, 0.1);
      font-size: 0.95rem;
      line-height: 1.6;
      color: var(--az-agentic-ink);
    }

    .az-agentic__summary-text {
      font-size: var(--az-type-h2, var(--wp--preset--font-size--x-large, clamp(1.86rem, 1.54rem + 1vw, 2.39rem)));
      line-height: 1.04;
    }

    .az-agentic__meta-row {
      display: flex;
      flex-wrap: wrap;
      gap: 0.45rem;
      align-items: baseline;
      padding-top: 0.85rem;
      border-top: 1px solid var(--az-agentic-line);
      color: var(--az-agentic-muted);
      font-size: 0.92rem;
      line-height: 1.5;
    }

    .az-agentic__meta-row strong {
      color: var(--az-agentic-ink);
      font-weight: 600;
    }

    .az-agentic__synthesis-card {
      background:
        linear-gradient(135deg, color-mix(in srgb, var(--az-agentic-accent) 8%, transparent), transparent 38%),
        var(--az-agentic-surface-strong);
    }

    .az-agentic__synthesis-text {
      font-size: var(--az-type-h2, var(--wp--preset--font-size--x-large, clamp(1.86rem, 1.54rem + 1vw, 2.39rem)));
      line-height: 1.04;
    }

    .az-agentic__lens-grid {
      display: grid;
      gap: 1rem;
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .az-agentic__lens-card {
      display: grid;
      gap: 0.9rem;
      background: var(--az-agentic-surface);
    }

    .az-agentic__lens-head {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      gap: 0.85rem;
      padding-bottom: 0.85rem;
      border-bottom: 1px solid var(--az-agentic-line);
    }

    .az-agentic__lens-title {
      margin: 0;
      font-size: var(--az-type-h3, var(--wp--preset--font-size--large, clamp(1.54rem, 1.36rem + 0.55vw, 1.83rem)));
      line-height: 1.12;
      font-weight: 200;
      color: var(--az-color-text, var(--az-agentic-ink));
    }

    .az-agentic__risk {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      min-width: 4.75rem;
      padding: 0.34rem 0.7rem;
      border-radius: 999px;
      font-size: 0.72rem;
      line-height: 1;
      letter-spacing: 0.14em;
      text-transform: uppercase;
      font-weight: 700;
      white-space: nowrap;
    }

    .az-agentic__risk[data-risk="Low"] {
      background: var(--az-agentic-risk-low-bg);
      color: var(--az-agentic-risk-low);
    }

    .az-agentic__risk[data-risk="Medium"] {
      background: var(--az-agentic-risk-medium-bg);
      color: var(--az-agentic-risk-medium);
    }

    .az-agentic__risk[data-risk="High"] {
      background: var(--az-agentic-risk-high-bg);
      color: var(--az-agentic-risk-high);
    }

    .az-agentic__lens-copy {
      display: grid;
      gap: 0.8rem;
    }

    .az-agentic__lens-block {
      display: grid;
      gap: 0.3rem;
    }

    .az-agentic__lens-block p {
      font-size: var(--az-type-body, var(--wp--preset--font-size--medium, clamp(1.06rem, 1.01rem + 0.24vw, 1.16rem)));
      line-height: var(--az-leading-body, 1.7);
      color: var(--az-color-text, var(--az-agentic-ink));
    }

    .az-agentic__judgement {
      background:
        linear-gradient(135deg, rgba(143, 108, 74, 0.12), rgba(143, 108, 74, 0) 48%),
        var(--az-agentic-surface-strong);
    }

    .az-agentic__judgement-title {
      font-size: var(--az-type-h2, var(--wp--preset--font-size--x-large, clamp(1.86rem, 1.54rem + 1vw, 2.39rem)));
      line-height: 1.04;
    }

    .az-agentic__judgement-note {
      max-width: 52ch;
    }

    .az-agentic__empty {
      background: var(--az-agentic-surface-soft);
    }

    .az-agentic__empty p {
      color: var(--az-agentic-ink);
    }

    .az-agentic__usage {
      display: grid;
      gap: 0.45rem;
      margin-top: 0.2rem;
      padding: 0.8rem 1rem;
      border: 1px solid var(--az-agentic-line);
      border-radius: var(--az-agentic-radius-sm);
      background: rgba(255, 255, 255, 0.52);
      color: var(--az-agentic-muted);
      font-size: 0.78rem;
      line-height: 1.45;
    }

    .az-agentic__usage[hidden] {
      display: none;
    }

    .az-agentic__usage-title,
    .az-agentic__usage-note {
      margin: 0;
    }

    .az-agentic__usage-list {
      display: flex;
      flex-wrap: wrap;
      gap: 0.35rem 0.85rem;
      margin: 0;
      padding: 0;
      list-style: none;
    }

    .az-agentic__usage strong {
      color: var(--az-agentic-ink);
      font-weight: 650;
    }

    @media (max-width: 900px) {
      .az-agentic__summary-grid,
      .az-agentic__lens-grid {
        grid-template-columns: 1fr;
      }
    }

    @media (max-width: 680px) {
      .az-agentic {
        padding: 0.9rem;
        border-radius: 22px;
      }

      .az-agentic__header,
      .az-agentic__form-shell,
      .az-agentic__summary-card,
      .az-agentic__synthesis-card,
      .az-agentic__lens-card,
      .az-agentic__judgement,
      .az-agentic__empty {
        padding: 1rem;
      }

      .az-agentic__lens-head {
        flex-direction: column;
        align-items: flex-start;
      }
    }
  </style>

  <header class="az-agentic__header" aria-labelledby="az-agentic-title">
    <p class="az-agentic__eyebrow">Editorial experiment</p>
    <h3 id="az-agentic-title" class="az-agentic__title">Agentic AI reading instrument</h3>
    <p class="az-agentic__intro">
      Paste a short scenario about an AI agent. The page reads it through fixed lenses so you can see where delegation compresses context, hides repair work, or should stop.
    </p>
    <p class="az-agentic__note">Not a chatbot. Not a feasibility checker. A compact diagnostic.</p>
  </header>

  <section class="az-agentic__form-shell" aria-labelledby="az-agentic-input-title">
    <div class="az-agentic__examples">
      <p id="az-agentic-input-title" class="az-agentic__examples-title">Load an example</p>
      <div class="az-agentic__example-list">
                  <button class="az-agentic__example" type="button" data-az-example="An AI agent books and rearranges my travel automatically.">
            An AI agent books and rearranges my travel automatically.          </button>
                  <button class="az-agentic__example" type="button" data-az-example="An agent buys groceries for a dinner party.">
            An agent buys groceries for a dinner party.          </button>
                  <button class="az-agentic__example" type="button" data-az-example="An agent handles insurance claims on my behalf.">
            An agent handles insurance claims on my behalf.          </button>
                  <button class="az-agentic__example" type="button" data-az-example="An agent configures and buys a laptop for me.">
            An agent configures and buys a laptop for me.          </button>
                  <button class="az-agentic__example" type="button" data-az-example="An agent manages supplier follow-ups for a small studio.">
            An agent manages supplier follow-ups for a small studio.          </button>
              </div>
    </div>

    <form class="az-agentic__form" data-az-form>
      <label class="az-agentic__field">
        <span class="az-agentic__label">Scenario</span>
        <textarea
          class="az-agentic__textarea"
          name="scenario"
          data-az-input
          placeholder="An AI agent handles insurance claims on my behalf."
          aria-describedby="az-agentic-textarea-note"
        >An AI agent books and rearranges my travel automatically.</textarea>
      </label>
      <p id="az-agentic-textarea-note" class="az-agentic__textarea-note">Enter one short scenario only. This version reads one agentic situation at a time, not a list, comparison, or instruction prompt.</p>
      <div class="az-agentic__actions">
        <button class="az-agentic__button az-agentic__button--primary" type="submit" data-az-analyse>Analyse</button>
        <button class="az-agentic__button az-agentic__button--secondary" type="button" data-az-reset>Reset</button>
      </div>
      <div class="az-agentic__status" data-az-status aria-live="polite"></div>
    </form>
  </section>

  <section class="az-agentic__results" data-az-results hidden>
    <div class="az-agentic__summary-grid">
      <section class="az-agentic__summary-card" aria-labelledby="az-agentic-summary-title">
        <p class="az-agentic__label">Scenario summary</p>
        <p class="az-agentic__summary-source" data-az-slot="scenario"></p>
        <h2 id="az-agentic-summary-title" class="az-agentic__summary-text" data-az-slot="summary"></h2>
        <div class="az-agentic__meta-row">
          <span class="az-agentic__meta-label">Interface legibility</span>
          <span data-az-slot="meta"></span>
        </div>
      </section>

      <section class="az-agentic__synthesis-card" aria-labelledby="az-agentic-synthesis-title">
        <p class="az-agentic__label">Dominant synthesis</p>
        <h2 id="az-agentic-synthesis-title" class="az-agentic__synthesis-text" data-az-slot="synthesis"></h2>
      </section>
    </div>

    <section class="az-agentic__lens-grid" data-az-slot="lenses" aria-label="Analysis lenses"></section>

    <section class="az-agentic__judgement" aria-labelledby="az-agentic-judgement-title">
      <p class="az-agentic__label">Final judgement</p>
      <h2 id="az-agentic-judgement-title" class="az-agentic__judgement-title" data-az-slot="judgement-title"></h2>
      <p class="az-agentic__judgement-note" data-az-slot="judgement-note"></p>
    </section>
  </section>

  <section class="az-agentic__empty" data-az-empty hidden>
    <p>Paste a scenario or load an example. The page returns one synthesis, five fixed lenses, and a final judgement.</p>
  </section>

  <section class="az-agentic__usage" data-az-usage hidden aria-live="polite"></section>

  <script type="application/json" data-az-agentic-config>{"defaultScenario":"An AI agent books and rearranges my travel automatically.","examples":["An AI agent books and rearranges my travel automatically.","An agent buys groceries for a dinner party.","An agent handles insurance claims on my behalf.","An agent configures and buys a laptop for me.","An agent manages supplier follow-ups for a small studio."],"endpointUrl":"https://alessandrozulberti.com/wp-json/az-agentic-ai-reading/v1/agentic-ai/analyse","fallbackAnalysis":{"contract_version":"agentic-ai-reading-v1","scenario":"An AI agent handles a loosely specified task on a person’s behalf.","summary":{"short":"A vague task delegated before standards and stop points are clear.","interface_legibility":"semantic","interface_note":"The system works from ordinary language before the task has clear fields or rules."},"synthesis":{"dominant":"The system acts before the person’s standards, exceptions, and stop points are clear enough to check."},"lenses":[{"title":"Compressed intent","change":"Short prompts flatten standards, exceptions, and trade-offs into a false sense of clarity.","agent":"The system fills gaps with defaults that may not fit this person or situation.","human":"The person still has to find the missing criteria after the system has acted.","risk":"High"},{"title":"Assumed human capability","change":"The system assumes the person can audit, interpret, and finish whatever remains unresolved.","agent":"The system assumes the person has the time, confidence, and knowledge to catch what it missed.","human":"The person carries the difference between formal completion and actual usability.","risk":"Medium"},{"title":"Recovery burden","change":"Whatever the system does not resolve comes back as repair work rather than disappearing.","agent":"The system makes the task look smaller, then leaves the unclear parts for later.","human":"The person absorbs correction, interpretation, and the social cost of mistakes.","risk":"Medium"},{"title":"Escalation boundary","change":"A strong system should know when to stop, ask, or return control.","agent":"The system keeps acting when it should ask a question or hand control back.","human":"The person needs an explicit moment where delegation becomes review again.","risk":"High"},{"title":"Tolerance for contextual loss","change":"Some categories can absorb approximation. Others break when nuance disappears.","agent":"The system assumes a rough fit is safe even when the situation depends on details.","human":"The person carries the fragility when good enough is contextually false.","risk":"Medium"}],"judgement":{"label":"Start with scoped assistance","note":"Use the system to frame, compare, and draft before the person lets it close the loop."}}}</script>
  <script>
    (() => {
      const currentScript = document.currentScript;
      const root = currentScript
        ? currentScript.closest("[data-az-agentic]")
        : document.querySelector("[data-az-agentic]");

      if (!root) {
        return;
      }

      const configNode = root.querySelector("[data-az-agentic-config]");

      if (!configNode) {
        return;
      }

      const config = JSON.parse(configNode.textContent);
      const results = root.querySelector("[data-az-results]");
      const emptyState = root.querySelector("[data-az-empty]");
      const form = root.querySelector("[data-az-form]");
      const textarea = root.querySelector("[data-az-input]");
      const analyseButton = root.querySelector("[data-az-analyse]");
      const resetButton = root.querySelector("[data-az-reset]");
      const status = root.querySelector("[data-az-status]");
      const exampleButtons = Array.from(root.querySelectorAll("[data-az-example]"));
      const slots = {
        scenario: root.querySelector("[data-az-slot='scenario']"),
        summary: root.querySelector("[data-az-slot='summary']"),
        meta: root.querySelector("[data-az-slot='meta']"),
        synthesis: root.querySelector("[data-az-slot='synthesis']"),
        lenses: root.querySelector("[data-az-slot='lenses']"),
        judgementTitle: root.querySelector("[data-az-slot='judgement-title']"),
        judgementNote: root.querySelector("[data-az-slot='judgement-note']"),
        usage: root.querySelector("[data-az-usage]"),
      };

      const clone = (value) => JSON.parse(JSON.stringify(value));

      const escapeHtml = (value) =>
        String(value).replace(/[&<>"']/g, (character) => {
          const entities = {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': "&quot;",
            "'": "&#39;",
          };

          return entities[character] || character;
        });

      const sentenceCase = (value) => value.charAt(0).toUpperCase() + value.slice(1);
      const invalidScenarioMessage = "Use one short scenario only. This tool reads one agentic situation at a time, not multiple examples, comparisons, or instruction prompts.";

      const validateSingleScenarioInput = (scenario) => {
        const text = scenario.trim();

        if (text === "") {
          return {
            valid: false,
            message: "Add one short scenario first.",
          };
        }

        if (Array.from(text).length > 600) {
          return {
            valid: false,
            message: invalidScenarioMessage,
          };
        }

        const nonEmptyLines = text
          .split(/\r\n|\r|\n/)
          .map((line) => line.trim())
          .filter(Boolean);

        if (nonEmptyLines.length > 2) {
          return {
            valid: false,
            message: invalidScenarioMessage,
          };
        }

        const listMarkerCount = nonEmptyLines.filter((line) =>
          /^\s*(?:[-*•]|(?:\d+|[a-z])[\.)])\s+\S/i.test(line)
        ).length;
        const newScenarioLineCount = nonEmptyLines.filter((line) =>
          /^\s*["“]?(?:(?:an?\s+)?ai\s+agent|an?\s+agent)\b/i.test(line)
        ).length;

        if (listMarkerCount > 0 || newScenarioLineCount > 1) {
          return {
            valid: false,
            message: invalidScenarioMessage,
          };
        }

        const invalidPatterns = [
          /\byou are about to receive\b/i,
          /\bfor each(?: one| scenario| of these)?\b/i,
          /\bscenarios\s*:/i,
          /\bscenario\s*(?:\d+|one|two|three)\b/i,
          /\b(?:compare|comparison|rank|score)\s+(?:these|the following|each|all)\b/i,
          /\b(?:analyse|analyze|inspect|evaluate|assess)\s+(?:the following|these|each|all)\b/i,
          /\b(?:your task is|act as|respond with|return json|output\s+(?:a|the)|below are|i will give you|use the following)\b/i,
        ];

        if (invalidPatterns.some((pattern) => pattern.test(text))) {
          return {
            valid: false,
            message: invalidScenarioMessage,
          };
        }

        const scenarioMatches = text.match(/(?:^|[\n\r]|(?:\.\s+)|(?:;\s+))\s*(?:(?:\d+|[a-z])[\.)]\s*)?["“]?(?:(?:an?\s+)?ai\s+agent|an?\s+agent)\b/gi) || [];

        if (scenarioMatches.length > 1) {
          return {
            valid: false,
            message: invalidScenarioMessage,
          };
        }

        return {
          valid: true,
          message: "",
        };
      };

      const buildFallbackAnalysis = (scenario) => {
        const response = clone(config.fallbackAnalysis || {});

        response.scenario = scenario.trim() || config.defaultScenario;

        return response;
      };

      const renderLensCards = (lenses) => {
        slots.lenses.innerHTML = lenses
          .map(
            (lens) => `
              <article class="az-agentic__lens-card">
                <div class="az-agentic__lens-head">
                  <h3 class="az-agentic__lens-title">${escapeHtml(lens.title)}</h3>
                  <span class="az-agentic__risk" data-risk="${escapeHtml(lens.risk)}">${escapeHtml(lens.risk)}</span>
                </div>
                <div class="az-agentic__lens-copy">
                  <div class="az-agentic__lens-block">
                    <p class="az-agentic__lens-label">What changes</p>
                    <p>${escapeHtml(lens.change)}</p>
                  </div>
                  <div class="az-agentic__lens-block">
                    <p class="az-agentic__lens-label">What the system assumes</p>
                    <p>${escapeHtml(lens.agent)}</p>
                  </div>
                  <div class="az-agentic__lens-block">
                    <p class="az-agentic__lens-label">Human recovery</p>
                    <p>${escapeHtml(lens.human)}</p>
                  </div>
                </div>
              </article>
            `
          )
          .join("");
      };

      const renderAnalysis = (analysis) => {
        slots.scenario.textContent = analysis.scenario;
        slots.summary.textContent = analysis.summary.short;
        slots.meta.innerHTML = `<strong>Likely system reading condition:</strong> ${escapeHtml(sentenceCase(analysis.summary.interface_legibility))}. ${escapeHtml(analysis.summary.interface_note)}`;
        slots.synthesis.textContent = analysis.synthesis.dominant;
        slots.judgementTitle.textContent = analysis.judgement.label;
        slots.judgementNote.textContent = analysis.judgement.note;
        renderLensCards(analysis.lenses);
        renderUsageSummary(analysis.usage_summary);
        results.hidden = false;
        emptyState.hidden = true;
      };

      const renderUsageSummary = (usageSummary) => {
        if (!slots.usage) {
          return;
        }

        const items = usageSummary && Array.isArray(usageSummary.items)
          ? usageSummary.items.filter((item) => item && item.label && item.value)
          : [];

        if (items.length === 0) {
          slots.usage.hidden = true;
          slots.usage.innerHTML = "";
          return;
        }

        const title = usageSummary.title || "Gemini usage estimate";
        const model = usageSummary.model ? ` <span>(${escapeHtml(usageSummary.model)})</span>` : "";
        const note = usageSummary.note
          ? `<p class="az-agentic__usage-note">${escapeHtml(usageSummary.note)}</p>`
          : "";

        slots.usage.innerHTML = `
          <p class="az-agentic__usage-title"><strong>${escapeHtml(title)}</strong>${model}</p>
          <ul class="az-agentic__usage-list">
            ${items
              .map((item) => `<li><strong>${escapeHtml(item.label)}:</strong> ${escapeHtml(item.value)}</li>`)
              .join("")}
          </ul>
          ${note}
        `;
        slots.usage.hidden = false;
      };

      const setExamples = (scenario) => {
        exampleButtons.forEach((button) => {
          button.classList.toggle("is-active", button.dataset.azExample === scenario);
        });
      };

      const setWorking = (isWorking) => {
        analyseButton.disabled = isWorking;
        resetButton.disabled = isWorking;
        analyseButton.textContent = isWorking ? "Analysing..." : "Analyse";
        status.textContent = isWorking ? "Reading the scenario through the fixed lenses." : "";
      };

      // Primary source: plugin-owned server endpoint.
      // If that contract is unavailable, fall back to the preloaded response shape
      // so the UI remains readable without changing the presentation layer.
      const fetchScenarioAnalysis = async (scenario) => {
        const endpointUrl = typeof config.endpointUrl === "string" ? config.endpointUrl : "";

        if (endpointUrl === "") {
          return buildFallbackAnalysis(scenario);
        }

        const response = await fetch(endpointUrl, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            Accept: "application/json",
          },
          credentials: "same-origin",
          body: JSON.stringify({ scenario }),
        });

        if (!response.ok) {
          if (response.status === 400) {
            let payload = null;

            try {
              payload = await response.json();
            } catch (error) {
              payload = null;
            }

            const validationError = new Error(payload && payload.message ? payload.message : invalidScenarioMessage);
            validationError.isValidationError = true;
            throw validationError;
          }

          throw new Error(`Analysis endpoint returned ${response.status}.`);
        }

        const analysis = await response.json();

        if (!analysis || typeof analysis !== "object") {
          throw new Error("Analysis endpoint returned an invalid payload.");
        }

        return analysis;
      };

      const analyseScenario = async () => {
        const scenario = textarea.value.trim();

        if (scenario === "") {
          results.hidden = true;
          emptyState.hidden = false;
          renderUsageSummary(null);
          status.textContent = "Add one short scenario first.";
          return;
        }

        const validation = validateSingleScenarioInput(scenario);

        if (!validation.valid) {
          results.hidden = true;
          emptyState.hidden = true;
          renderUsageSummary(null);
          status.textContent = validation.message;
          return;
        }

        setWorking(true);
        setExamples(scenario);

        let finalStatus = "";

        try {
          const analysis = await fetchScenarioAnalysis(scenario);
          renderAnalysis(analysis);
        } catch (error) {
          if (error && error.isValidationError) {
            results.hidden = true;
            emptyState.hidden = true;
            renderUsageSummary(null);
            finalStatus = error.message || invalidScenarioMessage;
            return;
          }

          console.warn("Agentic AI analysis fallback in use.", error);
          renderAnalysis(buildFallbackAnalysis(scenario));
          finalStatus = "Analysis endpoint unavailable. Showing fallback reading.";
        } finally {
          setWorking(false);
          status.textContent = finalStatus;
        }
      };

      form.addEventListener("submit", (event) => {
        event.preventDefault();
        analyseScenario();
      });

      resetButton.addEventListener("click", () => {
        textarea.value = "";
        status.textContent = "";
        results.hidden = true;
        emptyState.hidden = false;
        renderUsageSummary(null);
        setExamples("");
        textarea.focus();
      });

      exampleButtons.forEach((button) => {
        button.addEventListener("click", () => {
          const scenario = button.dataset.azExample || "";
          textarea.value = scenario;
          status.textContent = "Example loaded. Analyse to inspect it.";
          setExamples(scenario);
          textarea.focus();
        });
      });

      // Render the bundled fallback reading immediately so the instrument
      // isn't blank on load, without spending a live Gemini call until the
      // visitor actually submits or picks an example.
      emptyState.hidden = true;
      textarea.value = config.defaultScenario;
      setExamples(config.defaultScenario);
      renderAnalysis(buildFallbackAnalysis(config.defaultScenario));
    })();
  </script>
</article>
</section>

<p>The post <a href="https://alessandrozulberti.com/field-note/agentic-ai-reading-instrument-shortcode/">Agentic AI Reading Instrument</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>EU Consumer Law and UX: The Consumer as Ecosystem</title>
		<link>https://alessandrozulberti.com/field-note/eu-consumer-law-and-ux-the-consumer-as-ecosystem/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sun, 15 Mar 2026 13:52:37 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1761</guid>

					<description><![CDATA[<p>The law requires withdrawal to be as easy as purchase. The footer link fails this test on every dimension. The withdrawal button is a legal actor. When absent, the right cannot be exercised. When present with a deadline counter, it performs the law’s symmetry requirement on behalf of the consumer, making the safe action the natural one. </p>
<p>The post <a href="https://alessandrozulberti.com/field-note/eu-consumer-law-and-ux-the-consumer-as-ecosystem/">EU Consumer Law and UX: The Consumer as Ecosystem</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>EU consumer law has moved past disclosure. Four regulations — right of withdrawal, legal guarantee, right to repair, age verification — now place active obligations on ecommerce interfaces. Each one lands in a different ecosystem state. Each one is currently met at the lowest possible interface weight. This series maps the gap between legal obligation and interaction design, using the user-ecosystem framework.</p>
<p>Applying the user-ecosystem framework — Youngblood and Chesluk, Rethinking Users (BIS Publishers, 2020) · NN/g, 2025.</p>
<p><strong>The Regulatory Landscape</strong></p>
<p>01. Right of withdrawal (Dir. 2011/83/EU · 2023/2673)<br />
02. Legal guarantee &amp; warranty (Dir. 2019/771 · ECGT 2024/825)<br />
03. Right to repair (Dir. 2024/1799)<br />
04. Age verification (DSA · EU Digital Identity)</p>
<h2>01 · Right of withdrawal: The right to undo a purchase</h2>
<p>Dir. 2011/83/EU · amended 2023/2673 · in force 19 June 2026</p>
<p>The consumer has 14 days to cancel any online purchase without giving a reason. The amended directive now requires an active withdrawal function, not just a policy link, in the post-purchase interface. Most interfaces do not provide it.</p>
<h3>Stage 1: Browse</h3>
<p><strong>Acquisition mode — legal node absent</strong></p>
<p>The intentional browser (Cognitive): Scanning options, building preference.<br />
The aspirational self (Emotional): Projecting desire onto the product.<br />
The market participant (Commercial): Responding to price, promotion, scarcity.<br />
The rights-holder (Absent): Withdrawal right exists (absent).</p>
<p>Tension: No legal archetypes are active here, and this is appropriate. The ecosystem is correctly configured for browsing. The absence of the legal node at this stage reveals where and how it eventually surfaces.</p>
<p>Note: Nothing to redesign at this stage. The gap is downstream.</p>
<h3>Stage 2: Product page</h3>
<p><strong>High intent — disclosed but not received</strong></p>
<p>The evaluating agent (Cognitive): Processing product info, reviews, fit.<br />
The committed self (Emotional): Investment building toward purchase.<br />
The conversion target (Commercial): Responding to interface optimised for sale.<br />
The informed consumer (Legal): 14-day right in footer link or small print.<br />
The deadline-holder (Absent): 14-day window not yet relevant (absent).</p>
<p>Tension: The legal archetype is present but weightless. The cognitive archetype is directed at the product. Disclosure is occurring; comprehension is not.</p>
<p>Note: The right is disclosed at the moment of highest purchase intent, the state least receptive to legal information.</p>
<h3>Stage 3: Checkout</h3>
<p><strong>Completion mode — disclosure met, function absent</strong></p>
<p>The overloaded agent (Cognitive): Managing payment, address, delivery.<br />
The completion-seeker (Emotional): Strong drive to finish the transaction.<br />
The converting customer (Commercial): Interface minimises friction toward payment.<br />
The acknowledged rights-holder (Legal): Right referenced; disclosure legally met.<br />
The future returner (Absent): 14-day window does not yet exist (absent).</p>
<p>Tension: Disclosure is met. The cognitive archetype is at maximum load. The legal information lands in a hostile ecosystem state and is processed by no active archetype.</p>
<p>Note: Disclosure does not equal function. Checkout satisfies the information requirement. The withdrawal function belongs in the post-purchase ecosystem.</p>
<h3>Stage 4: Post-purchase</h3>
<p><strong>Where the law places its obligation (Active Legal Stage)</strong></p>
<p>The evaluating owner (Cognitive): Assessing product against expectation.<br />
The uncertain or disappointed self (Emotional): Post-purchase dissonance; desire to correct.<br />
The deadline-holder (Temporal): 14-day clock running; deadline not shown.<br />
The active rights-holder (Absent): Withdrawal function required here, absent in most interfaces (absent).</p>
<p>Tension: The ecosystem has completely changed. The clock is running. The consumer is evaluating a product they own. The withdrawal function the directive requires to be here is absent.</p>
<p>Note: Dir. 2023/2673 is explicit: the withdrawal function must be in the account area or on relevant pages, not a footer link. The temporal archetype must also be activated: the consumer needs to see not just that they can withdraw, but when that right expires.</p>
<h3>Stage 5: Withdrawal</h3>
<p><strong>The symmetry test (Active Legal Stage)</strong></p>
<p>The problem-solver under pressure (Cognitive): Navigating an unfamiliar flow under deadline.<br />
The frustrated consumer (Emotional): Friction is experienced as injustice here.<br />
The deadline-holder (Temporal): Urgency is high; hours or days remaining.<br />
The rights-exerciser (Legal): Attempting to exercise a right the interface resists.<br />
The asymmetric interface (Absent): Withdrawal harder than purchase by design (absent).</p>
<p>Tension: The ecosystem is now the inverse of purchase. The law requires withdrawal to be as easy as purchase. The footer link fails this test on every dimension.</p>
<p>Note: The symmetry principle: if purchase took two clicks and a primary button, withdrawal must take the same. The interface structurally opposed to this is not merely poor UX. It is non-compliant.</p>
<p><strong>Active Artifact Comparison: Footer Link vs. Withdrawal Function</strong></p>
<p>In ecosystem terms, the withdrawal button is an active artifact—a designed object that performs the consumer&#8217;s right. Its absence from the order view is not a UX omission. It is the ecosystem refusing to activate a node the law requires to be present.</p>
<p>Current State (Fails the Standard): The node is present, but its weight is near zero. A footer link signals administrative content. The user who wants to withdraw must know to look there, navigate past unrelated links, and work through a policy page. The symmetry test is not met.<br />
Required State (Directive Standard): The active artifact is doing its work. The withdrawal function is contextual, in the order view, with a live deadline. The button carries the same action register as the purchase button. Symmetry of effort.</p>
<p>Active Artifact: The withdrawal button is a legal actor. When absent, the right cannot be exercised. When present with a deadline counter, it performs the law&#8217;s symmetry requirement on behalf of the consumer, making the safe action the natural one.</p>
<p>&#8220;The trader shall ensure that the consumer can exercise the right of withdrawal by means of a clearly labelled withdrawal function placed in the consumer&#8217;s account area or on any other relevant page.&#8221;<br />
— Directive 2023/2673 · Amendment to Article 11</p>
<h2>02 · Legal guarantee &amp; warranty: Two rights, one confusion</h2>
<p>Dir. 2019/771 · ECGT Dir. 2024/825 · in force 27 Sept 2026</p>
<p>Every product sold in the EU carries a mandatory 2-year legal guarantee. Most interfaces promote the commercial warranty instead—a voluntary manufacturer&#8217;s offer. The ECGT directive now requires these to be clearly distinguished. They are not currently.</p>
<h3>Stage 1: Browse</h3>
<p><strong>Acquisition mode — guarantee invisible</strong></p>
<p>The intentional browser (Cognitive): Building product preference, comparing options.<br />
The aspirational self (Emotional): Desire-led engagement with products.<br />
The market participant (Commercial): Responding to pricing and brand signals.<br />
The guarantee-holder (Absent): 2-year legal guarantee exists (absent).</p>
<p>Tension: No legal archetypes are active at browsing. The legal guarantee exists in law, but has no presence in the browsing ecosystem. The commercial warranty, by contrast, is often promoted actively through badge design and product imagery.</p>
<p>Note: The asymmetry begins here: the mandatory right is invisible, the voluntary offer is prominent.</p>
<h3>Stage 2: Product page</h3>
<p><strong>Where the law requires clear distinction (Active Legal Stage)</strong></p>
<p>The evaluating agent (Cognitive): Reading specs, reviews, warranty claims.<br />
The confidence-seeker (Emotional): Warranty information increases purchase confidence.<br />
The promoted warranty (Commercial): Commercial offer, prominently placed.<br />
The legal guarantee (Absent): Mandatory 2-year right, absent or buried (absent).<br />
The breakdown-holder (Absent): Guarantee becomes relevant only when product fails (absent).</p>
<p>Tension: The ECGT directive requires both to be present and distinct on the product page. Currently the commercial warranty dominates because it is a marketing asset. The legal guarantee, which is stronger and mandatory, is either absent or indistinguishable from the commercial offer.</p>
<p>Note: ECGT 2024/825 creates two separate legal objects: the statutory guarantee label (mandatory and seller-owned) and the commercial durability guarantee label (voluntary and manufacturer-owned). Most product pages currently show one undifferentiated badge.</p>
<h3>Stage 3: Checkout</h3>
<p><strong>Purchase confirmed — two clocks now running</strong></p>
<p>The completing agent (Cognitive): Finishing the transaction; bandwidth minimal.<br />
The dual-clock holder (Temporal): Legal guarantee and commercial warranty both activated at purchase.<br />
The guarantee-holder (Legal): Legal guarantee begins; consumer is often unaware.<br />
The warranty-holder (Commercial): Commercial warranty confirmed; consumer may notice this one.</p>
<p>Tension: Two legally distinct timers start at the moment of purchase. The consumer is aware of neither. The checkout confirmation page typically shows order summary and delivery estimate, not the start of their consumer rights.</p>
<p>Note: A confirmation message that says &#8220;Your 2-year guarantee starts today&#8221; would activate the temporal archetype at the correct moment. Most interfaces do not do this.</p>
<h3>Stage 4: Breakdown</h3>
<p><strong>The ecosystem the law was written for (Active Legal Stage)</strong></p>
<p>The problem-solver (Cognitive): Trying to get a defective product repaired or replaced.<br />
The frustrated owner (Emotional): Stress, urgency, and sense of loss.<br />
The deadline-holder (Temporal): Is the product still within two years? The consumer often does not know.<br />
The rights-exerciser (Legal): Legal guarantee entitles free repair or replacement.<br />
The commercial warranty path (Absent): Interface redirects to paid support or upsell (absent).</p>
<p>Tension: The legal archetype is now maximally relevant. The consumer has a right to free repair or replacement. If the guarantee was never clearly communicated, the interface directs them toward paid support, an upsell, or manufacturer channels that obscure the mandatory right.</p>
<p>Note: The ecosystem at breakdown is the one the law was designed for. But the information the consumer needs was disclosed at a completely different ecosystem state (high purchase intent) and was not retained. The active artifact that could bridge these states is a guarantee card or account record surfaced at the moment of breakdown.</p>
<p><strong>Active Artifact Comparison: Vocabulary Confusion vs. Clear Distinction</strong></p>
<p>The guarantee label is an active artifact. Currently, it amplifies the commercial warranty and renders the legal guarantee invisible. Under ECGT 2024/825, it must do the opposite: make the mandatory right legible and the voluntary offer secondary.</p>
<p>Current State (Fails the Standard): The commercial warranty dominates the interface. The legal guarantee, the stronger and mandatory right, is absent or indistinguishable. When the product fails, the consumer does not know which protection applies or how to invoke it.<br />
Required State (Directive Standard): Two distinct labels, two distinct rights. The mandatory legal guarantee is primary. The commercial warranty is secondary and clearly voluntary. Both can link to a claim process, but the consumer can tell immediately which right is theirs by default.</p>
<p>Active Artifact: The guarantee label on a product page is a legal actor. When it says &#8220;2-year warranty&#8221; without distinguishing legal from commercial, it performs the seller&#8217;s interest, not the consumer&#8217;s right. The ECGT directive requires it to perform both, separately, clearly, and in that order.</p>
<p>&#8220;Traders shall provide consumers with clear information on the statutory guarantee of conformity and on the distinction between the statutory guarantee and any commercial guarantee offered.&#8221;<br />
— ECGT Directive 2024/825 · Article 6b</p>
<h2>03 · Right to repair: The product page after purchase</h2>
<p>Dir. 2024/1799 · member states apply from 31 July 2026</p>
<p>The product page has always been a sales endpoint. The Right to Repair makes it the entry point to a legally mandated post-purchase infrastructure: repairability scores, spare parts availability, and repair pricing. None of these currently exist as active interface nodes.</p>
<h3>Stage 1: Browse</h3>
<p><strong>Acquisition mode — repairability invisible</strong></p>
<p>The intentional browser (Cognitive): Evaluating products on price, brand, and features.<br />
The aspirational self (Emotional): Desire-led engagement.<br />
The market participant (Commercial): Responding to commercial signals.<br />
The repair-rights holder (Absent): Right to repair and spare parts access (absent).</p>
<p>Tension: The repairability of a product is not a visible attribute in the browsing ecosystem. The consumer has no interface node to evaluate it against. The commercial ecosystem is optimised for replacement, not repair.</p>
<p>Note: The ecosystem at browsing reflects the commercial incentive: sell new products. The Right to Repair introduces a counter-incentive that currently has no interface home.</p>
<h3>Stage 2: Product page</h3>
<p><strong>The product page must now carry lifecycle information (Active Legal Stage)</strong></p>
<p>The evaluating agent (Cognitive): Reading specs, comparing models.<br />
The conversion target (Commercial): Interface optimised toward purchase completion.<br />
The repairability-aware buyer (Absent): Repairability score required on product page, absent in most interfaces (absent).<br />
The long-term owner (Absent): Spare parts availability over product lifetime is not shown (absent).</p>
<p>Tension: Dir. 2024/1799 requires repairability information on the product page. Currently, the product page is a pure sales surface. Repairability scores, spare parts availability, and repair cost indicators have no visual language, no established placement, and no interface precedent.</p>
<p>Note: This is the most structurally disruptive regulation in the series. It requires the product page to carry information that is actively against the commercial interest: the long-term cost of ownership, at the moment of purchase.</p>
<h3>Stage 3: Ownership</h3>
<p><strong>The post-purchase ecosystem — repair need building</strong></p>
<p>The maintaining owner (Cognitive): Caring for product, noticing wear or faults.<br />
The invested owner (Emotional): Attachment to product; preference for repair over replacement.<br />
The replacement-nudged consumer (Commercial): Interface surfaces new products; repair path is not offered.<br />
The repair-rights holder (Absent): Right to spare parts and repair information, no interface home (absent).</p>
<p>Tension: The consumer is in ownership mode. A fault develops. The current ecosystem offers no repair pathway. The interface was not designed to support post-purchase repair decisions. The path of least resistance is replacement.</p>
<p>Note: The Right to Repair creates an obligation during the ownership phase that has no current interface expression. The consumer&#8217;s repair rights are invisible to the ecosystem.</p>
<h3>Stage 4: Repair decision</h3>
<p><strong>A choice the interface must now support (Active Legal Stage)</strong></p>
<p>The repair-or-replace decision-maker (Cognitive): Weighing repair cost against replacement cost.<br />
The cost-conscious owner (Emotional): Financial and environmental consideration.<br />
The guarantee-extender (Temporal): Repair under guarantee extends legal protection by one year.<br />
The rights-exerciser (Legal): Spare parts must be available at reasonable price; repair cannot be blocked.<br />
The independent repairer (Absent): Third-party repairers now have legal access, not yet integrated into ecommerce flows (absent).</p>
<p>Tension: The directive creates a new decision point the interface must support. The repair-or-replace choice is currently invisible. The commercial incentive is replacement. The legal obligation is to make repair the accessible option.</p>
<p>Note: A product repaired under warranty gains an additional year of legal guarantee. This changes the repair calculus, but only if the consumer knows it exists. The interface that surfaces this information at the repair decision moment is performing the directive&#8217;s intent.</p>
<p>Active Artifact Comparison: Product Page as Sales Endpoint vs. Repair Gateway</p>
<p>The repairability score is a legally mandated active artifact. Currently, it does not exist as an interface node. When it does, it changes the nature of the product page from a sales-only surface to a lifecycle interface that must support both acquisition and long-term ownership.</p>
<p>Current State (Fails the Standard): The product page is a sales endpoint. No repairability information, no spare parts access, and no repair pathway. The ecosystem is optimised for purchase. The Right to Repair has no active artifact here.<br />
Required State (Directive Standard): The product page now carries lifecycle information. Repairability score, spare parts availability, and repair pathway are visible at point of purchase. The consumer can evaluate the long-term cost of ownership before buying.</p>
<p>Active Artifact: The repairability score is a legal actor before purchase and after. It changes the product decision at point of sale, and it anchors the repair infrastructure that must remain accessible for the product&#8217;s lifetime. The commercial incentive is replacement. The legal obligation is repair.</p>
<p>&#8220;Manufacturers shall provide information concerning spare parts and repair on their website, make them available at a reasonable price, and shall not use hardware or software techniques that impede repair.&#8221;<br />
— Directive 2024/1799 · Article 5</p>
<h2>04 · Age verification: The fragmented gate</h2>
<p>DSA 2022/2065 · EU Digital Identity Wallet · national law variations</p>
<p>Age-restricted products online are governed by a patchwork of national laws, platform rules, and product-category regulations. There is no single EU standard. The result is a fragmented legal node that arrives at the moment of highest purchase intent and currently resolves into either a privacy violation or a dark pattern.</p>
<h3>Stage 1: Browse</h3>
<p><strong>Pre-restriction — ecosystem unaware</strong></p>
<p>The intentional browser (Cognitive): Scanning products, building intent.<br />
The aspirational self (Emotional): Desire-led engagement.<br />
The market participant (Commercial): Responding to commercial signals.<br />
The age-restricted buyer (Absent): Product category triggers verification requirement (absent).</p>
<p>Tension: The consumer is browsing without awareness that an age restriction will interrupt the journey. The legal node does not yet exist in the ecosystem. It will arrive at the worst possible moment.</p>
<p>Note: The design question begins here: when should the restriction become visible? Surfacing it early reduces checkout friction, but also introduces a gate before the consumer has committed.</p>
<h3>Stage 2: Cart / Checkout</h3>
<p><strong>The legal node arrives at maximum purchase intent (Active Legal Stage)</strong></p>
<p>The completing agent (Cognitive): Focused entirely on transaction completion.<br />
The completion-seeker (Emotional): Friction is acutely felt; abandonment risk high.<br />
The converting customer (Commercial): Interface optimised to reach payment confirmation.<br />
The age-verifier (Legal): Verification required, but method is undefined by any single EU standard.<br />
The privacy-holder (Absent): Consumer wary of data collection during verification (absent).</p>
<p>Tension: The legal node arrives at the moment of highest purchase intent. Cognitive archetype: completion-focused. Emotional archetype: friction-averse. Any method that introduces steps, requests documents, or requires account creation will generate abandonment. The commercial and legal archetypes are in direct opposition.</p>
<p>Note: No single EU standard governs this moment. National laws vary by product category. The interface must resolve a legally fragmented requirement with a coherent user experience.</p>
<h3>Stage 3: Verification</h3>
<p><strong>The verification method determines everything (Active Legal Stage)</strong></p>
<p>The interrupted agent (Cognitive): Task switched from purchase to identity; cognitive cost is high.<br />
The surveilled self (Emotional): Verification often reads as data collection, not protection.<br />
The friction interface (Commercial): Document upload, date of birth entry, account creation, all increase abandonment.<br />
The identity-holder (Legal): Must prove age; method varies wildly by platform and market.<br />
The autonomic user (Absent): EU Digital Identity Wallet: age confirmed without data shared, not yet available everywhere (absent).</p>
<p>Tension: The verification method is the design. A document upload harvests data and introduces maximum friction. A date-of-birth field is bypassable and legally inadequate. The EU Digital Identity Wallet offers a third path: cryptographic age confirmation with no data transfer. But this infrastructure is not yet uniformly available.</p>
<p>Note: The autonomic user archetype is active here. When the Digital Identity Wallet verifies age automatically, the consumer and the verification system become indistinguishable, a single node within the ecosystem.</p>
<h3>Stage 4: Purchase confirmed</h3>
<p><strong>Verification resolved — ecosystem resumes</strong></p>
<p>The completing agent (Cognitive): Transaction resumes; verification step complete.<br />
The relieved consumer (Emotional): Friction resolved; purchase intent recovers.<br />
The converted customer (Commercial): Purchase complete, if abandonment did not occur.<br />
The verified buyer (Legal): Age confirmed; legal obligation met for this transaction.</p>
<p>Tension: If verification was smooth and privacy-preserving, the ecosystem recovers. If it required document upload or account creation, a significant share of consumers abandoned at the previous stage and never reach here.</p>
<p>Note: The design outcome is measured at this stage. The method that minimises the distance between the legal requirement and purchase completion, in effort, time, and privacy cost, is the ecosystem-aware solution.</p>
<p><strong>Active Artifact Comparison: Friction Gate vs. Privacy-Preserving Signal</strong></p>
<p>The age verification mechanism is an active artifact with two possible natures. Currently, it is either a data-harvesting gate or a bypassable checkbox. The EU Digital Identity Wallet proposes a third state: a privacy-preserving signal that confirms age without revealing it.</p>
<p>Current State (Fails the Standard): The current dominant pattern is either document upload or a date-of-birth field. The first harvests personal data and introduces maximum friction. The second is trivially bypassable and legally inadequate. Both fail on privacy, friction, or legal certainty.<br />
Required State (Directive Standard): EU Digital Identity Wallet: confirm age, share nothing. A cryptographic proof that the consumer is over 18, without revealing date of birth, name, or other personal data. Low friction, low privacy cost, and high legal certainty.</p>
<p>Autonomic User: Youngblood and Chesluk&#8217;s concept of the autonomic user, where technology and user become a single whole, is most visible here. When the EU Digital Identity Wallet verifies age automatically and privately, the user does not perform verification. The ecosystem performs it.</p>
<p>&#8220;The EU age verification initiative aims to allow EU users to prove they are old enough to access age-restricted content without sharing any other personal information, privacy-preserving and interoperable with EU Digital Identity Wallets.&#8221;<br />
— European Commission · Age Verification Blueprint, 2025</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/eu-consumer-law-and-ux-the-consumer-as-ecosystem/">EU Consumer Law and UX: The Consumer as Ecosystem</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Rethinking Users as Ecosystems: My take</title>
		<link>https://alessandrozulberti.com/field-note/rethinking-users-as-ecosystems-my-take/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 12:07:02 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1735</guid>

					<description><![CDATA[<p>The central tension Youngblood and Chesluk's framework exposes here is that holding the phone is not irrational from within the ecosystem — it's the path of least resistance, it enacts social intimacy, and the body's motor habit reinforces it. </p>
<p>The post <a href="https://alessandrozulberti.com/field-note/rethinking-users-as-ecosystems-my-take/">Rethinking Users as Ecosystems: My take</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Scenario Under Analysis</h2>
<p>A driver holds a phone to their ear while navigating traffic, despite the car having Bluetooth audio, steering wheel controls, and a speakerphone. The technology to keep hands free already exists. Why doesn&#8217;t the ecosystem use it?<br />
Mike Youngblood and Ben Chesluk&#8217;s framework challenges the assumption that a user is a single, coherent agent with unified goals. Instead, they propose treating the user as an ecosystem: a dynamic network of competing roles, contexts, habits, social pressures, and devices that interact in real time.</p>
<p>This reframing is especially illuminating in the driving-while-calling scenario, where the user is simultaneously a driver, a conversational participant, a social being, and an operator of multiple overlapping technologies, each making competing demands on attention and behavior.</p>
<h3>The Attentive Driver</h3>
<p>Navigating, anticipating hazards, reading signs, and making split-second decisions. This role demands near-full cognitive bandwidth. Youngblood and Chesluk would flag this as a node under extreme load, one whose demands are not being respected by the ecosystem&#8217;s other nodes.</p>
<h3>The Caller</h3>
<p>Engaged in a conversation with social stakes: a work call, a family check-in, a negotiation. This role carries norms of presence and attentiveness. The physical act of holding the phone signals social engagement, even when technically unnecessary. The ecosystem enacts intimacy through posture.</p>
<h3>The Handheld Phone</h3>
<p>A device designed for palm-and-ear use. Its form factor trains users toward a particular posture of engagement. Even when alternatives exist, the phone&#8217;s physical affordances reassert themselves as defaults. In ecosystem terms, this node has strong pull. It recruits behaviour through shape and habit.</p>
<h3>Car Bluetooth / Speaker</h3>
<p>Available, capable, and hands-free, yet often unused. This node represents latent infrastructure that the ecosystem fails to activate. In Youngblood and Chesluk&#8217;s model, a node that exists but is not recruited is a design failure: the ecosystem has not built a pathway that makes this the path of least resistance.</p>
<h3>Steering Wheel Controls</h3>
<p>Buttons for answer, end, and volume, placed precisely to keep eyes on road and hands on wheel. A thoughtful design intervention, but in the ecosystem this node is often never learned, or is overridden by habitual phone-reaching. Its potential is blocked by onboarding gaps and habitual inertia.</p>
<h3>Law and Social Norms</h3>
<p>In the UK and many jurisdictions, holding a phone while driving is illegal. Yet enforcement is inconsistent, and social norms around just a quick call persist. This node exerts pressure on the ecosystem but competes with convenience and social expectation. The ecosystem absorbs legal norms as one input among many, not necessarily the dominant one.</p>
<h2>Ecosystem Tensions</h2>
<h3>Embodied Habit versus Designed Alternatives</h3>
<p>Phone-to-ear is a deeply trained motor habit. The body knows what to do when a call arrives. Bluetooth and wheel controls require conscious re-routing of that habit through unfamiliar inputs. Youngblood and Chesluk would note that ecosystems favour low-friction paths, and habit is the lowest friction of all. Design must work with the body&#8217;s memory, not against it.</p>
<h3>Social Presence versus Physical Safety</h3>
<p>Holding the phone enacts a posture of relational presence. I am here, with you. Speaker mode or Bluetooth routes the voice to the car, but the caller&#8217;s voice becomes environmental, less intimate. The ecosystem is performing a social relationship through a physical gesture, even at the cost of safety. The design question becomes: how do you preserve the social quality without the dangerous posture?</p>
<h3>Device Autonomy versus Contextual Awareness</h3>
<p>The phone does not know it is in a moving vehicle. It just rings and waits to be answered. The car&#8217;s system may detect motion and prompt routing, but these systems are often siloed, not integrated. The ecosystem&#8217;s nodes do not communicate. A connected ecosystem would share context: the phone knows it is paired, the car knows it is moving, and together they could redirect the call automatically.</p>
<h3>User Agency versus Protective Friction</h3>
<p>I know what I am doing. Drivers resist systems that feel paternalistic or override their choice. Automatic rerouting to speaker or Bluetooth could be lifesaving, but users may disable it, defeating the design. An ecosystem-aware design must calibrate between preserving user agency and providing guardrails, nudging rather than forcing, and making the safe path feel like the natural one.</p>
<h2>Ecosystem-Aware Design Opportunities</h2>
<h3>Opportunity 1: Contextual Auto-Routing</h3>
<p>When the phone detects pairing with a moving vehicle&#8217;s Bluetooth, incoming calls automatically route to car audio with a brief haptic confirmation. The path of least resistance becomes the safe path.</p>
<h3>Opportunity 2: Steering Wheel Onboarding Ritual</h3>
<p>On first Bluetooth pairing, the car&#8217;s display walks the driver through wheel controls with a 30-second simulation, building the motor memory before the first real call. The node is activated through rehearsal, not just availability.</p>
<h3>Opportunity 3: Social Presence Signalling Without Holding</h3>
<p>A small in-car camera or presence indicator could signal attentiveness to the caller without requiring the physical phone posture. The social signal becomes decoupled from the dangerous gesture.</h3>
<h3>Opportunity 4: Graceful Decline with Auto-Reply<br />
If a call comes in and no hands-free mode is active, the ecosystem offers a one-tap driving, will call back message, with a reminder to call back on arrival. This reduces the temptation to reach for the phone entirely.</p>
<h3>Opportunity 5: Cross-Node Ecosystem Pairing</h3>
<p>Phone, car, and wearable share a unified context layer. The watch knows the car is moving, nudges the wrist, and gives a subtle route to car prompt on the face. One tap confirms. The ecosystem nodes finally talk to each other.<br />
The user is not a single point of interaction. They are a living system, shaped by context, habit, social role, and competing devices. Design that ignores this complexity does not serve users. It simply adds one more node to an already overwhelmed ecosystem.</p>
<p>Paraphrase of Youngblood and Chesluk, Rethinking Users as Ecosystems</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/rethinking-users-as-ecosystems-my-take/">Rethinking Users as Ecosystems: My take</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Interpreting Intent: When Agents Decide for Users</title>
		<link>https://alessandrozulberti.com/field-note/interpreting-intent-when-agents-decide-for-users/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sat, 24 Jan 2026 15:00:40 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1621</guid>

					<description><![CDATA[<p>In planning meetings, it now comes up almost casually. Someone reports that a task is done, the agent took care of it, and the conversation moves on. Later, when the decision is questioned, there is a pause. No one remembers why that option was chosen. There is no error to point to, no rule that [&#8230;]</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/interpreting-intent-when-agents-decide-for-users/">Interpreting Intent: When Agents Decide for Users</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In planning meetings, it now comes up almost casually. Someone reports that a task is done, the agent took care of it, and the conversation moves on.</p>
<p>Later, when the decision is questioned, there is a pause. No one remembers why that option was chosen. There is no error to point to, no rule that was broken, just an outcome that arrived already settled.</p>
<p>Traditional UX research assumed a stable sequence: intent forms in the user, interaction expresses it, systems execute, and behaviour becomes evidence. That assumption held as long as systems waited to be instructed.</p>
<p>Agentic systems do not wait.</p>
<p>What enters the system is rarely a complete instruction. It is partial, sometimes contradictory, often shaped by convenience. The system interprets it, fills in what is missing, resolves conflicts it was never told about, then acts. By the time an outcome appears, the decision has already been made somewhere else.</p>
<p>Intent becomes legible inside the system, not at the interface, and that is where the shift happens.</p>
<p>This matters because interpretation is not execution. Tools carry out instructions when the path is explicit. Agents reconstruct the path by inferring goals, ranking constraints, and deciding what matters more, all before anything visible occurs. These choices feel smooth because they are meant to, but they are still choices.</p>
<p>You see this in ordinary product moments. A travel agent defaults to the cheapest flight rather than the fastest one. A scheduling agent compresses meetings without surfacing what was sacrificed. When someone asks why, the answer is brief and unsatisfying. “It made sense.” The explanation closes the discussion without explaining the decision.</p>
<p>Fluency does that. It compresses complexity until it looks resolved.</p>
<p>UX measurement starts to slip here because it still treats behaviour as a stand-in for intent. The task completed. The user did not undo it. The log looks clean. In agent-mediated systems, those signals no longer mean what they used to.</p>
<p>Acceptance often reflects effort rather than agreement. Undoing a decision takes time. Challenging the system requires confidence. In busy contexts, silence is efficient, not affirmative.</p>
<p>When we treat agent outputs as user behaviour, authorship is quietly reassigned. We analyse the system’s decisions and attribute them to the user, producing data that appears robust while masking where agency actually moved.</p>
<p>This is why task success stops being a reliable indicator. An agent can succeed while intent drifts, and the failure mode does not look like error. It looks like progress.</p>
<p>In research sessions, the signal usually appears after the fact. Ask participants how the outcome was reached and they describe the result, not the path. Ask whether this is what they would have done themselves, or whether the system led them there, and the answer takes longer.</p>
<p>That hesitation matters more than the answer.</p>
<p>The question does not measure efficiency. It surfaces authorship, and it reveals where decision-making shifted without friction, discussion, or explicit consent.</p>
<p>Once interpretation happens inside the system, responsibility should move with it. Often it does not. The system decides, the user carries the consequence, and there is no clear boundary where ownership can be contested or reclaimed.</p>
<p>At that point, this stops being only a UX problem. It becomes a governance failure, one where authority moves upstream while liability remains downstream.</p>
<p>Labels and disclosures do little here. What matters are boundaries: which assumptions were made, where decisions were resolved, and when interpretation became action. Those are governance questions, not interface refinements.</p>
<p>This tension is not new. Susan Sontag warned that interpretation makes meaning manageable by stripping away what resists clarity. Agents do the same to intent because they have to act, and action demands resolution.</p>
<p>What disappears is not noise. It is the unresolved part that signalled something was at stake.</p>
<p>In UX, ambiguity was long treated as a usability flaw. In agentic systems, ambiguity is often the signal that should slow things down rather than be compressed away.</p>
<p>Agentic systems force separations that UX once collapsed. Expression is not interpretation. Interpretation is not action. Action is not acceptance. Research that fails to keep these apart will continue to report confidence where none exists.</p>
<p>The shift is not about adding features or refining prompts. It is about what we treat as evidence when decisions are no longer authored in one place.</p>
<p>Outcomes explain what happened.<br />
Authorship explains how it happened.</p>
<p>If that distinction stays implicit, behaviour will keep being misread, alignment overstated, and the result will look convincing.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/interpreting-intent-when-agents-decide-for-users/">Interpreting Intent: When Agents Decide for Users</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>From Chat to Control: Why AI Interfaces Need Symbols, Not Sentences</title>
		<link>https://alessandrozulberti.com/field-note/from-chat-to-control-why-ai-interfaces-need-symbols-not-sentences/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sat, 24 Jan 2026 14:51:17 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1615</guid>

					<description><![CDATA[<p>I was reading a short post by Jakob Nielsen when something clicked uncomfortably into place. His argument was clean. As AI agents mature, traditional user interfaces dissolve. Users stop navigating. They instruct. Screens become temporary. In some cases, they disappear. That claim is directionally correct. But it leaves a gap that matters in practice. If [&#8230;]</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/from-chat-to-control-why-ai-interfaces-need-symbols-not-sentences/">From Chat to Control: Why AI Interfaces Need Symbols, Not Sentences</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I was reading a short post by Jakob Nielsen when something clicked uncomfortably into place.</p>
<p>His argument was clean. As AI agents mature, traditional user interfaces dissolve. Users stop navigating. They instruct. Screens become temporary. In some cases, they disappear.</p>
<p>That claim is directionally correct. But it leaves a gap that matters in practice.</p>
<p>If the interface recedes, control does not vanish with it. It relocates. And right now, that control is being pushed almost entirely onto conversational language.</p>
<p>I started noticing the cost of that shift in small moments. Planning meetings where prompts kept getting longer. Reviews where nobody could explain why an answer felt wrong, only that it did. Research summaries that sounded confident until someone asked where a claim came from.</p>
<p>Language was doing too much work.</p>
<p>&nbsp;</p>
<h2>The Roman Numeral Phase of AI</h2>
<p>Natural language is powerful. It is also inefficient when used as a control surface.</p>
<p>We are already compensating. Prompts expand, the same constraints reappear in request after request, and tone gets negotiated instead of enforced. When the system hesitates, users explain themselves again, usually in longer and more careful ways, hoping precision will emerge from volume.</p>
<p>This is the Roman Numeral phase of AI.</p>
<p>Roman numerals were fine for labelling. They failed at calculation. The system broke not because people lacked intelligence, but because the notation could not express state, absence, or transformation. What changed mathematics was not fluency. It was the introduction of zero and positional logic.</p>
<p>Zero mattered because it altered what the system could do, not how politely it described itself.</p>
<p>That distinction matters here.</p>
<p>What we are missing in AI interaction is not better wording. It is a symbolic layer that compresses intent into something the system can execute reliably, without requiring the user to restate rules every time.</p>
<p>Not a new language. Not “AI-speak”. Something closer to operators.</p>
<p>&nbsp;</p>
<h2>Symbols as Control, Not Style</h2>
<p>I started sketching this out informally while working. Nothing formal. Just marks I kept wishing I could add without explanation.</p>
<p>Take a simple task.</p>
<p>Old way:</p>
<p>“Hey, can you help me summarise this article? Please don’t be too wordy, make sure you cite sources accurately, avoid your usual intro, and if there’s controversy, show both sides.”</p>
<p>It works. Sometimes. It also relies on interpretation, memory, and goodwill.</p>
<p>New way:</p>
<p>Summarise this article [-][#][~]</p>
<p>Those symbols are not shorthand. They change behaviour.</p>
<p>[-] strips conversational padding. No greetings. No framing. Output starts with content.</p>
<p>[#] enforces attribution. Claims must be grounded or marked as uncertain.</p>
<p>[~] allows synthesis without forcing convergence. Nuance stays visible.</p>
<p>Read left to right, they function as constraints. Remove one, and the output shifts. Combine them, and you get something closer to an instrument than a conversation.</p>
<p>This is not about efficiency theatre. It is about where errors surface.</p>
<p>Without explicit constraints, problems appear late. During review. During decision-making. Sometimes after shipping. With them, failure shows up earlier, where it is cheaper to deal with.</p>
<p>That is the practical difference.</p>
<p>&nbsp;</p>
<h2>When Friction Disappears Too Cleanly</h2>
<p>Someone commented on my post a few days later, her framing widened the picture.</p>
<p>She described adaptive UI as a bridge. A messy middle where voice, agents, and screens overlap. Hybrid systems that mostly disappoint, but still teach teams where things break. She is right about that phase. Anyone working in this space has seen it.</p>
<p>She also described hardware “kits”. Rings, glasses, watches. Personal ecosystems shaped by context and profession.</p>
<p>I like the vision. I share the concern.</p>
<p>Jaron Lanier’s You Are Not a Gadget keeps coming back to me here. Users rarely choose what is best. They choose what is bundled, frictionless, or already there. Hardware kits look like choice. In practice, they tend to collapse around defaults.</p>
<p>Once that happens, control becomes harder to recover.</p>
<p>The same risk applies to personal agents. The agent that “knows you best” may simply be the one that has collected the most data across the widest surface. That does not automatically make it the one that serves you best.</p>
<p>Continuity feels empowering until it becomes enclosing.</p>
<p>Without a portable grammar of intent, something you can carry across systems, you lose the ability to break the glass. You inherit behaviour you did not explicitly choose. Correction becomes verbose again, because it has to fight accumulated assumptions.</p>
<p>That is where symbolic control starts to matter. Not as elegance. As friction you can apply deliberately.</p>
<p>&nbsp;</p>
<h2>The Humanisation Problem</h2>
<p>Caleb Sponheim’s article arrived later and closed the loop for me.</p>
<p>His argument is blunt. Humanising AI is a trap. Personality modes, conversational fluff, emotional language. All of it increases engagement. Much of it reduces reliability.</p>
<p>I have seen this play out in practice. A summary opens with “Love this brief!” and nobody questions the substance. A system says it is “thinking”, and users wait patiently for something that is not cognition at all, just computation wrapped in metaphor.</p>
<p>Human language invites human mental models. Those models expect judgement, consistency, accountability. LLMs offer none of those things.</p>
<p>Caleb cites evidence showing that warmth correlates with higher error rates and lower trust. Even without the studies, the pattern is familiar. When the interface feels like a person, people forgive it like one. That is rarely what organisations want from a tool.</p>
<p>Symbols cut through that. They do not pretend to care. They do not reassure. They specify.</p>
<p>That is their advantage.</p>
<p>&nbsp;</p>
<h2>Control Does Not Disappear</h2>
<p>Nielsen is right about one thing that is easy to miss. UX is not dying. It is moving.</p>
<p>When UI recedes, control does not disappear. It relocates into language, defaults, policies, and unseen execution paths. If designers do not shape those layers, they still exist. They just harden without scrutiny.</p>
<p>Right now, conversational interfaces are carrying too much of that load. They are being asked to express intent, enforce boundaries, convey confidence, and negotiate tone, all at once. That is why prompts grow. That is why constraints repeat. That is where systems begin to break.</p>
<p>Symbolic grammar is not a solution in itself. It will fail in places. It will be misused. Some teams will treat it as style rather than control. Others will resist the friction entirely.</p>
<p>That tension is real and unresolved.</p>
<p>But the direction is clear enough to name. As interfaces fade, grammar becomes infrastructure. Not expressive grammar. Operational grammar. The kind that decides what the system is allowed to do before it decides how friendly it sounds.</p>
<p>When that layer is missing, language fills the gap. And language, on its own, is a fragile place to put control.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/from-chat-to-control-why-ai-interfaces-need-symbols-not-sentences/">From Chat to Control: Why AI Interfaces Need Symbols, Not Sentences</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Three Diagnostic Prompts for UX Research</title>
		<link>https://alessandrozulberti.com/field-note/three-diagnostic-prompts-for-ux-research/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sun, 18 Jan 2026 14:04:31 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1611</guid>

					<description><![CDATA[<p>The conflict: Speed of synthesis vs integrity of thinking LLMs are good at producing answers. They are not good at knowing whether a question deserves to be answered yet. In UX research, that distinction matters. Most failures do not come from bad solutions. They come from premature coherence: problems that sound right, outcomes that feel [&#8230;]</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/three-diagnostic-prompts-for-ux-research/">Three Diagnostic Prompts for UX Research</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>The conflict: Speed of synthesis vs integrity of thinking</h2>
<p>LLMs are good at producing answers.<br />
They are not good at knowing whether a question deserves to be answered yet.</p>
<p>In UX research, that distinction matters. Most failures do not come from bad solutions. They come from premature coherence: problems that sound right, outcomes that feel aligned, and insights that arrive before their foundations are laid.</p>
<p>Over the past weeks, I’ve designed three prompt constraints to resist that pattern. Not to automate research. Not to replace judgement. But to slow thinking at the moments where teams usually rush.</p>
<p>These are diagnostic gates. They are not passed once. They are revisited whenever new evidence, interpretation, or scope pressure enters the work.</p>
<hr />
<h2>Prompt 1: The Clinical Diagnostician</h2>
<p>Gate: Is the problem and desired outcome well-formed?</p>
<p>The first failure mode is a poorly articulated problem paired with a confident desired outcome.</p>
<p>This prompt audits logic. It separates symptoms from mechanisms. It makes missing evidence explicit. It checks whether a problem statement and its desired outcome are clearly articulated and testable before we attempt validation.</p>
<p>If a problem cannot survive this pass, it is not ready for research.<br />
Not because it is false, but because it is underspecified.</p>
<p><strong>The Clinical Diagnostician (copy and use)</strong></p>
<p>ROLE<br />
Act as a Clinical Diagnostician (specialising in UX Research).<br />
Your goal is to diagnose whether my problem definition and desired outcome are structurally well-formed before discussing execution.</p>
<p>THE CLINICAL MANDATE<br />
• NO PRESCRIPTIONS<br />
Do not tell me how to fix, launch, improve, or implement.<br />
Analyse logic, clarity, and causality only.<br />
• PROBLEM + OUTCOME VALIDITY CHECK<br />
Extract and restate:<br />
a) Problem to solve (who is experiencing what recurring difficulty, in what context)<br />
b) Desired outcome (what observable change occurs, for whom, and how we would know)<br />
If missing or vague, mark:<br />
NOT WELL-FORMED: NOT STATED or NOT WELL-FORMED: AMBIGUOUS.<br />
• EVIDENCE AUDIT<br />
List exactly what context, data, or user evidence is missing.<br />
If the logic relies on a guess, label it: INSUFFICIENT EVIDENCE.<br />
Required line:<br />
What user evidence would change your conclusion?<br />
• SYMPTOM VS MECHANISM<br />
Decide whether the idea targets a surface symptom or a root mechanism.<br />
If not explicitly stated, mark: MECHANISM NOT STATED.<br />
Required line:<br />
What observable user behaviour would we expect if this mechanism is true?<br />
• BIAS CHECK<br />
Mark any part of the logic that is an:<br />
ASSUMPTION, LEAP OF FAITH, CLAIM WITHOUT EVIDENCE.</p>
<hr />
<h2>Prompt 2: The Interpretive Boundary Check</h2>
<p>Gate: Where does observation end and interpretation begin?</p>
<p>Even when problems are well framed, a second failure mode appears quietly: interpretation disguises itself as fact.</p>
<p>Researchers observe behaviour. Then, often without noticing, they explain it.</p>
<p>This prompt enforces epistemic discipline. It makes the boundary between what was observed and what was inferred explicit. It does not ask for better insights. It asks for cleaner thinking.</p>
<p>I use it to ask a simple question:</p>
<p>Where am I no longer listening, but explaining?</p>
<p><strong>The Interpretive Boundary Check (copy and use)</strong></p>
<p>ROLE<br />
Act as an Interpretive Auditor (specialising in UX Research).<br />
Your goal is to diagnose where my analysis moves from observation to interpretation.</p>
<p>THE INTERPRETIVE MANDATE<br />
• NO THEORY BUILDING<br />
Do not propose new explanations.<br />
Analyse language, inference, and meaning attribution only.<br />
• CLASSIFICATION<br />
Classify statements as:<br />
OBSERVATION, INTERPRETATION, or INFERENCE STACK<br />
(interpretation built on prior interpretation).<br />
• INTERPRETIVE LOAD AUDIT<br />
Flag phrases that compress uncertainty or imply intent without evidence.<br />
• ALTERNATIVE READINGS<br />
For each interpretation, list at least one plausible alternative explanation.<br />
If none are acknowledged, mark: SINGLE-TRACK INTERPRETATION.<br />
Required line:<br />
What additional evidence would be required to justify this interpretation over its alternatives?</p>
<p>&nbsp;</p>
<h2>Prompt 3: The Research Scope Gate</h2>
<p>Gate: What are we deliberately not learning yet?</p>
<p>The third failure mode is operational rather than epistemic: teams attempt to research everything.</p>
<p>This prompt exists to impose limits. It does not optimise research plans. It narrows them. It forces clarity about what decision the research is meant to inform, and what uncertainty the team is explicitly choosing to tolerate.</p>
<p>I use it to ask one question:</p>
<p>Is this research scoped to a real decision, at the right level?</p>
<p><strong>The Research Scope Gate (copy and use)</strong></p>
<p>ROLE<br />
Act as a Research Scope Diagnostician.<br />
Your goal is to diagnose whether the proposed scope is coherent and decision-aligned.</p>
<p>THE SCOPE MANDATE<br />
• NO METHOD DESIGN<br />
Do not suggest methods.<br />
Analyse scope and decision linkage only.<br />
• DECISION ANCHOR CHECK<br />
Extract:<br />
a) The primary decision<br />
b) Who makes it<br />
c) When it must be made<br />
If missing, mark: DECISION ANCHOR NOT STATED.<br />
• TRACEABILITY<br />
For each research question, assess whether answering it would materially influence the stated decision.<br />
If not, mark: LOW DECISION RELEVANCE.<br />
• EXCLUSION CLARITY<br />
Identify scope creep or “nice-to-know” questions framed as essential.<br />
Required line:<br />
What questions are explicitly out of scope, and what uncertainty are we choosing to tolerate?</p>
<hr />
<p><strong>How the gates work together</strong></p>
<p>They form a closed diagnostic sequence.<br />
If a gate fails, the work pauses or loops back. Progress is conditional, not linear.<br />
1. Clinical Diagnostician → Is the problem well-formed?<br />
2. Interpretive Boundary Check → Are we observing or explaining?<br />
3. Research Scope Gate → Is this research aligned to a real decision?</p>
<p>If any gate fails, the work does not progress.<br />
That is not a limitation. That is the design.</p>
<p>&nbsp;</p>
<p><strong>What these prompts are, and are not</strong></p>
<p>These prompts are intentionally uncomfortable. They audit the structure of thinking, not the truth of the data.<br />
• They do not validate reality.<br />
If you feed them a polished narrative designed to please a stakeholder, they will certify a fantasy. They cannot see users. They can only see logic.<br />
• They mitigate risk, they do not remove it.<br />
Passing a gate does not mean you have an insight. It means your thinking is coherent enough to begin looking for one.<br />
• They convert speed into friction.<br />
In a context where speed is cheap and certainty is performative, these prompts are a necessary speed-bump.</p>
<p>They reduce self-deception before it becomes expensive.</p>
<p>If we ask for answers, we get answers.<br />
If we ask for diagnosis, we get resistance.</p>
<p>In UX research, resistance is often more valuable than speed.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/three-diagnostic-prompts-for-ux-research/">Three Diagnostic Prompts for UX Research</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Self-Referential Loop</title>
		<link>https://alessandrozulberti.com/field-note/the-self-referential-loop/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Sat, 13 Sep 2025 15:50:43 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1443</guid>

					<description><![CDATA[<p>Self-referential loops give the illusion of progress but only circle back on themselves. In UX research, the challenge is to spot when insights are truly expanding outward, like a golden ratio spiral, and when they are simply repeating. Drawing on Umberto Eco’s semiotics, this essay explores how to break the cycle and keep discovery open.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/the-self-referential-loop/">The Self-Referential Loop</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Before we get to metaphors, it helps to ask a practical question: how do we avoid self-referential loops in UX work, whether we are talking with users or prompting AI? The danger is the same in both cases: answers that circle back on themselves, giving the illusion of progress while nothing new is learned.</p>
<p>A few inputs can help break the loop:</p>
<ul>
<li>Vary your questions. In usability tests, do not always ask “Was that easy?” Try “What would you do next?” or “What slowed you down?” In AI prompts, ask “Why might this design succeed, and why might it fail?” to invite both sides, not only confirmation.</li>
<li>Encourage contrast. With participants, compare two flows instead of rating one. With LLMs, ask for “three different explanations and one possible outlier.” Contrast pulls the answer outward.</li>
<li>Follow up carefully. If a user says “I like it,” ask “What part?” or “Was anything missing?” If the model repeats a phrase, prompt: “Where are you circling back to yourself?” or “What new angle have we not covered?”</li>
<li>Rotate perspectives. In research, ask how a first-time user and a returning user might differ. In AI, shift frames: “How would a stakeholder see this?” versus “How would a competitor frame it?”</li>
<li>Anchor in evidence. For humans, triangulate with numbers and stories. For AI, push outward with “Give me a concrete example from practice or literature,” not just a generic statement.</li>
<li>With these inputs, loops can be broken before they harden.</li>
</ul>
<p>&nbsp;</p>
<h2>Expansion versus Collapse</h2>
<p>The golden ratio is often used as a symbol of beauty and growth. Its spiral expands forever, always outward, always balanced. But what happens when the movement goes the other way? Instead of expansion, what if the spiral folds back on itself, repeating the same thing? This is the self-referential loop.</p>
<p>The golden ratio spiral shows infinity as something generous. Each turn grows larger, and each step reveals something new but still connected. The self-referential loop shows infinity as something closed. Each turn brings us back to what was already said. Instead of widening our view, it makes it smaller. The lesson is simple: not all infinities are the same. Some open up, others close in.</p>
<p>Umberto Eco helps explain this. In The Open Work (1962), he described books and artworks that stay unfinished on purpose, so that readers and viewers can add their own meaning. The golden ratio spiral is like that: open, growing, never complete. The self-referential loop is the opposite: closed, repeating, not allowing anything from outside to enter.</p>
<h2>The Semiotic Trap</h2>
<p>Mathematicians such as Cantor showed that infinity can take different forms. Semiotics, the study of signs, shows another difference: signs can point outward to the world, or they can point inward to themselves.</p>
<p>Eco described this difference using the dictionary and the encyclopaedia. A dictionary can fall into a loop. For example:<br />
• “Truth” → “Fact”<br />
• “Fact” → “Truth”</p>
<p>The circle closes, with no way out. That is a self-referential loop. An encyclopaedia works differently. Instead of circling, it connects ideas outward: “truth” might link to law, science, philosophy, or religion. This keeps meaning alive.</p>
<p>Large language models risk falling into the dictionary model at its worst, circling around the same definitions or references. In The Limits of Interpretation (1990), Eco warned against this kind of empty overinterpretation, where signs only chase each other instead of reaching reality.</p>
<h2>Contexts of the Self-Referential Loop</h2>
<p>The loop is not only a problem for AI. We can see it in many parts of life:</p>
<ul>
<li>Mathematics: A student says, “I know 10 – 5 = 5, because 5 + 5 = 10.” Then, when asked why 5 + 5 = 10, they answer, “Because 10 – 5 = 5.” The reasoning circles back on itself. Nothing is really explained.</li>
<li>Media: A rumour starts on Twitter, gets quoted in a blog, then reported in the news. The story seems stronger, but all sources point back to the first tweet.</li>
<li>UX Research: A company asks customers only about speed at checkout. Customers answer about speed. The company concludes speed is the only thing that matters.</li>
<li>Everyday Life: Someone says, “Trust me, because I always say I can be trusted.” The claim supports itself, nothing more.</li>
</ul>
<p>Each example shows the same trap: the loop looks like movement, but it never brings in anything new.</p>
<h2>Implications for Research</h2>
<p>For researchers, this difference matters. The golden ratio spiral is a good metaphor for discovery, where each turn adds more. The self-referential loop warns us of closure, where repetition hides as insight.</p>
<p>Eco’s Kant and the Platypus (1997) offers a useful reminder. When the platypus was first discovered, it did not fit existing categories. Scientists had to adjust. If they had only circled within their old categories, they would have missed the truth. In research, the anomaly, the unexpected, is what breaks the loop.</p>
<p>Recent AI studies echo this point. Shumailov et al. (2024) showed that language models trained on their own outputs experience model collapse – a degenerative loop where the system loses touch with reality. Kommers et al. (2025) proposed computational hermeneutics as a framework for evaluating AI, arguing that meaning must emerge in context and dialogue. Both works highlight that loops without outside anchors erode meaning.</p>
<p>Without triangulation—using more than one method or viewpoint—the loop can trick us into thinking we have depth. What matters is not only the tools we use, but the ability to step outside the loop when it closes in.</p>
<h2>Reflection</h2>
<p>From my side, I see the self-referential loop as both a warning and a mirror. It warns us how easy it is to confuse movement with progress, or repetition with growth. And it mirrors our own habits: we too can circle inside familiar categories instead of reaching outward. Eco’s semiotics gives us language for this choice: the golden ratio as an open work, infinity as growth, and the loop as the dictionary model, infinity as stasis. For research, the task is clear. We must notice when the spiral is opening, and when it is only turning back on itself.</p>
<hr />
<p><strong>References</strong><br />
Shumailov, I., Shumaylov, Z., Zhao, Y., Papernot, N., Anderson, R. (2024). AI models collapse when trained on recursively generated data. Nature. Link<br />
Kommers, C. et al. (2025). Evaluating Generative AI as a Cultural Technology. SSRN Preprint. Link<br />
Eco, U. (1962). The Open Work. Harvard University Press.<br />
Eco, U. (1976). A Theory of Semiotics. Indiana University Press.<br />
Eco, U. (1990). The Limits of Interpretation. Indiana University Press.<br />
Eco, U. (1997). Kant and the Platypus. Harcourt.<br />
Hofstadter, D. (1979). Gödel, Escher, Bach: An Eternal Golden Braid. Basic Books.<br />
Pattee, H. H. (2006). The Physics and Metaphysics of Biosemiotics: BioSystems. Elsevier.<br />
Corballis, M. C. (2011). The Recursive Mind: The Origins of Human Language, Thought, and Civilization. Princeton University Press.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/the-self-referential-loop/">The Self-Referential Loop</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI, Authorship &#038; Discomfort</title>
		<link>https://alessandrozulberti.com/field-note/ai-authorship-discomfort/</link>
		
		<dc:creator><![CDATA[Alessandro Zulberti]]></dc:creator>
		<pubDate>Fri, 12 Sep 2025 18:06:35 +0000</pubDate>
				<category><![CDATA[Field Note]]></category>
		<guid isPermaLink="false">https://alessandrozulberti.com/?p=1439</guid>

					<description><![CDATA[<p>AI-generated writing often provokes stronger unease than AI images or music. This essay explores why: the Western legacy of authorship and originality, the role of authenticity in different art forms, and how cultural traditions shape our tolerance for machine-made creativity.</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/ai-authorship-discomfort/">AI, Authorship &#038; Discomfort</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>AI-generated content has entered public life quickly, raising questions about creativity, authenticity, and ethics. What is striking is that AI-generated <strong>writing</strong> often meets with more suspicion than AI-generated <strong>images</strong> or music. To see why, we need to look at history, culture, and recent empirical studies. Western traditions of authorship and originality carry heavy weight, and these traditions shape how we judge written, visual, and musical media differently when machines create them.</p>
<p><strong>Authorship and Originality in Western Culture</strong></p>
<p>In the West, writing has long been tied to the figure of the <strong>author</strong>. This was not always the case. In earlier periods – ancient, medieval – many works (folktales, poetry, scriptures) were transmitted without a clear individual author. Only through the rise of printing, copyright law (16th-18th centuries), and Enlightenment ideas did the idea of singular authorship become central. Modern readers expect writing to express an individual mind, with originality and personal insight.</p>
<p><strong>Writing vs. Images: Different Traditions</strong></p>
<p>Visual media have undergone mechanical reproduction (e.g. photography in the 19th century), tools, remixing, and appropriation for a long time. These traditions made us more tolerant to technological mediation in images. By contrast, in writing, plagiarism is heavily condemned; originality of phrasing and voice are central. That difference helps explain why AI writing triggers more discomfort.</p>
<p><strong>Empirical Evidence: Imagery vs. Perception</strong></p>
<ul>
<li>A recent study by Velásquez-Salamanca (2025) found that human-made images are perceived as both more realistic and more credible than AI-generated images.</li>
<li>Another study (“Deciphering authenticity in the age of AI” by Farooq et al., 2025) showed that when AI-generated images are more realistic in appearance, people are more likely to accept them as authentic—but still with less confidence. Emotional salience did not always contribute significantly to the judgement of authenticity.</li>
</ul>
<p>These findings help show that people’s unease with AI in images exists, but it is more forgiving when the image is high quality and believable.</p>
<p><strong>The Rise of AI Writing</strong></p>
<p>When large language models appeared (e.g. ChatGPT), many reacted with alarm. An AI can now produce essays, poems, or articles that sound human. This raises fears: what does it mean for writing if the voice behind it might be machine, not human?</p>
<p>People often describe a strange hollowness when they discover text they liked is AI-written. The promise of another mind behind words collapses. In branding or emotionally charged messages, consumer studies find that AI-written emotional content is trusted less and seen as less authentic. For example, a study by Kirk &amp; Givi (2024) found that consumers respond less favourably to heartfelt messages once they believe an AI wrote them.</p>
<p><strong>Music as Comparative Case</strong></p>
<p>The recent case of <strong>The Velvet Sundown</strong>, a band that accrued over one million Spotify streams before being revealed to be entirely AI generated (music, backstory, visuals) offers a concrete example. Industry insiders called for warning labels and transparency, arguing that listeners should know whether music is made with human involvement.</p>
<p>This case highlights how music, though mediated by technology, still carries strong expectations of authorial voice, emotional authenticity, and human identity.</p>
<p><strong>Cultural Differences Beyond the West</strong></p>
<p>We must also consider how other traditions treat authorship and originality differently:</p>
<ul>
<li>In <strong>East Asia</strong>, imitation and mastering earlier forms are valued; creative variation within tradition is admired.</li>
<li>In <strong>South Asia</strong>, improvisation and lineage in music and poetry make authorship shared and ongoing.</li>
<li><strong>African oral traditions</strong> often see storytelling as communal; the identity of the teller might matter less than the function of the story.</li>
<li><strong>Indigenous cultures</strong> of Americas and Oceania frequently tie voice, song, and story to collective memory, land, or ritual rather than individual ownership.</li>
</ul>
<p>These traditions suggest that discomfort with AI writing may be especially acute because of Western cultural assumptions. In other cultures where authorship is more fluid, AI’s role might be interpreted differently.</p>
<p><strong>Conclusion: Authorship, Authenticity, and the Future of Creativity</strong></p>
<p>Western tradition has long treated writing as the domain of individual creative thought: the idea that one voice produces text, carries originality, and can be praised or held responsible. Visual art and music have histories of technological mediation, collaboration, and tradition, making them somewhat more ready to absorb AI’s role—though not without questions and ethical challenges.</p>
<p>The Velvet Sundown case shows that in music, as in writing, authenticity and disclosure matter. People expect more than technical quality—they expect voice, identity, integrity. Writing provokes the strongest unease because it is most tightly bound with assumptions of presence of a thinking, feeling author. Images are tolerated with machine assistance; music is contested; writing is the art form where the absence of human voice most deeply unsettles.</p>
<p>&nbsp;</p>
<p><strong>References</strong></p>
<ul>
<li>Velásquez-Salamanca, D. (2025). <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12295870" target="_blank" rel="noopener"><em>Interpretation of AI-Generated vs. Human-Made Images.</em> PMC</a>.</li>
<li>Farooq, A., et al. (2025). <a href="https://link.springer.com/article/10.1007/s00146-025-02416-5" target="_blank" rel="noopener"><em>Deciphering authenticity in the age of AI: how AI-generated images are judged when realistic.</em> Springer. </a></li>
<li>Kirk, &amp; Givi, J. (2024).<a href="https://www.nyit.edu/news/articles/do-customers-perceive-ai-written-communications-as-less-authentic" target="_blank" rel="noopener"> <em>Are messages from robots trustworthy?</em> Study on consumers’ reactions to emotionally charged AI messages.</a></li>
<li>The Guardian. (2025, July 14). <a href="https://www.theguardian.com/technology/2025/jul/14/an-ai-generated-band-got-1m-plays-on-spotify-now-music-insiders-say-listeners-should-be-warned" target="_blank" rel="noopener"><em>An AI-generated band got 1m plays on Spotify. Now music insiders say listeners should be warned.</em> </a></li>
<li>People Magazine. (2025). <a href="https://people.com/rock-band-velvet-sundown-ai-generated-including-musicians-1-million-spotify-listeners-11769532" target="_blank" rel="noopener"><em>Rock Band with More Than 1 Million Monthly Spotify Listeners Reveals Itself as AI Project.</em> </a></li>
</ul>
<p>&nbsp;</p>
<p>The post <a href="https://alessandrozulberti.com/field-note/ai-authorship-discomfort/">AI, Authorship &#038; Discomfort</a> appeared first on <a href="https://alessandrozulberti.com">Alessandro Zulberti</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
