TECHDEV · Công cụ mã nguồn mở

leaseguard

Coding agent của bạn hỏi: "tôi có thể chạy npm run deploy không?" Bạn liếc qua diff, nói đồng ý, quay lại ly cà phê. Nó chạy lệnh đó 40 phút sau, từ một thư mục khác, trên code đã thay đổi hai lần kể từ lúc bạn duyệt. Bạn đã duyệt lệnh đó lúc 10:00. Bạn không hề duyệt lệnh đó lúc 10:40. Nhưng không ai ghi lại điều đó, nên phê duyệt đã lặng lẽ sống sót quá hạn liên quan của chính nó.

Đó là bài toán "phê duyệt ôi thiu" trong quy trình làm việc với agent: một cái gật đầu không ngày hết hạn, không phạm vi, không biên lai. leaseguard biến câu "đồng ý" của bạn thành một lease: đã ký, giới hạn thời gian, giới hạn thư mục, và có nhật ký:

# bạn (con người) cấp một lease 10 phút cho lệnh deploy, trong thư mục này
leaseguard grant "npm run deploy" --for 10m --note "hotfix for #42"
# lease 9f2c1ab4e011 granted
#   valid   : 10m (until 2026-10-20T12:25:00.000Z)
#   scope   : /home/you/myapp
#   token   : eyJ2IjoxLCJpZCI6...

# agent chạy mọi thứ qua gate
leaseguard run --lease <token> -- npm run deploy

Gate kiểm tra theo thứ tự: deny policy đang hiệu lực (deny luôn thắng, kể cả khi lease còn hợp lệ) → chữ ký lease → thời hạn → phạm vi thư mục → mẫu lệnh. Sau đó nó chạy lệnh, giữ nguyên mã thoát, và ghi quyết định vào một sổ cái chuỗi băm. leaseguard audit cho bạn thấy cái gì đã chạy, cái gì bị từ chối, phê duyệt nào đã chết lặng lẽ mà không được dùng, và có ai đã sửa log hay không.

Node 18+ · Không phụ thuộc · MIT

Không phải ứng dụng cho thuê nhà: leaseguard đặt “hợp đồng thuê” có thời hạn cho phê duyệt lệnh của agent, nên một cái “đồng ý” không thể bị dùng lại sau nhiều phút.

Demo: một lần chạy thật

Kết quả thật từ README của leaseguard — một lease 3 giây, dùng một lần, rồi hết hạn (từ examples/demo.sh):

### 1. grant a 3-second lease for the deploy command
lease <id> granted
  pattern : echo deploy-*
  valid   : 3s (until <ts>)
  scope   : <tmpdir>
  note    : demo lease
token: <redacted>

run it with: leaseguard run --lease <token> -- echo deploy-<arg>

### 2. run it right away -> allowed
deploy-backend

### 3. run it again after the lease expired -> denied
leaseguard: denied: lease <id> expired at <ts> — ask for a fresh approval

### 4. audit: the stale approval died quietly, nothing ran on it
leaseguard audit
  leases : 1 total — 0 active, 0 revoked, 1 expired (used), 0 expired unused
  runs   : 1 allowed, 1 denied
  ledger : 3 entries, hash chain OK

  recent denials:
    [<ts>] lease-expired: echo deploy-backend

Kết quả được chép nguyên văn từ README của leaseguard.

Bài toán nó giải quyết

Bạn đã duyệt lệnh đó lúc 10:00. Bạn không hề duyệt lệnh đó lúc 10:40 — từ một thư mục khác, trên code đã thay đổi hai lần kể từ lúc bạn xem. Mỗi phê duyệt con người dành cho agent đều là một cái gật đầu không ngày hết hạn, không phạm vi, không biên lai. leaseguard ghi cả ba điều đó lại: mỗi phê duyệt trở thành một lease đã ký với giới hạn thời gian, phạm vi thư mục, và một bản ghi kiểm toán chuỗi băm.

Từ README của leaseguard (mục "The problem").

Cài đặt

3 bước. Không phụ thuộc. Node 18+.

git clone https://github.com/techdevfun/leaseguard.git
cd leaseguard
npm link   # hoặc: chmod +x leaseguard.js && ln -s $PWD/leaseguard.js ~/.local/bin/leaseguard

Kiểm tra xem đã chạy đúng chưa:

leaseguard help
npm test   # 21 tests, ~7 seconds

Các lệnh được chép nguyên văn từ README của leaseguard (mục "Install").

Cách dùng

Cấp một lease — pattern là một glob được khớp với toàn bộ chuỗi lệnh:

leaseguard grant "npm run deploy" --for 10m              # phạm vi mặc định: thư mục hiện tại
leaseguard grant "kubectl rollout restart *" --for 2m --scope ./infra --note "incident #7"
leaseguard grant "rm -rf ./dist" --for 30s

Thời lượng: 30s, 10m, 2h, 1d (mặc định 15m).

Chạy qua gate — lớp bao bọc dành cho agent. Mã thoát: 0 đã chạy (mã của chính lệnh được giữ nguyên), 2 bị từ chối (không có lease / không có allow trong policy), 3 lease hỏng hoặc hết hạn, 4 policy từ chối:

leaseguard run --lease $TOKEN -- npm run deploy
leaseguard run --lease-file ./lease.token -- npm run deploy   # tránh để token trong `ps`
LEASEGUARD_LEASE=$TOKEN leaseguard run -- npm run deploy      # hoặc qua biến môi trường

Lệnh chạy trực tiếp, không qua shell — chính xác argv đã duyệt mới được thực thi. Cần pipe? Chạy sh -c tường minh và để pattern khớp toàn bộ chuỗi sh -c "...".

Standing policy — các glob allow/deny luôn hiệu lực, không cần lease cho mấy việc nhàm chán. Deny luôn thắng:

{ "allow": ["npm test", "git status"], "deny": ["rm -rf *", "curl * | sh", "git push * --force"] }
leaseguard run --policy examples/policy.json -- npm test

Quản lý & kiểm toán:

leaseguard leases          # đang hiệu lực / hết hạn / bị thu hồi
leaseguard revoke 9f2c1a   # thu hồi lease ngay (khớp tiền tố ok; tiền tố mơ hồ bị từ chối chứ không đoán)
leaseguard audit           # tóm tắt + kiểm tra tính toàn vẹn của sổ cái
leaseguard audit --json    # dạng máy đọc

Mọi thứ nằm trong ~/.leaseguard/ (key, leases.json, ledger.jsonl); trỏ sang chỗ khác bằng LEASEGUARD_HOME.

Các lệnh và mã thoát được chép nguyên văn từ README của leaseguard (mục "Usage").

Giới hạn trung thực

Các giới hạn được chép nguyên văn từ README của leaseguard (mục "What this does NOT do").

Lộ trình — chưa có

Lộ trình chép từ README của leaseguard; chưa mục nào được triển khai (2026-10-30).

Giấy phép

MIT — xem LICENSE trong repository.

Công cụ liên quan

Các công cụ mã nguồn mở khác của TECHDEV: sessguard, runverdict, gheist-guard, vetgate, context-diet, ci-failure-detective, agent-seatbelt, devsecops-os, env-doctor, skill-audit, logtrim, testguard, breakcheck, keymap, memgraph, ggufit, factfence, jsonfold

Đóng góp ý kiến

Bình chọn cho công cụ này, đề xuất tính năng, hoặc thảo luận với các vận hành khác trên bảng cộng đồng.