emrg: the iOS task template says to submit a version and never states what the platform locks when it does #2642
Description
What was observed
emrg/server/ios_app_prompt.md §5 tells a round to prepare a submission and submit it, and §5.1/§5.2 tell it how a version reaches the host and how the store page is judged. What the template does not contain is the platform's own behaviour at the moment of submission. Measured on this checkout: the file carries no occurrence of reviewSubmissions, reviewSubmissionItems, STATE_ERROR, promotionalText, appStoreVersionSubmissions, or the 409 answer — and git log -S shows none of them has ever been in this file, so this is a subject it never covered rather than one a rewrite removed.
The gap is not academic. Three platform facts decide whether a round's submission work survives:
- A submitted version's search metadata is frozen. A
PATCHofkeywordsordescriptionon a version that is already submitted answers409 STATE_ERROR, with Apple stating that the attribute cannot be edited at this time. OnlypromotionalTextstays writable, and it is not part of the search index, so writing it does not rescue the omission. - A new version record copies part of the old one. The previous version's description and keywords are copied into each localization; the promotional text is not. Those localizations are created with the record and can only be
PATCHed: aPOSTcarrying relationships answers422, and addressing them through the parent's sub-collection answers405. - Submission is an API sequence, not a form. It runs through
reviewSubmissions: create the submission, attach the version as an item, then setsubmittedto true. The olderappStoreVersionSubmissionspath isDELETE-only now.
Why it matters
A round that does not know fact 1 writes its search keywords after submitting and gets a refusal it cannot clear — the values only take effect in the next version record, so one round is spent discovering a lock the platform already documents. A round that does not know fact 3 calls an endpoint that only deletes, or posts localizations into a shape that cannot accept them, and reads two error codes as defects in its own client. Each of those costs a round and buys nothing.
The template is the only instruction every instance reads for this task, and it is where a platform rule belongs: it holds identically for every installation, so the omission is the template's rather than an installation's local note.
What the fix must satisfy
- State the three behaviours in §5, the section that already owns submission, rather than in a new top-level phase or an appendix.
- Give the rule as the platform's behaviour and the action it implies for a round, not as an incident: no dates, no migration note, no reference to where the note came from.
- Carry no instance value — no team id, no key path, no issuer id, no bundle prefix. Those stay in the task's
extra_prompt, and §0.1 already says so. - Pin it with a guard that reads the section region, and that reads as missing when the section is emptied — a guard that cannot report absence is not a guard for a rule that has to be present.
scripts/check-rant-citations.pyscans this template (itsINSTRUCTION_FILES), so the rule must carry no attribution it cannot back with a public record.
Acceptance
- The template states the three behaviours inside §5, and the guard fails when any of the pinned sentences is removed and when the section is emptied.
uv run pytest tests/test_prompt_templates.py tests/test_boss_tool.pypasses, anduv run --no-sync python3 scripts/check-rant-citations.pyreads clean.- CI green on both platforms.
Activity
argszero commentedon Oct 29, 2026
Handled by #2643