v0.6.0-rc1
Pre-releaseThe Rust oracle is retired and tan is Python end to end — plus a workflow-injection fix and a sweep through the commands that reported success while doing something else.
This is a release candidate. latest still resolves to v0.5.1, so nothing upgrades onto it — install it deliberately.
Highlights
- The Rust oracle is gone.
crates/tan-core,crates/tan-cli,Cargo.tomlandCargo.lockare deleted;python/tan/is the implementation, not a port. - Workflow-injection fix in
parity.yml— an attacker-controlledrepository_dispatchpayload reached fourrun:blocks. - Every
uses:in.github/workflows/is pinned to a full commit SHA, withpersist-credentials: falseon 31 of 32 checkouts. - Five commands and the Flow D planner stopped reporting success for something they did not do —
flash,doctor,quality,initandmonitor, plus a declared-nulljlink_flash_deviceno longer downgrading Flow D to the SE-UART path. tan doctorgainedscope(hostorproject) on every check, plus alibrariesrow for the project's curated-library selection.tan explain --code <ALP-Bxxx|ALP_ERR_*>— diagnostic-code lookup, ported from alp-sdk.ALP_FLASH_REQUIRE_DPIDR=1makes an unarmed write refuse instead of warn, on every flash method that has a wrong-board guard.- A planner re-sync proposer —
python/scripts/planner_resync.pyopens the port PR when alp-sdk'sscripts/alp_orchestrate/moves.
Removed
- The Rust oracle — see above. Existing
v0.5.xassets are unaffected; this changes the repo, not the CLI's behaviour.
Fixed
tan flashrefuses a run that wrote nothing instead of reportingok: trueand exit 0, and the confirm gate finally has a reachable--confirmflag (#719).tan doctorrefuses a--sdk-rootthat is not an alp-sdk checkout rather than reporting[pass] sdkfor a pathtan buildcorrectly rejects (#727).tan qualityexits non-zero on a[FAIL]ing check, and refuses a profile that selected no checks at all (#721).tan monitoraccepts every port pyserial can open —/dev/serial/by-id/...symlinks andsocket:///rfc2217://URLs, not just whatcomports()enumerates (#569).tan doctor'ssevenZipcheck runs on every Windows host, not only whilezephyrSdkis already failing (#736).- A declared-null
jlink_flash_devicereachesflash_argsas a present key instead of silently downgrading Flow D to the SE-UART path (#734). tan initno longer emits cores that do not exist on the requested SKU, nor copies build output into a new project (#494).- The installers' header comments no longer claim
latestresolves tov0.4.1— it resolves to the newest non-prerelease,v0.5.1today (#749).
Install
Four binaries, one per host, plus checksums.txt and envelope-contract.json. There is no -musl asset — install.sh probes for musl and refuses before downloading rather than failing at exec time.
| Host | Asset |
|---|---|
| Windows x86_64 | tan-x86_64-pc-windows-msvc.zip |
| macOS Intel | tan-x86_64-apple-darwin.tar.gz |
| macOS Apple silicon | tan-aarch64-apple-darwin.tar.gz |
| Linux x86_64 | tan-x86_64-unknown-linux-gnu.tar.gz |
The Linux binary is built inside python:3.12-slim-bullseye (Debian 11). Its measured glibc floor is GLIBC_2.30, scanned over the 63 native files in the frozen payload — not read off the PyInstaller bootloader, which reports a container-invariant GLIBC_2.14 under any build image. It is a glibc binary and will not run on Alpine or another musl distro.
Verify what you downloaded:
gh attestation verify <downloaded-file> --repo alplabai/tan-cli
Because this is a prerelease, install.sh and install.ps1 resolve latest through GitHub and will keep installing v0.5.1 — download this one by hand.
Full detail: CHANGELOG.md · full diff