{
  "schema_version": "1.0",
  "release": "mini_hybrid_runtime_m3_m4",
  "generated_at": "2026-09-15T19:24:28Z",
  "apk": {
    "published": true,
    "channel": "beta",
    "coexists_with_stable": true,
    "package": "online.reverseml.phoneagent.hybrid",
    "application_label": "ReverseML Mini Hybrid",
    "apk_version": "0.3.0-hybrid-runtime",
    "apk_version_code": 3,
    "apk_sha256": "de79858d4be4aacfa3541cb8f6a981bb1b48aa2154e5accdcf69134137385368",
    "apk_size": 27469858,
    "apk_signing_cert_sha256": "d046834801b561bbfa418691b714b821537a98d0c87a1522347b2f3b3d91dad4",
    "download": "https://reverseml.online/mini/dl/android_hybrid_beta (approved testers only)",
    "is_primary_download": false
  },
  "model": {
    "changed": false,
    "trained": false,
    "sha256": "8a0326274d9b25a9df6d800cfb1ea51ab941c8b7bde2797f92baef5edf83ec73",
    "note": "byte-identical to the sha recorded in PUBLIC_CLAIMS_GATE_0.1; ollama models untouched. This is NOT a new model."
  },
  "versions": {
    "local_memory_schema_version": 1,
    "server_memory_schema_version": 1,
    "sync_protocol_version": "1.0",
    "planner_version": "1.0",
    "policy_version": "1.0",
    "adapter_registry_version": "1.0"
  },
  "server_code": {
    "app/routers/agent_mini_router.py": "e196abc2de5071b23afca1a810f1d351f5d462e50b0b448d0bf2f7e29bd8f9f9",
    "app/mini_memory.py": "6189a5de26581f1a57b56fe0944132aead2681c2de03550bc2920c9540c83e26",
    "app/runtime_executor.py": "6c80e52311d723fdf789436d7dc39e5e8360d95112bd097b8277edade16c03ee"
  },
  "features_verified": [
    "on-device persistent memory (SQLite, app-private)",
    "memory survives app process kill",
    "memory survives full device reboot",
    "offline recall and offline planner routing",
    "SAME / UPDATE / SUPERSEDE / CONFLICT write outcomes with history retained",
    "selective sync: phone->server push, authenticated",
    "selective sync: server->phone pull and reconcile",
    "LOCAL_ONLY records never leave the device",
    "verified-vs-verified conflict preserved, both sides kept",
    "Mini task planner routing (10 paths)",
    "level-0 device observation (battery, thermal, network, storage, runtime)",
    "level-1 safe adapters with read-back / hash verification",
    "action ledger: EXECUTED is not VERIFIED",
    "level-3 gated: not executed, no adapter exists",
    "level-4 denied outright",
    "standing permissions with grant, expiry and revocation",
    "Main/Unified Executor escalation from the device"
  ],
  "features_disabled": [
    "level-2 user-surface adapters (notification, open app, open URL) - not implemented",
    "level-3 external mutation - gated, no adapter",
    "accessibility automation - classified PROTECTED, denied",
    "device action execution beyond app-private storage"
  ],
  "tests": {
    "runtime": "Android 16 (API 36) emulator, real SQLite, real network",
    "run_against": "the production-signed RELEASE build (testBuildType=release)",
    "MiniHybridTest": "18/18 PASS",
    "MiniRuntimeE2ETest": "10/10 PASS",
    "MiniSyncLiveTest": "5/5 PASS (live server)",
    "MiniPersistenceStageTest": "4/4 PASS (write, process-kill, reboot, offline)",
    "total": "37/37",
    "stable_and_hybrid_coexist": true,
    "stable_app_starts_after_tests": true,
    "stable_api_compatibility": "0.2.2-shaped request -> 200; hybrid request -> 200"
  },
  "physical_phone_test": {
    "performed": false,
    "reason": "no physical device connected (adb devices empty); all proofs were run on the Android 16 emulator",
    "not_verified_on_emulator": "local GGUF inference - the llama runtime AAR is arm64 and the emulator image is x86_64"
  },
  "defects_found_and_fixed_during_testing": [
    "planner gated \"mark order bearings as done\" as a purchase because the task name contained \"order\"",
    "planner routed \"what is the latest price of copper?\" to memory recall, which would have answered a current-information question from stale memory",
    "a Kotlin string escape turned a regex \b into a literal backspace byte",
    "reconcile treated a server record that superseded a local row as a conflict instead of a newer version",
    "the pull cursor advanced past unresolved records, so a conflicted row would never be offered to the device again",
    "unprompted memory extraction filed an ordinary instruction containing \"is\" (\"explain why a catalogue listing is not proof of stock\") as a personal fact; fixed on BOTH the server and the device, with a regression test"
  ],
  "rollback": {
    "android_memory": "app/src/main/java/online/reverseml/phoneagent/MiniMemory.kt - remove the file and the MiniRuntime reference; SharedPreferences habit store is untouched and still works",
    "sync": "delete MemorySync.kt and the two /agent/mini/sync/* endpoints; server backup /tmp/mini_router.pre_m3.bak",
    "planner": "delete MiniPlanner.kt and restore the direct AndroidMiniAdapter call in MainActivity.submit()",
    "observer": "delete DeviceObserver.kt; UsageObserver is unchanged",
    "adapters": "delete DeviceAdapters.kt and MiniPolicy.kt",
    "independent": true,
    "live_apk": "unchanged - 0.2.2 is still the published download"
  },
  "privacy": {
    "db_location": "application-private storage, not shared/external",
    "device_id": "random per-installation UUID, not a hardware identifier",
    "consents": "escalation and memory sync are two separate opt-ins, both off by default",
    "training": "no memory path reaches training, Learning Bus, LoRA, V2/V3 or provenance"
  },
  "training_performed": false,
  "model_weights_modified": false,
  "main_modified": false,
  "website": {
    "public_capability_copy_changed": false,
    "reason": "the installable download is still 0.2.2, which contains none of these features. Advertising on-device memory, sync, planner or autonomy on /mini would describe a build no user can obtain. The copy changes when a signed 0.3.0 is published, not before.",
    "manifest_published_at": "https://reverseml.online/mini/mini_hybrid_release_20260915.json"
  },
  "release_status": "RELEASED_BETA_CHANNEL",
  "release_version": "0.3.0-hybrid-runtime",
  "release_timestamp": "2026-09-15T21:15:47Z",
  "release_notes_page": "https://reverseml.online/mini/hybrid-0.3.0.html",
  "signing": {
    "production_key_created": true,
    "key_alias": "reverseml-mini-release",
    "algorithm": "RSA 4096 / SHA384withRSA",
    "cert_sha256": "d046834801b561bbfa418691b714b821537a98d0c87a1522347b2f3b3d91dad4",
    "cert_dn": "CN=ReverseML Mini, OU=ReverseML Mini, O=ReverseML, L=Montreal, ST=Quebec, C=CA",
    "cert_valid_from": "2026-09-15",
    "cert_valid_to": "2056-09-07",
    "keystore_location_reference": "local release-secret store, outside source control; passwords supplied to the build only via environment variables",
    "previous_signing_cert_sha256": "10a5f12d7c637e9ff0d5c88e61d1945305f6370277ceaffc360ccb199ac7fee4",
    "legacy_identity": "LEGACY_INSECURE_SIGNING_IDENTITY (CN=Android Debug) - retired for all future public releases",
    "signing_identity_migrated": false,
    "signing_identity_migration_note": "the new key signs the parallel .hybrid package ONLY. The stable package keeps its existing certificate and was not touched.",
    "debug_signing_release_gate": "/opt/ai_agent/mini_access/release_signing_gate.sh",
    "debug_signing_release_gate_active": true
  },
  "model_changed": false,
  "model_sha256": "8a0326274d9b25a9df6d800cfb1ea51ab941c8b7bde2797f92baef5edf83ec73",
  "local_memory_schema_version": 1,
  "server_memory_schema_version": 1,
  "sync_protocol_version": "1.0",
  "planner_version": "1.0",
  "policy_version": "1.0",
  "adapter_registry_version": "1.0",
  "emulator_tests_passed": 37,
  "emulator_tests_total": 37,
  "physical_phone_tested": false,
  "verified_features": [
    "on-device persistent memory (SQLite, app-private)",
    "memory survives app process kill",
    "memory survives full device reboot",
    "offline recall and offline planner routing",
    "SAME / UPDATE / SUPERSEDE / CONFLICT write outcomes with history retained",
    "selective sync: phone->server push, authenticated",
    "selective sync: server->phone pull and reconcile",
    "LOCAL_ONLY records never leave the device",
    "verified-vs-verified conflict preserved, both sides kept",
    "Mini task planner routing (10 paths)",
    "level-0 device observation (battery, thermal, network, storage, runtime)",
    "level-1 safe adapters with read-back / hash verification",
    "action ledger: EXECUTED is not VERIFIED",
    "level-3 gated: not executed, no adapter exists",
    "level-4 denied outright",
    "standing permissions with grant, expiry and revocation",
    "Main/Unified Executor escalation from the device"
  ],
  "known_limitations": [
    "BETA: not the primary download; stable 0.2.2 remains the recommended install",
    "physical phone not tested - device R5CY22YEDFY was not connected",
    "local GGUF inference not re-verified on the emulator (arm64 runtime, x86_64 image)",
    "MEMORY_ID_DIVERGENCE_REMAINS: the server mints its own memory_id on push, so a synced record exists under two ids; lineage reconciliation is proven and no memory is lost",
    "level-2 user-surface adapters not implemented",
    "stable 0.2.2 remains signed with the retired development certificate; it was deliberately not re-signed, because that would break its existing installs"
  ],
  "rollback_paths": {
    "uninstall_beta_only": "adb uninstall online.reverseml.phoneagent.hybrid - stable Mini is untouched",
    "stable_frozen_record": "/opt/ai_agent/releases/MINI_STABLE_0_2_2_FROZEN/",
    "stable_apk_archive": "/opt/ai_agent/releases/MINI_STABLE_0_2_2_FROZEN/ReverseML-Mini-0.2.2-local-growth-arm64.apk",
    "mini_access_source_backup": "/opt/ai_agent/releases/MINI_STABLE_0_2_2_FROZEN/mini_access.py.bak",
    "site_backup": "/opt/ai_agent/releases/mini_hybrid_backup_20260915/",
    "server_router_backup": "/tmp/mini_router.pre_hybrid_channel.bak",
    "release_notes_page": "/opt/ai_agent/ui/mini/hybrid-0.3.0.html (delete to revert)"
  },
  "release_channel": "beta",
  "stable_release": {
    "version": "0.2.2-local-growth",
    "package": "online.reverseml.phoneagent",
    "apk_sha256": "f4410e7bff796496a8086b2676f64eb5d9302bd9d0d62f94be1affba9576684d",
    "signing_cert_sha256": "10a5f12d7c637e9ff0d5c88e61d1945305f6370277ceaffc360ccb199ac7fee4",
    "status": "PROTECTED STABLE BASELINE - unchanged, still the primary download",
    "frozen_record": "/opt/ai_agent/releases/MINI_STABLE_0_2_2_FROZEN/freeze.json",
    "MINI_STABLE_0_2_2_FROZEN": true,
    "stable_app_modified": false,
    "stable_app_data_modified": false,
    "stable_model_modified": false,
    "stable_primary_download_unchanged": true
  },
  "isolation": {
    "separate_application_id": true,
    "separate_app_private_storage": true,
    "hybrid_cannot_read_stable_storage": "enforced by Android package sandboxing",
    "server_beta_channel_confined_to": "mini:test",
    "beta_write_to_user_namespace": "REJECTED by the server",
    "beta_pull_namespaces": [
      "mini:test"
    ],
    "copy_not_move_verified": true,
    "source_memory_rows_before": 18,
    "source_memory_rows_after": 21,
    "rows_lost": 0
  },
  "migration_required_from_0_2_2": false,
  "migration_note": "none required - the beta is a separate app that installs alongside stable Mini"
}