docs/adr/0011-sandboxing-and-credential-proxy.mdXem bản gốc Bản dịch đầy đủ theo đúng cấu trúc tài liệu; code, liên kết và định danh kỹ thuật được giữ nguyên.
0011. Sandboxing + Credential Proxy — ba người thực thi đằng sau một đường nối chạy, một mitmproxy headless cho thông tin xác thực công cụ
Trạng thái: Được chấp nhận — §2 (hình dạng vỏ cố định docker), §3 (hình dạng vết xước trống theo phương thức) và
mỗi chế độ bash mô tả được thay thế bởi ADR-0012; §1 (đường may +
bảo vệ), §5 (an toàn phát lại), §6 (Proxy thông tin xác thực) và §7 (thang cách ly) vẫn có hiệu lực.
Ngày: 2026-07-02
Đã sửa đổi: 2026-07-13 — §6 (Proxy thông tin xác thực) được thay thế bởi ADR-0016
và mã của nó đã bị xóa; SANDBOX_GIT_TOKEN hiện được đưa trực tiếp vào Worker env trong phần phụ trợ cả hai.
§1, §5, §7 và chân bàn cách ly. Phần nội dung bên dưới không được chỉnh sửa - đó là bản ghi lại những gì đã được
quyết định vào ngày 2026-07-02 và thiết kế ADR-0016 đã ngừng hoạt động.
Bối cảnh
decode chạy các lệnh shell được chọn theo mô hình thông qua bash công cụ mà hôm nay sẽ gửi tới một
LocalExecutor - một máy chủ asyncio quy trình con - đằng sau CommandExecutor Giao thức trong
tools/exec.py. Giao thức đó được thiết kế ngay từ ngày đầu tiên dưới dạng sự trừu tượng thực sự (ADR-0002
§7,10, agent.md): async run(command, *, cwd, timeout_s) -> ExecResult, thuyết bất khả tri, với
bash.py giữ cấp độ mô-đun _EXECUTOR. ADR-0002 đã trì hoãn rõ ràng việc đóng hộp cát
triển khai cho "M8". Đây là M8.
Hai lực lượng nữa hội tụ ở đây. ADR-0008 §5 + "Công việc trong tương lai - Proxy thông tin xác thực tại hộp cát
step" đã sửa thiết kế Proxy thông tin xác thực thực sự của Kitaru và trì hoãn nó vì lý do cấu trúc:
proxy nằm giữa một nhân viên bị cô lập và mạng, và cho đến nay việc decode không có sự cô lập nào
công nhân (bash chạy trong quá trình). ADR này là ADR thực hiện mà phần đó đã hứa. Và ADR-0010
đã cho decode run chuyện gì xảy ra nếu Phát lại có tính chính xác giả định các lượt được lưu trong bộ nhớ đệm là thuần túy — shell nào
tác dụng phụ không có, buộc phải có quyết định rõ ràng ở đây (Quyết định §5).
Các sự kiện được xác nhận trong khi xác định phạm vi (chuỗi công cụ đã cài đặt): docker Hiện tại CLI 29.4.3 (daemon không phải lúc nào cũng
chạy - người bảo vệ phải xử lý); cái docker SDK Python chỉ hiện diện tạm thời qua
zenml (không được dựa vào); modal 1.5.1 là một phụ thuộc runtime hạng nhất phơi bày
modal.Sandbox.create(app=…, image=…, timeout=…), sb.exec(...), Sandbox.terminatevà
App.lookup(name, create_if_missing=True); thiết kế kinh điển tồn tại trong kho kitaru
examples/end_to_end/agent_harness_platform @ 90f123f và hướng dẫn kitaru.ai "Giai đoạn 2 — Của bạn
các agent cần một hộp cát" (decode thích ứng những điều này; SandboxProxyRule / build_credential_map /
DockerCredentialProxy KHÔNG có trong kitaru gói). mitmproxy chạy bên trong vùng chứa của chính nó (chính thức
mitmproxy/mitmproxy image + một addon được gắn) - nó không phải là phần phụ thuộc decode.
Các ràng buộc của dự án được tôn trọng: cơ sở hạ tầng được nhập/gọi trực tiếp (không có cổng); sự tương tác
REPL không có kitaru; sandbox/ là mô-đun dành riêng cho người thực thi hộp cát; bí mật không bao giờ
tiếp cận mô hình hoặc tải trọng hộp cát (AGENTS.md). ADR này được chuẩn bị thành các nhiệm vụ 071–077
(tính năng sandboxing) và mở rộng ADR-0008 (nó không thay thế nó).
Quyết định
-
SANDBOX_MODE=none|docker|modal, mặc địnhnone, chọn người thi hành đằng sau hiện có đường may (nhiệm vụ 071/074). Trường cài đặt pydantic mới (được phản chiếu trong.env.example) chọnCommandExecutorbashcông dụng.none= hôm nayLocalExecutor- hành vi giống hệt byte cho mọi hiện có.envvà kiểm tra. Nghị định thư trongtools/exec.pykhông thay đổi (run-chỉ);LocalExecutorvẫn ở đó làm mặc định không có hộp cát. Hai hộp cát thực sự sống trong một cái mớisrc/decode/sandbox/gói (docker_executor.py,modal_executor.py) và được chọn bởi lười biếng đường may trongbash.py(_get_executor()→decode.sandbox.select_executor(mode)), vậynonechế độ không nhập mã docker/modal sandbox. Một stderr một dòng thân thiện bảo vệ khởi động ( nhiệm vụ-004GEMINI_API_KEYmẫu) kích hoạt — trong cả chuỗi khởi động REPL và chuỗi headlessdecode run/replaypreflight - khi phần phụ trợ đã chọn không khả dụng (docker daemon không thể truy cập/không có thông tin xác thực theo phương thức): thoát khác 0, không bao giờ truy nguyên. Sự hiện diện, không tính chính xác (khớp với các bộ bảo vệ khóa của nhà cung cấp). Chế độ này được đọc một lần khi khởi động và được sửa trong phiên — "Nó chạy ở đâu?" trong sơ đồ kiến trúc? kim cương được trả lời bởi cấu hình, không phải định tuyến theo lệnh (giải pháp thay thế gửi theo lệnh đã được cung cấp và từ chối việc chải chuốt). -
Chế độ Docker = MỘT vùng chứa liên tục phiên chạy shell liên tục (tác vụ 072). Lazily
docker run -d --rm -v <cwd>/.decode/sandbox:/workspace -w /workspace <image> sleep infinitytrên cái đầu tiênbashgọi (đã sửa đổi sau khi xem xét - xem dấu đầu dòng sai lệch bên dưới; ban đầu là toàn bộ<cwd>đã được gắn); mọi lệnh sau đều chạy qua ** mộtdocker exec -i tồn tại lâu dài <id> đánh đập --noprofile --norc** có stdin mà chúng tôi viết từng lệnh vào, đọc thiết bị xuất chuẩn lên đến một giá trị duy nhất mang dòng đánh dấu cuối$?. Vì vậycd/export/pip install/ công việc nền kiên trì trên các lệnh gọi bash trong một phiên — hình dạng DockerSandbox chuẩn và lý do mỗi cuộc gọidocker exec sh -cđã bị từ chối (nó vẫn tồn tại trong hệ thống tập tin nhưng khôngcd/export). Các công cụ tập tin luôn ở phía máy chủ trên cây thật. Bị rách khi thoát decode (--rmlà vụ tai nạn chặn lại). Sự cô lập = quá trình + mọi thứ bên ngoài.decode/sandboxgãi (cộng với một gắn kết kỹ năng chỉ đọc); cây repo không có thể truy cập được từ bash hộp cát. Việc truy cập được thực hiện thông qua ** docker CLI tiêu chuẩn **, được trình bày bằngasyncioquy trình con (xem Giải pháp thay thế) - không phụ thuộc và lợi ích giảng dạy.- Hợp đồng hết thời gian chờ vẫn tồn tại trong lớp vỏ liên tục. Khi hết thời gian chờ,
ExecResulthợp đồng (timed_out=True, đầu ra một phần, không có quá trình mồ côi) vẫn được giữ thông qua tính trung thực đơn giản nhất quy tắc: hủy và khởi động lại shell (đặt lại trạng thái shell - cwd quay lại/workspace, env đã xóa) và nói như vậy trong câu trả lời hướng về mô hình (anotetrênExecResult, được thêm vào bởibash._render).ponytail:trần nhà — decode không thể phẫu thuật tiêu diệt một lệnh treo bên trong vùng chứa trong khi bảo quản phiên; một PID/cgroup theo lệnh +docker exec … killlà đường dẫn nâng cấp. - Sai lệch được ghi lại so với phiên bản chuẩn — đã được thay thế (đã sửa đổi sau khi xem xét). Giai đoạn chuẩn 2
ví dụ gắn kết một tập đĩa có tên trống (
workspace_<execution_id>) tại/workspace- không có máy chủ cây. decode-docker ban đầu liên kết gắn toàn bộ cwd ("một cây dùng chung với tệp máy chủ tools"); quá trình xem xét sau này đã bị đảo ngược:/workspacehiện được hỗ trợ bởi dự án.decode/sandbox/cào (được tạo trong lần sử dụng đầu tiên, hiển thị trên máy chủ và liên tục), cộng thêm một chỉ đọc.decode/skillsgắn kết tại/workspace/.decode/skills(chỉ những kỹ năng tương tự khắc ra như gieo hạt của phương thức). Bash do mô hình chọn không còn có thể đọc hoặc ghi repo nữa — repo quyền truy cập vẫn được duy trì bằng các công cụ tệp phía máy chủ; mã hộp cát đến quagit clone/ thế hệ, giống như phương thức. Điều này hội tụ chế độ docker trên hình dạng vết xước chuẩn trong khi vẫn giữ vết xước có thể kiểm tra trên máy chủ.
- Hợp đồng hết thời gian chờ vẫn tồn tại trong lớp vỏ liên tục. Khi hết thời gian chờ,
-
Chế độ phương thức = MỘT điều khiển từ xa liên tục trong phiên
modal.Sandbox, vết xước trống (nhiệm vụ 073). Tương tự hợp đồng vòng đời với tư cách là Docker (lười biếngSandbox.createthông quaApp.lookup(name, create_if_missing=Đúng), reuse,chấm dứton exit) but starting EMPTY at/không gian làm việcvới không đồng bộ hóa cây cục bộ — SDK phương thức được nhập trực tiếp (đã là phần phụ thuộc). Mỗi lệnh là một tươisb.exec(...)(thay đổi hệ thống tập tin -git clone,pip install— duy trì qua các cuộc gọi trên hộp cát fs; vỏcwd/env reset mỗi cuộc gọi, nhưnonechế độ). Khi hết thời gian thực thi bị chấm dứt, hộp cát vẫn tồn tại. Bởi vì cây địa phương không có,bashcông cụ mô tả cho biết mô hình rõ ràng nó chạy trong một sandbox từ xa (git clone/fetch/generate để làm việc với mã) — mô tả dành riêng cho chế độ (nhiệm vụ 074) chính xác là lý do tại sao điều này không thể gây ngạc nhiên cho mô hình. -
Lựa chọn người thực thi + chế độ cụ thể
bashmô tả (nhiệm vụ 074).bash.pygiữ bộ nhớ đệm_EXECUTORđường may (có thể vá/đặt lại để kiểm tra); trong lần sử dụng đầu tiên, nó sẽ chọn theoSANDBOX_MODEvới nhập khẩu lười biếng. cácbashcông cụ mô tả thích ứng với từng chế độ thông qua công cụ hiện cóprepare=gọi lại (đột biếnToolDefinition.description):nonevẫn giống hệt byte (không thay đổi);dockernêu rõ ngữ nghĩa shell liên tục trực tiếp + trạng thái hết thời gian chờ;modalnêu rõ thực tế từ xa / không có cây cục bộ. Người thi hành teardown (gặt container/hộp cát) nối dây vào cáirun_appđường dẫn thoát bên cạnh tắt LSP + ghi lại bộ nhớ (tui/app.py) và hoàn thành luồng headless — nỗ lực tốt nhất, với--rm/modal-timeoutnhư sự cố dừng lại. các cổng cấp phép không thay đổi — hộp cát được bảo vệ chuyên sâu trong cùng một quy trình phê duyệt; "tự động cho phép bash hộp cát" được đặt tên là tác phẩm trong tương lai. -
An toàn khi phát lại không cần đầu cho bash sandbox (nhiệm vụ 075) — phù hợp với ADR-0010. ADR-0010's Replay phục vụ mọi thứ ngược dòng của neo từ cache; một bộ nhớ đệm
bashrẽ sẽ không chạy lại các tác dụng phụ shell của nó khi phát lại (cảnh báo rõ ràng của bài viết). Sự hướng dẫn riêng của Kitaru đối với các công cụ lệnh sandbox làcheckpoint_strategy="calls"(đã decode mặc định, nhiệm vụ 068) +tool_checkpoint_config_by_name={<bash>: {"cache": False}}vì vậy thay vào đó hãy phát lại thực thi lại bash phục vụ một kết quả cũ, không có tác dụng phụ. Vì vậy, trong luồng bypass, khiSANDBOX_MODE != none,_build_runtime_agentcấu hìnhbashđiểm kiểm tra để thực thi lại thay vì bộ đệm. (HITL luồng đã được chọnbashhoàn toàn nằm ngoài trạm kiểm soát của nó - một người phục vụ - vì vậy nó vẫn thực thi lại; vàdecode replaychỉ là bỏ qua.) Hình dạng giá trị chính xác ({"cache": False}vs trần trụiFalse, sẽ bỏ điểm kiểm tra và mất khả năng sẵn sàng phát lại) được xác minh dựa trên cài đặt kitaru 0.18 SDK trước khi vận chuyển. Đánh đổi, được ghi lại: các lệnh có tác dụng phụ chạy lại khi phát lại (đúng) thay vì được lưu vào bộ nhớ đệm (nhanh nhưng cũ). -
Proxy thông tin xác thực — chỉ không có đầu, chỉ docker, chuẩn (nhiệm vụ 075). Được xây dựng chính xác ADR-0008 ba phần của §5, trong
src/decode/sandbox/proxy.py:SandboxProxyRule(mẫu tiêu đề trên mỗi máy chủ),build_credential_map(rules)(phía máy chủ{{ name.key }}→ giá trị thông quakitaru.get_secret(name).values→{host:{header:value}}) và mộtDockerCredentialProxycấu trúc liên kết - mộtmitmproxy/mitmproxythùng chứa tiện ích bổ sung trên mạng docker dùng chung, nhân viên đã chỉ vào nó thông quahttp_proxy/https_proxyvà tin tưởng nó CA. Bản đồ đã giải quyết chỉ được trao cho env của bộ chứa proxy, không bao giờ được chuyển đến env của công nhân. Đã đính hôn chỉ từ dòng chảy headless (a_sandbox_proxy()quản lý bối cảnh trongruntime/flow.py, phản chiếu_durable_sleeper/_config_from_secret_store) khisandbox_mode == "docker"vàsandbox_credential_proxy_enabled; REPL không bao giờ xây dựng nó, vì vậy trầndecodekhông bao giờ nhập khẩu kitaru (bất biến không bị ảnh hưởng).DEFAULT_PROXY_RULEStàu trống (chọn tham gia; bản đồ trống = a proxy thông qua). Đi ra là ** hợp tác ** (http_proxy/https_proxy+ CA đáng tin cậy) —ponytail:không phải là rào cản thoát nước; khóa mạng nội bộ là đường dẫn nâng cấp. các yêu cầu thông tin xác thực (công nhân không bao giờ giữ token) vẫn được giữ bất kể.Sửa đổi (13-07-2026 — các quy tắc proxy được giải quyết từ
Settings, khôngkitaru.get_secret){{ name.key }}biểu mẫu vàkitaru.get_secret(name).valuestra cứu được mô tả ở trên là đã xóa (ADR-0015 §6). Một mẫu bây giờ đặt tên cho mộtSettingstrường ({"Authorization": "Bearer {{ sandbox_git_token }}"}) vàbuild_credential_map()là một chức năng tinh khiết của ngậm nướcsettingsđối tượng - không nhập kitaru, không có mạng. Ở một nơi xa xôiDECODE_ENVgiá trị của trường đó đã đạt đếnSettingsthông qua Nhóm môi trường, vì vậy chỉ có kitaruget_secretđường nối trong cơ sở mã là nguồn cài đặt đó. Mọi thứ khác trong §6 là viết tắt: the cấu trúc liên kết vùng chứa, bản đồ chỉ được trao cho vùng chứa proxy, token công nhân không bao giờ giữ xác nhận quyền sở hữu, tùy chọn tham gia trống theo mặc định và cảnh báo trước khi hợp tác thoát ra. Bất biến an toàn REPL là được trình bày lại bởi ADR-0015 §5: tạiDECODE_ENV=local(mặc định), decode không bao giờ nhập kitaru.- Worker CA Trust — stock image + CA-mount (nhiệm vụ 075).
SANDBOX_IMAGEmặc định cho một cổ phiếughcr.io/astral-sh/uv:python3.12-bookworm-slim(có chứng chỉ ca, chạy bằng root), vì vậy trường hợp không có proxy không cần tùy chỉnh hình ảnh. Đối với đường dẫn proxy, nhân viên phải tin cậy CA mitmproxy: decode ** gắn kết proxy tạo CA vào công nhân và chạyupdate-ca-certificateslúc bắt đầu container** (chứ không phải vận chuyển một kho hàng trong nướcsandbox.Dockerfile). Thăm dò tích hợp gửi đi sử dụng python/urllib, không cong (mỏng không cong). Cặp được coi là được ghi lại trong Giải pháp thay thế.
- Worker CA Trust — stock image + CA-mount (nhiệm vụ 075).
-
Tính trung thực về cách ly + so sánh phụ trợ. Docker là hộp cát hướng dẫn — một hệ thống tập tin và ranh giới không gian tên cho hành vi sai trái ngẫu nhiên, không phải là ranh giới mã thù địch đầy đủ (kernel được chia sẻ trên Linux; trên macOS Docker Desktop's VM thêm ranh giới miễn phí). decode tàu rung 1 (Docker, máy tính xách tay) và thanh được lưu trữ (Modal, từ xa) đằng sau một đường nối; phần còn lại của sự cô lập phổ được so sánh trong bảng bên dưới và là bản decode nâng cấp cấu hình daemon miễn phí kế thừa đối với mã 0, người thực thi trong tương lai đằng sau cùng một đường nối hoặc tài liệu không phù hợp.
So sánh các chương trình phụ trợ cách ly - tại sao Docker + Modal
| Phần cuối | Ranh giới cách ly | Nền tảng tiếp cận (máy tính xách tay của sinh viên) | Chi phí tích hợp để decode | Khi nào thì có lý (trung thực) | Bản án (M8) |
|---|---|---|---|---|---|
none / LocalExecutor | không có (quy trình con máy chủ, được ghim cwd) | macOS / Windows / Linux | đã vận chuyển (đường cơ sở) | Nhà phát triển máy chủ đáng tin cậy + độ kín CI; mặc định nhanh | ** GIỮ làm mặc định ** |
| Docker (CHOSEN — địa phương) | vùng chứa: không gian tên + cgroups + fs; hạt nhân dùng chung (Linux); Ranh giới máy ảo Docker Desktop (macOS/Win) | macOS / Windows / Linux — một đường dẫn cài đặt | một người thực thi đằng sau đường nối (docker CLI, không phụ thuộc) | Máy tính xách tay của sinh viên: có hành vi sai trái vô tình; hình dạng chuẩn + mạng vùng chứa mà Proxy thông tin xác thực cần | TÀU (bậc 1) |
| Hộp cát được lưu trữ theo phương thức (CHOSEN — từ xa) | microVM từ xa; không có gì chạy trên máy của bạn (Modal chạy gVisor bên dưới) | macOS / Windows / Linux (từ xa) | một người thực thi đằng sau đường nối (SDK phương thức, đã là dep) | Mã thực sự không đáng tin cậy; "không có gì trên máy của tôi"; mục tiêu triển khai M12 | SHIP (được lưu trữ ở bậc thang) |
| dây an toàn (macOS) / bọc bong bóng (Linux) | tù hệ điều hành theo lệnh (sandbox-exec/không gian tên người dùng) | chỉ macOS hoặc Linux; không có gì cho Windows | hai người thực thi trên mỗi hệ điều hành; không có mạng container (phá vỡ cấu trúc liên kết proxy) | Máy chủ một hệ điều hành, tạm giam theo lệnh mà không mất phí daemon/hình ảnh, không cần proxy (phương pháp mã claude) | Đã xem xét, bị từ chối (2 chương trình phụ trợ, không có Windows, không có mạng proxy) |
| gVisor | hạt nhân không gian người dùng (runsc) chặn các cuộc gọi chung; mạnh mẽ trên kernel chia sẻ | Chỉ Linux | Mã decode KHÔNG — daemon --runtime=runsc (được kế thừa qua docker CLI) | Máy chủ Linux / tăng cường nhiều bên thuê phía máy chủ | Đường dẫn nâng cấp miễn phí (tài liệu, không có nhiệm vụ) |
| Hộp đựng Kata | trọng lượng nhẹ trên mỗi container VM (KVM) | Chỉ Linux (KVM) | Mã decode KHÔNG — daemon --runtime=kata (được kế thừa qua docker CLI) | Nhiều người thuê Linux muốn cách ly cấp VM với UX vùng chứa | Đường dẫn nâng cấp miễn phí (tài liệu, không có nhiệm vụ) |
| MicroVM pháo | KVM microVM tối thiểu (kernel + rootfs + TAP) | Chỉ Linux + KVM | hệ thống ống nước hoàn toàn mới; không có đường dẫn docker-CLI (FC thô; Kata-with-FC là tuyến gián tiếp) | Nhiều đối tượng thuê Linux/KVM ở quy mô, thường thông qua một nền tảng (E2B / Lambda), không phải thô | Không có mục tiêu (máy chủ macOS; không có đường dẫn CLI) |
| Được lưu trữ trên máy chủ khác (E2B, Daytona) | container/microVM từ xa (nhà cung cấp) | macOS / Windows / Linux (từ xa) | một người thực thi mới đằng sau đường nối (như Modal) | Tương tự như Modal; tùy chọn lưu trữ thứ hai nếu muốn | Người thực thi tương lai đằng sau đường may |
| WebAssembly (Wasm) | VM có khả năng đóng hộp cát; không có thẩm quyền xung quanh | macOS / Windows / Linux (runtime bị hạn chế) | runtime mới + mô hình thực thi không bash | Khối lượng công việc bị hạn chế, không bash, có phạm vi khả năng | Không phù hợp — công cụ decode là bash tùy ý |
Tại sao lại là Docker + Modal, một cách rõ ràng. (a) Tính di động / lý lẽ mang tính giáo dục — chúng là
chỉ ghép nối với một đường dẫn cài đặt trên các máy sinh viên macOS, Windows và Linux; mỗi hệ điều hành
tù (dây an toàn/bwrap) và các bậc thang chỉ dành cho Linux (gVisor/Kata/Firecracker) không thể là cơ sở a
khóa học tàu. (b) Mỗi đường dẫn một mã đằng sau đường dẫn hiện có CommandExecutor đường may - không có gì mới
trừu tượng. (c) Docker là chuẩn agent_harness_platform hình dạng và cung cấp
cấu trúc liên kết mạng container mà Proxy thông tin xác thực yêu cầu (tù máy chủ theo lệnh thì không).
(d) Modal là bậc được lưu trữ trên máy chủ của bài viết — "không có gì thực thi trên máy của chính bạn" — đã là một
phụ thuộc và mục tiêu triển khai M12. (e) Phân chia mô hình mối đe dọa: Docker chứa ngẫu nhiên
hành vi sai trái tại địa phương; mã thực sự không đáng tin cậy được trả lời bởi Modal (một bậc khác), không phải bởi một
nhà tù địa phương dày hơn. (f) Trên macOS, máy ảo của Docker Desktop bổ sung miễn phí ranh giới phần cứng; trên một
Máy chủ Linux phần thưởng đó biến mất — đó chính xác là khi các hàng gVisor/Kata trở thành
có liên quan và chúng có giá decode mã 0 vì DockerExecutor điều khiển docker CLI tiêu chuẩn
(một toán tử Linux đặt --runtime=runsc/--runtime=kata làm daemon mặc định và mọi decode
lệnh hộp cát kế thừa sự cô lập đó). Và khi decode chạy trên cơ sở hạ tầng của Modal, nền tảng
đã chạy gVisor bên dưới. Đây là phần thưởng trực tiếp của lựa chọn CLI-over-SDK (Lựa chọn thay thế).
Các lựa chọn thay thế được xem xét (trục phụ trợ không cách ly)
- kitaru
run_sandbox_command/ ngăn xếp các phiên bản sandbox — bị từ chối.zenml.sandboxes.LocalSandboxlà một quy trình con có sự cô lập không; một hương vị phương thức tồn tại nhưng ràng buộcbashđến một kitaru ngăn xếp và sẽ nhập kitaru trong REPL (phá vỡ giới hạn trần-decode-is-kitaru-bất biến miễn phí). decode giữ của riêng mìnhCommandExecutorđường may.kitaru.adapters.pydantic_ai.sandbox_command_toolsettương tự như vậy không được thông qua. - docker Python SDK so với docker CLI — đã chọn CLI.
dockerSDK chỉ hiện diện chuyển tiếp thông qua zenml; dựa vào dep chuyển tiếp là mong manh, vàuv add dockerthêm trọng lượng. Bắn phá tới tiêu chuẩndockerCLI quaasyncioquy trình con không phụ thuộc, phản chiếuLocalExecutorcủa phong cách, dạy các lệnh thực tế và — phần thưởng chiến lược — làm cho gVisor/Kata không mã nâng cấp daemon-config (§7). - Đồng bộ hóa cây cục bộ theo phương thức — bị từ chối. Hộp cát từ xa bắt đầu trống (
/workspacetrầy xước); không rsync/mount của cây cục bộ. Mô hình được thông báo rõ ràng (mô tả chế độ cụ thể) và hoạt động với mã thông qua git/fetch/generate. Vết xước từ xa trống là hình dạng chuẩn. Đã sửa đổi (đánh giá sau): một đường cắt hẹp — của dự án.decode/skills/được gieo hạt tại/workspace/.decode/skillsquaImage.add_local_dir(copy=False)vì vậy kỹ năng tập lệnh có thể chạy được từ xa; phiên/BỘ NHỚ/nhật ký hãy vắng mặt (các.gitignoreranh giới) và cây vẫn không bao giờ được đồng bộ hóa. Hai gợn sóng phía REPL đã hạ cánh cùng với nó: hộp cát bây giờ bắt đầu háo hức khi khởi chạy (một dòng tiến trình + mộtsandbox:<mode>đoạn biểu ngữ - hiển thị trongdocker pstrước bất kỳbash) thay vì vô hình ở giữa lượt đầu tiên và một hộp cát phương thức tồn tại lâu hơntimeout(tối đa thời gian) giữa phiên được thay thế một cách minh bạch vào ngày tiếp theobash, kết quảnotebáo cho mô hình biết hệ thống tập tin của nó đã được thiết lập lại. - token proxy kép của modal làm đường dẫn thông tin xác thực — nằm ngoài phạm vi ở đây.
MODAL_PROXY_TOKEN_*là một bề mặt tiêu đề yêu cầu (hình dạng tương tự mà proxy này đưa vào); ADR-0008 §5 cố tình rời đimodaltắt đường dẫn khóa mô hình vì lý do này. Không thay đổi. - hình ảnh chứng khoán + CA-mount so với in-repo
sandbox.Dockerfile— đã chọn stock + CA-mount. Bản chuẩn ví dụ gửi hình ảnh nhỏ của riêng nó một phần cho CA Trust + Curl. decode giữSANDBOX_IMAGEmột cổ phiếughcr.io/astral-sh/uv:python3.12-bookworm-slimvà chỉ trên đường dẫn proxy, gắn kết mitmproxy CA + chạyupdate-ca-certificateskhi bắt đầu container (worker là root; slim có chứng chỉ ca). Tích hợp thăm dò sử dụng python/urllib (không có đường cong mỏng). Dockerfile trong repo vẫn giữ lối thoát nếu gắn kết Cách tiếp cận tỏ ra dễ vỡ. Đã sửa đổi (xem xét sau): mặc định được chuyển từpython:3.12-slimđể của thiên vănuvbiến thể của cùng một đế mỏng — python 3.12 +uvđược cài đặt sẵn - vì vậy CẢ HAI hộp cát đến được cấu hình sẵn để chạy python thông quauv(tải trọng kỹ năng hướng dẫnchạy uv .decode/kỹ năng/<name>/scripts/…bên trong hộp cát); vẫn là một hình ảnh công khai (docker kéo nó, phương thứcfrom_registrys it), phương án thay thế bị từ chối: một phiênpip install uvkhởi động (giây về độ trễ trong mỗi lần khởi chạy, trên mỗi chương trình phụ trợ). - Tự động cho phép bash hộp cát — công việc trong tương lai. Hộp cát có tính phòng thủ chuyên sâu bên dưới không thay đổi cổng cấp phép; coi "trong hộp cát" là phê duyệt tự động bị trì hoãn.
- Khóa lối ra cứng — công việc trong tương lai. Hợp tác xã
http_proxy/CA là mức trần vận chuyển (ponytail:); mạng chỉ dành cho nội bộ với đầu ra từ chối mặc định là đường dẫn nâng cấp. - ảnh chụp nhanh git-shadow kiểu mã mở — không có mục tiêu.
Sơ đồ
flowchart TB
subgraph repl["INTERACTIVE REPL (bare decode — never imports kitaru)"]
rbash["bash tool (gated) · mode-specific description (074)"]
end
subgraph headless["HEADLESS decode run / replay (imports kitaru lazily)"]
flow["@flow run_agent_task (BYPASS)<br/>sandbox bash checkpoint: cache=False (075)"]
hbash["bash tool (inline under BYPASS)"]
flow --> hbash
end
seam{{"run seam — tools/exec.py CommandExecutor<br/>bash.py _get_executor() · select_executor(SANDBOX_MODE)"}}
rbash --> seam
hbash --> seam
local["LocalExecutor (none) — host subprocess<br/>the DEFAULT · byte-identical to today"]
docker["DockerExecutor (docker) — sandbox/docker_executor.py<br/>1 container · persistent bash shell · marker+$? protocol<br/>bind-mount .decode/sandbox→/workspace (+skills ro) · timeout=kill+restart shell"]
modal["ModalExecutor (modal) — sandbox/modal_executor.py<br/>1 remote modal.Sandbox · EMPTY /workspace scratch<br/>sb.exec per call · NO local tree"]
seam --> local
seam --> docker
seam --> modal
subgraph proxy["CREDENTIAL PROXY — headless + docker ONLY (075)"]
rules["DEFAULT_PROXY_RULES (empty by default)<br/>SandboxProxyRule(host → header template)"]
cmap["build_credential_map()<br/>{{ name.key }} → value via kitaru.get_secret()<br/>HOST-SIDE, at flow start"]
worker["WORKER container (docker)<br/>http_proxy/https_proxy → proxy · trusts proxy CA<br/>*** HOLDS NO SECRET ***"]
mitm["mitmproxy addon container<br/>gets the credential map in ITS env<br/>injects header AFTER request leaves worker"]
rules --> cmap --> mitm
worker -->|"GET api.github.com (no token)"| mitm -->|"+ Authorization header"| net([internet])
end
docker -. proxy path only .-> worker
classDef replc fill:#1565c0,stroke:#0d47a1,color:#ffffff;
classDef headc fill:#00838f,stroke:#005662,color:#ffffff;
classDef seamc fill:#37474f,stroke:#102027,color:#ffffff;
classDef exec fill:#2e7d32,stroke:#1b5e20,color:#ffffff;
classDef sec fill:#e65100,stroke:#bf360c,color:#ffffff;
classDef ext fill:#6a1b9a,stroke:#38006b,color:#ffffff;
class rbash replc;
class flow,hbash headc;
class seam seamc;
class local,docker,modal exec;
class rules,cmap,worker,mitm sec;
class net ext;
hậu quả
- Sự trừu tượng duy nhất mang lại kết quả chính xác như thiết kế. Hai người thực thi mới + một vùng đất ủy quyền đằng sau
ADR-0002
runđường may có không thay đổi thànhbashlogic của và byte giống hệtnone-chế độ hành vi - mặc định. Đường may kiếm được tiền bằng cách lưu trữ ba lần triển khai. - Docker Persistent-Shell chuyển hướng từ
none/modalngữ nghĩa - hiển thị, không ẩn.cd/envtồn tại trong docker nhưng không tồn tại trongnone/modal; chế độ cụ thểbashmô tả là những gì giữ cho mô hình đúng. Thời gian chờ của docker sẽ đặt lại phiên (được nêu trong thư trả lời); trần nhà được ghi lại. - Phát lại vẫn trung thực dù có tác dụng phụ. Sandbox
bashthực hiện lại khi phát lại (Quyết định §5) thay vì hơn là phục vụ một lượt được lưu trong bộ nhớ đệm cũ — giá đang chạy lại các lệnh có tác dụng phụ, chính xác cân bằng với mô hình ngược dòng bộ đệm của ADR-0010. - Xác nhận quyền sở hữu thông tin xác thực là có thật và có thể kiểm chứng được. Nhân viên không có token; bản đồ đã giải quyết chỉ tồn tại trong vùng chứa proxy; nhật ký mang quy tắc/máy chủ/tiêu đề tên, không bao giờ có giá trị - giống nhau kỷ luật tên không phải giá trị như nhiệm vụ 061, có thể chứng minh bằng cách quét nhật ký env + của nhân viên.
- Cách ly trung thực, có thang tài liệu. Docker chứa các tai nạn cục bộ; Modal là rung mã không đáng tin cậy; gVisor/Kata là các bản decode nâng cấp daemon-config miễn phí thông qua docker CLI; Firecracker/Wasm không phải là mục tiêu/không phù hợp — tất cả nằm trong một bảng so sánh để người đọc không bị nhầm lẫn.
- CI vẫn ngoại tuyến. Capstone luôn chạy chứng minh người thực thi hợp đồng + lựa chọn +
mô tả chế độ bằng giả/
LocalExecutorgấp đôi; các bài kiểm tra docker/modal/proxy thực sự làskipifbảo vệ như vậymake cicó màu xanh lục không có tia hồng ngoại (phản chiếu LSPty-bảo vệ và runtime cục bộ-stack các mẫu). Kín dướifilterwarnings=["error"]— người thực thi đóng vỏ/thùng chứa một cách xác định. - REPL không có kitaru. Proxy chỉ không có đầu;
import decode.clivẫn không bao giờ nhập khẩu kitaru. - Mở rộng, không thay thế, ADR-0008. Nó đáp ứng yêu cầu trì hoãn của ADR-0008 §5 "Công việc trong tương lai — Thông tin xác thực
Proxy" và tham chiếu chéo Bản phát lại của ADR-0010. Bảng thuật ngữ
Sandbox+Credential Proxyhàng là được cập nhật và nó đạt đượcSandbox Mode,Worker,Proxy Rule.