<?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: Peterson Andres Sena Arias</title>
    <description>The latest articles on DEV Community by Peterson Andres Sena Arias (@r3v3rs3).</description>
    <link>https://dev.to/r3v3rs3</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%2F1249042%2Fe1afca32-f78d-47dd-8926-3c2c75df7c61.jpeg</url>
      <title>DEV Community: Peterson Andres Sena Arias</title>
      <link>https://dev.to/r3v3rs3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/r3v3rs3"/>
    <language>en</language>
    <item>
      <title>Skills teach, hooks check: how my AI agent's skills and guardrails work together</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Mon, 12 Oct 2026 10:34:04 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/skills-teach-hooks-check-how-my-ai-agents-skills-and-guardrails-work-together-nno</link>
      <guid>https://dev.to/r3v3rs3/skills-teach-hooks-check-how-my-ai-agents-skills-and-guardrails-work-together-nno</guid>
      <description>&lt;p&gt;If you've used Claude Code or Codex for a while, you've probably collected some &lt;strong&gt;skills&lt;/strong&gt;: folders of instructions that teach the agent how to do something well, like designing a UI, writing tests or auditing a backend. And maybe some &lt;strong&gt;hooks&lt;/strong&gt;: scripts that run before or after the agent acts and can stop it.&lt;/p&gt;

&lt;p&gt;Most people treat them as two separate things. A drawer of skills over here, a couple of hooks over there.&lt;/p&gt;

&lt;p&gt;That's the mistake I made for months. A skill on its own is advice: the agent reads it when it remembers to, follows it when it's convenient. A hook on its own is a wall with no map: it blocks, and the agent doesn't know what to do instead. The interesting part is what happens when &lt;strong&gt;every important skill has a hook that checks it&lt;/strong&gt;, and every hook points back to the skill that explains how to get past it.&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;Senzu&lt;/strong&gt; is built: 43 skills, 24 hooks and 22 commands for Claude Code and Codex. This post is a tour of the best ones and, more importantly, of how they hand work to each other.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Senzu is written in Spanish, but it works the same in English: the skills and hooks are read by the agent, and you talk to it in your language. I explained exactly how (and the three places where Spanish still leaks through) in &lt;a href="https://dev.to/r3v3rs3/my-ai-agents-guardrails-are-written-in-spanish-they-work-exactly-the-same-in-english-26p5"&gt;the previous post&lt;/a&gt;. The hook messages below are real, in Spanish, with my English translation underneath.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The one idea: skill = how, hook = proof
&lt;/h2&gt;

&lt;p&gt;Here's the whole design in one picture:&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%2F9z2qlwiijtiahfhg6tkk.png" 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%2F9z2qlwiijtiahfhg6tkk.png" alt="Every skill that matters has a hook that checks it" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The left column teaches. The right column checks. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ui-verify&lt;/strong&gt; teaches the agent to measure a page in a real browser, phone first. &lt;strong&gt;stop-guard&lt;/strong&gt; won't let it say "done" after touching UI unless that verification happened.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;project-planner&lt;/strong&gt; teaches it to split work into small cards with a "done when" and a "how to verify". &lt;strong&gt;tarjeta-guard&lt;/strong&gt; won't let a card be marked done without the proof written in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;depurar&lt;/strong&gt; (&lt;em&gt;debug&lt;/em&gt;) teaches a method: reproduce, write the failing test, one hypothesis, narrow it down, fix the cause. &lt;strong&gt;depurar-coach&lt;/strong&gt; fires the moment a test or build command fails and reminds the agent of that method &lt;em&gt;before&lt;/em&gt; it starts changing things at random.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only take one thing from this post, take that: &lt;strong&gt;for every rule you care about, write down how to do it, and then write something that checks it was done.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the hooks live: five moments of a session
&lt;/h2&gt;

&lt;p&gt;Claude Code and Codex fire hooks at specific moments. Senzu puts at least one hook in each:&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%2Fm1bjdrzuaazk77t6tc2b.png" 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%2Fm1bjdrzuaazk77t6tc2b.png" alt="One session, five moments, a hook in each" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SessionStart&lt;/strong&gt;: before you've typed anything, &lt;code&gt;session-start&lt;/code&gt; tells the agent the stack, the branch, the project memory (decisions in force, what didn't work), the design system if there is one, and &lt;strong&gt;the next step of the method&lt;/strong&gt; (install, adopt, plan…).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UserPromptSubmit&lt;/strong&gt;: when you write, &lt;code&gt;prompt-router&lt;/code&gt; matches your words against the skills and suggests the one that fits, once per skill per session. &lt;code&gt;memoria-viva&lt;/code&gt; (&lt;em&gt;living memory&lt;/em&gt;) notices when you're stating a rule ("from now on…") and makes the agent write it down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PreToolUse&lt;/strong&gt;: before every command or file edit. This is where the walls are: the hard no's, the method, your conventions, your architecture, your vetoes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostToolUse&lt;/strong&gt;: after it acts. &lt;code&gt;edit-tracker&lt;/code&gt; records which files &lt;em&gt;this&lt;/em&gt; session touched, &lt;code&gt;format-on-save&lt;/code&gt; formats them (only if your project has a formatter configured, and never more lines than the agent changed), and &lt;code&gt;depurar-coach&lt;/code&gt; watches for failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop&lt;/strong&gt;: when the agent wants to finish. This is where "done" gets checked: verification, devlog, memory, uncommitted files.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The order matters. A hook at SessionStart can't block anything, but it can make sure the agent &lt;em&gt;starts&lt;/em&gt; in the right place. A hook at Stop can't prevent a mistake, but it can stop a mistake from being called finished.&lt;/p&gt;

&lt;p&gt;Now the best ones, in the order you'd meet them in a real feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The router: read one skill, not forty
&lt;/h2&gt;

&lt;p&gt;Forty-three skills is a lot of context. If the agent loaded them all, there'd be no room left for your code. So the first pair is about &lt;strong&gt;reading less&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;skill-router&lt;/strong&gt; (a skill) is a decision tree: "is this UI? backend? a bug? a plan?", and for each answer, which skill and &lt;em&gt;which section&lt;/em&gt; of it to read. Senzu's skills have a "minimum reading per task" table, so the agent opens one reference, not a manual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;prompt-router&lt;/strong&gt; (a hook) does the first step for it. Each skill in the registry has a priority and a set of keywords. When your message matches, the hook injects one line: "this looks like a job for &lt;code&gt;gsap-scrolltrigger&lt;/code&gt;; read its SKILL.md first". The more specific skill wins: ask for a React Three Fiber scene and you get &lt;code&gt;react-three-fiber&lt;/code&gt;, not the generic &lt;code&gt;threejs-webgl&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many of the keywords are already English (&lt;code&gt;landing&lt;/code&gt;, &lt;code&gt;hero&lt;/code&gt;, &lt;code&gt;dashboard&lt;/code&gt;, &lt;code&gt;animation&lt;/code&gt;, &lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;legacy&lt;/code&gt;, &lt;code&gt;screenshot&lt;/code&gt;), which is part of why it works when you write in English.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Design before code: ui-ux-pro-max + front-skill-reminder + code-hygiene
&lt;/h2&gt;

&lt;p&gt;This trio is my favourite, because it fixed the thing agents are worst at: deciding what a page should look like &lt;em&gt;before&lt;/em&gt; writing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ui-ux-pro-max&lt;/strong&gt; (&lt;a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill" rel="noopener noreferrer"&gt;by Next Level Builder&lt;/a&gt;, with a Senzu layer on top) is the entry point for anything visual. It picks style, palette, typography and layout pattern for the business and the stack, and saves them as the project's design system (&lt;code&gt;MASTER.md&lt;/code&gt;). Everything after reads from there.&lt;/p&gt;

&lt;p&gt;But a skill can be skipped. So &lt;strong&gt;front-skill-reminder&lt;/strong&gt; checks the very first UI edit of each session. If there's no design system &lt;em&gt;and&lt;/em&gt; no brief, it blocks:&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%2Fk6eit1d7896ba9yssw1h.png" 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%2Fk6eit1d7896ba9yssw1h.png" alt="Real output: first UI edit with no brief and no design system" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the escape hatch: if it really is a one-line fix to something already built, the agent says so explicitly and retries. The wall fires once per session. It's there to force a decision, not to be annoying.&lt;/p&gt;

&lt;p&gt;Then the third piece. During the design rounds, everything you reject goes to a &lt;code&gt;gustos.md&lt;/code&gt; file (&lt;em&gt;tastes&lt;/em&gt;) under "No". &lt;strong&gt;code-hygiene&lt;/strong&gt; reads that file on every edit. Vetoed a carousel? It can't come back:&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%2F2f944dnnr05ituy5vkb8.png" 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%2F2f944dnnr05ituy5vkb8.png" alt="Real output: a vetoed term is blocked" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's three components talking to each other through two files. The skill writes &lt;code&gt;MASTER.md&lt;/code&gt; and &lt;code&gt;gustos.md&lt;/code&gt;; one hook demands the first exists, another enforces the second. None of them would be worth much alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "Done" means proven: verify-build + ui-verify + stop-guard
&lt;/h2&gt;

&lt;p&gt;This is the pair I'd install first in any project, even without the rest of Senzu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;code-quality&lt;/strong&gt; ships a script, &lt;code&gt;verify-build.mjs&lt;/code&gt;, that figures out what kind of project it's in (Node, PHP, Python, Rust, Ruby, Java, .NET, Deno, monorepos with several of them) and runs lint, types, tests and build for what you touched. When everything passes, it leaves a small mark that says "verified after the last edit".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ui-verify&lt;/strong&gt; does the same for the screen: it opens the page in a real browser at 375, 768 and 1440 px, phone first, checks horizontal overflow, tap target sizes, contrast and console errors, and measures geometry in pixels. If something its container centers is 4 px off, it says so, with the probable cause. On mobile it actually opens the menu, taps it and checks it closes with Escape.&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;stop-guard&lt;/strong&gt; connects them. When the agent tries to finish, it checks: did this session edit code? Is there a verification mark &lt;em&gt;after&lt;/em&gt; the last edit? Did it touch UI? Is there a devlog entry for today? Are today's decisions in the project memory?&lt;/p&gt;

&lt;p&gt;Here's one it gave &lt;em&gt;me&lt;/em&gt;, for real, while I was writing the previous post with an agent:&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%2Fqae23ncd68q2v64710mv.png" 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%2Fqae23ncd68q2v64710mv.png" alt="Real output: stop-guard demanding verification, UI check and memory" width="799" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent had written the post, generated the images, committed, and was about to tell me "all done". It couldn't. It ran the build verification, ran the UI check at 375 and 1440 px (0 problems), added the decision to the memory, and &lt;em&gt;then&lt;/em&gt; it was done. That's the whole point: the end of a task is where agents cut corners, so that's where the strictest hook lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Plans that close with proof: project-planner + tarjeta-guard + arranque-guard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;project-planner&lt;/strong&gt; turns a feature into phases of small cards. Each card says which skill to use, what "done" looks like, how to verify it, and what it's for:&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;### F1-T2 · Checkout page  [M] [doing]&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; What for: the customer can pay without leaving the shop
&lt;span class="p"&gt;-&lt;/span&gt; Skill: ui-ux-pro-max
&lt;span class="p"&gt;-&lt;/span&gt; Done when: a test payment ends on the thank-you page
&lt;span class="p"&gt;-&lt;/span&gt; Verify: verify-ui 375/1440 + test payment
&lt;span class="p"&gt;-&lt;/span&gt; Verified: —
&lt;span class="p"&gt;-&lt;/span&gt; Meets: —
&lt;span class="p"&gt;-&lt;/span&gt; Devlog: —
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;/siguiente&lt;/code&gt; (&lt;em&gt;next&lt;/em&gt;) runs them one at a time. Two hooks keep that honest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;arranque-guard&lt;/strong&gt; (&lt;em&gt;start guard&lt;/em&gt;) blocks writing code when a step of the method is missing: no Senzu installed, an existing project with no adopted conventions, or no plan and no idea what we're building, in which case the agent has to ask you first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tarjeta-guard&lt;/strong&gt; (&lt;em&gt;card guard&lt;/em&gt;) simulates what &lt;code&gt;PLAN.md&lt;/code&gt; would look like after the edit and, for every card that moves to done, demands the last three fields, filled with real things:&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%2Ffoldgwzje5zyxkeojal9.png" 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%2Ffoldgwzje5zyxkeojal9.png" alt="Real output: a card can't be marked done without proof" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Meets" is the subtle one. It's not enough that tests pass; the card has to say how it fulfils its &lt;em&gt;purpose&lt;/em&gt;. The tests can pass on a checkout page that doesn't let anyone pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Your project's rules, not the agent's: /adoptar + conventions-guard + arquitectura-guard
&lt;/h2&gt;

&lt;p&gt;On an existing codebase, the problem isn't that the agent writes bad code. It writes &lt;em&gt;different&lt;/em&gt; code: its own naming, its own validation style, its own folders.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/adoptar&lt;/code&gt; (&lt;em&gt;adopt&lt;/em&gt;) uses the &lt;strong&gt;code-quality&lt;/strong&gt; skill to study the real project (naming, structure, validation, tests, git history, the language of identifiers and comments), proposes the conventions with a real example of each, and seals them once you agree. Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;conventions-guard&lt;/strong&gt; blocks code that introduces a pattern the sealed conventions forbid. Only what's &lt;em&gt;introduced&lt;/em&gt;: old code that already breaks a rule isn't your problem today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;guard&lt;/strong&gt; makes the sealed file untouchable for the agent. It can't edit it, move it, delete it or restore it, from the editor, the terminal or a commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ddd-hexagonal&lt;/strong&gt; is a library of 74 documents on domain-driven design, hexagonal architecture and light CQRS, including a checklist for when &lt;em&gt;not&lt;/em&gt; to use them. If you declare an architecture (MVC with services, hexagonal or DDD), &lt;strong&gt;arquitectura-guard&lt;/strong&gt; reads your real import map and blocks imports that cross a layer: the domain importing the framework, a controller using the ORM directly. I showed those messages in the previous post; the pattern is the same as everywhere else. The message says what's wrong, &lt;em&gt;where the code should go instead&lt;/em&gt;, and how you (not the agent) can approve an exception.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Memory you don't have to maintain: devlog + the memoria hooks
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;devlog&lt;/strong&gt; skill keeps a diary per project: one entry per relevant step, what was done, why, and how it was verified, plus a short &lt;code&gt;MEMORIA.md&lt;/code&gt; with the decisions in force (&lt;code&gt;D-012 · We do X because Y · see entry 063&lt;/code&gt;), what didn't work, and what's pending. It also has a search script that understands word stems, typos and synonyms.&lt;/p&gt;

&lt;p&gt;Writing it down is the skill. &lt;em&gt;Using&lt;/em&gt; it is the hooks':&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;session-start&lt;/code&gt; injects the memory at the start of every session. If the agent wants to contradict a decision, it has to quote it and ask.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memoria-archivo&lt;/code&gt; (&lt;em&gt;file memory&lt;/em&gt;) fires the first time a session touches a file: "here's what the memory and the devlog say about this file". That's how the agent learns that a component broke twice for the same reason before it breaks it a third time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memoria-viva&lt;/code&gt; catches your rules as you say them, and &lt;code&gt;estado-sesion&lt;/code&gt; saves where the session left off, so &lt;code&gt;/retomar&lt;/code&gt; (&lt;em&gt;resume&lt;/em&gt;) can pick it up tomorrow without you explaining anything.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stop-guard&lt;/code&gt;, again, won't let a session close with decisions in the devlog that never made it to the memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. The hard no's (that still explain themselves)
&lt;/h2&gt;

&lt;p&gt;Finally, the walls that don't pair with any skill, because there's no "right way" to do these things. You just don't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;guard&lt;/strong&gt;: no &lt;code&gt;git push&lt;/code&gt; to main/develop/staging/production, no &lt;code&gt;rm -rf&lt;/code&gt; on dangerous paths, no destructive database commands, no &lt;code&gt;curl | bash&lt;/code&gt;, no &lt;code&gt;--force&lt;/code&gt;. The agent can't grant itself permissions or turn hooks off: only you can, from your own terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;secrets-guard&lt;/strong&gt;: real-looking credentials don't go into code. AWS, GitHub, Stripe, OpenAI and Anthropic keys are recognized by their shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;protect-files&lt;/strong&gt;: &lt;code&gt;.env&lt;/code&gt;, already-applied migrations, lockfiles and generated files are off-limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;backend-guard&lt;/strong&gt;: migrations that drop or rename columns in one step, and personal data written to logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cierre-limpio&lt;/strong&gt; (&lt;em&gt;clean exit&lt;/em&gt;): no ending a session with your own files uncommitted, and no touching files another agent is working on. I often run Claude Code and Codex on the same repo, and this one is what makes that possible.&lt;/li&gt;
&lt;/ul&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%2Fyp8zjwjkg4yndlw0464s.png" 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%2Fyp8zjwjkg4yndlw0464s.png" alt="Real output: secrets-guard catching a Stripe key" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it feels like from the inside
&lt;/h2&gt;

&lt;p&gt;I'll be honest: some of these walls hit me while writing this very post.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;code-hygiene&lt;/code&gt; blocked a throwaway script I wrote to capture the hook messages, because it had a &lt;code&gt;console.log&lt;/code&gt;. Fair, and the fix was one line.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;guard&lt;/code&gt; from an older Senzu installed on my machine blocked a heredoc because the text merely &lt;em&gt;mentioned&lt;/em&gt; a protected file. That false positive is exactly what v2.16 ("quoting isn't doing") fixed: newer walls look at what actually runs, not at what a string says. I just hadn't updated that machine.&lt;/li&gt;
&lt;li&gt;And &lt;code&gt;stop-guard&lt;/code&gt;, as you saw above, didn't let the agent call the previous post finished until it was verified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the trade. A good wall costs you a few seconds now and then. A missing wall costs you the afternoon you spend finding out the agent "verified" something it never ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build your own pairs
&lt;/h2&gt;

&lt;p&gt;You don't need Senzu to use the idea. Pick the one rule you repeat to your agent most often and write two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A skill&lt;/strong&gt; that explains how to do it right: short, with a "minimum reading" section so the agent doesn't load more than it needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hook&lt;/strong&gt; that checks it was done, at the right moment (PreToolUse to prevent it, Stop to refuse calling it finished), and whose message says &lt;em&gt;what to do instead&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you'd rather start from mine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add petersonsenadevs/senzu
/plugin install senzu-all@senzu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;/instalar&lt;/code&gt; in your project. In Codex, add the same marketplace from the app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository (MIT): &lt;a href="https://github.com/petersonsenadevs/senzu" rel="noopener noreferrer"&gt;github.com/petersonsenadevs/senzu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website and docs, with a page per skill and per hook generated from the repo: &lt;a href="https://getsenzu.vercel.app" rel="noopener noreferrer"&gt;getsenzu.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Skills from other projects keep their author and license in &lt;code&gt;CREDITOS.md&lt;/code&gt;, and every week a job checks whether they've changed upstream and opens a PR for me to review.&lt;/p&gt;

&lt;p&gt;Which pair would you add first? I'm always looking for the wall I haven't thought of yet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My AI agent's guardrails are written in Spanish. They work exactly the same in English.</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Mon, 12 Oct 2026 10:13:13 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/my-ai-agents-guardrails-are-written-in-spanish-they-work-exactly-the-same-in-english-26p5</link>
      <guid>https://dev.to/r3v3rs3/my-ai-agents-guardrails-are-written-in-spanish-they-work-exactly-the-same-in-english-26p5</guid>
      <description>&lt;p&gt;A couple of weeks ago I wrote (in Spanish) about &lt;strong&gt;Senzu&lt;/strong&gt;, the toolkit I built to stop repeating myself to my coding agents. Same rules in every project: don't commit to &lt;code&gt;main&lt;/code&gt;, check the page on a phone before saying it's done, write down what you did and why, pick the palette before the third component, not after.&lt;/p&gt;

&lt;p&gt;The short version of that post: rules in a &lt;code&gt;CLAUDE.md&lt;/code&gt; are suggestions. The agent reads them and &lt;em&gt;almost always&lt;/em&gt; follows them. "Almost always" isn't good enough for a real project, so I turned every rule that could be executed into something that executes: hooks that block, not paragraphs that advise.&lt;/p&gt;

&lt;p&gt;Since then Senzu has gone from v2.7 to v2.19. That's a lot of new walls, a guided start for new and existing projects, a memory that keeps itself up to date, and a website. And the question I got the most after that first post was not about any of that. It was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It's all in Spanish. Does it work if I don't speak Spanish?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes. This post explains why, and then shows you everything that's new.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Spanish, and why it doesn't matter
&lt;/h2&gt;

&lt;p&gt;Senzu is written in Spanish on purpose. There's a mountain of tooling for coding agents in English and almost nothing designed for people who work in Spanish, so I built the thing I wanted to use.&lt;/p&gt;

&lt;p&gt;But here's what took me a while to see clearly: &lt;strong&gt;almost nothing in Senzu is written for you. It's written for the agent.&lt;/strong&gt;&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%2F71qcfj7g5ld7f2d5eorp.png" 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%2F71qcfj7g5ld7f2d5eorp.png" alt="Who reads what: Spanish for the agent, your language for you"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think about what Senzu actually is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; are instructions the agent loads when a task needs them: how to design a UI, how to audit a backend, how to plan a feature. The agent reads them. You never do, unless you're curious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; ("walls", &lt;em&gt;muros&lt;/em&gt; in Spanish) are small Node scripts that run before and after the agent acts. They inspect the command or the file and either let it through or block it with a reason. The reason goes to the agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commands&lt;/strong&gt; like &lt;code&gt;/plan&lt;/code&gt; or &lt;code&gt;/adoptar&lt;/code&gt; are prompts with a name. You type the name; the agent reads the prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude and GPT read Spanish as well as they read English. An instruction like "el dominio no conoce el framework" lands exactly the same as "the domain doesn't know about the framework". The model doesn't translate it into a weaker rule, it just understands it.&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;you&lt;/em&gt; see is the conversation, and the conversation happens in your language. The hook that runs at the start of every session tells the agent, literally: &lt;em&gt;"respond in Spanish, or in the language the user writes to you in"&lt;/em&gt;. Write in English, get English back.&lt;/p&gt;

&lt;p&gt;Your code doesn't become Spanish either. When you adopt an existing project, Senzu learns its conventions, including the language of its identifiers and comments, and seals them (more on that below). An English codebase stays English.&lt;/p&gt;

&lt;p&gt;There are three places where Spanish leaks through, and I'd rather tell you than have you find out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The rules file installed in your project&lt;/strong&gt; (&lt;code&gt;CLAUDE.md&lt;/code&gt; / &lt;code&gt;AGENTS.md&lt;/code&gt;) opens with &lt;em&gt;"Comunícate en español"&lt;/em&gt;. The session hook overrides it with "or the user's language", but if you want to remove any doubt, tell Senzu once and it will remember for every project:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   /recordar always answer me in English, and write the devlog and plan in English
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That line goes to your &lt;em&gt;user memory&lt;/em&gt; (&lt;code&gt;~/.config/senzu/memoria.md&lt;/code&gt;), which is injected at the start of every session in every project, with the instruction that it beats the agent's own habits.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;When a wall blocks something, the raw message is in Spanish.&lt;/strong&gt; You'll see it scroll by in the tool output. The agent reads it, understands it, and explains it to you in English. Here's a real one, so you know what to expect:&lt;/li&gt;
&lt;/ol&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%2F1v61lerweara2q3gbwc6.png" 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%2F1v61lerweara2q3gbwc6.png" alt="A real wall: no commits on main, with the English translation"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Real output of the &lt;code&gt;guard&lt;/code&gt; hook. The "In English" box is my translation for this post; in a session, the agent explains it to you.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automatic capture of your corrections listens for Spanish.&lt;/strong&gt; One of the new features (below) notices when you say things like &lt;em&gt;"no vuelvas a…"&lt;/em&gt; ("don't do that again") and makes the agent write it down. The phrases it listens for are Spanish, so "from now on, never…" in English slips past it. The workaround is the same command: when you want something remembered, say &lt;code&gt;/recordar …&lt;/code&gt; and it's stored, in any language. English phrases for the detector are on my list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Everything else is the same as if Senzu were written in English: the same walls fire, the same commands run, the same skills load.&lt;/p&gt;
&lt;h2&gt;
  
  
  Quick recap: what Senzu is
&lt;/h2&gt;

&lt;p&gt;If you didn't read the first post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A package for &lt;strong&gt;Claude Code and Codex&lt;/strong&gt; (Codex runs the same hooks since v1.5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;43 skills&lt;/strong&gt;: mine, plus the best ones I found from other people (with their author and license credited), with a layer on top that makes them work together. A router decides which one to load, so the context isn't flooded with things you don't need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;24 hooks&lt;/strong&gt; that block or remind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;22 commands&lt;/strong&gt; for the workflows I repeat in every project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9 stacks&lt;/strong&gt; with their own rules: Laravel, Next, Nuxt, Astro, SvelteKit, Vue + TypeScript, Node APIs, WordPress and Python with LangGraph.&lt;/li&gt;
&lt;li&gt;MIT licensed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, what's new.&lt;/p&gt;
&lt;h2&gt;
  
  
  New: a guided start, for new projects &lt;em&gt;and&lt;/em&gt; inherited ones
&lt;/h2&gt;

&lt;p&gt;The biggest change since the first post is that Senzu now has an opinion about &lt;strong&gt;the order of things&lt;/strong&gt;, and enforces it.&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%2Fh03vmpisthidgv84zu45.png" 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%2Fh03vmpisthidgv84zu45.png" alt="The method: one command per step, and a wall if you skip one"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you open a session, the start hook figures out where you are and tells the agent the next step of the method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Empty or new project:&lt;/strong&gt; &lt;code&gt;/brief&lt;/code&gt; (a plain-language interview: what the business does, what visitors should do, what sites you like), then &lt;code&gt;/propuestas&lt;/code&gt; (two genuinely different mockups you can open in a browser and vote on piece by piece), &lt;code&gt;/design-system&lt;/code&gt;, &lt;code&gt;/plan&lt;/code&gt;, and &lt;code&gt;/siguiente&lt;/code&gt; to execute one task at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing project with code but no sealed conventions:&lt;/strong&gt; &lt;code&gt;/adoptar&lt;/code&gt; first. Before the agent writes a single line, it studies how the project is &lt;em&gt;actually&lt;/em&gt; written and agrees the rules with you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it's not a suggestion. The &lt;code&gt;arranque-guard&lt;/code&gt; hook blocks the first attempt to write code if the missing step hasn't happened. No plan? The agent has to ask you what you're building before it starts.&lt;/p&gt;

&lt;p&gt;The new website has a section for exactly this:&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%2Ff3ycrlelh09ag2m4l3du.png" 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%2Ff3ycrlelh09ag2m4l3du.png" alt="The two paths on the Senzu website"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Each step links to its command page. The descriptions come straight from the Senzu repo at build time, so they never drift.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;code&gt;/adoptar&lt;/code&gt;: the agent writes like your project, not like itself
&lt;/h2&gt;

&lt;p&gt;This is the one I'm proudest of, because it fixes the thing that annoyed me most.&lt;/p&gt;

&lt;p&gt;Drop an agent into a three-year-old Laravel project and it will happily write code in &lt;em&gt;its&lt;/em&gt; style: different naming, a different validation approach, a different folder layout. Every PR becomes a style argument.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/adoptar&lt;/code&gt; (&lt;em&gt;adopt&lt;/em&gt;) reads the real code: naming, structure, how validation is done, how tests are named, what the git history looks like, which language identifiers and comments are in. It proposes the conventions, with a real example from your code for each one. You agree or correct. Then it &lt;strong&gt;seals&lt;/strong&gt; them in &lt;code&gt;senzu/conventions.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From then on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;conventions-guard&lt;/code&gt; hook blocks code that breaks the sealed conventions.&lt;/li&gt;
&lt;li&gt;The agent &lt;strong&gt;can't edit, move or delete&lt;/strong&gt; the sealed file, not with an edit, not from the terminal, not by sneaking it into a commit. In v2.14 I found it could be bypassed if the path came in a different format (&lt;code&gt;C:/&lt;/code&gt; vs &lt;code&gt;/c/&lt;/code&gt;) and fixed it as a security issue.&lt;/li&gt;
&lt;li&gt;The project's convention beats Senzu's own preferences. Always.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  New: declared architecture, enforced by a wall
&lt;/h2&gt;

&lt;p&gt;v2.18 adds something I wanted for a long time. You declare your architecture once: &lt;strong&gt;MVC with services, hexagonal, or DDD&lt;/strong&gt;. There are templates for Laravel, Node and Python. A wall makes the code respect it.&lt;/p&gt;

&lt;p&gt;It checks layers, bounded contexts, controllers that talk to the ORM directly, DTOs and folders. It reads the real import map of your project (PSR-4, &lt;code&gt;tsconfig&lt;/code&gt; aliases, Python modules), so it knows that &lt;code&gt;App\Models\Order&lt;/code&gt; lives in infrastructure.&lt;/p&gt;

&lt;p&gt;Here's what happens when the agent tries to put Eloquent in a controller of a hexagonal project:&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%2F9q31g661xcyk3qjh4zz3.png" 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%2F9q31g661xcyk3qjh4zz3.png" alt="A real wall: the controller can't use infrastructure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And when it tries to import the framework into the domain:&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%2Fglajkd2r7r7282j0mmmm.png" 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%2Fglajkd2r7r7282j0mmmm.png" alt="A real wall: the domain can't import the framework"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Both are real outputs, produced by running the hook against a throwaway Laravel project for this post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Notice the last line of each message: it doesn't just say no, it says &lt;em&gt;where the code should go instead&lt;/em&gt;. That's what turns a wall into something the agent can act on in its next attempt. If you really need an exception, you approve it and it's written down with a reason, right on that line.&lt;/p&gt;
&lt;h2&gt;
  
  
  New: a feature isn't done until the backend says so
&lt;/h2&gt;

&lt;p&gt;v2.17 extended the "no 'done' without proof" rule from the frontend to the backend. The &lt;code&gt;feature-guard&lt;/code&gt; hook won't let the agent close a backend feature if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there's no test for it,&lt;/li&gt;
&lt;li&gt;there's a migration that was never run, or one without a working &lt;code&gt;down&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;a new config key was added but not to &lt;code&gt;.env.example&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And every command now ends by saying what the next step is, so the chain from &lt;code&gt;/brief&lt;/code&gt; to a deployed feature doesn't break in the middle.&lt;/p&gt;

&lt;p&gt;Related: plan cards can't be marked as done without evidence (&lt;code&gt;tarjeta-guard&lt;/code&gt;), and when the agent says it verified something, verifying means real output: lint, types, tests, build, and the mobile check for UI work. v2.19 taught the build verifier more languages (Rust, Ruby, Java, .NET, Deno, Makefiles) and what to do in projects with no manifest at all, instead of asking for a fake verification.&lt;/p&gt;
&lt;h2&gt;
  
  
  New: memory that maintains itself
&lt;/h2&gt;

&lt;p&gt;The first post described the project memory: a short file with the decisions in force (&lt;code&gt;D-012 · We do X because Y · see entry 063&lt;/code&gt;), injected at the start of every session. If the agent wants to contradict a decision, it has to quote it and ask.&lt;/p&gt;

&lt;p&gt;v2.11 made it alive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your corrections are written down automatically.&lt;/strong&gt; When you correct the agent with a rule ("don't do that again", "from now on…"), the &lt;code&gt;memoria-viva&lt;/code&gt; hook notices and makes the agent write it down before going on; if it forgets, it can't close the session. (As mentioned above, it listens for the Spanish phrasing for now; in English, use &lt;code&gt;/recordar&lt;/code&gt;.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User memory&lt;/strong&gt;: rules that apply to all your projects (language, git habits, how you like to be spoken to) live in one file outside any project. That's the &lt;code&gt;/recordar&lt;/code&gt; trick from the language section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-file memory&lt;/strong&gt;: when the agent opens a file that has history ("this file broke twice because of X"), it gets reminded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/retomar&lt;/code&gt;&lt;/strong&gt; (&lt;em&gt;resume&lt;/em&gt;): picks up where the last session left off, with what was done, what's pending and what was decided.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  New: two agents, one repo, no mess
&lt;/h2&gt;

&lt;p&gt;I often have Claude Code and Codex working on the same repository. That used to end badly: one agent committing the other's half-finished files, or finishing its session with a pile of uncommitted changes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean exit&lt;/strong&gt; (&lt;code&gt;cierre-limpio&lt;/code&gt;, v2.10): the agent can't end a session leaving its own files uncommitted, and it can't touch files another agent is working on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protected branches&lt;/strong&gt; (v2.12, refined in v2.19.2): no commits or pushes to &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;develop&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt; or &lt;code&gt;production&lt;/code&gt;. Pushing to your own work branch (&lt;code&gt;feat/…&lt;/code&gt;, &lt;code&gt;fix/…&lt;/code&gt;) is allowed out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Quoting isn't doing"&lt;/strong&gt; (v2.16): walls used to fire when a commit message, a heredoc, an &lt;code&gt;echo&lt;/code&gt;, a &lt;code&gt;grep&lt;/code&gt; or a comment merely &lt;em&gt;mentioned&lt;/em&gt; something forbidden. Now they look at what actually runs. Fewer false positives means fewer reasons to turn a wall off.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  New: install profiles, and it tells you when it's out of date
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Profiles&lt;/strong&gt; (v2.9): instead of "everything or pick one by one", &lt;code&gt;/instalar&lt;/code&gt; offers profiles: web, backend, frontend, AI agent, library. Each one brings the skills, walls and commands that make sense for that kind of project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out-of-date warning&lt;/strong&gt; (v2.15): at the start of a session, if your installed Senzu is older than the latest release, the agent tells you, along with the two or three changes that matter most to you. No changelog reading required.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  New: a website, with docs generated from the repo
&lt;/h2&gt;

&lt;p&gt;Senzu has a home now: &lt;a href="https://getsenzu.vercel.app" rel="noopener noreferrer"&gt;getsenzu.vercel.app&lt;/a&gt;.&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%2Fqrftnpbgcxqxnzonaytx.png" 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%2Fqrftnpbgcxqxnzonaytx.png" alt="The Senzu website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The part I like most is invisible. &lt;strong&gt;The documentation is never written by hand.&lt;/strong&gt; On every build, the site fetches the latest tagged release of the Senzu repo and generates a page per skill, per command and per hook from the real files. The numbers on the home page (skills, hooks, commands, stacks) come from the same place. If a hook is added upstream, it shows up on the next deploy; if a command is removed, its page disappears.&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%2F7nmh1l4nj7rnlnpip6af.png" 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%2F7nmh1l4nj7rnlnpip6af.png" alt="Every hook has its own page, generated from the repo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The site and its docs are in Spanish too. If you're reading in English, your browser's translate button does a good job, and so does the agent itself: ask it "what does the &lt;code&gt;feature-guard&lt;/code&gt; hook do?" and it'll read the docs and answer in English.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to try it
&lt;/h2&gt;

&lt;p&gt;In Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add petersonsenadevs/senzu
/plugin install senzu-all@senzu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Codex, add the same marketplace from the app. Then, inside your project, open a session and type:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It detects the stack, asks what you want (a profile, everything, or à la carte) and sets it up. Then, if you want everything in English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/recordar always answer me in English, and write the devlog and plan in English
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, if the project already has code, start with &lt;code&gt;/adoptar&lt;/code&gt;. If it's a new one, &lt;code&gt;/brief&lt;/code&gt;. The agent will tell you anyway.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/petersonsenadevs/senzu" rel="noopener noreferrer"&gt;github.com/petersonsenadevs/senzu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website and docs: &lt;a href="https://getsenzu.vercel.app" rel="noopener noreferrer"&gt;getsenzu.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The first post, in Spanish: &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b"&gt;Le puse muros a mi agente de IA&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it isn't
&lt;/h2&gt;

&lt;p&gt;It's &lt;strong&gt;opinionated&lt;/strong&gt;. These are my working rules, not everyone's. You can turn walls off per project and change permissions, but only you can: the agent can't switch off its own walls, and that's by design.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;doesn't make the agent stop making mistakes&lt;/strong&gt;. It still makes them. The difference is that now it finds out before I do, and the explanation of what to do instead arrives in the same message.&lt;/p&gt;

&lt;p&gt;And it's &lt;strong&gt;in Spanish&lt;/strong&gt;, which, as it turns out, matters a lot less than I thought. The agent doesn't care. Hopefully you won't either.&lt;/p&gt;

&lt;p&gt;If you try it, tell me which wall you'd add. There's always one I missed.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:19:31 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/-4458</link>
      <guid>https://dev.to/r3v3rs3/-4458</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" class="crayons-story__hidden-navigation-link"&gt;Le puse muros a mi agente de IA (y ahora rompe la web, pero porque se lo pido)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/r3v3rs3" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1249042%2Fe1afca32-f78d-47dd-8926-3c2c75df7c61.jpeg" alt="r3v3rs3 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/r3v3rs3" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peterson Andres Sena Arias
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peterson Andres Sena Arias
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
                
              
              &lt;div id="story-author-preview-content-4791692" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/r3v3rs3" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1249042%2Fe1afca32-f78d-47dd-8926-3c2c75df7c61.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peterson Andres Sena Arias&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" id="article-link-4791692"&gt;
          Le puse muros a mi agente de IA (y ahora rompe la web, pero porque se lo pido)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/spanish"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;spanish&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/claude"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;claude&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/codex"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;codex&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>I got tired of logging in and out of Claude Code, so I built a one-command account switcher</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:25:10 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/i-got-tired-of-logging-in-and-out-of-claude-code-so-i-built-a-one-command-account-switcher-3ea3</link>
      <guid>https://dev.to/r3v3rs3/i-got-tired-of-logging-in-and-out-of-claude-code-so-i-built-a-one-command-account-switcher-3ea3</guid>
      <description>&lt;p&gt;Quick confession: last week I logged out of my work Claude Code account four times in one afternoon. Nothing was broken. I just have a second account for personal projects, and Claude Code can only be logged into one of them at a time.&lt;/p&gt;

&lt;p&gt;Sign in with the personal account and the work one is gone. Sign back in with work and personal is gone. Every switch is a browser tab, an OAuth dance and about forty seconds of my life. Multiply that by "I switch contexts a lot" and you get a genuinely annoying week.&lt;/p&gt;

&lt;p&gt;So I fixed it. The result is &lt;strong&gt;cc-switch&lt;/strong&gt;, and the whole thing is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ccp use personal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;claude&lt;/code&gt; you launch after that runs under the personal account. &lt;code&gt;ccp use work&lt;/code&gt; flips it back. No re-login, no browser, no forty seconds. And &lt;code&gt;ccp list&lt;/code&gt; tells you who is who:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Claude Code profiles
  --------------------
  * default                   alice@company.com
    personal   [shared]       alice@gmail.com
    client-x   [isolated]     alice@client-x.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The trick is a single environment variable
&lt;/h2&gt;

&lt;p&gt;I expected to need something hacky with credential files. I didn't. Claude Code reads an environment variable called &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; and uses it as the root for &lt;em&gt;everything&lt;/em&gt; it stores: credentials, settings, session transcripts, the lot. Point it at a different folder and you get a completely separate identity.&lt;/p&gt;

&lt;p&gt;So a "profile" in cc-switch is literally a directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude-profiles/
  personal/    ← its own login
  client-x/    ← its own login
~/.claude      ← your original account, untouched ("default")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ccp use &amp;lt;name&amp;gt;&lt;/code&gt; sets the variable for the current shell &lt;em&gt;and&lt;/em&gt; persists it for new terminals. &lt;code&gt;ccp run &amp;lt;name&amp;gt;&lt;/code&gt; sets it for a single invocation only, which means two terminals can talk to two different accounts at the same time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# terminal 1&lt;/span&gt;
ccp run work

&lt;span class="c"&gt;# terminal 2&lt;/span&gt;
ccp run personal &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"summarise yesterday's changes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use that far more than I expected to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I lost all my chats
&lt;/h2&gt;

&lt;p&gt;The first version worked great for about ten minutes. Then I opened a project under the personal profile and my conversation history was empty. Of course it was: transcripts live in &lt;code&gt;projects/&lt;/code&gt; inside the config dir, and the new profile had its own brand new, empty one.&lt;/p&gt;

&lt;p&gt;For some setups that's exactly what you want (a clean-room profile for a client). For my day-to-day it was terrible. I wanted the &lt;em&gt;login&lt;/em&gt; separated, not my memory of what I was doing yesterday.&lt;/p&gt;

&lt;p&gt;The fix turned out to be clean. On a &lt;strong&gt;shared&lt;/strong&gt; profile, cc-switch replaces the chat folders (&lt;code&gt;projects/&lt;/code&gt;, &lt;code&gt;sessions/&lt;/code&gt;, &lt;code&gt;plans/&lt;/code&gt;, &lt;code&gt;tasks/&lt;/code&gt;, &lt;code&gt;file-history/&lt;/code&gt;) and &lt;code&gt;history.jsonl&lt;/code&gt; with links back into &lt;code&gt;~/.claude&lt;/code&gt;: NTFS junctions and a hardlink on Windows, plain symlinks on Linux and macOS. Credentials and settings stay per profile, chats are one pool, and &lt;code&gt;claude --resume&lt;/code&gt; shows the same list whichever account you're on.&lt;/p&gt;

&lt;p&gt;If you &lt;em&gt;do&lt;/em&gt; want a walled-off environment, you just say so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccp add client-x &lt;span class="nt"&gt;--isolated&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can flip a profile between the two modes later with &lt;code&gt;ccp link&lt;/code&gt; and &lt;code&gt;ccp unlink&lt;/code&gt;. Nothing gets deleted either way: &lt;code&gt;unlink&lt;/code&gt; gives the profile its own empty folders and leaves the shared history where it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that would have deleted everything
&lt;/h2&gt;

&lt;p&gt;This is the part I actually want people to read, because it's a general Windows/PowerShell gotcha.&lt;/p&gt;

&lt;p&gt;My first &lt;code&gt;ccp remove&lt;/code&gt; was the obvious thing: &lt;code&gt;Remove-Item -Recurse -Force &amp;lt;profile dir&amp;gt;&lt;/code&gt;. On a &lt;em&gt;shared&lt;/em&gt; profile, that directory is full of junctions pointing at &lt;code&gt;~/.claude&lt;/code&gt;. And &lt;code&gt;Remove-Item -Recurse&lt;/code&gt; will happily walk straight through a junction and delete the contents of the target.&lt;/p&gt;

&lt;p&gt;In other words, "remove the test profile" would have wiped my entire real chat history. I only caught it because I was being paranoid in testing: I made a throwaway profile and counted the project folders on both sides before and after. The fix is to delete the links themselves first (&lt;code&gt;DirectoryInfo.Delete()&lt;/code&gt; on a junction removes only the reparse point, not what it points to) and &lt;em&gt;then&lt;/em&gt; recurse into whatever is left. &lt;code&gt;rm -rf&lt;/code&gt; on Linux doesn't follow symlinks, so the bash version was never at risk, but it does the same explicit dance anyway.&lt;/p&gt;

&lt;p&gt;If you write any tool that creates junctions on Windows: test your delete path against a directory you'd be sad to lose. I got lucky. You might not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install it
&lt;/h2&gt;

&lt;p&gt;One line, no clone:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows (PowerShell)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://raw.githubusercontent.com/petersonsenadevs/claude-code-switch/main/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux / macOS&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/petersonsenadevs/claude-code-switch/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ccp add personal          # new profile, shares your chats
ccp login personal        # opens claude: sign in, then /exit
ccp use personal          # you're switched
ccp list                  # every profile, with the email signed in on each
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's plain shell (a PowerShell module and a bash script) with no dependencies and no daemon. It doesn't wrap or patch &lt;code&gt;claude&lt;/code&gt;; it only sets a variable the CLI already respects. Profile names autocomplete with Tab, and &lt;code&gt;ccp update&lt;/code&gt; pulls the latest version when there is one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd love feedback on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS Keychain.&lt;/strong&gt; On macOS, Claude Code keeps its OAuth credentials in the system Keychain rather than in the config dir. Depending on your Claude Code version, that Keychain entry may be shared between profiles. I've built and tested this mainly on Windows and Linux, so if you're on a Mac and &lt;code&gt;ccp list&lt;/code&gt; shows the right account on each profile (or doesn't), I'd really like to hear about it in an issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which folders should be shared?&lt;/strong&gt; I went with the ones that make &lt;code&gt;--resume&lt;/code&gt; behave. &lt;code&gt;settings.json&lt;/code&gt; and MCP configs stay per profile on purpose. Would you share anything else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repo is here: &lt;strong&gt;&lt;a href="https://github.com/petersonsenadevs/claude-code-switch" rel="noopener noreferrer"&gt;github.com/petersonsenadevs/claude-code-switch&lt;/a&gt;&lt;/strong&gt;, MIT licensed. If it saves you the forty seconds, a star helps other people find it.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Le puse muros a mi agente de IA (y ahora rompe la web, pero porque se lo pido)</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:11:59 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b</link>
      <guid>https://dev.to/r3v3rs3/le-puse-muros-a-mi-agente-de-ia-y-ahora-rompe-la-web-pero-porque-se-lo-pido-3i8b</guid>
      <description>&lt;p&gt;Empecé a trabajar mis proyectos con agentes de IA usando Codex, y después llegó Claude Code. Al poco me di cuenta de que, proyecto tras proyecto, le estaba diciendo al agente lo mismo una y otra vez. Que no commitee en &lt;code&gt;main&lt;/code&gt;. Que revise en móvil antes de dar algo por hecho. Que deje escrito qué hizo y por qué. Que antes de diseñar decida la paleta y la tipografía, no a mitad de un componente.&lt;/p&gt;

&lt;p&gt;A eso se sumaban las librerías y las skills de otros que iba encontrando: una muy buena para diseñar interfaces, otra para animar con GSAP, otra para 3D… Cada una funcionaba bien por su cuenta, pero no se conocían entre ellas. Yo era el pegamento, copiando y pegando instrucciones de un proyecto a otro.&lt;/p&gt;

&lt;p&gt;Así que decidí juntarlo todo en un recopilatorio en el que las piezas se ayudaran entre sí. Lo llamé &lt;em&gt;dev-standards&lt;/em&gt;, porque era literalmente eso: mis estándares de trabajo. Hoy se llama &lt;strong&gt;Senzu&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Y por el camino me siguieron pasando cosas como estas, todas en la misma semana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prettier, con su configuración por defecto, le metió &lt;strong&gt;204 punto y coma&lt;/strong&gt; a un archivo de un proyecto que no los usa. El agente lo dio por bueno.&lt;/li&gt;
&lt;li&gt;El instalador de mis propias normas vació el &lt;code&gt;.mcp.json&lt;/code&gt; de un proyecto Laravel y se llevó por delante un servidor MCP que estaba configurado.&lt;/li&gt;
&lt;li&gt;El agente me dijo que había verificado la web en móvil. Las capturas existían, sí: en una carpeta temporal que yo nunca iba a abrir.&lt;/li&gt;
&lt;li&gt;Un loader y una barra de carga «centrados». A ojo lo estaban. Midiendo, no.&lt;/li&gt;
&lt;li&gt;Y mi favorita: yo daba por hecho que Codex no ejecutaba hooks. Sí los ejecuta. Lo que pasaba es que mis hooks no entendían cómo Codex describe una edición, así que dejaban pasar todo sin decir nada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ninguna de estas cosas es grave por separado. Juntas, son la diferencia entre fiarte del agente y tener que revisarle cada línea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las reglas en un CLAUDE.md son sugerencias
&lt;/h2&gt;

&lt;p&gt;Ahí está el problema de fondo. Puedes escribir en el &lt;code&gt;CLAUDE.md&lt;/code&gt; o en el &lt;code&gt;AGENTS.md&lt;/code&gt; que no se commitea en &lt;code&gt;main&lt;/code&gt;, que se verifica en móvil antes de cerrar una tarea o que no se toca el &lt;code&gt;.env&lt;/code&gt;. El agente lo lee. Y casi siempre lo cumple.&lt;/p&gt;

&lt;p&gt;«Casi siempre» no vale cuando es un proyecto de verdad.&lt;/p&gt;

&lt;p&gt;Por eso el recopilatorio no se quedó en un montón de instrucciones: lo que podía ejecutarse, lo convertí en algo que se ejecuta, no que se lee. Y el nombre: si viste Dragon Ball de pequeño, ya sabes por qué Senzu. Una semilla y el proyecto se recupera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es Senzu
&lt;/h2&gt;

&lt;p&gt;Un paquete para Claude Code y Codex, en castellano, con tres piezas que trabajan juntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: las mías y las de otros proyectos (con su autor y su licencia), con una capa en castellano encima. El agente carga solo la que toca: diseño de interfaz, calidad de código, DDD, animación, despliegue… Un enrutador decide cuál leer según lo que pides y en qué orden: primero se decide el diseño y después se elige el efecto, no al revés. Así no se llena el contexto de cosas que no vienen al caso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Muros&lt;/strong&gt; (hooks): no aconsejan, bloquean. Si el agente intenta algo que no debe, la acción no se ejecuta y le explican por qué.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comandos&lt;/strong&gt;: &lt;code&gt;/plan&lt;/code&gt;, &lt;code&gt;/verificar&lt;/code&gt;, &lt;code&gt;/brief&lt;/code&gt;, &lt;code&gt;/propuestas&lt;/code&gt;… atajos para flujos que repito en todos los proyectos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así se ve un muro cuando salta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[BLOQUEADO por Senzu] No se commitea en 'main'. Crea una rama
(git switch -c feat/...) y commitea ahí.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hace unos días bloqueó al propio agente que me estaba ayudando a sacar la última versión de Senzu, cuando intentó commitear donde no debía. Ahí es cuando sabes que funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los muros que más me han salvado
&lt;/h2&gt;

&lt;p&gt;Son dieciséis, pero hay unos cuantos que se ganan el sueldo cada semana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;guard&lt;/code&gt;&lt;/strong&gt;: nada de &lt;code&gt;git push&lt;/code&gt; sin que yo lo apruebe en ese momento, nada de &lt;code&gt;rm -rf&lt;/code&gt;, de borrar la base de datos ni de desplegar a producción por las buenas. Para saltárselo hace falta una variable explícita y mi aprobación, y la norma es dejarlo apuntado en el devlog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;secrets-guard&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;protect-files&lt;/code&gt;&lt;/strong&gt;: el agente no escribe claves reales en el código (las de AWS, Stripe, OpenAI… se reconocen por su forma) ni toca el &lt;code&gt;.env&lt;/code&gt;, las migraciones ya aplicadas o los archivos que se generan solos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;stop-guard&lt;/code&gt;&lt;/strong&gt;: este es mi favorito. El agente no puede dar la tarea por terminada si editó código y no pasó el build, el lint y los tests, si tocó la interfaz y no la verificó en móvil, o si no dejó escrito el devlog del día. Se acabó el «ya está» sin pruebas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;backend-guard&lt;/code&gt;&lt;/strong&gt;: bloquea migraciones que borran o renombran columnas de golpe (primero se añade lo nuevo y luego se quita lo viejo) y datos personales escritos en los logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;code-hygiene&lt;/code&gt;&lt;/strong&gt;: fuera los &lt;code&gt;console.log&lt;/code&gt;, los &lt;code&gt;dd()&lt;/code&gt; y los &lt;code&gt;.only&lt;/code&gt; olvidados en los tests. Y algo más, que cuento en el diseño.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;conventions-guard&lt;/code&gt;&lt;/strong&gt;: en un proyecto que ya existe, &lt;code&gt;/adoptar&lt;/code&gt; analiza cómo está escrito de verdad, lo pactamos y lo sella. A partir de ahí, el código que se salga de esas reglas no entra. Manda la convención del proyecto, no la del agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y uno que no bloquea pero que agradezco cada día: el formateo al guardar &lt;strong&gt;no impone estilo&lt;/strong&gt;. Si el proyecto no tiene configuración del formateador, no formatea, y si al formatear cambian más líneas de las que tocó el agente, lo deshace y avisa. Lo de los 204 punto y coma no ha vuelto a pasar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las skills que más uso
&lt;/h2&gt;

&lt;p&gt;Son más de cuarenta, pero el agente casi nunca carga más de una o dos por tarea. Las que más trabajan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ui-ux-pro-max&lt;/strong&gt; (&lt;a href="https://github.com/nextlevelbuilder/ui-ux-pro-max-skill" rel="noopener noreferrer"&gt;de Next Level Builder&lt;/a&gt;): la puerta de entrada de todo lo visual. Antes de escribir una línea de interfaz decide estilo, paleta, tipografía y patrón según el negocio y el stack, y lo deja guardado en un design system del proyecto. Encima lleva mi capa: perfiles para Laravel con Inertia, Next, Astro y Vue, y las guías de diseño que cuento más abajo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;front-activation&lt;/strong&gt;: el catálogo de efectos. Más de noventa, cada uno con su receta por stack, su versión para «reducir movimiento» y su coste en móvil. Pides «un marquee de logos» y el agente abre solo esa receta, no un manual entero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;code-quality&lt;/strong&gt;: buenas prácticas por lenguaje y un &lt;code&gt;verify-build&lt;/code&gt; que entiende monorepos y lanza el lint, los tipos, los tests y el build de lo que has tocado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;project-planner&lt;/strong&gt;: &lt;code&gt;/plan&lt;/code&gt; convierte una feature en fases y tareas pequeñas, cada una con la skill que toca y cómo se verifica. Luego &lt;code&gt;/siguiente&lt;/code&gt; va una por una.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;backend-audit&lt;/strong&gt;: audita el backend con herramientas de verdad, y cada hallazgo lleva su prueba: la salida del comando, el archivo y la línea, o un test que falla. Nada de «podría mejorarse la arquitectura».&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para animación y 3D (GSAP, Three.js, React Three Fiber…) uso las de &lt;a href="https://github.com/freshtechbro/claudedesignskills" rel="noopener noreferrer"&gt;Claude Design Skills&lt;/a&gt;, también con su capa en castellano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memoria que no depende de que el agente se acuerde
&lt;/h2&gt;

&lt;p&gt;Cada proyecto tiene un devlog (qué se hizo, por qué y cómo se verificó) y un archivo de memoria corto con las decisiones vigentes: &lt;code&gt;D-012 · Esto se decidió así · ver entrada 063&lt;/code&gt;. Un hook lo inyecta al empezar cada sesión. Si el agente va a contradecir una decisión, tiene que citarla y preguntarme.&lt;/p&gt;

&lt;p&gt;Para lo que no está en la memoria hay un buscador sobre el devlog que entiende raíces, erratas y sinónimos. Parece poca cosa. Es la diferencia entre explicar dos veces por qué no usamos tal librería o no tener que explicarlo nunca más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo diseña
&lt;/h2&gt;

&lt;p&gt;Aquí es donde más se nota que las piezas se conocen entre ellas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Primero pregunta.&lt;/strong&gt; Si no hay brief ni design system, el primer intento de tocar la interfaz se bloquea. El agente tiene que preguntar antes: qué hace el negocio, qué tiene que hacer el visitante, si hay marca, y dos o tres webs que te gusten. La entrevista va en lenguaje llano (&lt;code&gt;/brief&lt;/code&gt;), sin palabras como «hero» o «CTA», porque no todo el mundo habla así.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Estructura antes que estética.&lt;/strong&gt; Con eso escribe un blueprint: las secciones de la página con texto real y, en cada una, qué cambia en móvil. Hasta que no lo apruebas, no se diseña nada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dos maquetas que se pueden abrir.&lt;/strong&gt; &lt;code&gt;/propuestas&lt;/code&gt; genera dos direcciones opuestas de verdad, en HTML que se abre con doble clic. Cada decisión lleva una etiqueta (&lt;code&gt;A·T1&lt;/code&gt; es la tipografía de la maqueta A, &lt;code&gt;B·B2&lt;/code&gt; los botones de la B…) y un panel «Tu opinión» para votar Sí o No pieza a pieza y copiarlo al chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Rondas.&lt;/strong&gt; &lt;code&gt;/ronda&lt;/code&gt; hace la siguiente: lo que te gustó queda fijado en todas las maquetas, lo que no te gustó desaparece y cada maqueta trae algo nuevo. Un verificador comprueba antes de enseñártela que se ha respetado todo eso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Los vetos se cumplen.&lt;/strong&gt; Lo que dices que no te gusta va a un archivo &lt;code&gt;gustos.md&lt;/code&gt;. Y aquí vuelve &lt;code&gt;code-hygiene&lt;/code&gt;: si vetaste un color o un carrusel, el agente no puede volver a escribirlo. Lo mismo con una lista negra de cosas que delatan una web hecha con IA, como los badges de «disponible», las secciones numeradas «01 / 02 / 03», el «trusted by» con logos en gris o las métricas inventadas. Están bloqueadas por defecto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Construye sección a sección&lt;/strong&gt;, enseñando cada una antes de pasar a la siguiente. Y cuando el logo ya está elegido, sus archivos finales quedan protegidos y el agente no se pone a hacer bocetos que nadie le ha pedido.&lt;/p&gt;

&lt;p&gt;Y al final, verifica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verificar es medir, no mirar
&lt;/h2&gt;

&lt;p&gt;Esta parte nació del loader descentrado. «Debería verse bien» no es verificar, así que el verificador de interfaz ahora &lt;strong&gt;mide en píxeles&lt;/strong&gt;: si algo que su contenedor centra está a 4 px del centro, te lo dice, con la causa probable (un &lt;code&gt;margin-left: 8px&lt;/code&gt; que sobraba, por ejemplo).&lt;/p&gt;

&lt;p&gt;Lo calibré contra webs reales para que no fuera una máquina de falsos positivos. Empezó dando entre 33 y 41 avisos por página y lo dejé en 0-2. De paso encontró algo de verdad: en vuejs.org, un icono de play que está 3 px descentrado dentro de su propio SVG.&lt;/p&gt;

&lt;p&gt;En móvil hace lo que yo hacía a mano: &lt;strong&gt;abre el menú de verdad&lt;/strong&gt;. Lo pulsa, mide si los enlaces se pueden tocar con el dedo, prueba que se cierra con Escape y te deja una captura con cada aviso numerado encima de su elemento. La cifra y la imagen, juntas.&lt;/p&gt;

&lt;h2&gt;
  
  
  La parte divertida
&lt;/h2&gt;

&lt;p&gt;No todo son muros. Senzu también trae un catálogo de efectos con recetas por stack (Astro, Next, Vue con Inertia), y hace poco le pedí algo concreto: que la web se viera normal y de repente &lt;strong&gt;se partiera como un cristal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu2gdgm67k47lt4zekmu8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu2gdgm67k47lt4zekmu8.gif" alt="La web se rompe en trozos que son la propia página"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;La demo, a media velocidad para que se vea algo: en tiempo real dura menos de un segundo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lo que se rompe es la propia página, no una imagen encima. Cada trozo es una copia del DOM recortada con &lt;code&gt;clip-path&lt;/code&gt; a la forma del cristal. Por eso se lee el texto real, nítido, mientras cae girando en 3D. Sin capturas de pantalla y sin librerías.&lt;/p&gt;

&lt;p&gt;Y con reglas, porque un efecto así puede acabar siendo un circo: una vez y con intención, se salta con Escape, quien tiene activado «reducir movimiento» solo ve un fundido, y al terminar no queda nada en el DOM. Tiene sus pruebas automáticas en un navegador real, como todo lo demás.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo probarlo
&lt;/h2&gt;

&lt;p&gt;En Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add petersonsenadevs/senzu
/plugin install senzu-all@senzu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En Codex se añade el mismo marketplace desde la app. Luego, en tu proyecto, abre una sesión y escribe &lt;code&gt;/instalar&lt;/code&gt;: detecta el stack, te pregunta qué quieres (todo, por categorías o a medida) y lo deja listo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repositorio: &lt;a href="https://github.com/petersonsenadevs/senzu" rel="noopener noreferrer"&gt;github.com/petersonsenadevs/senzu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentación: &lt;a href="https://getsenzu.vercel.app" rel="noopener noreferrer"&gt;getsenzu.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que no es
&lt;/h2&gt;

&lt;p&gt;Es &lt;strong&gt;opinado&lt;/strong&gt;: son mis normas de trabajo, no las de todo el mundo. Lo puedes adaptar (los muros se apagan por proyecto y los permisos se cambian), pero parte de cómo trabajo yo.&lt;/p&gt;

&lt;p&gt;Está &lt;strong&gt;en castellano&lt;/strong&gt;, a propósito. Hay muchísimo para agentes en inglés y casi nada pensado para quien trabaja en español.&lt;/p&gt;

&lt;p&gt;Y no hace que el agente deje de equivocarse. Se sigue equivocando. La diferencia es que ahora se entera antes que yo.&lt;/p&gt;

&lt;p&gt;Es MIT. Usa skills de otros proyectos, cada una con su autor y su licencia en &lt;code&gt;CREDITOS.md&lt;/code&gt;. Cada semana comprueba si esos proyectos han cambiado y me abre un PR para revisarlo.&lt;/p&gt;

&lt;p&gt;Si lo pruebas, me encantará saber qué muro le pondrías tú a tu agente. Seguro que hay alguno que se me ha escapado.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>ai</category>
      <category>claude</category>
      <category>codex</category>
    </item>
    <item>
      <title>Laravel SwaggenerAI: Generate Swagger Documentation with AI in Seconds</title>
      <dc:creator>Peterson Andres Sena Arias</dc:creator>
      <pubDate>Tue, 03 Jun 2025 06:20:47 +0000</pubDate>
      <link>https://dev.to/r3v3rs3/laravel-swaggenerai-generate-swagger-documentation-with-ai-in-seconds-2feg</link>
      <guid>https://dev.to/r3v3rs3/laravel-swaggenerai-generate-swagger-documentation-with-ai-in-seconds-2feg</guid>
      <description>&lt;p&gt;Tired of writing Swagger documentation manually for your Laravel APIs? Meet &lt;strong&gt;Laravel SwaggenerAI&lt;/strong&gt;, a VS Code extension that uses artificial intelligence to automatically generate complete OpenAPI/Swagger documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multiple AI Providers
&lt;/h3&gt;

&lt;p&gt;The extension supports the best AI models on the market:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; (&lt;code&gt;gemini-2.0-flash&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI GPT-4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Claude&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Smart Generation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automatic controller detection
&lt;/li&gt;
&lt;li&gt;Routes and request analysis
&lt;/li&gt;
&lt;li&gt;Intelligent caching for faster performance &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Complete Customization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flexible AI provider selection &lt;/li&gt;
&lt;li&gt;Simple API key configuration
&lt;/li&gt;
&lt;li&gt;Multiple formatting options
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;The extension uses an &lt;strong&gt;abstraction system&lt;/strong&gt; that allows working with different AI providers uniformly. Each provider implements the same interface, ensuring consistency in documentation generation.&lt;/p&gt;

&lt;p&gt;The process is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes your Laravel controllers
&lt;/li&gt;
&lt;li&gt;Automatically detects routes and methods
&lt;/li&gt;
&lt;li&gt;Generates optimized prompts for each AI provider
&lt;/li&gt;
&lt;li&gt;Produces ready-to-use Swagger/OpenAPI annotations
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Installation and Usage
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Install from VS Code Marketplace
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Search: "Laravel SwaggenerAI"&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fp4pjtjq2gmrty4s4g1t6.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fp4pjtjq2gmrty4s4g1t6.png" alt=" " width="579" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the extension&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fgk158uvh6j58aeulmzoq.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fgk158uvh6j58aeulmzoq.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure your preferred AI provider and API key&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fohqr8bv8ils64rrhygbj.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fohqr8bv8ils64rrhygbj.png" alt=" " width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate documentation with one click!&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Ftmdnd2830xzp7zfu7znu.png" 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.amazonaws.com%2Fuploads%2Farticles%2Ftmdnd2830xzp7zfu7znu.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimized Performance
&lt;/h3&gt;

&lt;p&gt;The extension includes an intelligent cache system that avoids regenerating documentation unnecessarily, significantly improving response times in large projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Laravel SwaggenerAI?
&lt;/h3&gt;

&lt;p&gt;Save Time: What used to take hours, now takes minutes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Consistency: Uniform documentation across your entire project&lt;/li&gt;
&lt;li&gt;Flexibility: Choose the AI model that best fits your needs&lt;/li&gt;
&lt;li&gt;Free: Available on VS Code Marketplace&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Useful Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📦 VS Code Marketplace
&lt;a href="https://marketplace.visualstudio.com/items?itemName=PESEDevs.laravel-swaggenerai" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📚 Complete Documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="[Marketplace](https://marketplace.visualstudio.com/items?itemName=PESEDevs.laravel-swaggenerai)"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;☕ Support the Project&lt;br&gt;
If you find this extension useful, consider:&lt;br&gt;
⭐ Starring it on GitHub&lt;br&gt;
&lt;a href="https://buymeacoffee.com/petersonsena" rel="noopener noreferrer"&gt;Buy me a coffee &lt;/a&gt;&lt;br&gt;
📣 Sharing it with other developers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>documentation</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
