Skip to content

fix(skills-hub): deduplicate search results by identifier, not name#29490

Merged
teknium1 merged 3 commits into
mainfrom
hermes/hermes-3166accf
May 20, 2026
Merged

fix(skills-hub): deduplicate search results by identifier, not name#29490
teknium1 merged 3 commits into
mainfrom
hermes/hermes-3166accf

Conversation

@teknium1

@teknium1 teknium1 commented May 20, 2026

Copy link
Copy Markdown
Contributor

Salvage of #29441 by @EloquentBrush0x onto current main, plus one sibling fix.

Summary

Skill-hub search no longer silently drops browse-sh skills that share task names across different sites (e.g. search-listings from Airbnb, Booking.com, Zillow). Dedup now keys on r.identifier (always globally unique) instead of r.name.

Changes

From @EloquentBrush0x (PR #29441):

  • tools/skills_hub.pyunified_search() dedup key: r.namer.identifier
  • hermes_cli/skills_hub.pydo_browse() and browse_skills() dedup key: same
  • Test updates + 2 new regression tests

Our follow-ups:

  • tools/skills_hub.py — widened the same fix to GitHubSource.search() (line 386), which had the identical bug for multi-tap GitHub configurations
  • tests/hermes_cli/test_skills_hub.py — fixed patch path on the new test_browse_skills_dedup_uses_identifier_not_name test (was patching hermes_cli.skills_hub.create_source_router, but browse_skills() imports it locally from tools.skills_hub)

Validation

  • tests/tools/test_skills_hub.py + tests/hermes_cli/test_skills_hub.py: 133/133 pass
  • E2E: same-name/different-identifier inputs through unified_search() and GitHubSource.search() both return both results after fix; collapsed to 1 before fix

Closes #29441.

Infographic

skills-hub identifier dedup

EloquentBrush0x and others added 3 commits May 20, 2026 14:22
Browse.sh exposes skills by task name (e.g. "search-listings"), which is
shared across hundreds of sites. Deduplicating by name silently dropped
every browse-sh skill after the first one with a given task name — e.g.
only Airbnb's "search-listings" would survive, collapsing Booking.com,
Zillow, and every other site's variant into nothing.

Switch unified_search() and do_browse() to use r.identifier as the dedup
key. identifier is always globally unique (e.g.
"browse-sh/airbnb.com/search-listings-ddgioa"), so same-named skills from
different browse-sh hostnames are preserved as distinct results.

Update existing TestUnifiedSearchDedup tests to model the real scenario
(same identifier appearing from two sources) and add a regression test
that asserts browse-sh skills with the same name but different hostnames
are never collapsed.
browse_skills() is the TUI gateway's API for the web UI skills browser
(tui_gateway/server.py:6574). It had the same dedup-by-name bug as
do_browse() and unified_search() fixed in the parent commit: r.name is
not unique for browse-sh skills (Airbnb, Booking.com, Zillow all publish
"search-listings"), so the dedup loop silently dropped all but the first
skill with each task name.

Switch to r.identifier, which is always globally unique.

Add a regression test asserting that two browse-sh skills with the same
name but different hostnames both appear in the browse_skills() result.
…tch path

Sibling fix on top of @EloquentBrush0x's PR #29441.

- tools/skills_hub.py GitHubSource.search() had the same r.name dedup bug.
  Two configured GitHub taps publishing same-named skills would collapse to one.
- tests/hermes_cli/test_skills_hub.py:test_browse_skills_dedup_uses_identifier_not_name
  patched hermes_cli.skills_hub.create_source_router, but browse_skills() imports
  it locally from tools.skills_hub. Fixed patch path.
@github-actions

Copy link
Copy Markdown
Contributor

🔎 Lint report: hermes/hermes-3166accf vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 8982 on HEAD, 8982 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 4740 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@alt-glitch alt-glitch added type/bug Something isn't working P2 Medium — degraded but workaround exists comp/cli CLI entry point, hermes_cli/, setup wizard tool/skills Skills system (list, view, manage) labels May 20, 2026
@alt-glitch

Copy link
Copy Markdown
Collaborator

Salvage of #29441 with additional fix for GitHubSource.search() dedup. Supersedes #29441.

@teknium1 teknium1 merged commit c6a380e into main May 20, 2026
20 of 21 checks passed
@teknium1 teknium1 deleted the hermes/hermes-3166accf branch May 20, 2026 22:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard P2 Medium — degraded but workaround exists tool/skills Skills system (list, view, manage) type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants