শূন্য বাইটের সততা: ক্রিকেট ডেটা পাইপলাইনের নীরব ব্যর্থতা ও অন-চেইন অডিট-ট্রেইলের প্রয়োজন
core_answer: একটি ক্রিকেট অ্যানালিটিক্স পাইপলাইনে স্টেজ-১ পেলোড শূন্য তথ্য-বিন্দু নিয়ে স্টেজ-২-এ পৌঁছেছে, কোনো এরর ফ্ল্যাগ ছাড়াই। ফলে আটটি বিশ্লেষণী বিভাগই শূন্য অবস্থায় ফিরেছে। কনটেন্ট হ্যাশ ও অন-চেইন অডিট-ট্রেইল এমন নীরব ব্যর্থতাকে যাচাইযোগ্য প্রমাণে রূপ দিতে পারে।
key_facts: নিবন্ধের শিরোনাম, সূত্র ও ধরন — সবই N/A বা Unclassified; তথ্য-বিন্দুর তালিকা সম্পূর্ণ খালি ছিল।; ডোমেইন লেবেল cricket_world কাঠামোর প্রত্যাশিত Cricket লেবেলের সঙ্গে মেলেনি।; রিপোর্টের সতর্কতা: null আউটপুট ডাউনস্ট্রিমে “ঝুঁকি নেই” হিসেবে ভুলভাবে পড়া হতে পারে।; সুপারিশ: শূন্য তথ্য-বিন্দু বা Unclassified পেলোড প্রত্যাখ্যান করার ন্যূনতম-বিষয়বস্তু গেট যোগ করা।; ব্লকচেইন ভাঙা পার্সার সারায় না; এটি কেবল ব্যর্থতাকে প্রমাণযোগ্য করে।
source_attribution: সূত্র: Stage-2 Deep Analysis Report (পাইপলাইন ডায়াগনস্টিক, ইনপুট-অখণ্ডতা নোটিসহ)। নথিটিতে প্রকাশের কোনো তারিখ উল্লেখ নেই এবং স্টেজ-১-এ সময়-সংবেদনশীলতা যাচাই হয়নি।
related_qa: q: শূন্য তথ্য-বিন্দুর পেলোড কেন ঝুঁকিপূর্ণ?, a: কারণ ডাউনস্ট্রিম মডেল “তথ্য নেই” ও “ঝুঁকি নেই” এক করে পড়তে পারে, যা false-negative hazard তৈরি করে।; q: ব্লকচেইন কি এই পাইপলাইন ব্যর্থতা ঠেকাতে পারে?, a: কনটেন্ট হ্যাশ ও অ্যাপেন্ড-অনলি অ্যাটেস্টেশন ব্যর্থতাকে প্রমাণযোগ্য করে, কিন্তু ভাঙা পার্সার বা ভুল ইনজেশন নিজে থেকে সারায় না।; q: পরবর্তী ধাপে কী করা উচিত?, a: পুনরায় ইনজেশন চালানো; তথ্য-বিন্দুর তালিকা অখালি হলে সম্পূর্ণ স্টেজ-২ বিশ্লেষণ সম্ভব হবে।
আটটি বিশ্লেষণী বিভাগ। প্রতিটির নিচে একটি টেবিল, প্রতিটি ঘরে একই বাক্য: “অপর্যাপ্ত তথ্য, মূল্যায়ন সম্ভব নয়।” স্টেজ-২ গভীর বিশ্লেষণ রিপোর্টটি আমার ডেস্কে নামে, আর তার সবচেয়ে ভয়ংকর লাইনটি কোনো ফাঁকা ঘর নয় — একটি সতর্কবার্তা: এই রিপোর্ট যদি ডাউনস্ট্রিমে চলে যায়, পাঠক “কোনো ঝুঁকি নেই” পড়তে পারে, অথচ সত্যি হলো “কোনো তথ্যই নেই।” এ ভূগোল আমার চেনা। বহু বছর ধরে আমি স্কোরকার্ডের পাশে নিজের স্প্রেডশিট রাখি, আর প্রথম যে নিয়মটি শিখেছি তা হলো: একটি ফাঁকা ঘর মিথ্যা বলে, যতক্ষণ না তাকে স্পষ্টভাবে “অজানা” লেবেল দেওয়া হয়। রিপোর্টটি লেবেলটি দিয়েছিল। আর ঠিক সেখানেই ব্লকচেইনের প্রশ্নটি ঢুকে পড়ে — লেবেলটি কে জারি করল, এবং তা কে যাচাই করল?
রিপোর্টে কী ছিল, তা সংক্ষেপে দরকার। শিরোনাম: N/A। সূত্র: N/A। নিবন্ধের ধরন: Unclassified। ডোমেইন লেবেল: cricket_world — যদিও কাঠামো চাইছিল Cricket। তথ্য-বিন্দুর তালিকা সম্পূর্ণ খালি। সত্তা তালিকাভুক্ত হয়নি। সময়-সংবেদনশীলতা যাচাই হয়নি। অর্থাৎ স্টেজ-১ থেকে যা এসেছে তা একটি কাঠামো, বিষয়বস্তু নয়।
কাঠামোগত সমস্যাটি এখানেই। ওই আটটি বিভাগের প্রতিটি ডিজাইন অনুযায়ী প্রমাণ-বাঁধা। প্রথমটির দরকার ফরম্যাট অ্যাঙ্কর — টেস্ট, ওডিআই, টি-টোয়েন্টি, নাকি দ্য হান্ড্রেড। দ্বিতীয়টির দরকার খেলোয়াড়ের ভূমিকা। তৃতীয়টির দরকার দল ও ফরম্যাট। চতুর্থটির দরকার একটি নামধারী লিগ। পঞ্চমটির দরকার শাসন-স্তর। ষষ্ঠটির দরকার সুনির্দিষ্ট ঝুঁকি-বস্তু। সপ্তমটির দরকার আখ্যানের লেবেল। অষ্টমটির দরকার সংক্রমণ-চ্যানেল। একটিও নেই। ফলে রিপোর্ট লেখক সিদ্ধান্ত নিয়েছেন: অনুমান নয়, প্রত্যাখ্যান।
আমি এই সিদ্ধান্তকে শ্রদ্ধা করি, কারণ আমি নিজেও একই কাজ করি। ২০২০ সালের মে মাসে বুন্ডেসলিগা খালি স্টেডিয়ামে ফিরলে ছয় সপ্তাহ ধরে ৮৩টি ম্যাচ লগ করেছিলাম; হোম-উইন হার ৪৩.২% থেকে ৩৩.৮%-এ নেমেছিল, এবং আমি ফলাফলটি আত্মবিশ্বাসের ব্যবধান ও একটি স্পষ্ট সতর্কবার্তা সহ প্রকাশ করেছিলাম — ৮৩ ম্যাচ দর্শক-প্রভাব সম্পর্কে প্রায় কিছুই প্রমাণ করে না। পাঠক কমেছিলেন। যারা ছিলেন, তারাই কাজের অ্যানালিস্ট। কিন্তু প্রক্রিয়া-ব্যর্থতা স্বীকার করা আর সেটিকে প্রমাণ করা — এই দুইয়ের মধ্যে একটি বড় ফাঁক আছে, এবং সেই ফাঁকটাই আজকের আলোচনার কেন্দ্র।
রিপোর্টটি একটি সুনির্দিষ্ট অনুমান হাজির করে: Unclassified ধরন, নন-স্কিমা ডোমেইন লেবেল এবং শূন্য তথ্য-বিন্দু — এই তিনটি একসাথে থাকা সাধারণত বোঝায় স্টেজ-১-এ ইনজেশন বা পার্সিং ব্যর্থ হয়েছে। পেওয়াল, জাভাস্ক্রিপ্ট-রেন্ডার করা পাতা, পিডিএফ বা ছবি-সূত্র, কিংবা আপস্ট্রিম টাইমআউট। যুক্তিটি সূক্ষ্ম: সত্যিকারের ক্রিকেট সাংবাদিকতায় প্রথম অনুচ্ছেদেই ফরম্যাটের নাম থাকে। ফরম্যাটের কোনো চিহ্নই না থাকা নিজেই একটি অস্বাভাবিক সংকেত।

কিন্তু মূল সমস্যা হলো, ব্যর্থতাটি ছিল নীরব। পাইপলাইনে কোনো ন্যূনতম-বিষয়বস্তু গেট নেই। শূন্য তথ্য-বিন্দুর পেলোড স্টেজ-২ পর্যন্ত পৌঁছেছে কোনো এরর ফ্ল্যাগ ছাড়াই। প্রতিটি পেলোডের সঙ্গে যদি একটি ম্যানিফেস্ট থাকত — ফেচ টাইমস্ট্যাম্প, HTTP স্ট্যাটাস, বাইট-দৈর্ঘ্য, পার্সার সংস্করণ, এবং বিষয়বস্তুর ক্রিপ্টোগ্রাফিক হ্যাশ — তবে “পার্সার ব্যর্থ হয়েছে” অনুমান হতো না, প্রমাণ হতো। বাইট-দৈর্ঘ্য শূন্য দেখলে গেট স্টেজ-২-এ ঢোকার আগেই প্রত্যাখ্যান করত।
এখানেই ব্লকচেইনের প্রকৃত সংযোগ। এটি ক্রিকেটের প্রশ্ন নয়, ডেটা সাপ্লাই-চেইনের প্রশ্ন। আজকের ক্রিকেট অ্যানালিটিক্স তিন ধাপে চলে: তরুণ-উন্নয়ন ও প্রতিভা-সরবরাহ → জাতীয় দল ও ফ্র্যাঞ্চাইজি লিগ → সম্প্রচার, বাণিজ্যিক মূল্যায়ন ও ডেরিভেটিভ বাজার। প্রতিটি ধাপ পরের ধাপকে ডেটা দেয়। কোনো একটি ধাপ নীরবে null ফিরিয়ে দিলে পরের ধাপটি উত্তরাধিকার সূত্রে একটি মিথ্যা নিশ্চয়তা পায়। বাংলাদেশ থেকে দুবাই পর্যন্ত যে পথ আমি হেঁটেছি, সেখানে এই দুর্বলতা আরও প্রকট: সহযোগী-দেশের প্রতিভা-পাইপলাইনে তথ্য প্রায়ই অনানুষ্ঠানিক, ছড়ানো, এবং যাচাইযোগ্য সূত্র ছাড়া।
এবং এখানেই আসল ঝুঁকি: শূন্য মানে “শূন্য” নয়, শূন্য মানে “অজানা” — কিন্তু মডেল দুটিকে আলাদা করতে শেখে না। রিপোর্টটি এটিকে false-negative hazard নাম দিয়েছে। আমার ভাষায়: ছোট নমুনা আবহাওয়ার রিপোর্ট, জলবায়ুর রায় নয়; আর শূন্য নমুনা কোনো রিপোর্টই নয় — সেটি একটি ফাঁকা পাতা, যাকে কেউ কেউ মেঘহীন আকাশ বলে ভুল করে। ২০১৮ সালে কাজানের সেই রাতে ফ্রান্স-আর্জেন্টিনা ম্যাচে আমি মিডফিল্ড ও ব্যাক-ফোরের মধ্যে ৩৮ মিটারের ফাঁক গুনেছিলাম — ৯০ মিনিটে ১১টি আলাদা ফাঁক। আমি প্লে-এর নাম নেওয়ার আগে খালি জায়গাগুলো গুনি। এখানেও তাই করছি: খালি ঘরগুলোই এখানে একমাত্র ঘটনা।
অ্যাপেন্ড-অনলি অ্যাটেস্টেশন এই ভুলটি তিনভাবে ঠেকাতে পারে। প্রথমত, অপরিবর্তনীয় অডিট-ট্রেইল — প্রতিটি ইনজেশন ইভেন্ট হ্যাশ করে শৃঙ্খলে লেখা যায়, ফলে পরে কেউ দাবি করতে পারে না যে তথ্য এসেছিল। দ্বিতীয়ত, কমিটমেন্ট স্কিম — আমি ম্যাচ শুরুর আগে পূর্বাভাসের হ্যাশ প্রকাশ করি, ফলে ম্যাচের পরে সেটি চুপচাপ বদলে দেওয়া অসম্ভব। তৃতীয়ত, কনটেন্ট-অ্যাড্রেসিং — একই হ্যাশ মানে একই বিষয়বস্তু, তাই “আমরা তো এটাই পাঠিয়েছিলাম” তর্কের অবসান। ডেটা উত্তরটিকে সাজায় না, প্রশ্নটিকে ধারালো করে।
এখন অস্বস্তিকর অংশটি। ব্লকচেইন একটি ভাঙা পার্সার সারায় না। আবর্জনাকে অন-চেইনে বসালে সেটি অপরিবর্তনীয় আবর্জনা হয়ে যায়। রিপোর্টের নিজের সুপারিশ ছিল অত্যন্ত সাদামাটা: শূন্য তথ্য-বিন্দু বা Unclassified ধরনযুক্ত পেলোড আগেই প্রত্যাখ্যান করার একটি অ্যাসারশন যোগ করুন। এতে কোনো টোকেন লাগে না, কোনো কনসেনসাস মেকানিজম লাগে না, খরচ প্রায় শূন্য — এবং সমস্যার বড় অংশ সমাধান হয়ে যায়।
লেজার শুধু প্রমাণ করে আপনি কী দাবি করেছিলেন; দাবিটি সত্য কি না, তা লেজার জানে না। এটাই অরাকল সমস্যা, এবং ক্রিকেটে এটি আরও তীক্ষ্ণ। রিপোর্ট নিজেই আরেকটি বিপদ চিহ্নিত করেছে: কাঠামোটি প্রতিটি বিভাগে ন্যূনতম তিনটি সিদ্ধান্ত ও দুটি “লুকানো তথ্য” দাবি করে, ফলে ইনপুট খালি থাকলে কৃত্রিম বিষয়বস্তু উদ্ভাবনের চাপ তৈরি হয়। এই চাপ কোনো শৃঙ্খল কমায় না — শুধু শৃঙ্খলা কমায়। আমি চোখের পরীক্ষায় ভরসা করার আগে গ্রিড এঁকেছি; কিন্তু গ্রিড যদি ফাঁকা হয়, তবে সততাপূর্ণ উত্তর একটাই — গ্রিডটি ফাঁকা বলে স্বীকার করা। একই কারণে প্রতি লেখায় দুয়ের বেশি ফ্রেমওয়ার্ক ঢোকাই না; ফ্রেমওয়ার্ক-বাহুল্য নিজেই এক ধরনের null।
সামনের চক্রে যা দেখার: পুনরায় ইনজেশন। ট্রিগার শর্ত পরিষ্কার — তথ্য-বিন্দুর তালিকা অখালি হলো কি না, শিরোনাম পূরণ হলো কি না। যদি একই পেলোড আবার হুবহু শূন্য ফেরে, তবে ধরতে হবে সূত্রটি স্থায়ীভাবে ব্যর্থ, এবং আইটেমটি বাদ দিতে হবে। আর যদি কেউ আপনাকে “অন-চেইন স্পোর্টস ডেটা” বিক্রি করতে আসে, একটি প্রশ্নই যথেষ্ট: ফেচ যখন শূন্য বাইট ফেরায়, তখন আপনার সিস্টেম কী করে? নিউজলেটার শুরু হয়েছিল একটি স্প্রেডশিট দিয়ে, কোনো ইশতেহার দিয়ে নয়; শৃঙ্খলও তেমনি শুরু হওয়া উচিত একটি খালি ঘরের স্বীকৃতি দিয়ে — একটি টোকেন দিয়ে নয়।
