Skip to content

fix(manifest): register the icons the menu names, and point it at a page that exists - #75

Closed
rubenvdlinde wants to merge 1 commit into
developmentfrom
gates/manifest-icons
Closed

fix(manifest): register the icons the menu names, and point it at a page that exists#75
rubenvdlinde wants to merge 1 commit into
developmentfrom
gates/manifest-icons

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Closes hydra gates 53 and 60 — 6 findings.

Measured

Gate package 48c88ba1e0d049f8f38538c33e790d3e603c55d0.

gate before after
53 effective-manifest-crossref 1 0
60 icon-vocabulary 5 0

Both checkers still report 1 and 5 against origin/development.

The load-bearing finding

Four of gate-60's five findings are name migrations. The fifth is a live defect: src/main.js never called registerIcons(). CnIcon resolves a manifest icon name only through that registry and has no fallback — an unregistered name renders nothing at all: no glyph, no placeholder, no console error.

So migrating icon-dashboardViewDashboardOutline without registering it would have traded an invisible glyph for a missing one. src/icons.js registers the three components; all three are verified present in vue-material-design-icons.

Migration (ADR-077)

where was now
menu dashboards icon-dashboard ViewDashboardOutline (Tier A)
menu adminTemplates icon-template (unbridged) FileReplaceOutline (Tier B)
menu adminSettings icon-settings CogOutline (Tier A)
register Dashboard ViewDashboard ViewDashboardOutline (Tier A MUST)

Also fixed outside gate scope: ManifestController::buildManifest() hardcoded icon-home for every runtime menu entry — the wrong concept as well as a legacy class, since those entries are dashboards. gate-60 reads the JSON manifests, not PHP, so it never saw it; it is the same defect on the path users actually see.

gate-53

The single menu entry LaunchPad ships pointed at /dashboards, which matches no page — this stub's only dashboard page is /dashboards/:id, and the runtime builder emits /<slug>. Retargeted to the page id dashboard-detail, which is the pairing the server itself emits (buildManifest() sets each menu entry's route to its page's id, while the page carries the path).

There is deliberately no /dashboards index page. That rationale lives in the page's own _note, because the v2 schema sets additionalProperties: false on menu entries and rejects a note there — which the first attempt at this fix discovered.

Checks

  • check:manifest: valid
  • eslint src: 0 errors
  • vitest: 638 passed / 638
  • npm run build: compiled

No waivers, no excludes, no threshold changes.

…age that exists

Closes gates 53 and 60.

gate-60 (icon-vocabulary, 5). All three menu icons were legacy `icon-*`
CSS classes, and the register's Dashboard schema used the filled
`ViewDashboard` where ADR-077 Tier A requires the outline. Migrated to the
canonical names: dashboard -> ViewDashboardOutline (Tier A), template ->
FileReplaceOutline (Tier B), settings -> CogOutline (Tier A). An unbridged
`icon-*` renders as an invisible white glyph on NC34+ light themes.

The fifth finding was the load-bearing one: `src/main.js` never called
`registerIcons()`. CnIcon resolves a manifest icon name ONLY through that
registry and has no fallback — an unregistered name renders nothing at
all: no glyph, no placeholder, no console error. So migrating the three
names without registering them would have traded an invisible glyph for a
missing one. Adds `src/icons.js` with the three components and wires the
call before mount. All three verified to exist in
vue-material-design-icons.

The same legacy class was also hardcoded in the SERVER-side builder:
ManifestController::buildManifest() emitted `icon-home` for every runtime
menu entry — the wrong concept as well as a legacy class, since those
entries are dashboards. That is not in gate-60's scope (it reads the JSON
manifests, not PHP), but it is the same defect on the path users actually
see, so it moves to ViewDashboardOutline too.

gate-53 (effective-manifest-crossref, 1). The one menu entry LaunchPad
ships pointed at `/dashboards`, which matches no page: this stub's only
dashboard page is `/dashboards/:id`, and the runtime builder emits
`/<slug>`. Retargeted to the page id `dashboard-detail`, which is the
pairing the server itself emits — buildManifest() sets each menu entry's
route to its page's id while the page carries the path. There is
deliberately no `/dashboards` index page; the rationale now lives in the
page's own _note, because the v2 schema sets additionalProperties:false on
menu entries and rejects a note there.

Verified: gates 53 and 60 report 0 against this tree and still report 1
and 5 against origin/development. check:manifest valid, eslint 0 errors,
638 unit tests pass, webpack build ok.
@rubenvdlinde

Copy link
Copy Markdown
Contributor Author

Superseded by #77 — same commit, rebranded to fix/* for the Branch Policy prefix rule.

@rubenvdlinde
rubenvdlinde deleted the gates/manifest-icons branch August 9, 2026 14:35
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/launchpad @ 77c23eb

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
composer ✅ 102/102
npm ✅ 548/548
PHPUnit
Newman
Playwright
Hydra gates

Quality workflow — 2026-08-09 14:38 UTC

Download the full PDF report from the workflow artifacts.

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