Skip to content

The open-source template tells a cycle to wait for a maintainer's word, which no scheduled run can do #2728

Closed

Description

@argszero

What is observed

emrg/server/open_source_prompt.md §3.1.1 tells a cycle to wait for an answer it cannot receive:

A large change is discussed before it is built: when the contribution is bigger than a fix — a new
feature, an API change, a refactor — say what you intend on the issue (or open one) and wait for a
maintainer's word
. A PR nobody asked for, on a direction nobody agreed to, is the one that gets closed.

A cycle is one scheduled run of the task. Nothing in the daemon suspends it, and nothing re-enters it
when a reply lands: the next cycle is a new run that starts by reading the world again. So the instruction
has no executable meaning. Obeyed literally it produces one of two failures — a cycle that idles on an
answer that will not arrive inside its own run, or a cycle that ends with the question asked and nothing
written down, so the next cycle cannot tell that a direction was already raised and asks again.

Where the same subject is already stated correctly

emrg/server/feishu_prompt.md asks a human and says exactly what happens next:

Send it this round, carry on without waiting for the answer, and read the answer next round with §1's
recipe.
… Asking is not blocking; sending is.

That is the shape a scheduled run can execute, and it is pinned by tests/test_scheduler.py. So the two
built-in templates disagree about one subject, and the open-source template is the side that is wrong.
A task that follows it cannot distinguish "asked and awaiting" from "nothing done", which is the reading
§4 exists to produce.

What is expected

Asking a maintainer stays a step of the cycle, and the cycle ends there rather than waiting:

  • The intention goes on the issue (or into a new one) — that part is unchanged, and so is the rule it
    protects: a PR nobody asked for, on a direction nobody agreed to, is the one that gets closed.
  • §4 item 4 — what is blocked, and on whom — is where the question is recorded, so the next cycle
    inherits it as state instead of re-deriving it.
  • The answer is read from the issue's own thread by a later cycle, which is where §1.1 already sends it.
  • The wording states that asking is not waiting, so a cycle does not treat "no answer yet" as a reason to
    re-ask every run or to attempt the change uninvited.

What the fix must satisfy

  • The phrase "wait for a maintainer's word" is gone, and no synonym of it survives in that section.
  • The replacement says what a cycle does instead: it ends the cycle with the question on the issue and the
    block recorded in §4.
  • The rule's substance is kept — a large change is raised before it is built, and an uninvited PR is the one
    that gets closed.
  • A guard pins both directions: the replacement is present and the removed phrase is absent, asserted
    over a subject the test has first shown to be there, so a template that failed to render cannot pass.
  • Deleting the replacement must redden that guard.
  • emrg/server/feishu_prompt.md is unchanged — it already carries the executable shape, and this issue
    makes the sibling agree with it rather than the other way round.

Where the change lands

emrg/server/open_source_prompt.md §3.1.1, plus the guard in tests/test_scheduler.py beside the other
open_source_prompt.md pins.

Activity

  1. argszero commented on Nov 5, 2026

    @argszero
    OwnerAuthor

    Handled by #2729

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions