Problem
When a PR's review threads keep regenerating DISTINCT findings of the same class (an inherently
leaky fix surface), patching never converges. The playbook that cleared these PRs:
- Verify genuine non-convergence, not legitimate per-finding depth.
- Make the scope/architecture call.
- Ship-if-strictly-better + file a tracked follow-up (residual gaps + durable root-cause approach).
- Resolve the threads on that decided-and-tracked basis.
- Merge.
Done ad-hoc via Opus agents each time; codify it. Evidence: dotfiles#213, #224; follow-ups
dotfiles#232, plugins #365 / #366 / #367. Retrospective
.work/handoffs/babysit-autopilot-retro.md §1.6 / §2.2.
Recommended shape (re-derived blind to the original "skill" framing)
NOT a skill, NOT an engine signal. Extend the existing references — almost entirely pointers.
The constituent parts already exist across three owners; a new skill would restate them and drift:
- Verify genuine non-convergence → owned by
reference/safety.md "Verify Before Escalating
Non-Convergence". Point, do not restate the (a)/(b) test.
- Ship-if-strictly-better + tracked follow-up → the fix-now-or-ticket rule already owned by the
pull-request skill's reference/monitor.md ("never merge past a confirmed-valid finding with
neither a fix nor a tracked issue"). Point — ideally lift it to the shared plugin
reference/review-discipline.md so both skills point at one copy.
- Durable disposition so later snapshots don't re-flag the deferred finding → owned by
reference/feedback.md "Feedback Dispositions" (dispose --reason …). Decide-and-defer is
mechanically a new deferred disposition reason (one reason line + a new accepted --reason
value in the ledger).
- Resolve-on-decided-basis + gate-proven merge → guarded wrappers already owned by
safety.md +
SKILL.md autopilot widening.
New content — one home
The only genuinely new content is the thin sequencing playbook + the autopilot authorization. Home:
a new subsection under safety.md's "Verify Before Escalating Non-Convergence" (the most-pointed-at
owner of the non-convergence flow; the resolution is a mutation-authorization nuance = safety's
domain), plus the deferred reason line in feedback.md. orchestration.md Fix-Round-Cap and
SKILL.md autopilot each gain one pointer to it. Each fact stays owned once.
Load-bearing reconciliation (verified)
The babysit merge gate blocks on ANY unresolved thread unconditionally
(scripts/babysit_merge.py:253 if threads: → blocker; independent of GitHub's
requireThreadResolution, which it tracks separately). So — unlike the human-judgment merge in the
pull-request skill's monitor.md, where you can merge-past-with-a-ticket and leave the thread open —
reaching a babysit gate-proven merge REQUIRES resolving the deferred threads. This is not a new
invariant: it applies autopilot's existing "addressed → resolve" widening to a new "addressed" class
= decided-and-deferred-to-a-tracked-follow-up. Reconcile explicitly with safety.md's "never resolve
a thread over a live, unaddressed finding" and feedback.md's "a disposition never overrides
structured CHANGES_REQUESTED". Therefore: autopilot-only; applies to bot/AI-review threads and
(under the human widening) addressed human threads; never an unaddressed live CHANGES_REQUESTED.
Files
reference/safety.md — new "Decide-and-Defer Resolution (autopilot)" subsection
reference/feedback.md — new deferred disposition reason
Rejected shapes
Separate skill (restates safety.md + monitor.md = 2nd/3rd copies, drift), engine signal/script
(genuine non-convergence is a content judgment the engine is explicitly forbidden to make from
metadata — round count alone is insufficient by design), subagent (the verify step can reuse the
existing review-discipline extractor; the decide-and-defer call is orchestrator judgment, not
fan-out).
Problem
When a PR's review threads keep regenerating DISTINCT findings of the same class (an inherently
leaky fix surface), patching never converges. The playbook that cleared these PRs:
Done ad-hoc via Opus agents each time; codify it. Evidence: dotfiles#213, #224; follow-ups
dotfiles#232, plugins #365 / #366 / #367. Retrospective
.work/handoffs/babysit-autopilot-retro.md§1.6 / §2.2.Recommended shape (re-derived blind to the original "skill" framing)
NOT a skill, NOT an engine signal. Extend the existing references — almost entirely pointers.
The constituent parts already exist across three owners; a new skill would restate them and drift:
reference/safety.md"Verify Before EscalatingNon-Convergence". Point, do not restate the (a)/(b) test.
pull-request skill's
reference/monitor.md("never merge past a confirmed-valid finding withneither a fix nor a tracked issue"). Point — ideally lift it to the shared plugin
reference/review-discipline.mdso both skills point at one copy.reference/feedback.md"Feedback Dispositions" (dispose --reason …). Decide-and-defer ismechanically a new
deferreddisposition reason (one reason line + a new accepted--reasonvalue in the ledger).
safety.md+SKILL.mdautopilot widening.New content — one home
The only genuinely new content is the thin sequencing playbook + the autopilot authorization. Home:
a new subsection under
safety.md's "Verify Before Escalating Non-Convergence" (the most-pointed-atowner of the non-convergence flow; the resolution is a mutation-authorization nuance = safety's
domain), plus the
deferredreason line infeedback.md.orchestration.mdFix-Round-Cap andSKILL.mdautopilot each gain one pointer to it. Each fact stays owned once.Load-bearing reconciliation (verified)
The babysit merge gate blocks on ANY unresolved thread unconditionally
(
scripts/babysit_merge.py:253if threads:→ blocker; independent of GitHub'srequireThreadResolution, which it tracks separately). So — unlike the human-judgment merge in thepull-request skill's
monitor.md, where you can merge-past-with-a-ticket and leave the thread open —reaching a babysit gate-proven merge REQUIRES resolving the deferred threads. This is not a new
invariant: it applies autopilot's existing "addressed → resolve" widening to a new "addressed" class
= decided-and-deferred-to-a-tracked-follow-up. Reconcile explicitly with
safety.md's "never resolvea thread over a live, unaddressed finding" and
feedback.md's "a disposition never overridesstructured
CHANGES_REQUESTED". Therefore: autopilot-only; applies to bot/AI-review threads and(under the human widening) addressed human threads; never an unaddressed live
CHANGES_REQUESTED.Files
reference/safety.md— new "Decide-and-Defer Resolution (autopilot)" subsectionreference/feedback.md— newdeferreddisposition reasonRejected shapes
Separate skill (restates
safety.md+monitor.md= 2nd/3rd copies, drift), engine signal/script(genuine non-convergence is a content judgment the engine is explicitly forbidden to make from
metadata — round count alone is insufficient by design), subagent (the verify step can reuse the
existing review-discipline extractor; the decide-and-defer call is orchestrator judgment, not
fan-out).