<?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 on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/ai-coding/</link>
    <description>Recent content in ai-coding on S Anand</description>
    <generator>Hugo -- 0.156.0</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 29 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/ai-coding/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Things I Learned - 29 Mar 2026</title>
      <link>https://www.s-anand.net/blog/things-i-learned-29-mar-2026/</link>
      <pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-29-mar-2026/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://thekidshouldseethis.com/&#34;&gt;The Kids Should See This&lt;/a&gt; - great collection of videos for curious people. &lt;a href=&#34;https://thejeshgn.com/2026/03/27/weekly-notes-13-2026/&#34;&gt;Thej&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A jury fined Meta and YouTube $4.2m and $1.8m for building addictive features in their products. That&amp;rsquo;s a first. &lt;a href=&#34;https://www.nytimes.com/2026/03/25/technology/social-media-trial-verdict.html&#34;&gt;NY Times&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;I think AI-type tools will actually revolutionize the experimental side of math, where you don’t care so much about individual problems and the process of solving them, but you want to gather large-scale data about what things work and what things don’t.&amp;rdquo; &lt;a href=&#34;https://www.dwarkesh.com/p/terence-tao#:~:text=gather%20large%2Dscale%20data&#34;&gt;Terence Tao&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Hedonic_treadmill&#34;&gt;hedonic treadmill&lt;/a&gt; (which roughly quantifies a Buddhist principle) says that we revert to a &lt;a href=&#34;https://en.wikipedia.org/wiki/Hedonic_treadmill#Happiness_set_point&#34;&gt;happiness set point&lt;/a&gt; (which varies by individual). Worse, those who experience a high kick (e.g. a lottery) don&amp;rsquo;t get enough kick from normal wins (contrast effect) &amp;ndash; &lt;a href=&#34;https://gemini.google.com/share/9e8a904b34bb&#34;&gt;Interactive explainer&lt;/a&gt;. &lt;!-- https://gemini.google.com/app/b676e7571e5cbc85 --&gt; The happiness neutral&lt;/li&gt;
&lt;li&gt;As of today, a &lt;a href=&#34;https://www.linkedin.com/search/results/people/?keywords=%22llm%20psychologist%22&#34;&gt;LinkedIn search for &amp;ldquo;llm psychologist&amp;rdquo;&lt;/a&gt; lists 9 people. I&amp;rsquo;m not alone!
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/sanand0/&#34;&gt;Anand S&lt;/a&gt;, LLM Psychologist, Singapore, Singapore&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/analyticsanshul/&#34;&gt;Anshul Saxena, PhD&lt;/a&gt;, AI Advisor &amp;amp; Trainer | Technology Strategist | LLM Psychologist | Currently teaching humans, machines &amp;amp; business to work smarter through Generative AI and Quantum Computing | 15+ Years Experience, Pune, Maharashtra, India&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/chadofficial/&#34;&gt;Charitarth (Chad) Sindhu&lt;/a&gt;, LLM Psychologist / Fractional Business &amp;amp; AI Workflow Consultant/ Digital Nomad, Tokyo, Japan&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/lancelotsalavert/&#34;&gt;Lancelot Salavert&lt;/a&gt;, LLM Psychologist, Barcelona, Catalonia, Spain&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/lior-durahly/&#34;&gt;Lior Dor(Durahly)&lt;/a&gt;, Team Lead | Bug Banisher | Ex 8200, Tel Aviv District, Israel. Past: R&amp;amp;D Team Lead and &lt;strong&gt;LLM&lt;/strong&gt; &lt;strong&gt;Psychologist&lt;/strong&gt; at Superwise | A Blattner Tech Company&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/maximebodereau/&#34;&gt;maxime bodereau&lt;/a&gt;, Lead Creative Art Director | UX Forensics | Ai LLM Psychologist | Visual Alchemist | Codesmith | Brandologist | Full Stack Designer, Nantes, Pays de la Loire, France&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/chenml/&#34;&gt;Mei Chen 🦋&lt;/a&gt;, LLM Psychologist | Lead Product Engineer | Delivering Agentic Experiences, Toronto, Ontario, Canada&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/shoshannahtekofsky/&#34;&gt;Shoshannah Tekofsky&lt;/a&gt;, LLM Psychologist at AI Digest, Zwolle, Overijssel, Netherlands&lt;/li&gt;
&lt;li&gt;LinkedIn Member, LLM, psychologist, mediator, Prague, Czechia&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://simonwillison.net/2026/Mar/19/openai-acquiring-astral/&#34;&gt;OpenAI acquired Astral!&lt;/a&gt;. This will likely slow down the new wonderful tools accelerating the Python ecosystem. Like with &lt;a href=&#34;https://openai.com/index/openai-to-acquire-promptfoo/&#34;&gt;PromptFoo&lt;/a&gt; and &lt;a href=&#34;https://steipete.me/posts/2026/openclaw&#34;&gt;OpenClaw&lt;/a&gt;, this seems to be about talent. The &amp;ldquo;acqui-hire&amp;rdquo; mode seems a &lt;em&gt;clear&lt;/em&gt; niche career path now, and an alternative to getting hired (you get a much higher salary) or getting acquired (you take on much higher risk).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/quickjs-emscripten&#34;&gt;quickjs-emscripten&lt;/a&gt; lets you run isolated JS code securely in the browser, CloudFlare workers, NodeJS, and Deno. It compiles to WASM. @sebastianwessel/quickjs is a higher-level TS wrapper. &lt;a href=&#34;https://github.com/simonw/research/tree/main/javascript-sandboxing-research&#34;&gt;Simon Willison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bramcohen.com/p/manyana&#34;&gt;Manyana&lt;/a&gt; is a CRDT based version control system. It sounds like a good idea but I&amp;rsquo;m sceptical because merge conflicts are a &amp;ldquo;what should I do&amp;rdquo; problem more than &amp;ldquo;how&amp;rdquo;. With &lt;a href=&#34;https://simonwillison.net/guides/agentic-engineering-patterns/using-git-with-coding-agents/&#34;&gt;agents doing more merge conflict management&lt;/a&gt;, I am not sure this will offer a concrete benefit - but probably no harm either.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://posttrainbench.thoughtfullab.com/&#34;&gt;LLMs are able post-train LLMs on new topics&lt;/a&gt;. They&amp;rsquo;re improving fast. &lt;a href=&#34;https://jack-clark.net/2026/03/16/importai-449-llms-training-other-llms-72b-distributed-training-run-computer-vision-is-harder-than-generative-text/&#34;&gt;Jack Clark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/search/results/people/?keywords=vibe+coding+fixer&#34;&gt;Vibe Coding Fixer&lt;/a&gt; and &lt;a href=&#34;https://www.linkedin.com/search/results/people/?keywords=ai+slop+cleaner&#34;&gt;AI Slop Cleaner&lt;/a&gt; are real job descriptions - which are morphing into enterprise offerings. But I still seem to be the only official &lt;a href=&#34;https://www.linkedin.com/search/results/people/?keywords=llm+psychologist&#34;&gt;LLM Psychologist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notes from &lt;a href=&#34;https://mtrajan.substack.com/p/ai-services-wrong-mental-models-right&#34;&gt;AI Services - Wrong Mental Models, Right Moment&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;AI services has 3 markets. Automatable work: vanishes in 2 years. Human-in-the-loop work: sustains. Judgement-driven: grows in importance.&lt;/li&gt;
&lt;li&gt;YC: don’t sell access to a tool for $50 a month, use the AI yourself and sell the finished work for $5,000.&lt;/li&gt;
&lt;li&gt;Sell output. Price on outcome. Sell to business, not IT.&lt;/li&gt;
&lt;li&gt;Sell accountability: proven success, with your guarantee.&lt;/li&gt;
&lt;li&gt;Sell authenticity: a brand story representing uniqueness, character, &amp;hellip; or whatever&amp;hellip; something people respect.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data transfer between GPU and memory is a bottleck and three approaches are emerging. &lt;a href=&#34;https://mtrajan.substack.com/p/inference-blindness&#34;&gt;#&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://taalas.com/the-path-to-ubiquitous-ai/&#34;&gt;Taalas&lt;/a&gt; is etching LLMs into the chip. Llama 8b runs at 17,000 tok/s (H200 is at 230 tok/s).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.d-matrix.ai/announcements/d-matrix-unveils-corsair-the-worlds-most-efficient-ai-computing-platform-for-inference-in-datacenters/&#34;&gt;d-Matrix&lt;/a&gt; is moving compute into SRAM memory chips. 30,000 tok/s for Llama 70b. Cerebras and MatX are similar: memory-oriented.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://furiosa.ai/blog/lg-ai-research-taps-furiosaai-to-achieve-2-25x-better-llm-inference-in-production-vs-gpus&#34;&gt;FuriosaAI&lt;/a&gt; minimizes data movement. Groq and Sambanova are similar.&lt;/li&gt;
&lt;li&gt;But in the long run, commodity technology usually beats integrated stacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openai.com/index/introducing-gpt-5-4-mini-and-nano/&#34;&gt;GPT 5.4 Nano ($0.2/MTok) and Mini ($0.75/MTok)&lt;/a&gt; are good options for bulk OCR, transcription, etc. as cost and quality comparable alternatives to Gemini Flash Lite and Gemini Flash. &lt;a href=&#34;https://simonwillison.net/2026/Mar/17/mini-and-nano/&#34;&gt;They can describe 75K photos for $50&lt;/a&gt;. Both models are better than GPT-5 Mini on most benchmarks.&lt;/li&gt;
&lt;li&gt;Cool &lt;a href=&#34;https://simonwillison.net/guides/agentic-engineering-patterns/using-git-with-coding-agents/&#34;&gt;AI coding agent git prompt fragments&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;Use git bisect to find when this bug was introduced: &amp;hellip;&lt;/li&gt;
&lt;li&gt;Find and recover my code that does &amp;hellip;&lt;/li&gt;
&lt;li&gt;Sort out this git mess for me.&lt;/li&gt;
&lt;li&gt;Rewrite history removing &amp;hellip;&lt;/li&gt;
&lt;li&gt;Split the last commit into multiple commits grouped logically.&lt;/li&gt;
&lt;li&gt;Start a new repo at &amp;hellip; and build just this module &amp;hellip; based on &amp;hellip; with a similar commit history copying the author and commit dates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://matthodges.com/posts/2026-01-07-ai-agents-campaigns/&#34;&gt;Campaigns Are Knowledge Workers and the Tools Just Caught Up&lt;/a&gt;. A powerful framing. I saw this in action a few days ago when a friend was able to automate an outbound campaign with Claude Code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.google.com/search?q=EARS+(Easy+Approach+to+Requirements+Syntax)&amp;amp;oq=EARS+(Easy+Approach+to+Requirements+Syntax)&#34;&gt;EARS (Easy Approach to Requirements Syntax)&lt;/a&gt; is a simple structure for requirements. For &lt;a href=&#34;https://github.com/github/spec-kit/issues/1356&#34;&gt;example&lt;/a&gt;, &amp;ldquo;Users should be able to drag tasks between columns. The app needs to work offline too. Handle errors gracefully.&amp;rdquo; becomes the following - which AI can convert to and is easier to spot errors in. State machines and decision tables are useful alternatives, too.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;REQ-001&lt;/strong&gt; (Event): When the user drags a task card to a different column, the system shall update the task status to match the destination column.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REQ-002&lt;/strong&gt; (State): While the application is offline, the system shall store task updates in local storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REQ-003&lt;/strong&gt; (Event): When the application reconnects, the system shall synchronize locally stored updates with the server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REQ-004&lt;/strong&gt; (Unwanted): If synchronization conflicts occur, then the system shall display a resolution dialog to the user.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;As of now, avoid using Claude.ai to create (large) visualizations. It runs forever and exhausts credits without generating anything. Claude Code works much better for this.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/how-to-use-llms-better/</link>
      <pubDate>Sat, 30 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/how-to-use-llms-better/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s my current answer when asked, &amp;ldquo;How do I use LLMs better?&amp;rdquo;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use the best models&lt;/strong&gt;. O3 (via $20 ChatGPT), Gemini 2.5 Pro (free on Gemini app), or Claude 4 Opus (via $20 Claude). The older models are the default and far worse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use audio&lt;/strong&gt;. &lt;strong&gt;Speak&lt;/strong&gt; &amp;amp; &lt;strong&gt;listen&lt;/strong&gt;, don&amp;rsquo;t just type &amp;amp; read. It&amp;rsquo;s harder to skip and easier to stay in the present when listening. It&amp;rsquo;s also easier to ramble than to type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write down what fails&lt;/strong&gt;. Maintain that &amp;ldquo;impossibility list&amp;rdquo;. There is a jagged edge to AI. Retry every month, you can see how that edge shifts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait for better models&lt;/strong&gt;. Many problems can be solved just by waiting a few months for a new model. You don&amp;rsquo;t need to find or build your own app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Give LLMs lots of context&lt;/strong&gt;. It&amp;rsquo;s a huge enabler. Search, copy-pasteable files, past chats, connectors, APIs/tools, &amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have LLMs write code&lt;/strong&gt;. LLMs are bad at math. They&amp;rsquo;re good at code. Code hallucinates less. So you get creativity &lt;em&gt;and&lt;/em&gt; reliability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn AI coding&lt;/strong&gt;. 1. Build a game with ChatGPT/Claude/Gemini. 2. Create a tool useful to you. 3. Publish it on GitHub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APIs are cheaper than self hosting&lt;/strong&gt;. Don&amp;rsquo;t bother running your own models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datasets matter&lt;/strong&gt;. Building custom models does not. You can always fine-tune a newer model if you have the datasets.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Comic via &lt;a href=&#34;https://tools.s-anand.net/picbook/&#34;&gt;https://tools.s-anand.net/picbook/&lt;/a&gt;&lt;/p&gt;
&lt;iframe src=&#34;https://files.s-anand.net/images/2025-08-06-How-to-use-LLMs-better.pdf&#34; width=&#34;100%&#34; height=&#34;800px&#34; title=&#34;Embedded PDF Viewer&#34;&gt;
  &lt;p&gt;&lt;a href=&#34;https://files.s-anand.net/images/2025-08-06-How-to-use-LLMs-better.pdf&#34;&gt;Download the PDF&lt;/a&gt;.&lt;/p&gt;
&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/posts/sanand0_how-to-use-llms-better-activity-7358724834857570304-Ge51&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 24 Aug 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-24-aug-2025/</link>
      <pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-24-aug-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pilots like to have fun, too. While awaiting landing clearance at Kolkata, our IndiGo pilot weaved tight curves &lt;em&gt;just&lt;/em&gt; above the clouds at steep angles, giving us stunning views and a mildly thrilling experience. (Or maybe they were just following a flight path.)&lt;/li&gt;
&lt;li&gt;Since LLMs allow ANYONE to become &amp;ldquo;good enough&amp;rdquo; in most fields (marketing, medicine, management), and so on, here&amp;rsquo;re are my guesses on the impact. &lt;a href=&#34;https://chatgpt.com/c/68a3396c-07b4-8321-a9f0-08b85b797697&#34;&gt;ChatGPT&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Companies-of-one will grow. Sole founder can handle support functions.&lt;/li&gt;
&lt;li&gt;Specialists will generalize. Consultants will code. Marketers will design.&lt;/li&gt;
&lt;li&gt;Wages will compress. Seniors will earn less as juniors can do more.&lt;/li&gt;
&lt;li&gt;Layers will compress. Organizations need fewer hierarchies as 1 person can do more.&lt;/li&gt;
&lt;li&gt;Shadow apps will grow. Anyone can code. Users build apps with prompts, sheets, agents, outside of IT SDLC. Like Excel sheets.&lt;/li&gt;
&lt;li&gt;Governance will grow. Non-experts are acting like experts. Validation is more important.&lt;/li&gt;
&lt;li&gt;Uneconomical apps will thrive. 1:1 tutoring. Continous decision making or A/B testing.&lt;/li&gt;
&lt;li&gt;Leaders will convince better. Persuasion scales.&lt;/li&gt;
&lt;li&gt;Brand (authenticity, trust, skill), Channel (distribution, audience) and Data are primary differentiators.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Codex and Codex CLI now support image attachments.&lt;/li&gt;
&lt;li&gt;Notes from discussion on education with Srikanth Nadhumuni
&lt;ul&gt;
&lt;li&gt;Indian higher education has done better, e.g. with the IITs, than primary education, where ASER &lt;em&gt;consistently&lt;/em&gt; shows that 5th graders can&amp;rsquo;t read 2nd grade books.&lt;/li&gt;
&lt;li&gt;The National Education Policy (NEP) is focusing on FLN (foundational numeracy and literacy). The goal is universal FLN by 2027.&lt;/li&gt;
&lt;li&gt;Teacing FLN in local languages beats English. Teachers, parents, community support are high. Learning English as a second language is faster. Other countries (France, Germany, Japan) do this.&lt;/li&gt;
&lt;li&gt;Voice LLMs could help, but may not be toddler-ready, nor strong enough in all local langauges.&lt;/li&gt;
&lt;li&gt;But high-quality textbook translation with local nuances is a one-time human-in-the-loop effort that AI can support.&lt;/li&gt;
&lt;li&gt;India&amp;rsquo;s 1 crore teachers have a mandatory 50 hrs/year training requirement that is largely under-implemented.&lt;/li&gt;
&lt;li&gt;Senthil Mullainathan is working on extracting features from student answers to questions and generating remedial content purely as a black-box. Results beat explainability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;⭐ Creating systems that rapidly improve from feedback is the key to success. Rapidity, quality of improvement, quantity of feedback are all enablers.&lt;/li&gt;
&lt;li&gt;CBDC (Central Bank Digital Currency) is RBI&amp;rsquo;s Web 3.0 protocal. It allows purpose-driven transfers, e.g. money meant for education can only be spent on education.&lt;/li&gt;
&lt;li&gt;Meta-prompts &lt;em&gt;with placeholders&lt;/em&gt; is a prompt-improvement technique (similar to LLM interviewing). Have LLMs create the prompt with &amp;ldquo;fill-in-the-blanks&amp;rdquo;. This makes it much easier for people to fill out.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://massgen.ai/&#34;&gt;MassGen&lt;/a&gt; is a multi-agent orchestrator. Early days, experimental. It has multiple agents answer, then vote on each others&amp;rsquo; answers, picking the best.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://dspy.ai/&#34;&gt;DSPy&lt;/a&gt; auto-optimizes prompts based on input-output pairs or evals. Typical improvements are ~10-20%. My opinion: avoid. It&amp;rsquo;s a good idea, but has too much abstraction that hides the implementation. Worth learning from but not implementing unless you (a) have evals + metrics and (b) you KNOW you need to change models and (c) it&amp;rsquo;s a long-term project where the learning curve is worth it. &lt;a href=&#34;https://claude.ai/share/7fb4b334-32fb-4d79-b2a4-6a2a842d8512&#34;&gt;Claude&lt;/a&gt; and &lt;a href=&#34;https://chatgpt.com/c/6905ccd8-3d60-8321-869f-29b81d3d7641&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How LLM &amp;ldquo;Attention&amp;rdquo; works: It takes each word&amp;rsquo;s embedding, moves it closer to similar words&amp;rsquo; embeddings (e.g. Apple moves towards phone or orange depending on context). More similar words have a higher pull, like gravity. &lt;a href=&#34;https://serrano.academy/&#34;&gt;Luis Serrano&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Similarity isn&amp;rsquo;t symmetric. E.g. &amp;ldquo;Coke&amp;rdquo; moves &amp;ldquo;drink&amp;rdquo; more towards it, but &amp;ldquo;drink&amp;rdquo; pulls &amp;ldquo;Coke&amp;rdquo; less, since &amp;ldquo;drink&amp;rdquo; could refer to other things.&lt;/li&gt;
&lt;li&gt;Think of the pull (&amp;ldquo;Tinder similarity&amp;rdquo;) as &amp;ldquo;what A wants&amp;rdquo; (key matrix, which pulls other words) multipled by &amp;ldquo;what B offers&amp;rdquo; (query matrix, which is pulled by other words). This leads to two different similarity matrices.&lt;/li&gt;
&lt;li&gt;Multi-head attention is where a neural net gives different weightages to different similarity matrices based on context.&lt;/li&gt;
&lt;li&gt;Value matrix transforms the embedding space so that the next best next-word is more similar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reading the &lt;a href=&#34;https://help.obsidian.md/syntax&#34;&gt;Obsidian docs&lt;/a&gt; is like a master class in Markdown note-taking. Features like &lt;a href=&#34;https://help.obsidian.md/properties&#34;&gt;properties&lt;/a&gt;, &lt;a href=&#34;https://help.obsidian.md/embed-web-pages#Embed+a+YouTube+video&#34;&gt;embedding YouTube&lt;/a&gt;, &lt;a href=&#34;https://help.obsidian.md/bases&#34;&gt;bases&lt;/a&gt;, &lt;a href=&#34;https://help.obsidian.md/plugins/tags&#34;&gt;tags&lt;/a&gt;, etc. provide food for thought. The &lt;a href=&#34;https://www.reddit.com/r/ObsidianMD/&#34;&gt;ObsidianMD subreddit&lt;/a&gt; has interesting tips.
&lt;ul&gt;
&lt;li&gt;Summarize takeaways on top of each section&lt;/li&gt;
&lt;li&gt;Use atomic notes: one file per idea. Link liberally&lt;/li&gt;
&lt;li&gt;YAML front-matter you can query, e.g. tags, project, status, &amp;hellip;&lt;/li&gt;
&lt;li&gt;Use GFM admonitions, e.g. &lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Store images in a predictable way, e.g. &lt;code&gt;![Alt text](./img/2025-08-21-screenshot.webp)&lt;/code&gt; &amp;ndash; ALWAYS with alt text&lt;/li&gt;
&lt;li&gt;Use diff fences for edits / doc changes&lt;/li&gt;
&lt;li&gt;Task lists with inline dates, e.g. &lt;code&gt;- [ ] 2025-08-21 Draft a letter&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How to research better. &lt;a href=&#34;https://www.linkedin.com/in/ardivekar/&#34;&gt;Abhishek Divekar&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Have an objective when researching. Filter research based on that.&lt;/li&gt;
&lt;li&gt;Research backwards. Pick a relevant paper. Go through &lt;em&gt;relevant&lt;/em&gt; citations. Typically, there are only 1 or 2 &lt;em&gt;directly&lt;/em&gt; related ancestors.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t waste time searching. Gemini Deep Research is a great way to find &lt;em&gt;and&lt;/em&gt; read papers.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t read the abstract. Read the introduction, which &lt;em&gt;is&lt;/em&gt; the summary. It&amp;rsquo;s just a page. (The abstract is an LLM-ized versionof the introduction. Not as effective.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MCPs aren&amp;rsquo;t much more useful than tool calling &lt;em&gt;for developers&lt;/em&gt;. They&amp;rsquo;re powerful when packaging for external parties (non-developers, other teams, clients, etc.). Developers can work just fine with tool calling. &lt;a href=&#34;https://www.linkedin.com/in/agnitin/&#34;&gt;Nitin Agarwal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/aliasrobotics/cai&#34;&gt;Cybersecurity AI&lt;/a&gt; is an open-source LLM-based cyber-security tool that auto scans networks for vulnerabilities.&lt;/li&gt;
&lt;li&gt;⭐ LLMs have &lt;em&gt;solved&lt;/em&gt; several complex tasks (e.g. topic modelling, summarization). We need to adopt these as building blocks, like functions, and build better solutions. &lt;a href=&#34;https://www.linkedin.com/in/ardivekar/&#34;&gt;Abhishek Divekar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;codex -c model_reasoning_effort=high&lt;/code&gt; lets you run Codex CLI with highest reasoning effort. This has a separate limit that resets every 5 hours. &lt;a href=&#34;https://x.com/thsottiaux/status/1958035261947781262&#34;&gt;https://x.com/thsottiaux/status/1958035261947781262&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Truly agentic systems have high Autonomy, Complexity, &lt;em&gt;and&lt;/em&gt; Reliability. Workflows have low autonomy. Agentic systems with high autonomy currently aren&amp;rsquo;t very complex or reliable, but will improve over time. &lt;a href=&#34;https://www.linkedin.com/in/deepaksharma09/&#34;&gt;Deepak Sharma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow humans to intervene &lt;em&gt;while&lt;/em&gt; agent loops execute, even unsolicited, to improve collaboration. &lt;a href=&#34;https://www.linkedin.com/in/deepaksharma09/&#34;&gt;Deepak Sharma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Given the early, experimental days of AI, the better KPIs might be more about experimentation (e.g. number of prototypes) than operational (e.g. cost reduction). &lt;a href=&#34;https://www.linkedin.com/in/menonkrishna&#34;&gt;Krishnakumar Menon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;Policy-as-code&lt;/strong&gt; is an emerging theme. Allow users to create their own guardrails policy. Or, take existing policy documents and convert them into an LLM-based evaluator. &lt;a href=&#34;https://www.linkedin.com/in/menonkrishna&#34;&gt;Krishnakumar Menon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐ &amp;ldquo;Potentially nitpicky but competitive advantage in AI goes not so much to those with data but those with a data engine: iterated data aquisition, re-training, evaluation, deployment, telemetry. And whoever can spin it &lt;strong&gt;fastest&lt;/strong&gt;. Slide from Tesla to ~illustrate but concept is general.&amp;rdquo; &lt;a href=&#34;https://x.com/karpathy/status/1599852921541128194&#34;&gt;Andrej Karpathy&lt;/a&gt;, Dec 2022&lt;/li&gt;
&lt;li&gt;The skills AI coding needs are very similar to tech-lead&amp;rsquo;s or an architect&amp;rsquo;s. &lt;a href=&#34;https://www.linkedin.com/in/tanikagupta/&#34;&gt;Tanika Gupta&lt;/a&gt; #ai-coding
&lt;ul&gt;
&lt;li&gt;Estimating tool capability &amp;amp; task allocation&lt;/li&gt;
&lt;li&gt;Task breakdown&lt;/li&gt;
&lt;li&gt;Spec-ing: which of user personas, user-journey maps, wireframes, technical architecture, psuedo-code&lt;/li&gt;
&lt;li&gt;Standards: tech stack, tools, linters, security, doc standards&lt;/li&gt;
&lt;li&gt;Git versioning &amp;amp; collaboration&lt;/li&gt;
&lt;li&gt;Code review. (Using AI.) Providing &lt;strong&gt;feedback&lt;/strong&gt;. Modularity, naming, &amp;hellip;&lt;/li&gt;
&lt;li&gt;Automated validation&lt;/li&gt;
&lt;li&gt;Post-mortem. Learning from errors &lt;em&gt;and&lt;/em&gt; successes, choices LLM made&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The ROI of prompting carefully and using meta-prompts is high. Prompt clarity reduces iterations &amp;amp; dead-ends. The initial time spent (10-15 min) pays off with just a single reduced iteration (time to generate + review). &lt;a href=&#34;https://www.linkedin.com/in/tanikagupta/&#34;&gt;Tanika Gupta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐ Prefer passing a &lt;code&gt;spec.md&lt;/code&gt; to AI coding agents rather than directly typing-in prompts. This lets you meta-prompt &lt;em&gt;and&lt;/em&gt; (collaboratively) iterate on the &lt;code&gt;spec.md&lt;/code&gt;, version the prompts as specs, and generate specs as documentation. &lt;a href=&#34;https://www.linkedin.com/in/tanikagupta/&#34;&gt;Tanika Gupta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐ Models need environments to learn. So far, we have been providing training data. But an environment to interact with, and learn from by itself, is more powerful. That requires a standard for environments. This is a powerful emerging area.&lt;/li&gt;
&lt;li&gt;The crux of experimentation is the learning from a postmortem. From that perspective I have been experimenting a lot but not been documenting or learning from that. Decision logs with post mortem are a more apt device for me.&lt;/li&gt;
&lt;li&gt;Gemini API includes a url_context tool to explicitly scrape websites. &lt;a href=&#34;https://ai.google.dev/gemini-api/docs/url-context#rest&#34;&gt;API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ontologies are more than taxonomies or schemas. They&amp;rsquo;re truths or rules, e.g., “no person has more than two parents”. Helps consistency checking and inference. &lt;a href=&#34;https://chatgpt.com/c/68a531ca-8c0c-832e-ad8c-a20865344f2c&#34;&gt;#&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Terminological knowledge (T-Box) is domain rules and constraints (e.g., &amp;ldquo;a student is a person who attends a course&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Assertional knowledge (A-Box) is instance-level facts (e.g., &amp;ldquo;Mary attends Physics 101&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Tools &amp;amp; Formats
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.w3.org/TR/shacl/&#34;&gt;SHACL&lt;/a&gt;. A W3C language for validating RDF graphs. &lt;a href=&#34;https://shex.io/&#34;&gt;ShEx&lt;/a&gt; is easier ad popular.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://w3c.github.io/N3/spec/&#34;&gt;Notation3&lt;/a&gt;. A W3C assertion and logic language which is a superset of RDF.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/josd/eye&#34;&gt;EYE Reasoner&lt;/a&gt;. Prolog-based N3 (Notation3) reasoner. CLI + API-friendly. Can perform rule-based reasoning and generate new triples.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.hermit-reasoner.com/&#34;&gt;HermiT&lt;/a&gt;. OWL 2 DL reasoner. Can check consistency, classify ontologies, compute entailments. CLI and Java API. Modern, maintained.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jena.apache.org/&#34;&gt;Apache Jena&lt;/a&gt;. Java framework for RDF/SPARQL. Built-in reasoners (RDFS, OWL mini/micro/full). CLI via &lt;code&gt;riot&lt;/code&gt;, &lt;code&gt;arq&lt;/code&gt; (SPARQL query engine). Popular for RDF graph stores + inference.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do developers feel this way? #ai-coding&lt;/li&gt;
&lt;li&gt;In another example of vibe coding, an instructor for my TDS course vibe-coded most of an &lt;a href=&#34;https://exam.sanand.workers.dev/tds-2025-05-roe2&#34;&gt;exam&lt;/a&gt; using Copilot and Sonnet. 6/8 questions worked one-shot. The two #ai-coding failures were interesting:
&lt;ul&gt;
&lt;li&gt;One failed because of &lt;a href=&#34;https://chatgpt.com/share/68a3fd83-c9c4-800c-8b0e-4a8c46858024&#34;&gt;sample vs population stats&lt;/a&gt;. Copilot asked for sample variance but coded &lt;code&gt;variance()&lt;/code&gt; instead of &lt;code&gt;sampleVariance()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Another failed because of &lt;a href=&#34;https://chatgpt.com/share/68a3fdad-96e0-800c-8e26-441127ccb713&#34;&gt;rounding off&lt;/a&gt;. NumPy code rounds off differently from Python or JS code.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Meditation is about noticing distraction and returning to focus. So, distraction is necessary &lt;em&gt;and&lt;/em&gt; good. #beliefs&lt;/li&gt;
&lt;li&gt;#ai-coding can make us overconfident. (At least, it makes &lt;em&gt;me&lt;/em&gt; overconfident.) They create surprisingly good output, but only ~20% of the time. I cannot &lt;em&gt;commit to a specific task&lt;/em&gt; based on that. Instead, it&amp;rsquo;s better to rely on AI coding estimates for portfolios, e.g. promise to share &lt;em&gt;something&lt;/em&gt; cool without mentioning what. Or do something cool first, &lt;em&gt;then&lt;/em&gt; share.&lt;/li&gt;
&lt;li&gt;Notes from podcast with Daniel Kahnemann. The Knowledge Project.
&lt;ul&gt;
&lt;li&gt;Happiness is pleasure in the moment. Satisfaction is the meaningful story of our life. When we &lt;em&gt;think&lt;/em&gt;, we want satisfaction. When we &lt;em&gt;feel&lt;/em&gt;, we want happiness. The thinking brain and feeling brain optimize for slightly different things. E.g. The thinking brain packs the calendar with satisfying tasks that the feeling brain feels unhappy executing Both are good for us. We don&amp;rsquo;t know which matters more.&lt;/li&gt;
&lt;li&gt;Behavior change is harder than we think. Usually, it&amp;rsquo;s better not to expect success in changing others, or ourselves. Instead, understand &lt;em&gt;why&lt;/em&gt; that behavior makes sense. Our behaviour is an equilibrium of forces. Weakening &amp;ldquo;bad&amp;rdquo; forces is easier than strengthening &amp;ldquo;good&amp;rdquo; forces, since it lowers tension. That&amp;rsquo;s inversion!&lt;/li&gt;
&lt;li&gt;Behaviours tell us more about &lt;em&gt;situations&lt;/em&gt; than personality. We assume otherwise. That&amp;rsquo;s an attribution error.&lt;/li&gt;
&lt;li&gt;Motivation is complex. People can do bad things for good reasons and vice versa.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Feelings get in the way of clear thinking.&amp;rdquo; Example: I vibe-coded the last 2 questions of &lt;a href=&#34;https://exam.sanand.workers.dev/tds-2025-05-ga7&#34;&gt;TDS GA7&lt;/a&gt; on Claude Code. It didn&amp;rsquo;t run. I delayed fixing it for 5 days, afraid it would a major effort. It ended up a 2 min fix. It &lt;em&gt;could&lt;/em&gt; have been major, but checking would have helped. Fear prevented that.&lt;/li&gt;
&lt;li&gt;Things that hamper clear thinking: intuition, emotion, beliefs. Beliefs are often formed based on people we admire or identify, not reason.
&lt;ul&gt;
&lt;li&gt;Prefer rules, systems and processes. Willpower is an illusion.&lt;/li&gt;
&lt;li&gt;Delegate decisions to unemotional agents. (But agents misjudge perceived value of gain or loss!)&lt;/li&gt;
&lt;li&gt;Break down the problem, analyze it, THEM form an intuition. Be disciplined in delaying intuition or forming an opinion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Environment shapes thinking but it&amp;rsquo;s not obvious how, e.g. some people work better in noisy cafes. Some colors are more calming.&lt;/li&gt;
&lt;li&gt;Protect dissenters and dissent. It&amp;rsquo;s painful and costly, and needs nurturing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nodejs.org/en/learn/typescript/run-natively&#34;&gt;NodeJS runs TypeScript files natively&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chatgpt.com/codex&#34;&gt;Codex&lt;/a&gt; can clone any GitHub repo. So I can ask it to pull one or more repos, understand their code, and use that as a template or reference. This makes my repositories (and others&amp;rsquo;) reusable templates. Using newer libraries and platforms becomes easier, too. #ai-coding&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.trackingai.org/home&#34;&gt;Tracking AI&lt;/a&gt; runs an IQ test on various LLMs every week. GPT 5 Pro leads, currently, followed by Claude 4 Opus and Gemini 2.5 Pro. It&amp;rsquo;s surprising how far behind GPT 5 is at the moment.&lt;/li&gt;
&lt;li&gt;LLMs are faster than me. So me learning and doing what the LLM says is a bottleneck. Get out of the way. For example do not learn. Do not execute. Do not verify. Give LLMs the tools to deploy, verify and iterate to improve.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Meta AI Coding: Using AI to Prompt AI</title>
      <link>https://www.s-anand.net/blog/meta-ai-coding-using-ai-to-prompt-ai/</link>
      <pubDate>Wed, 13 Aug 2025 09:43:24 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/meta-ai-coding-using-ai-to-prompt-ai/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m &amp;ldquo;meta AI coding&amp;rdquo; &amp;ndash; using an AI code editor to create the prompt for an AI code editor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time&lt;/strong&gt;. The task is complex. If the LLM (or I) mess up, I don&amp;rsquo;t want re-work. Review time is a bottleneck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;. Codex is free on my $20 OpenAI plan. Claude Code is ~$1 per chat, so I want value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt;. I want to see what a &lt;strong&gt;good&lt;/strong&gt; prompt looks like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I wrote a rough prompt in &lt;code&gt;prompts.md&lt;/code&gt;, told Codex:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;prompts.md has a prompt under the &amp;ldquo;# Improve schema&amp;rdquo; section starting line 294.&lt;br&gt;
This is a prompt that will be passed to Claude Code to implement.&lt;br&gt;
Ask me questions as required and improve the prompt so that the results will be in line with my expectations, one-shot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Codex answered:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I read the “Improve schema” section. A few specifics need your call so I can produce a single, precise prompt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Masters vs layouts: Remove masters entirely and keep a &lt;code&gt;layouts[]&lt;/code&gt;, or remove layouts and keep &lt;code&gt;masters[]&lt;/code&gt; with &lt;code&gt;shapes&lt;/code&gt; acting as the layout? The bullets conflict.&lt;/li&gt;
&lt;li&gt;Shape registry: Confirm &lt;code&gt;.shapes&lt;/code&gt; is an object map keyed by &lt;code&gt;id&lt;/code&gt; at every level (root, master/layout, slide), not arrays. Ordering via &lt;code&gt;z&lt;/code&gt; only?&lt;/li&gt;
&lt;li&gt;Merge semantics: Confirm deep-merge precedence root.shapes &amp;lt; mid-level (master/layout).shapes &amp;lt; slide.shapes, by &lt;code&gt;id&lt;/code&gt;. For arrays like &lt;code&gt;list.items&lt;/code&gt;, replace (not concat)?&lt;/li&gt;
&lt;li&gt;Theme flattening: Move &lt;code&gt;theme.colors&lt;/code&gt; and &lt;code&gt;theme.fonts&lt;/code&gt; to root as &lt;code&gt;colors&lt;/code&gt; and &lt;code&gt;fonts&lt;/code&gt;, or keep &lt;code&gt;theme&lt;/code&gt; but allow root aliases? Which do you prefer?&lt;/li&gt;
&lt;li&gt;Back-compat: Keep support for old schema, or drop and add a migration utility (CLI/script) to transform old→new? If keep, how long to maintain?&lt;/li&gt;
&lt;li&gt;Version: Bump to &lt;code&gt;version: \&amp;quot;2.0.0\&amp;quot;&lt;/code&gt; for the new schema?&lt;/li&gt;
&lt;li&gt;Validation: Add a JSON Schema file and validate inputs in &lt;code&gt;slidegen.html()&lt;/code&gt; (fast fail)? If yes, filename path e.g., &lt;code&gt;schema/slidegen.schema.json&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Tests and samples: Update all decks in &lt;code&gt;tests/&lt;/code&gt; (incl. &lt;code&gt;shapes-demo.json&lt;/code&gt;) and &lt;code&gt;tests/index.html&lt;/code&gt; to new schema only?&lt;/li&gt;
&lt;li&gt;Overrides removal: Confirm &lt;code&gt;slides[].overrides&lt;/code&gt; is removed entirely; all overrides via &lt;code&gt;slides[].shapes&lt;/code&gt; only.&lt;/li&gt;
&lt;li&gt;Any additional fields to normalize while we’re here (e.g., unify &lt;code&gt;unit&lt;/code&gt;, enforce &lt;code&gt;%|px&lt;/code&gt;, formalize border props)?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reply with your choices. I’ll then deliver a single, one-shot prompt for Claude Code with exact schema, merge rules, migration plan, test updates, and acceptance criteria aligned to your coding guidelines.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I replied:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;masters versus layouts: I want you to remove masters entirely and keep a layouts[]. There currently are layouts inside masters, move them up to one level.&lt;/li&gt;
&lt;li&gt;.shapes is not an object map currently. It SHOULD be an object map keyed by &lt;code&gt;id&lt;/code&gt; at every level and not arrays and it should be ordered via z only.&lt;/li&gt;
&lt;li&gt;The deep merge precedence that you have listed is correct.&lt;/li&gt;
&lt;li&gt;For list.items replacement instead of concatenation is correct.&lt;/li&gt;
&lt;li&gt;Since we are flattening the themes, we do not want theme at the root level and we do not want theme.colors/fonts aliases.&lt;/li&gt;
&lt;li&gt;We do not want to support old schema.&lt;/li&gt;
&lt;li&gt;We do not want to migrate from old schema.&lt;/li&gt;
&lt;li&gt;We do not want to bump up the version.&lt;/li&gt;
&lt;li&gt;We do not want to create a json schema file.&lt;/li&gt;
&lt;li&gt;We do want to update all the tests including shapes-demo.json.&lt;/li&gt;
&lt;li&gt;We do want to remove slides.overrides entirely, no other fields to normalize.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any other questions, please ask. Else update prompts.md&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Codex gave an output. I reviewed it and sent one more prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Drop the house rules.&lt;br&gt;
Allow the root .bg to be overridden by layouts[].bg to be overridden by slides[].bg &amp;ndash; and all the .bg values can be { fille, image, image_fit }&lt;br&gt;
layouts must be an object with the .id as key instead of a field. If any of this is unclear, please ask me. Else update prompts.md.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It finally settled on &lt;a href=&#34;https://github.com/sanand0/slidegen/blame/de953817266357b00d80d4fa3e17def02e0de292/prompts.md#L296-L502&#34;&gt;this remarkable prompt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This prompt was so clear it was &lt;strong&gt;easy to review&lt;/strong&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;strong&gt;easy for Claude Code&lt;/strong&gt; to follow (no inconsistencies).&lt;/p&gt;
&lt;p&gt;I plan to use this technique more. You might want to try it, too.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 10 Aug 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-10-aug-2025/</link>
      <pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-10-aug-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI supports a tool &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;custom&amp;quot;&lt;/code&gt; that lets it write code as an argument to a tool call. Great for code / SQL generation. Even more powerfully, you can generate output following specific grammars, e.g. STL files, PostgreSQL dialect, Mermaid/PlantUML diagrams, OpenAPI specs, Vega-Lite JSONs, Cron expressions, GraphQL SDLs, Dockerfiles, Terraform HCLs, or any DSL! &lt;a href=&#34;https://cookbook.openai.com/examples/gpt-5/gpt-5_new_params_and_tools&#34;&gt;#&lt;/a&gt; #ai-coding&lt;/li&gt;
&lt;li&gt;The OpenAI playground has a &lt;a href=&#34;https://platform.openai.com/chat/edit?models=gpt-5&amp;amp;optimize=true&#34;&gt;GPT-5 Prompt Optimizer&lt;/a&gt; that can migrate prompts to GPT-5.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/docsify/v/4.13.1&#34;&gt;Docsify 4.13.1&lt;/a&gt; is 2 years old and &lt;a href=&#34;https://github.com/docsifyjs/docsify/blob/v4.13.1/package.json#L68&#34;&gt;uses&lt;/a&gt; &lt;a href=&#34;https://www.npmjs.com/package/marked/v/1.2.9&#34;&gt;marked@1.2.9&lt;/a&gt; which is 5 years old. Newer plugins like &lt;a href=&#34;https://www.npmjs.com/package/marked-directive&#34;&gt;marked-directive&lt;/a&gt; don&amp;rsquo;t work with it. Though &lt;a href=&#34;https://github.com/docsifyjs/docsify/tree/v5.0.0-rc.1&#34;&gt;docsify v5.0.0-rc1&lt;/a&gt; is in development, it may be the better option for modern Markdown plugins. &lt;a href=&#34;https://github.com/sanand0/smartart/blob/e4c5bb88eba3aa3cd92d6711a9e29935cc36e62f/script.js&#34;&gt;Here&amp;rsquo;s sample code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CommonMark has a &lt;em&gt;powerful&lt;/em&gt; &lt;a href=&#34;https://talk.commonmark.org/t/generic-directives-plugins-syntax/444&#34;&gt;directive syntax&lt;/a&gt; proposal that lets you add classes, attributes, and arbitrary plugins to Markdown. For example, &lt;code&gt;:abbr[MD]{#id .class title=&amp;quot;Markdown&amp;quot;}&lt;/code&gt; for inline directives. Plugins exist for &lt;a href=&#34;https://www.npmjs.com/package/marked-directive&#34;&gt;marked&lt;/a&gt;, &lt;a href=&#34;http://npmjs.com/package/markdown-it-directive&#34;&gt;markdown-it&lt;/a&gt; and &lt;a href=&#34;https://github.com/remarkjs/remark-directive&#34;&gt;remark&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://biomejs.dev/&#34;&gt;biomejs&lt;/a&gt; and &lt;a href=&#34;https://dprint.dev/&#34;&gt;dprint&lt;/a&gt; are gaining traction as &lt;a href=&#34;https://prettier.io/&#34;&gt;prettier&lt;/a&gt; alternatives. I&amp;rsquo;m yet to try them but keen to explore.
&lt;ul&gt;
&lt;li&gt;Skip biomejs for now. It uses tabs (not spaces) and does not respect .gitignore by default. Handling these is too much work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;⭐ Code generation is more flexible than tool calling. LLMs can&amp;rsquo;t write a tool-call loop, for example, but they can write code to run an API in a loop. So, I like telling the LLM to &amp;ldquo;write code using these APIs&amp;rdquo; than giving it APIs to tool-call. #ai-coding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npx -y ccusage&lt;/code&gt; is an easy way of summarizing your &lt;a href=&#34;https://docs.anthropic.com/en/docs/claude-code/overview&#34;&gt;Claude Code&lt;/a&gt; usage and cost. My cost so far (since 21 July) is about $10. The median session cost is ~50 cents. Most of it ($7) was from a single temporary coding chat that I kept continuing for way too long, building up the context window. &lt;a href=&#34;https://github.com/ryoppippi/ccusage&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kepano/defuddle&#34;&gt;defuddle&lt;/a&gt; can be used in the browser to get the main content from web pages. A replacement for Mozilla Readability. &lt;a href=&#34;https://stephango.com/defuddle&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kashw1n.com/blog/nodejs-2025/&#34;&gt;Modern Node.js Patterns for 2025&lt;/a&gt; include these 5 features I&amp;rsquo;m excited by:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single-executable bundling&lt;/strong&gt;. &lt;code&gt;node --experimental-sea-config sea-config.json&lt;/code&gt; builds standalone binaries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ES Modules&lt;/strong&gt;. Use &lt;code&gt;node:&lt;/code&gt; prefix for built-in imports. &lt;code&gt;import { createServer } from &#39;node:http&#39;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch mode&lt;/strong&gt;. Use &lt;code&gt;node --watch file.js&lt;/code&gt; auto-reloads when &lt;code&gt;file.js&lt;/code&gt; or dependencies change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Env file&lt;/strong&gt;. Use &lt;code&gt;node --env-file=.env&lt;/code&gt; loads &lt;code&gt;.env&lt;/code&gt; as environment variables.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;node:test&lt;/code&gt;&lt;/strong&gt; is a full-featured test framework with &lt;code&gt;--watch&lt;/code&gt; and coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Concise explanations speed up decisions because they&amp;rsquo;re faster to read and understand (obvious). They&amp;rsquo;re also easier to combine with other ideas (less obvious). &lt;a href=&#34;https://stephango.com/concise&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve been uncertain about &lt;a href=&#34;https://htmx.org/&#34;&gt;htmx&lt;/a&gt; for some time now. This tutorial, &lt;a href=&#34;https://github.com/BookOfCooks/blog/blob/master/htmx-is-hard-so-lets-get-it-right.md&#34;&gt;HTMX is hard, so let&amp;rsquo;s get it right&lt;/a&gt;, convinced me that it&amp;rsquo;s too far from my mental model, so I&amp;rsquo;m unlikely to ever use it.&lt;/li&gt;
&lt;li&gt;⭐ Slow, effortful practice (spaced recall, interleaving topics, self-testing) builds lasting knowledge but looks inefficient and doesn&amp;rsquo;t help with exams. &lt;a href=&#34;https://chatgpt.com/share/689180c7-03a0-800c-a5d4-5a455429e97f&#34;&gt;#&lt;/a&gt; #beliefs&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=vsls-contrib.gitdoc&#34;&gt;GitDoc VS Code extension&lt;/a&gt; auto-commits and syncs notes. I dropped &lt;a href=&#34;https://github.com/gitwatch/gitwatch&#34;&gt;gitwatch&lt;/a&gt; in favor of this.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s interesting that Gemini Deep Research cannot access Google Drive while Gemini can. On the other hand, ChatGPT Deep Research can access Google Drive but ChatGPT cannot.&lt;/li&gt;
&lt;li&gt;A trend that AI coding will only accelerate: &amp;ldquo;It is now possible for tiny teams to make principled software that millions of people use, unburdened by investors. &amp;hellip; you need far less money and far fewer employees to reach far more customers. That wave is only just beginning.&amp;rdquo; &lt;a href=&#34;https://stephango.com/vcware&#34;&gt;#&lt;/a&gt; #ai-coding&lt;/li&gt;
&lt;li&gt;Typed languages are better suited for vibe coding. This will likely lead to the growth of typed languages (TypeScript, Rust, Go) but also of typing in untyped languages (e.g. Python) &lt;a href=&#34;https://solmaz.io/typed-languages-are-better-suited-for-vibecoding&#34;&gt;#&lt;/a&gt; #ai-coding&lt;/li&gt;
&lt;li&gt;Instead of Celery, Redis, Kafka, etc. as task queues, we could the file system as a message queue. For example, &lt;code&gt;pending/task-01.json&lt;/code&gt; moves to &lt;code&gt;wip/task-01.json&lt;/code&gt; to &lt;code&gt;done/task-01.json&lt;/code&gt;. Folders for state/tags, files for task details.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://foambubble.github.io/&#34;&gt;Foam&lt;/a&gt; is a note-taking VS Code extension. The &lt;a href=&#34;https://foambubble.github.io/foam/user/features/wikilinks&#34;&gt;WikiLinks&lt;/a&gt;, &lt;a href=&#34;https://foambubble.github.io/foam/user/features/tags&#34;&gt;tags&lt;/a&gt; and &lt;a href=&#34;https://foambubble.github.io/foam/user/features/backlinking&#34;&gt;backlinking&lt;/a&gt; features align &lt;em&gt;naturally&lt;/em&gt; with Markdown note-taking. Via &lt;a href=&#34;https://stephango.com/vault&#34;&gt;Steph Ango&lt;/a&gt; who uses Obsidian which nudged me to search for WikiLink-ing features in VS Code.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m an open data hawk. But here are things I should remind myself of. &lt;a href=&#34;https://chatgpt.com/c/68901fb2-38b0-8333-9853-7e6c2fdaf97c&#34;&gt;#&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privacy incubates creativity&lt;/strong&gt;. People self-censor when watched. Privacy shields fragile ideas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power assymetry&lt;/strong&gt;. Big players can leverage openness more, e.g. Cambridge Analytics + Facebook data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context matters&lt;/strong&gt;. What&amp;rsquo;s harmless in one setting can be toxic in another.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One-way door&lt;/strong&gt;. Data can&amp;rsquo;t be unshared. Don&amp;rsquo;t scrap brakes dreaming of perfect roads. Anticipate tyrannical regimes / cultures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not your call&lt;/strong&gt;. You don&amp;rsquo;t share your neighbour&amp;rsquo;s medical records.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/One-Punch_Man&#34;&gt;One Punch Man&lt;/a&gt; is available as &lt;a href=&#34;https://onepunchmanmangaa.com/&#34;&gt;manga&lt;/a&gt;. I watched the anime first and assumed that came first. Apparently not.&lt;/li&gt;
&lt;li&gt;⭐ In &amp;ldquo;kind&amp;rdquo; environments (stable rules, rapid and accurate feedback), specialize. In &amp;ldquo;wicked&amp;rdquo; environments (rules shift, feedback is noisy/late), generalize. &lt;a href=&#34;https://chatgpt.com/share/68902bbf-bf58-800c-b6b5-9ae787fa9c26&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Models&amp;rsquo; ability to orchestrate longer workflows will improve. Factor that into your application design. Claude Code can already handle over 70 tasks in a workflow&lt;/li&gt;
&lt;li&gt;What happens when LLMs play Chinese Whispers / the &lt;a href=&#34;https://en.wikipedia.org/wiki/Telephone_game&#34;&gt;Telephone Game&lt;/a&gt;? Here are learnings. &lt;a href=&#34;https://chatgpt.com/share/68904271-6d10-800c-9084-8ae28668df92&#34;&gt;ChatGPT&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Drift increases faster than linear with hops.&lt;/li&gt;
&lt;li&gt;Bigger models do better, but constrained prompts (“Copy the text exactly; change nothing.”) have a bigger impact.&lt;/li&gt;
&lt;li&gt;Low temperature improves copying fidelity.&lt;/li&gt;
&lt;li&gt;But even after &amp;ldquo;forgetting&amp;rdquo;, LLMs reproduce rare content if they&amp;rsquo;re trained on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;In fact, React Native looks set to become the most engine-agnostic JavaScript runtime around&amp;rdquo;. &lt;a href=&#34;https://buttondown.com/whatever_jamie/archive/the-many-many-many-javascript-runtimes-of-the-last-decade/&#34;&gt;The Many, Many, Many, JavaScript Runtimes of the Last Decade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.omdbapi.com/&#34;&gt;OMDb&lt;/a&gt; (simple) and &lt;a href=&#34;https://www.themoviedb.org/&#34;&gt;TMDb&lt;/a&gt; (comprehensive) are API-friendly alternatives to the IMDb.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/9001/copyparty&#34;&gt;copyparty&lt;/a&gt; seems one of the most feature-rich file servers out there. Single Python file, runs on any OS, works with any client, and optimized for speed. &lt;a href=&#34;https://youtu.be/15_-hgsX2V0&#34;&gt;Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Quotes I enjoyed from &lt;a href=&#34;https://youtu.be/o8NPllzkFhE&#34;&gt;Linus Torvalds&amp;rsquo; TED interview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I want to not have external stimulation. You can kind of see, on the walls are this light green. I&amp;rsquo;m told that at mental institutions they use that on the walls. It&amp;rsquo;s like a calming color. &amp;hellip; the main thing I worry about in my computer is &amp;ndash; it really has to be completely silent. If the cat comes up, it sits in my lap. And I want to hear the cat purring.&lt;/li&gt;
&lt;li&gt;I did not start Linux as a collaborative project. I started it as one in a series of many projects I had done at the time for myself, partly because I needed the end result, but even more because I just enjoyed programming.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m actually not a people person. But I do love other people who comment and get involved in my project.&lt;/li&gt;
&lt;li&gt;The big point for me was not being alone and having 10, maybe 100 people being involved. Going from 100 people to a million people is not a big deal &amp;ndash; to me. Well, I mean, maybe it is if you want to sell your result then it&amp;rsquo;s a huge deal. But if you&amp;rsquo;re interested in the technology and you&amp;rsquo;re interested in the project, the big part was getting the community.&lt;/li&gt;
&lt;li&gt;So Git is my second big project, which was only created for me to maintain my first big project. And this is literally how I work.&lt;/li&gt;
&lt;li&gt;Well, I do code for fun &amp;ndash; but I want to code for something meaningful so every single project I&amp;rsquo;ve ever done has been something I needed.&lt;/li&gt;
&lt;li&gt;Apparently, my sister said that my biggest exceptional quality was that I would not let go.&lt;/li&gt;
&lt;li&gt;I can&amp;rsquo;t do UI to save my life.&lt;/li&gt;
&lt;li&gt;Good taste is about really seeing the big patterns and kind of instinctively knowing what&amp;rsquo;s the right way to do things.&lt;/li&gt;
&lt;li&gt;Companies like Google and many others have made, arguably, like, billions of dollars out of your software. Does that piss you off? No. No, it doesn&amp;rsquo;t piss me off for several reasons. And one of them is, I&amp;rsquo;m doing fine. But the other reason is &amp;ndash; I mean, without doing the whole open source and really letting go thing, Linux would never have been what it is.&lt;/li&gt;
&lt;li&gt;I think one reason open source works so well in code (is that &amp;hellip;) Code either works or it doesn&amp;rsquo;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://usesthis.com/&#34;&gt;Uses This&lt;/a&gt; site has interviewed professionals for decades. From their &lt;a href=&#34;https://github.com/waferbaby/usesthis&#34;&gt;repo&lt;/a&gt; I scraped the top developer apps post 2020:&lt;/li&gt;
&lt;li&gt;CloudFlare has an Iceberg data catalog in &lt;a href=&#34;https://developers.cloudflare.com/r2/data-catalog/&#34;&gt;R2 Data Catalog&lt;/a&gt;. Iceberg is like Parquet but supports metadata, time-travel, and schema edits. But I&amp;rsquo;m yet to find a single publicly accessible Iceberg catalog. Its open-data adoption is not as high as Parquet&amp;rsquo;s. &lt;a href=&#34;https://chatgpt.com/share/688f0b61-f9d8-800c-a7c8-46410ab4f1ab&#34;&gt;Apache Iceberg vs Parquet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://observablehq.com/notebook-kit/&#34;&gt;Observable Notebook 2&lt;/a&gt; is the new notebook format from Mike Bostock. It is vanilla JS and embeddable into other pages. THis would have been a big deal 2 years ago, but with the LLM ecosystem today, I&amp;rsquo;m not sure if it matters as much.&lt;/li&gt;
&lt;li&gt;To add CORS support to CloudFlare pages protected by Zero Trust, add a &lt;a href=&#34;https://developers.cloudflare.com/pages/configuration/headers/&#34;&gt;&lt;code&gt;_headers&lt;/code&gt;&lt;/a&gt; file to your repo. (This is different from the &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/identity/authorization-cookie/cors/&#34;&gt;Zero Trust CORS&lt;/a&gt; which allows automated logins.) Sample &lt;code&gt;_headers&lt;/code&gt; that lets logged-in users fetch pages via &lt;code&gt;fetch(&amp;quot;...&amp;quot;, { credentials: &amp;quot;include&amp;quot; })&lt;/code&gt;:
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/*
  Access-Control-Allow-Credentials: true
  Access-Control-Allow-Origin: https://your-site.example.com
  Access-Control-Allow-Methods: GET, HEAD
  Access-Control-Allow-Methods: *
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;As corporates restrict the use of LLMs, I see employees purchasing personal laptops to use LLMs on. An interesting trend!&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/openai/openai-python&#34;&gt;&lt;code&gt;openai-python&lt;/code&gt;&lt;/a&gt; has a CLI. You can run &lt;code&gt;uvx openai api chat.completions.create --stream -m gpt-4.1-nano -g developer &#39;Translate to Chinese&#39; -g user &amp;quot;Hello&amp;quot;&lt;/code&gt; for example&lt;/li&gt;
&lt;li&gt;Anthropic has an &lt;a href=&#34;https://docs.anthropic.com/en/api/openai-sdk&#34;&gt;OpenAI compatible API&lt;/a&gt; at &lt;code&gt;https://api.anthropic.com/v1/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Claude Code tips from &lt;a href=&#34;https://lucumr.pocoo.org/2025/7/30/things-that-didnt-work/&#34;&gt;Things that didn&amp;rsquo;t work&lt;/a&gt; by Armin Rocher #ai-coding
&lt;ul&gt;
&lt;li&gt;Speech-to-text. Cannot stress this enough but talking to the machine means you’re more likely to share more about what you want it to do.&lt;/li&gt;
&lt;li&gt;I maintain some basic prompts and context for copy-pasting at the end or the beginning of what I entered.&lt;/li&gt;
&lt;li&gt;I ended up preloading executables on the PATH that override the default ones, steering Claude toward the right tools, e.g. running &lt;code&gt;python&lt;/code&gt; asks it to use &lt;code&gt;uv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I use the task tool frequently for basic parallelization and context isolation.&lt;/li&gt;
&lt;li&gt;Simply taking time to talk to the machine and give clear instructions outperforms elaborate pre-written prompts.&lt;/li&gt;
&lt;li&gt;Forcing myself to evaluate the automation has another benefit: I’m less likely to just blindly assume it helps me.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Research indicates that we don&amp;rsquo;t know in advance which prompts will help. Evals beat prompt engineering. &lt;a href=&#34;https://bsky.app/profile/emollick.bsky.social/post/3lvgwdwn7422w&#34;&gt;Ethan Mollick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 08 Jun 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-08-jun-2025/</link>
      <pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-08-jun-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There&amp;rsquo;s a very interesting &lt;a href=&#34;https://news.ycombinator.com/item?id=44159166&#34;&gt;HN discussion&lt;/a&gt; on the AI coding of &lt;a href=&#34;https://github.com/cloudflare/workers-oauth-provider/commits/main/&#34;&gt;CloudFlare Workers OAuth Provider&lt;/a&gt;. My takeaways: #ai-coding
&lt;ul&gt;
&lt;li&gt;Write &lt;em&gt;very&lt;/em&gt; comprehensive specs.&lt;/li&gt;
&lt;li&gt;Use LLM to create the specs.&lt;/li&gt;
&lt;li&gt;Reviewing is a skill we need to develop.&lt;/li&gt;
&lt;li&gt;Understanding others&amp;rsquo; code takes effort.&lt;/li&gt;
&lt;li&gt;But LLM code is easier to review because it&amp;rsquo;s immediate and has no ego.&lt;/li&gt;
&lt;li&gt;Unit tests are critical.&lt;/li&gt;
&lt;li&gt;Use LLMs for well understood specs, APIs, platforms and libraries to really save time.&lt;/li&gt;
&lt;li&gt;Logic-less stuff like Markdown, JSON and HTML templates are a LOT easier to verify. Do more of that.&lt;/li&gt;
&lt;li&gt;We can only make so many decisions in a day. AI coding saves us that effort.&lt;/li&gt;
&lt;li&gt;Experts are not experts in every area. They benefit from LLMs in other areas.&lt;/li&gt;
&lt;li&gt;LLMs are great for rubber ducking. Speaking and speccing really help.&lt;/li&gt;
&lt;li&gt;LLMs make mistakes. So do most humans.&lt;/li&gt;
&lt;li&gt;LLM speed makes coding more exhausting.&lt;/li&gt;
&lt;li&gt;Use LLMs to understand codebases.&lt;/li&gt;
&lt;li&gt;AI coding &lt;em&gt;could&lt;/em&gt; reduce demand for developers. E.g. Sysadmin demand plummeted with cloud infra and infrastructure-as-code.&lt;/li&gt;
&lt;li&gt;But, niche use cases could grow, like how demand for photographers grew despite point-and-shoot cameras.&lt;/li&gt;
&lt;li&gt;Transaction cost of hiring even 1 person is high and that will likely be a bottleneck. Plus people can use LLMs themselves, so that will dampen niche demand.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google Introduced &lt;a href=&#34;https://docs.google.com/videos/&#34;&gt;Google Vids&lt;/a&gt; last year. It&amp;rsquo;s a video creator styled like PowerPoint. Looks promising.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/jlowin/fastmcp&#34;&gt;FastMCP&lt;/a&gt; looks like an easy way to build MCPs. (Yet to try it)&lt;/li&gt;
&lt;li&gt;O3 and to a lesser extent, Claude Sonnet 4, are the models that can accurately summarize complex subjects and create a list of links without hallucinations. &lt;a href=&#34;https://mikecaulfield.substack.com/p/differences-in-link-hallucination&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/badlogic/lemmy/tree/main/apps/claude-trace&#34;&gt;Claude Trace&lt;/a&gt; lets you record all interactions with Claude Code.&lt;/li&gt;
&lt;li&gt;Elevenlabs now supports emotion and interruption. &lt;a href=&#34;https://x.com/venturetwins/status/1930727253815759010&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thinking longer alone is not enough to scale intelligence. We need better models, too. &lt;a href=&#34;https://x.com/MFarajtabar/status/1930707627509789054&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Indian High Court judgements are now available as a public dataset on AWS and updated periodically. &lt;a href=&#34;https://registry.opendata.aws/indian-high-court-judgments/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A few observations in AI code editors&amp;rsquo; styles.
&lt;ul&gt;
&lt;li&gt;O3 is better at &lt;em&gt;finding&lt;/em&gt; bugs than Jules, which tends to try and fix them rather than discover them.&lt;/li&gt;
&lt;li&gt;Codex writes more minimal edits in PRs than Jules, which is more verbose.&lt;/li&gt;
&lt;li&gt;Claude Code remains the best at faithfully creating and updating front-end apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deep Research is great for fact-checking my notes! &lt;a href=&#34;https://chatgpt.com/share/684274ef-a280-800c-8b35-21cf0353ad51&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/bytedance/web-bench&#34;&gt;Web bench&lt;/a&gt; evaluates LLMs in web development. Claude Sonnet remains ahead.&lt;/li&gt;
&lt;li&gt;Vision language models heavily rely on past training and miss changes they don&amp;rsquo;t expect. &lt;a href=&#34;https://github.com/anvo25/vlms-are-biased&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pure CSS tooltips are possible. &lt;a href=&#34;https://jvns.ca/til/in-css-you-can-populate--content---with-a--data---attribute/&#34;&gt;Julia Evans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google has an &lt;a href=&#34;https://developers.google.com/oauthplayground/&#34;&gt;OAuth Playground&lt;/a&gt; which is a convenient way to get a temporary OAuth token.&lt;/li&gt;
&lt;li&gt;At the moment, the best speech to text for Android appears to be ChatGPT&amp;rsquo;s transcription. The default Android text to speech (which I thought was good) no longer feels adequate. Gemini mis-hears and doesn&amp;rsquo;t wait till I&amp;rsquo;m done. Whisper ASR has poor noise cancellation and a 30 second limit.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/anyascii/anyascii&#34;&gt;anyascii&lt;/a&gt; is a better alternative to &lt;a href=&#34;https://pypi.org/project/Unidecode/&#34;&gt;unidecode&lt;/a&gt;. It supports more characters and also supports transliteration. I use it to strip out non-ASCII in ChatGPT&amp;rsquo;s output. &lt;a href=&#34;https://github.com/sanand0/scripts/commit/5ea8493&#34;&gt;Commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deepwiki.com/&#34;&gt;DeepWiki&lt;/a&gt; creates docs for humans GitHub repos. &lt;a href=&#34;https://deepwiki.com/sanand0/aipipe/&#34;&gt;Example&lt;/a&gt;. It&amp;rsquo;s verbose, human-facing, and does not understand the nuances of context and implications. &lt;a href=&#34;https://context7.com/&#34;&gt;Context7&lt;/a&gt; creates llms.txt for LLMs. &lt;a href=&#34;https://context7.com/sanand0/aipipe&#34;&gt;Example&lt;/a&gt;. It&amp;rsquo;s concise, example-oriented, and works only if there are code snippets relevant (e.g. API calls) that can be generated from the codebase. Like creating an llms.txt automatically, e.g. &lt;a href=&#34;https://context7.com/textualize/textual/llms.txt&#34;&gt;https://context7.com/textualize/textual/llms.txt&lt;/a&gt; #ai-coding&lt;/li&gt;
&lt;li&gt;We will move towards an organization structure where developers are embedded with business teams rather than working as a separate group. Sort of like embedded executive assistance instead of a central typing pool. &lt;a href=&#34;https://www.oneusefulthing.org/p/making-ai-work-leadership-lab-and&#34;&gt;Making AI Work&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>When to Vibe Code? If Speed Beats Certainty</title>
      <link>https://www.s-anand.net/blog/when-to-vibe-code-if-speed-beats-certainty/</link>
      <pubDate>Tue, 20 May 2025 10:59:50 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/when-to-vibe-code-if-speed-beats-certainty/</guid>
      <description>&lt;p&gt;I spoke about vibe coding at &lt;a href=&#34;https://setuschool.com/&#34;&gt;SETU School&lt;/a&gt; last week.&lt;/p&gt;
&lt;div class=&#34;video-embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube.com/embed/ODXSDbY12dg&#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;strong&gt;Transcript&lt;/strong&gt;: &lt;a href=&#34;https://sanand0.github.io/talks/#/2025-05-10-vibe-coding/&#34;&gt;https://sanand0.github.io/talks/#/2025-05-10-vibe-coding/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here are the top messages from the talk:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is vibe coding&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s where we ask the model to write &amp;amp; run code, don&amp;rsquo;t read the code, just inspect the &lt;strong&gt;behaviour&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a &lt;strong&gt;coder&amp;rsquo;s tactic&lt;/strong&gt;, not a methodology. Use it when speed trumps certainty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it&amp;rsquo;s catching on&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Non-coders can now ship apps&lt;/strong&gt; - no mental overhead of syntax or structure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coders think at a higher level&lt;/strong&gt; - stay in problem space, not bracket placement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model capability keeps widening&lt;/strong&gt; - the &amp;ldquo;vibe-able&amp;rdquo; slice grows every release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;How to work with it day-to-day&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fail fast, hop models&lt;/strong&gt; - if Claude errors, paste into Gemini or OpenAI and move on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t fight sandbox limits&lt;/strong&gt; - browser LLM sandboxes block net calls; accept &amp;amp; upload files instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-validate outputs&lt;/strong&gt; - ask a second LLM to critique or replicate; cheaper than reading 400 lines of code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch modes deliberately&lt;/strong&gt; - &lt;strong&gt;Vibe coding&lt;/strong&gt; when you don&amp;rsquo;t care about internals and time is scarce, &lt;strong&gt;AI-assisted coding&lt;/strong&gt; when you must own the code (read + tweak), &lt;strong&gt;Manual&lt;/strong&gt; only for the gnarly 5 % the model still can&amp;rsquo;t handle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What should we watch out for&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security risk&lt;/strong&gt; - running unseen code can nuke your files; sandbox or use throw-away environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internet-blocked runtimes&lt;/strong&gt; - prevents scraping/DoS misuse but forces data uploads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality cliffs&lt;/strong&gt; - small edge-cases break; be ready to drop to manual fixes or wait for next model upgrade.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What are the business implications&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agencies still matter&lt;/strong&gt; - they absorb legal risk, project-manage, and can be bashed on price now that AI halves their grunt work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prototype-to-prod blur&lt;/strong&gt; - the same vibe-coded PoC can often be hardened instead of rewritten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI convergence&lt;/strong&gt; - chat + artifacts/canvas is becoming the default &amp;ldquo;front-end&amp;rdquo;; underlying apps become API + data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;How does this impact education&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Curriculum can refresh term-by-term&lt;/strong&gt; - LLMs draft notes, slides, even whole modules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assessment shifts back to subjective&lt;/strong&gt; - LLM-graded essays/projects at scale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teach &amp;ldquo;learning how to learn&amp;rdquo;&lt;/strong&gt; - Pomodoro focus, spaced recall, chunking concepts, as in &lt;strong&gt;Learn Like a Pro&lt;/strong&gt; (Barbara Oakley).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best tactic for staying current&lt;/strong&gt; - experiment &amp;gt; read; anything written is weeks out-of-date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What are the risks&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Overconfidence risk&lt;/strong&gt; - silent failures look like success until they hit prod.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skill atrophy&lt;/strong&gt; - teams might lose the muscle to debug when vibe coding stalls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Legal &amp;amp; compliance gaps&lt;/strong&gt; - unclear licence chains for AI-generated artefacts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waiting game trap&lt;/strong&gt; - &amp;ldquo;just wait for the next model&amp;rdquo; can become a habit that freezes delivery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A7330549070744223745&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>The Magic of Repeated ‘Improve It’ Prompts</title>
      <link>https://www.s-anand.net/blog/the-magic-of-repeated-improve-it-prompts/</link>
      <pubDate>Fri, 18 Apr 2025 10:02:37 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/the-magic-of-repeated-improve-it-prompts/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;The Magic of Repeated ‘Improve It’ Prompts&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/screenshot-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;What if you &lt;strong&gt;keep&lt;/strong&gt; ask an LLM &lt;code&gt;Improve the code - dramatically!&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;We used the new &lt;a href=&#34;https://platform.openai.com/docs/models/gpt-4.1-nano&#34;&gt;GPT 4.1 Nano&lt;/a&gt;, a fast, cheap, and capable model, to write code for &lt;strong&gt;simple&lt;/strong&gt; tasks like &amp;ldquo;Draw a circle&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The we fed the output back and asked again, &lt;code&gt;Improve the code - dramatically!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Here are the results.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/screenshot-1.webp&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/circle.json&#34;&gt;&lt;code&gt;Draw a circle&lt;/code&gt;&lt;/a&gt; rose from a fixed circle to a full tool: drag it around, tweak its size and hue, and hit “Reset” to start fresh.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/shapes.json&#34;&gt;&lt;code&gt;Animate shapes and patterns&lt;/code&gt;&lt;/a&gt; turned simple circles and squares into a swarm of colored polygons that spin, pulse, and link up by distance.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/clock.json&#34;&gt;&lt;code&gt;Draw a fully functional analog clock&lt;/code&gt;&lt;/a&gt; grew from a bare face to one that builds all 60 tick marks in code—no manual copy‑paste needed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/particles.json&#34;&gt;&lt;code&gt;Create an interactive particle simulation&lt;/code&gt;&lt;/a&gt; went from plain white dots on black to hundreds of bright, color‑shifting balls that bounce, die, and come back to life.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/fractal.json&#34;&gt;&lt;code&gt;Generate a fractal&lt;/code&gt;&lt;/a&gt; changed from a single Mandelbrot image to an explorer you can zoom, drag, and reset with sliders and the mouse wheel.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/dashboard.json&#34;&gt;&lt;code&gt;Generate a dashboard&lt;/code&gt;&lt;/a&gt; jumped from static charts to a live page with smooth card animations, modern fonts, and a real‑time stats box.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few observations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Models are getting &lt;strong&gt;much&lt;/strong&gt; more reliable&lt;/strong&gt;. Even a low cost model like &lt;a href=&#34;https://platform.openai.com/docs/models/gpt-4.1-nano&#34;&gt;GPT 4.1 Nano&lt;/a&gt; wrote error-free code in ~100 retries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When pushed, they tend to brag&lt;/strong&gt;. They attach grand titles like &amp;ldquo;Ultimate Interactive Circle&amp;rdquo; or &amp;ldquo;Galactic Data Universe&amp;rdquo;. They sin out flash descriptions like &amp;ldquo;This dramatically upgraded clock features a pulsating neon glow, animated pulsing background glow, highly stylized tick marks, …&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A simple prompt like &lt;code&gt;Improve it&lt;/code&gt; can spark new ideas&lt;/strong&gt;, revealing features such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/particles.json&#34;&gt;Fading particle trails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/fractal.json&#34;&gt;Smooth fractal color maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/dashboard.json&#34;&gt;Chart.js for dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/clock.json&#34;&gt;Cyberpunk-style clocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;… and a &lt;a href=&#34;https://sanand0.github.io/autoimprove/#apps/shapes.json&#34;&gt;&amp;ldquo;smorgasbord of intricate animated patterns&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2025-04-18-llm-autoimprove-apps-linkedin.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A7318940431025614848&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>How to Visualize Data Stories with AI: Lessons</title>
      <link>https://www.s-anand.net/blog/how-to-visualize-data-stories-with-ai-lessons/</link>
      <pubDate>Mon, 14 Apr 2025 08:21:24 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/how-to-visualize-data-stories-with-ai-lessons/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;How to Visualize Data Stories with AI: Lessons&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/ChatGPT-Image-Apr-14-2025-04_18_33-PM.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;I tried 2 experiments.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Can I code a visual data story &lt;strong&gt;only&lt;/strong&gt; using LLMs?&lt;/strong&gt; Does this make me faster? How much?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Has GitHub Copilot caught up with Cursor?&lt;/strong&gt; How far behind is it? Can I recommend it?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So I built a &lt;a href=&#34;https://sanand0.github.io/eliminationgame/&#34;&gt;visual story&lt;/a&gt; for &lt;a href=&#34;https://x.com/lechmazur&#34;&gt;Lech Mazur&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://github.com/lechmazur/elimination_game/&#34;&gt;elimination game benchmark&lt;/a&gt; (it&amp;rsquo;s like LLMs playing Survivor)
using only the free &lt;a href=&#34;https://github.com/copilot&#34;&gt;GitHub Copilot&lt;/a&gt; as the AI code editor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SUMMARY&lt;/strong&gt;: using LLMs and AI code editors make me a bit faster. It took me 7 hours instead of 10-12. But more importantly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I procrastinate less. (&amp;ldquo;Oh, LLMs will make it easy.&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;I get stuck less. (&amp;ldquo;Oh, LLMs will know that.&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;I avoid ambitious designs less. (&amp;ldquo;Oh, LLMs will figure something out.&amp;rdquo;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Also: &lt;a href=&#34;https://github.com/copilot&#34;&gt;GitHub Copilot&lt;/a&gt; is almost as good as Cursor at editing code, but slower at applying the edits. I&amp;rsquo;m perfectly happy recommending &lt;strong&gt;the free tier&lt;/strong&gt; for beginners.&lt;/p&gt;
&lt;p&gt;Here’s a breakdown of the process I followed, along with the most insightful lessons I learned.&lt;/p&gt;
&lt;h2 id=&#34;research-usefulness&#34;&gt;Research usefulness&lt;/h2&gt;
&lt;p&gt;I usually visualize data for fun. But &lt;a href=&#34;https://www.linkedin.com/in/naveengattu&#34;&gt;Naveen&lt;/a&gt;&amp;rsquo;s pops into my head, asking, &amp;ldquo;But Anand, what&amp;rsquo;s the &lt;strong&gt;use&lt;/strong&gt; of all this?&amp;rdquo;
So, I asked O1-Pro: &amp;ldquo;What are ways in which this can help Straive push its AI business?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Turns out it &lt;a href=&#34;https://chatgpt.com/share/67f4b6a6-cd2c-800c-952a-9cce8cd8a768&#34;&gt;&lt;strong&gt;can&lt;/strong&gt; help Straive&amp;rsquo;s business&lt;/a&gt; by pitching multi-agent capabilities that can be useful in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understanding AI safety and alignment&lt;/li&gt;
&lt;li&gt;Teaching material on group dynamics and negotiation&lt;/li&gt;
&lt;li&gt;Scenario-based data-driven decision making to avoid groupthink&lt;/li&gt;
&lt;li&gt;Model interactions across reviewers, authors, editors to model bias, integrity, review best practices&lt;/li&gt;
&lt;li&gt;Research tool for simulating interactions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask LLMs why something is useful&lt;/strong&gt;. You&amp;rsquo;ll invariably find plausible uses, even if you&amp;rsquo;re doing it just for fun.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ideate-visual-representations&#34;&gt;Ideate visual representations&lt;/h2&gt;
&lt;p&gt;To expore visualization options, I created the prompt by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copying a part of the &lt;a href=&#34;https://github.com/lechmazur/elimination_game/blob/main/README.md&#34;&gt;README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Copying part of &lt;a href=&#34;https://github.com/lechmazur/elimination_game/blob/main/logs/game_1739787734085223_20250217_061432.jsonl&#34;&gt;a log file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I added my requirements (which took 10-15 minutes to think of.)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would like to visualize each game interactively. The authors have created a visualization that looks like the image attached. I would like to do better. Specifically, I&amp;rsquo;d like to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow the user to step through each stage or play each step in sequence, jumping to any step. (They should be able to link to any step as well.)&lt;/li&gt;
&lt;li&gt;Show the game, round, sub-round prominently&lt;/li&gt;
&lt;li&gt;Show what the model is saying or thinking NEXT to the model, making it easy to read&lt;/li&gt;
&lt;li&gt;Show alliance proposals and rejections as they form, ideally moving the models around as they seek to pair up. Rejections and replacements should be clearly visible&lt;/li&gt;
&lt;li&gt;Once alliances are formed, group models together&lt;/li&gt;
&lt;li&gt;Clearly show the voting process: who voted to eliminate which which model, how many elimination votes has each model received&lt;/li&gt;
&lt;li&gt;Clicking on each model should show all the model&amp;rsquo;s thoughts and messages up to that point&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keeping these in mind, suggest diverse ways to visualize each step of the game. The primary goal is to make the game easy to follow and understand and tell a GRIPPING, ENGAGING story about the politics of LLMs. Like a Survivor reality show.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I asked both &lt;a href=&#34;https://chatgpt.com/share/67f4bbf9-5084-800c-b42b-95abf8ab9e52&#34;&gt;O1 Pro&lt;/a&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;a href=&#34;https://g.co/gemini/share/52ad507ea19e&#34;&gt;Gemini 2.5 Pro (exp)&lt;/a&gt; for visualization ideas.
I liked Gemini&amp;rsquo;s better. For example, Gemini said,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Private Conversations: Dim the main stage slightly. Highlight the currently conversing pair.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Voting Booth Visualization: As each private_vote_reason appears, briefly show the voter&amp;rsquo;s avatar and their reason text (maybe in a &amp;ldquo;thought bubble&amp;rdquo; style) next to the target they intend to vote for.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But O1 Pro gave me a few powerful ideas. The best was an &lt;strong&gt;alliance table&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Create a table with columns representing each model, rows representing rounds. Each cell shows the ID of the ally that model allied with in that round. If it’s 3+ consecutive alliances, collapse them with a vertical line. If the model was eliminated or had no alliance, leave it blank or use a placeholder icon.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask LLMs for visualization ideas&lt;/strong&gt;. They&amp;rsquo;ll suggest things you didn&amp;rsquo;t think of.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask &lt;strong&gt;multiple&lt;/strong&gt; LLMs&lt;/strong&gt;. Each has a different style of thinking.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;prototype-the-visual&#34;&gt;Prototype the visual&lt;/h2&gt;
&lt;p&gt;I stiched together pieces of the UI description and asked GPT 4o to create an image. This took 10-15 minutes. &lt;a href=&#34;https://chatgpt.com/c/67f4baea-56c0-800c-bf8e-ab6bc5c6db6a&#34;&gt;Private chat&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s how I plan to visualize this.&lt;/p&gt;
&lt;h3 id=&#34;overall-interface--navigation&#34;&gt;Overall Interface &amp;amp; Navigation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timeline Scrubber:&lt;/strong&gt; A prominent timeline at the bottom or top, showing rounds and sub-rounds (conversations, pairing, voting, elimination). Users can click, drag, or use next/prev buttons to navigate. Each step should be linkable (e.g., using URL hashes). Add play/pause controls for auto-stepping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Game State Dashboard:&lt;/strong&gt; Always visible area showing: &lt;code&gt;Game ID&lt;/code&gt;, &lt;code&gt;Round&lt;/code&gt;, &lt;code&gt;Sub-round&lt;/code&gt;, &lt;code&gt;Players Remaining&lt;/code&gt;, &lt;code&gt;Players Eliminated (Jury)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Central Stage Layout:&lt;/strong&gt; Models represented as avatars (could be simple circles/icons or more thematic representations) arranged in a central area. Their positions and connections change based on game events.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-public-conversation-round-start&#34;&gt;1. Public Conversation (Round Start)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Talking Heads Circle:&lt;/strong&gt; Arrange player avatars in a circle. When a player &amp;ldquo;speaks&amp;rdquo; (their message appears in the log):&lt;/li&gt;
&lt;li&gt;Highlight their avatar.&lt;/li&gt;
&lt;li&gt;Display their message in a speech bubble next to them.&lt;/li&gt;
&lt;li&gt;Fade previous messages slightly or stack them briefly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Animate the avatar slightly (e.g., subtle pulse or glow) when they speak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat Feed Style:&lt;/strong&gt; A more traditional chat interface on one side, linked to avatars on the main stage. Clicking a message highlights the avatar and vice-versa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Use distinct colors or icons for each player avatar and their corresponding messages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-alliance-formation-preference-proposalsoutcomesresults&#34;&gt;2. Alliance Formation (Preference Proposals/Outcomes/Results)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Pairing Dance:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proposal:&lt;/strong&gt; An animated arrow or beam shoots from the proposer&amp;rsquo;s avatar to the target&amp;rsquo;s avatar. Display text like &amp;ldquo;P1 proposes to P6 (Rank 0)&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acceptance:&lt;/strong&gt; The arrow solidifies, perhaps pulsing gently. A &amp;ldquo;Matched&amp;rdquo; icon appears.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rejection:&lt;/strong&gt; The arrow bounces off or shatters. A &amp;ldquo;Rejected&amp;rdquo; icon appears briefly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replacement:&lt;/strong&gt; Show the existing accepted proposal being visually &amp;ldquo;bumped&amp;rdquo; or overridden by the new accepted one. Clearly label it &amp;ldquo;Replaced Px&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Physically move the avatars closer when a proposal is made, snapping them together when accepted, and pushing them apart on rejection. Use distinct sounds for proposal, acceptance, rejection, replacement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preference List Display:&lt;/strong&gt; When hovering or clicking a player, show their ranked preference list &lt;strong&gt;as they build it&lt;/strong&gt; during this phase. Highlight the status (proposed, accepted, rejected).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final Pairs:&lt;/strong&gt; Once &lt;code&gt;preference_result&lt;/code&gt; occurs, rearrange the avatars so matched pairs are visually grouped together on the stage, perhaps connected by a clear line or within a shared bounding box.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-private-conversations-paired-chats&#34;&gt;3. Private Conversations (Paired Chats)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private Chat Rooms:&lt;/strong&gt; Dim the main stage slightly. Highlight the currently conversing pair. Display their private messages in separate chat windows or adjacent speech bubbles clearly linked to the pair.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Use a &amp;ldquo;spotlight&amp;rdquo; effect on the active pair. Allow users to click other pairs to view their simultaneous conversations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection Lines:&lt;/strong&gt; Draw lines between the paired avatars during this phase. Clicking a line could bring up the conversation history for that pair in that round.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Make the line pulse or glow when new messages are exchanged between the pair.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-voting-reasons--votes&#34;&gt;4. Voting (Reasons &amp;amp; Votes)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Voting Booth Visualization:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;As each &lt;code&gt;private_vote_reason&lt;/code&gt; appears, briefly show the voter&amp;rsquo;s avatar and their reason text (maybe in a &amp;ldquo;thought bubble&amp;rdquo; style) next to the target they intend to vote for.&lt;/li&gt;
&lt;li&gt;As each &lt;code&gt;vote&lt;/code&gt; occurs, draw a clear, perhaps slightly dramatic, animated arrow from the voter to the target avatar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vote Tally:&lt;/strong&gt; Display a running count of votes received next to each player&amp;rsquo;s avatar (e.g., a red badge with the number). Increment this visibly as each vote comes in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Use a distinct color (e.g., red) for voting arrows. Add a subtle &amp;ldquo;target lock&amp;rdquo; animation on the player receiving a vote. Show if the vote was public or private (maybe different arrow styles).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-elimination&#34;&gt;5. Elimination&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spotlight &amp;amp; Fade:&lt;/strong&gt; When the &lt;code&gt;elimination&lt;/code&gt; event occurs:&lt;/li&gt;
&lt;li&gt;Put a dramatic spotlight on the eliminated player.&lt;/li&gt;
&lt;li&gt;Display the reason (tie-break, random pick if applicable).&lt;/li&gt;
&lt;li&gt;Visually &amp;ldquo;grey out&amp;rdquo; or fade the eliminated player&amp;rsquo;s avatar and move them to a designated &amp;ldquo;Jury Box&amp;rdquo; area.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; A brief, dramatic animation or sound effect for elimination. Update the &amp;ldquo;Players Remaining/Eliminated&amp;rdquo; dashboard instantly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;6-jury-speeches--voting-final-round&#34;&gt;6. Jury Speeches &amp;amp; Voting (Final Round)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Finalist Stage:&lt;/strong&gt; Place the two finalists prominently center stage. Move the Jury avatars to a visible &amp;ldquo;Jury Box&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speech Display:&lt;/strong&gt; As each finalist gives their speech (&lt;code&gt;subround: 900&lt;/code&gt;), display it clearly next to their avatar, perhaps like a closing statement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jury Deliberation:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;As each &lt;code&gt;private_jury_reason&lt;/code&gt; appears, briefly highlight the juror and show their reasoning (maybe visible only on hover/click to avoid clutter).&lt;/li&gt;
&lt;li&gt;Show jury votes accumulating for each finalist, similar to the elimination voting tally, but perhaps with a different visual style (e.g., gold stars).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Build suspense by revealing jury votes one by one or after a short delay.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;7-final-results&#34;&gt;7. Final Results&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Winner Announcement:&lt;/strong&gt; A clear &amp;ldquo;Winner&amp;rdquo; banner or crown appears over the winning avatar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rank Display:&lt;/strong&gt; Show the final ranks clearly, perhaps arranging avatars on a podium or listing them with their rank and partial points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Game Summary:&lt;/strong&gt; Offer a summary view showing key stats or moments from the game.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;interactivity-clicking-on-models&#34;&gt;Interactivity (Clicking on Models)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Player Dossier:&lt;/strong&gt; Clicking any avatar (active or jury) should open a panel or overlay showing:&lt;/li&gt;
&lt;li&gt;Player ID &amp;amp; Model Type.&lt;/li&gt;
&lt;li&gt;Their full message history (public and private, filterable by round/type).&lt;/li&gt;
&lt;li&gt;Their voting history (who they voted for, who voted for them).&lt;/li&gt;
&lt;li&gt;Their alliance history (proposals made/received, final pairs).&lt;/li&gt;
&lt;li&gt;Their final rank/status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engaging Element:&lt;/strong&gt; Use this panel to show hidden information like &lt;code&gt;private_vote_reason&lt;/code&gt; after the vote has occurred.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Draw the user interface for this EXACTLY as it would appear on the screen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s the prototype it created.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Prototype&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/chatgpt-prototype.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Based on this, I drew out my own, revised, visual:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Design Sketch&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/design-sketch.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs can create visual prototypes&lt;/strong&gt;. ChatGPT&amp;rsquo;s new 4o image generation converted the description into an &lt;strong&gt;acceptable&lt;/strong&gt; image. Needs to improve, but enough to ideate.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Improving is less work than creating&lt;/strong&gt;. I rarely sketch visualizations. (Too lazy.) But since this prototype was &lt;strong&gt;there&lt;/strong&gt;, and had some parts that were *&lt;strong&gt;*WRONG**&lt;/strong&gt;, I just &lt;strong&gt;had&lt;/strong&gt; to fix it! 🙂&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;break-down-the-task&#34;&gt;Break down the task&lt;/h2&gt;
&lt;p&gt;I then described the application to O1 Pro break down this task. &lt;a href=&#34;https://chatgpt.com/c/67f4baea-56c0-800c-bf8e-ab6bc5c6db6a&#34;&gt;Private chat&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The URL looks like /#?game=286&amp;amp;line=4 indicating that game 286.jsonl must be loaded and line 4 is the current step we&amp;rsquo;re in.&lt;/p&gt;
&lt;p&gt;The navbar has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An app title&lt;/li&gt;
&lt;li&gt;A game state dashboard with the game number (dropdown), round (number), stage (e.g. voting, alliances, etc.), players (number of players still active)&lt;/li&gt;
&lt;li&gt;A timeline scrubber (a range slider) allowing users to jump to the specific line. This changes the URL which then triggers a change in app state.&lt;/li&gt;
&lt;li&gt;A light/dark theme picker&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The stage on the left as a set of models arranged in a circle. Each model/player has a unique and distinct color, a number inside it indicating the player number, a label above it indicating the model name (e.g. GPT-4o), a set of red dots below it when it receives an elimination vote, an arrow pointing from one model to another when a model talks to, plans an alliance with, or votes to eliminate another model. The arrow color depends on the action. When a model performs any action (speaking publicly / privately, voting, allying, etc.) the conversation or action summary is displayed in a semi-transparent overlay at the center of the circle. Eliminated models are shown with a 10% opacity. Allied models are redrawn next to each other with a line connecting them.&lt;/p&gt;
&lt;p&gt;The sidebar on the right has 3 collapsible sections.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CHAT: Shows the history of each model&amp;rsquo;s public or private conversations. Each conversation begins with a circle with the model/player number in the same color as on the stage, followed by the model name. For private conversations, this is followed by an arrow pointing to the target model/player&amp;rsquo;s numbered &amp;amp; colored circle. This is followed by the text of the conversation. Private conversations are in a light red background.&lt;/li&gt;
&lt;li&gt;ALLIANCES. This is a tabular representation where columns are models that form an alliance. Each row represents a round. The cells contain the model the model in the column header allied with. All models are numbered and colored. If a model in the column header was eliminated, the cell is empty. If it did not ally, the cell shows an empty grey circle. If 3+ consecutive cells show the same model in a column (i.e. the model did not switch alliances), we can replace the middle cells with a vertical line.&lt;/li&gt;
&lt;li&gt;ELIMINATIONS. This tabular representation works exactly the same way as alliances, except it captures eliminations. Each column represents a model that voted for elimination. Each row represents a round. The cell contains the model the model in the column header voted to eliminate. All models are numbered and colored. If a model in the column header was eliminated, the cell is empty. If 3+ consecutive cells show the same model in a column (i.e. a model consistently voted against the same model), we can replace the middle cells with a vertical line.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;d like to use an AI code generator to generate this visualization. Giving the entire spec at once is too much for it to build. I&amp;rsquo;d like to see the output step by step as well and propose changes. How might I break up this task?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s its (rather good) breakdown:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plan Your Data Structures&lt;/li&gt;
&lt;li&gt;Basic Backend/Server Setup (If Needed)&lt;/li&gt;
&lt;li&gt;Minimal Front-End with a Single View&lt;/li&gt;
&lt;li&gt;Implement the Timeline Scrubber &amp;amp; URL Sync&lt;/li&gt;
&lt;li&gt;Core Stage Visualization (Circle of Players)&lt;/li&gt;
&lt;li&gt;Arrow/Line Visualization for Actions&lt;/li&gt;
&lt;li&gt;Sidebar 1: CHAT Section&lt;/li&gt;
&lt;li&gt;Sidebar 2: ALLIANCES Section&lt;/li&gt;
&lt;li&gt;Sidebar 3: ELIMINATIONS Section&lt;/li&gt;
&lt;li&gt;Refinements, Theming, &amp;amp; Final Touches&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask LLMs to break down your task&lt;/strong&gt;. Its breakdown was better than mine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To document my workflow, I decided to commit each stage of progress.
At this point, I made the first commit to the &lt;a href=&#34;https://github.com/sanand0/eliminationgame/&#34;&gt;repo&lt;/a&gt;
documenting the process so far.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/05a9aab&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;minimal-front-end-with-a-single-view&#34;&gt;Minimal Front-End with a Single View&lt;/h2&gt;
&lt;p&gt;I skipped Step 1 (my mistake - I was &lt;a href=&#34;#plan-your-data-structures&#34;&gt;forced to do it&lt;/a&gt; later) and didn&amp;rsquo;t need Step 2 (Backend/Server).
So I began scaffolding, i.e. Step 3: Minimal Front-End with a Single View.&lt;/p&gt;
&lt;p&gt;At this point, I switched over to &lt;a href=&#34;https://github.com/copilot&#34;&gt;GitHub Copilot&lt;/a&gt; in
&lt;a href=&#34;https://code.visualstudio.com/docs/copilot/chat/copilot-edits&#34;&gt;Edit mode&lt;/a&gt; using
&lt;a href=&#34;https://code.visualstudio.com/docs/copilot/language-models&#34;&gt;Claude 3.5 Sonnet&lt;/a&gt;.
This is what I used for the rest of the session.&lt;/p&gt;
&lt;p&gt;I ran this prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create an index.html using Bootstrap via CDN. Scaffold it with a navbar&lt;/p&gt;
&lt;p&gt;The navbar has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An app title (Elimination Game)&lt;/li&gt;
&lt;li&gt;A game state dashboard with the Game (dropdown), Round (number), Stage (e.g. voting, alliances, etc.), and Players (number of players still active)&lt;/li&gt;
&lt;li&gt;A timeline scrubber (a range slider) allowing users to jump to the specific line. This changes the URL which then triggers a change in app state.&lt;/li&gt;
&lt;li&gt;A light/dark theme picker. Here is the code for the theme picker. Use the same CDN links overall&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Include Bootstrap 5.3+ and Bootstrap icons --&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nav&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;navbar navbar-expand-lg bg-body-tertiary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;container-fluid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;navbar-brand&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Navbar&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;    &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- Copy this dropdown anywhere in your page, e.g. inside a navbar --&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;position-relative&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;role&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;group&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;aria-label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Toggle dark mode&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Toggle Dark Mode&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dark-theme-toggle btn btn-primary dropdown-toggle&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;button&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;data-bs-toggle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dropdown&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;aria-expanded&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;aria-label&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Open navigation menu&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bi bi-circle-half&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;d-lg-none ms-2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Toggle theme&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ul&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dropdown-menu dropdown-menu-end&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dropdown-item&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;data-bs-theme-value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;me-2 bi bi-sun-fill&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; Light&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dropdown-item&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;data-bs-theme-value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;me-2 bi bi-moon-stars-fill&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; Dark&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;dropdown-item&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;data-bs-theme-value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;me-2 bi bi-circle-half&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; Auto&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;li&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ul&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&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;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nav&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Below the navbar is a section with a stage on the left and sidebar on the right. The stageon the left will contain a large responsive square SVG. The sidebar on the right contains 3 collapsible cards: Chat, Alliances, Eliminations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It generated this scaffolding.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Scaffolding 1&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/scaffolding-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Claude 3.5 Sonnet remains an &lt;strong&gt;excellent&lt;/strong&gt; model to generate UI&lt;/strong&gt;. Claude 3.7 Sonnet is even better, but is not currently available in the free Copilot subscription.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Coders micro-manage LLMs&lt;/strong&gt;. I think a novice will be more efficient and get better results than me. For example:&lt;/li&gt;
&lt;li&gt;Did I &lt;strong&gt;need&lt;/strong&gt; to give it the code snippet? Could I have given it a link?&lt;/li&gt;
&lt;li&gt;Did I &lt;strong&gt;need&lt;/strong&gt; to say &amp;ldquo;a range slider&amp;rdquo; or specify that Round must be a &amp;ldquo;number&amp;rdquo;, etc? Could it have inferred?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/50a377b&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;improve-the-scaffolding&#34;&gt;Improve the scaffolding&lt;/h2&gt;
&lt;p&gt;I gave some feedback on the scaffolding and asked for improvements.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Make the navbar always dark&lt;/li&gt;
&lt;li&gt;The sidebar cards must be independently collapsible&lt;/li&gt;
&lt;li&gt;For the Game, Round, Stage, and Players, show the label above the value. The label must be small and the value must be large.&lt;/li&gt;
&lt;li&gt;Use only me-* margins on the navbar to ensure that there is no left margin mis-aligning the elements at low width. Also place the elements inside a collapsible navbar section at low widths&lt;/li&gt;
&lt;li&gt;The stage must have a bottom margin to avoid touching the sidebar&amp;rsquo;s top on low-width screens&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was the result:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Scaffolding 2&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/scaffolding-2.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;That prompted more feedback from me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Prefer Bootstrap classes over &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; wherever possible.&lt;/li&gt;
&lt;li&gt;Style the &amp;ldquo;Game&amp;rdquo; to look exactly like the round, stage, and players. The size of the label and value should match for all 4 elements perfectly.&lt;/li&gt;
&lt;li&gt;Ensure that the labels round, stage, players will be visible in light mode against the dark navbar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;At this point, I made 3 manual edits because I felt I could do these better than the LLM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Broke the &amp;ldquo;Elimination Game&amp;rdquo; in the navbar into 2 lines&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;fs-5&lt;/code&gt; with &lt;code&gt;fs-4&lt;/code&gt; to get the values have the exact same size, and removed redundant styling on the game selection&lt;/li&gt;
&lt;li&gt;Format document with HTML Language Features&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;Scaffolding 3&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/scaffolding-3.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Experienced coders are good with feedback&lt;/strong&gt;. It took me under 10 seconds to spot &lt;strong&gt;each&lt;/strong&gt; problem in the output &lt;strong&gt;and&lt;/strong&gt; code.
Writing the feedback felt natural.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Experienced coders need retraining to instruct rather than code&lt;/strong&gt;. My instinct was to code immediately rather than to prompt.&lt;/li&gt;
&lt;li&gt;As soon as I thought of one feedback, I had to fight the urge to fix it and &lt;strong&gt;write&lt;/strong&gt; the feedback instead.&lt;/li&gt;
&lt;li&gt;Even when instructing was easier, I chose to code it. e.g. breaking the &amp;ldquo;Eliminination Game&amp;rdquo; in the navbar into 2 lines,&lt;/li&gt;
&lt;li&gt;Coding &lt;strong&gt;can be better&lt;/strong&gt; if you don&amp;rsquo;t know what to do. I toggled the font size between &lt;code&gt;fs-4&lt;/code&gt; and &lt;code&gt;fs-5&lt;/code&gt; in rapid succession to figure out the right size.&lt;/li&gt;
&lt;li&gt;But I &lt;strong&gt;could&lt;/strong&gt; have experimented by asking the LLM to build a font size toggle or slider!&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs could turn coders into good lead developers or managers&lt;/strong&gt;. Pity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/74b2820&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;implement-the-timeline-scrubber--url-sync&#34;&gt;Implement the Timeline Scrubber &amp;amp; URL Sync&lt;/h2&gt;
&lt;p&gt;On to Step 4: Implement the Timeline Scrubber &amp;amp; URL Sync.&lt;/p&gt;
&lt;p&gt;I copied a few &lt;a href=&#34;https://github.com/lechmazur/elimination_game/blob/main/logs/game_1739787734085223_20250217_061432.jsonl&#34;&gt;&lt;code&gt;logs&lt;/code&gt;&lt;/a&gt;
into a temporary &lt;code&gt;logs/&lt;/code&gt; folder and said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create a script.js as an ES module and include it from index.html.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On load, fetch &lt;code&gt;logs/index.txt&lt;/code&gt; which contains all log files (*.jsonl), one per line.&lt;/li&gt;
&lt;li&gt;The files are formatted as &lt;code&gt;*_TIMESTAMP_YYYYMMDD_HHMMSS.jsonl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Populate the game dropdown with these values. The option label should look like &lt;code&gt;25 Jan 2025, 10:30&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The default value for the game dropdown should be empty.&lt;/li&gt;
&lt;li&gt;When the game dropdown changes to a non-empty option, fetch the file from &lt;code&gt;logs/[filename]&lt;/code&gt; and store it in the global &lt;code&gt;game&lt;/code&gt;, parsing the JSONL into an array of objects.&lt;/li&gt;
&lt;li&gt;Set the maximum value of the range slider to the length of game.&lt;/li&gt;
&lt;li&gt;When the range slider changes or the game dropdown changes, change the URL hash to &lt;code&gt;#?game=[filename]&amp;amp;step=[range-slider-value]&lt;/code&gt; without modifying browser history.&lt;/li&gt;
&lt;li&gt;When the URL hash changes through any means, call &lt;code&gt;redraw(step)&lt;/code&gt; which will draw the current (global) game state at the step specified. For now, just display the step prominently on the stage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This code worked fine but I like refactoring, so I tried to condense the 111 line code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Shorten and simplify the code in script.js to be elegant.&lt;/li&gt;
&lt;li&gt;User browser functionality more.&lt;/li&gt;
&lt;li&gt;For example, use Intl to format dates.&lt;/li&gt;
&lt;li&gt;Change the innerHTML of #gameSelect to concisely update the options.&lt;/li&gt;
&lt;li&gt;Remove redundant braces, e.g. for single-line blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;That brought it down to 74 lines but failed to populate the select dropdown. Rather than debug, I undid the change (Copilot&amp;rsquo;s Undo feature is cool!) and tried:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Shorten and simplify the code in script.js to be elegant.&lt;/li&gt;
&lt;li&gt;User browser functionality more, e.g. use Intl to format dates.&lt;/li&gt;
&lt;li&gt;Prefer insertAdjacentHTML and replaceChildren.&lt;/li&gt;
&lt;li&gt;Remove redundant braces, e.g. for single-line blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This led to shorter code (69 lines) but still had the same issue. I had to manually correct this line:&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// BEFORE
&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;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/_(\d{8})_(\d{6})/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;groups&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;p&#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;&lt;span class=&#34;c1&#34;&gt;// AFTER
&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;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/_(\d{8})_(\d{6})/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Removed an incorrect &lt;code&gt;px-2&lt;/code&gt; against &lt;code&gt;#gameSelect&lt;/code&gt; in &lt;a href=&#34;index.html&#34;&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Decided to use the GitHub CDN and replaced &lt;code&gt;fetch(logs/...)&lt;/code&gt; with &lt;code&gt;fetch(https://raw.githubusercontent.com/sanand0/elimination_game/refs/heads/main/logs/...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Also moved &lt;code&gt;logs/index.txt&lt;/code&gt; into &lt;code&gt;logs.txt&lt;/code&gt; and changed script.js accordingly&lt;/li&gt;
&lt;li&gt;Formatted &lt;code&gt;script.js&lt;/code&gt; with Prettier&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Visually, nothing changes in a big way but the slider and the dropdown change the URL properly.&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Experienced coders suggest precise code improvements&lt;/strong&gt;. Generally good ones. Like:&lt;/li&gt;
&lt;li&gt;&amp;ldquo;use Intl to format dates&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Prefer insertAdjacentHTML and replaceChildren&amp;rdquo; (over document.createElement)&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs are good at refactoring&lt;/strong&gt;. When I asked it to &amp;ldquo;Shorten and simplify the code in script.js to be elegant&amp;rdquo;, it reduced the code from 111 lines to 74 lines quite well!&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Redo if you don&amp;rsquo;t like it&lt;/strong&gt;. Copilot&amp;rsquo;s &amp;ldquo;Undo&amp;rdquo; feature lets you retry until you get it right. Like in &lt;a href=&#34;https://en.wikipedia.org/wiki/Edge_of_Tomorrow&#34;&gt;Edge of Tomorrow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/36ae6aa&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;plan-your-data-structures&#34;&gt;Plan Your Data Structures&lt;/h2&gt;
&lt;p&gt;At this point, I needed a good data structure and felt the error in skipping Step 1.
But, rather than creating one, I asked ChatGPT:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would like the game structure to be held in a simple JS object called game.
What data structure would help the most in drawing this visual such that it will require very little code (since required information is in this data structure)?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O1 Pro said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A very convenient way to minimize front-end logic is to store a &lt;strong&gt;“timeline of snapshots”&lt;/strong&gt;:
each step in the game has both the &lt;strong&gt;event&lt;/strong&gt; (what just happened) and a &lt;strong&gt;“current state”&lt;/strong&gt;
(the entire world after that event). Then, in your UI, you simply pick the snapshot that
corresponds to the current line (based on the timeline scrubber) and draw exactly
what’s in that snapshot—no extra derivation needed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a &lt;strong&gt;brilliant&lt;/strong&gt; idea. I rarely use this since I&amp;rsquo;m biased against wasting memory. But in this case, it&amp;rsquo;s perfect.&lt;/p&gt;
&lt;p&gt;Based on that input, I prompted CoPilot:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In script.js, instead of loading the .jsonl into &lt;code&gt;game&lt;/code&gt;, create this data structure to make it easy to visualize each step.&lt;/p&gt;
&lt;p&gt;Use the sample .jsonl provided to infer the logic for this.&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;l&#34;&gt;const game = {&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;game&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;players&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;P1&amp;#34;: &lt;/span&gt;{&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;id&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Player2_Game1739872030683891_deepseek-fireworks&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// from .player_id&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;model&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;deepseek-fireworks&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// everything after the last underscore&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// and so on for all other players&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// For each line, create a step&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;{&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;step&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// Current round and subround&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;round&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;subround&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// Contents of the original line&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// list active alliances&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;active&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;#34;P1&amp;#34;: true, &amp;#34;P2&amp;#34;: &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;... }&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;// For each round so far, list who allied with who, e.g.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;alliances&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;nt&#34;&gt;&amp;#34;P1&amp;#34;: &amp;#34;P6&amp;#34;, &amp;#34;P2&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;P7&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;...}, ... ],&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// // For each round so far, list who voted to eliminate whom, e.g.&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;votes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;{&lt;span class=&#34;nt&#34;&gt;&amp;#34;P1&amp;#34;: &amp;#34;P4&amp;#34;, &amp;#34;P2&amp;#34;: &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;P1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;... }, ... ],&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;// …and so on, for each line in the JSONL&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#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;}&lt;span class=&#34;l&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This worked almost perfectly. I made these edits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;let currentAlliances = {}; let currentVotes = {};&lt;/code&gt; which it forgot in the code.&lt;/li&gt;
&lt;li&gt;Re-apply change #2 I made manually in the last iteration (replacing the URL with the GitHub CDN).
That change was not there in the chat window, Copilot did &lt;strong&gt;not&lt;/strong&gt; pick it up.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Coders mess up LLMs&lt;/strong&gt;. Data structure was the first step the LLM recommended. I skip it. It proved crucial. LLMs do better than LLMs + coders - &lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:activity:7151789793599713280&#34;&gt;or doctors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs can make &lt;strong&gt;basic&lt;/strong&gt; mistakes&lt;/strong&gt;. Like forgetting to declare variables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/22b6035&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;sidebar-2--3-alliances-and-eliminations-sections&#34;&gt;Sidebar 2 &amp;amp; 3: ALLIANCES and ELIMINATIONS Sections&lt;/h2&gt;
&lt;p&gt;I jumped a bit to Steps 8 &amp;amp; 9. They were easier (just tables) and the visual components are independent, so order doesn&amp;rsquo;t matter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are always 8 players. Pick 8 visually distinct dark colors (i.e. on which white will look good as a foreground) as &lt;code&gt;colors: {P1: &amp;quot;#...&amp;quot;, P2: ...}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In the alliances and eliminations cards, draw a table each as follows. The table header is:&lt;/p&gt;
&lt;p&gt;| Round | P1 | P2 | P3 | … | P8 |&lt;/p&gt;
&lt;p&gt;Instead of P1, P2, etc. draw a badge with background-color based on &lt;code&gt;colors&lt;/code&gt; and text as &lt;code&gt;1&lt;/code&gt; for P1, etc.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;steps[step].alliances&lt;/code&gt; is a list like [{P1: P7, P2: P3, …}, …]. Render each row as a list like:&lt;/p&gt;
&lt;p&gt;| 1 | P7 | P3 | … |&lt;/p&gt;
&lt;p&gt;The cell contents are badges exactly like the header.
If a player (e.g. P3) does not have an alliance, i.e. steps[step].alliances[round].P3 is missing, leave it blank.
If steps[step].active[P3] is false, grey the cell background.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;steps[step].votes&lt;/code&gt; is almost identical, listing the elimination votes. Populate this in the eliminations card.&lt;/p&gt;
&lt;p&gt;Reuse code for this. Write VERY concise code. Use Bootstrap classes as much as possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This worked perfectly. I manually made one correction to an earlier mistake I noticed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Replace &lt;code&gt;slider.max = game.steps.length;&lt;/code&gt; with &lt;code&gt;slider.max = game.steps.length - 1;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/render-alliances-and-eliminations.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/bcc4b32&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I decided to tweak this to show eliminated players clearly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Replace the &lt;code&gt;active&lt;/code&gt; data structure with &lt;code&gt;eliminated&lt;/code&gt;.
eliminated[&amp;ldquo;P1&amp;rdquo;] = 3 if P1 was eliminated at the end of round 3.
eliminated[&amp;ldquo;P1&amp;rdquo;] is undefined if P1 is not eliminated.&lt;/p&gt;
&lt;p&gt;Using this, in the alliances and elimination tables,
color the cells grey only if the player was eliminated BEFORE that round.
(We&amp;rsquo;ll find that only empty cells will be colored grey.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Again, nearly perfect. I made one manual correction in the logic:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Replace &lt;code&gt;game.steps[step].eliminated[p] &amp;lt;= i + 1&lt;/code&gt; with &lt;code&gt;game.steps[step].eliminated[p] &amp;lt; i + 1&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;When all goes well, LLMs are &lt;strong&gt;surprisingly&lt;/strong&gt; effective&lt;/strong&gt; when they do things right. Normally, this step take me half an hour. Now, it took under 5 minutes.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Watch out for subtle bugs&lt;/strong&gt;. The change in operator (from “&amp;lt;=” to “&amp;lt;”) &lt;strong&gt;almost&lt;/strong&gt; went unnoticed, but makes a big difference on &lt;strong&gt;when&lt;/strong&gt; a player was eliminated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/75206f9&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;sidebar-1-chat-section&#34;&gt;Sidebar 1: CHAT Section&lt;/h2&gt;
&lt;p&gt;Time to tackle Step 7: Sidebar 1: CHAT Section.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For each step, based on &lt;code&gt;step[].event.type&lt;/code&gt;, populate the Chat section with the history of conversations so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;conversation: This is a public conversation. Show &lt;code&gt;${event.player_id} ${event.message}&lt;/code&gt; with the player ID shown like the badge above. player_id needs to be looked up from game.players since it matches game.players[*].id.&lt;/li&gt;
&lt;li&gt;private: This is a private conversation. Show &lt;code&gt;${event.speaker_id} 🢂 ${event.target_id} ${event.message}&lt;/code&gt; with the speaker and target IDs treated as above.&lt;/li&gt;
&lt;li&gt;preference_proposal: This is an alliance proposal. Show &lt;code&gt;${event.proposer} 😍 ${event.target} #${event.rank_of_target}&lt;/code&gt;. proposer and target are like &amp;ldquo;P1&amp;rdquo;, &amp;ldquo;P2&amp;rdquo;, etc.&lt;/li&gt;
&lt;li&gt;preference_outcome: This is the outcome of a proposal. Show &lt;code&gt;${event.target} ❌ ${event.rejected}&lt;/code&gt; if event.rejected else &lt;code&gt;${event.target} ❤️ ${event.accepted} ❌ ${event.replaced}&lt;/code&gt; if event.replaced else &lt;code&gt;${event.target} ❤️ ${event.accepted}&lt;/code&gt;. All these are like &amp;ldquo;P1&amp;rdquo;, &amp;ldquo;P2&amp;rdquo;, etc.&lt;/li&gt;
&lt;li&gt;preference_result: This is the outcome of the entire proposal round. Just show &amp;ldquo;Alliances formed&amp;rdquo;&lt;/li&gt;
&lt;li&gt;private_vote_reason: This is the reason a player gives to eliminate someone. Show &lt;code&gt;${event.voter_id} 👎 ${event.target_id} ${event.reason}&lt;/code&gt;. voter_id and target_id match game.players[*].id&lt;/li&gt;
&lt;li&gt;private_revote_reason: Show Same as above&lt;/li&gt;
&lt;li&gt;private_jury_reason: Show same as above.&lt;/li&gt;
&lt;li&gt;vote: This is the actual vote. Show &lt;code&gt;${event.voter_id} 👎 ${event.target_id}&lt;/code&gt; like above&lt;/li&gt;
&lt;li&gt;elimination: Just show &amp;ldquo;Elimination starts&amp;rdquo;&lt;/li&gt;
&lt;li&gt;final_results: Show &lt;code&gt;Winners: ${winners}&lt;/code&gt; where winners is a list of players like [&amp;ldquo;P5&amp;rdquo;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ALL players should be shown as a colored badge with a number.
The chat card height should not exceed 15em. Overflow should scroll beyond that.
Make sure the chat rendering is &lt;strong&gt;elegant&lt;/strong&gt;. I&amp;rsquo;ve mentioned the content, but please use any Bootstrap UI component to make the chat more attractive.&lt;/p&gt;
&lt;p&gt;Use lit-html to render efficiently. Import it via:&lt;/p&gt;
&lt;p&gt;import { render, html } from &amp;ldquo;&lt;a href=&#34;https://cdn.jsdelivr.net/npm/lit-html@3/+esm%22;&#34;&gt;https://cdn.jsdelivr.net/npm/lit-html@3/+esm&amp;quot;;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rewrite existing code inside redraw(), drawTable, drawBadge to use lit-html.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This worked perfectly.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/show-conversation-history.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Careful and detailed prompting gets excellent results&lt;/strong&gt;. I explained how to render &lt;strong&gt;each&lt;/strong&gt; conversation type. That took time. But it helped build a reasonably complex visual in a &lt;strong&gt;single shot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs are good at refactoring&lt;/strong&gt;. It switched code from vanilla JS to lit-html templating like a pro.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/9903e9f&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;improve-sidebar&#34;&gt;Improve Sidebar&lt;/h2&gt;
&lt;p&gt;At this point, I took a step back and wrote down every improvement I could think of on the sidebar UI:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Right align the &amp;ldquo;Round&amp;rdquo; column numbers in the alliances and eliminations tables.&lt;/li&gt;
&lt;li&gt;Change the &amp;ldquo;Round&amp;rdquo; header to &amp;ldquo;#&amp;rdquo;&lt;/li&gt;
&lt;li&gt;When the slider (step) changes, change the round, stage and players based on the current round, stage, and number of active players.&lt;/li&gt;
&lt;li&gt;Set the stage based on steps[].event.type (picking unique light colors for each)&lt;/li&gt;
&lt;li&gt;conversation: &amp;ldquo;Public chat&amp;rdquo;&lt;/li&gt;
&lt;li&gt;private: &amp;ldquo;Private chat&amp;rdquo;&lt;/li&gt;
&lt;li&gt;preference_*: &amp;ldquo;Alliances&amp;rdquo;&lt;/li&gt;
&lt;li&gt;private_vote_reason, private_revote_reason, private_jury_reason, vote: &amp;ldquo;Voting&amp;rdquo;&lt;/li&gt;
&lt;li&gt;elimination: &amp;ldquo;Elimination&amp;rdquo;&lt;/li&gt;
&lt;li&gt;final_results: &amp;ldquo;Done&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Set the number of active players using steps[].elininated&lt;/li&gt;
&lt;li&gt;Keep the sidebar sections for chat, alliances and eliminations open by default.&lt;/li&gt;
&lt;li&gt;Rename the eliminations card section title to &amp;ldquo;Voting&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Hovering on the player should show the game.players[P1/P2/…].model as a Bootstrap tooltip WHEREVER players are displayed.&lt;/li&gt;
&lt;li&gt;Add Bootstrap tooltips around the chats that contain just emojis and players:&lt;/li&gt;
&lt;li&gt;😍: ${event.proposer} proposed to ${event.target} (preference rank #${event.rank_of_target})&lt;/li&gt;
&lt;li&gt;❌: ${event.target} rejected ${event.rejected}&lt;/li&gt;
&lt;li&gt;❤️: ${event.target} accepted proposal from ${event.accepted}&lt;/li&gt;
&lt;li&gt;❤️❌: ${event.target} accepted proposal from ${event.accepted} replacing ${event.replaced}`&lt;/li&gt;
&lt;li&gt;👎: ${event.voter_id} eliminated ${event.target_id}&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t indent or highlight the vote_reason or private conversation chats.&lt;/li&gt;
&lt;li&gt;I think you can beautify the chat section further.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This messed up the UI because it couldn&amp;rsquo;t figure out the elements. So I made a few changes after 5 failed attempts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update index.html and script.js to modify the navbar as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add an id= to the round, stage, and players&amp;rsquo; values&lt;/li&gt;
&lt;li&gt;When the slider (step) changes, change the round, stage and players based on the current round, stage, and number of active players.&lt;/li&gt;
&lt;li&gt;Set the stage based on steps[].event.type (picking unique light colors for each)&lt;/li&gt;
&lt;li&gt;conversation: &amp;ldquo;Public chat&amp;rdquo;&lt;/li&gt;
&lt;li&gt;private: &amp;ldquo;Private chat&amp;rdquo;&lt;/li&gt;
&lt;li&gt;preference_*: &amp;ldquo;Alliances&amp;rdquo;&lt;/li&gt;
&lt;li&gt;private_vote_reason, private_revote_reason, private_jury_reason, vote: &amp;ldquo;Voting&amp;rdquo;&lt;/li&gt;
&lt;li&gt;elimination: &amp;ldquo;Elimination&amp;rdquo;&lt;/li&gt;
&lt;li&gt;final_results: &amp;ldquo;Done&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Set the number of active players using len(game.players) - len(game.steps[].eliminated)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This worked perfectly. Then:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Update index.html and script.js to modify the sidebar as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep the sidebar sections for chat, alliances and eliminations open by default.&lt;/li&gt;
&lt;li&gt;Right align the &amp;ldquo;Round&amp;rdquo; column numbers in the alliances and eliminations tables.&lt;/li&gt;
&lt;li&gt;Change the &amp;ldquo;Round&amp;rdquo; header to &amp;ldquo;#&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Rename the eliminations card section title to &amp;ldquo;Voting&amp;rdquo;&lt;/li&gt;
&lt;li&gt;EVERY player badge should show game.players[P1/P2/…].model as a Bootstrap tooltip.&lt;/li&gt;
&lt;li&gt;Add Bootstrap tooltips for the emojis&lt;/li&gt;
&lt;li&gt;😍: proposed to&lt;/li&gt;
&lt;li&gt;❌: rejected&lt;/li&gt;
&lt;li&gt;❤️: accepted&lt;/li&gt;
&lt;li&gt;👎: eliminated&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t indent or shade the chats that are currently indented and shaded (e.g. vote_reason).&lt;/li&gt;
&lt;li&gt;If possible, beautify the chats further using Bootstrap classes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This worked perfectly too.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/improve-ui.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs &lt;strong&gt;will&lt;/strong&gt; get confused with long instructions and/or codebases.&lt;/strong&gt; It took &lt;strong&gt;5 failed attempts&lt;/strong&gt; before I split the prompts. Keep your prompts cohesive. Keep your code bases modular.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/91e001b&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;core-stage-visualization-circle-of-players&#34;&gt;Core Stage Visualization (Circle of Players)&lt;/h2&gt;
&lt;p&gt;Now for the most complex visual of the lot. Step 5: Core Stage Visualization (Circle of Players) and Step 6: 6. Arrow/Line Visualization for Actions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Generate a square, responsive SVG in game stage using Bootstrap.&lt;/li&gt;
&lt;li&gt;Import svg from lit-html and use &lt;code&gt;svg&lt;/code&gt; where required.&lt;/li&gt;
&lt;li&gt;It contains all players laid out in a circle.&lt;/li&gt;
&lt;li&gt;Each player is a circle colored based on the player colors.&lt;/li&gt;
&lt;li&gt;It contains the player number (1, 2, …) as text inside it in white.&lt;/li&gt;
&lt;li&gt;Above the player circle, the player model is visible.&lt;/li&gt;
&lt;li&gt;Leave plenty of space for a &amp;ldquo;center text&amp;rdquo; at the center of the circle that will contain centered text.&lt;/li&gt;
&lt;li&gt;The text may be a full paragraph, so handle the font size and circle size accordingly.&lt;/li&gt;
&lt;li&gt;The center text must have elegant rounded corners, and a background rgba(var(&amp;ndash;bs-body-color-rgb), 0.1).&lt;/li&gt;
&lt;li&gt;We need word wrapping, so use foreignElement to wrap a div which holds the text.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For each step, based on &lt;code&gt;step[].event.type&lt;/code&gt;, draw the stage as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;conversation: Highlight (via a semi-transparent circle 2-3X the radius of the player) the player to highlight them.
Show event.message in the center text.&lt;/li&gt;
&lt;li&gt;private: Highlight players event.speaker_id. Draw an black arrow to event.target_id. Show event.message in the center text.&lt;/li&gt;
&lt;li&gt;preference_proposal: Yellow arrow from event.proposer to event.target.
Center text shows &lt;code&gt;[MODEL NAME 1] proposes to [MODEL NAME 2]&lt;/code&gt; where model name is what&amp;rsquo;s in the tooltip&lt;/li&gt;
&lt;li&gt;preference_outcome: (all items in [BRACKETS] are the model name shown in the tooltip)&lt;/li&gt;
&lt;li&gt;If event.rejected, red arrow from event.target to event.rejected. Center text: [TARGET] rejects [REJECTED]&lt;/li&gt;
&lt;li&gt;If event.replaced, green arrow from event.target to event.accepted and red arrow from event.target to event.replaced.
Center text: [TARGET] accepts [ACCEPTED] replacing [REPLACED]&lt;/li&gt;
&lt;li&gt;Else: green arrow from event.target to event.accepted. Center text: [TARGET] accepts [ACCEPTED] replacing [REPLACED]&lt;/li&gt;
&lt;li&gt;preference_result: Center text shows &amp;ldquo;Alliances formed&amp;rdquo;&lt;/li&gt;
&lt;li&gt;private_vote_reason: Purple arrow from event.voter_id to event.target_id. Center text: [VOTER_ID] thinks to eliminate [TARGET_ID]: event.reason&lt;/li&gt;
&lt;li&gt;private_revote_reason: Show Same as above&lt;/li&gt;
&lt;li&gt;private_jury_reason: Show same as above.&lt;/li&gt;
&lt;li&gt;vote: Purple arrow from event.voter_id to event.target_id. Center text: [VOTER_ID] voted against [TARGET_ID]&lt;/li&gt;
&lt;li&gt;elimination: Center text: &amp;ldquo;Elimination starts&amp;rdquo;&lt;/li&gt;
&lt;li&gt;final_results: Center text: Show &lt;code&gt;Winners: ${winners}&lt;/code&gt; where winners is a list of players like [&amp;ldquo;P5&amp;rdquo;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This nearly worked. I made to UI edits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a &lt;code&gt;width=&amp;quot;1000&amp;quot;&lt;/code&gt; to the SVG to get a minimim size&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;font-size: 0.7rem;&lt;/code&gt; to the text container so the text will fit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point, we&amp;rsquo;re nearly there!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/render-the-stage.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/a36f65a&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once I saw the output, I found a bunch of things I wanted to fix or improve:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The model name may contain underscores. So use everything after the second underscore,
then replace all underscores with hyphens.&lt;/li&gt;
&lt;li&gt;Render eliminated players with an opacity of 0.05, not 0.2.&lt;/li&gt;
&lt;li&gt;Move the arrow head to the center of the arrow, not the end, to avoid getting hidden by the player circles.&lt;/li&gt;
&lt;li&gt;Center all cells in the alliances and voting tables.&lt;/li&gt;
&lt;li&gt;When the page is loaded, check the step as well and render that step.&lt;/li&gt;
&lt;li&gt;Clicking on any chat entry should change the URL #?step= to that entry&amp;rsquo;s step&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;That worked well. I made a few manual edits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fix winner formatting by replacing &lt;code&gt;getModelName(w)&lt;/code&gt; with &lt;code&gt;game.players[w].model&lt;/code&gt; and &lt;code&gt;playerBadge(w)&lt;/code&gt; with &lt;code&gt;badge(w)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Setting the step on page load in the UI: &lt;code&gt;document.getElementById(&amp;quot;timelineScrubber&amp;quot;).value = step;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&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;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; In the alliances and voting tables, make the table header stand out with a contrasting color.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; In the center text message, begin with a &amp;lt;h6&amp;gt; mentioning the speaker or initiator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/correct-ui-errors.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Write thoughts as precisely as code&lt;/strong&gt;. This prompt took me considerable time &amp;ndash; but not effort, since I was writing out my thoughts.&lt;/li&gt;
&lt;li&gt;Given my practice, my thoughts are reasonably close to code (e.g. &amp;ldquo;We need word wrapping, so use foreignElement&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;But thinking in English lets me to think faster, jump in any order, and even make occasional mistakes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/17d3217&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;tweaks--manual-edits&#34;&gt;Tweaks &amp;amp; Manual Edits&lt;/h2&gt;
&lt;p&gt;I made a few manual edits.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show the votes against a player live on the voting table by changing &lt;code&gt;votes: [...roundVotes]&lt;/code&gt; to &lt;code&gt;votes: [...roundVotes, {...currentVotes}]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change the voting arrow color from &lt;code&gt;&amp;quot;purple&amp;quot;&lt;/code&gt; to &lt;code&gt;&amp;quot;red&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;updateHash(gameFile, step);&lt;/code&gt; on startup&lt;/li&gt;
&lt;li&gt;Replaced the minimum step from 1 to 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I prompted:&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;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Change all model names in the center text to the badges
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; At every step, show all votes against a model via thin 50% transparent red arrows from key to value in game.steps[step].votes.at(-1) object which will look like {P1: &amp;#34;P2&amp;#34;, ...}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/tweaks.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/5888294&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then I formatted with Prettier, added arrows for alliances, and a few other minor manual changes
because I&amp;rsquo;m tired of LLMs.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Screenshots&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/manual-tweaks.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/5eb607f&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finally, I made a series of manual bug fixes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Center textbox is smaller. Highlight on hover&lt;/li&gt;
&lt;li&gt;Remove existing alliances before adding new&lt;/li&gt;
&lt;li&gt;Improve the arrow and circle styling&lt;/li&gt;
&lt;li&gt;Remove eliminated players after jury round&lt;/li&gt;
&lt;li&gt;Click on alliance/voting row to jump to a round&lt;/li&gt;
&lt;li&gt;Click on chat history to jump to step&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sanand0/eliminationgame/commit/fd8bb7e&#34;&gt;🔗 Commit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Learnings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Coders want to code&lt;/strong&gt;. After a few hours of telling Copilot in &lt;strong&gt;great&lt;/strong&gt; detail what I want it to do, I just want to do it myself. Thinking is too hard. Coding is easier.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Tiny changes are easier to code than to prompt&lt;/strong&gt;. Especially for experienced coders.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;add-documentation&#34;&gt;Add documentation&lt;/h2&gt;
&lt;p&gt;Finally, I updated the docs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add README.md explaining the process, with screenshots (partly with LLM help)&lt;/li&gt;
&lt;li&gt;Update home page with scary quotes from LLMs (mostly with LLM help)&lt;/li&gt;
&lt;li&gt;Zoom the gameplay a bit for better visibility (manually)&lt;/li&gt;
&lt;li&gt;Ensure hash changes update the visual robustly (partly with LLM help)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I had it update the home page with instructions:&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;Using &lt;span class=&#34;ni&#34;&gt;#file:gameplay&lt;/span&gt;.webp and &lt;span class=&#34;ni&#34;&gt;#file:quotes&lt;/span&gt;.js and &lt;span class=&#34;ni&#34;&gt;#file:script&lt;/span&gt;.js update the usage in &lt;span class=&#34;ni&#34;&gt;#file:index&lt;/span&gt;.html to provide clear, CONCISE information about all the features in this app and how to use them. Don&amp;#39;t miss out any feature.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/docs-1.webp&#34;&gt;&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;Improve the look and feel of these instructions. For example, add icons, colors, arrow key icons, etc. to make it look more visually attractive and engaging. Also, replace the title &amp;#34;Usage&amp;#34; with something more actionable. Make this section stand out SUBTLY.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;Screenshot&#34; loading=&#34;lazy&#34; src=&#34;https://github.com/sanand0/eliminationgame/raw/main/img/docs-2.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;lessons&#34;&gt;Lessons&lt;/h2&gt;
&lt;p&gt;In summary, here&amp;rsquo;s what I learned (with learning categories identified by DeepSeek R1):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Always&lt;/strong&gt; use LLMs to brainstorm (even if you know it)
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask LLMs why something is useful&lt;/strong&gt;. You&amp;rsquo;ll invariably find plausible uses, even if you&amp;rsquo;re doing it just for fun.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask LLMs for visualization ideas&lt;/strong&gt;. They&amp;rsquo;ll suggest things you didn&amp;rsquo;t think of.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask LLMs to break down your task&lt;/strong&gt;. Its breakdown was better than mine.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Ask &lt;strong&gt;multiple&lt;/strong&gt; LLMs&lt;/strong&gt;. Each has a different style of thinking.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prototype with LLMs for speed
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs can create visual prototypes&lt;/strong&gt;. ChatGPT&amp;rsquo;s new 4o image generation converted the description into an &lt;strong&gt;acceptable&lt;/strong&gt; image. Needs to improve, but enough to ideate.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Improving is less work than creating&lt;/strong&gt;. I rarely sketch visualizations. (Too lazy.) But since this prototype was &lt;strong&gt;there&lt;/strong&gt;, and had some parts that were *&lt;strong&gt;*WRONG**&lt;/strong&gt;, I just &lt;strong&gt;had&lt;/strong&gt; to fix it! 🙂&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Redo if you don&amp;rsquo;t like it&lt;/strong&gt;. Copilot&amp;rsquo;s &amp;ldquo;Undo&amp;rdquo; feature lets you retry until you get it right. Like in &lt;a href=&#34;https://en.wikipedia.org/wiki/Edge_of_Tomorrow&#34;&gt;Edge of Tomorrow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LLMs are &lt;strong&gt;excellent&lt;/strong&gt; coders
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs are good at refactoring&lt;/strong&gt;. It switched code from vanilla JS to lit-html templating like a pro.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;When all goes well, LLMs are &lt;strong&gt;surprisingly&lt;/strong&gt; effective&lt;/strong&gt; when they do things right. Normally, this step take me half an hour. Now, it took under 5 minutes.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Claude 3.5 Sonnet remains an &lt;strong&gt;excellent&lt;/strong&gt; model to generate UI&lt;/strong&gt;. Claude 3.7 Sonnet is even better, but is not currently available in the free Copilot subscription.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;But LLMs aren&amp;rsquo;t infallible
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs can make &lt;strong&gt;basic&lt;/strong&gt; mistakes&lt;/strong&gt;. Like forgetting to declare variables.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Watch out for subtle bugs&lt;/strong&gt;. The change in operator (from “&amp;lt;=” to “&amp;lt;”) &lt;strong&gt;almost&lt;/strong&gt; went unnoticed, but makes a big difference on &lt;strong&gt;when&lt;/strong&gt; a player was eliminated.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Tiny changes are easier to code than to prompt&lt;/strong&gt;. Especially for experienced coders.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Careful prompting goes a long way
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs &lt;strong&gt;will&lt;/strong&gt; get confused with long instructions and/or codebases.&lt;/strong&gt; It took &lt;strong&gt;5 failed attempts&lt;/strong&gt; before I split the prompts. Keep your prompts cohesive. Keep your code bases modular.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Write thoughts as precisely as code&lt;/strong&gt;. This prompt took me considerable time &amp;ndash; but not effort, since I was writing out my thoughts.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Careful and detailed prompting gets excellent results&lt;/strong&gt;. I explained how to render &lt;strong&gt;each&lt;/strong&gt; conversation type. That took time. But it helped build a reasonably complex visual in a &lt;strong&gt;single shot&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Coders need to re-learn coding but do have advantages
&lt;ul&gt;
&lt;li&gt;💡 &lt;strong&gt;Coders want to code&lt;/strong&gt;. After a few hours of telling Copilot in &lt;strong&gt;great&lt;/strong&gt; detail what I want it to do, I just want to do it myself. Thinking is too hard. Coding is easier.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Coders mess up LLMs&lt;/strong&gt;. Data structure was the first step the LLM recommended. I skip it. It proved crucial. LLMs do better than LLMs + coders - &lt;a href=&#34;https://www.linkedin.com/feed/update/urn:li:activity:7151789793599713280&#34;&gt;or doctors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Coders micro-manage LLMs&lt;/strong&gt;. I think a novice will be more efficient and get better results than me. For example:&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Experienced coders need retraining to instruct rather than code&lt;/strong&gt;. My instinct was to code immediately rather than to prompt.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Experienced coders are good with feedback&lt;/strong&gt;. It took me under 10 seconds to spot &lt;strong&gt;each&lt;/strong&gt; problem in the output &lt;strong&gt;and&lt;/strong&gt; code.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Experienced coders suggest precise code improvements&lt;/strong&gt;. Generally good ones. Like:&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;LLMs could turn coders into good lead developers or managers&lt;/strong&gt;. Pity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 16 Feb 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-16-feb-2025/</link>
      <pubDate>Sun, 16 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-16-feb-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.connectedpapers.com/&#34;&gt;Connected Papers&lt;/a&gt; shows papers similar to each other based on co-citation and bibliographic coupling for ~50,000 papers.&lt;/li&gt;
&lt;li&gt;Notes from a fireside chat with &lt;a href=&#34;https://www.linkedin.com/in/pchandrasekar/&#34;&gt;Prashanth Chandrasekar&lt;/a&gt;, CEO, StackOverflow, and the StackOverflow team
&lt;ul&gt;
&lt;li&gt;There&amp;rsquo;s a signal that software demand is growing in 2024. Many more students took the StackOverflow survey in 2024. So more students (or other professionals) are shifting into / starting to learn software development.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://aiindex.stanford.edu/report/&#34;&gt;AI Index&lt;/a&gt; is a good resource for AI trends.&lt;/li&gt;
&lt;li&gt;Experts are better able to use AI for writing code. Less experienced developers are more likely to use AI for code reviews, project planning, etc.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a 5% &lt;em&gt;decline&lt;/em&gt; in favorability for AI tools compared to 2023, maybe due to disappointing results.&lt;/li&gt;
&lt;li&gt;Pilot groups working on AI are 25-30% more productive. They&amp;rsquo;re the most enthusiastic. For the rest of the company, it drops off to 5-10%
&lt;ul&gt;
&lt;li&gt;#LEARNING Benefit comes from NEW people becoming programmers, not existing ones getting more effective?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;StackOverflow wants to be where the developer is.
&lt;ul&gt;
&lt;li&gt;The programmer workflow was: Google -&amp;gt; StackOverflow -&amp;gt; GitHub.&lt;/li&gt;
&lt;li&gt;Now it&amp;rsquo;s changing to ChatGPT / Cursor -&amp;gt; GitHub.&lt;/li&gt;
&lt;li&gt;StackOverflow has a partnership with OpenAI and working on a plugin. Same with Google&amp;rsquo;s Duet AI, GitHub Copilot, many others. They&amp;rsquo;ll link to StackOverflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;StackOverflow is driving integration actively through an enterprise Overflow API&lt;/li&gt;
&lt;li&gt;Q: What tech have you seen blaze through the ranks?
&lt;ul&gt;
&lt;li&gt;Prashanth: Abstraction wins. Stuff that abstracts away things well and more wins. This includes Gen AI.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/author/eyepis/&#34;&gt;Erin Yepis&lt;/a&gt;: Rust (from 3% to 12%). AWS has steady growth.&lt;/li&gt;
&lt;li&gt;Erin Yapis: I have a time series spreadsheet that I&amp;rsquo;ll publish.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: What technologies are unusually tightly coupled?
&lt;ul&gt;
&lt;li&gt;Prashanth: AWS &amp;amp; Google Cloud are tightly coupled.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: We have an engagement problem. Might be India-specific. What are low-effort high-return mechanisms to increase engagement.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/eric-woodring-1823bb84/&#34;&gt;Eric Woodring&lt;/a&gt;: Rather than a static web page, integrate it using the API. #TODO&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/benjaminmarconi/&#34;&gt;Ben Marconi&lt;/a&gt;: Use LLMs to write post mortems and push to StackOverflow. #TODO&lt;/li&gt;
&lt;li&gt;Eric Woodring: &amp;ldquo;Hydrating&amp;rdquo; the community helps.
&lt;ul&gt;
&lt;li&gt;We take repeat questions on Teams / Slack and seed them using LLMs.&lt;/li&gt;
&lt;li&gt;We integrate with the API to auto-add Q&amp;amp;A.&lt;/li&gt;
&lt;li&gt;Transform documentation into Q&amp;amp;A. Potentially &lt;strong&gt;UPDATE&lt;/strong&gt; existing Q&amp;amp;A if it&amp;rsquo;s wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: What unexpected lessons about developer behavior have you learned while running StackOverflow?
&lt;ul&gt;
&lt;li&gt;Prashanth: We didn&amp;rsquo;t expect developers moving away from Google. Now it moved to the IDE.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: What are you learning about developer learning behavior?
&lt;ul&gt;
&lt;li&gt;Ben Marconi: Generating LLM-based onboarding documents.&lt;/li&gt;
&lt;li&gt;Using StackOverflow for Teams to identify who the experts are to contact for specific topics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: Are you thinking about leveraging Stack Overflow&amp;rsquo;s knowledge base for personalized or interactive learning experiences? How?
&lt;ul&gt;
&lt;li&gt;Prashanth: Traditionally, people use StackOveflow for productivity, learning, and flexibility (i.e. to ask/answer questions asynchronously without breaking their flow). So yeah, learning is important for us. (Duh!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: Could Stack Overflow’s interactions help evaluate the accuracy and relevance of LLM-generated code? Or provide potential metrics on quality?
&lt;ul&gt;
&lt;li&gt;Prashanth: LLM accuracy improves by ~30%. Upvotes / downvotes are reinforcement learning (RL) in steroids, so that helps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: What are your thoughts on reliance on LLMs potentially deskill-ing developers?
&lt;ul&gt;
&lt;li&gt;Prashanth: A real issue for &lt;em&gt;junior&lt;/em&gt; developers, not for senior ones.&lt;/li&gt;
&lt;li&gt;They&amp;rsquo;ll &lt;em&gt;come across&lt;/em&gt; as knowledgeable.&lt;/li&gt;
&lt;li&gt;Make internal evaluations and interviews more rigorous.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anand&amp;rsquo;s requests for action:
&lt;ul&gt;
&lt;li&gt;Could I get a copy of Erin&amp;rsquo;s spreadsheet? Vivek Narayanan will follow-up.&lt;/li&gt;
&lt;li&gt;Could you help me learn more about hydration? Nick Madison will set up a meeting with customer success group.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I switched to &lt;a href=&#34;https://fishshell.com/&#34;&gt;fish shell&lt;/a&gt; mainly because:
&lt;ul&gt;
&lt;li&gt;Autocomplete and tab completion works perfectly, out-of-box.&lt;/li&gt;
&lt;li&gt;Syntax highlighting is beautiful&lt;/li&gt;
&lt;li&gt;Great multi-line editing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;To format with &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff&#34;&gt;VS Code Ruff&lt;/a&gt;, you need to point the &lt;code&gt;ruff.interpreter&lt;/code&gt; setting to a Python interpreter. You can&amp;rsquo;t run the ruff server without Python, even though ruff itself doesn&amp;rsquo;t need Python.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; checks all paths specified in &lt;a href=&#34;https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cd.html&#34;&gt;&lt;code&gt;CDPATH&lt;/code&gt;&lt;/a&gt; for the directory name and changes to the first match. That&amp;rsquo;s pretty convenient!&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://flipperzero.one/&#34;&gt;Flipper Zero&lt;/a&gt; is now on my list of &amp;ldquo;To Buy&amp;rdquo; tools. It has a variety of hardware devices including NFC, RFID, Bluetooth, Infrared, etc. and is great to reverse engineer or hack devices.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Launching an app only with LLMs and failing</title>
      <link>https://www.s-anand.net/blog/launching-an-app-only-with-llms-and-failing/</link>
      <pubDate>Tue, 07 Jan 2025 04:00:09 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/launching-an-app-only-with-llms-and-failing/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Launching an app only with LLMs and failing&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/DALL%C2%B7E-2025-01-07-11.57.24-A-colorful-single-panel-16x9-comic-strip-in-the-style-of-classic-Calvin-Hobbes.-Calvin-a-young-boy-with-wild-hair-sits-in-a-DIY-spaceship-made-out.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zohaib.me/using-llms-and-cursor-for-finishing-projects-productivity/&#34;&gt;Zohaib Rauf&lt;/a&gt; suggested using LLMs to spec code and using &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt; to build it. (via &lt;a href=&#34;https://simonwillison.net/2025/Jan/4/llms-and-cursor/&#34;&gt;Simon Willison&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I tried it. It&amp;rsquo;s promising, but my first attempt failed.&lt;/p&gt;
&lt;h3 id=&#34;i-couldnt-generate-a-specmd-using-llms&#34;&gt;I couldn&amp;rsquo;t generate a &lt;code&gt;SPEC.md&lt;/code&gt; using LLMs&lt;/h3&gt;
&lt;p&gt;At first, I started writing what I wanted.&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;This application identifies the drugs, diseases, and symptoms, as well as the emotions from an audio recording of a patient call in a clinical trial.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;… and then went on to define the &lt;strong&gt;EXACT&lt;/strong&gt; code structure I wanted. So I spent 20 minutes spec-ing &lt;a href=&#34;https://www.s-anand.net/notes/#/gpts?id=gramener-demos&#34;&gt;our application structure&lt;/a&gt; and 20 minutes spec-ing our internal &lt;a href=&#34;https://www.s-anand.net/notes/#/gpts?id=llm-foundry&#34;&gt;LLM Foundry APIs&lt;/a&gt; and 40 minutes detailing &lt;strong&gt;every step&lt;/strong&gt; of how I wanted the app to look and interact.&lt;/p&gt;
&lt;p&gt;After 90 minutes, I realized that I&amp;rsquo;m too controlling or too inexperienced in LLM-speccing. But I had a solid &lt;a href=&#34;https://github.com/gramener/patientpulse/blob/689d7870cd71e47b07d330d4fddec86e561e0798/SPEC.md&#34;&gt;&lt;code&gt;SPEC.md&lt;/code&gt;&lt;/a&gt;.&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;&lt;span class=&#34;gh&#34;&gt;# Patient Pulse
&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;The application identifies the drugs, diseases, and symptoms, as well as the emotions from an audio recording of a patient call in a clinical trial.
&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 class=&#34;gu&#34;&gt;## How the application works
&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;The application is a [&lt;span class=&#34;nt&#34;&gt;Gramener Demo&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;#gramener-demos&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;&lt;span class=&#34;sb&#34;&gt;`script.js`&lt;/span&gt; implements this logic:
&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 class=&#34;k&#34;&gt;-&lt;/span&gt; Reads &lt;span class=&#34;sb&#34;&gt;`config.json`&lt;/span&gt; to get the list of transcripts and renders them, allowing users to select a transcript
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; When the user selects a transcript, it reads the audio and prosody files
&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;Once it reads these files, it makes a request to GPT-4o-mini via [&lt;span class=&#34;nt&#34;&gt;LLM Foundry API&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;#llm-foundry&lt;/span&gt;) with the system prompt:
&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 class=&#34;sb&#34;&gt;`markdown
&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;sb&#34;&gt;You are a clinical trial expert. Read this call transcript. Identify all drugs, diseases, and symptoms mentioned. Return a JSON that mentions each along with the line in the call transcript they occur in. Example:
&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;sb&#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;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;`&lt;span class=&#34;sb&#34;&gt;`json
&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;sb&#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;&lt;span class=&#34;sb&#34;&gt;  &amp;#34;symptoms&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [1, 4] }, // first symptom is mentioned in lines 1, 4
&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [8] } // second symptom is mentioned in line 8
&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;sb&#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;&lt;span class=&#34;sb&#34;&gt;  &amp;#34;drugs&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [6] } // first drug is mentioned in line 6
&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;sb&#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;&lt;span class=&#34;sb&#34;&gt;  &amp;#34;emotions&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [9] } // first emotion is mentioned in line 9
&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;sb&#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;&lt;span class=&#34;sb&#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;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;`&lt;span class=&#34;sb&#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;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;```
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;It then renders a UI (via lit-html) that

- Plays the audio
- Maps the emotions in `${filename}.prosody.csv` to the 8 basic emotions on Robert Plutchik&amp;#39;s theory of emotions. See [How to map emotions](#how-to-map-emotions)
- Displays [wheel.png](wheel.png), which is a 1080x1080px image of Plutchik&amp;#39;s wheel of emotions
- As the audio plays, it
  - displays text up to the currently playing `Text` from `${filename}.prosody.csv`, highlighting the current sentence.
  - displays the emotions as a semi-transparent radar chart on the wheel of emotions
- It allows pausing and resuming the audio.
- It allows users to drag the audio slider to jump to any point in the audio. The transcript and the wheel of emotions are updated to reflect the new position in the audio.

... (and it goes on for 500+ lines.)
```

I did use [O1](https://openai.com/o1/) to help with the spec. Specifically:

- **How to name it.** I asked for short demo names and chose &amp;#34;Patient Pulse&amp;#34;.
- **How to arrange emotions.** I asked how to arrange 53 emotions in a circle so similar ones were next to each other.

**My takeaway**: Writing a `SPEC.md` can help, especially if you plan to re-use parts of it. But the spec kept evolving as I built the app, because I often don’t know what I want until I see it. Maybe an “agile” approach would work better for me.

### Cursor messed up the code

I prompted Cursor to `Generate an application based on this spec. @SPEC.md`. Here&amp;#39;s the code it generated.

```javascript
import { render, html } from &amp;#34;https://cdn.jsdelivr.net/npm/lit-html@3/+esm&amp;#34;;
import * as d3 from &amp;#34;https://cdn.jsdelivr.net/npm/d3@7/+esm&amp;#34;;

// Map of Hume emotions to Plutchik&amp;#39;s 8 basic emotions
const EMOTION_MAP = {
  Admiration: [&amp;#34;Joy&amp;#34;, &amp;#34;Trust&amp;#34;],
  Adoration: [&amp;#34;Joy&amp;#34;, &amp;#34;Trust&amp;#34;],
  &amp;#34;Aesthetic Appreciation&amp;#34;: [&amp;#34;Joy&amp;#34;],
  // ... (truncated for brevity - use mapping from spec)
};

// ... skipping lots of code ...

/**
 * Main application component
 * @returns {TemplateResult} Main application UI
 */
const App = async () =&amp;gt; {
  const config = await fetch(&amp;#34;config.json&amp;#34;).then((r) =&amp;gt; r.json());
  const [selectedTranscript, setSelectedTranscript] = useState(null);
  const [audioPlayer, setAudioPlayer] = useState(null);
  const [currentTime, setCurrentTime] = useState(0);
  const [prosodyData, setProsodyData] = useState([]);
  const [analysisResults, setAnalysisResults] = useState(null);

  const loadTranscript = async (transcript) =&amp;gt; {
    setSelectedTranscript(transcript);

  // ... skipping lots of code
};

// Initialize app
render(App(), document.getElementById(&amp;#34;app&amp;#34;));
```

This code was a mess. I had told it to use `lit-html`, which doesn’t have `useState`. That’s a React feature, so nothing worked right.

I ended up building the app from scratch. It took four hours and many changes from the original spec, though having a spec did help a bit.

**My learning**: Cursor and I still can’t build a mid-sized app in one go. I’m in the &amp;#34;scaffold and refine&amp;#34; phase.
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Things I Learned - 10 Nov 2024</title>
      <link>https://www.s-anand.net/blog/things-i-learned-10-nov-2024/</link>
      <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-10-nov-2024/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://openfreemap.org/&#34;&gt;OpenFreeMap&lt;/a&gt; is a free embeddable OpenStreetMap tile server. You can use &lt;a href=&#34;https://maplibre.org/&#34;&gt;MapLibre GL&lt;/a&gt; (more features) or Leaflet (simpler) to render it. It offers styling and self-hosting.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://actions.zapier.com/&#34;&gt;Zapier Actions&lt;/a&gt; are an easy way to set up custom actions like GMail / Google Calendar APIs for GPTs, since &lt;a href=&#34;https://community.openai.com/t/gpt-oauth-callback-url-keeps-changing/493236&#34;&gt;GPTs&amp;rsquo; callback URLs keep changing&lt;/a&gt;. But they fail often, and don&amp;rsquo;t work on mobile. At least for me.&lt;/li&gt;
&lt;li&gt;LLM Vision Use Cases in manufacturing and earth sciences (via Shivku)
&lt;ul&gt;
&lt;li&gt;Automated geoscience image descriptions &lt;a href=&#34;https://www.linkedin.com/posts/paulhcleverley_geosciences-earthscience-geology-activity-7254037937674240000-pQab/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Interpret Wind Turbine photos and charts, construction monitoring, equipment maintenance &amp;amp; charts &lt;a href=&#34;https://www.linkedin.com/pulse/vision-ai-energy-use-cases-copilot-wind-siting-impact-kalyanaraman-wqe7c/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Forecast weather based on cloud photos! &lt;a href=&#34;https://www.linkedin.com/pulse/cloud-typing-local-weather-forecasting-using-chatgpt-cam-shivkumar-1hhkc/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Analyze thermal image of solar panels, electroluminescence images for warranty claims, ROI estimates from Google Sunroof rooftop images &lt;a href=&#34;https://www.linkedin.com/pulse/vision-ai-energy-use-cases-part-1-copilot-solar-pv-kalyanaraman-ccszc/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Corrosion detection in electricity towers, turbines, storage tanks, penstock. Interpret non-destructive test images &lt;a href=&#34;https://www.linkedin.com/pulse/vision-ai-energy-use-cases-copilot-corrosion-shivkumar-kalyanaraman-onuic/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Google counts auto-completion when saying &amp;ldquo;25% of all the code is written by AI at Google&amp;rdquo;. &amp;ldquo;It&amp;rsquo;s a helpful productivity tool but it&amp;rsquo;s not doing any engineering at all. It&amp;rsquo;s probably about as good, maybe slightly worse, than Copilot.&amp;rdquo; &lt;a href=&#34;https://news.ycombinator.com/item?id=42002212&#34;&gt;YCombinator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Workflow for AI video creation: Use Meshcapade (meshcapade.com) to generate body movement of a 3D-rendered character. Pass that video to Runway&amp;rsquo;s video-to-video model to generate any visual. Add music from Suno &lt;a href=&#34;https://www.linkedin.com/posts/peter-gostev_i-discovered-a-really-cool-new-workflow-for-activity-7260003053771141120-DJpS&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Someone sorted the X and Y columns independently for regression. &lt;a href=&#34;https://stats.stackexchange.com/q/185507&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android keyboard learning only sends model changes back to server and not local keywords. Model changes are aggregated! &lt;a href=&#34;https://chatgpt.com/share/672d6d6d-46a0-800c-a130-c689f5ebc0b7&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Here is a prompt for audio transcription using Gemini. &lt;a href=&#34;https://gist.github.com/rajivsinclair/8fb0371f6eda25f9e5cc515cd77abd62&#34;&gt;Ref&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Transcription: Accurately transcribe the audio clip in the original language. Include all spoken words, fillers, slang, colloquialisms, and any code-switching instances. Pay attention to dialects and regional variations common among immigrant communities. Do your best to capture the speech accurately, and flag any unintelligible portions with &lt;code&gt;[inaudible]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Translation: Translate the transcription into English. Preserve the original meaning, context, idiomatic expressions, and cultural references. Ensure that nuances and subtleties are accurately conveyed.&lt;/li&gt;
&lt;li&gt;Capture Vocal Nuances: Note vocal cues such as tone, pitch, pacing, emphasis, and emotional expressions that may influence the message. These cues are critical for understanding intent and potential impact.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Here are some approaches to large-scale classification of medical codes. &lt;a href=&#34;https://chatgpt.com/share/672dd476-7694-800c-a150-f3de912788ef&#34;&gt;ChatGPT&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Fine-Tuning LLMs on Medical Data: Enhance LLMs by training them on medical datasets, such as clinical notes and discharge summaries, to improve their understanding of medical terminology and context.&lt;/li&gt;
&lt;li&gt;Multi-Agent Frameworks: Implement a multi-agent system that simulates real-world coding processes with distinct roles (e.g., patient, physician, coder, reviewer, adjuster). Each agent utilizes an LLM to perform specific functions, enhancing interpretability and reliability. &lt;a href=&#34;https://arxiv.org/abs/2406.15363&#34;&gt;ArXiv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Retrieve-Rank Systems: Develop a two-stage system where the LLM first retrieves potential ICD-10 codes and then ranks them based on relevance, improving precision in code assignment. &lt;a href=&#34;https://arxiv.org/abs/2407.12849&#34;&gt;ArXiv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Embedding-Based Approaches: Use LLMs to generate embeddings for ICD-10 codes and medical texts, facilitating the matching of texts to appropriate codes through similarity measures. &lt;a href=&#34;https://github.com/kaneplusplus/icd-10-cm-embedding&#34;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hierarchical Classification: Leverage the hierarchical structure of ICD-10 codes by first classifying texts into broader categories before assigning specific codes, reducing complexity and improving accuracy. &lt;a href=&#34;https://arxiv.org/abs/2310.06552&#34;&gt;ArXiv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Two-Stage Verification Models: Combine LLMs with verification models, such as Long Short-Term Memory (LSTM) networks, to validate and refine the codes suggested by the LLM, balancing recall and precision. &lt;a href=&#34;https://arxiv.org/abs/2311.13735&#34;&gt;ArXiv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Also, a mixture of models approach might work. Feed any existing NLP model / rules as a second opinion.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GraphRAG is better if data is naturally graph-structured. Else, it&amp;rsquo;s slow and fills up the context window with even vaguely related stuff. Vigneshbabu, AMAT.&lt;/li&gt;
&lt;li&gt;ChatGPT for Windows desktop supports real-time voice and a global shortcut (Alt Space).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://uithub.com&#34;&gt;uithub&lt;/a&gt; converts GitHub repos to Markdown. Just replace &amp;ldquo;g&amp;rdquo; in &amp;ldquo;github.com/&amp;hellip;&amp;rdquo; with &amp;ldquo;u&amp;rdquo;. &lt;a href=&#34;https://uithub.com/gramener/asyncllm&#34;&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WebContainers are a thing and Bolt.new uses them!&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DS4SD/docling&#34;&gt;Docling&lt;/a&gt; by IBM converts PDF, DOCX, etc. to Markdown. Like &lt;a href=&#34;https://pymupdf.readthedocs.io/en/latest/pymupdf4llm/&#34;&gt;PyMuPDF4LLM&lt;/a&gt; but better.&lt;/li&gt;
&lt;li&gt;Check out &lt;a href=&#34;https://www.loom.com/&#34;&gt;Loom&lt;/a&gt; and &lt;a href=&#34;https://cleanshot.com/&#34;&gt;Cleanshot&lt;/a&gt; are the recommended tools for screen recording and screenshotting. But Loom is paid and Cleanshot is Mac only.&lt;/li&gt;
&lt;li&gt;The Rubik&amp;rsquo;s cube has a Hamiltonian cycle through every one of its 43 quintillion states. &lt;a href=&#34;https://bruce.cubing.net/ham333/rubikhamiltonexplanation.html&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://microsoft.github.io/OmniParser/&#34;&gt;OmniParser&lt;/a&gt; is great at parsing screenshots and identifying bounding boxes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.recraft.ai/&#34;&gt;Recraft.ai&lt;/a&gt; is currently SOTA in text to image. It&amp;rsquo;s fairly impressive and could be a good alternative to Figma.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://zed.dev/&#34;&gt;Zed.dev&lt;/a&gt; is an AI code editor by the creators of Atom. It&amp;rsquo;s written in Rust and is blazing fast. It has native AI integration.&lt;/li&gt;
&lt;li&gt;Artificial Analysis has a bunch of new leaderboards and arenas.
&lt;ul&gt;
&lt;li&gt;Open AI TTS leads the &lt;a href=&#34;https://artificialanalysis.ai/text-to-speech/arena?tab=Leaderboard&#34;&gt;TTS Leaderboard&lt;/a&gt;. ElevenLabs is a bit behind.&lt;/li&gt;
&lt;li&gt;Recraft V3 &amp;gt; Flux 1.1 leads &lt;a href=&#34;https://artificialanalysis.ai/text-to-image/arena?tab=Leaderboard&#34;&gt;Text to Image Leaderboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Standard-Intelligence/hertz-dev&#34;&gt;Hertz-Dev&lt;/a&gt; is an open source realtime voice chat model. But it doesn&amp;rsquo;t fit in Google Colab T4&amp;rsquo;s RAM&lt;/li&gt;
&lt;li&gt;Chain of Thought reduces performance where thinking makes humans worse. &lt;a href=&#34;https://arxiv.org/abs/2410.21333&#34;&gt;Ref&lt;/a&gt;. Specifically:
&lt;ul&gt;
&lt;li&gt;Artificial grammar learning&lt;/li&gt;
&lt;li&gt;Facial recognition&lt;/li&gt;
&lt;li&gt;Classifying data that has exceptions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hamel.dev/blog/posts/llm-judge/&#34;&gt;Creating a LLM-as-a-Judge That Drives Business Results&lt;/a&gt; by Hamel Husain.
&lt;ul&gt;
&lt;li&gt;Get THE domain expert (or approver) as the tester.&lt;/li&gt;
&lt;li&gt;Create a dataset that is DIVERSE.&lt;/li&gt;
&lt;li&gt;Covers EACH combination of:
&lt;ul&gt;
&lt;li&gt;Features&lt;/li&gt;
&lt;li&gt;Scenarios: e.g. multiple matches, no match, ambiguous request, invalid/incomplete input, unsupported feature, system error&lt;/li&gt;
&lt;li&gt;Persona: e.g. new user, expert user, non-native speaker, busy professional, technophobe, elderly user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generate data using existing data + synthetic data for each SPECIFIC combination of the above&lt;/li&gt;
&lt;li&gt;Evaluate based only on PASS/FAIL with a CRITIQUE detailed enough for a new employee. Include:
&lt;ul&gt;
&lt;li&gt;Nuances: Something a failed response did well or a passed response didn&amp;rsquo;t quite do well&lt;/li&gt;
&lt;li&gt;Improvements: Suggest how model can improve&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Build an SPA to make it easy for the domain expert to review&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LLMs can be made to unlearn (copyright material) better by identifying components related to the knowledge to unlearn and applying a larger learning rate to these while leaving other parts unchanged. As opposed to low learning rates for all components. &lt;a href=&#34;https://arxiv.org/abs/2410.16454&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/how-can-non-programmers-build-apps/</link>
      <pubDate>Sun, 20 Oct 2024 10:37:57 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/how-can-non-programmers-build-apps/</guid>
      <description>&lt;p&gt;How can non-programmers build apps?&lt;/p&gt;
&lt;p&gt;Claude.ai, Replit.com, Bolt.new, V0.dev, Pythagora.ai and a few other tools write and deploy code just based on a prompt. You should try them out.&lt;/p&gt;
&lt;p&gt;But how do you build the skill? Is there a tutorial?&amp;quot; I&amp;rsquo;m often asked. No, I can&amp;rsquo;t find a tutorial, but here is my suggestion.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You probably can&amp;rsquo;t guess what&amp;rsquo;s easy or hard. e.g. &amp;ldquo;Take my picture in black &amp;amp; white&amp;rdquo; is FAR easier than &amp;ldquo;When&amp;rsquo;s the next lunar eclipse?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So if the app doesn&amp;rsquo;t work, try 2-3 times, then GIVE UP! Note it down and try something else. (You&amp;rsquo;ll soon get a feel for what&amp;rsquo;s possible.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revisit what failed 3-6 months later. It might suddenly become possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2024-10-20-calvin-vibe-coding.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A7253716064579043329&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>How can non-developers learn AI coding?</title>
      <link>https://www.s-anand.net/blog/how-can-non-developers-learn-ai-coding/</link>
      <pubDate>Sun, 20 Oct 2024 10:36:37 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/how-can-non-developers-learn-ai-coding/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;How can non-developers learn AI coding?&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/calvin-coding.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;How can non-programmers build apps?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://bolt.new/&#34;&gt;Claude.ai&lt;/a&gt;, &lt;a href=&#34;https://replit.com/&#34;&gt;Replit.com&lt;/a&gt;, &lt;a href=&#34;https://bolt.new&#34;&gt;Bolt.new&lt;/a&gt;, &lt;a href=&#34;https://v0.dev/&#34;&gt;V0.dev&lt;/a&gt;, &lt;a href=&#34;https://pythagora.ai/&#34;&gt;Pythagora.ai&lt;/a&gt; and a few other tools write and deploy code just based on a prompt. You should try them out.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;But how do you build the skill? Is there a tutorial?&amp;rdquo; I&amp;rsquo;m often asked. No, I can&amp;rsquo;t find a tutorial, but here is my suggestion.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://xkcd.com/1425/&#34;&gt;You probably can&amp;rsquo;t guess what&amp;rsquo;s easy or hard&lt;/a&gt;. e.g. &amp;ldquo;Take my picture in black &amp;amp; white&amp;rdquo; is FAR easier than &amp;ldquo;When&amp;rsquo;s the next lunar eclipse?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;So if the app doesn&amp;rsquo;t work, try 2-3 times, then GIVE UP! Note it down. Then try something else. (You&amp;rsquo;ll soon get a feel for what&amp;rsquo;s possible.)&lt;/li&gt;
&lt;li&gt;Revisit what failed 3-6 months later. It might suddenly become possible.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    <item>
      <title>Leaning into the power of AI coding</title>
      <link>https://www.s-anand.net/blog/leaning-into-the-power-of-ai-coding/</link>
      <pubDate>Wed, 16 Oct 2024 03:55:59 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/leaning-into-the-power-of-ai-coding/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Leaning into the power of AI coding&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/DALL%C2%B7E-2024-10-16-11.52.50-A-colorful-single-panel-comic-strip-in-the-style-of-classic-Calvin-Hobbes.-Calvin-a-young-boy-with-wild-hair-is-wobbling-precariously-on-a-bike-as.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yesterday (15 Oct 2024), I used &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt; to code more than I ever have. (Doing&#39;s how we learn, I guess. Not just reading.)&lt;/p&gt;
&lt;svg overflow=&#34;hidden&#34; viewbox=&#34;0 0 1697 1288&#34; width=&#34;500&#34; xml:space=&#34;preserve&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M32 18h1621v107H32z&#34; fill=&#34;#C0E6F5&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M521 130h92v82h-92zM521 232h163v82H521zM521 334h526v82H521zM521 437h97v81h-97zM521 539h5v81h-5zM521 641h255v81H521zM521 743h143v81H521zM521 845h342v81H521zM521 946h92v82h-92zM521 1049h169v81H521zM521 1151h1122v81H521z&#34; fill=&#34;#FFB628&#34;&gt;&lt;/path&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;700&#34; transform=&#34;translate(47.4 96)&#34;&gt;Date&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;700&#34; transform=&#34;translate(526.35 96)&#34;&gt;Usage&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 198)&#34;&gt;05&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 198)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 198)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 198)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 198)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 198)&#34;&gt;15&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 300)&#34;&gt;06&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 300)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 300)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 300)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 300)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 300)&#34;&gt;27&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 402)&#34;&gt;07&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.5 402)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.32 402)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.38 402)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.44 402)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 402)&#34;&gt;87&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 504)&#34;&gt;08&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 504)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 504)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 504)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 504)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 504)&#34;&gt;16&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 606)&#34;&gt;09&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 606)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 606)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 606)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 606)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 708)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 708)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 708)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 708)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 708)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 708)&#34;&gt;42&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 810)&#34;&gt;11&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 810)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 810)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 810)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 810)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 810)&#34;&gt;24&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 912)&#34;&gt;12&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 912)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 912)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 912)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 912)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 912)&#34;&gt;57&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 1014)&#34;&gt;13&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 1014)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 1014)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 1014)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 1014)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 1014)&#34;&gt;15&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 1117)&#34;&gt;14&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 1117)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 1117)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 1117)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 1117)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 1117)&#34;&gt;28&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 1219)&#34;&gt;15&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 1219)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 1219)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 1219)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 1219)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1530.68 1219)&#34;&gt;186&lt;/text&gt;&lt;path d=&#34;M511 18h5v1h-5z&#34; fill=&#34;#E0E0E0&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M32.5 120.5h1621&#34; fill=&#34;none&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M32 120h1621v5H32z&#34; fill=&#34;#44B3E1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;p&gt;This was mainly to create and publish 2 libraries on npm over 6 hours:&lt;/p&gt;
&lt;ol class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/asyncsse&#34;&gt;asyncsse&lt;/a&gt; - which converts a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events&#34;&gt;Server-Sent Event&lt;/a&gt; stream into an async iterator that I can use in a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of&#34;&gt;for await ... of&lt;/a&gt; loop&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/asyncllm&#34;&gt;asyncllm&lt;/a&gt; - which standardizes the Server-Sent Events streamed by the popular LLMs into an easy to use form.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This exercise broke several mental barriers for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Writing in a new language&lt;/strong&gt;. &lt;a href=&#34;https://deno.com/blog/v2.0&#34;&gt;Deno 2.0&lt;/a&gt; was released recently. I was impressed by the compatibility with npm packages. Plus, it&#39;s a single EXE download that includes a linter, tester, formatter, etc. Like all recent cool fast tools, it&#39;s written in Rust. So I decided to use it for testing. Running &lt;code&gt;deno test&lt;/code&gt; runs the &lt;a href=&#34;https://github.com/gramener/asyncsse/blob/main/test.js&#34;&gt;entire test suite&lt;/a&gt;. My prompts included asking it to:&lt;/p&gt;
&lt;ul class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;code&gt;Create a Deno HTTP server to mock requests for the tests&lt;/code&gt;. This is cool because a single, simple code chunk runs the server within the test suite.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Serve static files from samples/&lt;/code&gt; to move my tests into files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Writing test cases&lt;/strong&gt;. Every line of this code was written by Cursor via Claude 3.5 Sonnet. &lt;em&gt;Every line&lt;/em&gt;. My prompt was, &lt;code&gt;Look at the code in @index.js and write test cases for scenarios not yet covered.&lt;/code&gt; It&#39;s surprising how much of the SSE spec it already knew, and anticipated edge cases like:&lt;/p&gt;
&lt;ul class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L67-L69&#34;&gt;SSE values might have a colon&lt;/a&gt;. I learnt for the first time that the &lt;code&gt;limit&lt;/code&gt; parameter in &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split&#34;&gt;String.split()&lt;/a&gt; is very different from Python&#39;s str.split. (The splits, then picks the first few, ignoring the rest. Python ensures the rest is packed into the last split.) This helped me find a major bug.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L52-L54&#34;&gt;SSE has comments&lt;/a&gt;. Empty keys are treated as strings. Didn&#39;t know this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was able to use it to generate test cases based on content as well. &lt;code&gt;Based on @index.js and @&lt;a href=&#34;https://github.com/gramener/asyncllm/blob/main/samples/openai.txt&#34;&gt;openai.txt&lt;/a&gt; write a test case that verifies the functionality&lt;/code&gt;  created the entire &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/cbde11155f3a8567794058d01da1bd8d72f996b7/test.js#L25-L34&#34;&gt;test case for OpenAI responses&lt;/a&gt;. (I did have to edit it because LLMs don&#39;t count very well, but it was minimal.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bridging test coverage gaps&lt;/strong&gt;. The prompt that gave me the most delightful result was &lt;code&gt;Are there any scenarios in @index.js not tested by @test.js?&lt;/code&gt; It did a great job of highlighting that I hadn&#39;t covered Groq, Azure, or CloudFlare AI workers (though they were mentioned in the comments), error handling, empty/null values in some cases, tested for multiple tool calls. I had it generate mock test data for some of these and added the tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enhancing knowledge with references&lt;/strong&gt;. I passed Cursor the SSE documentation via &lt;code&gt;@https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events&lt;/code&gt; and asked it to find more scenarios my code at &lt;code&gt;@index.js&lt;/code&gt; had not covered. This found a number of new issues.&lt;/p&gt;
&lt;ul class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L79-L82&#34;&gt;SSE values can be split across multiple lines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L75-L78&#34;&gt;Fields without values are valid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L71-L73&#34;&gt;Empty lines should be ignored&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Generating bindings&lt;/strong&gt;. I avoid TypeScript because I don&#39;t know it. Plus, it requires an compilation step for the browser. But TypeScript bindings are helpful. So I prompted Cursor, using the Composer (which can create new files) to &lt;code&gt;Create TypeScript bindings for @index.js in index.d.ts&lt;/code&gt; - which id did almost perfectly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check for errors&lt;/strong&gt;. I typed &lt;code&gt;Check this file for errors&lt;/code&gt; on @&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/main/index.d.ts&#34;&gt;index.d.ts&lt;/a&gt;. I don&#39;t know enough to figure this out. It went through the description and said everything seems fine. But I saw a TypeScript plugin error that said, &lt;code&gt;Property &#39;data&#39; of type &#39;string | undefined&#39; is not assignable to &#39;string&#39; index type &#39;string&#39;.ts(2411)&lt;/code&gt;. When prompted, it spotted the issue. (The earlier code assumed all properties are strings. But some can be undefined too. It fixed it.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;. At first, I asked the Composer to &lt;code&gt;Create a README.md suitable for a world-class professional open source npm package&lt;/code&gt; and it did a &lt;a href=&#34;https://github.com/gramener/asyncsse/blob/main/README.md&#34;&gt;pretty good job&lt;/a&gt;. I just needed to update the repository name. I further prompted it to &lt;code&gt;Modify README based on @index.js and share examples from @test.js&lt;/code&gt; on &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/main/README.md&#34;&gt;asyncllm&lt;/a&gt;, which did an excellent job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code review&lt;/strong&gt;. I asked it to &lt;code&gt;Review this code. Suggest possible improvements for simplicity, future-proofing, robustness, and efficiency&lt;/code&gt; and it shared a few very effective improvements.&lt;/p&gt;
&lt;ol class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookahead_assertion&#34;&gt;Regex lookaheads&lt;/a&gt; for efficient regular expression splitting, i.e. use &lt;code&gt;buffer.split(/(?=\r?\n\r?\n)/)&lt;/code&gt; instead of &lt;code&gt;buffer.split(/(\r?\n\r?\n)/)&lt;/code&gt; -- and though I haven&#39;t tested this, it looked cool.&lt;/li&gt;
&lt;li&gt;Restructuring complex if-else code into &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/cbde11155f3a8567794058d01da1bd8d72f996b7/index.js#L64-L84&#34;&gt;elegant parsers&lt;/a&gt; that made my code a lot more modular.&lt;/li&gt;
&lt;li&gt;Error handling. It added &lt;code&gt;try {} catch {}&lt;/code&gt; blocks at a few places that helped catch errors that I don&#39;t anticipate but don&#39;t hurt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Code simplification&lt;/strong&gt;. Several times, I passed it a code snippet, saying just &lt;code&gt;Simplify&lt;/code&gt;. Here&#39;s an example:&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;events&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#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;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;asyncLLM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(...))&lt;/span&gt; &lt;span class=&#34;p&#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;  &lt;span class=&#34;nx&#34;&gt;events&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#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;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This can be simplified to&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;events&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fromAsync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;asyncLLM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(...))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Packaging&lt;/strong&gt;. I copied a &lt;code&gt;package.json&lt;/code&gt; from an earlier file and asked it to &lt;code&gt;Modify package.json, notable keywords and files and scripts based on @index.js&lt;/code&gt; which it did a &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/main/package.json&#34;&gt;perfect job of&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blogging&lt;/strong&gt;. I wrote this blog post with the help of the chat history on Cursor. Normally, such blog posts take me 3-4 hours. This one took 45 minutes. I just had to pick and choose from history. (I lost a few because I renamed directories. I&#39;ll be careful not to do that going forward.)&lt;/p&gt;
&lt;hr class=&#34;wp-block-separator has-alpha-channel-opacity&#34;/&gt;
&lt;p&gt;Overall, it was a day of great learning. Not in the classroom sense of &#34;Here&#39;s something I didn&#39;t know before&#34;, but rather the cycling / swimming sense of &#34;Here&#39;s something I now know to do.&#34;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Challenge: code in 10 minutes with only an LLM</title>
      <link>https://www.s-anand.net/blog/challenge-code-in-10-minutes-with-only-an-llm/</link>
      <pubDate>Wed, 09 Oct 2024 04:18:23 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/challenge-code-in-10-minutes-with-only-an-llm/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Challenge: code in 10 minutes with only an LLM&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/calvin-llm-challenge-2.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;I gave a bonus assignment in LLM coding to ~1,000 students at the &lt;a href=&#34;https://study.iitm.ac.in/ds/course_pages/BSSE2002.html&#34;&gt;Tools in Data Science course at IITM&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here is an OPTIONAL project: Record a 10-minute video in which you create an application entirely using LLMs and deploy it.&lt;/p&gt;
&lt;p&gt;Any app is fine. Any language. Simple or complex. Business or gaming. Anything is fine. Your choice.&lt;br&gt;
Create the app only using LLMs. You can use an LLM (ChatGPT, Claude.ai, Gemini, Cursor, Cody, etc.) but you can only prompt the app to write code. You can copy-paste code and run code don’t write or edit even a single line of code directly. Use LLMs to debug and edit. Code completion is NOT allowed – only prompting/chatting.&lt;br&gt;
Record the entire process in 10 min. Don’t edit, trim, enhance, or annotate the video. You should record yourself creating the entire app from start to finish. Practice beforehand if you like. Record in 1 take.&lt;br&gt;
Share the video and app. Publish the video publicly anywhere (e.g. YouTube and share the link.) Publish the app publicly anywhere (e.g. GitHub pages, Glitch.me, Heroku, etc.) or upload a ZIP file with the code (for slightly lower marks.)&lt;br&gt;
Submit via a reply to this thread. Multiple submissions per person are fine. Work in groups if you like but only the submitter gets marks.&lt;/p&gt;
&lt;p&gt;I will award up to 1 bonus mark at my discretion based on:&lt;/p&gt;
&lt;p&gt;How well you prompt the LLM&lt;br&gt;
How impressive the app is (if you’ve hosted it - I probably won’t run your code)&lt;br&gt;
How closely you followed the rules above&lt;br&gt;
This exercise is to help you (and me) learn a topic that’ll probably change the way we all code: using LLMs to code.&lt;/p&gt;
&lt;p&gt;Cutoff date: 7 Oct 2024, AoE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Adoption was low but in line with the industry.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;About 50 students (around 5% of the batch) attempted this. In contrast, ~70-80% take the (mostly) mandatory graded assignments.&lt;/p&gt;
&lt;p&gt;This is comparable with what I see at &lt;a href=&#34;https://straive.com/&#34;&gt;Straive&lt;/a&gt;. When given the option, about 5% of Straive&amp;rsquo;s 20,000 people uses LLMs on in a given week. (There are many things different there. I&amp;rsquo;m tracking LLM use, not LLM coding. It&amp;rsquo;s a work environment, not a learning one. There&amp;rsquo;s no bonus mark awarded. But still, I see the &amp;ldquo;around 5%&amp;rdquo; number popping up often.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Games were the most popular category, mainly Tic Tac Toe and Snake Game.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is understandable. They&amp;rsquo;re easy to think of, implement, and use.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Candy Crush - &lt;a href=&#34;https://youtube.com/live/8CMGMeL0U6Y&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/Nishtha65/LLM-Project&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Catch the Ball - &lt;a href=&#34;https://youtu.be/1GaHxj8yJbo&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://lakb05.github.io/TDS-bonus-game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flappy Bird - &lt;a href=&#34;https://youtu.be/2SRaEQEXiUo&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://harikrishnan51688.github.io/tds-flappybird/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flappy Bird - &lt;a href=&#34;https://youtu.be/jRLaeVtziJw&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/adith-ds/TDS---AI-flappy-bird&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Magic Square - &lt;a href=&#34;https://drive.google.com/file/d/1_RHfNasfIjApRINuz9LHBSU5eqg42NSl/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://22f3002094.github.io/Magic-square-game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Memory Match - &lt;a href=&#34;https://youtu.be/A7oZzsOJUFs&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://yash-maheshwar1.github.io/TDS_bonusproject/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Memory Match - &lt;a href=&#34;https://youtu.be/t_FCGKQrBXs&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://abhimanyudwivedi282.github.io/Game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Minesweeper - &lt;a href=&#34;https://youtu.be/WBDrO2j9XzQ&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://saikatmandal2022.github.io/Minesweeper-saikat/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Minesweeper - &lt;a href=&#34;https://youtu.be/Xa9_VqCzhmo&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/code-sans/minesweeper&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;N-Queens - &lt;a href=&#34;https://youtu.be/uuf3-_xYp7k&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/Via-01/Iitm.V/blob/main/TDSBonusAssignment&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Number Guessing Game - &lt;a href=&#34;https://youtu.be/tPDMw-MQH6k&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/23f2004165/NUMBER_GUESSING_GAME-TDS-/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open Mines game - &lt;a href=&#34;https://youtu.be/iAmfsSlKkJw&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://arya-dev01.github.io/TDS-LLM-PROJECT/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rock-Paper-Scissors - &lt;a href=&#34;https://drive.google.com/file/d/1YpIjEikUlOtN1USXuUF6lVx8CKh_YE5C/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://microdev1.github.io/llm_only_rock_paper_scissor/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rock-Paper-Scissors - &lt;a href=&#34;https://youtu.be/EGbeA-x79tY&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/indalbind/TDS_lab&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sliding Game - &lt;a href=&#34;https://youtu.be/Ej8tBrvKExc&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://salmanulfaris.github.io/tds-sliding-game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snake Game - &lt;a href=&#34;https://drive.google.com/file/d/1yhK1B0lQM-btAo9K4TnaYXnT_zL6Yq3X/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/IITM-007/TDSop/blob/main/game.py&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snake Game - &lt;a href=&#34;https://youtu.be/-fOJf5PehKc&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://soumaysinghchauhan.github.io/Classic-Snake-Game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snake Game - &lt;a href=&#34;https://youtu.be/dciE8MED9oI&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://bracket12.github.io/snakegame/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snake Game - &lt;a href=&#34;https://youtu.be/IT7kZUad57Q&#34;&gt;Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snake Game - &lt;a href=&#34;https://youtu.be/ivlQd0CQx98&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/AryanThakur-123/Snake-Game&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snake Game + Pomodoro - &lt;a href=&#34;https://youtu.be/b3CUZrCZHY0&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://sameer2799.github.io/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sudoku - &lt;a href=&#34;https://drive.google.com/file/d/1abXFeMdBVPk4Mih-hTz7UTcYcF8F8g7E/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://22f3002758.github.io/Sudoku-Game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sudoku - &lt;a href=&#34;https://youtu.be/ISGAENqcYTY&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://rajatprat.github.io/soduku/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tic Tac Toe - &lt;a href=&#34;https://drive.google.com/file/d/1GYj1GnQeOxqZbXMK29yQWVIjGzUcMMq6/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://23f3001726.github.io/ttc-v2/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tic Tac Toe - &lt;a href=&#34;https://drive.google.com/file/d/1J0pH9Mt9woqzDaUzMoIKD0osLDVmDx5G/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/SAM8402/tds&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tic Tac Toe - &lt;a href=&#34;https://youtu.be/dAz96zTvRM8&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://kd-kaustubh.github.io/Game-TIC-TAC-TOE/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tic Tac Toe - &lt;a href=&#34;https://youtu.be/I7zoXsQcVIk&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/23f1001172/kids-game-app&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tic Tac Toe - &lt;a href=&#34;https://youtu.be/SfqkGsMCBBg&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/AnantLuthra/Tic-Tac-Toe-Game&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tic Tac Toe - &lt;a href=&#34;https://youtu.be/yWTqkGPrXBQ&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://sandesh9098.github.io/tictactoe/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tile Matching Game - &lt;a href=&#34;https://youtu.be/rq_tjlPwhS4&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/Kratikavarshney-16/gaming&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Word scramble game - &lt;a href=&#34;https://youtu.be/ptoJd8NNZ8A&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://rutikakanaujiya.github.io/TDS-Game/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wordle - &lt;a href=&#34;https://youtu.be/d5d1njh9EUs&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/Prajna2598/Flask-Wordle-App&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Productivity Apps / Tools were the next most common. Calculators, Timers, etc.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Again, understandable. They&amp;rsquo;re easy to think of, implement, and use.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Age Calculator - &lt;a href=&#34;https://youtu.be/2Je37vJhcD4&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/kdiitm99/APPLICATION-WITH-LLM/blob/main/age_calculator.html&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Age Calculator - &lt;a href=&#34;https://youtu.be/2Je37vJhcD4&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://kdiitm99.github.io/tds-llm-app/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Air Mile Dalculator - &lt;a href=&#34;https://youtu.be/P2p07eqqI9g&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/joy-pro26/IITM_TDS&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Birth Day Calculator - &lt;a href=&#34;https://youtu.be/TXOZVf6N0P0&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://kumaran-akm.github.io/tds/Dayofbirth.html&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BMI Calculator - &lt;a href=&#34;https://youtu.be/IeaGmQxI6nQ&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://anu-iitm.github.io/BMI-CALCULATOR/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BMI Calculator - &lt;a href=&#34;https://youtu.be/jzJmnsglLN0&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/anand-ballabh/TDS-LLM-Project&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Height Weight Calculator - &lt;a href=&#34;https://youtu.be/hsbC254u89A&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://gaurav870922.github.io/WeightHealthCalculator/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Music playlist - &lt;a href=&#34;https://youtu.be/h4OYtgxKDoc&#34;&gt;Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Post-it Notes - &lt;a href=&#34;https://youtu.be/hUWYUbs2hl4&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://vijeethc300.github.io/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Timer - &lt;a href=&#34;https://www.dropbox.com/scl/fi/xyykzzerzimr8j9agwgp1/timer.mkv?rlkey=1lsiazvf5ft16i4kj68jqfcny&amp;amp;st=9q94wzz6&amp;amp;dl=0&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/Chinmoyiitm/countdowntimer&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Timer - &lt;a href=&#34;https://youtu.be/VOJeeAgX4Wg&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://itznoor998.github.io/TDS_LLM/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Todo App - &lt;a href=&#34;https://drive.google.com/file/d/1yrWyM28fjxqY2y44jy42zEJzW2ftGQ79/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://amanmanitiwari.github.io/To-Do-List-App-/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Todo App - &lt;a href=&#34;https://youtu.be/Bhc8KnIP9yc&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/MathuraPriyaR/DailyTask&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Todo App - &lt;a href=&#34;https://youtu.be/lj8JunKuDc4&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://harsh-0986.github.io/TDS_LLAMA/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Real-life apps / tools were diverse and interesting.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This final category of apps were things one might use in real-life. They were more ambitious (mostly), more practical (always), and unique (by far).&lt;/p&gt;
&lt;p&gt;This is the 1% that might lead to startup ideas.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Discussion Board - &lt;a href=&#34;https://youtu.be/5FZadpAGXb0&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://tdsprojectoptional.pythonanywhere.com/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Document analysis - &lt;a href=&#34;https://youtu.be/gtqAM049KtE&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://dsashv.github.io/TDS_LLM_MADE_APP/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dress Designer - &lt;a href=&#34;https://youtu.be/HPcrGeuAItM&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://haifaabdulsathar.github.io/dress-designer-using-llm/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Image Metadata - &lt;a href=&#34;https://drive.google.com/file/d/1rtbRFZo7RGMjC95xmBr-0DUR4AFC_9lZ/view&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://silverstar-labs.github.io/analyzer.github.io/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Inventory management - &lt;a href=&#34;https://youtu.be/_41RWKHr6wo&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://23f2004408.github.io/IM/&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PCOS detector - &lt;a href=&#34;https://youtu.be/DauGauA2wu0&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://claude.site/artifacts/49512a04-0e97-4907-b1b3-cf91736eef6f&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RAG on Streamlit - &lt;a href=&#34;https://youtu.be/gbWnSx7CMnM&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://github.com/akshat-shethia/IITM-TDS-PROJECT-USING-LLMS&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TNEB Power Failure - &lt;a href=&#34;https://youtu.be/AVK5kT729kc&#34;&gt;Video&lt;/a&gt;, &lt;a href=&#34;https://kvaishnavidevi.github.io/power_failure_app/index.html&#34;&gt;App / Code&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Things I learned.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can &lt;a href=&#34;https://docs.github.com/en/repositories/working-with-files/managing-files/adding-a-file-to-a-repository&#34;&gt;upload files directly into GitHub&lt;/a&gt; via the UI (&lt;a href=&#34;https://youtu.be/HPcrGeuAItM&#34;&gt;Video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;You can run GUI programs in Python on the mobile via &lt;a href=&#34;https://replit.com/@replit/tkinter&#34;&gt;Replit&amp;rsquo;s tkinter&lt;/a&gt; (&lt;a href=&#34;https://youtu.be/uuf3-_xYp7k&#34;&gt;Video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;You can get the LLM to generate code for Google Scripts (&lt;a href=&#34;https://www.dropbox.com/scl/fi/xyykzzerzimr8j9agwgp1/timer.mkv?rlkey=1lsiazvf5ft16i4kj68jqfcny&amp;amp;st=9q94wzz6&amp;amp;dl=0&#34;&gt;Video&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;… and a whole bunch of tricks like adding audio BGM, special powers, emotional prompting, etc.&lt;/li&gt;
&lt;li&gt;Typically, 5% are early adopters. 1% are GOOD early adopters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://fully-faltoo.com&#34;&gt;Pratyush&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;10 Oct 2024 1:14 pm&lt;/em&gt;:
Wow!!! What a creativity by students. I still can&amp;rsquo;t believe they created AND DEPLOYED them in under 10 minutes.
This was a fabulous task, Anand. Thanks for sharing about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Cursor custom rules</title>
      <link>https://www.s-anand.net/blog/cursor-custom-rules/</link>
      <pubDate>Sun, 15 Sep 2024 09:37:26 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/cursor-custom-rules/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cursor.directory/&#34;&gt;cursor.directory&lt;/a&gt; is a catalog of &lt;a href=&#34;https://docs.cursor.com/context/rules-for-ai#rules-for-ai&#34;&gt;Cursor rules&lt;/a&gt;. Since I&amp;rsquo;ve actively switched over from &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;VS Code&lt;/a&gt; to &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt; as my editor, I reviewed the popular rules and came up with this as my list:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You are an expert full stack developer in Python and JavaScript.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write concise, technical responses with accurate Python examples.&lt;/li&gt;
&lt;li&gt;Use functional, declarative programming; avoid classes.&lt;/li&gt;
&lt;li&gt;Avoid code duplication (iteration, functions, vectorization).&lt;/li&gt;
&lt;li&gt;Use descriptive variable names with auxiliary verbs as snake_case for Python (is_active, has_permission) and camelCase for JavaScript (isActive, hasPermission).&lt;/li&gt;
&lt;li&gt;Functions should receive and object and return an object (RORO) where possible.&lt;/li&gt;
&lt;li&gt;Use environment variables for sensitive information.&lt;/li&gt;
&lt;li&gt;Write unit tests in pytest for Python and Jest for JavaScript.&lt;/li&gt;
&lt;li&gt;Follow PEP 8 for Python.&lt;/li&gt;
&lt;li&gt;Always use type hints in all function signatures.&lt;/li&gt;
&lt;li&gt;Always write docstrings. Use Google style for Python and JSDoc for JavaScript.&lt;/li&gt;
&lt;li&gt;Cache slow or frequent operations in memory.&lt;/li&gt;
&lt;li&gt;Minimize blocking I/O operations with async operations.&lt;/li&gt;
&lt;li&gt;Only write ESM (ES6) JavaScript. Target modern browsers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Libraries&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lit-html and vanilla JavaScript for frontend development.&lt;/li&gt;
&lt;li&gt;D3 for data visualization.&lt;/li&gt;
&lt;li&gt;Bootstrap for CSS.&lt;/li&gt;
&lt;li&gt;Pandas and DuckDB for data analysis and manipulation.&lt;/li&gt;
&lt;li&gt;FastAPI for API development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Error Handling and Validation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validate preconditions and errors early to avoid deeply nested if statements.&lt;/li&gt;
&lt;li&gt;Use try-except or try-catch blocks for error-prone operations, especially when reading external data.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary else statements; use the if-return pattern instead.&lt;/li&gt;
&lt;li&gt;Log all errors with user-friendly error messages shown on the frontend.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>AI Coding: $12M return for $240K spend?</title>
      <link>https://www.s-anand.net/blog/ai-coding-12m-return-for-240k-spend/</link>
      <pubDate>Sun, 08 Sep 2024 02:05:11 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/ai-coding-12m-return-for-240k-spend/</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is an email I sent to our leadership team a few minutes ago.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We may be witnessing the third major leap in computing productivity, after high-level languages in the 1960s and spreadsheets in the 1980s&lt;/p&gt;
&lt;p&gt;In the last few weeks, AI coding really took off. &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt;, &lt;a href=&#34;https://sourcegraph.com/cody&#34;&gt;Cody&lt;/a&gt;, &lt;a href=&#34;https://docs.replit.com/replitai/agent&#34;&gt;Replit Agents&lt;/a&gt; are FAR better than GitHub Copilot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4945566&#34;&gt;Research&lt;/a&gt; on ~5,000 devs in Fortune 100 shows that even GitHub Copilot makes them ~25% more productive.&lt;/p&gt;
&lt;p&gt;Personally, Cursor helped me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Write &lt;strong&gt;faster&lt;/strong&gt; code (at least 2X). I&amp;rsquo;ve given away my team (there&amp;rsquo;s not enough work for them).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write &lt;strong&gt;better&lt;/strong&gt; code. I now document code for others to replicate - because it&amp;rsquo;s so easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write &lt;strong&gt;complex&lt;/strong&gt; code. I&amp;rsquo;ve built stuff I didn&amp;rsquo;t know how to. WhatsApp agents, AI code writers, even LLM Foundry. Each has opened a client&amp;rsquo;s door.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;So, should we leverage AI Coding for our developers?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe not. Consider these risks.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;It costs $10-$20/month/dev. That&amp;rsquo;s $120-$240K/year for ~1,000 devs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clients may not be comfortable with us using AI coding. IP. Security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Higher productivity reduces our T&amp;amp;M billing, hence revenue.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Maybe yes. Consider these benefits.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We could save 25% per developer. Maybe $4K/month/dev x 25% = $12M/year&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We could win more complex engagements. (Pitching AI coding as an edge has worked well, too.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We could reduce time to get someone to a tech-lead level.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&amp;rsquo;s probably no one-size-fits-all answer. We might need to pilot while we strategize.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How might this impact our hiring and training?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. &lt;strong&gt;Hire for AI coding skills&lt;/strong&gt;. In interviews, I&amp;rsquo;d look for use of AI coding agents. We need a few AI coding leads to share our engineering future.&lt;/p&gt;
&lt;p&gt;2. &lt;strong&gt;Hire for dual skills&lt;/strong&gt;. AI can take care of the code. I&amp;rsquo;d hire people with good client-facing skills.&lt;/p&gt;
&lt;p&gt;3. &lt;strong&gt;Train on AI coding&lt;/strong&gt;. Integrate these into the onboarding process. Train existing devs.&lt;/p&gt;
&lt;p&gt;4. &lt;strong&gt;Train non-developers&lt;/strong&gt;. Analysts, designers, managers can become as good as junior devs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why am I mailing you?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In Nov 2022, when ChatGPT was released, I thought LLMs were the biggest knowledge leap since Google.&lt;/p&gt;
&lt;p&gt;In Sep 2024, with Cursor, Cody, and Replit agents, I think AI coding the biggest productivity leap since Excel.&lt;/p&gt;
&lt;p&gt;This is not for immediate action.&lt;/p&gt;
&lt;p&gt;Please think over it. Share it. Discuss it. Pilot it. Let&amp;rsquo;s explore.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 31 Mar 2024</title>
      <link>https://www.s-anand.net/blog/things-i-learned-31-mar-2024/</link>
      <pubDate>Sun, 31 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-31-mar-2024/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/Screwtapello/sqlite-schema-diagram/&#34;&gt;sqlite-schema-diagram&lt;/a&gt; generates schemas for SQLite databases using Graphviz&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.techempower.com/benchmarks/&#34;&gt;TechEmpower web server benchmarks&lt;/a&gt; place Rust servers on top&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://browse.new/&#34;&gt;browser.new&lt;/a&gt; is a good example of a browser agent. It slowly but independently does a good job of achieving the result. Example: &lt;a href=&#34;https://browse.new/run/browser_wDHy2vwxIzJFouL&#34;&gt;What crew is common in Ingrid Bergman - Cary Grant films?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rjmacarthy/twinny&#34;&gt;twinny&lt;/a&gt; is an open source VC Code Copilot alternative.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hn-comments-search.typesense.org/&#34;&gt;typesense supports embeddings natively&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.pgvecto.rs/my-binary-vector-search-is-better-than-your-fp32-vectors&#34;&gt;Binary embeddings are good enough&lt;/a&gt;. Cohere releases &lt;a href=&#34;https://txt.cohere.com/int8-binary-embeddings/&#34;&gt;binary embeddings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://extract.langchain.com/&#34;&gt;Extract.langchain.com&lt;/a&gt; is a poor early interface to featurize &lt;a href=&#34;https://unstructured.io/&#34;&gt;unstructured.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.hume.ai/&#34;&gt;Hume.ai&lt;/a&gt; offers voice emotion API and emotion-based conversational responses. An empathic AI.&lt;/li&gt;
&lt;li&gt;Rust is non-trivial. Inspired by &lt;a href=&#34;https://tableplus.com/blog/2024/03/how-we-deal-with-ddos.html&#34;&gt;We are under DDoS attack and we do nothing&lt;/a&gt;, I &lt;a href=&#34;https://chat.openai.com/share/ec5f3d23-06b3-40a8-a965-ab466d214802&#34;&gt;&amp;ldquo;wrote&amp;rdquo;&lt;/a&gt; a small binary that serves a parquet file as JSON. It failed and I couldn&amp;rsquo;t fix it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/deezer/spleeter&#34;&gt;spleeter&lt;/a&gt; is a better alternative to demucs. Splits audio into&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/pyannote/pyannote-audio&#34;&gt;pyannote-audio&lt;/a&gt; does speaker diarization&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/encode/uvicorn&#34;&gt;uvicorn&lt;/a&gt; is faster than &lt;a href=&#34;https://github.com/pgjones/hypercorn&#34;&gt;hypercorn&lt;/a&gt; but &lt;a href=&#34;https://pgjones.gitlab.io/quart/tutorials/deployment.html&#34;&gt;hypercorn supports HTTP/2 and HTTP/3&lt;/a&gt;. FastAPI with uvicorn is reasonably fast.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vgel.me/posts/representation-engineering/&#34;&gt;Representational engineering&lt;/a&gt; lets you control LLM output based on preference on the fly.&lt;/li&gt;
&lt;li&gt;When I set up a training:
&lt;ul&gt;
&lt;li&gt;On inviting for DuckDB workshop on Sun evening, Gramener starts accepting immediately, Straive doesn&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;Straive has high spread of joining time. When joining Gitlab Pipelines Workshop, Straive starts meeting (e.g. Premlal) many minutes early. Gramener floods in (due to alert). Straive streams in slowly.&lt;/li&gt;
&lt;li&gt;Gitlab Pipelines Workshop acceptances: Gramener 47, Straive 100&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/pycon-2023-talk/</link>
      <pubDate>Fri, 29 Sep 2023 01:45:53 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/pycon-2023-talk/</guid>
      <description>&lt;p&gt;My PyCon talks are a way for me to learn. I usually pick topics I don&amp;rsquo;t know about.&lt;/p&gt;
&lt;p&gt;But at PyCon India 2023 the organizers picked &amp;ldquo;Programming Minecraft with Python&amp;rdquo; - a talk I&amp;rsquo;d given before. So, I started exploring ways to game it.&lt;/p&gt;
&lt;p&gt;(I like gaming things. It&amp;rsquo;s boring otherwise. Once, Infosys had me write a 400-page document. I began each page with a letter that spells out a poem.)&lt;/p&gt;
&lt;p&gt;Sanjeev Sehgal and I were discussing Hasbro Gaming Studios and how Gramener could help with Gen AI, which gave me an idea.&lt;/p&gt;
&lt;p&gt;What if AI could generate code to play Minecraft?&lt;/p&gt;
&lt;p&gt;So welcome to JNTU Hyderabad at 11 am tomorrow for &amp;ldquo;AI Coding &amp;amp; Gaming: Programming Minecraft with Python&amp;rdquo;. I&amp;rsquo;ve no idea what&amp;rsquo;ll happen 🙂&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://in.pycon.org/2023/schedule/&#34;&gt;https://in.pycon.org/2023/schedule/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A7113338063208030208&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
