ACTE(Adversarial Case-Theory Engine)是一个诉讼代理决策引擎。它在同一条流水线上 处理三个问题:哪些动作不可实施(不可逆动作护栏)、在允许的动作中选取哪一个(姿态参数化)、 以及主张是否具备事实、规范与证据三类支撑(案件理论图)。
引擎的设计约束只有一条:它不判断案件能否胜诉,只保证不会实施使自身处境发生不可逆
恶化的动作。该约束的形式化与由此得到的定理见 method/formalization.md。
本仓库收录算法本体,包括内核、运行时插件、评测入口、回归测试与验证链,以及形式化规范。 实验材料(任务集、金标准、消融配置与逐臂读数)另行归档,理由见第 8 节。
法律程序中存在一类不可回复的动作。提起诉讼可能引起处罚层级加重,甚至转入刑事程序;
未在法定期限内起诉则起诉通道关闭。此类动作登记于 T_irr(不可逆转移表),由护栏
(下称盾)在规划之前予以排除。盾的形态为
Shield(s) = { a : (s, a) ∉ T_irr 且存在自 s 起的无穷安全续行 }
其取值仅依赖状态、动作集与 T_irr,不依赖效用函数或策略。这一性质是定理 1 的结论,
而非实现上的取舍。T_irr 由 rules/gates.yaml(闸门注册表)生成,经
code/data/t-irr.json(附源文件 sha256 的快照)至插件内联合成段,三处逐字一致由
check_plugin_data.py 校验。
同一引擎以两个参数驱动三种诉讼风格:
| 姿态 | 目标 Obj |
风险预算 ε |
取向 |
|---|---|---|---|
| 细 | 覆盖最大化 | 宽松 | 先行铺全事实与证据 |
| 狠 | 效用最大化 | 宽松 | 追求回收规模 |
| 稳 | 效用最大化 | 严格 | 宁可少为,不可为错 |
ε 不停留于符号层面,而落实为可消耗配额。strict 对应配额 0,任何不可逆动作均不接受,
包括当事人已确认者;loose 对应配额 1,接受一个已确认的不可逆动作,未确认者仍一律拦截。
配额属于状态的增广分量,不构成策略,故不违反盾不依赖策略的要求。
主张为节点,事实、规范与证据为三类支撑边。完备性(每条主张三类边齐备)与覆盖度 (按要件事实计,不按请求权条数计)均可机械校验。
code/harness.py 为可插拔臂的评测入口,流程为运行系统、判定弱点是否被发现、计算指标、
落盘附溯源的结果文件。另设两个夹具臂(oracle 与 null)用于标定度量链自身:
oracle 应给出检出率 100%、误报 0;null 应给出检出率 0%、误报 0、升级事故率 100%。
任一不符即说明度量链存在问题,而非系统强弱。这两个臂不是基线,不得作为实验结果引用。
method/formalization.md 给出完整陈述、证明与工程含义,摘要如下。
| 定理 | 内容 | 所解锁的设计决策 |
|---|---|---|
| 1(解耦) | 硬约束(ε = 0)下盾可独立于目标与策略求解;分两步即达约束最优 |
风险闸门可实现为独立插件,无须与策略联合优化 |
| 1′(软约束可解耦的条件) | ε > 0 时解耦要求风险预算为可消耗配额;条件不满足时策略必须随机化 |
「闸门能否单独实现」成为可操作的工程判据 |
| 2(姿态单调) | 固定 Obj、ε_1 ≤ ε_2,则 Shield_{ε_1} ⊆ Shield_{ε_2} |
提供可证伪的消融诊断:出现交叉即说明 ε 未单独起作用 |
| 3(无免费午餐) | 存在实例族使三姿态两两互不占优 | 参数化为必需,而非多余的工程复杂度 |
定理 1 直接决定代码结构:Engine.shielded_plan() 先计算盾,再在盾内按姿态选取动作,
而非将风险并入效用函数统一打分。若实现将风险并入目标联合优化,即等于否认定理 1。
策略层因此不得重新评估风险,该边界由 code/tests/test_strategy.py 固定。
| 词 | 含义 |
|---|---|
| 盾 / shield | 不可逆动作护栏,见 ctd_acte/t_irr.py 与 plugins/acte-shield.js |
| 闸门 / gate | rules/gates.yaml 中的单条不可逆转移登记项 |
T_irr |
不可逆转移表,由闸门注册表导出 |
| 姿态 / posture | 参数对 (Obj, ε),见 ctd_acte/posture.py |
| 升级 / escalation | 己方动作引起的处境不可逆恶化,如处罚加重、转入刑事、标的物灭失 |
| 动作型 / 不作为型 | 两类 T_irr 条目:实施某动作即触发,与未在期限内作为而触发 |
| 时间增广 | 不作为型的判定需要剩余期限这一状态分量;缺该分量时应报无法判定,不得放行 |
| 弱点注入签名 | 金标准机制:将「案件事实中埋有弱点」转化为可机械核验的注入、痕迹与后果断言 |
| ToC | 案件理论图(Theory of Case) |
M_1 / M_2 / M_3 |
定理 3 构造的三个互不占优的实例族 |
| DSH | DeepSeek Harness,引擎的运行时基座(MIT,第三方组件) |
| 发射端 | plugins/acte-plan.js,注册工具、将提交送交盾、并将裁决写入日志 |
要诀 / yaojue |
登记表与快照里的来源标识:本引擎的办案风格取自一本实务读物的各章,yaojue 记该章名(稳 / 细 / 狠 / 全),source_page 记其在原书中的位置。本仓库只登记出处,不收录原书内容 |
| 姿态标识 | 代码与数据里的姿态标识沿用该读物的章名(细 / 狠 / 稳)。论文以目标与预算另行写为覆盖型 / 效用型 / 稳健型,两者是同一组参数的不同写法:细 = 覆盖型、狠 = 效用型、稳 = 稳健型 |
T1–T4 |
评测的四种任务形态:T1 立案决策、T2 主张栈完整性、T3 文书侧输出、T4 对方攻击预判。指标名与代码里的编号与之一致 |
代码注释中的 B1–B4 指论文 §4.1 列出的对比基线。除此以外,代码与文档不出现任何
需要外部对照表才能读懂的编号:所有机制名(如输出侧接地门槛、红队对抗循环)与
实验配置名都以自足表述写出,读者只看本仓库即可理解。
依赖 Python 3.9 及以上版本与 PyYAML;插件运行时测试需要 Node。内核本身不依赖第三方库。
python3 -m pip install pyyaml
python3 code/tools/verify_all.py本仓库不含任务集,验证链因此自动进入 code-only 档:执行不依赖任务集的六档,
其余五档以「不适用」显式列出,并说明本次验证覆盖的范围。完整十一档需要实验材料:
python3 code/tools/verify_all.py --profile full最小用例(不依赖任务集):
from ctd_acte.engine import Engine
from ctd_acte import toc as toc_mod
engine = Engine.from_snapshot("code/data/t-irr.json")
toc = toc_mod.ToC()
claim = toc.add_claim("请求判令被告支付货款", expected_utility=120000)
toc.add_edge(claim, "fact", "2025-03-01 双方签订买卖合同")
toc.add_edge(claim, "norm", "民法典第 577 条")
toc.add_edge(claim, "evidence", "买卖合同原件")
plan = engine.shielded_plan(
"稳",
actions=["起诉", "申请保全", "等待对方履行"],
triggered=["gate.escalation-risk"],
trigger_map={"起诉": ["gate.escalation-risk"]},
remaining=30,
toc=toc,
)
print(plan["shield"]["allowed"], plan["quota"], plan["toc"]["coverage"])verify_all.py 共十一档。本仓库(不含任务集)可执行其中六档:
| 档 | 检查 | 所防范的问题 |
|---|---|---|
| 1 | T_irr 登记表回归 |
登记表结构漂移,或校验器退化为从不报错 |
| 2 | T_irr 漂移 |
闸门源演进后快照静默过期(快照与源逐字比对) |
| 5 | 任务集生成器守卫(§A) | 生成器守卫失效(空注入计划、锚点未命中须报错退出) |
| 6 | ACTE 内核回归 | 盾的两种语义、时间增广、姿态嵌套、零容忍、ToC 口径 |
| 10 | 插件数据一致性 | 插件内联表静默过期;改用自上下文读取配置的写法(真机加载期崩溃) |
| 11 | 插件运行时行为(需 Node) | 盾的两型语义、时间增广、委托下游,以及盾缺席时必须报警 |
未覆盖的档以任务集为输入,随实验材料发布:弱点目录校验、判定机复用验证、度量链标定、 姿态与消融效应、红队开关对照。
第 11 档需要 Node。找不到 Node 时该档报告未执行并以非零退出,不作静默略过。
几个套件也可以单独跑(不经验证链)。其中两个(度量链标定、策略层与消融效应)以任务集
为输入,本仓库里没有该输入,因此会打印一段"不适用"说明并以退出码 2 结束,
而不是抛异常。抛异常看起来像套件坏了,而实际情况是这一步本来就依赖实验材料。
红队提示词开关套件只有其中一组依赖决策任务集,缺输入时该组跳过、其余照跑。
verify_all.py 会自动把这几步整体列为"不适用"。
code/
├── ctd_acte/ 内核(不依赖第三方库、不调用模型)
│ ├── t_irr.py T_irr 登记表与盾(限制型 / 强制型)
│ ├── posture.py 姿态 (Obj, ε)、配额映射与嵌套诊断
│ ├── toc.py 案件理论图、支撑完备性、要件覆盖度
│ ├── strategy.py 在盾内按姿态选取动作(不重新评估风险)
│ ├── engine.py 三层编排(先计算盾,再选取动作)
│ ├── metrics.py 检出、误报分级、升级事故、计划质量
│ └── output_gate.py 输出侧接地门槛:引文未逐字落到案情原文即降级
├── plugins/ DSH 运行时插件(JavaScript)
│ ├── acte-protocol.js 协议:层名、两型常量、通知位
│ ├── acte-shield.js 盾:两种语义(拦 / 催)与配置驱动
│ └── acte-plan.js 发射端:注册 acte_plan、发出 acte/shield、写取数日志
├── data/t-irr.json T_irr 快照(附源 sha256 溯源;含法条级期限节点的判定与覆盖)
├── vendor/signature.py 注入签名判定机(只读冻结件,见 vendor/PROVENANCE.md)
├── tests/ 回归套件(其中三个以任务集为输入,缺输入时按"不适用"退出)
├── tools/ 校验器、生成器、验证链、红队判定、性能微基准、统计工具
└── harness.py 评测入口(可插拔臂、夹具标定、指标落盘)
method/formalization.md 形式化规范:记号、SC-MDP 定义、定理 1/1′/2/3 与证明
method/t-irr.yaml 不可逆转移登记表(声明式判定 + 穷尽校验,快照由它派生)
method/deadline-nodes.yaml 法条级程序期限节点目录(21 个节点,精确到条)
method/book-coverage.md 设计来源对照表:办案经验 → 结构命题 → 工程构件
probes/redteam-probes.json 红队探针定义(24 件,另行改写,不进主任务集)
probes/redteam-verdicts.json 红队判定产物(两配置 × 两种子的逐探针判定)
perf/perf-report.md 护栏判定开销的实测读数(微基准与会话侧)
rules/gates.yaml 闸门注册表钉版快照(供第 2 档漂移校验)
内核不调用模型,此为刻意设计:盾与姿态的取值仅依赖 T_irr 与登记表,若将其绑定至
模型调用,闸门是否生效将变为不可复现的读数。生成式部分(红队对抗循环、主张生成)
由评测入口与臂适配器接入。
本仓库不含逐臂实验读数(见第 8 节);收录的读数只有两类,都不涉及主任务集的答案:
红队对抗探测的判定产物(probes/)与护栏开销的微基准(perf/)。
微基准读数是单机单次运行的结果(含计时器开销未扣除这一限定,见该报表 §5),
跨机器会变;可比的是工具与方法(code/tools/bench_shield.mjs 可自行复跑),
不是那几个微秒数值本身。
使用者若从论文或实验材料中获得逐臂读数,应注意以下两点,否则容易误读。
第一,误报率不宜仅看单一口径。基线的 FP(any)(存在任一报出即计为误报)均为 1.0,
属口径产物;判读应以 FP(重大)(仅重大误报计入)为准。输出侧门槛与分级口径的价值主张,
由机制与模型行为共同决定。
第二,检出率的排序随模型而变。同一任务集更换模型后,裸基线与本引擎的相对次序会发生 变化,任何比较结论均应限定于所测模型。
此外,机会面类弱点(例如抚养权窗口宜快)在各臂中几乎均未检出。该现象属任务集侧的 真实边界,论文中已如实记录。
任务集与金标准、消融配置、逐臂读数与口径记账均不收录于本仓库。因此,代码中出现的
experiment/tasks、experiment/results、experiment/run 等路径指向实验材料的目录布局:
使用本仓库内核不依赖这些路径,复现论文读数则需一并取得实验材料。
两处例外已随本仓库发布,原因是它们不涉及主任务集的答案:红队探针与判定产物
(probes/,探针由既有实例另行改写、不进主任务集),以及护栏开销读数(perf/)。
期限节点的覆盖与判定不设例外:它是登记表的派生物,直接随快照发布。
盲判材料包与标注结果不属于公开范围:其中包含臂身份映射、匿名码对照与已填标注,
等同于标准答案。导出脚本已将 experiment/blind*/ 列入无条件剔除清单。
代码与文档采用 CC BY-NC-SA 4.0(署名、非商业性使用、相同方式共享),全文见 LICENSE。
第三方组件见 THIRD_PARTY_NOTICES.md,其中运行时基座 DeepSeek Harness 采用 MIT 许可,
不受本仓库非商业条款约束。
判定机 code/vendor/signature.py 为只读的共享冻结件(同一套注入签名判定在多个
任务形态间复用),来源与 sha256 见 code/vendor/PROVENANCE.md。