Skip to content

[Feature]: Out-of-band auto-scorer model updates without a full Play release #715

Description

@mathrb

Problem / use case

The auto-scorer (camera assist, beta) ships its detection model bundled as an
app asset (assets/models/dart_auto_scorer.tflite, pinned via
kAutoScorerModelVersion). Today, improving only the model — no code change —
still requires a full app release and Google Play review. The review cycle is
slow and disproportionate for a payload that is data, not behaviour.

We want a way to ship an improved detection model to users out-of-band,
without going through a new Play release and its review, the way games stream
updated assets at launch.

Proposed solution

Scope a mechanism that lets the app fetch a newer auto-scorer model at runtime
and use it in place of the bundled one, while remaining safe and Play-compliant.

Goals / constraints to design around:

  • A model swap must only take effect when it is compatible with the code the
    installed app already runs (input size, class map, preprocessing, threshold
    semantics). The currently-bundled model stays the fallback.
  • Must degrade gracefully: offline, failed download, or any integrity failure →
    keep using the bundled model, never break scoring.
  • No change to what user data leaves the device (the download is an outbound
    fetch of a data file; frame capture stays local and gated).

Alternatives considered

  • Google "Play for On-device AI" (AI packs) — Google-hosted, free, with
    differential patching, BUT AI packs are still versioned together with the app
    binary, so they do not avoid a release/review for a model-only change.
    Reduces download size, not the review cycle. Rejected for the stated goal.
  • Status quo (bundle + full release per model) — what we do now; the cost
    this ticket exists to remove.

Scope notes

  • No persistence / game-events / statistics impact.
  • Touches the auto-scorer detector loading path and app startup; needs network
    (INTERNET) — verify it's already in the merged manifest.
  • Compliance angle is already researched (see context): a .tflite is data,
    not executable code
    , so a runtime model download is permitted under Google
    Play's Device and Network Abuse policy; no Data safety / privacy-policy change
    as long as no user data is uploaded.

Before implementation

Do not treat any architecture as decided. Re-derive the design from current
code via /plan first, answering at least:

  • Where/how the model is loaded today and where a remote source would slot in.
  • How to express and enforce the compatibility contract between a remote model
    and the installed app version (so an incompatible model is ignored, not run).
  • Integrity / authenticity of the downloaded file, and the fallback chain.
  • Hosting choice and its operational cost (versioning, bandwidth, availability).
  • When this canal is not enough and a real release is still required (contract
    changes: classes, input resolution, preprocessing).

Additional context

Compliance research (2026-06-27):

Feature is and stays beta (model still experimental).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions