Skip to content

vettd directory download: slug-based addressing can resolve non-deterministically #247

Description

@JTP75

Description

vettd directory download <slug> resolves skills by their public slug, a field explicitly documented as non-unique across the public directory (packages/db/prisma/schema.prisma in the sibling vettd repo: "cosmetic display label; may collide across skills, not routed on"). The server's collision resolution (getSkillBySlug in packages/api/src/directory/directory.ts) is a findFirst with no orderBy, so a slug collision does not deterministically resolve to the same skill on repeat runs — the same download command can silently fetch a different asset depending on row order.

Single-word slug addressing (e.g. vettd directory download s3) also gives no visibility into which repo/owner a download will actually fetch from, which matters more as the directory grows beyond its current single-source-dominated state.

No active user impact has been reported, but this is a real non-determinism, not just an ambiguous name. Raised as a backlog follow-up during review of #169 (epic #176).

Scope

  • Decide how vettd directory download should disambiguate a skill identifier beyond a bare slug.
  • Decide whether slug-collision resolution needs to become deterministic (or explicitly rejected) independent of any addressing change.
  • Cross-repo: touches AgenticHighway/vettd (resolveSkillDownload / getSkillBySlug) and AgenticHighway/vettd-cli (the directory download command's identifier parsing/CLI surface).

Acceptance Criteria

  • Addressing/disambiguation approach is decided
  • Slug-collision resolution is no longer silently non-deterministic
  • Decision covers whether this changes the existing <slug> argument shape (breaking vs. additive)
  • Any implementation work is split into its own follow-up issue(s) once the approach is decided

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions