<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Marco Santelli</title>
        <link>https://marcosantelli.com/writing</link>
        <description>Essays on AI, knowledge management, agentic frameworks, and building digital products.</description>
        <lastBuildDate>Mon, 13 Apr 2026 16:20:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>© 2026 Marco Santelli. All rights reserved.</copyright>
        <item>
            <title><![CDATA[Designing for agentic systems is mostly bookkeeping]]></title>
            <link>https://marcosantelli.com/writing/test-post-kitchen-sink</link>
            <guid>https://marcosantelli.com/writing/test-post-kitchen-sink</guid>
            <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A test post that exercises every element type — headings, code blocks, blockquotes, images, video links, lists, tables. If something looks broken here, it'll look broken in production.]]></description>
            <content:encoded><![CDATA[<p>Most of what makes an agentic framework work in production isn't the model. It's the bookkeeping around it — what the agent is allowed to know, where its outputs go, and which decisions need a human signature before they leave the building.</p>
<p>This post is a kitchen-sink test for the blog renderer. Every element below should look intentional. If it doesn't, the styles need work.</p>
<h2>Headings carry the structure</h2>
<p>A second-level heading is the main divider in a long post. It should feel like a chapter break — visible in the table of contents but not shouty.</p>
<h3>Third-level headings</h3>
<p>These are for sub-points inside a section. They should be clearly subordinate to <code>h2</code>, not competing with it.</p>
<h4>Fourth-level</h4>
<p>Rare, but used occasionally for inline structure. Should still be readable.</p>
<h2>Inline formatting</h2>
<p>A paragraph can contain <strong>bold text</strong> for emphasis, <em>italic text</em> for tone, and <code>inline code</code> for technical references like <code>getRelatedPosts()</code> or environment variables like <code>SITE_URL</code>. Links should be obvious — like this one to the <a href="https://vike.dev">Vike documentation</a> — without screaming for attention.</p>
<p>You should also be able to use <del>strikethrough</del> when you change your mind mid-paragraph, and combine <strong>bold <em>and italic</em></strong> if the moment calls for it.</p>
<h2>Code blocks</h2>
<p>Here's a TypeScript example. Syntax highlighting comes from Shiki at build time, so there's no client-side highlighter to ship.</p>
<pre data-language="typescript" class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#F97583">import</span><span style="color:#E1E4E8"> { useData } </span><span style="color:#F97583">from</span><span style="color:#9ECBFF"> "vike-react/useData"</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#F97583"> type</span><span style="color:#E1E4E8"> { BlogPost } </span><span style="color:#F97583">from</span><span style="color:#9ECBFF"> "../../data/blog-types"</span><span style="color:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> getRelatedPosts</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">slug</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">limit</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> 3</span><span style="color:#E1E4E8">)</span><span style="color:#F97583">:</span><span style="color:#B392F0"> BlogPost</span><span style="color:#E1E4E8">[] {</span></span>
<span class="line"><span style="color:#F97583">  const</span><span style="color:#79B8FF"> current</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> posts.</span><span style="color:#B392F0">find</span><span style="color:#E1E4E8">((</span><span style="color:#FFAB70">p</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> p.slug </span><span style="color:#F97583">===</span><span style="color:#E1E4E8"> slug);</span></span>
<span class="line"><span style="color:#F97583">  if</span><span style="color:#E1E4E8"> (</span><span style="color:#F97583">!</span><span style="color:#E1E4E8">current) </span><span style="color:#F97583">return</span><span style="color:#E1E4E8"> [];</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">  return</span><span style="color:#E1E4E8"> posts</span></span>
<span class="line"><span style="color:#E1E4E8">    .</span><span style="color:#B392F0">filter</span><span style="color:#E1E4E8">((</span><span style="color:#FFAB70">p</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> p.slug </span><span style="color:#F97583">!==</span><span style="color:#E1E4E8"> slug)</span></span>
<span class="line"><span style="color:#E1E4E8">    .</span><span style="color:#B392F0">map</span><span style="color:#E1E4E8">((</span><span style="color:#FFAB70">p</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> ({</span></span>
<span class="line"><span style="color:#E1E4E8">      post: p,</span></span>
<span class="line"><span style="color:#E1E4E8">      score:</span></span>
<span class="line"><span style="color:#E1E4E8">        p.tags.</span><span style="color:#B392F0">filter</span><span style="color:#E1E4E8">((</span><span style="color:#FFAB70">t</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> current.tags.</span><span style="color:#B392F0">includes</span><span style="color:#E1E4E8">(t)).</span><span style="color:#79B8FF">length</span><span style="color:#F97583"> +</span></span>
<span class="line"><span style="color:#E1E4E8">        (p.category </span><span style="color:#F97583">===</span><span style="color:#E1E4E8"> current.category </span><span style="color:#F97583">?</span><span style="color:#79B8FF"> 1</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">),</span></span>
<span class="line"><span style="color:#E1E4E8">    }))</span></span>
<span class="line"><span style="color:#E1E4E8">    .</span><span style="color:#B392F0">filter</span><span style="color:#E1E4E8">(({ </span><span style="color:#FFAB70">score</span><span style="color:#E1E4E8"> }) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> score </span><span style="color:#F97583">></span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">    .</span><span style="color:#B392F0">sort</span><span style="color:#E1E4E8">((</span><span style="color:#FFAB70">a</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">b</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> b.score </span><span style="color:#F97583">-</span><span style="color:#E1E4E8"> a.score)</span></span>
<span class="line"><span style="color:#E1E4E8">    .</span><span style="color:#B392F0">slice</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">0</span><span style="color:#E1E4E8">, limit)</span></span>
<span class="line"><span style="color:#E1E4E8">    .</span><span style="color:#B392F0">map</span><span style="color:#E1E4E8">(({ </span><span style="color:#FFAB70">post</span><span style="color:#E1E4E8"> }) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> post);</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<p>A shell example, for completeness:</p>
<pre data-language="bash" class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#B392F0">npm</span><span style="color:#9ECBFF"> run</span><span style="color:#9ECBFF"> build:blog</span></span>
<span class="line"><span style="color:#B392F0">npm</span><span style="color:#9ECBFF"> run</span><span style="color:#9ECBFF"> build</span></span>
<span class="line"><span style="color:#B392F0">npx</span><span style="color:#9ECBFF"> wrangler</span><span style="color:#9ECBFF"> pages</span><span style="color:#9ECBFF"> deploy</span><span style="color:#9ECBFF"> dist/client</span></span>
<span class="line"></span></code></pre>
<p>And a JSON example showing what the manifest looks like:</p>
<pre data-language="json" class="shiki github-dark" style="background-color:#24292e;color:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF">  "posts"</span><span style="color:#E1E4E8">: [</span></span>
<span class="line"><span style="color:#E1E4E8">    {</span></span>
<span class="line"><span style="color:#79B8FF">      "slug"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"test-post-kitchen-sink"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">      "title"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Designing for agentic systems is mostly bookkeeping"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">      "date"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"2026-04-11"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF">      "tags"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"ai"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"agentic-frameworks"</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#E1E4E8">    }</span></span>
<span class="line"><span style="color:#E1E4E8">  ]</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<h2>Blockquotes</h2>
<p>Blockquotes are for the moments when somebody else said it better, or when you want to slow the reader down for a paragraph.</p>
<blockquote>
<p>The first principle is that you must not fool yourself — and you are the easiest person to fool. Most production agent failures I've seen start with a developer convincing themselves the system "basically works" because the happy path passes.</p>
</blockquote>
<p>Multi-paragraph quotes also work:</p>
<blockquote>
<p>Knowledge management isn't a tool problem. It's a discipline problem.</p>
<p>The teams that win at it are the ones who treat the lifecycle of a fact — capture, review, decay, retirement — as seriously as they treat the lifecycle of a feature.</p>
</blockquote>
<h2>Lists</h2>
<p>Unordered lists, for parallel ideas:</p>
<ul>
<li>Capture happens at the boundary, not inside the agent</li>
<li>Review is a separate step with separate tooling</li>
<li>Decay is automatic unless someone re-confirms</li>
<li>Retirement is explicit and audited</li>
</ul>
<p>Ordered lists, for sequences:</p>
<ol>
<li>Define what the agent is allowed to know</li>
<li>Define where its outputs are allowed to go</li>
<li>Define which decisions need a human in the loop</li>
<li>Wire the audit trail before you wire the model</li>
</ol>
<p>Nested lists, when the structure demands it:</p>
<ul>
<li><strong>Capture stage</strong>
<ul>
<li>From conversation logs</li>
<li>From git history</li>
<li>From code review comments</li>
</ul>
</li>
<li><strong>Review stage</strong>
<ul>
<li>Automatic dedup</li>
<li>Human approval for novel claims</li>
<li>Promotion to canonical KB</li>
</ul>
</li>
</ul>
<h2>Images</h2>
<p>Cover images and inline images both render through the same path. Here's an inline placeholder you can swap with a real asset later:</p>
<p><img src="https://images.unsplash.com/photo-1518770660439-4636190af475?w=1200&#x26;h=600&#x26;fit=crop" alt="A diagram showing data flow through an agentic system"></p>
<p>The image gets a soft shadow and rounded corners automatically. No need to remember the wrapper class.</p>
<h2>Video links</h2>
<p>YouTube and Vimeo links render as plain links in markdown. For now, embed by pasting the URL on its own line:</p>
<p><a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ">Watch the talk: Designing agentic systems for production</a></p>
<p>A future version of this site can auto-detect video URLs and replace them with <code>&#x3C;iframe></code> embeds during the build step. For now, treat them as link cards.</p>
<h2>Tables</h2>
<p>Tables are for comparisons that don't fit a sentence:</p>
<table>
<thead>
<tr>
<th>Pattern</th>
<th>Where it lives</th>
<th>Audit cost</th>
<th>When to use</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tool call</td>
<td>Inside the agent</td>
<td>Low</td>
<td>Read-only operations</td>
</tr>
<tr>
<td>Action proposal</td>
<td>Outside the agent</td>
<td>Medium</td>
<td>Writes, sends, deletions</td>
</tr>
<tr>
<td>Human-in-the-loop</td>
<td>Outside the agent</td>
<td>High</td>
<td>Anything that touches prod</td>
</tr>
<tr>
<td>Async signed action</td>
<td>Outside the agent</td>
<td>High</td>
<td>Cross-team boundaries</td>
</tr>
</tbody>
</table>
<h2>Horizontal rules</h2>
<p>Sometimes the structure needs a hard break.</p>
<hr>
<p>After the rule, you should feel like you've moved to a different beat. Use sparingly.</p>
<h2>Closing thoughts</h2>
<p>If everything above renders cleanly — headings step down properly, code blocks have a dark background and syntax colors, the blockquote has its indigo bar, tags appear as pills below the title, and the images have rounded corners with a soft shadow — the renderer is in good shape.</p>
<p>If something looks off, fix it here before the first real post. The goal is that every future post can focus on the writing, not the styling.</p>
]]></content:encoded>
            <category>ai</category>
            <category>agentic-frameworks</category>
            <category>knowledge-management</category>
            <category>governance</category>
        </item>
    </channel>
</rss>