<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Colas.Nahaboo.net - ai</title>
    <subtitle>Colas Nahaboo personal site, with discussions about programming code, web and computing topics, surfing and SUPing, and various musings.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://colas.nahaboo.net/tags/ai/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://colas.nahaboo.net"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-08-15T00:00:00+00:00</updated>
    <id>https://colas.nahaboo.net/tags/ai/atom.xml</id>
    <entry xml:lang="en">
        <title>Bug reports: Favoring Prompt Requests over Pull Requests</title>
        <published>2026-08-15T00:00:00+00:00</published>
        <updated>2026-08-15T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://colas.nahaboo.net/blog/dont-do-pull-request-do-prompt-suggest/"/>
        <id>https://colas.nahaboo.net/blog/dont-do-pull-request-do-prompt-suggest/</id>
        
        <content type="html" xml:base="https://colas.nahaboo.net/blog/dont-do-pull-request-do-prompt-suggest/">&lt;p&gt;More and more often, I find a bug in some code that is not mine — often in a language or codebase I barely master. My reflex used to be to hack a fix anyway and send a pull request. But recently I spontaneously began to do the opposite: I let an AI agent fix the bug on a local copy, and instead of a pull request, I submitted the prompt I used — the one that seemed to fix the issue for me, passing the tests. An evolution of my &lt;a href=&quot;/blog/ai-without-ai&quot;&gt;AI without AI&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;I did this twice, recently: for the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/not-matthias/apollo/issues/183&quot;&gt;Apollo Zola theme&lt;/a&gt; and the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/co-l/openfox/issues/243&quot;&gt;Openfox AI harness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Which prompted me to wonder whether this practice already had a name. I found the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.coderabbit.ai/blog/show-me-the-prompt-what-to-know-about-prompt-requests&quot;&gt;CodeRabbit post on prompt requests&lt;/a&gt;, which was right on the spot, but nothing else. Hence this post, to draw attention to the matter.&lt;/p&gt;
&lt;h2 id=&quot;what&quot;&gt;What?&lt;a class=&quot;zola-anchor&quot; href=&quot;#what&quot; aria-label=&quot;Anchor link for: what&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The idea, in short: when you find a bug in a project, and you use an AI coding agent to fix it, &lt;strong&gt;do not submit the AI-generated pull request&lt;/strong&gt;. Submit the &lt;strong&gt;prompt&lt;/strong&gt; you used to fix the bug, with a comment that it seems to fix the bug on your setup, and passes the tests. Plus an overview of the useful info your AI investigation produced: the root cause analysis, the edge cases, the alternative paths tried.&lt;/p&gt;
&lt;p&gt;The maintainers can then run the prompt themselves, in the harness and the LLM they are comfortable with — not the one you happened to have at hand — refine it, grill the AI with a &lt;code&gt;grill-me&lt;/code&gt; style interrogation, and adjust it to their codebase. Instead of having the pain to review an unfamiliar PR.&lt;/p&gt;
&lt;p&gt;This is not my invention, the name already exists: &lt;strong&gt;prompt requests&lt;/strong&gt;. The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.coderabbit.ai/blog/show-me-the-prompt-what-to-know-about-prompt-requests&quot;&gt;CodeRabbit article&lt;/a&gt; traces the idea to a debate between &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://steipete.me/&quot;&gt;Peter Steinberger&lt;/a&gt;, creator of the self-hosted AI agent &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/clawdbot/clawdbot&quot;&gt;Clawdbot&lt;/a&gt;, and Gergely Orosz of &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.pragmaticengineer.com/&quot;&gt;Pragmatic Engineer&lt;/a&gt;.
At first I was going to call it &quot;PS&quot; for &lt;strong&gt;Prompt Suggest&lt;/strong&gt;, but let&#39;s not reinvent the wheel.&lt;/p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why?&lt;a class=&quot;zola-anchor&quot; href=&quot;#why&quot; aria-label=&quot;Anchor link for: why&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Maintainers are drowning in &lt;strong&gt;PR slop&lt;/strong&gt;: AI-generated code that compiles, passes CI, and is utterly wrong for the codebase — style drift, redundant helpers, subtle architectural shortcuts. The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://asdlc.io/concepts/pr-slop/&quot;&gt;asymmetric velocity problem&lt;/a&gt;: an agent generates code in seconds that takes a human hours to review.&lt;/p&gt;
&lt;p&gt;The numbers are staggering: GitHub merged pull requests went from &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.coderabbit.ai/blog/github-gives-maintainers-a-throttle-for-the-ai-pull-request&quot;&gt;25 million a month in January 2023 to 90 million a month in March 2026&lt;/a&gt;. A 3.6x increase, in an era where the number of human developers did not triple.&lt;/p&gt;
&lt;p&gt;The most spectacular example was the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.devclass.com/ai-ml/2025/11/27/ocaml-maintainers-reject-massive-ai-generated-pull-request/1728083&quot;&gt;13,000-line AI-generated pull request on the OCaml compiler&lt;/a&gt;, rejected by the maintainers, who cited the lack of review resources. The author, Joel Reymont, had &quot;carefully shepherded AI over the course of several days&quot;, and, asked why some files credited a maintainer as author, answered &quot;Beats me. AI decided to do so and I didn&#39;t question it.&quot;&lt;/p&gt;
&lt;p&gt;This is so bad that &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.blog/changelog/2026-02-13-new-repository-settings-for-configuring-pull-request-access&quot;&gt;GitHub now lets maintainers disable pull requests entirely&lt;/a&gt;, or restrict them to collaborators. Open source projects are starting to close their front door rather than drown.&lt;/p&gt;
&lt;p&gt;The root problem: &lt;strong&gt;code is now cheap&lt;/strong&gt;. As Jeremiah Lowin writes in &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://jlowin.dev/blog/oss-maintainers-guide-to-saying-no&quot;&gt;An Open-Source Maintainer&#39;s Guide to Saying No&lt;/a&gt;: &quot;Historically, we could assume that since writing code is an expensive, high-effort activity, contributors would engage in discussion before doing the work. Today, LLMs have inverted this. Code is now cheap, and we see it offered in lieu of discourse.&quot;&lt;/p&gt;
&lt;p&gt;Which prompted me to think: if the code is the cheap part, then the value of my contribution is not the diff — it is the investigation. The bug I found, the root cause my AI uncovered, the proof that a fix exists and passes the tests. And the prompt, which is the recipe to reproduce the investigation.&lt;/p&gt;
&lt;h2 id=&quot;how&quot;&gt;How?&lt;a class=&quot;zola-anchor&quot; href=&quot;#how&quot; aria-label=&quot;Anchor link for: how&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So here is what I think I will put from now on in a bug report instead of a pull request:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #4C4F69; background-color: #EFF1F5;&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: #D20F39;font-weight: bold;&quot;&gt;Bug&lt;/span&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span&gt;: [short description, with a reproduction]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: #D20F39;font-weight: bold;&quot;&gt;Prompt&lt;/span&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span&gt; (tested, fixes the bug on my setup, tests pass):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EA76CB;&quot;&gt;  &amp;gt; [the exact prompt(s) I gave to the agent]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: #D20F39;font-weight: bold;&quot;&gt;Harness / model&lt;/span&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span&gt;: opencode / DeepSeek v4 flash (or Claude Code / ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: #D20F39;font-weight: bold;&quot;&gt;Root cause&lt;/span&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span&gt;: [what the AI found]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: #D20F39;font-weight: bold;&quot;&gt;Edge cases&lt;/span&gt;&lt;span style=&quot;color: #7C7F93;&quot;&gt;**&lt;/span&gt;&lt;span&gt;: [what the AI&amp;#39;s analysis surfaced]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exact prompt is the key: like a minimal reproduction, it lets the maintainer run the fix in &lt;em&gt;his&lt;/em&gt; environment — the harness and model he trusts, in the context of his codebase. He can refine it, ask the AI questions, interrogate it about edge cases. I have a &lt;code&gt;grill-me&lt;/code&gt; skill in my own setup, I know it works :-)&lt;/p&gt;
&lt;h2 id=&quot;why-do-maintainers-should-like-it&quot;&gt;Why do maintainers should like it?&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-do-maintainers-should-like-it&quot; aria-label=&quot;Anchor link for: why-do-maintainers-should-like-it&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No trust question&lt;/strong&gt;: the code is generated in the maintainer&#39;s own sandbox, by his own model, with his own system prompts. The question is no longer &quot;do I trust this stranger&#39;s code?&quot; but &quot;does my setup produce a good fix for this prompt?&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture control&lt;/strong&gt;: the generated code follows the codebase conventions, because it is generated &lt;em&gt;in&lt;/em&gt; the codebase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The maintainer stays the author&lt;/strong&gt;: he is not inheriting 800 lines of alien code, he is applying an insight to his own project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the contributor still gets the satisfaction of having found and fixed the bug — which is the valuable part anyway.&lt;/p&gt;
&lt;h2 id=&quot;am-i-reinventing-the-wheel&quot;&gt;Am I reinventing the wheel?&lt;a class=&quot;zola-anchor&quot; href=&quot;#am-i-reinventing-the-wheel&quot; aria-label=&quot;Anchor link for: am-i-reinventing-the-wheel&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Partly. The CodeRabbit article is more cautious than me: it argues prompt requests and pull requests are &lt;strong&gt;not in conflict&lt;/strong&gt;, and prompt requests work best &lt;em&gt;before&lt;/em&gt; pull requests — review the intent before generating, then still review the code that ships. That makes sense &lt;em&gt;within a team&lt;/em&gt;, where you will have to maintain the result, and where determinism, git blame and accountability matter.&lt;/p&gt;
&lt;p&gt;My point is narrower, and for a different case: the &lt;strong&gt;drive-by contribution&lt;/strong&gt;. When you fix a bug in a project that is not yours, and you have no intention to maintain the result — which is most bug reports — the prompt is a better unit of exchange than the diff. It is the &lt;a href=&quot;/blog/ai-without-ai&quot;&gt;AI without AI&lt;/a&gt; of bug fixing: I provide the prompt, you run it in your own wetware (or your own GPU).&lt;/p&gt;
&lt;p&gt;There are cases where a PR is still better: the trivial one-line fix, the case where you &lt;em&gt;will&lt;/em&gt; maintain the fix, or the project that explicitly asks for PRs. Use your judgment.&lt;/p&gt;
&lt;p&gt;So, next time your AI agent fixes a bug in somebody else&#39;s project: resist the urge to &lt;code&gt;git push&lt;/code&gt;. Open an issue, and give the maintainers the prompt. They will be grateful, and the code will be better for it.&lt;/p&gt;
&lt;p&gt;Maybe a  modern twist on the old saying &quot;dont give fishes, show how to fish&quot;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>AI without AI</title>
        <published>2026-08-08T00:00:00+00:00</published>
        <updated>2026-08-08T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://colas.nahaboo.net/blog/ai-without-ai/"/>
        <id>https://colas.nahaboo.net/blog/ai-without-ai/</id>
        
        <content type="html" xml:base="https://colas.nahaboo.net/blog/ai-without-ai/">&lt;p&gt;Generative AI is currently morally bad, as most of it steals copyrighted works — but it would still be useful for people like me with no drawing skills. So I am increasingly using &lt;strong&gt;&quot;AI without AI&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That is, I just post the prompt I would have used with a generative AI, and let the reader use his own wetware (aka &quot;Brain&quot;) — the &lt;strong&gt;NI&lt;/strong&gt; &lt;em&gt;(Natural Imagination)&lt;/em&gt; — to visualize the picture.&lt;/p&gt;
&lt;p&gt;As an example, in a reply to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://bsky.app/profile/scalzi.com/post/3mruuefb7gs2a&quot;&gt;John Scalzi&#39;s post on Bluesky&lt;/a&gt; I described the book cover instead of generating it via AI:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And for some AI-without-AI, here is the prompt to generate the cover in your own wetware (aka &quot;Brain&quot;):
&lt;em&gt;«A book cover for the next Sci-Fi humoristic novel of the fictional author John Barefoot titled &#39;The Brother Laser Printer Aficionados&#39;»&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The nice thing about running prompts on your wetware is that the model is local, free, and the output stays in your head. No credits, no seed, no style references, infinite resolution, perfect privacy. It renders instantly — the only downside being that nobody else gets to see the result.&lt;/p&gt;
&lt;p&gt;Also, it is something that has bothered me for a long time. As a boy, I was struck that during his famous 65-day survival drift across the Atlantic Ocean in 1952, narrated in his book &lt;em&gt;Naufragé Volontaire&lt;/em&gt;, French physician and adventurer Alain Bombard — aboard his boat &lt;em&gt;l&#39;Hérétique&lt;/em&gt; — took only a few personal items, including a pocket score of Beethoven&#39;s string quartets (specifically the 15th String Quartet in A minor, Op. 132) alongside Bach&#39;s Passions. He recounted that studying and mentally playing this complex music helped keep him sane and motivated during extreme isolation and hardship.&lt;/p&gt;
&lt;p&gt;I loved listening to Beethoven, but I could not fathom somebody actually &quot;listening&quot; by merely reading the score. It turns out he was doing AI-without-AI, ... decades before AI.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Migration of this site to the new Zola Tera2</title>
        <published>2026-08-06T00:00:00+00:00</published>
        <updated>2026-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://colas.nahaboo.net/blog/migration-of-this-site-to-the-new-zola-tera2/"/>
        <id>https://colas.nahaboo.net/blog/migration-of-this-site-to-the-new-zola-tera2/</id>
        
        <content type="html" xml:base="https://colas.nahaboo.net/blog/migration-of-this-site-to-the-new-zola-tera2/">&lt;p&gt;I migrated this site to &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt; 0.23, released yesterday with the new &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://keats.github.io/tera/&quot;&gt;Tera 2&lt;/a&gt; template engine (Well, 0.23.1 from today actually). When I &lt;a href=&quot;/blog/a-new-version-of-the-site-for-2026-in-zola/&quot;&gt;chose Zola&lt;/a&gt; last March, I praised its creator for not chasing the latest fad. I stand by it: 0.23 breaks my templates, but it does it in a cleaner way.&lt;/p&gt;
&lt;p&gt;Tera 2 removes the old macros and imports, and Zola 0.23 removes the shortcodes. Everything is now a namespaced &lt;strong&gt;component&lt;/strong&gt;. A macro that I used to import and call like this:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #4C4F69; background-color: #EFF1F5;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% import &amp;quot;macros.html&amp;quot; as utils %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% macro show_link(url) %}&amp;lt;a href=&amp;quot;{{ url }}&amp;quot;&amp;gt;{{ url }}&amp;lt;/a&amp;gt;{% endmacro %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{ utils::show_link(url=link) }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;is now a global component with no import at all:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #4C4F69; background-color: #EFF1F5;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% component site.show_link(url) %}&amp;lt;a href=&amp;quot;{{ url }}&amp;quot;&amp;gt;{{ url }}&amp;lt;/a&amp;gt;{% endcomponent %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{&amp;lt;site.show_link url={link} /&amp;gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The big philosophical change: components are global and no longer inherit the caller context. Every variable — &lt;code&gt;page&lt;/code&gt;, &lt;code&gt;section&lt;/code&gt;, &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;current_path&lt;/code&gt; — must be passed explicitly as an argument. More verbose, but it makes dependencies visible. I like that more and more: one way to do it, and it is visible.&lt;/p&gt;
&lt;p&gt;Tera 2 is also &lt;strong&gt;strict&lt;/strong&gt;: a missing variable is now a hard error. My templates use optional chaining (&lt;code&gt;?.&lt;/code&gt;) for anything optional, which catches typos at build time instead of silently rendering broken pages.&lt;/p&gt;
&lt;p&gt;What concretely changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;concat&lt;/code&gt; and &lt;code&gt;slice&lt;/code&gt; filters are gone → array spread and slicing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_env&lt;/code&gt; is gone → &lt;code&gt;config.mode == &quot;serve&quot;&lt;/code&gt; for local editor links&lt;/li&gt;
&lt;li&gt;&lt;code&gt;include ... ignore missing&lt;/code&gt; is invalid → empty hook templates&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_page&lt;/code&gt; with &lt;code&gt;fatal=false&lt;/code&gt; → canonical path with &lt;code&gt;lang&lt;/code&gt; and &lt;code&gt;allow_missing=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_taxonomy_url&lt;/code&gt; with &lt;code&gt;name&lt;/code&gt; → &lt;code&gt;term&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://github.com/keats/tera/blob/master/MIGRATION.md&quot;&gt;migration guide&lt;/a&gt; was my best map through all of this.&lt;/p&gt;
&lt;p&gt;I use the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.getzola.org/themes/apollo/&quot;&gt;Apollo&lt;/a&gt; theme as a git submodule, and as it does not support Zola 0.23 yet, I keep a small local template-only patch of it until upstream migrates. The design, CSS, and JavaScript are untouched: this was a syntax migration, not a redesign, and I did not rewrite my post contents either.&lt;/p&gt;
&lt;h2 id=&quot;use-of-ai&quot;&gt;Use of AI&lt;a class=&quot;zola-anchor&quot; href=&quot;#use-of-ai&quot; aria-label=&quot;Anchor link for: use-of-ai&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I chose to have AI help me migrate my site. It worked flawlessly, so I encourage you to do the same. AI work especially well with Zola, as it is opinionated, and that means that there are clear ways of doing things so that AI agents do not get lost in rabbit holes trying to pursue all the possibilities of more flexible systems like Hugo.&lt;/p&gt;
&lt;p&gt;For reference here is the first prompt I gave it to prepare the plan for the migration:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #4C4F69; background-color: #EFF1F5;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;I want you to only create a document for agents ai/agents/tera2.md to summarize&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;how tera2 of Zola 0.23 differs from tera1 of Zola 0.22, and the plan to migrate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;my site from Zola 0.23 to 0.22.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Examine the differences between Zola 0.22 and 0.23, not just tera.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Docs:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Tera2 https://keats.github.io/tera/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Migration guide Tera1 → Tera2 https://github.com/Keats/tera/blob/master/MIGRATION.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Zola 0.23 docs https://www.getzola.org/documentation/getting-started/overview/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Take your time, be thourough, but do not modify yet any file of my site except&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;the ones in ai/agents/ and AGENTS.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Then, plan the migration of this site to zola 0.23&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. not modifying the contents of the posts unless necessary for tera2 changes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. not changing the look and feel, the UI of the site&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. adapting the various templates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4. changing my local copy of the Apollo theme I use if needed.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   These changes are a stopgap measure until upstream apollo is migrated to Zola 0.23&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I use Deepseek v4 flash normally, but chose to use GPT-5.6 Luna for this migration as it is currently quite cheap and I trust it more to not go change unecessary files. And Deepseek as no vision, so it cannot check the actual visual results of changes. It helped me greatly for this migration, without any problems.&lt;/p&gt;
&lt;h3 id=&quot;summary-of-ai-actions&quot;&gt;Summary of AI actions:&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary-of-ai-actions&quot; aria-label=&quot;Anchor link for: summary-of-ai-actions&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Replaced Tera 1 macros, imports, &lt;code&gt;self::&lt;/code&gt; calls, and macro namespaces with
namespaced Tera 2 components in the root templates and Apollo templates.&lt;/li&gt;
&lt;li&gt;Converted the local language-listing, page, navigation, debug, file
inclusion, and section-name helpers to components.&lt;/li&gt;
&lt;li&gt;Converted the site shortcode implementations to components in
&lt;code&gt;templates/macros/shortcodes.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Converted active post calls from the removed Zola shortcode syntax to Tera 2
component syntax. This includes YouTube, snapshots, attachments, Mermaid,
static-file inclusion, legacy overlays, obsolete notices, and SVG icons.&lt;/li&gt;
&lt;li&gt;Passed explicit &lt;code&gt;base_path&lt;/code&gt; values to components that used to receive
&lt;code&gt;page.path&lt;/code&gt; implicitly from Zola shortcodes.&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;get_page&lt;/code&gt; calls to use the canonical path with &lt;code&gt;lang=&quot;fr&quot;&lt;/code&gt; and
&lt;code&gt;allow_missing=true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;get_taxonomy_url&lt;/code&gt; calls from &lt;code&gt;name&lt;/code&gt; to &lt;code&gt;term&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Replaced the removed &lt;code&gt;get_env&lt;/code&gt; call with &lt;code&gt;config.mode == &quot;serve&quot;&lt;/code&gt; for the
local editor links.&lt;/li&gt;
&lt;li&gt;Replaced the removed &lt;code&gt;concat&lt;/code&gt; and &lt;code&gt;slice&lt;/code&gt; filters with Tera 2 array spread
and slicing, and changed the &lt;code&gt;object&lt;/code&gt; test to &lt;code&gt;map&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added empty Apollo hook templates because Tera 2 no longer accepts
&lt;code&gt;include ... ignore missing&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;dev/bin/site-check&lt;/code&gt; to recognize the new legacy component syntax.&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;static/ZOLA&lt;/code&gt; to &lt;code&gt;zola 0.23.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
