<?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>Forem: Snowball</title>
    <description>The latest articles on Forem by Snowball (@snowball0002).</description>
    <link>https://forem.com/snowball0002</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%2F3369047%2F3b8eb104-f38a-4d13-a949-beb59288c587.jpg</url>
      <title>Forem: Snowball</title>
      <link>https://forem.com/snowball0002</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/snowball0002"/>
    <language>en</language>
    <item>
      <title>Our Attention Span Is Now Shorter Than a Goldfish's. So I Built a Chrome Extension</title>
      <dc:creator>Snowball</dc:creator>
      <pubDate>Tue, 28 Apr 2026 12:10:05 +0000</pubDate>
      <link>https://forem.com/snowball0002/our-attention-span-is-now-shorter-than-a-goldfishs-so-i-built-a-chrome-extension-2pf</link>
      <guid>https://forem.com/snowball0002/our-attention-span-is-now-shorter-than-a-goldfishs-so-i-built-a-chrome-extension-2pf</guid>
      <description>&lt;h1&gt;
  
  
  Every Site Blocker Uses a Static List. So I Built One That Doesn't.
&lt;/h1&gt;

&lt;p&gt;Every site blocker on the Chrome Web Store works the same way: you create a blocklist upfront, and it blocks those sites. I tried several — they all hit the same wall.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://chromewebstore.google.com/detail/dynamic-site-blocker/fmlnjfdmdhnhcambhgihcagddaojgdfd" rel="noopener noreferrer"&gt;Dynamic Site Blocker&lt;/a&gt;, a session-based blocker that asks you "Block or Allow?" the first time you visit each site during a session. No pre-made lists. No configuration. Just a decision in the moment.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://chromewebstore.google.com/detail/dynamic-site-blocker/fmlnjfdmdhnhcambhgihcagddaojgdfd" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/atsushikaneko/dynamic-site-blocker" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem: Distraction Is Structural
&lt;/h2&gt;

&lt;p&gt;Getting sidetracked during work — opening a random site during an idle moment like waiting for an AI response, then losing 10-20 minutes — is something most developers have experienced.&lt;/p&gt;

&lt;p&gt;This isn't a willpower problem. It's an &lt;strong&gt;environment&lt;/strong&gt; problem.&lt;/p&gt;

&lt;p&gt;Research by Gloria Mark at UC Irvine shows that the average time a person focuses on a single screen dropped from &lt;strong&gt;150 seconds&lt;/strong&gt; in 2004 to &lt;strong&gt;47 seconds&lt;/strong&gt; in 2024 (Mark, 2023). On top of that, it takes an average of &lt;strong&gt;23 minutes and 15 seconds&lt;/strong&gt; to get back to a task after an interruption (Mark et al., CHI 2008).&lt;/p&gt;

&lt;p&gt;Trying not to get distracted is unrealistic. &lt;strong&gt;Building an environment that makes distraction harder&lt;/strong&gt; is the practical approach.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Static List Dilemma
&lt;/h2&gt;

&lt;p&gt;Existing blockers — StayFocusd, BlockSite, Cold Turkey, LeechBlock, you name it — all rely on static lists. You decide what to block before you start working. This creates a fundamental dilemma:&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Too strict → blocks what you need.&lt;/strong&gt; YouTube has tech talks. Twitter has industry news. What counts as "distraction" changes with every task.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Too loose → useless.&lt;/strong&gt; You can't predict where you'll end up. A link from Hacker News leads to a blog post, and 20 minutes vanish. If it's not on the list, the blocker can't help.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Per-task presets → management overhead.&lt;/strong&gt; Creating and maintaining presets for different work contexts becomes a task in itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem wasn't which sites to block. The problem was deciding upfront at all.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Solution: Decide on the Spot
&lt;/h2&gt;

&lt;p&gt;Dynamic Site Blocker takes a different approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Start a session&lt;/strong&gt; — Click "Start Session" from the extension popup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Decide per site&lt;/strong&gt; — The first time you visit any domain during the session, a Block/Allow overlay appears. That's it — just one question: "Do you need this site right now?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Blocked sites stay blocked&lt;/strong&gt; — Blocked domains redirect to a custom block page with randomized humor messages (14 variations) and an attempt counter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Session end = full reset&lt;/strong&gt; — Hit "End Session" and all decisions are cleared. Next session starts fresh.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Static list:    Pre-build list → Block → List management becomes work
Dynamic:        Start session → Decide on the spot → Reset on session end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accidentally blocked something? Unblock it from the popup. Let something through that you shouldn't have? Block it retroactively. Both directions work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Competitive Landscape
&lt;/h3&gt;

&lt;p&gt;Before building this, I searched the Chrome Web Store thoroughly. Every blocker I found used static lists, timers, schedules, or some combination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A session-based blocker that prompts you interactively on first access did not exist.&lt;/strong&gt; (As of April 2026)&lt;/p&gt;




&lt;h2&gt;
  
  
  Unexpected Benefit: Metacognitive Training
&lt;/h2&gt;

&lt;p&gt;Something I didn't anticipate: being asked "Do you need this site right now?" on every first visit turns &lt;strong&gt;unconscious browsing into conscious decisions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That &lt;strong&gt;one-second prompt&lt;/strong&gt; is surprisingly effective. Sometimes you don't even need to click Block — you realize you have no reason to be there and close the tab yourself. The blocker didn't stop you. You stopped yourself.&lt;/p&gt;

&lt;p&gt;This makes it less of a blocker and more of a &lt;strong&gt;self-awareness tool&lt;/strong&gt;. The ideal outcome is not needing it at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Notes
&lt;/h2&gt;

&lt;p&gt;The entire extension is &lt;strong&gt;13KB&lt;/strong&gt;. Here's what's under the hood:&lt;/p&gt;

&lt;h3&gt;
  
  
  Manifest V3
&lt;/h3&gt;

&lt;p&gt;Built on Manifest V3 with a Service Worker backend. No persistent background page.&lt;/p&gt;

&lt;h3&gt;
  
  
  declarativeNetRequest (redirect)
&lt;/h3&gt;

&lt;p&gt;Blocking uses &lt;code&gt;chrome.declarativeNetRequest&lt;/code&gt; session rules — processed natively by the browser with zero JavaScript overhead. Blocked domains redirect to a custom block page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;declarativeNetRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateSessionRules&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;addRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ruleId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;redirect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;extensionPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/blocked.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;urlFilter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`||&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;resourceTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main_frame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Session rules auto-clear when the browser closes — a natural fit for session-based blocking.&lt;/p&gt;

&lt;h3&gt;
  
  
  chrome.storage.session
&lt;/h3&gt;

&lt;p&gt;Session state (blocked/allowed domain lists, session flag) persists across Service Worker restarts via &lt;code&gt;chrome.storage.session&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Block/Allow Overlay Injection
&lt;/h3&gt;

&lt;p&gt;First-visit detection combines &lt;code&gt;chrome.webNavigation.onCompleted&lt;/code&gt; and &lt;code&gt;chrome.tabs.onActivated&lt;/code&gt;. The overlay is injected via &lt;code&gt;chrome.scripting.executeScript&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;If the problem is defined correctly, the solution can be simple.&lt;/p&gt;

&lt;p&gt;If the issue is "deciding upfront," the fix is "decide on the spot." ~200 lines of code solved a problem that no existing blocker addressed.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://chromewebstore.google.com/detail/dynamic-site-blocker/fmlnjfdmdhnhcambhgihcagddaojgdfd" rel="noopener noreferrer"&gt;Dynamic Site Blocker - Chrome Web Store&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/atsushikaneko/dynamic-site-blocker" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, feature requests, and issues are all welcome.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mark, G. (2023). &lt;em&gt;Attention Span: A Groundbreaking Way to Restore Balance, Happiness and Productivity&lt;/em&gt;. Hanover Square Press.&lt;/li&gt;
&lt;li&gt;Mark, G., Gudith, D., &amp;amp; Klocke, U. (2008). "The Cost of Interrupted Work: More Speed and Stress." &lt;em&gt;Proceedings of the SIGCHI Conference on Human Factors in Computing Systems (CHI '08)&lt;/em&gt;, pp.107-110.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Why "USED" Condition Fails in eBay Inventory API (Action Figure Category)</title>
      <dc:creator>Snowball</dc:creator>
      <pubDate>Sat, 19 Jul 2025 04:59:53 +0000</pubDate>
      <link>https://forem.com/snowball0002/why-used-condition-fails-in-ebay-inventory-api-action-figure-category-4pm6</link>
      <guid>https://forem.com/snowball0002/why-used-condition-fails-in-ebay-inventory-api-action-figure-category-4pm6</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;Action Figure&lt;/strong&gt; category on eBay, the listing UI only provides two condition options:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;NEW&lt;/strong&gt; and &lt;strong&gt;USED&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, when creating a SKU using the &lt;strong&gt;eBay Inventory API&lt;/strong&gt;, specifying &lt;code&gt;"USED"&lt;/code&gt; directly causes an error.&lt;/p&gt;
&lt;h2&gt;
  
  
  Root Cause
&lt;/h2&gt;

&lt;p&gt;According to eBay's API specification, the enum value &lt;code&gt;"USED"&lt;/code&gt; &lt;strong&gt;does not exist&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI Label → &lt;code&gt;"USED"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API Expected Value → &lt;code&gt;"USED_EXCELLENT"&lt;/code&gt; (Condition ID: &lt;code&gt;3000&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, to reproduce the UI’s “USED” condition in the API, you need to use &lt;code&gt;"USED_EXCELLENT"&lt;/code&gt; instead.&lt;/p&gt;
&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.ebay.com/api-docs/sell/inventory/resources/inventory_item/methods/createOrReplaceInventoryItem#request.availability" rel="noopener noreferrer"&gt;createOrReplaceInventoryItem - Inventory API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.ebay.com/api-docs/sell/inventory/types/slr:ConditionEnum" rel="noopener noreferrer"&gt;ConditionEnum Definitions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ❌ Example: Fails with &lt;code&gt;"USED"&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;\&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="s1"&gt;'https://api.ebay.com/sell/inventory/v1/inventory_item/test-sku-001'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer DUMMY_ACCESS_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "condition": "USED",
    "product": {
      "title": "Dummy Action Figure",
      "description": "Dummy description for an action figure item.",
      "imageUrls": ["https://dummyurl.com/dummy-image.jpg"]
    },
    "availability": {
      "shipToLocationAvailability": {
        "quantity": 1
      }
    }
  }'&lt;/span&gt;
&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="sb"&gt;``&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;



&lt;span class="c"&gt;### Error Response&lt;/span&gt;

&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="sb"&gt;```&lt;/span&gt;json
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"errors"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"message"&lt;/span&gt;: &lt;span class="s2"&gt;"Could not serialize field [condition]"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="sb"&gt;``&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="c"&gt;## ✅ Example: Success with {% raw %}`"USED_EXCELLENT"`&lt;/span&gt;

&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="sb"&gt;```&lt;/span&gt;bash
curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="s1"&gt;'https://api.ebay.com/sell/inventory/v1/inventory_item/test-sku-001'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer DUMMY_ACCESS_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "condition": "USED_EXCELLENT",
    "product": {
      "title": "Dummy Action Figure",
      "description": "Dummy description for an action figure item.",
      "imageUrls": ["https://dummyurl.com/dummy-image.jpg"]
    },
    "availability": {
      "shipToLocationAvailability": {
        "quantity": 1
      }
    }
  }'&lt;/span&gt;
&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="sb"&gt;``&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;


Now the &lt;span class="k"&gt;**&lt;/span&gt;USED&lt;span class="k"&gt;**&lt;/span&gt; listing works correctly via API.

&lt;span class="c"&gt;## Summary&lt;/span&gt;

- In the Action Figure category &lt;span class="o"&gt;(&lt;/span&gt;and similar&lt;span class="o"&gt;)&lt;/span&gt;, the &lt;span class="k"&gt;**&lt;/span&gt;UI only shows &lt;span class="s2"&gt;"New"&lt;/span&gt; and &lt;span class="s2"&gt;"Used"&lt;/span&gt;&lt;span class="k"&gt;**&lt;/span&gt;, but...
- The eBay Inventory API &lt;span class="k"&gt;**&lt;/span&gt;does not accept &lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;"USED"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;**&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
- Instead, use &lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;"USED_EXCELLENT"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;Condition ID &lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;3000&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;})&lt;/span&gt; when listing as used.
- Therefore:
  - New item → &lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;"condition"&lt;/span&gt;: &lt;span class="s2"&gt;"NEW"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;
  - Used item → &lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt;"condition"&lt;/span&gt;: &lt;span class="s2"&gt;"USED_EXCELLENT"&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt;
- This mismatch stems from eBay’s internal &lt;span class="o"&gt;{&lt;/span&gt;% raw %&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;ConditionEnum&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;% endraw %&lt;span class="o"&gt;}&lt;/span&gt; design and is &lt;span class="k"&gt;**&lt;/span&gt;not clearly documented&lt;span class="k"&gt;**&lt;/span&gt;, making it a common &lt;span class="nb"&gt;source &lt;/span&gt;of confusion &lt;span class="k"&gt;for &lt;/span&gt;developers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Why PDCA Often Fails — And How GP-PDCA Can Fix It</title>
      <dc:creator>Snowball</dc:creator>
      <pubDate>Sat, 19 Jul 2025 04:56:09 +0000</pubDate>
      <link>https://forem.com/snowball0002/why-pdca-often-fails-and-how-gp-pdca-can-fix-it-272e</link>
      <guid>https://forem.com/snowball0002/why-pdca-often-fails-and-how-gp-pdca-can-fix-it-272e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever followed the PDCA cycle (Plan-Do-Check-Act) and still ended up with no tangible results?&lt;/p&gt;

&lt;p&gt;You’re not alone.&lt;/p&gt;

&lt;p&gt;The truth is: PDCA is a powerful framework — but only &lt;strong&gt;when used in the right context, with the right starting point&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Too often, people jump into the "Do" phase without clarifying what they're really trying to achieve or solve.&lt;/p&gt;

&lt;p&gt;That’s where my original framework &lt;strong&gt;GP-PDCA&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Wrong with PDCA?
&lt;/h2&gt;

&lt;p&gt;PDCA is popular because it provides a simple loop for continuous improvement.&lt;br&gt;&lt;br&gt;
However, many teams run into the following issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❓ Unclear what the real problem is&lt;/li&gt;
&lt;li&gt;🎯 No alignment with the ultimate goal&lt;/li&gt;
&lt;li&gt;🌀 Endless cycles of "doing something" without meaningful impact&lt;/li&gt;
&lt;li&gt;📉 False sense of progress&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The root cause: PDCA assumes the &lt;strong&gt;problem and goal are already clear&lt;/strong&gt; — which is rarely the case in the real world.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introducing: GP-PDCA
&lt;/h2&gt;

&lt;p&gt;To make PDCA effective, you need two steps &lt;strong&gt;before&lt;/strong&gt; Plan:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Goal&lt;/strong&gt; and &lt;strong&gt;Problem&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🥅 Goal
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What are we really trying to achieve?&lt;/li&gt;
&lt;li&gt;What is the ideal future state?&lt;/li&gt;
&lt;li&gt;Why does it matter — and to whom?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Problem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What’s preventing us from reaching the goal?&lt;/li&gt;
&lt;li&gt;What are the bottlenecks or pain points?&lt;/li&gt;
&lt;li&gt;What is the root cause?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Then finally: the original PDCA loop
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt;: Hypothesize and design solutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do&lt;/strong&gt;: Execute a small-scale trial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check&lt;/strong&gt;: Measure and evaluate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act&lt;/strong&gt;: Standardize or iterate&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  GP-PDCA Flow
&lt;/h2&gt;

&lt;p&gt;G (Goal) → Define your ideal target or outcome (KGI)&lt;br&gt;
P (Problem) → Identify obstacles or root causes&lt;br&gt;
P (Plan) → Create hypotheses and KPIs&lt;br&gt;
D (Do) → Take action&lt;br&gt;
C (Check) → Evaluate performance&lt;br&gt;
A (Act) → Reflect, standardize, or retry&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: Improving a Dev Team's Output
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goal&lt;/strong&gt;: Double the team’s release frequency
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: PR reviews are slow, test automation is lacking, rework is frequent
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt;: Improve CI pipeline, enforce WIP limits, clarify review guidelines
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do&lt;/strong&gt;: Pilot these changes for 1 sprint
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check&lt;/strong&gt;: Measure PR turnaround time, number of weekly releases
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act&lt;/strong&gt;: Adopt successful practices across the team
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why “G → P” Before PDCA Is So Powerful
&lt;/h2&gt;

&lt;p&gt;Starting with &lt;strong&gt;Problem&lt;/strong&gt; is better than jumping into “Do”.&lt;br&gt;&lt;br&gt;
But starting with &lt;strong&gt;Goal&lt;/strong&gt; is even better.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Without a clear goal, you're just solving problems — not driving toward anything meaningful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GP-PDCA forces you to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Where are we going?”&lt;/li&gt;
&lt;li&gt;“Why does it matter?”&lt;/li&gt;
&lt;li&gt;“What’s standing in our way?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only then is it worth asking, “What should we do?”&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;PDCA is not broken — but it’s &lt;strong&gt;incomplete&lt;/strong&gt; when used in isolation.&lt;br&gt;&lt;br&gt;
The &lt;strong&gt;GP-PDCA&lt;/strong&gt; model adds two crucial layers: &lt;strong&gt;purpose&lt;/strong&gt; and &lt;strong&gt;problem clarity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This simple mental model has helped me dramatically improve how I approach product development, team processes, and even personal projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If PDCA has ever felt like busywork or a corporate ritual, you're not alone.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GP-PDCA&lt;/strong&gt; gives it teeth again — by anchoring it to &lt;strong&gt;purpose&lt;/strong&gt; and &lt;strong&gt;clarity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If this model resonates with you, feel free to comment or share your own use cases.&lt;br&gt;&lt;br&gt;
Let’s upgrade our thinking — one cycle at a time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written by [Your Name]&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Inspired by real-world frustration with shallow PDCA loops.&lt;/em&gt;&lt;/p&gt;

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