Skip to content

policy(babysit): out-of-loop babysit-prs invocations bypass the grace window, rung partition, and reviewer awarenessΒ #1630

Description

@kyle-sexton

πŸ€– Agent-authored β€” filed by the adversarial adjudication of #1614. This one is deliberately filed without a recommendation: it adjudicates the merge authority of the same lane that would otherwise decide it, so the conflict of interest is structural and the call is the operator's.

The question

In a repository that has adopted the babysit loop, should a direct /source-control:babysit-prs autopilot <owner/repo>#<N> invocation be able to merge?

Three safeguards live at the loop level and have no counterpart in the single-pass mechanic. An invocation that goes straight to the mechanic bypasses all three at once.

What the loop provides that the mechanic does not

Grace window. babysit-loop marks every PR whose head moved or that received comments within the window as report-only β€” "never elevated, never thread-resolved, never merged." babysit-loop/SKILL.md is explicit that this is a loop-level overlay: "The grace window below is an additional loop-level overlay, never a replacement for them." This repository tracks babysit_loop_grace_window_minutes: 30 in .claude/source-control.md.

Rung partition. The loop resolves each PR's close-linked work item and admits it only when the item's work class sits within the effective merge rung, fail-closed: "Unlinked or unclassified PRs never auto-merge." This repository tracks babysit_loop_merge: c2-mechanical and babysit_loop_tier: worker.

Reviewer awareness. Configured through the loop's seam keys, and separately blind in the merge gate itself β€” filed alongside this issue.

The mechanic's own tier matrix has none of these. autopilot is documented as "maximum autonomy … merge everything the gate proves ready", and the gate is exactly the deterministic merge gate β€” which is real, but is a different and narrower thing than the lane's governance.

Evidence β€” PR #1594

The merge lane was running at the time and did not merge #1594. From its own telemetry, issue #1214 (Lane telemetry: babysit-loop), cycle 13:

So the merge came from a session outside the lane. The PR carries a claim marker naming lane=fable-autopilot, consistent with a direct babysit-prs autopilot invocation.

Had the lane's own governance applied, #1594 would not have merged autonomously on two independent grounds:

Consequence: the merge landed 26 seconds before the reviewer's fifth round, which carried two valid findings including a regression the PR itself introduced (#1613).

I could not determine from the artifacts whether that autopilot invocation was operator-ordered β€” which babysit-prs explicitly sanctions ("Any tier also honors an explicit user instruction to merge or resolve specific PRs now") β€” or lane-elected. That distinction may matter to the decision and is not recoverable from GitHub state.

Options, stated neutrally

A β€” Forbid out-of-loop merges in lane-adopted repositories. A repository whose tracked config carries babysit_loop_* keys is declaring the loop as its merge authority; the mechanic would refuse to merge there when invoked outside a loop cycle, and report merge-ready instead.
For: one merge authority per adopted repo; the tracked seam means what it says. Against: removes a sanctioned direct-order path; needs a reliable way for the mechanic to know it is inside a loop cycle, which does not exist today; an operator who genuinely wants a one-off merge loses it or needs a new override token.

B β€” Require out-of-loop invocations to honor the loop's grace window and rung. The mechanic reads the same babysit_loop_* keys and applies the overlay and partition itself when they are present.
For: keeps the direct path; makes the safeguards a property of the repository rather than of the entry point. Against: duplicates loop logic into the mechanic, which today deliberately owns none of it (babysit-loop/SKILL.md: "The single-pass mechanics belong to /source-control:babysit-prs … this loop restates none of that" β€” this would push the coupling the other way); two implementations of one overlay is a drift risk; a legitimate urgent merge now waits out a 30-minute window.

C β€” Status quo. The mechanic's tier matrix and gate remain the whole story for direct invocations; the loop's overlays apply only to loop cycles.
For: no new coupling; the direct path stays available and honest about what it is; the merge gate is still never bypassed. Against: a repo can adopt the lane, track a conservative rung, and still have every one of those constraints bypassed by one invocation β€” which is what happened on #1594; the tracked config gives a false impression of the repo's effective merge policy.

These are not mutually exclusive. B could be scoped to the grace window alone, and A could be an override-gated form of B.

Why this is filed for a human

Under every option the deciding party is a lane whose own authority is what is being scoped. An autonomous session evaluating this is evaluating whether to keep a capability it holds. The adjudication that produced this issue takes no position beyond naming that conflict.

Related: #1614 (the policy issue this came out of), #1594 (the run), #1613 (the findings that arrived after the merge), #1214 (the lane telemetry quoted above).

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: highSignificant impact, or blocks an imminent release; staff this cycle.status: needs-decisionAwaiting a human or maintainer judgment call.

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions