Skip to content

Enforce rejected-author revision lockout, reassignment, and deadlock escalation #1828

Open

Description

@bradygaster

Scope after #1734 / #2096

This issue originally identified that same-account Squad agents could not create a machine-checkable independent approval. The accepted solution is stable logical Squad agent identities plus the required GitHub check Squad Review / review. #1734 and its implementation PR #2096 cover that independent-review gate: verdict evidence is bound to the repository, PR, exact head SHA, logical author/reviewer identities, result, timestamp, and workflow run, and the epic relay validates the clearing verdict.

That delivered scope does not enforce the broader rejected-author revision cycle. Keep this issue open for the residual lockout, contribution tracking, reassignment, and deadlock behavior below.

Residual problem

After a blocking rejection, there is still no durable enforcement that:

  • records who owns, contributes to, or advises each revision;
  • prevents the rejected revision author from participating in the immediate replacement revision;
  • assigns the next revision to a different eligible agent;
  • carries lockouts forward when successive revisions are rejected; or
  • fails closed and escalates when every eligible agent is locked out.

Without those controls, independent review can be genuine while the rejected-author lockout remains convention-only.

Required behavior

  1. A blocking verdict identifies the rejected artifact, exact PR/head SHA, requirement, accountable revision author, and rejecting reviewer.
  2. The rejected revision author is locked out of the immediate replacement revision: they cannot own, author, commit, implement, advise, or pair on it.
  3. The next accountable revision author must be a different active, eligible agent, with auditable assignment and provenance.
  4. Revision evidence tracks all contributors and advisors. Participation by a locked-out agent invalidates the revision. The rejecting reviewer may perform the focused rereview but cannot implement, advise, or pair on that revision.
  5. If a replacement revision is rejected for the same unresolved requirement, its accountable author joins the lockout set and another eligible agent must own the next revision. A second rejection of the same requirement escalates to architect; architecture/product decisions escalate to the user as defined by governance.
  6. If no eligible agent remains, the gate fails closed, records an explicit deadlock, and escalates rather than silently reusing a locked-out author or clearing the rejection.
  7. Lockout and provenance state survives workflow boundaries and rejects missing, malformed, duplicate, or stale evidence.

Acceptance criteria

  • A rejected revision's accountable author cannot author or contribute to the immediate next revision.
  • The immediate next revision has a different active, eligible accountable author.
  • Accountable author, contributors, and advisors are durably tracked for every revision.
  • Locked-out agents are excluded from implementation, advice, and pairing; the rejecting reviewer remains independent from the revision while retaining focused-rereview authority.
  • Repeated rejection of the same requirement advances the lockout set and reassigns the next revision to another eligible agent.
  • A second rejection of the same requirement triggers the governance escalation path.
  • Exhausting all eligible revision authors produces an auditable fail-closed deadlock and escalation to the user; it never silently bypasses lockout.
  • Tests cover author equality, hidden contributor/advisor participation, stale provenance, repeated-rejection progression, and all-eligible-agents deadlock.

Delivered separately / out of scope here

Historical context

PRs #1818, #1819, #1820, and #1821 demonstrated that substantive second-agent reviews had to be posted as comments because GitHub rejects same-account approval. One such review found the long-standing defect fixed by #1822. #2096 addresses the machine-checkable independent-review portion of that original problem; this issue now tracks only the stricter revision-cycle semantics above.

Activity

  1. bradygaster commented on Aug 30, 2026

    @bradygaster
    CollaboratorAuthor

    Architecture dependency (Ralph triage): This issue is a direct blocker for #1734 (Phase 2: required check enforcement). The enforcement surface — structurally preventing agents from approving each other's PRs — must be defined here before Phase 2 can be implemented. #1734 will not proceed until this decision resolves.

  2. added
    squadSquad triage inbox — Lead will assign to a member
    on Aug 30, 2026
  3. github-actions commented on Aug 30, 2026

    @github-actions
    Contributor

    📋 Assigned to Flight (Lead)

    Issue: #1828 — Reviewer lockout protocol has no enforcement surface — agents cannot approve each other's PRs

    Flight will pick this up in the next Copilot session.

    For Copilot coding agent: If enabled, this issue will be worked automatically.
    Otherwise, start a Copilot session and say:
    Flight, work on issue #1828

  4. github-actions commented on Sep 10, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  5. github-actions commented on Sep 10, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  6. 3 remaining items

  7. github-actions commented on Sep 11, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: Flight
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  8. github-actions commented on Sep 13, 2026

    @github-actions
    Contributor

    🔄 Ralph — Auto-Triage

    Assigned to: architect
    Reason: No module, routing, or role keyword match — routed to Lead/Architect
    Source: lead-fallback

    Ralph auto-triaged this issue using routing rules.
    To reassign, swap the squad:* label.

  9. added
    squad:github-integration-devAssigned to github-integration-dev (GitHub Integration Engineer)
    and removed
    squad:architectAssigned to architect (Lead Architect)
    on Sep 24, 2026
  10. github-actions commented on Sep 24, 2026

    @github-actions
    Contributor

    📋 Assigned to github-integration-dev (GitHub Integration Engineer)

    Issue: #1828 — Reviewer lockout protocol has no enforcement surface — agents cannot approve each other's PRs

    github-integration-dev will pick this up in the next Copilot session.

    For Copilot coding agent: If enabled, this issue will be worked automatically.
    Otherwise, start a Copilot session and say:
    github-integration-dev, work on issue #1828

  11. dat-intellis commented on Sep 26, 2026

    @dat-intellis

    I noticed this as well. A 4th option could be using labels as a trailed gate, similar to how squad is controlling issue assignments to squad members or blocking Ralph's loop based on specific labels.

    I'm guessing these where decided in the first place because squad members don't have a distinct identity so they cannot be officially assigned to anything through GitHub.

    This issue seems similar in nature, and the solution might therefore benefit from a similar approach.

  12. bradygaster commented on Sep 28, 2026

    @bradygaster
    CollaboratorAuthor

    #1734 enforcement decision and narrowed remaining scope

    Working as agentic-workflows-dev (Agentic Workflows Engineer), following the accepted product decision from Brady: use stable logical Squad agent IDs from committed provenance plus the required GitHub check Squad Review / review. Separate GitHub accounts or Apps per agent are not required. Native human approval remains independently required.

    The #1734 implementation is prepared and under focused rereview; it is not merged, deployed, or enabled in rulesets yet. Its deterministic guard binds a verdict to repository, PR number, exact reviewed head SHA, distinct canonical author/reviewer IDs, result, UTC timestamp, and the PR workflow run. It rejects missing, malformed, duplicate, stale, or self-authored evidence. The epic relay checks the merged PR head SHA and successful review check before advancing. Both logical verdicts are published as native COMMENT reviews because GitHub disallows same-account self-approval/self-rejection; the status check enforces logical REQUEST_CHANGES.

    A human administrator override is explicit, unedited, SHA- and review-scoped, reasoned, and retained in the PR conversation. It can clear an actual rejection, not missing/invalid identities or evidence, and never substitutes for human approval. Labels alone do not clear the gate.

    Keep #1828 open. This covers machine-checkable independent review and the accepted enforcement-surface decision. It does not fully enforce the broader rejected-author revision lockout: tracking who owns or contributes to each subsequent revision, preventing a locked-out author from contributing, and reassignment/deadlock escalation remain outstanding. Logical attribution also is not cryptographic proof of separate processes or humans.

    Ruleset activation remains a Brady/repository-administrator action after observing the actual check and App ID and satisfying the advisory-soak evidence gate: dev first, main after soak. I will link the implementation PR after its review gate clears.

    Implementation PR: https://github.com/bradygaster/squad/pull/2096 (commit d7e498d), targeting dev. Focused independent rereview approved; 524 focused tests, strict compilation, actionlint of both enforcement locks, build, and typecheck pass. The PR discloses the pre-existing dependency-worker CHANGELOG-protection test failure. This issue remains open for the revision-lockout invariants described above; ruleset activation and soak are still administrator actions.

  13. changed the title [-]Reviewer lockout protocol has no enforcement surface — agents cannot approve each other's PRs[/-] [+]Enforce rejected-author revision lockout, reassignment, and deadlock escalation[/+] on Sep 28, 2026
  14. bradygaster commented on Sep 28, 2026

    @bradygaster
    CollaboratorAuthor

    Scope split: #1734 and PR #2096 implement the machine-checkable independent logical review gate (Squad Review / review) and relay enforcement. They intentionally do not implement rejected-author revision lockout. #1828 remains open for durable revision ownership/contribution tracking, exclusion of locked authors and revision participants, reassignment across repeated rejections, and fail-closed escalation when no eligible reviser remains. #2074/#2069 remain orthogonal.

  15. bradygaster commented on Sep 29, 2026

    @bradygaster
    CollaboratorAuthor

    Final restack and delivery update: #2096 (https://github.com/bradygaster/squad/pull/2096) merged into dev as da7861d after #2093. Reviewed head b282987 preserves the merged command router, dependency CHANGELOG protection, genesis, and repo-health behavior; combined install contract is 8 workflows / 17 runtime resources / 1 skill. Exact-head independent cycle-2 review approved; required test and gh-aw strict compile checks passed, and PR was CLEAN before normal non-admin merge. Replacement CI run 36501234702 succeeded after the prior run was cancelled. Local evidence: 1,494 gh-aw tests + 25 repo-health transport tests passed; both source/package layouts strict-compiled 8/8; build, typecheck, integrity, interpolation and changed-test lint passed. Prior dependency-worker baseline failure is resolved by merged #2092. Two unchanged retro-only actionlint input diagnostics were reproduced on exact pre-PR dev and disclosed, not suppressed or included in this change. Independent logical author/reviewer enforcement and reviewed-head relay are delivered; #1828 remains open for the broader rejected-author revision-lockout invariant. Brady still owns observing the actual check/App ID, advisory soak, and enabling the exact required context with native human approval independently retained. No ruleset/soak completion is claimed; #2074/#2069 and Ralph heartbeat were not changed.

  16. bradygaster commented on Sep 29, 2026

    @bradygaster
    CollaboratorAuthor

    Post-#2105 reconciliation

    The merged dedicated-App review authority does not complete this issue's residual rejected-author ownership contract. Contributor/advisor provenance, reassignment, cumulative lockouts, second-rejection escalation, and all-authors-exhausted deadlock remain unimplemented. Keep open as active distinct work; it is not satisfied by #2105 or duplicated by #2103.

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

    gh-awGitHub Agentic Workflows integrationpriority:p2Next sprintsquadSquad triage inbox — Lead will assign to a membersquad:github-integration-devAssigned to github-integration-dev (GitHub Integration Engineer)type:rfcRFCwave1:P8Wave 1 PR group P8wave:1-nextWave 1 — immediate next sprint

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions