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

همین الگو در داراییهای صنعتی و دولتی ظاهر میشود: نقاط پایانی ارسال دستهای که یک شناسه کار میپذیرند و یک وضعیت برمیگردانند، افعال مدیریتی که برای یک کار زمانبندیشده در نظر گرفته شده بودند اما از یک حساب سرویس قابل دسترسی هستند، نقاط پایانی «داخلی» که در همان بخش شبکه حل میشوند و احراز هویت ندارند چون بخش مورد اعتماد فرض شده بود. عامل نیازی به زیرکی ندارد. نیاز به پایداری دارد و پایداری برایش ارزان است.
قاعده طراحی: محدودسازی قابلیتها در مرز پروتکل
کنترلی که این را برطرف میکند یک پیرامون بهتر نیست. یک مرز قابلیت در مقابل لایه قدیمی است که در پروتکلی که عامل واقعاً با آن صحبت میکند بیان میشود. سه قاعده آن را مشخص میکند.
افعالی را که یک عامل بهطور مشروع نیاز دارد شمارش کنید، نه افعالی که نقطه پایانی پشتیبانی میکند. یک نقطه پایانی قدیمی ممکن است خواندن، نوشتن، حذف و مجموعهای از عملیات مدیریتی را پشتیبانی کند. عاملی که رکوردها را خلاصه میکند به خواندن روی یک زیرمجموعه تعریفشده نیاز دارد. لیست مجاز از وظیفه مشتق میشود، نه از سطح نقطه پایانی. هر چیزی که در لیست نیست قابل دسترسی نیست، حتی اگر سرویس زیرین آن را بپذیرد.
هر فعل را به یک نرخ و یک شعاع اثر متصل کنید، نه فقط به یک هویت. کنترل دسترسی مبتنی بر هویت به «چه کسی فراخوانی میکند» پاسخ میدهد. به «چند بار» یا «در چه دامنهای» پاسخ نمیدهد. یک فعل خواندن محدود به یک رکورد، قابلیت متفاوتی از یک فعل خواندن محدود به اسکن جدول است، حتی اگر هر دو خواندن باشند. مرز باید هر دو را حمل کند: حداکثر نرخ فراخوانی برای هر فعل، و حداکثر مجموعه نتیجه یا تعداد رکورد تأثیرپذیر برای هر فراخوانی. وقتی عامل از هر یک فراتر رود، فراخوانی رد میشود نه اینکه بیصدا محدود شود، چون محدودسازی بیصدا یک نقض قابلیت را به یک مهلت زمانی تبدیل میکند که عامل دوباره تلاش خواهد کرد.
نقاط پایانی مستندنشده را برای عاملها غیرموجود در نظر بگیرید حتی وقتی حل میشوند. داراییهای قدیمی شامل نقاط پایانی هستند که قابل دسترسی اما فهرستنشدهاند. برای یک اپراتور انسانی، یک نقطه پایانی مستندنشده عملاً نامرئی است. برای عاملی که شمارش میکند، یک کاندید است. مرز باید از مسیریابی به نقاط پایانی که در مانیفست قابلیت عامل نیستند خودداری کند، صرفنظر از اینکه شبکه درخواست را تحویل میدهد یا نه. این تفاوت بین «عامل نمیتواند به آن برسد» و «عامل مجاز به رسیدن به آن نیست» است؛ دومی در برابر تغییرات شبکه دوام میآورد.
یک مانیفست حداقلی شکل را روشن میکند:
agent_capabilities:
- verb: read_record
endpoint: /legacy/lookup
max_rate: 5/s
max_scope: 1 record
- verb: submit_job
endpoint: /legacy/batch
m

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