play data-safety: PSL_SUPPORT_DATA_DELETION_BY_USER as Play's single choice (partialDeletion true | false | 'auto90'), drop the removed PSL_DATA_COLLECTION_USER_REQUEST_DELETE (deletionRequest deprecated, check notes it); ship Google's empty form (cli/data/play-data-safety-form.csv, exported 2026-10-12), take every Answer requirement from it and report pairs not in it (formPairIssues) in check, declarations and play data-safety. Pitfall 21

This commit is contained in:
CRTkafa 2026-10-12 09:33:56 +08:00
parent dfc28c15f8
commit b5b8f2da9d
35 changed files with 1824 additions and 859 deletions

View file

@ -9,6 +9,24 @@
owner presses only the final public or irreversible buttons and answers the facts no file proves in one batch at
the start. Skill text that left navigation, draft saves, exports or uploads to the owner is rewritten;
`tests/do-it-dont-ask.test.ts` guards it. Pitfall 26.
- Fix (`play data-safety`): apps with accounts got Play 400 "Invalid safety labels declaration: Line 7: Response ID
missing". Play's current form asks `PSL_SUPPORT_DATA_DELETION_BY_USER` as a single choice with three options;
storebound wrote it as a bare TRUE / FALSE. It now writes one row per option with TRUE on the picked one, and
`dataSafety.partialDeletion` is `true | false | 'auto90'`: true = `DATA_DELETION_YES` (plus `PSL_DATA_DELETION_URL`),
false = `DATA_DELETION_NO`, `'auto90'` = `DATA_DELETION_NO_AUTO_DELETED` ("No, but user data is automatically
deleted within 90 days"); left out, `check` names it as missing.
- Play removed `PSL_DATA_COLLECTION_USER_REQUEST_DELETE` from the form, so it is no longer written and has no rule.
`dataSafety.deletionRequest` is deprecated and optional; `check` prints a note to remove it. `profile` checks,
`scan` and the desktop app no longer ask for it (the desktop Data safety card shows the deletion answer instead).
- Google's empty form, exported from Play Console on 2026-10-12, ships as `cli/data/play-data-safety-form.csv`
(embedded in the binary). Every row's Answer requirement (and label) comes from it, `dataSafety.extra` rows
included (they were guessed as MULTIPLE_CHOICE / MAYBE_REQUIRED). New `formPairIssues`: every (Question ID,
Response ID) pair must be in that form, or `check`, `project.declarations`, `play data-safety --dry` and the real
run (before the POST) report "<q>,<r> is not in Play's current Data safety form ...; Play answers 400". Refresh
the file when Play changes the form (Play Console > App content > Data safety > Export to CSV, nothing answered).
- `templates/data-safety.csv` (the filled example from `init`) regenerated against the form. Pitfall 21.
- Fix (`play build`): the Android SDK is found the way Android Studio finds it, so a non-interactive shell (no
`ANDROID_HOME`) with a gitignored `local.properties` no longer ends in Gradle's "SDK location not found". Order:
`ANDROID_HOME`, `ANDROID_SDK_ROOT`, `sdk.dir` in the Gradle project's `local.properties`, then