مسئله ترتیبدهی
عاملهای خودمختار به شکلی خاص شکست میخورند: پیش از آنکه کسی بررسی کند آیا اقدام موجه بوده است، دست به اقدام میزنند. طرح معقول به نظر میرسید، فراخوانی ابزار بهدرستی شکل گرفته بود و اثر جانبی اعمال شد. تنها بعدها، در یک لاگ یا یک کار تطبیق، ناسازگاری آشکار میشود. تا آن زمان پرداخت تسویه شده، حذف منتشر شده، یا پیام خروجی خوانده شده است.
این جستار از یک موضع دفاع میکند: تأیید اجرا تنها زمانی بهکار میآید که بین طرح و اثر جانبی قرار بگیرد. این یعنی لایه تأیید باید یک وابستگی همگام فراخوانی ابزار باشد، نه یک جریان بازرسی ناهمگام. تأیید پسنگر شواهد را پس از آسیب تولید میکند و نمیتواند اجرا را تغییر دهد. تأیید درونمسیر به هر فراخوانی ابزار تأخیر میافزاید، پس باید تنها به اقدامهای بازگشتناپذیر محدود شود.
ترتیب همان کنترل است. هر چیز دیگری ابزارگذاری است.
دو جایگاه برای تأیید
دقیقاً دو جایگاه وجود دارد که یک گام تأیید میتواند در آن قرار بگیرد، و این دو ویژگیهای متضاد دارند.
تأیید پسنگر پس از بازگشت فراخوانی ابزار اجرا میشود. ارزان است، افزودنش آسان است و مصنوعات مفیدی تولید میکند: ردهای بازرسی، گزارشهای انحراف، هشداردهی. نمیتواند اجرا را تغییر دهد. اگر بررسی فعال شود، اثر جانبی از پیش واقعی شده است. بررسیهای پسنگر شیوهای است که تیمها کشف میکنند یک عامل یک هفته است رکوردهای بدشکل مینویسد. این کشف ارزشمندی است و کنترل ضعیفی.
تأیید درونمسیر بین طرح و فراخوانی ابزار اجرا میشود. فراخوانی ابزار تا زمانی که بررسی حکمی برنگرداند اجرا نمیشود. این تنها ترتیبی است که میتواند از یک اثر جانبی بد جلوگیری کند، و تنها ترتیبی است که به هر فراخوانی دروازهبندیشده تأخیر تحمیل میکند. یک دروازه همگام روی یک حلقه مدلمحور رایگان نیست: یک رفتوبرگشت میافزاید، میتواند مهلت را از دست بدهد و خودش میتواند شکست بخورد. پرسش مهندسی این نیست که آیا این هزینه را بپردازیم، بلکه این است که کجا بپردازیم.
طبقهبندی اقدامها بر اساس بازگشتپذیری
قاعده محدودهگذاری بازگشتپذیری است. یک اقدام بازگشتناپذیر است اگر واگردانیاش نیازمند همکاریای باشد که عامل از آن برخوردار نیست، یا اگر خود واگردانی یک اثر جانبی باشد.

متحمل نسبت به نمونهگیری و بازبینی ناهمگام:
- خواندنها. خواندنی که داده کهنه یا نادرست برمیگرداند با خواندن دوباره جبرانپذیر است. تنها بر مجوزدهی و خروج داده دروازه بگذارید، نه بر محتوا.
- پیشنویسها. پیشنویسی که هرگز ارسال نمیشود بیاثر است. بازبینی میتواند ناهمگام باشد.
- نوشتنهای محیط آزمایشی. نوشتن در یک فضاینام آزمایشی یا یک بافر فقطافزودنی بازبینی تأخیری را تحمل میکند، به شرط آنکه ارتقا به محیط تولید خودش دروازهبندی شده باشد.
نیازمند بررسیهای همگام:
- پرداختها و انتقالها. جابهجایی پول اقدام بازگشتناپذیر متعارف است. واگردانیاش بازپرداخت است که به طرف مقابل وابسته است.
- حذفها. حذفهای سخت، و هر حذفی که آبشاری باشد، به دروازه همگام نیاز دارند. حذفهای نرم دسته دیگریاند.
- پیامهای خروجی. ایمیل، چت، وبهوک و پستهای عمومی را نمیتوان خواندهنشده کرد. فراخوانی یک واگردانی نیست.
- نوشتنهای بیرونی. هر نوشتنی در سیستمی بیرون از مرز اعتماد، از جمله APIهای شخص ثالث و پایگاههای داده مشترک، وضعیتی را تغییر میدهد که عامل مالک آن نیست.
طبقهبندی باید بهازای هر ابزار اعلام شود، نه بهازای هر فراخوانی استنتاج شود. ابزاری که گاهی خواندن است و گاهی نوشتن، دو ابزار است. ابهام در کلاس بازگشتپذیری خودش یک نقص است.
یک بررسی واقعاً چه چیزی میتواند تصدیق کند
یک دروازه همگام تنها بهاندازه محمولهایی که ارزیابی میکند خوب است. چهار مورد ارزش ساختن دارند و با هم ترکیب میشوند.
شکل آرگومان در برابر یک اسکیمای اعلامشده. قرارداد ورودی ابزار یک اسکیماست و بررسی، آرگومانهای پیشنهادی را پیش از فراخوانی در برابر آن اعتبارسنجی میکند. این انحراف نوع، فیلدهای الزامی غایب، و آن دسته از شکستها را میگیرد که در آن مدل شیئی بهظاهر معقول با ساختار نادرست تولید میکند. اعتبارسنجی اسکیما ارزان است و برای هر ابزار بازگشتناپذیر به درونمسیر تعلق دارد.
مقصد در برابر قرارداد خروج داده. هر ابزار اعلام میکند که مجاز است داده را به کجا بفرستد: کدام میزبان، کدام حساب، کدام کانال. بررسی، مقصد حلشده را با آن قرارداد مقایسه میکند. این همان کنترلی است که مانع میشود عاملی را فریب دهند تا بار دادهای را به نشانیای بفرستد که در محتوای بازیابیشده ظاهر شده است. قرارداد خروج داده یک فهرست مجاز ایستاست؛ بررسی یک مقایسه زمان اجراست.
بودجه باقیمانده در برابر سقف هزینه اجرا. هر اجرا بودجهای حمل میکند. پیش از یک اقدام بازگشتناپذیر، بررسی بودجه باقیمانده و هزینه پیشنهادی را میخواند و اگر اقدام از سقف فراتر رود امتناع میکند. این یک محدودیت بهازای هر فراخوانی نیست؛ یک محدودیت بهازای هر اجراست، تا حلقهای از اقدامهای کوچکِ منفرد نتواند به یک اقدام بزرگ تجمیع شود. سازوکار یک شمارنده است که دروازه آن را بهصورت اتمی همراه با اقدام
ه عبور کنند.

منشأ مقادیری که نوشته میشوند. این کمشیوعترین و مهمترین است. هر مقداری که پایدار خواهد شد یک برچسب منشأ حمل میکند: برگرفته از نتیجه ابزار، برگرفته از ورودی کاربر، برگرفته از تکمیل مدل. بررسی از نوشتن مقداری که منشأش تولیدشده توسط مدل است در فیلدی که نیازمند منبعی برگرفته از ابزار یا کاربر است امتناع میکند. این همان چیزی است که مانع میشود عاملی یک واقعیت توهمزده را به یک رکورد پولشویی کند. بدون آن، یک تکمیل روان به یک سطر پایگاه داده تبدیل میشود و آن سطر از بافت زمینهای که تولیدش کرده عمر بیشتری میکند.
ردیابی منشأ نیازمند انضباط در بالادست است: نتایج ابزار باید در مرز برچسبگذاری شوند و برنامهریز باید برچسبها را در طول تبدیلها حفظ کند. این کار واقعی است و همان تفاوت میان دروازهای است که شکل را بررسی میکند و دروازهای که معنا را بررسی میکند.
هزینه و رفتار شکست
دروازه اکنون روی مسیر بحرانی است، پس حالتهای شکستش همان حالتهای شکست اجراست.
در مهلتگذشت تأیید، بسته شکست بخور و این را پیشفرض کن نه یک پرچم پیکربندی. دروازهای که مهلتش میگذرد و اقدام را مجاز میکند دروازه نیست. اگر بررسی نتواند در مهلت خود حکمی برگرداند، اقدام اجرا نمیشود و اجرا مهلتگذشت را بهعنوان خطایی درجهیک آشکار میکند. پرچم کردن این، دعوت میکند که پرچم در هنگام یک حادثه روی حالت مجاز تنظیم شود و سپس همانجا بماند. رفتار ایمن باید تنها رفتار باشد، یا رفتار ناایمن باید نیازمند یک بازنویسی صریح و قابلبازرسی باشد که خودش ثبت شود.
نرخ مثبت کاذب خود لایه تأیید را اندازه بگیر. دروازهای که اقدامهای مشروع را مسدود میکند دروازهای است که غیرفعال میشود. نرخ مثبت کاذب کسری از اقدامهای درست است که دروازه رد میکند. باید بهازای هر محمول ردیابی شود، چون یک بررسی اسکیما و یک بررسی منشأ به شکل متفاوتی شکست میخورند. یک محمول منشأ پرسروصدا نخستین چیزی خواهد بود که یک اپراتور خاموش میکند، و بهمحض خاموش شدن، مسیر پولشویی دوباره باز میشود. معامله صادقانه این است که سختگیرتر کردن یک محمول منفیهای کاذب را کاهش میدهد و مثبتهای کاذب را بالا میبرد، و بقای دروازه به پایین نگه داشتن عدد دوم وابسته است تا کسی نخواهد حذفش کند.
یک هزینه مرتبه دوم وجود دارد. هر بررسی همگام یک وابستگی است و وابستگیها شکست میخورند. دروازه باید در دسترستر از ابزارهایی باشد که پاسداری میکند، وگرنه خودش به قطعی تبدیل میشود. این معمولاً یعنی محمولها بهصورت محلی در برابر قراردادها و شمارندههای کششده ارزیابی میشوند، نه با فراخوانی یک سرویس سیاست راهدور در هر اقدام.
این حلقه را کجا میگذارد
معماریای که از استدلال ترتیبدهی برمیآید کوچک است. ابزارها یک کلاس بازگشتپذیری اعلام میکنند. ابزارهای بازگشتناپذیر یک اسکیما، یک قرارداد خروج داده، یک تعامل بودجه و یک الزام منشأ اعلام میکنند. حلقه عامل دروازه را فراخوانی میکند و دروازه ابزار را فراخوانی میکند. تأیید پسنگر هنوز وجود دارد، اما کارش یافتن محمولهایی است که باید افزوده شوند، نه گرفتن اقدامهایی که پیشتر رخ دادهاند.
بخش ناخوشایند این است که این تأیید را به مسیر داغ سیستم میراند، جایی که تأخیر و مثبتهای کاذبش را هر اجرا حس میکند. این همان نکته است. کنترلی که اجرا حسش نمیکند کنترلکننده اجرا نیست. جایگزین، یعنی یک جریان بازرسی ناهمگام، سندی از آنچه عامل انجام داده است، و سند یک تصمیم نیست.
