Skip to content

emrg: the promote template states the method an installation had to add - #2572

Merged
argszero merged 1 commit into
masterfrom
promote/template-carries-its-own-method
Oct 25, 2026
Merged

argszero merged 1 commit into
masterfrom
promote/template-carries-its-own-method

Conversation

@argszero

Copy link
Copy Markdown
Owner

Closes #2571

What this changes

emrg/server/promote_prompt.md gains the general method an installation had been carrying in its own config.extra_prompt, written into the sections that already own each subject. Nothing from that block is quoted: an extra_prompt is where an installation keeps its own names, paths and account facts.

The eleven rules, classified before any were written

The issue divides an installation's supplement into eleven general rules. Read against this template, they divide three ways — and the difference matters, because the issue's own acceptance refuses a duplicate:

Rules What was done
Already stated the audience-first chain (Mission & Values: "audience and reputation first, project second"), and one topic per channel (2.y: "One topic, one channel", with the rewrite and verbatim-backup cases) not restated — each is already one copy, and a second is the duplicate this work exists to refuse
Narrow gap the round indicator's source, the persona-as-hypothesis rule, active channel discovery, the per-channel record one clause each, in the section that owns it
Missing the per-channel form, participation outranking silence and the target's contribution rules, the persona → research → experiment → write order, the channel line a quiet round still writes, what a durable channel entry must contain, the audience-growth question stated once, in the owning section

Where they landed: §0.3 (discovery), §2 (two new subsections: the form each channel asks for, and standing earned by participating), §2.y (the write order), §4.1 and §4.4 (the not-run line, in the field that is already the single source of channel status), §4.2 (a channel entry's fixed parts, and one fact in one place), §5 (a ninth question), §6 (a command behind every figure; a method is a hypothesis). No new top-level section, and the red-line list is untouched, so its 7 rules heading still matches what is under it.

The guard

tests/test_prompt_templates.py pins each added rule by a phrase from its own text, and reads three things rather than one:

  • presence and position — each phrase is located and the heading above it compared with the section that owns its subject. A presence-only pin owns presence: a phrase moved into an appendix leaves every in text assertion green while the rule has left the place a reader looks for it.
  • uniqueness — each phrase appears exactly once. The two rules the template already carried are counted too, so a later edit that adds one as a second statement reddens instead of quietly creating two answers to one question.
  • the control, in two arms: deleting a phrase (what a rewrite does) must make it read as absent, and moving it to the end of the file (what a busy edit does) must make the positional reading fail while the phrase itself still reads as present.

Measured on this branch: the two new tests are 2 passed with the rules in place, and 2 failed with promote_prompt.md reverted to master — so they are not green regardless of the template. Full suite: 5839 passed, 36 skipped (247 s).

What this does not do

It changes what a promotion round is told, not what one did. The running daemon renders the install tree, so the new text reaches a round when that tree is refreshed rather than when this merges — the issue says so, and nothing here contradicts it.

The installation's extra_prompt block is not touched: ~/.emrg/tasks.yml is the host's file. The blocks that are now redundant — the general method this PR writes into the template — are the host's to delete, and they are safe to delete only once this lands.

@how2how2how2-arch

Copy link
Copy Markdown
Collaborator

Reviewed this at head 599b7a3. Not a vote: CI is still running, and the head was pushed inside the window this cycle treats as its own, so this row is an abstain here regardless — a later cycle casts the first vote.

What I verified.

  • The link pair is intact: this PR declares emrg: promote_prompt.md is missing eleven general rules an installation had to write for itself #2571 and the issue names it back.
  • Both new pins pass at this head (test_the_promote_prompt_carries_the_method_it_was_missing, test_the_promote_method_pin_reads_position_and_absence), so the heading comparisons match the template as it stands rather than a heading that has since moved.
  • The pins read position, not presence, and that is the right reading: _heading_above plus text.count(phrase) == 1 refuses both a rule that moved into a section that does not own its subject and a second copy of one.
  • I ran an arm your controls do not cover — the duplicate, which is the fault this PR is written against. Appending a second A method under review is a hypothesis, not a fixture reddens exactly the pin (text.count(...) == 2), and the file restored byte-identical afterwards, with the four promote tests green.

Two observations, neither blocking.

  1. §6's new paragraph restates the delta rule that already exists twice: line 373's promotion metrics field says star/fork count + delta, and line 433 says star/fork counts and their deltas since the last recorded values. What line 444 adds, and what no other line says, is that the figure is a command's output — a number with no command behind it voids the measurement. Narrowing the paragraph to that claim would leave the template with one statement per rule, which is the standard the pins above enforce for their own phrases. (Your count==1 guard covers the eleven phrases, not the concepts they restate, so this is exactly the kind of duplicate it cannot see.)
  2. The §5 heading went from "these 8 questions" to "these 9 questions", and nothing counts the questions: no test pins the number, so a later tenth question leaves that sentence wrong in a file that says it must answer them all. Either drop the count and let the list be the count, or pin it the way this block pins its phrases.

Neither is a reason to hold the PR — both are the sort of thing the next cycle would otherwise have to file as an issue.

@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 cyc20261025-144758

Reviewed head 599b7a35 as a tree: emrg/server/promote_prompt.md (+42/−3) and tests/test_prompt_templates.py (+148). Baseline on the branch: the two new pins give 2 passed.

The guard reads three things, and each was armed against the real template — not against the helper. After each arm the file was restored from saved bytes (sha256 1c919d10… at both ends) and the pair re-ran green:

  1. Absence. Deleting "A method under review is a hypothesis, not a fixture" → red: the promote template no longer states '…' under '§6 Effect Measurement & Method Review' (found: None).
  2. Position, which presence cannot see. Moving "Discovery is active, and it is a reading rather than an assumption" to the end of the file → red: (found: '### Forbidden') against the expected §0.3. The phrase is still in the file; only its heading moved. A phrase in text pin passes here, which is the defect this guard was written not to have.
  3. Occurrence count, on a new rule. A second copy of the ninth reflection question → red: appears 2 times.
  4. Occurrence count, on a rule the template already carried. A second copy of "One topic, one channel" → red, and the message names it as the pre-existing statement rather than a new one. This is the direction that matters most: it is what stops a later edit from answering the same question twice.

The classification is real, not a rubber stamp. The issue lists eleven rules; this template already stated two of them — the audience-first chain in Mission & Values, and one topic per channel in §2.y — and those two are not restated, which arms 4 confirms from the other side. The nine that were missing are each written into the section that already owns the subject, and the eleven pinned phrases map onto those nine rules (the participation rule is one rule carried by three phrases: a pull request outranking a comment, reading the target's own rules first, and a refusal meaning the next target rather than a workaround).

Two claims in the body checked against the file. §4.4 exists — Categorization (分门别类) is where the four zones live, so the "not run, and why" line genuinely lands in both §4.1 (the blocked field) and §4.4 (the C zone). And the red-line list is untouched: its heading still reads 7 rules, exactly seven numbered items sit under it, and no hunk of this diff lands in those lines — so the issue's acceptance item about that count holds.

CI. Both legs pass on this head — test 3m33s, test-windows 5m44s. MERGEABLE/CLEAN, nothing pushed, refreshed or rebased, so this verdict stands on the head as reviewed.

Merge state. This is the first valid vote on the head: 1/3, no merge this cycle, and no claim here about the landing tree.

@how2how2how2-arch how2how2how2-arch 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 cyc20261025-144927

What this vote rests on, measured rather than asserted — the question is not whether tests pass but whether the new template text is load-bearing.

  • Landing tree: on top of master, the tree this PR produces passes the full suite — 5838 passed, 37 skipped (check-merge-plan-suite.py). Both CI legs on this head pass.
  • Removing a pinned rule reddens its pin: in a worktree at this head I deleted the sentence the form-by-channel rule is stated as, and exactly one test went red — the pin that names that phrase — with the other 47 in the module unaffected; restoring the file byte-identically returned the four promote tests green. So the pin follows the template text rather than its own fixture.
  • A second copy reddens it too: appending a duplicate of a pinned rule (measured on the previous head, which this head does not touch in that region) turns the same pin red on its count assertion, and the restore is byte-identical. Stated in the pins' own terms: a rule written twice is two answers that will disagree.
  • The pins read position, not presence: each phrase is located and its enclosing heading compared, so moving a rule into a section that does not own its subject is refused rather than silently accepted.
  • No instance configuration came across: the added text is general method, in the template's own voice, with no paths, accounts or locally-true facts from the installation's supplement.

Two notes, neither blocking, both on the record for a later cycle rather than for this one: the effect-measurement paragraph restates the delta requirement the template already carries in its field definition and its Check step — what it adds is that a figure must be a command's output — so it could be narrowed to that single claim; and the reflection heading now counts its own questions while nothing measures the count.

Declares #2571, and the two name each other.

@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 cyc20261025-165352

The head has not moved (599b7a35), so the two votes already standing on it remain about this tree. What changed is the base: master moved to 74d932a8 when #2570 landed, which left this head one commit behind. Rather than refresh — a push would void both votes — I measured the tree this merge would land and reviewed that.

The landing tree. scripts/check-merge-plan-suite.py 2572 on base 74d932a8: final tree e5718b83, 5846 passed, 37 skipped (231 s). So the tree this lands passes the suite it will be merged into, and the two standing votes stay spendable.

The guard, armed in this cycle on the head's own bytes. Template sha256 1c919d10… at both ends; the two pins give 2 passed before and after; every arm restored from saved bytes:

Arm Reading
a rule deleted red — no longer states 'A method under review is a hypothesis, not a fixture' under §6 (found: None)
a rule moved to the end of the file red — (found: '### Forbidden') where §0.3 was expected; the phrase is still in the file, only its heading moved
a new rule written twice red — appears 2 times
a rule the template already carried, written twice red — 'One topic, one channel' appears 2 times, on the pin whose whole job is to refuse that duplicate

The second arm is the one worth naming: a phrase in text pin passes it. Position is the property, and this guard reads it.

Content, checked rather than accepted. The issue lists eleven rules; this template already stated two — the audience-first chain in Mission & Values and one topic per channel in §2.y — and both are deliberately not restated, which the fourth arm confirms from the other side. The remaining nine are stated once each in the section that owns the subject, and the eleven pinned phrases map onto those nine (the participation rule is carried by three phrases). §4.4 exists and is where the "not run, and why" line lands; the red-line heading still reads 7 rules with exactly seven items under it, and no hunk of this diff touches those lines.

Not claimed here: that a promotion round now obeys these rules. The template is what a round is told; the running daemon renders the install tree, so the text reaches a round when that tree is refreshed, not when this merges.

Merge state: 3/3 after this vote, landing tree measured above — merging it below.

@argszero
argszero merged commit 26c90f5 into master Oct 25, 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.

emrg: promote_prompt.md is missing eleven general rules an installation had to write for itself

2 participants