aminobutyric/under-llm-governance
GitHub: aminobutyric/under-llm-governance
一个安全优先的本地编码 agent,通过最小权限控制和沙箱隔离机制,在保障代码安全的前提下让大语言模型辅助完成代码检查与补丁生成。
Stars: 0 | Forks: 0
# 在 LLM 治理之下
一个安全优先的本地编码 agent 项目。该 agent 将通过 Ollama 使用本地模型,在用户选定的项目中工作,并在可强制执行的最小权限控制下运行。
本仓库具有可执行的只读检查和一次性编辑工作流,目前正致力于实现其 MVP 的沙箱和审批阶段。锁定的基准环境是 Linux、Python 3.11+、`uv`、rootless Docker 以及绑定在本地运行的 Ollama 服务器。Ollama 是一个适配器,而非核心设计的硬依赖。
本仓库采用 `MPL-2.0` 许可证。
## 核心理念
模型永远不会获得对主机的环境访问权限。它会提出类型化的操作,例如读取相对路径、应用补丁或运行配置好的测试。一个受信任的 controller 会验证每一个提议、应用策略、在必要时请求人类批准,并在隔离的任务工作区中执行已接受的操作。
系统提示词中的安全指令是有用的指导,但它们并不构成权限边界。
## 安全不变量
- 模型无法直接访问文件、进程、凭证或网络。
- 默认情况下,任务只能访问其一次性工作区。
- 类似机密和策略排除的文件,会在任何工作区数据进入模型上下文或审计数据之前被移除。
- 路径在 workspace 根目录下解析;单纯的字符串前缀检查被认为是不够的,symlink 会被拒绝而不是被跟随。
- 多文件补丁只有在每个 hunk 都验证通过且新的 workspace 生成完成后才会变得可见。
- 默认情况下,命令执行是非 root 权限的、资源受限的、时间受限的且离线的。
- 模型输出、仓库内容、工具输出和依赖输出都被视为不受信任的输入。
- 命令需要针对确切的配置配方获得狭窄的批准授权;在 MVP 中不存在需要网络、凭证或外部可见的操作。
- 每一个被提议和执行的操作都会生成一条审计记录,其中的机密信息在序列化或持久化之前会被脱敏。
## 仓库结构
```
pyproject.toml Package metadata, CLI entry point, tool settings
uv.lock Reproducible dependency lock
src/ulg/
cli.py Local CLI
controller.py Bounded agent loop and request lifecycle
actions/ Typed, versioned action and result schemas
model/ Provider contract, fake, and Ollama adapters
policy/ Deterministic authorization decisions
approval/ Scoped capability grants
tools/ Read, search, patch, diff, and recipe tools
workspace/ Copies, generations, exclusions, patch export
sandbox/ Isolated process runner
audit/ Structured pre-write redaction and JSONL sink
config/ Strict TOML configuration loading
tests/ Unit, integration, and security suites
.github/workflows/ci.yml Locked lint, type-check, and test workflow
config/ Example trusted policy files
docs/ Architecture, security model, plans, and ADRs
testdata/adversarial/ Inert injection, path, and resource fixtures
```
Phase 0 包包含 controller 演练路径、严格的操作和配置 schema、确定性策略、审计安全事件、一个假模型,以及用于批准、工具、工作区和沙箱的显式契约。具体的副作用实现仅会在对其进行保护和测试的开发阶段引入。
## 快速开始
```
uv sync
uv run ulg dry-run
uv run pytest
```
演练会跨越模型、schema、策略、controller 和审计边界,但不会读取工作区或执行工具。
要针对一次性只读快照使用已安装的本地 Ollama 模型:
```
uv run ulg inspect \
--workspace /path/to/project \
--task "Explain this project and cite the files you read" \
--model qwen3:14b
```
原始项目绝不会作为模型的工作目录。任务快照在检查后会被销毁,而允许的审计事件会保留在应用程序状态目录中。
要让模型在不修改原始项目的情况下生成一个可审查的补丁:
```
uv run ulg run \
--workspace /path/to/project \
--task "Make the requested change" \
--output /path/to/new-change.patch \
--model qwen3:14b
```
输出路径必须不存在。导出的统一 diff 是唯一写入应用程序状态之外位置的工件;将其应用到原始项目是刻意留给用户来完成的。
## 文档
- [架构](docs/architecture.md)
- [安全模型](docs/security-model.md)
- [开发计划](docs/development-plan.md)
- [MVP 实现状态](docs/mvp-status.md)
- [信任边界决策](docs/decisions/0001-trusted-controller.md)
- [Python 实现基准](docs/decisions/0002-python-baseline.md)
- [安全机制](docs/decisions/0003-security-mechanisms.md)
- [许可证决策](docs/decisions/0004-license-mpl.md)
- [开源核心策略](docs/open-core-strategy.md)
- [策略示例](config/policy.example.toml)
## 初始范围
MVP 支持一名本地用户且一次只能执行一个任务。它可以检查复制的 workspace、提出补丁、显示生成的 diff,并在没有网络访问的情况下运行预配置的检查。它会输出一个补丁供人类在 agent 的写入路径之外应用。它不会安装依赖、推送代码、部署软件、管理机密或进行任意的主机更改。
## 成功的定义
一个成功的 MVP 能够完成一个小型编码任务,同时,仓库中的对抗性文件无法使其读取 workspace 之外的内容、联系网络、消耗无限制的主机资源,或绕过批准决策。
标签:AI编程助手, AI风险缓解, LLM评估, Ollama, Python, Python安全, SOC Prime, 开发工具, 无后门, 时序数据库, 最小权限, 本地大模型, 沙箱, 请求拦截, 逆向工具