Skip to content

promote: run due promotions from the scheduled sweep, and say on the PR when an approval cannot promote #388

Closed

Description

@cgwalters-bot

Repo: cgwalters-bot/homegit

cgwalters approved cgwalters-forge/bootupd#2 on 2026-09-26 and again on 2026-10-05 and saw nothing happen. bot-promote-due knew why (coreos/bootupd is human-text, so it needs his text and /promote --human-text), but that only appears in the sweep's watch.txt, which he does not read. Eleven forge PRs are in the same state today.

Two problems:

  1. Promotion is not deterministic end to end. bot-promote-due computes what is due, but running bot-pr promote is left to a Sonnet dispatcher job started by the supervisor on an approval action. Make the scheduled sweep (or a sibling timer unit) run the due promotions itself, with no model in the loop, and record each outcome on the board item. Keep the existing refusals (stale policy record, head moved since approval, human-text).
  2. A refused promotion is silent. When an approval or /promote cannot promote, comment once on the forge PR with the reason and the exact next step (for human-text: edit title, body and commits, then /promote --human-text), keyed so it is not repeated for the same head and reason. Forge PRs are in the bot's own org, so this adds no bot text upstream.

Open question for cgwalters: on human-text repos, should an approval made after he has edited the title and body himself count as /promote --human-text? Today it does not.

Tests: data-driven cases for due, refused-with-reason, already-commented, and head-moved.

Generated-by: https://github.com/cgwalters/#llms

Activity

  1. added
    dispatchOpt in to the dispatcher's auto-dispatch of a devspace run
    on Oct 5, 2026
  2. cgwalters-bot commented on Oct 5, 2026

    @cgwalters-bot
    CollaboratorAuthor

    Scope added from cgwalters's answer on #245: accept means the PR is posted upstream as the bot. Upstream LLM rules become an advisory warning shown on the forge PR before promote, blocking only when they clearly disallow bot accounts. Keep one issue that caches the bot's view of each org/repo contribution policy, and recheck a record when its sources changed since the last submission. The verdict flip for the eight silent repos is cgwalters-bot/homegit#145 (needs his approval).

    Generated-by: https://github.com/cgwalters/#llms

  3. cgwalters-bot commented on Oct 6, 2026

    @cgwalters-bot
    CollaboratorAuthor

    Landed in cgwalters-bot/homegit#153 (and #151 reworked and merged).

    • The sweep already ran bot-promote-due --apply; it now also promotes a human-text PR after /promote --human-text (bot-pr promote still checks the text is yours), and reconcile no longer asks a model to run bot-pr promote.
    • An approval that can't promote gets one comment on the forge PR with the reason and next step, plus the item's News; keyed by approval, head and reason. The next sweep comments on the 11 PRs now waiting for your text.
    • bootc#2499 (.vmlinuz.hmac): sign off again #151: Done items are archived 3 days after closing, for real, from the sweep (every 6h, 100 per run).

    No gate or policy verdict changed. The open question (approval after your own edits counting as /promote --human-text) is at cgwalters-bot/homegit#153 (comment). Advisory warning and cached policy view: #398.

    Generated-by: https://github.com/cgwalters/#llms

  4. cgwalters-bot commented on Oct 6, 2026

    @cgwalters-bot
    CollaboratorAuthor

    Post-merge review of cgwalters-bot/homegit#153 and #151 (read in full, not by Sonnet): both hold, nothing to fix.

    • ostree#3611: rerun the red stream9 jobs #153: nothing here can promote without your approval of the exact head. bot-promote-due only decides when to run bot-pr promote, which checks the head, the policy and (for /promote --human-text) that the text is yours again; a stale approval never reaches it. Notices go only to open PRs by the bot in the forge or its own forks that carry a bot-meta section, never to the upstream PR, and only the bot's own comments count as notice keys or sign-off records. One comment per approval+head+reason (a moved head: per approval; a refusal: per approval+head, whatever its wording), so the 6h retry repeats nothing.
    • bootc#2499 (.vmlinuz.hmac): sign off again #151: archives only items that are Done on a fresh listing and whose issue or PR is closed for 3 days by its own closed_at; epics and anything with an open sub-issue stay; lookups are REST, archives go one at a time, 100 a run. Any unreadable item fails the run before a single archive.

    Two small things, yours to decide, not fixed:

    • After a "needs your text" notice, pushing your reworded commits before commenting /promote --human-text can draw one "head moved" notice whose next step names plain /promote.
    • An item set Done long after its issue closed is archived at the next 6h run, and late token spend on an archived item no longer reaches its Actual tokens.

    Generated-by: https://github.com/cgwalters/#llms

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

    P0dispatchOpt in to the dispatcher's auto-dispatch of a devspace runtarget:other

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions