تصور کنید تمام اسرار فنی شما — از طرحهای نیمهتمام و خطاهای سیستمی (stack traces) گرفته تا ساختار مخازن داخلی، بحثهای مربوط به نیازمندیها که حاوی نام مشتریان است و رمزهای عبوری که برنامهنویس گمان میکرد پاک شدهاند — در پوشهٔ ~/.claude/projects/ ذخیره شده باشد. این متون و ترانسکریپتهای عاملهای هوش مصنوعی، اغلب بسیار حساستر از خودِ کدهای منبع هستند؛ زیرا در حالی که کدها تنها نتایج نهایی را ثبت میکنند، یک ترانسکریپت، تردیدها، گزینههای ردشده، سیاستهای داخلی تیم و اسامی خاصی که با صدای بلند بیان شدهاند را ثبت میکند.
basou در نسخهٔ ۰.۳۷.۰ که در ۴ اوت ۲۰۲۶ منتشر شد، با اتخاذ یک طراحی «صفر-شبکه» (Zero-Network) که از پذیرش مسئولیت نگهداری دادههای کاربر سر باز میزند، این مشکل را حل میکند. (لازم به ذکر است که نسخهٔ ۰.۳۸.۰ در ۲۸ اوت ۲۰۲۶ منتشر شد که فرمت رویدادهای وارداتی را بهروز کرد اما این تصمیمات طراحی را بدون تغییر باقی گذاشت.)
بیشتر ابزارهای ردیابی برای تجمیع لاگها به یک سرور مرکزی متکی هستند که این موضوع یک ریسک عملیاتی عظیم ایجاد میکند. این رویکرد متمرکز در ابزارهایی مانند Wallfacer برای یکپارچهسازی تاریخچهٔ عاملهای کدنویسی به کار گرفته شده است، اما basou مسیر متفاوتی را برگزیده است. پذیرش مسئولیت نگهداری دادهها به معنای دادن قولهایی دربارهٔ مدتزمان نگهداری، نحوه مدیریت درخواستهای حذف در نسخههای پشتیبان و نحوه مدیریت اطلاعرسانی دربارهٔ نشت دادهها برای کاربر و کارفرمای اوست. برای یک پروژهٔ متنباز تکنویسنده که هنوز در مراحل پیش از نسخه ۱.۰ است، ریسک مدیریت رمزهای عبور و لاگهای تحت قراردادهای محرمانه (NDA) بسیار بالا است. بر اساس سوابق طراحی منتشرشده در ۳۱ اوت ۲۰۲۶، basou این ریسک را با تضمین اینکه هیچ دادهای هرگز از ماشین محلی خارج نمیشود، حذف کرده است. این تصمیم صرفاً یک تعهد ایدئولوژیک به حریم خصوصی یا استدلالی مبنی بر اینکه «حالت محلی سریعتر است» نیست؛ بلکه پذیرش این واقعیت است که میزان مسئولیتی که نویسنده میتوانست در قبال نگهداری دادهها بپذیرد، صفر بود. حتی گزینههای میانی، مانند رمزنگاری سمت کاربر (Client-side Encryption) که در آن سرور فقط دادههای ناخوانا را نگه میدارد، همچنان مسائلی چون مدت نگهداری، حذف دادهها و حوزهٔ قضایی را حل نمیکردند.
مکانیزم «ادغام بهجای انتقال»
بزرگترین چالش برای هر ابزار محلی-محور، پشتیبانی از چندین میزبان (multi-host) است. برنامهنویسان معمولاً روی لپتاپ کد میزنند اما عاملهای هوش مصنوعی مانند Claude Code را روی یک باکس توسعه راه دور (remote dev box) از طریق Remote-SSH اجرا میکنند. در این ساختار، ترانسکریپتها فقط در سمت راه دور وجود دارند. اجرای دستور basou orient — دستوری که به شما میگوید در حال حاضر کجا هستید — روی لپتاپ، بهطور معمول تنها نیمی از داستان را نشان میدهد و تمام تصمیمات گرفته شده در باکس توسعه را نادیده میگیرد.
بهجای ساخت یک سرور همگامسازی — که دقیقاً همان مسیر آپلودی را ایجاد میکرد که این طراحی رد میکند — basou رابط کاربری را بازتعریف کرد. این ابزار «ردپای یک میزبان دیگر» را به عنوان یک مسیر محلی تعریف میکند. basou از یک فایل رجیستری در مسیر ~/.basou/hosts.yaml استفاده میکند که در آن کاربران مسیرهای محلی را برای آینههای (mirrors) دادههای راه دور خود تعریف میکنند.
ساختار نمونهٔ hosts.yaml:
version: 1
hosts:
- label: devbox
path: ~/mirrors/devbox/service-api
فرقی نمیکند این مسیرها از طریق SSHFS mounts، آینههای rsync یا اهداف Syncthing پر شده باشند؛ basou با آنها مانند دایرکتوریهای محلی رفتار میکند. این مسیرها باید مطلق باشند (اگرچه علامت ~ بسط داده میشود)؛ اگر یک مسیر نسبی ارائه شود، basou کل فایل hosts.yaml را نادیده گرفته و به حالت محلی-تنها ادامه میدهد و یک هشدار به stderr با کد خروجی ۰ چاپ میکند: basou: ignoring ~/.basou/hosts.yaml (Host paths must be absolute (or start with '~').); showing local sessions only.
- انتقال (Transport): توسط مسیرهای SSH موجود و تاییدشده توسط سازمان کاربر مدیریت میشود. پیادهسازی در
packages/cli/src/lib/hosts-config.tsصراحتاً بیان میکند که basou هیچ عملیات ورودی/خروجی (I/O) شبکهای برای این منظور انجام نمیدهد. - ادغام (Merge): توسط basou مدیریت میشود که لاگها را در یک ردپای واحد از جلسه تجمیع میکند. در CHANGELOG نسخهٔ ۰.۱۶.۰ (۲۳ ژوئن ۲۰۲۶) این موضوع چنین خلاصه شده است: «این ابزار مالک ادغام است، نه انتقال».
این طراحی به این معناست که basou منطق ترکیب دادهها را بر عهده دارد اما نه عمل جابهجایی آنها را. هنگام ادغام، ورودیها میزبان منشأ خود را حفظ میکنند (مثلاً @devbox) تا منشأ دادهها (provenance) حفظ شود. هزینهٔ این طراحی، از دست دادن تضمین تازگی دادههاست؛ ابزار نمیتواند بداند آیا یک آینه راه دور قدیمی است یا خیر، مگر اینکه کاربر دستور basou refresh را روی آن میزبان خاص اجرا کند. رابط کاربری این موضوع را با تغییر حکم از «ضبط فعلی است» به «ضبط روی این میزبان (محلی) فعلی است» منعکس میکند و یادداشتی اضافه میکند که کارهای انجام نشده در میزبانهای دیگر را نمیتوان بهصورت محلی ارزیابی کرد.
مرزهای شبکه و امنیت
برای حفظ ادعای صفر-شبکه، basou مجموعه سختگیرانهای از محدودیتها را در مورد سوکتها و ترافیک خروجی دنبال میکند. این ابزار تنها یک سوکت برای رابط کاربری وب محلی خود (basou view) باز میکند که یک سرور HTTP راه میاندازد. تعریف «صفر-شبکه» در اینجا این است که ابزار «هیچ مسیر خروجی ندارد»، حتی اگر یک شنونده لوپبک (loopback listener) باز کند.
برای جلوگیری از حملات DNS Rebinding — که در آن دامنه مهاجم به 127.0.0.1 اشاره میکند تا مرورگر را فریب دهد تا به سرور محلی دسترسی یابد — basou بررسیهای خاصی را در packages/cli/src/lib/view-server.ts پیادهسازی کرده است:
- آدرس Bind: سرور بهصورت پیشفرض روی
127.0.0.1تنظیم شده است (خط ۱۰۸). - بررسی Host Header: هر درخواست بررسی میشود (خطوط ۶۶۴-۶۶۷) تا اطمینان حاصل شود که هدر
hostدقیقاً127.0.0.1:${port}یاlocalhost:${port}باشد. - بررسی Origin: برای درخواستهای POST (خطوط ۶۶۹-۶۷۳)، هدر
originباید با سرور محلی مطابقت داشته باشد یا غایب باشد (برای اجازه دادن به کلاینتهای غیرمرورگری مانند curl).
بهجز این رابط محلی، ابزار هیچ مسیر خروجی ندارد. در بستهٔ نهایی تولیدی که شامل ۱۳ بسته است (۱۱ بسته شخص ثالث)، هیچ کلاینت HTTP گنجانده نشده است. اگرچه ابزار میتواند فرآیندهای فرزند را از طریق basou exec ایجاد کند، اما هر ترافیک شبکهای که در آنجا ایجاد شود، نتیجهٔ یک دستور ارائه شده توسط کاربر است، نه منطق داخلی ابزار.
تعویق و پذیرش محدود
همه نیازمندیهای مربوط به شبکه از طریق مسیر «ادغام بهجای انتقال» حل نشدند. برخی از آنها از طریق تعویق یا پذیرش محدود مدیریت شدند:
- تأیید راه دور: نیازمندی برای تأیید اقدامات عامل از طریق تلفن به تعویق افتاد. مشخصات فنی (
docs/spec/overview.md) طرح کلی (schema) رویدادهای تأیید را تثبیت میکند اما نقاط انتهایی راه دور را خارج از محدوده قرار میدهد. در حال حاضر، تنها حلکننده (resolver) موجودlocal-cliاست. رویداد درخواستکننده از نامclaude-code-adapterدر فیلد عمومی «این از کجا آمده است» استفاده میکند. نویسنده با تثبیت شکل دادهها در ابتدا، فشار مهاجرت برای حلکنندههای راه دور آینده را کاهش داد. - رابط محلی: همانطور که ذکر شد، شنونده لوپبک با این شرط پذیرفته شد که بدون احراز هویت و فقط روی localhost باقی بماند. مشخصات فنی (
docs/spec/cli-commands.md) به کاربران هشدار میدهد که پورت را پشت یک Reverse Proxy قرار ندهند، زیرا بررسیهای Host/Origin نمیتوانند جلوی کلاینتی را که مستقیماً سرور را فراخوانی میکند بگیرند.
تأیید ادعای صفر-شبکه
نویسنده یک مسیر حسابرسی شفاف برای کاربران فراهم کرده است تا این ادعاها را در نسخهٔ ۰.۳۷.۰ تأیید کنند.
۱. تست Sandbox در زمان اجرا
با استفاده از sandbox-exec در macOS با یک پروفایل deny-outbound ((deny network-outbound))، کاربران میتوانند تأیید کنند که دستورات basou orient ،refresh و view همگی بهطور عادی عمل میکنند در حالی که ترافیک خروجی مسدود است. برای اثبات فعال بودن مسدودسازی، نویسنده پیشنهاد میکند یک شنونده محلی روی پورت ۴۸۰۸۰ راه اندازی شود و تأیید گردد که اتصالی از داخل سندباکس خطای EPERM برمیگرداند، در حالی که اتصالی از خارج از آن موفق میشود. این تأیید میکند که فرآیندهای فرزند نیز مسدودسازی را به ارث میبرند، به این معنی که دستوری مانند basou exec curl ... نمیتواند از داخل سندباکس خارج شود.
۲. تحلیل استاتیک
تحلیل استاتیک باندل (bundle) بیشتر تأیید میکند که ابزارهای خروجی وجود ندارند. یک جستجوی grep برای ماژولهای شبکه Node.js (http, https, net, tls, dgram, dns) و fetch نشان میدهد که تنها تابع createServer از ماژول http استفاده شده است.
هنگام گسترش اسکن برای شامل شدن child_process چند مورد یافت میشود:
- simple-git: گیت را برای
rev-parse،statusوdiffاجرا میکند. هیچ عملیات نوشتاری (push/pull/clone) در باندل ارسالی استفاده نشده است، اگرچه مجموعه تستها از یک مخزن موقت محلی برای push استفاده میکنند. - commander: شامل قابلیت اجرای زیردستورهای قابل اجرا است، اگرچه basou از این قابلیت برای دسترسی به شبکه استفاده نمیکند.
- اجراهای مستقیم: ابزار از
which(برای مکانیابی دستورات)،open(برای URLهای محلی) وgit ls-files(که مستقیماً توسط بررسی پیشپروازbasou viewفراخوانی میشود) استفاده میکند.
نقاط نوشتاری basou
در حالی که خودِ ردپا در .basou/ در کنار کدها قرار دارد، CLI در چندین مکان دیگر نیز مینویسد. این یک اصل ثابت است که هیچ چیز به خارج از ماشین ارسال نمیشود، اما محدوده نوشتاری گستردهتر از دایرکتوری ردپا است:
.basou/: ذخیرهساز اصلی برای ردپا..gitignore: دستورbasou initخطوطی را اضافه میکند تا لاگهای خام از تاریخچه گیت دور بمانند.- تنظیمات عامل: دستورات
basou refreshوbasou run codexبلوک جهتدهی (orientation block) را در~/.codex/AGENTS.mdبهروز میکنند. دستورbasou protocol syncیک بلوک نشانگر در~/.claude/CLAUDE.mdمینویسد وbasou hook installیک Stop hook را در~/.claude/settings.jsonثبت میکند. هر کدام یک نسخه پشتیبان یکباره با پسوند<target>.basou-bakنگه میدارند. - سیمکشی مخزن: با فلگ
--applyژنراتورهای پروژه، فایل.gitignoreو لینکهای نمادین (symlinks) برایAGENTS.md،CLAUDE.mdو.github/copilot-instructions.mdرا در مخزن هدف مینویسند. اینها بهطور پیشفرض در حالت dry-run هستند. - Workspace View: بهطور پیشفرض به عنوان یک دایرکتوری همسطح در خارج از مخزن ایجاد میشود. فلگ
--pruneاین لینکهای نمادین را مستقل از--applyحذف میکند. - مسیرهای تعریف شده توسط کاربر: برای مثال،
basou report generate --out <path>.
بهطور قابل توجهی، basou هرگز در فایلهای پیکربندی خود در ~/.basou/ (مانند hosts.yaml ،portfolio.yaml یا protocols.yaml) نمینویسد؛ بلکه فقط آنها را میخواند. مشخصات فنی دقیق است: ردپای فضای کاری در .basou/ قرار دارد، در حالی که ادغامهای اختیاری ممکن است فایلهای سطح کاربر را در ~/.claude/ یا ~/.codex/ بنویسند.
هزینهٔ رویکرد محلیمحور
انتخاب معماری صفر-شبکه مستلزم چشمپوشی از چندین قابلیت متداول است. کاربران باید محدودیتهای زیر را بپذیرند:
۱. عدم وجود گواهی شخص ثالث (Third-Party Notarization): تشخیص دستکاری بر اساس سازگاری داخلی است. مدل تهدید فرض میکند کسی که میتواند دو فایل هماهنگ را بهطور سازگار بازنویسی کند، خارج از محدوده حفاظتی این ابزار است. این یک ابزار ابتدایی برای شناسایی تغییرات تصادفی است، نه یک اثبات رمزنگاری.
۲. عدم تازگی متمرکز: هیچ راهی وجود ندارد که بفهمیم آیا یک میزبان راه دور کاری را از دست داده است، بدون اینکه به آن میزبان مراجعه کرده و دستور import را اجرا کنیم.
۳. تخریب خاموش (Silent Degradation): اگر یک Mount راه دور (مانند SSHFS) قطع شود یا یک مسیر دارای غلط املایی باشد، orient بهطور بیصدا نتایج محلی-تنها را برمیگرداند. تنها نشانه، ناپدید شدن بنر > hosts: است. هشدار تنها زمانی ظاهر میشود که دایرکتوری وجود داشته باشد اما قابل خواندن نباشد، یا سینتکس پیکربندی خراب باشد.
۴. عدم اشتراک رابط کاربری: Viewer بدون احراز هویت و فقط روی localhost است؛ نمیتوان آن را از طریق یک URL به اشتراک گذاشت. این محدودیت در تضاد با رویکردهای مدرن اشتراکگذاری ابزارهای AI است که بر تحویل عاملمحور و دسترسیپذیری تأکید دارند.
۵. عدم تجمیع تیمی: این ابزار برای یک مالک واحد طراحی شده تا کارهای خود را بررسی کند. مشخصات فنی صراحتاً آمارهای کاری یا معیارهای بهرهوری هر عامل را از سطح بررسی side-by-side حذف میکند، اگرچه دستور جداگانهای برای اندازهگیری حجم خروجی وجود دارد.
این رویکرد مسئولیت عملیاتی را به کاربر بازمیگرداند. کاربر انتقال داده را مدیریت میکند، پورت محلی را ایمن میسازد و آینههای خود را نظارت میکند. برای basou، این تنها راه صادقانه برای مدیریت حساسترین فایلها در محیط یک برنامهنویس است.




گفتگو