Skip to content
This repository was archived by the owner on Aug 12, 2026. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
41f0a12
v0.2.125
ggelango May 1, 2026
fe59781
harness
ggelango May 9, 2026
d490393
multi_env_listp
ggelango May 9, 2026
806aac1
harness
ggelango May 9, 2026
ebf6cfa
client
ggelango May 9, 2026
3f1d024
fixes
ggelango May 9, 2026
1b452d0
Update claw_harness.py
ggelango May 9, 2026
819361f
Update claw_harness.py
ggelango May 9, 2026
e527364
Update claw_harness.py
ggelango May 9, 2026
bb619b3
Create browser_harness.py
ggelango May 9, 2026
7715d7b
Update browser_harness.py
ggelango May 9, 2026
b16254c
Update browser_harness.py
ggelango May 9, 2026
e871a3b
Update browser_harness.py
ggelango May 9, 2026
adfbdf0
Update browser_harness.py
ggelango May 9, 2026
b18ea5f
Update claw_harness.py
ggelango May 9, 2026
5433b7b
Create requirements.txt
ggelango May 9, 2026
9442ab8
harnessess
ggelango May 9, 2026
b8e9118
0.2.126
ggelango May 9, 2026
7d24cfe
v0.2.127
ggelango May 13, 2026
d9776e3
Add async polling option to verifier execute path
ggelango Jun 18, 2026
bc8ddef
v0.2.129
ggelango Jun 18, 2026
6adfcf9
PLAT-399: propagate verifier cost team attribution (#134)
andrew-stelmach-fleet Jul 13, 2026
7a8447d
feat(create): dedicated create timeout, wait declaration, duplicate-r…
omar-fleet Jul 17, 2026
5927733
0.2.131
omar-fleet Jul 17, 2026
5b4b3ec
PLAT-423: release verifier judge cost-team propagation as v0.2.132 (#…
andrew-stelmach-fleet Jul 17, 2026
0e6ff73
feat: reconcile fleet-python 0.2.132 into main (PLAT-424)
andrew-stelmach-fleet Jul 18, 2026
a689de2
ci: automate high-assurance SDK releases (PLAT-424)
andrew-stelmach-fleet Jul 18, 2026
bd02bae
fix: bound verifier polling and prevent runner deadlock (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
abec08f
test: normalize styled CLI output in CI (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
41090c6
ci: validate full supported Python range (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
1bbf8aa
ci: align release automation with uv guidance (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
6ccf4d0
ci: use published action versions (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
fe62d33
fix: isolate bare in-memory resources (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
d3a1608
fix: restore lazy instance resource APIs (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
6969c02
ci: require WarpBuild runners (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
36f3e85
docs: require WarpBuild for SDK automation (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
e019599
ci: use available GitHub-hosted runners (PLAT-424)
andrew-stelmach-fleet Jul 20, 2026
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
60 changes: 60 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: SDK CI

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

concurrency:
group: sdk-ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: Test (Python ${{ matrix.python-version }})
runs-on: warp-ubuntu-latest-x64-4x
Comment thread
andrew-stelmach-fleet marked this conversation as resolved.
Outdated
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- uses: astral-sh/setup-uv@v8.3.2
with:
enable-cache: true
- run: uv sync --extra dev --extra cli --locked
- run: uv run --locked pytest

package:
name: Build and inspect distributions
runs-on: warp-ubuntu-latest-x64-4x
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- uses: astral-sh/setup-uv@v8.3.2
with:
enable-cache: true
- run: uv build --no-sources
- run: uvx twine check dist/*
- name: Verify package metadata
run: |
VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
python scripts/validate-release-artifacts.py --version "$VERSION"
- name: Smoke-test the wheel and source distribution
run: |
uv run --isolated --no-project --with dist/*.whl python -c "import fleet; print(fleet.__version__)"
uv run --isolated --no-project --with dist/*.tar.gz python -c "import fleet; print(fleet.__version__)"
- uses: actions/upload-artifact@v7
with:
name: fleet-python-sdk-dist-${{ github.sha }}
path: dist/
if-no-files-found: error
retention-days: 14
69 changes: 0 additions & 69 deletions .github/workflows/publish-fleet-sdk.yml

This file was deleted.

113 changes: 113 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
name: Release Fleet Python SDK

on:
push:
branches: [main]

permissions:
contents: write
issues: write
pull-requests: write

concurrency:
group: fleet-python-release
cancel-in-progress: false

jobs:
release_please:
runs-on: warp-ubuntu-latest-x64-4x
outputs:
release_created: ${{ steps.release.outputs.release_created }}
tag_name: ${{ steps.release.outputs.tag_name }}
version: ${{ steps.release.outputs.version }}
release_sha: ${{ steps.release.outputs.sha }}
Comment thread
cursor[bot] marked this conversation as resolved.
steps:
- id: release
uses: googleapis/release-please-action@v5
with:
# A GitHub App/PAT token is required so the bot's release PR runs CI.
token: ${{ secrets.RELEASE_PLEASE_TOKEN }}
config-file: release-please-config.json
manifest-file: .release-please-manifest.json

test-build-publish:
if: ${{ needs.release_please.outputs.release_created == 'true' }}
needs: release_please
runs-on: warp-ubuntu-latest-x64-4x
environment: pypi
Comment thread
cursor[bot] marked this conversation as resolved.
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.release_please.outputs.release_sha }}
fetch-depth: 0
- name: Fetch canonical main and release tag
run: git fetch --force origin "main:refs/remotes/origin/main" "refs/tags/${{ needs.release_please.outputs.tag_name }}:refs/tags/${{ needs.release_please.outputs.tag_name }}"
- name: Validate tag, version, and main ancestry
run: scripts/validate-release-tag.sh "${{ needs.release_please.outputs.tag_name }}"
- uses: actions/setup-python@v6
with:
python-version: "3.12"
Comment thread
cursor[bot] marked this conversation as resolved.
- uses: astral-sh/setup-uv@v8.3.2
with:
enable-cache: true
- name: Run the full SDK suite at the tagged commit
run: |
uv sync --extra dev --extra cli --locked
uv run --locked pytest
- name: Build the publishable artifacts once
run: uv build --no-sources
- run: uvx twine check dist/*
- name: Verify exact artifact versions
run: python scripts/validate-release-artifacts.py --version "${{ needs.release_please.outputs.version }}"
- uses: actions/upload-artifact@v7
with:
name: fleet-python-${{ needs.release_please.outputs.version }}
path: dist/
if-no-files-found: error
retention-days: 90
- name: Publish the tested artifacts through PyPI Trusted Publishing
uses: pypa/gh-action-pypi-publish@v1.14.1
with:
packages-dir: dist/

finalize-github-release:
if: ${{ needs.release_please.outputs.release_created == 'true' }}
needs: [release_please, test-build-publish]
runs-on: warp-ubuntu-latest-x64-4x
permissions:
contents: write
steps:
- uses: actions/download-artifact@v8
with:
name: fleet-python-${{ needs.release_please.outputs.version }}
path: dist/
- name: Attach artifacts and publish the draft GitHub release
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ needs.release_please.outputs.tag_name }}
run: |
gh release upload "$RELEASE_TAG" dist/* --clobber --repo "$GITHUB_REPOSITORY"
gh release edit "$RELEASE_TAG" --draft=false --verify-tag --repo "$GITHUB_REPOSITORY"

notify-internal-consumers:
if: ${{ needs.release_please.outputs.release_created == 'true' }}
needs: [release_please, finalize-github-release]
runs-on: warp-ubuntu-latest-x64-4x
steps:
- name: Request a separate Theseus consumer update PR
env:
GH_TOKEN: ${{ secrets.FLEET_SDK_CONSUMER_TOKEN }}
VERSION: ${{ needs.release_please.outputs.version }}
TAG: ${{ needs.release_please.outputs.tag_name }}
run: |
if [ -z "$GH_TOKEN" ]; then
echo "::error::FLEET_SDK_CONSUMER_TOKEN must be configured for cross-repository updates"
exit 1
fi
gh api --method POST repos/fleet-ai/theseus/dispatches \
-f event_type=fleet-sdk-released \
-f "client_payload[version]=$VERSION" \
-f "client_payload[tag]=$TAG"
4 changes: 4 additions & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
".": "0.2.132"
}

20 changes: 6 additions & 14 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help install-dev build test clean publish-to-pypi validate-tag unasync
.PHONY: help install-dev build test clean validate-tag unasync release-help

# Use the active Python interpreter (python3 preferred, fallback to python)
PYTHON ?= $(shell command -v python3 || command -v python)
Expand All @@ -11,7 +11,7 @@ help:
@echo "test Run tests"
@echo "clean Clean build artifacts"
@echo "validate-tag Validate release tag format"
@echo "publish-to-pypi Publish package to PyPI"
@echo "release-help Show the automated release process"
@echo "unasync Generate sync code from async sources"

install-dev:
Expand Down Expand Up @@ -81,18 +81,10 @@ validate-tag:
fi
./scripts/validate-release-tag.sh $(TAG)

publish-to-pypi: build
@echo "⚠️ Warning: Direct publishing is deprecated for security reasons"
@echo "🔒 Recommended: Use GitHub Actions workflow with OIDC authentication"
@echo "📋 To publish via GitHub Actions:"
@echo " 1. Ensure PyPI Trusted Publisher is configured"
@echo " 2. Create release tag: git tag fleet-python-v<VERSION>"
@echo " 3. Push tag: git push origin fleet-python-v<VERSION>"
@echo ""
@echo "Proceeding with direct upload in 5 seconds..."
@sleep 5
twine check dist/*
twine upload dist/*
release-help:
Comment thread
cursor[bot] marked this conversation as resolved.
@echo "Fleet SDK releases are automated from protected main."
@echo "Merge the reviewed Release Please PR; do not create or push tags manually."
@echo "See docs/releases.md for gates, configuration, retry, and rollback guidance."

# Local development
dev-setup: install-dev
Expand Down
24 changes: 24 additions & 0 deletions docs/releases.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Fleet Python SDK releases

Fleet SDK releases originate only from protected `main`.

1. Release Please opens or updates a release PR containing the version bump and `CHANGELOG.md`.
2. Required SDK CI tests Python 3.9–3.14 and builds, inspects, installs, and retains the wheel and sdist.
3. Merging the approved release PR makes Release Please create the immutable `fleet-python-vX.Y.Z` tag and a draft GitHub release.
4. The release workflow checks out that exact commit, proves the tag is on `origin/main`, reruns the full suite, builds once, verifies both artifact versions, and publishes those files through the protected `pypi` environment using OIDC Trusted Publishing.
5. Only after PyPI succeeds does automation attach the artifacts, publish the GitHub release, and dispatch a separate Theseus consumer-update PR.

## Required repository configuration

- Protect `main` and require all `SDK CI` jobs plus review approval.
- Admit `fleet-ai/fleet-sdk` to the WarpBuild runner group. CI and release workflows require `warp-ubuntu-latest-x64-4x` directly and intentionally do not fall back to GitHub-hosted runners.
- Configure the `pypi` GitHub environment with required reviewers and PyPI Trusted Publisher subject `fleet-ai/fleet-sdk`, workflow `.github/workflows/release.yml`, environment `pypi`.
- Set `RELEASE_PLEASE_TOKEN` to a narrowly scoped GitHub App token or fine-grained PAT that can update release PRs and contents. The bot-authored PR must trigger required CI.
- Set `FLEET_SDK_CONSUMER_TOKEN` to a narrowly scoped token allowed only to dispatch the `fleet-sdk-released` event to `fleet-ai/theseus`.

## Failure and retry policy

- A failed test, build, metadata check, environment approval, or PyPI upload leaves the GitHub release in draft. Fix forward; do not move or recreate the immutable tag.
- PyPI versions are immutable. If PyPI accepted the files but a later GitHub/consumer step failed, rerun only the failed job or finalize the existing draft release; do not republish the version.
- If failure happens before PyPI accepts the files, rerun the failed workflow job at the same tagged SHA. The retained workflow artifact is evidence; the publish job still rebuilds and verifies from the tag before uploading.
- To roll back a defective release, publish a new patch release. Never delete or retarget a published tag.
8 changes: 7 additions & 1 deletion fleet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
)
from .client import Fleet, SyncEnv, Session
from ._async.client import AsyncFleet, AsyncEnv, AsyncSession
from .browser import BrowserLease, host_from_url
from ._async.browser import AsyncBrowserLease
from .models import InstanceResponse, Environment, Run
from .instance.models import Resource, ResetResponse

Expand Down Expand Up @@ -79,14 +81,18 @@
from . import global_client as _global_client
from ._async import global_client as _async_global_client

__version__ = "0.2.124"
__version__ = "0.2.132" # x-release-please-version

__all__ = [
# Core classes
"Fleet",
"SyncEnv",
"AsyncFleet",
"AsyncEnv",
# Browser lease (orchestrator-managed /v1/browser)
"BrowserLease",
"AsyncBrowserLease",
"host_from_url",
# Models
"InstanceResponse",
"SyncEnv",
Expand Down
2 changes: 1 addition & 1 deletion fleet/_async/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
from .. import env
from . import global_client as _async_global_client

__version__ = "0.2.124"
__version__ = "0.2.132" # x-release-please-version

__all__ = [
# Core classes
Expand Down
Loading
Loading