فاز 14 · درس 33

تبدیل دستورالعمل‌های ایجنت به محدودیت‌های اجرایی

نوع
ساختنی
زمان
حدود 50 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 14 · درس 32 (میز کار حداقلی)
طرح مینیمال از یک چک‌لیست فلزی صنعتی با پنج شاخص نوری و اتصالات مدار به توابع ارزیابی کد
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفهوم اصلی
  4. پنج دسته‌بندی که بیشتر قوانین را پوشش می‌دهند
  5. قوانین ماشین‌خوان هستند
  6. قوانین با diff سازگارند
  7. قوانین در برابر گاردریل‌های فریم‌ورک
  8. افشای تدریجی: یک نقشه، نه یک دایره‌المعارف
  9. پیاده‌سازی از صفر
  10. الگوهای واقعی در محیط پروداکشن
  11. استفاده از ابزارهای واقعی
  12. خروجی این درس
  13. تمرین‌ها
  14. اصطلاحات کلیدی
  15. برای مطالعه‌ی بیشتر

بسیاری از تیم‌ها هنگام ساخت ایجنت‌های هوش مصنوعی با یک فایل قطور پر از توصیه‌های اخلاقی مثل «دقت کن» یا «پیش از ادغام، خوب تست کن» شروع می‌کنند. این توصیه‌ها شبیه اسناد راهنمای پرسنل جدید هستند؛ ایجنت‌ها بعد از چند نوبت گفت‌وگو یا به دلیل پر شدن پنجره‌ی کانتکست آن‌ها را نادیده می‌گیرند یا اساساً مرز مشخصی برای سنجش آن نصیحت‌ها ندارند. نتیجه، تحویل کدهای پر از باگ و ویرایش فایل‌های حساس است.

این درس به شما نشان می‌دهد چطور مرز میان هدایت مسیر و قوانین سفت‌وسخت را جدا کنید. با تبدیل قوانین مبهم به محدودیت‌های قابل اجرا و ماشین‌سنج در پنج دسته‌ی راه‌اندازی، اقدامات ممنوعه، تعریف اتمام کار، ابهام و تأیید انسانی، رفتار ایجنت را در زمان اجرا به تست‌های قطعی گره می‌زنید تا در خط لوله‌ی توسعه غافلگیر نشوید.

دستورالعمل‌هایی که به شکل نثر نوشته می‌شوند، صرفاً آرزو هستند. دستورالعمل‌هایی که در قالب محدودیت تعریف می‌شوند، تست به‌شمار می‌روند. میز کار (workbench) هر قانون را به چیزی تبدیل می‌کند که ایجنت در زمان اجرا (runtime) بررسی کند و بازبین بعد از اتمام کار، درستی‌اش را بسنجد.

اهداف یادگیری

  • تفکیک متنِ مسیریابی از قوانین عملیاتی.
  • بیان قوانین راه‌اندازی، اقدامات ممنوعه، تعریف اتمام کار (definition of done)، مدیریت ابهام و مرزهای تأیید در قالب محدودیت‌های ماشین‌سنج.
  • پیاده‌سازی یک بررسی‌کننده‌ی قانون (rule checker) که اجرای ایجنت را بر اساس مجموعه‌قوانین ارزیابی و امتیازدهی کند.
  • سازگار کردن مجموعه‌قوانین با diff تا بازبین بتواند تغییرات را به‌وضوح ببیند.

صورت مسئله

یک فایل معمولی AGENTS.md بیشتر شبیه مستندات توجیهی نیروهای تازه‌وارد (onboarding) است. به ایجنت می‌گوید «مراقب باش»، «کامل تست کن» و «اگر مطمئن نیستی بپرس». سه روز بعد، ایجنت تغییری را بدون هیچ تستی تحویل می‌دهد، در دایرکتوری ممنوعه‌ای فایل می‌نویسد و هرگز چیزی نمی‌پرسد؛ چون هیچ‌وقت مرزها را نمی‌دانسته است.

دستورالعمل‌ها وقتی عملیاتی باشند قدرتمندند و وقتی جنبه‌ی آرزو و نصیحت داشته باشند، ضعیف و ناکارآمدند. چاره‌ی کار نوشتن قوانینی است که میز کار بتواند تفسیرشان کند و بازبین هم بتواند به آن‌ها امتیاز بدهد.

مفهوم اصلی

جای قوانین در docs/agent-rules.md است، نه در مسیریاب (router) کوتاه ریشه. هر قانون یک نام، یک دسته‌بندی و یک تابع ارزیابی دارد.

AGENTS.mddocs/agent-rules.mdrule_checker.pyrule_report.jsonبازبین

پنج دسته‌بندی که بیشتر قوانین را پوشش می‌دهند

دسته‌بندی پرسشی که قانون به آن پاسخ می‌دهد مثال
راه‌اندازی (Startup) قبل از شروع کار، چه چیزی باید برقرار باشد؟ «فایل وضعیت وجود داشته باشد و به‌روز باشد»
ممنوعه (Forbidden) چه کاری هرگز نباید رخ دهد؟ «اسکریپت scripts/release.sh را ویرایش نکن»
تعریف اتمام کار (Definition of done) چه چیزی نشان می‌دهد کار کامل شده است؟ «کد خروج pytest برابر 0 باشد و تست پذیرش پاس شود»
ابهام (Uncertainty) ایجنت وقتی نامطمئن است چه می‌کند؟ «به‌جای حدس زدن، یک یادداشت سوال ثبت کن»
تأیید (Approval) چه چیزی به تأیید انسان نیاز دارد؟ «هر وابستگی جدید، هرگونه نوشتن روی محیط پروداکشن»

قانونی که در یکی از این پنج دسته جا نمی‌گیرد، معمولاً حاصل ادغام دو قانون است؛ بنابراین حتماً تفکیکش کنید.

قوانین ماشین‌خوان هستند

هر قانون یک اسلاگ (slug)، یک دسته‌بندی، یک خط توضیح و فیلدی به نام check دارد که نام تابعی را در rule_checker.py مشخص می‌کند. افزودن یک قانون یعنی افزودن یک تابع ارزیابی؛ در نتیجه، بررسی‌کننده همراه با میز کار رشد می‌کند.

قوانین با diff سازگارند

قوانین در یک فایل markdown واحد قرار دارند و هر قانون زیر یک سرتیتر مجزا می‌نشیند. تغییر نام‌ها در diffها کاملاً دیده می‌شوند. قوانین جدید در بالای دسته‌بندی خود می‌نشینند. قوانین کهنه هم حذف می‌شوند، نه اینکه کامنت شوند؛ زیرا مرجع حقیقت، میز کار است، نه لاگ گفت‌وگوهای مربوط به حس‌وحال اعضای تیم در فصل گذشته.

قوانین در برابر گاردریل‌های فریم‌ورک

گاردریل‌های فریم‌ورک (مانند گاردریل‌های OpenAI Agents SDK یا وقفه‌های LangGraph) قوانین را در سطح محیط اجرا اعمال می‌کنند. مجموعه‌قوانین این درس، در واقع قرارداد خواندنی و بازبینی‌پذیر برای انسان است که آن گاردریل‌ها پیاده‌سازیش می‌کنند. به هر دو نیاز دارید: محیط اجرا تخلف‌ها را حین یک نوبت گفت‌وگو شناسایی می‌کند و مجموعه‌قوانین هم ثابت می‌کند محیط اجرا کار درست را انجام می‌دهد.

افشای تدریجی: یک نقشه، نه یک دایره‌المعارف

دلیل رشد مداوم AGENTS.md این است که در هر حادثه قانونی به آن اضافه می‌شود، اما هیچ حادثه‌ای قانونی را حذف نمی‌کند. بعد از یک سال، فایل به 2000 خط می‌رسد و ایجنت هم فقط صفحه‌ی اول را می‌خواند، بودجه‌ی اتنشن (attention) آن تمام می‌شود و بر اساس بخش ناچیزی از دستورات عمل می‌کند. یک فایل دستورالعمل غول‌پیکر دقیقاً به همان دلیلی شکست می‌خورد که یک سند توجیهی 40 صفحه‌ای شکست می‌خورد: خواننده یک بار روزنامه‌وار نگاهش می‌کند و دیگر سراغ بخشی که واقعاً مهم بود نمی‌رود.

چاره‌ی کار کوچک‌تر کردن فایل نیست، بلکه لایه‌بندی آن است. مسیریاب ریشه آن‌قدر کوچک می‌ماند که در هر سشن به‌طور کامل خوانده شود و در آن جز اشاره‌گر چیزی قرار نمی‌گیرد. عمق کار در فایل‌های موضوعی قرار دارد و ایجنت تنها زمانی آن‌ها را بارگذاری می‌کند که کارش به آن موضوع مربوط شود. به ایجنت یک نقشه بدهید، نه کل دایره‌المعارف را؛ بگذارید خودش سراغ صفحه‌ای برود که نیاز دارد.

AGENTS.md                  # router, < 50 lines: what this repo is, where to look, the 5 hard rules
docs/
  agent-rules.md           # the full rule set (this lesson)
  architecture.md          # loaded when the task touches module boundaries
  testing.md               # loaded when the task writes or runs tests
  deploy.md                # loaded only for release work, gated behind an approval rule
feature_list.json          # the backlog (Phase 14 · 36)
لایه محل قرارگیری زمان خواندن بودجه‌ی حجم
مسیریاب AGENTS.md در هر سشن، همیشه کمتر از حدود 50 خط
قوانین docs/agent-rules.md در هر سشن، هنگام راه‌اندازی یک صفحه اسکرول به ازای هر دسته
اسناد موضوعی docs/<topic>.md فقط وقتی تسک به آن موضوع می‌رسد به میزان نیاز

دو آزمون، ساختار لایه‌ای را دقیق و سالم نگه می‌دارند. آزمون دسترسی‌پذیری: ایجنت باید حداکثر با 2 گام لغزش (hop) از مسیریاب به هر قانونی برسد، بنابراین مسیریاب باید به هر سند موضوعی از طریق مسیر (path) لینک دهد، نه اینکه با توضیحات متنی آن را شرح دهد. آزمون تازگی: مسیریاب آن‌قدر کوتاه است که بازبین در هر PR دوباره آن را می‌خواند؛ همین ویژگی جلوی تبدیل بی‌صدای آن را به دایره‌المعارفی که جایش را گرفته بود می‌گیرد. اشاره‌گری که مقصدش نامعتبر باشد، شکستی بدتر از نبودن قانون است؛ بنابراین وجود لینکی خراب در مسیریاب، خودش تخلف از بررسی‌های راه‌اندازی به‌شمار می‌رود.

قوانین به‌مثابه قیدهاامتیازدهی به یک اجرا بر اساس مجموعه قوانین
RULES AS CONSTRAINTSProse instructions say "be careful"; constraints say which check failed. The rule checker walks the rule set against the run artifacts and marks each rule pass or fail, so a violation is a named line in a report instead of a vibe. Diff-friendly rules mean review sees exactly which constraint changed.docs/agent-rules.mdراه‌اندازی: init قبل از ویرایش اجرا شدممنوعه: عدم نوشتن بیرون دامنهتکمیل: آزمون‌ها واقعاً اجرا شدندعدم قطعیت: پرسش قبل از فرض کردندست‌سازه‌های اجراdiff + لاگ بازخوردامتیاز 3 / 4یک مورد نقض، با نام مشخصهر قانون یک بررسی است، نه یک آرزو
دستورالعمل‌های متنی صرفاً می‌گویند «مراقب باش»، اما قیدها مشخص می‌کنند کدام بررسی با شکست مواجه شده است. ارزیاب قوانین، مجموعه قوانین را در برابر دست‌سازه‌های اجرا پیمایش کرده و هر قانون را قبول یا رد می‌کند؛ بنابراین نقض قانون به‌جای یک حس شهودی مبهم، خطی نام‌دار در گزارش است. قوانین خوانا در diff باعث می‌شوند بررسی‌کننده دقیقاً ببیند کدام قید تغییر کرده است.

پیاده‌سازی از صفر

فایل code/main.py شامل بخش‌های زیر است:

  • پارسر agent-rules.md که قوانین را در یک dataclass لود می‌کند.
  • توابع بررسی‌کننده به سبک rule_checker.py؛ یک تابع به ازای هر ارجاع check.
  • اجرای نمایشی یک ایجنت که دو قانون را نقض می‌کند، به‌همراه گام بررسی که این تخلفات را ثبت می‌کند.

اجرای آن:

python3 code/main.py

خروجی: مجموعه‌قوانین پارس‌شده، ردگیری محاسبات (trace) اجرا، وضعیت قبولی/ردی به ازای هر قانون، و یک فایل rule_report.json ذخیره‌شده در کنار اسکریپت.

الگوهای واقعی در محیط پروداکشن

سه الگو مجموعه‌قانونی را که یک فصل دوام می‌آورد، از مجموعه‌ای که ظرف یک هفته از کار می‌افتد جدا می‌کنند.

برچسب‌گذاری شدت در زمان نگارش. هر قانون برچسب severity دارد: block، warn یا info. بررسی‌کننده هر سه را گزارش می‌کند، اما محیط اجرا فقط جلوی block می‌ایستد. اغلب تیم‌ها در ابتدا شدت قوانین را بالا می‌برند و بعداً زیر فشار موعد تحویل بی‌سر‌و‌صدا آن‌ها را ضعیف می‌کنند؛ برچسب‌گذاری در زمان نوشتن باعث می‌شود کالیبراسیون از همان ابتدا به‌درستی انجام شود. این رویکرد را با گیت اعتبارسنجی (فاز 14 · درس 38) ترکیب کنید که هرگونه نادیده گرفتن قانون block را در یک لاگ حسابرسی overrides.jsonl ثبت و امضا می‌کند.

تاریخ انقضا به‌مثابه سازوکار الزام‌آور. هر قانون یک تاریخ expires_at دارد (پیش‌فرض 90 روز بعد از نگارش). اگر قانونی منقضی نشده باشد و در 60 روز متوالی هیچ تخلفی از آن ثبت نشود، بررسی‌کننده هشدار می‌دهد؛ در بازبینی فصلی بعدی، یا دلیلی برای نگه‌داشتنش ارائه می‌شود، یا سطح آن به info کاهش می‌یابد، یا حذف می‌شود. داده‌های بازبینی کد هوش مصنوعی در پروداکشن Cloudflare (آوریل 2026، با 131,246 اجرای بازبینی در 5,169 مخزن طی 30 روز) نشان داد مجموعه‌قوانینی که انقضای صریح داشتند زیر 30 قانون برای هر مخزن باقی ماندند؛ درحالی‌که مجموعه‌های بدون انقضا به بیش از 80 قانون رسیدند که بیشترشان هرگز اجرا نمی‌شدند.

مارک‌داون به‌عنوان مبدا، جیسون به‌عنوان کِش. فایل agent-rules.md فایلی است که نوشته و ویرایش می‌شود؛ agent-rules.lock.json کِشی است که بررسی‌کننده در مسیر اجرای سریع (hot path) می‌خواند. این فایل قفل با یک pre-commit hook دوباره تولید می‌شود. diffهای مارک‌داون به‌راحتی بررسی می‌شوند و پارس کردن مارک‌داون هم از هر نوبت گفت‌وگو بیرون می‌ماند، چون بررسی‌کننده فقط فایل کوچک JSON پیش‌ساخته را بارگذاری می‌کند. ساختاری دقیقاً مثل package.json / package-lock.json و Cargo.toml / Cargo.lock.

استفاده از ابزارهای واقعی

در محیط پروداکشن:

  • ابزارهای Claude Code، Codex و Cursor قوانین را در شروع سشن می‌خوانند و موقع رد درخواست‌ها به آن‌ها ارجاع می‌دهند. بررسی‌کننده هم آن‌ها را دوباره در CI اجرا می‌کند تا جلوی تغییرات تدریجی و بی‌صدا (drift) را بگیرد.
  • گاردریل‌های OpenAI Agents SDK همین بررسی‌ها را به‌عنوان گاردریل‌های ورودی و خروجی ثبت می‌کنند. مارک‌داون لایه‌ی اسناد است؛ SDK لایه‌ی زمان اجراست.
  • وقفه‌های LangGraph زمانی که گره‌ای در حال اجرا قانونی را نقض کند فعال می‌شوند. مدیریت‌کننده‌ی وقفه قانون را می‌خواند، از انسان سوال می‌پرسد و سپس کار را از سر می‌گیرد.

مجموعه‌قوانین در هر سه مورد قابل‌استفاده است، چون فقط از مارک‌داون و نام توابع تشکیل شده است.

خروجی این درس

فایل outputs/skill-rule-set-builder.md با مالک پروژه مصاحبه می‌کند، دستورالعمل‌های متنی موجود را در پنج دسته می‌چیند، و یک agent-rules.md نسخه‌دار به‌همراه اسکلت کدهای بررسی‌کننده تحویل می‌دهد.

تمرین‌ها

  1. اگر محصول شما واقعاً نیاز دارد، دسته‌ی ششمی اضافه کنید. دلیل بیاورید که چرا نمی‌توان آن را در یکی از پنج دسته‌ی قبلی ادغام کرد.
  2. بررسی‌کننده را طوری توسعه دهید که هر قانون بتواند سطح شدت (block، warn، info) داشته باشد و گزارش هم بر اساس آن تجمیع شود.
  3. بررسی‌کننده را به CI وصل کنید: اگر در آخرین اجرای ایجنت، قانونی با شدت block نقض شد، بیلد باید fail شود.
  4. فیلد «تاریخ انقضا» به هر قانون بیفزایید. قانونی که 90 روز بدون هیچ خطایی بماند، باید وارد فرآیند بازبینی شود.
  5. یک فایل AGENTS.md واقعی پیدا کنید و آن را بر اساس قوانین پنج‌گانه بازنویسی کنید. چند خط از آن واقعاً عملیاتی بود؟ چند خط از جنس آرزو بود؟

اصطلاحات کلیدی

اصطلاح چیزی که افراد می‌گویند معنای واقعی آن
قانون عملیاتی (Operational rule) «یک دستورالعمل واقعی» قانونی که میز کار بتواند در زمان اجرا آن را بررسی کند
قانون آرزویی (Aspirational rule) «مراقب باش» قانونی بدون تست مشخص؛ یا حذفش کنید یا ارتقایش دهید
تعریف اتمام کار (Definition of done) «پذیرش» سندی عینی و متکی به فایل که نشان می‌دهد کار تمام است
شدت توقف (Block severity) «قانون سخت‌گیرانه» نقض آن اجرا را متوقف می‌کند؛ بدون اپراتور نمی‌توان نادیده‌اش گرفت
انقضای قانون (Rule expiry) «پاکسازی قوانین کهنه» قانونی که پس از N روز تخلفی نداشته، آماده‌ی بازنشستگی است

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درستفاوت بین یک قانون آرمانی (aspirational) و یک قانون عملیاتی (operational) چیست؟
  2. پیش از درسدرس اغلب قوانین را تحت چه پنج دسته‌ای پوشش می‌دهد؟
  3. حین درسکدام برچسب شدت (severity) اجرا را متوقف کرده و نیازمند لغو دستی توسط اپراتور است؟
  4. حین درسچرا درس توصیه می‌کند برچسب شدت را همان زمان نوشتن قانون مشخص کنید؟
  5. حین درسالگوی «markdown به‌مثابه منبع، JSON به‌مثابه کَش» چه کاری انجام می‌دهد؟
  6. پس از درستاریخ انقضای قوانین چگونه نقش یک سازوکار بازدارنده (forcing function) را ایفا می‌کند؟
  7. پس از درسقوانین چه ارتباطی با گاردریل‌های فریم‌ورک دارند؟

سؤالات متداول

چرا دستورالعمل‌های متنی در AGENTS.md کارایی خود را از دست می‌دهند؟

با بزرگ شدن فایل و اضافه شدن قوانین متنی پیاپی، پنجره‌ی اتنشن ایجنت پر می‌شود و به دلیل نبود ابزار سنجش عینی، نمی‌تواند مرزهای عملیاتی را در زمان اجرا بسنجد.

پنج دسته‌بندی اصلی برای تعریف قوانین اجرایی چیستند؟

قوانین راه‌اندازی (Startup)، ممنوعه (Forbidden)، تعریف اتمام کار (Definition of done)، مدیریت ابهام (Uncertainty) و مرزهای تأیید انسانی (Approval).

تفاوت گاردریل‌های فریم‌ورک با مجموعه‌قوانین این درس چیست؟

گاردریل‌ها (مثل OpenAI یا LangGraph) قوانین را در زمان اجرا پیاده می‌کنند، اما مجموعه‌قوانین، قرارداد خواندنی و بازبینی‌پذیری است که بررسی‌کننده به کمک آن درستی عملکرد محیط اجرا را اثبات می‌کند.

فایل قفل agent-rules.lock.json چه کاربردی دارد؟

فایل Markdown به عنوان منبع قابل ویرایش توسط انسان نگهداری می‌شود و فایل lock.json خروجی کش برای اجرای سریع بدون نیاز به پارس مجدد Markdown در هر نوبت است.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.