Repository navigation
chore: Release 0.5.0 - #96
Merged
Merged
Conversation
Set the version to 0.5.0 in pyproject.toml and the lock, and date the 0.5.0 section of CHANGELOG.md, as CONTRIBUTING.md's "Cut a release" says. The section gains install and upgrade notes: the range to pin, the hpc extra's move to hpc-sandbox 0.5.1, the fetch that now locks multi-container Harbor tasks as runnable stacks, the training code's move out of platoon.train.tinker, and the TextCraft extension's release for platoon 0.5. Some entries had fallen behind the work that followed them, and now say what 0.5.0 ships: a compose file with services besides main runs as a stack instead of staying refused; the defaults of TrainerNeeds are told once, in the new feature, since 0.4.0 had no trainer API whose behavior they could change; and the Changes no longer name methods that 0.4.0 never had (TrainStep.advance, _new_stats_logger). Where an entry said that a 0.5.0 API "gains" or "now" does something, it says what the API does, and the blank lines that split the list of new features are gone. The listings that show platoon's version show 0.5.0, the FrontierSmith recipe no longer calls 0.5.0 unreleased, the RAO recipe's requirements name platoon 0.5 and platoon-textcraft 0.4, and CONTRIBUTING.md's example of the extension's release names 0.4.0. No docs mark what is new with "the next release". A minor release also moves every range that names the previous one: the docs, the examples, the first-party extension and the tests' fake extensions now require platoon within 0.5 (>=0.5,<0.6), since platoon 0.5 refuses an extension whose requirement stops below it. No deprecated form is due for removal in 0.5.0, since 0.4.0 deprecated nothing. The module paths that 0.5.0 moved out of platoon.train.tinker go in 0.6.0, and so does the warning of a GroupRolloutWorkflow subclass that defines a method of its startup gate under its name before 0.5.0: CONTRIBUTING.md's check now lists the forms due in 0.6.0, and names that warning. The TextCraft extension needs a release of its own for platoon 0.5: platoon-textcraft 0.4.0, whose platoon extra requires platoon[ors]>=0.5,<0.6. Its code and data are those of 0.3.0, which stays the release for platoon 0.4, as its README now says. It is a minor release, since it moves the platoon it installs to a new minor release. Its tag follows platoon's once platoon 0.5.0 is on PyPI.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request releases platoon 0.5.0, following CONTRIBUTING.md's "Cut a release", and readies the TextCraft
extension's release for it,
platoon-textcraft0.4.0. It holds the release commit alone, onmainafter every pullrequest of 0.5.0 has merged. Once it merges, the tag
v0.5.0on its merge commit publishes platoon 0.5.0 to PyPI.What 0.5.0 contains
What merged since 0.4.0, as CHANGELOG.md's 0.5.0 section lists it:
sandbox (feat: Add the compose subset for Harbor tasks, and run main-only compose files #57); the stack layer and the
processprovider's stacks (feat: Run multi-container Harbor tasks: the stack layer and the process provider #58); stacks asdocker composeprojects(feat: Run Harbor stacks with docker compose #66), as rootless pods on Singularity, Apptainer and enroot (feat: Run Harbor stacks as pods on Singularity, Apptainer and enroot #67, experimental), and on the host network where
pods cannot run (feat: Add the host-network fallback for Harbor stacks #75); hpc-sandbox 0.5.1 for the
hpcextra, and fetches that lock stacks as runnable (feat: Require hpc-sandbox 0.5.1, and lock fetched stacks as runnable #71); atask's MCP servers served through the tool plane, a stack's among them (feat: Serve task MCP servers through the tool plane #74).
name through fakeroot (feat: Honor [agent].user and [verifier].user through fakeroot #68), and node services with the FrontierSmith recipe (feat: Add node services and the FrontierSmith recipe #95).
run (refactor: Move the training code into packages named after the stages of a run #62, refactor: Decompose the training loop into the stages of one step #69, refactor: Decompose the long functions of the trainer, the group workflow and the workers #70, refactor: Clean up the training code #82, refactor: Finish cleaning up the training code #90; the old
platoon.train.tinkerpaths warn until 0.6.0), the workflow contract (refactor: Write down the workflow contract #76),policy objects (refactor: Hold each model's state in a policy object #77), learners and objectives (refactor: Update a policy through a learner and an objective #78), one lifecycle for every trainer (refactor: Run every trainer through one lifecycle #79), the rollout source
(refactor: Draw rollouts through a rollout source #80), the SFT trainer (feat: Add the SFT trainer #81), step hooks (feat: Let a trainer add work at the end of each step #86), per-datum stale masks (feat: Mask stale tokens per datum #83), credit estimators (feat: Add credit estimators #84), several
policies and frozen scorers (feat: Sample several policies, and score with frozen ones #88), a tool allowlist per agent role (feat: Add a tool allowlist per agent role #89), policies trained in lockstep (feat: Train several policies in lockstep #91) and on
their own clocks (feat: Let each policy step on its own clock #94).
processsandbox reap waits for the processes it kills (fix: Make a process sandbox reap wait for the processes it kills #73), and a checkpoint key that a row alreadyholds is refused (fix: Refuse checkpoint keys that a row already holds #92).
in the package.
What changes
pyproject.tomlanduv.lock: version 0.5.0. The lock recordsplatoon-textcraft0.4.0 too; nothing else in itmoves.
CHANGELOG.md:## 0.5.0 (unreleased)becomes## 0.5.0 (2026-10-29), the day (UTC) the tag is to land (shouldthe merge slip past that day, date it again first: the Release workflow checks only that the heading has a date).
The section gains install and upgrade notes: the upgrade commands, moving a pinned range to 0.5 (and how to load an
extension that does not admit 0.5 yet), the
hpcextra's move to hpc-sandbox 0.5.1, the fetch that now locksmulti-container tasks as runnable (and how to keep them refused), the training code's move out of
platoon.train.tinker, a restart of a run that is training, and the TextCraft extension's release for 0.5. Theintro's example range names 0.5.
CHANGELOG.md, entries brought up to what 0.5.0 ships, where later pull requests overtook them: a compose filewith services besides
mainruns as a stack, where the entry said such stacks stay refused; the defaults ofTrainerNeedsare told once, in the new feature, instead of as a change to 0.4.0's trainer API, which did notexist; the Changes no longer name methods that 0.4.0 never had (
TrainStep.advance,_new_stats_logger); entriesthat said a 0.5.0 API "gains" or "now" does something say what it does; the FrontierSmith entry is reworded and
rewrapped; and blank lines no longer split the list of new features.
>=0.5,<0.6):README.md's install line, CHANGELOG.md's intro, CONTRIBUTING.md's sections on extensions, versions and the TextCraft
extension, the install guide, the extension guides (
docs/extending/index.mdandpublish-a-package.md), the twoexample packages, the TextCraft extension and its README, and the fake extensions of the tests
(
tests/extension_site.pyand three tests), which platoon 0.5 would otherwise refuse. The changelog's earliersections keep their ranges.
platoon harness listandplatoon extensions listshow 0.5.0; the FrontierSmith recipenames platoon 0.5.0 without "(unreleased)"; the RAO recipe's requirements name platoon 0.5 and
platoon-textcraft0.4; and CONTRIBUTING.md's example of the extension's release names 0.4.0. No docs say "the next release".
grep -rn 'removed_in="0.5.0"' platoonfinds none). The module paths that 0.5.0 moved out ofplatoon.train.tinkergo in 0.6.0, and so does thewarning of a
GroupRolloutWorkflowsubclass that defines a method of its startup gate under its name before 0.5.0;CONTRIBUTING.md's check now lists the forms due in 0.6.0 and names that warning.
platoon-textcraft0.4.0: itsplatoonextra requiresplatoon[ors]>=0.5,<0.6, so thatplatoon-textcraft[platoon]installs beside platoon 0.5. Its code and data are those of 0.3.0, which stays therelease for platoon 0.4; its README says how to install the release for platoon 0.4, 0.3 or 0.2. It is 0.4.0, not
0.3.1, because a patch release only fixes bugs and this one moves the platoon it installs to a new minor release.
After the merge
v0.5.0on the merge commit, on the day the changelog dates (2026-10-29, UTC). The Release workflow checksthat the commit is on
mainand that CHANGELOG.md dates 0.5.0, builds and checks both distributions, and uploadsplatoon.
platoon-textcraft-v0.4.0on the same commit publishesplatoon-textcraft0.4.0. Not earlier: itsplatoonextra cannot be installed until platoon 0.5.0 is there. Notmuch later either: until it is on PyPI, the changelog's second upgrade command, which names
platoon-textcraft[platoon], does not resolve.as v0.4.0's.
Checks
mainwith every pull request of 0.5.0: lint; the tests on Python 3.12, 3.13 and 3.14 (8765 passed and 253 skipped on
each, and the 2 serial tests), with
uv lock --check, the generated reference, the public API snapshot and a cleantree after the tests on 3.12; the TextCraft extension's tests (38 passed, 6 skipped); the recipes (33 passed); and
the release workflow's build and checks: the sdist and the wheel of platoon 0.5.0 and of
platoon-textcraft0.4.0pass
twine check --strict, the wheel'splatoon --versionprints 0.5.0, itsplatoon harness listmatches thedocs' listing, and the TextCraft wheel serves its environments alone, without platoon. All pass.
[tinker,ors,hpc]into a fresh virtual environment outside the checkout (whichresolves hpc-sandbox 0.5.1):
platoon --versionprints 0.5.0,import platoon, platoon.experimentalimports fromthe installed package, and
platoon config validatepasses on the number-search example'strain.yamlandeval.yaml.tests/train/parity): 27 passed.uv lockmoved only platoon (0.4.0 to 0.5.0) and platoon-textcraft (0.3.0 to 0.4.0).mainbefore this commit passed CI with all of 0.5.0's pull requests merged.