How completeness was checked

  • Every route in app/router.js is referenced by at least one feature.
  • 100 of 101 controllers and all feature-bearing route files are referenced; the remaining route files are pageHeader-only parents.
  • The side menu (utils/get-side-nav-menu.js) was walked entry by entry, including commented-out and module-disabled entries.
  • Unreferenced models, serializers and components were traced to their templates to find hidden features (mobile-app config, login methods, integrations, social wifi, Froged, analytics, the dormant action log).
  • All 2,598 translation keys used literally in code were checked against translations.json.

Sources

  • app/router.js — 9 top-level product areas, ~140 routes
  • app/routes/, app/controllers/ — behaviour, actions and error handling
  • app/models/** — 130 models; get validations() blocks are the authoritative source for failure paths
  • app/abilities/** — 55 ember-can classes; the authoritative source for role and module gating
  • app/enums/** — statuses, types and filter palettes
  • translations.json — 3,214 keys; feature names come from menu.navbar.* / title.header.* and failure messages from error.* and the per-feature namespaces

Features added by the review pass

Notes

  • Permissions in this product are three-dimensional: staff level x centre module x record state. A feature can be invisible for any of the three reasons, and the UI rarely says which.
  • Failure paths are taken from the code, not inferred: model validations blocks, .catch() handlers and throw guards. Where a failure is swallowed or leaves a stuck spinner, that is recorded as the handling, because it is what an operator will actually experience.
  • Several translation namespaces have no remaining code references and look like dead or not-yet-built surface: bonusRequest (22 keys), dmr-weekly, marketing-analytics (16 keys), commerce-stay-alert (4 keys, though an ability and a menu key still exist), plus partial remnants of leasing, lineitem and supplier. They are deliberately not listed as features.
  • Two CSV-import implementations coexist (nf-import and the older import-csv) with different robustness; import-csv.errors.load.required-selections is still in Portuguese while its siblings are English.