a4eff17b77a10784ff342f4c66a41a4f15edcb09
WiFiSetupPage never showed networks and could not be exited once entered. Several compounding bugs were responsible across network.go and page.go. Primary bugs fixed: - WiFiSetupPage.Init() never assigned p.wifiDevice after FindDevices(), so startScan() always hit the nil guard and exited without launching a scan goroutine. No networks ever appeared in the list. A value copy of the Wi-Fi device is now taken from m.Devices immediately after FindDevices() returns, with an explicit error if no adapter is found. - CheckInternetConnection() called FindDevices() on every tick, rebuilding m.Devices every 2 seconds. This caused [NET-030] log spam, invalidated any pointers held into the slice, and meant checkState()'s fresh Manager instances (which have an empty Devices slice) would never detect internet after Fix 2 was applied. CheckInternetConnection() now calls FindDevices() only when m.Devices is empty (fresh Manager), and does a cheaper per-device State property refresh when devices are already known (long-lived Manager). This satisfies both callers correctly. - Connect() called WaitForInternet(30s, 5s) synchronously before returning, blocking the main UI thread for up to 35 seconds. It also returned an error if internet wasn't stable in time, even though AddAndActivateConnection had succeeded, causing the page to show "Failed to initiate connection" while NM was still negotiating in the background. WaitForInternet removed from Connect(); the page's existing checkConnectionStatusLoop and handleConnectionStatusUpdate already handle post-connection state tracking. Additional bugs fixed: - startScan() launched a new StartScan goroutine on every R-press without signalling the previous one to stop. Concurrent goroutines raced on resultsChan and accumulated indefinitely. stopScan is now closed and replaced before each scan, and checkConnectionStatusLoop is restarted with the new channel. - Connect() always generated a new UUID and called AddAndActivateConnection without checking for an existing profile. Repeated connection attempts (e.g. wrong password then correct) accumulated duplicate stale profiles in NetworkManager. Existing profiles matching the SSID are now deleted via Settings.Connection.Delete before creating a new one. - m.Devices was read and written concurrently from StartScan and CheckInternetConnection goroutines without synchronisation. A sync.RWMutex is added to Manager; state refreshes take a write lock, StartScan device lookup takes a read lock. - Connect() checked wifiDevice.State using the caller's value copy taken at Init() time, which never updated. The current state is now read from m.Devices under lock at the point of connection. - auth-alg: "open" was unconditionally set in the 802-11-wireless-security settings block. This field is only meaningful for WPA/WPA2-Personal and should be omitted for SAE (WPA3) and EAP variants. It is now only set when KeyMgmt is "wpa-psk".
Radiantwave & KioskConfig Development & Release Pipeline
Radiant Wave
Full Pipeline Workflow (Detailed)
Development Phase
- Create a new branch for the issue
- Implement the changes for the issue
Integration to dev
- Open a pull request to
dev - CI: Run
nix buildto verify no errors - CI: Run linting and unit tests
- CI: Auto-update
rhemawave-devflake input - CI: Build all
devVMs in parallel (Kiosk, Commercial, RPi) - Merge the pull request to
devafter CI passes
Testing Phase
- Run all VMs (Kiosk, Commercial, RPi) and test all functionality of the application on each VM
- Install
dev-isoto a test machine and verify installation and application functionality
Release to main
- Open a pull request from
devtomain - CI: Build all
mainVMs in parallel (Kiosk, Commercial, RPi) - CI: Build all ISO images in parallel
- CI: Auto-rename ISO images to format
radiantwave-{system}-{YYYY-MM-DD}-{git-hash}.iso - CI: Upload ISO images to file server
- CI: Move old ISO images to
archives/on file server - Merge the pull request to
mainafter CI passes - Tag the release (optional, for traceability)
Automation Opportunities
This section describes which parts of the workflow can be automated via CI/CD, and how.
Group 1: Development Validation (Steps 3-8)
What to automate: PR triggering,nix build, linting, unit tests, flake updates, dev VM buildsHow: GitHub Actions workflow triggered on PR todevWhy: Catch integration errors before manual testing; ensuredevis always buildable
Group 2: Testing (Steps 9-10)
What to automate: VM functionality testing, ISO installation verificationHow: Scripted test suites, automated ISO installation in VMsWhy: Reduce manual toil; increase test coverage and consistency
Group 3: Release Pipeline (Steps 11-16)
What to automate: Main VM/ISO builds, ISO renaming, file server uploads, archivingHow: GitHub Actions workflow triggered on PR tomainWhy: Ensure consistent releases; eliminate human error in naming/uploading
Preflight Checklist
- Create a new branch for the issue
- Implement the changes for the issue
- Open a pull request to
dev - Merge the pull request to
devafter CI passes - Run all VMs (Kiosk, Commercial, RPi) and test all functionality of the application on each VM
- Install
dev-isoto a test machine and verify installation and application functionality - Open a pull request from
devtomain - Merge the pull request to
mainafter CI passes - Tag the release (optional, for traceability)
Automation Task List
Group 1: Development Validation
-
Set up GitHub Actions workflow for PRs to
dev- Configure
nix buildstep - Add linting and unit test steps
- Add flake auto-update step
- Configure parallel VM builds (Kiosk, Commercial, RPi)
- Configure
- Verify workflow blocks PR merge on failure
Group 2: Testing
- Create automated test scripts for VM functionality
- Set up automated ISO installation testing
- Integrate with CI for optional automated testing
Group 3: Release Pipeline
-
Set up GitHub Actions workflow for PRs to
main- Configure parallel VM builds
- Configure parallel ISO builds
- Add ISO auto-renaming step (using
git rev-parse HEADanddate +%Y-%m-%d) - Add file server upload step (
rsyncor similar) - Add archive old ISOs step
- Verify workflow blocks PR merge on failure
Languages
Go
86.1%
Shell
4.9%
Python
4.5%
Nix
2.5%
HTML
1.4%
Other
0.6%