Skip to content

fix(ux/auth): name only the missing password criteria, not all four - #470

Merged
cristim merged 5 commits into
feat/multicloud-web-frontendfrom
claude/ux-reset-password-criterion-messages
May 19, 2026
Merged

fix(ux/auth): name only the missing password criteria, not all four#470
cristim merged 5 commits into
feat/multicloud-web-frontendfrom
claude/ux-reset-password-criterion-messages

Conversation

@cristim

@cristim cristim commented May 15, 2026

Copy link
Copy Markdown
Member

Summary

QA review on the reset-password / admin-setup / profile-change / user-create flows found that when a new password fails multiple complexity rules at once, the form surfaces a single bundled message listing every rule ("uppercase, lowercase, number, and special") even when only one is missing. The length rule already returns its own targeted message; complexity was the only diverger.

Fix

frontend/src/auth.ts:

  • Add describePasswordValidationError(password) that returns a single specific message ("Password must contain one uppercase letter") when one rule fails, or names only the rules that actually failed when several fail ("Password must contain one uppercase letter and one special character"). Length keeps its own message.
  • Replace the four duplicated bundled-message blocks at:
    • handleResetPasswordSubmit (reset-password modal)
    • handleAdminSetupSubmit (admin bootstrap modal)
    • profile change-password flow
    • frontend/src/users/userModals.ts::saveUser (admin-creating-a-user)

Result: 2 files, +38 / −51.

Closes #458.

Test plan

  • go build ./... (no Go change, sanity)
  • Open Settings → Profile → Change Password and submit a password missing only "one number" → message names just "one number".
  • Same with a password missing 2 rules → message names exactly those two.
  • Same in the user-create modal as an admin.
  • Reset-password link with a too-short password still says "Password must be at least 12 characters long".

Out of scope

  • The backend's validateCharacterRequirements (internal/auth/service_password.go) still emits a bundled message; the live indicator on the modal usually short-circuits before the request goes out, so the backend message is rarely user-visible. If we want full parity, that's a follow-up — the live indicators already mirror the new copy.

Additional fixes (2026-05-20)

Review of PR #470 surfaced two pre-existing UX gaps in the Profile change-password modal that the original PR did not touch (it only changed text). Added in commit adc33db:

  • Finding A — Profile modal lacks live password indicators. Reset-password and admin-setup both render the password-requirements block with req-* rows that turn green as each rule is satisfied; the Profile modal had none. Replicated the same block under #profile-new-password with a profile-req- ID prefix (so it cannot collide with the reset / setup indicators if both modals are mounted concurrently), and wired the input event to updatePasswordRequirements(value, 'profile-req-'). The existing helper already accepts a prefix parameter — no helper change needed.
  • Finding B — saveProfile uses alert() for password-validation failures while reset / setup use inline <div class="error-message">. Now that PR fix(ux/auth): name only the missing password criteria, not all four #470 unified the failure TEXT, the surface was the only inconsistency left. Added <div id="profile-password-error" class="error-message hidden"> next to the password fields and routed both new-password validation paths (length/complexity + confirm-mismatch) through it. Other saveProfile paths (missing current password, success toast, API error) keep their existing alert(...) surface — out of scope here.

Tests: four new cases in frontend/src/__tests__/auth.test.ts covering live indicator rendering, criterion class toggling on input, indicator + error reset on reopen, and inline-error rendering for the length/complexity failure path. Existing save profile validates new password confirmation case updated to assert the inline div and that alert is NOT called.


Generated by Claude Code

Summary by CodeRabbit

  • New Features

    • Centralized password validation with an exported helper and a live requirement indicator used during entry and submission across the app.
  • Bug Fixes

    • Unified, prioritized inline password error messages for resets, account creation, admin setup, and profile updates (min-length first, then missing classes); avoids alert popups.
  • Tests

    • Expanded tests for inline errors, live requirement indicators, and clearing stale indicators when reopening the profile modal.

Review Change Stack

QA review on the reset-password / admin-setup / profile-change / user-create
flows noted that the bundled "must contain at least one uppercase letter,
one lowercase letter, one number, and one special character" message
appears even when only one rule actually fails. The length rule already
returns its own targeted message; complexity was the only diverger.

Add describePasswordValidationError() in auth.ts that returns the
single specific message when one rule fails, or names only the rules
that actually failed when several fail ("Password must contain one
uppercase letter and one special character"). Replace the bundled
string at all four call sites — both modals in auth.ts, the profile
change-password flow, and the user-create modal.

Closes #458.
@coderabbitai

coderabbitai Bot commented May 15, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0ad9e29a-a7ac-483d-8688-c35e235bd891

📥 Commits

Reviewing files that changed from the base of the PR and between adc33db and f01394e.

📒 Files selected for processing (1)
  • frontend/src/__tests__/auth.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/tests/auth.test.ts

📝 Walkthrough

Walkthrough

Adds module-level SPECIAL_CHAR_RE and exported describePasswordValidationError(password); updates profile modal to show a live requirements checklist and inline password errors; replaces duplicated complexity checks in reset-password, admin-setup, and create-user flows with the helper; updates tests to assert inline errors and live indicator behavior.

Changes

Password validation consolidation

Layer / File(s) Summary
Password validation helper
frontend/src/auth.ts
Adds SPECIAL_CHAR_RE and exports describePasswordValidationError(password) which returns "" on success or a prioritized message for length or missing character classes.
Profile modal UI and save wiring
frontend/src/auth.ts
Adds live password requirement checklist (profile-req-*), profile-password-error inline container, autocomplete="new-password" on inputs, wires updatePasswordRequirements(..., 'profile-req-'), resets indicators on open, and uses describePasswordValidationError in saveProfile.
Integrate helper into other flows
frontend/src/auth.ts, frontend/src/users/userModals.ts
Replaces inline complexity checks in reset-password and admin-setup submit handlers and in the create-user flow with calls to describePasswordValidationError, displaying returned messages inline and aborting submission on failure.
Tests: inline errors & live indicators
frontend/src/__tests__/auth.test.ts
Updates profile modal tests to assert inline profile-password-error, adds tests for complexity failure showing inline error, rendering of profile-req-* elements, live met/unmet toggling while typing, and clearing state when modal reopens.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Suggested labels

priority/p2, severity/medium, urgency/this-sprint, type/bug

🐰 I hopped through code to mend the net,
A helper now checks each missing set.
Requirements glow as fingers play,
Inline errors guide the way.
Burrow tidy, passwords kept.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% 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 'fix(ux/auth): name only the missing password criteria, not all four' directly reflects the main change—replacing bundled password error messages with specific messages naming only the missing criteria.
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 claude/ux-reset-password-criterion-messages

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

cristim commented May 16, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review


Generated by Claude Code

@coderabbitai

coderabbitai Bot commented May 16, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get the PR diff
gh pr view 470 --repo LeanerCloud/CUDly --json files,additions,deletions,title,body 2>/dev/null || echo "Could not fetch PR details"

# Get the diff
gh pr diff 470 --repo LeanerCloud/CUDly 2>/dev/null | head -300

Length of output: 8440


@cristim: Reviewed the diff. The refactor is clean and achieves its goal well — replacing four near-identical validation blocks with a single, well-documented helper is a clear improvement. Here are a few items to look at before merging:


🔴 Potential regex inconsistency — SPECIAL_CHAR_RE vs. updatePasswordRequirements

The new SPECIAL_CHAR_RE constant is only used inside describePasswordValidationError. The live-indicator function updatePasswordRequirements (not changed in this PR) appears to compute requirements.special internally. If its special-character regex ever diverges from SPECIAL_CHAR_RE, the live indicator could show "all requirements met" while the validator still rejects the password (or vice versa).

Suggestion: export SPECIAL_CHAR_RE and import it inside whatever helper drives updatePasswordRequirements, so both paths share one source of truth:

// auth.ts  — already at module level, just add export
export const SPECIAL_CHAR_RE = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/;

🟡 TypeScript nit — prefer non-null assertion over as string

// current
const last = missing.pop() as string;

// more idiomatic (communicates "we know this is non-null")
const last = missing.pop()!;

Both are safe here because the missing.length === 0 / === 1 guards precede the call, but ! is the conventional TypeScript idiom for "cannot be undefined at this point."


🟡 Test plan items not checked

All four manual test items are still unchecked in the PR description. They're all straightforward to verify in a browser — worth ticking off before merge to confirm the fix covers the reset-password, admin-setup, profile-change, and user-create flows end-to-end.


✅ Positive notes

  • The missing.join(', ') + ' and ' + last composition handles 1, 2, and 3+ failing rules correctly without any special-casing.
  • Wording is now consistent across all four flows (e.g. saveUser previously said "Password must be at least 12 characters" without "long"; saveProfile said "New password must…"; both are now unified).
  • SPECIAL_CHAR_RE being hoisted to module level avoids recompiling the regex on every call — good micro-optimisation.
  • Exporting describePasswordValidationError makes it unit-testable in isolation if/when test coverage is added for these flows.
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

CodeRabbit on #470: updatePasswordRequirements (the live ○/✓ indicator)
had its own inline /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/ regex while
describePasswordValidationError used SPECIAL_CHAR_RE — if either ever
edited the character set without the other, the live indicator and
the submit-time validator would silently disagree (indicator says "all
green" while validator still rejects, or vice versa).

Hoist SPECIAL_CHAR_RE to module-level (before updatePasswordRequirements
so both can read it) and replace the inline literal. Also swap the
"missing.pop() as string" assertion for the conventional non-null "!"
since the length-guard above proves it's defined.

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

🧹 Nitpick comments (1)
frontend/src/auth.ts (1)

168-191: ⚡ Quick win

Use the same special-character regex for live and submit-time checks.

describePasswordValidationError uses SPECIAL_CHAR_RE (Line 186), but updatePasswordRequirements still has a separate inline regex (Line 157). Reusing one constant avoids future drift between inline indicators and submit-time errors.

♻️ Proposed refactor
 function updatePasswordRequirements(password: string, prefix = 'req-'): void {
   const requirements = {
     length: password.length >= 12,
     uppercase: /[A-Z]/.test(password),
     lowercase: /[a-z]/.test(password),
     number: /[0-9]/.test(password),
-    special: /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)
+    special: SPECIAL_CHAR_RE.test(password)
   };
🤖 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 `@frontend/src/auth.ts` around lines 168 - 191, The password-special-character
regex is duplicated: describePasswordValidationError uses SPECIAL_CHAR_RE but
updatePasswordRequirements uses an inline regex; this can drift. Modify
updatePasswordRequirements to import/use the existing SPECIAL_CHAR_RE constant
instead of its inline /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/ regex so both live
UI indicators and submit-time validation (functions updatePasswordRequirements
and describePasswordValidationError) use the same canonical regex constant.
🤖 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 `@frontend/src/auth.ts`:
- Around line 168-191: The password-special-character regex is duplicated:
describePasswordValidationError uses SPECIAL_CHAR_RE but
updatePasswordRequirements uses an inline regex; this can drift. Modify
updatePasswordRequirements to import/use the existing SPECIAL_CHAR_RE constant
instead of its inline /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/ regex so both live
UI indicators and submit-time validation (functions updatePasswordRequirements
and describePasswordValidationError) use the same canonical regex constant.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f9bc663d-d25d-45a4-a7d5-6840ed6d496d

📥 Commits

Reviewing files that changed from the base of the PR and between 09cbc89 and f820195.

📒 Files selected for processing (2)
  • frontend/src/auth.ts
  • frontend/src/users/userModals.ts

cristim commented May 17, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review


Generated by Claude Code

@coderabbitai

coderabbitai Bot commented May 17, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get the PR details including commits
gh pr view 470 --repo LeanerCloud/CUDly --json commits,headRefName,baseRefName,title,state 2>/dev/null

# Get the latest diff
gh pr diff 470 --repo LeanerCloud/CUDly 2>/dev/null | head -400

Length of output: 9297


@cristim: Both items from the previous review have been addressed in the follow-up commit — great turnaround.

Previous findings — resolved ✅

# Finding Status
🔴 SPECIAL_CHAR_RE shared between updatePasswordRequirements and describePasswordValidationError ✅ Fixed — SPECIAL_CHAR_RE is now hoisted to module level and updatePasswordRequirements reads it via SPECIAL_CHAR_RE.test(password) instead of an inline literal
🟡 missing.pop() as string → prefer ! ✅ Fixed — swapped to missing.pop()!

No new issues found. The diff is clean: the constant placement, guard logic, message composition, and import in userModals.ts all look correct.

One remaining non-code item 🟡

The manual test plan checkboxes in the PR description are still unchecked. Worth ticking them off for the four flows (reset-password, admin-setup, profile-change, user-create) before merging — just to confirm the error message surfaces correctly end-to-end.

[approve]

@cristim

cristim commented May 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai full review

The previous review flagged that updatePasswordRequirements used an inline special-character regex while describePasswordValidationError used SPECIAL_CHAR_RE, risking drift. Commit ce1398b hoists SPECIAL_CHAR_RE to module scope and uses it in both call sites, so the inline regex no longer exists. Requesting a fresh pass on frontend/src/auth.ts to confirm the fix and surface anything else.


Generated by Claude Code

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get the full current content of frontend/src/auth.ts from the PR branch
gh pr diff 470 --repo LeanerCloud/CUDly 2>/dev/null

echo "=== FULL FILE CONTENT ==="
# Also get the actual file content from the PR branch
gh api repos/LeanerCloud/CUDly/contents/frontend/src/auth.ts?ref=claude/ux-reset-password-criterion-messages 2>/dev/null | jq -r '.content' | base64 -d

Length of output: 35709


@cristim: Fresh pass complete. Here's the full picture:


✅ Previously flagged items — confirmed fixed

Finding Status
SPECIAL_CHAR_RE drift risk ✅ Resolved — constant is at module scope; updatePasswordRequirements now reads SPECIAL_CHAR_RE.test(password) and describePasswordValidationError does the same. Single source of truth confirmed in both call sites.
missing.pop() as string ✅ Resolved — missing.pop()! is in place.

🔍 Additional findings from the full file

describePasswordValidationError logic — correct ✅

  • Length guard fires first and returns its own message; complexity checks only run when password.length >= 12. This correctly mirrors the live-indicator behavior where length and complexity are separate rows.
  • Priority order (uppercase → lowercase → number → special) matches the live-indicator display order.
  • Message composition for 1 / 2 / 3+ failures all produce grammatically correct output.
  • Empty string input ("") returns 'Password must be at least 12 characters long' — correct.

SPECIAL_CHAR_RE not exported — low priority 🟡
Both usages (updatePasswordRequirements and describePasswordValidationError) are in the same module, so drift is structurally impossible without a code change touching the constant itself. Exporting it would only matter if a future caller in another module needs it — fine to defer.

Profile modal lacks live password indicators — pre-existing, out of scope 🟡
The profile change-password form has no req-* DOM elements, so updatePasswordRequirements is never wired up there. Users only see the error on submit. This predates the PR and is not made worse by it — worth tracking as a follow-up UX improvement if desired.

saveProfile uses alert() while reset/setup use an error <div> — pre-existing, out of scope 🟡
The alert() vs inline-error-div inconsistency was already present before this PR. The messaging text is now at least unified via describePasswordValidationError.


Summary

No new issues introduced. The SPECIAL_CHAR_RE unification is solid, the message helper is correct, and the four validation sites are consistently handled. The PR is ready to merge.

✅ Actions performed

Full review triggered.

The Profile change-password modal was the only password-entry flow
without live `req-*` criterion indicators and the only one that
surfaced password-validation failures via `alert(...)` instead of an
inline `<div class="error-message">`. PR #470 unified the failure TEXT
across all four flows; this commit closes the remaining two UX gaps so
the surface matches too.

- Replicate the five `password-requirements` rows from the reset /
  admin-setup modals under `#profile-new-password`, using a
  flow-specific `profile-req-` ID prefix so they cannot collide with
  the reset (`req-`) or setup (`setup-req-`) indicators if both modals
  are ever mounted concurrently. `updatePasswordRequirements` already
  takes a prefix parameter — no helper change needed.
- Wire `input` events on the new-password field to the live updater.
  Listener is registered once on initial modal creation (the modal
  DOM is reused across opens), and each `openProfileModal` call resets
  the indicators to their empty-input state so a previous session's
  check-marks don't bleed in.
- Add `<div id="profile-password-error" class="error-message hidden">`
  next to the password fields and route both new-password validation
  paths (length/complexity via `describePasswordValidationError`, plus
  the confirm-mismatch path) through it instead of `alert(...)`. The
  error clears on every submit attempt and on modal reopen. Other
  `saveProfile` paths (missing current password, success toast, API
  error) keep their `alert(...)` surface — out of scope here.

Also add `autocomplete="new-password"` to the two profile password
inputs so password managers don't auto-fill the user's stored
credential into "new password" fields (parity with reset / setup).

Tests: four new cases in the profile-modal suite covering live
indicator rendering, criterion class toggling on input, indicator +
error reset on reopen, and inline-error rendering for the
length/complexity failure path. The existing
`save profile validates new password confirmation` test was updated
to assert the inline div surface and that `alert` is NOT called.
@cristim

cristim commented May 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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

🧹 Nitpick comments (1)
frontend/src/__tests__/auth.test.ts (1)

542-568: ⚡ Quick win

Re-query profile-password-error after reopening the modal.

This test keeps a pre-reopen errorDiv reference and asserts it after reopen. If the modal is re-rendered, that reference may be stale and not represent the live DOM.

Proposed test hardening
-      const errorDiv = document.getElementById('profile-password-error') as HTMLElement;
-      errorDiv.textContent = 'old error';
-      errorDiv.classList.remove('hidden');
+      const errorDiv = document.getElementById('profile-password-error') as HTMLElement;
+      errorDiv.textContent = 'old error';
+      errorDiv.classList.remove('hidden');
@@
-      expect(errorDiv.textContent).toBe('');
-      expect(errorDiv.classList.contains('hidden')).toBe(true);
+      const reopenedErrorDiv = document.getElementById('profile-password-error') as HTMLElement;
+      expect(reopenedErrorDiv.textContent).toBe('');
+      expect(reopenedErrorDiv.classList.contains('hidden')).toBe(true);
🤖 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 `@frontend/src/__tests__/auth.test.ts` around lines 542 - 568, The test
"reopening profile modal resets stale indicators and error" holds a stale
reference in errorDiv to '`#profile-password-error`' before the modal is closed;
after the modal is re-opened you must re-query the DOM for that element and use
the fresh reference in assertions. Update the test to call
document.getElementById('profile-password-error') (or querySelector) again after
userEmail.click() and awaiting, then assert on that fresh element's textContent
and classList; keep the existing checks for 'profile-req-length' and
'profile-req-uppercase' as-is.
🤖 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 `@frontend/src/__tests__/auth.test.ts`:
- Around line 542-568: The test "reopening profile modal resets stale indicators
and error" holds a stale reference in errorDiv to '`#profile-password-error`'
before the modal is closed; after the modal is re-opened you must re-query the
DOM for that element and use the fresh reference in assertions. Update the test
to call document.getElementById('profile-password-error') (or querySelector)
again after userEmail.click() and awaiting, then assert on that fresh element's
textContent and classList; keep the existing checks for 'profile-req-length' and
'profile-req-uppercase' as-is.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fe086905-0016-476d-8245-6105b2de90cd

📥 Commits

Reviewing files that changed from the base of the PR and between ce1398b and adc33db.

📒 Files selected for processing (2)
  • frontend/src/__tests__/auth.test.ts
  • frontend/src/auth.ts

claude and others added 2 commits May 19, 2026 22:04
CodeRabbit on #470: the "reopening profile modal resets stale
indicators and error" test caches errorDiv before close-and-reopen
and then asserts on it. The close-and-reopen path re-renders the
modal, so the cached reference is detached from the live DOM and
the assertions would silently pass even if the new modal regressed.

Re-query #profile-password-error after the reopen, matching the
pattern already used for #profile-req-length / #profile-req-uppercase
two lines above.
@cristim

cristim commented May 19, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cristim
cristim merged commit e2cd496 into feat/multicloud-web-frontend May 19, 2026
5 checks passed
@cristim
cristim deleted the claude/ux-reset-password-criterion-messages branch May 19, 2026 22:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

effort/s Hours impact/many Affects most users priority/p3 Polish / idea / may never ship severity/low Minor harm triaged Item has been triaged type/feat New capability urgency/eventually No deadline

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants