From 77a3f58dcd9ea319fe6972b53536b32400b464a0 Mon Sep 17 00:00:00 2001
From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com>
Date: Wed, 4 Nov 2026 04:02:17 -0500
Subject: [PATCH 1/2] fix(ci): select the manifest-reading suites when a plugin
manifest changes
A change to plugins/
/.claude-plugin/plugin.json selected neither
lib/view-settings.test.sh nor scripts/check-data-root.test.sh. Both read
every plugin's manifest through a path built from parts, and the selector
maps manifests only through R1, R2 or a declared scope (R8). The merge
group for #13027 therefore skipped view-settings, and only the full main
run caught the break.
Both suites now declare `plugins/*/.claude-plugin/plugin.json` in a
`# test-scope:` header, as lib/prerequisites.test.sh already does.
check-data-root also declares `plugins/*/README.md`, which it reads the
same way. scripts/affected-tests-live.sh pins both selections.
Co-Authored-By: Claude Opus 5.5
---
lib/view-settings.test.sh | 1 +
scripts/affected-tests-live.sh | 3 +++
scripts/check-data-root.test.sh | 1 +
3 files changed, 5 insertions(+)
diff --git a/lib/view-settings.test.sh b/lib/view-settings.test.sh
index a8a973da2c8..4e67b8d8e1b 100755
--- a/lib/view-settings.test.sh
+++ b/lib/view-settings.test.sh
@@ -1,4 +1,5 @@
#!/usr/bin/env bash
# Owns view-settings.test.mjs; run-plugin-tests.sh discovers only .test.sh files.
+# test-scope: plugins/*/.claude-plugin/plugin.json
set -euo pipefail
exec node --test "$(dirname "${BASH_SOURCE[0]}")/view-settings.test.mjs"
diff --git a/scripts/affected-tests-live.sh b/scripts/affected-tests-live.sh
index c966cfaa090..b38e4e25638 100755
--- a/scripts/affected-tests-live.sh
+++ b/scripts/affected-tests-live.sh
@@ -255,6 +255,9 @@ read_pairs=(
"plugins/biome-format/hooks/biome-format-end-of-turn.test.sh|plugins/biome-format/hooks/exec-bash.mjs"
"plugins/code-metrics/skills/audit/scripts/audit-complexity.test.sh|plugins/code-metrics/scripts/yaml_subset.py"
"plugins/instruction-placement/git-hooks/index-check.test.sh|plugins/instruction-placement/.claude-plugin/plugin.json"
+ # Suites that read every plugin's manifest through a path built from parts.
+ "lib/view-settings.test.sh|plugins/architecture/.claude-plugin/plugin.json"
+ "scripts/check-data-root.test.sh|plugins/architecture/.claude-plugin/plugin.json"
)
for fixture in events-v1 invalid-device-scope-on-prototype invalid-reaction-agree \
invalid-recommendation-on-choice state-full state-v7-live wire-heartbeat wire-presence; do
diff --git a/scripts/check-data-root.test.sh b/scripts/check-data-root.test.sh
index 7a587aed79b..3f312a9e01b 100755
--- a/scripts/check-data-root.test.sh
+++ b/scripts/check-data-root.test.sh
@@ -9,6 +9,7 @@
# Each case runs the real script against a fixture tree. This repository's own
# tree passes all four checks, so a script that ignored the variable would exit
# 0 on the failing fixture.
+# test-scope: plugins/*/.claude-plugin/plugin.json plugins/*/README.md
# shellcheck disable=SC2016
set -uo pipefail
From 3967e2f477c90a0af1481ecbff185f6d1609bf91 Mon Sep 17 00:00:00 2001
From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com>
Date: Wed, 4 Nov 2026 04:04:07 -0500
Subject: [PATCH 2/2] docs(ci): say a manifest change in a merge group is
scoped to its own diff
Co-Authored-By: Claude Opus 5.5
---
.github/workflows/pr-require-checks.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/pr-require-checks.yml b/.github/workflows/pr-require-checks.yml
index 9190a990f4d..e25f069ed23 100644
--- a/.github/workflows/pr-require-checks.yml
+++ b/.github/workflows/pr-require-checks.yml
@@ -1064,11 +1064,11 @@ jobs:
with:
filter: blob:none
# THE DIFF BASE, RESOLVED ONCE. A pull request diffs against its base
- # branch, and a merge group against the queue's base commit, unless its
- # diff touches a plugin or marketplace manifest, as a release does. A schedule
- # or dispatch run gets no base: the whole tree, the net for what a diff
- # cannot show. scripts/resolve-diff-base.sh holds the rules and logs why
- # it chose.
+ # branch, and a merge group against the queue's base commit, a release
+ # group included, so a manifest change selects only the suites that
+ # declare they read it (test-scope). A schedule or dispatch run gets no
+ # base: the whole tree, the net for what a diff cannot show.
+ # scripts/resolve-diff-base.sh holds the rules and logs why it chose.
- name: Resolve the diff base
id: base
env: