<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://alejandrosierra.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://alejandrosierra.dev/" rel="alternate" type="text/html" /><updated>2026-07-05T19:55:13+00:00</updated><id>https://alejandrosierra.dev/feed.xml</id><title type="html">Alejandro Sierra</title><subtitle>Delivery Manager AI-Native and Quality Engineering Leader. Predictable delivery, quality strategy and agentic tooling across multi-team programs.</subtitle><entry><title type="html">Mapping the Pipeline: From a Functional Spec to a Full Test Suite in Seven Phases</title><link href="https://alejandrosierra.dev/postmortem/spec-to-test-suite-pipeline-map/" rel="alternate" type="text/html" title="Mapping the Pipeline: From a Functional Spec to a Full Test Suite in Seven Phases" /><published>2026-07-05T08:00:00+00:00</published><updated>2026-07-05T08:00:00+00:00</updated><id>https://alejandrosierra.dev/postmortem/spec-to-test-suite-pipeline-map</id><content type="html" xml:base="https://alejandrosierra.dev/postmortem/spec-to-test-suite-pipeline-map/"><![CDATA[<p>Every phase in this pipeline runs on the same rule the whole system is built around: nothing gets generated on a guess. If a functional spec leaves a gap, the pipeline asks about it instead of filling it in, and if the answer never comes, that gap stays visibly open rather than quietly turning into a test nobody actually agreed to.</p>

<p>That rule is what makes it workable to hand over a functional document and get back a test suite spanning API, UI, mobile, performance and security, without spending the next sprint discovering which parts of it were invented along the way.</p>

<h2 id="the-phase-map">The phase map</h2>

<pre><code class="language-mermaid">flowchart TD
    A["Functional spec&lt;br/&gt;(doc, images, exports)"] --&gt; B["Phase 1: Analysis&lt;br/&gt;Output: test flows + open questions"]
    B -- "Blocking gap unanswered" --&gt; B
    B -- "Blocking/high resolved" --&gt; C["Phase 2: Contract gate + API tests&lt;br/&gt;Output: full API test suite"]
    C --&gt; D["Phase 3: UI tests&lt;br/&gt;(only if a web UI exists)"]
    C --&gt; E["Phase 4: Mobile tests&lt;br/&gt;(only if a native app exists)"]
    D --&gt; F["Phase 5: Performance tests&lt;br/&gt;Output: load test scripts"]
    E --&gt; F
    G["Phase 6: Security scan&lt;br/&gt;(runs anytime)"] -.-&gt; C
    H["Phase 7: Page-speed audit&lt;br/&gt;(runs anytime)"] -.-&gt; D
</code></pre>

<h2 id="what-happens-where">What happens where</h2>

<p><strong>Analysis.</strong> Takes the functional document, in whatever format it arrives, and produces test flows plus a structured question log. Questions are triaged by severity, and blocking or high-severity gaps have to be resolved, one round at a time, before anything downstream gets generated. Leave one blank and it’s marked pending, not assumed. The analysis simply runs again once the real answer exists.</p>

<p><strong>Contract and API tests.</strong> Nothing gets built on top of an API contract until it clears a linting gate. Once it does, this phase generates realistic test data per entity and a full assertion suite: happy path, authentication, role-based access, validation, not-found handling, and checks that specifically try to make one user reach another user’s data.</p>

<p><strong>UI and mobile, both conditional.</strong> These only run if the project actually has a web interface or a native mobile app. Each produces two things per screen: functional coverage and an accessibility pass, so accessibility isn’t a separate initiative bolted on afterward.</p>

<p><strong>Performance.</strong> This is the one phase that refuses to guess at load numbers out of thin air. It reads two plain-language questions answered back in the analysis phase, who uses the system and what would hurt most if it broke, and derives concurrency targets and SLAs from that, instead of defaulting to an arbitrary number of virtual users.</p>

<p><strong>Security and page-speed, both independent.</strong> Neither depends on the phases before it, and both can run at any point once there’s a live environment to point them at. One scans for real vulnerabilities against the running API; the other measures actual page performance and reports specifically what’s slow and why.</p>

<h2 id="why-the-branching-matters-more-than-the-count">Why the branching matters more than the count</h2>

<p>The interesting part isn’t that there are seven phases, it’s that most of them are conditional or independent. A backend-only service skips UI and mobile entirely. A project with no agreed SLAs still gets a performance suite, just one honestly labeled as a default instead of a false promise of precision. That shape, generate what applies, skip what doesn’t, gate what’s uncertain, is the same judgment I’d apply running this by hand. The pipeline just holds the line on it at a scale a manual process never could.</p>]]></content><author><name></name></author><category term="ai-native" /><category term="quality" /><summary type="html"><![CDATA[A phase-by-phase map of an agentic QA pipeline: what each phase takes in, what it produces, and why open questions are never silently assumed away.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://alejandrosierra.dev/assets/img/postmortem/spec-to-test-suite-pipeline-map/og.png" /><media:content medium="image" url="https://alejandrosierra.dev/assets/img/postmortem/spec-to-test-suite-pipeline-map/og.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Why I Designed Our Agentic Quality Pipeline Around QE Fundamentals, Not Around the AI</title><link href="https://alejandrosierra.dev/postmortem/agentic-qa-pipeline-qe-fundamentals/" rel="alternate" type="text/html" title="Why I Designed Our Agentic Quality Pipeline Around QE Fundamentals, Not Around the AI" /><published>2026-07-05T00:00:00+00:00</published><updated>2026-07-05T00:00:00+00:00</updated><id>https://alejandrosierra.dev/postmortem/agentic-qa-pipeline-qe-fundamentals</id><content type="html" xml:base="https://alejandrosierra.dev/postmortem/agentic-qa-pipeline-qe-fundamentals/"><![CDATA[<p>Most conversations about AI and testing start with the model. Mine started with the opposite question: what does a test actually need to be worth, before I let anything, human or agent, ship it into a codebase I’m accountable for?</p>

<p>That question came from years spent as a QE Manager before I ever wore an AI-native hat. It’s the reason the agentic quality pipeline I designed and now run in daily production use wasn’t built as an AI project with some testing bolted on. It was built as a testing discipline that happens to be executed by AI.</p>

<h2 id="what-it-does-at-a-high-level">What it does, at a high level</h2>

<p>Given a functional specification, the pipeline autonomously generates a complete test suite, covering API, UI, mobile, performance and security, orchestrated across multiple AI coding agents working in concert rather than a single model doing everything. It doesn’t just produce tests that run; it produces tests wired directly into the same CI/CD safeguards a human-authored suite would go through, so nothing generated is exempt from the checks everything else has to clear.</p>

<h2 id="the-criteria-its-built-on">The criteria it’s built on</h2>

<p>None of that is trustworthy on its own. What makes it usable at scale, across 25+ teams, is a set of QE principles enforced on top of the generation, not left to the model’s judgment:</p>

<ul>
  <li><strong>Traceability first.</strong> Every generated test maps back to an explicit acceptance criteria, not to a guess at what “looks testable.” If a test can’t be traced to a requirement, it doesn’t ship.</li>
  <li><strong>Risk-based coverage.</strong> Effort is weighted toward the areas with the highest business impact and the highest rate of change, the same prioritization I’d apply manually, not spread evenly across the codebase because evenly is easier to automate.</li>
  <li><strong>Test pyramid discipline.</strong> Unit and API-level assertions form the backbone; UI and end-to-end tests are reserved for what genuinely requires a browser or a device, not generated by default because they’re the easiest thing to visualize.</li>
  <li><strong>Maintainability as an output, not an afterthought.</strong> Generated tests follow the same structural patterns enforced in our manually authored suites, Page Object Model and Screenplay-style separation, SOLID structuring, so a generated test and a human-written one are indistinguishable six months later when someone has to maintain it.</li>
  <li><strong>Validated fault detection, not just green checkmarks.</strong> A test that passes isn’t automatically a good test. Generated suites are held to the same mutation-testing standard I’d apply to any team’s coverage: if a test can’t catch a deliberately introduced defect, it doesn’t count as coverage.</li>
  <li><strong>A human still holds the gate.</strong> Every generated case is reviewable and overridable by a QE before it reaches CI. I treat the agent as a fast, tireless junior tester, not an unsupervised authority, which is exactly how I’d onboard a junior engineer onto a team I was managing.</li>
</ul>

<h2 id="why-both-hats-had-to-be-on-the-same-head">Why both hats had to be on the same head</h2>

<p>An AI-native Delivery Manager without QE depth ships something that produces green checkmarks and calls it coverage. A QE Manager without delivery fluency never lets an agent near production test suites at this scale, the operational trust just isn’t there. This pipeline exists because both of those perspectives had to make the same call at once: is this a good test, and does it belong in how we deliver.</p>

<p>That discipline is also why the results attached to it are what they are.
The AI doesn’t produce numbers. The criteria does. The AI just makes it possible to apply them at a scale no manual QE process could match.</p>]]></content><author><name></name></author><category term="ai-native" /><category term="quality" /><summary type="html"><![CDATA[An agentic pipeline that turns a spec into a full test suite is only trustworthy because of the QE discipline enforced on top of it: traceability, risk-based coverage, mutation-tested fault detection, and a human still holding the gate.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://alejandrosierra.dev/assets/img/postmortem/agentic-qa-pipeline-qe-fundamentals/og.png" /><media:content medium="image" url="https://alejandrosierra.dev/assets/img/postmortem/agentic-qa-pipeline-qe-fundamentals/og.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>