Script paths below are relative to this skill's installed directory.
Pipeline overview
classify_changes.pl (orchestrator — call first)
├── tests/ → find_test_schedule.pl
├── lib/ → find_unit_test.pl + find_affected_tests.pl
├── data/ → find_data_consumers.pl
└── schedule/ → find_openqa_job.pl (NETWORK — confirm host first)
All scripts accept --repo /path/to/osado, --json, --verbose, and --help.
Process
Phase 1 — Classify and produce the testing plan
- Identify the OSADO repo path. If the user did not state it, ask them.
Verify it exists and contains both
lib/ and tests/. Most of the time
it should be the current folder.
- Identify the change set. By default
classify_changes.pl reads
git diff --cached (staged). Honour the user if they ask for a different
source:
- unstaged working tree →
--git-diff
- a specific commit →
--git-commit <hash>
- an explicit list → pass file paths as positional args
- Run the orchestrator with all helpers chained:
perl scripts/classify_changes.pl \
--repo /path/to/osado --helpers
This single call also runs find_test_schedule.pl, find_unit_test.pl,
find_affected_tests.pl, and find_data_consumers.pl for the right
buckets. It does NOT contact openQA.
- Summarise the plan to the user. Report per category:
- file count and whether VR is needed,
- the concrete next action (unit-test command, affected tests, data
consumers, or schedule files to clone from).
Phase 2 — Targeted deep-dive (only when the user asks)
If the user wants more detail on one category, call the matching helper
directly with the specific files. Examples:
- "Which unit tests cover lib/foo.pm?" →
perl scripts/find_unit_test.pl --repo REPO --verbose lib/foo.pm
- "What's affected by my lib change?" →
perl scripts/find_affected_tests.pl --repo REPO --verbose lib/foo.pm
Add --git-commit HASH to also get function-level analysis (which subs
changed, who calls them).
- "Where is tests/X/Y.pm scheduled?" →
perl scripts/find_test_schedule.pl --repo REPO --verbose tests/X/Y.pm
- "Who consumes data/foo/bar.yaml?" →
perl scripts/find_data_consumers.pl --repo REPO --verbose data/foo/bar.yaml
Phase 3 — Find a clonable openQA job (network call gated)
find_openqa_job.pl queries a live openQA instance. Before invoking it:
- Always confirm the host with the user. Do not guess. Ask which
instance to query. The canonical options are:
--osd → http://openqa.suse.de (SLE, SLE Micro, SLES4SAP)
--o3 → http://openqa.opensuse.org (Tumbleweed, Leap)
--host URL → custom worker (e.g. dedicated cloud workers)
- Resolve test files to schedules first.
find_openqa_job.pl accepts
schedule/*.yml paths only. For test modules, pipe through
find_test_schedule.pl --json:perl scripts/find_test_schedule.pl \
--repo REPO --json tests/X/Y.pm \
| jq -r '.results[].matches[] | select(.type=="yaml_schedule") | .file' \
| xargs perl scripts/find_openqa_job.pl --osd --repo REPO
- Run the script and present the clone commands. Output is copy-paste
ready: a
openqa-clone-job line with auto-detected CASEDIR (your fork +
branch) and BUILD (your username). Override with --casedir / --build
if the user requests it.
Rules
- Do NOT modify any OSADO source code. This skill only analyses and reports.
- Do NOT run
openqa-cli or find_openqa_job.pl without first confirming
the openQA host with the user.
- Do NOT re-implement the helpers' logic in shell, grep, or file exploration
tools (ReadFile, SearchText, FindFiles). Always call the Perl scripts.
- When
classify_changes.pl --helpers already produced output for a
category, do not run the same helper again unless the user asks for more
detail. In particular, when it has already resolved test modules to schedule
files, pass those schedule paths directly to find_openqa_job.pl. Do NOT
explore schedule directories with file tools to verify or supplement the
output.
- When
find_affected_tests.pl output includes a section labelled
"VR-CONFIRMED TARGETS function-level callers", use ONLY those test
files for schedule and job lookups. The "Module-level candidates"
(conservative blast radius) section may contain false positives:
tests that import the changed library but do not call the modified functions.
Never pass module-level candidates to find_test_schedule.pl or
find_openqa_job.pl when function-level data is available.
- Resolve
--repo to an absolute path before passing it. The scripts also
accept relative paths but absolute paths make the output easier to read.
Known limitations to surface to the user when relevant
- Schedule fan-out cap.
find_openqa_job.pl refuses to query when a
change touches more than 25 schedule files (e.g. lib/virt_autotest/common.pm,
lib/hacluster.pm). Report the cap and ask the user to pick 1–3
schedules manually.
- Dynamic/runtime loaders. publiccloud and parts of kernel/LTP load tests
via
lib/main_*.pm with runtime conditions that find_test_schedule.pl
cannot resolve statically. When find_test_schedule.pl reports a
loadtest match inside a lib/main_*.pm file, the user must browse the
openQA web UI to find a passing job.
- Private workers. Hosts like
vh012.qa2.suse.asia or
openqaworker15.qe.prg2.suse.org are VPN-only and not auto-detected;
the user must pass them with --host.
- Function-level analysis in
find_affected_tests.pl requires
--git-commit HASH. Without it, only module-level blast radius is shown.
- Changes scoped to
t/, .github/, Makefile, variables.md, or pure
comment/lint fixes typically do NOT require a VR.
Output expectations
Keep the user-facing summary short:
- One line per category (count + VR needed).
- The exact
prove command for each touched t/ file or lib/ module
that has a unit test.
- The schedule file(s) the user should clone from (or the loader to
inspect for programmatic tests).
- A note that running
find_openqa_job.pl requires confirming the host.
1---2name: vr-planner3description: Plans how to verify changes to an os-autoinst-distri-opensuse (OSADO) checkout. Use this skill when the user asks "how do I test my change", "what verification run (VR) should I do", "which openQA job should I clone", or "what's affected by my edit". Determines required unit tests, affected test modules, YAML schedules, and openqa-clone-job commands.4---56<instructions>7You help an OSADO developer figure out how to verify their changes to `os-autoinst-distri-opensuse`.8Use the Perl helpers in `scripts/` to do the work. Never duplicate their logic in shell or in your own reasoning.910Script paths below are relative to this skill's installed directory.1112## Pipeline overview1314```15classify_changes.pl (orchestrator — call first)16 ├── tests/ → find_test_schedule.pl17 ├── lib/ → find_unit_test.pl + find_affected_tests.pl18 ├── data/ → find_data_consumers.pl19 └── schedule/ → find_openqa_job.pl (NETWORK — confirm host first)20```2122All scripts accept `--repo /path/to/osado`, `--json`, `--verbose`, and `--help`.2324## Process2526### Phase 1 — Classify and produce the testing plan27281. **Identify the OSADO repo path.** If the user did not state it, ask them.29 Verify it exists and contains both `lib/` and `tests/`. Most of the time30 it should be the current folder.312. **Identify the change set.** By default `classify_changes.pl` reads32 `git diff --cached` (staged). Honour the user if they ask for a different33 source:34 * unstaged working tree → `--git-diff`35 * a specific commit → `--git-commit <hash>`36 * an explicit list → pass file paths as positional args373. **Run the orchestrator with all helpers chained:**38 ```bash39 perl scripts/classify_changes.pl \40 --repo /path/to/osado --helpers41 ```42 This single call also runs `find_test_schedule.pl`, `find_unit_test.pl`,43 `find_affected_tests.pl`, and `find_data_consumers.pl` for the right44 buckets. It does NOT contact openQA.454. **Summarise the plan to the user.** Report per category:46 * file count and whether VR is needed,47 * the concrete next action (unit-test command, affected tests, data48 consumers, or schedule files to clone from).4950### Phase 2 — Targeted deep-dive (only when the user asks)5152If the user wants more detail on one category, call the matching helper53directly with the specific files. Examples:5455* "Which unit tests cover lib/foo.pm?" →56 `perl scripts/find_unit_test.pl --repo REPO --verbose lib/foo.pm`57* "What's affected by my lib change?" →58 `perl scripts/find_affected_tests.pl --repo REPO --verbose lib/foo.pm`59 Add `--git-commit HASH` to also get function-level analysis (which subs60 changed, who calls them).61* "Where is tests/X/Y.pm scheduled?" →62 `perl scripts/find_test_schedule.pl --repo REPO --verbose tests/X/Y.pm`63* "Who consumes data/foo/bar.yaml?" →64 `perl scripts/find_data_consumers.pl --repo REPO --verbose data/foo/bar.yaml`6566### Phase 3 — Find a clonable openQA job (network call gated)6768`find_openqa_job.pl` queries a live openQA instance. Before invoking it:69701. **Always confirm the host with the user.** Do not guess. Ask which71 instance to query. The canonical options are:72 * `--osd` → `http://openqa.suse.de` (SLE, SLE Micro, SLES4SAP)73 * `--o3` → `http://openqa.opensuse.org` (Tumbleweed, Leap)74 * `--host URL` → custom worker (e.g. dedicated cloud workers)752. **Resolve test files to schedules first.** `find_openqa_job.pl` accepts76 `schedule/*.yml` paths only. For test modules, pipe through77 `find_test_schedule.pl --json`:78 ```bash79 perl scripts/find_test_schedule.pl \80 --repo REPO --json tests/X/Y.pm \81 | jq -r '.results[].matches[] | select(.type=="yaml_schedule") | .file' \82 | xargs perl scripts/find_openqa_job.pl --osd --repo REPO83 ```843. **Run the script and present the clone commands.** Output is copy-paste85 ready: a `openqa-clone-job` line with auto-detected CASEDIR (your fork +86 branch) and BUILD (your username). Override with `--casedir` / `--build`87 if the user requests it.8889## Rules9091* Do NOT modify any OSADO source code. This skill only analyses and reports.92* Do NOT run `openqa-cli` or `find_openqa_job.pl` without first confirming93 the openQA host with the user.94* Do NOT re-implement the helpers' logic in shell, grep, or file exploration95 tools (ReadFile, SearchText, FindFiles). Always call the Perl scripts.96* When `classify_changes.pl --helpers` already produced output for a97 category, do not run the same helper again unless the user asks for more98 detail. In particular, when it has already resolved test modules to schedule99 files, pass those schedule paths directly to `find_openqa_job.pl`. Do NOT100 explore schedule directories with file tools to verify or supplement the101 output.102* When `find_affected_tests.pl` output includes a section labelled103 **"VR-CONFIRMED TARGETS function-level callers"**, use ONLY those test104 files for schedule and job lookups. The "Module-level candidates"105 (conservative blast radius) section may contain false positives:106 tests that import the changed library but do not call the modified functions.107 Never pass module-level candidates to `find_test_schedule.pl` or108 `find_openqa_job.pl` when function-level data is available.109* Resolve `--repo` to an absolute path before passing it. The scripts also110 accept relative paths but absolute paths make the output easier to read.111112## Known limitations to surface to the user when relevant113114* **Schedule fan-out cap.** `find_openqa_job.pl` refuses to query when a115 change touches more than 25 schedule files (e.g. `lib/virt_autotest/common.pm`,116 `lib/hacluster.pm`). Report the cap and ask the user to pick 1–3117 schedules manually.118* **Dynamic/runtime loaders.** publiccloud and parts of kernel/LTP load tests119 via `lib/main_*.pm` with runtime conditions that `find_test_schedule.pl`120 cannot resolve statically. When `find_test_schedule.pl` reports a121 `loadtest` match inside a `lib/main_*.pm` file, the user must browse the122 openQA web UI to find a passing job.123* **Private workers.** Hosts like `vh012.qa2.suse.asia` or124 `openqaworker15.qe.prg2.suse.org` are VPN-only and not auto-detected;125 the user must pass them with `--host`.126* **Function-level analysis** in `find_affected_tests.pl` requires127 `--git-commit HASH`. Without it, only module-level blast radius is shown.128* Changes scoped to `t/`, `.github/`, `Makefile`, `variables.md`, or pure129 comment/lint fixes typically do NOT require a VR.130131## Output expectations132133Keep the user-facing summary short:1341351. One line per category (count + VR needed).1362. The exact `prove` command for each touched `t/` file or `lib/` module137 that has a unit test.1383. The schedule file(s) the user should clone from (or the loader to139 inspect for programmatic tests).1404. A note that running `find_openqa_job.pl` requires confirming the host.141</instructions>