Thor v1.97.0 Release Notes
Version 1.97.0 (1970) is a cumulative update covering everything added after v1.96.0
(1960) through 585acf62. It combines v1.96.1, v1.96.2 development builds,
v1.96.3, and the subsequent merged work through PR #553. Features already present in
v1.96.0 are outside this release's change summary.
The cumulative comparison is
v1.96.0...585acf62.
The newest published tag is v1.96.3; new work since that release is identified below,
using its tag as the fresh-change baseline. Earlier post-1960 notes remain available for
v1.96.1,
v1.96.2, and
v1.96.3.
Descriptions here reflect the final implementation, including later reliability fixes.
✨ Highlights
- 🛡️ Privilege Check becomes a bottom sheet — replaces the previous dialog, adds header
Refresh/Close icons and grant ticks, and keeps identified managers ready to Open. Discover
ReSukiSU/SukiSU Ultra or choose a shortcut for another hidden root manager. - 🛠️ Sett Edit in Extensions — inspect Android settings, preview individual changes, verify
saved values and retain edit history with Root or Shizuku. - ⏸️ Suspended apps and Unpause — find suspended user/system apps together and use Android's
supported native Unpause action. - 🛡️ More accurate root status and safer operations — coordinate fresh authorization with
accepted work, retain uncertain outcomes, and improve selected export/game-file copies,
app-data clearing and installation ownership. - ❄️ Dhizuku and Shizuku improvements — device-owner hiding and supported actions, plus a
configurable recovery fallback for affected Shizuku system-app freezes. - 🗂️ Freezer profiles and custom multi-app actions — assign selections to profiles, choose how
to recover frozen apps, and arrange separate App list/Freezer toolbars. - 🔍 App Ops and draggable scrollbars — inspect and adjust supported operation modes and
move through long app lists or grids. - 🇯🇵 Japanese, accessible confirmation and optional support — Japanese localization,
scrollable Extensions consent controls, and support shortcuts after successful actions.
What's Changed
🛠️ Built-in Sett Edit and edit-history reconciliation — new since v1.96.3
PR #530,
PR #539,
PR #544, and
PR #545
(0b309463, f64d4800, ad1fd5ee, 98793e74, 3d175607):
- Extensions → Sett Edit is bundled with Thor and needs no separate download. It supports
Root or Shizuku and stays unavailable with Dhizuku selected or without a supported provider. - Six searchable views cover System, Secure, Global, Android properties, Java properties and
Environment. Only System/Secure/Global are editable; these are Android's shared settings,
not an individual app's preferences. System/Secure use the current Android user; Global is
shared device state. Java properties and Environment describe Thor's own process. - Separate device-local first-use consent precedes editing. Add, edit and delete show the exact
old/new values and scope. Reads preserve absent, SQL-null, empty and literal-null distinctions.
Fresh conflict checks precede writes; readback confirms the stored value rather than promising
that Android applied the intended behavior. - History records original/requested values and verified, rejected, conflicting or uncertain
outcomes. Undo is available only for verified edits whose current value still matches Thor's
recorded result; it does not promise to reverse every effect of a setting. - Check current value records a later read-only observation for uncertain history. Matching
readback does not retroactively verify the original write, release an unresolved writer, or
enable undo. No uncertain command is automatically replayed. - Root helpers have bounded execution and explicit termination/output-drain acknowledgement.
Unconfirmed writes retain a durable barrier for their exact setting, including against a later
Shizuku write. New shells, provider switching and app restart alone cannot prove a writer stopped.
Android settings can affect debugging, input, accessibility and device startup. Review only changes
you understand. Android/OEM normalization can reject a requested value, and the pre-write conflict
check is not an atomic compare-and-set. Presets, bulk import, app-preference editing and Android
property mutation remain separate work.
⏸️ Suspended-app list and Android's native Unpause — new since v1.96.3
PR #529
(a92aaacc, d24b97e6), addressing issue #522:
- Home's Suspended counter opens a combined list of suspended user and system apps. It hides
when empty. Search, sorting, grid/list view, actions and queue navigation preserve the ordinary
Apps screen's filters and keep the dedicated suspension view consistent. - Root/Shizuku suspensions request Android's native Unpause app action on Android 11/API 30+.
Where supported, Android removes the selected suspension and continues the original launch. - Dhizuku retains Android's device-policy notice and Thor's in-app Unsuspend. Older Android
versions and OEM fallback paths can lack the native button. Existing suspensions keep their
original dialog until recreated, and another suspension owner's policy may still apply. - Supported suspension overloads use ordinary reflection, avoiding a native crash encountered
when an absent overload was attempted through the unsafe reflection fallback.
🛡️ Privilege Check bottom sheet and manager shortcuts — new since v1.96.3
PR #553
(e081e91f, be66be4d, 02b40176, d2465d9e, edb79102, fa86a8ab):
- The previous Privilege Check dialog is replaced by a scrollable bottom sheet. Refresh and
Close are header icon actions. The searchable manager picker is also a bottom sheet with a
header Close action and room for results above the keyboard. - Manager rows show compact app icons; root managers also show their actual package names.
Green ticks mean granted access, not simply that a manager was found or selected. Root's
tick requires an idle, confirmed root observation; checking/unknown states remain visible. - Open remains available for identified and selected managers, including while access is
granted or root is being checked. Shizuku and Dhizuku retain their supported Grant actions
when permission is missing. - Adds ReSukiSU and SukiSU Ultra discovery alongside existing managers. Renamed builds
are recognized when they retain an exact known launcher activity; names and labels alone
do not identify a root manager or prove that Thor has root access. - Choose saves a device-local shortcut to a launchable app for managers with other hidden
or randomized identities. Change reopens the picker; Clear removes only that saved
shortcut and restores automatic discovery. The selection is excluded from backups. - If no root manager can be identified or selected, a generic Root row offers Choose
while keeping root availability independent of discovery. Unavailable saved shortcuts are
identified so they can be changed or cleared; duplicate automatic/selected rows are removed. - Choose/Change and Clear have balanced widths and matching heights when labels wrap.
Manager lookup is refreshed when needed and reused across unrelated preference changes.
The source-pinned UI validation record
includes ReSukiSU phone and Magisk emulator smoke checks, screenshots with Shizuku/Dhizuku,
and earlier large-text coverage. The unknown-manager fallback's device simulation remains unrun;
its behavior was reviewed in code. Manager discovery and choosing a shortcut do not grant root.
🛡️ Fresh root status, admission and service ownership — new since v1.96.3
PR #531,
PR #533,
PR #534,
PR #535,
PR #536,
PR #537, and
PR #538
(21f0d559, a1a23f7f, c5921e49, f13450dd, 8c6e5774, 7a8c9ac1, eff6de65):
- Settings and App Info consume one shared privilege observation. Root refresh distinguishes
confirmed root/non-root from checking, busy, timeout and failed acquisition. Busy/failed checks
preserve the last confirmed identity while stopping new root work from treating it as fresh. - Accepted work keeps its ownership through refresh; busy refresh retries at an idle boundary.
Confirmed changes invalidate capability caches and retire dedicated shells when idle. - KernelSU/ReSuKiSU manual app authorization is respected. A restricted ADB root shell is not
treated as evidence that Thor itself lacks authorization. - Timed-out or cancelled RootService bind attempts release their own late connections without
clearing a newer connection. Rebinding and service ownership remain separate from shell refresh. - Root services retain Android-user isolation. Invalidation or replacement for one user cannot
silently take over another user's service. - Root app-data clearing uses the compatible ActivityManager interface. A failure after possible
dispatch does not trigger an unsafe repeated clear through a fallback path.
📤 Acknowledged export, game-file and input staging — new since v1.96.3
PR #539,
PR #540,
PR #541,
PR #542, and
PR #543
(ad1fd5ee, 53d7a3a6, ecb8bec3, 59299562, 99134fef, 3d484ede,
9e696a88, 5ffb42e6, 67a980e6):
- Explicit persistent/isolated execution policies preserve whether work started, termination was
confirmed, output drained and the shell remains reusable. Cancelling a caller alone is not
reported as termination of privileged work. - Selected root export copies use private, receipt-backed staging. Successful payloads are
published only after acknowledgement and byte validation. Unsupported atomic moves fall back
to a checked copy; incomplete destinations cannot silently become successful exports. - OBB placement retains package ownership across installation and placement. Each file is staged,
permissioned and size-checked before same-directory publication, preserving an existing target
until then. Symlinks are replaced without following them; actual directory targets are refused. - Unresolved earlier OBB placement blocks a conflicting restore before its first destructive data
replacement. A cleanup failure does not overwrite a successful placement result. - Privileged preview/import and archive-icon reads retain one selected provider, bounded output
and per-attempt staging. Shared copies are not world-writable. Icon read failures that may
recover are kept distinct from persistent cache misses. - Missing acknowledgement retains owned staging and uncertainty rather than deleting or reusing
files a producer may still write. Known terminal or different-boot evidence governs recovery;
ordinary app restart, stable file size and elapsed time are insufficient.
This adoption is limited to the named consumers. Tar creation, extraction, destructive restore
commit phases and broad cache deletion still need workload-specific ownership/recovery contracts.
Deliberately detached descendants and accepted Binder/system-server work are outside shell-only
termination guarantees.
📦 Tracked data clearing, suspension readback and installer ownership — new since v1.96.3
PR #546 and
PR #547
(f9e684e8, bc8647f5, ab9bf1e3, e7ddadf6, 0ddae5c2):
- Root suspension readback uses bounded typed results with owner/state validation, reducing
reliance on large unstructured package dumps and preserving independent suspension owners. - Clear-data requests are durably identified before dispatch. A matching callback or validated
terminal query can settle them; missing/uncertain completion retains a package barrier across
supported providers. A replacement service's missing record is not treated as success. - Repeated clear gestures first reconcile an unresolved operation rather than blindly wiping
again. Corrupt or nonempty malformed journals fail closed; interrupted empty initialization
can resume safely. - Internal installer sessions retain package/global ownership from attempted commit until their
matching terminal callback. Caller deadlines, cancellation and pending user action do not imply
Android stopped installing. Cleanup after a submitted session cannot replace its result. - External installer ownership ends at chooser handoff. Durable installer-session recovery across
app death, full worker-cancellation acceptance and broader IPC mutation support remain open.
The remaining sections collect the changes already delivered in v1.96.1–v1.96.3, all of which
are after the requested 1960 baseline.
❄️ Dhizuku freeze, unfreeze and hidden-app recovery
PR #483
(e04e8c77, aab7c93f):
- Dhizuku freezes apps with device-owner hiding and unfreezes them by unhiding, preserving the
installed APK and app data. Thor no longer treats device-owner access as shell-level authority. - Hidden apps appear as frozen in app metadata and Freezer state, so they remain available for
recovery rather than disappearing from Thor's view. - Root and Shizuku recovery also account for apps hidden by another mode, while keeping legacy
recovery for system apps removed for the current user by older Thor versions. - Freeze failures use localized, actionable messages.
📦 Supported device-owner operations and safer install completion
PR #484
(92b6f127, d5b272d3):
- Dhizuku uses device-owner operations for clearing app data, suspension, runtime permission
changes, app removal and APK installation, and reports their actual results. - Ordinary APK replacement remains supported. Fix Store and Auto Reinstall's Play attribution
require Root or Shizuku; force-stop and cache clearing are unavailable through Dhizuku. - Installation controls reflect mode capabilities. Install-time permission grants and the
low-target-SDK override remain available only on supported Root/Shizuku paths. - An install already submitted to Android is no longer reported as a submission failure merely
because closing its session fails afterward.
🗂️ Profile assignment, live membership and recovery choices
PR #487
(aac7bd60, d747b558, cecf0592):
- Add to profiles assigns selected apps from App list or Freezer to existing profiles, with
an option to also add them to the Freezer list. Assignment itself does not freeze the apps. - App Info shows live profile memberships. Membership is managed through the profile editor.
- Removing a frozen app's last profile membership, when it is not in the Freezer list, offers an
explicit recovery choice: leave it frozen or unfreeze it. Changes from elsewhere remain
reflected while the sheet is open. - The combined unfreeze action covers the Freezer list and profiles; recovery failures are
reported without duplicate error messages.
🎛️ Multi-app action customization
PR #488 (8e76ce3c):
- Settings → Customization now has separate layouts for App list and Freezer multi-app actions.
- Reorder actions, hide those you do not use, or restore defaults. Each toolbar keeps its own
saved preferences, and Close remains available. - Action availability still depends on the selected apps and privilege mode. Saved layouts
preserve chosen order and incorporate newly introduced actions.
💛 Optional support after successful operations
PR #485
(c74b0eff, c4b08213, d3b25b36, cd15b850):
- Successful operations can offer a Support Thor shortcut through completion feedback.
- Invitations respect supporter eligibility, and the automatic introduction is shown only once.
FOSS users, and Store users whose billing service is unavailable, can choose I already support
Thor to hide invitations on that device. - Confirmed Freezer additions get clearer success feedback, and completion sheets use consistent
support buttons. Support remains optional in both distributions.
🧊 Shizuku system-app freeze and restore
PR #521, addressing
issue #519
(04d51a5e, d17ac998, 63f31e43; merged as 7994cf40):
- Thor first tries the existing Binder disable and
pm disable-userpaths. Only a
policy-refused Shizuku system-app disable can usepm uninstall -k --user N, and only
while the removal fallback setting is enabled. Ordinary command/transport failures,
user-installed apps, Root and Dhizuku do not use this fallback. - A healthy local preference store with no saved choice defaults to enabled, including on
upgrades. Explicit off choices persist and are checked when queued work executes. The setting
is device-local and excluded from backups, so restoring other settings cannot override it.
Unreadable preferences disable the fallback; corruption recovery persists an off choice. - Unfreeze reinstalls packages removed for the current user. Restoration of legacy removed
packages remains available even when the fallback is off. - Queue history preserves distinct disable-refused, disable-failed and restore-failed reasons.
Diagnostic logs retain both shell output streams. Unrelated root-availability probes no longer
mark Shizuku tasks as degraded; task warnings follow commands actually executed for that target. - Shizuku launches
shfor either server identity, allowing the child process to inherit the
server UID without an unnecessary nestedsudependency.
📜 Extensions confirmation on small screens
PR #523, addressing
issue #518 (a1d522bf):
- The Extensions acknowledgement sheet now scrolls vertically, so its warning, answer field,
Accept button and Cancel control remain reachable in short windows and landscape. - The arithmetic confirmation and saved consent behavior are unchanged.
🛡️ App Ops in Permission Manager
PR #511
(f06b540d, 06373e87, 26f57ac0, 76f0cba4, 699fe66a, 1ef6de96):
- A separate App Ops tab discovers operation names, controlling switches, linked permissions,
defaults and reset support from the running Android build. Search and the Relevant,
Changed and All filters make long catalogs easier to inspect. - Root or Shizuku can read and change supported package- or UID-scoped modes for the current
Android user. Thor verifies the requested scope after writes, reports uncertain results and
offers a separate reset-to-platform-default action. Shared-UID edits warn about other affected apps. - Runtime-permission-controlled operations stay read-only in App Ops, with a path to Permissions.
Unknown policy blocks potentially conflicting edits. Parsing handles supported mixed Xiaomi
operation output, and the editor sheet dismisses when swiped down from its title.
↕️ Draggable scrollbars in Apps and Freezer
PR #510
(7df4c174, 664808ec, ebd93039, 5ae8ab7d):
- Drag scrollbar thumbs through long lists and grids, with a bubble showing the visible app
range and accessibility progress controls for navigation. - The expanded drag target and responsive spacing preserve grid columns and nearby row/card
taps. Dragging remains stable when the item count changes. Sort-aware snapping is a follow-up.
🇯🇵 Japanese localization
PR #513 (bfc594cf):
- Adds Japanese strings across the app, including App Ops, backup, settings and Store features,
and exposes Japanese in the supported language picker and Android locale configuration. - Updates locale tests and contribution guidance. The hotfix also supplies its new messages in
all nine app locales and aligns Japanese wording with the existing Unfreeze terminology.
🔧 Project: diagnostics, release tooling and maintenance
- Development lifecycle diagnostics — #551
(46d9eeb5,bc529939,a36d0a40,04276805) adds a closed, versioned event schema for
refresh/admission, shell generations, lane recovery, isolated outcomes and service binding.
Records contain no commands, package/work identifiers, settings or output text. Diagnostic
failures cannot interrupt operations; normal release builds keep the sink disabled. Local
close/unbind events do not claim producer or accepted-IPC termination. - Private logging and test reliability — #530 redacts private Shizuku timeout commands
(a1c6e4ef) and acknowledges helper submission before cancellation (b005cb35). #531 corrects
readiness publication and opt-in assumptions (cdf8afcc). #547 uses a real-clock cancellation
watchdog (8952fab2); #551 waits for an already-scheduled idle refresh in smoke-test setup. - Manager discovery and preference caching — #553
adds 21 tests for canonical/renamed manager discovery, exact package matching, duplicate and
unavailable shortcuts, device-local preference mapping and collection-local caching. Selection
or explicit refresh invalidates discovery; unrelated preference changes keep their current
values without rescanning installed managers (e081e91f,edb79102). - Build and dependency updates — #548
(3a49c3a0) adopts Gradle 9.8.0, reviews Gradle properties, updates dependencies and fixes
Robolectric 4.17 compatibility on Java 21. Current root integration uses Odin 1.1.0;
AGP is 9.5.0-alpha08. Earlier updates include #478/#479, #499/#500/#501, #507/#514,
#516/#517 and final #549/#550 (61dc6fb3,2f8e27df), covering Android, web, Fastlane/Ruby
and CI actions. Beta-branch dependency reconciliation retains the devalue fix (#498,
6ed949d2) and compatible Rubyzip history (#515,37f97ae6). - Release correctness — 1.96.1 release work preserves complete multiline Play notes in every
locale, rejects empty/truncated notes, preserves contributed translations and validates Shizu
JSON round trips (445e7bd3). The one-time 1961 already-published Play exception lets that
release's GitHub promotion proceed without a second Play upload (b2f4865b); later versions
use normal routing. The full commit log below records release-preparation corrections. - Store metadata and history — #486 (
17953b04), #494 (c68810c2) and #526 (7aa20338)
synchronize Shizu after production releases;a6de91a6clarifies Shizuku fallback eligibility.
#512 (ca46642f,29a3138d) adds 1.96.2 notes and en-GB Fastlane metadata. History and
beta/production back-merges are reconciled before subsequent development. - Documentation and acceptance — #506/#508 reconcile README and follow-ups; #532
(3e8fc7a7) records the Odin roadmap, with implementation, exact source/APK evidence and
remaining acceptance updated through #551. Settings live-writer and reboot/cancellation
fixtures (#544/#545) distinguish observed values from original write/termination proof. - This release preparation changes only versionCode to 1970, derives 1.97.0, adds the
three cumulative note files, and supplies complete Play/F-Droid text to en-US, en-GB and hi-IN.
It retires v1.92.1's curated directory to keep the newest 20; existing Fastlane history remains.
Shizu continues to describe published production 1.96.3 until 1970 reaches production and
its separate post-promotion sync is carried through the normal branch flow.
🧪 Validation scope and remaining acceptance
The expanded release candidate through dev 585acf62, built from
ea66bee4,
passed on Zulu JDK 21, Gradle 9.8.0 and AGP 9.5.0-alpha08 in one Gradle invocation:
./gradlew --max-workers=1 test lintFossDebug lintStoreRelease \
assembleFossDebug assembleFossRelease assembleStoreRelease \
:app:compileFossDebugAndroidTestKotlin- 3,554 JVM tests per FOSS/Store Debug variant, zero failures, errors or skips.
Gradle reused cached unit-test results for unchanged inputs. - Both lint gates report zero errors/warnings, including no MissingTranslation or
SyntheticAccessor findings; existing hints remain 9 for FOSS Debug and 8 for Store Release. - Debug and both minified release APKs report 1970 / 1.97.0. Neither release contains the
development lifecycle trace tag; no nonempty R8 missing-rules file was produced. - FOSS Debug instrumentation sources compile successfully. Instrumentation tests were not run
on a device as part of this build check. - All 13 release-script suites and 35 release-routing tests / 49 assertions passed on
the merged tree. The 20-directory retention and production-pinned Shizu checks passed. - The updated notes cover 137 non-merge commits through
585acf62. Play notes use
489/500 characters and Telegram uses 892/1024 assembled UTF-16 units.
Note budgets, the exact commit log, commit references, closing-keyword and Fastlane-content/parity
checks pass; en-US, en-GB and hi-IN each retain the complete Play source.
The tested source is ea66bee4; the subsequent validation edit changes this document only.
The local release APKs are unsigned. AGP recorded NO_VALID_GIT_FOUND in their local
version-control metadata, so the source revision and APK SHA-256 values are recorded separately
with the build evidence. Release publishing rebuilds and signs from its own checkout and commit.
No new device installation was performed for this merge. The earlier release-candidate phone
smoke is recorded in PR #552's device evidence.
PR #553's separate UI smoke checks remain attributed to source fa86a8ab in the manager
validation record; those checks are not a full device regression of this expanded candidate.
Local preparation evidence, including reports and APK hashes, is retained in
~/.codex/artifacts/thor-pr552-dev-merge-2026-10-03/.
Historical device results retain their original tested revisions in the
Odin implementation tracker,
Settings Editor record,
Unpause record,
the manager UI record,
and the earlier release notes linked above. They include Magisk/ReSuKiSU root checks, selected
live Shizuku cases, native Unpause and an emulator device-owner suspension check; they do not
establish every Android/OEM/provider combination.
Open acceptance includes physical live-writer death/reboot and unacknowledged termination,
workload-specific destructive archive/cache adoption, real installer callback/durable recovery
cases, broader minified/unauthorized-caller/multi-user IPC cases, and selected App Ops/scrollbar/OEM
checks. Existing Shizuku removal fallback can preserve data files while losing app-managed accounts.
Release diagnostic retention/export remains undecided and disabled in normal release builds.
🛠 Commits Log
Complete non-merge development history after the requested baseline: 137 commits, in
chronological order, from v1.96.0..585acf62. Release-preparation commit 3c213496 separately
adds version 1970 and these notes; the merge of current dev into the release branch is bf6f183e.
The newly developed subset since the latest published tag is v1.96.3..585acf62.
950c7d11chore(deps-dev): bump @types/node in /web in the web group98f5c0fachore(deps): bump com.google.devtools.ksp in the maven groupe04e8c77fix: use device-owner hiding for Dhizuku freezeaab7c93ffix: localize Dhizuku freeze failures92b6f127fix: use device-owner APIs for Dhizuku actionsc74b0efffeat: add optional support actions after successful operationsc4b08213docs: show support invitation entry pointsd5b272d3fix(installer): preserve submission after session cleanup failured3b25b36fix(support): announce confirmed freezer additions and polish labelscd15b850style(support): outline completion sheet support buttons17953b04fix(shizu): sync changelog to production 1.96.0aac7bd60feat: assign selected apps to existing freezer profilesd747b558feat: clarify profile membership and add recovery choices8e76ce3cfeat: customize App list and Freezer multi-app actionscecf0592fix: keep profile membership live and report recovery errors once445e7bd3chore(release): prepare v1.96.1 and preserve complete changelogsb2f4865bfix(release): publish 1961 without repeating Play promotionc68810c2fix(shizu): sync complete changelog to production 1.96.16ed949d2chore(deps): bump devalue265d3b0echore(deps): bump fastlane from 2.239.0 to 2.240.1 in the fastlane group45f3eb83chore(deps-dev): bump the web group in /web with 2 updates69131bcdchore(deps): bump ruby/setup-ruby in the actions group0b5360c9chore: refresh Thor documentation and AGP versiona2502252docs: distinguish partial Samsung fix from shipped work3e58535bdocs: qualify extension catalog hash verificationc358263fchore(deps): update Coil to 3.6.3ab3e98d6docs: mark shipped installer and bulk follow-upsfb214ae2docs: reconcile follow-up index and reports with shipped work7df4c174feat: add draggable scrollbars to Apps and Freezer664808ecfix: tighten grid scrollbar spacing without losing columnsebd93039feat: use responsive scrollbar spacing in lists and grids5ae8ab7dfix: preserve scrollbar drag when item count changesf06b540dfeat(permissions): add verified App Ops manager06373e87fix(app-ops): support mixed Xiaomi operation responses26f57ac0fix(app-ops): explain runtime restrictions and restore editor input76f0cba4fix(app-ops): filter relevance by manifest permissions699fe66afix(app-ops): guard unknown policy and reveal linked permissions1ef6de96fix(app-ops): make editor title swipe dismiss sheetca46642fchore(release): prepare v1.96.229a3138dchore(release): add en-GB Fastlane metadatabfc594cfi18n: add Japanese app localization6888e96achore: refresh dependencies, fix warnings, and save scrollbar prototypes37f97ae6chore(deps): bump rubyzip in the bundler group across 1 directoryfe319596chore(deps): bump the web group in /web with 5 updatesf770cd59chore(deps): bump the actions group with 2 updates04d51a5efix(shizuku): restore consented system-app freeze fallbackd17ac998fix(shizuku): enable removal fallback by default and preserve opt-outs63f31e43fix(shizuku): preserve removal opt-out on preference read failuresdd2c4d98chore(release): prepare v1.96.3 Shizuku hotfixa1d522bffix(extensions): make consent sheet scrollable on small screens1a447b52chore(release): include Extensions scrolling fix in v1.96.3 notes7aa20338chore(release): sync Shizu changelog after v1.96.3a6de91a6docs(release): clarify Shizuku fallback eligibilitya92aaaccfeat: add suspended apps list and native unpause action (#522)d24b97e6fix: hide empty suspended counter on home0b309463feat: add built-in Sett Edit extension (#504)a1c6e4effix: redact private Shizuku command timeout logs5d1da1f6docs: record Sett Edit recovery and execution limitsf64d4800fix: bound Sett Edit helper jobs before Root lease releaseb005cb35test: acknowledge Sett Edit job submission before cancellation21f0d559feat: adopt Odin isolated cancellation and root cache refreshcdf8afcctest: fix Odin readiness ordering and policy opt-in skip3e8fc7a7docs: record Odin reliability roadmap and progress checklist [skip ci]a1a23f7ffix(root): avoid replaying uncertain data clears64d296efdocs(odin): record data-clear fix validationc5921e49fix(privilege): reuse shared state across app screensd868f74ddocs(odin): track starting-pair PRs and validation65b5c5b1docs(odin): synchronize shared-state progressf13450ddfeat(root): coordinate fresh root state and operation admission7f5d766bdocs: record root refresh validation and firmware compatibility follow-up63da45f5docs: schedule AIDL compatibility fix after root refresh merge8c6e5774fix(root): use standard ActivityManager API for data clearing9c6dccfadocs: record clear-data compatibility validation and next steps7a8c9ac1fix(root): own delayed RootService connectionsa3ce8f4cdocs: track binding ownership validation and pending hardware checks9bb93427docs: record successful ReSuKiSU binding validationeff6de65fix: preserve root services across Android users1d61768cdocs: record root service isolation validation1caf87f0docs: link profile isolation PR in roadmapad1fd5eefeat: preserve isolated root execution outcomes1f5dd126docs: record M2-01 validation and next milestone53d7a3a6feat: isolate root export staging with recoverable cleanupbb8da97adocs: record M2-02 device validation and roadmap progressecb8bec3fix: copy export payload when atomic promotion is unsupported59299562feat(obb): add acknowledged isolated placement and recoverye325174adocs(odin): record M2-03 completion and device validation99134feffix(obb): preserve placement results and preflight restores1d6e1c68docs(odin): record review-fix validation3d484edefix(obb): coordinate installs and publish checked expansions65011fcfdocs(odin): record installer and publication review checks9e696a88feat: isolate privileged preview and archive input reads8e93e710docs: link input staging validation to PR 5425ffb42e6fix: remove shared write access from read staging67a980e6feat: adopt acknowledged archive icon staging328c54d0docs: link archive icon progress to PR 543e7bf7eafdocs: record ReSuKiSU archive icon validation98793e74feat(settings): reconcile uncertain edits with read-only observations988ac936docs: link Settings Editor reconciliation PR and tested revisionc1d87205test(settings): validate physical readiness and process-death recoveryd0b0d1aadocs: record physical Root Shizuku and process-death validation44dc3191docs: clarify private journal validation artifacts3d175607test: validate live settings writer recovery534e9472docs: pin live-writer evidence to tested harnessf9e684e8feat(root): add bounded typed suspension readback59c51adadocs: record typed suspension readback checks and remaining workbc8647f5feat(root): track clear-data completion and retain package ownership3aab97d5docs: record typed clear-data validation and remaining acceptance3a49c3a0chore(build): upgrade Gradle and fix Robolectric 4.17 on Java 21ab9bf1e3fix(root): resume interrupted empty clear-data journal initialization9badb63cdocs: record clear-data journal initialization regression checks8952fab2test(root): use real time for admission cancellation watchdog5df1c0e1docs: record PR 547 cancellation watchdog validation38f9a200docs: record PR 547 validation after dev mergee7ddadf6fix(installer): retain operation leases until session completion7a47f4badocs: record installer session lease validation61dc6fb3chore(deps): bump the web group in /web with 3 updates2f8e27dfchore(deps): bump the actions group with 2 updates0ddae5c2fix(installer): retain session leases after caller detachment09aa5e6fdocs(odin): record retained installer ownership validation46d9eeb5feat(root): add structured development lifecycle diagnosticsbc529939fix(root): avoid synthetic accessors in binding diagnosticsa36d0a40test(root): await deferred refresh settlement during setup04276805docs(odin): record diagnostics validation and remaining acceptancee081e91ffix: discover KernelSU forks and hidden root managersd13d3b7dui: mark the selected root manager with a green tick000dd3a1ui: group root manager choose and clear actions276dd803fix: preserve action semantics for root manager split buttonsbe66be4dui: use privilege bottom sheets with header icon actionsb14902fachore: remove the unused privilege dialog icon02b40176ui: balance manager actions and show manager app iconsd2465d9eui: align joined actions when translated labels wrap34b43c2dui: show detected root manager details and selection change action4da92cb3docs: record root manager discovery and sheet validationedb79102fix: cache manager discovery across unrelated preference changesfa86a8abui: show live grant ticks and retain manager open actions88388008docs: record grant indicator and manager cache validationa6530658docs: refresh emulator screenshots with all privilege managers