Skip to content

Comments

feat: architecture cleanup, backend parity, 489 new tests, accessibility, and docs#27

Merged
AndrewAltimit merged 6 commits intomainfrom
feat/comprehensive-improvements
Feb 21, 2026
Merged

feat: architecture cleanup, backend parity, 489 new tests, accessibility, and docs#27
AndrewAltimit merged 6 commits intomainfrom
feat/comprehensive-improvements

Conversation

@AndrewAltimit
Copy link
Owner

Summary

Full-codebase improvement spanning 10 phases, 70 files changed, +7,895/-333 lines, 489 new tests (2,428 -> 2,917).

  • Phase 1 - Architecture: GradientStyle enum, TextMetrics struct, pub(crate) browser modules, oasis-core prelude, pinned git deps
  • Phase 2 - Backend parity: SDL network/audio streaming, UE5 graceful audio stubs with callbacks, PSP shape rendering (rounded rect, circle, line)
  • Phase 3 - Test coverage: 489 new tests across oasis-app (68), oasis-ui (140), oasis-wm (89), oasis-vfs (52), oasis-net (27), oasis-core plugin (32), plus property-based tests
  • Phase 4 - UI completeness: Tooltip widget, keyboard navigation system (focus ring, Tab/Shift-Tab), enhanced modal dialogs, visual glitch fixes
  • Phase 5 - Browser CSS3: Incremental layout with dirty flags and edge cache, HTML nesting depth guard (256), CSS value proptest
  • Phase 6 - Terminal: MAX_OUTPUT_LINES 2000, stderr separation (2>/2>>/2>&1), shell functions, help --category filter
  • Phase 7 - WM polish: WindowId(Rc) for cheap cloning, screen bounds clamping, edge snapping (8px), titlebar gradients, modal z-order
  • Phase 8 - Performance: Incremental browser layout, PSP stack buffer safety, benchmarks in CI pipeline
  • Phase 9 - Documentation: Troubleshooting guide, plugin dev guide, command dev guide, 16 Cargo.toml doc URLs, feature flag docs
  • Phase 10 - Accessibility: Reduced-motion mode, font scaling (0.5x-3.0x), colorblind theme (deuteranopia-safe), spinner widget

Test plan

  • cargo clippy --workspace -- -D warnings passes clean
  • cargo test --workspace -- 2,917 tests pass, 0 failures
  • cargo fmt --all -- --check passes clean
  • PSP EBOOT builds and runs in PPSSPP
  • Desktop SDL app launches and runs interactively

Generated with Claude Code

AI Agent Bot and others added 2 commits February 21, 2026 07:04
Full-codebase improvement spanning architecture, backends, testing,
UI, browser, terminal, window manager, performance, docs, and
accessibility. 70 files changed, +5056/-333 lines, 489 new tests
(2428 -> 2917).

Phase 1 - Architecture: GradientStyle enum, TextMetrics struct,
pub(crate) browser modules, oasis-core prelude, pinned git deps.

Phase 2 - Backend parity: SDL network/audio streaming, UE5 graceful
audio stubs with callbacks, PSP shape rendering (rounded rect,
circle, line).

Phase 3 - Test coverage: 489 new tests across oasis-app (68),
oasis-ui (140), oasis-wm (89), oasis-vfs (52), oasis-net (27),
oasis-core plugin (32), plus property-based tests.

Phase 4 - UI completeness: Tooltip widget, keyboard navigation
system (focus ring, Tab/Shift-Tab), enhanced modal dialogs,
visual glitch fixes.

Phase 5 - Browser CSS3: Incremental layout with dirty flags and
edge cache, HTML nesting depth guard (256), CSS value proptest.

Phase 6 - Terminal: MAX_OUTPUT_LINES 2000, stderr separation
(2>/2>>/ 2>&1), shell functions, help --category filter.

Phase 7 - WM polish: WindowId(Rc<str>) for cheap cloning,
screen bounds clamping, edge snapping (8px), titlebar gradients,
modal z-order (normal < always_on_top < modal).

Phase 8 - Performance: Incremental browser layout, PSP stack
buffer safety, benchmarks in CI pipeline.

Phase 9 - Documentation: Troubleshooting guide, plugin dev guide,
command dev guide, 16 Cargo.toml doc URLs, feature flag docs.

Phase 10 - Accessibility: Reduced-motion mode, font scaling
(0.5x-3.0x), colorblind theme (deuteranopia-safe), spinner widget.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wraps the ptr::write + ptr::add calls in an unsafe block per
Rust 2024 unsafe_op_in_unsafe_fn requirements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@AndrewAltimit AndrewAltimit changed the title feat: comprehensive improvements across all 10 phases feat: architecture cleanup, backend parity, 489 new tests, accessibility, and docs Feb 21, 2026
@github-actions
Copy link

Gemini AI Code Review

Issues (if any)

  • [BUG] crates/oasis-backend-psp/src/shapes.rs:434 - Line thickness broken for diagonal lines

    • nx and ny evaluate to (-dy / len) as i32. Since the division yields a float between -1.0 and 1.0, casting to i32 truncates to 0 for any non-axis-aligned line, stacking all parallel lines at offset 0.
    • Multiply by offset before casting: ((-dy / len) * offset as f32) as i32.
  • [BUG] crates/oasis-ui/src/focus.rs:143 - Panic on negative focus offsets

    • [UNVERIFIED - file not found in PR] FocusStyle.offset is an i32 but cast directly to u32 in w + (off as u32) * 2. A negative offset (for inset rings) creates a massive u32 that will panic on overflow.
    • Use w.saturating_add_signed(off * 2) and similarly for h.
  • [BUG] crates/oasis-backend-sdl/src/lib.rs:682 - Rounded rect gradient fallback loses radius

    • When falling back for Horizontal or FourCorner gradients, the SDL backend calls fill_rect_gradient, which drops radius and draws sharp corners.
    • Call self.fill_rounded_rect(..., radius, gradient.primary_color()) to preserve the requested shape.

Previous Issues (for incremental reviews)

(none)

Suggestions (if any)

  • crates/oasis-browser/src/layout/block.rs:114 - any_child_dirty traverses the entire subtree recursively at every level, making the incremental layout pass O(N * D) and degrading performance on deep trees. Consider propagating a has_dirty_child boolean up to the parent when marking nodes dirty for O(1) checks.

Notes

  • 1 claim(s) were automatically filtered as potential hallucinations (file:line content didn't match claims)

  • Testing additions (489 tests) significantly improve coverage across UI, VFS, and core components.

  • MemoryVFS path traversal protections look solid and handle standard evasion vectors.

  • HTML nesting depth limit (MAX_NESTING_DEPTH = 256) correctly prevents stack overflows. Deeply unbalanced tags may cause premature stack popping, but this is an acceptable safety trade-off for this environment.

Reaction


Generated by Gemini AI (gemini-3.1-pro-preview). Supplementary to human reviews.

@github-actions
Copy link

Codex AI Code Review

Issues (if any)

  • [BUG] crates/oasis-backend-psp/src/shapes.rs:356 - Thick diagonal lines render as 1px

  • What's wrong: nx/ny are cast to i32 before applying offset; for most non-axis-aligned lines (-dy/len) and (dx/len) are in (-1,1), truncating to 0, so all parallel offsets collapse.

  • How to fix (if obvious): apply offset in float first, then cast (let ox = ((-dy / len) * offset as f32) as i32; let oy = ((dx / len) * offset as f32) as i32;).

  • [BUG] crates/oasis-ui/src/focus.rs:143 - Negative focus offsets can overflow indicator size

  • What's wrong: off is i32 but cast to u32 in w + (off as u32) * 2; negative values become huge unsigned values, causing overflow/panic (debug) or invalid large geometry (release).

  • How to fix (if obvious): use signed saturating math (w.saturating_add_signed(off * 2), same for h) and clamp resulting rect.

  • [BUG] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded gradient fallback drops corner radius

  • What's wrong: non-vertical gradients in fill_rounded_rect_gradient return fill_rect_gradient(...), producing sharp corners despite a nonzero radius.

  • How to fix (if obvious): preserve rounded shape in fallback (e.g., clip gradient to rounded mask or at minimum fall back to fill_rounded_rect(..., gradient.primary_color()) to keep geometry contract).

Previous Issues (for incremental reviews)

  • [STILL UNRESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Diagonal line thickness offset collapses due early integer cast.
  • [STILL UNRESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative FocusStyle.offset [UNVERIFIED - File does not exist and is not in PR] can overflow/panic via as u32 conversion.
  • [STILL UNRESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded-rect gradient fallback ignores radius for non-vertical gradients.

Suggestions (if any)

  • crates/oasis-ui/src/spinner.rs:161 - SpinnerStyle::Bar does not render label even though Spinner is documented with an optional label; either render it for bar mode or narrow the docs/field semantics.

Notes

  • 1 claim(s) were automatically filtered as potential hallucinations (file:line content didn't match claims)

  • Verified against the current diff lines in the touched files.

  • Reaction-search MCP tool was unavailable in this environment, so fallback reaction URL is used.


Generated by Codex AI (gpt-5.3-codex). Supplementary to human reviews.

@AndrewAltimit
Copy link
Owner Author

No review feedback found to process.

- PSP shapes: fix thick diagonal lines rendering as 1px by applying
  perpendicular offset in float before casting to i32
- Focus indicator: use saturating_add_signed for offset to prevent
  overflow/panic on negative FocusStyle.offset values
- SDL rounded rect gradient: fall back to fill_rounded_rect with
  primary_color instead of fill_rect_gradient to preserve corner radius

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@AndrewAltimit
Copy link
Owner Author

Review feedback addressed (2aef993)

Fixed all 3 bugs identified by Gemini and Codex:

1. PSP thick diagonal lines rendering as 1px (shapes.rs:356)

  • Root cause: nx/ny were cast to i32 before multiplying by offset, truncating values in (-1, 1) to 0 for non-axis-aligned lines.
  • Fix: Apply offset in float first, then cast: (nx * offset as f32) as i32.

2. Focus indicator overflow on negative offsets (focus.rs:143)

  • Root cause: off as u32 on a negative i32 wraps to a massive unsigned value, causing overflow.
  • Fix: Use w.saturating_add_signed(off * 2) for safe signed arithmetic.

3. SDL rounded rect gradient drops corner radius (lib.rs:687)

  • Root cause: Non-vertical gradient fallback called fill_rect_gradient which draws sharp corners.
  • Fix: Fall back to fill_rounded_rect(... radius, gradient.primary_color()) to preserve the rounded shape.

Also pushed the PSP Cargo.lock update.

All 2,917 tests pass, clippy clean.

@github-actions
Copy link

Gemini AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

(none)

Previous Issues (for incremental reviews)

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs - Diagonal line thickness offset collapses due to early integer cast
  • [RESOLVED] crates/oasis-ui/src/focus.rs - Negative FocusStyle.offset can overflow/panic via as u32 conversion
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs - Rounded-rect gradient fallback ignores radius for non-vertical gradients

Suggestions (if any)

  • crates/oasis-browser/src/layout/block.rs:114 - any_child_dirty traverses the entire subtree recursively at every level, making the incremental layout pass O(N * D) and degrading performance on deep trees. Consider propagating a has_dirty_child boolean up to the parent when marking nodes dirty for O(1) checks.

Notes

  • 1 claim(s) were automatically filtered as potential hallucinations (file:line content didn't match claims)

  • All previously flagged issues have been correctly addressed in this iteration.

  • Testing additions are comprehensive. The new MAX_NESTING_DEPTH correctly mitigates stack exhaustion vulnerabilities without sacrificing standard functionality.

Reaction


Generated by Gemini AI (gemini-3.1-pro-preview). Supplementary to human reviews.

The pipeline was timing out after adding benchmarks, coverage, and
expanded test suites across the comprehensive improvements branch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link

Gemini AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

  • [CRITICAL] crates/oasis-browser/src/layout/block.rs:131 - Unstable let_chains syntax used

    • if let ... && ... && let ... requires #![feature(let_chains)], breaking stable compilation.
    • Rewrite using nested if let blocks or match on a tuple.
  • [CRITICAL] crates/oasis-ui/src/list_view.rs:61 - Unstable is_multiple_of method on u32

    • u32::is_multiple_of is a nightly-only feature (int_roundings), fails on stable Rust.
    • Replace with: u32::from(h % self.item_height != 0).
  • [CRITICAL] crates/oasis-backend-psp/src/shapes.rs:74 - Floating-point arithmetic in const fn

    • f64 math in cos_approx/sin_approx requires #![feature(const_fn_floating_point_math)], missing from lib.rs.
    • Add the feature flag to crates/oasis-backend-psp/src/lib.rs or move evaluation to runtime via std::sync::OnceLock.

Previous Issues (for incremental reviews)

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Diagonal line thickness offset collapses due to early integer cast
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative FocusStyle.offset can overflow/panic via as u32 conversion
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded-rect gradient fallback ignores radius for non-vertical gradients

Suggestions (if any)

  • crates/oasis-browser/src/layout/block.rs:114 - any_child_dirty traverses the entire subtree recursively at every level, making incremental layout O(N * D) on deep trees. Consider propagating a has_dirty_child boolean up to the parent when marking nodes dirty for O(1) checks.

Notes

  • 1 claim(s) were automatically filtered as potential hallucinations (file:line content didn't match claims)

  • All previous issues successfully verified as fixed.

  • The MAX_NESTING_DEPTH implementation gracefully mitigates stack exhaustion without panics or dropping leaf content.


Generated by Gemini AI (gemini-3.1-pro-preview). Supplementary to human reviews.

@github-actions
Copy link

Codex AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

  • [WARNING] crates/oasis-ui/src/focus.rs:146 - Focus indicator size math can still overflow for extreme offsets.
    What's wrong: off * 2 is evaluated before saturating_add_signed, so very large/small offset values can overflow (panic in debug, wrap in release), and x - off / y - off can also overflow.
    How to fix (if obvious): use saturating signed math throughout, e.g. let delta = off.saturating_mul(2); then x.saturating_sub(off), y.saturating_sub(off), w.saturating_add_signed(delta), h.saturating_add_signed(delta).

Previous Issues (for incremental reviews)

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:434 - Line thickness broken for diagonal lines
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Panic on negative focus offsets
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:682 - Rounded rect gradient fallback loses radius
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Thick diagonal lines render as 1px
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative focus offsets can overflow indicator size
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded gradient fallback drops corner radius
  • [RESOLVED] crates/oasis-browser/src/layout/block.rs:131 - Unstable let_chains syntax used
  • [RESOLVED] crates/oasis-ui/src/list_view.rs:61 - Unstable is_multiple_of method on u32
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:74 - Floating-point arithmetic in const fn

Suggestions (if any)

(none)

Notes

  • Verified against the provided diff and current file contents for all referenced file:line entries.
  • The three prior “unstable feature” claims are not reproducible on stable Rust in this environment (let-chains, is_multiple_of, const float in const fn all compile).
  • mcp__reaction-search__search_reactions was unavailable here, so fallback reaction URL is used.

Reaction


Generated by Codex AI (gpt-5.3-codex). Supplementary to human reviews.

Automated fix by Claude in response to Gemini/Codex review.

Iteration: 1/5

Co-Authored-By: AI Review Agent <noreply@anthropic.com>
@AndrewAltimit
Copy link
Owner Author

Review Response Agent (Iteration 1)

Status: Changes committed, pushing...

Commit: a29fd3f

Fixed Issues

  • crates/oasis-ui/src/focus.rs:146 - Hardened indicator_rect against overflow on extreme offset values: off * 2 now uses saturating_mul, and x - off / y - off now use saturating_sub (Codex WARNING)

Ignored Issues

  • crates/oasis-browser/src/layout/block.rs:114 - any_child_dirty O(N*D) performance suggestion (Gemini SUGGESTION). This is a valid optimization idea but not a bug. The browser engine targets a 480x272 PSP screen where DOM trees are very small, making this premature optimization.

Deferred to Human

  • (none)

Notes

  • All 80 focus tests pass, clippy clean
  • All 9 previously reported bugs (3 original + 3 unstable feature + 3 duplicates) were already resolved in prior commits

Automated summary of agent fixes.

@github-actions
Copy link

Gemini AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

  • [BUG] crates/oasis-ui/src/spinner.rs:163 - SpinnerStyle::Bar ignores the provided label
    • The Bar arm in draw does not render self.label [UNVERIFIED - file not in PR], nor subtract the label's width from bar_w. The progress bar stretches over the label's allocated space despite measure() reserving it.
    • Draw the text and subtract the measured label width from bar_w, similar to the Text and Dots variants.

Previous Issues

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:434 - Line thickness broken for diagonal lines
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Panic on negative focus offsets
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:682 - Rounded rect gradient fallback loses radius
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Thick diagonal lines render as 1px
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative focus offsets can overflow indicator size
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded gradient fallback drops corner radius
  • [RESOLVED] crates/oasis-browser/src/layout/block.rs:131 - Unstable let_chains syntax used
  • [RESOLVED] crates/oasis-ui/src/list_view.rs:61 - Unstable is_multiple_of method on u32
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:74 - Floating-point arithmetic in const fn
  • [RESOLVED] crates/oasis-ui/src/focus.rs:146 - Focus indicator size math can still overflow for extreme offsets

Suggestions (if any)

  • crates/oasis-ui/src/scroll_view.rs:80 - If content_height is 0, ratio evaluates to f32::INFINITY. The float-to-int cast and .min(h) bound it correctly, but an explicit if self.content_height > 0 guard avoids reliance on IEEE 754 infinity propagation and clarifies intent.
  • crates/oasis-wm/src/window.rs:62 - WindowId equality can short-circuit with Rc::ptr_eq(&self.0, &other.0) || *self.0 == *other.0 for cloned identifiers.

Notes

  • 1 claim(s) were automatically filtered as potential hallucinations (file:line content didn't match claims)

  • Testing is thorough with good edge case coverage (VFS traversal protections, missing focus manager states).

  • FocusManager and Tooltip implementations are robust; Modal cleanly enforces input blocking.

  • Previous unstable feature warnings were correctly categorized as non-issues for the Nightly/Edition 2024 target.

Reaction


Generated by Gemini AI (gemini-3.1-pro-preview). Supplementary to human reviews.

@github-actions
Copy link

Codex AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

  • [BUG] crates/oasis-ui/src/spinner.rs:161 - SpinnerStyle::Bar still ignores the configured label.
    What's wrong: measure() reserves label width for all styles, but the Bar draw path neither renders self.label [UNVERIFIED - File does not exist and is not in PR] nor subtracts label width from bar_w, so layout and rendering are inconsistent.
    How to fix (if obvious): in the Bar branch, render label like Text/Dots and reduce the drawable bar width by the measured label width + spacing.

Previous Issues (for incremental reviews)

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:434 - Line thickness broken for diagonal lines
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Panic on negative focus offsets
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:682 - Rounded rect gradient fallback loses radius
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Thick diagonal lines render as 1px
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative focus offsets can overflow indicator size
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded gradient fallback drops corner radius
  • [RESOLVED] crates/oasis-browser/src/layout/block.rs:131 - Unstable let_chains syntax used
  • [RESOLVED] crates/oasis-ui/src/list_view.rs:61 - Unstable is_multiple_of method on u32
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:74 - Floating-point arithmetic in const fn
  • [RESOLVED] crates/oasis-ui/src/focus.rs:146 - Focus indicator size math can still overflow for extreme offsets
  • [STILL UNRESOLVED] crates/oasis-ui/src/spinner.rs:163 - SpinnerStyle::Bar ignores the provided label

Suggestions (if any)

(none)

Notes

  • 1 claim(s) were automatically filtered as potential hallucinations (file:line content didn't match claims)

  • The newly marked file crates/oasis-ui/src/focus.rs looks solid for the previously reported overflow/panic paths; the saturating arithmetic fix is in place.

  • mcp__reaction-search__search_reactions was unavailable in this environment, so fallback reaction URL is used.

Reaction


Generated by Codex AI (gpt-5.3-codex). Supplementary to human reviews.

The Bar variant's draw() did not render self.label, even though
measure() reserved width for it in all styles. This caused the
progress bar to stretch over the label's allocated space. Now the
Bar arm draws the label text and offsets the bar track accordingly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@AndrewAltimit
Copy link
Owner Author

Review Response Agent (Iteration 2)

Status: No changes needed

Fixed Issues

  • crates/oasis-ui/src/spinner.rs:161 - SpinnerStyle::Bar now renders self.label and offsets the progress bar track by the label width. Previously, measure() reserved space for the label in all styles, but the Bar draw path silently ignored it, causing the bar to stretch over the label's allocated space. (Gemini BUG + Codex BUG)

Ignored Issues

  • crates/oasis-ui/src/scroll_view.rs:80 - Division by zero guard for content_height == 0 (Gemini SUGGESTION). Not reachable: draw_scrollbar is only called when needs_scrollbar() returns true, which requires content_height > viewport_height. The zero_content_height test already confirms correct behavior.
  • crates/oasis-wm/src/window.rs:62 - Rc::ptr_eq short-circuit in WindowId::eq (Gemini SUGGESTION). Micro-optimization, not a bug. String comparison on short window IDs is negligible.

Deferred to Human

  • (none)

Notes

  • All 2,918 tests pass, clippy clean
  • New test draw_bar_with_label verifies the fix
  • Commit: f4a2a71

The agent reviewed feedback but determined no code changes were required.

@github-actions
Copy link

Gemini AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

(none)

Previous Issues (for incremental reviews)

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:434 - Line thickness broken for diagonal lines
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Panic on negative focus offsets
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:682 - Rounded rect gradient fallback loses radius
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Thick diagonal lines render as 1px
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative focus offsets can overflow indicator size
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded gradient fallback drops corner radius
  • [RESOLVED] crates/oasis-browser/src/layout/block.rs:131 - Unstable let_chains syntax used
  • [RESOLVED] crates/oasis-ui/src/list_view.rs:61 - Unstable is_multiple_of method on u32
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:74 - Floating-point arithmetic in const fn
  • [RESOLVED] crates/oasis-ui/src/focus.rs:146 - Focus indicator size math can still overflow for extreme offsets
  • [RESOLVED] crates/oasis-ui/src/spinner.rs:163 - SpinnerStyle::Bar ignores the provided label
  • [RESOLVED] crates/oasis-ui/src/spinner.rs:161 - SpinnerStyle::Bar still ignores the configured label

Suggestions (if any)

(none)

Notes

  • Excellent work resolving the reported rendering artifacts and overflow edge cases. The fallback behavior for fill_rounded_rect_gradient correctly maintains the widget shape, and the layout engine handles label sizes appropriately in all spinner styles.
  • The addition of TextMetrics with proper ascent parsing greatly clarifies font baseline alignment logic across the backends.
  • With 489 new tests, the coverage of oasis-ui and the VFS layer is very robust. Security protections against path traversal in MemoryVfs are well implemented.

Reaction


Generated by Gemini AI (gemini-3.1-pro-preview). Supplementary to human reviews.

@github-actions
Copy link

Codex AI Incremental Review

This is an incremental review focusing on changes since the last review.

Issues (if any)

(none)

Previous Issues (for incremental reviews)

  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:434 - Line thickness broken for diagonal lines.
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Panic on negative focus offsets.
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:682 - Rounded rect gradient fallback loses radius.
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:356 - Thick diagonal lines render as 1px.
  • [RESOLVED] crates/oasis-ui/src/focus.rs:143 - Negative focus offsets can overflow indicator size.
  • [RESOLVED] crates/oasis-backend-sdl/src/lib.rs:687 - Rounded gradient fallback drops corner radius.
  • [RESOLVED] crates/oasis-browser/src/layout/block.rs:131 - Unstable let_chains syntax used.
  • [RESOLVED] crates/oasis-ui/src/list_view.rs:61 - Unstable is_multiple_of method on u32.
  • [RESOLVED] crates/oasis-backend-psp/src/shapes.rs:74 - Floating-point arithmetic in const fn.
  • [RESOLVED] crates/oasis-ui/src/focus.rs:146 - Focus indicator size math can still overflow for extreme offsets.
  • [RESOLVED] crates/oasis-ui/src/spinner.rs:163 - SpinnerStyle::Bar ignores the provided label.
  • [RESOLVED] crates/oasis-ui/src/spinner.rs:161 - SpinnerStyle::Bar still ignores the configured label.

Suggestions (if any)

(none)

Notes

  • Verified the new file crates/oasis-ui/src/spinner.rs and found no additional actionable regressions.
  • Local verification passed: cargo test -p oasis-ui spinner and cargo check -p oasis-browser -p oasis-ui -p oasis-backend-sdl.
  • mcp__reaction-search__search_reactions was unavailable in this environment, so fallback reaction URL is used.

Reaction


Generated by Codex AI (gpt-5.3-codex). Supplementary to human reviews.

@AndrewAltimit
Copy link
Owner Author

Review Response Agent (Iteration 3)

Status: No changes needed

Fixed Issues

  • (none needed - all previously reported issues already resolved)

Ignored Issues

  • (none - no new issues reported)

Deferred to Human

  • (none)

Notes

  • Both Gemini (gemini-3.1-pro-preview) and Codex (gpt-5.3-codex) incremental reviews found zero new issues
  • All 12 previously tracked issues are marked RESOLVED by both reviewers
  • Gemini gave positive feedback on the TextMetrics addition, 489 new tests, and path traversal security protections
  • Codex verified locally with cargo test -p oasis-ui spinner and cargo check
  • No code changes required for iteration 2

The agent reviewed feedback but determined no code changes were required.

@AndrewAltimit AndrewAltimit merged commit 942b810 into main Feb 21, 2026
7 checks passed
@AndrewAltimit AndrewAltimit deleted the feat/comprehensive-improvements branch February 21, 2026 16:25
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