Skip to content

fix(skill): AI skill drift — dead routing refs, phantom components (B24Slider/B24AuthForm), index.json desync, broken examples #93

Description

@IgorShevchik

Background

Surfaced during the June 2026 multi-angle project audit (documentation review). The skill (skills/b24-ui-nuxt/) is structurally sound (valid frontmatter, 155-line body, one-level-deep references) but has drifted from both the codebase and its own manifest — agents following it today emit non-compiling code.

Checklist

  • Routing table points at 4 non-existent reference files — SKILL.md rows ~59 (auth), 61 (chat), 64 (docs), 66 (editor) reference files that don't exist under references/ (inherited from the nuxt/ui skill). Existing files are only: guidelines/{component-selection,conventions,design-system,forms,icons}, layouts/{dashboard,landing}, recipes/{card-pickers,data-tables,detail-panel,navigation,overlays,settings,task-form}, components.md. Repoint (auth → forms; chat/editor → components.md sections) or delete the rows.
  • Two substantial recipes are orphaned — references/recipes/detail-panel.md (203 lines) and task-form.md (301 lines) are listed in no routing row and not in SKILL.md's Recipes section: an agent will never load them. Add them.
  • Phantom components — component-selection.md:64 recommends B24AuthForm (does not exist anywhere in src/; followed by a stray Russian parenthetical «(документация отсутствует, см. B24Form)»). component-selection.md:59 and components.md:62 name B24Slider; the real component is B24Range (links already point at range.md — only the name is wrong). Full cross-check of all B24* names found exactly these two phantoms.
  • skills/index.json out of sync with disk — files omits references/recipes/card-pickers.md and settings.md (referenced from SKILL.md lines 45-46, 57-58, 65), while listing detail-panel/task-form which SKILL.md never mentions. Since docs advertise npx skills add bitrix24/b24ui, a manifest-driven install delivers a skill with dead routing targets. Regenerate from the tree and add a CI check that the manifest matches find skills -name '*.md'.
  • Broken example code agents copy verbatim — design-system.md:70: <И24Card …> with a Cyrillic И instead of B24Card; icons.md:43: :icon="{AchievementIcon}" binds an object literal (and the template at line 24, :icon="{{ {icon} }}", teaches the same mistake) — should be :icon="AchievementIcon"; conventions.md:102-103: duplicate import PersonIcon (duplicate-identifier error).
  • EN grammar sweep — "for find icons" (SKILL.md:22, conventions.md:55), "ou are using" (conventions.md:151), duplicated LLMs.txt paragraph (SKILL.md:12-14), "for Bitrix24 application" → "for a Bitrix24 application" (SKILL.md + index.json descriptions).

Priority: P1 — this package is shipped to AI agents as ground truth.

Activity

  1. added
    bugSomething isn't working
    documentationImprovements or additions to documentation
    on Jun 9, 2026
  2. IgorShevchik commented on Aug 9, 2026

    @IgorShevchik
    CollaboratorAuthor

    Fixed and merged in #343 🧭

    Every box on the checklist is ticked, plus nine more of the same species that the review round flushed out of files this issue never named. Turns out when you go looking for one dead reference, you find its extended family.

    The routing table no longer sends anyone to auth, chat, docs or editor. Those four were inherited from the nuxt/ui skill and never existed here, which is a fun kind of bug: the agent dutifully tries to load a file, finds nothing, and carries on with whatever it already believed. They now point at the sections of components.md that actually cover chat, the editor and markdown. detail-panel.md and task-form.md — 500 lines of genuinely good material that no row named — are routed too, and icons finally got the row it never had.

    The phantoms are gone. B24Slider is B24Range (the links were right the whole time, only the name was wrong), UFieldGroup is B24FieldGroup, and B24AuthForm — which the skill recommended for every login page, alongside a Russian parenthetical quietly admitting there were no docs — never existed at all. Login pages now compose what does:

    <B24Form :schema="schema" :state="state" @submit="onSubmit">
      <B24FormField label="Email" name="email">
        <B24Input v-model="state.email" type="email" autocomplete="username" />
      </B24FormField>
      <B24FormField label="Password" name="password">
        <B24Input v-model="state.password" type="password" autocomplete="current-password" />
      </B24FormField>
    </B24Form>

    And the examples now run. The worst one was card-pickers.md, which imported LayoutGridIcon, LayoutListIcon and LayoutKanbanIcon from a package that has no icon named Layout anything — and, in a detail I enjoyed rather more than I should have, that file was one of the two this same PR added to index.json. It had just started shipping to agents, and it failed on first use. Also fixed: the Cyrillic И in <И24Card>, :icon="{AchievementIcon}" binding an object where a component belongs, variant="ghost" on seven buttons (there is no variant prop — the skill's own forms guideline said so, two files away), color="neutral" matching no key in the theme, an undefined PlusLIcons, and form.clearErrors() for what is actually clear().

    Special mention for Core rule 3, the single highest-traffic sentence in the package, which told every agent to read .nuxt/ui/<component>.ts. We write to .nuxt/b24ui/. The sibling design-system guideline had it right; the rule had been quietly wrong since the fork.

    The part that matters most is that none of this can come back silently. test/utils/skill-manifest.spec.ts runs ten checks in CI: component names under both registered prefixes (B24* and Prose* — an earlier draft accepted 35 names that do not exist, because prose components are registered differently), icon imports against the very metadata file the skill tells agents to search, links that must resolve inside the installed package, manifest parity in both directions, and routing checked both ways — because "listed but unreachable" is exactly how detail-panel.md got lost. Every check was mutation-tested against the defect it guards.

    Want to see it work? Try:

    Using the b24ui skill, build a settings page with a layout picker (table / list / kanban) and a login form. Follow the routing table and load only the references it names.

    Nothing in the npm package changed — skills/ is not published — so this ships as a docs entry rather than a version bump.

    Two follow-ups filed with full context: #344 (generate index.json and the components.md table from the docs frontmatter, so those two cannot drift at all) and #345 (guard prop and colour names, not just identifiers — the one gap the new checks can't see).

    Thanks from Igor 🙏


    Generated by Claude Code

  3. added a commit that references this issue on Sep 14, 2026
    0fb88ac
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

    bugSomething isn't workingdocumentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions