Skip to content

gate-55's hardcoded icon mirror has drifted from nc-vue: it accepts ClipboardList (renders '?') and rejects ClipboardListOutline (correct) #304

Description

@rubenvdlinde

Summary

check_detail_page_discipline.py hardcodes ICON_REGISTRY as a mirror of nc-vue's src/components/CnWidgetGrid/widgetIcons.js. The mirror has drifted by one entry, and it drifted in the direction that makes the gate wrong in both directions at once.

in nc-vue registry in gate mirror
ClipboardList ❌ no ✅ yes
ClipboardListOutline ✅ yes ❌ no

So gate-55 accepts ClipboardList, which renders the ? fallback in the running app, and rejects ClipboardListOutline, which is the correct name.

Measured

Against @conduction/nextcloud-vue as installed (pipelinq's node_modules):

real registry count: 55
mirror count: 55
real NOT in mirror: ClipboardListOutline
mirror NOT in real: ClipboardList

Extracted from the real file by its import statements (vue-material-design-icons/<Name>.vue), which is how the registry is actually built — each icon is imported individually, no barrel.

Why it matters beyond one name

The gate's own comment says the mirror is "a hardcoded mirror — when the registry changes, replace the names below". Nothing enforces that, so the mirror is a silent expiry date, the same shape as the pinned-callee problem. There is no test asserting mirror == registry.

There is a second registry, and gate-55 does not know about it

An icon must be in two places to render:

  1. nc-vue's widgetIcons.js — what gate-55 checks.
  2. The app's own src/icons.js (ADR-077) — what gate-60 checks.

An icon in (1) but not (2) renders with no icon at all — worse than the ? fallback. Measured on pipelinq: Timeline is in nc-vue's registry and in gate-55's mirror, but not in pipelinq's src/icons.js. gate-55 was green on it; only gate-60 caught it.

⚠️ And gate-60 is easy to lose: it reports SKIPPED (wiring) when vue-material-design-icons is absent, which is the default in a fresh worktree without npm ci. In that state gate-55 is the only icon check running, and it is the one with the stale mirror. A broken icon ships under a green board.

Suggested fix

  1. Re-sync the mirror (ClipboardListClipboardListOutline).
  2. Add a test that parses nc-vue's widgetIcons.js and asserts set equality with ICON_REGISTRY, so drift fails loudly instead of silently inverting the verdict.
  3. Consider having gate-55 state in its output that it checks the lib vocabulary only, and that app-level registration is gate-60's job — so a green gate-55 is not read as "this icon renders".

Workaround used in pipelinq#742

Every replacement icon was chosen from the intersection of all three sets (nc-vue registry ∩ gate mirror ∩ src/icons.js), verified before commit.

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