Elevare Digital میں آپ کا AI ایجنٹ اس لیے غیر فعال (idle) ہو گیا کیونکہ حال ہی میں شامل کی گئی PostgreSQL row-level security (RLS) پالیسی نے ہر job row کو فلٹر کر دیا، جس سے کیو (queue) خالی نظر آنے لگی۔ یہ غلطی اس وقت تک نظر نہیں آئی جب تک کہ جابز کا ڈھیر لگ نہیں گیا، جس کے نتیجے میں ٹیم کو آرکیسٹریٹر (orchestrator) کے خالی کیو کو پہچاننے کے طریقے کو دوبارہ ڈیزائن کرنے پر مجبور ہونا پڑا۔

چھپا ہوا اندھا دھند نقطہ (The hidden blind spot)

ARIA، Elevare کا خود مختار AI سسٹم، پینڈنگ جابز کے لیے ایک PostgreSQL ٹیبل کو پول (poll) کرتا ہے۔ کوئری کامیاب رہی، صفر روز (rows) واپس کیے، اور ایجنٹ سو گیا۔ حقیقت میں ٹیبل بھرا ہوا تھا۔ ایک RLS پالیسی نے SELECT رسائی کو صارفین کے ایک مخصوص سیٹ تک محدود کر دیا تھا۔ آرکیسٹریٹر ایک سروس رول (service role) کے ساتھ منسلک تھا جس کے پاس bypass privilege نہیں تھا، اس لیے ڈیٹا بیس نے خاموشی سے رزلٹ سیٹ سے ہر رو (row) کو نکال دیا۔ PostgreSQL فلٹر شدہ ریڈ (read) کو خالی ٹیبل کے برابر سمجھتا ہے، اس لیے کوئی ایرر، وارننگ یا فیلر کوڈ ظاہر نہیں ہوا۔ غیر فعال ایجنٹ کے ایک صحت مند ہارٹ بیٹ (heartbeat) سے اس بات کا کوئی اشارہ نہیں ملا کہ کچھ غلط ہے۔

RLS نے ایک بھری ہوئی کیو کو خاموشی میں کیسے بدل دیا

RLS ہر SELECT کے دوران ہر رو پر ایک predicate شامل کرتا ہے۔ اگر predicate غلط ہو، تو وہ رو رزلٹ سے غائب ہو جاتی ہے۔ کلائنٹ صرف وہی روز دیکھتا ہے جو پالیسی پر پورا اترتے ہیں؛ اسے کبھی معلوم نہیں ہوتا کہ روز چھپائی گئی تھیں۔ ایک کیو ورکر کے لیے، خالی رزلٹ سیٹ بالکل ایک حقیقی خالی کیو کی طرح لگتا ہے۔ آرکیسٹریٹر نے یہ فرض کر لیا کہ "کوئی رو نہیں = کوئی کام نہیں" اور وہ idle loop میں چلا گیا جبکہ پس منظر میں جابز جمع ہوتی رہیں۔

ٹیم نے دریافت کیا کہ ایک پالیسی، جس کا مقصد ریڈز کو انفرادی صارفین تک محدود کرنا تھا، اس نے غیر ارادی طور پر خود سروس رول کو بھی اپنی گرفت میں لے لیا تھا۔ چونکہ اس رول کے پاس خصوصی "bypass RLS" ایٹریبیوٹ نہیں تھا، اس لیے پالیسی آرکیسٹریٹر کے ذریعے جاری کردہ ہر کوئری پر لاگو ہو گئی۔ یہ سیکیورٹی بمقابلہ observability کا ایک کلاسک توازن (trade-off) ہے: RLS ڈیٹا کو غیر مجاز صارفین سے محفوظ رکھتا ہے، لیکن یہ ان سسٹم اجزاء کے لیے ناکامی کا ایک مفید اشارہ بھی ختم کر دیتا ہے جو visibility پر انحصار کرتے ہیں۔

کینری چیک پیٹرن (The canary-check pattern)

خاموش خالی رزلٹ پر انحصار ختم کرنے کے لیے، Elevare نے ایک "canary" چیک شامل کیا۔ نیا فلو یہ ہے:

  1. پینڈنگ-جابز ٹیبل کو کوئری کریں۔
  2. اگر روز واپس ملیں، تو انہیں پہلے کی طرح پروسیس کریں۔
  3. اگر رزلٹ خالی ہو، تو ایک مخصوص کینری رو (canary row) کے خلاف دوسری کوئری جاری کریں جو ہمیشہ موجود ہونی چاہیے۔
  4. اگر کینری کوئری مطلوبہ رو واپس کرتی ہے، تو کیو واقعی خالی ہے؛ ایک idle heartbeat لاگ کریں۔
  5. اگر کینری کوئری بھی کچھ واپس نہ کرے، تو ایجنٹ اندھا ہو چکا ہے؛ فوری الرٹ جاری کریں۔

اب آرکیسٹریٹر تین حالتوں میں فرق کرتا ہے:

  • Jobs found – نارمل پروسیسنگ۔
  • No jobs, canary OK – حقیقی طور پر غیر فعال (idle) دورانیہ۔
  • No jobs, canary failed – چھپا ہوا RLS بلاک، الرٹ ٹرگر کریں۔

کینری ٹیبل ایک واحد رو ہے جو کبھی نہیں بدلتی۔ اسے سیٹ اپ کرنے میں تقریباً ایک گھنٹہ لگا، لیکن یہ خاموش ناکامیوں کی ایک پوری قسم کو ختم کر دیتا ہے۔

ٹیموں کو کیا کرنا چاہیے

اگر آپ PostgreSQL یا اس پر مبنی کسی ہوسٹڈ سروس (جیسے Supabase) کے خلاف کیو ورکرز چلاتے ہیں، تو ان اقدامات پر عمل کریں:

  • سروس-رول کریڈنشلز (service-role credential) کا استعمال کریں جس میں "bypass RLS" فلیگ موجود ہو۔ یہ سسٹم کے اجزاء کو صارف کی سطح کی پالیسیوں کے باوجود تمام روز دیکھنے کی اجازت دیتا ہے۔
  • RLS پالیسیوں کا آڈٹ کریں تاکہ سروس رولز کے لیے مسنگ bypass permissions کا پتہ چل سکے۔ ایک پالیسی جو اینڈ یوزرز کے لیے درست نظر آتی ہے، وہ غیر ارادی طور پر اندرونی سروسز کو پھنسا سکتی ہے۔
  • ایک کینری ٹیبل شامل کریں (یا اس کے مساوی ہمیشہ موجود رہنے والی رو) اور ورکر کے idle logic میں کینری چیک کو شامل کریں۔ اضافی کوئری سستی ہے اور ایک واضح حفاظتی جال فراہم کرتی ہے۔

توازن (The trade-off)

RLS باریک بینی سے ڈیٹا تک رسائی کو نافذ کرنے کے لیے ایک طاقتور ٹول ہے۔ یہ حادثاتی ڈیٹا لیکس کو روکتا ہے اور پورے کوڈ بیس میں ایپلی کیشن لیول کے فلٹرز پھیلائے بغیر ملٹی ٹیننٹ آرکیٹیکچرز کی حمایت کرتا ہے۔ اس کا نقصان یہ ہے کہ یہ ان اجزاء سے ناکامیوں کو چھپا سکتا ہے جو ایک سادہ "کوئی رو نہیں" کے سگنل کا مطلب "کچھ کرنے کو نہیں ہے" سمجھتے ہیں۔ کینری پیٹرن RLS کو کمزور نہیں کرتا؛ یہ ایک ہلکا پھلکا تصدیقی مرحلہ شامل کرتا ہے جو observability کو بحال کرتا ہے۔

خلاصہ (Takeaway)

ایک چھپی ہوئی RLS پالیسی ایک مصروف کیو کو خاموش ڈیڈ اینڈ میں بدل سکتی ہے، جس سے AI ایجنٹس غیر فعال رہتے ہیں جبکہ کام جمع ہوتا رہتا ہے۔ سروس رولز کو مناسب bypass privilege دیں اور ہر خالی-کیو ریڈ کو کینری چیک کے ساتھ جوڑیں؛ ٹیمیں اپنے خود مختار ورکرز کو درست رکھ سکتی ہیں اور مہنگے اندھے پن (blind spots) سے بچ سکتی ہیں۔