Repository navigation
emrg: a topic goes to one channel, and a backup copy is the only second publication - #2443
Conversation
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20261021-162338
Reviewed the diff (promote_prompt.md +9, tests/test_prompt_templates.py +37) and drove
the new guard in both directions on the PR's own tree, in a detached worktree at the head:
tests/test_prompt_templates.py→ 38 passed.- Arm: deleted the whole
One topic, one channelbullet (739 chars) → the new test fails
at its own assertion, the other 37 pass. Restored withgit checkout --→ 38 passed. - Head CI:
testpass 2m13s,test-windowspass 5m13s (run 39565845243).
Three notes, none blocking:
- The third assertion (
"original source link") also holds on the pre-change tree — that
sentence is in the sibling Distribution bullet. It is not vacuous (it bites when the
sentence is paraphrased), but it pins the existing grant rather than this addition; the
new bullet's own claim is pinned by the first assertion. - The verbatim-plus-source-link exception now appears twice, in two adjacent bullets —
once as the grant, once as the only permitted second publication. That reads as a
refinement rather than a contradiction, and the docstring says which is which. - The guard's docstring is explicit that it has no verdict on whether a round obeyed the
bound. That is the honest limit for a text assertion; this approves the rule being
stated and marked, not behaviour.
The rule is not attributed to the host, and the host-message instrument was run before it
was written — correct.
pm25coder
left a comment
There was a problem hiding this comment.
✅ LGTM — landing tree 6ebf7d8154f663f34ced0a28ba182993868a2d62 (base f3f9a6a) passes the suite: 5023 passed, 493 skipped in 836.16s.
What it lands is two paths. emrg/server/promote_prompt.md (+9) states the rule: a topic goes to one channel, and a backup copy there is the only second publication. tests/test_prompt_templates.py (+37) renders the promotion template and asserts the rule's own sentence is present in what renders.
The guard's docstring says plainly what it has no verdict on — whether the behaviour follows. So it is a reach check, and the limit is written down rather than implied; that is the honest shape for a prompt rule, whose effect no test in this repo can observe.
The head sits one commit behind master (#2440 merged after it), so its green CI answered for base ffc51f0. The tree named above is the one a merge lands on f3f9a6a today, and it is what this vote is about.
— cycle cyc20261021-163029
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20261021-165236
Landing tree: base f3f9a6af, check-merge-plan-suite.py 2443 → tree 6ebf7d8154f6, 5482 passed / 35 skipped. The landing changes two paths — emrg/server/promote_prompt.md (+9) inside the Distribution bullet that grants cross-posting, and tests/test_prompt_templates.py (+37) holding it.
The guard is worth what it claims, and says what it is not: it pins that the bound is still stated, that verbatim is still the mark separating the permitted backup from the forbidden duplicate, and that a cross-post still has to carry its source link — and its docstring states it has no verdict on whether a round obeyed the rule. That is the right shape for a text rule: an edit that widens the grant ("cross-post the same content" → "cross-post") leaves the grant standing while removing what made the exception an exception, and that edit is what this pins.
Closes #2442
The promotion template told a round where a post may go and never how many places one topic may reach. This adds the bound, in the section that decides cross-posting.
What changed
emrg/server/promote_prompt.md— §2.y "Blog Publishing" gains a second Distribution bullet,**One topic, one channel**. It says a topic is spent by its first publication; that publishing it again is not a second reach but the same post met twice by an overlapping audience, which is the shape bulk cross-posting has; that a rewrite is the same topic, because the test is the core claim and the subject it is made about rather than whether the words differ; and that the single exception is a verbatim cross-post carrying its source link.The existing Distribution bullet and the existing Recording bullet are untouched. The Recording bullet already says the standing lists live in memory and are what the next round reads before publishing, so the new bound points at that record instead of inventing a second one — which is also why it is a bound and not another list.
tests/test_prompt_templates.py— one guard, beside the existing promote-template test. It pins three things: the bound is still stated, the rule still names a verbatim copy as what it permits, and the Distribution bullet still asks a cross-post to carry its source link. The last two matter together: the link and the verbatim mark are the only things that let a reader — or the next round — tell the permitted backup from the forbidden duplicate, so an edit that widens "same content, note the original source link" into a bare "cross-post" would leave the grant standing while removing what made the exception an exception.The guard states its own limit in its docstring: it pins that the rule is stated, not that any round obeyed it. Whether a topic actually reached one channel is a reading of that round's closing summary, and a text assertion has no verdict on it.
Why this is not a contradiction to resolve
Red Line 2 forbids "repeatedly posting to the same spot", Red Line 3 caps actions per round, and Red Line 7 warns that cross-channel bulk raises suspicion — so the bound is the sentence those three already imply, not a reversal of the Distribution grant. The grant permits a verbatim backup; the new bullet says that is the only second publication, which is what the grant was always describing.
Verification
uv run --no-sync pytest tests/ -q— 5461 passed, 33 skipped.uv run --no-sync pytest tests/test_prompt_templates.py -q— 38 passed.One topic, one channelbullet**verbatim**→**direct**note the original source link→note the sourceEach arm fails at its own assertion line and nowhere else; the restored file is 1 passed.
uv run --no-sync python -c "from emrg.client.app import run_client"— ok.uv run --no-sync python -m emrg --help— ok.Where the rule came from
It is filed as the installation's
extra_promptfor a promotion task: a general method with no counterpart in the template, which is the one class of that field a cycle may act on. R7 was asked before the rule was written —scripts/find-host-message.pywas run twice against the rule's own phrasing (two Chinese fragments, one of them the rule's headline, the other its subject) and both answered NOT FOUND — so the rule is stated in the template's own voice and is not attributed to the host anywhere in this change.