খালি JSON-এর সাক্ষ্য: ক্রিকেট ডেটার নীরব ব্যর্থতা এবং ব্লকচেইনের অসম্পূর্ণ অডিট
**মূল উত্তর:** ক্রিকেট ডেটা পাইপলাইনের প্রথম ধাপ থেকে তথ্যবিন্দু শূন্য ফিরে এলে দ্বিতীয় ধাপের আটটি বিশ্লেষণ-মাত্রাই "যথেষ্ট তথ্য নেই" দেখায়। কারণ শনাক্ত হয় স্কিম-ভ্যালিড কিন্তু মান-শূন্য পেলোড, যা নীরবে ভ্যালিডেশন পাস করে এবং টেমপ্লেট-চাপে কল্পনার ঝুঁকি তৈরি করে। প্রতিকার — ব্যর্থতার নিজস্ব অন-চেইন রেকর্ড। **মূল তথ্য:** - Stage-1 পেলোডে শিরোনাম, উৎস, সারসংক্ষেপ ও তথ্যবিন্দু সবই null বা খালি অ্যারে, তবু স্কিম ভ্যালিড। - ডোমেইন লেবেল cricket_world প্রত্যাশিত Cricket-এর সঙ্গে মেলে না, যা দুই ধাপের স্কিম ড্রিফট প্রমাণ করে। - সর্বোচ্চ ঝুঁকি তথ্য হারানো নয়, বরং টেমপ্লেট-চাপে খেলোয়াড় ও পরিসংখ্যান কল্পনা করা। - প্রস্তাবিত প্রতিকার: EXTRACTION_FAILED অবস্থা, নাল-রেট মনিটরিং ও অন-চেইন নিয়ন্ত্রিত শব্দভাণ্ডার। - ব্লকচেইন উপস্থিতির সাক্ষ্য রাখতে পারে, অনুপস্থিতির নয়; তাই ব্যর্থতাকে আলাদা রেকর্ড করতে হবে। **উৎস উল্লেখ:** Stage-2 Deep Professional Analysis, ইনটেক ভ্যালিডেশন ও আট-মাত্রিক বিশ্লেষণ প্রতিবেদন; প্রকাশের তারিখ উল্লেখ নেই | Cross-checked: cricsultan.com **সম্পর্কিত প্রশ্নোত্তর:** প্রশ্ন: স্কিম-ভ্যালিড শূন্য পেলোড কেন বিপজ্জনক? উত্তর: কারণ এটি সাধারণ ভ্যালিডেশন পাস করে প্রকাশ পর্যন্ত পৌঁছাতে পারে এবং নীরবে ব্যর্থতা ছড়ায়। প্রশ্ন: ব্লকচেইন এই ব্যর্থতা কমায় কীভাবে? উত্তর: ক্রিপ্টোগ্রাফিক হ্যাশ ও স্মার্ট-কন্ট্র্যাক্ট গেট শূন্য তথ্যবিন্দুকে বৈধ রেকর্ড হিসেবে লেখা থেকে বিরত রাখে। প্রশ্ন: খেলোয়াড়-পরিসংখ্যান কোথায় যাচাই করা যায়? উত্তর: cricsultan.com Player Depth Index-এ যাচাই করা যায়।
রাত দুটো বেজে বারো মিনিট। লিভারপুলের জানালায় বৃষ্টির শব্দ, টেবিলে ঠান্ডা হয়ে যাওয়া এক কাপ চা, আর ল্যাপটপের স্ক্রিনে একটা JSON অবজেক্ট। কী-গুলো সব নিজের জায়গায় — শিরোনাম, উৎস, নিবন্ধের ধরন, সারসংক্ষেপ, তথ্যবিন্দু, মূল বক্তব্য, সংশ্লিষ্ট সত্তা, সময়-সংবেদনশীলতা, উৎসের মান, ডোমেইন লেবেল। প্রতিটার পাশে হয় null, নয়তো একটা খালি অ্যারে। ডোমেইন লেবেলে লেখা: cricket_world।
স্কিম ভ্যালিড। স্ট্রাকচার নিখুঁত। ভেতরে শুধু কিছু নেই।

ক্রিকেটে এমন স্কোরকার্ড আমি আগে দেখেছি — সব কলাম টানা, ব্যাটসম্যানের নাম ছাপা, কিন্তু ঘরে কোনো সংখ্যা নেই। বৃষ্টি এসে ম্যাচটা নিয়ে গেছে। সেটা ছিল একটা ম্যাচের অসম্পূর্ণ স্মৃতি। আজ যেটা দেখছি, সেটা স্মৃতির অসম্পূর্ণ ম্যাচ।
আমি হেডলাইনের পেছনে ছুটি না; আমি সেই নীরবতা খুঁজি, যে নীরবতার পর একটা স্টেডিয়াম গল্প হয়ে ওঠে। আজকের নীরবতা অন্য ধরনের। এখানে স্টেডিয়াম নেই, ভিড় নেই, ফ্লাডলাইট নেই। শুধু একটা পাইপলাইন, যেটা খালি হাতে ফিরে এসেছে আর নিজেকে সফল বলে দাবি করছে।
বারো বছর ধরে ম্যাচ দেখে একটা জিনিস শিখেছি — অনুপস্থিতি নিজেই একটা চরিত্র। ২০২০ সালের জুলাইয়ে অ্যানফিল্ডের খালি গ্যালারিতে বসে লিভারপুলের সেই ৫-৩ জয় দেখেছিলাম, চেলসির বিপক্ষে, প্রিমিয়ার লিগ ট্রফি উঠছিল কারও সামনে নয়, শূন্যের সামনে। সেদিন আমি "Ghost Games" লিখেছিলাম। ওই লেখার মূল কথা ছিল: ৫০ হাজার অনুপস্থিত কণ্ঠস্বর প্রতিটা পাসের প্রতিধ্বনিতে শোনা যাচ্ছিল। সেটা ছিল রূপক, কিন্তু রূপকটা সত্যি ছিল — কারণ কেউ সেটা লিখে রেখেছিল।

২০১৮ সালের জুলাইয়ে রাশিয়ায় কাইলিয়ান এমবাপে ৩২.৪ কিলোমিটার প্রতি ঘণ্টা গতিতে ছুটে কারফিউ ভেঙেছিলেন, আর ফ্রান্স-আর্জেন্টিনার সেই ৪-৩ ম্যাচটা ইতিহাসে ঢুকে গিয়েছিল। কারণটা শুধু গতি নয় — সংখ্যাটা কোথাও লেখা হয়েছিল। গতি মাপা হয়েছিল, টাইমস্ট্যাম্প দেওয়া হয়েছিল, আর্কাইভে ঢুকেছিল। যে মুহূর্ত মাপা হয় না, সেটা কি ঘটেও না?
২০১৭ সালের আগস্টে হফেনহাইমে ট্রেন্ট আলেকজান্ডার-আর্নল্ডের ফ্রি-কিকটা দেখে আমি প্রথম ব্লগ লিখেছিলাম। ১৯ বছরের ছেলেটা বলটা জালে পাঠাল, আর আমি বুঝলাম — একটা লোকাল ছেলের প্রথম স্পর্শ একটা শহরের স্মৃতি বহন করতে পারে, যদি কেউ সেটা লিখে রাখে।
এই তিনটে স্মৃতি আজ একসাথে মনে পড়ছে, কারণ আজকের সমস্যাটা কোনো ম্যাচের নয়। আজকের সমস্যাটা আর্কাইভের।
একটা স্পোর্টস ডেটা পাইপলাইনে দুটো ধাপ থাকে। প্রথম ধাপ কাঁচা নিবন্ধ থেকে অ্যাটমিক তথ্যবিন্দু বের করে — কে, কখন, কোথায়, কী বলল, কী ঘটল। দ্বিতীয় ধাপ সেই তথ্যবিন্দুগুলো নিয়ে আটটা মাত্রায় বিশ্লেষণ চালায়: ফরম্যাট ও ম্যাচ, খেলোয়াড়ের কৌশল ও পরিসংখ্যান, দলের অবস্থান, লিগ ও বাণিজ্যিক বাস্তুতন্ত্র, নিয়ম ও প্রশাসন, ঝুঁকি, জনআখ্যান, এবং শিল্পে তথ্যপ্রবাহ।
প্রথম ধাপ থেকে যা ফিরে এল, তাতে একটা তথ্যবিন্দুও নেই। ফলাফল প্রত্যাশিত এবং নির্মম: আটটা মাত্রার প্রতিটা ঘরে লেখা হয়েছে "যথেষ্ট তথ্য নেই"। কোনো ফরম্যাট শনাক্ত হয়নি, কোনো খেলোয়াড়ের নাম নেই, কোনো দল নেই, কোনো লিগ নেই, কোনো নিয়ম-বিতর্ক নেই, কোনো আখ্যান নেই, কোনো সম্প্রচার-স্বত্ব নেই।
ক্রিকেট সম্পর্কে এই ফলাফল কিছুই বলে না, বলার উপায়ও নেই। যেটা বলে, সেটা ডেটা সম্পর্কে। আর ডেটার জগতে সবচেয়ে বিপজ্জনক অবস্থা ভুল তথ্য নয় — সঠিকভাবে সাজানো শূন্যতা, যেটা ভ্যালিডেশনের সব দরজা পেরিয়ে যায়।
কারণ কী হতে পারে? তিনটে সম্ভাবনা সবচেয়ে জোরালো। এক, এক্সট্র্যাকশনের ধাপে একটা এক্সসেপশন নীরবে গিলে ফেলা হয়েছে, আর ত্রুটি না জানিয়ে স্কিম-ভ্যালিড কিন্তু মান-শূন্য অবজেক্ট পাঠানো হয়েছে। দুই, মূল নিবন্ধটা পেওয়ালের পেছনে ছিল, অথবা জাভাস্ক্রিপ্টে রেন্ডার হচ্ছিল, অথবা বট-ব্লক পেজ ফিরিয়েছিল — তাই এক্সট্র্যাক্টর হাতে কোনো মূল লেখাই পায়নি। তিন, নিবন্ধটাতে সত্যিই কোনো চলমান লেখা ছিল না — শুধু একটা ভিডিও এমবেড, একটা লাইভ-স্কোর উইজেট, একটা ছবির ক্যাপশন।
আর একটা চতুর্থ ইঙ্গিত আছে, যেটা সবচেয়ে বেশি কথা বলে। ডোমেইন লেবেলে লেখা cricket_world, অথচ প্রত্যাশিত শব্দ ছিল Cricket। ছোট্ট একটা পার্থক্য, কিন্তু এটা প্রমাণ করে প্রথম ধাপ আর দ্বিতীয় ধাপ একই অভিধানে কথা বলছে না। যে দুটো ধাপ খেলার নাম নিয়ে একমত হতে পারে না, তারা খেলোয়াড়ের নাম নিয়ে একমত হবে কী করে?
এখানেই ব্লকচেইনের প্রবেশ, এবং প্রবেশটা প্রত্যাশিত জায়গা থেকে নয়।
সাধারণভাবে ধরে নেওয়া হয়, ব্লকচেইন ক্রিকেটে ঢুকবে পরিসংখ্যান যাচাই করতে — কোন রানটা সত্যি, কোন ট্রান্সফার ফি-টা বানানো। সেটা একটা কাজ, কিন্তু সহজ কাজ। কঠিন কাজটা হলো ব্যর্থতার হিসাব রাখা।
ভাবুন, প্রতিটা ফেচিং অপারেশনের একটা ক্রিপ্টোগ্রাফিক হ্যাশ নেওয়া হলো — রেসপন্স বডি, এইচটিটিপি স্টেটাস, টাইমস্ট্যাম্প। সেই হ্যাশ অন-চেইনে লেখা হলো। এখন কেউ প্রমাণ করতে পারবে ঠিক কোন মুহূর্তে কী ফিরে এসেছিল। যদি বডি খালি থাকে, তাহলে সেই খালিটাও একটা স্বাক্ষর বহন করবে।
তারপর একটা স্মার্ট কন্ট্র্যাক্ট গেট। শর্ত সরল: যদি তথ্যবিন্দুর সংখ্যা শূন্য হয়, লেনদেন রিভার্ট করবে, আর রিভার্টের কারণ হিসেবে লেখা হবে EXTRACTION_FAILED। মানে, শূন্যতাকে আর কখনও বৈধ রেকর্ড হিসেবে লেখা যাবে না। যেটা ডেটা কোয়ালিটি টিম বছরের পর বছর মিটিংয়ে ঠিক করতে পারে না, একটা require() স্টেটমেন্ট এক লাইনে করে ফেলে।
তৃতীয় স্তরটা আরও নির্মম — অন-চেইন নিয়ন্ত্রিত শব্দভাণ্ডার। Cricket, Football, Tennis — নির্দিষ্ট তালিকা, সেটার বাইরে কিছু গেলে লেনদেন গ্রহণই হবে না। এতে করে প্রথম ধাপ আর দ্বিতীয় ধাপের স্কিম সংস্করণ একে অপরের থেকে দূরে সরে যেতে পারবে না। cricket_world টোকেনটা তখন জমা পড়বে না, বরং ধরা পড়বে।

চতুর্থ স্তর, নাল-রেট মনিটরিং। প্রতিটা ফিল্ডে কত শতাংশ রেকর্ড খালি, সেটা একটা অন-চেইন কাউন্টার। একটা নাল দুর্ঘটনা; শতকরা দুইয়ের বেশি নাল সিস্টেমিক ব্যর্থতা। পার্থক্যটা তখন আর অনুমানের বিষয় থাকে না।
আর এখানেই আসল উপলব্ধিটা, যেটা আমি অন্য কোথাও পড়িনি।
ব্লকচেইন প্রমাণ করতে পারে একটা রেকর্ড নির্দিষ্ট সময়ে বিদ্যমান ছিল। ব্লকচেইন প্রমাণ করতে পারে না যে কিছু ঘটেনি। উপস্থিতির সাক্ষ্য সে রাখতে পারে, অনুপস্থিতির সাক্ষ্য রাখতে পারে না। এটা লেজারের সীমাবদ্ধতা, আর এই সীমাবদ্ধতাটাই বলে দেয় আমাদের কী করতে হবে: ব্যর্থতাটাকে নিজেকেই একটা রেকর্ড বানাতে হবে।
অর্থাৎ, নেগেটিভ রেকর্ড। এই সময়ে এই উৎস থেকে এই অনুরোধ গিয়েছিল, এই ফলাফল ফিরেছিল, এবং ফলাফলটা অগ্রহণযোগ্য ছিল — এই বাক্যটাই যদি ব্লকে লেখা থাকে, তবেই আর্কাইভ সম্পূর্ণ হয়। নইলে যা হয়, সেটা হলো একটা হাইলাইট রিল — শুধু সফলতা, শুধু গোল, শুধু ছক্কা, আর কোনো ফাঁকা ঘর নেই।
আমার নিজের পেশায় এর একটা পুরনো সংস্করণ আছে। আমরা আর্কাইভ ভালোবাসি — হলদে স্কোরকার্ড, রেডিও ধারাভাষ্য, পুরনো সংবাদপত্রের কাটিং। কিন্তু আর্কাইভ তো বাছাইয়ের উপর দাঁড়ানো। কে বাছাই করে? যে লিখতে বসেছিল। আর যেটা কেউ লেখেনি, সেটা ইতিহাসে থাকে না। ২০২০ সালের সেই ট্রফি আমরা মনে রেখেছি, কারণ কেউ শূন্য গ্যালারির কথা লিখে রেখেছিল। কেউ না লিখলে নীরবতাটা সম্পূর্ণ হতো।
তাহলে প্রশ্নটা দাঁড়ায় — ক্রিকেটের ডেটা ইন্ডাস্ট্রি কেন শুধু যা এসেছে তার হিসাব রাখে, যা আসেনি তার নয়?
এখানেই প্রচলিত ধারণার সঙ্গে আমার মতভেদ। স্পোর্টস টেকের আলোচনায় ব্লকচেইনকে প্রায়ই "ট্রুথ মেশিন" হিসেবে বর্ণনা করা হয় — যেন চেইনে লেখা মানেই সত্য। কিন্তু চেইন সত্য বলে না, চেইন শুধু বলে কে কখন কী জমা দিয়েছে। যে পাইপলাইন একটা খালি অবজেক্টকে বৈধ রেকর্ড হিসেবে চেইনে লিখে দেয়, সেটা খালিটাকে সত্য বানিয়ে ফেলে। অনুপস্থিতি তখন "যাচাইকৃত অনুপস্থিতি" হয়ে যায় — আর এটা চেইন না থাকার চেয়েও খারাপ, কারণ তখন আর কেউ প্রশ্ন করে না।
দ্বিতীয় মতভেদটা আরও অস্বস্তিকর। এই পুরো বিশ্লেষণে যে ঝুঁকিটা সবচেয়ে উঁচুতে রাখা হয়েছে, সেটা ডেটা হারানো নয় — টেমপ্লেটের চাপ। আটটা মাত্রার ফাঁকা ঘর হাজির, আর মডেলের কাছে শূন্য তথ্য। এই অবস্থায় সবচেয়ে স্বাভাবিক প্রবৃত্তি হলো কল্পনা করা। একটা বিশ্বাসযোগ্য খেলোয়াড়ের নাম, একটা বিশ্বাসযোগ্য রান, একটা বিশ্বাসযোগ্য বিতর্ক — এবং টেমপ্লেট ভরে যায়। কেউ ধরতে পারে না, কারণ ফর্ম্যাটটা নিখুঁত।
শূন্যতা কোনো নিরপেক্ষ ইনপুট নয়। শূন্যতা একটা সক্রিয় চাপ।
আমি নিজেও এই ফাঁদে পড়ার পথে ছিলাম। এই লেখাটা যদি আমি ক্রিকেট-গল্প দিয়ে ভরাতাম — কাল্পনিক এক ডেবিউয়ের কথা লিখতাম — পাঠক টের পেত না, কারণ গদ্যটা ভালো হতো। কিন্তু তখন সত্যিটা হারিয়ে যেত, আর সত্যিটা হলো এই: একটা পাইপলাইন ব্যর্থ হয়েছে, আর সেই ব্যর্থতার রিপোর্টটাই আজকের একমাত্র বিশ্বাসযোগ্য তথ্য।
সেটা কি যথেষ্ট? না। কিন্তু সেটা সত্য।
সামনের দিকে তাকালে আমি একটা সংস্করণ-পরিবর্তন দেখছি, বিজয়ের মিছিল নয়। পরের সংস্করণে যা দরকার, তা আরও ভালো প্রম্পট নয় — দরকার একটা স্পষ্ট ব্যর্থতা-অবস্থা, যার নিজের একটা হ্যাশ আছে, একটা টাইমস্ট্যাম্প আছে, আর একটা দৃশ্যমান জায়গা আছে ড্যাশবোর্ডে।
যেদিন প্রথম EXTRACTION_FAILED নিজের একটা ব্লক পাবে, সেদিন ক্রিকেট ডেটা এমন একটা শিক্ষা পাবে, যেটা কোনো স্কোরকার্ড কখনও দেয়নি — স্কোরকার্ড শেখায় কী হয়েছে, লেজার শেখাবে কী হয়নি।
আর শেষ প্রশ্নটা রেখে দিলাম। একটা ম্যাচের নীরবতা আমরা লিখে রাখি, কারণ আমরা জানি নীরবতাও একটা ঘটনা। তাহলে একটা ডেটা পাইপলাইনের নীরবতা লিখে রাখার দায়িত্বটা কার? ক্রিকেট বোর্ডের? সম্প্রচারকের? নাকি সেই সাংবাদিকের, যে স্ক্রিনের দিকে তাকিয়ে ঠান্ডা চা হাতে বসে আছে?
