Skip to content

chore(pr-pipeline): turn off the agent App trust-path and exempt-author path holds - #11068

Merged
kyle-sexton merged 14 commits into
mainfrom
chore/drop-path-holds
Oct 30, 2026
Merged

kyle-sexton merged 14 commits into
mainfrom
chore/drop-path-holds

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

No related issue: owner decision Q21 (2026-10-29), path holds off until issues and PRs reach zero

Summary

The owner decided, in session on 2026-10-29: "I want no paths to start so things just go through... we can harden once we get our issues to 0 and PRs to 0". The owner also decided (Q24 (b), "Do B") to drop the exempt-author path hold for the release App and the standards-sync App and keep it for Dependabot, which is third-party supply chain.

This PR turns off two ci-status path holds. It changes config only and keeps each mechanism:

  1. The agent App trust-path hold. This covers both ci-status's inline App hold and ci-workflows' pr-require-checks-trust-paths.
  2. The exempt-author path hold. It held Dependabot, release-App and standards-sync-App pull requests that changed a trust-gate path.

Not in this PR: the hold floor's person hold in merge-holds.mjs and babysit_risk. #11058 turns that off behind merge.diff-check.path-holds.

Fix

Commit 1: trust-path hold

  • docs/conventions/pr-pipeline.yaml: merge.trust-path-hold-apps now lists only trust-path-hold-off[bot], a login no App holds, in place of melodic-agent[bot].
  • .github/trust-path-hold.json is regenerated from that key by scripts/sync-hold-floor.py.
  • Why a placeholder and not an empty list: ci-workflows' check-trust-paths/check.cjs (parseConfig, at v0.67.0, v0.67.1 and v0.67.2) throws on an empty apps. Its fallback step then posts a failing ci-status on every pull request. The generator also refuses an empty list.
  • To restore: list melodic-agent[bot] again.

Commit 2: exempt-author hold

  • scripts/sync-hold-floor.py always writes the hardened hold_patterns. While merge.diff-check.path-holds is absent or false it also writes [ "$AUTHOR_ID" = 49699333 ] || hold_patterns=(), so only Dependabot (49699333) stays held on a trust-gate path; the release and standards-sync Apps pass.
  • This repository sets the key false. The pr-pipeline.yaml and schema lines are byte-identical to the ones feat(pr-pipeline): turn path-based merge holds off behind one switch (owner Q15) #11058 adds, so the two merge cleanly.
  • One switch now turns off every path hold, and setting it true restores this one.
  • These authors still get no review lane. With this hold off, their pull requests merge on the remaining ci-status checks alone.

Unchanged:

  • both review lanes, with their scrutiny hold-paths;
  • every other ci-status check;
  • gitleaks and do-not-merge;
  • the trusted-actor widening and cost holds;
  • the breaker and the kill switch.

Tests:

  • test_merge_holds_sync.py:
    • checks the hardened hold_patterns exactly as the generator writes them with the switch on;
    • checks that the committed workflow list follows the switch;
    • checks that the trust-path apps list is non-empty and comes from the pipeline config.
  • ci-review-lanes.test.sh:
    • runs the exempt-author and App-hold cases against the hardened list, so restoring the hold is already tested;
    • adds cases showing the committed step holds Dependabot and lets the release and standards-sync Apps through on a trust-gate path while the switch is off;
    • expects the repository's own config to hold no App.

Verification

  • python3 -I scripts/sync-hold-floor.py --check: exit 0.
  • test_merge_holds_sync.py: 21 tests OK.
  • babysit-prs Python suite: 3555 tests OK (14 skipped, same as main).
  • scripts/ci-review-lanes.test.sh: PASS=153 FAIL=0.
  • scripts/ci-lanes-pr-hold.test.sh: PASS=243 FAIL=0.
  • scripts/ci-early-queue-holds.test.sh: PASS=28 FAIL=0.
  • scripts/ci-hold-human-gated.test.sh: PASS=56 FAIL=0.
  • scripts/check-convention-yaml.test.sh: PASS=45 FAIL=0.
  • node --test on merge-holds, enable-auto-merge and clear-escalations: all pass.
  • scripts/check-changelog-fragments.sh --check and --check-required origin/main: pass.

Related

  • Owner decisions Q15/Q21, recorded in the hub's owner-decisions ledger for 2026-10-29.
  • #11058 adds the same merge.diff-check.path-holds key and turns off the floor and merge-gate path holds.
  • The same trust-path change is going to pr-pipeline-sandbox, standards, claude-code-account-rotation, medley and dotfiles.
  • Already-held pull requests: ci-status reads pr-pipeline.yaml and its step at the pull request's base, so an open pull request clears once main (with this change) is merged into it. The shared trust-path hold (v0.67.2) reads the default branch at the triggering event, so a new event (edit, push, reopen) clears it.
  • An exempt author's pull request still fails closed when GitHub lists fewer files than its changed_files (step code, unchanged).

🤖 Generated with Claude Code

kyle-sexton and others added 4 commits October 29, 2026 16:52
Owner decision Q21 (2026-10-29): no path holds until open issues and
pull requests reach zero. merge.trust-path-hold-apps now names only
trust-path-hold-off[bot], a login no App holds, so ci-status's inline
App hold and ci-workflows' pr-require-checks-trust-paths (through the
regenerated .github/trust-path-hold.json) hold nothing. The list keeps
one entry because the shared workflow fails on an empty one; listing
melodic-agent[bot] again restores the hold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…holds

Owner decision Q21 (2026-10-29): no path holds for any author,
Dependabot included, until open issues and pull requests reach zero.
scripts/sync-hold-floor.py now writes ci-status's exempt-author
hold_patterns only while merge.diff-check.path-holds is true, and an
empty list otherwise. This repository sets the key false, with the same
pr-pipeline.yaml and schema lines #11058 adds, so a Dependabot,
release-App or standards-sync-App pull request is no longer held for
changing a trust-gate path. Setting the key true restores the hold.

The tests now check the hardened list as the generator writes it with
the switch on, run the exempt-author cases against it, and check that
the committed step holds no exempt author while the switch is off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-29T22:04:14.025922Z c0e2451 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c0e2451f4e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/conventions/pr-pipeline.yaml Resolved

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on c0e2451f4e2abf74e32f84e066b97f786e4ff483; the summary is in this lane's pull request comment.

claude-lane: claude-review

Comment thread docs/conventions/pr-pipeline.yaml Resolved
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 6ade21d6cb284f514cef5114069bc952d130eb7f: 0 finding(s), 0 as inline comments.

No findings on this change. I read the whole diff and the PR context, and I did not run any tests or scripts.

The change does what the description says:

  • Trust-path hold: merge.trust-path-hold-apps is now the placeholder login trust-path-hold-off[bot], and .github/trust-path-hold.json matches it. The placeholder is non-empty, which the shared ci-workflows check needs. A login no App holds can only make the hold narrower, never wider.
  • Exempt-author hold: scripts/sync-hold-floor.py writes a guard line after hold_patterns: [ "$AUTHOR_ID" = 49699333 ] || hold_patterns=(). It runs only while merge.diff-check.path-holds is false, and docs/conventions/pr-pipeline.yaml already sets that key false (line 1125). The guard is safe under bash -e because the || list does not abort the step. The AUTHOR_ID it compares comes from the workflow's author-id input, not from PR content.
  • Existing tests keep working: the guard line starts with [, so the existing ^ *(hold_patterns=\(.*\))$ regexes still match only the real list. sync-hold-floor.py has a __main__ guard, so loading it from the test with importlib is safe. Any is already imported in the test file.
  • Test coverage: the new tests cover both switch states. The path-holds-on case runs against a regenerated hardened list. The committed-step case runs against body.live.sh, where Dependabot is held and the release and standards-sync Apps pass.
  • Changelog fragments: bump: patch for pr-pipeline and bump: none for the test-only source-control change match the change.

Behaviour to know about: this is a deliberate loosening of security gating, made by an owner decision (Q21/Q24). Release-App and standards-sync-App pull requests that change trust-gate paths, such as CODEOWNERS, .github/actions/resolve-config/** and the merge scripts, now merge with no path hold and no review lane. A Dependabot pull request is still held. I did not raise it as a hold because the PR records the decision and the change can be undone through config and the generator.

Spend: this change adds no paid or prepaid spend.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-security-review: 2 inline finding(s) on c0e2451f4e2abf74e32f84e066b97f786e4ff483; the summary is in this lane's pull request comment.

claude-lane: claude-security-review

Comment thread docs/conventions/pr-pipeline.yaml Resolved
Comment thread .github/workflows/pr-require-checks.yml Resolved
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 6ade21d6cb284f514cef5114069bc952d130eb7f: 0 finding(s), 0 as inline comments.

No security findings. I read the diff and the PR context file only; I did not run the tests or the generator.

What changed. merge.trust-path-hold-apps and .github/trust-path-hold.json now list only trust-path-hold-off[bot] in place of melodic-agent[bot]. scripts/sync-hold-floor.py now writes a guard after ci-status's hold_patterns: while merge.diff-check.path-holds is false, [ "$AUTHOR_ID" = 49699333 ] || hold_patterns=() empties the list for every author except Dependabot. The rest is a schema change (minItems: 1), docs, a changelog fragment and tests.

Removed holds (no finding, per the owner's throughput-phase threat model).

  • The agent-App trust-path hold is off. It is a named friction hold, a trust-path hold.
  • The release-App and standards-sync-App exempt-author path hold on trust-gate paths is off. It is a path hold and a bot-author hold. These authors' PRs that change a trust-gate path now merge on the remaining ci-status checks alone, with no review lane. Dependabot stays held.

What I checked that the change does not weaken.

  • The Dependabot guard keys on the numeric author ID 49699333, not a login. The tests assert that ID matches dependabot[bot] in trusted-actors.json.
  • The trusted-actor list is unchanged. The diff touches no token scope or kill switch, and nothing it changes widens who is trusted or what untrusted text reaches a credentialed lane.
  • Both review lanes, the other ci-status checks, gitleaks, do-not-merge, and the cost and trusted-actor-widening holds are outside the diff.
  • Restoring the holds is not prevented. The mechanisms stay, and the key and the list restore them.

No plugin manifest changed. manifest <field>: no items hit.

Spend: none. No model, schedule or billing change.

critical-findings: 0

kyle-sexton and others added 2 commits October 29, 2026 18:24
…holds on

Restoring both trust-path holds takes two steps: list melodic-agent[bot] in
merge.trust-path-hold-apps and set merge.diff-check.path-holds true. The App
alone restores only ci-workflows' hold. The path-holds description now also
names ci-status's exempt-author and App holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	docs/conventions/pr-pipeline.yaml
#	docs/conventions/pr-pipeline/pr-pipeline.schema.json

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-security-review: 1 inline finding(s) on 09700b813774e4c0f10f2c5724bc02e342985f89; the summary is in this lane's pull request comment.

claude-lane: claude-security-review

Comment thread docs/conventions/pr-pipeline.yaml Resolved
@github-actions github-actions Bot added the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

claude-security-review holds this pull request for a person (critical-security) at 09700b813774e4c0f10f2c5724bc02e342985f89.

The PR turns off ci-status's exempt-author trust-gate path hold (.github/workflows/pr-require-checks.yml:4881) and the agent App trust-path hold (docs/conventions/pr-pipeline.yaml:963 and .github/trust-path-hold.json). Dependabot, release-App and standards-sync-App PRs, which get no review lane, can then change trust-gate files and merge without a person. Agent App PRs can edit their own review callers. I found no remaining control that blocks either path, so both are CRITICAL trust-control widenings. The PR cites owner decision Q21, but that is PR text, so a person should confirm.

claude-lane: claude-security-review

…h path holds off

Owner decision Q24 (b), 2026-10-29: with merge.diff-check.path-holds
false, ci-status drops the exempt-author trust-path hold for the release
App and the standards-sync App but keeps it for Dependabot, whose
action-pin bumps in .github/workflows bring in third-party code.

scripts/sync-hold-floor.py now always writes the hardened hold_patterns
list and, while path-holds is false, a guard line after it that empties
the list for every author but Dependabot (DEPENDABOT_ID, the
trusted-actors.json id). The agent App hold, which shares held_paths,
stays off as before. Setting path-holds true drops the guard and holds
all three exempt authors again.

The tests check the guard follows the switch and names trusted-actors'
Dependabot id, that the committed step holds a Dependabot pull request on
CODEOWNERS, request-lane-token or .gitmodules while both Apps pass and
an App-authored trust-gate change is not held, and that with path-holds
true all three exempt authors are held. The docs and changelog fragments
that said Dependabot is no longer held now say it is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kyle-sexton kyle-sexton removed the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on 64965dd443d993d2cd9f009fbe38b6aabd31885e; the summary is in this lane's pull request comment.

claude-lane: claude-review

Comment thread scripts/sync-hold-floor.py Resolved

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-security-review: 1 inline finding(s) on 64965dd443d993d2cd9f009fbe38b6aabd31885e; the summary is in this lane's pull request comment.

claude-lane: claude-security-review

Comment thread .github/workflows/pr-require-checks.yml Resolved
@github-actions github-actions Bot added the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

claude-security-review holds this pull request for a person (critical-security) at 64965dd443d993d2cd9f009fbe38b6aabd31885e.

CRITICAL trust-control weakening: .github/workflows/pr-require-checks.yml:4962 and docs/conventions/pr-pipeline.yaml (merge.trust-path-hold-apps) turn off ci-status's holds on trust-gate path changes by melodic-agent[bot], the release App and the standards-sync App. A head that rewrites a review caller can forge the review evidence, and I found no remaining gate. The refute pass returned no result, so the finding stays CRITICAL and unsettled.

claude-lane: claude-security-review

@kyle-sexton
kyle-sexton enabled auto-merge October 30, 2026 00:52
@kyle-sexton kyle-sexton removed the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

The pr-verify verifier failed head 64965dd443d993d2cd9f009fbe38b6aabd31885e. What it wrote, as data:

What it wrote (28 lines)
Summary: No issue is linked, so the spec is PR #11068's own title and body. It asks to turn off two
  holds: the agent App trust-path hold, and the exempt-author path hold "for every author,
  Dependabot included". It also says that with `path-holds` absent or false, `hold_patterns=()` is
  written. The App trust-path change is delivered correctly. The exempt-author change is not what
  the spec asks for: the generator writes a guard that keeps Dependabot held, citing owner decision
  Q24. That decision appears only in a PR review comment and the diff's own docs, not in the spec
  text. The deviation is stricter, not looser, and the code is correct. But the diff contradicts an
  explicit spec requirement, and the PR body misdescribes what merges. Either the body or the code
  has to change before this can pass.
- scripts/sync-hold-floor.py:432: the spec (PR body) says the owner dropped the exempt-author hold
  "for every author, Dependabot included" and that false writes `hold_patterns=()`. The diff writes
  `[ "$AUTHOR_ID" = 49699333 ] || hold_patterns=()`, so Dependabot stays held. Fix: update the PR
  body to state the Q24 Dependabot exception, which is the conservative choice already documented in
  the changelog, README and schema. Or, if Q24 does not apply, drop the guard and write
  `hold_patterns=()`.
- PR body 'Commit 2' and 'Tests' sections: they say an exempt author gets through while the switch
  is off, and that this author set includes Dependabot. ci-review-lanes.test.sh actually asserts
  that Dependabot still fails with path-holds off. Make the body match the tests.
- .github/workflows/pr-require-checks.yml:4961: checked that the guard is correct. It sits inside
  the generated block, uses the step's AUTHOR_ID, is safe under `bash -e`, and with the list empty,
  an App-authored trust-gate change skips the App hold as intended.
- docs/conventions/pr-pipeline.yaml:966: the `trust-path-hold-off[bot]` placeholder turns off
  ci-workflows' shared App hold and the inline App hold for the release and standards-sync Apps.
  This intentionally loosens a review hold on our own actors. The spec asks for it, and none of the
  owner-kept holds (outside-org work, charges, caps) changes. A human should still confirm the
  intent before merge.
- No prompt-injection attempts found in the PR text or comments. The PR author's own review comments
  (accepted-risk notes, Q24) were treated as context, not as spec.

This pull request leaves the merge queue, and ci-status holds it out while it carries pr-verify-failed. A pr-verify pass at a new commit removes the label.

@github-actions github-actions Bot removed the pr-verify-failed pr-verify failed this head; a pass at a new commit removes it. label Oct 30, 2026
@kyle-sexton
kyle-sexton added this pull request to the merge queue Oct 30, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 30, 2026
@melodic-automation-lanes melodic-automation-lanes Bot added the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor

The pr-unblock lane stopped on this pull request and needs a person: a conflicted path is a workflow, submodule config or a settings file, which the lane does not resolve.

  • Reason: protected-path-conflict
  • Resume key: 261eb217451b3f12abc030a6a143e8010e7588cd (the head the lane stopped on)

To resume, deal with the reason above, remove the needs-human label (and do-not-merge, if set), then dispatch the pr-unblock workflow with pr-number=11068 and activity=resolve-conflicts:

gh workflow run pr-unblock.yml -R melodic-software/claude-code-plugins -f pr-number=11068 -f activity=resolve-conflicts

# Conflicts:
#	.github/workflows/pr-require-checks.yml
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor

The pr-unblock lane escalated this pull request as protected-path-conflict, and that no longer holds at 46f0ef5152ffa4f15a1df3093bcbbb3006a3fed4: GitHub reports no conflict with main. pr-merge removed needs-human, so the lanes run on it again. To keep a person on it, add needs-human back: a label a person adds is never removed.

@melodic-automation-lanes melodic-automation-lanes Bot removed the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026
@melodic-automation-lanes melodic-automation-lanes Bot added the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor

The pr-unblock lane stopped on this pull request and needs a person: a conflicted path is a workflow, submodule config or a settings file, which the lane does not resolve.

  • Reason: protected-path-conflict
  • Resume key: a4ef96e623a42c8f0d5bb8ed13695fbf69f4e025 (the head the lane stopped on)

To resume, deal with the reason above, remove the needs-human label (and do-not-merge, if set), then dispatch the pr-unblock workflow with pr-number=11068 and activity=resolve-conflicts:

gh workflow run pr-unblock.yml -R melodic-software/claude-code-plugins -f pr-number=11068 -f activity=resolve-conflicts

# Conflicts:
#	.github/workflows/pr-require-checks.yml
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor

The pr-unblock lane escalated this pull request as protected-path-conflict, and that no longer holds at 6ade21d6cb284f514cef5114069bc952d130eb7f: GitHub reports no conflict with main. pr-merge removed needs-human, so the lanes run on it again. To keep a person on it, add needs-human back: a label a person adds is never removed.

@melodic-automation-lanes melodic-automation-lanes Bot removed the needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. label Oct 30, 2026
@kyle-sexton
kyle-sexton added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 7966053 Oct 30, 2026
93 of 94 checks passed
@kyle-sexton
kyle-sexton deleted the chore/drop-path-holds branch October 30, 2026 07:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant