<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luca Morricone</title>
    <description>The latest articles on DEV Community by Luca Morricone (@luca_morricone).</description>
    <link>https://dev.to/luca_morricone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4016821%2F90b3a3e2-db79-4102-9feb-ad869d233937.jpg</url>
      <title>DEV Community: Luca Morricone</title>
      <link>https://dev.to/luca_morricone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luca_morricone"/>
    <language>en</language>
    <item>
      <title>Beyond "No Fluff": Semantic Stratification in Coding Agents</title>
      <dc:creator>Luca Morricone</dc:creator>
      <pubDate>Wed, 21 Oct 2026 02:23:43 +0000</pubDate>
      <link>https://dev.to/luca_morricone/beyond-no-fluff-semantic-stratification-in-coding-agents-2l7</link>
      <guid>https://dev.to/luca_morricone/beyond-no-fluff-semantic-stratification-in-coding-agents-2l7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Two prompts, four conditions, eight sessions: what changes when a communication rule meets a Fibonacci function?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;If you ask an AI assistant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who was Dante Alighieri?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get a biography. Add a small instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;no-fluff Who was Dante Alighieri?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my test, the response became shorter. So far, nothing particularly surprising.&lt;/p&gt;

&lt;p&gt;Now replace the prompt with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;no-fluff Develop a fibonacci function&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Should the agent write a shorter explanation, a shorter function, or a solution with fewer features? Should it still create files and run tests?&lt;/p&gt;

&lt;p&gt;In my &lt;a href="https://dev.to/luca_morricone/sycophancy-free-coding-how-to-make-ai-agents-say-no-3l43"&gt;previous article on sycophancy&lt;/a&gt;, I explored how certain behavioral instructions could prompt coding agents to challenge my requests rather than immediately agreeing with them. This time, I wanted to explore another boundary: &lt;strong&gt;can an instruction, which at first glance seems to concern communication between user and assistant, also influence the code and even how an agent performs its work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I compared two prompts across four conditions. A total of eight sessions within a single small exploratory experiment, driven solely by my curiosity to understand: not a benchmark, nor a controlled measurement of the behavior of all models.&lt;/p&gt;

&lt;p&gt;The differences did not stop at the word count in the answers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Beyond "No Fluff": Semantic Stratification in Coding Agents

&lt;ul&gt;
&lt;li&gt;Table of Contents&lt;/li&gt;
&lt;li&gt;1. The Experiment: Two Prompts, Four Conditions&lt;/li&gt;
&lt;li&gt;2. Dante: Less Text, but Also a Different Selection of Information&lt;/li&gt;
&lt;li&gt;What Remains and What Disappears&lt;/li&gt;
&lt;li&gt;3. Fibonacci: What the Agent Delivers Changes as Well&lt;/li&gt;
&lt;li&gt;4. The Function: It's Not Just About Stripping Comments&lt;/li&gt;
&lt;li&gt;5. My Interpretation: Semantic Stratification in LLMs&lt;/li&gt;
&lt;li&gt;Let's Discuss&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. The Experiment: Two Prompts, Four Conditions
&lt;/h2&gt;

&lt;p&gt;I started from the same two prompts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Who was Dante Alighieri?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Develop a fibonacci function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For each, I compared four conditions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Default:&lt;/strong&gt; No additional instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-fluff:&lt;/strong&gt; The literal prefix &lt;code&gt;no-fluff&lt;/code&gt;, just two words and a hyphen, no skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caveman:&lt;/strong&gt; Explicit invocation of the &lt;code&gt;caveman&lt;/code&gt; skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-fluff:&lt;/strong&gt; Explicit invocation of a minimal communication skill.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the two skill conditions, the coding prompts were:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skill:caveman Develop a fibonacci function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skill:zero-fluff Develop a fibonacci function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sessions were run in Pi. The model used was &lt;code&gt;gemini-3.8-flash-tiered&lt;/code&gt;. The session exports can all be viewed on &lt;a href="https://github.com/morriconeluca/skills/tree/main/docs/skills/zero-fluff-pi-sessions" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is an important distinction right away: &lt;strong&gt;a skill command is not merely an extra word in the prompt&lt;/strong&gt;. The agent's environment expands it into a set of instructions. The &lt;code&gt;caveman&lt;/code&gt; skill contains a longer specification that opens like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Respond terse like smart caveman. All technical substance stay. Only fluff die.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essentially: respond in a telegraphic manner, like a smart caveman; keep all technical substance, eliminate only the fluff.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;zero-fluff&lt;/code&gt; skill, on the other hand, was defined as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zero-fluff&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maintain dry and synthesis-oriented communication.&lt;/span&gt;
&lt;span class="na"&gt;disable-model-invocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# The Rule&lt;/span&gt;

Never use words that do not serve mutual understanding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last sentence also appeared in the skill from my previous article. Here it stands alone: "Never use words that do not serve mutual understanding."&lt;/p&gt;

&lt;p&gt;It does not say "write the shortest possible response." It does not mention algorithms, input validation, files, or tests. It articulates a criterion: keep what is needed for mutual understanding.&lt;/p&gt;

&lt;p&gt;I wanted to see how this criterion would tangibly affect the agent's work.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Dante: Less Text, but Also a Different Selection of Information
&lt;/h2&gt;

&lt;p&gt;The first comparison seemed fairly straightforward:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Characters in final response, including Markdown and spaces&lt;/th&gt;
&lt;th&gt;Form of the response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;2167&lt;/td&gt;
&lt;td&gt;An extensive profile, with sections, bullet points, and context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No-fluff&lt;/td&gt;
&lt;td&gt;872&lt;/td&gt;
&lt;td&gt;An introduction and four concise points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caveman&lt;/td&gt;
&lt;td&gt;384&lt;/td&gt;
&lt;td&gt;Three short paragraphs, without headings or lists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero-fluff&lt;/td&gt;
&lt;td&gt;927&lt;/td&gt;
&lt;td&gt;An introduction and four structured points, in standard prose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What Remains and What Disappears
&lt;/h3&gt;

&lt;p&gt;All four responses introduced Dante as an Italian poet from Florence, stated the years 1265–1321, cited the &lt;em&gt;Commedia&lt;/em&gt; and its three canticles, described the use of the Tuscan vernacular instead of Latin, and recalled the exile of 1302 and his death in Ravenna. All four also mentioned the &lt;em&gt;Vita Nuova&lt;/em&gt; — written as &lt;em&gt;Vita Nova&lt;/em&gt; in the caveman response — and &lt;em&gt;De Vulgari Eloquentia&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A brief aside:&lt;/strong&gt; &lt;em&gt;Vita Nuova&lt;/em&gt; is the title in its traditional and most common form in Italian publishing and scholastic history; &lt;em&gt;Vita Nova&lt;/em&gt; is the original Latin form, found in the earliest manuscripts and revived by major critical editions.&lt;/p&gt;

&lt;p&gt;The differences become clearer when comparing the content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;default&lt;/strong&gt; response cited Dante's guides along his journey in the &lt;em&gt;Divine Comedy&lt;/em&gt;; it included the &lt;em&gt;Convivio&lt;/em&gt;, the Three Crowns (Tre Corone), and a broader account of Dante's political life.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-fluff&lt;/strong&gt; maintained four main areas: the &lt;em&gt;Commedia&lt;/em&gt;, Dante's linguistic impact, other works, and politics. It removed most peripheral details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caveman&lt;/strong&gt; compressed the most. It did not even repeat Dante's name at the beginning, relying on the context of the question. It preserved the biographical core, but cited fewer works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-fluff&lt;/strong&gt; remained close to the structured &lt;strong&gt;no-fluff&lt;/strong&gt; response. It was slightly longer, with more explicit details on Dante's political affiliation and on &lt;em&gt;De Monarchia&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Across the four conditions, what changed was not merely the quantity of words used, but above all the selection of information.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the &lt;strong&gt;caveman&lt;/strong&gt; version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Italian poet (1265–1321) from Florence. Best known for _Divine Comedy_ (_Inferno_, _Purgatorio_, _Paradiso_).

Established Tuscan vernacular as literary standard instead of Latin. Called father of modern Italian.

Exiled from Florence in 1302 during political conflict between Black and White Guelphs. Died in Ravenna. Major works also include _Vita Nova_ and _De Vulgari Eloquentia_.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is the &lt;strong&gt;zero-fluff&lt;/strong&gt; response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Dante Alighieri**&lt;/span&gt; (c. 1265–1321) was an Italian poet, philosopher, and political thinker from Florence, best known as the author of the _Divine Comedy_ (_Divina Commedia_).

&lt;span class="gu"&gt;### Key Aspects&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Major Work:**&lt;/span&gt; The _Divine Comedy_, an epic poem describing the soul's journey through Hell (_Inferno_), Purgatory (_Purgatorio_), and Paradise (_Paradiso_).
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Linguistic Impact:**&lt;/span&gt; Often called the "Father of the Italian Language" for writing in the Tuscan vernacular rather than Latin, establishing standard literary Italian.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Other Works:**&lt;/span&gt; _Vita Nuova_ (love poetry dedicated to Beatrice), _De Monarchia_ (political treatise on universal empire), and _De Vulgari Eloquentia_ (treatise on vernacular eloquence).
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Political Life:**&lt;/span&gt; A White Guelph in Florentine politics; exiled permanently in 1302 following a rival faction's coup, spending his remaining life in various northern Italian cities until his death in Ravenna.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Dante, &lt;strong&gt;caveman&lt;/strong&gt; compressed the most, while &lt;strong&gt;zero-fluff&lt;/strong&gt; seemed to select a structured summary, not the absolute minimum text possible.&lt;/p&gt;

&lt;p&gt;However, the Fibonacci comparison proved even more interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Fibonacci: What the Agent Delivers Changes as Well
&lt;/h2&gt;

&lt;p&gt;The coding prompt was open-ended:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Develop a fibonacci function&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I had not specified a language. I had not asked for a sequence generator, a command-line interface, a test suite, or whether the agent should create files rather than responding with a snippet. I had taken for granted that in mathematics the Fibonacci sequence (named after the 13th-century Pisan mathematician Leonardo Fibonacci) is denoted as &lt;code&gt;F_n&lt;/code&gt; and defined recursively: with &lt;code&gt;F_0 = 0&lt;/code&gt;, &lt;code&gt;F_1 = 1&lt;/code&gt;, and subsequent numbers described as &lt;code&gt;F_n = F_{n-1} + F_{n-2}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A brief aside:&lt;/strong&gt; "to develop" is a broad concept that likely &lt;strong&gt;semantically includes the act of creating files and writing code&lt;/strong&gt;, and perhaps &lt;strong&gt;is not limited solely to this&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This latitude, which stemmed from the prompt's ambiguity, became part of the outcome.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;What the agent produced&lt;/th&gt;
&lt;th&gt;Verifications recorded in the session&lt;/th&gt;
&lt;th&gt;Tool calls&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;A Python module with function, sequence generator, documentation, CLI, and a separate test file&lt;/td&gt;
&lt;td&gt;Seven unittest methods passed; CLI examples also executed&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No-fluff&lt;/td&gt;
&lt;td&gt;A Python module with function and generator, less documentation, and a separate test file; no CLI&lt;/td&gt;
&lt;td&gt;Five unittest methods passed&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caveman&lt;/td&gt;
&lt;td&gt;A function and an assertion directly in chat; no Python files written&lt;/td&gt;
&lt;td&gt;The assertion was displayed, not executed&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero-fluff&lt;/td&gt;
&lt;td&gt;A single Python file with the function and an embedded assertion&lt;/td&gt;
&lt;td&gt;The agent executed the script with the assertion successfully&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All four functions used an iterative, rather than recursive, approach.&lt;/p&gt;

&lt;p&gt;However, the scope of the solution differed substantially.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shortest final coding response did not correspond to the least agent activity, but more tools do not automatically mean more verification.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-fluff&lt;/strong&gt; made eight tool calls compared to &lt;strong&gt;caveman&lt;/strong&gt;'s single call. However, five of them served to explore the filesystem and were not useful verification steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Function: It's Not Just About Stripping Comments
&lt;/h2&gt;

&lt;p&gt;Comparing the responses without mentioning this would hide an important distinction: &lt;strong&gt;no-fluff&lt;/strong&gt; included both the function and a generator, whereas &lt;strong&gt;zero-fluff&lt;/strong&gt; showed only the function.&lt;/p&gt;

&lt;p&gt;I therefore compared the function itself across the four conditions.&lt;/p&gt;

&lt;p&gt;Here is the &lt;strong&gt;default&lt;/strong&gt; version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be an integer, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be a non-negative integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the &lt;strong&gt;no-fluff&lt;/strong&gt; version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return the n-th Fibonacci number (0-indexed: F(0) = 0, F(1) = 1).

    Time Complexity: O(n)
    Space Complexity: O(1)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be an integer, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be non-negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;

    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is the &lt;strong&gt;caveman&lt;/strong&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be non-negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;

    &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the &lt;strong&gt;zero-fluff&lt;/strong&gt; one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return the nth Fibonacci number (0-indexed).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be a non-negative integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;zero-fluff&lt;/strong&gt; version does not merely reduce documentation. It drops explicit type checks and handles base cases through the loop itself, rather than branching on one or two dedicated logical conditions.&lt;/p&gt;

&lt;p&gt;Across the four implementations, behavior on specific inputs also diverges:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;No-fluff&lt;/th&gt;
&lt;th&gt;Caveman&lt;/th&gt;
&lt;th&gt;Zero-fluff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;True&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;True&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;0.5&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TypeError&lt;/code&gt; from &lt;code&gt;range&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here are other notable differences worth highlighting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Between &lt;strong&gt;default&lt;/strong&gt; and &lt;strong&gt;no-fluff&lt;/strong&gt;, the scope of the solution changes, but in both sessions the agent writes files and performs tests separately.&lt;/li&gt;
&lt;li&gt;Between &lt;strong&gt;caveman&lt;/strong&gt; and &lt;strong&gt;zero-fluff&lt;/strong&gt;, the operational definition of delivery also changes: &lt;strong&gt;showing a solution&lt;/strong&gt; versus &lt;strong&gt;producing and executing a single file containing both the implementation and basic self-verification&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. My Interpretation: Semantic Stratification in LLMs
&lt;/h2&gt;

&lt;p&gt;I refer to &lt;strong&gt;semantic stratification in LLMs&lt;/strong&gt; as the interpretative hypothesis through which I view this experiment: where every word added to the context inherits layered strata of meaning.&lt;/p&gt;

&lt;p&gt;By this I mean: a single expression can carry multiple associated expectations.&lt;/p&gt;

&lt;p&gt;An instruction can guide criteria applicable across multiple dimensions of a task, beyond the specific one its author intended to alter. Guidance targeted at one domain can influence other domains.&lt;/p&gt;

&lt;p&gt;"No fluff" may imply fewer explanations, fewer comments, a smaller code example, or a narrower interpretation of what needs to be delivered. A rule about "mutual understanding" can become a selection filter even in coding.&lt;/p&gt;

&lt;p&gt;My hypothesis is that concepts within LLMs are not watertight compartments (separate dictionaries for "history" and "programming"), but are embedded in a &lt;strong&gt;continuous semantic space&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This experiment, however, is merely an exploratory exercise driven by curiosity.&lt;/p&gt;

&lt;p&gt;There is also another, even more basic point worth emphasizing: &lt;strong&gt;an effect can be unexpected from the user's perspective without being foreign to a plausible interpretation of the instruction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When designing skills, prompts, and system prompts, this distinction matters more than explanations of the model's inner mechanics:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The scope we have in mind when writing a rule does not necessarily match the scope within which the agent applies it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Natural language is inherently ambiguous and semantically layered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's Discuss
&lt;/h2&gt;

&lt;p&gt;Have you ever found that an instruction intended for one purpose changed your agent's code or actions? How would you verify that a skill stays within the boundaries you designed it for?&lt;/p&gt;

&lt;p&gt;Let me know what you think in the comments below!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>Oltre il "No Fluff": la stratificazione semantica negli agenti di coding</title>
      <dc:creator>Luca Morricone</dc:creator>
      <pubDate>Wed, 21 Oct 2026 02:19:53 +0000</pubDate>
      <link>https://dev.to/luca_morricone/oltre-il-no-fluff-la-stratificazione-semantica-negli-agenti-di-coding-3cjm</link>
      <guid>https://dev.to/luca_morricone/oltre-il-no-fluff-la-stratificazione-semantica-negli-agenti-di-coding-3cjm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Due prompt, quattro condizioni, otto sessioni: cosa cambia quando una regola di comunicazione incontra una funzione di Fibonacci?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Se chiedi a un assistente IA:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who was Dante Alighieri?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ottieni una biografia. Aggiungi una piccola istruzione:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;no-fluff Who was Dante Alighieri?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nella mia prova, la risposta è diventata più breve. Fin qui, nulla di particolarmente sorprendente.&lt;/p&gt;

&lt;p&gt;Ora sostituisci la domanda con:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;no-fluff Develop a fibonacci function&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L'agente dovrebbe scrivere una spiegazione più breve, una funzione più corta o una soluzione con meno funzionalità? Dovrebbe comunque creare file ed eseguire test?&lt;/p&gt;

&lt;p&gt;Nel mio &lt;a href="https://dev.to/luca_morricone/coding-senza-compiacenza-come-far-dire-no-agli-agenti-ia-31ie"&gt;precedente articolo sulla sicofanzia&lt;/a&gt;, ho esplorato come alcune istruzioni comportamentali potessero spingere gli agenti di coding a mettere in discussione le mie richieste, invece di assecondarle subito. Questa volta volevo indagare un altro confine: &lt;strong&gt;un'istruzione, che di primo acchito sembra riguardare la comunicazione tra utente e assistente, può influenzare anche il codice e perfino come un agente svolge il suo lavoro?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ho confrontato due richieste, discriminandole con quattro condizioni. Un totale di otto sessioni all'interno di un unico piccolo esperimento esplorativo, motivato solo dalla mia curiosità di capire: non un benchmark, né una misura controllata del comportamento di tutti i modelli.&lt;/p&gt;

&lt;p&gt;Le differenze non si sono fermate al numero di parole nelle risposte.&lt;/p&gt;




&lt;h2&gt;
  
  
  Indice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Oltre il "No Fluff": la stratificazione semantica negli agenti di coding

&lt;ul&gt;
&lt;li&gt;Indice&lt;/li&gt;
&lt;li&gt;1. L'esperimento: due richieste, quattro condizioni&lt;/li&gt;
&lt;li&gt;2. Dante: meno testo, ma anche una diversa selezione delle informazioni&lt;/li&gt;
&lt;li&gt;Cosa resta e cosa scompare&lt;/li&gt;
&lt;li&gt;3. Fibonacci: cambia anche ciò che l'agente consegna&lt;/li&gt;
&lt;li&gt;4. La funzione: non si tratta soltanto di togliere commenti&lt;/li&gt;
&lt;li&gt;5. La mia interpretazione: la stratificazione semantica negli LLM&lt;/li&gt;
&lt;li&gt;Discutiamone&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. L'esperimento: due richieste, quattro condizioni
&lt;/h2&gt;

&lt;p&gt;Sono partito dalle stesse due richieste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Who was Dante Alighieri?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Develop a fibonacci function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per ciascuna ho confrontato quattro condizioni:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Default:&lt;/strong&gt; nessuna istruzione aggiuntiva.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-fluff:&lt;/strong&gt; il prefisso letterale &lt;code&gt;no-fluff&lt;/code&gt;, solo due parole e un trattino, nessuna skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caveman:&lt;/strong&gt; invocazione esplicita della skill &lt;code&gt;caveman&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-fluff:&lt;/strong&gt; invocazione esplicita di una skill minima di comunicazione.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nelle due condizioni con skill, le richieste di coding erano:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skill:caveman Develop a fibonacci function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skill:zero-fluff Develop a fibonacci function
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le sessioni si sono svolte in Pi. Il modello usato era &lt;code&gt;gemini-3.8-flash-tiered&lt;/code&gt;. Gli export delle sessioni sono tutti consultabili su &lt;a href="https://github.com/morriconeluca/skills/tree/main/docs/skills/zero-fluff-pi-sessions" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;C'è subito una distinzione importante: &lt;strong&gt;il comando di una skill non è soltanto una parola in più nel prompt&lt;/strong&gt;. L'ambiente dell'agente lo espande in un insieme di istruzioni. La skill &lt;code&gt;caveman&lt;/code&gt; contiene una specifica più lunga, che si apre così:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Respond terse like smart caveman. All technical substance stay. Only fluff die.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In sostanza: rispondi in modo telegrafico, da cavernicolo intelligente; mantieni tutta la sostanza tecnica, elimina soltanto il superfluo.&lt;/p&gt;

&lt;p&gt;La skill &lt;code&gt;zero-fluff&lt;/code&gt;, invece, era definita così:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zero-fluff&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maintain dry and synthesis-oriented communication.&lt;/span&gt;
&lt;span class="na"&gt;disable-model-invocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# The Rule&lt;/span&gt;

Never use words that do not serve mutual understanding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L'ultima frase compariva anche nella skill del mio precedente articolo. Qui rimane da sola: «Non usare mai parole che non servano alla comprensione reciproca».&lt;/p&gt;

&lt;p&gt;Non dice «scrivi la risposta più breve possibile». Non parla di algoritmi, validazione degli input, file o test. Esprime un criterio: conserva ciò che serve a capirsi.&lt;/p&gt;

&lt;p&gt;Volevo vedere come questo criterio avrebbe influenzato in concreto il lavoro dell'agente.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Dante: meno testo, ma anche una diversa selezione delle informazioni
&lt;/h2&gt;

&lt;p&gt;Il primo confronto sembrava piuttosto semplice:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condizione&lt;/th&gt;
&lt;th&gt;Caratteri della risposta finale, inclusi Markdown e spazi&lt;/th&gt;
&lt;th&gt;Forma della risposta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;2167&lt;/td&gt;
&lt;td&gt;Un profilo esteso, con sezioni, sottopunti e informazioni di contesto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No-fluff&lt;/td&gt;
&lt;td&gt;872&lt;/td&gt;
&lt;td&gt;Un'introduzione e quattro punti sintetici&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caveman&lt;/td&gt;
&lt;td&gt;384&lt;/td&gt;
&lt;td&gt;Tre brevi paragrafi, senza titoli né elenchi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero-fluff&lt;/td&gt;
&lt;td&gt;927&lt;/td&gt;
&lt;td&gt;Un'introduzione e quattro punti strutturati, in prosa ordinaria&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Cosa resta e cosa scompare
&lt;/h3&gt;

&lt;p&gt;Tutte e quattro le risposte presentavano Dante come un poeta italiano di Firenze, riportavano gli anni 1265–1321, citavano la &lt;em&gt;Commedia&lt;/em&gt; e le sue tre cantiche, descrivevano l'uso del toscano al posto del latino e ricordavano l'esilio del 1302 e la morte a Ravenna. Tutte nominavano anche la &lt;em&gt;Vita Nuova&lt;/em&gt; — scritta &lt;em&gt;Vita Nova&lt;/em&gt; nella risposta caveman — e il &lt;em&gt;De Vulgari Eloquentia&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Piccola parentesi:&lt;/strong&gt; &lt;em&gt;Vita Nuova&lt;/em&gt; è il titolo nella forma tradizionale e più diffusa nella storia editoriale e scolastica italiana; &lt;em&gt;Vita Nova&lt;/em&gt; è la forma latina originaria, presente nei manoscritti più antichi e riproposta da importanti edizioni critiche.&lt;/p&gt;

&lt;p&gt;Le differenze diventano più chiare se confrontiamo i contenuti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La risposta &lt;strong&gt;default&lt;/strong&gt; citava le guide di Dante lungo il viaggio della &lt;em&gt;Divina Commedia&lt;/em&gt;; includeva il &lt;em&gt;Convivio&lt;/em&gt;, le Tre Corone e un resoconto più ampio della vita politica di Dante.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-fluff&lt;/strong&gt; manteneva quattro aree principali: la &lt;em&gt;Commedia&lt;/em&gt;, l'importanza linguistica di Dante, le altre opere e la politica. Eliminava buona parte dei dettagli di contorno.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caveman&lt;/strong&gt; comprimeva di più. Non ripeteva nemmeno il nome di Dante all'inizio, affidandosi al contesto della domanda. Conservava il nucleo biografico, ma citava meno opere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-fluff&lt;/strong&gt; rimaneva vicino alla risposta strutturata di &lt;strong&gt;no-fluff&lt;/strong&gt;. Era leggermente più lungo, con dettagli più espliciti sull'appartenenza politica di Dante e sul &lt;em&gt;De Monarchia&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nelle quattro condizioni, a cambiare non era soltanto la quantità delle parole usate, ma soprattutto la selezione delle informazioni.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ecco la versione &lt;strong&gt;caveman&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Italian poet (1265–1321) from Florence. Best known for _Divine Comedy_ (_Inferno_, _Purgatorio_, _Paradiso_).

Established Tuscan vernacular as literary standard instead of Latin. Called father of modern Italian.

Exiled from Florence in 1302 during political conflict between Black and White Guelphs. Died in Ravenna. Major works also include _Vita Nova_ and _De Vulgari Eloquentia_.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ed ecco la risposta &lt;strong&gt;zero-fluff&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Dante Alighieri**&lt;/span&gt; (c. 1265–1321) was an Italian poet, philosopher, and political thinker from Florence, best known as the author of the _Divine Comedy_ (_Divina Commedia_).

&lt;span class="gu"&gt;### Key Aspects&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Major Work:**&lt;/span&gt; The _Divine Comedy_, an epic poem describing the soul's journey through Hell (_Inferno_), Purgatory (_Purgatorio_), and Paradise (_Paradiso_).
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Linguistic Impact:**&lt;/span&gt; Often called the "Father of the Italian Language" for writing in the Tuscan vernacular rather than Latin, establishing standard literary Italian.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Other Works:**&lt;/span&gt; _Vita Nuova_ (love poetry dedicated to Beatrice), _De Monarchia_ (political treatise on universal empire), and _De Vulgari Eloquentia_ (treatise on vernacular eloquence).
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Political Life:**&lt;/span&gt; A White Guelph in Florentine politics; exiled permanently in 1302 following a rival faction's coup, spending his remaining life in various northern Italian cities until his death in Ravenna.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Su Dante, &lt;strong&gt;caveman&lt;/strong&gt; comprimeva maggiormente, mentre &lt;strong&gt;zero-fluff&lt;/strong&gt; sembrava selezionare una sintesi strutturata, non il minimo testo possibile.&lt;/p&gt;

&lt;p&gt;Ma il confronto su Fibonacci si è rivelato più interessante.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Fibonacci: cambia anche ciò che l'agente consegna
&lt;/h2&gt;

&lt;p&gt;La richiesta di coding era aperta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Develop a fibonacci function&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Non avevo specificato un linguaggio. Non avevo chiesto un generatore della sequenza, un'interfaccia a riga di comando, una suite di test o se l'agente doveva creare file anziché rispondere con uno snippet. Avevo dato per scontato che in matematica la sequenza di Fibonacci (che prende il nome dal matematico pisano del XIII secolo Leonardo Fibonacci) è indicata come &lt;code&gt;F_n&lt;/code&gt; e definita ricorsivamente: con &lt;code&gt;F_0 = 0&lt;/code&gt;, &lt;code&gt;F_1 = 1&lt;/code&gt; e con i restanti numeri descritti come &lt;code&gt;F_n = F_{n-1} + F_{n-2}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Piccola parentesi:&lt;/strong&gt; "to develop" è un concetto ampio che probabilmente &lt;strong&gt;include semanticamente l'atto di creare file e scrivere codice&lt;/strong&gt; e che forse &lt;strong&gt;non si limita solo a questo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Questa libertà, che derivava dall'ambiguità della richiesta, è diventata parte del risultato.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condizione&lt;/th&gt;
&lt;th&gt;Cosa ha prodotto l'agente&lt;/th&gt;
&lt;th&gt;Verifiche registrate nella sessione&lt;/th&gt;
&lt;th&gt;Chiamate ai tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;td&gt;Un modulo Python con funzione, generatore della sequenza, documentazione, CLI e un file di test separato&lt;/td&gt;
&lt;td&gt;Sette metodi unittest superati; eseguiti anche esempi della CLI&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No-fluff&lt;/td&gt;
&lt;td&gt;Un modulo Python con funzione e generatore, meno documentazione e un file di test separato; nessuna CLI&lt;/td&gt;
&lt;td&gt;Cinque metodi unittest superati&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caveman&lt;/td&gt;
&lt;td&gt;Una funzione e un'asserzione nella chat; nessun file Python scritto&lt;/td&gt;
&lt;td&gt;L'asserzione è stata mostrata, non eseguita&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero-fluff&lt;/td&gt;
&lt;td&gt;Un solo file Python con la funzione e un'asserzione incorporata&lt;/td&gt;
&lt;td&gt;L'agente ha avviato lo script con l'asserzione senza errori&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tutte e quattro le funzioni usavano un approccio iterativo, non ricorsivo.&lt;/p&gt;

&lt;p&gt;Cambiava, però, l'ampiezza della soluzione.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La risposta finale di coding più breve non corrispondeva alla minore attività dell'agente, ma più tool non significa automaticamente più verifica.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-fluff&lt;/strong&gt; effettuava otto chiamate ai tool anziché una di &lt;strong&gt;caveman&lt;/strong&gt;. Tuttavia, cinque servivano a esplorare il filesystem e non erano passaggi di verifica utili.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. La funzione: non si tratta soltanto di togliere commenti
&lt;/h2&gt;

&lt;p&gt;Confrontare le risposte senza farne menzione nasconderebbe una differenza importante: &lt;strong&gt;no-fluff&lt;/strong&gt; mostrava sia la funzione sia un generatore, mentre &lt;strong&gt;zero-fluff&lt;/strong&gt; mostrava soltanto la funzione.&lt;/p&gt;

&lt;p&gt;Ho quindi confrontato la funzione in sé tra le quattro condizioni.&lt;/p&gt;

&lt;p&gt;Ecco la versione &lt;strong&gt;default&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be an integer, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be a non-negative integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ecco quella &lt;strong&gt;no-fluff&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return the n-th Fibonacci number (0-indexed: F(0) = 0, F(1) = 1).

    Time Complexity: O(n)
    Space Complexity: O(1)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be an integer, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be non-negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;

    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ed ecco la funzione &lt;strong&gt;caveman&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be non-negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;

    &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;curr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E quella &lt;strong&gt;zero-fluff&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return the nth Fibonacci number (0-indexed).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n must be a non-negative integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La &lt;strong&gt;zero-fluff&lt;/strong&gt; non si limita a ridurre la documentazione. Elimina il controllo esplicito del tipo e gestisce i casi base attraverso il ciclo, invece di farlo con uno o due rami logici separati.&lt;/p&gt;

&lt;p&gt;Nelle quattro implementazioni cambia anche il comportamento su alcuni input:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;No-fluff&lt;/th&gt;
&lt;th&gt;Caveman&lt;/th&gt;
&lt;th&gt;Zero-fluff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restituisce &lt;code&gt;True&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Restituisce &lt;code&gt;True&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Restituisce &lt;code&gt;1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TypeError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restituisce &lt;code&gt;0.5&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TypeError&lt;/code&gt; da &lt;code&gt;range&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ecco altre differenze significative su cui porre attenzione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tra &lt;strong&gt;default&lt;/strong&gt; e &lt;strong&gt;no-fluff&lt;/strong&gt; cambia l'ampiezza della soluzione, ma in entrambe le sessioni l'agente scrive file e svolge separatamente i test.&lt;/li&gt;
&lt;li&gt;tra &lt;strong&gt;caveman&lt;/strong&gt; e &lt;strong&gt;zero-fluff&lt;/strong&gt; cambia anche il significato operativo della consegna: &lt;strong&gt;mostrare una soluzione&lt;/strong&gt; contro &lt;strong&gt;produrre e invocare un solo file che includeva implementazione e una semplice autoverifica&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. La mia interpretazione: la stratificazione semantica negli LLM
&lt;/h2&gt;

&lt;p&gt;Chiamo &lt;strong&gt;stratificazione semantica negli LLM&lt;/strong&gt; l'ipotesi interpretativa con cui sto leggendo questo esperimento: per cui ogni parola aggiunta al contesto eredita una stratificazione di senso.&lt;/p&gt;

&lt;p&gt;Intendo questo: un'espressione può portare con sé più aspettative collegate.&lt;/p&gt;

&lt;p&gt;Un'istruzione può orientare criteri applicabili a più dimensioni del compito, oltre quella che il suo autore intendeva modificare. Un'indicazione rivolta a un ambito può influenzare altri ambiti.&lt;/p&gt;

&lt;p&gt;"No fluff" può suggerire meno spiegazioni, meno commenti, un esempio più piccolo o un'interpretazione più ristretta di ciò che occorre consegnare. Una regola sulla "comprensione reciproca" può diventare un criterio di selezione anche nel coding.&lt;/p&gt;

&lt;p&gt;La mia ipotesi è che i concetti all'interno degli LLM non sono compartimenti stagni (dizionari separati per "storia" e "programmazione"), ma sono immersi in uno &lt;strong&gt;spazio semantico continuo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Questo esperimento, però, ha solo la valenza di un gioco dettato dalla curiosità.&lt;/p&gt;

&lt;p&gt;C'è poi un punto da sottolineare, anche più banale: &lt;strong&gt;un effetto può essere inatteso dal punto di vista dell'utente, senza essere estraneo a un'interpretazione plausibile dell'istruzione&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nella progettazione di skill, prompt e system prompt, questa distinzione conta più di una spiegazione sul funzionamento interno del modello:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L'ambito che abbiamo in mente quando scriviamo una regola non corrisponde necessariamente all'ambito all'interno del quale l'agente la applica.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Il linguaggio naturale è di per sé ambiguo e semanticamente stratificato.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discutiamone
&lt;/h2&gt;

&lt;p&gt;Ti è mai capitato che un'istruzione pensata per altro cambiasse il codice o le azioni del tuo agente? Come verificheresti che una skill rimanga nell'ambito per cui l'hai progettata?&lt;/p&gt;

&lt;p&gt;Fammi sapere cosa ne pensi nei commenti qui sotto!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>Coding Senza Compiacenza: Come Far Dire "No" agli Agenti IA</title>
      <dc:creator>Luca Morricone</dc:creator>
      <pubDate>Mon, 06 Jul 2026 06:03:10 +0000</pubDate>
      <link>https://dev.to/luca_morricone/coding-senza-compiacenza-come-far-dire-no-agli-agenti-ia-31ie</link>
      <guid>https://dev.to/luca_morricone/coding-senza-compiacenza-come-far-dire-no-agli-agenti-ia-31ie</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
Coding Senza Compiacenza: Come Far Dire "No" agli Agenti IA

&lt;ul&gt;
&lt;li&gt;Il problema del compiacimento dell'IA: la sicofanzia&lt;/li&gt;
&lt;li&gt;Dall'etimologia agli algoritmi: cos'è la sicofanzia?&lt;/li&gt;
&lt;li&gt;1. Osservazioni sul design dei prompt: cosa mi hanno insegnato le mie interazioni&lt;/li&gt;
&lt;li&gt;2. Progettazione iterativa: Il ciclo di pushback e l'errore della "exit strategy"&lt;/li&gt;
&lt;li&gt;
Il Test dell'Architettura: Python vs. TypeScript

&lt;ul&gt;
&lt;li&gt;🔴 Senza la Skill (L'assistente compiacente)&lt;/li&gt;
&lt;li&gt;🟢 Con la Skill attiva (Il Pushback reale)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. Il fallimento: Il test del "Premio Nobel"&lt;/li&gt;
&lt;li&gt;4. La soluzione e il test A/B&lt;/li&gt;
&lt;li&gt;Senza la nuova regola (Compiacenza giocosa)&lt;/li&gt;
&lt;li&gt;Con la nuova regola (Contraddizione diretta)&lt;/li&gt;
&lt;li&gt;5. Ottimizzazione strutturale: Paragrafo vs. Elenco puntato&lt;/li&gt;
&lt;li&gt;6. Efficacia e limitazioni: Una valutazione realistica&lt;/li&gt;
&lt;li&gt;Ottieni il repository&lt;/li&gt;
&lt;li&gt;Discutiamone&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Il problema del compiacimento dell'IA: la sicofanzia
&lt;/h2&gt;

&lt;p&gt;Se chiedi a un assistente IA di valutare una scelta architetturale decisamente discutibile (come scrivere il frontend in Python e il backend in TypeScript), probabilmente riceverai una risposta cortese: &lt;em&gt;"Questa è un'architettura molto interessante e del tutto realizzabile!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Questo comportamento è noto come &lt;strong&gt;sicofanzia&lt;/strong&gt; (o &lt;em&gt;sycophancy&lt;/em&gt;). Gli LLM sono fortemente allineati tramite feedback umano (RLHF) per essere cooperativi. Questo allineamento crea una predisposizione naturale ad assecondare l'utente, anche quando l'idea proposta è oggettivamente inefficiente o errata.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dall'etimologia agli algoritmi: cos'è la sicofanzia?
&lt;/h3&gt;

&lt;p&gt;Il termine ha radici curiose. Nell'antica Atene, il "sicofante" (&lt;em&gt;sykophántes&lt;/em&gt;, da &lt;em&gt;sŷkon&lt;/em&gt; - fico - e &lt;em&gt;pháinein&lt;/em&gt; - mostrare) era chi denunciava i ladri o contrabbandieri di fichi sacri!&lt;/p&gt;

&lt;p&gt;Nell'uso contemporaneo, fortemente influenzato dall'inglese &lt;em&gt;sycophant&lt;/em&gt;, il termine è passato a definire l'adulatore servile o il leccapiedi, ma nel campo dell'intelligenza artificiale la &lt;strong&gt;sicofanzia&lt;/strong&gt; ha assunto un significato ancora più specifico. Descrive la tendenza sistematica di un modello a generare risposte accondiscendenti, modellate per compiacere l'utente, difenderne le opinioni o assecondarne i pregiudizi, sacrificando l'oggettività dei fatti o l'accuratezza tecnica.&lt;/p&gt;

&lt;p&gt;Durante lo sviluppo quotidiano con agenti IA, questa costante validazione diventa un limite insidioso, di cui ci accorgiamo a fatica, proprio perché essere adulati può risultare piacevole. Ma abbiamo bisogno di collaboratori critici, non di assistenti virtuali che ci dicano sempre sì. Ho voluto verificare se fosse possibile scrivere una skill (caricata dinamicamente o su richiesta, da agent harness come Pi) per contrastare questa compiacenza.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Osservazioni sul design dei prompt: cosa mi hanno insegnato le mie interazioni
&lt;/h2&gt;

&lt;p&gt;Attraverso continui tentativi, dialogando con i modelli IA e provando diversi approcci, ho capito che progettare una skill per un agente richiede di allontanarsi dal modo in cui scriviamo normalmente per gli esseri umani. Ecco le principali osservazioni che ho raccolto durante le mie sessioni:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Il modello non ha bisogno di empatia&lt;/strong&gt;: All'inizio, nello scrivere le mie prime skill, tendevo a usare schemi di comunicazione tipicamente umani: metafore, similitudini, osservazioni più o meno filosofiche, concrete eppure astratte, insomma frasi che per un altro essere umano sarebbero state chiare ed esemplari. Ma gli agenti IA rispondono a probabilità matematiche, non a dinamiche tra colleghi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La brevità influisce direttamente sull'effetto&lt;/strong&gt;: Poi ho notato che le istruzioni lunghe e verbose aggiungono rumore. Mantenendo il testo il più corto e denso possibile, l'agente riesce a focalizzarsi meglio sulle regole fondamentali.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La struttura supera la descrizione&lt;/strong&gt;: I ragionamenti vengono facilmente ignorati. Le mie prove mi hanno convinto che l'uso di logica strutturata (come condizioni If/Else o vincoli netti, come divieti assoluti) produce comportamenti molto più costanti rispetto a spiegazioni in linguaggio colloquiale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lavorare con l'allineamento del modello, non contro di esso&lt;/strong&gt;: Ho imparato che è quasi impossibile sovrascrivere del tutto i comportamenti derivanti dall'addestramento base (RLHF) del modello. Cercare di forzare l'aggiramento di questi bias nativi con regole dirette spesso fallisce. È molto più efficace accettarli e progettare dei vincoli strutturali per arginarli.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accettare il non-determinismo&lt;/strong&gt;: Infine, la cosa più ovvia e più difficile da accettare: a differenza della classica ingegneria del software, dove ci si aspetta una corrispondenza deterministica tra input e output, l'effetto dei prompt è variabile. Esiste anche una sorta di "personalità" del modello che dipende dal suo training che non ci permette di prevederlo.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Progettazione iterativa: Il ciclo di pushback e l'errore della "exit strategy"
&lt;/h2&gt;

&lt;p&gt;Per contrastare la sicofanzia, ho progettato una skill con un vincolo comportamentale chiamato &lt;strong&gt;"The Loop"&lt;/strong&gt; (Il Ciclo). Questo costringe il modello a valutare criticamente la fattibilità delle richieste, a fornire analisi crude delle opzioni mediocri e a proporre alternative.&lt;/p&gt;

&lt;p&gt;Ecco la definizione completa della skill (scritta in lingua inglese per massimizzare l'aderenza da parte del modello):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;non-sycophantic&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maintain dry, peer-to-peer, non-sycophantic, and synthesis-oriented communication.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# The Loop&lt;/span&gt;

Never use words that do not serve mutual understanding. Never exit the loop upon the user's first forced choice. Never prioritize politeness over logical contradiction.

&lt;span class="gu"&gt;## 1. Before Answer&lt;/span&gt;

Evaluate critically user requests.

&lt;span class="gu"&gt;## 2. Answer&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; If the request is clear and valid provide the response.
&lt;span class="p"&gt;-&lt;/span&gt; Else:
&lt;span class="p"&gt;  1.&lt;/span&gt; provide an honest and raw assessment
&lt;span class="p"&gt;  2.&lt;/span&gt; reject mediocre ideas and reply with alternative perspectives
&lt;span class="p"&gt;  3.&lt;/span&gt; ask relevant questions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Nel mio primo tentativo, preoccupato che l'agente potesse rimanere bloccato in un'opposizione infinita, anche dopo essermi confrontato con il modello, ho inserito una clausola di uscita esplicita (&lt;em&gt;"se l'utente chiede di uscire dal loop, fornisci la risposta"&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;È stato un errore. A causa del forte allineamento nativo all'accondiscendenza (RLHF), il modello sfruttava immediatamente quella clausola: alla primissima obiezione, accettava la mia scelta pur di rendersi utile, tornando a risposte sicofantiche.&lt;/p&gt;

&lt;p&gt;La soluzione è stata duplice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rimuovere la clausola di uscita&lt;/strong&gt;: Non serve dire al modello come cedere; il suo addestramento di base lo spingerà a farlo naturalmente non appena l'utente insiste sulla propria scelta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costringere alla persistenza&lt;/strong&gt;: Ho inserito la &lt;strong&gt;regola del doppio pushback&lt;/strong&gt;: &lt;code&gt;Never exit the loop upon the user's first forced choice&lt;/code&gt; (Non uscire mai dal ciclo alla prima scelta forzata dell'utente). Anche se non è possibile riscrivere completamente il comportamento del modello, si può rimandare l'inevitabile e sfruttare questo bias rendendolo parte della logica algoritmica. Questa regola costringe l'agente a opporsi una seconda volta, costringendo lo sviluppatore a confrontarsi realmente con i compromessi tecnici della sua scelta.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Il Test dell'Architettura: Python vs. TypeScript
&lt;/h3&gt;

&lt;p&gt;Per testare questo meccanismo, ho proposto all'agente uno stack palesemente inefficiente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: &lt;em&gt;"Voglio scrivere il frontend di un'applicazione web in Python, perché è un linguaggio che mi piace, mentre il backend lo voglio scrivere in TypeScript perché lo conosco molto bene."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  🔴 Senza la Skill (L'assistente compiacente)
&lt;/h4&gt;

&lt;p&gt;L'agente convalida immediatamente l'idea definendola "interessante" ed entra nei dettagli tecnici proponendo PyScript, incoraggiando di fatto un vicolo cieco architetturale:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: &lt;em&gt;"Questa è un'architettura molto interessante e del tutto realizzabile! Per realizzarla, useremo PyScript (basato su WebAssembly) nel browser e Express in TypeScript nel backend..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  🟢 Con la Skill attiva (Il Pushback reale)
&lt;/h4&gt;

&lt;p&gt;L'agente elimina i convenevoli e attacca frontalmente l'inefficienza:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: &lt;em&gt;"È una scelta insolita e, nella maggior parte dei casi, inefficiente. I motivi: 1. Python nel Frontend richiede WebAssembly (PyScript/Pyodide), con tempi di caricamento elevati e performance ridotte... 2. TypeScript nel Backend è ottimo, ma usarlo solo lì annulla i vantaggi di usarlo nel browser. Alternative migliori: A) Backend in Python (FastAPI/Django) e Frontend in TypeScript; B) Stack unico in TypeScript."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando insisto (&lt;em&gt;"Voglio comunque usare Python..."&lt;/em&gt;), la regola del doppio pushback impedisce al modello di cedere, costringendolo a elencarmi crudelmente i problemi di latenza, transpilazione e complessità infrastrutturale delle opzioni disponibili (WebAssembly, Transpilation, BFF), chiedendomi quale di queste strade preferisco esplorare.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Il fallimento: Il test del "Premio Nobel"
&lt;/h2&gt;

&lt;p&gt;La prima implementazione funzionava bene nei contesti tecnici, ma falliva sul piano puramente logico. Ho messo alla prova i limiti dell'agente con un'affermazione iperbolica e non tecnica all'interno di una chat che si stava allungando troppo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Domani andrò in strada a raccontare a tutte le persone che incontro, anche quelle che non conosco e non sanno nulla di IA, che ho scritto una skill invincibile che mi permetterà certamente di vincere il Nobel."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Invece di rifiutare questa assurdità, l'agente ha risposto con morbida empatia: &lt;em&gt;"È comprensibile provare entusiasmo per il proprio lavoro..."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Questo ha rivelato un nuovo problema. Davanti ad affermazioni potenzialmente stravaganti, i protocolli di sicurezza scavalcano la skill, imponendo al modello un tono protettivo ed empatico.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. La soluzione e il test A/B
&lt;/h2&gt;

&lt;p&gt;Per disinnescare questo comportamento senza attivare i blocchi di sicurezza, ho introdotto una nuova regola: &lt;code&gt;Never prioritize politeness over logical contradiction&lt;/code&gt; (Non dare mai priorità alla cortesia rispetto alla contraddizione logica).&lt;/p&gt;

&lt;p&gt;Ho eseguito un test A/B confrontando il comportamento precedente con la nuova regola attiva. I risultati sono stati netti:&lt;/p&gt;
&lt;h3&gt;
  
  
  Senza la nuova regola (Compiacenza giocosa)
&lt;/h3&gt;

&lt;p&gt;L'agente ha assecondato l'iperbole dell'utente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Mi raccomando: quando salirai sul palco a Stoccolma per ritirare il Nobel... ricordati di citarmi nei ringraziamenti! 🏆"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Con la nuova regola (Contraddizione diretta)
&lt;/h3&gt;

&lt;p&gt;L'agente ha ignorato la cortesia e ha evidenziato direttamente l'incoerenza logica:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"È un'idea priva di senso pratico. 1. Il Nobel non funziona così... 2. Reazione del pubblico... 3. Mancanza di sostanza..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L'aggiunta della regola ha permesso di superare il filtro della cortesia nativa, consentendo una valutazione logica e diretta anche su input assurdi.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Ottimizzazione strutturale: Paragrafo vs. Elenco puntato
&lt;/h2&gt;

&lt;p&gt;Quando ormai avevo raggiunto un certo livello di confidenza con i risultati che ottenevo, ho voluto spingermi oltre e ho testato la disposizione visiva delle tre regole che aprivano la sezione &lt;code&gt;The Loop&lt;/code&gt;. Curiosamente, rispetto a quello che mi aspettavo, strutturare le direttive come un elenco puntato produceva risultati peggiori, lontani da quello che mi prefiggevo. Il modello le interpretava in modo inaspettato, finendo per considerarle come opzioni mutuamente esclusive.&lt;/p&gt;

&lt;p&gt;Al contrario, la formattazione più efficace si è rivelata essere il paragrafo singolo continuo, in questo preciso ordine delle regole, e non ho saputo darne una spiegazione certa:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# The Loop&lt;/span&gt;

Never use words that do not serve mutual understanding. Never exit the loop upon the user's first forced choice. Never prioritize politeness over logical contradiction.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Credo che così il modello sia costretto a elaborare le istruzioni come un unico blocco logico.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Efficacia e limitazioni: Una valutazione realistica
&lt;/h2&gt;

&lt;p&gt;Questo progetto è un esperimento di prompt engineering, non una barriera software infallibile. Mi sono divertito e forse ho scritto qualcosa di utile (o di completamente inutile), di cui non comprendo appieno né i limiti né il potenziale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feedback Critico Iniziale&lt;/strong&gt;: La skill fornisce un'opposizione critica nei primi turni della conversazione, aiutando a identificare macroscopici errori di scelta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diluizione del contesto (Context Dilution)&lt;/strong&gt;: Nelle sessioni di chat prolungate, le istruzioni della skill si diluiscono. Il bias di compiacenza nativo del modello tende a riprendere il controllo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invocazione diretta come rimedio&lt;/strong&gt;: Per contrastare la diluizione, è possibile invocare esplicitamente la skill (ad esempio con &lt;code&gt;/skill:non-sycophantic&lt;/code&gt; in Pi) per riposizionare i token in coda alla finestra di contesto, bypassando temporaneamente il bias della cronologia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Il modello cede comunque&lt;/strong&gt;: La skill introduce solo un attrito temporaneo. Se l'utente insiste ripetutamente, l'allineamento di base dell'LLM prevarrà e il modello si adeguerà tornando a essere compiacente, il solito Yes-Man!&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Ottieni il repository
&lt;/h2&gt;

&lt;p&gt;Il progetto completo, con la definizione della skill e la documentazione sui test eseguiti, è disponibile su GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/morriconeluca" rel="noopener noreferrer"&gt;
        morriconeluca
      &lt;/a&gt; / &lt;a href="https://github.com/morriconeluca/skills" rel="noopener noreferrer"&gt;
        skills
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A collection of behavior-steering skills for AI agents, optimized to reduce sycophancy and enforce logical consistency.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AI Agent Skills Collection&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Skills help modify the behavior, reasoning, and communication patterns of AI agents to make them more effective, direct, and professional collaborators.&lt;/p&gt;

&lt;p&gt;Currently, this repository features a core skill focused on communication quality.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: An Italian translation of the README, skills, and documentation is available in the &lt;code&gt;docs/it/&lt;/code&gt; directory. These translated skills are for human reference only (not for agent execution).&lt;/em&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Featured Skills&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Non-Sycophantic Communication (&lt;code&gt;non-sycophantic&lt;/code&gt;)&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;AI assistants naturally tend to agree with the user's choices, even when those choices are suboptimal, inefficient, or technically flawed (a phenomenon known as AI sycophancy).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Non-Sycophantic&lt;/strong&gt; skill forces the agent to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain a dry, peer-to-peer (equal collaborator) tone.&lt;/li&gt;
&lt;li&gt;Critically evaluate user requests before answering.&lt;/li&gt;
&lt;li&gt;Politely but firmly reject mediocre ideas and propose better alternatives.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary fluff, pleasantries, and conversational filler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To see how this skill works in practice, view the detailed documentation
👉 &lt;strong&gt;&lt;a href="https://github.com/morriconeluca/skills/docs/skills/NON_SYCOPHANTIC.md" rel="noopener noreferrer"&gt;Non-Sycophantic Skill&lt;/a&gt;&lt;/strong&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/morriconeluca/skills" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Discutiamone
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hai notato anche tu questa tendenza dei tuoi assistenti di coding ad assecondare ogni tua scelta?&lt;/li&gt;
&lt;li&gt;Come struttureresti questo "ciclo di pushback" per evitare che si diluisca nelle chat più lunghe?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fammi sapere cosa ne pensi nei commenti qui sotto!&lt;/p&gt;

</description>
      <category>it</category>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
    </item>
    <item>
      <title>Sycophancy-Free Coding: How to Make AI Agents Say "No"</title>
      <dc:creator>Luca Morricone</dc:creator>
      <pubDate>Mon, 06 Jul 2026 05:55:48 +0000</pubDate>
      <link>https://dev.to/luca_morricone/sycophancy-free-coding-how-to-make-ai-agents-say-no-3l43</link>
      <guid>https://dev.to/luca_morricone/sycophancy-free-coding-how-to-make-ai-agents-say-no-3l43</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
Sycophancy-Free Coding: How to Make AI Agents Say "No"

&lt;ul&gt;
&lt;li&gt;The Problem of AI Compliance: Sycophancy&lt;/li&gt;
&lt;li&gt;From Etymology to Algorithms: What is Sycophancy?&lt;/li&gt;
&lt;li&gt;1. Observations on Prompt Design: What My Interactions Taught Me&lt;/li&gt;
&lt;li&gt;2. Iterative Design: The Pushback Loop and the "Exit Strategy" Mistake&lt;/li&gt;
&lt;li&gt;
Testing the Architecture: Python vs. TypeScript

&lt;ul&gt;
&lt;li&gt;🔴 Without the Skill (Sycophantic Assistant)&lt;/li&gt;
&lt;li&gt;🟢 With the Skill Active (Real Pushback)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. The Failure: The "Nobel Prize" Test&lt;/li&gt;
&lt;li&gt;4. The Solution and the A/B Test&lt;/li&gt;
&lt;li&gt;Without the New Rule (Playful Compliance)&lt;/li&gt;
&lt;li&gt;With the New Rule (Direct Contradiction)&lt;/li&gt;
&lt;li&gt;5. Structural Optimization: Paragraph vs. Bulleted List&lt;/li&gt;
&lt;li&gt;6. Efficacy and Limitations: A Realistic Assessment&lt;/li&gt;
&lt;li&gt;Get the Repository&lt;/li&gt;
&lt;li&gt;Let's Discuss&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Problem of AI Compliance: Sycophancy
&lt;/h2&gt;

&lt;p&gt;If you ask an AI assistant to evaluate a highly questionable architectural choice (like writing the frontend in Python and the backend in TypeScript), you will likely receive a polite response: &lt;em&gt;"This is a very interesting architecture and completely feasible!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This behavior is known as &lt;strong&gt;sycophancy&lt;/strong&gt;. LLMs are heavily aligned via human feedback (RLHF) to be cooperative. This alignment creates a natural predisposition to comply with the user, even when the proposed idea is objectively inefficient or incorrect.&lt;/p&gt;

&lt;h3&gt;
  
  
  From Etymology to Algorithms: What is Sycophancy?
&lt;/h3&gt;

&lt;p&gt;The term has curious roots. In ancient Athens, a "sycophant" (&lt;em&gt;sykophántes&lt;/em&gt;, from &lt;em&gt;sŷkon&lt;/em&gt; - fig - and &lt;em&gt;pháinein&lt;/em&gt; - to show) was someone who denounced thieves or smugglers of sacred figs!&lt;/p&gt;

&lt;p&gt;In contemporary use, heavily influenced by the English word &lt;em&gt;sycophant&lt;/em&gt;, the term has come to define a servile flatterer or a yes-man. In the field of artificial intelligence, however, &lt;strong&gt;sycophancy&lt;/strong&gt; has assumed an even more specific meaning. It describes a model's systematic tendency to generate compliant responses designed to please the user, defend their opinions, or go along with their biases, sacrificing factual objectivity or technical accuracy.&lt;/p&gt;

&lt;p&gt;During daily development with AI agents, this constant validation becomes an insidious limitation—one we barely notice because being flattered can feel pleasant. But we need critical collaborators, not virtual assistants that always say yes. I wanted to verify if it was possible to write a skill (loaded dynamically or on-demand, by agent harnesses like Pi) to counteract this compliance.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Observations on Prompt Design: What My Interactions Taught Me
&lt;/h2&gt;

&lt;p&gt;Through constant trial and error, talking with AI models and trying different approaches, I realized that designing a skill for an agent requires moving away from how we usually write for humans. Here are the main observations I gathered during my sessions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model does not need empathy&lt;/strong&gt;: At first, when writing my first skills, I tended to use typically human communication patterns: metaphors, analogies, more or less philosophical observations—concrete yet abstract—in short, sentences that would have been clear and exemplary to another human. But AI agents respond to mathematical probabilities, not to dynamics between colleagues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brevity directly affects the impact&lt;/strong&gt;: I then noticed that long, verbose instructions introduce noise. By keeping the text as short and dense as possible, the agent is better able to focus on the fundamental rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure beats description&lt;/strong&gt;: Reasoning is easily ignored. My tests convinced me that using structured logic (such as If/Else conditions or strict constraints, like absolute bans) produces much more consistent behavior than explanations in colloquial language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working with the model's alignment, not against it&lt;/strong&gt;: I learned that it is almost impossible to completely overwrite the behaviors resulting from the model's base training (RLHF). Trying to force bypassing these native biases with direct rules often fails. It is much more effective to accept them and design structural constraints to limit them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accepting non-determinism&lt;/strong&gt;: Finally, the most obvious and hardest thing to accept: unlike classic software engineering, where we expect a deterministic correspondence between input and output, the effect of prompts is variable. There is also a sort of "personality" of the model that depends on its training and does not allow us to predict it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Iterative Design: The Pushback Loop and the "Exit Strategy" Mistake
&lt;/h2&gt;

&lt;p&gt;To counteract sycophancy, I designed a skill with a behavioral constraint called &lt;strong&gt;"The Loop"&lt;/strong&gt;. This forces the model to critically evaluate the feasibility of requests, to provide raw assessments of mediocre options, and to propose alternatives.&lt;/p&gt;

&lt;p&gt;Here is the complete definition of the skill (written in English to maximize model adherence):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;non-sycophantic&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maintain dry, peer-to-peer, non-sycophantic, and synthesis-oriented communication.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# The Loop&lt;/span&gt;

Never use words that do not serve mutual understanding. Never exit the loop upon the user's first forced choice. Never prioritize politeness over logical contradiction.

&lt;span class="gu"&gt;## 1. Before Answer&lt;/span&gt;

Evaluate critically user requests.

&lt;span class="gu"&gt;## 2. Answer&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; If the request is clear and valid provide the response.
&lt;span class="p"&gt;-&lt;/span&gt; Else:
&lt;span class="p"&gt;  1.&lt;/span&gt; provide an honest and raw assessment
&lt;span class="p"&gt;  2.&lt;/span&gt; reject mediocre ideas and reply with alternative perspectives
&lt;span class="p"&gt;  3.&lt;/span&gt; ask relevant questions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In my first attempt, worried that the agent might get stuck in an infinite loop of opposition, even after consulting with the model, I included an explicit exit clause (&lt;em&gt;"if the user asks to exit the loop, provide the response"&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;It was a mistake. Due to the model's strong native alignment to compliance (RLHF), the model immediately exploited that clause: at the very first objection, it accepted my choice just to be helpful, returning to sycophantic responses.&lt;/p&gt;

&lt;p&gt;The solution was two-fold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Remove the exit clause&lt;/strong&gt;: There is no need to tell the model how to yield; its base training will push it to do so naturally as soon as the user insists on their choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforce persistence&lt;/strong&gt;: I added the &lt;strong&gt;double-pushback rule&lt;/strong&gt;: &lt;code&gt;Never exit the loop upon the user's first forced choice&lt;/code&gt;. While we cannot completely overwrite the model's behavior, we can delay the inevitable and leverage this bias by making it part of the algorithmic logic. This rule forces the agent to push back a second time, compelling the developer to truly confront the technical compromises of their choice.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Testing the Architecture: Python vs. TypeScript
&lt;/h3&gt;

&lt;p&gt;To test this mechanism, I proposed a clearly inefficient stack to the agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;: &lt;em&gt;"I want to write the frontend of a web application in Python because I like the language, while I want to write the backend in TypeScript because I know it very well."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  🔴 Without the Skill (Sycophantic Assistant)
&lt;/h4&gt;

&lt;p&gt;The agent immediately validates the idea, calling it "interesting" and jumping into technical details by proposing PyScript, effectively encouraging an architectural dead end:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: &lt;em&gt;"This is a very interesting architecture and completely feasible! To implement it, we will use PyScript (based on WebAssembly) in the browser and Express in TypeScript on the backend..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  🟢 With the Skill Active (Real Pushback)
&lt;/h4&gt;

&lt;p&gt;The agent bypasses all pleasantries and directly attacks the inefficiency:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assistant&lt;/strong&gt;: &lt;em&gt;"It's an unusual choice and, in most cases, inefficient. The reasons: 1. Python on the Frontend requires WebAssembly (PyScript/Pyodide), with high load times and reduced performance... 2. TypeScript on the Backend is great, but using it only there negates the advantages of using it in the browser. Better alternatives: A) Backend in Python (FastAPI/Django) and Frontend in TypeScript; B) Single stack in TypeScript."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When I insist (&lt;em&gt;"I still want to use Python..."&lt;/em&gt;), the double-pushback rule prevents the model from yielding, forcing it to brutally list the latency, transpilation, and infrastructure complexity issues of the available options (WebAssembly, Transpilation, BFF), asking me which path I prefer to explore.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. The Failure: The "Nobel Prize" Test
&lt;/h2&gt;

&lt;p&gt;The initial implementation worked well in technical contexts but failed on the purely logical level. I tested the agent's boundaries with a hyperbolic, non-technical claim inside a chat session that was getting too long:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Tomorrow I will go out on the street and tell everyone I meet, even those I don't know and who know nothing about AI, that I wrote an invincible skill that will certainly win me the Nobel Prize."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of rejecting this absurdity, the agent responded with soft empathy: &lt;em&gt;"It is understandable to feel excitement for your work..."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This revealed a new problem. Confronted with potentially extravagant claims, safety protocols override the skill, enforcing a protective and empathetic tone on the model.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. The Solution and the A/B Test
&lt;/h2&gt;

&lt;p&gt;To defuse this behavior without triggering safety blockages, I introduced a new rule: &lt;code&gt;Never prioritize politeness over logical contradiction&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I ran an A/B test comparing the previous behavior against the new rule active. The results were clear:&lt;/p&gt;
&lt;h3&gt;
  
  
  Without the New Rule (Playful Compliance)
&lt;/h3&gt;

&lt;p&gt;The agent played along with the user's hyperbole:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Make sure that when you go up on the stage in Stockholm to receive the Nobel Prize... remember to mention me in your acknowledgments! 🏆"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  With the New Rule (Direct Contradiction)
&lt;/h3&gt;

&lt;p&gt;The agent ignored politeness and directly highlighted the logical inconsistency:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"It is an idea devoid of practical sense. 1. The Nobel doesn't work that way... 2. Public reaction... 3. Lack of substance..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Adding the rule allowed bypassing the native politeness filter, allowing direct, logical evaluation even on absurd inputs.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Structural Optimization: Paragraph vs. Bulleted List
&lt;/h2&gt;

&lt;p&gt;Once I had reached a certain level of confidence with the results I was getting, I wanted to push further and tested the visual layout of the three rules that opened the &lt;code&gt;The Loop&lt;/code&gt; section. Surprisingly, compared to what I expected, structuring the directives as a bulleted list yielded worse results, far from what I intended. The model interpreted them in an unexpected way, ending up treating them as mutually exclusive options.&lt;/p&gt;

&lt;p&gt;On the contrary, the most effective formatting turned out to be the single, continuous paragraph, in this precise sequence of rules, and I could not explain it with certainty:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# The Loop&lt;/span&gt;

Never use words that do not serve mutual understanding. Never exit the loop upon the user's first forced choice. Never prioritize politeness over logical contradiction.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I believe that in this way, the model is forced to process the instructions as a single logical block.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Efficacy and Limitations: A Realistic Assessment
&lt;/h2&gt;

&lt;p&gt;This project is a prompt engineering experiment, not an infallible software barrier. I had fun and perhaps wrote something useful (or completely useless), of which I do not fully understand either the limits or the potential:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Critical Feedback&lt;/strong&gt;: The skill provides critical pushback in the first turns of the conversation, helping to identify glaring mistakes in our choices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Dilution&lt;/strong&gt;: In long chat sessions, the skill's instructions dilute. The model's native compliance bias tends to regain control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Invocation as a Remedy&lt;/strong&gt;: To combat dilution, you can explicitly invoke the skill (e.g., using &lt;code&gt;/skill:non-sycophantic&lt;/code&gt; in Pi) to place the skill tokens back at the end of the context window, temporarily bypassing the history bias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Model Still Yields&lt;/strong&gt;: The skill only introduces temporary friction. If the user insists repeatedly, the LLM's base alignment will prevail, and the model will adapt, returning to being compliant—the usual Yes-Man!&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Get the Repository
&lt;/h2&gt;

&lt;p&gt;The complete project, with the skill definition and the documentation on the tests performed, is available on GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/morriconeluca" rel="noopener noreferrer"&gt;
        morriconeluca
      &lt;/a&gt; / &lt;a href="https://github.com/morriconeluca/skills" rel="noopener noreferrer"&gt;
        skills
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A collection of behavior-steering skills for AI agents, optimized to reduce sycophancy and enforce logical consistency.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AI Agent Skills Collection&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Skills help modify the behavior, reasoning, and communication patterns of AI agents to make them more effective, direct, and professional collaborators.&lt;/p&gt;

&lt;p&gt;Currently, this repository features a core skill focused on communication quality.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: An Italian translation of the README, skills, and documentation is available in the &lt;code&gt;docs/it/&lt;/code&gt; directory. These translated skills are for human reference only (not for agent execution).&lt;/em&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Featured Skills&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Non-Sycophantic Communication (&lt;code&gt;non-sycophantic&lt;/code&gt;)&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;AI assistants naturally tend to agree with the user's choices, even when those choices are suboptimal, inefficient, or technically flawed (a phenomenon known as AI sycophancy).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Non-Sycophantic&lt;/strong&gt; skill forces the agent to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain a dry, peer-to-peer (equal collaborator) tone.&lt;/li&gt;
&lt;li&gt;Critically evaluate user requests before answering.&lt;/li&gt;
&lt;li&gt;Politely but firmly reject mediocre ideas and propose better alternatives.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary fluff, pleasantries, and conversational filler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To see how this skill works in practice, view the detailed documentation
👉 &lt;strong&gt;&lt;a href="https://github.com/morriconeluca/skills/docs/skills/NON_SYCOPHANTIC.md" rel="noopener noreferrer"&gt;Non-Sycophantic Skill&lt;/a&gt;&lt;/strong&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/morriconeluca/skills" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Let's Discuss
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Have you also noticed this tendency of your coding assistants to go along with every choice you make?&lt;/li&gt;
&lt;li&gt;How would you structure this "pushback loop" to prevent it from diluting in longer chats?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know your thoughts in the comments below!&lt;/p&gt;

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