Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ae1c6a2
wip: snapshot of interrupted build track
abrichr Oct 9, 2026
5f8514a
docs: source the referral baseline and state fault-test scope exactly
abrichr Oct 9, 2026
9da008e
chore(metadata): give the PyPI summary the README's plain opening
abrichr Oct 9, 2026
72c53ca
ci: resolve the launcher by name on Python 3.13 and 3.14
abrichr Oct 9, 2026
0d9cfe6
docs: record uv, extras, and Python 3.14 engine findings
abrichr Oct 9, 2026
493c8ce
docs: say what the halted quickstart run leaves for a person
abrichr Oct 9, 2026
767312b
docs: link partners to the Execute page
abrichr Oct 9, 2026
57501b4
fix(quickstart): derive the halted rerun's result from its report
abrichr Oct 9, 2026
1cd626b
docs: list every plain result and map each outcome to one
abrichr Oct 9, 2026
e105747
chore(metadata): say which agent command the base install exposes
abrichr Oct 9, 2026
58f4389
docs: record the 2026-10-09 recheck of the install fix
abrichr Oct 9, 2026
bc45259
ci: pin the Python 3.13/3.14 guard's actions and limit its token
abrichr Oct 10, 2026
9f66706
docs: record the Linux resolution behind the 3.13/3.14 CI guard
abrichr Oct 10, 2026
ad6be41
fix(deploy): stop at the Python check on 3.13 and newer
abrichr Oct 10, 2026
7015868
docs: withdraw the billing-audit case study from the README
abrichr Oct 10, 2026
8e16df5
chore: describe the source-boundary guard without the old incident
abrichr Oct 10, 2026
fcee8b4
chore(lifecycle): repin the Production lifecycle source and name Flow…
abrichr Oct 14, 2026
0334ba8
chore(release): record published openadapt-privacy 1.1.1 in the platf…
abrichr Oct 14, 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
101 changes: 101 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,104 @@ jobs:
! grep -E '/(\.env|\.cache/|[^/]+\.db$|output\.png$|\.claude/|\.worktrees/)' /tmp/openadapt-sdist-files.txt
unzip -l dist/*.whl > /tmp/openadapt-wheel-files.txt
! grep -E '(\.env|\.cache/|[^/]+\.db$|output\.png$|\.claude/|\.worktrees/)' /tmp/openadapt-wheel-files.txt

# pip on Python 3.13 and 3.14 used to skip every current launcher (all
# capped below 3.13) and silently install openadapt 1.3.0, an unrelated
# pre-compiler CLI. The launcher now installs on any Python >=3.10 and keeps
# the engine behind a version marker. This job proves, on the first
# unsupported interpreters, that the built wheel installs without the engine
# and that each engine command prints the Python 3.12 install fix.
unsupported-python-guard:
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
shell: bash
strategy:
matrix:
python-version: ['3.13', '3.14']

steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: ${{ matrix.python-version }}

- name: Build the launcher wheel
run: |
python -m pip install --upgrade pip build
python -m build --wheel

# Installing dist/*.whl directly would hide the original bug, which was
# pip choosing an older release by name. Resolve by name with PyPI in
# view: if this launcher didn't install here, an old release that allows
# this Python (1.3.0 did) would win and the version check would fail.
- name: Resolve openadapt by name and confirm pip picks this launcher
run: |
for spec in openadapt 'openadapt[browser]' 'openadapt[capture]'; do
python -m pip install --dry-run --quiet --find-links dist \
--report resolution.json "$spec"
python - "$spec" <<'PY'
import json
import pathlib
import sys
import tomllib

spec = sys.argv[1]
project = tomllib.loads(pathlib.Path("pyproject.toml").read_text())
expected = project["project"]["version"]
report = json.loads(pathlib.Path("resolution.json").read_text())
chosen = {
item["metadata"]["name"]: item["metadata"]["version"]
for item in report["install"]
}
assert chosen.get("openadapt") == expected, (spec, chosen.get("openadapt"))
for name in ("openadapt-flow", "openadapt-agent"):
assert name not in chosen, (spec, name, chosen[name])
print(f"{spec}: pip chose openadapt {expected} with no engine")
PY
done

- name: Install the wheel and confirm it brings no engine
run: |
python -m pip install dist/*.whl
python - <<'PY'
import pathlib
import tomllib
from importlib.metadata import PackageNotFoundError, version

project = tomllib.loads(pathlib.Path("pyproject.toml").read_text())
expected = project["project"]["version"]
assert version("openadapt") == expected, version("openadapt")
for name in ("openadapt-flow", "openadapt-agent"):
try:
found = version(name)
except PackageNotFoundError:
continue
raise SystemExit(f"{name} {found} must not install on this Python")
print(f"openadapt {expected} installed alone, as intended")
PY

- name: Engine commands print the install fix
run: |
for command in "quickstart --break-it" "flow tutorial" "doctor"; do
read -ra args <<<"$command"
set +e
output=$(openadapt "${args[@]}" 2>&1)
status=$?
set -e
echo "$output"
test "$status" -eq 1
grep -q "uv tool install --python 3.12 openadapt" <<<"$output"
done
help_text=$(openadapt --help)
grep -q "OpenAdapt needs Python 3.10" <<<"$help_text"

- name: Run the Python support tests
run: |
python -m pip install pytest packaging
pytest tests/test_python_support.py -v
Loading
Loading