template compliance answers never reach a store: init writes unanswered (dataSafety, appPrivacy, reviewNotes, ageRating, accounts, reviewAccess), older configs are recognised by the template values; check / validate / scan block, play data-safety (also --dry), console plan / fill, apple review-details and appinfo refuse. onboard --declarations replaces them on a live app: name and copyright from the stores (a copyright with a private term is left out), the rows the code proves (scan proposal, sign-up methods from auth code and login SDKs), the rest as one owner question list. play data-safety --dry prints the answers that change (old -> new, account and deletion first) against the last uploaded CSV; pitfall 60; tests

This commit is contained in:
CRTkafa 2026-10-14 11:36:30 +08:00
parent 34c2fa22e5
commit 7219ded3e8
27 changed files with 659 additions and 19 deletions

View file

@ -5,6 +5,11 @@
import type { ShipConfig } from 'storebound';
const config: ShipConfig = {
// Every compliance answer below is the TEMPLATE's, not yours. While an area is listed here, check / validate block
// and nothing sends it to a store. Derive the answers from the code (storebound scan --write; for an app that is
// already live: storebound onboard --declarations), answer the rest, then remove the area from this list.
unanswered: ['dataSafety', 'appPrivacy', 'reviewNotes', 'ageRating', 'accounts', 'reviewAccess'],
app: {
name: 'Example App',
profile: 'app',

View file

@ -5,6 +5,11 @@
import type { ShipConfig } from 'storebound';
const config: ShipConfig = {
// Every compliance answer below is the TEMPLATE's, not yours. While an area is listed here, check / validate block
// and nothing sends it to a store. Derive the answers from the code (storebound scan --write; for an app that is
// already live: storebound onboard --declarations), answer the rest, then remove the area from this list.
unanswered: ['dataSafety', 'appPrivacy', 'reviewNotes', 'ageRating', 'accounts', 'reviewAccess'],
app: {
name: 'Example App',
profile: 'subscription-app',

View file

@ -4,6 +4,11 @@
import type { ShipConfig } from 'storebound';
const config: ShipConfig = {
// Every compliance answer below is the TEMPLATE's, not yours. While an area is listed here, check / validate block
// and nothing sends it to a store. Derive the answers from the code (storebound scan --write; for an app that is
// already live: storebound onboard --declarations), answer the rest, then remove the area from this list.
unanswered: ['dataSafety', 'appPrivacy', 'reviewNotes', 'ageRating'],
app: {
name: 'Example Game',
profile: 'game',