# Validation — Fileworkbench 0.2.3 Date: 2026-09-24. **Complete diagnostic source release; no verified APK supplied.** ## Scope and provenance The shipped 0.2.2 source ZIP was extracted into a fresh working directory. The previously supplied SAF-D1 diagnostic changes were applied there and incorporated into this complete project. The current source retains the earlier PDF lifecycle and nullable-cursor-result corrections. Gradle is pinned to 8.14.5; the daemon, module toolchains and bytecode targets select 17. Root plugin aliases are distinct. The user still reports the folder-listing failure. No subsequent device trace has established its cause. **This release instruments that failure; it does not claim to fix it.** A versioned footer identifies the diagnostic source, and a genuinely null query cursor has the distinct `[SAF-D1/NULL_CURSOR]` message. ## Executed checks for this source | Check | Result | Boundary | |---|---|---| | Common core + JVM adapter suite | **112/112 passed** | Local Kotlin compiler; not Gradle/Android compilation | | Actual production listing block + diagnostic harness | **16/16 passed** | Real shared models and Android test doubles; no Binder/real provider/permission validation | | Build-configuration invariants | **18 passed** | Static pins/aliases/hashes/markers, not Gradle plugin resolution | | Build-guard regression cases | **8/8 passed** | Accepts the baseline with local SDK/IDE files; rejects wrong Gradle/JVM, duplicate plugin aliases/IDs and stale shell/Windows bootstrap tags | | Kotlin PSI syntax | **44 files, zero parse errors** | Includes Kotlin source and Gradle Kotlin scripts; no Android/Compose/Gradle type resolution | | Existing project/XML/security invariants | Passed | Permission-free main manifest, isolated PDF service, read-only picker boundaries, portable core, prior PDF regression guard | | Shell syntax | Passed | Bash/sh syntax only; PowerShell not executed | | Android build attempt | **Blocked before Gradle/Android compilation** | Wrapper fetch: `curl: (6) Could not resolve host: raw.githubusercontent.com` | | Device/emulator tests | Not executed here | The test sources are retained; no device is attached | | iOS build/tests | Not executed here | Core architecture retained; no iOS shell added | The local host has **OpenJDK 21.0.11 and kotlinc 1.9.0**, not JDK 17 or the project's Kotlin 2.2.21 toolchain. The host harnesses now emit JVM-17 bytecode but run on that local JVM 21. **Do not interpret their results as a JDK-17 Android build.** The actual Gradle configuration requests an installed JDK 17; no JDK-21 fallback has been added to the project. No Android SDK or downloaded wrapper is available in this authoring runtime. The full Android command was attempted using the newly pinned launcher. Its bootstrap failed before the settings guards or compiler could run. No APK or successful Gradle sync is claimed. The network-dependent bootstrap fallback and Windows PowerShell bootstrap remain unexecuted here. Raw evidence for this release is under `validation/0.2.3/`. Previous results retain their versioned paths; the old report is preserved as `VALIDATION-0.2.2.md`. Old `BUILD_ATTEMPT.txt`/test outputs elsewhere in docs are historical, not new results. ## Packaging checks The full archive is assembled from this source tree, excluding `out`, build caches, local IDE/SDK state, keystores and generated test JARs. Prior source modules, resources, fixtures, licence, documentation and examples remain present. It ships no APK, wrapper JAR, JDK or Android SDK. The first wrapper invocation bootstraps the verified external JAR. See `SOURCE-MANIFEST.sha256` for per-file integrity hashes and `validation/0.2.3/archive-checks.txt` for extraction/integrity checks. ## Reproduce host checks ```sh python3 scripts/check-project.py python3 scripts/test-build-config.py bash scripts/test-core.sh python3 scripts/test-folder-listing.py bash scripts/check-kotlin-syntax.sh ``` ## Next local acceptance step Follow `BUILD.md`: fresh extraction, installed JDK 17, wrapper Gradle 8.14.5, SDK 36, then tests/assembly/lint. Install the resulting APK with the existing signing identity, confirm **Fileworkbench 0.2.3 · Browser diagnostics SAF-D1** in Browse → Locations, and reproduce the folder problem. Preserve the existing app data. Capture the full new error instead of inferring permission or provider failure from the earlier ambiguous wording.