Skip to content

[History] Verify boardless REC operational acceptance #436

Description

@KozakBartosz

Parent

#434

Source amendment: #434 (comment)

What to build

Add an operational release gate for board-independent Ride Recording. Verify REC/STOP behavior only from a development build rebuilt and installed from the feature worktree, with the active Metro workspace, branch, commit, package id, and loaded bundle identified before judging behavior.

The check must prove that REC availability follows native location-recording capability rather than Board selection or BLE connection. Launch and JS reload must hydrate the same native LiveState.recording state without a Board reconnect or JS-side coordinate replay. A manual boardless recording must remain active after JS refresh and intentional Board disconnect until native STOP closes it.

Treat stale Metro bundles and pre-installed release APKs as invalid test environments. Record Android and iOS process/force-quit limitations precisely in the implementation PR.

Likely files

  • src/modules/board/components/FloatingBar.tsx - current REC action and disabled state are gated by bleStatus.
  • src/modules/board/store/bleStore.ts - hydrates JS state from native getLiveState() and live-state events.
  • modules/vescape-core/src/index.ts - cross-platform LiveStateEvent and recording API contract.
  • modules/vescape-core/android/src/main/java/expo/modules/vescapecore/LiveStateMapper.kt - Android native LiveState payload mapping.
  • e2e/flows/ - Maestro flows and smoke checks.
  • e2e/README.md - device/E2E environment and native-vs-fake-state guidance.
  • docs/connectionState.md - recording ownership and LiveState restoration contract.
  • docs/native-api.md - native recording API and platform behavior.

Implementation hints

  • Remove bleStatus as the authority for REC availability. Native location permission/provider state must provide any disabled reason.
  • Capture an observable native LiveState event or log in the smoke evidence. A disabled REC must correspond to an explicit location permission/provider error, never bleStatus != connected.
  • Before device evidence, record the feature worktree path, Git branch and commit, Metro project root, package id, and whether the installed app is a development build consuming the current bundle.
  • A phone refresh alone is insufficient evidence: it can reload a bundle from another worktree.
  • Do not claim uninterrupted recording after Android force-stop or iOS force-quit. State only the platform-supported foreground-service/process-restoration and background-location guarantees.
  • Follow the repository device-verification rule: rebuild and reinstall before using an installed release APK to assess JS/TypeScript changes.

Acceptance criteria

  • A development build is rebuilt and installed from the feature worktree before verification.
  • Verification evidence records the worktree path, branch, commit, Metro project root, package id, build type, and loaded JS bundle identity.
  • REC is enabled whenever native location recording can start, with no dependency on selected Board, connected Board, or bleStatus == connected.
  • Disabled REC exposes an explicit native location permission/provider reason.
  • Launch and JS reload hydrate REC/STOP from native LiveState.recording without Board reconnect or JS-side coordinate replay.
  • A manual boardless recording remains active and actionable after JS refresh.
  • Intentional Board disconnect does not close a manual Ride Recording; native STOP closes it.
  • A smoke check captures the visible native LiveState source and proves BLE state is not the REC availability gate.
  • Stale Metro bundles and pre-installed release APKs fail the test-environment precondition instead of being reported as product failures.
  • The implementation PR documents Android foreground-service/process-restoration and iOS background-location/force-quit limits without promising force-stop/force-quit survival.

Blocked by

Related

None

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:e2eMaestro E2E flows, screenshot capture tooling, device fixtures and presetsarea:historyRide history, sessions, buckets, graphsarea:nativeTouches native side (modules/vesc-ble, Swift/Kotlin)complexity:highCritical paths, subtle correctness, native pipelines. Use opus.ready-for-agentFully specified, ready for an AFK agent

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions