Skip to content
Deployment
Skill

/flame-harness-submit

Phase 10 — upload store text metadata + categories via fastlane, then pause with exact manual steps for the final iOS review submission and Android production promotion.

From plugin
flutter-flame-harness
6114 skills1 hook

Claude Code

$ npx -y skills add tjdrhs90/flutter-flame-harness --skill flame-harness-submit --agent claude-code

SKILL.md

flame-harness-submit.SKILL.md
name: flame-harness-submit
description: Phase 10 — upload store text metadata + categories via fastlane, then pause with exact manual steps for the final iOS review submission and Android production promotion.
argument-hint: ""
allowed-tools: [Read, Write, Edit, Bash, AskUserQuestion]

flame-harness-submit

Phase 10 of the flutter-flame-harness pipeline. Uploads store text metadata and app categories via fastlane for both iOS and Android, then pauses the pipeline with exact manual steps for the final review submission / production promotion (see **Boundary** below for what is genuinely manual and what is a deliberate checkpoint).

All file schemas (`config.md`, `state.md`, `pipeline-log.md`) and the phase transition table are defined in `docs/harness-protocol.md` — that document is the single source of truth (§1 for `config.md`; §2 for `state.md` keys and `pause_reason` values; §6 for `pipeline-log.md` schema; §7 for the `submit → metadata-done → paused` transition and the `(paused) → resume → retro` transition). Do not redefine schemas here.

**Boundary:** Text metadata upload is automated. The final "Submit for Review" on iOS and the "Promote to production" action on Android are **manual in this pipeline** — deliberately, so a human sees the assembled listing once before it goes out, and because the Play questionnaires (Content Rating, Data Safety, Target Audience) have no API.

Note the iOS half *is* automatable if you want it: `reviewSubmissions` will submit a version end-to-end (see **iOS submission over the API** below). What is genuinely not automatable is the Play side and the age-rating questionnaire. Keep the pause unless you have a reason not to — the review is the point of it.

**Prerequisites:** Phase 9 (`flame-harness-screenshot`) completed; screenshots and ASO metadata already uploaded; `state.md` shows `next_role: submit`.

---

Input — Read Inputs

Before any action, load:

1. `docs/harness/config.md` — extract `app_slug`, `bundle_id`, `app_name`, and `default_language` (per protocol §1). 2. `docs/harness/state.md` — confirm `next_role: submit` (per protocol §2).

Derive the game project root for `<app_slug>` from `config.md` / the harness working directory (the games live under the same parent as the harness, e.g. `…/AndroidStudioProjects/<app_slug>/`).

---

Phase 0 — Generate store-info files from config

Before uploading, write the store-listing + App-Review files from the `developer` block in `config.md` (sourced from `credentials/store-metadata.md`) so they actually get uploaded — these are otherwise empty and the listing/review info would be missing.

**iOS (deliver picks these up automatically):**

  • `ios/fastlane/metadata/copyright.txt` ← `developer.copyright`
  • per locale (`ko`, `en-US`): `support_url.txt` ← `developer.homepage`, `marketing_url.txt` ←

`developer.homepage`, `privacy_url.txt` ← `developer.privacy`

  • `ios/fastlane/metadata/review_information/`: `first_name.txt`, `last_name.txt`, `phone_number.txt`,

`email_address.txt` ← `developer.*`; `notes.txt` ← reviewer notes (e.g. the ATT screen-recording note for an ads build).

**Android (contact email + website have no `supply` field — set via the Publisher API):**

  • copy `templates/set_contact_details.rb.template` → `android/fastlane/set_contact_details.rb`,

fill `__PACKAGE__`=`bundle_id`, `__EMAIL__`=`developer.email`, `__WEBSITE__`=`developer.homepage`, and run `cd android && ruby fastlane/set_contact_details.rb`.

  • The **privacy policy URL** and Data Safety / Content Rating / Target Audience are set in the manual

step below (Play console).

Phase 1 — Metadata Upload

Run the fastlane metadata and categories lanes for both platforms. These lanes push text metadata (localized titles, descriptions, release notes) and app category assignments to the stores without uploading a binary.

iOS metadata upload

cd <game>/ios
fastlane metadata
fastlane categories
  • `fastlane metadata` pushes all locale text files under `ios/fastlane/metadata/` to App Store

Connect via `deliver` (titles, subtitles, descriptions, keywords, promotional text, release notes).

  • `fastlane categories` sets the primary and secondary App Store category. The `categories` lane

must already exist in the generated `ios/fastlane/Fastfile` (written by Phase 8 `flame-harness-build`).

Android metadata upload

cd <game>/android
fastlane metadata
fastlane release_notes
  • `fastlane metadata` pushes all locale text files under `android/fastlane/metadata/android/` to

Google Play (titles, short descriptions, full descriptions) via `upload_to_play_store` with `skip_upload_apk: true` and `skip_upload_aab: true`.

  • `fastlane release_notes` pushes the `changelogs/<version-code>.txt` files for the current

release.

If any fastlane lane exits non-zero, do NOT proceed to the pause step. Instead write `docs/harness/state.md` with `status: paused`, `pause_reason: manual_action`, and `next_role: submit` (retry), then explain the error and stop.

---

Phase 2 — Manual Steps + Pause

After both upload sequences complete successfully, the pipeline must pause so the developer can perform the final submission actions that cannot be automated.

**Pre-submit rejection checklist** (print this with the manual steps — these are the rejections already hit; see `docs/game-gotchas.md` → Store rejections):

  • **Age rating declarations complete — especially `advertising` = Yes.** Apple added

`userGeneratedContent`, `messagingAndChat`, `ageAssurance`, `gunsOrOtherWeapons`, `advertising`, `healthOrWellnessTopics`, `parentalControls` in 2026. An app record that only answered the old questionnaire is blocked before human review. **Any AdMob build (banners count) must answer `advertising` = Yes**, or Apple's automated analysis bounces it. `ageRatingDeclarations` is write-only over the API (`GET` → `403`) — verify in the Connect UI, there is no other way.

  • **Android: check the *merged* man
Read more
@tjdrhs90
Ships withflutter-flame-harness

An autonomous game launch harness for Claude Code, Google Antigravity, and OpenAI Codex that takes a Flutter/Flame game from raw idea all the way to the app stores.

Stars on GitHub

Momentum

stars in total
61
Star history of tjdrhs90/flutter-flame-harness on GitHub, a chart by star-history.com

Other skills on flutter-flame-harness.

More skills from other plugins.

configuring-horizon

configuring-horizon

Use this skill whenever the user mentions Horizon by name in a Laravel context. Covers the full Horizon lifecycle: installing…

coolify10d66k
@coollabsio@coollabsioInstall Skill
vercel-cli

vercel-cli

Guides deployment, configuration, and troubleshooting with the Vercel CLI. Use when operating Vercel projects or resources…

vercel12d16k
@vercel@vercelInstall Skill
skypilot

skypilot

Use when launching cloud VMs, Kubernetes pods, or Slurm jobs for GPU/TPU/CPU workloads, training or fine-tuning models on cloud…

@skypilot-org@skypilot-orgInstall Skill
pinme

pinme

Use this skill when the user mentions "pinme", or needs to upload files, store to IPFS, create/publish/deploy websites or…

pinme2mo3.8k
@glitternetwork@glitternetworkInstall Skill

Questions about flame-harness-submit.

Which coding agents can use flame-harness-submit?
flame-harness-submit installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.