<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  
  <title>Ziyad - writing</title>
  <subtitle>Personal site of Ziyad, a hands-on engineering leader building messaging infrastructure, product software, AI-assisted systems, and full-stack tools.</subtitle>
  <link href="https://ziyad.co.uk/feed.xml" rel="self" />
  <link href="https://ziyad.co.uk/" />
  <updated>2026-03-02T00:00:00Z</updated>
  <id>https://ziyad.co.uk/</id>
  <author>
    <name>Ziyad</name>
    <email>hello@ziyad.co.uk</email>
  </author>
  <entry>
    <title>The document should stay primary</title>
    <link href="https://ziyad.co.uk/writing/the-document-should-stay-primary/" />
    <updated>2026-03-02T00:00:00Z</updated>
    <id>https://ziyad.co.uk/writing/the-document-should-stay-primary/</id>
    <summary>CV tooling works best when import, AI assistance, job tracking, and billing all serve the exported document.</summary>
    <content type="html">&lt;p&gt;A CV tool can easily become everything except a CV tool.&lt;/p&gt;
&lt;p&gt;It can become a dashboard, an AI prompt box, a job tracker, a billing surface, a template gallery, or a cloud sync product. Some of those things are useful. None of them should replace the document as the main object.&lt;/p&gt;
&lt;p&gt;That is the design constraint behind &lt;a href=&quot;https://ziyad.co.uk/projects/masterful-cv/&quot;&gt;Masterful CV&lt;/a&gt;. The core loop is deliberately plain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Import or edit the profile.&lt;/li&gt;
&lt;li&gt;Preview the CV as a real document.&lt;/li&gt;
&lt;li&gt;Tailor it against a job when that helps.&lt;/li&gt;
&lt;li&gt;Export something useful.&lt;/li&gt;
&lt;li&gt;Track the application context without losing the source profile.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI assistance is valuable when it shortens the distance between an existing CV, a job description, and a better application pack. It becomes a problem when it silently rewrites the source data or makes the user guess what credits were spent.&lt;/p&gt;
&lt;p&gt;The product work is in keeping those boundaries honest: profile data is canonical, generated artifacts are inspectable, export remains useful, and planned monetisation flows explain what credits are being used for.&lt;/p&gt;
&lt;p&gt;The best version of the tool should feel like a precise workbench, not a generic AI dashboard with a document preview attached.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Operational software should explain itself</title>
    <link href="https://ziyad.co.uk/writing/operational-software-should-explain-itself/" />
    <updated>2026-02-14T00:00:00Z</updated>
    <id>https://ziyad.co.uk/writing/operational-software-should-explain-itself/</id>
    <summary>Notes from building messaging systems, billing flows, and agent runs where the evidence trail matters as much as the happy path.</summary>
    <content type="html">&lt;p&gt;The most useful systems I have worked on had a simple property: when something went wrong, they gave operators enough evidence to act.&lt;/p&gt;
&lt;p&gt;That mattered in messaging infrastructure, where failures might involve provider state, carrier delivery, customer configuration, credit balance, queue health, or a deploy. It matters in billing systems, where a user needs to understand what was reserved, spent, refunded, or left for support. It also matters in agent tooling, where &amp;quot;the model said it worked&amp;quot; is not an acceptable audit trail.&lt;/p&gt;
&lt;p&gt;I keep coming back to the same design preference: product surfaces should show the real lifecycle rather than hiding it behind a vague success state. A good interface can still be calm, but it should not be evasive.&lt;/p&gt;
&lt;p&gt;For operational software, that usually means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;explicit states instead of optimistic labels&lt;/li&gt;
&lt;li&gt;durable artifacts instead of transient console output&lt;/li&gt;
&lt;li&gt;clear ownership when a process needs human review&lt;/li&gt;
&lt;li&gt;enough history to explain what changed and why&lt;/li&gt;
&lt;li&gt;failure messages that distinguish user action from system recovery&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is not to expose every internal detail. The goal is to preserve the evidence a human needs when the happy path stops being true.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What I want from agent tooling</title>
    <link href="https://ziyad.co.uk/writing/what-i-want-from-agent-tooling/" />
    <updated>2026-01-21T00:00:00Z</updated>
    <id>https://ziyad.co.uk/writing/what-i-want-from-agent-tooling/</id>
    <summary>Agent work needs isolation, review, and durable evidence before it can be treated like serious engineering work.</summary>
    <content type="html">&lt;p&gt;The useful part of AI coding agents is not that they can type code quickly. It is that they can explore alternatives, take on bounded work, and surface implementation options a human can review.&lt;/p&gt;
&lt;p&gt;The weak part is everything around that: context preparation, safety boundaries, diff review, verification, retry decisions, and the question of what evidence survives after a run finishes.&lt;/p&gt;
&lt;p&gt;That is the shape of &lt;a href=&quot;https://ziyad.co.uk/projects/consortio/&quot;&gt;Consortio&lt;/a&gt;. I want agent work to look less like a long chat transcript and more like an engineering workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Express the task as durable intent.&lt;/li&gt;
&lt;li&gt;Run candidates in isolated workspaces.&lt;/li&gt;
&lt;li&gt;Capture plans, critiques, diffs, proof results, and reports.&lt;/li&gt;
&lt;li&gt;Keep ranking downstream of verification.&lt;/li&gt;
&lt;li&gt;Export the selected work only when a human can inspect what happened.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The interesting product problem is not &amp;quot;which model is best?&amp;quot; It is how different agents, reviewers, judges, deterministic checks, and a human owner can work together without turning the process into noise.&lt;/p&gt;
&lt;p&gt;That is where the interface has to earn its keep. It should show disagreement, unresolved risk, and evidence without making the user read every raw artifact by hand.&lt;/p&gt;
</content>
  </entry>
</feed>