Beta cycle ran one week with no integrator-reported regressions across
the parity surface (live Base Sepolia: 11/12 green; the one skip is a
server-side nonce race in agirails.app receipts, classified as
transient by the test suite). No functional code changes between b1
and this stable version — promotion only.
Pre-publish housekeeping (PyPI-visible):
- README rewritten for the 3.0 surface: correct install command,
TS SDK 4.0.0 parity reference, gasless Smart Wallet quickstart,
drop the stale "1738 tests" badge. This is the PyPI long
description.
- CHANGELOG: drop the stale [Unreleased] block ("Planned for
2.1.0/2.2.0") that pre-dated the 3.0 ship. Stable 3.0.0 header
added on top.
- pyproject.toml: bump to 3.0.0, classifier to Production/Stable,
drop unused `aiofiles`+`types-aiofiles` deps, add sdist exclude
block (coverage.json, dev caches, internal markers).
Result: sdist 1.5 MB → 610 KB.
- .gitignore: add `coverage.json` so it stops showing up untracked.
- ABI dedup: remove byte-identical `config/abis/AgentRegistry.json`
duplicate; agent_registry.py now reads the canonical
`abis/agent_registry.json` (matches the snake_case convention of
the other 3 shipped ABIs). Drop unused `abis/eas.json` (eas.py
uses inline ABI constants).
- release-pypi.yml: gate the `pypi` job on a green `testpypi`
publish (`needs: [build, testpypi]`). Stable upload can no
longer bypass a TestPyPI smoke step. testpypi now runs on every
dispatch regardless of target.
Correctness fixes uncovered by the audit run:
- MockRuntime tx_id collision: two consecutive create_transaction
calls with identical params + same blockchain timestamp produced
the same tx_id. Real ACTP IDs are always unique per call. Added
a per-state monotonic nonce (len(state.transactions)) to the
hash input so the mock honours the same uniqueness invariant.
Caught by the Hypothesis stateful exerciser.
- tests/test_types/test_message.py: drop the
`test_verify_emits_warning` case — the warning was deliberately
removed in 45bd938 (April), the test was never updated. Stale
for ~1.5 months.
- tests/test_cli_deploy/test_deploy.py: annotate the public
Foundry/Anvil deterministic account #0 test key so the audit
pattern is obvious (zero-funds, well-known test key, not a real
secret).
Wheel verification: `bash scripts/test_installed_wheel.sh` →
ALL CHECKS PASSED. `agirails-3.0.0-py3-none-any.whl` ready to
publish.