Skip to content

fix(pr-pipeline): align every needs-human path with the owner stop rule #10517

Open
0 of 6 issues completed
Open

Description

@kyle-sexton

Refs: #10516

Problem

#10516 records the owner's stop rule in one place (docs/conventions/loop-lane/README.md, "When work stops for the owner"): work stops for the owner only for an intent/vision change, an implementation finding that alters intent or the primary design, or a HIGH/CRITICAL security issue; any other hand-off is a defect. Its inventory found code paths that still hand work to a person for other reasons. Each needs a decision: align it, or record why it is a trust control the rule keeps.

Paths found (from the #10516 inventory)

  • Cost holds: intake triage's COST rule (cost flag + needs-human) and merge-holds.mjs costHold as a person reason in enable-auto-merge and babysit_risk.person_reasons (in progress: poteto's fix/cost-hold-real-charges-only).
  • babysit_risk.person_reasons escalates only a CRITICAL security finding; the rule says HIGH or CRITICAL.
  • Other person_reasons: a high path (floor, denied or aliasing path), a trusted-actor widening, a file listing too long to check.
  • The issue lane's research-first, probe-first and split-required skips add needs-human.
  • work-resolve-issue/report-outcome.mjs hands patch escalations (patch-protected-path, patch-invalid, the other PATCH_REASONS) to a person.
  • Post-merge demotion, post-merge-failure and suite-quarantine issues are labelled needs-human.
  • A failed red-main auto-revert guard labels the draft revert PR needs-human.
  • Review rounds hand off on "Unsure: escalate", on a claude[bot] finding with no lane footer, and on feedback-not-converging.
  • Five escalation classes in plugins/autonomy/reference/guardrails.md#escalation that loop-lane §2 still requires (gate-failure, verification-divergence, admission-rejection, demotion, structural-plan-approval).
  • verify:repeated-fail and verify:too-old carry no label but never clear, so such a PR never merges unattended.
  • Intake sends text addressed to the triage run (an injection attempt) to a person: a trust control, but not one of the three reasons as written.

Kept as owner-held security controls: the untrusted-provenance hold and verify:untrusted-spec.

Acceptance criteria

  • Each path above either routes to a lane (no needs-human) or is named in the "When work stops for the owner" section as a kept trust control, with its reason.
  • A test or check per changed path shows the new routing.
  • No HIGH/CRITICAL security path is loosened without a security-review pass at the head.

Activity

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

    @github-actions
    Contributor

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

    Size: Large
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: this issue aligns the remaining needs-human paths in the PR pipeline with the owner stop rule recorded in #10516. Each path either routes to a lane or is named as a kept trust control. The earlier re-triage comment already settles the open questions, so none remain.

    The work spans several subsystems: babysit risk, issue-lane skips, post-merge and revert routing, review rounds, guardrails, and intake charge words. It is Large and needs the split into sub-issues (a) to (f) that the re-triage comment lists. Any slice that touches a person_reasons or hold path needs a security-review pass at its head.

    No duplicate found.

    Automated triage, applied by the lanes App.

  3. melodic-automation-lanes commented on Oct 27, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  4. added
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 27, 2026
  5. melodic-automation-lanes commented on Oct 27, 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: Each of the eleven needs-human paths is either routed to a lane or named as a kept trust control in the owner stop rule section, with a routing test per changed path.

    Dependencies

    • #​10516: the 'When work stops for the owner' section in docs/conventions/loop-lane/README.md is not in the checkout yet, so there is no recorded rule to align to or to add kept controls to
    • #​10076: re-running review lanes on lane-source-changed overlaps the review-round hand-off path

    Related work

    Open questions

    1. Is this one issue, or should it be split into one issue per subsystem (cost holds, babysit_risk person_reasons, issue-lane skips, report-outcome patch escalations, post-merge/red-main issues, review rounds, guardrails escalation classes, verify:repeated-fail/too-old, intake injection hold)?
      RECOMMENDED: Split by subsystem; the single issue is Large/High with eleven independent decisions and an acceptance test per path. Basis: judgment
    2. Should babysit_risk.person_reasons escalate HIGH as well as CRITICAL security findings?
      RECOMMENDED: Yes, as the stop rule says HIGH/CRITICAL; the change needs a security-review pass at the head per the acceptance criteria. Basis: docs/conventions/pr-pipeline/README.md:1090
    3. Which paths are kept trust controls rather than routed: the intake injection-attempt hold, and the high-path, trusted-actor-widening and file-listing-too-long person_reasons?
      RECOMMENDED: Keep the injection hold and the high-path/trusted-actor-widening reasons as named trust controls; route the too-long file listing to a lane (retry or chunked check). Basis: judgment
    4. For the cost holds, does this issue wait for poteto's fix/cost-hold-real-charges-only work, or take the cost item over?
      RECOMMENDED: Wait for that branch and exclude the cost item here until it merges. Basis: judgment
    5. Where should the five guardrails.md escalation classes and verify:repeated-fail/too-old go: a lane route, or an amended loop-lane §2?
      RECOMMENDED: Route each to a lane and amend loop-lane §2 and guardrails.md#escalation to match, once #​10516 lands. Basis: judgment

    Sources read

    • /home/runner/work/_temp/refine-data/context.json: issue body, intake triage and candidates
    • docs/conventions/pr-pipeline/README.md:1090: babysit_risk.person_reasons lists a CRITICAL security finding, a high path and other person reasons
    • plugins/source-control/skills/babysit-prs/scripts/tests/test_babysit_risk.py:1518: existing test for person_reasons
    • docs/conventions/loop-lane/README.md: no 'When work stops for the owner' section found in the checkout

    To answer, post a comment that starts with this line:

    **Decision recorded.** <answer>
    

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

  6. kyle-sexton commented on Oct 29, 2026

    @kyle-sexton
    MemberAuthor

    Re-triage. No owner stop applies. The owner's rule is already recorded (#10516, merge 73c26fab6e, docs/conventions/loop-lane/README.md:316-345), and this issue aligns code to it. No path below is loosened. Each security control is kept and named, which the rule allows: "Trust holds (untrusted provenance, an untrusted spec) are security controls the owner keeps" (:345). The open questions are decided below on the code at origin/main 1ac46f037a.

    1. Which paths are kept as named trust controls?
      Decided: these are kept, unchanged, and named in "When work stops for the owner" with their reason:

      • the intake injection-attempt hold (text addressed to the triage run)
      • the person_reasons high path (floor, denied or aliasing path)
      • trusted-actor widening
      • the too-long file listing (an unchecked listing is an unjudged security surface)
      • the untrusted-provenance hold
      • verify:untrusted-spec

      Basis: rule 6 of this range keeps a security control's loosening with the owner, and keeping one needs no decision. Open PR feat(pr-pipeline): let a trusted author's gate-path PR clear on a passed security review #10708 changes the gate-path hold for trusted authors. That is its own change, outside this issue.

    2. Should babysit_risk.person_reasons escalate HIGH as well as CRITICAL?
      Decided: yes. Basis: docs/conventions/loop-lane/README.md:330 names "A HIGH or CRITICAL security issue", and fix(review): rate a security finding HIGH or CRITICAL only on a demonstrated exploitable path #10484 (merged) rates HIGH only on a demonstrated exploitable path. This tightens, so per this issue's third criterion it needs a security-review pass at the head.

    3. The cost holds?
      Decided: fix(babysit-prs): hold cost only for a real new charge #10525 (merge f9c2695c71, "hold cost only for a real new charge") aligned babysit's cost-review-required. Two cost paths remain, and both hold only for a charge README:331 names: intake admission's charge words, and pr-merge costHold. Intake admission's charge words (plugins/work-items/scripts/charge-words.json, cost pattern) still match a bare subscription, and model usage under the Claude subscriptions is not cost (README:337-339). That match held test(developer-experience): run the plugin-eval suite on the eval dispatch lane and record the delta #10005 for its "subscription login" wording.

    4. The operational paths?
      Decided: route each to its lane, with no needs-human:

      • issue-lane research-first, probe-first and split-required skips: back to intake for refine or split
      • report-outcome.mjs patch escalations: patch-protected-path goes to a builder record
      • post-merge demotion, post-merge-failure and suite-quarantine issues: to the issue lane at status: ready
      • the red-main auto-revert guard failure: to pr-unblock
      • review-round hand-offs ("Unsure: escalate", an unfootered claude[bot] finding, feedback-not-converging): to pr-verify's round cap, which README:329 already names as the implementation-finding stop
      • verify:repeated-fail and verify:too-old: they get a clearing path
      • the five guardrails.md#escalation classes: amend loop-lane §2 and plugins/autonomy/reference/guardrails.md#escalation to match. structural-plan-approval stops only when the plan changes intent or the primary design.

      Basis: README:342, "Any other stop is a defect to fix, not a reason to ask me". Each target lane is judgment from the file the body names for the path.

    5. One issue or many?
      Decided: split by subsystem before a run picks it up (owner Q93): (a) babysit person_reasons HIGH + kept-control naming; (b) issue-lane skips and report-outcome.mjs escalations; (c) post-merge demotion, failure, quarantine and red-main revert; (d) review-round hand-offs; (e) guardrails escalation classes, loop-lane §2 and verify:* clearing; (f) intake charge words and pr-merge costHold. A slice whose change lands under .github/workflows/** goes to the Automation Lanes builder, since the lanes App cannot push it (.github/actions/resolve-config/patch-rules.json:3).

    Acceptance criteria:

    • Each path in the body either routes to a lane with no needs-human, or is named in docs/conventions/loop-lane/README.md "When work stops for the owner" as a kept trust control with its reason, as decisions 1 and 4 assign.
    • Intake admission's charge words and pr-merge costHold hold only for a charge that README:331 names. A test shows that text naming model usage on the subscription login (for example "runs on the subscription login") is not held, and that a plan or seat change, or a paid subscription purchase, still is.
    • babysit_risk.person_reasons escalates a HIGH or CRITICAL security finding, and test_babysit_risk.py covers both.
    • Each changed path has a test or check showing the new routing.
    • No kept trust control in decision 1 changes behavior. Each has a test showing it still stops for a person.
    • A security-review pass ran at the head of every PR that touches a person_reasons or hold path.
  7. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    and removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Oct 29, 2026
  8. melodic-automation-lanes commented on Oct 29, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: Size large: the split into sub-issues at intake is pending (owner Q93).

  9. melodic-automation-lanes commented on Oct 29, 2026

    @melodic-automation-lanes
    Contributor

    Split at intake (owner Q93). This issue is Size Large, so its done-when is split into 6 sub-issues, each holding its task-list lines as written.

    Automated split by the lanes App. Admission waits on this issue while a sub-issue is open; work-unblock closes it as completed once every sub-issue is closed by a merge or a listed human.

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: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Type

    Fields

    No fields configured for Task.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions