Skip to content

fix(cluster-install): correct v1.4.x namespace, storageclass gate, dashboard OIDC#14

Merged
Aleksei Sviridkin (lexfrei) merged 5 commits into
mainfrom
fix/cluster-install-talos-1.4-gaps
Jun 1, 2026
Merged

fix(cluster-install): correct v1.4.x namespace, storageclass gate, dashboard OIDC#14
Aleksei Sviridkin (lexfrei) merged 5 commits into
mainfrom
fix/cluster-install-talos-1.4-gaps

Conversation

@lexfrei
Copy link
Copy Markdown
Contributor

@lexfrei Aleksei Sviridkin (lexfrei) commented May 30, 2026

What

Three corrections to the cluster-install skill, found while installing Cozystack v1.4.2 on a fresh Talos cluster end to end. Each item is a place where the skill's guidance matched v1.3.x behaviour but breaks on v1.4.x.

1. cozy-installer namespace (references/values-template.md, Phase 6)

The skill installed the chart with --namespace kube-system and explicitly avoided --create-namespace. That is the v1.3.x contract. As of v1.4.0 (cozystack/cozystack#2508) the chart no longer templates the cozy-system Namespace on the helm path — the release lives in cozy-system and the caller must pass --create-namespace, after which a pre-install hook Job (cozy-system-labeler, in kube-system, hostNetwork, NotReady/CNI-not-ready tolerant) stamps the new namespace with PodSecurity enforce=privileged + cozystack.io/system=true.

With the old form against a v1.4 chart the labeler hook fails with namespaces "cozy-system" not found and the whole install aborts before the operator deploys. Both forms are now documented side by side so the operator picks the one matching installer_version.

2. StorageClasses — gate on the live cluster, not a version number (Phase 8.6)

Phase 8.6 skipped on installer_version >= 1.4.0, assuming the tenant CRD exposes spec.storageClasses and the operator auto-creates the classes. On v1.4.2 that field does not exist in the shipped CRD (kubectl get crd tenants.apps.cozystack.io -o yaml | grep -c storageClass0) and nothing creates the StorageClasses, so the cluster reaches all-HRs-Ready with kubectl get storageclass empty. Every stateful PVC (keycloak-db, etcd, seaweedfs, vmstorage/vlstorage) then sits Pending, which cascades: keycloak CrashLoops with no DB, and cozystack-api/controller/dashboard never go Ready.

The fix replaces the version branch with a live kubectl get storageclass check — create the linstor defaults whenever the cluster comes up empty, self-skip if a future release starts creating them. Also documents that SC creation belongs inside the Phase 8 watch loop (gated on linstor-controller Ready), not after all-HRs-Ready, to avoid deadlocking on PVC-dependent HRs.

3. Dashboard requires OIDC/Keycloak (Phase 8 + references/values-template.md)

The skill enabled spec.ingress on the root tenant but never enabled OIDC and never set the tenant spec.host. Two problems:

  • authentication.oidc.enabled defaults to false and the isp-full* overlays do not turn it on, so no Keycloak deploys and the dashboard falls back to its non-OIDC token-proxy container — which on v1.4.2 never binds its port and CrashLoops on its own liveness probe. The cluster sits at "88/90 HRs Ready" forever.
  • The root tenant ships with spec.host: "" and does not inherit publishing.host from the Platform Package, so per-tenant ingress objects render against an empty domain.

The watch-loop patch now sets both spec.host and spec.ingress, and the skill enables authentication.oidc.enabled plus keycloak in exposedServices (baked into the Platform Package, with a runtime-patch fallback). This mirrors what the upstream hack/e2e-install-cozystack.bats does.

Not in scope (already correct)

The OCI install.image-ignored trap (Talos booted from a disk image skips the installer, so cozystack extensions never land) is already handled by talos-bootstrap Phase 11 verification + Phase 11.5 auto-upgrade. No change needed there.

Testing

All three were validated by a full end-to-end install of Cozystack v1.4.2 on a 3-node Talos cluster on a NAT'd cloud provider: cluster reached 98/98 HelmReleases Ready, 49/49 certificates issued, dashboard reachable over SSO. Docs-only change to the skill — no executable code paths altered beyond the embedded command snippets.

Summary by CodeRabbit

  • New Features

    • Documented dashboard OIDC/Keycloak requirement and platform package options to enable it.
  • Documentation

    • Updated installer namespace to cozy-system and helm release reference.
    • Clarified namespace creation/adoption and install guidance for v1.4+.
    • Expanded examples for patching root tenant (host + ingress) and issue-template install steps.
  • Bug Fixes

    • StorageClass creation now gated on live cluster state to avoid PVC deadlocks.
    • Strengthened tenant ingress/host patching in the install watch loop.

…shboard OIDC

Three corrections to the cluster-install skill found while installing
Cozystack v1.4.2 on a fresh Talos cluster end to end.

cozy-installer namespace: install into cozy-system with
--create-namespace. v1.4.0 stopped templating the cozy-system Namespace
in the chart and moved namespace creation to --create-namespace plus a
pre-install labeler hook (in kube-system, hostNetwork, NotReady-tolerant)
that stamps PSA=privileged. The previous --namespace kube-system form
(no --create-namespace) makes the labeler hook fail with
'namespaces "cozy-system" not found' and aborts the install before the
operator deploys. Both v1.3.x and v1.4.x forms are now documented
side by side.

StorageClasses: gate on a live 'kubectl get storageclass' check instead
of a version branch. The prior guidance skipped this phase on
installer_version >= 1.4.0 assuming the tenant CRD exposes
spec.storageClasses and the operator auto-creates them. On v1.4.2 the
shipped tenant CRD has no storageClasses field and nothing creates the
classes, so the cluster reaches all-HRs-Ready with zero StorageClasses
and every stateful PVC stuck Pending. The live check creates the
linstor defaults whenever the cluster comes up empty and self-skips if a
future release starts creating them. Also documents that SC creation
belongs inside the Phase 8 watch loop, gated on linstor-controller
Ready, to avoid deadlocking on PVC-dependent HRs.

dashboard OIDC: enable authentication.oidc, set the root tenant
spec.host (it does not inherit publishing.host), and expose keycloak.
The non-OIDC token-proxy dashboard path is broken on v1.4.2 (container
never binds its port and CrashLoops on its own liveness probe), so a
working web dashboard requires Keycloak. This mirrors what the upstream
e2e install does.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 30, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

This PR updates cluster-install documentation: the cozy-installer Helm release and commands now target cozy-system (with pre-install labeling/adoption notes), Phase 8 watch-loop patches root Tenant with both spec.host and spec.ingress=true, OIDC/Keycloak requirements for the dashboard are documented, and StorageClass defaults are gated by live cluster state and moved into the Phase 8 watch loop.

Changes

Cluster-install v1.4.0+ behavior updates

Layer / File(s) Summary
Installer namespace targeting and setup (v1.4.0+ migration)
plugins/cozystack/skills/cluster-install/SKILL.md, plugins/cozystack/skills/cluster-install/references/values-template.md, plugins/cozystack/skills/cluster-install/references/issue-templates.md
Phase 5/6/10 docs and install commands updated to target cozy-system with --create-namespace; documents pre-install labeler Job, adoption procedure for existing cozy-system, refusal when owned by another release, and updates issue-template and printed helm-release references.
Root Tenant patching and OIDC/Keycloak authentication
plugins/cozystack/skills/cluster-install/SKILL.md, plugins/cozystack/skills/cluster-install/references/values-template.md, plugins/cozystack/skills/cluster-install/references/known-failures.md
Phase 8 watch loop now checks and patches both tenants/root.spec.ingress=true and tenants/root.spec.host=$HOST. Platform Package template adds authentication.oidc.enabled and requires keycloak in publishing.exposedServices when enabled. Known-failures and recovery kubectl patch commands updated to set both fields. Optional system-bundle tenant extensions documented.
StorageClass installation logic and timing
plugins/cozystack/skills/cluster-install/SKILL.md, plugins/cozystack/skills/cluster-install/references/provider-pitfalls.md, plugins/cozystack/skills/wizard/SKILL.md
Phase 8.6 changed from a version-gate to a live-cluster gate: default linstor local/replicated StorageClasses are created only when the cluster has zero StorageClasses. Creation is moved into the Phase 8 watch loop and gated on linstor-controller readiness to avoid PVC/Pending deadlocks. Wizard note updated accordingly.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • sircthulhu

Poem

🐰 A rabbit reads the install guide clear,
Namespaces moved and host fields now appear,
OIDC wakes the dashboard's song,
Storage waits until none belong,
Docs hop forward—short and dear. 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the three main factual corrections made in the PR: v1.4.x namespace handling, StorageClass gating logic, and dashboard OIDC requirements.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/cluster-install-talos-1.4-gaps

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

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request updates the cozystack cluster installation documentation to support v1.4.x changes, including updating the installer namespace to cozy-system, documenting OIDC/Keycloak requirements for the dashboard, patching the root tenant's host, and shifting StorageClass creation to a live-cluster check inside the Phase 8 watch loop. The review feedback suggests normalizing the installer version variable to prevent prefix issues in Helm commands and replacing a placeholder with the correct variable in the documentation.

Comment on lines +31 to 40
# v1.4.0+ (current): release in cozy-system, --create-namespace REQUIRED,
# the pre-install labeler hook stamps PSA=privileged on the new namespace.
helm --kube-context $CTX upgrade --install cozy-installer \
oci://ghcr.io/cozystack/cozystack/cozy-installer \
--version $INSTALLER_VERSION \
--namespace kube-system \
--namespace cozy-system --create-namespace \
--set cozystackOperator.variant=$INSTALLER_VARIANT \
--set cozystack.apiServerHost=$API_HOST \
--set cozystack.apiServerPort=$API_PORT \
--wait --timeout 10m
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The Helm command uses $INSTALLER_VERSION directly, which might contain the v prefix (e.g., v1.4.2). Helm's OCI client expects the exact tag without the v prefix. To prevent installation failures, normalize the version string to $INSTALLER_VERSION_OCI before running the helm command, matching the behavior in SKILL.md.

Suggested change
# v1.4.0+ (current): release in cozy-system, --create-namespace REQUIRED,
# the pre-install labeler hook stamps PSA=privileged on the new namespace.
helm --kube-context $CTX upgrade --install cozy-installer \
oci://ghcr.io/cozystack/cozystack/cozy-installer \
--version $INSTALLER_VERSION \
--namespace kube-system \
--namespace cozy-system --create-namespace \
--set cozystackOperator.variant=$INSTALLER_VARIANT \
--set cozystack.apiServerHost=$API_HOST \
--set cozystack.apiServerPort=$API_PORT \
--wait --timeout 10m
# Normalise: v1.3.3 → 1.3.3 (Helm's OCI client matches the registry tag as-is)
INSTALLER_VERSION_OCI="${INSTALLER_VERSION#v}"
# v1.4.0+ (current): release in cozy-system, --create-namespace REQUIRED,
# the pre-install labeler hook stamps PSA=privileged on the new namespace.
helm --kube-context $CTX upgrade --install cozy-installer \
oci://ghcr.io/cozystack/cozystack/cozy-installer \
--version "$INSTALLER_VERSION_OCI" \
--namespace cozy-system --create-namespace \
--set cozystackOperator.variant=$INSTALLER_VARIANT \
--set cozystack.apiServerHost=$API_HOST \
--set cozystack.apiServerPort=$API_PORT \
--wait --timeout 10m

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch — fixed in 4a4da47. Both helm examples now strip a leading v into $INSTALLER_VERSION_OCI before --version, matching Phase 6 in SKILL.md. Confirmed against the ghcr registry: the cozy-installer chart tags are published as X.Y.Z with no v prefix, so a v-prefixed --version would not resolve.

Comment on lines +46 to +52
# v1.3.x ONLY — do not use against a v1.4+ chart.
helm --kube-context $CTX upgrade --install cozy-installer \
oci://ghcr.io/cozystack/cozystack/cozy-installer \
--version $INSTALLER_VERSION \
--namespace kube-system \
--set cozystackOperator.variant=$INSTALLER_VARIANT \
--wait --timeout 10m
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The Helm command uses $INSTALLER_VERSION directly, which might contain the v prefix (e.g., v1.3.3). Helm's OCI client expects the exact tag without the v prefix. To prevent installation failures, normalize the version string to $INSTALLER_VERSION_OCI before running the helm command, matching the behavior in SKILL.md.

Suggested change
# v1.3.x ONLY — do not use against a v1.4+ chart.
helm --kube-context $CTX upgrade --install cozy-installer \
oci://ghcr.io/cozystack/cozystack/cozy-installer \
--version $INSTALLER_VERSION \
--namespace kube-system \
--set cozystackOperator.variant=$INSTALLER_VARIANT \
--wait --timeout 10m
# v1.3.x ONLY — do not use against a v1.4+ chart.
# Normalise: v1.3.3 → 1.3.3 (Helm's OCI client matches the registry tag as-is)
INSTALLER_VERSION_OCI="${INSTALLER_VERSION#v}"
helm --kube-context $CTX upgrade --install cozy-installer \
oci://ghcr.io/cozystack/cozystack/cozy-installer \
--version "$INSTALLER_VERSION_OCI" \
--namespace kube-system \
--set cozystackOperator.variant=$INSTALLER_VARIANT \
--wait --timeout 10m

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in 4a4da47 — the v1.3.x example now normalises to $INSTALLER_VERSION_OCI as well.

--output jsonpath='{range .items[?(@.status.conditions[?(@.type=="Ready" && @.status!="True")])]}{.metadata.namespace}/{.metadata.name} {end}'
```

On the full `system`-bundle path you may also want the root tenant's `etcd`/`monitoring`/`seaweedfs` services (this is what cozystack's own `hack/e2e-install-cozystack.bats` patches): extend the patch to `{"spec":{"ingress":true,"host":"<HOST>","monitoring":true,"etcd":true,"seaweedfs":true}}` when those were selected in Phase 4. Leave them at their defaults otherwise.
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

In the suggested patch command, the placeholder <HOST> is used instead of the variable ${HOST}. For consistency with the rest of the script and to ensure correct execution by the skill interpreter, please use ${HOST} instead of <HOST>.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in eed8670 — the extended patch example now uses ${HOST} to match the watch-loop command above it.

@lexfrei Aleksei Sviridkin (lexfrei) marked this pull request as ready for review May 30, 2026 12:13
Copy link
Copy Markdown

@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

🤖 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 `@plugins/cozystack/skills/cluster-install/references/values-template.md`:
- Around line 124-125: Update the "After Package apply" example to patch both
the root tenant CR fields required by the Phase 8 watch loop: set spec.host to
the Package publishing.host value and set spec.ingress: true; locate the root
tenant CR editing command/example in values-template.md and modify it so it
writes both spec.host and spec.ingress (refer to the root tenant CR, spec.host,
spec.ingress, and the Phase 8 watch loop) instead of only patching ingress.
- Around line 31-37: The helm example uses $INSTALLER_VERSION directly which
fails if callers include a leading "v"; update the docs/snippet to explicitly
normalize the installer tag by stripping a leading "v" when used in the helm
--version argument (e.g., use the shell-parameter form that removes a leading v
such as ${INSTALLER_VERSION#v}) and mention in the surrounding text that OCI
chart tags must be X.Y.Z (no "v"); change the helm line that contains --version
$INSTALLER_VERSION to use the normalized form and keep the rest
(cozystackOperator.variant, --namespace cozy-system, --create-namespace)
unchanged.

In `@plugins/cozystack/skills/cluster-install/SKILL.md`:
- Around line 643-644: Scan SKILL.md for hardcoded namespace snippets
referencing "kube-system" (especially in operator-facing plan/actions/artifacts
and NOTES/install snippets mentioning "cozy-installer") and update them to the
v1.4+ default "cozy-system" unless the snippet is explicitly guarded by an
installer_version legacy branch for v1.3.x; ensure any examples or command lines
that create or reference the namespace match the guidance in
references/values-template.md, preserve the v1.3 `--namespace kube-system` form
only inside explicit legacy sections, and verify all occurrences of
"cozy-installer" namespace usage are aligned or commented as legacy.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 344f950d-6fc7-4771-b271-29a3d88569aa

📥 Commits

Reviewing files that changed from the base of the PR and between 8783bcf and 0a205c1.

📒 Files selected for processing (2)
  • plugins/cozystack/skills/cluster-install/SKILL.md
  • plugins/cozystack/skills/cluster-install/references/values-template.md

Comment thread plugins/cozystack/skills/cluster-install/SKILL.md
…helm commands

The cozy-installer OCI chart tags are published as X.Y.Z with no leading
v (verified against the ghcr registry), but both helm command examples in
the reference passed $INSTALLER_VERSION verbatim. An operator-supplied
v1.4.2 would not match the registry tag 1.4.2 and the install would fail.
Strip the leading v into $INSTALLER_VERSION_OCI before --version, matching
what SKILL.md Phase 6 already does.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
…tem namespace

Phase 6 was updated to the v1.4 release layout (cozy-system,
--create-namespace, pre-install labeler hook), but the plan-view summary,
the artifacts summary, and the issue reproduction template still described
the v1.3 form where cozy-installer lived in kube-system and the chart
templated the namespace itself. An operator following those leftover
snippets would run --namespace kube-system against a v1.4 chart and the
labeler hook would abort the install. Bring all three in line with Phase 6.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Phase 8.6 was changed to create default StorageClasses whenever the live
cluster comes up empty, on the finding that v1.4.2 does not auto-create
them. But two sibling references still asserted the opposite — that v1.4+
exposes tenants.apps.cozystack.io spec.storageClasses and the operator
creates the classes from the tenant declaration. That field is absent from
the shipped tenant CRD on v1.4.2 and from the monorepo source through
current HEAD, so nothing auto-creates StorageClasses on v1.4 either. Align
the pitfall note and the wizard preflight entry with the live-gate guidance
so the bundle no longer carries contradictory instructions.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
…here

The Phase 8 watch loop was updated to set both spec.host and spec.ingress
on the root tenant, because it ships with spec.host: "" and does not
inherit publishing.host. Every other spot still patched or described ingress
alone: the plan-view action list, the standing rule in the lessons section,
the system-bundle extended-patch example (which also used a <HOST>
placeholder instead of ${HOST}), the After Package apply reference snippet,
and the stalled-install recovery snippet in known-failures. Set host in all
of them so no example leaves the per-tenant ingress objects rendering
against an empty domain.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Copy link
Copy Markdown

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

🧹 Nitpick comments (1)
plugins/cozystack/skills/cluster-install/references/provider-pitfalls.md (1)

81-81: 💤 Low value

Consider a version-agnostic heading to reduce maintenance.

The heading explicitly lists "v1.3.x and v1.4.2", but line 85 states the issue persists "through current HEAD", suggesting it affects versions beyond v1.4.2. A version-specific heading will require updates whenever a new release continues the same behavior. Consider a more general heading like "Cozystack does not create StorageClasses automatically" and document affected versions in the mechanism paragraph where they're already detailed.

🤖 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 `@plugins/cozystack/skills/cluster-install/references/provider-pitfalls.md` at
line 81, Update the versioned heading "## Cozystack does not create
StorageClasses automatically (v1.3.x and v1.4.2)" to a version-agnostic title
such as "## Cozystack does not create StorageClasses automatically", and move
the specific version details currently in the mechanism paragraph (which notes
the behavior persists "through current HEAD") into that paragraph so affected
versions are documented there instead of in the heading.
🤖 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.

Nitpick comments:
In `@plugins/cozystack/skills/cluster-install/references/provider-pitfalls.md`:
- Line 81: Update the versioned heading "## Cozystack does not create
StorageClasses automatically (v1.3.x and v1.4.2)" to a version-agnostic title
such as "## Cozystack does not create StorageClasses automatically", and move
the specific version details currently in the mechanism paragraph (which notes
the behavior persists "through current HEAD") into that paragraph so affected
versions are documented there instead of in the heading.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f523b947-54e3-42e8-8b15-832d69990cfa

📥 Commits

Reviewing files that changed from the base of the PR and between 0a205c1 and eed8670.

📒 Files selected for processing (6)
  • plugins/cozystack/skills/cluster-install/SKILL.md
  • plugins/cozystack/skills/cluster-install/references/issue-templates.md
  • plugins/cozystack/skills/cluster-install/references/known-failures.md
  • plugins/cozystack/skills/cluster-install/references/provider-pitfalls.md
  • plugins/cozystack/skills/cluster-install/references/values-template.md
  • plugins/cozystack/skills/wizard/SKILL.md
✅ Files skipped from review due to trivial changes (2)
  • plugins/cozystack/skills/wizard/SKILL.md
  • plugins/cozystack/skills/cluster-install/references/issue-templates.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • plugins/cozystack/skills/cluster-install/references/values-template.md
  • plugins/cozystack/skills/cluster-install/SKILL.md

@lexfrei Aleksei Sviridkin (lexfrei) merged commit 8e61ad5 into main Jun 1, 2026
4 checks passed
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.

2 participants