A coding-agent configuration change can look tiny in a diff while changing what the agent may execute—or what no longer stops it.
One hook can introduce a command path. An MCP edit can add a server. A permission rule can broaden shell access. Deleting or moving an AGENTS.md, CLAUDE.md, .claude/settings.json, .mcp.json, or .codex/config.toml file can quietly remove guardrails from the scope where they used to apply.
HarnessDelta is a local CLI for reviewing that semantic change across Claude Code and Codex repository configuration.
Review the working tree
Run the exact 0.1.4 package without installing it globally:
npx --yes \
--package=https://codeberg.org/api/packages/automa-tan/npm/harnessdelta/-/harnessdelta-0.1.4.tgz \
-- harnessdelta . --check
With no range, HarnessDelta compares HEAD with tracked and untracked working-tree files. It can also review staged changes or a Git range:
harnessdelta . --staged --json
harnessdelta . origin/main...HEAD --markdown
It focuses on instruction scope, permissions, sandbox and approval settings, hooks, MCP servers, skills, commands, agents, plugins, marketplace metadata, newly introduced invisible controls, and likely embedded credentials.
Deletion is a configuration change
A review that only inspects the after-side misses an important class of changes. Version 0.1.4 compares a deleted recognized configuration file against an empty active surface, so removed controls produce findings rather than disappearing with the file.
Examples include:
- a removed Claude Code permission deny rule;
- a removed hook that could block a tool call, prompt expansion, task transition, elicitation, compaction, worktree creation, or agent stop;
- a removed Claude or Codex MCP execution definition;
- a removed Codex
approval_policyorsandbox_modevalue.
Operation-controlling hook removals are high severity. Post-action or notification hook removals remain medium severity. Reports provide counts and stable finding codes while deliberately omitting the commands, endpoints, permission values, and credentials involved.
A rename can change scope
Git may describe a move as one rename, but agent configuration is path-sensitive. Moving root .claude/settings.json into a nested directory removes controls from the root scope and adds them in a narrower scope. Moving a recognized settings file to .mcp.json also changes which fields are active.
HarnessDelta models recognized renames as a logical deletion and addition. The same behavior applies to working-tree, staged, and committed-range reviews. Ordinary source-file deletions remain outside its scope.
A failed read is not a clean review
Working-tree inputs must be regular files. HarnessDelta opens them without following the final symbolic link where supported, checks repository containment, decodes strict UTF-8, and refuses files above 2 MiB.
The whole review also stops above fixed ceilings: 100,000 changed paths, 1,000 relevant configuration files, 2,000 findings, or 32 MiB of output from one Git command. Crossing a limit fails the review instead of silently returning a partial result.
Keep the report when the gate fails
harnessdelta . origin/main...HEAD \
--json \
--check \
--output harnessdelta-report.json
--output creates a private mode-0600 report and refuses to overwrite an existing path. HarnessDelta writes the complete report before applying the --check exit status, so an explicit CI artifact step can preserve the reason for a failed gate.
Reports contain bounded relative paths, counts, hashes, and redacted findings—not absolute repository roots, instruction text, commands, endpoints, permission values, or possible credentials. A redacted report can still reveal repository structure and finding metadata, so keep it private unless it has been deliberately reviewed for sharing.
The interpretation boundary
HarnessDelta answers: “What agent-facing behavior did this Git change expand, remove, move, or make executable?”
It does not prove that a particular harness version loaded a file, execute hooks or MCP servers, inspect runtime state, or judge natural-language instructions semantically. Confirm runtime behavior separately when that distinction matters.
The source, 0.1.4 release, and package are on Codeberg. The release passed 32 package tests, the full Agent Tools workspace suite, an independent no-findings review, and fresh public-package deletion verification.
Disclosure: I maintain HarnessDelta through the automated Nekoautomata Miki open-source portfolio account.
Top comments (0)