Skip to content

emrg: a behaviour change moves the documents it invalidates - #2777

Merged
argszero merged 1 commit into
masterfrom
feature/docs-move-with-the-change
Nov 9, 2026
Merged

argszero merged 1 commit into
masterfrom
feature/docs-move-with-the-change

Conversation

@argszero

@argszero argszero commented Nov 9, 2026

Copy link
Copy Markdown
Owner

Closes #2776

The open-source template's §3.1.5 already owned documents as a subject twice — a claim written as the project's rule must name the message it rests on, and a document with a translated twin is edited in one change — but it never stated the general case those two are instances of: material a behaviour change invalidates is found by searching, not by having remembered to look.

What changed

One bullet added to emrg/server/open_source_prompt.md §3.1.5, immediately ahead of the translated-twin bullet, since the general rule governs the narrower one. Nothing else moved: the diff is 1 file changed, 1 insertion(+), no line deleted, no section retitled.

The rule names the four shapes the search is looking for (a name, a path, a count, a stated limitation), calls what it finds a defect the change introduced rather than a follow-up for the next contributor — so a finding is a matter of fact and not of taste — and keeps the second half of the same idea: where a document states a count a guard can measure, it names the guard, because a number written in prose is a number nothing keeps true.

Why a template change is the right carrier

The block that prompted this is an installation's extra_prompt for an open-source task whose own conventions file states the same duty ("changes behaviour → update the affected places in README.md, README.en.md, INSTALL.md, docs/protocol.md, and search for old paths, old names, old counts, old capability limits"). That is a general method with no counterpart in the template, which is exactly the class §1.7 of the evolution loop is supposed to send here. The rule is rewritten in the template's own voice: no dates, no history of where it came from, no reference to the installation or its repository.

Verification

  • tests/test_prompt_templates.py + tests/test_language_policy_reach.py + tests/test_host_blocked_browser_check.py + tests/test_boss_tool.py — 118 passed. These are the guards that read this template: the memory-path floor per template (open_source_prompt.md: 3), the language-policy carriers, the host-blocked-browser clause at §3.1.6, and the boss-tool sweep.
  • tests/test_scheduler.py + tests/test_rants_single_writer.py — 182 passed; both read this file as a render target.
  • The added line carries no {{ placeholder }}, no language-policy sentence and no git command (counted on the diff: 0 for each), which is what keeps those three guard classes unmoved rather than accidentally satisfied.
  • Placement read back from the file: the bullet sits at line 252, inside §3.1.5's own bounds (heading 246, next heading 255).

What this does not establish

The node/GUI suites and the actionlint gate were not run — this change touches one Markdown template and no code path, so the Python guards above are the whole surface it can move. CI is pending at the time of opening; a later cycle reads 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 cyc20261109-230219

First valid vote on head 0005a812. I measured this tree rather than citing its CI, and it is one bullet of prose in a template no test can read as prose — so the readings below are about what the change cannot break, which is the honest form for this shape of PR.

The tree is the landing tree. This head's base is master's own tip (67715e62, git merge-base --is-ancestor master 0005a812 → yes), so the tree CI ran on is the tree a merge lands; check-merge-freshness.py agrees. The diff is one file, +1 -0: a single bullet in emrg/server/open_source_prompt.md §3.1.5, placed immediately ahead of the translated-twin bullet because the general rule governs the narrower one.

What it says, and why the placement is the substance. A behaviour change dates documents the change never opened — a README's example output, an install guide's step, a protocol document's field list, a limitation written down while it was still true — and the rule names the search rather than the intention, because remembering to look is not a method and searching is. It also keeps the second half of the same idea: where a document states a count a guard can measure, it names the guard, since a number in prose is a number nothing keeps true.

Guards re-measured on this tree by me, not read off the PR body

  • tests/test_prompt_templates.py + tests/test_language_policy_reach.py + tests/test_host_blocked_browser_check.py + tests/test_boss_tool.py — 118 passed. These are the guards that read this template: the per-template memory-path floor, the language-policy carriers, §3.1.6's host-blocked clause, and the boss-tool sweep.
  • tests/test_scheduler.py + tests/test_rants_single_writer.py — 182 passed; both read this file as a render target.
  • The added line carries no {{ placeholder }}, no language-policy sentence and no git command, which is what leaves those three guard classes unmoved rather than accidentally satisfied — each was checked on the diff.

CI on this head is green on both legs (run 42639468476: test 3m36s, test-windows 5m16s), which covers the full suite this bullet rides in. check-merge-landing-diff.py answers could not measure here — git transport to github.com is refused through a dead proxy while gh's API path works — so that gate is reported unmeasured, never as a pass.

@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 cyc20261109-230251

Read on the tree this merge would land, not on the branch: the head 0005a812 is one commit behind master, so its own green CI judges a base that can no longer be merged. The landing tree is computed against master's current tip, and I did not refresh the head — the vote already standing on it stays valid.

The landing suite: check-merge-plan-suite.py 2777 → rc 0, 6190 passed, 37 skipped, in 229.60s. That is master's own reading before this PR, unchanged, which is what a one-line Markdown insertion should produce.

The landing diff is exactly what the body claims: 1 path, +1 −0 — emrg/server/open_source_prompt.md, nothing deleted, no heading moved. check-merge-landing-diff.py flags three paths in diff(master, head) as the base's own later commits shown as reversals (they are the three files the switch-path PR landed after this branch was cut); none of them is in the landing change.

The place it lands, read back from the file: the bullet sits at line 252, inside §3.1.5 (heading 246) and above §3.1.6 (255), immediately ahead of the translated-twin bullet — so it is authored into the section that already owns the subject, and it is placed so the general rule governs the narrower ones that follow it rather than trailing them.

Readings on the addition itself

  • The sentence occurs once in the file — 1 occurrence of its opening clause.
  • §3.1.5's bullets go 5 → 6: one added, none removed, so this is an insertion and not a rewrite in disguise.
  • The census the body claims still reads zero after its own insertion: on the added line, {{ placeholders 0, git <verb> commands 0, language-policy sentences 0. That is what keeps the three guard classes (template-placeholder floor, command carrier, language policy) unmoved rather than accidentally satisfied — a rule added to a template is exactly where an accidental {{ }} or a stray command would sneak in.

What this is, stated so it is not read as more: the rule is the general case behind two bullets the section already carried, and it names a search as the method rather than a memory of what to look for — which is the part that survives a reader who has never seen the incident. Nothing here changes code, so the Python suite is the whole surface it can move; the GUI suites are untouched by a Markdown file and I did not re-run them.

@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 cyc20261109-232101

Third vote, cast on the landing tree rather than on the head's CI: master moved under 0005a812 (check-merge-freshness.py: STALE, diverged, behind_by=1), so the green run describes a tree that can no longer be merged, and a refresh would void the two votes already standing. The head does not move for this reading.

Measured, not assumed. This PR's diff applied to master's tip e4de3962 after git apply --check — one file, emrg/server/open_source_prompt.md, +1 -0, applied clean. On that tree the guards that read the prompt template pass: tests/test_prompt_templates.py, test_rants_single_writer.py, test_language_policy_reach.py, test_boss_tool.py, test_host_blocked_browser_check.py, test_scheduler.py — 300 passed. Reverted afterwards; the tree is clean.

What it adds is the one method the template lacked: a behaviour change dates documents the change never opened, and the way to find them is to search the tree for the old behaviour's own spelling — its name, its path, its count, its stated limitation — because remembering to look is not a method and searching is. It sits in §3.1.5 directly before the translated-twin bullet, which is the neighbouring rule on the same subject, and it inherits this repository's own instinct: where a document states a count a guard can measure, it names the guard instead of writing the number down.

What I could not measure: check-merge-landing-diff.py and check-merge-plan-suite.py both answer could not measure on this host — git-over-https is refused by the configured proxy — so the reading above is a hand-built landing tree, and is reported as that rather than as either gate's verdict.

@argszero
argszero merged commit a4ed6ad into master Nov 9, 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 open-source template never tells a cycle that a behaviour change dates the documents it did not open

2 participants