The first stable release of the Python tan, and the first that requires — and is gate-verified against — a released alp-sdk. v0.6.0-rc1 was a prerelease nothing upgraded onto, so everything in it reaches users here for the first time.
Highlights
tan renodeis removed, along with all 27 publishedrenode.*issue codes — the one breaking change, details below.- alp-sdk
v0.16.0or newer is now required. tan's planner mirror and every vendored fixture pin to that released tag, so the gates measure tan against the SDK you actually install rather than an unreleased dev commit. - Bootstrap stopped handing Fedora/Rocky/Arch hosts
sudo apt-get install -y cmake— install commands are now selected per package manager, and a gap degrades to a host-neutral hint instead of a guessed package name. tan buildno longer dropsflash_args.slot0_load_addressfor a variant declaringjlink_flash_device: null, and a dual-M55 AEN SoM that declares no per-role<role>_slot0region is refused rather than mis-mapped.tan doctorresolvesgit/py/pythonto absolute paths before spawning instead of by bareargv[0].- A bare
taninvocation is meaningfully faster to start —click.testing,jsonschema, PyYAML andurllib.requestare no longer imported on every run (427 → 279 modules). tan run --flashcan arm the flash confirm gate directly, with a real--confirmflag.- Scaffolded project READMEs pin their doc links to the released SDK tag rather than a moving
main.
Removed
tan renode, its modules, and all 27renode.*issue codes. This is the breaking change in this release:- Any script invoking
tan renode ...must stop; the verb no longer resolves and exits as an unknown command. - Any consumer matching on a
renode.*code inissues[]will never see one again — the codes are unpublished, not merely unused.
- Any script invoking
Changed
tan/core/shapes.py's dedup is finished — eight duplicate definitions are gone, with a gate so the next half-finished dedup cannot ship green.- The Windows
%PATH%walk no longer builds apathlib.Pathper candidate, and an unreadable%PATH%entry is skipped rather than aborting the whole lookup.
Added
- The pin-move-verify sender (ADR-0029 clause 5) — a PR that moves a pin value dispatches the proposed tuple to alp-e2e instead of spell-checking it.
- A clean-container end-to-end run on a schedule, rather than only when something touches it.
- A gate requiring a pinned hand-port to name which tan code it governs, and symbol-level checking of
scripts/alp_cli/explain.py.
Fixed
tan/planner/is re-synced with alp-sdk, closing an emit divergence where tan wrote noCONFIG_SPI=yfor any GD32-bearing SoM while alp-sdk did.- A storage entry can no longer reach
status: okon a defaulted Devicetree label, and every planner site resolves against the project's own metadata root. install.ps1rolls back a failure during the backup renames, not only after them, and no longer reports a successful install that did not happen.tan flash'sexpect_dpidrwrong-board guard round-trips a bare YAML hex, and a--core/--helperfilter matching nothing now fails instead of passing silently.tan size/image/clean/run/validatesurfacesdk.discovery-divergentin the text channel instead of only in JSON.- A
postCommandsstep skipped for a missing tool reachesissues[]rather than vanishing. - A
v*tag can no longer publish while a changelog fragment sits unfolded. - The vendored toolchain lock and bootstrap manifest are re-vendored against released alp-sdk
v0.16.0, and CI now fetches tags for its alp-sdk clone so tag-dependent emit matches what a real checkout produces.
Install
install.sh (macOS/Linux) and install.ps1 (Windows) resolve latest through GitHub and will install this release — unlike v0.6.0-rc1, which was a prerelease they skipped. Asset names, the measured glibc floor, and the attestation verify command are in the ## Release assets block below.
Full detail: CHANGELOG.md · full diff
Release assets
Four archives, each a PyInstaller --onedir freeze of the Python
tan (tan-cli#349 -- was a single-file --onefile freeze; --onedir
fixes a 13-19s macOS startup regression caused by --onefile
re-extracting its runtime on every invocation). Unpack the archive
and run the tan/tan.exe inside; install.sh/install.ps1 do
this for you.
tan-x86_64-pc-windows-msvc.zip-- Windows x64tan-x86_64-apple-darwin.tar.gz/tan-aarch64-apple-darwin.tar.gz-- macOStan-x86_64-unknown-linux-gnu.tar.gz-- Linux x64, frozen on Debian 11.
It requires GLIBC_2.30 or newer -- measured from the
binary's own bundled payload at build time, not assumed from the
build image. Debian 11+ / Ubuntu 20.04+ / RHEL 9+ are comfortably
above it.
There is no arm64 Windows and no arm64 Linux asset in this release,
and no -musl asset. A frozen binary has to be built on the
architecture it runs on, and this release builds on four runners; if
you need an arm64 Linux or arm64 Windows tan, install from source
(pip install ./python) and say so on the issue tracker.
- Every archive +
checksums.txtcarries a GitHub build-provenance
attestation. Verify with:
gh attestation verify <downloaded-file> --repo alplabai/tan-cli