Skip to content

Tighten textbox skill fuzzy filtering#5348

Merged
lawrencecchen merged 15 commits into
mainfrom
issue-textbox-skill-fuzzy-filter
Jun 5, 2026
Merged

Tighten textbox skill fuzzy filtering#5348
lawrencecchen merged 15 commits into
mainfrom
issue-textbox-skill-fuzzy-filter

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

  • stop scoring textbox mention candidates against absolute subtitle paths
  • index skills by skill name plus relative skill-pack path so /iterate-pr and $iterate-pr beat broad path-only fuzzy matches
  • clear stale bare-trigger rows when the same trigger changes to a non-empty query, showing loading until exact results arrive

Verification

  • git diff --check
  • python3 scripts/lint_auxiliary_window_close_shortcuts.py
  • cmux-policy-check --mode local
  • ./scripts/reload-cloud.sh --tag fuzzy

Local xcodebuild tests were not run because this repo forbids local test actions on the user Mac.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Medium Risk
Touches NSTextView text-change/insert paths and mention indexing used on every keystroke; behavior is well covered by new unit and UI tests but regressions could affect input or completion UX.

Overview
Tightens textbox skill mention search and keeps the completion popover in sync while typing.

Skill indexing and ranking no longer treat absolute subtitle paths as searchable text; skills are keyed by name plus relative pack path, and the candidate index prefilters with token matching before ranking so weak path-only fuzzy hits (e.g. iterate surfacing unrelated skills) drop out. Nucleo probe results are validated with Swift ranking and only fall back to a full-corpus pass when the probe may have missed matches.

The mention controller clears suggestions when crossing bare trigger ↔ typed query or changing trigger/root; while the query narrows on the same trigger it filters visible stale rows in place instead of flashing empty. TextBoxInputTextView refreshes completions from didChangeText / outer insertText, with isHandlingDidChangeText so delegate notifications do not double-refresh; debug mention fields and an XCUITest path exercise $ + iterate filtering via the automation socket.

Reviewed by Cursor Bugbot for commit 611714a. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Improves textbox skill mentions so exact skill names rank first, weak path-only fuzzy matches are filtered out, and the popover shows only relevant rows while you type. Safer text-change handling avoids duplicate scans, and new debug fields support an end-to-end UI test.

  • Bug Fixes

    • Ranking: drop subtitle paths from the corpus; index by “name + relative pack path”; token pre-filter the corpus and honor cancellation; never merge nucleo rows; after a nucleo probe, return Swift-ranked matches and only run a full Swift pass if the probe likely missed and the limit isn’t filled.
    • Popover/refresh: clear rows on trigger/root changes and when moving between a bare trigger and a non-empty query; when narrowing a non-empty query, filter visible stale rows in place (≤500) and mark them non-current; refresh on didChangeText and after direct insertText, with guards to avoid duplicate scans and safer insertText/attachment cleanup ordering; expose mention state (active/query/trigger/loading/current) and titles for automation; add a UI test that types after a bare $ trigger and harden socket diagnostics/launch.
  • Refactors

    • Docs: move Swift interpreter guidance into a central knowledge reference.

Written for commit 611714a. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Improvements

    • Faster, more reliable mention ranking: probes can return final top matches sooner and avoid merging partial probe results with full-corpus rankings.
    • Indexing and matching improvements to surface candidates by title/search key and reduce path-based fuzzy false positives.
    • Smarter suggestion refresh: clears on empty→non-empty transitions; otherwise filters visible stale suggestions in-place.
    • Added debug-only hooks exposing current suggestion titles and mention state.
  • Tests

    • Added/updated tests covering ranking, refresh transitions, filtering, and stale-suggestion behavior.

@vercel

vercel Bot commented Jun 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Canceled Canceled Jun 5, 2026 5:48am
cmux-staging Building Building Preview, Comment Jun 5, 2026 5:48am

@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Indexing now uses a relative-path-based skill searchKey and omits subtitle; nucleo probing returns Swift-ranked probed matches when present or falls back to full-corpus Swift ranking; completion refresh clears or filters stale suggestions on trimmed empty→non-empty transitions; tests and DEBUG accessors added.

Changes

Mention Search and Index Refresh

Layer / File(s) Summary
Skill search key helper
Sources/TextBoxMentionIndexStore.swift
New private helper skillSearchKey(skillName:skillURL:rootURL:) computes a searchable key by deriving the skill's directory relative path to the provided root, concatenating with skill name, and lowercasing. Updated index creation to call this helper.
Candidate indexing and nucleo/Swift ranking
Sources/TextBoxMentionCandidateIndex.swift, Sources/TextBoxMentionIndexStore.swift
Candidate corpus entries now index title + searchKey (subtitle removed). When nucleo probing yields a probed subset, that subset is Swift-ranked and returned if sufficiently populated; otherwise Swift ranking runs over the full corpus. Swift ranking pre-filters entries with a per-token mention predicate. The previous merged-rank helper was removed.
Completion controller stale-filter and debug accessor
Sources/TextBoxMentionCompletionController.swift
Adds maxVisibleStaleSuggestionsToFilter cap. Treats trimmed empty→non-empty queries as stale-invalidating (clears suggestions); for other per-keystroke text edits with non-empty trimmed queries, filters visible stale suggestions in-place using normalized sequential-title matching. Adds debugSuggestionTitles under #if DEBUG.
TextBoxInput hook and debug state
Sources/TextBoxInput.swift
didChangeText() triggers refreshMentionCompletions() after automatic attachment cleanup. debugInteractionState() now includes mention-related fields; DEBUG-only accessor exposes suggestion titles.
Exact matching and refresh behavior tests
cmuxTests/TextBoxMentionCompletionTests.swift
Adds large-corpus skill-ranking test asserting exact-name precedence and multiple $-trigger refresh tests covering empty→non-empty clearing, unchanged non-empty persistence-as-stale, narrowing-based filtering, return-to-previous-value non-current behavior, and clearing when returning to a bare trigger. Also adds unit tests for candidate filtering and nucleo-unvalidated rows.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • manaflow-ai/cmux#5021: Textbox mention completion/index/controller rewrite overlapping changes to mention search indexing keys and refresh logic.

Poem

🐰 I hop through index and query streams,

Relative paths and tidy schemes,
Stale rows cleared when whispers start,
Narrowed hops still guard the heart,
Exact-name finds the brightest beams.


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore

❌ Failed checks (3 errors, 2 warnings)

Check name Status Explanation Resolution
Cmux Algorithmic Complexity ❌ Error Non-cancellable nested filter over 800 skills violates algorithmic-complexity.md; duplicate mention-refresh per keystroke doubles cost in hot UI path. Add shouldCancel checks to filter loop; remove refreshMentionCompletions() from didChangeText() to avoid duplication.
Cmux Swift Concurrency ❌ Error PR introduces fire-and-forget Task at line 187 with meaningful lifecycle (awaits and mutates state) outside allowed boundaries, violating Swift concurrency modernization rules. Store the Task in a property, convert to async function, or use TaskGroup instead of fire-and-forget Task creation.
Cmux Architecture Rethink ❌ Error Duplicate wiring: Coordinator.textDidChange() and new didChangeText() override both call refreshMentionCompletions(). Non-cancellable prefilter scans entire corpus ignoring shouldCancel flag. Remove didChangeText() override and make prefilter respect shouldCancel per review comments.
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.
Description check ⚠️ Warning The pull request description covers the main changes (indexing, ranking, and popover behavior) and lists verification steps, but is missing required template sections for testing and demo video. Add a 'Testing' section describing manual verification and how the changes were tested locally. Include a 'Demo Video' section with a link if UI behavior changed, or note if not applicable.
✅ Passed checks (13 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Tighten textbox skill fuzzy filtering' is concise and directly relates to the main changes, which focus on improving skill mention ranking and popover behavior by tightening search 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.
Cmux Swift Actor Isolation ✅ Passed No Swift 6 actor isolation violations. @MainActor TextBoxMentionCompletionController and actor TextBoxMentionIndexStore properly isolate mutable state; all value types correctly marked Sendable.
Cmux Swift Blocking Runtime ✅ Passed No blocking synchronization primitives detected in production changes. Code uses proper async/await with @MainActor, actor-based isolation, and Task patterns throughout.
Cmux No Hacky Sleeps ✅ Passed PR contains only Swift files. Check scope is TypeScript, JavaScript, shell, and non-Swift build/runtime scripts; Swift timing covered by swift-blocking-runtime.md instead. Check not applicable.
Cmux Swift @Concurrent ✅ Passed No @concurrent annotation violations found. Actor methods correctly access isolated state without @concurrent, and UI callers properly use Task{} explicit hops for heavy async work.
Cmux Swift File And Package Boundaries ✅ Passed Existing files touched minimally (TextBoxInput +14 lines, IndexStore +10); new files under 400 lines with coherent single responsibilities; fits allowed cases for incidental changes to large files.
Cmux Swift Logging ✅ Passed No logging violations found. Production code lacks prohibited print/debugPrint/dump/NSLog statements. Debug accessors properly #if DEBUG guarded.
Cmux User-Facing Error Privacy ✅ Passed PR introduces no new user-facing errors, alerts, or sensitive data exposure. Changes are internal ranking/filtering logic with debug-only properties guarded by #if DEBUG.
Cmux Full Internationalization ✅ Passed PR contains backend logic changes only. No new user-facing strings without localization. All existing localized strings have full locale coverage. Debug-only methods properly guarded.
Cmux Swiftui State Layout ✅ Passed PR uses modern @Observable (not @Published), passes immutable snapshots to rows, contains no store references in view subtrees, and no render-time state mutations.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds TextBoxMentionCompletionPanel as non-key popover (canBecomeKey=false, .popUpMenu level). Identifier in lint IGNORED_IDENTIFIERS. Lint script passes.
✨ 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 issue-textbox-skill-fuzzy-filter

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.

Comment thread Sources/TextBoxMentionCompletionController.swift Outdated
@greptile-apps

greptile-apps Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR tightens skill-mention fuzzy filtering in the textbox by dropping subtitle paths from the search corpus, indexing skills by name plus relative pack path, adding a token pre-filter before the expensive full-corpus fuzzy search, and revising the nucleo probe pipeline to never merge unvalidated rows. Popover behavior is also improved: stale rows are cleared on bare-trigger ↔ typed-query transitions, filtered in-place when narrowing within a non-empty query, and mention refresh is moved into didChangeText with coordination flags to prevent double-scan on delegate notifications.

  • Ranking/indexing (TextBoxMentionCandidateIndex, TextBoxMentionIndexStore): Subtitle paths removed from searchable texts; searchKey uses relative skill-pack path instead of absolute path; a token pre-filter gates CommandPaletteSearchEngine.search; the nucleo probe no longer merges with Swift results and only falls back to a full-corpus Swift pass when the probe is likely incomplete.
  • Popover state (TextBoxMentionCompletionController): Clear-vs-filter logic now distinguishes bare-trigger ↔ non-empty-query transitions (clear) from within-query narrowing (in-place filter with a 500-row cap); filterVisibleStaleSuggestions runs a simple fuzzy match on titles synchronously on the main actor.
  • Double-refresh guard (TextBoxInput): isHandlingDidChangeText and activeInsertTextDepth/didChangeTextDuringActiveInsertText coordinate insertTextdidChangeText so delegate notifications don't trigger a second refreshMentionCompletions call; debug state now exposes mention query/trigger/loading/titles for UI test automation.

Confidence Score: 5/5

Safe to merge; all changed paths are guarded by new unit and UI tests, and the coordination logic between insertText and didChangeText is correct across both normal and recursive call shapes.

The double-refresh coordination (isHandlingDidChangeText / activeInsertTextDepth) correctly handles both the normal AppKit path (super.insertText → didChangeText fires) and the edge case where AppKit skips didChangeText. The empty↔non-empty transition detection is accurate (previousQueryWasEmpty && !queryIsEmpty), and the in-place stale-row filter is safely bounded at 500 entries and runs synchronously on the main actor. The nucleo probe pipeline change is logically sound, and the searchKey relative-path fix directly addresses the ranking problem described in the PR. No pre-existing issues are worsened.

No files require special attention.

Important Files Changed

Filename Overview
Sources/TextBoxMentionCandidateIndex.swift Removes subtitle path from searchable texts, adds token pre-filter before full fuzzy search, and rewrites nucleo probe path to return Swift-ranked results directly without merging; logic is correct and well-bounded.
Sources/TextBoxMentionCompletionController.swift New clear-vs-filter logic correctly distinguishes bare-trigger↔non-empty transitions (clear) from within-query narrowing (in-place filter); filterVisibleStaleSuggestions caps at 500 and resets suggestionsQuery to keep rows marked non-current.
Sources/TextBoxInput.swift Double-refresh coordination via isHandlingDidChangeText/activeInsertTextDepth is correct; the depth counter handles nested insertText calls and the explicit didChangeText() call in the else branch fires at depth 0, avoiding spurious side effects.
Sources/TextBoxMentionIndexStore.swift skillSearchKey now uses the relative pack path instead of the absolute skill URL path, correctly scoping search scoring to name + relative path.
cmuxTests/TextBoxMentionCompletionTests.swift New unit tests cover ranking preferences, weak-match filtering, nucleo non-merge, stale-row filtering, cancellation during pre-filter, and empty↔non-empty refresh transitions.
cmuxUITests/AutomationSocketUITests.swift New UI test drives bare-$ + typed skill query end-to-end via the automation socket; helpers are test-only scaffolding and do not affect production behavior.

Sequence Diagram

sequenceDiagram
    participant User
    participant TextBoxInputTextView
    participant Coordinator
    participant CompletionController
    participant IndexStore

    User->>TextBoxInputTextView: insertText(_:replacementRange:)
    Note over TextBoxInputTextView: activeInsertTextDepth += 1
    TextBoxInputTextView->>TextBoxInputTextView: super.insertText()
    TextBoxInputTextView->>TextBoxInputTextView: didChangeText()
    Note over TextBoxInputTextView: isHandlingDidChangeText = true
    TextBoxInputTextView->>TextBoxInputTextView: flushAutomaticAttachmentFileCleanup()
    TextBoxInputTextView->>CompletionController: refreshMentionCompletions()
    Note over TextBoxInputTextView: isHandlingDidChangeText = false
    TextBoxInputTextView->>Coordinator: textView(_:didChangeText:) [delegate]
    Note over Coordinator: isHandlingDidChangeText == true → skip refreshMentionCompletions
    Note over TextBoxInputTextView: activeInsertTextDepth -= 1

    CompletionController->>CompletionController: refresh(for:rootDirectory:)
    alt bare trigger → non-empty query (or trigger/root change)
        Note over CompletionController: clear suggestions immediately
    else narrowing within non-empty query
        CompletionController->>CompletionController: filterVisibleStaleSuggestions(≤500 rows)
        Note over CompletionController: suggestionsQuery = nil (marks non-current)
    end
    CompletionController->>IndexStore: suggestions(for:rootDirectory:) [async]
    IndexStore->>IndexStore: TextBoxMentionCandidateIndex.rankedCandidates()
    Note over IndexStore: token pre-filter → swiftRankedCandidates(probedCorpus)<br/>full Swift pass only if probe may have missed results
    IndexStore-->>CompletionController: [TextBoxMentionSuggestion]
    CompletionController->>CompletionController: update suggestions + suggestionsQuery
Loading

Reviews (8): Last reviewed commit: "test: harden textbox mention XCUITest so..." | Re-trigger Greptile

Comment on lines +68 to +69
let queryChangedToNonEmpty = previousActiveQuery?.query != query.query &&
!query.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty

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.

P1 queryChangedToNonEmpty fires on every non-empty keystroke, not just the bare-trigger → first-character transition

The condition checks previousQuery != query.query && !query.query.isEmpty, which is true on every character typed or deleted that leaves a non-empty query — for example, backspacing /iterate-pr to /iterate-p sets it to true and clears the stale rows. The name and the PR description ("clear stale bare-trigger rows when the same trigger changes to a non-empty query") imply the intent is the empty→non-empty edge only, but the implementation acts on any→non-empty. The old test explicitly asserted that editing within the same trigger kept rows visible; that assertion was removed rather than updated, so there is no coverage of the typing-within-a-query path. Every keystroke beyond the first now shows a loading spinner instead of the previous results, which is the flicker the original design was trying to avoid.

Suggested change
let queryChangedToNonEmpty = previousActiveQuery?.query != query.query &&
!query.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
let previousQueryWasEmpty = (previousActiveQuery?.query ?? "")
.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
let queryChangedToNonEmpty = previousQueryWasEmpty &&
!query.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty

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 3b699f7 by making the clear condition require the previous query to be empty. Added a regression test that keeps rows visible when a same-trigger query stays nonempty.

— Claude Code

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 4 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread Sources/TextBoxMentionCompletionController.swift Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4d789aa. Configure here.

Comment thread Sources/TextBoxMentionCompletionController.swift
coderabbitai[bot]
coderabbitai Bot previously requested changes Jun 5, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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 `@Sources/TextBoxInput.swift`:
- Line 3658: didChangeText() is redundantly calling refreshMentionCompletions()
while TextBoxInputView.Coordinator.textDidChange(_:) already performs that
refresh on every edit; remove the duplicate refresh call from didChangeText()
(or add a guard to skip it when invoked by the coordinator) so
refreshMentionCompletions() is only invoked once per keystroke, and ensure any
non-coordinator code paths that legitimately need a mention refresh still call
refreshMentionCompletions() explicitly.

In `@Sources/TextBoxMentionCandidateIndex.swift`:
- Around line 98-102: The eager prefilter in TextBoxMentionCandidateIndex (where
you compute preparedQuery via CommandPaletteFuzzyMatcher.preparedQuery and then
build filteredEntries with entries.filter { mentionCandidate($0, matches:
preparedQuery) }) must respect cancellation; modify that path to periodically
call the provided shouldCancel() closure (or Task.isCancelled) while scanning
entries and abort early if it returns true. Replace the single eager
entries.filter call with a cancellable loop or a lazy sequence that checks
shouldCancel() between iterations, returning an empty result immediately when
cancelled so the subsequent CommandPaletteSearchEngine.search can bail out
quickly.
🪄 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: ASSERTIVE

Plan: Pro

Run ID: 0dc5ed73-b044-41f7-904f-4c86a803635d

📥 Commits

Reviewing files that changed from the base of the PR and between aa0566c and 8417901.

📒 Files selected for processing (3)
  • Sources/TextBoxInput.swift
  • Sources/TextBoxMentionCandidateIndex.swift
  • cmuxTests/TextBoxMentionCompletionTests.swift

Comment thread Sources/TextBoxInput.swift
Comment thread Sources/TextBoxMentionCandidateIndex.swift

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7b6a29b434

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +4152 to +4154
"mention_should_show": mentionCompletionController.debugShouldShowPopover,
"mention_current": mentionCompletionController.debugHasCurrentSuggestions,
"mention_titles": mentionCompletionController.debugSuggestionTitles

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Guard debug-only completion state in Release builds

In non-DEBUG builds, TextBoxMentionCompletionController does not define debugShouldShowPopover, debugHasCurrentSuggestions, or debugSuggestionTitles because those accessors are inside #if DEBUG, but debugInteractionState() is compiled unconditionally. Building Release or any non-DEBUG configuration will fail to type-check when it reaches these new dictionary entries; wrap these fields in #if DEBUG or use non-debug accessors.

Useful? React with 👍 / 👎.

@lawrencecchen lawrencecchen dismissed coderabbitai[bot]’s stale review June 5, 2026 01:52

Stale CodeRabbit review. Actionable comments were addressed in 7b6a29b, and the latest CodeRabbit check passed/skipped on the current head.

@lawrencecchen lawrencecchen force-pushed the issue-textbox-skill-fuzzy-filter branch from f2b44f2 to bcf22d6 Compare June 5, 2026 05:24
@lawrencecchen lawrencecchen force-pushed the issue-textbox-skill-fuzzy-filter branch from 25d689b to c09de9c Compare June 5, 2026 05:29
@lawrencecchen lawrencecchen force-pushed the issue-textbox-skill-fuzzy-filter branch from c09de9c to 611714a Compare June 5, 2026 05:30
@lawrencecchen lawrencecchen merged commit c3acdb8 into main Jun 5, 2026
19 of 21 checks passed
@lawrencecchen lawrencecchen deleted the issue-textbox-skill-fuzzy-filter branch June 5, 2026 05:34
@vercel vercel Bot temporarily deployed to Preview – cmux June 5, 2026 05:48 Inactive
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