takerukondo/loophole-lab
GitHub: takerukondo/loophole-lab
Loophole Lab 通过对抗性搜索发现区划政策中字面规则与意图不变量之间的分歧,并将反例自动记录为可复现的回归测试。
Stars: 0 | Forks: 0
# Loophole Lab
一项规则可能通过了自身的测试,却依然未能保护其原本意图守护的对象。
Loophole Lab 是一个离线的对抗性策略实验。脚本化 proposer 将开发场景提交给两个确定性 verifier:其中一个字面应用合成的 Toyville 法规,另一个则检查其声明的不变量(invariant)。字面通过加上意图失败,就成了一个可以作为 pytest 回归测试记录下来的反例。
```
$ loophole-lab
Loophole Lab — a written rule passes what its stated intent rejects
policy: v1 -> v1+patch-amenity-far
counterexamples: 2
after counting amenity area toward FAR:
spec-TV-100: literal pass True -> False
- FAR 4.500 exceeds max 3.0 (amenity_exempt=False)
```
所有操作均在本地基于虚构的政策和地块运行。没有模型调用,也没有网络请求。
## 运行说明
一条命令即可创建环境、运行测试套件,并展示闭环流程:
```
./scripts/run.sh
```
或者直接安装并运行各个组件:
```
python -m pip install -e '.[dev]'
pytest
loophole-lab
```
默认的演示是只读的。要将发现的反例保存为独立的回归测试,请明确指定目标路径:
```
loophole-lab --emit-dir ./captured_regressions
```
## 植入的漏洞
Toyville v1 在其字面 FAR 计算中排除了“便利设施”的建筑面积。意图检查则会计算总建筑面积。`speculator` 策略将住宅面积设定在书面规定的上限,并增加豁免面积;其结果是该方案通过了字面规则,却违背了不变量。已演示的最小补丁会将便利设施建筑面积计入 FAR,从而使同一方案无法通过。
此处有意不将其呈现为一种真实的监管漏洞利用行为。测试数据(fixtures)均是虚构的,且这三个“agent”是确定性的提案策略,而非自主系统。[DESIGN_NOTES.md](./DESIGN_NOTES.md) 解释了为什么这种约束是有用的。[LIMITATIONS.md](./LIMITATIONS.md) 更详细地说明了该边界。
## 与 `zoning-unit-tests` 的关系
[`zoning-unit-tests`](https://github.com/takerukondo/zoning-unit-tests) 比较不同版本显式规则之间的行为差异。而 Loophole Lab 则保持规则不变,寻找其字面语义与显式政策不变量之间的分歧。前者属于回归测试;后者属于对抗性搜索。在找到能让问题更清晰而非掩盖这些不同问题的共享 schema 之前,它们将保持独立。
## 研究脉络
这是我于 2024 年 5 月至 2025 年 1 月在 SCI-Arc Research 担任研究助理期间,独立完成的一项工作。这种关于激励鸿沟的构想,得益于 Masha Hupalo 和 Luke Falcone 的《Inclusionary Zoning in Los Angeles》,以及 Erik Ghenoiu、Masha Hupalo、Andrew Chittenden 和 Case Miller 的《NPA Ballot Initiative》的启发。
本仓库并未声明我是上述项目的唯一作者,也不属于 SCI-Arc 的官方发布。此处的软件和合成测试数据均属于独立实现。请参阅 [ATTRIBUTION.md](./ATTRIBUTION.md) 和 [PROVENANCE.md](./PROVENANCE.md)。
基于 MIT 许可协议发布。仅包含合成政策;不构成法律建议。
标签:Python, 安全规则引擎, 对抗测试, 文档结构分析, 无后门, 策略测试, 红队评估, 逆向工具