لاگ‌های خام گفتگو در مقیاس بالا غیرقابل خواندن می‌شوند. پس از چند ماه استفاده سنگین، با صدها هزار خط گفتگوی رفت و برگشتی روبرو می‌شوید. جستجوی آن‌ها کند است و خواندنشان غیرممکن. در مقابل، یک Obsidian vault به شما حافظه بلندمدت ساختاریافته می‌دهد: لینک‌های دوطرفه، تگ‌ها و یک نمای گراف (graph view) که ارتباطات را آشکار می‌کند. شکاف بین این دو آشکار است. پر کردن این شکاف مستلزم اتوماسیون است.

من یک پایپ‌لاین کوچک ساخته‌ام که هر شب این شکاف را پر می‌کند. این فرآیند سه مرحله را به ترتیب و بدون هیچ مداخله دستی اجرا می‌کند. اول، آخرین خروجی‌های گفتگو را جمع‌آوری کرده و آن‌ها را به آخرین وضعیت خود به‌روزرسانی می‌کند. دوم، ۲۸ ساعت اخیر گفتگوهای خام را از طریق Claude استخراج کرده و خلاصه‌های ساختاریافته را مستقیماً به Obsidian vault اضافه می‌کند. این بازه ۲۸ ساعته تعمدی است؛ این زمان تمام روز قبل به‌علاوه یک بافر کوچک برای تأخیرهای احتمالی را پوشش می‌دهد. سوم، با کامیت کردن و پوش کردن تغییرات به یک مخزن (repository) خصوصی، از همه چیز نسخه پشتیبان تهیه می‌کند که هم به عنوان ذخیره‌سازی آفلاین و هم به عنوان بیمه‌ای در برابر حذف تصادفی عمل می‌کند. کل این زنجیره باید کسل‌کننده و قابل اعتماد باشد. هدف، اتوماسیونِ کسل‌کننده است.

وقتی macOS بی‌صدا اسکریپت شما را از کار می‌اندازد

بزرگترین دشمن یک کار شبانه، کرش کردن ناگهانی و پر سر و صدا نیست؛ بلکه سکوت است.

در macOS، پوشه Documents تحت حفاظت TCC قرار دارد؛ زیرسیستمی برای حریم خصوصی که دسترسی به مکان‌های حساس را کنترل می‌کند. اگر اسکریپت خود را از طریق launchd زمان‌بندی کنید، سیستم ممکن است بدون نمایش خطایی که متوجه شوید، فرآیند را مسدود کند. فایل لاگ شما خالی می‌ماند. vault شما هرگز به‌روز نمی‌شود. کار با شکست مواجه شده است، اما شما تنها روزها بعد متوجه این شکاف می‌شوید، یعنی زمانی که می‌فهمید یادداشت‌هایتان قدیمی شده‌اند.

من این مسئله را با یک روال بررسی اولیه (preflight) سخت‌گیرانه مدیریت می‌کنم. قبل از شروع کار اصلی، اسکریپت سعی می‌کند یک عملیات نوشتن بی‌خطر را در دایرکتوری هدف انجام دهد. اگر macOS آن را رد کند، خطا بلافاصله شناسایی شده و یک اعلان (notification) بلند روی دسکتاپ نمایش داده می‌شود. هیچ خروج بی‌صدایی در کار نیست. در مرحله بعد، خودِ مفسر شل (shell interpreter) نیز باید دسترسی Full Disk Access را در System Settings دریافت کرده باشد. از آنجایی که این مجوز بسیار کلی است، من با نگه داشتن تمام اسکریپت‌های اتوماسیون کاملاً خارج از درخت پوشه Documents، میزان قرارگیری در معرض خطر را به حداقل می‌رسانم. آن‌ها در یک دایرکتوری اختصاصی در جای دیگری قرار دارند و مسیر vault به طور صریح ارجاع داده می‌شود. این ترکیب از تشخیص زودهنگام، هشدارهای پرسرصدا و قرارگیری دقیق پوشه‌ها، سناریوی مرگ بی‌صدا را حل می‌کند.

طراحی برای حالت Sleep، تایم‌اوت‌ها و کارهای متوقف‌شده

لپ‌تاپ‌ها به حالت sleep می‌روند. شبکه‌ها دچار اختلال لحظه‌ای می‌شوند. فراخوانی‌های API گیر می‌کنند. یک کار متوقف‌شده نباید کل سیستم را برای مدت نامحدود از کار بیندازد.

من از چهار مکانیزم کاربردی برای پایدار نگه داشتن پایپ‌لاین استفاده می‌کنم.

بازه زمانی‌های متعدد. به جای شرط‌بندی روی یک اجرای واحد در اوایل صبح، زمان‌بند (scheduler) در نقاط مختلف روز دوباره تلاش می‌کند. اگر دستگاه در سپیده‌دم بسته بوده باشد، بازه بعدازظهر همچنان آن را پوشش می‌دهد.

نشانگرهای اتمام کار. وقتی یک اجرا با موفقیت انجام می‌شود، یک ردپای (breadcrumb) واضح از خود به جای می‌گذارد. تلاش زمان‌بندی‌شده بعدی ابتدا آن نشانگر را بررسی می‌کند. اگر کار قبلاً انجام شده باشد، در عرض چند ثانیه به طور تمیز خارج می‌شود. این کار از فراخوانی‌های غیرضروری API و پردازش‌های تکراری جلوگیری می‌کند.

قفل کردن فایل از طریق mkdir. برای جلوگیری از اجرای همزمان و هم‌پوشان، از یک قفل مبتنی بر دایرکتوری استفاده می‌کنم. ایجاد یک دایرکتوری در سیستم‌فایل‌های محلی یک عملیات اتمیک (atomic) است، بنابراین دو کار همزمان نمی‌توانند مسیر قفل یکسانی را تصاحب کنند. اگر دایرکتوری از قبل وجود داشته باشد، نمونه دوم بلافاصله متوقف می‌شود. وقتی اولی تمام شد، دایرکتوری را حذف می‌کند. این روش از فایل‌های PID سبک‌تر و از