---
name: musl-tier-progress
description: "MUSL-TIER milestone (static musl Linux platform) wave ledger — W1+W2 shipped to main, W3 dispatched to todlando"
metadata: 
  node_type: memory
  type: project
  originSessionId: c6203feb-91ff-4cdb-b10d-6579afc0a2f4
---

MUSL-TIER = first-class static-musl Linux platform (`x86_64-unknown-linux-musl`). Triaged/queued PR #60 (see [[spt-core-findings-backlog]] #14). doyle drives the arc; todlando builds, deployah publishes ([[dont-solo-across-role-lines]]).

**Zero-dep premise (doyle /diagnose 2026-07-08, backlog #14):** tree builds+runs static musl with NO source changes — rustls not openssl, aws-lc-sys + bundled-sqlite clean under `musl-gcc`, openpty, static DNS/HTTPS. So the whole milestone = registry DATA + cfg + CI/release wiring, no dependency changes.

**Wave ledger:**
- **W1** ✅ merged `b659420` (PR #61) — target-triple centralization. `SUPPORTED_PLATFORMS` const-table in `crates/spt-daemon/src/release.rs`; `KNOWN_TARGET_TRIPLES` + `current_platform()`-∈-registry unit + applyhost N-platform filter + xtask asset map all derive. `REQ-PLATFORM-REGISTRY` [impl,unit]. Behaviour-neutral (gnu+windows byte-identical). Ruling: `docs/MUSL-W1-DISPATCH-RULING.md`.
- **W2** ✅ merged `7a3ee6e` (PR #62) — register musl (self-IDENTIFY). Registry row `{x86_64-unknown-linux-musl, spt-x86_64-linux-musl}` + `current_platform()` musl cfg arm (self-IDs, no more 'unknown' fallback) + 2 units. `REQ-PLATFORM-MUSL` [impl,unit]. Gate: kitsu gnu nextest 1698/1698 RC=0. **CI gotcha:** first run RED — 2 e2e daemon-timeout fails on kitsubito Phase-A (`adapter_apply_with_no_matching_session_still_swaps`, `cross_perch_dead_owner_repin_is_refused_no_contamination`) = leaked-daemon CONTAMINATION (my post-sweep gate rerun raced CI on the shared box); `rerun --failed` cleared green. Re-learned [[seedmap-test-collides-live-daemon]]: kitsubito is musl-build box AND gnu CI runner — no local gate suites there while CI can fire.
- **W3** DISPATCHED to todlando 2026-07-08 (`spt send`, main@`047db7d`). `REQ-RELEASE-MUSL-ARTIFACT` (dormant `[]` until todlando activates [impl,unit,int]). release.yml musl matrix (build kitsubito, `CC_x86_64_unknown_linux_musl=musl-gcc`) + assemble/SHA256SUMS/sign/update-set carry `spt-x86_64-linux-musl` (derive from `SUPPORTED_PLATFORMS`, no 3rd literal). **Int gate = real cut**: draft release + static musl binary on sub-2.39-glibc box → `update fetch` (no `NoArtifactForPlatform`) → verify SHA256+Ed25519 over musl bytes → apply → self-ID musl. gnu stays default Linux. Ruling: `docs/MUSL-W3-DISPATCH-RULING.md` @047db7d.
- **W3 GATE = PASS** (doyle, 2026-07-08, branch @`7d776ea`). Legs: diff review (release.yml musl matrix + `spt-x86_64-*` glob, xtask ZERO code change — W1 registry-derive pays off, only a unit added, `asset_target_triple` reads `SUPPORTED_PLATFORMS`); clippy `-D warnings`=0; traceable `--json`=0 `[impl,unit,int]`; **kitsubito musl build** = `statically linked`/`static-pie` ELF (no glibc → runs sub-2.39, the sub-glibc proof); **self-ID** = live `spt update fetch` → `NoArtifactForPlatform("x86_64-unknown-linux-musl")` (musl triple, NOT 'unknown' — field gap confirmed, closes on publish); **int test** `update_set_carries_and_verifies_the_musl_artifact` (propagate.rs) = musl select+verify + tamper→ArtifactMismatch + gnu-unchanged + absent→NoArtifactForPlatform, platform-independent, green both legs. Win nextest 1692/1712: 1 fail = `inject_control_wedge::wan_arrival_to_idle_spt_hosted_injects_with_no_hook_poll` = BOX-TIMING flake (80ms inject settle-window loses under Windows-box load; deterministic on THIS box but PASS [0.292s] on kitsubito + shipped green v0.29.1; W3 diff provably can't touch inject_control_wedge.rs). **SEED:** the 80ms `INJECT_SETTLE_TIMEOUT` window is too tight on a loaded Windows box → head-loss-spool → `pending_spool_rows=1`; candidate test-hardening (raise/env-scale the settle window, or gate on echo not wall-clock) — file under [[spt-core-findings-backlog]], NOT a W3 blocker.
- **✅ SHIPPED + PUBLISHED v0.30.0 (counter 51 LIVE/Latest) 2026-07-08** — deployah cut it end-to-end (bump @ae7b1f6, PR #63 CI all-green both legs + traceability, merged+tagged @9c4e694). release.yml fired the FIRST real musl CI matrix on kitsubito (build PASSED 3m7s) → published. update-set v51 = 3 platforms (win/gnu/musl), all signed + sha-matched. MUSL-TIER milestone COMPLETE (W1 registry + W2 register + W3 release-artifact, all gated by doyle, built by todlando, published by deployah — clean lane discipline throughout). static-musl `spt-x86_64-linux-musl` now a first-class self-updating platform. **FIELD GAP CLOSED E2E:** a static-pie musl binary self-IDs `x86_64-unknown-linux-musl` + `update fetch` SELECTS+STAGES the musl artifact (`UPDATE_STAGED:51`, no `NoArtifactForPlatform`). **RESIDUAL operator-gate leg (NON-blocking):** apply-on-a-real-sub-2.39-glibc box — the static-pie binary has ZERO glibc linkage so apply is expected clean on any glibc, but the genuine-old-box proof waits for an actual sub-2.39 host in the fleet (doyle runs it opportunistically when one lands; milestone shipped-status stands on artifact+fetch+stage+self-ID all proven). **RELEASE FLAKE (actual, NOT the inject one):** hfenduleam Win build `checkout@v5` EPERM unlinking a LEAKED runner `target\debug\spt.exe` → remove the stale runner artifact (no live lock) + `rerun --failed`, no re-tag (the known EPERM-displace pattern, [[v0270-published]]).
- **Release (historical)** — handed to deployah 2026-07-08 to drive the milestone+release cut (bump + CHANGELOG on the W3 branch, release PR, tag → release.yml musl matrix builds/signs/uploads `spt-x86_64-linux-musl`, then verify a real musl node fetch/apply — the full self-update E2E completes on the PUBLISHED release). doyle gated code; deployah owns bump/tag/publish ([[dont-solo-across-role-lines]], [[release-standard-bump-in-pr]]).
