
สี่รีลีสใน 26 ชั่วโมง: งานเดินท่อของ language setting กับ "bridge release"
GeekBye v1.7.6 ถึง v1.8.1: language setting ที่ไม่เคยออกไปพ้นแล็ปท็อป, overlay แบบ Cmd+/ ที่โชว์ keybinding จริงของคุณ, เวอร์ชันที่ไม่มีการแก้โค้ดเลยสักบรรทัด — และปัญหาไก่กับไข่ของการย้าย feed อัปเดตอัตโนมัติ
ระหว่างเช้าวันพฤหัสถึงบ่ายวันศุกร์ในเดือนกุมภาพันธ์ 2026 GeekBye ปล่อยสี่รีลีส: v1.7.6, v1.7.7, v1.8.0 และ v1.8.1 — 16 คอมมิต ห่างกันราว 26 ชั่วโมงระหว่างแท็กแรกกับแท็กสุดท้าย ไม่มีตัวไหนเป็นข่าวพาดหัวได้ด้วยตัวเอง แต่รวมกันแล้วพวกมันคือภาพเหมือนของสิ่งที่สัปดาห์แห่งรีลีสเล็ก ๆ บรรจุอยู่จริง ๆ: ฟีเจอร์ที่ในที่สุดก็เดินทางจนจบ, overlay เพิ่มคุณภาพชีวิต, เลขเวอร์ชันที่ไม่มีโค้ดอยู่ข้างใน และงาน release engineering ที่ให้บทเรียนได้จริง ๆ หนึ่งชิ้น
ภาษาที่ไม่เคยออกไปพ้นแล็ปท็อป
GeekBye มี setting สำหรับภาษาของ transcript มาตั้งแต่กันยายน 2025 มันทำงานได้ — ในเครื่อง เลือกภาษาสเปน แล้วไปป์ไลน์ speech-to-text บนเครื่องก็ถอดเสียงภาษาสเปนอย่างขยันขันแข็ง แต่ลอง grep โค้ดเบสของ v1.7.5 หา setting ตัวนั้นดู คุณจะเจอมันแค่สามที่พอดี: audio handler, Settings UI และ settings hook ไม่อยู่ใน API client ไม่อยู่ใน session tracker เป็นเวลาสี่เดือน ทุก request ที่ออกจากเครื่องตาบอดเรื่องภาษา: session record ฝั่ง backend ไม่รู้เลยว่าตัวเองแทนภาษาอะไร และ AI chat ได้รับ transcript ภาษาสเปนโดยไม่มีคำใบ้สักนิดว่ามันเป็นภาษาสเปน
v1.7.6 คือรีลีสที่ setting ตัวนี้เดินทางจนจบ — สองคอมมิต หนึ่งวัน ตอนนี้การเริ่ม audio session พก transcriptLanguage ใน payload และ request แบบ stream-chat ของ AI ก็ได้ฟิลด์เดียวกัน โดยร้อยผ่าน helper ตัวเล็ก ๆ ที่อ่าน setting แล้วจงใจคืน undefined เมื่อค่าเป็น auto หรือยังไม่ถูกตั้ง เพื่อให้ backend รุ่นเก่า degrade อย่างนุ่มนวลแทนที่จะสำลักฟิลด์ที่มันไม่รู้จัก ใน diff ยังมีตัวแก้โบนัสเงียบ ๆ ซ่อนอยู่ด้วย: การจะส่งภาษาได้ การเริ่ม session ต้องย้ายไปหลังการ resolve ภาษา — ซึ่งตามที่เราอ่าน มันปิด error path หนึ่งไปด้วย ที่ session อาจถูกเริ่มไปแล้ว (และถูกนับเข้า limit) แล้วกลายเป็นกำพร้าเมื่อการ resolve ภาษาล้มเหลวในอึดใจถัดมา
บทเรียนนี้ขยายผลได้ทั่วไป: setting ไม่ได้ถือว่า ship แล้วเมื่อมันมี UI และมีผลลัพธ์ มันถือว่า ship แล้วเมื่อมันไปถึงผู้บริโภคทุกรายที่ควรรู้เรื่องมัน ของเราหยุดอยู่ที่เส้นแบ่งเครือข่ายนานสี่เดือน และไม่มีใครสังเกต เพราะพฤติกรรมในเครื่อง — พฤติกรรมที่มองเห็นได้ — ถูกต้องมาตลอด (บันทึกไว้หน่อยว่า นี่เป็นแค่ก้าวแรกแบบหยาบ ๆ ของการจัดการภาษา; การสอนให้ AI ตอบเป็นภาษาของบทสนทนาจริง ๆ เป็นบทที่มาทีหลังมากในเรื่องนี้)
Cmd+/ — overlay ที่ไม่โกหกเรื่อง keybinding ของคุณ
ฟีเจอร์ฝั่งผู้ใช้ของ v1.8.0 คือ overlay คีย์ลัดบน Cmd+/ — คอมโพเนนต์ใหม่ 193 บรรทัด กับหนึ่งการตัดสินใจเชิงดีไซน์ที่ควรขโมยไปใช้: มันไม่ render cheat sheet แบบ hardcode มันดึงconfig คีย์ลัดตัวเป็น ๆ มาแล้ว render customKeys || defaultKeys ผู้ใช้ที่ remap คีย์ไปแล้วจึงเห็นคีย์ของตัวเอง overlay คีย์ลัดที่โชว์ค่า default ให้คนที่เปลี่ยนมันไปแล้วไม่ใช่เอกสาร; มันคือข้อมูลผิด ๆ ที่จัด typography มาสวย
ที่เหลือเป็นการเก็บงานความถูกต้องเล็ก ๆ น้อย ๆ: overlay จัดตำแหน่งตัวเองไว้ซ้ายหรือขวาของการ์ดแอป แล้วแต่ว่าจอฝั่งไหนมีที่ว่าง และปิดตัวเองด้วย Escape ด้วยการกด Cmd+/ ซ้ำ หรือด้วยการคลิกข้างนอก ตัว Cmd+/ เองก็เข้าร่วมระบบ preset ที่ remap ได้แบบเดียวกับคีย์ลัดตัวอื่นทุกตัว — ซึ่งสำคัญ เพราะ Cmd+/ คือ "toggle comment" ใน editor ส่วนใหญ่ และเครื่องมือสำหรับนักพัฒนาไม่ควรไปนั่งทับคีย์ของ editor แบบที่คุณย้ายมันหนีไม่ได้
bridge release
งานวิศวกรรมที่น่าสนใจเกิดขึ้นในเลขเวอร์ชันที่ไม่มีใครมองซ้ำสองรอบ v1.8.0 ยังย้าย releases ของโปรเจกต์ไปยัง GitHub organization ใหม่ด้วย — ดูผิวเผินก็แค่จัดบ้าน org แต่ auto-update ของแอปเดสก์ท็อปมีคุณสมบัติอยู่ข้อหนึ่ง: URL ของ feed ถูกฝังอยู่ใน binary การติดตั้ง v1.8.0 ทุกตัว poll releases ของ organization ใหม่ ส่วนการติดตั้งทุกตัวที่อยู่ข้างนอกโลกจริง — ทั้งหมดเป็น v1.7.7 หรือเก่ากว่า — poll ตัวเก่าไปตลอดกาล เว้นแต่จะมีอะไรไปโผล่ที่นั่น
นั่นแหละไก่กับไข่: publish รีลีสถัดไปของคุณไปที่ repo ใหม่ที่เดียว แล้วฝูง client ที่มีอยู่ทั้งหมดจะไม่มีวันเห็นมันเลย สิบหกนาทีหลังแท็ก v1.8.0 แฟล็กใหม่ก็ลงจอดในสคริปต์รีลีส: --publish-owner ซึ่งเขียนทับปลายทางที่ electron-builder อัปโหลด artifact หลัง build เสร็จ — อย่างที่คอมเมนต์ในโค้ดบอกไว้ชัด ๆ ว่า "โดยไม่กระทบโค้ดแอปที่คอมไพล์แล้ว" เคล็ดลับมีแค่นั้น และมันคือรอยต่อที่ถูกต้องพอดีเป๊ะ: feed ที่ฝังอยู่ใน binary กับปลายทางอัปโหลดของ artifact เป็นการตัดสินใจสองเรื่องคนละเรื่องกัน และการ migration ต้องการให้ทั้งสองถูกแยกออกจากกันหนึ่งรีลีส build v1.8.1 ให้ชี้ไปที่ feed ใหม่ อัปโหลดมันขึ้น repo เก่า; client เก่าเห็นอัปเดตที่นั่น ติดตั้งมัน แล้วตื่นขึ้นมา poll organization ใหม่ commit message เรียกสิ่งนี้ว่า "bridge release" (รีลีสสะพานเชื่อม) ซึ่งเป็นชื่อที่ถูกต้องแล้ว v1.8.1 ถูกแท็กหลัง v1.8.0 ไป 2 ชั่วโมง 20 นาที (สำหรับที่มาที่ไปว่าทำไมโปรเจกต์นี้ถึงปฏิบัติต่อ auto-update ด้วยความเคารพระดับเฉียดความกลัว ดูอัปเดตอัตโนมัติที่ทำให้แอปของเราฆ่าไม่ตาย)
แล้ว v1.7.7 ล่ะ? หนึ่งคอมมิต ตัว version bump เอง ไม่มีตัวแก้ ไม่มี revert ไม่มีคำอธิบายใน history — การอ่านที่ดีที่สุดของเราคือมันเป็นการ publish ที่ต้องรันซ้ำ และเรายอมรับแบบนั้นดีกว่าแต่งเรื่องขึ้นมา บางครั้งเลขเวอร์ชันมีอยู่เพราะการปล่อยซอฟต์แวร์เป็นกระบวนการในโลกจริงที่มีสะดุดแบบโลกจริง ไม่ใช่ pure function ของ source tree ส่วนคำถามว่าทำไม 1.7 ถึงกลายเป็น 1.8 ตั้งแต่แรก: ไม่มีคอมมิตไหนบอก แต่การย้าย feed คือเส้นแบ่งความเข้ากันได้ที่มีความหมายจริง — binary 1.8.x ทุกตัวมองไปที่ organization คนละอันกับ binary 1.7.x ทุกตัว — และนั่นสมควรได้ minor bump ยิ่งกว่าฟีเจอร์ไหน ๆ
สามสิ่งที่สัปดาห์นี้สอนเรา
- ตามรอย setting ไปให้ถึงผู้บริโภคทุกราย language preference "เสร็จแล้ว" อยู่สี่เดือนขณะที่ backend ยังตาบอด การที่พฤติกรรมในเครื่องซึ่งมองเห็นได้นั้นถูกต้อง คือสิ่งที่ทำให้ช่องว่างนี้รอดมาได้พอดี — คำถามสำหรับ audit คือ "ใครอีกบ้างที่ควรรู้ค่านี้?" ถามซ้ำที่ทุกเส้นแบ่ง
- จง render config ตัวเป็น ๆ ไม่ใช่เอกสาร overlay คีย์ลัดอ่าน source of truth ตัวเดียวกับที่ระบบคีย์ลัดใช้ วิธีอื่นใดจะเริ่มเพี้ยนตั้งแต่ครั้งแรกที่ผู้ใช้ customize
- การย้าย feed ต้องมีหนึ่งรีลีสที่อาศัยอยู่ในสองโลกพร้อมกัน feed ใหม่ใน binary, repo เก่าสำหรับอัปโหลด ถ้าเครื่องมือรีลีสของคุณแยกสองเป้าหมายนี้ออกจากกันไม่ได้ จงเพิ่มแฟล็กก่อนที่จะต้องใช้มัน — ของเรามาถึงหลังจากถูกต้องการไปแล้ว 16 นาที ซึ่งก็ใกล้พอจะนับว่าทันเวลา
สำหรับบทก่อนหน้าของเรื่องราวยุค v1 ดูหน้า Login นั่นแหละคือ Demo (v1.7.5); และสำหรับภาพรวมทั้งเส้นเรื่อง ดูกายวิภาคของการส่งมอบซอฟต์แวร์ให้สมบูรณ์แบบ