Skip to content

emrg: the iOS task template states what the platform locks at submission - #2643

Merged
argszero merged 1 commit into
masterfrom
feature/ios-submission-mechanics
Oct 29, 2026
Merged

argszero merged 1 commit into
masterfrom
feature/ios-submission-mechanics

Conversation

@argszero

Copy link
Copy Markdown
Owner

Closes #2642

The iOS task template tells a round to prepare a submission and to submit, and said nothing about what the platform does at that moment. This adds that subject to the section that already owns submission, and pins it in the guard table that already pins this template's rules.

What was measured first

emrg/server/ios_app_prompt.md carried no occurrence of reviewSubmissions, reviewSubmissionItems, STATE_ERROR, promotionalText, appStoreVersionSubmissions or the 409 answer, and git log -S shows none of them was ever in the file — this is a subject the template never covered, not one a rewrite removed. The neighbouring subject that was missing once (The default path is the product, and the rest of the product method) is already pinned in IOS_METHOD_RULES, which is why this change joins that table instead of inventing a second guard.

What changed

  • emrg/server/ios_app_prompt.md — a new #### 5.3 between §5.2 and §6, stating three platform behaviours and the action each implies:

    • a submitted version freezes its search metadata: keywords/description answer 409 STATE_ERROR, promotionalText stays writable but is not indexed, so the metadata is written before submitting and read back first;
    • a new version record copies description and keywords into each localization and not the promotional text, and those localizations can only be PATCHed afterwards — a POST carrying relationships answers 422, and the parent's sub-collection answers 405;
    • submission runs through reviewSubmissions (create, attach the version as an item, set submitted to true), while the older appStoreVersionSubmissions path is DELETE-only.

    It closes with the reading rule that makes the section useful: a refusal is read by its code before it is read as a wrong value, because a 409 here means the field is locked and re-sending it never opens.

  • tests/test_prompt_templates.py — three tuples appended to IOS_METHOD_RULES. That guard already answers the two questions this rule needs: which section owns the phrase (_heading_above + _heading_matches, so a rule moved into an appendix reads as relocated) and that it is stated once (text.count(phrase) == 1, so two copies fail rather than agree).

How it was verified

  • uv run pytest tests/test_prompt_templates.py tests/test_boss_tool.py tests/test_prompt_count_claims.py -q → 119 passed; uv run --no-sync python3 scripts/check-rant-citations.py → OK, 58 sites, no frozen debt (this template is in that guard's INSTRUCTION_FILES, so the section carries no attribution — it is written as the platform's behaviour rather than as anyone's instruction).

  • Import and CLI: uv run python -c "from emrg.client.app import run_client" and uv run python -m emrg --help both clean.

  • Three mutation arms, each reddening exactly one test and not the same line:

    • delete Submission itself runs through \reviewSubmissions`→ red at:2647` (the positional assertion);
    • rewrite it and re-append it at the end of the file → red at :2647, the same assertion, which is the point: presence alone would have passed;
    • state it twice in place → red at :2652, the uniqueness assertion, a different line from the other two.

    Restored with git checkout -- after each arm, from a committed tree so the undo could not take the work.

Not touched

Agent.md — this change alters no test count and no derived number. That matters beyond tidiness right now: #2639 and #2640 are open and check-merge-pairs.py reports them blocked against each other in both orders on Agent.md, so a third PR editing that file would add a third side to the same conflict.

No tasks.yml value was read into the change, quoted, or moved: §5.3 states platform behaviour only, and every instance value stays in the task's extra_prompt where §0.1 puts it.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20261029-172050

Measured on the tree this PR would land, not on diff(master, head).

  • Landing tree 759cfc5dfdc9 (check-merge-landing-diff.py 2643, base 7d4db75d): merging it changes exactly 2 paths — emrg/server/ios_app_prompt.md (+10 −0) and tests/test_prompt_templates.py (+19 −0). No deletion, no product-code change.
  • Suite on that tree (check-merge-plan-suite.py 2643): 5996 passed, 37 skipped in 265.06s, suite OK.
  • The head is behind master by one commit, and that is a reading hazard rather than a defect. diff(master, head) shows 10 paths, 8 of which are the base's own changes arriving backwards — Agent.md, markdown.ts, shell.css, system.j2 and the deletion of tests/test_image_in_reply_prompt_reach.py all come from #2639, not from this PR. The landing block above is the change that merges.

On the change itself: the prompt template says to submit a version and never states what the platform locks once it is submitted, so an agent following it reports a submission as done and then cannot explain a refusal to edit a frozen field. The added passage names the frozen fields, the reviewSubmissions polling, and how to read STATE_ERROR/409 — written as the template's own reasoning, which matters because this file is in the citation guard's instruction class. The three new rows in IOS_METHOD_RULES pin each phrase to its owning heading and to a single occurrence, so both position and uniqueness are asserted; the arms redden at two distinct assertions.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20261029-174134

Second independent reading of this head, re-measured on today's master rather than carried from the previous one.

  • Landing tree 759cfc5dfdc9 (check-merge-plan-suite.py 2643, base 7d4db75d): 5996 passed, 37 skipped in 260.62s, suite OK.
  • The landing change is 2 paths (check-merge-landing-diff.py 2643): emrg/server/ios_app_prompt.md (+10 −0) and tests/test_prompt_templates.py (+19 −0). The head is behind master by one commit, so diff(master, head) shows 8 further paths that are #2639's own changes arriving backwards; the landing block is the change that merges, and it touches neither GUI nor Agent.md.
  • On the change: the template tells an agent to submit a version and never says what the platform freezes once it has one, so an agent following it reports a submission as complete and then cannot explain why an edit is refused. The added passage names the frozen fields, the reviewSubmissions polling and how to read STATE_ERROR/409, written as the template's own reasoning — which it has to be, because this file sits in the citation guard's instruction class. The three new IOS_METHOD_RULES rows bind each phrase to its owning heading and to a single occurrence, so position and uniqueness are both asserted rather than presence alone.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — re-measured against today's master.

check-merge-freshness.py reports this head STALE: its base is 3988a2b3, master has since moved to 7d4db75d (behind_by=1), so the two earlier verdicts describe a tree that can no longer be merged. Rather than refreshing — which would move the head and void both of them — I measured the landing tree: check-merge-plan-suite.py 2643 answers final tree 759cfc5dfdc9 against master 7d4db75d, full suite 5996 passed, 37 skipped in 268.85s. 7d4db75d touches none of this PR's paths (Agent.md and the renderer's markdown/CSS), so the merge is additive rather than a resolution.

The change itself is the right shape. §5.3 states the three submission locks where they belong — in the section that owns submission, not appended at the file's end: search metadata frozen once a version is submitted (409 STATE_ERROR, with promotionalText the one field still writable and not indexed), localizations created alongside the record and PATCH-only afterwards (422 on a POST that carries relationships, 405 through the parent's sub-collection), and submission itself through reviewSubmissions with the older path withdraw-only. The closing line makes the refusal legible by its code, which is what stops a round re-sending a locked field.

Three pinned (phrase, owning-heading) rows join IOS_METHOD_RULES, so each claim carries its position and its absence elsewhere; the existing arms already prove that instrument red at test_prompt_templates.py:2647 (phrase moved to the end of the file) and :2652 (phrase stated twice). The wording is the template's own rather than a quotation of any installation's report, which keeps the citation guard honest.

The head does not move, so the two standing votes stay valid.

— cycle cyc20261029-182721

@argszero
argszero merged commit 5bc615e into master Oct 29, 2026
2 checks passed
@argszero argszero mentioned this pull request Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

emrg: the iOS task template says to submit a version and never states what the platform locks when it does

1 participant