mavericks-mvi — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mavericks-mvi (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Mavericks screens are rendered from immutable state. Keep state data-only, reducers pure, and side effects in ViewModel methods or UI consumers.
| Task | Use |
|---|---|
| Define screen state | data class XxxState(...) : MavericksState |
| Create Hilt VM | @AssistedInject + @Assisted initialState + Factory + hiltMavericksViewModelFactory() |
| Register VM | @Binds @IntoMap @ViewModelKey in the owning ViewModelModule |
| One-shot request | suspend { repo.call() }.execute { copy(request = it) } |
| Long-lived Flow to normal state | flow.setOnEach { value -> copy(value = value) } |
| Refresh without UI flicker | .execute(retainValue = State::request) { ... } |
| Compose VM | mavericksViewModel() or mavericksViewModel(argsFactory = { args }) |
| Compose state | vm.collectAsStateWithLifecycle(State::prop) |
| Fragment VM | by fragmentViewModel() / activityViewModel() / parentFragmentViewModel() |
| Fragment state | vm.onEach(State::prop) { ... } |
| Fragment one-shot | vm.onEach(State::effect, deliveryMode = uniqueOnly()) { ... } |
| Read current state in VM | withState { state -> ... } or suspend awaitState() |
@AssistedInject, @Assisted initialState, @AssistedFactory, and hiltMavericksViewModelFactory().@Binds @IntoMap @ViewModelKey.execute for finite async work represented by Async<T>.setOnEach for long-lived Flows that map directly to ordinary State fields.com.airbnb.mvrx.compose.collectAsStateWithLifecycle.DeliveryMode is only for MavericksView subscriptions, not ViewModel onEach and not Compose.@PersistState: references/state.mdexecute, setOnEach, setState, withState: references/viewmodel-execute.mdMavericksView, DeliveryMode, scopes: references/observing-ui.mdAsync<T> states and rendering patterns: references/async.md| Pitfall | Fix |
|---|---|
| Missing State defaults with no args path | Add defaults or initialize through args/initialState() |
| Mutable State field | Use immutable/read-only types and copy on update |
| Storing derived values | Use computed properties |
Reading immediately after setState | Use reducer state, withState, or awaitState() |
| Heavy work inside reducer | Move work before setState or into execute(dispatcher) |
Long action inside VM onEach gets cancelled | onEach uses collectLatest; move long work elsewhere |
Flow wrapped in execute when no Async is needed | Use setOnEach |
| UI flickers during refresh | Use retainValue |
Rendering state with uniqueOnly() | Use default delivery mode |
Compose using legacy collectAsState | Use Mavericks collectAsStateWithLifecycle |
| Required Compose args omitted | Use mavericksViewModel(argsFactory = { args }) |
| Effect fires twice after Fragment restart | Use uniqueOnly() and clear after handling |
| Multiple effects lost | Use a list/queue or redesign event semantics |
| Hilt VM creation crashes | Check @AssistedFactory, companion factory, and ViewModelModule binding |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.