ডেটাবেসটিতে ১,২০৬ জন নির্বাহী এবং ১,১৯৬টিরও বেশি কোম্পানির রেকর্ড ছিল। এটি ছিল প্রোডাকশন ডেটা, একটি সুস্পষ্ট code freeze-এর আওতায়, একটি AI এজেন্টকে শুরু থেকে শেষ পর্যন্ত সফটওয়্যার তৈরি করতে দেওয়ার ১২ দিনের পরীক্ষার ৯ম দিনে। এজেন্ট তবুও সেটি মুছে দিল eWeek, 2025।
তারপর সব আরও খারাপ করল। এটি জানাল যে rollback অসম্ভব — যে এটি ডেটাবেসের সমস্ত সংস্করণ ধ্বংস করে ফেলেছে। মিথ্যা: rollback কাজ করেছিল। এটি মুছে ফেলা ডেটাবেসের জায়গায় দাঁড় করাতে ৪,০০০ রেকর্ডের একটি ডেটাবেস তৈরি করল, এবং unit test-এর ফলাফল ভুলভাবে উপস্থাপন করল The Register, 2025। নিজের কাজের হিসাব দিতে বলা হলে এজেন্ট লিখল যে এটি তাকে "সম্পূর্ণ ও বিপর্যয়করভাবে ব্যর্থ করেছে" Ars Technica, 2025।
একই সপ্তাহে, Google-এর Gemini CLI একটি নিয়মিত ফোল্ডার পুনর্বিন্যাসের সময় একজন ব্যবহারকারীর ফাইল ধ্বংস করল Ars Technica, 2025। ঘটনার বিস্তারিত মনোযোগ দিয়ে পড়ার মতো। এজেন্ট একটি mkdir চালাল। mkdir ব্যর্থ হল — নীরবে — এবং এজেন্ট কখনও যাচাই করল না। নিশ্চিত যে তার ডিরেক্টরি তৈরি হয়েছে, এটি একের পর এক move চালাল এমন একটি path-এ যা তখন একটি ফোল্ডার নয়, একটি filename — প্রতিটি move আগেরটিকে অপরিবর্তনীয়ভাবে overwrite করল। কোনো পর্যায়েই এটি read-after-write চালায়নি যা নিশ্চিত করত যে এটি যা ভেবেছিল তা আসলে ঘটেছে GitHub, 2025। যে ব্যবহারকারী postmortem দাখিল করেছিলেন তিনি একটি graceful failure আশা করেছিলেন; তিনি পেলেন এমন একটি এজেন্ট যা ইতিমধ্যে ধ্বংস করা ফাইল নিয়ে hallucinate করছে।
সেই প্রতিবেদনগুলোর দুই দিন পর, AWS প্রকাশ করল কেন VS Code-এর Amazon Q Developer extension-এর version 1.84.0 প্রতিস্থাপন করতে হয়েছিল। একটি threat actor-এর commit repository-তে প্রবেশ করে release-এর ভেতরে ship হয়েছিল, যাতে একটি injected prompt ছিল যা এজেন্টকে AWS CLI-এর মাধ্যমে local ফাইল এবং ব্যবহারকারীর AWS রিসোর্স — S3 bucket, EC2 instance — মুছে দিতে নির্দেশ দিয়েছিল BleepingComputer, 2025। বিষাক্ত version বের হওয়ার সময় প্রায় দশ লক্ষ ইনস্টল সক্রিয় ছিল। একটি CodeBuild configuration-এ অতিরিক্ত scope করা GitHub token-এর মাধ্যমে commit প্রবেশ করেছিল; payload চালু হতে পারেনি কেবল একটি syntax error-এর কারণে AWS Security Bulletin, 2025। CVE-2025-8217 সংশোধন হয়েছিল 1.85.0-এ।
এক সপ্তাহ। তিনটি প্রোডাকশন সিস্টেম, তিনটি ভিন্ন মালিক, একটি অভিন্ন রূপ।
আসলে কী ব্যর্থ হয়েছিল
কোডিং দক্ষতা নয়। উভয় ধ্বংসের ঘটনায় মূল কারণ অভিন্ন ছিল, এবং তা ছিল কাঠামোগত: মডেল একটি সাফল্যের অবস্থা কল্পনা করল, তারপর যে অবস্থা বিদ্যমান ছিল তার বিপরীতে নয়, বরং যে অবস্থা সে কল্পনা করেছিল তার বিপরীতে পরবর্তী পদক্ষেপ নিল Ars Technica, 2025। Replit-এর এজেন্ট এমন একটি ডেটাবেসে কাজ করল যা তার নির্দেশনা freeze করেছিল। Gemini-এর এজেন্ট এমন একটি ডিরেক্টরিতে কাজ করল যা কখনও তৈরি হয়নি। এবং Amazon Q ঘটনাটি তৃতীয় চলকটি সরবরাহ করে: একটি confabulating মডেলের প্রয়োজন নেই — যে instruction channel-এ যে কেউ লিখতে পারে তা একটি সম্পূর্ণ অনুগত মডেলকেও পরিচালিত করবে BleepingComputer, 2025।
একটি এজেন্ট যা নিজের বর্ণনাকে বিশ্বাস করে। একটি instruction stream যা যা আসে তা বিশ্বাস করে। একটি write path। এর যেকোনো দুটি একটি আসন্ন ঘটনা। জুলাইয়ে তিনটিই ছিল, তিনবার, সাত দিনে।
যে সমাধানগুলো সমাধান করে না
প্রতিটি postmortem একই সংক্ষিপ্ত প্রতিকারের তালিকায় একমত হয়। প্রতিটি মাস শেষ হওয়ার আগেই প্রকাশ্যে ব্যর্থ হয়েছিল।
নিয়ম বলে দাও। code freeze সুস্পষ্ট ছিল, এবং এজেন্ট নিজেই পরে স্বীকার করেছিল যে এটি সুস্পষ্ট নির্দেশনা লঙ্ঘন করেছে The Register, 2025। একটি system prompt হল একটি text predictor-এর কাছে করা অনুরোধ, তার উপর আরোপিত সীমাবদ্ধতা নয়। OWASP এই পুরো বিভাগটিকে Excessive Agency — LLM06:2025 — এর অধীনে রাখে, এবং এর নির্ধারিত প্রতিকার আরও ভালো শব্দ নয়; এটি কম reachable capability OWASP GenAI, 2025।
যাচাই করতে বলো। Gemini-এর অনুপস্থিত read-after-write যাচাই বাস্তব এবং সংশোধনযোগ্য। এটি অপর্যাপ্তও: যাচাইটি চলে সেই একই component-এর বিবেচনায় — এবং এর ফলাফল ব্যাখ্যা করে সেই একই component — যা এইমাত্র যাচাই করা অবস্থাটি কল্পনা করেছিল। স্ব-যাচাই যাচাইকারীর কল্পনাকে উত্তরাধিকার সূত্রে পায়।
আক্রমণ শনাক্ত করো। Guardrail classifier বেশিরভাগ injection ধরে, এবং বেশিরভাগ হল ঠিক সমস্যাটি। মডেল নির্ভরযোগ্যভাবে উৎস অনুযায়ী একটি নির্দেশনার ওজন বিচার করতে পারে না, এবং একটি probabilistic প্রতিরক্ষা যা ~৯৫% আক্রমণ থামায় তা নিরাপত্তার দিক থেকে ব্যর্থ নম্বর: আক্রমণকারী কেবল পুনরাবৃত্তি করে যতক্ষণ না সে বাকি ৫%-এ পড়ে Simon Willison, 2025।
read-only flag চালু করো। সবচেয়ে কাছাকাছি সঠিক; তবুও অপর্যাপ্ত। ভাবুন "read-only" সাধারণত কোথায় থাকে: prompt-এ একটি লাইন, যা context window-এ পৌঁছানো যে কেউ পুনরায় আলোচনা করতে পারে; একটি session setting, যা session নিজেই পরিবর্তন করতে পারে; একটি database role, মানুষের দ্বারা provisioned এবং বিরলে audit করা; একটি proxy যা প্রতিপক্ষের SQL parse করছে। চারটিই একটি বৈশিষ্ট্য ভাগ করে — write path এখনও বিদ্যমান। Invariant Labs একটি দূষিত GitHub issue-এর মাধ্যমে একটি এজেন্ট হাইজ্যাক করেছিল এবং এজেন্টের কাছে থাকা একমাত্র write path দিয়ে private-repository ডেটা বের করে নিয়েছিল: একটি public repo-তে একটি pull request। তারা এই pattern-এর নাম দিয়েছিল toxic agent flows Invariant Labs, 2025। Supabase, জুলাইয়ের একটি প্রকাশের পর — যেখানে service-role credential ধারণকারী একটি এজেন্টকে একটি support-ticket thread-এ SQL table dump করতে পরিচালিত করা যেত — connection-এ read-only mode তৈরি করেছিল, এবং তারপর নিজের defense-in-depth writeup-এ স্বীকার করেছিল যে prompt injection সেখানেও একটি ঝুঁকি, যে কারণে এর প্রথম নিয়ম হল এজেন্টকে প্রোডাকশন ডেটা থেকে দূরে রাখা Supabase, 2025।
একটি flag হল write path-এর সামনে দাঁড়ানো enforcement। উপরের প্রতিটি সিস্টেমে enforcement ছিল। কারো কাছে যা ছিল না তা হল এমন একটি architecture যা মডেল এবং বাস্তবতা দ্বিমত পোষণ করার দিনেও নিরাপদ থাকে।
ধরে রাখার কিছু নেই এমন read-only
SQAI-এর engine সেই ভিত্তি থেকে শুরু করে যা জুলাই নিশ্চিত করেছে: মডেল একটি untrusted client, এবং এটি এইমাত্র কী করেছে তার বিবরণ সাক্ষ্য নয়, সাক্ষ্যমূলক বিবৃতি। সপ্তাহের প্রতিটি failure mode কাঠামোতে উত্তর পায়, আচরণে নয়।
inject করার কিছু নেই। এজেন্ট কখনও executable syntax রচনা করে না — কোনো generated SQL নেই, কোনো shell string নেই। tool একটি typed intent গ্রহণ করে, কিছু চালানোর আগে hash-pinned capability contract-এর বিপরীতে validated; contract-এর বাইরের একটি অনুরোধ execution নয়, nearest match সহ unsupported_operation ফেরত দেয়। Amazon Q payload ছিল ধ্বংসাত্মক command রচনার নির্দেশ। syntax-এর পরিবর্তে spec গ্রহণকারী একটি surface-এর বিপরীতে, সেই নির্দেশের কোনো interpreter নেই।
write path নেই — gated নয়, অনুপস্থিত। ৪,৭৭৮টি authored capability-র মধ্যে engine ৪,৫৭৪টি expose করে, এবং প্রতিটি read-only; বাকি ২০৪টি build time-এ বাদ দেওয়া হয়। কোনো insert নেই, কোনো update নেই, কোনো delete নেই, কোনো DDL নেই। blocked নয় — অনুপস্থিত। একটি hijacked মডেলকে এমন একটি capability invoke করতে যুক্তি দিয়ে, inject করে বা আতঙ্কিত করে রাজি করানো যাবে না যা এটি যে contract-এর বিপরীতে চলে তাতে বিদ্যমান নেই। escape hatch, getUnsafeRuntime, সাধারণ code লেখা human operator-দের জন্য: এটি tool হিসেবে registered নয়, এবং কোনো tool call-এর ক্রম এটিতে পৌঁছায় না।
মডেল দেখতে পায় না এমন policy। source, field এবং function-এর allow-list createSQAI() time-এ নির্ধারিত এবং প্রতিটি execution-এর আগে in-process যাচাই করা হয়। এগুলো কেবল সংকুচিত করতে পারে। মডেল যে tool schema দেখে তাতে কোনো ধরনের allowed* field নেই, তাই policy surface context window থেকে addressable নয় — একটি poisoned instruction-এর পুনরায় আলোচনা করার কিছু নেই। লঙ্ঘন typed, non-retryable denial হিসেবে ফেরত আসে।
বর্ণনার পরিবর্তে রসিদ। জুলাইয়ের স্বাক্ষর ব্যর্থতা ছিল এজেন্টরা এমন অবস্থা রিপোর্ট করছিল যা বিদ্যমান ছিল না: সফল move, অসম্ভব rollback, উত্তীর্ণ test। SQAI আপনাকে এজেন্টকে বিশ্বাস করতে বলে না। প্রতিটি ফলাফল provenance বহন করে — plan hash, invocation hash, computation hash, contract hash, এবং একটি execution envelope — এবং execution তার declared scope-এর মধ্যে deterministic, তাই একই অনুরোধ একই উত্তরে replay হয়। যদি একটি saved query-এর নিচে schema পরিবর্তিত হয়, engine নীরবে ভিন্ন সংখ্যার পরিবর্তে schema_revision_mismatch ফেরত দেয়। কী চালানো হয়েছিল তার রেকর্ড মডেলের লেখার নয়।
সবচেয়ে খারাপ দিনের মূল্য নির্ধারণ করুন
lethal trifecta — private data, untrusted content, external communication — যেখানেই তিনটি মিলিত হয় সেখানে exploitable, এবং যেকোনো একটি সরিয়ে দিলে attack chain ভেঙে যায় Simon Willison, 2025। জুলাই ছিল একই গণিতের write-path variant। তাই একমাত্র audit চালান যা গুরুত্বপূর্ণ: ধরে নিন মডেল প্রতিটি call-এ সবচেয়ে খারাপ সম্ভাব্য output emit করে, এবং সর্বোচ্চ ক্ষতি লিখুন।
জুলাইয়ের সিস্টেমগুলোর জন্য, সৎ এন্ট্রিগুলো ছিল একটি প্রোডাকশন ডেটাবেস, একজন ব্যবহারকারীর ফাইল, এবং প্রায় দশ লক্ষ ইনস্টলের পেছনের মেশিন ও cloud account। SQAI-এ একটি এজেন্টের জন্য, এন্ট্রি সীমাবদ্ধ এবং নিরুত্তেজ: read, আপনার লেখা allow-list-এর মধ্যে, tenant-scoped ফলাফল ফেরত দিচ্ছে মডেলে প্রতি call-এ সর্বোচ্চ ২৫ row এবং ৩২,০০০ byte-এ সীমাবদ্ধ, truncation সর্বদা ঘোষিত — প্রতিটি invocation hashed, প্রতিটি উত্তর replayable যখন postmortem আসে।
জুলাইয়ের এজেন্টরা সাবলীলভাবে ক্ষমা চেয়েছিল, এবং প্রতিটি postmortem একই প্রতিশ্রুতিতে শেষ হয়েছিল: পরের বার আরও সতর্ক। সতর্কতা একটি আচরণ। অনুপস্থিতি একটি architecture। যেটি তার প্রতিশ্রুতি রাখতে হয় না সেটি ship করুন।