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
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ implements (`SPEC_VERSION`; README, "Version").

The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions use
PEP 440 spelling: a release is spelled as in SemVer (`1.0.0`), a release candidate
differently (SemVer's `1.0.0-rc.7` is `1.0.0rc7` here).
differently (SemVer's `1.1.0-rc.1` is `1.1.0rc1` here).

## [Unreleased]

Expand Down Expand Up @@ -38,7 +38,7 @@ A patch of the package. Specification `1.0.0` is unchanged (README, "Version").

## [1.0.0] - 2026-10-14

### Upgrading from 1.0.0rc7
### Changes in 1.0.0

The package follows specification `1.0.0`. `pip install agentic-system-core` installs it
without `--pre`, and `agsc --version` prints `agsc 1.0.0 (Python package; specification
Expand Down
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ pip install agentic-system-core
```

This installs the latest release. A release candidate of a later version is
installed only when asked for, with `--pre` or by naming its version. The two
`0.0.x` versions on PyPI only reserved the name, contain no code and are yanked,
so pip never picks them.
installed only when asked for, with `--pre` or by naming its version.

Python 3.9 or newer; every release is tested on 3.9, 3.13 and 3.14. Python 3.9
reached its end of life in October 2025 and is still supported by this release.
Expand Down
6 changes: 6 additions & 0 deletions docs/MAINTAINING.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@ before this package's tag is pushed; it exists for every engine release, while a
specification tag exists only when the specification moved. The version in `pyproject.toml` must be the engine's version in PEP 440
spelling; the engine's `tools/release` checks that the two agree.

To roll back a bad release, yank that version on PyPI (project page, "Manage",
the release, "Options", "Yank"): pip then stops choosing it, but anyone who pins it still gets it. Never
delete it. Fix the cause and release the next patch version through the same lane
(for example `1.0.2` after a bad `1.0.1`), and add a line to `CHANGELOG.md` under the
new version that names the yanked one and why.

Before tagging, write the new version in every place that carries it: `pyproject.toml`,
`__version__` and `SEMVER_VERSION` in `src/agentic_system_core/__init__.py`, the
"Version" section of the README, and a heading in `CHANGELOG.md`. `tests/test_cli.py`
Expand Down
4 changes: 2 additions & 2 deletions tests/test_ci_workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,12 +174,12 @@ def test_the_release_runs_the_test_lane_at_the_derived_engine_tag():
@pytest.mark.skipif(sys.version_info < (3, 11), reason="the release step reads pyproject.toml "
"with tomllib, which Python 3.11 and later ship")
@pytest.mark.parametrize("version, tag, engine", [
("1.0.0rc7", "v1.0.0rc7", "v1.0.0-rc.7"),
("1.2.0rc1", "v1.2.0rc1", "v1.2.0-rc.1"),
("1.0.0", "v1.0.0", "v1.0.0"),
("1.0.0.post1", "v1.0.0.post1", "v1.0.0"),
("1.0.1", "v1.0.1", "v1.0.1"),
("1.1.0rc2.post3", "v1.1.0rc2.post3", "v1.1.0-rc.2"),
("1.0.0", "v1.0.0rc7", None),
("1.0.0", "v1.0.0rc1", None),
("1.0.0a1", "v1.0.0a1", None),
("1.0.0.dev1", "v1.0.0.dev1", None),
("1.0", "v1.0", None),
Expand Down
7 changes: 7 additions & 0 deletions tests/test_newcomer_surface.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ def test_a_final_version_installs_with_a_plain_pip_install():
assert not re.search(r"\b\d+\.\d+\.\d+rc\d+\b", text), "the README names a release-candidate version"


def test_the_public_text_names_no_pre_release_history():
for name in ("README.md", "CHANGELOG.md"):
text = (ROOT / name).read_text(encoding="utf-8")
assert "0.0.x" not in text, name
assert not re.search(r"1\.0\.0-?rc\.?\d", text), name


CHANGELOG_URL = "https://github.com/andreibesleaga/agentic-system-core-python/blob/main/CHANGELOG.md"


Expand Down