<?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: David Perez Vicens</title>
    <description>The latest articles on DEV Community by David Perez Vicens (@davidpv).</description>
    <link>https://dev.to/davidpv</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F686362%2F16313114-dbc1-49d2-9d5f-cc58f5866cad.jpeg</url>
      <title>DEV Community: David Perez Vicens</title>
      <link>https://dev.to/davidpv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidpv"/>
    <language>en</language>
    <item>
      <title>I was using Claude Code wrong — here's the workflow that fixed it</title>
      <dc:creator>David Perez Vicens</dc:creator>
      <pubDate>Thu, 18 Jun 2026 08:45:48 +0000</pubDate>
      <link>https://dev.to/davidpv/i-was-using-claude-code-wrong-heres-the-workflow-that-fixed-it-3o07</link>
      <guid>https://dev.to/davidpv/i-was-using-claude-code-wrong-heres-the-workflow-that-fixed-it-3o07</guid>
      <description>&lt;p&gt;I've been using Claude Code on production projects for several months. It's genuinely impressive at writing code. But I kept shipping features that technically worked and architecturally misfired.&lt;/p&gt;

&lt;p&gt;The problem wasn't the code quality. It was that I was handing the AI a task and letting it decide — implicitly, mid-implementation — what the system should actually do. Those decisions were buried in commits, invisible to review, and untraceable to any requirement.&lt;/p&gt;

&lt;p&gt;I was using Claude Code as a replacement for a developer. It works better as a replacement for a compiler: something that takes a precise specification and produces correct output.&lt;/p&gt;

&lt;p&gt;That realization led me to build opsx.&lt;/p&gt;

&lt;p&gt;The core principle: Spec → Plan → Code&lt;/p&gt;

&lt;p&gt;Code is the last artifact produced, never the first.&lt;/p&gt;

&lt;p&gt;Before any implementation starts, there's a change document: a proposal that explains what's changing and why, delta specs that describe the new behavior, a design section, and an implementation task list. Only when that document is reviewed and approved does the agent write a single line of code.&lt;/p&gt;

&lt;p&gt;This isn't a new idea — it's how safety-critical engineering works. The interesting part is applying it to agentic AI workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkbeyo7tvatc2f7xaf8yd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkbeyo7tvatc2f7xaf8yd.gif" alt=" " width="559" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two planes, never confused&lt;/p&gt;

&lt;p&gt;opsx enforces a clean separation between:&lt;/p&gt;

&lt;p&gt;Management plane (Jira) — what work exists and who's doing it. Tasks, priorities, estimates. This is where product decisions live.&lt;/p&gt;

&lt;p&gt;Governance plane (OpenSpec) — how the system must behave. This is the source of truth that authorizes code. A Jira ticket, no matter how detailed, does not authorize implementation. A reviewed OpenSpec change does.&lt;/p&gt;

&lt;p&gt;This sounds bureaucratic. In practice, it means you catch design conflicts before they're in the code, and every commit traces back to an explicit decision.&lt;/p&gt;

&lt;p&gt;What the workflow looks like&lt;/p&gt;

&lt;p&gt;bashnpx &lt;a class="mentioned-user" href="https://dev.to/davidpv"&gt;@davidpv&lt;/a&gt;/opsx init          # scaffold the workflow on any existing project&lt;br&gt;
npx &lt;a class="mentioned-user" href="https://dev.to/davidpv"&gt;@davidpv&lt;/a&gt;/opsx doctor        # verify tooling&lt;/p&gt;

&lt;p&gt;Inside Claude Code:&lt;/p&gt;

&lt;p&gt;/opsx:propose speed-up-search   # write change: proposal + specs + design + tasks&lt;br&gt;
/review-change speed-up-search  # spec-reviewer audit before any code&lt;br&gt;
/opsx:apply                     # implement task by task, traced to specs&lt;br&gt;
/git-commit                     # semantic commit with Change:/Task:/Jira: footers&lt;br&gt;
/ship                           # validate + archive specs + merge&lt;/p&gt;

&lt;p&gt;The workflow is guided: /start routes new work, /next tells you where you are if you get lost. Every command ends by suggesting the next step.&lt;/p&gt;

&lt;p&gt;What you get in practice&lt;/p&gt;

&lt;p&gt;No silent design decisions. The proposal step forces you to articulate why before the agent executes how.&lt;br&gt;
Reviewable specs. Delta specs are Markdown files in your repo. They go through your normal code review process.&lt;br&gt;
Full traceability. Every commit has footers pointing to the change, the task step, and the Jira ticket. /ship archives the delta specs into the living spec.&lt;br&gt;
Drift detection. If you make a hotfix that doesn't match the spec, /opsx:sync surfaces and resolves the conflict explicitly.&lt;/p&gt;

&lt;p&gt;Stack-agnostic&lt;/p&gt;

&lt;p&gt;opsx works with Claude Code, opencode, and Codex. workflow.yaml configures branches (git-flow or trunk-based), commit convention, and Jira project key. The commands are just Markdown files in .claude/, .opencode/, or .codex/ — readable and editable.&lt;/p&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;p&gt;bashnpx &lt;a class="mentioned-user" href="https://dev.to/davidpv"&gt;@davidpv&lt;/a&gt;/opsx init&lt;/p&gt;

&lt;p&gt;Node &amp;gt;= 18, requires the OpenSpec CLI and at least one agent CLI.&lt;/p&gt;

&lt;p&gt;GitHub: github.com/davidpv/opsx-spec-driven-development-toolkit&lt;/p&gt;

&lt;p&gt;npm: &lt;a class="mentioned-user" href="https://dev.to/davidpv"&gt;@davidpv&lt;/a&gt;/opsx&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
