บันทึกการสนทนาแบบดิบจะเริ่มอ่านยากเมื่อมีปริมาณมหาศาล หลังจากใช้งานหนักไปไม่กี่เดือน คุณจะต้องเผชิญกับข้อความโต้ตอบนับแสนบรรทัด การค้นหาทำได้ช้า ส่วนการอ่านนั้นแทบจะเป็นไปไม่ได้ ในทางตรงกันข้าม Obsidian vault มอบความจำระยะยาวที่มีโครงสร้างให้คุณ ทั้งลิงก์แบบสองทิศทาง แท็ก และมุมมองกราฟที่ช่วยให้เห็นความเชื่อมโยง ช่องว่างระหว่างสองสิ่งนี้ชัดเจนมาก และการจะปิดช่องว่างนี้ได้ต้องอาศัยระบบอัตโนมัติ
ผมได้สร้างไปป์ไลน์ขนาดเล็กที่ช่วยเชื่อมช่องว่างนั้นในทุกๆ คืน โดยจะทำงานสามขั้นตอนต่อเนื่องกันโดยไม่ต้องมีคนเข้าไปแทรกแซง ขั้นแรก คือการรวบรวมไฟล์ส่งออกการสนทนาล่าสุดและอัปเดตให้เป็นสถานะปัจจุบัน ขั้นที่สอง คือการกลั่นกรองบทสนทนาแบบดิบในช่วง 28 ชั่วโมงที่ผ่านมาผ่าน Claude แล้วเพิ่มสรุปที่มีโครงสร้างเข้าไปใน Obsidian vault โดยตรง ช่วงเวลา 28 ชั่วโมงนี้ถูกกำหนดมาอย่างตั้งใจเพื่อให้ครอบคลุมข้อมูลของวันก่อนหน้าทั้งหมดบวกกับส่วนเผื่อเล็กน้อยสำหรับความล่าช้า ขั้นที่สาม คือการสำรองข้อมูลทั้งหมดด้วยการ commit และ push การเปลี่ยนแปลงไปยัง private repository ซึ่งทำหน้าที่เป็นทั้งที่เก็บข้อมูลแบบออฟไลน์และเป็นประกันกรณีเกิดการลบข้อมูลโดยไม่ตั้งใจ กระบวนการทั้งหมดต้องเรียบง่ายและเชื่อถือได้ เป้าหมายของระบบอัตโนมัติคือความเรียบง่ายที่ไว้ใจได้
เมื่อ macOS สั่งหยุดสคริปต์ของคุณอย่างเงียบเชียบ
ศัตรูตัวฉกาจของงานที่ต้องทำทุกคืนไม่ใช่การค้างหรือพังอย่างรุนแรง แต่มันคือความเงียบ
บน macOS โฟลเดอร์ Documents อยู่ภายใต้การคุ้มครองของ TCC ซึ่งเป็นระบบย่อยด้านความเป็นส่วนตัวที่ทำหน้าที่ควบคุมการเข้าถึงตำแหน่งที่ละเอียดอ่อน หากคุณตั้งเวลาการทำงานของสคริปต์ผ่าน launchd ระบบอาจจะบล็อกกระบวนการนั้นโดยไม่แจ้งข้อผิดพลาดใดๆ ให้คุณทราบ ไฟล์ล็อกของคุณจะว่างเปล่า Vault ของคุณจะไม่ได้รับการอัปเดต งานล้มเหลวไปแล้ว แต่คุณจะมารู้ตัวเอาหลายวันต่อมาเมื่อพบว่าโน้ตของคุณไม่อัปเดต
ผมจัดการเรื่องนี้ด้วยขั้นตอนการตรวจสอบก่อนเริ่มงาน (preflight routine) ที่เข้มงวด ก่อนที่งานหลักจะเริ่มขึ้น สคริปต์จะพยายามทำการเขียนข้อมูลที่ไม่มีอันตรายลงในไดเรกทอรีเป้าหมาย หาก macOS ปฏิเสธ การล้มเหลวจะถูกตรวจพบทันทีและจะมีการแจ้งเตือนบนเดสก์ท็อปอย่างชัดเจน จะไม่มีการจบการทำงานแบบเงียบๆ นอกจากนี้ ตัว shell interpreter เองจำเป็นต้องได้รับสิทธิ์ Full Disk Access ใน System Settings เนื่องจากสิทธิ์นั้นค่อนข้างกว้าง ผมจึงลดความเสี่ยงโดยการเก็บสคริปต์อัตโนมัติทั้งหมดไว้นอกโครงสร้างโฟลเดอร์ Documents ที่ได้รับการคุ้มครองอย่างสิ้นเชิง โดยพวกมันจะอยู่ในไดเรกทอรีเฉพาะที่อื่น และมีการอ้างอิงพาธของ vault อย่างชัดเจน การผสมผสานระหว่างการตรวจพบตั้งแต่เนิ่นๆ การแจ้งเตือนที่ชัดเจน และการวางตำแหน่งโฟลเดอร์อย่างระมัดระวัง ช่วยแก้ปัญหาการหยุดทำงานอย่างเงียบเชียบนี้ได้
การออกแบบเพื่อรองรับโหมด Sleep, Timeouts และงานที่ค้าง
แล็ปท็อปอาจเข้าสู่โหมด Sleep เครือข่ายอาจติดขัด หรือการเรียก API อาจค้าง งานที่ค้างเพียงงานเดียวไม่ควรทำให้ระบบทั้งหมดหยุดชะงักไปตลอดกาล
ผมใช้กลไกที่ใช้งานได้จริง 4 อย่างเพื่อให้ไปป์ไลน์มีความเสถียร
ช่วงเวลาที่หลากหลาย (Multiple time slots). แทนที่จะฝากความหวังทั้งหมดไว้กับการรันงานเพียงครั้งเดียวในช่วงเช้ามืด ตัวตั้งเวลา (scheduler) จะพยายามรันใหม่อีกครั้งในเวลาที่ต่างกันตลอดทั้งวัน หากเครื่องปิดอยู่ตอนรุ่งสาง ช่วงเวลาในตอนบ่ายก็ยังสามารถดักจับงานได้
เครื่องหมายแสดงความสำเร็จ (Done markers). เมื่อการรันงานสำเร็จ มันจะทิ้งร่องรอย (breadcrumb) ไว้อย่างชัดเจน การพยายามรันครั้งต่อไปจะตรวจสอบเครื่องหมายนั้นก่อน หากงานเสร็จสิ้นแล้ว มันจะจบการทำงานอย่างสะอาดภายในไม่กี่วินาที วิธีนี้ช่วยป้องกันการเรียก API ที่ไม่จำเป็นและการประมวลผลที่ซ้ำซ้อน
การล็อกไฟล์ผ่าน mkdir. เพื่อหลีกเลี่ยงการทำงานที่ซ้อนทับกัน ผมใช้การล็อกแบบอิงตามไดเรกทอรี เนื่องจากการสร้างไดเรกทอรีเป็นกระบวนการแบบ atomic บนไฟล์ซิสเต็มในเครื่อง ดังนั้นงานสองงานที่เกิดขึ้นพร้อมกันจึงไม่สามารถอ้างสิทธิ์ในพาธล็อกเดียวกันได้ หากมีไดเรกทอรีอยู่แล้ว อินสแตนซ์ที่สองจะยกเลิกการทำงานทันที และเมื่ออินสแตนซ์แรกทำงานเสร็จ มันจะลบไดเรกทอรีนั้นทิ้ง วิธีนี้เบากว่าการใช้ไฟล์ PID และจัดการได้ยากกว่า
