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
10 changes: 5 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
# Changelog

## Unreleased
## 0.4.0 (2026-09-24)

### Analysis

- The module body and the bodies of top-level classes are analysed as the functions `<module>` and `Cls.<body>`: their calls are call sites, their values carry taint, and an advisory entry point called at import time or in a class body is reachable. Coverage counts them; the cache format is bumped so cached results gain their findings (#113).

### Dependencies

- Advisories distinguish the `affected_symbols` a fix changed from the public `entry_points` through which they are reached, each justified and carrying `conditions` (checkable argument values, or `semantic` ones kept as pending review); `modules` names what the package installs. Every dependency finding records its evidence `level`: `declared`, `imported`, `reachable` or `exploitable`.
- A call to an API affected by several advisories of the pinned release reports every one of them, not the first listed.
- One advisory per identifier and package: a later contributor replaces an earlier one, so a curated feed refines the bundled sample, and the sample names the modules its packages install.
- A version specifier may be a union of ranges separated by `||`, as an advisory over several release series needs (`>=4.2,<4.2.28 || >=5.2,<5.2.11`); the OSV import produces one such advisory per package instead of one per range.
- Advisories distinguish the `affected_symbols` a fix changed from the public `entry_points` through which they are reached, each justified and carrying `conditions` (checkable argument values, or `semantic` ones kept as pending review); `modules` names what the package installs. Every dependency finding records its evidence `level`: `declared`, `imported`, `reachable` or `exploitable` (#109).
- A call to an API affected by several advisories of the pinned release reports every one of them, not the first listed (#109).
- One advisory per identifier and package: a later contributor replaces an earlier one, so a curated feed refines the bundled sample, and the sample names the modules its packages install (#109).
- A version specifier may be a union of ranges separated by `||`, as an advisory over several release series needs (`>=4.2,<4.2.28 || >=5.2,<5.2.11`); the OSV import produces one such advisory per package instead of one per range (#112).

### Plugins

Expand Down
2 changes: 1 addition & 1 deletion docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ the directory of the checked file; a path outside it is printed as it is.
```json
{
"schema_version": 1,
"tool": {"name": "coretrace-python-analyzer", "version": "0.3.0"},
"tool": {"name": "coretrace-python-analyzer", "version": "0.4.0"},
"root": "/home/me/project",
"findings": [
{
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "coretrace-python-analyzer"
version = "0.3.0"
version = "0.4.0"
description = "Static security analysis infrastructure for Python code"
readme = "README.md"
requires-python = ">=3.11"
Expand Down
2 changes: 1 addition & 1 deletion src/coretrace_python/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""CoreTrace's Python static analysis frontend."""

__version__ = "0.3.0"
__version__ = "0.4.0"

2 changes: 1 addition & 1 deletion tests/test_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def require_changelog() -> None:
def test_the_version_is_declared_once_and_mirrored() -> None:
project = tomllib.loads((REPO / "pyproject.toml").read_text(encoding="utf-8"))["project"]

assert project["version"] == coretrace_python.__version__ == "0.3.0"
assert project["version"] == coretrace_python.__version__ == "0.4.0"


def test_the_changelog_starts_with_the_current_version() -> None:
Expand Down
Loading