沙箱诚实失败(sandbox-honest-fail)v2.0
把沙箱/权限拦截的"静默失败"问题变成可控闭环。零外部依赖,仅 ~150 行标准库代码。
核心价值
- 不谎报成功:被沙箱拦截时,明确告知"实际未成功",绝不假装完成
- 严重级别区分:FATAL(彻底禁止)/ RETRY(临时限流)/ PERMISSION(权限不足)分类处置
- OS 自动适配:自动生成 Windows(schtasks) / macOS(crontab+launchd) / Linux(crontab+systemd) 的手动命令
- JSON 结构输出:方便 Agent 解析后自动决策下一步
API
is_blocked(stderr: str) → bool
判断命令是否被沙箱/权限拦截(任意级别)。
classify_severity(stderr: str) → str
分类严重级别:
- FATAL → 沙箱彻底禁止,无法补救
- RETRY → 临时限流,稍后可能成功
- PERMISSION → 权限不足,可提权补救
- UNKNOWN → 已知错误但级别不明
- NONE → 无拦截
honest_sandbox_message(stderr, context, manual_cmd, *, platform_hint, severity, json_output) → str
产出诚实的失败提示。
参数:
- stderr - 命令的标准错误输出
- context - 任务描述(如"注册定时任务")
- manual_cmd - 可选手动命令(未提供时自动生成当前 OS 的命令模板)
- platform_hint - "auto" / "windows" / "darwin" / "linux"
- severity - "auto"(默认)或强制指定级别
- json_output - True 时返回 JSON 结构
CLI 接口
# 直接传参
python sandbox_honest.py "sandbox error" "注册定时任务" --json
# 管道输入
echo "operation not permitted" | python sandbox_honest.py --json
拦截关键词(已扩展至 v2.0)
| 级别 | 关键词 |
|---|---|
| 🔴 FATAL | sandbox, strip_write, hydrogen, hammer, hammersock, e2b, isolation, security policy, blocked |
| 🟡 RETRY | rate limit, 429, too many requests, quota exceeded, throttl |
| 🟠 PERMISSION | access is denied, denied, operation not permitted, eperm, sudo, 需要管理员, 无权限 |
用法示例
import subprocess
from sandbox_honest import honest_sandbox_message, is_blocked, classify_severity
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
sev = classify_severity(result.stderr)
if is_blocked(result.stderr):
print(honest_sandbox_message(
result.stderr,
context="注册每日新闻任务",
json_output=True # Agent 友好结构
))
else:
print(f"[失败] {result.stderr}")
elif result.stdout.strip() == "":
# 命令成功但输出为空,也是静默失败的一种
print(honest_sandbox_message(
"", context="注册任务", manual_cmd='schtasks /Create ...'
))
v2.0 相比 v1.0 的改进
- 严重级别区分(FATAL / RETRY / PERMISSION)
- OS 自动适配(Windows / macOS / Linux 手动命令模板)
- 关键词扩展(6 → 20+ 个,覆盖 e2b、HammerSock、限流等)
- CLI 接口(支持管道 +
--json输出) - JSON 结构输出(方便 Agent 自动解析和下一步决策)