الگوی شکست: توانایی اعطا شده، قصد راستیآزمایینشده
این الگوی تکرارشونده است. یک عامل مجاز است یک سیستم را مرور کند، سپس روی آن عمل میکند. یا مجاز است یک رکورد را بخواند، سپس یکی مینویسد. بیشتر حوادث در همان شکاف بین فعلی که به عامل اعطا شده و فعلی که واقعاً اجرا کرده زندگی میکنند. اعطا معمولاً ضمنی است: یک اعتبارنامه با دامنه خواندن-نوشتن، یک ابزار با امضای عمومی http_request، یک حساب سرویس که میتواند به هر چیزی روی یک بخش شبکه دسترسی پیدا کند. قصد معمولاً راستیآزمایینشده است: هیچ مصنوعی وجود ندارد که بگوید «این فراخوانی مشخص، علیه این اندپوینت مشخص، با این بار مشخص، پیش از خروج از فرایند بررسی شده است.»
لاگگیری پسازواقع نمیتواند این شکاف را ببندد. لاگها به شما میگویند چه اتفاقی افتاد؛ آنها فراخوانی را رد نمیکنند. اگر تنها کنترل بین یک عامل و یک اندپوینت تولیدی یک جمله در یک پرامپت سیستمی باشد، آن کنترل توصیهای است. یک مدل تحت جابهجایی توزیع، یک تزریق پرامپت حملشده در یک سند بازیابیشده، یا یک برنامهریز که دچار رانش شده، توصیه را بهعنوان یک پیشنهاد تلقی میکند. رد باید در جایی اتفاق بیفتد که عامل نتواند با آن بحث کند.
یک قرارداد سندباکس چهار بند دارد
قرارداد سندباکس یک پیششرط قابلبررسی ماشینی است که به یک مرز ابزار متصل میشود. یک سند سیاستی نیست و یک پرامپت نیست. چهار بند دارد، و هر چهار بند بیرون از مدل اعمال میشوند.
دامنه
دامنه مجموعه دقیق اندپوینتها و فعلهایی است که عامل میتواند استفاده کند، که بهصورت یک allowlist بیان میشود. یک denylist شکست میخورد چون باید هر عمل خطرناکی را برشمارد، و فضای اعمال خطرناک باز است. یک allowlist بهصورت بسته شکست میخورد: هر چیزی که نامبرده نشده باشد رد میشود. بهطور مشخص، دامنه مجموعهای از چندتاییهایی مانند (method, host, path-pattern, credential-id) است که پیش از ساخت درخواست تطبیق داده میشوند. ابزاری که یک URL آزاد ارائه میدهد، دامنهدار نیست؛ یک پروکسی با چند گام اضافه است.

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

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