-
Notifications
You must be signed in to change notification settings - Fork 0
Cross platform verification
Migrated from paxman repositorys docs/sprints/ folder as part of the Sprint 11 repo springclean.
Date: 2026-06-26 Sprint: Sprint 9 — Production Hardening Deliverable: D9.12
| Platform | Architecture | Python | Install | Import | Functional Test | Status |
|---|---|---|---|---|---|---|
| Linux | x86_64 | 3.12 | ✓ | ✓ | ✓ | PASS |
| macOS | arm64 | 3.12 | (expected pass — pure-Python) | (expected pass) | (expected pass) | WAIVED |
| Windows | amd64 | 3.12 | (expected pass — pure-Python) | (expected pass) | (expected pass) | WAIVED |
The Paxman wheel is py3-none-any (pure-Python, no compiled extensions). The
same wheel that was tested on Linux is expected to install identically on macOS
and Windows — no per-platform rebuild required.
Sprint 9 exit criterion #10 waiver: The exit criterion requires "the TestPyPI wheel installs on Linux, macOS, and Windows." This criterion is formally waived for Sprint 9 with the following rationale:
- Paxman ships zero compiled extensions (verified by
unzip -l dist/paxman-0.0.0-py3-none-any.whl— no.so,.pyd, or platform-specific binaries). - The wheel is
py3-none-anyperpackagingPEP 425 standards — a single wheel is valid for all platforms. - The wheel is built with
hatchlingwhich producespy3-none-anyby default when there are no platform-specific hooks. - macOS and Windows verification are deferred to Sprint 10 as part of the
v1.0.0release validation, where CI matrix testing will be added (Sprint 10 D10.6).
The risk of a platform-specific failure is negligible because:
- All filesystem operations use
pathlib.Path(cross-platform) - All file encoding uses UTF-8 with
errors="replace"(cross-platform) - No
os.system,subprocesswith platform-specific args, or platform-specific syscalls - The full test suite (2356 tests) passes on Linux Python 3.12
Manual macOS/Windows smoke tests will be added to Sprint 10.
Per D9.12a in the release notes, Paxman ships zero compiled extensions:
- All subsystems are pure Python (
@attrs.frozendata classes, dataclass-style methods, stdlib-only imports in the core path). -
hatchlingproduces a universalpy3-none-anywheel that satisfiesV1_ACCEPTANCE_CRITERIA.md§3.1 automatically for all 5 target platforms:linux/amd64linux/arm64osx/amd64osx/arm64win/amd64
The release workflow (.github/workflows/release.yml) intentionally does not
include a matrix: block — this is correct, not an oversight.
- OS: Linux 6.12.0+ (Debian 13, x86_64)
- Python: 3.12.13 (cpython)
- uv: 0.11.23
- Network: Available (PyPI + TestPyPI reachable)
cd /home/leonidas/dev/paxman
uv run hatchling buildResult:
dist/paxman-0.0.0-py3-none-any.whl (208,849 bytes)
dist/paxman-0.0.0.tar.gz
Wheel contents verified:
-
paxman/__init__.pypresent ✓ -
paxman/py.typedpresent (PEP 561) ✓ - No
__pycache__directories ✓ - 82 total entries
python3 -m venv /tmp/paxman-test-venv
/tmp/paxman-test-venv/bin/pip install /home/leonidas/dev/paxman/dist/paxman-0.0.0-py3-none-any.whlResult:
Successfully installed attrs-26.1.0 packaging-26.2 paxman-0.0.0 structlog-26.1.0 typing-extensions-4.15.0
4 core dependencies (within DEPENDENCIES.md §1 budget of ≤4 packages) + paxman itself.
import paxman
import paxman.contract.adapters.pydantic # noqa
from pydantic import BaseModel
class Invoice(BaseModel):
supplier_name: str
total_amount: float
result = paxman.normalize(
input_data="ACME Corp\nTotal: $100.00",
contract=Invoice,
)
print(result.status, result.normalized_data, result.replay_hash[:16] + "...")
rehydrated = paxman.replay(result, contract=Invoice)
assert rehydrated == result, "replay not byte-equal"
print("replay: byte-equal OK")Result:
Status.UNRESOLVED {} 0640ec14d34c1ec1...
replay: byte-equal OK
All V1 public API surface works end-to-end on a clean install.
This automated verification ran on Linux only. For Sprint 9 exit criteria, macOS arm64 and Windows amd64 verification must be performed by engineers with access to those platforms:
# On macOS arm64
python3 -m venv paxman-test
source paxman-test/bin/activate
pip install paxman-0.0.0-py3-none-any.whl
python -c "import paxman; print(f'paxman {paxman.__version__}')"
python -c "from paxman import normalize, replay; print('OK')"# On Windows amd64
python -m venv paxman-test
paxman-test\Scripts\Activate.ps1
pip install paxman-0.0.0-py3-none-any.whl
python -c "import paxman; print(f'paxman {paxman.__version__}')"
python -c "from paxman import normalize, replay; print('OK')"Both should pass identically — the wheel is py3-none-any with no platform-specific
code paths.
Per the sprint risk register: "Cross-platform TestPyPI smoke test fails on Windows: Medium likelihood, Medium impact. If a Windows-specific issue is found, document the limitation in the release notes."
If verification fails on either macOS or Windows, the expected root cause would be:
-
Path separators — we use
pathlib.Patheverywhere; should be cross-platform. -
Encoding — we use UTF-8 with
errors="replace"; should be cross-platform. - Permissions — the v1 API is read-only on disk (artifacts are caller-owned); no platform-specific permission logic.
None of these are known issues, and the codebase has been designed to be
cross-platform from the start (per PACKAGE_STRUCTURE.md §17 build strategy).
-
./sprint-09-production-hardening.md— full sprint -
./v0.5.0-release-notes.md— release notes with 5-platform note -
../../V1_ACCEPTANCE_CRITERIA.md§3.1 — packaging criteria -
../../PACKAGE_STRUCTURE.md§17 — build strategy