Repository navigation
Conversation
Whitespace only (`git diff -w` shows one removed blank line). The gofmt step of the required "Go Checks / All" job fails on these nine files. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01QaKz9HeXaNBjrchbbGimFx
The required "Go Checks / All" job has not run staticcheck since
February: v0.4.6 doesn't build on Go 1.25, and `shadow@latest` now
needs Go 1.26, so the blocking shadow gate for wap/pkg/server stopped
running too. Pin staticcheck v0.7.0 (2026.1) and x/tools v0.49.0, the
last releases that build on Go 1.25 (cmd/blox doesn't build on 1.26
yet), and fix what staticcheck v0.7.0 reports (113 findings):
- SA1019: network.WithUseTransient -> WithAllowLimitedConn (64 calls;
in go-libp2p v0.47.0 both set the same context key);
docker ImageInspectWithRaw -> ImageInspect (same struct, the unused
raw bytes dropped).
- SA4006 in the daemon (blockchain/blox.go, 4 handlers): `out := T{..}`
was overwritten on every path; now `var out T`. Same response.
- SA4006 in tests (13): calls whose errors the tests deliberately
ignore keep the call, as `_ = f()`.
- SA4017 (blox/kubo_proxy.go): removed an `if` whose body was only a
"no-op" comment; its conditions are side-effect free.
- U1000: removed unused functions and fields in blockchain, blox,
cmd/blox (updateConfig), modules/initipfs (+ the commented-out call)
and wap/pkg/server. The three unused kubo HTTP-API helpers in
cmd/blox stay, behind lint:ignore: they are the only importer of
kubo's commands/corehttp stack, and removing them would drop ~250
packages and their init()s (e.g. dag-jose and git codec registration)
from the daemon. cmd/blox links exactly the same packages as before
and go.mod/go.sum are unchanged.
- S1017/S1031/S1039: TrimPrefix, a nil check around range, and a
test init() that did nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QaKz9HeXaNBjrchbbGimFx
…ffline
Go Test / unit failed on every run for reasons outside the code under
test:
- TestFxBlockchainCreation / TestBlockchainHealthCheck both Start() the
proxy and ping servers on the fixed 0.0.0.0:4020/4021 and never shut
down, so whichever ran second failed to bind. FxBlockchain gets
unexported withListenAddrs (tests use 127.0.0.1:0) and the tests shut
down via t.Cleanup.
- TestPoolDiscoveryWithMockServer never reached its mock: callEVMChain
always used the hard-coded RPC URLs, so it asserted live chain state.
Chain configs now go through bl.chainConfigs(), which tests can
replace with the unexported withChainConfigs; the mock answers
poolIds(0), reports problems with t.Errorf instead of require on the
server goroutine, and compares addresses case-insensitively.
- Tests that need the real SKALE/Base contracts (integration_test.go,
pool_bug_test.go, two pool discovery tests) move behind the existing
`livechain` build tag, with their stale expectations fixed (Base's
pool 1 is Global-B1; the decoder returns lowercase addresses).
`go test -tags livechain ./blockchain/` runs them.
- exchange/example_test.go: both examples exercised Pull/Push, which now
return "no longer supported", and panicked on a nil chain getter.
Removed with their helpers.
Robustness: blockchain.With{Get,Update}{Pool,Chain}Name ignore nil and
keep their defaults (blox.New passes its options through even when they
were never set), and blox guards its own getPoolName call. The daemon
always sets all four, and the defaults are unchanged: a new test pins
0.0.0.0:4020/4021, GetChainConfigs() and the nil handling.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QaKz9HeXaNBjrchbbGimFx
…races The -race step of Go Test never ran in CI (the step before it always failed), and it fails in wap/pkg/server: 4 data races in 3 lanbind tests. multiCloser.Close() stopped the hotspot / LAN-setup watchers but did not wait for them, so a test restoring a package setting (hotspotWatchInterval, lanWatchInterval, lanListenAddrs) raced with a watcher still reading it. - multiCloser counts its watchers (trackWatcher, under mu, so it can't race Close); Close() closes listeners and stopWatch under mu, then releases mu and waits. Waiting under mu would deadlock against a watcher in add(); with `closed` set add() refuses and the watcher returns, so the wait is at most one tick. Callers see the same result as before, slightly later. - TestLANSetupWatchStopsOnceTheBloxHasAnOwner swapped config.FULA_CONFIG_PATH while the watcher read it; it now rewrites the same file atomically (claimConfig). Go Test's race step gets -timeout 20m: mobile's client tests spend ~5 min waiting out the client's fixed dial timeouts and took 516 s of the default 600 s under -race locally. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01QaKz9HeXaNBjrchbbGimFx
The root Dockerfile is an old copy of fula-ota's: it COPYs ./go-fula/ and ./go-fula.sh, which don't exist in this repo, so "Build / Container" has failed on every push since 2025-06-11, and publish.yml (its only job pushes that image to GHCR on release) has failed on every release. Release images are built from fula-ota's Dockerfile and pushed to Docker Hub; nothing else in this repo references these files. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01QaKz9HeXaNBjrchbbGimFx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
All three CI checks were red on
mainfor reasons unrelated to the code they check, so the two required ones (unit,All) had stopped gating anything:v0.4.6doesn't build on Go 1.25 (since 2026-02), andshadow@latestnow needs Go 1.26, so neither staticcheck nor the blockingwap/pkg/servershadow gate ran. gofmt flagged 9 files.0.0.0.0:4020/4021; a "mock server" test that never reached its mock (hard-coded RPC URLs); live-chain tests with stale expectations; obsolete examples panicking. The-racestep never ran, and once it does it finds 4 data races in thelanbindtests.Dockerfileis a stale copy of fula-ota's (COPYs files that don't exist here). Release images come from fula-ota's Dockerfile.None of these is a bug in what devices run. One real but latent issue is fixed here: nil pool/chain getters passed to the blockchain options replaced the safe defaults (the daemon always sets them, so it never triggered).
What changes (one commit per step)
[email protected]and[email protected](the last releases that build on Go 1.25;cmd/bloxdoesn't build on 1.26 yet) and fix all 113 staticcheck findings:WithUseTransient→WithAllowLimitedConn(identical in go-libp2p v0.47.0: same context key).ImageInspectWithRaw→ImageInspect.cmd/bloxstay behind//lint:ignore. Removing them would drop ~250 packages and theirinit()s (e.g. dag-jose/git codec registration) from the daemon; that deserves its own change.livechaintag (go test -tags livechain ./blockchain/). Obsolete examples are removed. Nil getters now keep the defaults.multiCloser.Close()waits for the hotspot/LAN watchers after releasing its lock (they exit within one tick once closed), and the tests stop swapping config paths under a running watcher. The race step gets-timeout 20m:mobile's tests spend ~5 min waiting out fixed client timeouts.build.yml,publish.yml(its only job pushed that image to GHCR and has failed on every release since 2025-06) and the rootDockerfile.Daemon behaviour
cmd/blox,wap/cmdandmodules/initipfscluster(linux/arm64) link exactly the same packages asmain.modules/initipfsno longer links stdlibnet/http; its only user was dead code.go.mod/go.sumare unchanged.Close()returns once its watchers have stopped, instead of immediately.Verification (Go 1.25.14, the pinned tools,
GOTOOLCHAIN=local)go mod tidy(no diff),gofmt -s,go vet, blockingshadow,staticcheck,go generate(no diff).vetandstaticcheckwith-tags livechainare clean too.go test -v -shuffle=on ./...passes ×2, andgo test -v -race -timeout 20m ./...passes ×2 with no data races (onmainthe race step finds 4).TestMDNSServiceDiscovery. mDNS needs a non-loopback interface, which runners have.go test -tags livechain ./blockchain/passes 8 tests (read-only, real SKALE and Base contracts).cmd/blox,wap/cmd,modules/initipfsandmodules/initipfsclusterbuild for linux/arm64, andgo list -depsis identical tomainapart frominitipfsno longer linkingnet/http.multiCloserwait (no deadlock or WaitGroup misuse) and the daemon defaults.Release order
Suggest cutting the fula-ota release from
mainbefore merging this, so the pool-leave release (#251) ships on its own and this goes out in the next one.🤖 Generated with Claude Code
https://claude.ai/code/session_01QaKz9HeXaNBjrchbbGimFx