oficina / home Public

ARM64 release build correction open

On branch fix-operator-arm64-build

Building approved merged Home d4b2eeb for preview deployment exposed an earlier merged operator descriptor portability error: unix.Statt.Nlink is uint32 onarm64 but stored in uint64 field. Minimal explicit uint64 conversion preserves exact unsigned value and native behavior. Added CGOENABLED0 linux/arm64 build of both cmd/home and cmd/oficina to existing Makefile test-build gate. Original build failure reproduced and retained; corrected crossbuild succeeds. Full gate/CI and independentFable review underway. No deployment occurred.

APPROVE — model claude-fable-5-1, Home 20a343377ca72f88b0114dcb74f6405b4698f5fe over base d4b2eeb3d1ca6d0f384e40aa812eb2dcda2fa190. No blocking findings. Severity: none.

What the diff is (2 hunks, both matching the frozen source and the worktree HEAD):

  • internal/operator/open_linux.go:174 wraps s.Nlink in uint64(...). On linux/arm64 unix.Stat_t.Nlink is uint32; on amd64 it is already uint64, so the conversion is a widening no-op there and a lossless unsigned widening on arm64. No truncation, no sign change.
  • Makefile:40 adds CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ./cmd/home ./cmd/oficina to test-build. Native builds and CI step .amadan/ci.d/30-build (which execs make test-build) are untouched.

Link-check and mounting logic unchanged. Every consumer of the descriptor still enforces exactly one hard link: d.links != 1 at open_linux.go:251 and :314, main.links != 1 at :301, plus the raw s.Nlink != 1 / stat.Nlink != 1 gates in pinExisting, statExisting, and pathMatches (:108, :139, :190). Those compare against an untyped constant and compile on both arches. No change to O_NOFOLLOW path walking, WAL/SHM sibling identity, PRAGMA database_list verification, or the writable-descriptor baseline. Nothing in the diff touches mounting, provisioner, handoff, or roster.

Evidence checked: baseline.log reproduces the exact compile error at line 174; cross-build.log is empty, which is the expected output of a successful go build. Both cmd/home (via internal/home/operator_person.go) and cmd/oficina (via internal/provisioner) transitively import internal/operator, so the cross-build actually exercises the fixed file. No other arch-sensitive Stat_t fields (Blksize, Rdev, timespecs) are used anywhere in the tree. golang.org/x/sys v0.47.0 is current.

Non-blocking note: the new cross-build only type-checks non-test packages reachable from the two mains. Test files such as open_linux_test.go are not checked for arm64 (they use uint64(stat.Dev) and stat.Ino only, so nothing there is at risk today). A future GOARCH=arm64 go vet ./... line would close that gap; not required for this change.

Gate status: gate.log was still running at review time. This approval covers the diff and the two build logs; full make test and exact CI remain to be confirmed separately.

Full localgate and exact20a CI passed; Fable actual5.1 APPROVE recorded. Normalexpectmerge producedeabd7e1d234ed458b8b68f22ad895adffb5d5292 with identical reviewedtree8a1c8bd271bdae405d372bc48a2f23b2442e4ac9. Frozen cmd/home ARM64 build succeeded and deployed named Home previewchannel, both canonical body+edge versions confirmed eabd. Task49 Done. Currentmain checker integration is separate and absent from deployedarchive. Evidence /home/paulca/.cache/oficina-home-keymail-deploy/deployment.json.