Sangeetha-Grantha

Metadata Value
Status Completed
Version 0.2.0
Last Updated 2026-09-20
Author TRACK-138 coordinator
Document Type Evidence record
Track TRACK-138

TRACK-138 Rasika mobile MVP — implementation evidence


[!NOTE] Historical evidence: results, counts, commands, and observations below belong to the original work described here. The editorial update date is not a new test or corpus verification. For present behavior, use current feature map.

Living report for Node C onward. Not a claim that the MVP is complete.

Compatibility recorded 2026-09-05

Tool Observed
JDK Temurin 25.0.1
Gradle 9.7.1
Android SDK local.properties sdk.dir; platforms 34–37.0; compileSdk 37
Android bytecode target JVM 17 (toolchain remains 25)
Xcode 26.6 (17F113)
iOS deployment target (planned) 16.0 pending first linkDebugFrameworkIosSimulatorArm64
Simulators iPhone 17 family available (Shutdown at inspection)

Node C increment

Proof commands and outcomes are appended as they are run.

2026-09-05 Node C first slice

Command Result
./gradlew :modules:shared:mobile-data:jvmTest Pass (12 tests after session-inactivity assertion fix)
./gradlew :modules:shared:presentation:jvmTest Pass (navigator + search presenter)
./gradlew :modules:mobile:androidApp:assembleDebug Pass. APK modules/mobile/androidApp/build/outputs/apk/debug/androidApp-debug.apk (~20 MiB)
./gradlew :modules:shared:presentation:linkDebugFrameworkIosSimulatorArm64 Pass. Android bytecode target JVM 17; iOS deployment target 16.0 in the Xcode project
xcodebuild -list -project modules/mobile/iosApp/RasikaApp.xcodeproj Target/scheme RasikaApp
make check-docs Fails on untracked TRACK-138 files until they are added to git (checker uses git ls-files)

Hosts now inject KtorCatalogueApi (see Node B + M below). FixtureCatalogueApi remains for tests and offline UI review.

Node B + M increment (2026-09-05)

Catalogue endpoints

Method Path Notes
GET /v1/catalogue/krithis Published-only; query/composerId/ragaId; page 0/size 30/max 100; raga via krithi_ragas
GET /v1/catalogue/krithis/{id} Published reader + variant inventory; default reading is unambiguous primary else language/script/UUID
GET /v1/catalogue/krithis/{id}/lyrics/{variantId} Ownership + published 404; unsegmented text when no sections
GET /v1/catalogue/ragas Directory + published junction counts + matching aliases
GET /v1/catalogue/ragas/{id} Stored raga + aliases + parent/nomenclature
GET /v1/catalogue/composers Directory + published counts + matching aliases
GET /v1/catalogue/composers/{id} Stored profile + aliases + count

Unknown params / malformed UUIDs → CatalogueErrorDto 400. Missing/unpublished/wrong-owner → same 404 shape. Cache-Control: no-store.

Legacy /v1/krithis/search and /v1/krithis/{id} are published-only for anonymous/non-admin. Admin JWT can still read drafts. GET /v1/admin/krithis/search and GET /v1/admin/krithis/{id} added.

Host wiring

Proof

Command Result
make test Pass (DAL + API, including MoneyPath visibility update)
Catalogue/visibility/usage tests Pass
python3 -m unittest discover -s tools/tests -p test_catalogue_usage_report.py Pass
assembleDebug Pass after hiding HttpClient behind androidLiveCatalogue()
linkDebugFrameworkIosSimulatorArm64 Pass

Usage JSONL recorder + tools/catalogue-usage-report.py landed. A live report sample waits on Node A traffic. Admin web still uses public routes with JWT (drafts remain available to admins).

Live API smoke after make dev-down / make dev (2026-09-05)

Against http://localhost:8080 (current binary, not the 15h-stale container):

Node A Android live journeys (2026-09-05, later)

Created AVD Rasika_API34 (system-images;android-34;google_apis;arm64-v8a). First install crashed: manifest .MainActivity resolved to com.sangita.grantha.rasika.MainActivity while the class is com.sangita.grantha.mobile.MainActivity. Fixed FQCN; rebuilt APK.

Journey Result
Search visva Live card viSva nAthaM bhajEhaM; ragamalika repeats preserved in UI
Open reader 6 stored readings (LATIN/EN, DEVANAGARI/SA, TAMIL/TA, TELUGU/TE, KANNADA/KN, MALAYALAM/ML)
Switch to Tamil Stored Tamil Pallavi text (not generated)
Save favourite + Favourites tab Bookmark listed
Force-stop + relaunch Favourite still listed
SharedPreferences Only krithiId + short label + bookkeeping; no lyrics/catalogue cache
Browse ragas Live directory (Abheri…); most counts 0 because only 1 published kriti

Backend catalogue-usage for that session (same session UUID across search/reader/lyrics): search 200, reader 200, lyrics 200. Report from extracted Docker JSONL: 12 attempts, 3 completed searches, 2 reader views, 3 approximate sessions (build/track-138/usage/live-android-session.jsonl, gitignored).

Live gaps: only one published composition, so combined filters/paging/zero-result were not demonstrated on-device (fixtures cover them). Airplane-mode and instrumented RasikaJourneyTest not run.

2026-09-20 close-out / verify

The 5 Sep live-data gap of one published kriti is closed in the current catalogue: GET /v1/catalogue/krithis?page=0&pageSize=2 reports total=1225; page=1 returns a distinct pair (SrI abhayAmbA, abhayAmbA jagadambA). Raga directory paging remains total=1014.

Dedicated JSONL usage logging is no longer console-only. LogbackConfig attaches a non-additive catalogue-usage rolling file appender (10 MiB / 7 days / 100 MiB) at CATALOGUE_USAGE_DIR (default build/track-138/usage/catalogue-usage.jsonl). CatalogueUsageFileAppenderTest writes a raw JSON line without wrapping it in the pattern layout. Operational retention, not a cryptographic deletion guarantee.

Named TRACK-138 journeys:

TRACK-140 R18 remains the broader native suite (Explore paging fixtures, appearance, large text).

Q review (2026-09-20)

Pass Important Notes
Bugs None remaining Connection-failure copy is ERROR_BODY in full; iOS tests must not match a prefix. Usage file appender failures leave catalogue reads unblocked.
Security None remaining JSONL events carry no query/lyric/token. rasika.uiTest.* flags are instrumentation-only. CATALOGUE_USAGE_DIR is server env, not a request parameter.
Compliance None remaining V46 retired by file delete + history row keyed on version and description (ADR-013). No new corpus V__. Lakshana: amba nIlAyatAkshi is P+A+C.

Limitations (not blockers): OS airplane-mode was not toggled; Android connectedDebugAndroidTest was not re-run in this session (AVD Rasika_API34 exists, no emulator attached). Physical-device/store distribution remains out of scope.

Ref: application_documentation/05-frontend/mobile/track-138-visual-design.md

iOS host compile (H, not I)

xcodebuild with a concrete simulator UUID fails: Xcode 26.6 reports iOS 26.5 is not installed. Installed runtimes: iOS 17.0, 26.0, 26.1, 26.2. xcodebuild -destination 'generic/platform=iOS Simulator' BUILD SUCCEEDED; product build/track-138/ios-derived/Build/Products/Debug-iphonesimulator/Rasika.app. verify-ios.sh now falls back to that generic destination. Live iOS journeys remain blocked.

Additional tests / CI

Ref: application_documentation/05-frontend/mobile/track-138-visual-design.md


Section index · Documentation home · Feature status