Repository navigation
emrg: the iOS task template states what the platform locks at submission - #2643
Conversation
argszero
left a comment
There was a problem hiding this comment.
✅ 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, base7d4db75d): merging it changes exactly 2 paths —emrg/server/ios_app_prompt.md(+10 −0) andtests/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.j2and the deletion oftests/test_image_in_reply_prompt_reach.pyall 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
left a comment
There was a problem hiding this comment.
✅ 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, base7d4db75d): 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) andtests/test_prompt_templates.py(+19 −0). The head is behind master by one commit, sodiff(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
reviewSubmissionspolling and how to readSTATE_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 newIOS_METHOD_RULESrows bind each phrase to its owning heading and to a single occurrence, so position and uniqueness are both asserted rather than presence alone.
argszero
left a comment
There was a problem hiding this comment.
✅ 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
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.mdcarried no occurrence ofreviewSubmissions,reviewSubmissionItems,STATE_ERROR,promotionalText,appStoreVersionSubmissionsor the 409 answer, andgit log -Sshows 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 inIOS_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.3between §5.2 and §6, stating three platform behaviours and the action each implies:keywords/descriptionanswer409 STATE_ERROR,promotionalTextstays writable but is not indexed, so the metadata is written before submitting and read back first;PATCHed afterwards — aPOSTcarrying relationships answers422, and the parent's sub-collection answers405;reviewSubmissions(create, attach the version as an item, setsubmittedto true), while the olderappStoreVersionSubmissionspath isDELETE-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
409here means the field is locked and re-sending it never opens.tests/test_prompt_templates.py— three tuples appended toIOS_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'sINSTRUCTION_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"anduv run python -m emrg --helpboth clean.Three mutation arms, each reddening exactly one test and not the same line:
Submission itself runs through \reviewSubmissions`→ red at:2647` (the positional assertion);:2647, the same assertion, which is the point: presence alone would have passed;: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:#2639and#2640are open andcheck-merge-pairs.pyreports them blocked against each other in both orders onAgent.md, so a third PR editing that file would add a third side to the same conflict.No
tasks.ymlvalue was read into the change, quoted, or moved: §5.3 states platform behaviour only, and every instance value stays in the task'sextra_promptwhere §0.1 puts it.