Skip to content
Back to skills

Destructive Action Policy Matrix

BSecurity

Classify every destructive/gated action an agent body can attempt (git, filesystem, network, shell, github) into block/approve/allow tiers, and audit whether the pre-tool and post-tool governance backing that classification is real: blocked actions proven zero-side-effect by a negative fixture, every denial backed by a receipt and a transcript event, every block-tier denial paired with a safe alternative, and no unmanaged or same-UID body ever marked "contained." Use when building or reviewin...

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 24, 2026
toolsrustgoshellbashnodegitdocumentation

Works with

  • cli
  • mcp

Security analysis

B85/100
  • highPerforms destructive filesystem operations

Pro scans all 11 files and shows the line behind each finding

Scanned September 24, 2026

npx -y skills add curiositech/port-daddy --skill destructive-action-policy-matrix --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Destructive Action Policy Matrix?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Destructive Action Policy Matrix
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/curiositech-destructive-action-policy-matrix/badge)](https://www.skillsdirectory.com/skills/curiositech-destructive-action-policy-matrix)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: destructive-action-policy-matrix
description: >-
  Classify every destructive/gated action an agent body can attempt (git, filesystem, network, shell, github) into
  block/approve/allow tiers, and audit whether the pre-tool and post-tool governance backing that classification is
  real: blocked actions proven zero-side-effect by a negative fixture, every denial backed by a receipt and a
  transcript event, every block-tier denial paired with a safe alternative, and no unmanaged or same-UID body ever
  marked "contained." Use when building or reviewing Agent Harbor's C5 governance gate (destructive git blocker,
  approval request/result, denial receipts), gating a new tool surface before it can run destructive commands, or
  auditing whether an existing "destructive-action blocked" claim actually has evidence behind it. NOT for proving an
  existing sandbox boundary actually contains an adversary once an action is isolated (use
  sandboxed-adversarial-test-harness), deciding where in a DAG to place a human review node or designing the approval
  UX itself (use human-gate-designer), or designing the general work-receipt schema across an entire agent task (use
  agent-work-receipt-designer).
license: Apache-2.0
allowed-tools: Read,Write,Edit,Bash,Grep,Glob
metadata:
  category: Agent & Orchestration
  tags:
    - destructive-action
    - policy-matrix
    - pre-tool-gate
    - denial-receipt
    - governance
  provenance:
    kind: first-party
    owners:
      - port-daddy
  pairs-with:
    - skill: sandboxed-adversarial-test-harness
      reason: This skill classifies and audits policy/evidence; that skill proves the isolation boundary a containment claim depends on actually holds.
    - skill: human-gate-designer
      reason: Approve-tier rows in this matrix are exactly the DAG nodes that skill designs the human review UX and routing for.
    - skill: agent-work-receipt-designer
      reason: A denial receipt is a specialized, single-decision instance of the broader work receipt that skill's schema covers.
    - skill: articles-of-agreement-auditor
      reason: This policy matrix is the tool-use half of the Articles contract that skill audits; a gated action is one clause whose enforcement mechanism must be real.
  io-contract:
    kind: deliverable
    consumes:
      - kind: tool-surface-inventory
        format: markdown
      - kind: policy-matrix-spec
        format: json
    produces:
      - kind: destructive-action-policy-matrix
        format: markdown
      - kind: policy-matrix-audit
        format: json
---

# Destructive Action Policy Matrix

Classify every destructive/gated action into block/approve/allow, then prove the governance behind that classification is real, not asserted.

## Use This For

- Building Agent Harbor's C5 governance gate: destructive git blocker, approval request/result, denial receipts, tool-result persistence, safe alternatives.
- Gating a new tool or MCP surface before it can run destructive commands (`rm -rf`, `git reset --hard`, `gh repo delete`, arbitrary shell exec, egress to a new host).
- Auditing an existing "we block destructive git" claim to check whether a negative fixture actually proved zero side effects, or whether it's just documentation.
- Deciding whether a denial is real (receipt + transcript event + safe alternative) or just a log line nobody reads.
- Catching a report that overclaims containment for a same-UID or unmanaged agent body.

## Do Not Use This For

- Proving an already-classified, already-isolated action's sandbox actually holds against an active adversary (`sandboxed-adversarial-test-harness`) — this skill audits the *policy and evidence*, not the isolation mechanism itself.
- Designing where in a DAG a human review node belongs or how the approval UX looks (`human-gate-designer`) — this skill only asks whether an `approve`-tier action has the pre-tool gate, receipt, and transcript coverage a human gate depends on.
- Designing the general work-receipt schema for an entire agent task's evidence (`agent-work-receipt-designer`) — a denial receipt here is one specialized row of that broader shape, not the schema itself.

## Classification And Audit Process

```mermaid
flowchart TD
  A[Inventory every tool surface's destructive/gated actions] --> B[Classify each into git/filesystem/network/shell/github]
  B --> C[Assign tier: block, approve, or allow]
  C --> D{Tier is block or approve?}
  D -->|Yes| E[Wire pre-tool gate, denial receipt, transcript event]
  D -->|No allow| F[No gate required]
  E --> G{Tier is block?}
  G -->|Yes| H[Run negative fixture; prove zero side effects; document safe alternative]
  G -->|No approve| I[Human gate decides; receipt+transcript still required]
  H --> J[Run scripts/policy_matrix_audit.mjs]
  I --> J
  F --> J
  J --> K{pass and zero critical findings?}
  K -->|No| C
  K -->|Yes| L[Gate deploy on green matrix]
```

1. **Inventory every destructive/gated action** the tool surface exposes. A new MCP tool or CLI is unclassified by default — never implicitly `allow`.
2. **Classify each action's category** (`git`, `filesystem`, `network`, `shell`, `github`) using `references/destructive-action-taxonomy.md`. Category creep or "it's usually fine" reasoning is a finding waiting to happen.
3. **Assign a tier** (`block`, `approve`, `allow`) by the action's *worst-case* effect, not its typical case.
4. **For `block`/`approve` tiers, wire pre-tool enforcement, a denial receipt, and a transcript event** (see `references/denial-receipt-and-transcript-envelope.md` for the exact envelope and receipt shapes).
5. **For `block` tier specifically**, run the negative fixture (e.g. `git reset --hard` in a dirty worktree) and prove zero side effects before setting `sideEffectFreeOnBlockFixture: true`; document a concrete, runnable safe alternative.
6. **Run `scripts/policy_matrix_audit.mjs`** against the assembled matrix. It statically audits classification completeness, evidence, and any containment claim — before any live enforcement is trusted.
7. **Gate deployment on `pass: true`** with zero critical findings. A matrix with an unproven block or an evidence-free denial is a blocker, not an FYI.

## Output Contract

- **Policy matrix**: one row per destructive/gated action — category, tier, pre-tool gate, denial receipt, transcript event, safe alternative (block-tier), side-effect-free-on-block proof.
- **Containment claim** (if the report makes one): explicit `sameUidBodyMarkedContained` boolean — never `true` for an unmanaged or same-UID body.
- **Policy-matrix audit**: `{ pass, score, findings, recommendations }` from `scripts/policy_matrix_audit.mjs`, matching `schemas/policy-matrix.schema.json` for the input shape.

Use `scripts/policy_matrix_audit.mjs` to compute the score and flag unclassified actions, unproven blocks, evidence-free denials, and overclaimed containment deterministically.

## Anti-Patterns

### The Blocker That Still Ran

**Novice**: "We block `git reset --hard`" — meaning the intent is documented, or a warning is logged, but the command still executes.
**Expert**: A block-tier action is only a blocker if a negative fixture has proven the command produces zero side effects when denied. Intent, a log line, or a code comment is not proof; a passing fixture is.
**Detection**: `policy_matrix_audit.mjs` fires `blocked-action-has-side-effects` (critical) when a `block`-tier action's `sideEffectFreeOnBlockFixture` is false or absent.

### The Silent Denial

**Novice**: A destructive action gets denied, and that's the end of it — no record, no way for the agent (or a reviewer) to know what to do instead.
**Expert**: Every denial on a `block`/`approve` action must produce a durable receipt, a visible transcript event, and — for `block` tier — a concrete safe alternative. A denial with none of these teaches nothing and leaves no evidence a governance gate exists at all.
**Detection**: `policy_matrix_audit.mjs` fires `denial-without-receipt` (critical) when a gated action has no denial receipt, `denial-without-transcript-event` (critical) when it emits no transcript event, and `gated-action-no-safe-alternative` (critical) when a `block`-tier action has no `safeAlternative`.

### Overclaiming Containment

**Novice**: A report marks an unmanaged, same-UID debug shell or fallback code path as "contained" because it happens to be sitting behind the same policy matrix as everything else.
**Expert**: Containment is a property of an enforced isolation boundary (separate OS user, sandbox, container) — not of having a policy on file. A same-UID or unmanaged body can be *governed* by this matrix, but it can never be truthfully marked *contained*.
**Detection**: `policy_matrix_audit.mjs` fires `same-uid-marked-contained` (critical) whenever `containmentClaim.sameUidBodyMarkedContained` is `true`.

## References

| File | Load When |
| --- | --- |
| `references/destructive-action-taxonomy.md` | Need the five action categories, the three tiers, the tier decision test, and common misclassification traps. |
| `references/denial-receipt-and-transcript-envelope.md` | Need the pre-tool/post-tool event envelope, the human gate payload shape, or the denial receipt shape. |
| `examples/expected-output.md` | Need a weak policy matrix audited (`pass:false`), then the same matrix fixed and passing. |
| `examples/sample-input.json` | Need a complete, passing policy-matrix spec to copy as a starting point. |
| `templates/output-template.md` | Need a reusable policy-matrix template with a pre-gate checklist. |
| `schemas/policy-matrix.schema.json` | Need to validate a policy-matrix JSON payload's structure before auditing it. |
| `scripts/policy_matrix_audit.mjs` | Need deterministic scoring of a policy matrix's classification completeness and evidence. |
| `agents/openai.yaml` | Need a subagent descriptor for delegated policy-matrix design/audit. |

<!-- BEGIN BUNDLE INDEX (auto: index_references.py) -->

## Skill Bundle Index

*Every file in this skill, and when to open it. Auto-generated; run `scripts/index_references.py --fix`.*

**root**
- [`CHANGELOG.md`](CHANGELOG.md) — Destructive Action Policy Matrix — Changelog — - Initial skill creation - Core classification and evidence-audit process defined (Agent Harbor binder C5) - Reference files and determinist
- [`README.md`](README.md) — Destructive Action Policy Matrix — Classify every destructive/gated action an agent body can attempt into block/approve/allow tiers, then audit whether the pre-tool and post-t

**`agents/`**
- [`agents/openai.yaml`](agents/openai.yaml) — openai (data/schema)

**`examples/`**
- [`examples/expected-output.md`](examples/expected-output.md) — Example Output: Destructive Action Policy Matrix — Scenario: a first pass at Agent Harbor's C5 governance gate.
- [`examples/sample-input.json`](examples/sample-input.json) — sample input (data/schema)

**`references/`**
- [`references/denial-receipt-and-transcript-envelope.md`](references/denial-receipt-and-transcript-envelope.md) — Denial Receipt And Pre-Tool/Post-Tool Event Envelope — Use this when defining what actually gets emitted when a gated action is blocked or held — the shapes the C5 governance work order calls out
- [`references/destructive-action-taxonomy.md`](references/destructive-action-taxonomy.md) — Destructive Action Taxonomy — Use this when classifying a new action into a category and tier, or when deciding whether an existing classification is still correct after 

**`schemas/`**
- [`schemas/policy-matrix.schema.json`](schemas/policy-matrix.schema.json) — policy matrix.schema (data/schema)

**`scripts/`**
- [`scripts/policy_matrix_audit.mjs`](scripts/policy_matrix_audit.mjs)

**`templates/`**
- [`templates/output-template.md`](templates/output-template.md) — Destructive Action Policy Matrix Template — Fill in one row per destructive/gated action before running the audit.

<!-- END BUNDLE INDEX -->

Files in this skill

  • CHANGELOG.md250 B
  • README.md1.4 KB
  • SKILL.md11.7 KB
  • agents/openai.yaml895 B
  • examples/expected-output.md8.3 KB
  • examples/sample-input.json1.9 KB
  • references/denial-receipt-and-transcript-envelope.md4 KB
  • references/destructive-action-taxonomy.md4.2 KB
  • schemas/policy-matrix.schema.json3.1 KB
  • scripts/policy_matrix_audit.mjs10.6 KB
  • templates/output-template.md1.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…