Repository navigation
Release Orven 3.0 with new identity and Mac diagnostics - #2
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: df71321001
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| swift build -c release | ||
| BIN_DIR="$(swift build -c release --show-bin-path)" | ||
| APP_DIR="$PROJECT_DIR/dist/Toolbox.app" | ||
| APP_DIR="$PROJECT_DIR/dist/Orven.app" |
There was a problem hiding this comment.
Migrate existing schedules when renaming the bundle
When a Toolbox 2.0 user has scheduled scans enabled, the existing com.thang.toolbox.scheduled-scan launch agent contains the absolute path to Toolbox.app. Installing Orven.app does not replace that bundle, while ScheduledScanService preserves the same label/defaults and only detects the older Diskora label, so the UI still reports the schedule as enabled while launchd either runs the obsolete app or fails after it is removed. Rewrite and bootstrap the same-label agent against the current bundle as part of this rename.
Useful? React with 👍 / 👎.
| value: pressure, availability: pressure == nil ? .temporarilyUnavailable : .available, | ||
| unit: .state, time: pressureTime ?? time, source: "DispatchSourceMemoryPressure", | ||
| reason: pressure == nil ? "No OS memory-pressure event observed" : nil), |
There was a problem hiding this comment.
Initialize memory pressure before publishing samples
For a monitoring session in which memory pressure never transitions after startup, pressure remains nil because only the dispatch event handler assigns it, so every hardware sample reports .temporarilyUnavailable and pressure history and alerts remain unusable indefinitely on an otherwise normal Mac. Apple documents this source as monitoring pressure-condition changes, with .normal representing a change back to normal (DispatchSourceMemoryPressure); obtain an initial current state before publishing samples rather than waiting for a transition.
Useful? React with 👍 / 👎.
| Task { | ||
| await loadDetails(for: identity) | ||
| guard canOpenApplication, detailIdentity == identity else { return } | ||
| ToolboxRuntime.shared.navigation.open(.section(.applications)) |
There was a problem hiding this comment.
Carry the mapped app into the Applications route
After selecting a verified running application and pressing “Review in Applications,” this discards the revalidated bundle mapping and opens only the generic Applications section. ApplicationsView initializes its own focusedAppID to nil and opens a dossier only through its local selection button, so the requested app is neither selected nor shown—and if no application scan has run, the user lands on the empty scan screen. Pass the mapped bundle URL through a dedicated route and focus or open that application's dossier.
Useful? React with 👍 / 👎.
| public func setRetention(now: Date, hours: Int) throws -> HealthArchive { | ||
| _ = try read(now: now, retentionHours: hours) | ||
| try save() |
There was a problem hiding this comment.
Roll back archive mutations when persistence fails
If saving a retention change fails—for example because the disk is full or the support directory becomes unwritable—read(now:retentionHours:) has already pruned the actor's in-memory archive before this save() throws. The UI reports that existing data was preserved, but a later successful append serializes the previously pruned state and permanently removes those records; append, baseline capture, and size-budget eviction have the same mutate-before-write behavior. Stage changes in a local archive and replace the stored state only after the atomic write succeeds.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 23b7259bde
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if let last = archive.records.last { | ||
| guard record.observedAt > last.observedAt else { return archive } | ||
| if record.observedAt.timeIntervalSince(last.observedAt) < 60 { return archive } |
There was a problem hiding this comment.
Accept records after a backward wall-clock adjustment
When the system clock is moved backward—for example by a manual timezone/date correction—HealthHistoryViewModel starts a new segment, but this guard silently rejects every subsequent record until wall time passes the previous timestamp again. Because append returns successfully, the UI clears any error and advances its sampling tick while history and baseline comparisons can remain frozen for hours. Preserve ordering using the detected segment/monotonic time or otherwise handle the clock discontinuity instead of dropping the new segment.
Useful? React with 👍 / 👎.
| Task { | ||
| await ToolboxRuntime.shared.monitoring.stop() | ||
| NSWorkspace.shared.notificationCenter.removeObserver(self) | ||
| NotificationCenter.default.removeObserver(self) | ||
| sender.reply(toApplicationShouldTerminate: true) |
There was a problem hiding this comment.
Cancel owned diagnostic helpers before terminating
When the user quits while a latency or connection diagnostic is running, this termination path joins only the monitoring coordinator. NetworkToolsViewModel.run owns a detached task that may have launched /sbin/ping, /sbin/ping6, or nc, but it is neither canceled nor awaited here; replying to AppKit lets the app exit before that task's cleanup defer runs, so the child helper can remain orphaned and continue sending traffic until its deadline. Track the explicit diagnostic jobs at application scope and cancel and join them before replying to the termination request.
Useful? React with 👍 / 👎.
| "Primary interface": value.primary ?? "Unavailable", | ||
| "IPv4 gateway": value.gateway4 ?? "Unavailable", | ||
| "IPv6 gateway": value.gateway6 ?? "Unavailable", | ||
| "DNS servers": value.dns.sorted().joined(separator: ", "), |
There was a problem hiding this comment.
Preserve DNS server order in change tracking
When two successful refreshes report the same global DNS servers in a different order, sorting the addresses makes both snapshots identical, so the opt-in Network Change Timeline emits no event. Server order is part of the observed resolver configuration and can affect which resolver is preferred, while the UI promises to compare DNS changes; preserve the array order when constructing this comparison field.
Useful? React with 👍 / 👎.
Orven 3.0 replaces Toolbox's product name, icon, native interface, website and installation guidance. It adds hardware/sensor observations, Sleep Inspector, health history and baselines, bounded alerts and recordings, session connection changes, Wi-Fi/LAN observations and explicit cancellable connection diagnostics. Storage, project and recovery workflows remain available; existing bundle identity and data paths stay compatible.
The owner explicitly chose an ad-hoc-signed, unnotarized stable release. The existing tag workflow builds and verifies a universal DMG, then publishes v3.0.0. Public documents describe actual coverage, privacy and limits. Obsolete public plans, prototype assets, v2 screenshots and unsupported Homebrew tooling are removed; raw machine QA is excluded from publication.
Validation: 96 XCTest, strict Swift formatting, all five smoke contracts, four-locale lint, universal build, ad-hoc distribution/DMG checks, documentation/diagram/community/site contracts and the adoption regression passed locally. Current release bundle launch, About and Wi-Fi/LAN navigation were checked natively. Website locale/theme/keyboard and mobile overflow checks were exercised in a real browser.
Known limits: current GUI foreground resource profiling, physical Intel/macOS 13/Ethernet, full VoiceOver, critical Japanese copy review and native notification delivery remain unverified. Earlier active candidates exceeded the 2% CPU engineering target. Historical engine soak is not current GUI evidence. No notarization, firewall, hard CPU caps, fan control or exclusive APFS snapshot-byte claim is made.