Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add zakariaf/Flutter-Skills --skill release-and-store-shippinggit clone --depth 1 https://github.com/zakariaf/Flutter-SkillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/zakariaf/flutter-skills/release-and-store-shipping)<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/release-and-store-shipping"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/release-and-store-shipping/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/release-and-store-shipping"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/release-and-store-shipping.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00224 | $0.04403 |
| Opus 5 | $0.00112 | $0.02201 |
| Sonnet 5 | $0.00045 | $0.00881 |
| Haiku 4.5 | $0.00022 | $0.00440 |
Grade A, and why
release-and-store-shipping scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 286 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Release and store shipping
CI proves the code; a release proves the artifact. Everything here is about the
exact bundle a stranger installs — built with R8, obfuscation, tree-shaking, and
release-mode asserts stripped, signed by a key you must never lose, declaring
things about itself to a store that will pull the app if they are untrue. This
skill starts where ci-pipeline-and-gates ends and where design-review-workflow
signs off.
Building, signing, uploading, and tagging are side-effecting and irreversible in part (a published build number can never be reused; an iOS build can never be unshipped). Never run them because a task seemed to imply a release — run them only when the developer asks for a release by name. Reading and enforcing the config rules below is always in scope.
Run scripts/check-release-hygiene.sh before any release build (and in CI): it is the
static half of this skill — tracked credentials, a malformed build number, debug
signing, and debug affordances, none of which need a build to catch. Run
scripts/check-ipa-slices.sh on the built IPA before spending an upload. Platform depth
lives in references/android-play.md, references/ios-app-store.md,
references/app-store-connect-submission.md, and
references/privacy-permissions-and-claims.md.
Non-negotiable rules
pubspec.yaml'sversion: x.y.z+Nis the only version source.x.y.z→versionName/CFBundleShortVersionString,N→versionCode/CFBundleVersion. Override per build only with--build-name/--build-number; never hardcode a version inbuild.gradleorInfo.plist. WHY: two sources silently diverge and the crash report then names a version that never shipped.- The build number only ever goes up, and a published one is burned forever.
Play rejects a reused or lower
versionCode; App Store Connect rejects a reusedCFBundleVersionfor the same short version. A failed upload still burns the number — bump, don't retry. - No signing material in the repository, ever. Keystore/
.jks/.p12, the App Store Connect API key (.p8), the Play service-account JSON, andandroid/key.propertiesare gitignored and injected from a secret store. WHY: a key in git history is compromised permanently, and rotating an app signing key is a store-side process you do not want to discover during a release. - Enroll in Play App Signing and keep the upload key separate. With Play App Signing, a lost upload key is recoverable via support; a lost app signing key for an unenrolled app means the listing can never be updated again — a dead app.
- Obfuscate and split debug info, then archive the symbols with the artifact.
--obfuscate --split-debug-info=<dir>is mandatory for every uploaded build, and<dir>must be versioned per build (symbols/<x.y.z>+<N>/) and stored off-machine. WHY: symbol files are the only way to read that release's stack traces; regenerating them later produces different symbols and decodes nothing. - Verify the release artifact itself, on real hardware. Install the exact
.aab(via Play internal app sharing /bundletool) or the exact TestFlight build — never a debug or profile build, never "it worked in the emulator." WHY: R8, resource shrinking, and obfuscation only run in release, so reflective plugins, missing ProGuard rules, and stripped asserts fail first in the artifact you ship. - Assert the permission set whole, from the MERGED manifest. Transitive plugins
inject permissions you never wrote. Read the merged output (not your source
manifest), strip what you do not need with
tools:node="remove", and keep a committed expected-permission list that a gate diffs against. On iOS everyNS*UsageDescriptionpresent must be honest and every one you need must exist — a missing usage string is an App Review rejection, an unused one is a claim you cannot defend. Seereferences/privacy-permissions-and-claims.md. - Every store declaration must be provable in the repo. Play Data Safety, App
Store privacy nutrition labels, and
PrivacyInfo.xcprivacy(required-reason APIs- third-party SDK privacy manifests) describe what the code does. Add a crash reporter, an ads SDK, or an analytics package and the declaration changes in the same PR. WHY: a false declaration is a takedown, not a warning.
- No absolute privacy claims. Ban "nothing ever leaves your device" and "completely private" as listing/onboarding copy. State the mechanism instead — what is stored, where, what leaves, and when. WHY: one crash upload, one share-sheet export, or one map tile makes the absolute sentence a lie.
- Debug affordances must be unreachable in release. Dev menus, fixture seeding,
eraseDatabaseOnSchemaChange, log-everything sinks, and staging endpoints are compiled out or behind a flavor that is not the store flavor — proved by a grep gate, not by memory. WHY: shipped, they wipe or leak real user data. - Size and cold start are measured on the release build and recorded per
release.
--analyze-sizefor bytes,--trace-startupin profile for the first frame, on a real low-end target device. A regression past the recorded budget is a release blocker, not a note. - Roll out in stages with a written halt criterion. internal → closed → production at a staged percentage, with the crash-free-sessions threshold that triggers a halt decided before the rollout starts. WHY: Play rollouts can be halted; an App Store release can only be superseded by another build.
- One tagged commit ships. Tag the exact commit, attach release notes, and keep
the artifact + symbol archive with the tag. The dated design-review sign-off
(
design-review-workflow) is a precondition, not part of this pass. - Store-side gates are account-holder-only, and store-side state is never assumed. Creating the app record, the privacy questionnaire, and the Paid Applications Agreement have no API and block on a human — raise them on day one. An inactive Paid Applications Agreement makes StoreKit return zero products, which presents as a broken purchase button, not as a missing agreement. Everything that is API-settable (price, territory availability, in-app purchase state, screenshots, metadata) is read back from the store before submission — a green upload log is not server state, and a committed screenshot folder is not an uploaded screenshot set. WHY: every one of these blocks submission with a message that names a symptom rather than the setting.
- A first release submits the app version AND its first in-app purchase together.
Apple requires the first purchase of each type to ride an app-version submission; ship the
version alone and App Review closes the submission without reviewing the app
(Guideline 2.1(b)), and the remedy costs a new binary plus a full review cycle. Verify with
one request before submitting —
GET /v1/reviewSubmissions/{id}/itemsmust return 2 items, not 1. WHY: a configured purchase reports a submittable state that reads, to every tool and every human, exactly like a submitted one. Seereferences/app-store-connect-submission.md.
What ships with it
6 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 286 lines · 224 tokens per session scan A 1ffcd245429b
release-and-store-shipping is a skill published in the GitHub repository zakariaf/Flutter-Skills (2 stars, last pushed 13d ago), licensed MIT. It adds 224 tokens to every session and 4,403 once invoked, about $0.0011 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
codew-release-qa-sweep
Use before claiming Codewhale release work is done: run the full gate sweep and list the manual QA targets.
gh-credit-harvest
Harvest one community PR into a release branch with authorship and credit preserved, verified green, and a warm thank-you.
release
Skill "release" from Hmbown/Codewhale, covering release, invocation, non-goals and workflow.
axiom-shipping
Use when preparing ANY app for submission, handling App Store rejections, writing appeals, or managing App Store Connect. Covers submission checklists, rejection troubleshooting, metadata requirements, privacy manifests, age ratings, export compliance.
publish-notes
Draft user-facing release notes, store changelogs, and internal publish summaries.
release-notes
Draft user-facing release notes from a git log range. Trigger when the user asks for "release notes", "changelog entry", or "what shipped this week" with a git ref range. Output is markdown sections grouped by Features / Fixes / Breaking with PR links.