প্রকল্প সম্পর্কে

testgraph হলো একটি জার্নি-লেভেল টেস্ট সিলেক্টর। একটি git diff-এর প্রেক্ষিতে, এটি উত্তর দেয় যে কোন ইউজার-ফেসিং ফ্লোগুলো একটি পরিবর্তনের কারণে ভেঙে যেতে পারে এবং কোন ক্রমে সেগুলো পরীক্ষা করা উচিত; এটি সবকিছু পুনরায় চালানোর নির্দেশের পরিবর্তে একটি সংক্ষিপ্ত র‍্যাঙ্কড তালিকা প্রদান করে। এটি ইচ্ছাকৃতভাবে ব্রাউজার চালনা করে না, টেস্ট তৈরি করে না বা সেলফ-হিল করে না; এর নির্ধারিত কাজ হলো বিদ্যমান ড্রাইভারগুলোর উপরের স্তরে থেকে সিদ্ধান্ত নেওয়া যে কী পরীক্ষা করা প্রয়োজন। এটি যেভাবে কাজ করে একটি জার্নি রেজিস্ট্রি প্রতিটি ইউজার জার্নি এবং এর এন্ট্রি সিম্বলগুলোর (যেমন route handlers বা scheduler sweep) নাম নির্ধারণ করে। propose মডিউলটি ইনডেক্সের বিপরীতে Python route decorators এবং Next.js কনভেনশন স্ক্যান করে একটি নতুন রিপোর জন্য রেজিস্ট্রি খসড়া করে এবং একজন মানুষ এটি পড়ার আগ পর্যন্ত এটিকে approved false হিসেবে চিহ্নিত করে, যাতে একটি অননুমোদিত রেজিস্ট্রি স্পষ্টভাবে সংকেত দেয় কিন্তু নিঃশব্দে চলে না। একটি diff-এর জন্য, testgraph পরিবর্তিত লাইন রেঞ্জগুলোকে সেগুলোর মালিক সিম্বল বা seed-এর সাথে ম্যাপ করে; এরপর CodeGraph এজ গ্রাফের মধ্য দিয়ে রিভার্সে ট্রানজিটিভলি প্রতিটি সিম্বলে যায় যা একটি seed-এর উপর নির্ভরশীল (impacted set); এবং সেই জার্নিগুলোর রিপোর্ট করে যাদের এন্ট্রি সিম্বল ওই সেটের অন্তর্ভুক্ত, যা fan-in অনুযায়ী র‍্যাঙ্ক করা থাকে এবং প্রতিটি জার্নিতে পৌঁছানো সবচেয়ে শক্তিশালী এজ পাথের কনফিডেন্স থাকে। কনফিডেন্স হলো পাথের সর্বোচ্চ এবং এজের সর্বনিম্ন মানের সমন্বয়, তাই একটি চেইন তার দুর্বলতম হপের মতোই নির্ভরযোগ্য, তবে একটি শক্তিশালী রুটই যথেষ্ট। শুধুমাত্র দুর্বল বা সিন্থেসাইজড এজের মাধ্যমে পৌঁছানো জার্নিগুলোকে নিঃশব্দে বিশ্বাস করার পরিবর্তে ম্যানুয়াল ভেরিফিকেশনের জন্য ফ্ল্যাগ করা হয় এবং সেগুলো সিলেকশন থেকে কখনোই সরানো হয় না। এই টুলটি recall-first: এটি কোনো জার্নিকে নিঃশব্দে বাদ দেওয়ার চেয়ে অতিরিক্ত সিলেকশন করাকে পছন্দ করে। উত্তর দেওয়ার আগে, একটি integrity guard নষ্ট বা পুরনো CodeGraph ইনডেক্সের উপর ভিত্তি করে রান করতে অস্বীকার করে, কারণ ভুল গ্রাফ আত্মবিশ্বাসের সাথে ভুল উত্তর তৈরি করে। রেজিস্ট্রি রেজোলিউশন প্রথমে পাওয়া ফলাফলটি গ্রহণ করে: প্রথমে একটি এনভায়রনমেন্ট ভেরিয়েবল escape hatch, তারপর রিপোর ভেতরে একটি .testgraph/journeys ডিরেক্টরি (যা সুপারিশকৃত অবস্থান), এবং সবশেষে প্রজেক্টের নিজস্ব চেকআউটে প্যাকেজের পাশে একটি journeys ডিরেক্টরি। প্রতিটি অবস্থানে একটি রেজিস্ট্রি তার ফাইলের নামের পরিবর্তে তার স্ব-ঘোষিত টার্গেটের সাথে ম্যাচ করা হয়, এবং অন্য প্রজেক্ট থেকে কপি করা এবং সম্পাদনা না করা রেজিস্ট্রি প্রত্যাখ্যান করা হয়। প্রয়োজনীয়তা এবং ইনস্টলেশন শুধুমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে Python 3.11 বা তার নতুন সংস্করণ, কোনো থার্ড-পার্টি ডিপেন্ডেন্সি নেই; diff ইনপুটের জন্য git; এবং codegraph init দ্বারা তৈরি একটি CodeGraph ইনডেক্সসহ একটি টার্গেট রিপো। PyPI থেকে pip install testgraph দিয়ে ইনস্টল করুন। wheel-টি শুধুমাত্র প্যাকেজটি সরবরাহ করে, যেখানে measurement harness এবং dogfood রেজিস্ট্রিগুলো রিপোজিটরিতে থাকে। CLI এবং MCP কমান্ড-লাইন এন্ট্রি পয়েন্টগুলোর মধ্যে রয়েছে select (CI গেট বা অন্য এজেন্টের জন্য হিউম্যান-রিডেবল বা JSON আউটপুট), export (যা একটি স্ট্যাটিক জার্নি ম্যাপ লেখে যা এজেন্ট প্রি-কমিটের আগে পড়ে), propose, record এবং একটি summary মোড। MCP stdio সার্ভার দুটি টুল, testgraph_impact এবং testgraph_journeys এক্সপোজ করে এবং প্রতি রিপোর জন্য রেজিস্টার করা হয়। এটি stdlib-only এবং অ্যানালাইসিস মডিউলগুলো লেজিলি ইমপোর্ট করে, তাই একটি আইডল সার্ভার sqlite3 লোড করে না, কোনো ডাটাবেস কানেকশন রাখে না এবং মেমরিতে কোনো ইনডেক্স রাখে না। README-তে রিপোর্ট করা হয়েছে যে একটি পূর্ণ হ্যান্ডশেকের পর RSS ১৫.২ MB পরিমাপ করা হয়েছে, যেখানে একটি সাধারণ Python MCP SDK সার্ভারের জন্য এটি ৬২ থেকে ৬৯ MB হয়। ওয়্যারিং এবং লেজার hooks/install.sh অনুমোদিত রেজিস্ট্রি থাকা প্রতিটি রিপোতে একটি pre-push হুক ইনস্টল করে, যাতে প্রতিটি পুশ সম্ভাব্য ক্ষতিগ্রস্ত জার্নিগুলো প্রিন্ট করে। হুকটি প্রথমে codegraph sync চালায়, কারণ seed-গুলো লাইন রেঞ্জ থেকে আসে এবং কোড মুভ করার আগে তৈরি করা ইনডেক্স পুরনো স্প্যানের বিপরীতে diff রেজলভ করবে; যদি পরিবর্তিত ফাইলের বাইট এখনও ইনডেক্স করা কপির সাথে অমিল থাকে, তবে উত্তরটি নিম্নমানের হয় এবং ফাইলের নাম উল্লেখ করে। হুকটি কখনোই পুশ ফেইল করে না, প্রতিটি পাথ জিরো এক্সিট করে এবং এটি git config সেটিংসের মাধ্যমে প্রতি রিপোর জন্য নিষ্ক্রিয় করা যেতে পারে বা uninstall ফ্ল্যাগ দিয়ে সরানো যেতে পারে। প্রতিটি রান একটি JSONL লেজারে একটি সিলেকশন রো যুক্ত করে; record কমান্ডটি অন্য অর্ধেক লেখে (জার্নিটি রান করে কী পাওয়া গেল), যাতে রিপো এবং কমিটের ভিত্তিতে দুটিকে জয়েন করে গণনা করা যায় যে কোনো জার্নি এমন একটি কমিটে ফেইল করেছে যা সিলেকশনে নাম উল্লেখ করেনি, যাকে silent under-selection বলা হয়। অবস্থা এটি একটি phase-1 spike এবং কনফিডেন্স-ওয়েটেড পাথ হিসেবে বর্ণিত, যা একটি dogfood টার্গেটে কাজ করছে এবং যাচাই করা হয়েছে: পাঁচটি হ্যান্ড-লেবেলড কমিটে recall ১.০০ এবং গড় precision ০.৬৮, এবং একটি স্বাধীন AST oracles-এর বিপরীতে স্কোর করা ২০টি সিডেড মিউটেশন সাইটে ১.০০, যেখানে integrity guard পরীক্ষিত এবং schema-pinned। এর পরিধি ওই একক টার্গেটে সীমাবদ্ধ, যা ব্যাকএন্ড এন্ট্রি পয়েন্টে রেজিস্টার করা জার্নিসহ ব্যাকএন্ড এবং ফ্রন্টএন্ড ফাইল বিশ্লেষণ করে। README-তে আরও রেকর্ড করা হয়েছে যে রেজিস্ট্রি ছাড়া দুটি রিপোর পরবর্তী পরিমাপে আগের সঞ্চয়ের দাবিটি ভুল প্রমাণিত হয়েছে: ২৩টি জার্নির ক্ষেত্রে একটি রিপো ৩৮টি কমিটের জন্য শূন্য জার্নি এবং ২টির জন্য ২৩টি জার্নির হিস্টোগ্রাম দিয়েছে, এবং ২০৭টি জার্নির ক্ষেত্রে অন্যটি শুধুমাত্র ৫৪.১ শতাংশ জার্নি-রান এভয়েড করেছে (যখন কোনো রেজিস্টার করা সারফেস স্পর্শ করে না এমন কমিটগুলো বাদ দেওয়া হয়েছে), তাই সিলেকশন সংখ্যাগুলোকে সঞ্চয়ের প্রতিশ্রুতি হিসেবে নয় বরং কাপলিং-এর সর্বনিম্ন সীমা হিসেবে পড়া উচিত। একই পরিমাপ র‍্যাঙ্কিং নিশ্চিত করেছে, যেখানে ০.৩ কনফিডেন্সের একটি ফলস-পজিটিভ হোল-রেজিস্ট্রি সিলেকশন ম্যানুয়াল ভেরিফিকেশনের জন্য ফ্ল্যাগ করা হয়েছে এবং ০.৯ কনফিডেন্সের একটি প্রকৃত বড় ব্লাস্ট রেডিয়াস পরিষ্কারভাবে এসেছে।