| name | rn-harness-acceptance |
| description | Phase 7.5 โ Human acceptance gate before store build. Runs an automated Maestro E2E smoke test on a real simulator/emulator, then PAUSES for the user to run the app themselves and explicitly approve before any EAS/local build or store submission. |
| allowed-tools | ["Read","Write","Edit","Bash","Glob","Grep","AskUserQuestion"] |
rn-harness-acceptance โ Phase 7.5: User Acceptance Gate
The last checkpoint before irreversible work (store build โ submission). The agent Evaluator (Phase 6) already judged that the app works; this phase asks a different question a machine can't answer: "is this the app the user actually wanted, and are they OK shipping it?"
Runs after AdMob (Phase 7) so the user reviews the real, ad-integrated app, and before Build (Phase 8) so nothing gets built or submitted without an explicit human yes.
Evaluator PASS โ AdMob โ [๐ค THIS PHASE] โ Build โ Screenshots โ Submit
Trigger
Called by the orchestrator as Phase 7.5. Skipped only if config.md โ skip_acceptance: true (e.g. unattended CI) โ and even then, log loudly that a human gate was bypassed.
Input
- Project code (AdMob integration complete)
docs/harness/handoff/plan.md (PRD โ core user journeys)
docs/harness/config.md
Two parts
Part 1: Automated E2E Smoke (objective floor)
Give the human a known-good starting point โ don't ask them to approve an app that fails its own core flows.
Why Maestro: the screenshot phase already uses it, so it's a cheap add. Maestro drives the real app on a simulator/emulator via YAML flows. (Alternatives: Detox โ RN-specific, heavier setup; Appium โ cross-platform, heaviest. Default to Maestro here.)
-
Launch the app (AdMob = native module โ Expo Go will crash; use a dev client / native run):
npx expo run:ios
npx expo run:android
-
Create/reuse E2E flows under .maestro/ โ one flow per core user journey from the PRD. Keep them smoke-level (does the happy path work end to end), not exhaustive:
appId: com.company.app
---
- launchApp
- assertVisible: "<home screen anchor text>"
- tapOn: "<primary CTA>"
- assertVisible: "<expected next screen>"
-
Run the flows:
maestro test .maestro/
-
Report per-flow pass/fail. Any failure โ this is a bug the Evaluator missed: hand back to Generator with the failing flow as evidence, then re-run. Do not advance to the human step on a red smoke test (unless the user explicitly overrides).
This is automated regression coverage โ it answers "does it still work," not "is it good." That second question is Part 2.
Part 2: Human Acceptance PAUSE (subjective judgment)
Set state.md status to paused, then AskUserQuestion:
์ฑ์ด ๊ธฐ๋ฅ QA + E2E ์ค๋ชจํฌ๋ฅผ ํต๊ณผํ์ต๋๋ค. ์คํ ์ด ๋น๋/์ ์ถ ์ ์ ์ง์ ํ์ธํด ์ฃผ์ธ์.
โถ ์คํ ๋ฐฉ๋ฒ:
npx expo run:ios # ๋๋
npx expo run:android
(AdMob ํตํฉ ์ํ๋ผ Expo Go ์๋ โ ์ ๋ช
๋ น์ผ๋ก dev ๋น๋ ์คํ)
โถ ์๋ E2E ์ค๋ชจํฌ ๊ฒฐ๊ณผ:
[flow๋ณ PASS/FAIL ์์ฝ]
์ง์ ์จ๋ณด๊ณ ์๋์์ ์ ํํ์ธ์:
| ์ ํ์ง | ๊ฒฐ๊ณผ |
|---|
| ์น์ธ โ ๋น๋ ์งํ | status: running โ Phase 8 (Build)๋ก ์งํ |
| ์์ ์์ฒญ | ํผ๋๋ฐฑ์ docs/harness/feedback/์ ๊ธฐ๋ก โ Generator(Phase 5)๋ก ๋๋๋ฆผ โ ์ฌQA |
| ์ค๋จ | status: paused ์ ์ง, ํ์ดํ๋ผ์ธ ์ ์ง |
- "์์ ์์ฒญ" ์ ํ ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌด์์ ๊ณ ์น ์ง ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ์ feedback ํ์ผ๋ก ์ ์ฅํ๊ณ Generator์ ํธ๋์คํ.
- ์น์ธ ์ ์๋ ์ด๋ค ๋น๋/์ ์ถ ๋ช
๋ น๋ ์คํ ๊ธ์ง.
Output
docs/harness/handoff/acceptance-result.md:
# User Acceptance โ Phase 7.5
## Automated E2E (Maestro)
- Flows run: [N]
- Passed: [N] / Failed: [N]
- Failing flows: [list or none]
## Human Decision
- Result: [APPROVED / CHANGES_REQUESTED / ABORTED]
- Reviewed on: [simulator/device]
- Feedback (if changes requested): [text โ docs/harness/feedback/...]
- Approved by: user
State Update
On approval:
current_phase: build
next_role: rn-harness-build
On changes requested:
current_phase: generator
next_role: rn-harness-generator
HARD GATES
- E2E smoke must PASS before presenting the app for approval (or user explicitly overrides a known failure)
- No build or submission command runs before explicit user approval โ this is the whole point of the gate
- AdMob apps: never launch via Expo Go (crashes) โ use
expo run:* / dev client
- "Changes requested" must capture concrete feedback and route back to Generator, not silently loop
- If
skip_acceptance: true, log a loud warning that the human gate was bypassed