撤版那天早上,我留下了一個修正,因為設定頁有顆看不見的刪除帳號按鈕
Futari 是給兩個人一起記生活帳的家計簿,有 iPhone App 也有網頁版。在設定頁最下面,有一顆「刪除帳號」。按下去會先跳出一個確認框,把後果講清楚:資料會進入 14 天的倒數,期滿就真的沒了。確認框裡有「取消」和「確認」兩顆按鈕。
9 月 14 日凌晨兩點到快五點,agent 照著一份設計審查清單,一口氣改了六個地方。首頁的裝飾陰影收掉;二十處錯誤訊息的紅字太淡,在白底上不夠清楚,換成深一點的紅;旅行帳本頁有四句中文寫死在程式裡,接回翻譯檔;底部導覽列判斷「現在在哪一頁」的邏輯修正。剩下兩個,都跟那個確認框有關。
早上八點多,這批修改合進了主線。問題是,我正準備替前一版切版號。這批東西原本排在下一版,現在已經躺在主線最上面,直接切下去,它們會被記在不該屬於它們的那一版底下。最乾淨的做法是先撤掉、切完版、再放回來。
撤到一半,我停在確認框那一筆。
它的說明寫得很清楚。這個確認框其實一直都在頁面上,關著的時候只是變成全透明,滑鼠點不到。可是用鍵盤的人不靠滑鼠。在設定頁一路按 Tab 往下走,焦點會停在一顆看不見的按鈕上,那顆按鈕就是確認框裡的「確認」。這時候按 Enter,帳號就送出刪除,人被登出。確認框從頭到尾沒有打開過,後果說明也沒讀到,畫面上什麼都沒發生。用螢幕閱讀器的人則會聽到一段關著的確認框內容,被當成頁面的一部分唸出來。
刪除帳號這個入口是 6 月 10 日加上的。也就是說,這顆隱形的按鈕在設定頁裡待了三個月。擋在資料真正消失之前的,只剩下伺服器那邊的 14 天寬限期。
修法本身不複雜。關著的確認框直接從頁面上拿掉,打開時才出現;補上讓輔助工具認得它是對話框的標記;焦點鎖在框裡,關掉時再回到原來的位置。還有一個小地方:打開時焦點先落在「取消」,不落在「確認」。打字快的人連按兩下 Enter,最多就是把框關掉。
所以那天早上,我撤了四筆,留下兩筆。撤銷說明裡寫的理由很短:為了版本歸屬把它放回去,代價不對等。前一版在八點五十五分切好,十分鐘後,那四筆就原封不動地回到主線,當天晚上合進去,跟著下一版一起出去。
撤銷的理由從頭到尾只有版號,跟那批修改好不好無關。可是撤銷本身也有代價:把一個修正拿掉,等於把它修好的那個洞重新打開。對其他四筆來說,打開幾分鐘沒什麼差別。對確認框來說,那幾分鐘裡任何一個用鍵盤的人都可能把自己的帳號刪掉。
之後要撤一批東西的時候,先別看它們有多大、多新,先一筆一筆問:拿掉它,會重新打開什麼?大部分的答案是「一個顏色變回原本那樣」,只有少數幾筆的答案會讓人睡不著。
還有一個細節是 agent 自己寫在說明裡的:這個修正沒有在瀏覽器裡實際跑過,Tab 怎麼循環、Esc 能不能關、焦點會不會回到原處,都只是讀程式碼判斷的,建議合併前用鍵盤實際走一次。它跟刪除帳號緊挨著,所以合併前我真的拔掉滑鼠,用 Tab 走了一遍。
如果你的產品也有「看不見但還在」的東西,例如淡出的選單、收起來的抽屜、透明的遮罩,可以試試看拔掉滑鼠,只用 Tab 走一遍。
Futari 在作品集裡,iPhone 和網頁都能直接試。
先不說了,我得去把其他頁會彈出來的框,也一個一個用 Tab 走過。
這段 code 寫於 2026 年 9 月 14 日,文章整理於 2026 年 10 月。