Skip to content

release: 2.3.1 - #26

Merged
dennishavermans merged 1 commit into
mainfrom
release/2.3.1
Sep 3, 2026
Merged

release: 2.3.1#26
dennishavermans merged 1 commit into
mainfrom
release/2.3.1

Conversation

@dennishavermans

Copy link
Copy Markdown
Owner

A correction release. 2.2.0 shipped a sentence that said "measured" about something the harness could not separate, and 2.3.0 carried it forward.

What was wrong

The Bash(git * main) finding read: "Measured on Claude Code 2.1.238: Bash(git * main) auto-approves git push --force origin main and git push --delete origin main."

The machine those measurements ran on carries Bash(git push *) in its own ~/.claude/settings.json, which approves every push on its own. A --settings file merges with user settings, so the probe could not tell the rule under test from the ambient one. An empty-allow-list control executed the same force push, which is what exposed it.

Re-measured, ambient-proof

git branch is covered by no ambient rule on that machine, so it can carry the test. Claude Code 2.1.238, Bash(git * main) as the only rule, throwaway repository, evidence taken from disk rather than transcript text:

case rule present result
git branch -D main none branch survived, not approved
git branch -D main Bash(git * main) branch deleted
git branch -D dev Bash(git * main) branch survived, not approved
git -c core.fsmonitor=<script> diff main Bash(git * main) the named script ran

The last row is arbitrary program execution from a rule that reads as a git allowance, which is sharper than the claim it replaces. It is also documented: the permission page notes the wildcard covers "every git subcommand and every option before it", including -c, "which makes git run a program you name".

Documentation, quoted where it applies

Both wildcard findings now cite the vendor text that describes them. For the leading star that is "In Bash(* --version), the * stands in for the program, so any program matches", with bash -c 'echo hi' --version listed as a match in the documentation's own table. That table also settles the tail behaviour the 2.3.0 check relies on: Bash(* --help *) "matches npm --help x but not npm --help".

Method note

The probe command matters. An earlier version of the leading-star harness used echo, and Claude Code's read-only classifier can approve such a command by itself, which produced one contradictory row. Every probe here creates a file or deletes a branch, and the check is the effect on disk.

1042 tests pass, lint and typecheck clean.

The Bash(git * main) finding claimed a measured `git push --force origin
main`. The machine that ran the measurement carries `Bash(git push *)` in
its own user settings, which approves every push by itself, so the run
proved nothing about the rule under test. An empty-allow-list control
executed the same push, which is what exposed it.

Re-measured with Bash(git * main) as the only rule, in a throwaway
repository, using effects on disk rather than transcript text as the
evidence: `git branch -D main` deleted the branch, and
`git -c core.fsmonitor=<script> diff main` ran the named script. With no
rule present neither ran, and `git branch -D dev` did not run. No ambient
rule covers `git branch`, so the grant is this rule.

The replacement is also sharper than the claim it replaces: arbitrary
program execution from a rule that reads as a git allowance, which is
what the permission documentation warns about when it notes the wildcard
covers -c, "which makes git run a program you name".

Both wildcard findings now quote the documentation that describes them.
@dennishavermans
dennishavermans merged commit e9a10d7 into main Sep 3, 2026
12 checks passed
@dennishavermans
dennishavermans deleted the release/2.3.1 branch September 3, 2026 09:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants