Skip to content

fix(release): retire target labels after tagging - #7118

Merged
cv merged 9 commits into
mainfrom
codex/retire-release-target-labels
Jul 18, 2026
Merged

fix(release): retire target labels after tagging#7118
cv merged 9 commits into
mainfrom
codex/retire-release-target-labels

Conversation

@cv

@cv cv commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

Summary

Release target labels are now temporary planning state instead of a second release-membership record. Merged PR automation labels only work ahead of the latest semver tag, and the coordinated tag workflow carries open work forward before deleting the released label; tags and commit ancestry remain the durable signal.

Changes

  • Stop assigning or reconciling release labels for PRs already contained in a semver tag; scheduled repair now scans only latest-tag..main.
  • Have the release-latest-tag workflow run the idempotent retirement helper after verifying the signed release tag and moving latest to that exact tag object; it moves open issues and PRs to the next patch, verifies none remain, and deletes the released repository label.
  • Serialize post-merge label assignment and tag-triggered retirement through one queue: max concurrency group, preventing assignment during the final verification/delete window.
  • Refuse unsafe patch increments or carry-forward to an already-tagged version, and identify the release housekeeping run by its exact release commit.
  • Update the release plan, maintainer skills, canonical policy, and regression coverage for the new label lifecycle.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: This changes internal maintainer automation and policy, which are updated in .agents/skills/; it does not change end-user behavior or Fern documentation.
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Maintainer-requested release-policy change; failure paths and no-recreation behavior are covered by focused regression tests.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — release workflow and retirement regression set (5 files, 65 tests passed), npm run typecheck:cli, and npm run test:projects:check (1,654 candidate files across 8 projects)
  • Applicable broad gate passed — Not applicable; this is a focused release-automation and maintainer-process change.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Carlos Villela cvillela@nvidia.com

Summary by CodeRabbit

  • New Features

    • Release workflows now carry forward open issues and pull requests from a completed released label to the next patch release.
    • The release-latest-tag flow verifies completion and then retires (deletes) the released label, using serialized concurrency and updated token permissions; retirement is restricted to this workflow.
    • Release plans now include explicit carry-forward and released-label deletion steps.
  • Documentation

    • Maintainer runbooks/policies clarified that released labels are not readiness claims and must never be renamed or reused; added additional anti-examples and tighter housekeeping sequencing.
  • Tests

    • Added/updated end-to-end coverage for label retirement behavior and refreshed workflow/plan assertions for the new carry-forward + delete lifecycle.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>
@cv cv self-assigned this Jul 17, 2026
@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 8bc72926-7cdd-47fe-89db-89f4cbfc7889

📥 Commits

Reviewing files that changed from the base of the PR and between 0847ca6 and 19835bd.

📒 Files selected for processing (1)
  • test/release-latest-tag.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/release-latest-tag.test.ts

📝 Walkthrough

Walkthrough

Release labeling now compares merges with the latest release tag and current untagged interval. Serialized release workflows move open stragglers to the next patch label, delete the released label, and update release plans, maintainer guidance, and validation.

Changes

Release label lifecycle

Layer / File(s) Summary
Release housekeeping contract
.agents/skills/..., references/*, .agents/skills/nemoclaw-skills-guide/SKILL.md
Maintainer guidance and release policies define workflow-managed carry-forward, verified label deletion, shared coordination, and non-reuse of released labels.
Current-interval release targeting
.github/workflows/label-merged-pr-release-target.yaml, test/label-merged-pr-release-target-workflow.test.ts
Merged-PR labeling compares against the newest release tag, reconciles only the current untagged interval, serializes operations, and updates boundary and restart tests.
Retirement command and workflow wiring
scripts/retire-release-label.mts, .github/workflows/release-latest-tag.yaml, test/retire-release-label.test.ts
The retirement command moves open PRs/issues, verifies and deletes the released label, and is invoked by the release workflow with write permissions and failure-case coverage.
Release plan operations
scripts/release-plan.mts, test/release-latest-tag.test.ts
Generated release plans include carry-forward to the following patch and deletion of the released label afterward.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Maintainer
  participant release-latest-tag
  participant retire-release-label-mts
  participant GitHub
  Maintainer->>release-latest-tag: Confirm release tag and workflow completion
  release-latest-tag->>retire-release-label-mts: Pass released tag and repository
  retire-release-label-mts->>GitHub: Move open PRs and issues to next patch
  retire-release-label-mts->>GitHub: Verify and delete released label
  release-latest-tag-->>Maintainer: Report carry-forward and retirement result
Loading

Suggested labels: area: ci, area: docs, bug-fix

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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 is concise and accurately summarizes the main change: retiring release target labels after tagging.
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.
✨ 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 codex/retire-release-target-labels

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

@github-code-quality

github-code-quality Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage remains at 96%, unchanged from the main branch.

TypeScript / code-coverage/cli

The overall coverage in the codex/retire-release... branch remains at 80%, unchanged from the main branch.

Show a code coverage summary of the most impacted files.
File main 539f407 codex/retire-release... 3c6baef +/-
src/lib/state/registry.ts 86% 83% -3%
src/lib/adapter...hell/resolve.ts 100% 100% 0%
src/lib/agent/defs.ts 81% 81% 0%
src/lib/onboard...ndbox-create.ts 91% 91% 0%
src/lib/onboard...ndbox-create.ts 100% 100% 0%
src/lib/sandbox...rce-identity.ts 91% 91% 0%
src/lib/securit...p-url-target.ts 100% 100% 0%
src/lib/credentials/store.ts 59% 64% +5%
src/lib/onboard...-desktop-gpu.ts 83% 89% +6%
src/lib/core/pr...mpt-activity.ts 67% 92% +25%

Updated July 18, 2026 08:21 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Blocking findings reported

Advisor assessment: Blockers require maintainer review
Next action: Review the blockers below.
Findings: 1 blocker · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 1 blocker · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized E2E selections differ; Nemotron reported 1 fewer blocker, the same number of warnings, the same number of suggestions.

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: None

1 optional E2E recommendation
  • docs-validation

Blockers

PRA-1 Blocker — Use supported GitHub Actions concurrency controls

  • Location: .github/workflows/label-merged-pr-release-target.yaml:29
  • Category: architecture
  • Problem: The release-label coordination boundary relies on `queue: max` in both the post-merge labeler and release workflow, but GitHub Actions concurrency supports a group plus `cancel-in-progress`; it does not provide a `queue` setting. The stated guarantee that every merge event waits while label retirement runs is therefore not established by this configuration.
  • Impact: A merge event can be cancelled or displaced while the release workflow retires a label, leaving a merged PR without the required next-release target or allowing the intended serialization guarantee to fail.
  • Fix: Replace the unsupported queue setting with a supported coordination design that preserves or deterministically reconciles all merge events, and keep the same release-label critical section for assignment and retirement.
  • Verification: Inspect the GitHub Actions concurrency syntax and the workflow's scheduled/manual reconciliation path; confirm that a merge event arriving during retirement is retained or later assigned without relying on `queue: max`.
  • Test coverage: Add a workflow-contract test that rejects unsupported concurrency keys and a behavioral test covering a merge event queued during label retirement, asserting it is eventually assigned to the correct untagged release label.
  • Evidence: `.github/workflows/label-merged-pr-release-target.yaml:29-32` declares `concurrency.group` with `queue: max`. `.github/workflows/release-latest-tag.yaml:25-28` declares the same unsupported `queue: max` coordination setting. Both workflow comments claim `queue:max` keeps every merge event while the other workflow owns the coordination lock.

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>

@coderabbitai coderabbitai 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.

Actionable comments posted: 3

🤖 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 @.agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md:
- Around line 161-166: Update the workflow-monitoring instructions after Step 3
to identify the release run using the release commit and push event, rather than
selecting the most recent run. Filter the gh run list result by the release
commit, require exactly one matching run, and only then pass its run ID to gh
run watch.

In `@scripts/retire-release-label.mts`:
- Around line 43-48: Before calling ensureReleaseLabel in the retirement flow,
add an exact remote-tag check for to and refuse to recreate or reuse the label
when that version has already shipped. Keep the existing releaseLabelExists
handling and successful retirement output unchanged.

In `@test/maintainer-skills-policy.test.ts`:
- Line 101: Remove the duplicate quality_rules property declaration from the
relevant type definition in maintainer-skills-policy.test.ts, keeping a single
declaration with its existing boolean shape so the TypeScript
duplicate-identifier error is resolved.
🪄 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: Enterprise

Run ID: 7680ad28-1522-4e26-8d93-4fcfe41cf896

📥 Commits

Reviewing files that changed from the base of the PR and between e7e8b67 and 37bceb5.

📒 Files selected for processing (21)
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md
  • .agents/skills/nemoclaw-maintainer-day/PR-REVIEW-PRIORITIES.md
  • .agents/skills/nemoclaw-maintainer-day/scripts/bump-stragglers.ts
  • .agents/skills/nemoclaw-maintainer-evening/SKILL.md
  • .agents/skills/nemoclaw-maintainer-policies/SKILL.md
  • .agents/skills/nemoclaw-maintainer-policies/references/daily-flow.md
  • .agents/skills/nemoclaw-maintainer-policies/references/examples.md
  • .agents/skills/nemoclaw-maintainer-policies/references/label-taxonomy.json
  • .agents/skills/nemoclaw-maintainer-policies/references/label-taxonomy.md
  • .agents/skills/nemoclaw-maintainer-policies/references/project-workflow.md
  • .agents/skills/nemoclaw-maintainer-policies/references/release-train.md
  • .agents/skills/nemoclaw-skills-guide/SKILL.md
  • .github/workflows/label-merged-pr-release-target.yaml
  • .github/workflows/release-latest-tag.yaml
  • scripts/release-plan.mts
  • scripts/retire-release-label.mts
  • test/bump-stragglers.test.ts
  • test/label-merged-pr-release-target-workflow.test.ts
  • test/maintainer-skills-policy.test.ts
  • test/release-latest-tag.test.ts
  • test/retire-release-label.test.ts
💤 Files with no reviewable changes (2)
  • .agents/skills/nemoclaw-maintainer-day/scripts/bump-stragglers.ts
  • test/bump-stragglers.test.ts

Comment thread .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md Outdated
Comment thread scripts/retire-release-label.mts
release: { application_policy: string; positive_signals: string[] };
};
quality_rules: { post_merge_release_labeling_allowed: boolean };
quality_rules: { post_merge_untagged_release_labeling_allowed: boolean };

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.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Remove the duplicate quality_rules declaration.

Line 101 declares the same property twice, causing a TypeScript duplicate-identifier error.

Proposed fix
-      quality_rules: { post_merge_untagged_release_labeling_allowed: boolean };
       quality_rules: { post_merge_untagged_release_labeling_allowed: boolean };
🤖 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 `@test/maintainer-skills-policy.test.ts` at line 101, Remove the duplicate
quality_rules property declaration from the relevant type definition in
maintainer-skills-policy.test.ts, keeping a single declaration with its existing
boolean shape so the TypeScript duplicate-identifier error is resolved.

@coderabbitai coderabbitai 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/retire-release-label.test.ts (1)

1-31: 📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Import the CLI source from this root-level test.

runRetireReleaseLabel executes scripts/retire-release-label.mts in a child process. The repository rule for test/**/*.test.{ts,js} requires root-level tests to import CLI source; expose a testable entry point and inject the gh dependency, or relocate true process/package-contract coverage to the designated package-contract area.

As per path instructions, root-level tests must import CLI source; compiled-artifact assertions belong under test/package-contract/.

🤖 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 `@test/retire-release-label.test.ts` around lines 1 - 31, Replace the
child-process execution in runRetireReleaseLabel with a direct import of the CLI
source and a testable entry point that accepts an injected gh dependency. Keep
genuine process or package-contract assertions out of this root-level test; if
needed, move them under test/package-contract/.

Source: Path instructions

🤖 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.

Outside diff comments:
In `@test/retire-release-label.test.ts`:
- Around line 1-31: Replace the child-process execution in runRetireReleaseLabel
with a direct import of the CLI source and a testable entry point that accepts
an injected gh dependency. Keep genuine process or package-contract assertions
out of this root-level test; if needed, move them under test/package-contract/.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4afeeae3-dce6-4c95-8d22-59648ee18cfb

📥 Commits

Reviewing files that changed from the base of the PR and between 37bceb5 and 30cda53.

📒 Files selected for processing (4)
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md
  • scripts/retire-release-label.mts
  • test/maintainer-skills-policy.test.ts
  • test/retire-release-label.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • test/maintainer-skills-policy.test.ts
  • scripts/retire-release-label.mts
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md

apurvvkumaria pushed a commit that referenced this pull request Jul 17, 2026
## Summary

- Requires release operators to create the immutable semver tag as a
signed annotated tag on their workstation.
- Requires GitHub to report that exact tag object as `verified: true`
before the release workflow can promote `latest`.
- Makes `latest` a second ref to the exact verified semver tag object
instead of minting a distinct unsigned tag object in Actions.
- Verifies raw tag-object equality as well as peeled commit equality,
while retaining main ancestry, newest-semver, rollback, and
unchanged-`lkg` guards.
- Uses an exact-object force-with-lease so a concurrent out-of-band
`latest` update cannot be overwritten.

## Why

The current release workflow creates `latest` with `git tag -fa`, which
produces a separate unsigned annotated object even when the semver
release tag is signed. Authentication through `GITHUB_TOKEN` authorizes
the ref update but does not cryptographically sign the object. This
caused `latest` for v0.0.86 to report `verified: false` until
protected-tag remediation.

The new trust chain keeps private signing material out of Actions: the
operator signs the immutable semver object locally, GitHub verifies it,
and Actions only aliases the mutable `latest` ref to that
already-verified object.

## Security Boundary

This change authenticates the exact tag object and requires GitHub to
recognize its signature. It does not introduce a separate allowlist of
release signers: authorization to create a release tag remains governed
by repository permissions and tag rulesets. Restricting tag creation to
a designated release team or app, if required, is a separate policy
hardening step.

## Coordination

[#7118](#7118) also updates the
latest-tag workflow for release-label retirement. This patch applies
cleanly over its current head; if #7118 lands first, its permissions,
concurrency group, and retirement steps must be preserved when this
branch is refreshed.

## Type of Change

- [x] Code change with tests
- [x] Release/security workflow hardening

## Verification

- `vitest run --project integration test/release-latest-tag.test.ts
test/release-latest-tag-workflow.test.ts` — **22 passed**
- Real ephemeral SSH signing keys prove the cut tag contains an SSH
signature.
- Git semantics test proves `latest` and `vX.Y.Z` resolve through the
same signed tag object.
- Negative tests cover mismatched verified object, permanently
unverified GitHub state, verification propagation, distinct same-commit
objects, and concurrent `latest` movement.
- `npm run build:cli && npm run check:diff` — passed
- `bash -n`, ShellCheck, formatting, repository checks, source-shape
budget, test-size budget, gitleaks, and DCO hooks — passed
- Commit is SSH-signed and includes DCO sign-off.

---
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>

@coderabbitai coderabbitai 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/release-latest-tag.test.ts (1)

223-229: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Assert that carry-forward precedes label deletion.

These assertions only verify that both operations exist. A plan that deletes v0.0.2 before carrying open items to v0.0.3 would still pass. Assert their indices or ordered subsequence.

Suggested assertion
-  expect(plan.operations).toContain(
-    "have release-latest-tag workflow carry open v0.0.2 items forward to v0.0.3",
-  );
-  expect(plan.operations).toContain(
-    "have release-latest-tag workflow delete released v0.0.2 label after carry-forward succeeds",
-  );
+  const carryForward =
+    "have release-latest-tag workflow carry open v0.0.2 items forward to v0.0.3";
+  const deleteReleased =
+    "have release-latest-tag workflow delete released v0.0.2 label after carry-forward succeeds";
+  const carryForwardIndex = plan.operations.indexOf(carryForward);
+  const deleteReleasedIndex = plan.operations.indexOf(deleteReleased);
+  expect(carryForwardIndex).toBeGreaterThanOrEqual(0);
+  expect(deleteReleasedIndex).toBeGreater(carryForwardIndex);

As per path instructions, this test should verify behavioral confidence at the public boundary rather than only operation presence.

🤖 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 `@test/release-latest-tag.test.ts` around lines 223 - 229, Update the
release-latest-tag plan test around the carry-forward and label-deletion
operation assertions to verify ordering, not just presence. Capture or derive
each operation’s index in plan.operations and assert that carrying open v0.0.2
items forward to v0.0.3 occurs before deleting the released v0.0.2 label, while
preserving the existing operation-content checks.

Source: Path instructions

🤖 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.

Outside diff comments:
In `@test/release-latest-tag.test.ts`:
- Around line 223-229: Update the release-latest-tag plan test around the
carry-forward and label-deletion operation assertions to verify ordering, not
just presence. Capture or derive each operation’s index in plan.operations and
assert that carrying open v0.0.2 items forward to v0.0.3 occurs before deleting
the released v0.0.2 label, while preserving the existing operation-content
checks.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: f4718fa6-e285-4403-82e1-b0e0ad327163

📥 Commits

Reviewing files that changed from the base of the PR and between 30cda53 and 0847ca6.

📒 Files selected for processing (6)
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md
  • .github/workflows/release-latest-tag.yaml
  • scripts/release-plan.mts
  • test/label-merged-pr-release-target-workflow.test.ts
  • test/maintainer-skills-policy.test.ts
  • test/release-latest-tag.test.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • .github/workflows/release-latest-tag.yaml
  • scripts/release-plan.mts
  • .agents/skills/nemoclaw-maintainer-cut-release-tag/SKILL.md
  • test/label-merged-pr-release-target-workflow.test.ts

@cv
cv merged commit cbe11ac into main Jul 18, 2026
53 checks passed
@cv
cv deleted the codex/retire-release-target-labels branch July 18, 2026 09:00
@wscurran wscurran added area: ci CI workflows, checks, release automation, or GitHub Actions chore Build, CI, dependency, or tooling maintenance labels Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ci CI workflows, checks, release automation, or GitHub Actions chore Build, CI, dependency, or tooling maintenance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants