<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ai-coding-agents on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/ai-coding-agents/</link>
    <description>Recent content in ai-coding-agents on S Anand</description>
    <generator>Hugo -- 0.156.0</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 12 Jul 2026 16:25:50 +0530</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/ai-coding-agents/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Creating a scrollytelling map</title>
      <link>https://www.s-anand.net/blog/creating-a-scrollytelling-map/</link>
      <pubDate>Sun, 12 Jul 2026 16:25:50 +0530</pubDate>
      <guid>https://www.s-anand.net/blog/creating-a-scrollytelling-map/</guid>
      <description>&lt;p&gt;I had Claude Code with Fable create a small scrollytelling map for my &lt;a href=&#34;https://sanand0.github.io/datastories/security-at-bagmane-capital/&#34;&gt;14-minute walk&lt;/a&gt; experience at &lt;a href=&#34;https://www.s-anand.net/blog/security-at-bagmane-capital/&#34;&gt;Bagmane Capital&lt;/a&gt; in Bangalore.&lt;/p&gt;
&lt;p&gt;I used this as an opportunity to explore the current status of the technology. &lt;a href=&#34;https://chatgpt.com/share/6a537375-5308-83ee-ab03-00e39d8cc05a&#34;&gt;ChatGPT&lt;/a&gt; suggested: &lt;!-- https://chatgpt.com/c/6a520c51-2e08-83e8-8073-a1b703bdd45c --&gt;&lt;/p&gt;
&lt;section ai-disclosure=&#34;ai-generated&#34; data-ai-model=&#34;gpt-5.6-sol&#34; data-ai-provider=&#34;OpenAI&#34;&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Try ArcGIS StoryMaps first&lt;/strong&gt; for a polished scrollytelling story.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Try Google Earth Projects&lt;/strong&gt; if this is primarily something you will present live, like a map-based slide deck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use MapLibre GL JS with a coding agent&lt;/strong&gt; if you want precise choreography, animated routes, unusual visual effects, or an asset you can continually extend.&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
&lt;p&gt;None of these fit my requirements, which was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hostable, self-contained, on GitHub Pages&lt;/li&gt;
&lt;li&gt;Forever free tiles, to the extent possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Based on its recommendations, my workflow was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Capture locations in Google Maps&lt;/strong&gt;. Right-click and copy the latitude, longitude.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capture routes in &lt;a href=&#34;https://mymaps.google.com&#34;&gt;Google My Maps&lt;/a&gt;&lt;/strong&gt;. This was insight. MyMaps lets you export driving, walking, and cycling routes as KML. (No bike routes, though.)&lt;/li&gt;
&lt;li&gt;Create a single-page index.html using &lt;strong&gt;MapLibre GL JS with a free OpenFreeMap basemap&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I &lt;a href=&#34;https://www.google.com/maps/d/u/0/edit?mid=1EmnW_jW6nP22MBJAlFg0R66CfBt9Fw8&#34;&gt;created the MyMaps routes&lt;/a&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.google.com/maps/d/u/0/edit?mid=1EmnW_jW6nP22MBJAlFg0R66CfBt9Fw8&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2026-07-12-creating-a-scrollytelling-map-google-mymaps.avif&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip; exported layers as KML files, and meta-prompted Codex with my story written in this form:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;I was staying at [&lt;span class=&#34;nt&#34;&gt;The Curzon Court, Brigade Road&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://maps.app.goo.gl/ArHn75eAihHzZXcr9&lt;/span&gt;). 12.97454856819103, 77.60788450296555
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;I needed to be at [&lt;span class=&#34;nt&#34;&gt;Microsoft Luxor North Tower&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://maps.app.goo.gl/Tf5qZGwXogetSJr46&lt;/span&gt;) 12.984402817080221, 77.70407412470264
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;for a 2 pm [&lt;span class=&#34;nt&#34;&gt;workshop&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://hasgeek.com/fifthelephant/when-data-is-for-agents-workshop/&lt;/span&gt;).
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;So I came over to [&lt;span class=&#34;nt&#34;&gt;Seetharampalya Metro Station&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://maps.app.goo.gl/Z4deFUzZsqamcCZC9&lt;/span&gt;) 12.98116461318051, 77.70872373073122
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;and seated myself at [&lt;span class=&#34;nt&#34;&gt;Fairfield by Marriott&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;https://maps.app.goo.gl/NJqUfFnHL4QW8xa2A&lt;/span&gt;) 12.981961760138114, 77.70869689674738
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;by 11 am.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; and also attached a series of &lt;code&gt;.kml&lt;/code&gt; files for the routes. The generated prompt had some &lt;em&gt;nice&lt;/em&gt; suggestions, such as:&lt;/p&gt;
&lt;section ai-disclosure=&#34;ai-generated&#34; data-ai-model=&#34;gpt-5.6-sol&#34; data-ai-provider=&#34;OpenAI&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Break the story into well-paced scenes, preserving its dry, escalating humour.&lt;/li&gt;
&lt;li&gt;Make time pressure visible through restrained clocks, timestamps, distance and ETA annotations.&lt;/li&gt;
&lt;li&gt;Build tension toward the late arrival, then treat the security confrontation with deadpan repetition.&lt;/li&gt;
&lt;li&gt;End quietly and anticlimactically at Bug &amp;amp; Bean with the peri peri paneer sandwich.&lt;/li&gt;
&lt;li&gt;&amp;hellip; etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;But one interesting idea I didn&amp;rsquo;t explore was to &amp;ldquo;Have the coding agent add an authoring mode&amp;rdquo;, specifically:&lt;/p&gt;
&lt;section ai-disclosure=&#34;ai-generated&#34; data-ai-model=&#34;gpt-5.6-sol&#34; data-ai-provider=&#34;OpenAI&#34;&gt;
&lt;p&gt;In authoring mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clicking the map copies &lt;code&gt;[longitude, latitude]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy camera&lt;/strong&gt; copies the current center, zoom, bearing and pitch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy visible bounds&lt;/strong&gt; copies southwest and northeast coordinates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Import KML/GeoJSON&lt;/strong&gt; previews routes.&lt;/li&gt;
&lt;li&gt;Selecting a route offers &lt;strong&gt;Create fit chapter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clicking a marker offers &lt;strong&gt;Create point chapter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A panel shows the exact chapter JSON.&lt;/li&gt;
&lt;li&gt;Pressing &lt;code&gt;C&lt;/code&gt; copies the current camera.&lt;/li&gt;
&lt;li&gt;Pressing &lt;code&gt;P&lt;/code&gt; creates a placemark.&lt;/li&gt;
&lt;li&gt;Pressing &lt;code&gt;B&lt;/code&gt; creates a fit-to-bounds instruction.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;This is a great idea - fairly easy to implement, meaning that I can even do away with map authoring software in the future.&lt;/p&gt;
&lt;p&gt;AI agents write software, but also know &lt;em&gt;what&lt;/em&gt; software features are useful. That makes taste more niche (i.e. I&amp;rsquo;ll use / buy your software if I already know and totally align with your taste, but otherwise, I&amp;rsquo;ll mix-and-match and build my own.)&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Arvind Satyanarayan talk at VizChitra 2026</title>
      <link>https://www.s-anand.net/blog/arvind-satyanarayan-talk-at-vizchitra-2026/</link>
      <pubDate>Wed, 24 Jun 2026 09:29:20 +0800</pubDate>
      <guid>https://www.s-anand.net/blog/arvind-satyanarayan-talk-at-vizchitra-2026/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2026-06-24-arvind-satyanarayan-talk-at-vizchitra-2026.avif&#34;&gt;&lt;/p&gt;
&lt;p&gt;On Sat 4 July at Bangalore, &lt;a href=&#34;https://arvindsatya.com/&#34;&gt;Arvind Satyanarayan&lt;/a&gt; is speaking at &lt;a href=&#34;https://vizchitra.com/2026&#34;&gt;VizChitra 2026&lt;/a&gt; - a talk I&amp;rsquo;m keenly looking forward to.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been following Arvind&amp;rsquo;s work since &lt;a href=&#34;https://vega.github.io/vega-lite/&#34;&gt;Vega-Lite&lt;/a&gt;. It&amp;rsquo;s a grammar of graphics - something that makes data visualizations (charts) more structured. I tried switching to it our default at &lt;a href=&#34;https://gramener.com/&#34;&gt;Gramener&lt;/a&gt; - but most felt it was too much to learn (they already knew Excel/Power BI) or too limiting (D3 can do more).&lt;/p&gt;
&lt;p&gt;With AI coding agents, the learning is less relevant - AI will write the code. So, do grammars have less relevance? Arvind&amp;rsquo;s talk is about how they might actually be more important - maybe like a structured way to prompt.&lt;/p&gt;
&lt;p&gt;Quite looking forward to this. Do attend if you&amp;rsquo;re interested in the cutting edge of AI-driven chart generation.&lt;/p&gt;
&lt;p&gt;Here are some questions I hope to ask Arvind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When someone hits the limit of a visualization grammar, but they know &lt;em&gt;exactly&lt;/em&gt; what they want, what &amp;ldquo;escape&amp;rdquo; or extension mechanisms have you found most intuitive and useful?&lt;/li&gt;
&lt;li&gt;With &lt;a href=&#34;https://gofish.graphics/&#34;&gt;GoFish&lt;/a&gt;, you re-built a grammar rather than updating one. Why? I mean, what smells or gaps in existing grammars made you decide that way?&lt;/li&gt;
&lt;li&gt;When &lt;em&gt;YOU&lt;/em&gt; find a grammar limiting you, what tool(s) do you turn to today - and how do you work with them?&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- https://claude.ai/chat/f24ac627-9417-4142-a66f-8368e6df729b + https://chatgpt.com/c/6a3b18ea-ba8c-83e8-b451-59f3f647621a --&gt;
</description>
    </item>
    <item>
      <title>Using Codex as my OS</title>
      <link>https://www.s-anand.net/blog/using-codex-as-my-os/</link>
      <pubDate>Thu, 23 Apr 2026 21:06:28 -0400</pubDate>
      <guid>https://www.s-anand.net/blog/using-codex-as-my-os/</guid>
      <description>&lt;p&gt;Increasingly, I&amp;rsquo;m using Codex (or other AI coding agents) as the &amp;ldquo;operating system&amp;rdquo; to run programs. That is, rather than directly run programs, I have the coding agent run the program.&lt;/p&gt;
&lt;p&gt;Advantage: If the program breaks, or needs a configuration change, the coding agent debugs it and fixes it. I don&amp;rsquo;t need to do anything.&lt;/p&gt;
&lt;p&gt;This is particularly useful for installation. For example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Install demucs and run it against my music folder.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s also useful for brittle scripts. When my WhatsApp scraper broke, I told Codex:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The scraper was working fine but today, it fails. Find out what changed in the WhatsApp Web UI and fix it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Codex researched and replied:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The current scraper still finds the chat area and message rows, but its row-identity parser is now invalid. On March 28 the code assumed each message node had a packed &lt;code&gt;data-id&lt;/code&gt; like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;true_&amp;lt;chat-id&amp;gt;@..._&amp;lt;message-id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;false_&amp;lt;chat-id&amp;gt;@..._&amp;lt;message-id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Today, in the live WhatsApp tab, the visible message nodes still exist under &lt;code&gt;#main [role=&amp;quot;row&amp;quot;]&lt;/code&gt;, but &lt;code&gt;data-id&lt;/code&gt; now looks like a bare message ID:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3A4689CE2A81856D4BB0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ACED689BB5C3115D3DD361F3520F9ECE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because &lt;code&gt;parseDataId()&lt;/code&gt; only accepts the old packed format, it rejects every row, so &lt;code&gt;whatsappMessages()&lt;/code&gt; returns &lt;code&gt;[]&lt;/code&gt;, and the bookmarklet shows &lt;code&gt;Copy 0 messages&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;WhatsApp appears to have split what used to be one overloaded field into separate concerns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data-id&lt;/code&gt; now behaves like &lt;code&gt;messageId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;outgoing direction is likely encoded by DOM class (&lt;code&gt;.message-out&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;chat/thread id is no longer bundled into the row &lt;code&gt;data-id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; and went on to share a &amp;ldquo;Recommended hardening plan for future breakages&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;If coding agents can install, configure, write, run, test, and debug programs, &amp;ldquo;Agentic Operating Systems&amp;rdquo; are not nearby. We already have them.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 02 Nov 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-02-nov-2025/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-02-nov-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.tvmaze.com/api&#34;&gt;TVMaze API&lt;/a&gt; is an API for TV shows, episodes, cast, crew, etc. Useful for TV-related apps as well as learning APIs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://skills.intellectronica.net/&#34;&gt;Awesome Skills&lt;/a&gt; is a curated list of prompts and skills for AI coding agents.&lt;/li&gt;
&lt;li&gt;⭐ &lt;a href=&#34;https://github.com/samrolken/nokode&#34;&gt;nokode&lt;/a&gt; is a API server that has no code: just LLMs responding. Interestingly, it is compliant. Just expensive, slow, forgetful and unreliable compared to code. All four are improving with time, indicating that coding may be transitional.&lt;/li&gt;
&lt;li&gt;Notes from &lt;a href=&#34;https://www.thoughtworks.com/profiles/v/vanya-seth&#34;&gt;Vanya Seth&lt;/a&gt;&amp;rsquo;s keynote at &lt;a href=&#34;https://hasgeek.com/fifthelephant/osai-hyd-meetup/schedule/ai-first-software-delivery-superpowers-adoption-challenges-and-the-path-to-software-3-0-5NgsrKyCWSJszHXvHKHkdW&#34;&gt;OSAI HYD&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Superpowers of Gen AI to keep in mind when exploring AI coding agent use cases:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Translating&lt;/strong&gt;. Requirements to code, code to code, language to queries, standard to standard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finding&lt;/strong&gt; info just-in-time (in context). How does this work? What&amp;rsquo;s this error? What tools are permitted in my org? Who knows what? E.g. &lt;a href=&#34;https://www.atlassian.com/software/rovo&#34;&gt;Atlassian Rovo&lt;/a&gt; queries &lt;em&gt;across&lt;/em&gt; JIRA, Confluence, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brainstorming&lt;/strong&gt; and ideation. Product ideation. Requirements. Testing gaps. Architecture review. Exploratory / scenario testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summarizing&lt;/strong&gt; and clustering. Change logs, incident management, research data, docs summary.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Challenges in using AI coding agents:
&lt;ol&gt;
&lt;li&gt;Adoption imbalance. Only certain roles are amplified by AI. Coding, QA, more than planning, maintenance, AI ops, etc. What&amp;rsquo;s the impact of this?
&lt;ul&gt;
&lt;li&gt;⭐ Goldratt&amp;rsquo;s ToC implies that backlogs need to fill faster. Downstream becomes a bottleneck. Technical debt piles up.&lt;/li&gt;
&lt;li&gt;ACTION: Use AI across &lt;em&gt;entire&lt;/em&gt; value chain, from research to maintenance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Locality. enhances roles (nodes), not relationships (links). They optimize local work, not global flow. Workflow tools are missing.
&lt;ul&gt;
&lt;li&gt;Coordination overhead. Context Fragmentation. Translation problems.&lt;/li&gt;
&lt;li&gt;⭐ Expand productive roles to cover neighboring tasks. Productive developers shift left and build backlogs; shift right to reduce code review, maintenance tasks.
&lt;ul&gt;
&lt;li&gt;E.g. Move maintenance/production activities into development. Security, performance, monitoring, observability, cost, infrastructure.&lt;/li&gt;
&lt;li&gt;We spend time on IDE, CI/CD, Jira, Confluence, Prod observability tools.&lt;/li&gt;
&lt;li&gt;A typical Agent Development Platform (ADP) covers evals, guardrails, workflow builder, agent builder, observability, prompt management, AI gateway (LiteLLM), MCP servers, model fine-tuning, model serving, model repository, vector stores&lt;/li&gt;
&lt;li&gt;We need ADP Agents covering delivery risk, continuous security, prod issues RCA, observability, performance, accessibility, product research, infra optiimzation, test data generation, anomaly detection, release management&lt;/li&gt;
&lt;li&gt;ACTION: Share ADP photo with Patrick.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;ACTION: ⭐ Centralize skills (&amp;ldquo;knowledge packs&amp;rdquo;) and MCPs and observe which gets used most. Allow people to use more.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Lethal Trifecta. There&amp;rsquo;s growing demand for higher productivity with AI code assistants. But the lethal trifecta makes them an attack vector. It has access to sensitive information, exfiltrate data, and read and follow unsafe instructions.
&lt;ul&gt;
&lt;li&gt;Can lead to supply chain poisoning attacks.&lt;/li&gt;
&lt;li&gt;Regulated industries cannot adopt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Technical debt growth. More productivity leads to poor code quality which will slow down future work.
&lt;ul&gt;
&lt;li&gt;See &lt;a href=&#34;https://www.harness.io/the-state-of-software-engineering-excellence&#34;&gt;Software Engineering Excellence 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AI induced complacency.&lt;/li&gt;
&lt;li&gt;Sunk-cost fallacy on AI-generated code hurts.&lt;/li&gt;
&lt;li&gt;ACTION: Evaluate code quality continuously to reduce technical debt. Double-down on good engineering practices.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compliance.
&lt;ul&gt;
&lt;li&gt;Model residency. Self-hosting is required.&lt;/li&gt;
&lt;li&gt;Data observability gaps. Data privacy, audit trails, etc. are concerns.&lt;/li&gt;
&lt;li&gt;Token economics. $20/day happens in Thoughtworks. Token cost is subsidized.&lt;/li&gt;
&lt;li&gt;Rogue AI usage. Use of dis-allowed tools; shadow IT.&lt;/li&gt;
&lt;li&gt;ROI justification. Hard to quantify productivity gains.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Adoption.
&lt;ul&gt;
&lt;li&gt;AI Literacy. Tap into organizational knowledge&lt;/li&gt;
&lt;li&gt;Champions &amp;amp; communities of practice to support cross-pollination.&lt;/li&gt;
&lt;li&gt;Use-case driven adoption. Teams identify based on AI superpowers.&lt;/li&gt;
&lt;li&gt;AI playbook. Share what worked, what didn&amp;rsquo;t work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AI automation is likely less if a &lt;strong&gt;high portion&lt;/strong&gt; of work
&lt;ul&gt;
&lt;li&gt;Has &lt;strong&gt;legal liability&lt;/strong&gt; (e.g. pharmacist/judge vs shop attendant/lawyer)&lt;/li&gt;
&lt;li&gt;Is &lt;strong&gt;subjective&lt;/strong&gt; (e.g. perfumer/auction appraiser vs lab chemist/insurance appraiser)&lt;/li&gt;
&lt;li&gt;Needs rapid contextual &lt;strong&gt;decisions&lt;/strong&gt; (e.g. detective/fireman/ER vs parking enforcer)&lt;/li&gt;
&lt;li&gt;Via &lt;a href=&#34;https://chatgpt.com/c/68d79589-c2b8-8331-b86f-0e0f211feb7f&#34;&gt;ChatGPT&lt;/a&gt;, &lt;a href=&#34;https://claude.ai/chat/d534c273-7b6c-4ffa-98a9-5bca40d9959a&#34;&gt;Claude&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sindresorhus/parse-sse&#34;&gt;parse-sse&lt;/a&gt; from Sindre Sorhus is a more standards-compliant, more likely-to-be-maintained alternative to my &lt;a href=&#34;https://github.com/sanand0/async-sse&#34;&gt;async-sse&lt;/a&gt; package.&lt;/li&gt;
&lt;li&gt;Which is better: Comment A: 1 upvote, 0 downvotes (100% positive) or Comment B: 99 upvotes, 1 downvote (99% positive)? Use &lt;strong&gt;Wilson&amp;rsquo;s Lower Bound&lt;/strong&gt; which measures &amp;ldquo;What % positive am I 95% confident of?&amp;rdquo; &lt;a href=&#34;https://claude.ai/share/0f69e7f8-6ca7-4fee-b3ec-8b580556bc9a&#34;&gt;Claude&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Using this, we can measure metrics for tweets, like below. &lt;a href=&#34;https://chatgpt.com/share/68fef88f-7b18-800c-835f-38a3fe470f34&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Popularity = (5 _ WLB(reposts / views) + 2 _ WLB(likes / views)) * Decay(half-life of 72 h)&lt;/li&gt;
&lt;li&gt;Memorability = (5 _ WLB(bookmarks / views) + 4 _ WLB(replies / views)) * Decay(half-life of 36 hours)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A nice visual &amp;ldquo;benchmark&amp;rdquo; of &lt;a href=&#34;https://genai-showdown.specr.net/&#34;&gt;text-to-image&lt;/a&gt; and &lt;a href=&#34;https://genai-showdown.specr.net/image-editing&#34;&gt;image editing&lt;/a&gt; models. Seadream 4, Gemini 2.5 Flash, and Qwen Image Edit lead. This includes examples like &lt;a href=&#34;https://genai-showdown.specr.net/image-editing&#34;&gt;straightening te Tower of Pisa&lt;/a&gt; - which only Flux.1 and Seadream 4 do well on; or removing only the brown M&amp;amp;Ms - which only Qwen Image Edit manages to.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.archgw.com/&#34;&gt;Arch&lt;/a&gt; is a pure LLM router. It supports multiple LLMs, flexible routing and observability but not auth.&lt;/li&gt;
&lt;li&gt;From &lt;a href=&#34;https://github.com/openai/codex/tree/main/docs&#34;&gt;Codex docs&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/prompts.md&#34;&gt;custom prompts&lt;/a&gt; in &lt;code&gt;~/.codex/prompts/xyz.md&lt;/code&gt; and launch as &lt;code&gt;/prompts:xyz&lt;/code&gt;. Optional: &lt;code&gt;description:&lt;/code&gt; and &lt;code&gt;argument-hint:&lt;/code&gt; in YAML front-matter. For example, create prompts to refactor, rewrite in a developer&amp;rsquo;s style, document AGENTS.md, identify re-usable code, etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AGENTS.override.md&lt;/code&gt; overrides parent directory &lt;code&gt;AGENTS.md&lt;/code&gt;. &lt;code&gt;AGENTS.md&lt;/code&gt; appends to parent &lt;code&gt;AGENTS.md&lt;/code&gt;. &lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/agents_md.md#how-they-come-together&#34;&gt;Fallback names are allowed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/exec.md#json-output-mode&#34;&gt;&lt;code&gt;codex exec&lt;/code&gt; supports streaming JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/exec.md#authentication&#34;&gt;&lt;code&gt;codex exec&lt;/code&gt; accepts a &lt;code&gt;CODEX_API_KEY=&lt;/code&gt; environment variable&lt;/a&gt;. &lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/authentication.md#usage-based-billing-alternative-use-an-openai-api-key&#34;&gt;&lt;code&gt;codex&lt;/code&gt; uses an &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can configure &lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/config.md#shell_environment_policy&#34;&gt;which environment variables are passed to the shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/openai/codex/blob/main/docs/config.md#project_doc_max_bytes&#34;&gt;Codex reads 32KB from AGENTS.md by default&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Things that I currently follow and don&amp;rsquo;t follow from Peter Steinberger&amp;rsquo;s excellent &lt;a href=&#34;https://steipete.me/posts/just-talk-to-it#do-you-do-spec-driven-development&#34;&gt;Just Talk To It&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prefer Codex &amp;gt; Claude Code.&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Ask for options before executing&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Generate &amp;amp; review specs collaboratively&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; You don&amp;rsquo;t need git worktrees&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prefer subscriptions over API to reduce cost&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Store docs with code&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Give examples&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Use voice input&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Use Codex Web as a mobile inbox for ideas&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prefer CLI over agentic platforms&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prefer CLI tools over MCP&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Avoid ALL-CAPS for Codex. It follows instructions well&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Avoid sub-agents, RAG, etc.&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Iterate UI live. Watch changes&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Use 3-8 agents in parallel on a single repo.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Make small, atomic commit checkpoints. Commit only what the agent touches&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Add &lt;code&gt;ast-grep&lt;/code&gt; as a pre-commit hook to block rule violations.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Keep custom prompts minimal (commit, automerge, massageprs, review, &amp;hellip;). Just &amp;ldquo;commit&amp;rdquo; reduces context&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Cancel long tasks and ask what&amp;rsquo;s happening&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prefer Medium over High reasoning. It decides level of thinking&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Share screenshots&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Use tmux to run CLIs persistently&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Schedule refactor time (20%). Use jscpd, knip, oxlint, &amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Don&amp;rsquo;t reset context. Cold start wastes time + tokens&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Write tests in the &lt;em&gt;same&lt;/em&gt; context. Yields better tests, reveals bugs.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Prototype in a separate folder / PR&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Queue &lt;code&gt;continue&lt;/code&gt; messages** before stepping away&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Ask it to &amp;ldquo;Preserve intent and add comments at tricky spots&amp;rdquo;. Future you needs the WHY&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; On hard problems, add “take your time”, “be comprehensive”, “read all related code”, “form hypotheses”, etc.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Maintain an &lt;em&gt;evolving&lt;/em&gt; &lt;strong&gt;AGENTS.md&lt;/strong&gt; with product notes, naming, API patterns, test policy, &lt;strong&gt;ast-grep rules&lt;/strong&gt;, etc. Delete stale guidelines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fascinating implications from &lt;a href=&#34;https://osf.io/preprints/psyarxiv/vbkmt_v1&#34;&gt;Quantifying Human-AI Synergy&lt;/a&gt; &lt;a href=&#34;https://chatgpt.com/c/68fefa47-6a60-8320-9488-186d617916fc&#34;&gt;ChatGPT&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Models vary in ability to uplift humans. Don&amp;rsquo;t just use standalone model benchmarks.&lt;/li&gt;
&lt;li&gt;People vary in ability to work with AI. Don&amp;rsquo;t just measure solo skills. Reward AI collaboration ability (delegation, prompting, verification, revision, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;Train models to ask for missing Theory-of-Mind cues: goal, beliefs, constraints, audience, success test&lt;/li&gt;
&lt;li&gt;Train people by asking them to predict what the model will get right/wrong, and validate&lt;/li&gt;
&lt;li&gt;Design UI and models for synergy. UI: Surface/solicit assumptions, intent, uncertainty, constraints. Model: Infer &amp;amp; adapt to evolving user state.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openrouter.ai/docs/features/multimodal/image-generation&#34;&gt;OpenRouter image generation&lt;/a&gt; now includes &lt;a href=&#34;https://openrouter.ai/openai/gpt-5-image-mini&#34;&gt;GPT-5 Image Mini&lt;/a&gt;. An image costs about 1 cent. Here&amp;rsquo;s the code:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://openrouter.ai/api/v1/chat/completions&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OPENROUTER_API_KEY&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    model: &amp;#34;openai/gpt-5-image-mini&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    messages: [{ role: &amp;#34;user&amp;#34;, content: &amp;#34;Draw a cat&amp;#34; }],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    modalities: [&amp;#34;image&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    image_config: { &amp;#34;aspect_ratio&amp;#34;: &amp;#34;16:9&amp;#34; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;  }&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.choices[0].message.images[0].image_url.url&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; cut -c23- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; base64 -d &amp;gt; cat.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/codex-follows-instructions-too-faithfully/</link>
      <pubDate>Tue, 16 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/codex-follows-instructions-too-faithfully/</guid>
      <description>&lt;p&gt;GPT-5 (Codex) follows instructions exactly as given. Usually a good thing, but sometimes, it this is what happens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt;: ALWAYS WRITE TESTS before coding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt;: Let me begin with the tests. (Spends 5 minutes writing tests.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: Stop! This is a proof of concept. We don&amp;rsquo;t need tests!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt;: Write tests before coding. Drop tests for proof-of-concepts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt;: (Proceeds to delete all existing tests.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: STOP! We need those tests!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt;: For new code, or if tests exist, start by writing tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: Do this task. &amp;hellip; BUT SKIP TESTS! This is a POC!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt;: The user has explicitly asked to skip tests. But the guidelines require tests for new code. For now, I think I will skip tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anand&lt;/strong&gt;: (sigh!)&lt;/p&gt;
&lt;p&gt;Reminds me of Chaplin&amp;rsquo;s Feeding Machine.&lt;/p&gt;
&lt;div class=&#34;video-embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube.com/embed/mVUVPen3xNQ&#34; title=&#34;YouTube video&#34; loading=&#34;lazy&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/posts/sanand0_charlie-chaplin-demonstrates-the-feeding-activity-7370987866577022976-d1MA&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Mistakes AI Coding Agents Make</title>
      <link>https://www.s-anand.net/blog/mistakes-ai-coding-agents-make/</link>
      <pubDate>Sun, 22 Jun 2025 09:21:05 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/mistakes-ai-coding-agents-make/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Mistakes AI Coding Agents Make&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/image-9.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&#34;https://chatgpt.com/codex&#34;&gt;Codex&lt;/a&gt; to write tools while I walk. Here are merged PRs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/27&#34;&gt;Add editable system prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/23&#34;&gt;Standardize toast notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/25&#34;&gt;Persist form fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/22&#34;&gt;Fix SVG handling in page2md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/19&#34;&gt;Add Google Tasks exporter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/20&#34;&gt;Add Markdown table to CSV tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/24&#34;&gt;Replace simple alerts with toasts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/21&#34;&gt;Add CSV joiner tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sanand0/tools/pull/12&#34;&gt;Add SpeakMD tool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This added technical debt. I spent four hours fixing the AI generated tests and code.&lt;/p&gt;
&lt;h3 id=&#34;what-mistakes-did-it-make&#34;&gt;What mistakes did it make?&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Inconsistency&lt;/strong&gt;. It flips between &lt;code&gt;execCommand(&amp;quot;copy&amp;quot;)&lt;/code&gt; and &lt;code&gt;clipboard.writeText()&lt;/code&gt;. It wavers on timeouts (50 ms vs 100 ms). It doesn&amp;rsquo;t always run/fix test cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missed edge cases&lt;/strong&gt;. I &lt;a href=&#34;https://github.com/sanand0/tools/pull/25&#34;&gt;switched&lt;/a&gt; &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;. My earlier code didn&amp;rsquo;t have a &lt;code&gt;type=&amp;quot;button&amp;quot;&lt;/code&gt;, so clicks reloaded the page. It missed that. It also left scripts as plain &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; instead of &lt;code&gt;&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;&lt;/code&gt; which was required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limited experimentation&lt;/strong&gt;. My failed with a HTTP 404 because the &lt;code&gt;common/&lt;/code&gt; directory wasn&amp;rsquo;t served. I added &lt;code&gt;console.log&lt;/code&gt;s to find this. Also, &lt;a href=&#34;https://www.npmjs.com/package/happy-dom&#34;&gt;happy-dom&lt;/a&gt; won&amp;rsquo;t handle multiple &lt;code&gt;export&lt;/code&gt;s instead of a single &lt;code&gt;export { ... }&lt;/code&gt;. I wrote code to verify this. Coding agents didn&amp;rsquo;t run such experiments.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;what-can-we-do-about-it&#34;&gt;What can we do about it?&lt;/h3&gt;
&lt;p&gt;Three things could have helped me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Detailed coding rules&lt;/strong&gt;. E.g. &lt;strong&gt;always&lt;/strong&gt; run test cases and fix until they pass. Only use ESM. Always import from CDN via JSDelivr. That sort of thing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100% test coverage&lt;/strong&gt;. Ideally 100% of code and all usage scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log everything&lt;/strong&gt;. My tests got a HTTP 404 because I was not serving the &lt;code&gt;common/&lt;/code&gt; directory. LLMs couldn&amp;rsquo;t figure this out because it was not logged. Logging everything helps humans &lt;strong&gt;and&lt;/strong&gt; LLMs debug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait&lt;/strong&gt;. LLMs and coding agents keep improving. A few months down the line, they&amp;rsquo;ll run more experiments themselves.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Was AI coding worth the effort?&lt;/strong&gt; Here, yes. The tools &lt;strong&gt;worked&lt;/strong&gt;. Codex saved me 90% effort. My code quality obsession reduced savings to ~70%. Still huge.&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
