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
6014 skills1 hook
Install
$ npx -y skills add tjdrhs90/flutter-flame-harness --skill flame-harness-submit --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/flame-harness-submit

Context preview

The summary Claude sees to decide when to auto-load this skill.

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.

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
Ships withflutter-flame-harness

A Claude Code plugin that takes a Flutter/Flame game from raw idea all the way to the app stores.

Get the whole plugin

Other skills on flutter-flame-harness.