Skip to content

chore(pr-pipeline): decide in the lanes audit whether lane run jobs keep sudo and docker #7791

Closed

Description

@kyle-sexton

Lane run jobs keep sudo and docker access since #7786. Owner decision (2026-10-17): "lanes keep Docker and sudo for now - we can come back and evaluate/update later (no friction right now)".

The residual risk is recorded in docs/conventions/pr-pipeline/pr-run-activity.md ("Runner memory, with root") and ADR 0055 item 6. With root, a skill turn or head code run in the skill's Bash can read runner memory (sudo cat /proc/<Runner.Worker pid>/mem, docker run -v /:/host --privileged), including CLAUDE_CODE_OAUTH_TOKEN, which the subprocess env scrub otherwise keeps out of Bash. Review thread on #7786: #7786 (comment)

Done when

  • The lanes audit decides, per lane, whether the run job keeps sudo and docker.
  • Options to weigh (from the review): drop root before the head checkout and the activity again, keeping it only for the steps that need it (bwrap/socat install, setup-env.sh, Playwright system libraries); or keep it only for lanes whose trigger gate admits trusted actors, with a check that fails a run that reads untrusted text while root is available.
  • The convention and ADR 0055 state the outcome.

🤖 Generated with Claude Code

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 17, 2026
  2. github-actions commented on Oct 17, 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: #7531

    Decision recorded.

    Question: Lane run jobs keep root since #7786. With root, a skill turn or head code that reads untrusted text could reach runner memory. Options: (a) keep parked until the lanes audit; (b) drop root before head checkout; (c) keep root only for lanes whose trigger admits trusted actors only.

    Owner's answer: (a) Your own words on 2026-10-17: "lanes keep Docker and sudo for now - we can come back and evaluate/update later (no friction right now)". The residual risk is recorded in docs/conventions/pr-pipeline/pr-run-activity.md and ADR 0055 item 6. The lanes audit is #7531 ("post-V1 audit and retro of the unattended merge flow", open). Basis: #7791 body quote.

    The owner accepted this recommendation as item D4 of a 21-decision batch in an attended backlog-shaping session on 2026-10-18. The batch question: "Accept all 21 batch 7 decisions, with my change to D13 (#6008 goes to the lane, but you merge its PR because it edits AGENTS.md)? I post a 'Decision recorded.' comment on each issue." The owner answered: "Accept, with my D13 change (Recommended)".

    Posted by AI from the owner's answer in that session.

    #7791 (comment)

    This decision settles the open questions: lanes keep sudo and docker until the lanes audit in #7531 decides per lane. This issue is therefore sequenced after that audit.

    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 17, 2026
  4. kyle-sexton commented on Oct 18, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded.

    Question: Lane run jobs keep root since #7786. With root, a skill turn or head code that reads untrusted text could reach runner memory. Options: (a) keep parked until the lanes audit; (b) drop root before head checkout; (c) keep root only for lanes whose trigger admits trusted actors only.

    Owner's answer: (a) Your own words on 2026-10-17: "lanes keep Docker and sudo for now - we can come back and evaluate/update later (no friction right now)". The residual risk is recorded in docs/conventions/pr-pipeline/pr-run-activity.md and ADR 0055 item 6. The lanes audit is #7531 ("post-V1 audit and retro of the unattended merge flow", open). Basis: #7791 body quote.

    The owner accepted this recommendation as item D4 of a 21-decision batch in an attended backlog-shaping session on 2026-10-18. The batch question: "Accept all 21 batch 7 decisions, with my change to D13 (#6008 goes to the lane, but you merge its PR because it edits AGENTS.md)? I post a 'Decision recorded.' comment on each issue." The owner answered: "Accept, with my D13 change (Recommended)".

    Posted by AI from the owner's answer in that session.

  5. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 25, 2026
  6. kyle-sexton commented on Oct 25, 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.

  7. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 25, 2026
  8. 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.
    on Oct 25, 2026
  9. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 25, 2026
  10. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: no trusted-human acceptance criteria: a listed human must put the confirmed - [ ] criteria in the body or post them as their own comment, or, on an issue a listed human filed, intake's newest refinement comment must hold them unedited. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

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

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: needs-decision; its comment says why.

  12. melodic-automation-lanes commented on Oct 25, 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: The lanes audit (#​7531) decides per lane whether run jobs keep sudo and docker, and pr-run-activity.md and ADR 0055 item 6 are updated to state that outcome.

    Dependencies

    • #​7531: the owner's recorded decision parks this until the lanes audit decides per lane.

    Related work

    Open questions

    1. The checkout contradicts the issue: the run jobs already call setup-runner-isolation, which makes the docker socket root-only and deletes the sudoers entry before head checkout, and the convention and ADR 0055 item 6 describe that. Does the issue's premise (lanes keep sudo and docker since #​7786) still hold?
      RECOMMENDED: Check whether #​7786's intent was reverted or only partly applied. Then rewrite the issue against the current state, or close it if root is already dropped everywhere. Basis: .github/actions/setup-runner-isolation/action.yml:43-51; docs/adr/0055-load-nothing-head-controlled-into-a-pipeline-skill-activity.md:70-72
    2. Is the per-lane sudo and docker decision a security call that waits for the owner and the audit in #​7531, or may an unattended run make it?
      RECOMMENDED: Keep it parked until #​7531 reports, as the recorded decision says; an unattended run must not choose it. Basis: Decision recorded comment 2026-10-18 and the 2026-10-24 rule that security calls stop for a person
    3. Which lanes does the audit cover, and which steps need root (bwrap/socat install, setup-env.sh, Playwright system libraries)?
      RECOMMENDED: List each lane workflow that uses setup-runner-isolation and give each a keep or drop verdict in a table in the convention. Basis: judgment

    Sources read

    • /home/runner/work/_temp/refine-data/context.json: owner decision parks this until #​7531; the 2026-10-24 comment released it for re-triage
    • docs/conventions/pr-pipeline/pr-run-activity.md:280-282: run job step 10 removes sudo and docker access and fails red if either still works
    • docs/conventions/pr-pipeline/pr-run-activity.md:1624-1626: the runner-memory risk is mitigated by removing root before head checkout
    • docs/adr/0055-load-nothing-head-controlled-into-a-pipeline-skill-activity.md:70-72: item 6 says no root in the head-code job
    • docs/adr/0055-load-nothing-head-controlled-into-a-pipeline-skill-activity.md:64-69: the run job installs bubblewrap and socat itself
    • /.github/actions/setup-runner-isolation/action.yml:43-51: makes the docker socket root-only and removes /etc/sudoers.d/runner
    • /.github/workflows/pr-run-activity-write.yml:1240: the write run job uses setup-runner-isolation

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

  13. kyle-sexton commented on Oct 25, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Issue Triage session (2026-10-25), accepting the recommended answers below:

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

    AND whatever is aligned with my overall goal of lowest friction, highest throughput (within our environmental, github, rate limit, etc. constraints)

    Question asked: Close #7791 as done, since lane run jobs already drop sudo and docker before the head checkout? (Security.)

    Already decided: #7791 (comment) (2026-10-18: (a) keep parked until the lanes audit in #7531)

    1. Security. The issue says lane run jobs keep sudo and docker since feat(pr-pipeline): install lane skill dependencies on demand #7786. origin/main contradicts that: setup-runner-isolation installs bubblewrap and socat with sudo, then makes the docker socket root-only, deletes the runner's sudoers entry, and fails red if either still works. Rewrite the issue or close it?
      Accepted: Close it as done. Main already does the body's first option (drop root before the head checkout, keeping it only for the steps that need it), and ADR 0055 item 6 and pr-run-activity.md already state it. Seven workflows call the action: eval-browser-dispatch, intake-triage, maintenance-audit-lane-runs, pr-run-activity-read, pr-run-activity-write, pr-unblock, pr-verify. Not checked: whether any other lane job runs head code without the action. Basis: .github/actions/setup-runner-isolation/action.yml:40-60, docs/adr/0055-load-nothing-head-controlled-into-a-pipeline-skill-activity.md:70-72, docs/conventions/pr-pipeline/pr-run-activity.md:280-282 and :1649-1650 on origin/main 4ab8989 (corrected: the refinement said rewrite or close; this says close).

    Closed as done. Main already meets both lines of the body's "Done when". Evidence on origin/main 4ab8989:

    • .github/actions/setup-runner-isolation/action.yml:40-60: installs bubblewrap and socat with sudo, makes the docker socket root-only, deletes the runner's sudoers entry, and fails red if either still works.
    • The action runs in eval-browser-dispatch, intake-triage, maintenance-audit-lane-runs, pr-run-activity-read, pr-run-activity-write, pr-unblock and pr-verify.
    • docs/adr/0055-load-nothing-head-controlled-into-a-pipeline-skill-activity.md:70-72 and docs/conventions/pr-pipeline/pr-run-activity.md:280-282, :1649-1650 state the outcome.
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: needs-decisionAwaiting a human or maintainer judgment call.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