<?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: Kengo Asamizu</title>
    <description>The latest articles on DEV Community by Kengo Asamizu (@rabitarochan).</description>
    <link>https://dev.to/rabitarochan</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%2F4066051%2F218a3a0a-240c-4e50-9d55-f4a202f09025.png</url>
      <title>DEV Community: Kengo Asamizu</title>
      <link>https://dev.to/rabitarochan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rabitarochan"/>
    <language>en</language>
    <item>
      <title>Harvesting Skills with their Why: a Claude Code plugin for knowledge that survives the session</title>
      <dc:creator>Kengo Asamizu</dc:creator>
      <pubDate>Thu, 06 Aug 2026 14:12:39 +0000</pubDate>
      <link>https://dev.to/rabitarochan/harvesting-skills-with-their-why-a-claude-code-plugin-for-knowledge-that-survives-the-session-35d7</link>
      <guid>https://dev.to/rabitarochan/harvesting-skills-with-their-why-a-claude-code-plugin-for-knowledge-that-survives-the-session-35d7</guid>
      <description>&lt;p&gt;Agentic coding tools like Claude Code and Codex have a mechanism called Skills — a way to teach the agent your project's coding rules and the quirks of the libraries you use.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Validation in this project is written like this."&lt;br&gt;
"Debug this error in this order."&lt;br&gt;
"That API has this particular trap."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Knowledge like that already exists on your team. But unless it becomes a Skill, the agent never notices it, and you end up explaining the same thing again in the next session.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/rabitarochan/agent-skdd" rel="noopener noreferrer"&gt;agent-skdd&lt;/a&gt;, a Claude Code plugin that catches that knowledge before it evaporates and &lt;strong&gt;harvests it into Skills that keep growing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post explains &lt;strong&gt;SkDD (Skill Driven Development)&lt;/strong&gt;, what the tool actually does, and why it is designed the way it is.&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;# Install&lt;/span&gt;
claude plugin marketplace add rabitarochan/agent-skdd
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;skdd@agent-skdd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why project knowledge doesn't accumulate in AGENTS.md
&lt;/h2&gt;

&lt;p&gt;The obvious way to hand project-specific knowledge to an LLM is to write it into &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;CLAUDE.md&lt;/code&gt;. That is a perfectly good answer, and it works in plenty of cases.&lt;/p&gt;

&lt;p&gt;It also runs into three problems.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Writing it down doesn't stick.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;You think "I should write that explanation down," but not enough to interrupt the work.&lt;/li&gt;
&lt;li&gt;Next time it comes up, you explain it out loud again.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The file bloats.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Append everything to one &lt;code&gt;AGENTS.md&lt;/code&gt; and the whole thing is loaded every session.&lt;/li&gt;
&lt;li&gt;Knowledge irrelevant to today's task sits in context permanently, burying the part that matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Why doesn't survive.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A note written in a hurry captures the How and nothing else.&lt;/li&gt;
&lt;li&gt;"Throw ValidationException for validation failures" tells you what to do, but not what to do when the situation changes.&lt;/li&gt;
&lt;li&gt;Is it still a live rule, or a workaround for a constraint that no longer exists? You can't tell.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third one is the real problem. &lt;strong&gt;A How that has lost its Why can only be obeyed — it cannot adapt as the project grows.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SkDD (Skill Driven Development) answers all three head-on.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;agent&lt;/strong&gt; writes. You only approve.&lt;/li&gt;
&lt;li&gt;The destination is a &lt;strong&gt;set of Skills&lt;/strong&gt;, not one file — each loaded only when relevant.&lt;/li&gt;
&lt;li&gt;The unit of record is &lt;strong&gt;a How with its Why attached&lt;/strong&gt;. A How without a Why is not accepted as a harvest.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What agent-skdd is
&lt;/h2&gt;

&lt;p&gt;In one sentence: &lt;strong&gt;an ADR at skill granularity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At each natural break in the work, the agent asks itself whether the exchange produced knowledge worth keeping. If it did, it proposes a Skill. Approve, and you get two files: a &lt;code&gt;SKILL.md&lt;/code&gt; holding the procedure itself, and a &lt;code&gt;harvest.md&lt;/code&gt; that accumulates the reasoning behind it.&lt;/p&gt;

&lt;p&gt;An ADR records architectural decisions in chronological order. agent-skdd does the same thing, one skill at a time.&lt;/p&gt;

&lt;p&gt;The name "skdd" stands for &lt;strong&gt;Skill Driven Development&lt;/strong&gt;. Agentic development already has a pile of xDD names — SDD (Spec Driven Development) and friends — so I picked something that sits alongside them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Once installed, proposals start coming from the agent's side at task boundaries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📦 Skill Proposal
─────────────────────
Name:     pj-api-error-routing
Location: project (.claude/skills/)
Summary:  Route domain-consistency check failures into the existing validation path
Scope:    - How to implement external-system reference checks
          - When to use ValidationException
          - Constraint: do not add new frontend handling
Trigger:  "I want to add a domain check" / "How should this error surface?"
Criteria met: recurrence, proceduralness, non-obviousness, correction-derived
Threshold: medium (bar: 3/5)
Overlap:  Checked pj-validation-basics — that one covers input-format validation
          only, not the external-reference decision
─────────────────────
Shall I generate this?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Approve, and &lt;code&gt;SKILL.md&lt;/code&gt; and &lt;code&gt;harvest.md&lt;/code&gt; appear under &lt;code&gt;.claude/skills/pj-api-error-routing/&lt;/code&gt;, ready to commit. From the next session onward, that skill loads automatically whenever the work is related.&lt;/p&gt;

&lt;p&gt;Whether something gets picked up is decided against five criteria.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Recurrence&lt;/strong&gt; — is this likely to come up again?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proceduralness&lt;/strong&gt; — is there a reproducible procedure?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-obviousness&lt;/strong&gt; — is it something you couldn't derive from the docs or common sense?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correction-derived&lt;/strong&gt; — did it come from the user correcting the agent, or from trial and error?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generality&lt;/strong&gt; — does it apply beyond the one file or one ticket in front of you?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of these, &lt;strong&gt;correction-derived&lt;/strong&gt; is the one that earns its place. The spot where a user corrects the agent is where tacit knowledge shows up at its highest concentration.&lt;/p&gt;

&lt;p&gt;Work the agent got right on its own rarely contains anything worth recording. The value is in the path that got stuck, got corrected, and then worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  One dial controls how much you harvest
&lt;/h2&gt;

&lt;p&gt;How greedily the agent picks things up comes down to a single setting: the &lt;strong&gt;harvest threshold&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Propose at&lt;/th&gt;
&lt;th&gt;Proto-Skill&lt;/th&gt;
&lt;th&gt;Promotion&lt;/th&gt;
&lt;th&gt;Consolidation bias&lt;/th&gt;
&lt;th&gt;Line cap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;low&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2/5+&lt;/td&gt;
&lt;td&gt;1/5&lt;/td&gt;
&lt;td&gt;2 sessions&lt;/td&gt;
&lt;td&gt;Create new unless an existing skill clearly covers it&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3/5+&lt;/td&gt;
&lt;td&gt;1-2/5&lt;/td&gt;
&lt;td&gt;2 sessions&lt;/td&gt;
&lt;td&gt;Update when scopes overlap&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4/5+&lt;/td&gt;
&lt;td&gt;2-3/5&lt;/td&gt;
&lt;td&gt;3 sessions&lt;/td&gt;
&lt;td&gt;Read every existing description first; update on overlap&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5/5&lt;/td&gt;
&lt;td&gt;3-4/5&lt;/td&gt;
&lt;td&gt;4 sessions&lt;/td&gt;
&lt;td&gt;Must state why no existing skill can absorb it&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Raising the level tightens three things at once.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The score bar&lt;/strong&gt; — how many criteria must be met to propose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation bias&lt;/strong&gt; — how hard to prefer updating an existing skill over creating a new one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distillation discipline&lt;/strong&gt; — the line cap on &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why a dial? &lt;strong&gt;Because the right harvest rate is not the same across projects.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you have zero skills, pick things up aggressively. On a mature project the incentive inverts: the more skills you have, the more diluted the set becomes, and the harder it is to surface the one that matters. Adding the 21st skill to a set of 20 costs nothing like adding the first to a set of zero.&lt;/p&gt;

&lt;p&gt;The distillation rule at &lt;code&gt;max&lt;/code&gt; captures the intent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Transcribing the steps you just performed is not harvesting — state the rule&lt;br&gt;
that would let a future agent derive those steps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You pick the threshold during &lt;code&gt;/skdd:setup&lt;/code&gt; and change it later with &lt;code&gt;/skdd:config threshold=high&lt;/code&gt;. The default is &lt;code&gt;medium&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Knowledge below the bar isn't thrown away
&lt;/h3&gt;

&lt;p&gt;Anything that misses the bar but still looks like knowledge is recorded in &lt;code&gt;backlog.md&lt;/code&gt; as a &lt;strong&gt;Proto-Skill&lt;/strong&gt; — a seed.&lt;/p&gt;

&lt;p&gt;If the same topic resurfaces within the configured number of sessions, promotion is proposed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The note I made earlier about &amp;lt;topic&amp;gt; came up again this session. It might be worth turning into a skill. Shall I?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether a one-off turns out to have recurrence is something you can only know in hindsight. &lt;strong&gt;Having somewhere to defer the decision&lt;/strong&gt; means you can set a high threshold without losing as much.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;backlog.md&lt;/code&gt; is per-developer local state and is gitignored — nobody else's half-formed hunches end up in your repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  SKILL.md + harvest.md — an ADR per skill
&lt;/h2&gt;

&lt;p&gt;This is the core of SkDD. Every harvested skill is managed as a pair of files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.claude/skills/pj-api-error-routing/
├── SKILL.md      &lt;span class="c"&gt;# current Why + How snapshot&lt;/span&gt;
└── harvest.md    &lt;span class="c"&gt;# append-only decision log (ADR)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;th&gt;When it's read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Live Why&lt;/strong&gt; — why the &lt;em&gt;current&lt;/em&gt; procedure is correct&lt;/td&gt;
&lt;td&gt;Loaded at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;harvest.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Retired Why&lt;/strong&gt; — what was tried, and why it was dropped&lt;/td&gt;
&lt;td&gt;Not normally loaded; only during harvesting and review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Why split them?&lt;/p&gt;

&lt;p&gt;The live Why has to influence execution, so it must sit on the side that gets loaded at runtime. What lets an agent adapt instead of blindly following a procedure — when the project's situation has shifted — is having the reasoning right there.&lt;/p&gt;

&lt;p&gt;The retired Why is noise at that moment. But delete it and you lose the lineage of decisions. "Why aren't we doing it that way?" becomes unanswerable, and discarded options get relitigated indefinitely.&lt;/p&gt;

&lt;p&gt;Splitting them keeps &lt;strong&gt;&lt;code&gt;SKILL.md&lt;/code&gt; lean and &lt;code&gt;harvest.md&lt;/code&gt; complete&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomic update
&lt;/h3&gt;

&lt;p&gt;A decision-level change is one transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;① Draft the harvest.md entry FIRST
② Edit SKILL.md (including the inline Why)
③ Append the entry to harvest.md
④ Verify the invariant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing only one side is invalid. You do not end the task partway through the sequence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writing down why you're changing something before you change it is itself the quality gate.&lt;/strong&gt; It stops decisions from being silently overwritten.&lt;/p&gt;

&lt;p&gt;There is exactly one invariant to hold:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The last entry in harvest.md == the rationale for the current SKILL.md&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While that holds, "why is this skill shaped the way it is?" is answered by reading the tail of one file. No diffing through git history.&lt;/p&gt;

&lt;p&gt;If the invariant is broken — &lt;code&gt;SKILL.md&lt;/code&gt; changed on its own — the agent reconstructs an entry marked &lt;code&gt;context: drift repair&lt;/code&gt; and appends it. There's a defined escape hatch so a break never gets silently ignored.&lt;/p&gt;

&lt;h3&gt;
  
  
  A real harvest.md
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Harvest Log — pj-api-error-routing&lt;/span&gt;

&lt;span class="gu"&gt;## 001: Route domain-check failures through the validation pipeline&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; date: 2026-06-01
&lt;span class="p"&gt;-&lt;/span&gt; context: External-system reference checks could not be expressed in the
  standard validator, so errors surfaced through an ad-hoc exception with its
  own frontend handling, diverging from every other error path.
&lt;span class="p"&gt;-&lt;/span&gt; change: Domain checkers now throw the shared ValidationException so failures
  join the existing validator display path. Why: one error pipeline is easier
  to reason about than two; How: build ValidationResult manually and throw.
&lt;span class="p"&gt;-&lt;/span&gt; supersedes: —
&lt;span class="p"&gt;-&lt;/span&gt; result: Reused across 3 screens in the first week without new frontend code.

&lt;span class="gu"&gt;## 002: Prefer warning-response over exception for save-time checks&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; date: 2026-06-15
&lt;span class="p"&gt;-&lt;/span&gt; context: A new requirement wanted saves to succeed while still surfacing
  check failures; blocking via exception (001) prevented that.
&lt;span class="p"&gt;-&lt;/span&gt; change: Save-time checks return warning messages on the response instead of
  throwing; blocking exceptions remain only for confirm-time checks. The 001
  approach is retired for save paths but stays valid for confirm paths.
&lt;span class="p"&gt;-&lt;/span&gt; supersedes: 001
&lt;span class="p"&gt;-&lt;/span&gt; result:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;context&lt;/code&gt; holds &lt;strong&gt;the situation that forced a rethink&lt;/strong&gt;, not the change itself. What a future reader needs in order to judge "is this decision still valid?" is the former, not the latter.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;result&lt;/code&gt; is the one field that may be rewritten later. Fill it in once you know how it went.&lt;/p&gt;

&lt;h3&gt;
  
  
  Oscillation guard
&lt;/h3&gt;

&lt;p&gt;Projects move. An approach you rejected six months ago starts looking attractive again once the reasons have faded.&lt;/p&gt;

&lt;p&gt;So before adopting an approach in a skill update, there's a rule to scan &lt;code&gt;harvest.md&lt;/code&gt; for an entry that already rejected it.&lt;/p&gt;

&lt;p&gt;If one turns up, the agent doesn't quietly re-adopt it. Either the rejection stands, or — if the context genuinely changed — it explicitly overrides that entry via &lt;code&gt;supersedes&lt;/code&gt; and states &lt;strong&gt;what changed that justifies the reversal&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This stops the thrash of re-adopting discarded ideas with a confident face.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Entry 002 above is exactly that. It doesn't negate 001; it splits the scope — retired for save paths, still valid for confirm paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deliberately not owning the skill format
&lt;/h2&gt;

&lt;p&gt;SkDD splits the rules for generated skills into two layers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layer 1 — SkDD invariants&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The five criteria, the per-level bars and line caps, the &lt;code&gt;SKILL.md&lt;/code&gt; + &lt;code&gt;harvest.md&lt;/code&gt; pair and atomic update, naming and routing, the oscillation guard, never renaming a skill.&lt;/li&gt;
&lt;li&gt;Hardcoded into the engine. Always wins.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer 2 — platform conventions&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Frontmatter fields, how to write a description, the shape of the body, the flavour of progressive disclosure (when to split into &lt;code&gt;references/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Not baked into the plugin. Resolved on the spot, at every harvest.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The resolution chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. If a skill-authoring skill is in session (e.g. Anthropic's skill-creator), follow it
2. Otherwise, use the model's own latest knowledge of Skills best practices
3. If neither is confidently newer than the baseline,
   use the dated baseline shipped with the engine (as of 2026-08)

Precedence: SkDD invariants &amp;gt; newer platform conventions &amp;gt; dated baseline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No documentation is fetched. The chain has to work offline.&lt;/p&gt;

&lt;p&gt;The point is that &lt;strong&gt;as models and Claude Code evolve, harvested skills track current best practice without the plugin being updated&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If the tool froze "the correct way to write a SKILL.md as of 2026-08" inside itself, it would start rotting the moment it was written. So it doesn't own the format. It hardcodes only the judgment it should actually own: what to harvest, when, and how strictly.&lt;/p&gt;

&lt;p&gt;The "if you aren't sure, use the baseline" precedence is deliberate too. &lt;strong&gt;A misremembered "newer" convention is worse than a real one with an old date on it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When updating an existing skill, newer conventions apply &lt;strong&gt;only to the parts you touched&lt;/strong&gt;. A full rewrite for style consistency counts as churn, not growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup and operation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;

&lt;p&gt;The plugin itself is installed globally, once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add rabitarochan/agent-skdd
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;skdd@agent-skdd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run setup in each project where you want skdd active.&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="nb"&gt;cd&lt;/span&gt; ~/work/my-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; claude
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /skdd:setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup asks three things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill prefix&lt;/strong&gt; — defaults to &lt;code&gt;pj-&lt;/code&gt;. Project skills are named &lt;code&gt;pj-&amp;lt;domain&amp;gt;-&amp;lt;action&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether to install the Stop hook&lt;/strong&gt; — prompts a harvest evaluation each time a response completes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harvest threshold&lt;/strong&gt; — defaults to &lt;code&gt;medium&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what gets deployed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Managed by update?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.claude/skills/skdd-harvest/SKILL.md&lt;/code&gt; + &lt;code&gt;references/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Harvest engine&lt;/td&gt;
&lt;td&gt;Yes (overwritten)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/skdd-harvest/backlog.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proto-Skill backlog&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No — per-developer state&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.claude/hooks/skdd-stop.sh&lt;/code&gt; + the Stop entry in &lt;code&gt;settings.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Harvest reminder (opt-in)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The managed section of &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Protocol for every agent&lt;/td&gt;
&lt;td&gt;Yes (re-rendered)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The &lt;code&gt;@AGENTS.md&lt;/code&gt; line in &lt;code&gt;CLAUDE.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Bridge for Claude Code&lt;/td&gt;
&lt;td&gt;Repaired if missing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything except &lt;code&gt;backlog.md&lt;/code&gt; is meant to be committed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/skdd:setup                  &lt;span class="c"&gt;# install into a project&lt;/span&gt;
/skdd:config &lt;span class="nv"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;high  &lt;span class="c"&gt;# change settings (threshold, prefix, hook)&lt;/span&gt;
/skdd:update                 &lt;span class="c"&gt;# after upgrading the plugin, bring deployed assets forward&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/skdd:config&lt;/code&gt; changes &lt;strong&gt;settings&lt;/strong&gt;; &lt;code&gt;/skdd:update&lt;/code&gt; changes the &lt;strong&gt;version&lt;/strong&gt;. &lt;code&gt;config&lt;/code&gt; takes arguments, and without them it walks you through the settings interactively.&lt;/p&gt;

&lt;p&gt;The two are independent on purpose: raising the threshold never swaps the engine out from under you.&lt;/p&gt;

&lt;p&gt;Neither ever touches &lt;code&gt;backlog.md&lt;/code&gt; or your harvested skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why setup runs per project
&lt;/h2&gt;

&lt;p&gt;Most plugins work the moment you install them. agent-skdd only starts working after you install it &lt;em&gt;and&lt;/em&gt; deploy files into a project. That's extra friction, and there are three reasons I accepted it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The knowledge is project-specific.&lt;/strong&gt;&lt;br&gt;
The harvest protocol — what to pick up, when, how strictly — can be identical everywhere. The knowledge it picks up, the prefix, and the threshold cannot. The former lives in the plugin; the latter lives in your repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The output becomes part of the repository.&lt;/strong&gt;&lt;br&gt;
Harvested skills are born in &lt;code&gt;.claude/skills/pj-*/&lt;/code&gt;, get committed, get reviewed, and get shared with the team. Locked inside a global install, they'd be nothing but personal notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Agents other than Claude Code can participate.&lt;/strong&gt;&lt;br&gt;
What gets deployed is plain Markdown and a shell script. Any other agent that reads &lt;code&gt;AGENTS.md&lt;/code&gt; — OpenAI Codex, or anything else Agent Skills-compatible — follows the same protocol with no plugin installed at all. The plugin is a Claude Code feature; the output isn't confined to Claude Code.&lt;/p&gt;

&lt;p&gt;Teammates benefit without knowing the plugin exists. Clone the repository and the harvested rules and skills are simply there. Only the person installing and upgrading needs the plugin at all.&lt;/p&gt;

&lt;p&gt;There's a trade-off. Upgrading the plugin does not update project assets automatically. Nothing about your agent's rules changes overnight in a repository that's about to ship — but you do have to run &lt;code&gt;/skdd:update&lt;/code&gt; when you want the new version.&lt;/p&gt;

&lt;p&gt;That question, "how do you keep updating something you've already distributed?", turned into the main design problem of the plugin. The answer: carve out a managed region inside &lt;code&gt;AGENTS.md&lt;/code&gt; with &lt;code&gt;&amp;lt;!-- skdd:begin --&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;!-- skdd:end --&amp;gt;&lt;/code&gt; markers, and keep the settings and deployed version in a single HTML comment just inside them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;Being honest about where this stands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local edits to a deployed &lt;code&gt;skdd-harvest&lt;/code&gt; get overwritten.&lt;/strong&gt; Engine improvements are meant to happen on the plugin side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Changing the prefix does not rename existing skills.&lt;/strong&gt; You migrate those by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The threshold only changes what gets harvested from now on.&lt;/strong&gt; It does not revisit or reorganise skills already harvested at a lower bar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newer platform conventions likewise apply only going forward.&lt;/strong&gt; Updates touch only what you edited, so existing skills are never restyled wholesale. That's intentional, but it does mean older-format skills stick around.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;agent-skdd grows the knowledge that emerges while working with an LLM into Skills that carry their Why.&lt;/p&gt;

&lt;p&gt;What SkDD argues, reduced to one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Preserve the How together with its Why.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Keep only the procedure and nobody can make a call when the situation changes. Keep only the reasoning and you rebuild the procedure from scratch every time. You need both — and you need the current decision kept separate from the retired ones. That's what the &lt;code&gt;SKILL.md&lt;/code&gt; + &lt;code&gt;harvest.md&lt;/code&gt; pair is for.&lt;/p&gt;

&lt;p&gt;And rather than relying on a human to write all that down, it falls out as a by-product of working with the agent. That, I think, is what finally makes it sustainable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add rabitarochan/agent-skdd
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;skdd@agent-skdd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/rabitarochan/agent-skdd" rel="noopener noreferrer"&gt;https://github.com/rabitarochan/agent-skdd&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's still rough in places. If you've ever caught yourself thinking "I've explained this before," it might be worth a try. Feedback and issues are very welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
    </item>
  </channel>
</rss>
