S.H.O.N.A.R._Desktop_Companion/STATUS.md

110 lines
6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SHONAR Desktop — Status
Checkpoint for the standalone desktop app. Prepend a new dated section per
material change; keep history below.
## 2026-09-22 — open-item audit closed; Large v3 quiet benchmark; in-app update check
- **pump-error.log (open item 1, Sep 16): CLOSED — already gone.** Nothing
named pump-error.log exists under `~/.config/shonar-desktop/` anymore
(only `logs/engine.log`). The code path that writes it
(`DesktopState.kt` pump failure logger) is current and legitimate.
- **Large v3 full-length timing (open item 2, Sep 16): MEASURED.** Quiet
machine (app + engine stopped), CPU int8, same args as the engine
(beam_size=5), clips cut from a real 2 h 09 m recording:
- 300 s audio → 1107 s wall (**0.27× real-time**), first segment 37 s,
model load 8.7 s.
- 1200 s audio → 2768 s wall (**0.43× real-time**), first segment 52 s.
The earlier note ("300 s clip ran well under 7 min") was optimistic —
under real quiet-CPU conditions Large v3 is ~4–8× slower than that.
Practical read: a 2-hour recording ≈ 4–8 h of CPU transcription;
Base (~7× real-time) stays the sensible default, Large v3 is for
shorter, quality-critical clips.
- **In-app update check** (`7195aa1`, pushed): Settings gains
"About & updates" — build commit baked into the jar
(`generateBuildInfo` → `shonar-build.properties`), a Check-for-updates
button against the Forgejo commits API (up to date / update available
with Open-repo link / newer-than-remote for dev builds), verified live
on-device.
## 2026-09-16 — open-item audit; Large v3 provisioning verified
- **Large v3 first-use download verified end-to-end** in an isolated
`HF_HUB_CACHE`: `snapshot_download` fetched 2.9 GB in ~2.5 min,
`is_model_downloaded('large-v3')` → True, model loaded in 4.6 s
(CPU int8) and transcribed a real clip. Note: `setup-standalone.sh`
vendors only **Base**; Large v3 is deliberately a first-use auto-download
into the `models/hf-cache` the app exports — the registry's
`download_instructions()` already covers the manual path. No defect.
- Skipped backend test resolved: intentional (`test_ai_adapters.py:55`
skips when faster-whisper IS installed — the missing-dep path can't be
exercised then). Not a Postgres test. Current count: 80 passed, 1 skipped.
- Earlier open items 1–2 (startup job adoption, upload-mapping reuse) were
closed by `ba54cb8` + the `.shonar.json` sidecar.
## 2026-09-15 (evening) — summarize progress bar, job adoption
**Committed:** `7fa99e8` streaming summarize progress, `ba54cb8` job adoption.
- Summarize now shows a real determinate bar + `Summarizing… N%` (same look
as the main screen). Backend: both LLM adapters stream (SSE / NDJSON) and
report 0–99% as tokens arrive; 100 only on success. No fake movement —
before the first token the label reads "Summarizing… waiting for model"
(cold LLM / server queueing was indistinguishable from a dead app).
- Adoption of engine jobs across app restarts: startup scan no longer skips
files that have a report (re-summarize was orphaned), a reprocess that
hits 409 "already running" attaches to the running job instead of
erroring, and live work outranks a saved report in library status.
- Verified live: screencap 19:41 — library row shows the bar + waiting
label mid re-summarize; job settled to succeeded 100 with the % racing
48→99→100 once tokens flowed (H200 queueing caused the earlier "nothing
happens"). pytest 79 passed/1 skipped · ruff clean · gradle green.
- Note: the dev loop died once (~19:35, cause unclear — gradle `run` exit
143 chain); relaunched via background `./desktop-dev.sh`.
**Done earlier (Sep 15 morning):** see below.
## 2026-09-15 — standalone desktop, Android fully removed
**Verified state (live this session):**
- HEAD `6599935`, clean tree, single branch `master`, no stashes
- Backend tests: `78 passed, 1 skipped` (pytest, SQLite) · `ruff check` clean
- Frontend tests: `39 passed` across 7 gradle suites
- Engine runs locally on `127.0.0.1:8000` (healthz ok); runtime state in
`~/.config/shonar-desktop/` (`engine.db`, `settings.json`)
**What the app is:** Compose Desktop (Kotlin) UI + bundled FastAPI engine
(SQLite + in-process queue, self-migrating on boot). No Postgres/Redis/Docker,
no server, no phone component. faster-whisper (Base vendored under
`models/hf-cache/`, Large v3 downloadable) + an LLM for summaries
(`openai_compat` or `ollama`).
**Architecture decisions worth keeping:**
- All Android/phone code deleted (`71b5571`) — desktop is the product. The
old server-era source lives on the main repo's `deferred/desktop-server`
branch for reference only.
- Shared code sits at `shared/com/shonar` (no `src/`), pulled in via
`srcDir("../shared")` in `app/build.gradle.kts`.
- Search picks its path by SQL dialect inside `services/search.py` (SQLite
substring scan / Postgres tsvector) — intentionally **no** `search_backend`
config knob (removed `6599935`; nothing ever read it).
- Engine endpoint root is `/api/v1` (`/healthz`, `/system/status`, …).
- Dev loop: `./desktop-dev.sh` (inotifywait restarts app on `.kt`; uvicorn
`--reload` for backend). Debian path: `INSTALL-debian.md`.
**Done this cycle (Sep 14–15):** batch transcribe-all with overall +
per-file stage progress; library multi-select/bulk delete (single delete
path); queued-file delete/rename; folder picker in-app + path in Settings;
zoom keys; search-within-recording; click-hit-to-playback; model choice
narrowed to Base + Large v3; Debian packaging + install guide; standalone
provisioning with vendored base model.
**Open items / candidates:**
1. Stale-noise cleanup: `~/.config/shonar-desktop/pump-error.log` holds old
Android→server upload 404s (pre-desktop pivot); no action taken.
2. Optional: full-length Large v3 transcription timing (300 s clip ran well
under 7 min on CPU int8 while the app + LLM were also active; a quiet
benchmark would pin the number).
**Known debt:** none blocking. No dead stubs; one former TODO (search
backend) resolved by deletion.