v3.1.14 — ipfs-cluster identity.json directory wedge fix
Fix: ipfs-cluster wedge from a directory-shaped identity.json
Resolves a failure where /uniondrive/ipfs-cluster/identity.json could be created as a directory instead of a file — a Docker bind-mount footgun (the blox-ai plugin bind-mounted the file; when it was absent at container-create time, the Docker daemon auto-created it as a directory). This permanently wedged ipfs-cluster (its init waits forever for a regular-file identity) and stopped rewards. Neither the readiness-check nor the "not earning" troubleshooter detected it before.
Prevention — blox-ai now bind-mounts the parent /uniondrive/ipfs-cluster directory, so Docker can only ever auto-create the (harmless) directory, never the file-as-directory.
Recovery (already-wedged devices) — go-fula's initipfscluster (Go binary + wrapper) and the readiness-check watchdog now detect a directory-shaped identity.json, remove it, and regenerate the deterministic identity (the cluster peerID is derived from the persistent node key, so it is unchanged → pool registration and earnings are preserved). On update, the go-fula restart triggers this automatically.
Diagnosis — the blox-ai "not earning" troubleshooter now reports cluster_identity_is_directory with a one-tap restart_fula recommendation (previously "indeterminate").
CI — pinned the QEMU binfmt image by digest to fix arm64 cross-build segfaults.
Validated on an RK3588 lab device (test153 build): prevention, recovery via the real initipfscluster binary, and diagnosis confirmed; deterministic peerID preserved across recovery.
Companion change: blox-ai Fix 4b ships via functionland/blox-ai:release (separate pipeline, already published).