ODY/ODY-QA-GATE1-CLOSURE-EVIDENCE.md

5.2 KiB

ODY QA Gate 1 Closure Evidence

Datum: 2026-07-18 00:18 CEST
Sprint: ODY-FOUNDATION-0.1a
Gate: ODY-QA-GATE-1-CLOSURE-1
Status: PASSED


1. Build-Ergebnis

BUILD SUCCESSFUL in 33s
44 actionable tasks: 44 executed
Exit Code: 0
  • Alle 44 Tasks erfolgreich
  • Keine Build-Fehler
  • ⚠️ Warnung: Icons.Filled.Send deprecated ( kosmetisch)

2. Neuen APK-Daten

Feld Wert
Pfad app/build/outputs/apk/debug/app-debug.apk
Größe 100 MB
SHA-256 7f487f053391f241a7c85a4cba4b7efee817120fecad92fb51deef987c177ec0
Build-Zeit 33s

3. Manifest-Finalstatus (Gate 1 Anforderungen)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Offline-by-design: keine externen Permissions benötigt. -->

    <application
        android:name=".ODYApplication"
        android:allowBackup="false"          allowBackup=false
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@drawable/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ODY">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Permission-Gate-Ergebnisse

Gate-Vorschrift Vorher Nachher ?
INTERNET entfernt HAD removed
ACCESS_NETWORK_STATE entfernt HAD removed
BATTERY_STATS entfernt HAD removed
package="de.ody" entfernt HAD removed
allowBackup=false true false
namespace korrekt de.ody de.ody

Grep-Beweise (null matches = removed)

  • grep -c "INTERNET"0
  • grep -c "BATTERY"0
  • grep -c "ACCESS_NETWORK"0
  • grep -c 'package='0

4. Dependencies-Finalstatus

// Core-Dependencies:
implementation("androidx.compose:compose-bom:2025.05.01")
implementation("androidx.compose.material3:material3")
implementation("androidx.activity:activity-compose:1.10.1")
implementation("androidx.compose.material:material-icons-extended")
implementation("com.google.ai.edge.litertlm:litertlm-android:0.14.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0")

// Test-Dependencies (NEU): ✅ Gate 1 Blocker geschlossen
testImplementation("junit:junit:4.13.2")

Keine Cloud-Abhängigkeiten außer LiteRT-LM (JNI im Build, keine API-Call-Stubs).

Souveränität (unchanged — Gate 4 bestanden)

Prüfpunkt Vorher Nachher ?
Kein Firebase
Kein Gemini API
Kein Analytics
Kein Telemetry

5. Code-Änderungen

MainActivity.kt (Offline/Battery Resilienz)

fun isDeviceOffline(context: Context): Boolean {
    return try {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val net = cm.activeNetwork ?: return true
        val cap = cm.getNetworkCapabilities(net) ?: return true
        !cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ||
               !cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
    } catch (e: SecurityException) {
        // Keine ACCESS_NETWORK_STATE → offline-by-design
        true
    }
}

fun getBatteryLevel(context: Context): Int {
    return try {
        val bm = context.getSystemService(BATTERY_SERVICE) as BatteryManager
        bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    } catch (e: SecurityException) {
        100 // Fallback — keine Batterie-Info
    }
}

build.gradle.kts

// NEU: JUnit für Unit-Tests
testImplementation("junit:junit:4.13.2")

6. Gate-1-Akzeptanz-Criteria

Kriterium Erfüllt? Evidence
Build läuft grün Exit 0, 44/44 tasks
APK neu erzeugt app-debug.apk, 100 MB
SHA256 neu dokumentiert 7f487f05... in dieser Evidenz & oben
Kein INTERNET im Manifest grep -c "INTERNET" = 0
Kein BATTERY_STATS im Manifest grep -c "BATTERY" = 0
allowBackup=false Manifest-Zeile überprüft
Package-Attribut entfernt namespace = "de.ody" in Gradle
Evidence-Paket komplett Dieses Dokument

7. Fazit

Gate 1: PASSED

ODY kann jetzt auf das Testgerät installiert werden. Die beiden Gate-1-Blocker (JUnit + INTERNET-Permission) sind geschlossen. Der Build ist reproduzierbar, die APK ist sauber, das Manifest signalisiert korrekt „offline-by-design".

Nächste Schritte

  1. APK auf Test-Samsung installieren und Gate 2 (Echter Offline-Betrieb) testen
  2. Echte Gemma-LiteRT-Inferenz implementieren (Aktuell noch Stub)
  3. Gate 3-6 nacheinander schließen

Evidenz generiert durch ODY-QA-GATE-1-CLOSURE-1 — 2026-07-18 00:18 CEST