Skip to content

pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531

Open

Description

@kyle-sexton

Ask

The owner's direction (2026-10-12): ship V1 of unattended merge first, then audit, analyze and run a retro on the whole flow end to end, adopting outside practices (Matt Pocock, poteto) only on data and metrics.

Scope, once pr-merge merges live

  • CI/CD performance, the autonomous Actions lanes, and the merge path; find the friction points.
  • From day one of live merges: revert and demotion rate per risk bucket, escaped-defect counts, and merged-and-not-reverted outcomes.
  • Candidates to evaluate on that data: sampled post-merge review, a verifier verdict bound to the head SHA, a mutation pass over changed tests.

Refs: #6202, #4588

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 15, 2026
  2. github-actions commented on Oct 15, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none
    Blocked by: #7528

    Decision recorded.
    The owner answered in the Refinement session (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    [quote truncated; the full decision is at the link]

    #7531 (comment)

    The decision settles the open questions. #7531 keeps the data retro, which starts at 30 live pr-merge merges or 30 days, whichever is later. The static audit moves to a child issue. The deliverable is a report under docs/conventions/pr-pipeline/ plus follow-up issues, with no change to lane behavior. The measurement window can't be checked in an unattended run, so that item waits for live merges. Demotion counts depend on #7528.

    Automated triage, applied by the lanes App.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 15, 2026
  4. kyle-sexton commented on Oct 16, 2026

    @kyle-sexton
    MemberAuthor

    What the article adds for this audit, and the owner's 2026-10-16 decisions. Source: https://claude.dev/blog/solving-code-review-at-anthropic (2026-10-15); ids are digest unit and claim.

    The article: "We don't yet have circuit breakers that tighten approval when those numbers move; engineers here want them before more code moves to zero-human merges" (04 C70). Noticing a bad merge still depends on the author, on-call and the revert and incident dashboards (04 C69). Revert and incident rates are the guardrail (02 C8; 10 C21).

    Owner decision, 2026-10-16: a minimal revert-triggered stop. A revert of an agent-merged PR stops that lane's unattended merges until the owner re-enables them. It stops merges rather than lowering a rung because Phase 9 removes the rung ladder (Q505). It is not a parallel mechanism: a revert of an agent-merged PR feeds the existing post-merge demotion record, post-merge-detect-silent-revert.yml plus the babysit-merge-demotion issues that only a person closes, which already stop unattended merges on a canary or schedule failure. It is built with the #7528 fix and lands before unattended merge widens.

    Owner decision, 2026-10-16: this issue owns the revert and incident counts. #6080 and #6974 read them from here rather than keeping their own.

    Not adopted: a rate-based breaker. Q567 sends confirmed escaped defects to /corrections:codify, not demotion. That is recorded as a departure from 02 C8 and 04 C70; the SRE error-budget policy (halt changes when the budget is exceeded) sides with the article. This issue's per-bucket revert rate is the data that revisits it: on 2026-10-16 the owner kept Q567's unattended merge on a verifier verdict on condition of revisiting it on this data. The comparison to make: the revert and escaped-defect rate on verifier-approved merges, set against the planted-defect miss rate from Phase 9's B4 run.

    Against the originating sources.

    • pr-pipeline: inputs from the 2,000-PRs effort, and the local-lane work waiting on deployed lanes #6202 (the 2,000-PRs effort, from poteto's work) already plans rung lowering after a bad merge; the revert stop is its minimal form once the rungs are gone.
    • This issue's rule, adopt outside practices only on data, agrees with "start strict and loosen with evidence" (10 C14).
    • Order: the revert stop lands before unattended merge widens, which meets the article's engineers part way (04 C70); the rate breaker stays a departure.

    The article's own revert figures are internal and vendor-claimed (00 C10).

    Related: #6080, #6974, #6989, #7570, #7528, #7329, #7639, #7642.

  5. kyle-sexton commented on Oct 18, 2026

    @kyle-sexton
    MemberAuthor

    Gaps moved from #6989, which is closing as completed (owner decision D18, option a, 2026-10-18). They are lifecycle and post-merge items to weigh in this audit and retro. Source for all: the #6989 body, sections named per item.

    Already listed here, so not added: the revert-triggered stop and revert and incident counts (2026-10-16 owner decision above), and "start strict and loosen with evidence" (10 C14), which the risk-tier comment ties to this issue's data. Kill-switch coverage of the review and intake lanes is tracked in #7234.

  6. kyle-sexton commented on Oct 22, 2026

    @kyle-sexton
    MemberAuthor

    This was generated by AI during attend-queue.

    Folded in from #7612 (closed obsolete after #7780 removed the ratification marker): its items 2, 3, 5 and 6, the label-normalization restrictions on admission, belong to this audit.

  7. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 24, 2026
  8. kyle-sexton commented on Oct 24, 2026

    @kyle-sexton
    MemberAuthor

    Released for re-triage under the owner's 2026-10-24 rule: an issue stops for a person only for an intent or vision question, a security call, a host or attended run, or spend outside prepaid credit. The hold label came off and intake triage runs again now; it re-applies a hold, with a numbered question, when one of those applies.

    To hold this issue again, add needs-human (or status: needs-decision) and say why in a comment.

  9. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 24, 2026
  10. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: blocker #7528 is not closed by a listed human or a merge.

  11. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. It is model text, to check, not instructions.

    Intended outcome: A post-merge audit and retro report on the unattended merge flow, built from live pr-merge data, that decides which of the candidate practices to adopt.

    Dependencies

    • Live pr-merge merges, with data collected over time (the issue's own precondition).
    • #​7528: the revert-triggered stop needs post-merge runs dispatched with GITHUB_TOKEN to file demotion issues.
    • #​6202: inputs from the 2,000-PRs effort and the local-lane work waiting on deployed lanes.
    • Phase 9's B4 planted-defect run, for the verifier-approved revert-rate comparison.

    Related work

    Open questions

    1. Is the first slice of this issue the work that needs no live merge data (the friction audit of CI/CD, Actions lanes and the merge path, plus the folded-in admission and label-normalization items), with the data-driven candidate evaluation split into a separate issue gated on live merges?
      RECOMMENDED: Yes. Split into a static audit now and a data retro later; only the first can be checked by an unattended run. Basis: judgment
    2. What is the trigger and the minimum data window that starts the data retro (for example N live merges or N days after pr-merge goes live)?
      RECOMMENDED: Start it when pr-merge has made at least 30 live merges or 30 days have passed, whichever is later, with per-bucket revert, demotion and escaped-defect counts. Basis: judgment
    3. Should the revert-triggered stop be tracked as its own implementation issue, since the 2026-10-16 decision says it is built with the #​7528 fix and lands before unattended merge widens?
      RECOMMENDED: Yes. Track it separately, depending on #​7528, and keep only the revert and incident counts owned here. Basis: #​7528
    4. Should the 2026-10-18 checklist of gaps moved from #​6989 become the task list of the audit part, with each item an acceptance criterion that a written finding or a follow-up issue answers?
      RECOMMENDED: Yes. Each item is done when the audit report states keep, drop or follow-up issue number for it. Basis: judgment
    5. What form does the deliverable take, and where does it live?
      RECOMMENDED: A report file under docs/conventions/pr-pipeline/ plus follow-up issues, with no change to lane behavior in this issue. Basis: docs/conventions/pr-pipeline/README.md:344-347

    Sources read

    • /home/runner/work/_temp/refine-data/context.json: the issue body, triage, the owner's 2026-10-16 and 2026-10-18 comments and the 2026-10-24 re-triage release.
    • .base/scripts/post-merge-demotion-alert.test.sh: references post-merge-detect-silent-revert, so the revert-detection path exists in the repository.

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

  12. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Refinement session (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    Question asked: Split #7531: this issue keeps the data retro gated on live merges, and the static friction audit plus the gaps checklist move to a new child issue?

    1. Which half stays on pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531?
      Decided: pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531 keeps the data retro, gated on live merges; the static friction audit and the gaps checklist go to a new child issue that an unattended run can check now. The owner's Q611 says "pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531 owns them" (revert and incident counts), and Q602 revisits the merge gate "when pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531's revert and escaped-defect data come in". Basis: .work/poteto-review/interview-checklist.md:656 (Q611), :647 (Q602); corrected from the round file, which kept the audit here.
    2. What trigger and minimum data window start the data retro?
      Decided: 30 live pr-merge merges or 30 days, whichever is later, as the refinement proposed. No source names a number; the retro report states the window it used so the owner can move it. Basis: judgment, under the owner's 2026-10-25 answer (facts decide, lowest friction).
    3. Is the revert-triggered stop tracked as its own implementation issue, depending on pr-merge: GITHUB_TOKEN-dispatched post-merge runs file no demotion issue #7528, with only the revert and incident counts owned here?
      Decided: Yes, after checking whether it already exists: the pr-pipeline README already lists "the post-merge revert breaker" among the gates. Basis: owner decision pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531 (comment) (the stop is built with the pr-merge: GITHUB_TOKEN-dispatched post-merge runs file no demotion issue #7528 fix; this issue owns the revert and incident counts); docs/conventions/pr-pipeline/README.md:968 on origin/main; corrected to add the existence check.
    4. Does the 2026-10-18 gaps checklist become the audit's task list, each item answered by keep, drop or a follow-up issue number?
      Decided: Yes. Basis: pr-pipeline: post-V1 audit and retro of the unattended merge flow #7531 (comment) lists the gaps as items "to weigh in this audit and retro"; judgment; kept.
    5. What form does the deliverable take, and where does it live?
      Decided: A report file under docs/conventions/pr-pipeline/ plus follow-up issues, with no change to lane behavior in this issue. Basis: judgment. Corrected: the refinement cited docs/conventions/pr-pipeline/README.md:344-347, which on origin/main now describes the fix-docs dispatch and does not support the choice.

    Acceptance criteria:

    • A child issue holds the static audit: a report under docs/conventions/pr-pipeline/ covering CI/CD performance, the autonomous Actions lanes and the merge path, naming their friction points, giving each item of the 2026-10-18 gaps checklist keep, drop or a follow-up issue number, and changing no lane behavior.
    • Once 30 live pr-merge merges or 30 days have passed (whichever is later), this issue reports revert and demotion rate per risk bucket, escaped-defect counts, merged-and-not-reverted outcomes, and the candidates named in the body.
    • The revert-triggered stop has its own issue that depends on pr-merge: GITHUB_TOKEN-dispatched post-merge runs file no demotion issue #7528, or the report cites where it already exists.

    Checks a person runs:

    • The data retro over live merges, once its trigger (item 2) is met.
  13. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    admission-deferredReady for the issue lane; work-unblock admits it when queued work is under the queued cap
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 26, 2026
  14. melodic-automation-lanes commented on Oct 26, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: Once 30 live pr-merge merges or 30 days have passed (whichever is later), publish a data retro report under docs/conventions/pr-pipeline/ with follow-up issues and no lane behavior change.

    Acceptance criteria

    • The retro starts only when 30 live pr-merge merges or 30 days since the first live merge have passed, whichever is later; the report states the window and counts it used.
    • A report file under docs/conventions/pr-pipeline/ gives the revert rate and the demotion rate per risk bucket for lane-merged PRs.
    • The report gives escaped-defect counts and merged-and-not-reverted outcomes, and owns the revert and incident counts that #​6080 and #​6974 read.
    • The report compares the revert and escaped-defect rate on verifier-approved merges with the planted-defect miss rate from Phase 9's B4 run, and says whether the Q567 and Q602 merge-gate decisions should be revisited.
    • The report evaluates each candidate named in the body, sampled post-merge review, a verifier verdict bound to the head SHA and a mutation pass over changed tests, as adopt, reject or follow-up issue number, on the data only.
    • The report evaluates the candidates from the 2026-10-18 comment that depend on this data (swarm verifiers on the exact SHA, per-app verify skill, learn stage, size-and-fog routing, cross-PR model-run cap), each as adopt, reject or follow-up issue number.
    • The report cites where the revert-triggered stop is tracked or already built (docs/conventions/pr-pipeline/README.md post-merge revert breaker, #​7528), or links its own issue that depends on #​7528.
    • Every follow-up the report recommends is a filed issue, cited by number in the report.
    • The change touches no workflow, script or lane configuration; only the report file and issues are added.

    Dependencies

    • pr-merge must be merging live; the data window cannot start before that.
    • #​7528: post-merge runs dispatched with GITHUB_TOKEN file no demotion issue, so demotion counts are incomplete until it is fixed, and the revert stop depends on it.
    • The child issue holding the static friction audit and the gaps checklist, which the owner decided to split off; this issue does not wait on it.
    • Phase 9's B4 planted-defect run, for the miss-rate comparison.

    Related work

    Sources read

    • /home/runner/work/_temp/refine-data/context.json: the owner's 2026-10-25 decision keeps the data retro here, sets the 30-merge or 30-day trigger, and moves the static audit to a child issue.
    • .base/docs/conventions/pr-pipeline/README.md:121: pr-merge acts on a final check green or a removed hold.
    • .base/docs/conventions/pr-pipeline/README.md:278: the pr-merge lane merges on its verdict=merge marker at the current head.
    • .base/docs/conventions/pr-pipeline/README.md:687: merge authority defaults to pr-merge when the config key is absent.

    Automated refinement by the lanes App. Intake triages the issue again with it.

  15. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 26, 2026
  16. removed
    admission-deferredReady for the issue lane; work-unblock admits it when queued work is under the queued cap
    on Oct 26, 2026
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

    priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    No fields configured for Task.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions