Skip to content

Release Orven 3.0 with new identity and Mac diagnostics - #2

Merged
thangldw merged 7 commits into
mainfrom
codex/orven-3-production
Oct 14, 2026
Merged

thangldw merged 7 commits into
mainfrom
codex/orven-3-production

Conversation

@thangldw

Copy link
Copy Markdown
Owner

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.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-14T17:47:48.056953Z 23b7259 New commits
🔒 Security Review ✅ Completed 2026-10-14T17:42:36.501277Z 23b7259 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +80 to +82
value: pressure, availability: pressure == nil ? .temporarilyUnavailable : .available,
unit: .state, time: pressureTime ?? time, source: "DispatchSourceMemoryPressure",
reason: pressure == nil ? "No OS memory-pressure event observed" : nil),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +214 to +216
public func setRetention(now: Date, hours: Int) throws -> HealthArchive {
_ = try read(now: now, retentionHours: hours)
try save()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +195 to +197
if let last = archive.records.last {
guard record.observedAt > last.observedAt else { return archive }
if record.observedAt.timeIntervalSince(last.observedAt) < 60 { return archive }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +131 to +135
Task {
await ToolboxRuntime.shared.monitoring.stop()
NSWorkspace.shared.notificationCenter.removeObserver(self)
NotificationCenter.default.removeObserver(self)
sender.reply(toApplicationShouldTerminate: true)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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: ", "),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@thangldw
thangldw merged commit 4296a32 into main Oct 14, 2026
4 checks passed
@thangldw
thangldw deleted the codex/orven-3-production branch October 14, 2026 17:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant