बड़े पैमाने पर बातचीत के कच्चे लॉग (raw conversation logs) अपठनीय हो जाते हैं। कुछ महीनों के भारी उपयोग के बाद, आप लाखों लाइनों के आने-जाने वाले संवादों को देखते रह जाते हैं। उन्हें खोजना धीमा है; उन्हें पढ़ना असंभव है। इसके विपरीत, एक Obsidian vault आपको एक संरचित दीर्घकालिक स्मृति (structured long-term memory) देता है: द्वि-दिशीय लिंक (bi-directional links), टैग और एक ग्राफ व्यू जो कनेक्शन को सामने लाता है। दोनों के बीच का अंतर स्पष्ट है। इसे पाटने के लिए ऑटोमेशन की आवश्यकता है।

मैंने एक छोटी पाइपलाइन बनाई है जो हर रात इस अंतर को पाट देती है। यह बिना किसी मानवीय हस्तक्षेप के क्रम में तीन चरणों में चलती है। सबसे पहले, यह नवीनतम बातचीत के एक्सपोर्ट्स को इकट्ठा करती है और उन्हें उनकी वर्तमान स्थिति तक रिफ्रेश करती है। दूसरा, यह Claude के माध्यम से पिछले 28 घंटों के कच्चे संवाद का सार निकालती है, और संरचित सारांशों (structured summaries) को सीधे Obsidian vault में जोड़ देती है। 28 घंटे की यह विंडो जानबूझकर चुनी गई है; यह पिछले पूरे दिन को कवर करती है और देरी के लिए एक छोटा बफर भी देती है। तीसरा, यह परिवर्तनों को एक निजी रिपॉजिटरी (private repository) में कमिट और पुश करके सब कुछ बैकअप करती है, जो ऑफलाइन स्टोरेज और आकस्मिक विलोपन (accidental-deletion) के बीमा, दोनों के रूप में कार्य करती है। पूरी श्रृंखला का उबाऊ और विश्वसनीय होना आवश्यक है। बोरिंग ऑटोमेशन ही लक्ष्य है।

जब macOS चुपचाप आपके स्क्रिप्ट को मार देता है

एक नाइटली जॉब (nightly job) का सबसे बड़ा दुश्मन कोई नाटकीय क्रैश नहीं है। यह चुप्पी है।

macOS पर, Documents फोल्डर TCC के संरक्षण में रहता है, जो एक प्राइवेसी सबसिस्टम है और संवेदनशील स्थानों तक पहुंच को नियंत्रित करता है। यदि आप अपने स्क्रिप्ट को launchd के माध्यम से शेड्यूल करते हैं, तो सिस्टम बिना किसी ऐसे एरर के जिसे आप नोटिस कर सकें, सीधे प्रक्रिया को ब्लॉक कर सकता है। आपकी लॉग फ़ाइल खाली रहती है। आपका vault कभी अपडेट नहीं होता। काम विफल हो गया, लेकिन आपको इस कमी का पता दिनों बाद तब चलता है जब आपको एहसास होता है कि आपके नोट्स पुराने हो गए हैं।

मैं इसे एक सख्त प्रीफ़्लाइट रूटीन (preflight routine) के साथ संभालता हूँ। मुख्य काम शुरू होने से पहले, स्क्रिप्ट लक्षित डायरेक्टरी के अंदर एक हानिरहित राइट ऑपरेशन (write operation) करने का प्रयास करती है। यदि macOS इसे मना कर देता है, तो विफलता तुरंत पकड़ ली जाती है और एक तेज़ डेस्कटॉप नोटिफिकेशन आता है। कोई शांत एग्जिट (quiet exit) नहीं होता। इसके बाद, शेल इंटरप्रेटर (shell interpreter) को स्वयं System Settings के अंदर Full Disk Access दिया जाना आवश्यक है। वह अनुमति बहुत व्यापक है, इसलिए मैं सभी ऑटोमेशन स्क्रिप्ट्स को सुरक्षित Documents फोल्डर ट्री से पूरी तरह बाहर रखकर जोखिम को कम करता हूँ। वे कहीं और एक समर्पित डायरेक्टरी में रहते हैं, और vault पाथ का स्पष्ट रूप से संदर्भ दिया जाता है। शुरुआती पहचान, शोर वाले अलर्ट और सावधानीपूर्वक फोल्डर प्लेसमेंट का यह संयोजन 'साइलेंट डेथ' (silent death) परिदृश्य को ठीक कर देता है।

स्लीप, टाइमआउट और फ्रीज़ हुए जॉब्स के लिए डिज़ाइन करना

लैपटॉप स्लीप मोड में चले जाते हैं। नेटवर्क में रुकावट आती है। API कॉल्स हैंग हो जाते हैं। एक अकेला फ्रीज़ हुआ जॉब पूरे सिस्टम को अनिश्चित काल के लिए नहीं रोक देना चाहिए।

पाइपलाइन को स्थिर रखने के लिए मैं चार व्यावहारिक तंत्रों का उपयोग करता हूँ।

कई टाइम स्लॉट्स। सब कुछ सुबह के एक ही रन पर दांव लगाने के बजाय, शेड्यूलर दिन भर में अलग-अलग समय पर फिर से प्रयास करता है। यदि भोर के समय मशीन बंद थी, तो दोपहर का विंडो उसे पकड़ लेता है।

डन मार्कर्स (Done markers)। जब कोई रन सफल होता है, तो वह एक स्पष्ट निशान (breadcrumb) छोड़ देता है। अगला निर्धारित प्रयास पहले उस मार्कर की जांच करता है। यदि काम पहले से ही पूरा हो चुका है, तो यह कुछ ही सेकंड में साफ तरीके से बाहर निकल जाता है। यह अनावश्यक API कॉल्स और दोहराव वाली प्रोसेसिंग को रोकता है।

mkdir के माध्यम से फ़ाइल लॉक। ओवरलैपिंग एक्जीक्यूशन से बचने के लिए, मैं डायरेक्टरी-आधारित लॉक का उपयोग करता हूँ। लोकल फ़ाइल सिस्टम पर डायरेक्टरी बनाना एटॉमिक (atomic) होता है, इसलिए दो एक साथ चलने वाले जॉब एक ही लॉक पाथ का दावा नहीं कर सकते। यदि डायरेक्टरी पहले से मौजूद है, तो दूसरा इंस्टेंस तुरंत रुक जाता है। जब पहला समाप्त हो जाता है, तो यह डायरेक्टरी को हटा देता है। यह PID फ़ाइलों की तुलना में हल्का है और अधिक कठिन