<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software-Engineering on Lessons learned</title><link>https://eghuro.cz/tags/software-engineering/</link><description>Recent content in Software-Engineering on Lessons learned</description><generator>Hugo</generator><language>en-us</language><copyright>© Alexandr Mansurov · Licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)</copyright><lastBuildDate>Sun, 25 Oct 2026 18:25:00 +0100</lastBuildDate><atom:link href="https://eghuro.cz/tags/software-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>A repeatable agentic development workflow: context, tickets, implementation, review</title><link>https://eghuro.cz/posts/agentic-development-workflow/</link><pubDate>Sun, 25 Oct 2026 18:25:00 +0100</pubDate><guid>https://eghuro.cz/posts/agentic-development-workflow/</guid><description>&lt;p&gt;Giving a coding agent a feature request and accepting the first working diff is easy. Repeating that across projects is where things get messy: the agent has to rediscover the domain, invent missing requirements, decide what “done” means, and review its own assumptions.&lt;/p&gt;&#10;&lt;p&gt;Here is the setup I now reuse across stacks. It has supported ten iOS app releases this year, helped clean up an existing app built with loose agent guidance, and helped a Go implementation recover after its first approach fell apart - to name a few examples. The Go work also involved a language stack and MCP technology I had not used before. The process didn&amp;rsquo;t provide that expertise on its own; it made the gaps visible early enough to address them.&lt;/p&gt;&#10;&#10;&lt;h2 id="give-the-agent-durable-context"&gt;Give the agent durable context &lt;/h2&gt;&#10;&lt;p&gt;Start with &lt;a&#10; href="https://github.com/mattpocock/skills"&#10; &#10; target="_blank" rel="noopener"&#10; &#10; &#10;&gt;mattpocock/skills&lt;/a&gt;&#10; and run its repository setup. Keep a short domain vocabulary in &lt;code&gt;CONTEXT.md&lt;/code&gt; (or the current upstream convention, &lt;code&gt;GLOSSARY.md&lt;/code&gt;). Record consequential design choices as ADRs. The agent can then use the same terms in discussions, tickets, code, and reviews.&lt;/p&gt;&#10;&lt;p&gt;For a change whose shape is uncertain, use &lt;code&gt;/grill-with-docs&lt;/code&gt; to work through the decisions and write them down. Run &lt;code&gt;/to-spec&lt;/code&gt; once the conversation has enough detail. Break the spec into small, ordered tickets with &lt;code&gt;/to-issues&lt;/code&gt; in older installations or &lt;code&gt;/to-tickets&lt;/code&gt; in the current upstream skills. Then use &lt;code&gt;/implement&lt;/code&gt; against those tickets.&lt;/p&gt;&#10;&lt;p&gt;The sequence is:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shared vocabulary + ADRs → grill → spec → tickets → implement → review&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can enter the sequence at whichever step the work needs. A small, well-specified fix may already have a ticket. An uncertain feature should be grilled before an agent starts writing code.&lt;/p&gt;&#10;&#10;&lt;h2 id="put-tickets-where-the-project-works"&gt;Put tickets where the project works &lt;/h2&gt;&#10;&lt;p&gt;The tracker is an adapter for the process. One project keeps issues in a local &lt;code&gt;docs/TODO.txt&lt;/code&gt;; others use Vikunja or Taiga. What matters is that the agent knows where the authoritative spec and tickets live, how to record blockers, and how to update their status. Write those rules into the repository&amp;rsquo;s agent documentation. A tracker integration skill can handle the API details without changing the development sequence.&lt;/p&gt;&#10;&lt;p&gt;This also makes the setup portable. Moving to a new project means teaching the agent that project&amp;rsquo;s domain, tracker, and checks, rather than rebuilding the workflow.&lt;/p&gt;&#10;&#10;&lt;h2 id="make-implementation-answer-to-the-spec"&gt;Make implementation answer to the spec &lt;/h2&gt;&#10;&lt;p&gt;Implementation includes tests and a diff review. Review the result against two different questions: does the code follow the project&amp;rsquo;s standards, and does it actually satisfy the originating spec? The latter catches plausible code that solves the wrong problem. &lt;a&#10; href="https://eghuro.cz/posts/standards-vs-spec-review"&#10; &#10; data-rel="prefetch"&#10; &#10; &#10;&gt;A previous review&lt;/a&gt;&#10; found duplicate-write paths after a large test suite passed because it checked a safety claim against the call path.&lt;/p&gt;&#10;&lt;p&gt;Where the project&amp;rsquo;s rules allow it, use a different model family for review. A typical split is Claude writing the code and GPT reviewing it, since a different family brings different blind spots. Claude reviewing Claude has also proven decent, so one family is still a workable setup when you can only use one provider. For larger changes, a &lt;code&gt;multi-review&lt;/code&gt; skill can run distinct axes such as correctness, quality, tests and performance, security, and, for frontend, accessibility. Give each reviewer the same bounded diff and the actual spec; collect actionable findings back into the tracker.&lt;/p&gt;&#10;&lt;p&gt;Attach stack-specific skills where they help. Go work can load guidance for concurrency, error handling, testing, and security. iOS work can use Swift and mobile guidance. For exposed web APIs, mobile clients, or MCP tools, apply relevant OWASP-based web, mobile, and LLM security skills during implementation and review. A checklist gives the agent concrete questions to ask; it does not turn a code review into a security certification.&lt;/p&gt;&#10;&lt;p&gt;Start with one change: write down the vocabulary and decision, turn the request into a spec and tickets, implement one ticket, and review the diff against the spec and its security boundaries. Adjust the tracker, skills, and review axes to fit the next project.&lt;/p&gt;&#10;</description></item><item><title>Inherited agent notes can send the next agent down the same dead end</title><link>https://eghuro.cz/posts/distrust-inherited-agent-notes/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://eghuro.cz/posts/distrust-inherited-agent-notes/</guid><description>&lt;p&gt;A new agent can go through a failed investigation again if its first job is to absorb the conclusions of the previous agent. In the course of an authorised security exercise the user was repeatedly asking for a clean start as the prior progress files could be somewhat misleading. The useful reset was to establish a small verified baseline before using the inherited notes to select the next experiment.&lt;/p&gt;&#10;&#10;&lt;h2 id="a-hint-survived-longer-than-its-evidence"&gt;A hint survived longer than its evidence &lt;/h2&gt;&#10;&lt;p&gt;The conversation history had instructions to go it alone after a number of failed attempts at the task. Another handoff stated the prior agent had got lost and that its notes could be misleading to the replacement.&lt;/p&gt;&#10;&lt;p&gt;One concrete example concerned an environment hint favoring IPv6. A later &lt;code&gt;SUMMARY.md&lt;/code&gt; excerpt said:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4 and IPv6 behave identically everywhere tested&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It was very explicit that the IPv6 hint in &lt;code&gt;AGENTS.md&lt;/code&gt; didn&amp;rsquo;t apply in that case. That&amp;rsquo;s a useful clarification, with a caveat: this is a recorded summary of the checks, not an independent re-run of every network probe. It does support the removal of that hint for that particular surface. It doesn&amp;rsquo;t in any way establish equivalence for all services or a successful resolution of the problem. The outcome is still unknown.&lt;/p&gt;&#10;&#10;&lt;h2 id="rebuild-only-enough-context-to-choose-a-test"&gt;Rebuild only enough context to choose a test &lt;/h2&gt;&#10;&lt;p&gt;On a restart read the current task and the mandatory operating instructions. Observe the authorization boundaries and safety rules. Be very clear in your mind about the difference between the instructions and the factual observations about the environment. A line in &lt;code&gt;AGENTS.md&lt;/code&gt; could be a binding rule, it could be a fact about the setup or it could be a hypothesis that you need to go out and check.&lt;/p&gt;&#10;&lt;p&gt;Then establish the facts required to inform the next decision. In a network investigation that might involve confirming the target endpoint, checking that it&amp;rsquo;s reachable and then making a baseline request to it. In a code issue scenario you&amp;rsquo;d want to reproduce the failure that was reported and then have a look at the current code before accepting any diagnosis from a previous developer.&lt;/p&gt;&#10;&lt;p&gt;Only then do you compare the inherited notes against that baseline. That way you don&amp;rsquo;t re-run the whole investigation and the new agent has its own baseline to work from.&lt;/p&gt;&#10;&lt;p&gt;A handoff instruction can be as short as:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Establish a minimal baseline from the current tool output.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Treat inherited diagnoses as hypotheses.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;For each claim you make, you need to be able to locate the evidence or at the very least be able to run a very cheap check.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Keep the required operating and safety instructions in force.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;h2 id="preserve-the-test-behind-a-negative-result"&gt;Preserve the test behind a negative result &lt;/h2&gt;&#10;&lt;p&gt;A note such as &amp;ldquo;IPv6 works better&amp;rdquo; is completely devoid of the endpoint, the request and the comparison that would actually make it useful. &amp;ldquo;No difference on these tested endpoints&amp;rdquo; is much more specific and much easier to verify.&lt;/p&gt;&#10;&lt;p&gt;For future handoffs, record:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The claim and its scope (including when it was checked).&lt;/li&gt;&#10;&lt;li&gt;The command or test and a pointer to its output.&lt;/li&gt;&#10;&lt;li&gt;What remains is an interpretation or an unproven lead.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Keep the failed attempts too and state what each one ruled out. A failed request with one set of credentials doesn&amp;rsquo;t rule out the whole protocol. The next agent needs to be able to make the judgement as to whether repeating that test would in fact add any evidence.&lt;/p&gt;&#10;&lt;p&gt;Copying an assertion into successive summaries doesn&amp;rsquo;t constitute independent corroboration. If the raw output is missing then unverified is the correct designation rather than promoting it to a fact.&lt;/p&gt;&#10;&lt;p&gt;Prior to your next agent handoff, pick the assumption that will drive the next action and attach the relevant tool output in support of that assumption. If you can&amp;rsquo;t find it then that will be the restart task.&lt;/p&gt;&#10;</description></item></channel></rss>