workflow-mobile-native-uiux · git:20261008.5f1659d · 2026-10-08 · sha256 758b12aa88f52ef4

workflow-mobile-native-uiux git:20261008.5f1659dA

Immutable. This exact content never changes and is served at /api/v1/blob/758b12aa88f52ef4.

---
name: workflow-mobile-native-uiux
description: >
  Run the whole native UI/UX pass on an existing Capacitor, Expo, or RN app:
  plumbing, native feel, a11y, layout, device QA, PR. Use for "fix our mobile
  UI/UX end to end".
license: MIT
metadata:
  chain: "enhance-capacitor-ui mobile-capacitor-platform enhance-mobile-native-feel audit-accessibility audit-responsive mobile-emulator-test workflow-pr"
---

# workflow-mobile-native-uiux — Existing app → native feel → verified PR

**Degree of freedom: MIXED.** Which fixes each screen gets `[HIGH freedom]`;
step order, skip rules, device probes, and the PR evidence
`[LOW freedom — run exactly]`.

The app ships and works, but it reads as a website in a shell. This workflow
runs the mobile skills in the order their outputs depend on each other: separate
the surfaces, fix the shell plumbing, run the native-feel pass, then prove it
with accessibility, layout, and device checks before one PR.

## This skill vs neighbors

| Skill | Owns |
|---|---|
| **workflow-mobile-native-uiux** (this) | The end-to-end run: every step below, one branch, one PR |
| `enhance-mobile-native-feel` | The design pass alone (step 3), no verification sweep or PR |
| `mobile-rn-screen` | One React Native screen |
| `plan-mobile-readiness` | Store submission audit, plan-only; run it after this if a release is next |
| `plan-capacitor-hardening` | Native-layer security, plan-only |
| `design-mobile-first` | A new touch-first UI, not an existing app |

## How to reason

1. **Baseline** — stack, versions, before-screenshots, scorecard
2. **Order** — surfaces → plumbing → native feel; each later step assumes the earlier one
3. **Prove** — a11y, layout, and device probes with evidence, not "looks fine"
4. **Ship** — one PR carrying before/after, the scorecard, and the probe table

## Worked example

> Illustrative.
> **Baseline:** Capacitor 8.1, React + Ionic, PWA and both stores from one codebase;
> `targetSdkVersion 35`; JS tab bar; scorecard 3/10.
> **Order:** step 1 splits `useIsMobile` into form factor / platform / pointer; step 2
> moves to `targetSdkVersion 36`, `SystemBars`, deletes `StatusBar.setBackgroundColor`,
> adds the back listener; step 3 moves secondary flows to sheets and fixes haptic styles.
> **Prove:** 2.5.8 probe finds 11 icon buttons at 20 px; fixed on touched screens, 3 left
> on the untouched settings page go in the report. Tablet AVD landscape was a stretched
> phone; fixed. Back from a nested route exited the app; fixed.
> **Ship:** scorecard 3 → 9/10; PR notes a store build is needed (native config changed).

## Self-critique before reporting

- **Order kept** — no native-feel edits before the plumbing they depend on
- **Skips named** — every skipped step has its reason in the report
- **Fixes scoped** — a11y fixes stayed on the screens this pass touched; the rest are listed
- **Device evidence** — back, font scale, reduce motion, large screen each have a screenshot or output; iOS is `not run` when no Mac was available
- **Store build flagged** — the PR says whether any change needs a native build
- **Right owner** — store paperwork → `plan-mobile-readiness`; security → `plan-capacitor-hardening`

---

## Sequence  [LOW freedom — run exactly]

```
0. BASELINE      → versions, before-screenshots, scorecard (no skill)
1. SURFACES      → enhance-capacitor-ui        (only if one codebase also ships to the web)
2. PLUMBING      → mobile-capacitor-platform   (Capacitor only: § Native shell plumbing)
3. NATIVE FEEL   → enhance-mobile-native-feel  (chrome, IA, lists, motion, haptics, type)
4. ACCESSIBILITY → audit-accessibility         (WCAG 2.2 AA, incl. 2.5.8 / 2.4.11 / 2.5.7)
5. LAYOUT        → audit-responsive            (phone landscape, tablet, foldable)
6. DEVICE QA     → mobile-emulator-test        (walk + native-feel probes on Android 16)
7. PR            → workflow-pr                 (before/after, scorecard, probe table)
```

Skip step 1 when the app has no web surface, and step 2 for Expo / React Native
(their shell recipes live in `enhance-mobile-native-feel`). Name every skip in the
report. Work on one branch and commit after each step (`workflow-git-commit`
format), so step 7 starts from a committed branch.

The turn ends at the step-7 PR or at a real gate: a decision only the user can
make, a missing credential, a device that will not boot. A step summary is a
progress note, not a stopping point.

---

## Step 0: Baseline  [LOW freedom — run exactly]

```bash
grep -E '"(expo|react-native|@capacitor/core|@ionic/react|@ionic/angular)"' package.json
grep -nE 'targetSdkVersion|compileSdkVersion' android/variables.gradle android/app/build.gradle 2>/dev/null
git switch -c feat/native-uiux
```

Boot an Android 16 AVD (Expo / RN: `mobile-emulator-start`; Capacitor:
`npx cap run android`). Screenshot every top-level screen in light and dark, and
fill the `enhance-mobile-native-feel` scorecard. These are the "before" set.

## Step 1: Surfaces (read enhance-capacitor-ui)  [HIGH freedom]

> Read the `enhance-capacitor-ui` skill and follow it.

Done when no `useIsMobile` answers platform or pointer, chrome visibility is
CSS-gated, and the six-cell matrix was viewed.

## Step 2: Plumbing (read mobile-capacitor-platform)  [LOW freedom — run exactly]

> Read the `mobile-capacitor-platform` skill and follow its *Version discipline*
> and *Native shell plumbing* sections only.

Done when every plumbing row has its probe result and the dead-bar-config grep
returns zero hits.

## Step 3: Native feel (read enhance-mobile-native-feel)  [HIGH freedom]

> Read the `enhance-mobile-native-feel` skill and follow it.

Run the whole fix order. Done when the re-scored card and the reduced-motion,
target-size, and back gates pass.

## Step 4: Accessibility (read audit-accessibility)  [HIGH freedom]

> Read the `audit-accessibility` skill and follow it.

That skill reports first. Here, the request to fix the app's UI/UX approves fixing
Level A and AA findings on the screens steps 1–3 touched; list the rest in the
report with their SC. Capacitor: audit the web build at a 390×844 viewport.
Expo / RN with no web build: axe does not apply; check `accessibilityLabel`,
`accessibilityRole`, and hit areas in code, run the device probes in step 6, and
mark the axe rows `not run`.

## Step 5: Layout (read audit-responsive)  [HIGH freedom]

> Read the `audit-responsive` skill and follow it.

Include the native cells (`844 390` and `1024 768`). Done when no screen is a
stretched portrait phone in landscape or on a tablet.

## Step 6: Device QA (read mobile-emulator-test)  [LOW freedom — hand off]

> Read the `mobile-emulator-test` skill and follow it.

Run the walk plus its *Native-feel probes* (back, font scale 2.0, reduce motion,
large screen, gesture vs 3-button nav). iOS needs a Mac with a simulator;
otherwise report iOS as `not run`, never as passed.

## Step 7: PR (read workflow-pr)  [LOW freedom — hand off]

> Read the `workflow-pr` skill and follow it.

The PR description carries: before/after screenshots per top-level screen, the
scorecard before → after, the probe table from step 6, the skipped steps with
reasons, and whether a store build is needed (any change under `ios/`,
`android/`, `capacitor.config.*`, or `app.json` native keys needs one; JS, CSS,
and assets alone can ship over the air where the app uses OTA). Merge only if
the user asked.

---

## Report  [LOW freedom — run exactly]

```markdown
## Native UI/UX pass — <app> — <date>
**Stack:** <Capacitor n | Expo SDK n / RN n> · targetSdk <n> · **Score:** <before>/10 → <after>/10
| Step | Result | Evidence |
|---|---|---|
| 1 Surfaces | done / skipped (<reason>) | |
| 2 Plumbing | done / skipped (<reason>) | probe outputs |
| 3 Native feel | done | before/after paths |
| 4 Accessibility | n fixed · n listed | SC per finding |
| 5 Layout | done | landscape + tablet shots |
| 6 Device QA | Android ✓ · iOS ✓ / not run | probe table |
| 7 PR | <url> | store build: yes / no |
**Open:** <what still fails and why>
```