<?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: supreet singh</title>
    <description>The latest articles on DEV Community by supreet singh (@supreet_s).</description>
    <link>https://dev.to/supreet_s</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1208051%2Fc8c6141a-71df-4a21-aed7-0dbbde368977.jpg</url>
      <title>DEV Community: supreet singh</title>
      <link>https://dev.to/supreet_s</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/supreet_s"/>
    <language>en</language>
    <item>
      <title>Built (almost) a structured Lobster pipeline on OpenClaw to solve AI non-determinism</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Sat, 04 Apr 2026 22:23:03 +0000</pubDate>
      <link>https://dev.to/supreet_s/built-almost-a-structured-lobster-pipeline-on-openclaw-to-solve-ai-non-determinism-3c5j</link>
      <guid>https://dev.to/supreet_s/built-almost-a-structured-lobster-pipeline-on-openclaw-to-solve-ai-non-determinism-3c5j</guid>
      <description>&lt;p&gt;&lt;em&gt;If you've been following &lt;a href="https://dev.to/supreet_s/building-memspren-a-claude-skill-as-a-second-brain-v1-architecture-deep-dive-2p7o"&gt;the MemSpren series&lt;/a&gt;, you know the core thesis: AI agents don't execute reliably because we ask them to do too much at once. For months, I've argued that the solution to non-determinism is moving orchestration out of the LLM's "vibes" and into a structured code pipeline.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is the story of what happened when I actually tried to do that, and why it convinces me that the "AI will replace humans" narrative is fundamentally hollow.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack: OpenClaw + Lobster
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt; is the AI agent platform I'm building MemSpren on. &lt;a href="https://github.com/openclaw/lobster" rel="noopener noreferrer"&gt;Lobster&lt;/a&gt; is its workflow engine. The pitch is elegantly simple: define your steps in YAML, pass data between them as JSON, and let the pipeline handle the sequencing.&lt;/p&gt;

&lt;p&gt;The division of labor is clear:&lt;/p&gt;

&lt;p&gt;The LLM does what LLMs are good at: generating, analyzing, and transforming text.&lt;/p&gt;

&lt;p&gt;Lobster does what code is good at: sequencing, retrying, and routing.&lt;/p&gt;

&lt;p&gt;In theory, this eliminates the "hallucinated loop" where an agent gets stuck in a logic trap. But my use case is more than a three-step "Hello World." It involves multi-stage extraction, transformation, and writing, with structured JSON outputs at every turn. That complexity is where the friction lived.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Myth of the "Easy" Integration
&lt;/h2&gt;

&lt;p&gt;There is a massive amount of FOMO right now, especially among non-technical people, to integrate AI into every facet of their workflow. Big AI companies would have you believe this is a "plug and play" evolution.&lt;/p&gt;

&lt;p&gt;My experience over the last week suggests the opposite. While standard, linear workflows are becoming easier to automate, the moment you attempt something creative or non-standard, the difficulty spikes exponentially. If you aren't prepared to spend hours debugging silent failures and observational mishaps, you won't get a "seamless" integration; you'll get a broken system.&lt;/p&gt;

&lt;h2&gt;
  
  
  When "Explicit Trust" Becomes a Wall
&lt;/h2&gt;

&lt;p&gt;Throughout March 2026, OpenClaw tightened its permissions model. The releases around v2026.3.31 and v2026.4.1 hit me hard.&lt;/p&gt;

&lt;p&gt;The update moved from implicit trust to explicit permissioning across exec, gateway auth, and node permissions. Even after I granted "Full Power" in the config, the system kept prompting for manual approval on every tool invocation. For a pipeline designed to run autonomously, this was a death sentence.&lt;/p&gt;

&lt;p&gt;I spent hours diving through release notes and toggling flags. Eventually, I made a choice that every developer recognizes: I rolled back. I needed to execute, not audit. But that rollback triggered a cascade of secondary failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lobster Installation Workflow
&lt;/h2&gt;

&lt;p&gt;The entire installation of Lobster is quite a workflow in itself. You have to install it as a plugin, you have to enable it, and you also need to install it at the global level individually for it to work. If you miss any of these steps or if it is somehow not connected to your main agent, it will simply not work.&lt;/p&gt;

&lt;p&gt;I missed some of these instructions initially when I was reading the documentation. It took me a significant amount of time to figure out why Lobster was unable to execute from within OpenClaw as a subprocess, even though I was able to run the entire workflow directly from the terminal command line. When OpenClaw invokes Lobster, it launches the CLI in "tool mode" and expects to parse a JSON envelope from stdout. If the binary is not in the global PATH, the gateway fails silently. There are no logs in the UI and no error message in the console, just a "Step Failed" status and a void where the data should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Character Limits: The Silent Killer
&lt;/h2&gt;

&lt;p&gt;This was the most painful bug to squash. I use llm-task directives to force the LLM into returning structured JSON. I had set a maxLength of 3,000 characters on the content field in my schema, and I had reinforced this as a critical requirement within the prompt itself.&lt;/p&gt;

&lt;p&gt;The LLM, as LLMs do, ignored both the schema constraint and the explicit prompt instruction, generating 3,200 characters.&lt;/p&gt;

&lt;p&gt;The LLM, as LLMs do, ignored the constraint and generated 3,200 characters.&lt;/p&gt;

&lt;p&gt;The result? A generic 500 Internal Server Error. No partial content was returned, and there was no UI indication that the failure was a schema mismatch. I eventually found the culprit by tailing the gateway log at &lt;code&gt;/tmp&lt;/code&gt;, filtering through the 1,440 "heartbeat" lines the gateway generates every day. Tucked away in the noise was the smoking gun:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LLM JSON did not match schema: /content must NOT have more than 3000 characters&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Anthropic Squeeze
&lt;/h2&gt;

&lt;p&gt;Today, April 4, 2026, Anthropic officially ended Claude subscription support for third-party tools like OpenClaw.&lt;/p&gt;

&lt;p&gt;For months, I've been running Opus and Sonnet through my flat-rate subscription. Now, it's pay-as-you-go or bust. I'm currently experimenting with KIMI K2.5 and OpenAI Codex. My concern isn't just price; it's reliability. Claude has been the gold standard for following complex JSON schemas. If the model layer gets flakier while I'm still fighting for determinism at the orchestration layer, I'm fighting a war on two fronts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Frontier: Why AI Won't Replace You (Yet)
&lt;/h2&gt;

&lt;p&gt;The pipeline finally runs. But reaching this point required a level of patience and technical forensic work that most people simply don't have the time or interest to perform.&lt;/p&gt;

&lt;p&gt;This leads me to a few firm conclusions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI isn't autonomous: it's high-maintenance.&lt;/strong&gt; The "autonomy" of these agents is an illusion that shatters the moment you step off the well-trodden path of documented examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Replacement" Narrative is Wrong.&lt;/strong&gt; Anyone who says AI is going to replace humans has no idea what is coming at them. The complexity of making these systems actually work, not just demo well, is staggering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Rise of the AI Specialist.&lt;/strong&gt; I believe we are about to see a massive surge in AI-related jobs. These are not "prompt engineers," but people who can resolve the silent failures, navigate the learning cycles, and bridge the gap between creative intent and deterministic execution.&lt;/p&gt;

&lt;p&gt;People want to do what they are good at. They don't want to tail &lt;code&gt;/tmp&lt;/code&gt; logs for four hours to find a schema mismatch. As long as AI remains this "tricky," there will be a massive market for humans who can tame it.&lt;/p&gt;

&lt;p&gt;The core thesis of the MemSpren series still holds: tighter scopes and more governance is the only way forward. But I've learned that governance is a human job.&lt;/p&gt;

&lt;p&gt;The fight for reliability continues.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you want the personal and philosophical context behind MemSpren, I write about that on &lt;a href="https://innerodyssey.substack.com" rel="noopener noreferrer"&gt;Odyssey (Substack)&lt;/a&gt;. For the technical deep dives, &lt;a href="https://dev.to/supreet_s"&gt;follow me on dev.to&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloudskills</category>
      <category>ai</category>
      <category>secondbrain</category>
    </item>
    <item>
      <title>I Wrote the Rules. My Agent Read Them. Then Did Whatever It Wanted.</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Tue, 24 Mar 2026 11:58:23 +0000</pubDate>
      <link>https://dev.to/supreet_s/i-wrote-the-rules-my-agent-read-them-then-did-whatever-it-wanted-1mc4</link>
      <guid>https://dev.to/supreet_s/i-wrote-the-rules-my-agent-read-them-then-did-whatever-it-wanted-1mc4</guid>
      <description>&lt;p&gt;&lt;em&gt;If you've been following the &lt;a href="https://memspren.io/" rel="noopener noreferrer"&gt;MemSpren project&lt;/a&gt;, you know I've been building an agentic second brain that runs on Obsidian. This article is about a problem that's followed me across every interface I've tried to run it through, and the governance experiments I've been running to fight it.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happened This Morning
&lt;/h2&gt;

&lt;p&gt;I spent today integrating Telegram with Claude Code so that &lt;a href="https://memspren.io/" rel="noopener noreferrer"&gt;MemSpren&lt;/a&gt; can run through a Telegram bot interface natively, the same daily-driver flow I've had working with my existing OpenClaw setup for months. End-to-end, the loop works now. Telegram message, Claude Code, MemSpren skill, vault write. But getting there produced a friction log worth documenting, because the real problem showed up after setup was done, not during it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup Friction
&lt;/h2&gt;

&lt;p&gt;Most of what went wrong today came down to one thing: Bun wasn't installed. Bun is the runtime for the Telegram MCP server, and without it the MCP server silently fails. Claude Code reported "MCP failing" with no useful error message pointing at Bun specifically. I spent time ruling out other things before landing there.&lt;/p&gt;

&lt;p&gt;There were two other genuine friction points worth knowing about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command naming mismatch.&lt;/strong&gt; The docs say &lt;code&gt;/telegram:configure&lt;/code&gt;. The actual installed command is &lt;code&gt;/configure&lt;/code&gt;. No error, just silence. I found the real command by inspection. Docs and reality diverged somewhere, and the only way to find out was trial and error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;--channels&lt;/code&gt; flag isn't surfaced by Claude Code.&lt;/strong&gt; The bot never responded to DMs because I didn't launch Claude Code with &lt;code&gt;--channels plugin:telegram@claude-plugins-official&lt;/code&gt;. The flag is documented, but I was following Claude Code's own setup guidance, not the README, and Claude Code didn't mention it. The plugin looks loaded, token saved, skills visible, and nothing tells you the MCP server that actually listens for incoming messages only starts when you pass that flag at launch. That's the kind of thing that costs an afternoon.&lt;/p&gt;

&lt;p&gt;One more thing that isn't a setup issue but is genuinely annoying: Claude Code asks for permission on every vault write. In a daily check-in flow with five or ten writes per session, that's not a workflow. Fix is &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; for the vault directory, or adding the path to &lt;code&gt;~/.claude/settings.json&lt;/code&gt; trusted paths.&lt;/p&gt;

&lt;p&gt;All of that is solvable. That's not the hard problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hard Problem
&lt;/h2&gt;

&lt;p&gt;After setup was done, I gave the skill a small update to process. It responded conversationally. It didn't create the vault entry. The sync buffer protocol, explicit, written, right there in the skill file, wasn't followed until I told it to follow it explicitly.&lt;/p&gt;

&lt;p&gt;This is the failure pattern I've been trying to solve since I started building MemSpren in OpenClaw, and now it's showing up in Claude Code on day one. The skill reads the protocol correctly when invoked directly. It doesn't apply it proactively on every trigger. The methodology is sound. The execution is inconsistent.&lt;/p&gt;

&lt;p&gt;That inconsistency is what I mean by non-determinism. Not random hallucination, not broken code. An instruction set the agent acknowledges understanding but doesn't always execute.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I've Tried in OpenClaw
&lt;/h2&gt;

&lt;p&gt;I've been running MemSpren through OpenClaw long enough to have a proper history with this problem. The governance stack I've built up over time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cron-based synchronization.&lt;/strong&gt; Regular scheduled syncs that run regardless of what the agent did or didn't do in the session. This catches drift. If the agent missed a write, the cron job surfaces the gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redundant state comparison.&lt;/strong&gt; Maintaining state in two places so that discrepancies can be detected. If what's in the vault doesn't match what should be in the vault based on the session log, something was missed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archive-on-edit, never-delete invariant.&lt;/strong&gt; Every vault file edit goes through a process that archives the prior version and commits to git before the new version lands. This is enforced as a CRITICAL statement in the skill file. The agent cannot delete, it can only archive. The git history is the audit trail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End-of-day commit review.&lt;/strong&gt; A separate process that runs at day's end and validates that everything committed was committed correctly. No truncated writes, no orphaned files, no missing frontmatter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocol-level redundancy.&lt;/strong&gt; Checks on checks. If a write protocol is supposed to run, there's a verification step that runs after it to confirm it ran. Not foolproof, the verification step itself can be skipped, but it reduces the blast radius.&lt;/p&gt;

&lt;p&gt;All of this has helped. None of it has solved the problem. The agent still occasionally skips protocol steps that are clearly documented. The cron scripts catch the misses, but they're reactive, not preventive. I'm managing the consequences of non-determinism rather than eliminating it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Others Are Doing
&lt;/h2&gt;

&lt;p&gt;This isn't a MemSpren-specific problem. Brian Scanlan at Intercom shared a &lt;a href="https://x.com/brian_scanlan/status/2033978300003987527" rel="noopener noreferrer"&gt;Twitter thread&lt;/a&gt; on how they approached non-determinism in their AI workflows at production scale. The core of their approach: strict governance layers that wrap every agent action, not relying on the model to follow instructions correctly, but enforcing correct behaviour structurally through the system around the model.&lt;/p&gt;

&lt;p&gt;That framing is more honest than most of what gets written about agents. The model is unreliable by nature, so reliability has to come from the architecture. You can't prompt your way to determinism.&lt;/p&gt;

&lt;p&gt;I haven't built that. My governance stack is additive and external. What I'm thinking about is whether micro skills, small, single-purpose skill files that each govern one specific behaviour, could be a better model than one large SKILL.md that the agent has to follow end to end. Narrower scope, less instruction for the model to hold in working context, more targeted verification. I haven't tested this yet. It's the experiment I'm setting up now.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;MemSpren is an open-source AI second brain skill built on Obsidian and Claude. You can find the project at &lt;a href="https://memspren.io" rel="noopener noreferrer"&gt;memspren.io&lt;/a&gt;. The architecture is documented in &lt;a href="https://dev.to/supreet_s/building-memspren-a-claude-skill-as-a-second-brain-v1-architecture-deep-dive-2p7o"&gt;Building MemSpren: A Claude Skill as a Second Brain — V1 Architecture Deep Dive&lt;/a&gt;. This article continues the evolution started in &lt;a href="https://dev.to/supreet_s/teaching-an-ai-skill-to-learn-from-its-own-mistakes-2aij"&gt;Teaching an AI Skill to Learn from Its Own Mistakes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow me on &lt;a href="https://dev.to/supreet_s"&gt;dev.to&lt;/a&gt; for technical updates, or on &lt;a href="https://innerodyssey.substack.com" rel="noopener noreferrer"&gt;Substack&lt;/a&gt; for the thinking behind the building.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloudskills</category>
      <category>ai</category>
      <category>secondbrain</category>
    </item>
    <item>
      <title>I Wrote the Rules. My Agent Read Them. Then Did Whatever It Wanted.</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Tue, 24 Mar 2026 11:58:23 +0000</pubDate>
      <link>https://dev.to/supreet_s/i-wrote-the-rules-my-agent-read-them-then-did-whatever-it-wanted-3jpn</link>
      <guid>https://dev.to/supreet_s/i-wrote-the-rules-my-agent-read-them-then-did-whatever-it-wanted-3jpn</guid>
      <description>&lt;p&gt;&lt;em&gt;If you've been following the &lt;a href="https://memspren.io/" rel="noopener noreferrer"&gt;MemSpren project&lt;/a&gt;, you know I've been building an agentic second brain that runs on Obsidian. This article is about a problem that's followed me across every interface I've tried to run it through, and the governance experiments I've been running to fight it.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happened This Morning
&lt;/h2&gt;

&lt;p&gt;I spent today integrating Telegram with Claude Code so that &lt;a href="https://memspren.io/" rel="noopener noreferrer"&gt;MemSpren&lt;/a&gt; can run through a Telegram bot interface natively, the same daily-driver flow I've had working with my existing OpenClaw setup for months. End-to-end, the loop works now. Telegram message, Claude Code, MemSpren skill, vault write. But getting there produced a friction log worth documenting, because the real problem showed up after setup was done, not during it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup Friction
&lt;/h2&gt;

&lt;p&gt;Most of what went wrong today came down to one thing: Bun wasn't installed. Bun is the runtime for the Telegram MCP server, and without it the MCP server silently fails. Claude Code reported "MCP failing" with no useful error message pointing at Bun specifically. I spent time ruling out other things before landing there.&lt;/p&gt;

&lt;p&gt;There were two other genuine friction points worth knowing about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command naming mismatch.&lt;/strong&gt; The docs say &lt;code&gt;/telegram:configure&lt;/code&gt;. The actual installed command is &lt;code&gt;/configure&lt;/code&gt;. No error, just silence. I found the real command by inspection. Docs and reality diverged somewhere, and the only way to find out was trial and error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;--channels&lt;/code&gt; flag isn't surfaced by Claude Code.&lt;/strong&gt; The bot never responded to DMs because I didn't launch Claude Code with &lt;code&gt;--channels plugin:telegram@claude-plugins-official&lt;/code&gt;. The flag is documented, but I was following Claude Code's own setup guidance, not the README, and Claude Code didn't mention it. The plugin looks loaded, token saved, skills visible, and nothing tells you the MCP server that actually listens for incoming messages only starts when you pass that flag at launch. That's the kind of thing that costs an afternoon.&lt;/p&gt;

&lt;p&gt;One more thing that isn't a setup issue but is genuinely annoying: Claude Code asks for permission on every vault write. In a daily check-in flow with five or ten writes per session, that's not a workflow. Fix is &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; for the vault directory, or adding the path to &lt;code&gt;~/.claude/settings.json&lt;/code&gt; trusted paths.&lt;/p&gt;

&lt;p&gt;All of that is solvable. That's not the hard problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hard Problem
&lt;/h2&gt;

&lt;p&gt;After setup was done, I gave the skill a small update to process. It responded conversationally. It didn't create the vault entry. The sync buffer protocol, explicit, written, right there in the skill file, wasn't followed until I told it to follow it explicitly.&lt;/p&gt;

&lt;p&gt;This is the failure pattern I've been trying to solve since I started building MemSpren in OpenClaw, and now it's showing up in Claude Code on day one. The skill reads the protocol correctly when invoked directly. It doesn't apply it proactively on every trigger. The methodology is sound. The execution is inconsistent.&lt;/p&gt;

&lt;p&gt;That inconsistency is what I mean by non-determinism. Not random hallucination, not broken code. An instruction set the agent acknowledges understanding but doesn't always execute.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I've Tried in OpenClaw
&lt;/h2&gt;

&lt;p&gt;I've been running MemSpren through OpenClaw long enough to have a proper history with this problem. The governance stack I've built up over time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cron-based synchronization.&lt;/strong&gt; Regular scheduled syncs that run regardless of what the agent did or didn't do in the session. This catches drift. If the agent missed a write, the cron job surfaces the gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redundant state comparison.&lt;/strong&gt; Maintaining state in two places so that discrepancies can be detected. If what's in the vault doesn't match what should be in the vault based on the session log, something was missed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archive-on-edit, never-delete invariant.&lt;/strong&gt; Every vault file edit goes through a process that archives the prior version and commits to git before the new version lands. This is enforced as a CRITICAL statement in the skill file. The agent cannot delete, it can only archive. The git history is the audit trail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End-of-day commit review.&lt;/strong&gt; A separate process that runs at day's end and validates that everything committed was committed correctly. No truncated writes, no orphaned files, no missing frontmatter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocol-level redundancy.&lt;/strong&gt; Checks on checks. If a write protocol is supposed to run, there's a verification step that runs after it to confirm it ran. Not foolproof, the verification step itself can be skipped, but it reduces the blast radius.&lt;/p&gt;

&lt;p&gt;All of this has helped. None of it has solved the problem. The agent still occasionally skips protocol steps that are clearly documented. The cron scripts catch the misses, but they're reactive, not preventive. I'm managing the consequences of non-determinism rather than eliminating it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Others Are Doing
&lt;/h2&gt;

&lt;p&gt;This isn't a MemSpren-specific problem. Brian Scanlan at Intercom shared a &lt;a href="https://x.com/brian_scanlan/status/2033978300003987527" rel="noopener noreferrer"&gt;Twitter thread&lt;/a&gt; on how they approached non-determinism in their AI workflows at production scale. The core of their approach: strict governance layers that wrap every agent action, not relying on the model to follow instructions correctly, but enforcing correct behaviour structurally through the system around the model.&lt;/p&gt;

&lt;p&gt;That framing is more honest than most of what gets written about agents. The model is unreliable by nature, so reliability has to come from the architecture. You can't prompt your way to determinism.&lt;/p&gt;

&lt;p&gt;I haven't built that. My governance stack is additive and external. What I'm thinking about is whether micro skills, small, single-purpose skill files that each govern one specific behaviour, could be a better model than one large SKILL.md that the agent has to follow end to end. Narrower scope, less instruction for the model to hold in working context, more targeted verification. I haven't tested this yet. It's the experiment I'm setting up now.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;MemSpren is an open-source AI second brain skill built on Obsidian and Claude. You can find the project at &lt;a href="https://memspren.io" rel="noopener noreferrer"&gt;memspren.io&lt;/a&gt;. The architecture is documented in &lt;a href="https://dev.to/supreet_s/building-memspren-a-claude-skill-as-a-second-brain-v1-architecture-deep-dive-2p7o"&gt;Building MemSpren: A Claude Skill as a Second Brain — V1 Architecture Deep Dive&lt;/a&gt;. This article continues the evolution started in &lt;a href="https://dev.to/supreet_s/teaching-an-ai-skill-to-learn-from-its-own-mistakes-2aij"&gt;Teaching an AI Skill to Learn from Its Own Mistakes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow me on &lt;a href="https://dev.to/supreet_s"&gt;dev.to&lt;/a&gt; for technical updates, or on &lt;a href="https://innerodyssey.substack.com" rel="noopener noreferrer"&gt;Substack&lt;/a&gt; for the thinking behind the building.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloudskills</category>
      <category>ai</category>
      <category>secondbrain</category>
    </item>
    <item>
      <title>Teaching an AI Skill to Learn from Its Own Mistakes</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Tue, 17 Mar 2026 11:30:30 +0000</pubDate>
      <link>https://dev.to/supreet_s/teaching-an-ai-skill-to-learn-from-its-own-mistakes-2aij</link>
      <guid>https://dev.to/supreet_s/teaching-an-ai-skill-to-learn-from-its-own-mistakes-2aij</guid>
      <description>&lt;p&gt;&lt;em&gt;Follow-up to &lt;a href="https://dev.to/supreet_s/beyond-the-prompt-building-production-grade-ai-skills-a-case-study-17f"&gt;Beyond the Prompt: Building Production-Grade AI Skills&lt;/a&gt;, which covers the original architecture and reasoning behind this Cypress E2E testing skill.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I have a Claude skill that generates Cypress E2E tests from Jira Acceptance Criteria. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It reads the ticket&lt;/li&gt;
&lt;li&gt;discovers the relevant components&lt;/li&gt;
&lt;li&gt;instruments them&lt;/li&gt;
&lt;li&gt;generates the tests&lt;/li&gt;
&lt;li&gt;validates that everything compiles. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original version did all of that well, &lt;strong&gt;but what it didn't do was actually run the tests to see if they passed&lt;/strong&gt;. Token budgets were tighter at the time, and adding a verification loop meant longer sessions, more context, more cost. So I didn't add it to the initial version. &lt;br&gt;
I didn't realize that running the tests myself and fixing whatever broke would cost me three to four days of manual debugging on the first real run. That turned out to be a much more painful decision than I expected, even though skipping verification was saving me considerable tokens and making the entire process cheaper than it would have been otherwise.&lt;/p&gt;

&lt;p&gt;Since then, &lt;strong&gt;Opus 4.6 and Sonnet 4.6 have moved to 1,000,000 token context windows&lt;/strong&gt;, and Claude Code's &lt;strong&gt;&lt;em&gt;prompt caching&lt;/em&gt;&lt;/strong&gt; keeps the cost of longer sessions reasonable. Since that constraint didn't apply anymore, I went back and made &lt;em&gt;three changes&lt;/em&gt; which have made a massive difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Human Review Gate on the Test Matrix
&lt;/h2&gt;

&lt;p&gt;The skill already had human review gates in a few places, including reviewing the instrumentation before it gets applied. The new addition is that the human review gate now also prompts you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review the test matrix plan&lt;/li&gt;
&lt;li&gt;Verify the acceptance criteria mapping&lt;/li&gt;
&lt;li&gt;Approve before the tests are generated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason I added this is that I noticed on complex tickets with 15+ acceptance criteria, the matrix was occasionally miscategorizing tests or missing edge cases. &lt;br&gt;
Part of that comes from a limitation that still exists: the skill currently doesn't extract acceptance criteria from screenshots attached to the ticket. &lt;br&gt;
If an AC only exists in an image, it gets missed. That's a future improvement, but for now the human review gate catches those gaps before they turn into missing tests.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;gate is a configuration parameter.&lt;/em&gt; If you don't want the back-and-forth of reviewing every matrix, you can turn it off and the skill will proceed straight through to instrumentation and test creation without involving a human in the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Verify-and-Fix Loop
&lt;/h2&gt;

&lt;p&gt;This was the biggest change. The skill now actually runs each test before considering it done, and if it fails, it classifies why it failed because not every failure is something the skill should be fixing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logic Error:&lt;/strong&gt; An actual bug in the application code. The skill stops and tells you about it. Fixing business logic is not what this skill is for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure Error:&lt;/strong&gt; Something environmental is wrong, like the dev server not running or a dependency missing. The skill flags it and waits for you to sort it out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrumentation Error:&lt;/strong&gt; Something wrong with how the test was written or how the component was set up for testing. That's the skill's territory and it will fix it, re-run, and loop until it passes or hits a retry limit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real example that came up on my first run: a component had the correct &lt;code&gt;data-testid&lt;/code&gt; on it, but there was a transparent overlay element in the DOM sitting on top of it. &lt;br&gt;
Cypress could find the element but couldn't click it because the overlay was intercepting the interaction. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The skill identified what was blocking it,&lt;/li&gt;
&lt;li&gt;adjusted the test to handle the overlay, &lt;/li&gt;
&lt;li&gt;and it passed on retry. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the kind of issue I would have spent a long time staring at Cypress output trying to figure out, and the old generate-only workflow had no way of catching it at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Pattern Persistence Across Runs
&lt;/h2&gt;

&lt;p&gt;That transparent overlay wasn't unique to one component. The same pattern existed across a dozen components in the app, which meant every test touching those components would hit the same failure for the same reason. &lt;br&gt;
In the old version each run was completely stateless, so the skill would discover the overlay problem, fix it for that one test, and then have no memory of it on the next run. &lt;br&gt;
Same discovery, same fix, same wasted tokens, every single time.&lt;/p&gt;

&lt;p&gt;Now every time the skill discovers a failure pattern during the verify-and-fix loop, it persists it with metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The error message&lt;/li&gt;
&lt;li&gt;The root cause&lt;/li&gt;
&lt;li&gt;How it was resolved&lt;/li&gt;
&lt;li&gt;Which component it came from&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This file gets read at the start of every new run before any tests are generated, so the skill is consulting its own history of failures before writing a single test.&lt;/p&gt;

&lt;p&gt;The effect compounds over time. The first run discovers patterns reactively and fixes them as they come up. The second run already knows those patterns and generates tests that account for them from the start. Each iteration produces fewer first-attempt failures and uses fewer tokens because less of the session is spent rediscovering things it already learned.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The original 8-phase lifecycle and three-pillar architecture are documented in &lt;a href="https://dev.to/supreet_s/beyond-the-prompt-building-production-grade-ai-skills-a-case-study-17f"&gt;Beyond the Prompt: Building Production-Grade AI Skills&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow the build on &lt;a href="https://dev.to/supreet_s"&gt;dev.to&lt;/a&gt; and &lt;a href="https://innerodyssey.substack.com/" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>llm</category>
      <category>testing</category>
    </item>
    <item>
      <title>Building MemSpren: A Claude Skill as a Second Brain — V1 Architecture Deep Dive</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Tue, 03 Mar 2026 14:05:22 +0000</pubDate>
      <link>https://dev.to/supreet_s/building-memspren-a-claude-skill-as-a-second-brain-v1-architecture-deep-dive-2p7o</link>
      <guid>https://dev.to/supreet_s/building-memspren-a-claude-skill-as-a-second-brain-v1-architecture-deep-dive-2p7o</guid>
      <description>&lt;p&gt;&lt;em&gt;How I architected a Zettelkasten-powered knowledge graph as a Claude Skill — memory management, node creation, session flow, and the decisions behind each.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I've been building personal knowledge management systems for years, trying to solve a specific problem: losing context, losing ideas, and losing the thread of my own thinking across tools and time. MemSpren is my attempt to solve that properly — using Claude as the intelligence layer and Obsidian as the storage layer.&lt;/p&gt;

&lt;p&gt;The name is a nod to Brandon Sanderson's &lt;em&gt;Stormlight Archive&lt;/em&gt;, where spren are spirits of concepts that have come to life and bond with a human to guide them. That felt right.&lt;/p&gt;

&lt;p&gt;If you want to understand the deeper reasoning behind why I built this — the mindset, the frustrations, the years of failed PKM experiments, and the philosophy underneath the architecture — I've written that on &lt;a href="https://innerodyssey.substack.com/p/i-open-sourced-my-second-brain-heres" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;. That's the "why." &lt;strong&gt;This article is the "how."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What follows is a technical breakdown of how the V1 system is structured: how it manages memory across sessions, how it creates and links nodes, how the session startup sequence works, and what architectural decisions I made and why.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MemSpren requires Claude Cowork&lt;/strong&gt;, not Claude.ai chat or Claude Code. Cowork mounts a real folder from your local filesystem into the sandboxed environment. When the skill asks for your Obsidian vault path during setup, that folder must already be mounted in Cowork. Without this, the skill cannot read or write to your vault.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The implementation is file-based — no external databases, no cloud infrastructure beyond Cowork itself. That's a deliberate choice: auditable in a text editor, runnable without extra accounts, forkable by anyone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Native Claude Memory Isn't Enough
&lt;/h2&gt;

&lt;p&gt;Claude now has a built-in memory feature. As of early 2026, it's available to all users — free and paid. It generates summaries from your conversation history, updates every 24 hours, and gives Claude some continuity between sessions. There's also chat search, which uses RAG to pull relevant context from past conversations when you ask for it.&lt;/p&gt;

&lt;p&gt;That's genuinely useful. But it's not what MemSpren is doing, and the difference matters.&lt;/p&gt;

&lt;p&gt;Claude's native memory is &lt;strong&gt;generalized and unstructured&lt;/strong&gt;. It summarizes your conversations into a broad synthesis — helpful for not re-explaining your general context, but it has no concept of typed entities. It doesn't know the difference between a project and a person. It can't tell you which of your ideas are linked to which projects. It can't load a specific protocol when you say you want to do a check-in. It can't track that a particular task has been idle for 10 days. It doesn't maintain a graph.&lt;/p&gt;

&lt;p&gt;What MemSpren builds is &lt;strong&gt;structured, typed, and programmable memory&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hot memory with a hard token cap that forces prioritization of what matters &lt;em&gt;right now&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;A graph index that tracks every node and its connections without loading every file&lt;/li&gt;
&lt;li&gt;Protocol files that define exactly how Claude should behave for specific intents&lt;/li&gt;
&lt;li&gt;Entity files with typed frontmatter that make the vault queryable from metadata alone&lt;/li&gt;
&lt;li&gt;A session startup sequence that loads different context depending on what you're trying to do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Native memory solves "I have to re-explain myself." MemSpren solves something harder: &lt;em&gt;how do you build a knowledge graph that gets smarter over time, with surgical memory loading, typed nodes, and evolvable behavioral protocols?&lt;/em&gt; That's a different problem. The architecture below is the answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Separate File Locations
&lt;/h2&gt;

&lt;p&gt;The system uses two distinct locations. Mixing them up breaks things.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Location 1: Skill operational files
# Dot-prefix hides this from Obsidian's graph view
.second-brain/
├── config.md                    ← static system settings
└── Memory/
    ├── hot-memory.md            ← always loaded each session
    └── system-state.md          ← active protocols, flags, graph index

# Location 2: Vault content
# Lives at vault_path defined in config.md
# This is what Obsidian renders
vault/
├── Vision/
├── Strategy/
├── Work/
│   ├── Projects/
│   └── Ideas/
├── People/
├── Tasks/
│   └── tasks-inbox.md
├── Log/
│   ├── Daily/
│   └── Weekly/
├── Notes/
│   ├── Learnings/
│   └── Resources/
├── Archive/
└── Inbox/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.second-brain/&lt;/code&gt; is Claude's operational layer — config, memory files, protocol files. These should never appear in the Obsidian graph. The dot-prefix keeps them hidden from Obsidian by default.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault_path&lt;/code&gt; is where all content lives — everything Obsidian renders and displays. This is what grows over time. MemSpren writes every note, project file, and daily log into this location.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;vault_path&lt;/code&gt; points to the same root as the mounted folder, the two locations coexist in the same directory. That's fine — &lt;code&gt;.second-brain/&lt;/code&gt; is still separate and still hidden.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Memory Architecture
&lt;/h2&gt;

&lt;p&gt;This is the core architectural problem in any AI-native knowledge system: &lt;strong&gt;you cannot load everything into every session, but you need Claude to know enough to be useful from the moment the conversation starts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The solution is a three-tier loading strategy.&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.amazonaws.com%2Fuploads%2Farticles%2Fs5vm0iqv8m4nvn70rnfw.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%2Fs5vm0iqv8m4nvn70rnfw.png" alt="loading strategy" width="752" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 1: Hot Memory
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;hot-memory.md&lt;/code&gt; is loaded every single session without exception. It is capped at approximately 800 tokens — a deliberate hard constraint. The cap forces prioritization: only what matters &lt;em&gt;right now&lt;/em&gt; belongs here. What falls outside the cap belongs in long-term storage.&lt;/p&gt;

&lt;p&gt;What lives in hot memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Currently active projects (name, status, immediate next action)&lt;/li&gt;
&lt;li&gt;This week's tasks and commitments&lt;/li&gt;
&lt;li&gt;Friction points or blockers flagged in recent check-ins&lt;/li&gt;
&lt;li&gt;Any patterns Claude has been tracking&lt;/li&gt;
&lt;li&gt;Current journaling context summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The daily sync refreshes hot memory at the end of each check-in, based on what was captured during the session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 1: System State
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;system-state.md&lt;/code&gt; is the operational counterpart to hot memory. Where hot memory is &lt;em&gt;contextual&lt;/em&gt; (what are we working on), system state is &lt;em&gt;operational&lt;/em&gt; (how is the skill configured to behave right now).&lt;/p&gt;

&lt;p&gt;What lives in system state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which protocol files are active (lifestyle tracking on/off, journaling enabled, etc.)&lt;/li&gt;
&lt;li&gt;A graph index — a compact summary of what nodes exist and how they connect, without the full file content&lt;/li&gt;
&lt;li&gt;Inbox sorting rules&lt;/li&gt;
&lt;li&gt;Any behavioral flags set by the user in previous sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The graph index in system state is what lets Claude answer "what do I have on X?" without loading every vault file. It's a lightweight map of the graph, not the graph itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 2: On-Demand Loading
&lt;/h3&gt;

&lt;p&gt;Protocol files and entity files are only loaded when the current conversation intent requires them. The protocol files define &lt;em&gt;how&lt;/em&gt; Claude behaves for specific actions (check-ins, entity creation, linking). Entity files contain the actual content of a specific node.&lt;/p&gt;

&lt;p&gt;A key rule in &lt;code&gt;SKILL.md&lt;/code&gt;: when loading an entity file is warranted, Claude reads the YAML frontmatter first. Only if the conversation requires deeper context does it read the full body. This matters at scale — a vault with hundreds of files should not require reading hundreds of full file bodies to answer a simple question.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 3: The Full Vault
&lt;/h3&gt;

&lt;p&gt;Historical log entries, archived notes, completed project files — these exist in the vault but are never loaded in bulk. They're accessible if specifically needed, but the system is designed so that the vast majority of sessions never need to touch them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Session Startup Sequence
&lt;/h2&gt;

&lt;p&gt;Every session follows the same startup sequence, defined in &lt;code&gt;SKILL.md&lt;/code&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.amazonaws.com%2Fuploads%2Farticles%2F22yeqqw3888te039d2ku.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%2F22yeqqw3888te039d2ku.png" alt="startup sequence" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things worth noting in this flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Config is always read first.&lt;/strong&gt; &lt;code&gt;config.md&lt;/code&gt; contains the vault path and the &lt;code&gt;setup_complete&lt;/code&gt; flag. Without the vault path, the skill doesn't know where to write anything. Without the setup flag, it doesn't know whether to run the setup flow or skip to normal operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent detection determines what gets loaded next.&lt;/strong&gt; MemSpren doesn't load everything upfront and then figure out what to do. It loads the minimum (config + hot memory + system state), detects intent, and only then loads the protocol files relevant to that intent. A session where the user just asks "what am I working on" never loads a single protocol file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocol files are loaded by section, not in full.&lt;/strong&gt; When creating a project, only the Project section of &lt;code&gt;entity-protocol.md&lt;/code&gt; gets read. The Idea and Person sections don't load. This is enforced in the intent detection table in &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Node System
&lt;/h2&gt;

&lt;p&gt;Every piece of information in the vault is a node. Projects, ideas, people, tasks, daily logs, learnings — all of them follow the same structural rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node Types and Locations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Node Type&lt;/th&gt;
&lt;th&gt;Folder&lt;/th&gt;
&lt;th&gt;Filename Pattern&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Work/Projects/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project-name.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;New file per project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idea&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Work/Ideas/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;idea-name.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;New file per idea&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Person&lt;/td&gt;
&lt;td&gt;&lt;code&gt;People/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;firstname-lastname.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;New file per person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Tasks/tasks-inbox.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Appended, not a new file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Notes/Learnings/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;learning-topic.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;New file per learning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily Log&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Log/Daily/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;YYYY-MM-DD.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One per day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tasks are the exception — they don't get their own files. Everything goes into &lt;code&gt;tasks-inbox.md&lt;/code&gt; as an appended entry using Obsidian Tasks plugin syntax. This keeps the task layer flat and queryable without spawning hundreds of individual files.&lt;/p&gt;

&lt;h3&gt;
  
  
  YAML Frontmatter — Non-Negotiable on Every File
&lt;/h3&gt;

&lt;p&gt;Every node gets YAML frontmatter at creation. No exceptions. The reason: retrofitting metadata onto hundreds of notes later is painful. Starting from day one means the graph is always queryable from metadata alone, even as it scales.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;node_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;          &lt;span class="c1"&gt;# project | idea | person | task | learning | log&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;active&lt;/span&gt;              &lt;span class="c1"&gt;# active | idle | archived | completed&lt;/span&gt;
&lt;span class="na"&gt;created&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-03-01&lt;/span&gt;
&lt;span class="na"&gt;updated&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-03-01&lt;/span&gt;
&lt;span class="na"&gt;connected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[[Work/Ideas/progressive-disclosure-idea]]"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[[People/niklas-luhmann]]"&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;second-brain&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;architecture&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;claude-skills&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;connected&lt;/code&gt; field mirrors the &lt;code&gt;[[links]]&lt;/code&gt; written in the body. This redundancy is intentional. System state's graph index is built from frontmatter, not from parsing body content. Claude can understand the shape of your entire graph by scanning frontmatter alone — without reading thousands of full note bodies.&lt;/p&gt;

&lt;h3&gt;
  
  
  The No-Orphan-Notes Rule
&lt;/h3&gt;

&lt;p&gt;Every new note must contain at least one &lt;code&gt;[[link]]&lt;/code&gt; to an existing node before it gets saved. If there is no existing node to link to, Claude creates the minimal stub for that linked entity first, then saves the original note with a link to it.&lt;/p&gt;

&lt;p&gt;This is enforced in &lt;code&gt;linking-protocol.md&lt;/code&gt; and is referenced as a hard invariant in &lt;code&gt;SKILL.md&lt;/code&gt;. The rule exists because the value of the system is in the connections — a vault full of disconnected notes is just a graveyard. The no-orphan rule is what ensures the graph actually builds over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomization — One Idea Per Note
&lt;/h3&gt;

&lt;p&gt;When a brain dump contains multiple ideas, Claude doesn't create one note with everything in it. It creates multiple atomic notes, one per idea, each linked to the others and to relevant existing nodes.&lt;/p&gt;

&lt;p&gt;This is the Zettelkasten principle applied directly: small, discrete, highly-connected notes are more valuable than large, comprehensive notes that try to contain everything. A note with five &lt;code&gt;[[links]]&lt;/code&gt; to existing nodes is more useful than a perfectly organized note with no links.&lt;/p&gt;

&lt;p&gt;The atomization happens during the check-in. The user talks in streams. Claude writes in atoms.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Check-In Flow
&lt;/h2&gt;

&lt;p&gt;The check-in is the primary interface of the system. Everything else is infrastructure in service of this interaction.&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.amazonaws.com%2Fuploads%2Farticles%2F6y1ekztuz9btvp57oyoa.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%2F6y1ekztuz9btvp57oyoa.png" alt="Check in flow" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The check-in protocol defines exactly what Claude should extract from the brain dump: which entities to create, which existing nodes to update, what goes into tasks-inbox, and what belongs in the daily log vs a separate entity file.&lt;/p&gt;

&lt;p&gt;Claude follows up only on gaps that weren't naturally covered — not a read-out-loud checklist. The distinction matters for sustainability. A conversational check-in takes 5–10 minutes and is easy to maintain daily. A structured form with required fields is homework.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evolvable Protocol Files
&lt;/h2&gt;

&lt;p&gt;Behavioral settings don't live in &lt;code&gt;config.md&lt;/code&gt;. They live in protocol files that Claude creates and rewrites over time based on instructions you give 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.amazonaws.com%2Fuploads%2Farticles%2Frew3n528wghlgyriu1cb.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%2Frew3n528wghlgyriu1cb.png" alt="protocol evolution" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The principle: &lt;code&gt;config.md&lt;/code&gt; holds static settings that almost never change (vault path, check-in time, idle thresholds). Protocol files hold behavioral settings that should evolve as you learn what works for you.&lt;/p&gt;

&lt;p&gt;When you give Claude an instruction, it gets persisted. The relevant protocol file gets updated. System state gets flagged. The next session picks it up without you having to repeat yourself. This is how the system learns your preferences over time without you managing configuration manually.&lt;/p&gt;

&lt;p&gt;The distinction between static config and evolvable protocol files is one of the more important architectural decisions in the system. Anything that might change based on user behavior or preference is a protocol file, not a config value.&lt;/p&gt;




&lt;h2&gt;
  
  
  SKILL.md: Executable Logic in Natural Language
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; is the operating system of the skill. It is not documentation — it's a structured instruction set that Claude loads and executes at the start of every session.&lt;/p&gt;

&lt;p&gt;What &lt;code&gt;SKILL.md&lt;/code&gt; defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session startup sequence&lt;/strong&gt; — what to load, in what order, under what conditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intent detection table&lt;/strong&gt; — maps what the user says to which protocol gets loaded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity creation rules&lt;/strong&gt; — which type goes where, what filename pattern, what frontmatter fields are required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory loading rules&lt;/strong&gt; — what loads first, when to stop loading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard invariants&lt;/strong&gt; — what never happens (no orphan notes, no deletion, no Windows-style paths, no loading all files in bulk)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The design philosophy is progressive disclosure applied to the skill itself. &lt;code&gt;SKILL.md&lt;/code&gt; is the thin always-loaded layer. Protocol files are detail that loads on demand. A monolithic &lt;code&gt;SKILL.md&lt;/code&gt; that tries to define every template and every edge case is slow to load, expensive in tokens, and fragile to maintain. Keep it lean. Push detail into the protocol files it references.&lt;/p&gt;

&lt;p&gt;The hard invariants section of &lt;code&gt;SKILL.md&lt;/code&gt; is worth calling out specifically — it's a list of things that categorically never happen, regardless of what the user asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No note is saved without YAML frontmatter&lt;/li&gt;
&lt;li&gt;No note is saved without at least one &lt;code&gt;[[link]]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No vault file is ever deleted — archived instead&lt;/li&gt;
&lt;li&gt;Protocol files and memory files are never written into vault content folders&lt;/li&gt;
&lt;li&gt;All file paths use forward slashes&lt;/li&gt;
&lt;li&gt;Entity files are never loaded all at once in bulk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't guidelines. They're hard stops baked into the system's behavior from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Everything you need to run MemSpren V1 is in the GitHub repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/supre/memspren" rel="noopener noreferrer"&gt;github.com/supre/memspren&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Claude Cowork&lt;/strong&gt; — MemSpren requires Cowork's local filesystem access. It will not work in Claude.ai chat or Claude Code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mount your Obsidian vault&lt;/strong&gt; — In Cowork, mount the folder that contains (or will contain) your Obsidian vault. Note the full path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clone the repo and copy &lt;code&gt;SKILL.md&lt;/code&gt;&lt;/strong&gt; — Drop the skill file into your Cowork environment following the instructions in the README.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the setup flow&lt;/strong&gt; — Open a Cowork session and say &lt;em&gt;"Run the MemSpren skill."&lt;/em&gt; It will detect that setup hasn't run, ask for your vault path, and scaffold the full directory structure automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do your first check-in&lt;/strong&gt; — Say &lt;em&gt;"Let's do a check-in."&lt;/em&gt; The rest follows from there.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The README covers troubleshooting, vault path formatting, and how to verify the skill is reading and writing correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Decisions Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No external database&lt;/td&gt;
&lt;td&gt;File-based only&lt;/td&gt;
&lt;td&gt;Auditable, no cloud dependency, runs anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion policy&lt;/td&gt;
&lt;td&gt;Hard no-deletion, archive forever&lt;/td&gt;
&lt;td&gt;Past is data. Patterns require historical nodes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config scope&lt;/td&gt;
&lt;td&gt;Static settings only&lt;/td&gt;
&lt;td&gt;Behavioral = protocol files. Evolving config is state, not config.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always-loaded files&lt;/td&gt;
&lt;td&gt;hot-memory + system-state only&lt;/td&gt;
&lt;td&gt;Everything else on demand. Token budget discipline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hot memory cap&lt;/td&gt;
&lt;td&gt;~800 tokens&lt;/td&gt;
&lt;td&gt;Forces prioritization. No free lunch on context.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML on every file&lt;/td&gt;
&lt;td&gt;Required at creation&lt;/td&gt;
&lt;td&gt;Retrofitting metadata later is painful. Graph index needs it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;connected&lt;/code&gt; field + &lt;code&gt;[[links]]&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Both, always&lt;/td&gt;
&lt;td&gt;Dual representation — navigable in Obsidian, queryable from metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tasks as append-only inbox&lt;/td&gt;
&lt;td&gt;Single file, not per-task files&lt;/td&gt;
&lt;td&gt;Flat, queryable, no file sprawl.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atomicity rule&lt;/td&gt;
&lt;td&gt;One idea per note&lt;/td&gt;
&lt;td&gt;Connection density over comprehensiveness. Small notes link more.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No orphan notes&lt;/td&gt;
&lt;td&gt;Hard invariant&lt;/td&gt;
&lt;td&gt;Graph only works if everything connects.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MOC creation&lt;/td&gt;
&lt;td&gt;Emergent, never upfront&lt;/td&gt;
&lt;td&gt;Synthesized when link density warrants it, not pre-planned.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SKILL.md design&lt;/td&gt;
&lt;td&gt;Thin always-loaded layer&lt;/td&gt;
&lt;td&gt;Detail lives in protocol files. Lean core, deep protocols.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What's Not in V1
&lt;/h2&gt;

&lt;p&gt;V1 has a deliberately tight scope. The goal was one working loop: open Cowork, run the skill, do a check-in, see files appear in your Obsidian vault with frontmatter and links. Everything below is deferred until that loop is proven reliable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No automated cron jobs — check-in is manually triggered&lt;/li&gt;
&lt;li&gt;No weekly or quarterly planning flows&lt;/li&gt;
&lt;li&gt;MOC detection exists in system state, but MOC creation is suggestion-only&lt;/li&gt;
&lt;li&gt;No pattern correlation analysis&lt;/li&gt;
&lt;li&gt;No graph visualization beyond Obsidian native&lt;/li&gt;
&lt;li&gt;No financial tracking, calendar integration, or script execution&lt;/li&gt;
&lt;li&gt;No Telegram or WhatsApp integration (planned for a future version)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;The non-technical story behind MemSpren — the years of failed PKM experiments, the philosophy behind the architecture, and what it actually feels like to use it daily — is on &lt;a href="https://innerodyssey.substack.com/p/i-open-sourced-my-second-brain-heres" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;. Start there if you want the "why" before the "how."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow the build on &lt;a href="https://dev.to/supreet_s"&gt;dev.to&lt;/a&gt; and &lt;a href="https://innerodyssey.substack.com/" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Supreet is a Senior Software Engineer building AI-native tools in public.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Beyond the Prompt: Building Production-Grade AI Skills — A Case Study</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Tue, 24 Feb 2026 13:35:12 +0000</pubDate>
      <link>https://dev.to/supreet_s/beyond-the-prompt-building-production-grade-ai-skills-a-case-study-17f</link>
      <guid>https://dev.to/supreet_s/beyond-the-prompt-building-production-grade-ai-skills-a-case-study-17f</guid>
      <description>&lt;p&gt;In Part 1, we examined the theory of moving from linear prompting to Skill-based orchestration—a workflow abstraction layer that uses progressive disclosure to keep the model focused and efficient.&lt;/p&gt;

&lt;p&gt;Every sprint, our QA team was catching the same category of bug: a developer had shipped a feature that passed code review but missed a subtle Acceptance Criterion buried in the Jira ticket. By the time the miss was found, the developer had already moved on. I built a Skill to close that gap—a system that automatically bridges Jira ACs to executable Cypress E2E tests. This article is a technical walkthrough of how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Requirement Disconnect and the Structural Gap
&lt;/h2&gt;

&lt;p&gt;In my current company, we manage multiple product lines simultaneously, ranging from fragile legacy systems to modern React builds. We have a small, highly capable QA team, but they are consistently outnumbered by the volume of features being shipped across these tracks.&lt;/p&gt;

&lt;p&gt;A typical failure looked like this: a Product Owner writes an AC that says "the modal must close when the user clicks outside it." The developer builds the modal, ensures the internal logic works, and ships it. However, they neglect the "click outside" requirement—a small but critical UX detail. QA catches the miss four days later. The developer has to context-switch back into code they've mentally closed. That single miss costs an hour of velocity—multiplied across a dozen stories per sprint.&lt;/p&gt;

&lt;p&gt;This created a structural gap in our process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Missed Requirements:&lt;/strong&gt; Developers, naturally focused on technical complexity, occasionally overlook smaller, subtle ACs buried in a ticket description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Latency:&lt;/strong&gt; The cost of "re-learning" a feature to fix a basic AC failure after days of drift is a massive drain on velocity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Testing Bottleneck:&lt;/strong&gt; Lacking automated E2E coverage for new features forces QA to burn limited bandwidth on repetitive manual verification instead of hunting for deep edge cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built this Skill to serve as a checkpoint. It acts as a forcing function for requirement alignment, allowing developers to verify their work against the source of truth before shipping.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 1: Layered Context Management (The Discovery Layer)
&lt;/h2&gt;

&lt;p&gt;The primary challenge I wanted to avoid was Context Rot. If I had loaded 5,000 lines of documentation into a single prompt, the model's reasoning performance would have dropped significantly. To solve this, I implemented a three-tier hierarchy to ensure only the context strictly necessary for the task is loaded at each stage.&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.amazonaws.com%2Fuploads%2Farticles%2Fjzxp616z0a6eff4l4ypp.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%2Fjzxp616z0a6eff4l4ypp.png" alt=" " width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Discovery Hierarchy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Front Matter (The Gateway):&lt;/strong&gt; This YAML block acts as the entry point. It tells Claude when this skill is relevant. By using specific trigger terms like "Cypress" or "Jira ID," we ensure the heavy logic of this skill is only active when needed, preserving the global context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Main Body (The Router):&lt;/strong&gt; This acts as the "map" for the 8-phase workflow. It manages the sequence and the gates between them. It knows that Phase 3 follows Phase 2, but it doesn't need to know the specific syntax for a Cypress intercept yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference Files (The Specialists):&lt;/strong&gt; These hold the deep, domain-specific logic. We separate these files so that Claude only "reads" the Jira API documentation while fetching tickets. Once it moves to writing tests, it drops that context and loads the &lt;code&gt;test-generation.md&lt;/code&gt; context. This selective loading keeps the "cognitive scope" narrow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 2: Persistent State and Hashing (The Continuity Layer)
&lt;/h2&gt;

&lt;p&gt;Standard AI interactions are stateless, which doesn't work for multi-stage engineering tasks. I built a JSON-based memory system so the Skill can track its progress and detect requirement changes over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Management and Session Resumption
&lt;/h3&gt;

&lt;p&gt;The Skill utilizes a dedicated JSON memory file that acts as its persistent state. This file is updated at the conclusion of every phase, ensuring the system never "forgets" the context of its work.&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.amazonaws.com%2Fuploads%2Farticles%2Fo0s49tns1nrqy6htpxgt.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%2Fo0s49tns1nrqy6htpxgt.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The memory file specifically tracks ticket processing, code instrumentation maps, and the Integrity Hash. I use an MD5 hash of the raw Acceptance Criteria text field from the Jira API response.&lt;/p&gt;

&lt;p&gt;By comparing the current AC hash against the stored hash in &lt;code&gt;memory.json&lt;/code&gt;, the Skill detects "staleness." In practice, this means a developer can re-run the Skill on the same ticket after a code review without re-generating 40 test files that haven't changed. Only the deltas are ever touched, saving significant token costs and preventing unnecessary file writes.&lt;/p&gt;

&lt;p&gt;This architecture also enables &lt;strong&gt;Session Resumption&lt;/strong&gt;. If the process is interrupted, the Skill identifies the incomplete session from the memory file and prompts the user to resume from the last successful phase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pillar 3: Review Gates and Governance (The Control Layer)
&lt;/h2&gt;

&lt;p&gt;Even with robust discovery and memory, technical reliability isn't enough. When a system can modify production code, it needs human accountability. I wanted to avoid a "black box" scenario where component instrumentation happened in unexpected places.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Configuration Layer
&lt;/h3&gt;

&lt;p&gt;I implemented a Configuration Layer that allows the user to toggle "Human Review Gates." This flexibility ensures the architecture adapts to the developer's specific need for control—whether they are shipping a critical billing flow or iterating quickly on a new UI component.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategic Review Gates
&lt;/h3&gt;

&lt;p&gt;When these gates are enabled, the workflow pauses at critical decision points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Component Discovery Gate (Phase 2):&lt;/strong&gt; The Skill presents a list of exactly which React components it intends to instrument. This prevents unexpected changes in sensitive areas of the codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Matrix Gate (Phase 6):&lt;/strong&gt; Before generating Cypress files, the Skill displays a comprehensive plan categorizing tests into Happy Path, Negative, Edge Case, and Error scenarios.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Agentic Workflow
&lt;/h2&gt;

&lt;p&gt;When triggered, the Skill follows a rigorous 8-phase lifecycle, where each phase serves as a technical checkpoint.&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.amazonaws.com%2Fuploads%2Farticles%2Fvrzyj7zkmymjnbxhoj4s.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%2Fvrzyj7zkmymjnbxhoj4s.png" alt=" " width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Breaking Down the Lifecycle
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Preflight&lt;/td&gt;
&lt;td&gt;Verifies Jira connectivity via the Atlassian MCP and ensures the workspace root is correct.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Context &amp;amp; Hashing&lt;/td&gt;
&lt;td&gt;Fetches the Jira AC and compares the MD5 hash against the memory file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;Scans the codebase to map Jira stories to specific React components.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dependency Check&lt;/td&gt;
&lt;td&gt;Verifies that required testing libraries (Cypress, custom commands, the TestId enum file) are present and importable. This prevents instrumenting components with identifiers that don't yet exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Instrumentation&lt;/td&gt;
&lt;td&gt;Performs the "surgery" on production code, injecting unique test identifiers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Matrix Approval&lt;/td&gt;
&lt;td&gt;The Skill presents the full test plan to the developer before writing a single file. This is the last human checkpoint before code is generated.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Generation&lt;/td&gt;
&lt;td&gt;Generates the Page Objects and the actual Spec files based on the approved matrix.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validation&lt;/td&gt;
&lt;td&gt;Executes a validation script that compiles the new code and checks for lint errors.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Technical Implementation Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Self-Healing Validation
&lt;/h3&gt;

&lt;p&gt;If the TypeScript compiler (&lt;code&gt;tsc&lt;/code&gt;) or linter finds an issue, the Skill enters an iterative "Self-Healing" loop (up to three times). It reads the error log, identifies the file and line number, and attempts a fix. If it fails after three attempts, it exits the loop, preserves the state in &lt;code&gt;memory.json&lt;/code&gt;, and surfaces the raw compiler output. The developer can patch it manually and resume from that phase rather than starting over.&lt;/p&gt;

&lt;h3&gt;
  
  
  MUI-Aware Instrumentation
&lt;/h3&gt;

&lt;p&gt;Standard AI often struggles with Material UI (MUI) components, which often hide the actual HTML input inside a wrapper. A naive implementation would instrument an MUI TextField like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt; &lt;span class="na"&gt;data-testid&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;TestId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SEARCH_INPUT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cypress can't interact with that because the &lt;code&gt;testid&lt;/code&gt; lands on the wrapper &lt;code&gt;div&lt;/code&gt;. The Skill knows to use the &lt;code&gt;inputProps&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt; &lt;span class="na"&gt;inputProps&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-testid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TestId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SEARCH_INPUT&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Encoding this library-specific knowledge into a reference file ensures any developer on the team gets it right the first time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sharing the Vision, Not the Source
&lt;/h2&gt;

&lt;p&gt;Because this Skill was built for production use at my company, the source code stays internal—but the architectural patterns here (progressive disclosure, persistent state, human-in-the-loop governance) are entirely portable. I'm currently formalizing these same patterns into an open-source "Second Brain" project, and I look forward to sharing its structure with the community soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts: Engineering with Confidence
&lt;/h2&gt;

&lt;p&gt;What this system ultimately gave me is confidence at the moment of merge. Before, shipping a feature meant hoping that QA would catch what I'd missed. Now, before a PR is opened, I have programmatic proof that every Acceptance Criterion has a corresponding test.&lt;/p&gt;

&lt;p&gt;The regression library builds itself sprint by sprint, and the QA team's attention is freed for the complex, judgment-heavy testing that automation can't replace. That shift—from reactive bug-catching to proactive verification—is what I set out to build when I started exploring Skills. It turns out the architecture was always capable of it; we just needed a system to unlock it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>llm</category>
      <category>testing</category>
    </item>
    <item>
      <title>Beyond the Prompt: An Explorer’s Guide to Claude Skills (Part 1)</title>
      <dc:creator>supreet singh</dc:creator>
      <pubDate>Tue, 17 Feb 2026 10:39:50 +0000</pubDate>
      <link>https://dev.to/supreet_s/beyond-the-prompt-an-explorers-guide-to-claude-skills-part-1-gon</link>
      <guid>https://dev.to/supreet_s/beyond-the-prompt-an-explorers-guide-to-claude-skills-part-1-gon</guid>
      <description>&lt;p&gt;I’ve been spending a lot of time lately trying to figure out where "prompting" ends and "systems" begin.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Chat Box Ceiling
&lt;/h3&gt;

&lt;p&gt;Most of us start our AI journey in a chat box. We learn to ask better questions and provide more context, eventually building massive, complex prompts. Yet, even the best prompts often miss the mark.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Claude Code Transition
&lt;/h3&gt;

&lt;p&gt;I expected the friction to disappear when I moved to Claude Code because the tool lives in my local environment. It didn't work out that way. The overhead remains surprisingly high. Even with local access, if you want Claude to plan and execute a complex task, you still end up defining a massive instruction set for every single run. It becomes a tedious ritual of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specifying every parameter for the task.&lt;/li&gt;
&lt;li&gt;Reminding the agent what to watch for.&lt;/li&gt;
&lt;li&gt;Defining exactly how to take specific actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels less like doing the actual work and more like managing a micromanager.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Legacy System Hurdle
&lt;/h3&gt;

&lt;p&gt;When I started using Claude Code last year, "Skills" weren't really on the radar yet. My workaround was building a library of SOPs (Standard Operating Procedures). This was a necessity because I work with legacy systems—specifically ancient Linux builds and fragile ecosystems that are decades old.&lt;/p&gt;

&lt;p&gt;Before every task, I had to manually point Claude toward that world. I would identify which SOPs were relevant, tell Claude Code to read them, and then wait for it to "load" that logic before it could finally act.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Discovery of Skills
&lt;/h3&gt;

&lt;p&gt;Recently, I stumbled upon Claude Skills. I’ve found them to be much more effective at handling this orchestration without the manual baggage of the SOP approach.&lt;/p&gt;

&lt;p&gt;I’m not writing this as an expert who has mastered the architecture. I’m an explorer in the middle of an "Aha!" moment. I’m identifying patterns, figuring out the logic, and trying to build something that actually scales. Here is what I’m learning in real time.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. The Conceptual Shift: Instruction vs. Orchestration
&lt;/h4&gt;

&lt;p&gt;The first thing I had to unlearn is the idea that a Skill is just a "saved prompt." It isn’t.&lt;/p&gt;

&lt;p&gt;If a prompt is a recipe, a Skill is the entire kitchen setup. A normal prompt tells Claude what to do once. A Skill defines how Claude should operate across an entire category of scenarios. It is a workflow abstraction layer. Instead of a linear prompt-response cycle, you are encoding "agentic behavior" into a reusable unit. This includes conditional logic, tool choices, and specific reasoning stages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt-level:&lt;/strong&gt; "Summarize this into five bullet points."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill-level:&lt;/strong&gt; "When I give you a financial document, identify the sender, select the right parsing method, and decide if an Excel file is needed based on the data complexity."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recent research into "Divide and Conquer" frameworks for LLMs supports this. Studies show that single-shot, linear instructions suffer from "superlinear noise growth." In plain English, the longer and more complex your instructions get, the more the model’s focus degrades. Moving to an orchestration model keeps the "noise" low by keeping the immediate task context tiny.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. The Anatomy: How It’s Actually Built
&lt;/h4&gt;

&lt;p&gt;Technically, a Skill is just a folder. The structure of that folder is where the magic happens. At the root, you have a file called &lt;code&gt;SKILL.md&lt;/code&gt;. This isn’t just a readme; it is the brain of the operation. It generally has three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Front Matter (Identity):&lt;/strong&gt; A brief YAML block that tells the system what the skill is. This is how Claude "discovers" the skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Main Body (The Router):&lt;/strong&gt; This is the orchestration layer. It doesn't hold all the instructions. Instead, it acts as a traffic controller. It tells Claude: "If Task A happens, look at File X. If Task B happens, use Tool Y."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Files (The Specialists):&lt;/strong&gt; These are separate files that hold the deep, domain-specific logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation is the core of &lt;strong&gt;Progressive Disclosure.&lt;/strong&gt; Instead of stuffing 5,000 words of instructions into every chat, the Skill selectively loads only what is relevant. If you are summarizing a document, it doesn't load the code-generation logic. It keeps the "cognitive scope" narrow and precise.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. The "Token Economy" Hypothesis
&lt;/h4&gt;

&lt;p&gt;One of the most exciting things about Skills is that they can significantly reduce token usage, sometimes by 60% to 70%.&lt;/p&gt;

&lt;p&gt;This efficiency comes from that Progressive Disclosure architecture. In a typical session, Claude might recognize twenty different skills but only loads a tiny metadata snippet for each one. The heavy instructions and reference files stay out of the context window until Claude decides they are actually needed.&lt;/p&gt;

&lt;p&gt;Loading less context uses fewer tokens, but it also leads to better results. This isn't just a hunch; 2025 research on "Context Rot" shows that even if a model is technically within its context window, irrelevant information causes reasoning performance to drop by anywhere from 13% to a staggering 85%. By limiting what the model sees, we aren't just saving money; we are dramatically improving the quality of the reasoning.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. When Does a Skill Actually Make Sense?
&lt;/h4&gt;

&lt;p&gt;If you just want your AI to always use a specific tone or return JSON, a simple template is fine. You are over-engineering if you build a Skill for a trivial task. The value of a Skill explodes when you deal with &lt;strong&gt;conditional complexity.&lt;/strong&gt; Think about a financial workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; A monthly report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; Parse expenses and analyze patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition:&lt;/strong&gt; If spending is over budget, load the "Planning Recommendation" context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; Generate an Excel file and trigger a tool to email the summary to an accountant.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point, you have a system that can orchestrate different flows of your workflow automatically.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. The "Unanswered Questions" Log
&lt;/h4&gt;

&lt;p&gt;This is what I’m currently working through and what I'll cover in the next few articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observability:&lt;/strong&gt; How do we actually see the Skill flow? I want to know exactly when a specific context is triggered and how to measure if the output is truly optimized.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning:&lt;/strong&gt; How do we update a Skill without breaking the workflows that rely on it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Tool Selection:&lt;/strong&gt; I’ve discovered that Claude uses a search pattern to manage massive libraries. Instead of loading every tool definition, it uses a lightweight index to find tools on demand. I’m exploring how to implement custom search strategies in my own skills.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What’s Next?
&lt;/h3&gt;

&lt;p&gt;This is just the beginning. I’m currently building custom skills for my day-to-day work. While I can’t share the proprietary details, I’ll be documenting the broader architectural lessons I learn along the way.&lt;/p&gt;

&lt;p&gt;I’ll also be publishing public skills for Openclaw. It uses a similar system, but I’ve noticed it tends to be context-heavy, which leads to significant token waste. I’m looking at how to port Claude’s efficient patterns over to Openclaw to lean out that workflow.&lt;/p&gt;

&lt;p&gt;I’m curious about what you’re building. What messy, repetitive workflows are you trying to turn into "systems" right now? If you've managed to incorporate skills into your day-to-day, I’d love to hear how it’s changing your approach.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>claudeskills</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
