Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@ and could stop an installed copy from updating.

## [Unreleased]

### Changed

- **keel's "What keel does not do" section now names the heredoc evasion
explicitly.** The list of un-inspected shell constructs already covered
`$()` command substitution, but not the specific `gh pr create` wrapped in
a heredoc'd `$(cat <<'EOF' … EOF)` — the exact form that opened keel's own
first PR past the advisory guard. Naming it makes the deliberate boundary
legible to a reader debugging why a heredoc'd command wasn't classified.
Documentation only; no behavior change (the guard is advisory by design, and
the real gates are server-side).

## [0.8.1] - 2026-07-23

### Fixed
Expand Down
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,11 +215,14 @@ than block on ignorance.
Claude Code session.
- **It does not parse shell constructs adversarially.** `bash -c`, `eval`,
subshells, backticks/`$()`, and other command substitution are not
inspected — deliberately. keel's predecessor tried, and a review of that
code found roughly 20 verified ways to evade its checks while also
producing false positives (e.g. splitting a quoted commit message and
classifying a phantom push). Escalating that arms race isn't worth it: it
buys false confidence without buying real coverage.
inspected — deliberately. A `gh pr create` wrapped in a heredoc'd
`$(cat <<'EOF' … EOF)` slips straight past the guard, and keel's own first
PR was opened exactly that way. That is the design working, not failing:
keel's predecessor tried to close such holes, and a review of that code
found roughly 20 verified ways to evade its checks while also producing
false positives (e.g. splitting a quoted commit message and classifying a
phantom push). Escalating that arms race isn't worth it: it buys false
confidence without buying real coverage.
- **It is not a security control.** It cannot stop someone determined to
evade it, and it is not meant to. Its job is to catch honest mistakes
early, not to gate access.
Expand Down