# Parity matrix

This table tracks which security guarantees Doberman proves on each host it fronts, and which
gaps are still open. Each row is a guarantee; each column a host. Generated by
`python -m tools.parity.generate_parity`; do not edit it by hand.

- **✅**: a CI test proves the cell on that host (the link opens the test file).
- **◻**: an open, contributor-sized gap not yet proven (see issues labeled `parity`).
- **—**: the host cannot express this guarantee today (see the footnotes).

| Guarantee | Claude Code | Codex | Mcp Proxy | Openclaw |
|---|---|---|---|---|
| Destructive shell commands are blocked or AUTH-gated | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_claude_pre.py) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_codex.py) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/integration/test_engine_blocks_reach_no_tool.py) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_openclaw.py) |
| Deleting unrecoverable gitignored data is gated (AN-1) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_claude_pre.py) | ◻ | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/integration/test_engine_blocks_reach_no_tool.py) | ◻ |
| A session that read a secret gets a raised floor on egress | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_taint_floor.py) | ◻ | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_proxy_taint_floor.py) | ◻ |
| An outbound value matching a read secret is blocked | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_exfil_fingerprint.py) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_codex.py) | ◻ | ◻ |
| Tool output carrying credentials is blocked from the model | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_claude_post.py) | ◻ | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_proxy_secret_output_gating.py) | — |
| The agent cannot edit Doberman's own config or hooks | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_control_plane.py) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_rule_paths_codex_control_plane.py) | ◻ | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_openclaw.py) |
| Approvals are single-use and bound to one action id | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_auth_challenge.py) | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_hosthook_codex.py) | ◻ | ◻ |
| AUTH challenges auto-deny at the wall-clock deadline | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_auth_challenge_timeout.py) | ◻ | ◻ | ◻ |
| A timeout is logged distinctly from a refusal | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/unit/test_auth_challenge_timeout.py) | ◻ | ◻ | ◻ |
| Policy weakening requires the human-approved path | ◻ | ◻ | [✅](https://github.com/DobermanCore/Doberman-Core/blob/main/tests/integration/test_drift_gate.py) | ◻ |

### Footnotes for `—` cells

- **Tool output carrying credentials is blocked from the model (openclaw):** the OpenClaw adapter has no after_tool_call hook in the current slice, so it cannot scan tool output (documented limitation, not a gap to fill)
