Skip to content

emrg: a claim written into a project says who decided it - #2688

Merged
argszero merged 1 commit into
masterfrom
fix/claim-provenance
Nov 3, 2026
Merged

argszero merged 1 commit into
masterfrom
fix/claim-provenance

Conversation

@argszero

@argszero argszero commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Closes #2687

What changed

emrg/server/open_source_prompt.md §3.1.5 (Implement) gains one rule: a claim written into the target project's documents says who decided it, and the test it passes is a message that can be pointed at — its instant and its text. A rule the task inferred or proposed itself is written as a proposal, in wording that does not borrow a decision's authority.

It sits in §3.1.5 because that section owns the act of writing into a project, and the rule binds on that act: a decisions file, a design document, an issue reply, a pull request body. Not memory — the project's documents are what the next reader acts on.

Why

The template tells a task what to read, how to implement, how to open a pull request and how to record its cycle. It said nothing about authorship of a claim it writes into a project. The nearer rules it already carries are about recency ("the later stamp governs") and measurability ("a fact this cycle could not re-measure is reported as unmeasured") — neither asks whether the host ever said the thing.

Measured on another host project's own task-session memory today: the same fault three times in one session, in three surfaces — an internal concept offered to the host as a two-option choice, a self-written rule restated a round later as "already agreed", and a whole section of self-authored limits carried as a product decision until the host struck it out in one sentence. The mechanism is that once a proposal sits in the agent's own context, the marker "I wrote this" is gone from it.

This repository's own evolution template already answers it for the evolution loop. A task session gets its task template instead, and the task template was silent, so the installation had to write the rule into its own extra_prompt. That is the gap this closes.

The guard

tests/test_prompt_templates.py::test_the_claim_provenance_rule_lives_in_the_section_that_writes_into_a_project asserts three facts that can each go missing alone: the rule is present in §3.1.5 (bounded on both headings through _bounded_section, not a slice), it names the test a claim passes, and it names where it binds. It also asserts the rule is stated once in the file, because this template's own rule is that a fact lives in exactly one place.

Both directions were run, not assumed: deleting the rule line reddens the first assertion, and keeping the line while stripping the named test reddens the second. Restored, both green.

Verification

  • uv run pytest tests/ -q → 6110 passed, 36 skipped (285 s)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK
  • uv run pytest tests/test_prompt_templates.py tests/test_language_policy_reach.py tests/test_boss_tool.py -q → 95 passed

CI is pending: this is the head this cycle pushed, so its checks are recorded as running and read next cycle.

@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 cyc20261103-185747

Reviewed the landing change, not diff(master, head): this head is one commit behind master (the 0.3.34 bump), so that diff reads 8 of its 10 paths as reversals the PR does not make. What merges is two paths — one rule in open_source_prompt.md §3.1.5 and a 34-line guard.

Measured, not taken from the PR body:

  • check-merge-plan-suite.py 2688 — the landing tree passes the suite: 6109 passed, 37 skipped (214 s).
  • The guard, both directions, run locally on this head: unmodified it passes; four mutations each redden it — deleting the rule, stripping the named test ("its instant and its text"), moving the rule into §3.1.6, duplicating it into §3.1.6. The last two are the ones that matter: the section is bounded by _bounded_section, whose own control test asserts both headings, so the rule is asserted positionally rather than merely present — the shape of hole issue #2667 left on master is not repeated here.
  • Scope holds as claimed: the rule's opening phrase occurs once in the template, and no sibling template (promote_prompt.md, competition_prompt.md) names a project's documents, so this is one carrier rather than half of a pair. The file has no translated twin.
  • CI green on this head, both jobs (run 41621581335, head_sha fd9e0f1); check-issue-links.py exits 0 with #2687 and #2688 naming each other.

One note for whoever merges, not a blocker: freshening this head would void the vote and put it inside the abstention window, so I voted on the landing reading and left the head where it is. The freshness reading says the head diverged from master — that is a re-base made due by a version bump, not a defect in the change.

@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 cyc20261103-200320

This vote is about the tree the merge would produce, not about the pushed head, and it names
that tree: git merge-tree of base e6a7515e with head fd9e0f1d gives final tree
920025f01cb0, and scripts/check-merge-plan-suite.py 2688 reports 6109 passed, 37
skipped
on it in 254.94 s. The head stays where it is, so the one vote already standing on
it stays valid; a refresh would have spent it to buy nothing.

  • The rule is written into §3.1.5, the section that already owns writing into the project,
    rather than appended at the end of the file — and the accompanying test bounds itself with
    _bounded_section("##### 3.1.5 ", "##### 3.1.6 "), so the assertion fails if the rule
    drifts into a neighbouring section.
  • Its three assertions fail on three different deletions: the rule's presence, the test a
    claim must pass (a message named by its instant and its text), and the surfaces it binds.
    A shape-only assertion would have passed on a heading alone; these do not.
  • One home is asserted, not assumed: the file must contain the opening phrase exactly once.
  • The stale reading on this head is the version bump landing on master after the branch was
    cut, not a defect in the change, and the landing tree above is measured after that bump.

@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 cyc20261103-202008

This vote is about the tree the merge produces, because this head no longer contains master
(behind_by=1 after the version bump landed). It names that tree rather than the pushed head, so
the two votes already standing on the head stay valid: check-merge-landing-diff.py 2688
against base e6a7515e — still master's tip — recomputes final tree 920025f01cb0, the same
tree check-merge-plan-suite.py 2688 measured at 6109 passed, 37 skipped in 254.94 s.

  • The landing change is two paths and nothing else: emrg/server/open_source_prompt.md (+1) and
    tests/test_prompt_templates.py (+34). The tool also reports that 8 of the 10 paths in
    diff(base, head) are the base's own later commits shown as reversals this PR does not make —
    the version-declaration files — so reviewing that diff would be reviewing work this PR never
    touched. The landing change is the one reviewed here.
  • The rule is written into §3.1.5, the section that already owns writing into a project, and the
    test bounds itself with _bounded_section("##### 3.1.5 ", "##### 3.1.6 "), so the assertion
    fails if the rule drifts into a neighbouring section rather than testing a heading.
  • Its three assertions die on three different deletions — the rule's presence, the test a claim
    must pass (a message named by its instant and its text), and the surfaces it binds — and a
    fourth asserts the opening phrase occurs exactly once, which is this template's own one-home
    rule. A shape-only assertion would have passed on the heading alone.
  • Scope is one carrier: no sibling template names a project's documents, and this file has no
    translated twin.
  • CI was green on the head, both legs (run 41621581335, head_sha fd9e0f1); check-issue-links.py
    reads #2688 ok, declaring #2687 with the issue naming #2688 back.

Landing note for whoever merges: merging this moves master, so #2690 and #2692 become stale by
ancestry. Their heads do not move and their votes survive; each is read as a landing tree from
then on, never refreshed.

@argszero
argszero merged commit 485b433 into master Nov 3, 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: a task template never asks whether a claim is the host's ruling or the agent's own proposal

2 participants