<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matías Espinoza</title>
    <description>The latest articles on DEV Community by Matías Espinoza (@matas_espinoza_aaab42da0).</description>
    <link>https://dev.to/matas_espinoza_aaab42da0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2387433%2F787c29a4-6007-4057-9a38-254618068529.jpg</url>
      <title>DEV Community: Matías Espinoza</title>
      <link>https://dev.to/matas_espinoza_aaab42da0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matas_espinoza_aaab42da0"/>
    <language>en</language>
    <item>
      <title>SpecFlow: Multi-Agent SDD in Cursor (4 phases, /approve, single code writer)</title>
      <dc:creator>Matías Espinoza</dc:creator>
      <pubDate>Mon, 25 May 2026 19:50:41 +0000</pubDate>
      <link>https://dev.to/matas_espinoza_aaab42da0/specflow-multi-agent-sdd-in-cursor-4-phases-approve-single-code-writer-3nnl</link>
      <guid>https://dev.to/matas_espinoza_aaab42da0/specflow-multi-agent-sdd-in-cursor-4-phases-approve-single-code-writer-3nnl</guid>
      <description>&lt;h1&gt;
  
  
  SpecFlow: Multi-Agent SDD in Cursor (4 phases, &lt;code&gt;/approve&lt;/code&gt;, single code writer)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;SpecFlow&lt;/strong&gt; is a CLI that installs &lt;strong&gt;Spec-Driven Development (SDD)&lt;/strong&gt; in your repository: four phase agents, markdown specs, and &lt;strong&gt;only Implementer&lt;/strong&gt; may edit source code. It still looks like Cursor chat — you turn on flow when the feature warrants it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ceatoleii/specflow" rel="noopener noreferrer"&gt;&lt;code&gt;@ceatoleii/specflow&lt;/code&gt;&lt;/a&gt; · Pipeline: &lt;strong&gt;Requirement → Plan → Tasks → Code → Review&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ceatoleii/specflow init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://ceatoleii.github.io/specflow/" rel="noopener noreferrer"&gt;ceatoleii.github.io/specflow&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What problem it solves
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;SpecFlow mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vague ask → huge diff&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Refiner&lt;/strong&gt; → &lt;code&gt;task.md&lt;/code&gt; with &lt;strong&gt;AC1&lt;/strong&gt;, &lt;strong&gt;AC2&lt;/strong&gt;…&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code before design agreement&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SDD&lt;/strong&gt; waits for &lt;strong&gt;&lt;code&gt;/approve&lt;/code&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple “agents” touching &lt;code&gt;src/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Only &lt;strong&gt;Implementer&lt;/strong&gt; writes source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Done” without evidence&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; → &lt;code&gt;review.md&lt;/code&gt; per AC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pipeline:&lt;/strong&gt; Requirement → Plan → Tasks → Code → Review&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
  R[Refining&amp;lt;br/&amp;gt;task.md] --&amp;gt; D[Designing&amp;lt;br/&amp;gt;plan.md + tasks.md]
  D --&amp;gt;|/approve| I[Implementing&amp;lt;br/&amp;gt;src/]
  I --&amp;gt; V[Reviewing&amp;lt;br/&amp;gt;review.md]
  V --&amp;gt;|PASS| A[history/ + flow off]
  V --&amp;gt;|FAIL| I
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Architecture in 60 seconds
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase (&lt;code&gt;phase.md&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Writes code?&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refining&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Refiner&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;designing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SDD&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;plan.md&lt;/code&gt;, &lt;code&gt;tasks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;implementing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementer&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code + &lt;code&gt;tasks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reviewing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reviewer&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;review.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Direct mode vs flow mode
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Direct mode&lt;/th&gt;
&lt;th&gt;Flow mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;.agents-state/.flow-enabled&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;File present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;new task&lt;/code&gt;, &lt;code&gt;flow on&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;flow off&lt;/code&gt;, direct mode phrases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Typos, spikes, exploration&lt;/td&gt;
&lt;td&gt;Features with clear ACs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Install (2 minutes)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; Node.js ≥ 18, interactive terminal, project root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ceatoleii/specflow init
specflow doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to &lt;code&gt;.gitignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents-state/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What &lt;code&gt;init&lt;/code&gt; installs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Maintained by&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpecFlow (&lt;code&gt;init&lt;/code&gt; / &lt;code&gt;sync&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Universal entry for IDEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.agents/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpecFlow&lt;/td&gt;
&lt;td&gt;Phase rules — &lt;strong&gt;do not edit&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.agents-docs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;You&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stack, conventions, &lt;code&gt;verification.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.agents-state/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Per-task state — gitignore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.cursor/rules/_specflow.mdc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpecFlow&lt;/td&gt;
&lt;td&gt;Cursor adapter (default v2.2+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.specflow-linear.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Linear sync via Cursor MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Golden rule:&lt;/strong&gt; fill &lt;code&gt;.agents-docs/&lt;/code&gt; before serious tasks — agents read it every flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Walkthrough: rate limiting on &lt;code&gt;/api/search&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Example feature:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Max 100 req/min per IP, HTTP 429 with standard JSON, existing tests stay green.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Start flow
&lt;/h3&gt;

&lt;p&gt;In Cursor chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;new task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also: &lt;code&gt;flow on&lt;/code&gt;, or &lt;code&gt;new task from LIN-123&lt;/code&gt; (Linear + MCP).&lt;/p&gt;

&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;specflow doctor
&lt;span class="c"&gt;# Expect .flow-enabled and phase.md = refining&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Refining → &lt;code&gt;task.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Refiner asks questions; you answer. Typical output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Task: Rate limit /api/search&lt;/span&gt;

&lt;span class="gu"&gt;## Goal&lt;/span&gt;
Limit anonymous traffic to /api/search without breaking current behavior.

&lt;span class="gu"&gt;## Acceptance Criteria&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**AC1:**&lt;/span&gt; &amp;gt;100 requests/min from same IP → HTTP 429
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AC2:**&lt;/span&gt; Body &lt;span class="sb"&gt;`{ "error": "rate_limit_exceeded", "retryAfter": &amp;lt;number&amp;gt; }`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AC3:**&lt;/span&gt; Existing search endpoint tests pass unchanged

&lt;span class="gu"&gt;## Constraints&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Reuse existing error middleware patterns if present
&lt;span class="p"&gt;-&lt;/span&gt; No new env vars without team approval

&lt;span class="gu"&gt;## Out of Scope&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Per-API-key quotas
&lt;span class="p"&gt;-&lt;/span&gt; Admin dashboard for limits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You review&lt;/strong&gt; ACs and Out of Scope — reply in chat to fix; no need to hand-edit the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Designing → &lt;code&gt;plan.md&lt;/code&gt; + &lt;code&gt;tasks.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;SDD proposes design. Sample &lt;code&gt;tasks.md&lt;/code&gt; (TDD order):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Tasks&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; [ ] [test] Add integration test: 101 requests in 60s → 429 (AC1)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [test] Assert JSON body shape matches AC2
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [impl] Create rateLimit middleware (in-memory store, 100/min)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [impl] Wire middleware on /api/search route only
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [impl] Run full search test suite (AC3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read &lt;code&gt;plan.md&lt;/code&gt; (files, approach). If the plan sneaks in unrequested refactors, ask for changes &lt;strong&gt;before&lt;/strong&gt; approve.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;/approve&lt;/code&gt; gate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/approve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also valid: &lt;code&gt;approved&lt;/code&gt;, &lt;code&gt;go ahead&lt;/code&gt; (locale-dependent phrases in rules).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phase → &lt;code&gt;implementing&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Only now may &lt;strong&gt;Implementer&lt;/strong&gt; touch &lt;code&gt;src/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;With Linear enabled: issue → &lt;strong&gt;In Progress&lt;/strong&gt; (via Cursor MCP)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Implementing
&lt;/h3&gt;

&lt;p&gt;Watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tasks.md&lt;/code&gt; — &lt;code&gt;[ ]&lt;/code&gt; → &lt;code&gt;[~]&lt;/code&gt; → &lt;code&gt;[x]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git diff&lt;/code&gt; — must match &lt;code&gt;plan.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On spec gaps, answer in chat — Implementer should not guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Reviewing → &lt;code&gt;review.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Reviewer runs &lt;code&gt;.agents-docs/verification.md&lt;/code&gt; (e.g. &lt;code&gt;npm test&lt;/code&gt;, &lt;code&gt;npm run lint&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Sample &lt;code&gt;review.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Review: Rate limit /api/search&lt;/span&gt;

&lt;span class="gu"&gt;## Acceptance Criteria&lt;/span&gt;

| AC | Evidence | Status |
|----|----------|--------|
| AC1 | &lt;span class="sb"&gt;`rate-limit.test.ts`&lt;/span&gt; — 101 req → 429 | PASS |
| AC2 | Snapshot &lt;span class="sb"&gt;`error`&lt;/span&gt; + &lt;span class="sb"&gt;`retryAfter`&lt;/span&gt; fields | PASS |
| AC3 | &lt;span class="sb"&gt;`npm test -- search`&lt;/span&gt; — 0 failures | PASS |

&lt;span class="gu"&gt;## Verification&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="sb"&gt;`npm test`&lt;/span&gt; — exit 0
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt; — exit 0

&lt;span class="gu"&gt;## Decision&lt;/span&gt;

&lt;span class="gs"&gt;**PASS**&lt;/span&gt; — archived to history/, flow disabled.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PASS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;history/YYYY-MM-DD-slug/&lt;/code&gt;, flow off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAIL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Back to Implementer with concrete fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Five design principles
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec before code&lt;/strong&gt; — No &lt;code&gt;/approve&lt;/code&gt;, no implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One writer&lt;/strong&gt; — Only Implementer in &lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;lib/&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit state&lt;/strong&gt; — &lt;code&gt;phase.md&lt;/code&gt;, &lt;code&gt;task.md&lt;/code&gt;, &lt;code&gt;plan.md&lt;/code&gt; under &lt;code&gt;.agents-state/current/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable rules&lt;/strong&gt; — &lt;code&gt;.agents/&lt;/code&gt; via &lt;code&gt;sync&lt;/code&gt;; project facts in &lt;code&gt;.agents-docs/&lt;/code&gt; (never overwritten by sync).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero overhead by default&lt;/strong&gt; — Without an active task, assistant behaves normally.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Commands you’ll actually use
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;First install&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow doctor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify files and phase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow doctor --run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;+ run &lt;code&gt;verification.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Version, Linear on/off, updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow sync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update engine and adapters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow linear setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable Linear sync (MCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;specflow status
specflow &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Linear + Cursor MCP (optional)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Config: &lt;code&gt;specflow linear setup&lt;/code&gt; or wizard during &lt;code&gt;init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; API keys in the CLI — the Cursor agent uses the Linear MCP plugin&lt;/li&gt;
&lt;li&gt;Default state mapping:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SpecFlow event&lt;/th&gt;
&lt;th&gt;Linear state&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Refining complete&lt;/td&gt;
&lt;td&gt;Todo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/approve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;In Progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review PASS&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Details: &lt;a href="https://ceatoleii.github.io/specflow/linear-integration.html" rel="noopener noreferrer"&gt;Linear Integration&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  When to skip SpecFlow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use flow&lt;/th&gt;
&lt;th&gt;Skip (direct mode)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feature with ACs and scope&lt;/td&gt;
&lt;td&gt;One-line fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You want to read plan before diff&lt;/td&gt;
&lt;td&gt;Spec already signed elsewhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team shares &lt;code&gt;.agents/&lt;/code&gt; rules&lt;/td&gt;
&lt;td&gt;Fully ad-hoc spike&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Team workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Commit:&lt;/strong&gt; &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.agents/&lt;/code&gt;, &lt;code&gt;.agents-docs/&lt;/code&gt;, adapters, &lt;code&gt;.specflow-version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not commit:&lt;/strong&gt; &lt;code&gt;.agents-state/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ceatoleii/specflow &lt;span class="nb"&gt;sync&lt;/span&gt;   &lt;span class="c"&gt;# updates engine; keeps .agents-docs/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick troubleshooting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;First step&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Assistant ignores phases&lt;/td&gt;
&lt;td&gt;Is &lt;code&gt;.flow-enabled&lt;/code&gt; present? &lt;code&gt;specflow doctor&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code without plan&lt;/td&gt;
&lt;td&gt;Did you &lt;code&gt;/approve&lt;/code&gt;? Check &lt;code&gt;phase.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review fails tests&lt;/td&gt;
&lt;td&gt;Fill &lt;code&gt;.agents-docs/verification.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More: &lt;a href="https://ceatoleii.github.io/specflow/troubleshooting.html" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install&lt;/strong&gt; rules and templates with &lt;code&gt;npx @ceatoleii/specflow init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start&lt;/strong&gt; with &lt;code&gt;new task&lt;/code&gt; when the contract matters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approve&lt;/strong&gt; design with &lt;code&gt;/approve&lt;/code&gt; before the diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One agent&lt;/strong&gt; writes code; &lt;strong&gt;Reviewer&lt;/strong&gt; closes with per-AC evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@ceatoleii/specflow" rel="noopener noreferrer"&gt;@ceatoleii/specflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ceatoleii/specflow" rel="noopener noreferrer"&gt;github.com/ceatoleii/specflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://ceatoleii.github.io/specflow/" rel="noopener noreferrer"&gt;ceatoleii.github.io/specflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;More SDD context: &lt;code&gt;article-medium-en.md&lt;/code&gt; in the repo&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What feature would you run through &lt;code&gt;/approve&lt;/code&gt; first? 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cursor</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>SpecFlow: SDD multi-agente en Cursor (4 fases, /approve, un solo escritor de código)</title>
      <dc:creator>Matías Espinoza</dc:creator>
      <pubDate>Mon, 25 May 2026 19:49:01 +0000</pubDate>
      <link>https://dev.to/matas_espinoza_aaab42da0/specflow-sdd-multi-agente-en-cursor-4-fases-approve-un-solo-escritor-de-codigo-2cm6</link>
      <guid>https://dev.to/matas_espinoza_aaab42da0/specflow-sdd-multi-agente-en-cursor-4-fases-approve-un-solo-escritor-de-codigo-2cm6</guid>
      <description>&lt;h1&gt;
  
  
  SpecFlow: SDD multi-agente en Cursor (4 fases, &lt;code&gt;/approve&lt;/code&gt;, un solo escritor de código)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;SpecFlow&lt;/strong&gt; es un CLI que instala &lt;strong&gt;Spec-Driven Development (SDD)&lt;/strong&gt; en tu repositorio: cuatro agentes por fase, specs en markdown y &lt;strong&gt;solo Implementer&lt;/strong&gt; puede editar código fuente. Sigue siendo chat en Cursor — activas el flujo cuando la feature lo merece.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ceatoleii/specflow" rel="noopener noreferrer"&gt;&lt;code&gt;@ceatoleii/specflow&lt;/code&gt;&lt;/a&gt; · Pipeline: &lt;strong&gt;Requisito → Plan → Tareas → Código → Revisión&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ceatoleii/specflow init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guía completa: &lt;a href="https://ceatoleii.github.io/specflow/es/" rel="noopener noreferrer"&gt;ceatoleii.github.io/specflow/es&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Qué problema resuelve
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Síntoma&lt;/th&gt;
&lt;th&gt;Mecanismo SpecFlow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Requisito vago → diff enorme&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Refiner&lt;/strong&gt; → &lt;code&gt;task.md&lt;/code&gt; con &lt;strong&gt;AC1&lt;/strong&gt;, &lt;strong&gt;AC2&lt;/strong&gt;…&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Código antes de acordar diseño&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;SDD&lt;/strong&gt; espera &lt;strong&gt;&lt;code&gt;/approve&lt;/code&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Varios “agentes” tocando &lt;code&gt;src/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Solo &lt;strong&gt;Implementer&lt;/strong&gt; escribe fuente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Listo” sin evidencia&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; → &lt;code&gt;review.md&lt;/code&gt; por AC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pipeline:&lt;/strong&gt; Requisito → Plan → Tareas → Código → Revisión&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
  R[Refining&amp;lt;br/&amp;gt;task.md] --&amp;gt; D[Designing&amp;lt;br/&amp;gt;plan.md + tasks.md]
  D --&amp;gt;|/approve| I[Implementing&amp;lt;br/&amp;gt;src/]
  I --&amp;gt; V[Reviewing&amp;lt;br/&amp;gt;review.md]
  V --&amp;gt;|PASS| A[history/ + flow off]
  V --&amp;gt;|FAIL| I
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Arquitectura en 60 segundos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fase (&lt;code&gt;phase.md&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Agente&lt;/th&gt;
&lt;th&gt;¿Escribe código?&lt;/th&gt;
&lt;th&gt;Salida&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refining&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Refiner&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;designing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SDD&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;plan.md&lt;/code&gt;, &lt;code&gt;tasks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;implementing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementer&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Sí&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Código + &lt;code&gt;tasks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reviewing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reviewer&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;review.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Modo directo vs modo flujo
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Modo directo&lt;/th&gt;
&lt;th&gt;Modo flujo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Señal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sin &lt;code&gt;.agents-state/.flow-enabled&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Archivo presente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Activar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nueva tarea&lt;/code&gt;, &lt;code&gt;flow on&lt;/code&gt;, &lt;code&gt;activar flujo&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Apagar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;flow off&lt;/code&gt;, &lt;code&gt;modo directo&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uso&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Typos, spikes, exploración&lt;/td&gt;
&lt;td&gt;Features con ACs claros&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Instalación (2 minutos)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Requisitos:&lt;/strong&gt; Node.js ≥ 18, terminal interactiva, raíz del proyecto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ceatoleii/specflow init
specflow doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Añade al &lt;code&gt;.gitignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents-state/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Qué instala &lt;code&gt;init&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ruta&lt;/th&gt;
&lt;th&gt;Quién la mantiene&lt;/th&gt;
&lt;th&gt;Notas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpecFlow (&lt;code&gt;init&lt;/code&gt; / &lt;code&gt;sync&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Entrada para cualquier IDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.agents/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpecFlow&lt;/td&gt;
&lt;td&gt;Reglas de fase — &lt;strong&gt;no editar&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.agents-docs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Tú&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stack, convenciones, &lt;code&gt;verification.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.agents-state/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Estado por tarea — gitignore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.cursor/rules/_specflow.mdc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SpecFlow&lt;/td&gt;
&lt;td&gt;Adaptador Cursor (default v2.2+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.specflow-linear.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Sync Linear vía MCP en Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Regla de oro:&lt;/strong&gt; completa &lt;code&gt;.agents-docs/&lt;/code&gt; antes de tareas serias — los agentes leen eso en cada flujo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Walkthrough: rate limiting en &lt;code&gt;/api/search&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Feature de ejemplo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Máx. 100 req/min por IP, HTTP 429 con JSON estándar, tests existentes en verde.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Activar flujo
&lt;/h3&gt;

&lt;p&gt;En el chat de Cursor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nueva tarea
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternativas: &lt;code&gt;flow on&lt;/code&gt;, &lt;code&gt;activar flujo&lt;/code&gt;, o &lt;code&gt;nueva tarea desde LIN-123&lt;/code&gt; (Linear + MCP).&lt;/p&gt;

&lt;p&gt;Comprueba:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;specflow doctor
&lt;span class="c"&gt;# Debe ver .flow-enabled y phase.md = refining&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Refining → &lt;code&gt;task.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;El Refiner pregunta; tú respondes. Resultado típico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Task: Rate limit /api/search&lt;/span&gt;

&lt;span class="gu"&gt;## Goal&lt;/span&gt;
Limit anonymous traffic to /api/search without breaking current behavior.

&lt;span class="gu"&gt;## Acceptance Criteria&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**AC1:**&lt;/span&gt; &amp;gt;100 requests/min from same IP → HTTP 429
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AC2:**&lt;/span&gt; Body &lt;span class="sb"&gt;`{ "error": "rate_limit_exceeded", "retryAfter": &amp;lt;number&amp;gt; }`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**AC3:**&lt;/span&gt; Existing search endpoint tests pass unchanged

&lt;span class="gu"&gt;## Constraints&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Reuse existing error middleware patterns if present
&lt;span class="p"&gt;-&lt;/span&gt; No new env vars without team approval

&lt;span class="gu"&gt;## Out of Scope&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Per-API-key quotas
&lt;span class="p"&gt;-&lt;/span&gt; Admin dashboard for limits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tú revisas&lt;/strong&gt; ACs y Out of Scope — no hace falta editar el archivo; corrige en chat si algo falla.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Designing → &lt;code&gt;plan.md&lt;/code&gt; + &lt;code&gt;tasks.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;El SDD propone diseño. Fragmento de &lt;code&gt;tasks.md&lt;/code&gt; (orden TDD):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Tasks&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; [ ] [test] Add integration test: 101 requests in 60s → 429 (AC1)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [test] Assert JSON body shape matches AC2
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [impl] Create rateLimit middleware (in-memory store, 100/min)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [impl] Wire middleware on /api/search route only
&lt;span class="p"&gt;-&lt;/span&gt; [ ] [impl] Run full search test suite (AC3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lee &lt;code&gt;plan.md&lt;/code&gt; (archivos, enfoque). Si el plan incluye refactors no pedidos, pide cambios &lt;strong&gt;antes&lt;/strong&gt; de aprobar.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Puerta &lt;code&gt;/approve&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/approve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También válido: &lt;code&gt;aprobado&lt;/code&gt;, &lt;code&gt;dale&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fase → &lt;code&gt;implementing&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Solo ahora &lt;strong&gt;Implementer&lt;/strong&gt; puede tocar &lt;code&gt;src/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Con Linear habilitado: issue → &lt;strong&gt;In Progress&lt;/strong&gt; (vía MCP en Cursor)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Implementing
&lt;/h3&gt;

&lt;p&gt;Monitorea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tasks.md&lt;/code&gt; — &lt;code&gt;[ ]&lt;/code&gt; → &lt;code&gt;[~]&lt;/code&gt; → &lt;code&gt;[x]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git diff&lt;/code&gt; — debe alinearse con &lt;code&gt;plan.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si hay ambigüedad en la spec, responde en chat; el Implementer no debe adivinar.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Reviewing → &lt;code&gt;review.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;El Reviewer ejecuta comandos de &lt;code&gt;.agents-docs/verification.md&lt;/code&gt; (ej. &lt;code&gt;npm test&lt;/code&gt;, &lt;code&gt;npm run lint&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Ejemplo &lt;code&gt;review.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Review: Rate limit /api/search&lt;/span&gt;

&lt;span class="gu"&gt;## Acceptance Criteria&lt;/span&gt;

| AC | Evidence | Status |
|----|----------|--------|
| AC1 | &lt;span class="sb"&gt;`rate-limit.test.ts`&lt;/span&gt; — 101 req → 429 | PASS |
| AC2 | Snapshot &lt;span class="sb"&gt;`error`&lt;/span&gt; + &lt;span class="sb"&gt;`retryAfter`&lt;/span&gt; fields | PASS |
| AC3 | &lt;span class="sb"&gt;`npm test -- search`&lt;/span&gt; — 0 failures | PASS |

&lt;span class="gu"&gt;## Verification&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="sb"&gt;`npm test`&lt;/span&gt; — exit 0
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt; — exit 0

&lt;span class="gu"&gt;## Decision&lt;/span&gt;

&lt;span class="gs"&gt;**PASS**&lt;/span&gt; — archived to history/, flow disabled.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resultado&lt;/th&gt;
&lt;th&gt;Qué pasa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PASS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;history/YYYY-MM-DD-slug/&lt;/code&gt;, flujo apagado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAIL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vuelve a Implementer con lista concreta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Los 5 principios de diseño
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec antes que código&lt;/strong&gt; — Sin &lt;code&gt;/approve&lt;/code&gt;, no hay implementación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un solo escritor&lt;/strong&gt; — Solo Implementer en &lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;lib/&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estado explícito&lt;/strong&gt; — &lt;code&gt;phase.md&lt;/code&gt;, &lt;code&gt;task.md&lt;/code&gt;, &lt;code&gt;plan.md&lt;/code&gt; en &lt;code&gt;.agents-state/current/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reglas portables&lt;/strong&gt; — &lt;code&gt;.agents/&lt;/code&gt; con &lt;code&gt;sync&lt;/code&gt;; hechos del proyecto en &lt;code&gt;.agents-docs/&lt;/code&gt; (nunca sobrescrito por sync).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cero overhead por defecto&lt;/strong&gt; — Sin tarea activa, el asistente es normal.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Comandos del día a día
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;Cuándo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Primera instalación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow doctor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verificar archivos y fase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow doctor --run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;+ ejecutar &lt;code&gt;verification.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Versión, Linear on/off, updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow sync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Actualizar motor y adaptadores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;specflow linear setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Habilitar sync Linear (MCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;specflow status
specflow &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Linear + Cursor MCP (opcional)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Config: &lt;code&gt;specflow linear setup&lt;/code&gt; o wizard en &lt;code&gt;init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&gt; usa API keys en el CLI — el agente en Cursor llama al plugin Linear MCP&lt;/li&gt;
&lt;li&gt;Eventos por defecto:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evento SpecFlow&lt;/th&gt;
&lt;th&gt;Estado Linear&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Refining completo&lt;/td&gt;
&lt;td&gt;Todo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/approve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;In Progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review PASS&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Detalle: &lt;a href="https://ceatoleii.github.io/specflow/es/linear-integration.html" rel="noopener noreferrer"&gt;Integración Linear&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Cuándo NO usar SpecFlow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Usa flujo&lt;/th&gt;
&lt;th&gt;Omite (modo directo)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feature con ACs y alcance&lt;/td&gt;
&lt;td&gt;Fix de una línea&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quieres leer plan antes del diff&lt;/td&gt;
&lt;td&gt;Spec ya firmada fuera del repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equipo con mismas reglas en &lt;code&gt;.agents/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Spike exploratorio 100% ad-hoc&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Trabajo en equipo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Commitear:&lt;/strong&gt; &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.agents/&lt;/code&gt;, &lt;code&gt;.agents-docs/&lt;/code&gt;, adaptadores, &lt;code&gt;.specflow-version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No commitear:&lt;/strong&gt; &lt;code&gt;.agents-state/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @ceatoleii/specflow &lt;span class="nb"&gt;sync&lt;/span&gt;   &lt;span class="c"&gt;# actualiza motor; preserva .agents-docs/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Troubleshooting rápido
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problema&lt;/th&gt;
&lt;th&gt;Primer paso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;El asistente ignora fases&lt;/td&gt;
&lt;td&gt;¿Existe &lt;code&gt;.flow-enabled&lt;/code&gt;? &lt;code&gt;specflow doctor&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Código sin plan&lt;/td&gt;
&lt;td&gt;¿Dijiste &lt;code&gt;/approve&lt;/code&gt;? Revisa &lt;code&gt;phase.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review falla tests&lt;/td&gt;
&lt;td&gt;Completa &lt;code&gt;.agents-docs/verification.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Más: &lt;a href="https://ceatoleii.github.io/specflow/es/troubleshooting.html" rel="noopener noreferrer"&gt;Solución de problemas&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instalas&lt;/strong&gt; reglas y plantillas con &lt;code&gt;npx @ceatoleii/specflow init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activas&lt;/strong&gt; con &lt;code&gt;nueva tarea&lt;/code&gt; cuando el contrato importa&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apruebas&lt;/strong&gt; diseño con &lt;code&gt;/approve&lt;/code&gt; antes del diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un agente&lt;/strong&gt; escribe código; &lt;strong&gt;Reviewer&lt;/strong&gt; cierra con evidencia por AC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@ceatoleii/specflow" rel="noopener noreferrer"&gt;@ceatoleii/specflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ceatoleii/specflow" rel="noopener noreferrer"&gt;github.com/ceatoleii/specflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs ES: &lt;a href="https://ceatoleii.github.io/specflow/es/" rel="noopener noreferrer"&gt;ceatoleii.github.io/specflow/es&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Más contexto SDD: &lt;code&gt;article-medium-es.md&lt;/code&gt; en el repo&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;¿Qué feature probarías primero con &lt;code&gt;/approve&lt;/code&gt;? 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cursor</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
