Skip to content

[issues/249] Defer QA version naming with "Unreleased" placeholder#605

Merged
couimet merged 8 commits into
mainfrom
issues/249-adopt_deferred_version_pattern
May 27, 2026
Merged

[issues/249] Defer QA version naming with "Unreleased" placeholder#605
couimet merged 8 commits into
mainfrom
issues/249-adopt_deferred_version_pattern

Conversation

@couimet
Copy link
Copy Markdown
Owner

@couimet couimet commented May 26, 2026

Summary

Adopts the CHANGELOG's [Unreleased] convention across QA tooling: nextTargetVersion now stays "Unreleased" during trunk-based development instead of pinning a SemVer that may change (e.g., the 1.1.0 → 2.0.0 pivot). The version is locked in only at release time via finalize-release (future PR). This eliminates mid-cycle file renames when version targets shift.

Changes

  • generate-qa-test-plan.sh — conditional output filename (qa-test-cases-unreleased.yaml vs qa-test-cases-vX.Y.Z.yaml), conditional header rendering, dropped file-exists early-exit so in-place header refresh works, fixed blank-line accumulation bug in the body extraction sed
  • generate-release-testing-instructions.sh — symmetric Unreleased support: conditional output filename and internal yaml references
  • resolve-qa-labels.js — loosened auto-discovery filter from qa-test-cases-v* to qa-test-cases-* so the unreleased file is selectable
  • verify-qa-scripts.sh — loosened artifact globs to cover unreleased filenames
  • qa/qa-test-cases-unreleased.yaml — renamed from qa-test-cases-v1.1.0.yaml via git mv; header refreshed to read v1.0.0 → Unreleased
  • package.jsonnextTargetVersion changed from "1.1.0" to "Unreleased"
  • BATS tests — new suites for generate-qa-test-plan (9 tests) and generate-release-testing-instructions (7 tests), plus targeted additions to existing suites
  • Documentation — CLAUDE.md QA002, TESTING.md, qa-suggest SKILL.md, and plan-integration-test agent updated to describe the Unreleased convention

Test Plan

  • Jest: 1979 tests, 112 suites — all pass
  • BATS: 147 shell tests — all pass
  • generate:qa-test-plan is idempotent (consecutive runs produce zero diff)
  • generate:qa-issue --dry-run produces correct "QA Checklist — unreleased" output
  • validate:qa-coverage passes against the unreleased yaml
  • generate:release-testing-instructions emits release-testing-instructions-unreleased.md with correct internal references

Related

Summary by CodeRabbit

  • Documentation

    • Updated QA and release workflow to support a trunk-based "Unreleased" target, clarifying editing, labeling, and finalization guidance for QA plans.
  • Tests

    • Added end-to-end suites validating QA plan & release-instruction generation, QA label selection, filename/label rules, idempotency, and SemVer selection behavior.
  • Chores

    • Tooling and metadata updated to prefer non-versioned/unreleased QA artifacts and to generate/update QA outputs appropriately during active development.

Review Change Stack

couimet added 6 commits May 26, 2026 11:22
…eholder

Mid-cycle SemVer pivots (e.g., 1.1.0 → 2.0.0) force renaming the QA YAML, editing headers, and chasing references across consumer scripts. Extending the `[Unreleased]` convention from CHANGELOG to the QA tooling lets the version stay deferred until finalize-release locks it in.

Both generators now branch on `nextTargetVersion == "Unreleased"`: filenames drop the `v` prefix and headers render without it, while SemVer values keep the existing `v`-prefixed form for forward compatibility with the future finalize step. The QA test plan generator also stops no-op-ing when the output file exists so a header refresh can be a separate, minimal-diff commit. Consumer auto-discovery in resolve-qa-labels.js and the verify-qa-scripts.sh glob are loosened so the new unreleased.yaml is picked up.

New BATS coverage exercises both filename branches, the in-place refresh, the no-clobber early-exit on the testing-instructions side, and the existing error paths.

Benefits:
- No more mid-cycle file renames when a version target shifts
- Symmetric behavior between generate-qa-test-plan and generate-release-testing-instructions
- Forward-compatible: SemVer paths still work for finalize-release
- BATS coverage prevents regressions on either branch
Activates the deferred-version pattern by flipping nextTargetVersion from a SemVer placeholder to the literal "Unreleased". The QA YAML header is regenerated in the same commit so the file accurately reflects the new state and the stale self-reference (qa-test-cases-v1.1.0-003.yaml) is corrected. Body content unchanged.

Cleaned up the header template at the same time
… pattern

CLAUDE.md QA002, TESTING.md, qa-suggest SKILL.md, and plan-integration-test agent all
referenced the old version-based filename convention (qa-test-cases-v1.1.0.yaml). Updated
to describe qa-test-cases-unreleased.yaml as the trunk-based development filename, with
version locking deferred to finalize-release.
The old sed range expression preserved blank lines between the header and body, which combined with the separator echo to add one blank line per regeneration. Dropping the file-exists early-exit in commit 1 surfaced this latent bug. Replaced with a simpler sed -n range that skips directly from test_cases: to EOF.

Also updated a stale usage example in generate-qa-issue.sh.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 26, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 44bdcbed-163b-4706-92e9-6a5feafad584

📥 Commits

Reviewing files that changed from the base of the PR and between 383feb5 and 4eede3a.

📒 Files selected for processing (3)
  • .claude/skills/qa-suggest/SKILL.md
  • packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh
  • tests/shell/generate-qa-test-plan.bats
✅ Files skipped from review due to trivial changes (1)
  • .claude/skills/qa-suggest/SKILL.md

Walkthrough

The PR converts QA workflows to a trunk-based "Unreleased" mode: package metadata and QA YAML use Unreleased, generators and discovery select qa-test-cases-unreleased.yaml (or fall back to latest versioned file), verification globs become non-versioned, tests cover both modes, and docs/AI guidance are updated.

Changes

Trunk-based QA Test Case Workflow

Layer / File(s) Summary
Package metadata and QA YAML configuration
packages/rangelink-vscode-extension/package.json, packages/rangelink-vscode-extension/qa/qa-test-cases-unreleased.yaml
nextTargetVersion set to "Unreleased", QA YAML header updated to Unreleased scope and related header/comment adjustments.
QA test-plan generation script and tests
packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh, tests/shell/generate-qa-test-plan.bats
Script emits NEXT_LABEL/filename conditionally for Unreleased vs SemVer, rebuilds header, extracts body from test_cases:, prefers existing target file; Bats tests validate naming, header rendering, idempotency, and error paths.
Release testing instructions generator and tests
packages/rangelink-vscode-extension/scripts/generate-release-testing-instructions.sh, tests/shell/generate-release-testing-instructions.bats
Script computes NEXT_LABEL, BASE_NAME, QA_YAML_FILENAME, and related slugs conditionally for Unreleased or SemVer and updates generated markdown paths; Bats tests validate filenames, embedded QA YAML references, headers, errors, and early-exit behavior.
QA file discovery and verification script updates
packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js, packages/rangelink-vscode-extension/scripts/verify-qa-scripts.sh, tests/shell/resolve-qa-labels.bats, tests/shell/validate-qa-coverage.bats
Candidate discovery widened to qa-test-cases-* and now prefers qa-test-cases-unreleased.yaml when present; verification globs updated to non-versioned patterns; tests assert discovery and coverage report naming.
Workflow and AI documentation updates
.claude/agents/plan-integration-test.md, .claude/skills/qa-suggest/SKILL.md, CLAUDE.md, packages/rangelink-vscode-extension/TESTING.md, packages/rangelink-vscode-extension/scripts/generate-qa-issue.sh
Documentation and AI skill guidance updated to instruct editing qa-test-cases-unreleased.yaml during trunk-based development, treat Unreleased as a valid nextTargetVersion, and update examples and scratchpad naming.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • couimet/rangeLink#498: Introduced/modified the release-testing instruction generator; this PR extends that script to support an Unreleased mode.
  • couimet/rangeLink#388: Previously added QA test-plan tooling; this PR adjusts its versioning lifecycle to support trunk-based Unreleased files.
  • couimet/rangeLink#576: Related changes to QA YAML discovery/label resolution logic; both PRs alter how QA files are discovered and selected.

"From trunk the rabbit hops, Unreleased in tow,
Carrot-named test plans ready to grow,
Scripts hum the tune, headers refreshed in flight,
And finalize-release will crown the night." 🥕🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: adopting an 'Unreleased' placeholder to defer QA version naming during trunk-based development, which is the central theme of all documented changes across multiple files and scripts.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issues/249-adopt_deferred_version_pattern

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (1)
tests/shell/generate-qa-test-plan.bats (1)

124-173: ⚡ Quick win

Add a mixed-file rerun test (versioned + unreleased both present).

Current idempotence coverage misses the case where both YAML variants exist; that’s the scenario most likely to regress source selection.

🧪 Suggested test shape
+@test "re-running prefers existing unreleased.yaml when both unreleased and versioned files exist" {
+  setup_fixture
+  write_package_json <<'EOF'
+{
+  "version": "1.0.0",
+  "nextTargetVersion": "Unreleased"
+}
+EOF
+  write_yaml "qa-test-cases-v1.0.0.yaml" <<'EOF'
+test_cases:
+  - id: foo-001
+    scenario: 'from versioned'
+    automated: true
+EOF
+  write_yaml "qa-test-cases-unreleased.yaml" <<'EOF'
+test_cases:
+  - id: foo-002
+    scenario: 'from unreleased'
+    automated: true
+EOF
+
+  run "$SCRIPT"
+  [[ "$status" -eq 0 ]]
+  grep -q "scenario: 'from unreleased'" "$FIXTURE_ROOT/qa/qa-test-cases-unreleased.yaml"
+  ! grep -q "scenario: 'from versioned'" "$FIXTURE_ROOT/qa/qa-test-cases-unreleased.yaml"
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/shell/generate-qa-test-plan.bats` around lines 124 - 173, Add a new
bats test that covers the mixed-file rerun case where both the versioned file
and the unreleased file exist: create a `@test` (e.g. "re-run mixed-file
idempotent: versioned + unreleased present") which calls setup_fixture, writes
package.json with version 1.0.0/nextTargetVersion Unreleased, writes both
"qa-test-cases-v1.0.0.yaml" (use minimal_previous_yaml) and a pre-existing
"qa-test-cases-unreleased.yaml" (can be a small body or the stale header
example), then run "$SCRIPT" twice and assert status 0 both times and that the
shasum of "$FIXTURE_ROOT/qa/qa-test-cases-unreleased.yaml" (or the file expected
to be overwritten) is identical after first and second runs; reuse helpers used
in other tests (setup_fixture, write_yaml, minimal_previous_yaml, SCRIPT) to
match existing test style.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh`:
- Around line 35-45: The script's file-selection logic (in
generate-qa-test-plan.sh using NEXT_VERSION, BASE_NAME, OUTPUT_FILE and QA_DIR)
should prefer an existing target YAML to avoid clobbering in-progress
"qa-test-cases-unreleased.yaml": before performing discovery or selecting the
highest-versioned file, check if "$OUTPUT_FILE" exists and use it as the
source/output; only if it does not exist proceed with the current
discovery/selection logic (the code block around lines referencing
NEXT_VERSION/BASE_NAME and the later discovery section) so reruns will reuse the
existing unreleased file instead of overwriting it.

In `@packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js`:
- Line 99: The auto-discovery currently filters for names starting with
"qa-test-cases-" then later sorts/picks by version, which causes
"qa-test-cases-unreleased.yaml" to lose to "v*" files; update the selection
logic so after applying the filter (.filter((f) =>
f.startsWith('qa-test-cases-') && f.endsWith('.yaml'))), check explicitly for
the exact filename "qa-test-cases-unreleased.yaml" and return it immediately if
present, otherwise fall back to the existing version-sorting logic; reference
the filter expression and the code path that performs the version sort/pick so
you can add the short-circuit check before the sort.

In `@tests/shell/resolve-qa-labels.bats`:
- Around line 212-224: Add a new Bats test that creates both filename styles and
asserts the versioned file wins; e.g., add a test like resolve-qa-labels:
auto-discovery prefers vX.Y.Z over unreleased that calls setup_fixture, writes
two YAML fixtures "qa-test-cases-unreleased.yaml" (with id unreleased-001) and
"qa-test-cases-v1.2.3.yaml" (with id released-001), runs node "$SCRIPT", checks
status is 0 and that output equals "released-001" to lock the auto-discovery
precedence; use the same structure as the existing test and the same run/assert
pattern.

---

Nitpick comments:
In `@tests/shell/generate-qa-test-plan.bats`:
- Around line 124-173: Add a new bats test that covers the mixed-file rerun case
where both the versioned file and the unreleased file exist: create a `@test`
(e.g. "re-run mixed-file idempotent: versioned + unreleased present") which
calls setup_fixture, writes package.json with version 1.0.0/nextTargetVersion
Unreleased, writes both "qa-test-cases-v1.0.0.yaml" (use minimal_previous_yaml)
and a pre-existing "qa-test-cases-unreleased.yaml" (can be a small body or the
stale header example), then run "$SCRIPT" twice and assert status 0 both times
and that the shasum of "$FIXTURE_ROOT/qa/qa-test-cases-unreleased.yaml" (or the
file expected to be overwritten) is identical after first and second runs; reuse
helpers used in other tests (setup_fixture, write_yaml, minimal_previous_yaml,
SCRIPT) to match existing test style.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2f541a9f-a9da-482f-9336-cd9743c47b24

📥 Commits

Reviewing files that changed from the base of the PR and between b59abaf and a8f8c2e.

📒 Files selected for processing (15)
  • .claude/agents/plan-integration-test.md
  • .claude/skills/qa-suggest/SKILL.md
  • CLAUDE.md
  • packages/rangelink-vscode-extension/TESTING.md
  • packages/rangelink-vscode-extension/package.json
  • packages/rangelink-vscode-extension/qa/qa-test-cases-unreleased.yaml
  • packages/rangelink-vscode-extension/scripts/generate-qa-issue.sh
  • packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh
  • packages/rangelink-vscode-extension/scripts/generate-release-testing-instructions.sh
  • packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js
  • packages/rangelink-vscode-extension/scripts/verify-qa-scripts.sh
  • tests/shell/generate-qa-test-plan.bats
  • tests/shell/generate-release-testing-instructions.bats
  • tests/shell/resolve-qa-labels.bats
  • tests/shell/validate-qa-coverage.bats

Comment thread packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js
Comment on lines +212 to +224
@test "resolve-qa-labels: auto-discovery picks qa-test-cases-unreleased.yaml when it is the only file" {
setup_fixture
write_yaml "qa-test-cases-unreleased.yaml" <<'EOF'
test_cases:
- id: unreleased-001
feature: Unreleased
scenario: Single file
automated: true
EOF
run node "$SCRIPT"
[[ "$status" -eq 0 ]]
[[ "$output" == "unreleased-001" ]]
}
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.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Add a mixed-file precedence test (unreleased + vX.Y.Z) to lock expected selection.

This new case only validates the single-file path. Please add a fixture with both filename styles and assert which one must win, so auto-discovery precedence is explicit and regression-safe.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/shell/resolve-qa-labels.bats` around lines 212 - 224, Add a new Bats
test that creates both filename styles and asserts the versioned file wins;
e.g., add a test like resolve-qa-labels: auto-discovery prefers vX.Y.Z over
unreleased that calls setup_fixture, writes two YAML fixtures
"qa-test-cases-unreleased.yaml" (with id unreleased-001) and
"qa-test-cases-v1.2.3.yaml" (with id released-001), runs node "$SCRIPT", checks
status is 0 and that output equals "released-001" to lock the auto-discovery
precedence; use the same structure as the existing test and the same run/assert
pattern.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

…sorts

Both generate-qa-test-plan.sh and resolve-qa-labels.js sort candidate files with ASCII ordering where 'unreleased' (u=117) sorts before 'v' (v=118), causing versioned files to win discovery when both coexist. This would clobber in-progress unreleased edits once a versioned file exists (post-finalize). Fixed by short-circuiting: prefer the existing target file in the shell script, and return the unreleased file immediately in the JS auto-discovery.

Ref: #605 (review)
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@couimet
Copy link
Copy Markdown
Owner Author

couimet commented May 26, 2026

@coderabbitai full review -- I was rate-limited on earlier run

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 26, 2026

@couimet: No problem! Kicking off a full review of PR #605 now.

(ᴗ˳ᴗ) 🐇

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
tests/shell/generate-qa-test-plan.bats (1)

175-200: ⚡ Quick win

Add a regression test for numeric SemVer ordering in fallback selection.

Current tests don’t guard against v1.10.0 vs v1.9.0 ordering mistakes when selecting the carry-forward source.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/shell/generate-qa-test-plan.bats` around lines 175 - 200, Add a
regression test that verifies numeric SemVer ordering when selecting the
carry-forward source: in the existing test "re-running prefers existing
unreleased.yaml when both unreleased and versioned files exist" (or add a new
test with a similar name), set package.json version to "1.10.0" and create two
versioned YAML fixtures (e.g., "qa-test-cases-v1.9.0.yaml" and
"qa-test-cases-v1.10.0.yaml") with distinct scenarios, plus
"qa-test-cases-unreleased.yaml"; run "$SCRIPT" and assert the script prefers the
correct numeric-latest version (v1.10.0) as the fallback (or prefers unreleased
when intended) by grepping for the expected scenario and ensuring the other
scenario is not present.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/skills/qa-suggest/SKILL.md:
- Line 147: Update the scratchpad filename and header templates to handle a
locked SemVer by adding conditional logic around nextTargetVersion: when
nextTargetVersion === "Unreleased" keep the current header ("v<version> →
Unreleased") and filename pattern (NNNN-qa-suggest.txt); otherwise format the
header as "v<version> → v<nextTargetVersion>" and alter the filename to include
the target version suffix (e.g., NNNN-qa-suggest-v<nextTargetVersion>.txt).
Locate and change the templates that produce the scratchpad path
`.claude-work/issues/<ID>/scratchpads/NNNN-qa-suggest.txt` and the header that
currently renders "v<version> → Unreleased" to use this conditional logic using
the variables nextTargetVersion and version.

In `@packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh`:
- Around line 52-66: The current PREVIOUS_YAML selection sorts the normalized
basename lexicographically and can pick the wrong semantic version (e.g.,
v1.10.0 vs v1.9.0); update the pipeline that emits and sorts the "base<TAB>file"
pairs (the block assigning PREVIOUS_YAML and the for-loop that prints normalized
names) to perform a semantic/version-aware sort (use the version sort option)
instead of plain lexicographic sort so the highest semver is chosen; keep the
existing normalization logic (adding -000 for unsuffixed names) but replace the
final sort invocation with a version-aware sort of the first field before tail
-1 and cut -f2.

---

Nitpick comments:
In `@tests/shell/generate-qa-test-plan.bats`:
- Around line 175-200: Add a regression test that verifies numeric SemVer
ordering when selecting the carry-forward source: in the existing test
"re-running prefers existing unreleased.yaml when both unreleased and versioned
files exist" (or add a new test with a similar name), set package.json version
to "1.10.0" and create two versioned YAML fixtures (e.g.,
"qa-test-cases-v1.9.0.yaml" and "qa-test-cases-v1.10.0.yaml") with distinct
scenarios, plus "qa-test-cases-unreleased.yaml"; run "$SCRIPT" and assert the
script prefers the correct numeric-latest version (v1.10.0) as the fallback (or
prefers unreleased when intended) by grepping for the expected scenario and
ensuring the other scenario is not present.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9550da10-2a19-40b5-9311-6ba73d32fed0

📥 Commits

Reviewing files that changed from the base of the PR and between b59abaf and 383feb5.

📒 Files selected for processing (15)
  • .claude/agents/plan-integration-test.md
  • .claude/skills/qa-suggest/SKILL.md
  • CLAUDE.md
  • packages/rangelink-vscode-extension/TESTING.md
  • packages/rangelink-vscode-extension/package.json
  • packages/rangelink-vscode-extension/qa/qa-test-cases-unreleased.yaml
  • packages/rangelink-vscode-extension/scripts/generate-qa-issue.sh
  • packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh
  • packages/rangelink-vscode-extension/scripts/generate-release-testing-instructions.sh
  • packages/rangelink-vscode-extension/scripts/resolve-qa-labels.js
  • packages/rangelink-vscode-extension/scripts/verify-qa-scripts.sh
  • tests/shell/generate-qa-test-plan.bats
  • tests/shell/generate-release-testing-instructions.bats
  • tests/shell/resolve-qa-labels.bats
  • tests/shell/validate-qa-coverage.bats

Comment thread .claude/skills/qa-suggest/SKILL.md Outdated
Comment thread packages/rangelink-vscode-extension/scripts/generate-qa-test-plan.sh Outdated
…plates

The fallback YAML selection used lexicographic sort, which ranked v1.9.0 above v1.10.0 because 9 > 1 at offset 3. Replaced with numeric sort by MAJOR, MINOR, PATCH. The qa-suggest SKILL.md now conditionally formats the scratchpad header and filename based on whether nextTargetVersion is "Unreleased" or a locked SemVer.

Benefits:
- Correct carry-forward source when version components cross the 10 boundary
- Scratchpad naming reflects actual version state during locked-version QA cycles
- Regression test prevents backsliding on numeric sort

Ref: #605 (review)
@github-actions
Copy link
Copy Markdown

✅ CI / Integration Tests (with extensions) — run summary

Duration 9m 29s
Unit tests Ran in Test & Validate job
Integration tests passing 160
QA TC IDs exercised clipboard-preservation-011, clipboard-preservation-012, custom-ai-assistant-003, claude-code-001, claude-code-006, claude-code-007, gemini-code-assist-001, gemini-code-assist-005, gemini-code-assist-006
Report View run & artifacts

@github-actions
Copy link
Copy Markdown

✅ CI / Test & Validate — run summary

Duration 9m 53s
Unit tests passed 1979 / 1979
Integration tests passing 151
QA TC IDs exercised status-bar-menu-002, status-bar-menu-003, status-bar-menu-005, status-bar-menu-006, bind-to-destination-010, bind-to-destination-013, terminal-picker-001, terminal-picker-002, terminal-picker-003, terminal-picker-004, terminal-picker-005, terminal-picker-007, terminal-picker-008, terminal-picker-011, terminal-picker-012, terminal-picker-013, terminal-picker-014, terminal-picker-015, terminal-picker-016, file-picker-001, file-picker-002, file-picker-003, file-picker-004, file-picker-005, file-picker-009, file-picker-011, file-picker-012, clipboard-preservation-001, clipboard-preservation-002, clipboard-preservation-003, clipboard-preservation-004, clipboard-preservation-005, clipboard-preservation-006, clipboard-preservation-007, clipboard-preservation-008, clipboard-preservation-009, clipboard-preservation-010, clipboard-preservation-013, clipboard-preservation-014, clipboard-preservation-015, clipboard-preservation-016, send-file-path-001, send-file-path-002, send-file-path-004, send-file-path-005, send-file-path-006, send-file-path-007, send-file-path-008, send-file-path-010, send-file-path-011, send-file-path-012, dirty-buffer-warning-004, dirty-buffer-warning-006, dirty-buffer-warning-007, dirty-buffer-warning-019, send-terminal-selection-003, send-terminal-selection-006, send-terminal-selection-007, go-to-link-001, unbind-001, unbind-003, unbind-004, editor-binding-validation-004, full-line-navigation-001, full-line-navigation-002, char-navigation-001, char-navigation-002, full-line-link-generation-001, wrapped-link-navigation-001, wrapped-link-navigation-002, wrapped-link-navigation-003, wrapped-link-navigation-004, markdown-link-navigation-001, url-exclusion-001, stale-viewcolumn-001, hidden-tab-paste-001, hidden-tab-paste-002, full-line-selection-validation-001, core-send-commands-r-l-001, core-send-commands-r-l-002, core-send-commands-r-l-003, core-send-commands-r-c-001, core-send-commands-r-l-004, core-send-commands-r-c-002, core-send-commands-r-l-005, core-send-commands-r-p-001, core-send-commands-r-v-001, clickable-file-paths-001, clickable-file-paths-002, clickable-file-paths-003, clickable-file-paths-004, clickable-file-paths-005, clickable-file-paths-006, clickable-file-paths-007, clickable-file-paths-008, clickable-file-paths-009, clickable-file-paths-010, clickable-file-paths-011, clickable-file-paths-012, smart-padding-001, smart-padding-003, smart-padding-005, smart-padding-006, smart-padding-007, smart-padding-008, smart-padding-011, duplicate-tab-group-001, duplicate-tab-group-002, duplicate-tab-group-003, duplicate-tab-group-004, langswitch-binding-001, langswitch-binding-002, navigation-clamping-001, navigation-clamping-002, navigation-clamping-003, navigation-clamping-004, untitled-navigation-001, untitled-navigation-002, untitled-navigation-003, untitled-navigation-004, untitled-navigation-005, untitled-navigation-006, navigation-toast-settings-001, navigation-toast-settings-002, navigation-toast-settings-003, filename-fallback-navigation-001, filename-fallback-navigation-002, filename-fallback-navigation-003, filename-fallback-navigation-004, custom-ai-assistant-001, custom-ai-assistant-002, custom-ai-assistant-004, custom-ai-assistant-005, custom-ai-assistant-006, custom-ai-assistant-007, custom-ai-assistant-008, custom-ai-assistant-009, custom-ai-assistant-010, custom-ai-assistant-011, custom-ai-assistant-012, custom-ai-assistant-013, custom-ai-assistant-014, custom-ai-assistant-015, custom-ai-assistant-016, custom-ai-assistant-017, github-copilot-chat-001, release-notifier-001, release-notifier-002, status-bar-appearance-001, status-bar-appearance-002
Report View run & artifacts

@couimet couimet merged commit 6c4f9ec into main May 27, 2026
5 checks passed
@couimet couimet deleted the issues/249-adopt_deferred_version_pattern branch May 27, 2026 02:42
@couimet couimet mentioned this pull request May 27, 2026
3 tasks
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