<?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: kanfu-panda</title>
    <description>The latest articles on DEV Community by kanfu-panda (@kanfu-panda).</description>
    <link>https://dev.to/kanfu-panda</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%2F3940859%2F45897ada-53a1-4e66-a3ca-356f624df48e.jpeg</url>
      <title>DEV Community: kanfu-panda</title>
      <link>https://dev.to/kanfu-panda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kanfu-panda"/>
    <language>en</language>
    <item>
      <title>PDLC 1.1: two things v1.0 got wrong about artifact shape</title>
      <dc:creator>kanfu-panda</dc:creator>
      <pubDate>Wed, 10 Jun 2026 14:33:44 +0000</pubDate>
      <link>https://dev.to/kanfu-panda/pdlc-11-two-things-v10-got-wrong-about-artifact-shape-5com</link>
      <guid>https://dev.to/kanfu-panda/pdlc-11-two-things-v10-got-wrong-about-artifact-shape-5com</guid>
      <description>&lt;p&gt;Three months after starting a project with PDLC, a team member asked a simple question: "What does the system look like right now?"&lt;/p&gt;

&lt;p&gt;There was no good answer. &lt;code&gt;/pdlc-arch&lt;/code&gt; had been run six times. The &lt;code&gt;docs/02_design/architecture/&lt;/code&gt; directory had six timestamped files: &lt;code&gt;20260112-arch-analysis.md&lt;/code&gt;, &lt;code&gt;20260204-arch-analysis.md&lt;/code&gt;, and so on. Each captured the architecture at a point in time. None answered the question as asked — because the question was about &lt;em&gt;current state&lt;/em&gt;, not history.&lt;/p&gt;

&lt;p&gt;The same thing happened with coding standards. The team ran &lt;code&gt;/pdlc-standard&lt;/code&gt; (in the old form) to update the naming conventions. Instead of editing the existing file, it created &lt;code&gt;coding-style-v2.md&lt;/code&gt;. Then &lt;code&gt;coding-style-v3.md&lt;/code&gt;. By the time someone new joined the project, there were four files covering the same topic, with no obvious canonical one.&lt;/p&gt;

&lt;p&gt;These weren't edge cases. They were a systematic confusion about what kind of artifact you're writing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The design choice: ledger vs surface
&lt;/h2&gt;

&lt;p&gt;PDLC v1.0 treated all artifacts the same way: write to a new file with a timestamp or version suffix, and never touch the old ones. This is the right behavior for some artifacts — a PRD records a decision at a point in time, and you don't want it overwritten when the feature evolves. A PRD is a &lt;em&gt;ledger artifact&lt;/em&gt;: append-only, date-addressed, permanent.&lt;/p&gt;

&lt;p&gt;But architecture overviews and team conventions aren't decisions. They're states. The question they answer isn't "what did we decide on Feb 4?" but "what is true right now?" For those, append-only is exactly wrong. Every new version compounds the confusion instead of resolving it.&lt;/p&gt;

&lt;p&gt;RFC #5 introduced the &lt;strong&gt;ledger/surface split&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;Type&lt;/th&gt;
&lt;th&gt;Question answered&lt;/th&gt;
&lt;th&gt;Mutation rule&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ledger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"What happened at time T?"&lt;/td&gt;
&lt;td&gt;Append-only, never edit in place&lt;/td&gt;
&lt;td&gt;PRD, per-feature design doc, test plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Surface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"What is true right now?"&lt;/td&gt;
&lt;td&gt;In-place edit, git log is the history&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ARCHITECTURE.md&lt;/code&gt;, coding standards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rule is enforced at the skill level. &lt;code&gt;/pdlc-arch&lt;/code&gt; is now declared &lt;code&gt;artifact_type: surface&lt;/code&gt; in its frontmatter. Its iron law: &lt;strong&gt;one file, &lt;code&gt;docs/ARCHITECTURE.md&lt;/code&gt;, overwritten every time&lt;/strong&gt;. The skill won't create a dated copy. If it finds legacy &lt;code&gt;YYYYMMDD-arch-analysis.md&lt;/code&gt; files, it moves them to &lt;code&gt;docs/.archive/architecture/&lt;/code&gt; automatically and uses the most recent one as the starting point for the new surface file.&lt;/p&gt;

&lt;p&gt;The same principle governs the new &lt;code&gt;/pdlc-standard&lt;/code&gt; skill, which manages &lt;code&gt;docs/00_standards/&lt;/code&gt;. The rule is explicit in the skill definition: &lt;code&gt;coding-style-v2.md&lt;/code&gt; is prohibited. There is one file per topic. The audit trail lives in &lt;code&gt;git log&lt;/code&gt;, not in filename proliferation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before v1.1                          After v1.1
─────────────────────────────────    ──────────────────────────────────
docs/02_design/architecture/         docs/
  20260112-arch-analysis.md            ARCHITECTURE.md   ← one file
  20260204-arch-analysis.md              (git log shows full history)
  20260315-arch-analysis.md           .archive/architecture/
  20260428-arch-analysis.md             20260112-arch-analysis.md
  20260519-arch-analysis.md             (legacy files, out of the way)
  20260601-arch-analysis.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The anti-pattern has a name now: "ledger detour" — when a surface artifact gets treated as a ledger because the tooling defaulted to append. Naming it makes it easier to catch.&lt;/p&gt;




&lt;h2&gt;
  
  
  The feature relation problem
&lt;/h2&gt;

&lt;p&gt;v1.0 introduced per-feature state machines at &lt;code&gt;docs/.pdlc-state/&amp;lt;feature-id&amp;gt;.json&lt;/code&gt;. Feature IDs are flat: &lt;code&gt;F20260501-01&lt;/code&gt;, &lt;code&gt;F20260501-02&lt;/code&gt;, and so on. Each feature tracks its own stages independently.&lt;/p&gt;

&lt;p&gt;The problem surfaces when features start depending on each other. You're changing &lt;code&gt;F20260501-03&lt;/code&gt; (user authentication). Does anything else break? Under v1.0, the only way to know was to read every PRD and hope the author mentioned the dependency. There was no structural answer.&lt;/p&gt;

&lt;p&gt;RFC #6 adds the feature relation chain via &lt;code&gt;/pdlc-relate&lt;/code&gt;. Six relation types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;extends&lt;/code&gt; — "this feature builds on that one"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;depends_on&lt;/code&gt; — "this feature requires that one to function"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;supersedes&lt;/code&gt; — "this feature replaces that one"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolves&lt;/code&gt; — "this feature fixes that defect"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;conflicts_with&lt;/code&gt; — "these two features can't coexist as-is" (symmetric)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;relates_to&lt;/code&gt; — "loosely connected, worth knowing" (symmetric)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Relations are stored redundantly across five locations: the feature state machine JSON, the document traceability header, a reverse index at &lt;code&gt;docs/.pdlc-state/_relations.json&lt;/code&gt;, and a generated Mermaid graph at &lt;code&gt;docs/.pdlc-state/_graph.md&lt;/code&gt;. The redundancy is intentional — any skill can read from whichever location is most convenient, and &lt;code&gt;/pdlc-relate validate&lt;/code&gt; checks that all five stay consistent.&lt;/p&gt;

&lt;p&gt;The command that makes this useful is &lt;code&gt;impact&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/pdlc-relate impact F20260501-03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Impact radius for F20260501-03 (user-auth)

🔴 Direct (depth 1) — must coordinate
   F20260601-01  oauth-integration   extends
   F20260601-04  session-management  depends_on

🟡 Transitive (depth ≥2) — should review
   F20260612-02  user-profile-sync   depends_on → F20260601-01

🟢 Historical — audit only
   B20260520-07  login-loop-fix      resolves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the answer to "what breaks if I touch this?" — with severity levels, not just a flat list. The direct layer tells you what needs coordination before you make the change. The transitive layer tells you what to review. The historical layer shows what defects this feature has already resolved, which is useful when deciding whether to edit in place or create a &lt;code&gt;supersedes&lt;/code&gt; feature instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A[F20260501-03&amp;lt;br/&amp;gt;user-auth] --&amp;gt;|extended by| B[F20260601-01&amp;lt;br/&amp;gt;oauth-integration]
    A --&amp;gt;|depended on by| C[F20260601-04&amp;lt;br/&amp;gt;session-management]
    B --&amp;gt;|depended on by| D[F20260612-02&amp;lt;br/&amp;gt;user-profile-sync]
    E[B20260520-07&amp;lt;br/&amp;gt;login-loop-fix] --&amp;gt;|resolved by| A
    style A fill:#ff6b6b,color:#fff
    style B fill:#ffd93d
    style C fill:#ffd93d
    style D fill:#6bcb77
    style E fill:#6bcb77
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What to watch out for
&lt;/h2&gt;

&lt;p&gt;The ledger/surface distinction is easy to misapply in one direction: marking something surface when it should be a ledger. A design decision that gets reconsidered six months later should have both the original record and the new one — not an in-place overwrite that destroys the history of the decision. If you're not sure, default to ledger. Surface is the right call only when the artifact is genuinely describing current state, not recording a decision.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;/pdlc-relate&lt;/code&gt;, the main friction point is bootstrapping. If you have thirty features and add the relation chain in v1.1, none of them have relation data yet. &lt;code&gt;/pdlc-relate orphans&lt;/code&gt; will list all thirty as orphans, which is technically correct but not actionable. The practical approach is to add relations incrementally as you touch features, rather than trying to backfill the entire graph in one session.&lt;/p&gt;

&lt;p&gt;The five-location redundancy is also worth noting as a tradeoff. Keeping relations in five places makes reads fast for any skill, but it means &lt;code&gt;/pdlc-relate validate&lt;/code&gt; needs to run after any manual edit to catch drift. The alternative — a single source of truth that every skill reads — would require every relation lookup to go through &lt;code&gt;_relations.json&lt;/code&gt;, which adds a dependency that wasn't there before. The current design accepts the redundancy to keep skills loosely coupled.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where things stand
&lt;/h2&gt;

&lt;p&gt;PDLC is at v1.1.0. The plugin has 33 skills (up from 31). The two new skills are additive — existing projects don't need to migrate anything to get the v1.1 behavior for &lt;code&gt;/pdlc-arch&lt;/code&gt;. The relation chain is opt-in; if you never run &lt;code&gt;/pdlc-relate&lt;/code&gt;, nothing changes.&lt;/p&gt;

&lt;p&gt;Both new skills dogfood their own concepts: the &lt;code&gt;docs/ARCHITECTURE.md&lt;/code&gt; in the pdlc-skills repo is a surface artifact maintained by &lt;code&gt;/pdlc-arch&lt;/code&gt;, and &lt;code&gt;docs/GLOSSARY.md&lt;/code&gt; is managed as a surface file.&lt;/p&gt;

&lt;p&gt;The piece that's still manual: there's no automatic detection of "you're about to change a feature that has incoming &lt;code&gt;depends_on&lt;/code&gt; edges." The impact check has to be run explicitly. Whether to put this in the &lt;code&gt;/pdlc-implement&lt;/code&gt; guard is an open question — it would add a lookup on every implementation start, which might be more noise than signal for small projects.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# New install&lt;/span&gt;
/claude &lt;span class="nb"&gt;install &lt;/span&gt;kanfu-panda/pdlc-skills

&lt;span class="c"&gt;# Upgrade from v1.0&lt;/span&gt;
bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source and issues: &lt;a href="https://github.com/kanfu-panda/pdlc-skills" rel="noopener noreferrer"&gt;github.com/kanfu-panda/pdlc-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First article in the series: &lt;a href="https://dev.to/kanfu-panda/why-hard-contracts-beat-soft-conventions-when-working-with-ai-coding-agents-5fk7"&gt;Why Hard Contracts Beat Soft Conventions When Working With AI Coding Agents&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;Episode 03 will cover aitm — the terminal I built to solve the context-switching problem in AI-assisted coding. 5.3 MB binary, Rust + Tauri, a four-layer security model for AI command execution, and some honest notes on what the "participant not driver" framing actually costs in UX.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why hard contracts beat soft conventions when working with AI coding agents</title>
      <dc:creator>kanfu-panda</dc:creator>
      <pubDate>Tue, 19 May 2026 18:10:04 +0000</pubDate>
      <link>https://dev.to/kanfu-panda/why-hard-contracts-beat-soft-conventions-when-working-with-ai-coding-agents-5fk7</link>
      <guid>https://dev.to/kanfu-panda/why-hard-contracts-beat-soft-conventions-when-working-with-ai-coding-agents-5fk7</guid>
      <description>&lt;p&gt;A retrospective on building PDLC — 31 slash commands that force my Claude Code workflow to actually finish features.&lt;/p&gt;

&lt;p&gt;Six months of pair-programming with Claude Code taught me one uncomfortable truth: &lt;strong&gt;the AI is great at writing code, and terrible at the rest of the software lifecycle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It happily says "done" when only the chat transcript proves the PRD existed.&lt;/p&gt;

&lt;p&gt;It writes tests, but after the implementation — making "TDD" a polite lie.&lt;/p&gt;

&lt;p&gt;It loses track of which feature is at which stage the moment you start a new session.&lt;/p&gt;

&lt;p&gt;It enters lint-fix loops that converge on nothing.&lt;/p&gt;

&lt;p&gt;None of this is the model's fault. The model does what you ask, in the moment you ask it. The problem is that &lt;em&gt;soft conventions&lt;/em&gt; — "please write a PRD first", "please write the failing test first" — are how we talk to humans, who keep their own working memory.&lt;/p&gt;

&lt;p&gt;LLMs don't. They need &lt;em&gt;hard contracts&lt;/em&gt;: rules that the workflow itself enforces, not rules the model is supposed to remember.&lt;/p&gt;

&lt;p&gt;This is the story of how I encoded that conviction into a Claude Code plugin called &lt;strong&gt;PDLC&lt;/strong&gt; — Product Development Life Cycle — and what surprised me along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape of the contract
&lt;/h2&gt;

&lt;p&gt;PDLC ships 31 slash commands organized in three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entry points (3):&lt;/strong&gt; &lt;code&gt;/pdlc-feature&lt;/code&gt;, &lt;code&gt;/pdlc-fix&lt;/code&gt;, &lt;code&gt;/pdlc-status&lt;/code&gt; — one sentence drives a whole chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stages (11):&lt;/strong&gt; &lt;code&gt;/pdlc-prd&lt;/code&gt;, &lt;code&gt;/pdlc-design&lt;/code&gt;, &lt;code&gt;/pdlc-tdd&lt;/code&gt;, &lt;code&gt;/pdlc-implement&lt;/code&gt;, &lt;code&gt;/pdlc-review&lt;/code&gt;, &lt;code&gt;/pdlc-e2e&lt;/code&gt;, &lt;code&gt;/pdlc-ship&lt;/code&gt;, ... — when you want fine-grained control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools (17):&lt;/strong&gt; &lt;code&gt;/pdlc-ui-design&lt;/code&gt;, &lt;code&gt;/pdlc-db-migrate&lt;/code&gt;, &lt;code&gt;/pdlc-security&lt;/code&gt;, &lt;code&gt;/pdlc-perf&lt;/code&gt;, ... — specialized concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every Layer 1/2 stage that produces artifacts is bound to five invariants I call the Iron Law:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Persist to disk.&lt;/strong&gt; Every artifact (PRD, API design, DB schema, test plan, review notes) lands as a real file under &lt;code&gt;docs/&lt;/code&gt;. You can &lt;code&gt;git diff&lt;/code&gt; what the AI did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update the state machine.&lt;/strong&gt; Each stage writes &lt;code&gt;docs/.pdlc-state/&amp;lt;feature-id&amp;gt;.json&lt;/code&gt;. New session? &lt;code&gt;/pdlc-status&lt;/code&gt; tells you exactly where every feature stands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests first.&lt;/strong&gt; &lt;code&gt;/pdlc-implement&lt;/code&gt; literally refuses to proceed if &lt;code&gt;/pdlc-tdd&lt;/code&gt; hasn't already produced a failing-test artifact on disk for this feature. Real TDD red-light gate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-check.&lt;/strong&gt; Every stage runs a self-audit before handing off. Catch drift at the stage boundary, not three stages downstream during review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-shot repair.&lt;/strong&gt; Auto-fix loops run at most once. If a stage's output fails its own audit, the model gets one chance to repair it, then flags the issue for a human. No more "fix → check → fix → check → fix" until the heat death of your token budget.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The state machine matters more than I expected.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started with the persistence rule alone — write everything to disk. That helped, but a week into using it I caught myself asking the AI "wait, did we write a PRD for the phone-verification thing?" again. The artifacts existed; they were just hard to find.&lt;/p&gt;

&lt;p&gt;Adding the per-feature state file (&lt;code&gt;F20260502-01.json&lt;/code&gt; with &lt;code&gt;current_stage&lt;/code&gt;, &lt;code&gt;artifacts&lt;/code&gt;, &lt;code&gt;next_step&lt;/code&gt;) was the moment the plugin started feeling like an actual process tool, not a fancier prompt template. &lt;code&gt;/pdlc-status&lt;/code&gt; became my new dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tests-first was the hardest contract to make stick.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The natural tendency of an LLM is to "show its work" by writing the implementation first, then writing tests that conveniently pass. To make &lt;code&gt;/pdlc-tdd&lt;/code&gt; truly red-light, I had to make &lt;code&gt;/pdlc-implement&lt;/code&gt; &lt;em&gt;read the test artifact&lt;/em&gt; and verify it currently fails — not just exists. Without that verification, the model would happily generate stubs that already pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. One-shot repair was a token-budget revelation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before this rule, lint-fix loops would burn 30k tokens converging on a misunderstanding. The model would "fix" something that wasn't the real issue, the checker would complain again with a slightly different message, the model would "fix" the new message, and so on. Capping the repair at one attempt forces it to either understand the real problem or escalate to a human — both vastly better than infinite drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this falls apart
&lt;/h2&gt;

&lt;p&gt;Three things I should be honest about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code only.&lt;/strong&gt; I rely on slash commands and skills as first-class primitives. Cline and Cursor don't have direct equivalents. Porting is possible (the contracts are in bash + markdown) but not free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Iron Law is not law.&lt;/strong&gt; A determined user can edit the state file by hand, or invoke &lt;code&gt;/pdlc-implement&lt;/code&gt; directly without going through &lt;code&gt;/pdlc-tdd&lt;/code&gt;. The contracts are &lt;em&gt;guardrails&lt;/em&gt;, not jail. That's deliberate — guardrails that you can step over with one extra command are usually right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhead for tiny changes.&lt;/strong&gt; Running the full chain for a 3-line CSS fix is overkill. That's what &lt;code&gt;/pdlc-fix&lt;/code&gt; (lighter chain) is for, but the line between "feature" and "fix" is judgmental.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to reach for it
&lt;/h2&gt;

&lt;p&gt;If your workflow with an AI agent involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple sessions per feature → the state machine pays for itself&lt;/li&gt;
&lt;li&gt;Anything you'd want to &lt;code&gt;git diff&lt;/code&gt; later → persistence pays for itself&lt;/li&gt;
&lt;li&gt;Code where you regret not having tests → TDD red light pays for itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're using AI for one-off scripts, refactor sweeps, or single-session prototypes, PDLC is more ceremony than the work justifies. Use it where the discipline is worth its weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Install (no clone needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh | bash &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/pdlc-feature add phone-number verification to user login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will allocate a feature ID, walk through the chain, and refuse to skip the steps that matter.&lt;/p&gt;

&lt;p&gt;Repo (MIT): &lt;a href="https://github.com/kanfu-panda/pdlc-skills" rel="noopener noreferrer"&gt;https://github.com/kanfu-panda/pdlc-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build something on top, file a Discussion — I'd love to see what shapes hold up that I haven't tested.&lt;/p&gt;

&lt;p&gt;— kanfu-panda&lt;/p&gt;

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