فاز 14 · درس 38

گیت‌های اعتبارسنجی: جلوگیری قطعی از اعلام موفقیت کاذب ایجنت‌ها

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

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

گیت اعتبارسنجی (Verification Gate) به عنوان یک لایه‌ی کنترلی قطعی، مستقل از ارزیابی احتمالات مدل کار می‌کند. این سیستم دست‌سازه‌های باقی‌مانده از مراحل کار—شامل رکوردهای بازخورد، گزارش دامنه، diff کد و قوانین کیفی—را تحلیل کرده و تصمیمی مطلق و بدون ابهام می‌گیرد؛ تصمیمی که مستقیماً در پایپ‌لاین CI وارد شده و از نفوذ باگ‌های پنهان یا تغییرات ناخواسته جلوگیری می‌کند.

ایجنت حق ندارد کار خودش را تمام‌شده اعلام کند. یک گیت اعتبارسنجی (verification gate) قرارداد دامنه، لاگ بازخورد، گزارش قوانین و diff را می‌خواند و فقط به یک پرسش پاسخ می‌دهد: آیا این تسک واقعاً تمام شده است؟ اگر پاسخ گیت منفی باشد، چت هر چه می‌خواهد بگوید؛ تسک انجام نشده است.

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

  • تعریف گیت اعتبارسنجی به‌عنوان یک تابع قطعی بر روی دست‌سازه‌های میز کار.
  • ترکیب گزارش قوانین، گزارش دامنه، رکوردهای بازخورد و diff در یک رای نهایی واحد.
  • تولید یک فایل verification_report.json که هم ایجنت بازبین و هم CI بتوانند آن را بخوانند.
  • خودداری از پیشبرد تسک در صورت بروز هر خطایی با سطح اهمیت مسدودکننده (block-severity)، بدون هیچ استثنایی.

صورت مسئله

ایجنت‌ها خیلی راحت اعلام موفقیت می‌کنند. سه الگوی شکست متداول در این زمینه دیده می‌شود:

  • «خوب به نظر می‌رسد.» مدل diff خودش را خوانده و تصمیم گرفته که درست است.
  • «تست‌ها پاس شدند.» با اطمینان کامل بیان می‌شود، اما هیچ رکوردی از اجرای واقعی تست وجود ندارد.
  • «معیارهای پذیرش برآورده شدند.» معیارهای پذیرش آن‌قدر باز و منعطف تفسیر شده‌اند که هر چیزی شبیه به کار انجام‌شده را شامل شوند.

راه‌حل میز کار، یک گیت اعتبارسنجی واحد است که دست‌سازه‌های تولیدشده توسط ایجنت را می‌خواند و تصمیم نهایی را می‌گیرد. این گیت قطعی (deterministic) است، در کنترل نسخه نگهداری می‌شود و به CI متصل است. ایجنت نمی‌تواند سر آن کلاه بگذارد.

مفاهیم پایه

بلهخیرDiffverify_agent.pyscope_report.jsonrule_report.jsonfeedback_record.jsonlverification_report.jsonقبول شد؟ایجنت بازبینرد انجام + ارجاع به انسان

مواردی که گیت بررسی می‌کند

بررسی دست‌سازه‌ی مبدأ سطح اهمیت
همه‌ی دستورهای پذیرش اجرا شده باشند feedback_record.jsonl block
کد خروجی همه‌ی دستورهای پذیرش صفر باشد feedback_record.jsonl block
بررسی دامنه هیچ نوشتن ممنوعی نداشته باشد scope_report.json block
بررسی دامنه هیچ نوشتن خارج از دامنه‌ای نداشته باشد scope_report.json block یا warn
همه‌ی قوانین با سطح اهمیت مسدودکننده پاس شوند rule_report.json block
هیچ کد خروجی null در بازخوردها نباشد feedback_record.jsonl block
فایل‌های دست‌خورده با scope.allowed_files همخوانی داشته باشند هر دو warn

یافته‌ای با سطح warn صرفاً به رای نهایی ضمیمه می‌شود؛ اما یافته‌ای با سطح block جلوی passed: true را می‌گیرد.

قطعی، نه احتمالاتی

گیت باید برای یک مجموعه‌ دست‌سازه‌ی یکسان، همیشه خروجی و رای ثابتی تولید کند. از داورهای مبتنی بر مدل‌های زبانی بزرگ (LLM judges) خبری نیست. جای داورهای LLM در بخش ایجنت بازبین (فصل 14 · 39) است؛ جایی که هدف ارزیابی کیفی است، نه تعیین وضعیت تسک.

یک گزارش، یک مسیر

گیت برای هر پایان تسک، یک verification_report.json تولید می‌کند که در مسیر outputs/verification/<task_id>.json ذخیره می‌شود. فرایند CI نیز دقیقاً همین مسیر را می‌خواند. وجود چند گیت با مسیرهای متفاوت، منبع حقیقت (source of truth) را دچار انشعاب (fork) می‌کند.

رد کردن بدون استثنا

یافته‌های با سطح اهمیت مسدودکننده توسط ایجنت قابل چشم‌پوشی (override) نیستند. این موارد تنها توسط انسان، با ثبت یک override_reason مشخص و شناسه‌ی کاربری overridden_by قابل چشم‌پوشی خواهند بود. نادیده گرفتن این موارد یک تغییر امضاشده است، نه تصمیمی که ایجنت بگیرد.

گیت اعتبارسنجیگیت‌های ترتیبی، یک حکم نهایی
VERIFICATION GATEThe gate is a deterministic function over artifacts the agent already produced: the rule report, the scope report, the feedback records, and the diff. The change clears rules, scope, and feedback, but acceptance has no record of ever running, so the final gate stays down and done stays false, whatever the chat claimed.قوانیندامنهبازخوردپذیرشdiffمسدود: آزمون پذیرش هرگز اجرا نشدverification_report.json · passed: false
گیت یک تابع قطعی (deterministic) روی دست‌سازه‌هایی است که ایجنت از قبل تولید کرده است: گزارش قوانین، گزارش دامنه، سوابق بازخورد و diff. تغییر اعمال‌شده از آزمون‌های قوانین، دامنه و بازخورد با موفقیت عبور می‌کند، اما سوابقی از اجرای acceptance وجود ندارد؛ بنابراین گیت نهایی بسته می‌ماند و وضعیت done بدون توجه به ادعای چت، false خواهد بود.

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

فایل code/main.py موارد زیر را پیاده‌سازی می‌کند:

  • یک بارگذار (loader) برای هر دست‌سازه‌ی ورودی که همگی به‌صورت محلی شبیه‌سازی شده‌اند تا این درس کاملاً خودکفا باشد.
  • تابع خالص verify(task_id, artifacts) -> VerdictReport.
  • یک چاپگر که نتایج تک‌تک بررسی‌ها و وضعیت نهایی قبولی/رد را نمایش می‌دهد.
  • یک نسخه‌ی نمایشی با سه سناریوی تسک: قبولی بی‌نقص، خزش دامنه (scope creep) و غیبت معیارهای پذیرش.

اجرای کد:

python3 code/main.py

خروجی: سه گزارش رای نهایی، که هر کدام در کنار اسکریپت ذخیره می‌شوند.

الگوهای کاربردی در محیط‌های عملیاتی

پنج الگو وجود دارند که این گیت را از «یک تسک ساده‌ی lint» به «نقطه‌ی تعیین‌کننده‌ی اصلی» ارتقا می‌دهند:

دفاع در عمق، نه یک گیت تنها. هوک pre-commit ← بررسی وضعیت در CI ← هوک مجوز پیش از ابزار ← گیت pre-merge. هر لایه قطعی است تا خطای ردشده از یک لایه، در لایه‌ی بعدی گرفته شود. شیوه‌نامه‌ی مارس 2026 در microservices.io صراحتاً می‌گوید: هوک pre-commit غیرقابل دور زدن است؛ چون برعکس مهارت‌های سمت مدل، به دنبال کردن دستورالعمل‌ها توسط ایجنت وابسته نیست. گیت اعتبارسنجی در لایه‌ی CI / pre-merge می‌نشیند.

دفاع با بررسی‌های قطعی، داوری مدل فقط برای نکات ظریف. الگوی ترکیبی سال 2026 شرکت Anthropic: پاداش‌های قابل اعتبارسنجی (تست‌های واحد، بررسی ساختار اسکما، کدهای خروجی) به این پرسش پاسخ می‌دهند که «آیا کد مسئله را حل کرد؟» — شیوه‌نامه‌های نمره‌دهی (rubrics) با LLM پاسخ می‌دهند که «آیا کد خوانا، امن و مطابق شیوه‌نامه‌ی کدنویسی هست یا خیر؟» گیت دسته‌ی اول را اجرا می‌کند؛ ایجنت بازبین (فصل 14 · 39) دسته‌ی دوم را. مخلوط کردن این دو با هم، شفافیت نتایج را از بین می‌برد.

لاگ چشم‌پوشیِ امضاشده، نه گفتگوهای اسلک. هر چشم‌پوشی یک سطر در outputs/verification/overrides.jsonl ثبت می‌کند که شامل این موارد است: برچسب زمانی، کد یافته، دلیل، کاربر امضاکننده و commit فعلیِ HEAD. محیط اجرا هر چشم‌پوشیِ بدون امضا را رد می‌کند؛ ردپای حسابرسی نیز در git دنبال می‌شود. مرز میان یک سیاست چشم‌پوشی واقعی و یک نمایش صوری همین جاست.

کف پوشش آزمون به‌عنوان یک بررسی تراز اول. فایل coverage_report.json ورودی بررسی coverage_floor (پیش‌فرض 80%) است. اگر پوششِ سنجیده‌شده به زیر این کف بیفتد یا نسبت به merge قبلی بیش از 1 درصد افت کند، گیت با خطا متوقف می‌شود. بدون این بررسی، ایجنت‌ها بی‌سروصدا تست‌هایی را که fail می‌شوند حذف می‌کنند و گزارش‌های اعتبارسنجی همچنان سبز می‌مانند.

حالت strict-- هشدارها را به خطا تبدیل می‌کند. برای branchهای انتشار، PRهای مسدودکننده‌ی عرضه یا تریاژ پس از رخداد، پرچم strict-- همه‌ی هشدارها را به خطای قطعی مسدودکننده تبدیل می‌کند. این پرچم به‌صورت اختیاری روی هر branch فعال می‌شود، نه به‌عنوان پیش‌فرض سراسری؛ چون اعمال همیشگی حالت Strict جریان روزمره‌ی کار را مختل می‌کند.

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

الگوهای محیط عملیاتی:

  • مرحله‌ی CI. تسک verify_agent گیت را روی دست‌سازه‌های نهایی ایجنت اجرا می‌کند. سازوکار محافظت از merge تا زمان دریافت passed: true اجازه‌ی ادغام نمی‌دهد.
  • هوک پیش از تحویل (Pre-handoff hook). محیط اجرای ایجنت قبل از تولید سند تحویل کار، گیت را فراخوانی می‌کند. رای سبز نباشد، تحویلی هم در کار نیست.
  • تریاژ دستی. وقتی ایجنت ادعای موفقیت می‌کند و نیروی انسانی به آن شک دارد، اپراتورها گزارش را بررسی می‌کنند.

این گیت نقطه‌ی تصمیم‌گیری نهایی در جریان کاری میز کار است. تمام سطوح دیگر در بالادستِ آن قرار دارند.

خروجی این درس

فایل outputs/skill-verification-gate.md این گیت را به یک پروژه‌ی مشخص وصل می‌کند: کدام دستورهای پذیرش ورودی آن هستند، کدام قوانین اهمیت مسدودکننده دارند، چه میزان نوشتن خارج از دامنه‌ای تحمل می‌شود و لاگ حسابرسی چشم‌پوشی‌ها چگونه نگهداری خواهد شد.

تمرین‌ها

  1. یک بررسی coverage_floor اضافه کنید: دستور تست باید گزارش پوشش آزمونی با حداقل 80% تولید کند. مشخص کنید کدام دست‌سازه باید این کف پوشش را در خود داشته باشد.
  2. قابلیتی برای حالت strict-- پیاده کنید که همه‌ی warnها را به block تبدیل کند. مواردی را که حالت Strict باید پیش‌فرض باشد مستند کنید.
  3. کاری کنید گیت علاوه بر JSON، یک خلاصه‌ی Markdown هم تولید کند. استدلال کنید که چه فیلدهایی باید در این خلاصه آورده شوند.
  4. یک بررسی time_since_last_human_touch اضافه کنید: هر فایلی که در بازه‌ی زمانی 60 ثانیه‌ای پس از فشرده‌شدن کلیدی توسط انسان ویرایش شده باشد، از خطاهای خارج از دامنه معاف شود.
  5. گیت را روی یک diff واقعیِ تولیدشده توسط ایجنت در محصول خودتان اجرا کنید. چند مورد از یافته‌ها واقعی و چند مورد نویز هستند؟ این گیت در چه بخش‌هایی نیاز به رشد و توسعه دارد؟

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

اصطلاح در گفتار عامیانه معنای واقعی و دقیق
گیت اعتبارسنجی (Verification gate) «همان بررسی‌ای که جلوی همه‌چیز را می‌گیرد» تابع قطعی روی دست‌سازه‌های میز کار که رای قبول/رد نهایی را صادر می‌کند
سطح اهمیت مسدودکننده (Block severity) «خطای سخت (Hard fail)» یافته‌ای که مانع از passed: true می‌شود و نیاز به چشم‌پوشی امضاشده دارد
لاگ چشم‌پوشی (Override log) «چرا اجازه دادیم رد شود» ورودی‌های امضاشده با ذکر دلیل و شناسه‌ی کاربری که در بازبینی حسابرسی می‌شوند
دستور پذیرش (Acceptance command) «سند اثبات» دستور شلی که خروجی صفر آن به معنای «تمام شدن کار» است
مسیر گزارش واحد (One report path) «مرجع حقیقت» مسیر outputs/verification/<task_id>.json که هم توسط CI و هم انسان‌ها خوانده می‌شود

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

خودآزمایی

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

  1. پیش از درسگیت اعتبارسنجی دقیقاً به چه سؤالی پاسخ می‌دهد؟
  2. پیش از درسچرا گیت باید حتماً قطعی (deterministic) باشد؟
  3. حین درسقاعده و انضباط نادیده‌گرفتن (override) در گیت چگونه است؟
  4. حین درسمنظور از جفت «هنجار ترکیبی» (Hybrid Norm) که در درس به آن اشاره شده چیست؟
  5. حین درسدفاع در عمق (دفاع لایه‌ای) چگونه گیت‌ها را لایه‌بندی می‌کند؟
  6. پس از درسبررسی کف پوشش آزمون (coverage_floor) در برابر چه چیزی محافظت می‌کند؟
  7. پس از درسدر چه مواقعی حالت strict-- باید تمام موارد warn را به block ارتقا دهد؟

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

چرا ارزیابی خروجی گیت باید قطعی (Deterministic) باشد و نه بر پایه‌ی LLM؟

چون گیت وضعیت باینری تسک (قبول یا رد قطعی) را تعیین می‌کند. استفاده از مدل‌های زبانی به ارزیابی‌ها ناپایداری و احتمال خطا می‌دهد، در حالی که داوری‌های کیفی LLM صرفاً برای بازبینی محتوایی مناسب‌اند نه تأیید وضعیت تسک.

تفاوت خطای مسدودکننده (Block) با هشدار (Warn) در گیت چیست؟

خطای مسدودکننده مانع از صدور تأییدیه‌ی قبولی (passed: true) می‌شود و عبور از آن فقط با امضا و ثبت دلیل مستند توسط انسان ممکن است، اما هشدار فقط به گزارش ضمیمه می‌شود و روند را متوقف نمی‌کند.

چرا بررسی کف پوشش آزمون (Coverage Floor) در گیت حیاتی است؟

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

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

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