Skip to content

chore: release 0.4.0 - #80

Merged
higagan merged 1 commit into
mainfrom
chore/release-0.4.0
Oct 19, 2026
Merged

higagan merged 1 commit into
mainfrom
chore/release-0.4.0

Conversation

@higagan

@higagan higagan commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Prepares 0.4.0. Merging this does not publish anything — see "Not done" below.

Why a minor bump

New public API (ShellCommandAllowList, NoDangerousShellPatterns, SecretPatternFilter, Violation.category, ModelFuzzBlockError.category, scan --attacker-model) plus a deliberate behaviour change: URLAllowList detection is stricter, so single-slash URLs, file:/data:/javascript:/mailto: forms and protocol-relative //host that used to pass are now blocked. 0.4.0 rather than 0.3.10 signals that.

The release matters more than the features

The fixes from #75 affect every earlier release, not just unreleased code: URLAllowList failed open on http:/evil.com, file:/etc/passwd, javascript:, bytes URLs and NUL-in-host; @shield_tool skipped **kwargs keys; and block reasons wrote basic-auth passwords into the audit log. PyPI is at 0.3.9 with all of those open. The changelog leads with this.

Changes

  • pyproject.toml / uv.lock: 0.3.9 → 0.4.0
  • CHANGELOG.md: the [Unreleased] section was a development journal, including entries narrating bugs that only ever existed on an unreleased branch (the shell allowlist's env-assignment hole never reached PyPI). Rewritten as release notes: security fixes that affect shipped versions first, then new features, docs, CI, with the behaviour change called out.

Verified (beyond CI)

  • uv lock --check clean; ruff, mypy --strict, 359 tests pass
  • Built the sdist and wheel and installed the wheel into a clean venv, then ran the existing smoke-test body plus this release's fixes against the installed package: http:/evil.com, file:/etc/passwd, //evil.com, bytes URLs, NUL-in-host, **kwargs-key and GIT_SSH_COMMAND= bypasses all blocked; CLI --version prints 0.4.0; py.typed present
  • sdist hygiene check (the workflow's own): no .claude/.env/__pycache__, py.typed and AGENTS.md present

Not done — deliberately

Tagging and uploading to PyPI are outward-facing and hard to undo (PyPI versions are permanent), so I stopped here. Suggested order:

  1. Merge ci: make the smoke test check the version it was triggered for #79 first so the post-publish smoke test checks the right version.
  2. Merge this.
  3. Upload 0.4.0 to PyPI, then push tag v0.4.0 — or the reverse; the smoke test now retries while PyPI indexes, so either order works.
  4. Create the GitHub release (the "Latest" label still points at v0.3.7).
  5. Consider a GitHub security advisory for 0.3.x given the first section above.

🤖 Generated with Claude Code

Adds ShellCommandAllowList, NoDangerousShellPatterns, SecretPatternFilter,
Violation.category and scan --attacker-model, and ships the URLAllowList and
@shield_tool bypass fixes from the full-library audit, which affect every
earlier release.

The Unreleased changelog was a development journal and narrated bugs that
existed only on an unreleased branch. Rewritten as release notes, with the
fixes that affect shipped versions separated from the new features, and the
behaviour change called out.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@higagan
higagan merged commit f4dfd3c into main Oct 19, 2026
5 checks passed
@higagan
higagan deleted the chore/release-0.4.0 branch October 19, 2026 09:10
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.

1 participant