refactor: extract Browser/Network/Package Manager/System Monitor + close backlog - #169
Conversation
Closes the four remaining backlog items from oasis-os-backlog.md: - PR1.1 last bullet — record decision to extract Browser/Network/ Package Manager/System Monitor from oasis-core to oasis-app-* crates as a follow-up. CLAUDE.md updated in both the crate dependency graph and the oasis-core bullet. - PR3.5 — skipped: crates/oasis-net/src/tests.rs is genuinely test code (free_port helpers, #[test] blocks, listener lifecycle), not fixture data. No rename needed. - PR4.2 — no code change: all 5 cited panic!() calls verified inside #[cfg(test)] mod tests blocks (text-editor:572 in mod from L426, skin/builtin:347-350 in mod from L107, audio/radio/source:1028 in mod from L536). - PR6 last bullet — audited the 4 ADRs untouched since 2026-02-19. ADR-001/002/004 and psp-plugin.md already carry "Last reviewed: 2026-05-02 — still current" from PR #161. ADR-003 and ADR-005 had stale facts and are updated: * ADR-003: 8 extension traits → 9 in the SdiBackend bundle (SdiRenderTarget was missing); 39 optional methods → ~55 default-impl methods; mention SdiBlendMode + SdiGeometry as additional extension traits outside the bundle. * ADR-005: 8 distinct visual styles → 15; "18 unique skins ship, 18 built-in + 14 external TOML" → 15 built-in / 12 external TOML / 3 built-in-only (corrupted, desktop, modern). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Completes the extraction decision recorded in commit 60cd05b. The four remaining in-core apps now live in their own oasis-app-* crates, matching the pattern already used by Settings, File Manager, etc. New crates: - oasis-app-browser — Browser launcher placeholder - oasis-app-network — Network status app (loopback, listener, remote-connection state) - oasis-app-package-manager — Installed packages listing - oasis-app-system-monitor — Platform/backend/uptime/CPU placeholder Each crate defines a typed App struct (BrowserApp, NetworkApp, PackageManagerApp, SystemMonitorApp) with a ContentState field, implements oasis_app_core::App via impl_content_app_methods!(content), and ships its own focused unit tests (5 + 7 + 4 + 5 = 21 tests). Behavioural parity with the previous SimpleApp::* constructors — title, lines, navigation, downcast — is covered. Wiring: - Workspace Cargo.toml: 4 new members + workspace.dependencies entries - oasis-core/Cargo.toml: depends on the 4 new crates - crates/oasis-core/src/apps/registry.rs: dispatch routes the four app titles to the new types instead of SimpleApp constructors - SimpleApp constructors network/package_manager/browser/system_monitor + their tests removed (dead code post-extraction). SimpleApp itself stays for the in-core Terminal app and the plugin system's dynamic app placeholder. - runner.rs scroll test switched from "Network" to "Terminal" since Network no longer downcasts to SimpleApp. - System Monitor backend label upgraded from "SDL2" to "SDL3" while the constructor was being moved (pre-existing drift; SDL3 migration landed in PR #53). Docs: - CLAUDE.md / AGENTS.md: app-crate count 9 → 13, crate-directory count 45 → 49, workspace member count 35 → 39, oasis-core line rewritten to reflect that no app implementations remain in core beyond the Terminal delegate and the plugin SimpleApp placeholder. CI: cargo build --workspace, cargo fmt --all -- --check, cargo clippy --workspace -- -D warnings, and targeted tests (oasis-app-browser / network / package-manager / system-monitor / oasis-core) all pass. The pre-existing rmp3 UB precondition panic in oasis-backend-sdl::sdl_audio::tests::streaming_buffer_is_bounded reproduces on main and is unrelated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Claude AI Architecture & Quality ReviewIssues (if any)
Previous Issues (for incremental reviews)(none) Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new security or correctness issues in the new files) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI General ReviewIssues (if any)
Previous Issues (for incremental reviews)(none) Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 1/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 1)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new security or correctness issues in the new files) Previous Issues (for incremental reviews)
Suggestions (if any)(none) Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 2/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 2)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new issues in the two new files) Previous Issues (for incremental reviews)
Suggestions (if any)(none) Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new security or correctness issues in the new files) Previous Issues (for incremental reviews)
Suggestions (if any)(none) Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 3/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 3)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new security or correctness issues in the new file) Previous Issues (for incremental reviews)
Suggestions (if any)(none) Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new architectural or quality issues in the new files) Previous Issues (for incremental reviews)
Suggestions (if any)(none — previous suggestions have been addressed or are deferred with documented rationale) Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Review Response Agent (Iteration 4)Status: Hallucination detected — no commit
Stream log: Fixed Issues
Ignored Issues
Deferred to Human
Notes
No file modifications were performed; this iteration produced no commit. |



Summary
Closes the four remaining items from
oasis-os-backlog.mdAND lands the extraction follow-up that was the resolution of PR1.1's last bullet — all in one branch / one PR.Commit 1 (60cd05b) — Doc-only cleanup
oasis-coreintooasis-app-*crates.crates/oasis-net/src/tests.rsis genuinely test code, not fixture data. The backlog item was based on a misread; no rename needed.panic!()calls verified inside#[cfg(test)] mod testsblocks.psp-plugin.mdalready carryLast reviewed: 2026-05-02 — still currentannotations from PR docs(crates): subsystem references for js, terminal, net, audio, vector, shader #161. ADR-003 and ADR-005 had stale facts and are updated:SdiBackendbundle (SdiRenderTargetwas missing); 39 optional methods → ~55 default-impl methods; calls outSdiBlendModeandSdiGeometryas additional extensions intentionally outside the bundle.Commit 2 (2fc1bcf) — Apps extraction
The decision recorded in commit 1 is now executed in the same PR.
New crates (each with its own typed
Appimpl + focused unit tests):oasis-app-browser— Browser launcher placeholder (5 tests)oasis-app-network— Network status (loopback / listener / remote connection state) (7 tests)oasis-app-package-manager— Installed packages listing (4 tests)oasis-app-system-monitor— Platform/backend/uptime/CPU placeholder (5 tests)Each crate defines a struct (
BrowserApp,NetworkApp,PackageManagerApp,SystemMonitorApp) with aContentStatefield and implementsoasis_app_core::Appvia theimpl_content_app_methods!(content)macro — the same shape asoasis-app-settings.Wiring:
Cargo.toml: 4 new members +workspace.dependenciesentries.oasis-core/Cargo.toml: depends on the 4 new crates.crates/oasis-core/src/apps/registry.rs: title dispatch routes to the new types instead ofSimpleApp::*constructors.SimpleApp::network/::package_manager/::browser/::system_monitorand their tests removed (dead post-extraction).SimpleAppitself stays for the in-core Terminal app and the plugin system's dynamic app placeholder.runner.rsscroll test switched from"Network"to"Terminal"since"Network"no longer downcasts toSimpleApp."SDL2"to"SDL3"while the constructor was being moved (pre-existing drift; SDL3 migration landed in PR feat: migrate SDL2 → SDL3 (3.4.2) #53).Docs (CLAUDE.md / AGENTS.md):
oasis-coreline rewritten — no app implementations remain in core beyond the Terminal delegate and the pluginSimpleAppplaceholder.Test plan
cargo fmt --all -- --checkcleancargo clippy --workspace -- -D warningsclean (the--all-targetsform fails on pre-existingunwrap_useddenies inoasis-uitest code — same onmain)cargo build --workspacecleanoasis-app-browser(5),oasis-app-network(7),oasis-app-package-manager(4),oasis-app-system-monitor(5),oasis-core(613)oasis-backend-sdl::sdl_audio::tests::streaming_buffer_is_boundedreproduces onmainand is unrelated to this PR (third-party decoder issue)Generated with Claude Code