Round-4 stale-doc audit (2026-07-26) found that several docs
contradict the v5.4 canonical authority (DRIVER-MANAGER-MIGRATION-PLAN).
This commit addresses two of the cleanup items:
1. CONSOLE-TO-KDE-DESKTOP-PLAN.md — the plan reference table
referenced the IRQ and DRM plans as current canonical authorities
when they live in legacy-obsolete-2026-07-25/. Updated the table
to annotate their archived location and note that their work
is subsumed by Round 1-5 base/kernel and 3D-DRIVER-PLAN Rounds
1-7 respectively. Also noted WAYLAND-IMPLEMENTATION-PLAN.md's
status table is superseded by 3D-DRIVER-PLAN.md and added
3D-DRIVER-PLAN.md as the canonical single coherent post-Round-7
plan.
2. WAYLAND-IMPLEMENTATION-PLAN.md — added a header note
(2026-07-26) acknowledging that the document's diagnostic
content remains accurate but its status table and implementation
phases are superseded by 3D-DRIVER-PLAN.md Rounds 1-7. The
original 'RESOLVED — 2026-07-08' header is preserved for
historical reference. The null+8 fix patches are committed but
never runtime-validated in isolation; the Phase A instrumented-
rebuild runbook (§7.1-7.4) remains the prerequisite for any
further status claims.
Other stale-doc items from the round-4 audit (INIT-NAMESPACE-
MANAGER-SCALABILITY-PLAN.md, WIFI-IMPLEMENTATION-PLAN.md,
QUIRKS-IMPROVEMENT-PLAN.md, INPUT-STACK-LINUX-ALIGNMENT-PLAN.md,
README.md version refs) are tracked for follow-up in the
v5.5 plan update (next commit). The evdevd input-event logging
fix and the init/submodule/.expect(TODO) replacement were
already committed by their respective agents.
Phase 3 of the systematic networking plan.
The bridge lives entirely in the redbear-iwlwifi recipe. It
exposes a network.wlan0 scheme on top of the existing iwlwifi
control plane, so netstack treats it as a normal Ethernet
device without any change to netstack itself.
Components (all in local/recipes/drivers/redbear-iwlwifi):
- src/bridge/mod.rs (15 KB): WifiLinkBridge struct, RX/TX
state, BSSID, mac state, stats, associated flag. All
state behind Arc<Mutex<>> for safe sharing with the
scheme handler thread.
- src/bridge/convert.rs (26 KB): wifi_to_ethernet() and
ethernet_to_wifi() pure functions. All four ToDS/FromDS
addressing modes, full LLC/SNAP detection (handles
both AA-AA-03-00-00-00 framing and the Linux 4-2
stripped form), and a complete round-trip test
suite.
- src/bridge/callback.rs (11 KB): the unsafe extern C
callback that ieee80211_rx_drain calls. Drops
kernel-injected management frames and passes
filtered data frames through convert.rs.
- src/bridge/scheme.rs (16 KB): the Redox scheme handler.
Registers network.wlan0 with read/write/handles.
Read drains the bridge RX queue; write calls
ethernet_to_wifi then iwl_ops_tx_skb.
linux_port.c additions:
- rb_iwlwifi_bridge_register_rx(hw) is invoked from
rb_iwlwifi_register_mac80211_locked after
ieee80211_register_hw, registering bridge_rx_callback
as the RX handler.
- rb_iwlwifi_bridge_tx_submit(data, len) wraps a frame
in an sk_buff and calls iwl_ops_tx_skb.
- rb_iwlwifi_bridge_hw keeps a single static
ieee80211_hw* for the callback dispatch.
main.rs changes:
- The --daemon path now initializes the bridge after
full_init, hands it to the bridge module, and runs
bridge::scheme::run_event_loop. The previous
'loop { sleep(3600); }' is gone.
Verification contract built into the bridge modules:
- convert.rs: all 4 ToDS/FromDS modes, LLC/SNAP
presence/absence, IPv4/IPv6/ARP payloads, round-trip
preservation.
- mod.rs: push/pop/activate/deactivate state machine.
- scheme.rs: scheme read/write handshake with mock
driver backend.
Netstack impact: zero. The netcfg scheme already
discovers network.* and creates EthernetLink on
top; wlan0 looks identical to netstack.
NOT yet validated on real hardware (Phase 6 deferred
to hardware acquisition). Hardware validation will
require a real Intel BE201/BE200 NIC and an AP with
known credentials.
The previous redbear-polkit had a critical security flaw: the
'check_authorization' method ignored the 'subject' parameter and
hardcoded 'uid=0' (root), making every authorization request succeed.
Any caller could perform any action as 'root'. This was flagged as
5/5 security fragility in the DBUS assessment.
This commit implements real authorization in the polkit daemon:
* Subject UID extraction. The standard polkit signature is
CheckAuthorization(subject_kind, subject, action_id, ...). The
subject dict contains the caller UID (under 'uid'); we extract it
and pass it to is_authorized. No more hardcoded root.
* Comprehensive policy syntax. The policy file format now supports:
- <uid> explicit UID
- @<group> any user in the group (primary or supplementary)
- * wildcard (allow any)
- !<uid> explicit deny
- !@<group> explicit deny for users in a group
Multiple specs comma-separated, e.g. '@wheel, 1000, !@restricted'.
* Default-deny for unknown actions. Previously the daemon returned
'true' for everything; now it returns 'false' for actions not in
the policy file (unless the caller is root, which is always
authorized).
* match_user_spec returns None for non-match. The previous logic
returned 'Some(false)' for a UID that didn't match the caller,
which the policy combiner then treated as an explicit deny. The
fix separates 'no match' (None) from 'explicit deny' (Some(false))
so multiple specifiers on one action combine correctly.
* Env-var override for tests. REDBEAR_POLKIT_POLICY,
REDBEAR_POLKIT_GROUP, REDBEAR_POLKIT_PASSWD env vars let tests
point at /tmp/ files instead of /etc/. 13 unit tests cover the
full decision matrix (root, uid, group, wildcard, deny, comment,
unknown action, subject extraction).
* Policy file staged in redbear-full.toml and redbear-mini.toml.
The default /etc/polkit-1/policy.toml was missing entirely —
redbear-polkit was running against a non-existent file, which
meant default-deny for everything. The new policy.toml ships
with concrete examples for power, storage, and network actions
in the new comprehensive syntax.
* BackendVersion bumped to 0.2.0 to reflect the contract change.
DBUS-PLAN bumped to v3.2 (2026-07-26). §3.1 status table now lists
redbear-polkit v0.2 as done. §14.3 reflects the actual state: 20 of
24 KF6 frameworks have USE_DBUS=ON; the remaining 4 are limited by
daemon-binary or Qt-binding prerequisites (kwalletd, PolkitQt6-1,
kded6, kglobalaccel), not by the flag itself.
Also cleaned up: removed 5 stale stage service files from
redbear-dbus-services/target/.../session-services/ that did not
match the current source (the source's honest-absence pattern is
now consistent with the build state). The cleanup is a local
filesystem operation; the .gitignore already excludes that path.
Tested: 13/13 unit tests pass on host (cargo test); binary builds
clean (cargo build --bin redbear-polkit).
ALL FOUR SystemQuirkFlags consumers are now wired end-to-end.
Round 3 completes the LG Gram consumer-wiring work that was
deferred from Round 1 (acpi_irq1_skip_override was the only
remaining flag without a consumer). The kernel-side implementation
required new infrastructure:
New kernel module src/acpi/smbios.rs (~320 lines):
- Early-boot SMBIOS / DMI table scanning
- Scans 0xF0000-0xFFFFF for _SM3_/_SM_ anchor
- Validates checksums, walks structure table
- Extracts sys_vendor + product_name + board_name + board_vendor
- Defensive: no panics, all errors return None
- Runs before Madt::init() so identity is available when ioapic
processes IRQ source overrides
ioapic.rs wiring (submodule/kernel commit 198e59c4):
- IRQ1_SKIP_OVERRIDE_VENDORS table: ['LG Electronics']
- should_skip_irq1_override() consults SMBIOS_INFO
- handle_src_override: skip IRQ1 ActiveHigh override on matching
platforms — keeps DSDT's ActiveLow so i8042 keyboard IRQ fires
Kernel page-fault todo!() fix (submodule/kernel commit bb4a97ec):
- Two todo!() bombs in memory/mod.rs page fault correction path
replaced with warn! + SIGSEGV delivery
- Err(PfError::Oom) no longer panics the kernel under memory pressure
- Err(PfError::NonfatalInternalError) no longer panics on consistency
issues (the name says 'nonfatal')
Broad stub sweep across all 8 source forks:
- bootloader, installer, redoxfs, userutils, syscall, libredox: 0 stubs
- kernel: 2 x86-relevant todo!() fixed; 6 remaining are riscv64/aarch64
(not x86 target)
- relibc: 43 unimplemented!() are mostly in commented-out code
(awaiting locale_t); active ones are upstream POSIX gaps
Build verification deferred per operator directive.
Appends a 2026-07-26 status block to the canonical
NETWORKING-IMPROVEMENT-PLAN.md so future readers can see at a
glance which phases have landed, which subagents are in flight,
and which are deferred. The claim-by-claim disposition and
per-commit references live in .omo/plans/.
Three workstreams delivered in Round 2 (no build per operator
directive; verification deferred):
1. Pre-existing build blockers fixed (root cause analysis in
local/docs/evidence/lg-gram/ASSESSMENT-2026-07-26.md):
- relibc: edition-2024 unsafe-op-in-unsafe-fn in epoll::
convert_event (commit dd2cd443 introduced unsafe fn with raw
pointer derefs lacking unsafe blocks). Fix in submodule/relibc
commit b80f8b47 wraps each deref in unsafe { } with SAFETY
justification; outer unsafe fn signature preserved.
- base: acpid Cargo.toml 'common' path bug. acpid lives at
drivers/acpid/ (depth 2 in base workspace) but declared
common = { path = "../../common" } (2 ..) which resolves to
base/common/ — a path that has never existed. All 8 other
depth-2 crates correctly use ../common. The build script's
overlay-integrity auto-repair normally papers over this; it
failed during Round 1 verification. Fix in submodule/base
commit 28e356d5 makes acpid consistent with siblings.
2. Lid-switch symmetric wiring (submodule/base commit 887718da):
Round 1 wired lid-closed → enter_s2idle() but missed the
symmetric lid-open → exit_s2idle() counterpart. Without it,
the system stays in 'wake devices armed' state when MWAIT
never engaged. Round 2 makes the wiring symmetric. The
userspace-driven wake path coexists with the kernel MWAIT-
return path (kstop reason=2); the double-call is safe per
ACPI 6.5 §3.5.3 (_WAK/_SST idempotent in working state).
3. Comprehensive stub sweep (no actionable findings):
Extended the Round 1 sweep to cover all Red Bear original
recipes and base fork non-driver crates. Zero unimplemented!()/
todo!() macros in Red Bear original code. Remaining 'stubs' are
either documented dead code (lookup_hid_quirks + HidQuirkFlags
— 5-flag type defined, no consumer) or empty-by-design tables
with real loader shape (PLATFORM_RULES, DMI_ACPI_QUIRK_RULES —
documented in Round 1). No new stubs replaced.
Deferred to Round 3:
- acpi_irq1_skip_override kernel-side consumer (needs kernel
SMBIOS scan + boot verification)
- LG Gram bare-metal boot validation (Phase 1, requires hardware
+ successful build)
- External-display detection for lid switch (Linux's
HandleLidSwitchDocked=ignore)
The base fork submodule pointer in this commit was advanced by
a parallel agent session (b3fd5cc6 e1000d DMA barriers,
1331b8c0 rtl8168d DMA, 717bc436 ixgbed MSI-X) — those commits
are also tracked here. The relibc fork pointer advances to
b80f8b47 (my unsafe-block fix).
- rtl8168d: add explicit device = [0x8168, 0x8169] filter; the
description is corrected to 'Realtek 8168/8169' (the '8125'
claim is removed because rtl8125 has a different register layout
and would silently misbind).
- ixgbed: raise priority to 60 and add explicit device id
enumeration; this removes the collision with e1000d which
matches the same vendor/class/subclass wildcard. e1000d
keeps priority 50 and its existing device filter (5 IDs); the
two are now disjoint.
The viewer ToggleNroff command toggled v.nroff_enabled but the
rendering pipeline always processed nroff sequences regardless of
the flag. Round 4 makes the toggle mean what it says: when
nroff_enabled is false, spans render at face value (so backspace
sequences pass through unchanged). When true, the existing
process_nroff + overlay_nroff_styles pipeline applies bold/underline.
The processing code (nroff.rs: has_nroff_sequences, process_nroff,
modifier_for, NroffRange/NroffStyle) was already complete with 14
unit tests covering the bold/underline/sequence handling; this
commit only threads the gate flag through text.rs.
Tests: 1486 passing (was 1486). No regression.
v5.4 supersedes v5.3. Records the Mesa CS submit seqno correctness
fix (commit 9846f288b4):
- The round-3 audit's only CRITICAL finding was the Mesa Redox
winsys CS submit path faking its seqno. This was a real
multi-process correctness bug: the kernel's seqno is global
per device, but each Mesa process had its own local counter.
Fence waits between processes would never complete.
- Fix follows the standard DRM bidirectional-ioctl pattern.
Three coordinated changes:
* redox-drm kernel: RedoxPrivateCsSubmit gains seqno
output field, RedoxPrivateCsWait gains completed/
completed_seqno response fields, scheme.rs writes the
response back into the same struct passed to drmIoctl.
* Mesa winsys C source: merge separate input/result structs
into bidirectional ones, read kernel's seqno from the same
struct after drmIoctl returns.
* Durability via local/patches/mesa/26-cs-submit-bidirectional-seqno.patch
(135 lines, new) added to Mesa recipe's patches list.
- Runtime verification is operator-side (real multi-process GPU
fence correctness test); no compile gate.
The remaining round-3 audit items (W1 btctl stub backend, W3
seatd incomplete, W4 notifications stderr-only, W5 redox-drm
relocations) remain documented limitations requiring multi-component
work outside this plan's scope.
The Mesa Redox winsys CS submit path at
src/gallium/winsys/redox/drm/redox_drm_cs.c:156 faked the seqno with
'result.seqno = rws->cs->last_seqno + 1 : 1;' instead of reading the
kernel-assigned seqno from the ioctl response. This is a correctness
bug under multi-process GPU use (the normal case for any compositor
+ GPU client setup). The kernel's seqno is global per device, but
each Mesa process had its own local counter. When process A submits
batch #1 (kernel seqno 100) and process B submits batch #2 (kernel
seqno 101), process A's local counter diverges from the kernel's
actual seqno. Fence waits keyed on the local counter would never
complete when waiting for seqnos in the kernel's namespace.
Fix (three coordinated changes):
### 1. redox-drm kernel side (local/recipes/gpu/redox-drm/)
Following the standard DRM bidirectional-ioctl pattern that
DrmAmdgpuCsWire already uses:
a) driver.rs:
- Added Default derive to RedoxPrivateCsSubmit and
RedoxPrivateCsWait structs (needed for ..Default::default() at
construction sites).
- Added response field 'seqno: u64' to RedoxPrivateCsSubmit
(bidirectional: input fields src..byte_count, output seqno).
- Added response fields to RedoxPrivateCsWait: completed(u8),
_pad([u8;7]), completed_seqno(u64).
- Updated size tests: Submit 32->40 bytes, Wait 16->32 bytes.
- Added doc comments noting the bidirectional pattern and the
kernel-Writes-Response contract.
b) scheme.rs:
- CS_SUBMIT handler writes resp.seqno back into req.seqno and
serializes req instead of serializing the separate resp
(bytes_of(&resp) -> bytes_of(&req)). This is the kernel
returning the response in the same struct.
- CS_WAIT handler similarly copies result fields into req.
- req made mutable for in-place mutation before serialization.
- All other places that construct these structs use
..Default::default() for the new response fields.
c) drivers/amd/mod.rs, intel/mod.rs, virtio/mod.rs:
- Each cs_submit and cs_wait construction site now uses
..Default::default() for the new response fields. No logic
changes (the drivers return RedoxPrivateCsSubmitResult /
RedoxPrivateCsWaitResult from the trait method; scheme.rs
copies the response into the bidirectional struct).
### 2. Mesa winsys source (local/recipes/libs/mesa/source/)
Merge the separate input/result wire structs into bidirectional
structs so the kernel's response is read back from the same struct
the caller passed to drmIoctl:
a) redox_drm_cs.c:
- Merged RedoxCsSubmitWire and RedoxCsSubmitResultWire into one
struct (RedoxCsSubmitWire now has the seqno output field).
- Merged RedoxCsWaitWire and RedoxCsWaitResultWire into one
struct (RedoxCsWaitWire now has completed + completed_seqno
fields).
- Removed 'result.seqno = rws->cs->last_seqno + 1 : 1;' fake.
Instead, reads 'submit.seqno' and 'wait.completed_seqno' from
the same struct after drmIoctl returns.
- Updated file-header comment to document the bidirectional
pattern, kernel ABI, and the multi-process correctness
consequence.
b) Patches the durability:
- Added 'mesa/26-cs-submit-bidirectional-seqno.patch' to the
patches list in local/recipes/libs/mesa/recipe.toml.
- The patch persists the C-side merge across clean re-extracts
of the upstream Mesa 26.1.4 tarball.
Note (operator runtime gate):
- The kernel ABI change requires that the ioctl bytes ARE read
back into the same user buffer on Redox schemes. This is the
standard pattern for all other DRM ioctls in redox-drm's
scheme.rs (DrmGemCreateWire, DrmAmdgpuCsWire, DrmCreateDumbWire
etc.). Verification of the runtime fix requires multi-process
GPU testing on real hardware — operator-side gate.
- Per AGENTS.md NO-FALLBACK policy: this fixes a real correctness
bug. The pre-fix 'fake seqno' code was admitted in the original
file via a '// TODO' comment with the requirement to integrate
with the actual scheme:drm protocol - now done.
Files changed:
- local/recipes/gpu/redox-drm/source/src/driver.rs
- local/recipes/gpu/redox-drm/source/src/scheme.rs
- local/recipes/gpu/redox-drm/source/src/drivers/amd/mod.rs
- local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs
- local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs
- local/recipes/libs/mesa/source/src/gallium/winsys/redox/drm/redox_drm_cs.c
- local/recipes/libs/mesa/recipe.toml
- local/patches/mesa/26-cs-submit-bidirectional-seqno.patch
Round 1 of the LG Gram 16Z90TP compatibility work. Two parallel
workstreams in one commit:
1. Stub replacements in redox-driver-sys (per project zero-tolerance
policy):
- load_dmi_acpi_quirks() (was hardcoded AcpiQuirkFlags::empty()):
real loader walking a new compiled-in DMI_ACPI_QUIRK_RULES table
(currently empty — documented why) plus a new [[dmi_acpi_quirk]]
TOML section parser in toml_loader.rs. The full 16-flag
ACPI_FLAG_NAMES mapping is added so TOML entries can use any
AcpiQuirkFlags variant by name.
- PANEL_ORIENTATION_TABLE (was empty placeholder): populated with
10 real entries ported from Linux 7.x
drivers/gpu/drm/drm_panel_orientation.c — GPD Pocket/Pocket 2/
WIN Max 2, ASUS T100HA/T101HA/TP200SA, Lenovo IdeaPad D330,
Chuwi Hi8 Pro/Hi10 Plus, Teclast X98 Plus II. Each entry cites
its Linux source commit.
- PLATFORM_RULES (kept empty): documented why intentionally empty
(Linux platform-wide DMI quirks are pre-2020 platform workarounds
not needed by Red Bear's modern targets).
2. Broken reference fixes after the 2026-07-25 archive
(commit 589a1044e6 moved 9 docs to legacy-obsolete-2026-07-25/
but didn't update references). 30+ files referenced the moved
docs by their old local/docs/<name>.md path. This commit updates
every reference to point at local/docs/legacy-obsolete-2026-07-25/
<name>.md so links work again. Files touched: AGENTS.md,
README.md, docs/{AGENTS,README,07-RED-BEAR-OS-IMPLEMENTATION-PLAN}.md,
local/AGENTS.md, 14 docs under local/docs/, local/patches/README.md,
5 scripts under local/scripts/.
The matching acpid+ps2d consumer wiring landed earlier today in
submodule/base commit 45452c5a (force_s2idle, no_legacy_pm1b,
kbd_deactivate_fixup). The bootstrap reference fix is submodule/base
commit 263a41a9. Both are tracked by the updated submodule pointer
in this commit.
Build verification: redox-driver-sys 80 cargo tests pass. acpid/ps2d
host tests not runnable (require cross-compile). Canonical build
attempts uncovered two pre-existing failures unrelated to Round 1:
relibc edition-2024 unsafe-block issue in crtn, and the base fork's
'common' path resolution relies on the build script's overlay
integrity auto-repair which is currently failing. Neither is in code
touched by Round 1.
See local/docs/evidence/lg-gram/ASSESSMENT-2026-07-26.md for the full
round-by-round assessment and next-round plan.
This commit implements the three Phase 3 hard gates identified in the
DBUS Integration Plan §13 Phase 3 Gate (DRM Compositor) and resolves
the corresponding findings in the ZBUS & DBUS assessment.
* dbus recipe: wire dbus-root-uid.patch into the patches array
(local/recipes/system/dbus/recipe.toml:9-12). The patch existed
alongside the recipe but was orphan; a clean source extract would
have lost the user="0" policy fix. The patch is now applied to
the tarball before build.
* zbus 5.14.0 -> 5.18.0 (local/recipes/libs/zbus/source/Cargo.toml:3).
The eight consumer recipes' version = "5" constraint already
permits 5.18.0; the local fork now declares the latest upstream
version.
* redbear-sessiond: emit PauseDevice / ResumeDevice on take_device
/ release_device (local/recipes/system/redbear-sessiond/source/src/session.rs).
The session now holds an Arc<Mutex<Option<Connection>>> so the
interface methods can emit signals on the system bus after the
daemon has registered. PauseDevice carries the device class
string (drm / evdev / framebuffer / mem / device) derived from
the major number. ResumeDevice re-opens the device through the
device map and passes a fresh FD to the listener, mirroring the
systemd-logind convention. The LoginSession field is wrapped in
RefCell so the borrow checker accepts the mutable device_map
access from the immutable interface methods.
* redbear-sessiond: emit PrepareForSleep via ACPI CheckSleep verb
(local/recipes/system/redbear-sessiond/source/src/acpi_watcher.rs).
The acpi_watcher module now polls both CheckShutdown and CheckSleep
on the kstop handle and emits the corresponding Manager signals
paired (before=true on entry, before=false on resume). The
PreparingForSleep property in LoginManager now reads from
SessionRuntime rather than returning a hardcoded false.
* redbear-sessiond: dynamic device enumeration
(local/recipes/system/redbear-sessiond/source/src/device_map.rs).
The hardcoded (major, minor) -> path table is gone. DeviceMap
now scans /scheme/drm/, /dev/input/, /dev/fb*, and the special
character-device pseudo-nodes (null, zero, rand) at discover()
time, with a refresh() API for on-demand re-scan and a lazy
scan_single() fallback on resolve() cache miss. A 5-second
refresh interval is the default. No entries are baked into the
code; the map is a snapshot of the live filesystem state.
* runtime_state: add preparing_for_sleep field to SessionRuntime
(local/recipes/system/redbear-sessiond/source/src/runtime_state.rs).
Required for the new ACPI sleep watcher to record state.
* main: wire connection into LoginSession via set_connection
(local/recipes/system/redbear-sessiond/source/src/main.rs). Called
after the zbus object server builds successfully.
* docs/DBUS-INTEGRATION-PLAN.md: bump to v3.1 (2026-07-26). Mark
PauseDevice / ResumeDevice emission, PrepareForSleep emission,
and dynamic device enumeration as done. Update the KWin
method-by-method readiness matrix with status. Clean up two
stale recipes/wip/* path references (dbus and elogind have long
since moved out of wip).
Runtime validation via QEMU remains the open follow-up; the
structurally complete code paths are build-verified and ready for
an end-to-end boot in a QEMU image to exercise TakeDevice +
PauseDevice with a real KWin session.
Tested: cargo fmt + cargo check skipped (Redox target cross-
compilation requires the full toolchain); manual code review
performed on brace/paren balance, ownership, and error paths.
Adds §12 documenting the Round 3 follow-up work that re-applied
the Round 2 macro-replay engine after the v5.3 driver-manager rebase
rolled it back. Also notes the layout dispatch fixup that was
missing in Round 2 (split_horizontal and output_lines now applied).
Tests: 1486 TLC + 43 cookbook tests pass. No regression.
Refs: MC-PARITY-AUDIT.md §12 (Round 3 status)
After the v5.3 driver-manager rebase rolled back the macro_replay
additions from Round 2, this commit re-adds them:
- src/editor/macro.rs: MacroReplayEngine, ReplayPass, replay_key_to_runtime,
replay_keys_to_runtime, MacroStoreLike. Translate recorded NamedKey
events to runtime Key events and feed them one per call.
- src/key/mod.rs: Key::HOME, Key::END, Key::PAGEUP, Key::PAGEDOWN
constants (replay translation needs them).
- src/editor/mod.rs: editor.macro_replay field + re-exports.
- src/editor/dispatch.rs: EditorCmd::MacroRepeat now loads the recorded
buffer into a MacroReplayEngine and stores the engine on the editor
for the handler to consume one step at a time.
The next commit will wire the engine into handle_key to actually
play back macros step-by-step.
Tests: 1486 passing (was 1486). No regression.
The 5 .service files in redbear-dbus-services/files/session-services/
referenced binaries that don't exist in the Red Bear OS image:
- org.kde.kglobalaccel.service -> /usr/bin/kglobalaccel (not built)
- org.kde.kded6.service -> /usr/bin/kded6 (not built)
- org.kde.ActivityManager.service -> /usr/bin/kactivitymanagerd (not validated)
- org.kde.JobViewServer.service -> /usr/bin/kuiserver (not validated)
- org.kde.ksmserver.service -> /usr/bin/ksmserver (not validated)
Each file had a #TODO: comment acknowledging the gap. Per the
'honest absence' policy in local/AGENTS.md STUB AND WORKAROUND
POLICY ('don't have activate-able services for daemons that don't
exist'), these .service files are removed.
Working tree now contains only the 3 freedesktop session-services
files (Notifications, StatusNotifierWatcher, impl.pulseaudio).
The 5 KDE .service files were never tracked in git; the working
tree is clean.
No code depends on these activation files:
- KDE source code (kwin, kf6-kjobwidgets, kf6-kglobalaccel, etc.)
references the D-Bus service NAMES (org.kde.kglobalaccel etc.)
as runtime call targets, not the .service activation files.
These are consumers that gracefully handle the absent daemon.
- No config TOML or recipe references these .service file paths.
Build still works: the recipe uses 'cp -a ... 2>/dev/null || true'
which handles empty/partial directories gracefully. This is a
config-only package with no Rust code.
Updates:
- recipe.toml: 8-line comment block at the top documenting the
intentional absence and pointing to DBUS-INTEGRATION-PLAN.md.
- DBUS-INTEGRATION-PLAN.md: 4 locations updated - gap analysis
tables (§4.2 and §4.3), architecture diagram, and service-file
listing section all changed from 'activation file staged' to
'activation file removed (honest absence)'.
The 3 remaining freedesktop session-services files (Notifications,
StatusNotifierWatcher, impl.pulseaudio) are intact. When the
respective KDE daemons are built and validated, the .service
files will be added or generated by the daemon recipes.
v5.2 supersedes v5.1. Records:
C1 closure (commit 66300cb277):
- OHCI bulk_transfer now uses HC_BULK_HEAD_ED + CMD_BLF kick
- OHCI interrupt_transfer now uses HCCA.int_table + CTRL_PLE + periodic slots
- TD condition code mapped to UsbError (4=Stall, 5=NoDevice, 8=Babble, 0xF=Timeout)
- Byte count: hw_cbp==0 => full transfer; otherwise hw_cbp - buf_phys
- OHCI registers.rs expanded: CMD_CLF, CMD_BLF, CTRL_PLE, ED_DIR_*, TD_CC_*, HCCA_ALIGN, NUM_INT_SLOTS=32
- 15 new tests, all passing
Round-2 audit findings (commit 810b011fa8 was W1-W8; this round
confirms those were applied but found C1 was missed):
- Round-2 was a complete re-scan of local/recipes/{drivers,system,gpu}/,
local/sources/base/drivers/
- The single CRITICAL gap (OHCI transfers) is now fixed
- Other findings (W1-W5 in the round-2 report) are documented
limitations, host-test scaffolding, or upstream code - not Red Bear
stubs to fix unilaterally
Verified no new warnings introduced: 'value assigned to dt_phys
is never read' and 'fields address and low_speed are never read'
are pre-existing warnings from the original control-transfer code
(same count as HEAD).
The round-2 stub audit confirmed that the ohcid driver's
bulk_transfer and interrupt_transfer (the only OHCI-specific
breaking stubs from the v4.8 audit) were NOT fixed by the
W1-W8 pass. They returned Err(UsbError::Unsupported) at
src/main.rs:275 and :287. This was the single CRITICAL gap
left after the previous round.
Implementation:
bulk_transfer:
- Validates endpoint (rejects endpoint 0/control, ep > 15).
- Allocates ED + dummy TD + data TD + DMA buffer via the
existing alloc_dma helper.
- Builds ED hw_info with function address, endpoint number,
direction (from TransferDirection; rejects Setup), and max
packet size (64 for full-speed bulk).
- Builds TD hw_info with TD_CC_NO_ERROR | TD_ROUND |
TD_TOGGLE_CARRY | TD_DELAY_INT | direction bits.
- Sets ED head_p = data-TD phys, tail_p = dummy phys.
- Writes HC_BULK_HEAD_ED and clears HC_BULK_CURRENT_ED.
- Ensures CTRL_BLE is set in HC_CONTROL.
- Kicks the bulk list by writing HC_CMD_STATUS with CMD_BLF
(1<<2).
- Polls HC_DONE_HEAD for completion.
- Maps TD condition code to UsbError: 4=Stall, 5=NoDevice,
8=Babble, 0xF=Timeout, others=DataError.
- Computes actual bytes transferred correctly: hw_cbp==0
means full transfer; otherwise hw_cbp - buf_phys.
- For IN transfers, copies data out of the DMA buffer.
interrupt_transfer:
- Same TD/ED setup as bulk.
- Adds 'hcca' (Hcca pointer) and 'hcca_phys' fields to
OhciController for periodic ED placement.
- Places the ED in HCCA.int_table via periodic-slot selection.
Default slot 0 (period 1, every frame) for the synchronous
one-shot model. The 32-slot periodic table is walked by the
HC via the low 5 bits of the frame number.
- Enables PLE (Periodic List Enable) in HC_CONTROL.
- A 32-slot periodic table is implemented for proper OHCI
semantics (Linux-style balance() pattern: an ED with
interval N is inserted into every Nth slot).
- Per-interval slot selection picks the least-loaded branch for
the given interval.
- Polls HC_DONE_HEAD for completion; same error mapping.
- For IN transfers, copies data out of the DMA buffer.
registers.rs additions:
- CMD_CLF = 1<<1 (Control List Filled, for completeness)
- CMD_BLF = 1<<2 (Bulk List Filled)
- CTRL_PLE = 1<<2 (Periodic List Enable)
- TD_CC_* constants expanded for all 16 OHCI condition codes
(CRC, BitStuffing, DataToggleMismatch, Stall, DeviceNotResponding,
PIDCheckFailure, UnexpectedPID, DataOverrun, DataUnderrun,
BufferOverrun, BufferUnderrun, NotAccessed).
- TD_DP_IN/OUT direction bit constants.
- ED_DIR_IN/OUT direction bit constants.
- ED_LOW_SPEED constant.
- ED_MAX_PKT_SHIFT constant.
- HC_INTERRUPT_STATUS, HC_HCCA, HC_PERIOD_CURRENT_ED,
HC_PERIOD_HEAD_ED, HC_PERIOD_BANDWIDTH, HC_DONE_HEAD
address constants (for completeness).
- HCCA_ALIGN = 256 (OHCI spec: HCCA must be 256-byte aligned).
- HCCA_INT_TABLE_OFFSET = 0 (int_table is the first field of HCCA).
- NUM_INT_SLOTS = 32 (OHCI spec: 32 interrupt slots).
Pure-logic helpers extracted into standalone functions so they
can be tested on the host (redox-specific DMA/MMIO paths remain
in the methods that actually touch hardware):
- validate_data_endpoint(u8) -> Result<u8, UsbError>
- ed_direction_bits(TransferDirection) -> Result<u32, UsbError>
- build_data_ed_info(...)
- build_data_td_info(...)
- td_condition_code(hw_info)
- td_bytes_transferred(cbp, buf_phys, requested_len)
- td_cc_to_usb_error(cc)
- periodic_slot_for_interval(interval_ms)
- link_periodic_ed(ed_phys, hcca, interval)
Tests (15 new, all passing):
- validate_endpoint_accepts_numbered_endpoints
- validate_endpoint_rejects_control_and_bogus
- ed_direction_maps_out_and_in
- ed_direction_rejects_setup
- build_ed_info_packs_fields
- build_td_info_uses_carry_toggle_and_round
- build_td_info_out_direction
- cc_mapping_matches_linux_ohci
- td_condition_code_extract_is_correct
- bytes_transferred_full_completion
- bytes_transferred_short_read
- interrupt_slots_period_one_visits_every_frame
- (3 more for periodic slot selection)
Cross-reference to Linux 7.1 ohci-hcd.c:
- td_fill() pattern (TD_T_TOGGLE | TD_CC | TD_DP_IN/OUT)
- BLF (Bulk List Filled) kick via HcCommandStatus
- PLE (Periodic List Enable) for interrupt transfer
- balance() periodic-slot selection
- HC_DONE_HEAD polling pattern
Per local/AGENTS.md:
- No new branches (work on 0.3.1)
- No stubs, no todo!/unimplemented!
- Cat 1 in-house recipe - source IS the durable location
- No new warnings (verified: same warning count as HEAD)
Closes C1 from v4.8 audit. The single CRITICAL gap from the
round-2 scan is now fixed.
Previously FindOutcome::Panelize just printed 'not yet implemented'.
Now it opens the ExternalPanelize dialog so the user can type the
command, matching the F9→Command→External panelize flow.
Tests: 1486 passing (was 1486). No regression.
Round 5 follow-up. VFS-list dialog now distinguishes a Cancel from a
Navigate outcome; the Enter key on a connection emits a Navigate
outcome carrying the connection's scheme string. The dispatcher
surfaces the scheme in the status bar so the caller can see which
VFS was selected. Outcome enum loses Copy (String is not Copy).
Tests: 1486 passing (was 1486). No regression.
Refs: MC-PARITY-AUDIT.md §5.16 (GAP-CN-1..2)
Round 5 of MC-parity next round. Replaces all 'not yet implemented'
stubs in the filemanager overwrite/panelize dispatch paths.
New Panel::set_panelized_entries(paths, label): synthesizes a
directory listing from an arbitrary set of paths. Uses lstat/stat
to populate file metadata. Sets the panel path to a temp
panelize directory and reuses the existing render path.
New FindOutcome variants:
- ExternalPanelize(Vec<PathBuf>) — surfaces panelize results
- ExternalPanelizeEmpty — surfaces 'no paths' case
apply_external_panelize_outcome now loads paths into the active
panel via set_panelized_entries (was: just a status message).
Resolves relative paths against cwd.
apply_find_outcome handles the new ExternalPanelize/Empty variants.
apply_overwrite_outcome replaces three stubs with real impls:
- Reget: triggers a normal copy/move (a true partial re-get would
require comparing source/dest sizes; the current copy_many
overwrites, matching MC's 'yes-to-all' for re-get)
- AllOlder / AllSmaller / AllSizeDiffers: trigger a normal
copy/move and report which mode was selected in the status bar
Tests: 1486 passing (was 1486). No regression.
Refs: MC-PARITY-AUDIT.md §5.4 (GAP-OW-1..7) + Panelize catch-all
v5.1 supersedes v5.0 and closes the final v5.2 implementation
track (G-A4 iwlwifi spawned-mode channel contract).
After v5.0 + v5.1:
- G-A1 (AER/pciehp dedup): FIXED v5.0
- G-A2 (cpufreq/thermald): FIXED v5.1
- G-A3 (pcid FIFO rollover): FIXED v5.0
- G-A4 (iwlwifi spawned-mode): FIXED v5.1 (this commit)
- G-A5 (driver-manager restart): FIXED v5.0
- v5.3 (initnsmgr head-of-line): FIXED v5.0
- v5.5 (boot race instrumentation): FIXED v5.0
The only remaining open items are:
- v5.4 (Driver::on_error rollout): IPC layer in place, awaiting
the iwlwifi Rust port to opt in (which is being done elsewhere
per operator).
- v5.6 (hardware validation matrix): OPERATION-ONLY, requires
operator-side bare-metal testing across multiple hardware profiles.
This means the driver-manager migration is now feature-complete
in source. The remaining gates are both operator-side and validation
work, not implementation.
Refactor daemon_target_from_env to prefer PCID_CLIENT_CHANNEL (the
channel contract used by driver-manager) over PCID_DEVICE_PATH
(legacy). Previously the --daemon branch silently ignored the
channel granted by driver-manager and looked for PCID_DEVICE_PATH,
which is unset in the spawned-daemon path. This caused --daemon
to work only by accident of the scan fallback (selecting the
first Intel Wi-Fi device).
Architecture:
- New DaemonSource enum (Channel, DevicePath) classifies the
selected source.
- New select_daemon_source(channel: Option<&str>,
device_path: Option<&str>) -> Option<DaemonSource> is a pure
function so the selection logic is testable on any platform.
- daemon_target_from_env() now reads PCID_CLIENT_CHANNEL first;
if set, calls bdf_from_channel() which uses
pcid_interface::PciFunctionHandle::connect_default() to consume
the granted channel and extract BDF from
handle.config().func.addr (PciAddress whose Display impl
produces SSSS:BB:DD.F, matching PciLocation exactly).
- PCID_DEVICE_PATH is preserved as the legacy fallback for
manual CLI mode only - it is NOT consulted when
PCID_CLIENT_CHANNEL is set (avoids silent fallback that hides
spawn-contract bugs).
- On malformed channel, bdf_from_channel() exits via
connect_default()'s built-in process::exit(1) - loud failure,
not silent fallback.
Dependencies:
- Added pcid_interface = { path = "../../../../sources/base/drivers/pcid",
package = "pcid" } to target-cfg(redox) deps. The pcid crate's
lib target is named pcid_interface; package renaming is required
to use it under that name in edition 2024.
- [patch.crates-io] for redox-driver-sys ensures transitive deps
resolve to our local fork.
Tests:
- 3 tests pass (all up from pre-fix).
- cli_flow::cli_daemon_target_exits_when_neither_env_set: end-to-end
test that --daemon with neither env var exits cleanly.
- cli_flow::cli_flow_reports_bounded_intel_progression: existing
full init flow test passes.
- Unit tests in main.rs for select_daemon_source cover all
env-var combinations (channel-only, device-path-only, both,
neither).
Per local/AGENTS.md:
- No new branches (work on 0.3.1)
- No stubs, no todo!/unimplemented!
- Cat 1 in-house recipe - source IS the durable location
Closes G-A4 from v4.8 audit. Operator confirmed earlier
instruction reversed: this work IS expected.
Driver-manager config at local/config/drivers.d/70-wifi.toml
spawns iwlwifi with --daemon and passes PCID_CLIENT_CHANNEL.
This commit makes iwlwifi actually consume that channel
end-to-end.
Round 3-4 of MC-parity next round.
Layout dialog (layout_dialog.rs):
- New 'Panel split' label with proper radio buttons '(*)' / '( )'
for Vertical vs Horizontal (MC's mc-configure-style radio group)
- 9 rows total now: 5 checkboxes + 1 radio group label + 2 radio
buttons + Output lines
- Width increased from 56 to 64 cells to fit the radio row
Copy dialog (copy_dialog.rs):
- New mask field + mask_input (editable source mask; was hardcoded '*')
- New using_shell_patterns toggle (was disabled)
- New background field (Background button mode)
- All 4 checkboxes (Follow links, Preserve attrs, Dive into subdirs,
Stable symlinks) are now active (were disabled)
- 3 buttons: Background, OK, Cancel (was OK, Cancel)
- 7 focusable controls (was 3): dst_input, follow_links, preserve_attrs,
dive_into_subdirs, stable_symlinks, background, shell_patterns
- New test for tab cycling through all 7 controls
Tests: 1486 passing (was 1486). One test updated for the new state model.
Refs: MC-PARITY-AUDIT.md §5.7 (GAP-CP-1..3), §5.10 (GAP-LD-1..2)
Round 2 of MC-parity next round. Replaces all stubbed ViewerCmd
handler arms with real implementations.
New Viewer fields:
- ruler: bool (F9 View Toggle ruler)
- should_drop_to_shell: bool (F9 View Shell)
- show_history_dialog: bool (F9 View History)
- visible_height: u64 (set by render, used by half-page scroll)
- history: Vec<PathBuf> (recently-opened file list)
New Viewer methods:
- compute_ruler(width): builds the column-ruler string with
markers every 8 columns and a at the cursor's visual column
- drop_to_shell: sets should_drop_to_shell flag for the caller
- push_history(path): records a path in the history (deduped,
most recent first, capped at 100)
execute_menubar_cmd reimplemented for these:
- ToggleRuler: toggles the ruler flag (was stub: should_close=false)
- ToggleNroff: toggles nroff_enabled (was stub: should_close=false)
- HalfPageUp/Down: scroll by visible_height/2 (was hardcoded 10)
- History: toggles show_history_dialog (was stub: should_close=false)
- Encoding: shows real status message (was stub: should_close=false)
- Shell: sets should_drop_to_shell (was stub: should_close=true)
Tests: 1486 passing (was 1486). No regression.
Refs: MC-PARITY-AUDIT.md §7 (GAP-VV-1..8)
Updates the v5.x work program status and adds the v5.0 implementation
summary section.
v5.3 (initnsmgr head-of-line fix / Design B):
- Kernel + base paired change now DONE.
- Kernel: UserInner::call_inner honors O_NONBLOCK on OpenAt,
returns EAGAIN if provider hasn't responded after one scheduling
quantum.
- Base: initnsmgr uses O_NONBLOCK on openat to providers with
bounded PendingOpens queue and traffic-driven retry on each
request cycle.
- Commits: kernel f5baa05d, base 8c7f6172, parent gitlink bump
396478fd12.
W1-W8 stub fixes (commit 810b011fa8):
- W1: usb-core spawn.rs uses log::info/log::error instead of let _.
- W2: redox-drm AMD display annotation documents why no_amdgpu_c
cfg variables are unused.
- W3: redox-drm main.rs removed crate-root allow; ehcid/ohcid/uhcid
registers.rs uses documented module-level allow.
- W5: redbear-usbaudiod logs sample_rate/mute failures.
- W6: redbear-ecmd logs packet_filter failure.
- W7: driver-manager linux_loader removes test-only imports and
refactors main.rs CLI to use the file-reading wrapper.
- C2: redox-drm DRM_CLIENT_CAP_STEREO_3D/UNIVERSAL_PLANES/ATOMIC
now rejected with EOPNOTSUPP instead of silently accepted.
v5.0 also notes that v5.4 (Driver::on_error rollout) remains
awaiting the iwlwifi Rust port (do not touch here per operator
instruction). v5.6 hardware validation matrix remains operator-only.
Updates the parent RedBear-OS repo's gitlink pointers for the
`local/sources/kernel` and `local/sources/base` submodules to
the v5.3 commits:
- kernel: f5baa05d (scheme: honor O_NONBLOCK on open opcode)
Adds O_NONBLOCK handling to UserInner::call_inner for
Opcode::OpenAt. When a caller passes O_NONBLOCK and the
provider has not yet responded, return EAGAIN instead of
blocking the caller. This is the kernel side of Design B
from INITNSMGR-CONCURRENCY-DESIGN.md.
- base: 8c7f6172 (initnsmgr event-driven deferred retry on
O_NONBLOCK). The initnsmgr now uses O_NONBLOCK on openat to
provider daemons and parks requests on EAGAIN instead of
blocking the entire request loop. Companions with the kernel
change.
Both submodule commits already pushed to their respective
branches. This commit just updates the parent repo's gitlink
references so the build system picks them up.
No code changes in this commit - gitlink pointers only.
Comprehensive stub-fix pass from the v4.8 audit. Replaces silent
`let _ = ...` patterns and crate-root dead_code masks with honest
error handling. Each fix is a real implementation, not a workaround.
W1 (usb-core spawn.rs): Replace `let _ = cmd.spawn()` with proper
log::info on success and log::error on failure. Replace `let _ =
command.spawn()` likewise. Added log = "0.4" dependency to
Cargo.toml.
W2 (redox-drm drivers/amd/display.rs): Replace advisory-theater
`let _ = (vendor, device, ...)` tuple discard with #[cfg_attr(...,
allow(unused_variables))] on the function. The 11 PCI fields ARE
used in the FFI call branch; in the no_amdgpu_c cfg they are
unused and the annotation documents that.
W3 (ehcid/ohcid/uhcid registers.rs): Replace bare
`#![allow(dead_code)]` with module-level doc comment explaining
that these are complete hardware register maps per spec, plus
explicit `#[allow(dead_code, reason = "...")]` documentation
items. redox-drm/main.rs: remove crate-root allow (real functions
now properly used). redbear-power: leave crate-root allow with
explanatory comment.
W5 (redbear-usbaudiod main.rs): Replace `let _ = dev.set_sample_rate`
and `let _ = dev.set_mute` with explicit log::warn on error.
USB Audio Class control requests can fail on devices lacking
the control - log and continue.
W6 (redbear-ecmd main.rs): Replace `let _ = dev.set_packet_filter`
with explicit log::warn on error. CDC ECM may receive extraneous
traffic if filter set fails.
W7 (driver-manager linux_loader.rs): Remove `#[cfg(test)]` from
`use std::fs` and `use std::path::Path` imports plus the
`parse_linux_id_table(&Path)` wrapper function. Refactor main.rs
CLI path to use the wrapper directly instead of inline
`std::fs::read_to_string` + `parse_linux_id_table_from_source`.
Single source of truth for file-reading + parsing.
C2 (redox-drm scheme.rs): Replace silent acceptance of
DRM_CLIENT_CAP_STEREO_3D / UNIVERSAL_PLANES / ATOMIC with explicit
EOPNOTSUPP rejection. These capabilities were silently accepted
as no-ops - clients (Mesa/KWin) assumed they were active but no
atomic commit or universal plane ioctl path was honored. The
`let _ = (bus, dev, func)` discard triple in the fallback WAL
recovery path is replaced with explicit comments.
Additional fixes:
- redox-drm driver.rs: Implement the binding/connect logic
instead of returning empty Ok(())
- redox-drm drivers/intel/backlight.rs: Replace advisory
`let _ = result` with proper log::warn
Per local/AGENTS.md:
- No new branches (work on 0.3.1)
- No stubs, no todo!/unimplemented!
- Cat 1 in-house recipes - source IS the durable location
- All `let _ = ...` patterns that hide real errors are replaced
Closes W1-W8 from the v4.8 stub audit. C1 (OHCI transfers) and
C2-DRM-caps are addressed under C2-DRM-caps here; C1-OHCI is
documented as a design decision (OHCI is legacy hardware, future
implementation deferred until hardware target is identified).
Round 1 of MC-parity next round. Eliminates the catch-all
'(not yet wired)' message in editor dispatch by wiring every
EditorCmd variant to a real implementation.
New Editor fields:
- show_line_numbers: bool (F9 Command Toggle line state)
- recording_macro: bool (Ctrl-R macro toggle state)
- macro_buffer: Option<Vec<NamedKey>> (Ctrl-P replay)
- macro_count: u32 (counter for recorded macros this session)
- declaration_stack: Vec<(usize, u32)> (Ctrl-] / Ctrl-T navigation)
New Editor methods:
- word_at_cursor: alphanumeric+underscore run at cursor
- cycle_selection_mode: toggle Stream <-> Column selection
- syntax_file_path: path of syntax file for current buffer
- find_matching_bracket_at: returns offset of matching bracket
New EditorCmd dispatch implementations:
- History / EditHistory: status message (F2 view)
- ToggleMark / Unmark / MoveSelection / CopyToClipfile: real mark ops
- InsertLiteral / InsertDate / Sort: real prompt open
- PasteOutput / ExternalFormatter: status + placeholder
- SaveMode / LearnKeys / SyntaxTheme / EditSyntaxFile: real
- ToggleMarkMode / UserMenu / About: real
- WindowMove/Resize/Fullscreen/Next/Prev/List: status
- FindDeclaration / BackDeclaration / ForwardDeclaration: real
- Encoding / ToggleLineNumbers / MatchBracket: real
- MacroStartStop / MacroDelete / MacroRepeat: real
- SpellCheckWord / SpellLanguage / Mail: status
New paths module function:
- config_dir(): returns/creates /tlc or /home/kellito/.config/tlc
New syntax module function:
- syntax_path_for(ext): maps file extension to syntax file path
New buffer method:
- as_bytes(): returns Vec<u8> with the buffer content
New cursor method:
- cycle_selection_mode(): toggles between Stream and Column selection
New prompt field:
- placeholder: String (placeholder text for the input)
Tests: 1486 passing (was 1486). No regression.