<?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: Ivan Li</title>
    <description>The latest articles on DEV Community by Ivan Li (@stevenleep).</description>
    <link>https://dev.to/stevenleep</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%2F4096019%2F5eeb98d0-60d0-444b-b332-8e525f2c7bf7.jpg</url>
      <title>DEV Community: Ivan Li</title>
      <link>https://dev.to/stevenleep</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stevenleep"/>
    <language>en</language>
    <item>
      <title>A safer Windows slowdown triage: 30 minutes before you reinstall</title>
      <dc:creator>Ivan Li</dc:creator>
      <pubDate>Wed, 26 Aug 2026 16:46:08 +0000</pubDate>
      <link>https://dev.to/stevenleep/a-safer-windows-slowdown-triage-30-minutes-before-you-reinstall-je6</link>
      <guid>https://dev.to/stevenleep/a-safer-windows-slowdown-triage-30-minutes-before-you-reinstall-je6</guid>
      <description>&lt;p&gt;When a Windows machine becomes slow, reinstalling the operating system is often treated as the first move. It should usually be much later in the process.&lt;/p&gt;

&lt;p&gt;A reinstall changes many variables at once, creates avoidable recovery work, and can hide the real cause: a failing disk, too little free space, an aggressive startup application, an incomplete update, thermal throttling, or a workload that has simply outgrown the hardware.&lt;/p&gt;

&lt;p&gt;Here is the read-only triage sequence I use before making changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Confirm scope, ownership, and recovery options
&lt;/h2&gt;

&lt;p&gt;Before opening an administrative shell, answer four questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this the owner's device, or do they have written authority to manage it?&lt;/li&gt;
&lt;li&gt;Is important data backed up, and has the backup been tested recently?&lt;/li&gt;
&lt;li&gt;What must not be changed during this session?&lt;/li&gt;
&lt;li&gt;What is the observed symptom: slow boot, slow login, high disk usage, application lag, update failure, or random freezes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Write down the Windows version, device model, approximate age, time of the last known-good state, and any recent software or driver changes. A short timeline is more useful than “it has been slow for months.”&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Establish a baseline
&lt;/h2&gt;

&lt;p&gt;Start with built-in tools and capture findings before changing anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ComputerInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WindowsProductName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WindowsVersion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OsBuildNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;CsModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CsTotalPhysicalMemory&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Get-Volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DriveLetter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FileSystemLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FileSystem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;HealthStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SizeRemaining&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Size&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Low free space is a common contributor, but do not delete files merely because a drive is full. Identify what owns the space, confirm retention requirements, and agree on what may be removed.&lt;/p&gt;

&lt;p&gt;Check the storage device's reported health:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FriendlyName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MediaType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HealthStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;OperationalStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Size&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a complete hardware diagnostic. If the disk reports an unhealthy state, the priority becomes backup and replacement planning—not “cleanup.”&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Inventory startup pressure
&lt;/h2&gt;

&lt;p&gt;Use Task Manager's Startup Apps page for impact estimates, then collect the configured startup entries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_StartupCommand&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not disable everything. Security tools, accessibility software, device utilities, synchronization clients, and business agents may be required. For each candidate, record the owner, purpose, and rollback action before disabling it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Look for a time-correlated system error
&lt;/h2&gt;

&lt;p&gt;Instead of scrolling through every event, limit the initial sample to recent high-severity events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Get-WinEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FilterHashtable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nx"&gt;LogName&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'System'&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nx"&gt;Level&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nx"&gt;StartTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxEvents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TimeCreated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ProviderName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An error in the log is not automatically the cause. Look for repetition and correlation with the user's timeline. Record event IDs and providers; avoid pasting logs containing personal or company data into public tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Verify system files without repairing yet
&lt;/h2&gt;

&lt;p&gt;These commands are useful when corruption is plausible and you want evidence before repair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;DISM.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/Cleanup-Image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/ScanHealth&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;sfc.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/verifyonly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ScanHealth&lt;/code&gt; and &lt;code&gt;verifyonly&lt;/code&gt; are diagnostic choices. Repair commands change system state and should come later, after backup status and rollback expectations are clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Separate software limits from hardware limits
&lt;/h2&gt;

&lt;p&gt;During a controlled reproduction of the problem, watch CPU, memory, disk active time, and the specific process involved. A machine with 4 GB of RAM running a modern browser, conferencing software, security agents, and development tools may be behaving exactly as its hardware allows.&lt;/p&gt;

&lt;p&gt;That distinction matters. Software cleanup cannot honestly promise to turn insufficient hardware into a fast workstation.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Finish with a written decision
&lt;/h2&gt;

&lt;p&gt;A useful triage session should end with one of these outcomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No change: evidence is insufficient or the risk is too high.&lt;/li&gt;
&lt;li&gt;Low-risk change: a small, reversible action with an explicit rollback.&lt;/li&gt;
&lt;li&gt;Escalation: hardware diagnostics, vendor support, data recovery, or a specialist is required.&lt;/li&gt;
&lt;li&gt;Rebuild plan: a reinstall is justified, with backups, license information, required applications, and restore testing prepared first.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The deliverable is not “I ran a cleaner.” It is a record of observations, actions, exclusions, and next steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  A transparent service note
&lt;/h2&gt;

&lt;p&gt;I currently offer a fixed-scope remote Windows health check: up to 75 minutes covering storage, startup items, updates, and basic security state, followed by written findings. The price is CNY 499 per device.&lt;/p&gt;

&lt;p&gt;I only work on devices the client owns or is authorized to manage. Backup status and scope are confirmed first. I do not install pirated software, bypass licenses, access unrelated files, or provide network-restriction circumvention. Hardware repair and guaranteed speed improvements are outside the scope.&lt;/p&gt;

&lt;p&gt;If that scope fits your situation, the intake form is here: &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSc_qNpMHC0IAQWhqw2LTDflcfJ7s-3hyL0q-VkzyjT4YbqaFw/viewform" rel="noopener noreferrer"&gt;https://docs.google.com/forms/d/e/1FAIpQLSc_qNpMHC0IAQWhqw2LTDflcfJ7s-3hyL0q-VkzyjT4YbqaFw/viewform&lt;/a&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>devops</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The first deliverable of a software rescue is not more code</title>
      <dc:creator>Ivan Li</dc:creator>
      <pubDate>Wed, 26 Aug 2026 16:36:55 +0000</pubDate>
      <link>https://dev.to/stevenleep/the-first-deliverable-of-a-software-rescue-is-not-more-code-556o</link>
      <guid>https://dev.to/stevenleep/the-first-deliverable-of-a-software-rescue-is-not-more-code-556o</guid>
      <description>&lt;p&gt;When a software project is late, “add another developer” sounds like the fastest answer. Sometimes it is. Often it makes the project later because the new person inherits the same uncertainty plus a communication cost.&lt;/p&gt;

&lt;p&gt;Before writing more code, I use a short stabilization phase to turn an ambiguous rescue into a testable piece of work.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Name the one release path that matters
&lt;/h2&gt;

&lt;p&gt;“The app needs to work” is not a release path.&lt;/p&gt;

&lt;p&gt;A release path is a concrete journey such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An invited user signs in, uploads one supported video, runs one AI action, previews the result, and exports a playable file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Write the path as observable steps. If the team cannot agree on the path, the current blocker is product scope, not implementation speed.&lt;/p&gt;

&lt;p&gt;Everything outside this path goes into one of three buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required for safety or data integrity;&lt;/li&gt;
&lt;li&gt;useful after the release;&lt;/li&gt;
&lt;li&gt;explicitly excluded from the rescue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last bucket matters. A rescue without exclusions quietly becomes a rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Build an evidence pack, not a blame document
&lt;/h2&gt;

&lt;p&gt;The minimum useful evidence pack contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact reproduction steps;&lt;/li&gt;
&lt;li&gt;expected and actual behavior;&lt;/li&gt;
&lt;li&gt;the smallest failing input, with sensitive data removed;&lt;/li&gt;
&lt;li&gt;relevant logs and timestamps;&lt;/li&gt;
&lt;li&gt;the last known working version;&lt;/li&gt;
&lt;li&gt;build, test, and deploy instructions;&lt;/li&gt;
&lt;li&gt;environment differences;&lt;/li&gt;
&lt;li&gt;changes made just before the failure appeared.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid screenshots without context and messages like “it randomly fails.” A screenshot can prove that a symptom happened. It usually cannot explain the state that produced it.&lt;/p&gt;

&lt;p&gt;Do not send production passwords, private keys, customer data, or unrestricted cloud credentials in chat. Create temporary, least-privilege access and revoke it after the engagement.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Restore one known build and deployment path
&lt;/h2&gt;

&lt;p&gt;Before changing the product, answer four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can a clean machine build it?&lt;/li&gt;
&lt;li&gt;Can the current test suite run?&lt;/li&gt;
&lt;li&gt;Can a non-production environment be deployed?&lt;/li&gt;
&lt;li&gt;Can that deployment be rolled back?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answer is no, fixing a product bug may create a build or deployment incident instead. The team needs a reproducible baseline before it needs more changes.&lt;/p&gt;

&lt;p&gt;For small teams, a one-page runbook is enough. Record the commands, required runtime versions, configuration source, health check, and rollback step. The goal is not perfect documentation. The goal is for a second person to repeat the path.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Separate the symptom from the constraint
&lt;/h2&gt;

&lt;p&gt;The visible failure may not be the actual constraint.&lt;/p&gt;

&lt;p&gt;An export button that “does nothing” could be caused by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a frontend state transition that never fires;&lt;/li&gt;
&lt;li&gt;a rejected API request;&lt;/li&gt;
&lt;li&gt;a background job that is not consuming the queue;&lt;/li&gt;
&lt;li&gt;an expired media URL;&lt;/li&gt;
&lt;li&gt;a codec or platform mismatch;&lt;/li&gt;
&lt;li&gt;a permissions problem;&lt;/li&gt;
&lt;li&gt;missing observability that hides a successful-but-slow job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create hypotheses that can be disproved. “The queue is broken” is weak. “Jobs created after version X stay in &lt;code&gt;pending&lt;/code&gt; for more than 60 seconds and no worker claims them” gives you something to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Define go/no-go acceptance before implementation
&lt;/h2&gt;

&lt;p&gt;A rescue should have an objective end. For the example release path, acceptance might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the supported test asset completes the full path three times;&lt;/li&gt;
&lt;li&gt;a deliberately invalid asset produces a clear, recoverable error;&lt;/li&gt;
&lt;li&gt;a failed AI request can be retried without creating duplicate output;&lt;/li&gt;
&lt;li&gt;the exported file plays in the agreed target environment;&lt;/li&gt;
&lt;li&gt;logs contain a traceable job identifier;&lt;/li&gt;
&lt;li&gt;the deployment and rollback notes have been tested by someone other than the author.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice what is missing: “feels stable,” “looks better,” and “should be production ready.” Those phrases invite disagreement at the end of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Make the first paid milestone a map of reality
&lt;/h2&gt;

&lt;p&gt;When the system is unfamiliar or the problem is intermittent, promising a full fix before diagnosis is guesswork.&lt;/p&gt;

&lt;p&gt;A useful first milestone can be small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reproduce the blocker;&lt;/li&gt;
&lt;li&gt;map the critical path and dependencies;&lt;/li&gt;
&lt;li&gt;rank the top risks by delivery impact and reversibility;&lt;/li&gt;
&lt;li&gt;propose the narrowest repair options;&lt;/li&gt;
&lt;li&gt;define acceptance and exclusions;&lt;/li&gt;
&lt;li&gt;provide a fixed implementation quote only if the evidence supports one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This milestone has value even if the original implementation estimate turns out to be wrong. The client receives a testable decision document instead of another vague opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  A compact rescue brief
&lt;/h2&gt;

&lt;p&gt;If you need to bring someone into a delayed project, send this before the first call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Critical user journey:
Current blocker:
Exact reproduction steps:
Expected / actual result:
Evidence and logs (secrets removed):
Last known working version:
Build / test / deploy status:
Deadline and reason:
What may be cut:
Decision owner:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first deliverable of a rescue is not more code. It is a shared, testable map of reality. Once that map exists, you can decide whether the constraint is code, infrastructure, product scope, ownership, or missing information.&lt;/p&gt;

&lt;p&gt;I’m Ivan Li, a technical lead and frontend engineer working around AI-powered video products. I publish practical notes about product rescue, AI workflows, and small-team operations. If you are triaging a delayed release, you can use the brief above for free. For a fixed-scope diagnostic or 5–7 day rescue sprint, see &lt;a href="https://ivan-product-rescue.yingong0014.chatgpt.site" rel="noopener noreferrer"&gt;https://ivan-product-rescue.yingong0014.chatgpt.site&lt;/a&gt; or email &lt;a href="mailto:ivan@zstun.com?subject=Product%20rescue%20diagnostic"&gt;ivan@zstun.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>devops</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
