Harness Academy
Tài liệu gốc 21 20 phútTiếng Việt + English
docs/adr/0011-sandboxing-and-credential-proxy.mdXem bản gốc
Ngôn ngữ bài đọc
Bản dịch tiếng Việt

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

  1. SANDBOX_MODE=none|docker|modal, mặc định none, 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ọn CommandExecutor bash công dụng. none = hôm nay LocalExecutor - hành vi giống hệt byte cho mọi hiện có .env và kiểm tra. Nghị định thư trong tools/exec.py không thay đổi (run-chỉ); LocalExecutor vẫ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ới src/decode/sandbox/ gói (docker_executor.py, modal_executor.py) và được chọn bởi lười biếng đường may trong bash.py (_get_executor() → decode.sandbox.select_executor(mode)), vậy none chế độ 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ụ-004 GEMINI_API_KEY mẫu) kích hoạt — trong cả chuỗi khởi động REPL và chuỗi headless decode run/replay preflight - 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).

  2. 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 infinity trên cái đầu tiên bash gọ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ột docker 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ậy cd / 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ọi docker exec sh -c đã bị từ chối (nó vẫn tồn tại trong hệ thống tập tin nhưng không cd/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 (--rm là vụ tai nạn chặn lại). Sự cô lập = quá trình + mọi thứ bên ngoài .decode/sandbox gã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ằng asyncio quy 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ờ, ExecResult hợ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 (a note trên ExecResult, được thêm vào bởi bash._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 … kill là đườ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: /workspace hiệ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/skills gắ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 qua git 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ủ.
  3. 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ếng Sandbox.create thông qua App.lookup(name, create_if_missing=Đúng), reuse, chấm dứt on exit) but starting EMPTY at /không gian làm việc vớ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ươi sb.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ư none chế độ). 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ó, bash cô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.

  4. Lựa chọn người thực thi + chế độ cụ thể bash mô tả (nhiệm vụ 074). bash.py giữ 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 theo SANDBOX_MODE với nhập khẩu lười biếng. các bash cô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ến ToolDefinition.description): none vẫn giống hệt byte (không thay đổi); docker nêu rõ ngữ nghĩa shell liên tục trực tiếp + trạng thái hết thời gian chờ; modal nê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ái run_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-timeout như 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.

  5. 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 bash rẽ 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, khi SANDBOX_MODE != none, _build_runtime_agent cấu hình bash điểm kiểm tra để thực thi lại thay vì bộ đệm. (HITL luồng đã được chọn bash hoà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 replay chỉ là bỏ qua.) Hình dạng giá trị chính xác ({"cache": False} vs trần trụi False, 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ũ).

  6. 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 qua kitaru.get_secret(name).values → {host:{header:value}}) và một DockerCredentialProxy cấu trúc liên kết - một mitmproxy/mitmproxy thù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 qua http_proxy/https_proxy và 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 trong runtime/flow.py, phản chiếu _durable_sleeper/_config_from_secret_store) khi sandbox_mode == "docker" và sandbox_credential_proxy_enabled; REPL không bao giờ xây dựng nó, vì vậy trần decode không bao giờ nhập khẩu kitaru (bất biến không bị ảnh hưởng). DEFAULT_PROXY_RULES tà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ông kitaru.get_secret) {{ name.key }} biểu mẫu và kitaru.get_secret(name).values tra 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ột Settings trườ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ước settings đối tượng - không nhập kitaru, không có mạng. Ở một nơi xa xôi DECODE_ENV giá trị của trường đó đã đạt đến Settings thông qua Nhóm môi trường, vì vậy chỉ có kitaru get_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ại DECODE_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_IMAGE mặc định cho một cổ phiếu ghcr.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ạy update-ca-certificates lúc bắt đầu container** (chứ không phải vận chuyển một kho hàng trong nước sandbox.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ế.
  7. 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ốiRanh giới cách lyNề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 để decodeKhi nào thì có lý (trung thực)Bản án (M8)
none / LocalExecutorkhô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 đặtmộ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ầnTÀ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 M12SHIP (đượ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 Windowshai 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)
gVisorhạ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ỉ LinuxMã 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 Katatrọ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áoKVM microVM tối thiểu (kernel + rootfs + TAP)Chỉ Linux + KVMhệ 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ốnNgườ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 quanhmacOS / Windows / Linux (runtime bị hạn chế)runtime mới + mô hình thực thi không bashKhối lượng công việc bị hạn chế, không bash, có phạm vi khả năngKhô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.LocalSandbox là 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ộc bash đế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ình CommandExecutor đường may. kitaru.adapters.pydantic_ai.sandbox_command_toolset tương tự như vậy không được thông qua.
  • docker Python SDK so với docker CLI — đã chọn CLI. docker SDK 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 docker thêm trọng lượng. Bắn phá tới tiêu chuẩn docker CLI qua asyncio quy trình con không phụ thuộc, phản chiếu LocalExecutorcủ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 (/workspace trầ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/skills qua Image.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 .gitignore ranh 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ột sandbox:<mode> đoạn biểu ngữ - hiển thị trong docker ps trướ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ơn timeout (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 theo bash, kết quả note bá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 đi modal tắ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_IMAGE một cổ phiếu ghcr.io/astral-sh/uv:python3.12-bookworm-slim và chỉ trên đường dẫn proxy, gắn kết mitmproxy CA + chạy update-ca-certificates khi 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ăn uv biế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 qua uv (tải trọng kỹ năng hướng dẫn chạ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ức from_registrys it), phương án thay thế bị từ chối: một phiên pip install uv khở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ành bashlogic của và byte giống hệt none-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/modal ngữ nghĩa - hiển thị, không ẩn. cd/env tồn tại trong docker nhưng không tồn tại trong none/modal; chế độ cụ thể bash mô 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 bash thự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ả/LocalExecutor gấp đôi; các bài kiểm tra docker/modal/proxy thực sự là skipif bảo vệ như vậy make ci có màu xanh lục không có tia hồng ngoại (phản chiếu LSP ty-bảo vệ và runtime cục bộ-stack các mẫu). Kín dưới filterwarnings=["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.cli vẫ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 Proxy hàng là được cập nhật và nó đạt được Sandbox Mode, Worker, Proxy Rule.
Mục lục nguồn