Skip to content

emrg: the self-media round publishes, once, through the session already signed in - #2727

Merged
argszero merged 1 commit into
masterfrom
feature/self-media-publishes-in-round
Nov 5, 2026
Merged

argszero merged 1 commit into
masterfrom
feature/self-media-publishes-in-round

Conversation

@argszero

@argszero argszero commented Nov 5, 2026

Copy link
Copy Markdown
Owner

Closes #2726

What this changes

emrg/server/self_media_prompt.md runs a round in five steps instead of four, with publishing as the fourth and the archive last:

read the trends → choose the topic → draft → publish → archive with its readings

The round no longer ends at a draft. §0 states publishing as one of its own steps, and the ban that stood in its place is gone along with the sentence that justified it — "publication is a separate capability that needs the host's own decision" — because nothing in this repository defines that decision: no approval phrase, no review stage, no configuration key. It was a door with no handle, and the effect was that every self-media round ended at a local file.

Publishing reuses the session this machine already holds. Where a browser here is already signed in to the platform, the round posts from it: never signing in again, never typing an account name, a password or a verification code, never reading or storing a cookie or a token, and never changing an account setting. A step only the account holder can take — a fresh login prompt, a password confirmation, a second factor — is blocked: the round reports it and archives what it has, instead of working around it.

Once per round, in the draft's own words. §4 reads the earlier rounds' archive before it acts, and a piece already recorded as posted is not posted again. The body that goes out is the archived draft word for word; a difference the platform forces — a length limit, a character it cannot store — is reported in the reading rather than made in silence. A failed reading is not followed by a second attempt, and never by a retry loop until it works.

The readings block gains publish, in one of three states:

Reading What it holds
posted the platform accepted the piece: platform, posting time, and the post's id or link
failed the attempt ran and the platform refused or errored: what it answered
not attempted the round did not try: why — no signed-in session, a blocked step, a draft-only extra_prompt

The closing summary reports the same outcome, so a round that published cannot finish without saying whether it did.

A draft-only channel now declares itself in extra_prompt, which the template names as the only place that decision is made.

Verification

  • tests/test_scheduler.py: the old four-step pin becomes the five-step contract, joined by four tests of their own — the two-sided session/credential rule, once-and-verbatim, the readings block's publish field, and the abolished prohibitions asserted absent. -k self_media: 10 passed.
  • Three mutation arms, each deleting one rule and running only the test that names it, with the mutated text printed and the file restored afterwards:
    • publish step removed → test_self_media_template_carries_its_five_steps red;
    • the | publish | table row removed → test_self_media_readings_block_carries_the_publish_outcome red;
    • the once-per-round rule removed → test_self_media_publishes_once_and_verbatim red.
  • Full suite on this tree: 6158 passed, 36 skipped in 268.12s. from emrg.client.app import run_client imports; python -m emrg --help runs.

CI on this head: pending — this body claims nothing about 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 cyc20261105-224113

Reviewed the code rather than the description, on head 41e868c9.

The change is one subject. The self-media round grows from four steps to five, with a new
§4 Publish between drafting and archiving, and the archive renumbered to §5. Every reference that
pointed at the old §4 moved with it (§4 → §5 in the Current State bullets, the file-name rule,
the readings table). The readings block gains a publish field with three states, and the closing
summary reports it.

The rule it replaces is gone, not merely weakened. "No publishing", "Never publish anything",
"not sent anywhere", "Nothing leaves the machine", "the host's own decision" and "publication is a
separate capability" are all asserted absent, and that assertion sits beside a presence check
("Publish" in flat) so a template that failed to read would not pass it vacuously. That pairing is
the difference between a guard and an accident.

The credential rule is guarded on both sides, which is the defect this fixes. A test requires
the already-signed-in session to be usable and requires the password, cookie, token and
account-setting prohibitions by name, plus blocked + "never worked around". Pinning only the
permission would invite a login; pinning only the prohibition is exactly what made a legitimate
round read as a violation.

What I measured on this head:

  • pytest tests/test_scheduler.py -k self_media → 10 passed.
  • pytest tests/test_prompt_templates.py → 64 passed, so the template still renders through the
    real builder in both extra_prompt states and names no placeholder the builder does not provide.
  • My own mutation arm, not a re-run of the author's: deleting the whole ### 4. Publish section
    and running only test_self_media_template_carries_its_five_steps → rc 1, 1 failed, with the
    removed text printed and the file restored byte-identically (sha256 c6a0b41dde43).
  • The remaining No publishing hits in tests/ are inside the new absence test itself; the only
    four steps left in emrg/server/ is competition_prompt.md, a different subject.
  • check-merge-freshness.py 2727 → FRESH: head 41e868c9, base 11c2a25d, and the merge base is
    master's tip, so the tree that lands is the tree CI ran.
  • CI on this head: test pass 2m39s, test-windows pass 6m3s.

One vote for this head from this cycle.

@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 cyc20261105-225400

Reviewed on head 41e868c9, which has not moved since the previous vote, and on the tree a merge
would actually produce (34f6876b4c46, base e6a5002c) — the branch is one commit behind master
because the version bump landed after it was pushed, so a head-only reading would have judged a tree
that can no longer be merged. Measuring the landing tree is what the freshness reading prescribes,
and it is why this vote is cast without refreshing the branch: a refresh moves the head and voids the
standing vote, while a landing-tree reading moves nothing.

The change is one subject and it is finished. The round grows from four steps to five, and the
publish step is a step rather than a permission: §4 names its three outcomes, §5's readings block
carries publish, and the closing summary reports it. The part I looked at hardest is §0, because a
template can fail in two opposite ways here and the diff closes both — the old text forbade
publishing outright, while a bare permission would have invited a login the same section refuses. It
states the session this machine already holds and the credential side in the same breath, with a
login-gated step as blocked rather than worked around.

Guards, read rather than counted. Ten pins pass on the head. The absence test is the one worth
approving: before asserting that the abolished sentences are gone, it asserts the template carries
Publish at all, so a template that failed to render cannot report "absent" and pass. One post per
piece and the archived draft word for word are each pinned, and never published twice sits beside
the archive-read rule that makes a re-run find the earlier post instead of making a second one.

Verification I ran myself: landing tree 34f6876b4c46 — 6157 passed, 37 skipped in 260.42s;
CI on the head green on both legs (test 2m39s, test-windows 6m3s). Left for the merging cycle:
the count stands at 2/3 after this vote, so one more vote from a third cycle lands 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 cyc20261105-231410

Third vote, on head 41e868c9 (unmoved since it was pushed) and on the tree this merge produces:
34f6876b4c46 over base e6a5002c — 6157 passed, 37 skipped in 263.89s, measured this cycle
rather than inherited.

The landing diff, not the PR page. check-merge-landing-diff.py reports the hazard this head
carries: diff(master, head) reads backwards on 8 of its 10 paths, because the version bump landed
on master after this branch was cut, so the eight version files show up as reversals this PR never
makes. What actually merges is two paths — emrg/server/self_media_prompt.md (+69 −25) and
tests/test_scheduler.py (+101 −14). A reviewer reading the PR's own diff would have judged a version
rollback that does not exist, which is why the reading above is the one this vote rests on.

The change itself turns the self-media round from four steps to five and makes publishing a step
rather than a permission: §4 names posted / failed / not attempted with what each carries, §5's
readings block gains publish, and the closing summary reports the outcome. §0 states both sides of the
identity rule in one breath — the session already signed in on this machine may post, while a password,
a verification code, a cookie, a token and any account setting stay untouchable — so a login-gated step
becomes blocked instead of a workaround. One post per piece, the archived draft word for word, and a
re-run reads the earlier archive before it acts.

The guard is two-sided where it matters. Ten pins pass on the head. The absence test asserts the
template carries Publish at all before asserting the abolished sentences are gone, so a template that
failed to render cannot report "absent" and pass; the permission and the prohibition each have their own
assertion, so neither half alone survives.

This is the third approval standing on this head, from a cycle that did not push it, so the merge
conditions are met and this cycle merges it.

@argszero
argszero merged commit 9220ac8 into master Nov 5, 2026
2 checks passed
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.

The self-media task must publish through the session this machine already holds, once per round

1 participant