खाली फ़ील्ड, चमकता हुआ लेबल: क्रिकेट एशिया पाइपलाइन में वह गड़बड़ी जो सफलता का चेहरा लेकर आई
**मुख्य उत्तर:** क्रिकेट एशिया डोमेन के एक स्टेज-1 निष्कर्षण आउटपुट में `domain_label` वैध था, जबकि सारांश, लेखक-रुख, सूचना बिंदु और संस्थाएँ सभी खाली थीं। यह क्रॉल विफलता, स्कीमा-आधारित साइलेंट डिग्रेडेशन और सामग्री से स्वतंत्र वर्गीकरण का संयुक्त परिणाम है। **मुख्य तथ्य:** - `one_sentence_summary` रिक्त, `author_stance` और `article_purpose` दोनों N/A दर्ज थे। - `information_points` एक खाली सरणी थी; किसी बिंदु के साथ `source` फ़ील्ड मौजूद नहीं था। - `entities` में संस्थाओं के नाम के बजाय "ऊपर के सूचना बिंदुओं से पहचानें" निर्देश दर्ज था। - डोमेन लेबल `cricket_asia` वैध बना रहा, क्योंकि वर्गीकरण URL, डोमेन और शीर्षक पर स्वतंत्र रूप से काम करता है। - क्रॉल लॉग, मूल URL और कैप्चर समय उपलब्ध नहीं; विफलता का स्तर निर्धारित नहीं किया जा सकता। **स्रोत श्रेय:** स्टेज-1 एक्सट्रैक्शन रिपोर्ट (आंतरिक दस्तावेज़; प्रकाशन तिथि उपलब्ध नहीं)। CricSultan डेटाबेस के विरुद्ध स्वतंत्र सत्यापन नहीं किया गया। **संबंधित प्रश्नोत्तर:** प्रश्न: खाली रिकॉर्ड के बजाय किस बैच की जाँच पहले होनी चाहिए? उत्तर: उन रिकॉर्ड्स की जिनमें फ़ील्ड भरे हैं पर स्रोत अनुपस्थित है, क्योंकि वही जाँच पास कर जाते हैं और झूठ को दस्तावेज़ बना देते हैं। प्रश्न: न्यूनतम अवरोध क्या होना चाहिए? उत्तर: `information_points` को गैर-रिक्त होना चाहिए, हर बिंदु के साथ `source` अनिवार्य हो, और सारांश तथा संस्थाएँ दोनों भरे होने चाहिए; कोई शर्त टूटे तो रिकॉर्ड "निष्कर्षण विफल" अंकित हो। प्रश्न: पाइपलाइन का डिबगिंग क्यों अवरुद्ध है? उत्तर: हर खाली रिकॉर्ड के साथ विफलता स्तर, स्टेटस कोड और समय दर्ज न होने पर कारण और मरम्मत दोनों अलग नहीं किए जा सकते।
सोमवार की दोपहर, बेंगलुरु के अपार्टमेंट में, मैंने एक JSON पेलोड खोला और लगभग चौदह सेकंड तक स्क्रीन को बिना कुछ किए देखता रहा। फ़ाइल में एक फ़ील्ड चमक रही थी — domain_label: cricket_asia. यह वैध था। साफ़-सुथरा, प्रारूप के हिसाब से पूरी तरह सही, किसी भी निगरानी डैशबोर्ड की नज़र में एक हरा बिंदु। उसके नीचे one_sentence_summary खाली था। author_stance में N/A। article_purpose में भी N/A। information_points एक खाली सरणी थी — शून्य, null नहीं, बिल्कुल शून्य, जैसे किसी ने गिनती शुरू ही न की हो। और entities में जो लिखा था वह किसी बल्लेबाज़, किसी बोर्ड, किसी मैदान का नाम नहीं था, बल्कि एक निर्देश था: "ऊपर के सूचना बिंदुओं से पहचानें।" निर्देश उस चीज़ को पहचानने का था जो मौजूद ही नहीं थी।
फ़्रीज़-फ़्रेम व्याख्या से पहले आ गया। व्याख्या यह थी: यह किसी लेख का सारांश नहीं, किसी मशीन की ईसीजी रिपोर्ट है — जिसमें सभी लीड जुड़े हुए हैं, पेपर साफ़ चल रहा है, और धड़कन दर्ज ही नहीं हुई। स्वास्थ्य का दिखावा पूरा, जान की गिनती शून्य।
इस रिपोर्ट के आगे का हिस्सा पढ़ने से पहले यह साफ़ कर देना ज़रूरी है कि मैं यहाँ किसी एक खबर की समीक्षा नहीं कर रहा। जो मेरे हाथ में है वह एक स्टेज-1 निष्कर्षण आउटपुट है — यानी उस कदम का नतीजा जो किसी बाहरी लेख को पढ़कर उसके भीतर से तथ्य निकालता है, ताकि अगला कदम उन तथ्यों पर अपना विश्लेषण खड़ा कर सके। उस पहले कदम ने कुछ नहीं निकाला। जो चीज़ बाहर आई, वह पूरी तरह खाली है। और यही इस पूरे मामले को दिलचस्प बनाता है — खालीपन नहीं, बल्कि खालीपन के साथ आया वह हरा लेबल।
क्रिकेट एशिया का कंटेंट सप्लाई चेन बाकी खेल पत्रकारिता से अलग नहीं है, बस उसकी गलियाँ ज़्यादा पेचीदा हैं। सबसे ऊपर बोर्डों की आधिकारिक विज्ञप्तियाँ हैं — जो अक्सर धीरे आती हैं, कम आती हैं, और जब आती हैं तो उनमें तारीख़ के साथ-साथ वह संदर्भ भी होता है जो कोई दूसरा नहीं दे सकता। उसके बाद वायर एजेंसियों की कॉपी है, जो तेज़ है और जिसकी त्रुटि दर उतनी ही तेज़ी से फैलती है। उसके नीचे एग्रीगेटर हैं, जो अक्सर मूल को पूरी तरह हटा देते हैं और सिर्फ़ निष्कर्ष छोड़ देते हैं। और सबसे नीचे वे साइटें हैं जो स्कोर, आँकड़े और मैच-सेंटर चलाती हैं — जहाँ सामग्री का बड़ा हिस्सा जावास्क्रिप्ट से बनता है और जहाँ किसी साधारण क्रॉलर को कुछ नहीं मिलता।
इस ढाँचे में निष्कर्षण उपकरण का काम एक ही है: कच्चे पाठ को ऐसे खानों में बदलना जिन पर अगली मशीन या अगला संपादक भरोसा कर सके। और जब वह उपकरण विफल होता है, तो तीन अलग-अलग जगहों पर विफल होता है — तीनों जगहें तकनीकी रूप से अलग हैं, तीनों की मरम्मत अलग है, और तीनों मिलकर वही नतीजा देती हैं जो मैंने सोमवार को देखा।
पहली जगह क्रॉलर है। यह वह कदम है जो पेज को असल में खींचता है। क्रिकेट एशिया के संदर्भ में यह कदम चार तरीक़ों से मर सकता है, और चारों आम हैं। एक, सर्वर 403 लौटा देता है। दो, पेज के पीछे पेबॉल है और क्रॉलर को दीवार दिखती है। तीन, पेज खाली आता है क्योंकि सामग्री ब्राउज़र में जावास्क्रिप्ट चलने के बाद बनती है — क्रॉलर को शेल मिलता है, कंटेंट नहीं। चार, कुछ बोर्ड साइटें भौगोलिक रूप से सीमित हैं, यानी उसी लेख का एक संस्करण भारत से खुलता है और दूसरा कहीं और से नहीं। इन चारों में साझा बात यह है कि हर मामले में क्रॉलर के पास लौटाने के लिए कुछ नहीं होता, और वह चुपचाप वापस आ जाता है।
दूसरी जगह निष्कर्षक ही है। मान लीजिए क्रॉलर ने कुछ लाया, लेकिन लाया हुआ पाठ अपेक्षित ढाँचे में नहीं बैठा। तब सिस्टम के सामने दो रास्ते हैं। एक, ज़ोर से असफल हो जाओ — त्रुटि फेंको, बैच रोको, अलार्म बजाओ। दो, खाली संरचना लौटा दो और आगे बढ़ जाओ। व्यवहार में लगभग हर बड़ी पाइपलाइन दूसरा रास्ता चुनती है, क्योंकि पहला रास्ता हज़ारों रिकॉर्ड वाले बैच को एक खराब रिकॉर्ड की वजह से रोक देता है। यह चुनाव इंजीनियरिंग के नज़रिए से समझ में आता है और पत्रकारिता के नज़रिए से विनाशकारी है, क्योंकि इसका मतलब है कि सिस्टम के पास "कुछ नहीं मिला" और "पढ़ा ही नहीं जा सका" के बीच कोई फ़र्क़ करने का तरीक़ा नहीं बचता। दोनों एक ही खाली सरणी बनकर बाहर आते हैं।
तीसरी जगह वर्गीकरण है, और यहीं कहानी तीखी होती है। जो उपकरण लेख को cricket_asia का लेबल देता है, वह अक्सर लेख की सामग्री पढ़कर यह तय नहीं करता। वह URL देखता है, डोमेन देखता है, शीर्षक देखता है, कभी-कभी सिर्फ़ पहले कुछ शब्द देखता है। यह डिज़ाइन तेज़ है और सस्ता है और ज़्यादातर मामलों में सही भी है। लेकिन इसका एक साइड इफ़ेक्ट है जिसे कोई डैशबोर्ड नहीं दिखाता: वर्गीकरण उस चीज़ से पूरी तरह स्वतंत्र रूप से काम करता है जिसे निष्कर्षण ने बचाया या खोया। लेख का शरीर खाली हो, निष्कर्षण कुछ न लौटाए, फिर भी लेबल चमकता रहेगा, क्योंकि लेबल को शरीर की ज़रूरत ही नहीं थी।
यह तीन-स्तरीय विफलता इसलिए ख़तरनाक है कि इसके हर हिस्से को अलग-अलग देखकर जायज़ ठहराया जा सकता है। क्रॉलर का नरमी से लौट आना जायज़ है — वह वेबसाइटों पर हमला नहीं करना चाहता। निष्कर्षक का खाली संरचना लौटाना जायज़ है — वह बैच नहीं रोकना चाहता। वर्गीकरण का सामग्री से स्वतंत्र रहना जायज़ है — वह सस्ता और तेज़ रहना चाहता है। तीनों जायज़, और तीनों मिलकर एक ऐसी रिकॉर्ड बनाते हैं जो दिखने में पूरी है, नापने में शून्य है, और सिस्टम के हिसाब से सफल है। ऐसी रिकॉर्ड को डेटाबेस में कोई जगह नहीं मिलती, क्योंकि डेटाबेस के पास "अधूरा" नाम का कोई खाना ही नहीं है।
यहाँ एक पल के लिए रुकना ज़रूरी है, क्योंकि मुझे लगता है कि यह समस्या क्रिकेट रिपोर्टिंग के उस पुराने सवाल का ही डिजिटल संस्करण है जिससे मैं पिछले बाईस साल से टकराता आ रहा हूँ। जब मैं किसी मैच का विश्लेषण करता हूँ, तो मुझे स्कोरकार्ड से कोई शिकायत नहीं होती — लेकिन स्कोरकार्ड कभी भी मेरा आधार नहीं रहा। स्कोरकार्ड बताता है कि कितने रन बने, कौन आउट हुआ, किसने कितने ओवर फेंके। यह सब सही है और यह सब अपर्याप्त है, क्योंकि इसमें वह चीज़ नहीं है जो मुझे चाहिए: गेंद कहाँ पड़ी, बल्लेबाज़ कहाँ खड़ा था, फ़ील्डर कहाँ से भागा, और इन तीनों के बीच कितना समय लगा। मेरा पूरा तरीक़ा — सेकंड, मीटर, शुरुआती ज़ोन — इसी अंतर पर खड़ा है। स्कोरकार्ड आपको नतीजा देता है। इवेंट लॉग आपको तंत्र देता है। और आज जो पाइपलाइन विफल हुई, उसने मुझे इवेंट लॉग देने के बजाय एक ऐसा कार्ड थमा दिया जिस पर सिर्फ़ टीमों के नाम छपे थे।
इसी वजह से मेरे लिए इस रिपोर्ट का सबसे अहम हिस्सा वह है जिसे सबसे कम देखा जाता है — source फ़ील्ड। यह एक छोटी सी चीज़ है, एक स्ट्रिंग, शायद कुछ शब्द। लेकिन यह पूरी इमारत की लोड-बेयरिंग दीवार है। अगर मुझे पता नहीं कि कोई सूचना बिंदु बोर्ड की आधिकारिक विज्ञप्ति से आया है या किसी एग्रीगेटर की दोबारा लिखी गई कॉपी से, तो मेरे पास उस बिंदु की गुणवत्ता तय करने का कोई साधन नहीं है। और यह अंतर क्रिकेट एशिया में सौम्य नहीं है। बोर्ड की विज्ञप्ति बताती है कि अनुबंध में क्या लिखा है। एग्रीगेटर की कॉपी बताती है कि किसी ने अनुबंध के बारे में क्या समझा। ये दो अलग-अलग दुनियाएँ हैं, और इन्हें एक ही खाने में डाल देने से पैदा हुआ मिश्रण आगे कभी अलग नहीं किया जा सकता।
मेरे पास एक नियम है जो मैंने अपने काम के लिए बनाया था और जिसे मैं अब किसी भी सामग्री पाइपलाइन के लिए सीधे लागू कर सकता हूँ। नियम यह है: किसी दावे को तभी प्रकाशित करो जब तुम उसे वीडियो पर समय के साथ नाप सको। इसका डिजिटल अनुवाद यह है: किसी रिकॉर्ड को तभी "सफल" मानो जब उसका हर तथ्य किसी ऐसे दस्तावेज़, फ़्रेम या ऑन-रिकॉर्ड उद्धरण तक वापस जाता हो जिसे कोई तीसरा व्यक्ति खोलकर जाँच सके। दस्तावेज़ नहीं, तो दावा नहीं। जिस रिकॉर्ड में फ़ील्ड भरे हैं पर स्रोत खाली है, वह रिकॉर्ड खाली रिकॉर्ड से ज़्यादा ख़तरनाक है, क्योंकि खाली रिकॉर्ड अपनी खालीपन का ऐलान कर देता है और भरा हुआ रिकॉर्ड चुप रहता है।
इसलिए जो अगला कदम उठाया जाना चाहिए, वह सुधार नहीं, एक ठोस अवरोध है। और उस अवरोध को तीन शर्तों पर खड़ा होना चाहिए, जिन्हें मशीन की भाषा में नहीं, संपादक की भाषा में लिखा जाना चाहिए। पहली: information_points एक खाली सरणी नहीं होनी चाहिए — यानी अगर लेख से कुछ नहीं निकला तो यह साफ़ लिखा जाए कि कुछ नहीं निकला, छिपाया न जाए। दूसरी: हर सूचना बिंदु के साथ उसका स्रोत अनिवार्य हो — स्रोत के बिना बिंदु गिना ही न जाए। तीसरी: सारांश और संस्थाएँ दोनों अनिवार्य हों। इनमें से कोई भी शर्त टूटे तो रिकॉर्ड को "सफल" नहीं, "निष्कर्षण विफल" का दर्जा मिलना चाहिए। यह तकनीकी रूप से एक पंक्ति का बदलाव है और व्यवहार में पूरी पाइपलाइन की शब्दावली बदल देता है, क्योंकि तब डैशबोर्ड पर हरा रंग झूठ नहीं बोलेगा।
और यह बदलाव इसलिए भी ज़रूरी है कि खाली रिकॉर्ड का सफ़र यहीं ख़त्म नहीं होता। अगर वह आगे बढ़ता है, तो अगला कदम उस खालीपन को भरने की कोशिश करेगा — क्योंकि कोई भी मॉडल या कोई भी संपादक खाली खाने को खाली नहीं छोड़ना चाहता। और जिस पल वह उसे भरता है, उसी पल कल्पना दस्तावेज़ बन जाती है। मैंने अपने करियर में यह बहुत बार देखा है, अलग रूप में: किसी मैच रिपोर्ट में एक वाक्य जोड़ दिया जाता है क्योंकि "ऐसा ही हुआ होगा", और तीन साल बाद वही वाक्य किसी और रिपोर्ट का हवाला बन जाता है। खाली फ़ील्ड एक ईमानदार चीख है। भरी हुई मगर बेस्रोत फ़ील्ड एक शालीन झूठ है। और पाइपलाइन की असली समस्या दूसरी है।
यहाँ वह मोड़ आता है जहाँ मुझे अपनी ही शुरुआती प्रतिक्रिया से असहमत होना पड़ता है। जब मैंने यह पेलोड खोला, तो मेरी पहली सोच यही थी: यह विफलता है, इसे ठीक करो। लेकिन अगर मैं इसे उसी ठंडेपन से देखूँ जिसकी कोशिश मैं हर रिपोर्ट में करता हूँ, तो यह खाली रिकॉर्ड असल में खराब सिस्टम के भीतर एक अच्छा व्यवहार है। इसने जो किया, वह ठीक वही है जो एक बेईमान रिकॉर्ड नहीं करता — इसने अपना खालीपन छिपाया नहीं। इसने N/A लिखा, शून्य लिखा, कुछ भी बनाया नहीं। जिस सिस्टम में हज़ारों रिकॉर्ड रोज़ गुज़रते हैं, वहाँ सबसे बड़ा ख़तरा खाली रिकॉर्ड नहीं है। सबसे बड़ा ख़तरा वह रिकॉर्ड है जो आधा भरा है, जिसमें सारांश मौजूद है, संस्थाएँ मौजूद हैं, बिंदु मौजूद हैं — और हर बिंदु का स्रोत किसी न किसी कदम पर गिर गया है। वह रिकॉर्ड हर जाँच पास कर जाएगा, क्योंकि जाँच खालीपन देखती है, स्रोत की गहराई नहीं।

इसका सीधा मतलब यह है कि जिस बैच की जाँच सबसे पहले होनी चाहिए, वह खाली बैच नहीं है। खाली बैच अपने आप नज़र आ गया। पहली जाँच उन रिकॉर्ड्स पर होनी चाहिए जो "पूरे" दिखते हैं — क्योंकि उन्हीं में यह छिपा हुआ है कि स्रोत कब काटा गया, संस्थाओं के रिश्ते कब अनुमान से बने, और सारांश कब शीर्षक की दोबारा भाषा बन गया। एक बात मैं दावे से नहीं, सवाल के रूप में रखूँगा: जब किसी पाइपलाइन में हरा लेबल उस सामग्री से आज़ाद हो जाता है जिसे उसे प्रमाणित करना चाहिए, तो उस पाइपलाइन का पूरा भरोसा-मॉडल ही दोबारा लिखना पड़ता है, सिर्फ़ एक फ़ंक्शन नहीं।
मुझे यह भी साफ़ कहना है कि मेरे पास इस रिकॉर्ड की क्रॉल लॉग नहीं है और न ही मूल URL और न ही उसका कैप्चर समय। इसका मतलब यह है कि मैं यह भी नहीं बता सकता कि विफलता पहले स्तर पर हुई या दूसरे पर — क्योंकि दोनों स्तर एक ही खाली परिणाम देते हैं। यह अपने आप में एक सबक है: जो पाइपलाइन अपनी विफलता के कारण नहीं बताती, वह अपनी विफलता की मरम्मत भी नहीं कर सकती। डिबगिंग के लिए ज़रूरी है कि हर खाली रिकॉर्ड के साथ यह दर्ज हो कि वह किस स्तर पर, किस स्टेटस कोड पर, किस समय पर खाली हुआ। बिना उसके, हम एक ऐसी मशीन की मरम्मत कर रहे हैं जो अपनी बीमारी बताना बंद कर चुकी है।
इस पूरे प्रकरण में एक चीज़ मुझे बार-बार लौटकर सताती है। मेरे पास एक ठंडी स्प्रेडशीट है जिसमें मैं सालों से हर ट्रांज़िशन सीक्वेंस को उसके शुरुआती ज़ोन के हिसाब से दर्ज करता आया हूँ, और उसके बगल में एक और फ़ाइल है जिसमें वही मैच बैठे हैं जिन्हें मैंने किसी न किसी शाम स्टेडियम में या टीवी के सामने बैठकर देखा था। दोनों फ़ाइलें एक ही चीज़ नहीं हैं और मैंने कभी उन्हें एक मानकर काम नहीं किया। स्प्रेडशीट मुझे बताती है कि क्या हुआ। मेरी याद बताती है कि वह कैसा लगा। जिस दिन मैं इन दोनों को एक ही खाने में डाल दूँगा, उस दिन मेरी पत्रकारिता वही गलती करेगी जो आज इस पाइपलाइन ने की है — सफल दिखना, और खाली होना।
अगली बार जब कोई पाइपलाइन यह कहे कि सब ठीक है, तो मेरा सवाल यह होगा: क्या वह हर रिकॉर्ड के लिए वह एक दस्तावेज़ दिखा सकती है जिसे खोला जा सके? अगर नहीं, तो जो ठीक लग रहा है वह ठीक नहीं है — वह बस अभी तक किसी ने उसे खोला नहीं।
