<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>HanLHo. - Fractional Architect &amp; Software Product Engineer - opencode</title>
    <link rel="self" type="application/atom+xml" href="https://hanlho.com/tags/opencode/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://hanlho.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-26T00:00:00+00:00</updated>
    <id>https://hanlho.com/tags/opencode/atom.xml</id>
    <entry xml:lang="en">
        <title>Combining agent skills</title>
        <published>2026-02-26T00:00:00+00:00</published>
        <updated>2026-02-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hanlho.com/p/combining-agent-skills/"/>
        <id>https://hanlho.com/p/combining-agent-skills/</id>
        
        <content type="html" xml:base="https://hanlho.com/p/combining-agent-skills/">&lt;p&gt;A short post on combining skills. It&#x27;s not always clear when a skill will be called or triggered. The easiest way is to put instructions and directly invoke the skill you want by name.&lt;&#x2F;p&gt;
&lt;p&gt;For example, for my &lt;a href=&quot;https:&#x2F;&#x2F;til.hanlho.com&quot;&gt;Today I Learned mini blog site&lt;&#x2F;a&gt;, I have two skills to keep my TILs focussed and concise. One skill evaluates that my text is concise and utilitarian, which is what I expect or aim for in a TIL. And I have a more general skill that I also apply for this blog that creates the text according to UK English &#x27;as done by an English teacher&#x27;.&lt;&#x2F;p&gt;
&lt;p&gt;To combine both, I have the &lt;code&gt;review-til&lt;&#x2F;code&gt; skill that invokes both and specifies the output:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;markdown&quot; style=&quot;background-color:#eff1f5;color:#4f5b66;&quot; class=&quot;language-markdown &quot;&gt;&lt;code class=&quot;language-markdown&quot; data-lang=&quot;markdown&quot;&gt;&lt;span&gt;Review the provided TIL file or text by running both checks in parallel:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;1. &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#d08770;&quot;&gt;**TIL Rules Check**&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;: Invoke the &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;`til-rules-checker`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; skill to verify content guidelines (word count, focus, clarity, format)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;2. &lt;&#x2F;span&gt;&lt;span style=&quot;font-weight:bold;color:#d08770;&quot;&gt;**Text Grading**&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;: Invoke the &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;`text-grader`&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; skill to assess spelling, grammar, and clarity using UK English standards
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span&gt;After both checks complete, provide a unified summary with:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;- TIL rules verdict (PASS&#x2F;NEEDS REVISION)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;- Text grade (A&#x2F;B&#x2F;C&#x2F;D&#x2F;F)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;- Combined list of actionable improvements (if any)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span&gt;If a file path is provided as an argument, read that file first. If text is provided directly, use that text.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note both &lt;code&gt;Invoke the &#x27;...&#x27;&lt;&#x2F;code&gt; instructions.&lt;&#x2F;p&gt;
&lt;p&gt;This works in Codex and Opencode. When I asked to review two TILs at once (&lt;code&gt;Review both non-committed TILs&lt;&#x2F;code&gt;) the result looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#eff1f5;color:#4f5b66;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Review&lt;&#x2F;span&gt;&lt;span&gt; summary:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; beads-query-default-limit.md
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Word count: 32
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; TIL rules: PASS (focused, clear, non-blog style, utilitarian)
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Text grade: A (96%)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; beads-query-subcommand.md
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Word count: 55
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; TIL rules: PASS (focused, clear intent, non-blog style, utilitarian)
&lt;&#x2F;span&gt;&lt;span&gt;      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; Text grade: B (84%) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;due&lt;&#x2F;span&gt;&lt;span&gt; to grammar issues (hard cap applied)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(The reason for the &lt;code&gt;B&lt;&#x2F;code&gt; grade is also detailed in the full output.)&lt;&#x2F;p&gt;
&lt;p&gt;In case you are interested, these are the skills I have currently published online:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;til&#x2F;blob&#x2F;main&#x2F;.agents&#x2F;skills&#x2F;check-til-rules&#x2F;SKILL.md&quot;&gt;check-til-rules&lt;&#x2F;a&gt;: This is the skill that has my TIL rules.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;til&#x2F;blob&#x2F;main&#x2F;.agents&#x2F;skills&#x2F;review-til&#x2F;SKILL.md&quot;&gt;review-til&lt;&#x2F;a&gt;: The skill I usually invoke that combines the two skills. The content at the time of writing, aside from the frontmatter, is above.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Agent Chisels: My LLM Agent Skills and Workflows</title>
        <published>2026-01-13T00:00:00+00:00</published>
        <updated>2026-01-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hanlho.com/p/agent-chisels-my-llm-agent-skills-and-workflows/"/>
        <id>https://hanlho.com/p/agent-chisels-my-llm-agent-skills-and-workflows/</id>
        
        <content type="html" xml:base="https://hanlho.com/p/agent-chisels-my-llm-agent-skills-and-workflows/">&lt;p&gt;I have been meaning to share more about my LLM workflows and tooling for a while, partly to have a reference for conversations, but mostly to learn in public.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;agent-chisels&quot;&gt;Agent Chisels&lt;&#x2F;a&gt; is where I will be sharing the custom artefacts (primarily &lt;code&gt;skills&lt;&#x2F;code&gt;, with &lt;code&gt;commands&lt;&#x2F;code&gt; and &lt;code&gt;agents&lt;&#x2F;code&gt; to follow) that I find most useful and actively use in my daily workflow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;skills&quot;&gt;Skills&lt;&#x2F;h2&gt;
&lt;p&gt;I have shared two &lt;a href=&quot;https:&#x2F;&#x2F;agentskills.io&#x2F;home&quot;&gt;skills&lt;&#x2F;a&gt; I use almost daily. In addition, I&#x27;ve also included a third skill, more of a meta-skill for evaluating other skills, which I used when reviewing these for release. I actively use this skill to iterate and improve my skills so it fits the goal of this project.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;documenting-architectural-decisions&lt;&#x2F;code&gt;: Document and manage architectural decisions using ADRs. Supports Y-statement and traditional ADR formats. Used for creating, reviewing, or searching decision records. This repository contains several examples of decision logs created with this skill, for example, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;agent-chisels&#x2F;blob&#x2F;main&#x2F;plugins&#x2F;jj&#x2F;decision-log.md&quot;&gt;here&lt;&#x2F;a&gt; is the one for the &lt;code&gt;jj&lt;&#x2F;code&gt; plugin.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I use &lt;a href=&quot;https:&#x2F;&#x2F;www.jj-vcs.dev&#x2F;latest&#x2F;&quot;&gt;&lt;code&gt;jj&lt;&#x2F;code&gt; or &lt;code&gt;Jujutsu&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, an alternative version control system, in all my projects. Getting LLMs to work reliably with it is quite a challenge, so I have a skill to detect and remind an LLM to use &lt;code&gt;jj&lt;&#x2F;code&gt; and one to add the capability of using &lt;code&gt;jj&lt;&#x2F;code&gt;. The &lt;a href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;plugins&quot;&gt;Claude Code plugin&lt;&#x2F;a&gt; also adds a &lt;code&gt;use-jj&lt;&#x2F;code&gt; command and a hook to remind an LLM of using &lt;code&gt;jj&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;detecting-jujutsu&lt;&#x2F;code&gt; — Verify if the current repository uses Jujutsu (jj) instead of git. Used when confirming VCS state before operations.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;using-jujutsu&lt;&#x2F;code&gt; — Detailed guidance on Jujutsu (jj) VCS operations including committing, pushing, searching history, and working with revisions&#x2F;revsets.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And finally, there is the meta-skill to evaluate skills. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;agent-chisels&#x2F;blob&#x2F;main&#x2F;skills&#x2F;evaluate-skills&#x2F;examples&#x2F;EXAMPLE.md&quot;&gt;Here is an example&lt;&#x2F;a&gt; of a report generated by this skill.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;evaluating-skills&lt;&#x2F;code&gt; — A skill to evaluate skills against best practices for size, structure, examples, and prompt engineering. Use when reviewing skills for deployment, optimisation, or standards compliance.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;To use these, you can use the Claude Code plugin system or install them manually; take a look at the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;agent-chisels#user-content-installation&quot;&gt;installation section&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-little-on-the-setup-of-the-repository&quot;&gt;A little on the setup of the repository&lt;&#x2F;h2&gt;
&lt;p&gt;I use symbolic links liberally to avoid duplication. For example, symbolic links allow me to share the independent skills with the Claude Code plugin while also using them in this project itself.&lt;&#x2F;p&gt;
&lt;p&gt;All skills I share in this repo are dynamically linked to my &lt;code&gt;~&#x2F;.claude&#x2F;skills&lt;&#x2F;code&gt; directory. Note that this is also the easiest way to make these skills &lt;a href=&quot;https:&#x2F;&#x2F;agentskills.io&#x2F;home#adoption&quot;&gt;available to other LLM CLI agents&lt;&#x2F;a&gt; like Opencode, Codex, and Mistral Vibe. In this repo, I have mostly worked with &lt;a href=&quot;https:&#x2F;&#x2F;opencode.ai&quot;&gt;Opencode&lt;&#x2F;a&gt; and the skills in the &lt;code&gt;.claude&lt;&#x2F;code&gt; location just work with it.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#eff1f5;color:#4f5b66;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;❯&lt;&#x2F;span&gt;&lt;span&gt; ls&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span&gt; .claude&#x2F;skills
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;l...&lt;&#x2F;span&gt;&lt;span&gt; detecting-jujutsu -&amp;gt; ..&#x2F;..&#x2F;skills&#x2F;detecting-jujutsu
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;l...&lt;&#x2F;span&gt;&lt;span&gt; documenting-architectural-decisions -&amp;gt; ..&#x2F;..&#x2F;skills&#x2F;documenting-architectural-decisions
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;l...&lt;&#x2F;span&gt;&lt;span&gt; evaluating-skills -&amp;gt; ..&#x2F;..&#x2F;skills&#x2F;evaluating-skills
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;l...&lt;&#x2F;span&gt;&lt;span&gt; using-jujutsu -&amp;gt; ..&#x2F;..&#x2F;skills&#x2F;using-jujutsu
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;d...&lt;&#x2F;span&gt;&lt;span&gt; verify-release-readiness
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;l&lt;&#x2F;code&gt; at the beginning of each line stands for symbolic link. You&#x27;ll notice one real directory in there, that is a skill only relevant to this repository.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future-plans&quot;&gt;Future plans&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ll be adding LLM artefacts as I move my own setup more and more to this repository. Since I&#x27;m trying to reuse as much as possible (within reason) between different LLM agents, I need a central location anyway, preferably vendor neutral yet pragmatic (e.g. using the &lt;code&gt;.claude&#x2F;skills&lt;&#x2F;code&gt; location to share skills). Also, my hope is to make this repository a more live and automatically up-to-date version of the artefacts I use day to day.&lt;&#x2F;p&gt;
&lt;p&gt;Related to this, I am thinking of creating a setup similar to &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;webpro&#x2F;awesome-dotfiles&quot;&gt;dotfiles&lt;&#x2F;a&gt; (where developers share configuration files) but for LLM agent configurations: &#x27;agentfiles&#x27;. I intend to share my LLM agent configurations and how I integrate them. Let me know if you would be interested in this or are already sharing.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Implementing an Urgent Feature with Opencode, Claude, and Zed</title>
        <published>2025-12-18T00:00:00+00:00</published>
        <updated>2025-12-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hanlho.com/p/implementing-an-urgent-feature-with-llms-and-zed/"/>
        <id>https://hanlho.com/p/implementing-an-urgent-feature-with-llms-and-zed/</id>
        
        <content type="html" xml:base="https://hanlho.com/p/implementing-an-urgent-feature-with-llms-and-zed/">&lt;p&gt;This is a short post to share a positive experience I had using an LLM agent to quickly add a feature to an existing personal CLI &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lhohan&#x2F;simple-time-tracker&quot;&gt;time-tracking application&lt;&#x2F;a&gt;. Below, I describe how I added it using Zed, Opencode and Claude.&lt;&#x2F;p&gt;
&lt;p&gt;To start, I wasn&#x27;t even sure the feature I needed existed in a text-based time-tracking application I use day-to-day to keep track of what I work on. My application &lt;em&gt;has&lt;&#x2F;em&gt; a way of getting the information I needed out, but the feature that should make this easy was missing details on &lt;em&gt;what&lt;&#x2F;em&gt; I had actually worked on.&lt;&#x2F;p&gt;
&lt;p&gt;So, should I invest the time and expand the feature, or accept that it was missing for now and spend a lot more time on manual work? I could try an LLM agent and see if it could help me implement the change quickly. Each choice had downsides: spending &lt;em&gt;more&lt;&#x2F;em&gt; time digging through time-tracking information to fill in timesheets is not very appealing, and implementing the feature (with or without agents) could become a time sink. I also had lots of other work planned for the day.&lt;&#x2F;p&gt;
&lt;p&gt;I decided to implement it, telling myself I’d stop if it didn’t look like I had a clear path to finish it within one hour.&lt;&#x2F;p&gt;
&lt;p&gt;Because I think it is relevant to the (spoiler) successful implementation, let me share a little about this project. It is a Rust codebase that I use to test development practices, and I think it is structured and implemented fairly well. The CLI, the main part of the application, has over 95% coverage using behaviour-driven, DSL-style acceptance tests. This setup gives the LLM models both structure and plenty of examples to follow when adding tests. I will not go into the details here, but I have added a brief example at the end. Also noteworthy: this is a small project, which definitely makes a difference.&lt;&#x2F;p&gt;
&lt;p&gt;For this implementation, I used Zed with its Opencode integration. Lately, I have been on the command line building smaller apps prompt-driven, without worrying much about the fine details. But for this project the actual implementation mattered to me, so I wanted to track changes more closely in an IDE. Opencode taps into my Claude subscription; I can use Opus for planning and Haiku for implementation.&lt;&#x2F;p&gt;
&lt;p&gt;Honestly, I was very pleased with how smoothly this feature was implemented. What contributed to this was the plan-first approach before implementing anything. For anything non-trivial, always plan first!&lt;&#x2F;p&gt;
&lt;p&gt;Here is a high-level overview of my interaction with Opencode in Zed:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Investigate
&lt;ul&gt;
&lt;li&gt;I started with Claude Opus and asked whether the feature I needed already existed, rather than looking it up myself because I was under time pressure. It didn&#x27;t.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Plan
&lt;ul&gt;
&lt;li&gt;I asked Claude to plan the feature and use a test-driven approach. It broke the work into nine tests, and I asked it to pause after each one for me to review.&lt;&#x2F;li&gt;
&lt;li&gt;Before starting any implementation, I asked it to write the plan to a Markdown file in the backlog.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Then I reviewed the plan.&lt;&#x2F;em&gt; That sounds more superficial than what I did, but I cannot say much more than that it simply looked good.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Implementation
&lt;ul&gt;
&lt;li&gt;I switched to Claude Haiku for implementation.&lt;&#x2F;li&gt;
&lt;li&gt;It started off well and asked for feedback after each test cycle, and I asked for a refactor to remove duplication.&lt;&#x2F;li&gt;
&lt;li&gt;While it was implementing, I discovered I wanted a different kind of description for the tasks, so I told it to change that in the plan. I did not switch models for this.&lt;&#x2F;li&gt;
&lt;li&gt;The plan was updated in all the correct places.&lt;&#x2F;li&gt;
&lt;li&gt;After this, the workflow changed: it stopped asking me for feedback after each step, and before I realised it, seven of nine tests were running. Not the TDD flow I asked for, but it worked.&lt;&#x2F;li&gt;
&lt;li&gt;Instead of asking it to redo anything, I reviewed the implementation (it was not a lot of code) and continued.&lt;&#x2F;li&gt;
&lt;li&gt;I ran the program against my own data and everything worked as intended. Aside from the one refactoring to remove duplication, I did not change the code.&lt;&#x2F;li&gt;
&lt;li&gt;One loose end I had to remind it of: update the documentation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I have shared the full session here: https:&#x2F;&#x2F;opncd.ai&#x2F;share&#x2F;aBYozahW.&lt;&#x2F;p&gt;
&lt;p&gt;There were some pitfalls of using LLMs that I ran into, and I admittedly leaned into them. Speed beating accuracy is a real risk. The feature works and the code looks good, but if I were coding hands-on I probably would have reviewed more thoroughly. It is hard to tell if the end result would have been &lt;em&gt;drastically&lt;&#x2F;em&gt; better. It requires discipline to not start running along with the agent and to not start accepting everything if the outcome is as expected. The LLM gave me what I needed and any follow-up changes should be small, but I still see little things I would have done differently if I done it manually (which other developers may disagree with too, to be fair). For example, some of the tests could do with fewer assertions. The current code organisation makes that easy to address later. &lt;em&gt;If&lt;&#x2F;em&gt; any tech debt was added, it is very small and under control, so I stopped, generated my reports and filled in my timesheets.&lt;&#x2F;p&gt;
&lt;p&gt;Overall, working in Zed made it easy to review the code, and combining Opencode&#x27;s plan phases kept things organised. The existing, structured DSL-based test approach with plenty of examples also helped.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;extra-how-an-llm-can-work-better-with-a-well-structured-dsl&quot;&gt;Extra: How an LLM can work better with a well-structured DSL&lt;&#x2F;h2&gt;
&lt;p&gt;To give some context, what the application needed was to combine two existing flags: &lt;code&gt;breakdown&lt;&#x2F;code&gt; and &lt;code&gt;details&lt;&#x2F;code&gt;. The time &lt;code&gt;breakdown&lt;&#x2F;code&gt; reports were already implemented but were only reporting time spent per day, week, month or year. What I needed were details of the projects I had worked on. The application already had a &lt;code&gt;details&lt;&#x2F;code&gt; flag but it was not implemented for this view.&lt;&#x2F;p&gt;
&lt;p&gt;In the test DSL, the flags are set by calling methods in the &lt;code&gt;given&lt;&#x2F;code&gt; setup phase: &lt;code&gt;breakdown_flag(...)&lt;&#x2F;code&gt; and &lt;code&gt;details_flag()&lt;&#x2F;code&gt;. The breakdown feature did not implement the &lt;code&gt;details&lt;&#x2F;code&gt; flag, so it was not used in the tests for this feature. What is nice (and I credit this way of testing for it) is that the LLM was able to figure out the &lt;code&gt;details_flag&lt;&#x2F;code&gt; was already present and decided to re-use it: &lt;code&gt;Cmd::given().details_flag()....&lt;&#x2F;code&gt;. Here is an example of such a DSL test:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#eff1f5;color:#4f5b66;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;breakdown_day_with_details_should_show_tasks_per_day&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; some_content = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;## TT 2020-01-01
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;- #project-a 1h Task A
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;- #project-b 2h Task B&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;    Cmd::given()
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#a7adba30;&quot;&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;details_flag&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;mark style=&quot;background-color:#a7adba30;&quot;&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;breakdown_flag&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;day&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;tags_filter&lt;&#x2F;span&gt;&lt;span&gt;(&amp;amp;[&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;project-a&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;project-b&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;])
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;at_date&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;2020-01-01&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;a_file_with_content&lt;&#x2F;span&gt;&lt;span&gt;(some_content)
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;when_run&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;should_succeed&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_task_with_duration&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;project-a&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;1h 00m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_task_with_duration&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;project-b&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;2h 00m&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Thank you for reading,&lt;&#x2F;p&gt;
&lt;p&gt;Hans&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My agentic coding stack for October 2025</title>
        <published>2025-10-05T00:00:00+00:00</published>
        <updated>2025-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hanlho.com/p/my-agentic-coding-stack-for-october-2025/"/>
        <id>https://hanlho.com/p/my-agentic-coding-stack-for-october-2025/</id>
        
        <content type="html" xml:base="https://hanlho.com/p/my-agentic-coding-stack-for-october-2025/">&lt;p&gt;After wrapping my head around the constant changes in LLM subscriptions and performance, here&#x27;s my new coding stack for October 2025:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Warp Pro&lt;&#x2F;strong&gt;: my go-to agentic CLI, speedy and reliable for coding and task automation. Supports most top end LLMs.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Zed Pro&lt;&#x2F;strong&gt; (using the $20 trial, then €10&#x2F;month)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;OpenCode&lt;&#x2F;strong&gt; for agentic CLI dev (local + cloud models, easy swapping, no lock-in)&lt;&#x2F;p&gt;
&lt;p&gt;I dropped Claude Code and did not subscribe to Codex. If this turns out to be a bad idea, I can always resubscribe again.&lt;&#x2F;p&gt;
&lt;p&gt;My main decision influences: cost control, flexibility and avoiding vendor lock-in (Claude Code&#x27;s past month changes have this effect).&lt;&#x2F;p&gt;
&lt;p&gt;After spending a few months in the CLI I want to look again at working more in an IDE, hence Zed is on this list.&lt;&#x2F;p&gt;
&lt;p&gt;Note: I do not subscribe to Max plans, I combine multiple lower cost plans.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
