ما در یک آخر هفته یک نگهبان کد خودکار ساختیم

ما با هدفی جسورانه وارد JacHacks شدیم.

ساخت ابزاری که یک مخزن (repository) را زیر نظر داشته باشد. این ابزار باید تغییرات مشکوک در وابستگی‌ها (dependencies) را شناسایی کند. باید آن وابستگی‌ها را در یک محیط ایزوله (sandbox) اجرا کند تا مخرب بودن آن‌ها را ثابت کند. سپس، باید یک راه حل بنویسد و یک pull request باز کند. تا مرحله آخر، هیچ انسانی درگیر نیست.

نام آن را GhostWatch گذاشتیم. این پروژه مقام دوم را در بخش agentic کسب کرد.

در اینجا نحوه ساخت آن و آنچه آموختیم را می‌خوانید.

مشکل

بررسی‌های استاندارد کد دو نقص بزرگ دارند:

  • ابزارها نمی‌توانند شعاع اثر (blast radius) را ببینند. یک تغییر در یک تابع می‌تواند فایل‌هایی را در فواصل دور خراب کند. اکثر ابزارها به ارتباطات نگاه نمی‌کنند.
  • حملات زنجیره تأمین (supply chain attacks) بررسی‌ها را دور می‌زنند. یک مهاجم می‌تواند یک نسخه مسموم را مستقیماً به یک رجیستری (registry) ارسال کند. هیچ pull request ای برای بررسی وجود ندارد. شما تازه بعد از وقوع خسارت متوجه می‌شوید.

راه حل ما

ما سیستمی با آگاهی فضایی (spatial awareness) ساختیم. ما از Jac برای مدل‌سازی کدbase به صورت یک گراف استفاده کردیم.

در این گراف:

  • فایل‌ها گره‌ها (nodes) هستند.
  • وارد کردن‌ها (imports) یال‌ها (edges) هستند.

برای یافتن شعاع اثر، ما حدس نمی‌زنیم؛ بلکه یک پیمایش گراف (graph walk) انجام می‌دهیم. این کار منطق امنیتی را قطعی (deterministic) و قابل توضیح می‌کند.

پشته تکنولوژی (Tech Stack)

ما به جای استفاده از Python خام و فراخوانی‌های دستی LLM، از Jac استفاده کردیم. این کار نحوه کار ما را تغییر داد:

  • کدbase خود یک ساختار داده است.
  • پایداری (persistence) داخلی است. گراف مخزن ما بدون نیاز به یک پایگاه داده جداگانه، پس از راه‌اندازی مجدد باقی می‌ماند.
  • ادغام با LLM بی‌وقفه است. ما از یک کلمه کلیدی واحد استفاده می‌کنیم تا یک تابع را به یک فراخوانی LLM تبدیل کنیم که اشیاء تایپ‌شده (typed objects) را برمی‌گرداند.

بخش‌های دشوار

کار آسانی نبود. ما با چندین مانع روبرو شدیم:

  • سینتکس جدید: Jac از سمی‌کولون، آکولاد و کلمات کلیدی خاصی مانند has به جای self در Python استفاده می‌کند. ما چند ساعت اول را صرف رفع خطاهای تجزیه (parse errors) کردیم.
  • تله‌های React: من سعی کردم لیست‌ها را در همان محل تغییر دهم (mutate in place). این کار مانع از به‌روزرسانی فرانت‌اند می‌شد. مجبور شدم برای ایجاد رندر مجدد (re-render)، به روش انتساب مجدد لیست‌ها روی بیاورم.
  • شکاف‌های مستندات: راه‌اندازی محیط توسعه بیشتر از آنچه انتظار می‌رفت طول کشید، زیرا برخی از مستندات ناقص بودند.

چرا این موضوع اهمیت دارد

اکثر سیستم‌های عامل (agent systems) از شما می‌خواهند که وضعیت (state)، هماهنگ‌سازی (orchestration) و سریال‌سازی (serialization) را به صورت دستی مدیریت کنید. با Jac، گراف یک ساختار زبانی است. معماری سیستم با مشکلی که در حال حل آن بودیم مطابقت دارد.

این پروژه کامل نیست. محیط ایزوله (sandbox) به جای microVMهای ابری، از زیرفرآیندهای (subprocesses) محلی استفاده می‌کند. ما این شکاف‌ها را آشکار باقی گذاشتیم، زیرا صیقل دادن یک پروژه در هکاتون نباید با دروغ همراه باشد.

تماشای دمو: https://www.youtube.com/watch?v=ZN0UVnNUpRs

بررسی کد: https://github.com/ayushmk7/GhostWatch

منبع: https://dev.to/ayushmk/we-built-an-autonomous-code-guardian-in-a-weekend-heres-what-happened-4982

انجمن یادگیری اختیاری: https://t.me/GyaanSetuAi