<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Progress on Tarragon</title><link>https://tarrragon.github.io/blog/tags/progress/</link><description>Recent content in Progress on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/progress/index.xml" rel="self" type="application/rss+xml"/><item><title>U.C11 抓到 96/928 本就顯示完成 — 完成判定的證據強度不足</title><link>https://tarrragon.github.io/blog/ux-design/cases/lazy-load-premature-completion/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/ux-design/cases/lazy-load-premature-completion/</guid><description>&lt;p>「完成」是一個 UI 宣告，誠實度取決於判定條件的證據強度：「暫時沒有變化」與「確認沒有更多」是強度完全不同的兩種證據，混用會讓使用者拿到殘缺資料而不自知。&lt;/p>
&lt;h2 id="觀察">觀察&lt;/h2>
&lt;p>電子書庫總覽 Chrome 擴充功能（book_overview_v1）從 lazy-load 書庫頁提取書目。提取器的兩種載入策略（捲動容器 / 點擊「更多&amp;hellip;」按鈕）設計成二擇一，實機上容器 selector 恆先命中，「更多&amp;hellip;」按鈕分支永不執行；首批 96 本載入後 count 連續 3 輪不變，觸發 &lt;code>count_stable&lt;/code> 條件判定完成 — 實際書庫有 928 本，提取器在 96 本就宣告成功結束（commit &lt;code>9d0556e1b&lt;/code>，W1-030 / W1-040）。&lt;/p>
&lt;p>修復：每輪同時捲動＋點擊按鈕（不再二擇一），涵蓋率從 96/928 提升到 928/928 — 可見書目全數取得（全書庫 944 本、其餘為封存借出、不在可見清單）。&lt;/p>
&lt;h2 id="判讀">判讀&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>count 穩定是「沒有變化」、不是「沒有更多」&lt;/strong>。lazy-load 頁面的內容增長依賴特定觸發動作（捲動、點按鈕）— 觸發動作缺失時 count 永遠穩定，穩定訊號分不出「真的到底了」和「載入通道根本沒打開」。完成判定缺一個獨立的窮盡證據：頁面宣告的總數、終止標記（「沒有更多了」元素）、載入觸發器消失、或 API 側的窮盡宣告（分頁 cursor 耗盡、&lt;code>has_more=false&lt;/code>）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>誤報完成比報錯更難察覺&lt;/strong>。提取失敗使用者會重試；「成功提取 96 本」看起來一切正常，使用者帶著殘缺資料做下游決策（統計、匯出、比對），錯誤在離開這個畫面很久之後才浮現、且很難回溯到提取階段。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>有總數可對照時，缺口是可偵測的&lt;/strong>。頁面顯示 928 本、提取到 96 本 — 10 倍差距在有對照數字時一眼可見。判定邏輯沒有利用這個訊號，是證據源的遺漏、不是證據不存在。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="策略">策略&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>完成判定列出證據清單&lt;/strong>：宣告完成前問「終止條件是『確認沒有更多』還是『暫時沒變化』」。只有停滯訊號時，完成宣告降級為「已取得 N 筆、可能還有更多」的誠實表達。降級的適用邊界：下游需要全量的操作（備份、匯出、合規留存）不適用部分結果 — 這類場景把不完整按失敗處理、阻止下游動作。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>利用對照數字做完整性檢查&lt;/strong>：來源有總數（頁面計數、API total）時，提取數與總數的比對是最便宜的誤報偵測 — 差距大時不宣告完成、改報部分結果與原因。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>多策略遍歷用並行不用二擇一&lt;/strong>：載入觸發方式不確定時每輪全部嘗試，單一策略的 selector 誤命中不會關閉其他通道。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>進度指示與假進度反模式 → &lt;a href="https://tarrragon.github.io/blog/ux-design/06-interaction-feedback/response-time-strategy/" data-link-title="時間感知與回應策略：Loading 的形式由等待時間門檻決定" data-link-desc="100ms / 400ms / 1s / 10s 時間門檻對應不同回饋策略 — 決定操作該不該顯示 loading、用 spinner、skeleton 還是進度條的判準。">時間感知與回應策略&lt;/a>&lt;/li>
&lt;li>結果通知的呈現（部分成功的摘要 + 明細）→ &lt;a href="https://tarrragon.github.io/blog/ux-design/06-interaction-feedback/feedback-three-layers/" data-link-title="互動回饋三層模型：點擊確認、等待指示、結果通知" data-link-desc="使用者操作後的回饋依時間分層，缺層的症狀是重複提交與重複導航 — 診斷「按了沒反應」與多步驟流程卡狀態問題的檢查框架，涵蓋按鈕級與畫面級兩個尺度。">互動回饋三層模型&lt;/a>&lt;/li>
&lt;li>類似案例（結果通知鏈路錯誤）→ &lt;a href="https://tarrragon.github.io/blog/ux-design/cases/async-listener-false-failure/" data-link-title="U.C9 提取成功卻誤報失敗 — 結果通知鏈路被搶通道" data-link-desc="操作實際成功、資料已寫入，UI 卻顯示失敗時使用。多 context 的訊息通道語意（誰負責回應）是結果通知鏈路的一部分，async listener 搶通道會把 undefined 當成回應送回">U.C9 提取成功卻誤報失敗&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>「完成」是一個 UI 宣告，誠實度取決於判定條件的證據強度：「暫時沒有變化」與「確認沒有更多」是強度完全不同的兩種證據，混用會讓使用者拿到殘缺資料而不自知。</p>
<h2 id="觀察">觀察</h2>
<p>電子書庫總覽 Chrome 擴充功能（book_overview_v1）從 lazy-load 書庫頁提取書目。提取器的兩種載入策略（捲動容器 / 點擊「更多&hellip;」按鈕）設計成二擇一，實機上容器 selector 恆先命中，「更多&hellip;」按鈕分支永不執行；首批 96 本載入後 count 連續 3 輪不變，觸發 <code>count_stable</code> 條件判定完成 — 實際書庫有 928 本，提取器在 96 本就宣告成功結束（commit <code>9d0556e1b</code>，W1-030 / W1-040）。</p>
<p>修復：每輪同時捲動＋點擊按鈕（不再二擇一），涵蓋率從 96/928 提升到 928/928 — 可見書目全數取得（全書庫 944 本、其餘為封存借出、不在可見清單）。</p>
<h2 id="判讀">判讀</h2>
<ol>
<li>
<p><strong>count 穩定是「沒有變化」、不是「沒有更多」</strong>。lazy-load 頁面的內容增長依賴特定觸發動作（捲動、點按鈕）— 觸發動作缺失時 count 永遠穩定，穩定訊號分不出「真的到底了」和「載入通道根本沒打開」。完成判定缺一個獨立的窮盡證據：頁面宣告的總數、終止標記（「沒有更多了」元素）、載入觸發器消失、或 API 側的窮盡宣告（分頁 cursor 耗盡、<code>has_more=false</code>）。</p>
</li>
<li>
<p><strong>誤報完成比報錯更難察覺</strong>。提取失敗使用者會重試；「成功提取 96 本」看起來一切正常，使用者帶著殘缺資料做下游決策（統計、匯出、比對），錯誤在離開這個畫面很久之後才浮現、且很難回溯到提取階段。</p>
</li>
<li>
<p><strong>有總數可對照時，缺口是可偵測的</strong>。頁面顯示 928 本、提取到 96 本 — 10 倍差距在有對照數字時一眼可見。判定邏輯沒有利用這個訊號，是證據源的遺漏、不是證據不存在。</p>
</li>
</ol>
<h2 id="策略">策略</h2>
<ol>
<li>
<p><strong>完成判定列出證據清單</strong>：宣告完成前問「終止條件是『確認沒有更多』還是『暫時沒變化』」。只有停滯訊號時，完成宣告降級為「已取得 N 筆、可能還有更多」的誠實表達。降級的適用邊界：下游需要全量的操作（備份、匯出、合規留存）不適用部分結果 — 這類場景把不完整按失敗處理、阻止下游動作。</p>
</li>
<li>
<p><strong>利用對照數字做完整性檢查</strong>：來源有總數（頁面計數、API total）時，提取數與總數的比對是最便宜的誤報偵測 — 差距大時不宣告完成、改報部分結果與原因。</p>
</li>
<li>
<p><strong>多策略遍歷用並行不用二擇一</strong>：載入觸發方式不確定時每輪全部嘗試，單一策略的 selector 誤命中不會關閉其他通道。</p>
</li>
</ol>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>進度指示與假進度反模式 → <a href="/blog/ux-design/06-interaction-feedback/response-time-strategy/" data-link-title="時間感知與回應策略：Loading 的形式由等待時間門檻決定" data-link-desc="100ms / 400ms / 1s / 10s 時間門檻對應不同回饋策略 — 決定操作該不該顯示 loading、用 spinner、skeleton 還是進度條的判準。">時間感知與回應策略</a></li>
<li>結果通知的呈現（部分成功的摘要 + 明細）→ <a href="/blog/ux-design/06-interaction-feedback/feedback-three-layers/" data-link-title="互動回饋三層模型：點擊確認、等待指示、結果通知" data-link-desc="使用者操作後的回饋依時間分層，缺層的症狀是重複提交與重複導航 — 診斷「按了沒反應」與多步驟流程卡狀態問題的檢查框架，涵蓋按鈕級與畫面級兩個尺度。">互動回饋三層模型</a></li>
<li>類似案例（結果通知鏈路錯誤）→ <a href="/blog/ux-design/cases/async-listener-false-failure/" data-link-title="U.C9 提取成功卻誤報失敗 — 結果通知鏈路被搶通道" data-link-desc="操作實際成功、資料已寫入，UI 卻顯示失敗時使用。多 context 的訊息通道語意（誰負責回應）是結果通知鏈路的一部分，async listener 搶通道會把 undefined 當成回應送回">U.C9 提取成功卻誤報失敗</a></li>
</ul>
]]></content:encoded></item></channel></rss>