# On the Level

Offline-first Android pocket toolset: a trustworthy level, angle meter, and
calibrated screen ruler (Pro). Kotlin + Jetpack Compose, single module, no backend.

- **[BRIEF.md](BRIEF.md)** — the authoritative v1 product & technical brief
- **[AUDIT.md](AUDIT.md)** — audit of the brief; the amendments it lists are incorporated
- **resources/** — concept board (visual direction)

## Building

Open in Android Studio, or:

```sh
./gradlew assembleDebug        # build
./gradlew testDebugUnitTest    # measurement-math unit tests
```

## Scaffold status

The project skeleton follows BRIEF.md §Sensor and measurement architecture.
Implemented and tested:

- `core/sensors` — sensor selection (game rotation vector → gravity → low-passed
  accelerometer), device-frame gravity stream, and the pure measurement math:
  orientation mapping, two-sample per-mode calibration (derived in angle space,
  **applied in vector space** so it stays correct away from zero), EMA smoothing,
  lock hysteresis/dwell/debounce, display deadband, placement validity, and the
  sensor-vector contract (all sources emit device-frame world-up; flat = +9.81 on Z,
  pinned by `SensorContractTest`). All unit-tested.
- `core/settings` — DataStore preferences and per-mode calibration persistence.
- `core/billing` — entitlement interface with a stub (free-tier) implementation.
- `feature/level`, `feature/angle` — live numeric scaffolds wired to the real
  sensor pipeline, with manual Surface|Edge selection, placement-validity hints,
  lock state (locked label states the tolerance so it can never contradict the
  rounded readout), and directional hold-to-zero (vector reference, not magnitude
  subtraction).
- `feature/ruler`, `feature/tools` — static placeholders.

Not yet implemented (deliberately — see TODO markers):

- The tactile vial visuals and the spring-animated **display value** (value 3 of 3
  in the brief); scaffold screens render the deadbanded stable value directly.
- Guided calibration flow UI (math and persistence are done).
- Edge-mode readout counter-rotation on the portrait-locked activity.
- Play Billing implementation of `ProEntitlementRepository`.
- Screen ruler measurement UI and per-display scale persistence.
- Audio cue, reduced-motion behaviors, preferences UI.
