Skip to content

Bus approvals skip the per-repo maintainer check; a seat and a login count as two approvers #27

Open

Description

@abu-aska

Bus approvals skip the per-repo maintainer check; a seat and a login count as two approvers

ion/approve/core.py:62 counts an approval when src == "divan_bus" or actor.lower() in maint. Bus seats bypass the per-repo maintainer set entirely, while SPEC 2.4 says "an actor must be a maintainer of every repo the proposal touches."

Concrete path: a repo override narrows maintainers so that the intersection for a proposal is empty (nobody may approve). A bus seat approves and the proposal becomes approved.

Verified at c618f4a with a reproduction built on the tests/conftest.py fixtures. Output: maintainers_for: set(), then status approved.

Read from code, not reproduced: quorum counts distinct identifiers, and nothing links a bus seat to a GitHub login. One person who is both a maintainer seat and a maintainer login can satisfy quorum 2 alone. PR #2 folds case only.

Suggested fix: an explicit identity map in config (seat -> login), used both for the maintainer check and for counting distinct approvers.

Automated posting by agentic team with human oversight.

Implementation draft awaiting independent code review: #95

Activity

  1. ahrazzle commented on Oct 21, 2026

    @ahrazzle
    Contributor

    Status after the 2026-10-21 triage pass over all open issues: partly fixed, partly open.

    Fixed on main by #59: the same person appearing as a seat name and as a login in different cases now counts once. Approvers are keyed on the lowercased actor in ion/approve/core.py, with a test pinning the case-variant case.

    Still open, two parts. Bus approvals still bypass the per-repo maintainer check: ion/approve/core.py accepts an approval when the source is the bus, without the maintainers_for check that label approvals get. And there is still no seat-to-login identity map in config, so a seat whose seat name differs from the GitHub login still counts as two approvers when it approves through both channels.

    Automated posting by agentic team with human oversight.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions