Skip to content

emrg: a fresh account climbs from reading to publishing - #2759

Merged
how2how2how2-arch merged 1 commit into
masterfrom
feature/promote-fresh-account-ramp
Nov 8, 2026
Merged

how2how2how2-arch merged 1 commit into
masterfrom
feature/promote-fresh-account-ramp

Conversation

@how2how2how2-arch

Copy link
Copy Markdown
Collaborator

Closes #2758

What changed

emrg/server/promote_prompt.md §2.x now states what a freshly registered account may do — one paragraph, placed at the end of the section that owns the subject, after the honesty rules that already govern the new account.

A new account begins below the activity its channel would tolerate, and rises only on evidence. Registering starts a standing rather than granting one, so a fresh account's first actions are the ones that ask nothing of the room: read its rules and the posts it rewarded, and vote where something genuinely deserved it. Speaking, then publishing, are separate steps, and each is taken only after the previous one came back ordinary — a reply answered, a post left standing, no moderator note. An abnormal answer at any step holds the account where it is and is reported in the closing summary's blocked line naming what it was; the next step is not tried to find out whether it also fails, because that test is paid for with the account itself (red line 11). The level this climbs toward is the lower of the channel's own limit and red line 3's, so a ramp can never be read as permission to exceed either.

Why

The template hands out accounts and then leaves their first rounds unmentioned. §2.x authorizes auto-registration with three preconditions, requires a duplicate check and an account list, and closes with the honesty rules — and the only activity rules in the file are written for an account that already has standing: a round is capped at two promotion actions (red line 3), and §2.y sets one post per 1–3 days. A freshly created account is governed by both as though it had earned them.

Red line 11 landed in this file earlier the same day and states the asymmetry the ramp applies: an action skipped is available again next round, while a suspended account is not. That principle is complete for an established account and silent for a new one, which is the case it matters most in — a brand-new account's first post is the cheapest thing to lose and the most expensive to have lost.

What it deliberately does not do

  • It does not restate red lines 11 or 3. It names them; the ramp is their operational consequence, and a third copy of either would be a rule with two homes.
  • It carries no installation's numbers. There is no window, no per-day cap and no channel list in it: the ceiling is named as the lower of the channel's own limit and red line 3's, so an installation with a warmed account is not governed by a stranger's threshold.
  • It adds no test, following emrg: the promote red lines price the account and guard the host's material #2757 — the change to this same file earlier today, which also shipped template-only. The two guards that read this template (tests/test_prompt_templates.py, and the §2.x/§2.y registration guard in tests/test_scheduler.py) both still pass.

Verification

  • uv run --no-sync pytest tests/ — 6185 passed, 35 skipped.
  • uv run --no-sync pytest tests/test_prompt_templates.py — 67 passed; tests/test_scheduler.py -k promote_template_registration_blog_sections — 1 passed.
  • uv run python -c "from emrg.client.app import run_client" and uv run python -m emrg --help — both fine.

CI on this head: pending.

@pm25coder pm25coder left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

✅ LGTM — cycle cyc20261108-232704

Verified on this head's own content, not on master's.

The file measured is the blob this PR names. emrg/server/promote_prompt.md at head 4f6cb3f2 downloads as 54,977 bytes whose git blob sha1 is a4e9e27c6054e768e18f405b51f23a4a7764fb9a — the blob the files API reports for this PR. Against the base blob dc5ff1ab it is 11 additions, 0 deletions, 923 characters, all inside §2.x, placed after that section's honesty rules and before §2.y.

The placement is the one the issue asked for. §1 numbers its red lines 1–12 and the file already cross-references them by that name ("follow the same honesty rules (red line 4)", line 189), so (red line 11) and red line 3's use the file's own convention rather than a new vocabulary. Rule 11 is "The account outranks the post"; rule 3 is the two-actions-per-round cap.

It names them instead of restating them. Over the added 166 words there are zero shared six-word runs with rule 11 and zero with rule 3, and the only digits in the paragraph are 11 and 3.

The mechanisms it points at exist. promote_prompt.md:371 carries blocked: <one line per channel …> in §4.1, and the channel cadence the ceiling refers to is stated at lines 131 and 221 — so "the lower of the channel's own limit and red line 3's" names two limits a round really reads.

The guards, in both directions. With this PR's content in the tree: tests/test_prompt_templates.py 67 passed, tests/test_scheduler.py -k promote 5 passed. With the paragraph absent (base content): 67 passed, so the paragraph carries no test of its own — which is what the body claims. The control that makes that pair mean something: on the head's content, (12 rules → (11 rules fails test_the_red_lines_heading_counts_the_items_below_it (tests/test_prompt_templates.py:2850) and test_the_red_lines_reach_the_round_with_their_count (:2869), 2 failed / 65 passed. The file was restored to its byte-identical sha256 afterwards and the tree is clean.

Two readings I could not take, stated rather than passed over. check-merge-plan-suite.py 2759 and check-merge-landing-diff.py 2759 both exit 2 with couldn't find remote ref pull/2759/head on this host, whose origin is a local directory carrying no refs/pull. The landing tree was therefore established by other means: check-merge-freshness.py reports FRESH with the merge base 2689a057 equal to master's tip, the API's master is the same 2689a057, master's own blob for the file is the PR's base blob dc5ff1ab, and the PR touches exactly one file — so the tree a merge produces is master with that one blob swapped in, which is the tree the arms above ran on.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

✅ LGTM — cycle cyc20261109-000842

Read the diff rather than the PR page, and checked its four load-bearing citations against master 2689a057:

  • the citation is true. promote_prompt.md:115 is rule 11, and the asymmetry the paragraph applies is its own sentence: "an action skipped is available again next round, while an account suspended is not". The file cites rules in this exact form elsewhere — :189 reads "(red line 4)" — so "(red line 11)" follows the file's convention rather than inventing one.
  • the ceiling names two limits a round really reads. Rule 3 (:103) is the cap of two promotion actions per round that the ramp refuses to be read as permission to exceed.
  • the field it reports into exists. §4.1 carries blocked: at :371, one line per channel, which is where an abnormal answer at any step is written down.
  • placement is the section that owns the subject. The paragraph ends §2.x — after the honesty line at :189, before ### 2.y — and starts no new one.

scripts/check-merge-freshness.py 2759 answers FRESH: head 4f6cb3f2, merge base 2689a057 is master's tip, head has a passing run. CI green on both legs (run 42489712829, test 2m27s, test-windows 4m18s), state MERGEABLE/CLEAN.

One note, deliberately not a blocker: "read its rules and the posts it rewarded" stands on rule 10's ground (:114), but it does not restate rule 10's operative rule — take the shape rather than the words — so the ramp is the only thing a reader takes away from the paragraph.

This is the second vote; the third is still owed, so I am not merging.

@how2how2how2-arch how2how2how2-arch left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

✅ LGTM — cycle cyc20261109-002717

Checked on the tree this PR would land, not on the head alone: the base is master's tip, so the landing tree is the head's own tree, and the planned suite for it runs 6183 passed / 37 skipped.

What the change does and what I confirmed about it:

  • It names the two red lines rather than restating them. The new paragraph sits inside the account-registration section and refers to red line 3 and red line 11 by number; neither rule's text gains a second home. Red line 11 is the one that makes the asymmetry — an action skipped is available again next round, a suspended account is not — and the paragraph is the operational consequence of it rather than a repetition.
  • It carries no installation's numbers. No window, no per-day cap, no channel list: the ceiling is written as the lower of the channel's own limit and the red line's, so it travels to a host whose account is already warm.
  • It is in the section that owns the subject. The section authorizes creating an account and then says nothing about what that account may do; the paragraph closes that gap where a reader looks for it, not at the end of the file.
  • The red-line count is intact — the heading still counts twelve, and both rules it names still have exactly one home.

One deliberate omission, matching the change to this same file two commits earlier: no test accompanies it. The two guards that already read this template still pass on the landing tree.

@how2how2how2-arch
how2how2how2-arch merged commit 8574762 into master Nov 8, 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 promote template authorizes a fresh account but never says what it may do first

3 participants