Repository navigation
Closed
Closed
Feature
Copy link
Labels
priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Description
Problem
/review:merge-risk (PR #12954) rates a pull request's merge risk and returns a demote flag that can only send an unattended merge to a human. No merge gate reads demote yet (owner question Q57). The earlier risk-only version was replayed once in #7024: across 11 unattended merges it demoted none and missed #6205, a CI trust-boundary change. The new rubric adds floors for exactly that class, but it has not been replayed.
Owner decisions (2026-11-03, in session)
- Do not wire
demoteinto any merge gate yet. Replay the new rubric over past unattended merges first; the wiring decision (Q57) comes back to the owner with the replay's numbers. - In the same replay, run the blind checker on the PR author's model and on a different model class, and compare.
- Record each
/review:merge-riskresult (PR, head, area levels,demote) so it can later be joined to reverts, and let/work-items:measure-deliveryreport the revert rate per risk level.
Acceptance criteria
- Replay
/review:merge-riskover every unattended lane merge the lane telemetry records (the 11 PRs in feat(review): add a risk-only action to explain-change that can only demote an unattended merge #7024 at minimum), each at its merged head. - Per PR: the rater's and the checker's maximum level,
demote, and the hindsight outcome (reverted, regressed, follow-up fix, or none), in a table on this issue. - The checker runs twice per PR, on the author's model and on a different model class; the table shows both, with agreement counts.
- Counts: demotions, missed risks (hindsight says a human should have looked), false demotions.
- A design for recording merge-risk results (where they are written, how long they are kept, and how
/work-items:measure-deliveryjoins them to reverts), brought to the owner with the replay results and the Q57 recommendation. No gate change lands under this issue.
Related
- Refs feat(review): split merge-risk rating out of explain-change #12954 (adds
/review:merge-risk) - Refs feat(review): add a risk-only action to explain-change that can only demote an unattended merge #7024 (the earlier replay)
- Refs feat(review): risk-only explain-change action that can only demote an unattended merge to human #6943
Metadata
Metadata
Assignees
Labels
priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Type
Fields
Work status
ready
Activity
github-actions commentedon Nov 3, 2026
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: none
Understood: replay
/review:merge-riskover past unattended lane merges (at least the 11 PRs in #7024), each at its merged head. For each PR, record the rater's and checker's maximum level,demote, and the hindsight outcome. Run the checker on the author's model and on a different model class. Report the counts of demotions, missed risks and false demotions. Then bring a design for recording results, and how/work-items:measure-deliveryjoins them to reverts, to the owner along with the Q57 recommendation. No gate change lands under this issue.The done-when items are exact, and I found no cost charge: the replay runs on local sessions, not a billed service. The replay depends on #12954 merging first. The table and the Q57 recommendation need a person's review, but nothing blocks the work. I found no duplicate among the open issues.
Automated triage, applied by the lanes App.
melodic-automation-lanes commentedon Nov 3, 2026
Not admitted to the issue lane: its title or stated work names a charge (retention), which needs an owner decision; Size large: the split into sub-issues at intake is pending (owner Q93). Admission takes the issue once each of those is met, when intake triages it again (
.github/actions/resolve-config/admission-rules.json).melodic-automation-lanes commentedon Nov 3, 2026
The latest triage verdict holds nothing: the issue is at
status: ready.kyle-sexton commentedon Nov 4, 2026
Decision (Merge Risk session, owner away, settled by evidence): this issue names no charge. "Retention" in the first body meant how long merge-risk result records are kept in the repository; the body now says "how long they are kept". The replay runs local Claude Code sessions, which use subscription capacity, not a billed service; no Azure, GitHub runner, storage or plan change is involved. Basis: the issue body and the replay method in #7024. Size: the replay is one host run over about 11 PRs, done in one session, so no sub-issue split. The Merge Risk session runs it after #12954 merges.
9 remaining items
github-actions commentedon Nov 4, 2026
kyle-sexton commentedon Nov 5, 2026
Status.
agent-readyremoved andhost-runadded: this is a host run, not issue-lane work.status: needs-decisionstays for the owner's Q93 size-split rule, per the 2026-11-04T01:36Z correction above.Agent choice, not an owner answer.
agent-readysent it to a lane that cannot do it.kyle-sexton commentedon Nov 5, 2026
kyle-sexton commentedon Nov 5, 2026
Owner decision (2026-11-05, in session, verbatim: "ok go with recommendations"). #12984 runs as one host run, without a Q93 split. Basis: intake triage rated it Size: Medium (2026-11-03T23:16Z comment above); Q93 covers Size Large only, and the "Size large" in the admission comment conflicts with that rating.
status: needs-decisioncomes off, since it stood only for the Q93 split.Lane 4 holds the lease and is building the replay inventory: the unattended merges in lane telemetry, author models, and hindsight outcomes. Model runs start after the count is known.
kyle-sexton commentedon Nov 6, 2026
Replay result:
/review:merge-riskover every unattended lane mergeThe new rubric (#12954) caught both known risks, but its
demoteflag would have sent 227 of 674 unattended merges (34%) to a person. Against hindsight, 212 of those had nothing later go wrong. Recommendation for Q57: do not wiredemoteinto a merge gate. Record each rating instead (design below), and come back to Q57 when the revert data can measure precision.Criterion 1: every unattended lane merge, each at its merged head
mergedByis the lanes App, and the lane'sbabysit-merge-pincomment records each merge), 2026-10-17 to 2026-11-05.merge_rung: c3-autonomous).git diff <merge>^ <merge>;claude -p --restrictedin a directory outside any repository: no Bash, file tools confined to that PR's inputs, and no CLAUDE.md loaded.Criterion 3: two checkers per PR
Models:
review:brief-reviewer, which runs on Opus at high effort.code-fixroute (Opus, high effort). With the 12 merges from before that config existed (the babysit 11, whose commits carryClaude Opus 5.5trailers, and build: Bump anthropics/claude-code-action from 1.0.248 to 1.0.250 in the vendor-actions group across 1 directory #7708), Opus is the author arm for 542 PRs.model: defaultroute, where sampled trailers sayClaude Sonnet 5.5. For those, Sonnet is the author arm.Agreement over all 674 PRs:
demote(Opus arm) =demote(Sonnet arm)Opus and Sonnet maxes cross-tabulated (row is Opus, column is Sonnet; L, M, H, C are LOW, MEDIUM, HIGH, CRITICAL):
The Opus checker is the stricter one:
Criterion 4: demotions, missed risks and false demotions
demoteis computed as the skill defines it (rater or Opus checker at HIGH or above). The Sonnet arm is the same rule with the Sonnet checker in the checker's place.How each column is defined:
Other numbers:
Criterion 2: per-PR table
Levels are the maximum over areas, as L, M, H, C. The hindsight classes are:
caused-by: a later change undid a defect this PR introduced.follow-up: a later change finished this PR's work.observed-on: a lane or CI defect was seen on this PR.none: nothing later names this PR.All 674 PRs
Criterion 5: recording design, and the Q57 recommendation
The problem. Owner decision 3 asks for each merge-risk result (PR, head, area levels,
demote) to be joinable to reverts, and for/work-items:measure-deliveryto report the revert rate per risk level. measure-delivery reads only git history ("no tracker or forge call is made"), so where the result is stored decides whether the join needs any forge reads.Prerequisite, found during the replay. measure-delivery counts a revert only from a
This reverts commit <sha>line or aRevert "<subject>"subject. All 13 revert commits on main since 2026-10-04 use the Conventional Commits formrevert(<scope>): …and carry neither. Today it would report 0 reverts for this repository, whatever was recorded. It needs to recognizerevert(<scope>):commits, and the lane revert records that the post-merge demotion alert files.Options for where the result is written:
Merge-Risk:line in the squash commit message (recommended).Merge-Risk: max=<level> demote=<bool> head=<sha> rubric=<plugin version> rater=<model> checker=<model>.babysit-merge-pin) with the same fields.Recommendation: option 1, plus the measure-delivery revert-detection fix above. Basis: measure-delivery is the named consumer, and its signal reads only git; option 1 is the only one that keeps that true.
Q57: wire
demoteinto a merge gate?/review:merge-riskreport-only.Also found (outside this issue's scope)
5ccfd16eat 13:52Z.pr-unblock/address-feedbackpusheda62fcbb5at 13:55Z, with noauto_merge_disabledevent.a62fcbb5at 14:06Z.ci-statusand both review lanes passed ona62fcbb5. The arming step's own checks ran only on5ccfd16e.Lane-Activity:. Which model theopusalias resolved to on each run is visible only in the run log, so the recording line should name the model ID.No gate change lands under this issue.
kyle-sexton commentedon Nov 6, 2026
Owner decision Q57 (2026-11-05, in session, verbatim: "Go w/ recommenadtions").
demoteis not wired into any merge gate. Ratings are recorded first, and Q57 comes back once revert rates per risk level can be measured.All five criteria are met: the replay covered 674 of 674 merges (criterion 1), the per-PR table and both checker arms are in the results comment above (criteria 2 and 3), the counts are there too (criterion 4), and the recording design plus the Q57 recommendation went to the owner and were decided (criterion 5). No gate change landed under this issue.
The follow-up work is filed:
/work-items:measure-deliverycountsrevert(<scope>):commits, so a revert rate can be measured at all.Merge-Risk:line in the squash commit (the recommended option 1 above), report-only.Closing as completed.