# 契约表：八项技术项各要哪些字段

这份表是判定规则的全文：左边是八项要求什么，中间是这份账本把它映射到了哪个物理列，右边是映射不上时判什么。你自己的账本照同一结构改 `map` 段，判定口径不会变。

## 适配器契约：`sample-agent-ledger-csv`

来源：`{"kind": "csv", "files": {"audit_log": "agent_events-sample.csv"}}`　说明：示例映射契约：把一份客户 CSV 执行日志的列名，对到八项技术项要求的逻辑字段上。刻意不映射 scope_grant_id / approval_id / input_guard / output_guard / anomaly_flags / retention_until / current_hash，也不提供 scope_grants、approval_bindings、anomalies、kill_switch_events 四张表 —— 这些格子必须如实判「无字段」。你的账本照这份结构改写 map 段即可；映射不上就是无字段，不按列名相似度猜。

**规则：映射不上就是无字段，不许猜。** 没有映射的逻辑字段一律判 `missing`；不按列名相似度兜底、不用默认值填充、不从别的列推断。谓词里的字段没映射上时，分母退化为窗口全部行，并在输出里标注降级。

| # | 技术项 | 需要的证据（逻辑字段） | 适用行 | 本账本映射 | 缺失时判定 | 非空率阈值 |
|---|---|---|---|---|---|---|
| 1 | 身份标识 | `audit_log.agent_id` | 全部行 | `audit_log.agent_ref` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 1 | 身份标识 | `audit_log.subject_principal`（替谁执行 —— 委托人口径，任何动作都应该有） | 全部行 | `audit_log.delegated_for` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 1 | 身份标识 | `audit_log.authority_commitment` | 全部行 | `audit_log.mandate_ref` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 1 | 身份标识 | `audit_log.model_artifact_source`（provider id / local；API 与自有权重路径都该有） | 全部行 | `audit_log.model_host` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 1 | 身份标识 | `audit_log.model_artifact_revision`（决策当时使用的声明修订（通常 = model）） | 全部行 | `audit_log.model_tag` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 1 | 身份标识 | `audit_log.model_artifact_digest`（只在自有权重时才有；API 路径空是如实，不是缺陷） | model_artifact_source = local | `audit_log.model_weight_digest` | 未映射 → missing；0 行适用 → covered（不适用） | 90% |
| 2 | 系统权限调用 | `audit_log.decision` | 全部行 | `audit_log.verdict` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 2 | 系统权限调用 | `audit_log.scope_grant_id` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 2 | 系统权限调用 | `scope_grants.id` | 全部行 | **未映射 → 无字段** | 字段不存在 → missing；存在即计入 | 90% |
| 3 | 工具调用 | `audit_log.tool_name` | 全部行 | `audit_log.action` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 3 | 工具调用 | `audit_log.input_hash` | 全部行 | `audit_log.args_digest` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 3 | 工具调用 | `audit_log.output_hash`（分母是真正执行过的调用（deny/not_invoked 无输出可言），证据在配对子行；父行+子行拼着才算出示） | parent_id 为空 且 outcome_class ∈ {allow, error, timeout, retry_exhausted} | `audit_log.result_digest` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 4 | 数据收集使用 | `audit_log.data_class` | 全部行 | `audit_log.data_bucket` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 4 | 数据收集使用 | `audit_log.data_purpose` | 全部行 | `audit_log.purpose_code` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 5 | 高风险操作人工介入 | `audit_log.approval_id`（分母是升级到人审的调用 —— 没升级过的行不需要审批回指） | decision ∈ {step_up, defer} | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 5 | 高风险操作人工介入 | `approval_bindings.approver` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 5 | 高风险操作人工介入 | `approval_bindings.consumed_at` | 全部行 | **未映射 → 无字段** | 字段不存在 → missing；存在即计入 | 90% |
| 6 | 输入输出安全防护 | `audit_log.input_guard` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 6 | 输入输出安全防护 | `audit_log.output_guard` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 6 | 输入输出安全防护 | `audit_log.anomaly_flags` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 7 | 日志留存与动态监测 | `audit_log.timestamp` | 全部行 | `audit_log.when_utc` | 未映射 → missing；非空率 <90% → unproven | 90% |
| 7 | 日志留存与动态监测 | `audit_log.current_hash` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 7 | 日志留存与动态监测 | `audit_log.retention_until` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 7 | 日志留存与动态监测 | `anomalies.rule` | 全部行 | **未映射 → 无字段** | 字段不存在 → missing；存在即计入 | 90% |
| 8 | 异常阻断与紧急关停 | `audit_log.enforcement_action`（分母是关停/解冻动作行 —— 普通调用不需要有强制动作） | tool_name = governance.write_freeze | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |
| 8 | 异常阻断与紧急关停 | `kill_switch_events.id` | 全部行 | **未映射 → 无字段** | 未映射 → missing；非空率 <90% → unproven | 90% |

### 每项的判定规则

- **covered**（有字段可出示）：全部格子 covered
- **unproven**（有字段出示不了）：无 missing，但至少一格非空率未达阈值
- **missing**（无字段）：至少一格无字段（未映射 / 表列不存在）

### 缺字段统计：13 / 26 个逻辑字段在这份账本上没有落点
