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: