我如何为 Claude Code 构建信任评分钩子
Source: Dev.to
概览
我已经使用 Claude Code 一段时间了,发现自己对代理在会话期间的行为毫无可见性——它调用了哪些工具,是否触及了不该触碰的文件,以及每个任务发起了多少次调用。为了解决这些问题,我构建了一个对每个会话进行评分的 hook。
该 hook 监听三类 Claude Code 事件:
- PostToolUse – 记录每一次工具调用,检查是否在白名单内,并标记受保护路径的访问。
- PreToolUse – 阻止对
.env、SSH 密钥等敏感文件的工具调用。 - Stop – 计算最终的信任分数并记录日志。
每次会话结束时,你会看到类似以下的输出:
[authe.me] Trust Score: 92 (reliability=100 | scope=75 | cost=100)
[authe.me] tools=14 violations=1 failed=0
评分模型
信任分数是三个维度的加权组合:
| 维度 | 权重 | 描述 |
|---|---|---|
| 可靠性 | 40 % | 成功的工具调用所占的百分比。 |
| 范围 | 35 % | 代理是否仅使用了允许的工具和路径。每一次违规会使分数下降 25 分。 |
| 成本 | 25 % | 发起的工具调用次数。少于 20 次还算正常,超过 100 次则开始被标记。 |
实现细节
工具调用的哈希链
每一次工具调用事件都会与前一次的哈希值一起进行哈希,形成一个简单的链。如果日志被篡改,链会断裂——这是一种轻量级的区块链式审计轨迹。
import hashlib, json
def compute_hash(prev_hash, data):
payload = f"{prev_hash}:{json.dumps(data, sort_keys=True)}"
return hashlib.sha256(payload.encode()).hexdigest()[:16]
PreToolUse 拒绝示例
PreToolUse hook 会检查 Claude 是否即将读取或编辑敏感文件。如果匹配到受保护路径,hook 会返回一个拒绝决定,并附带原因,Claude 会将其作为反馈收到:
result = {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "authe.me policy: .env is a protected path."
}
}
Claude 会看到拒绝原因并相应地调整其计划。
安装
mkdir -p ~/.claude/hooks ~/.authe
curl -fsSL https://raw.githubusercontent.com/autheme/claude-code-hook/main/authe-hook.py \
-o ~/.claude/hooks/authe-hook.py
chmod +x ~/.claude/hooks/authe-hook.py
Hook 配置
在 ~/.claude/settings.json 中添加以下内容:
{
"hooks": {
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "AUTHE_HOOK_EVENT=PostToolUse python3 ~/.claude/hooks/authe-hook.py"
}
]
}
],
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "AUTHE_HOOK_EVENT=Stop python3 ~/.claude/hooks/authe-hook.py"
}
]
}
]
}
}
该 hook 只包含单个文件,零外部依赖,且纯 Python 实现。
未来工作
- 远程报告 – 汇总跨会话和跨代理的分数。
- OpenClaw 插件 – 为 OpenClaw 生态系统提供等效功能。
代码仓库地址:
Built with Claude. I’d love feedback from anyone running Claude Code in production.