Projects table empty in pipelines quota tab when NamespaceMonthlyUsage record does not exist
## Summary When a `Ci::Minutes::NamespaceMonthlyUsage` record does not exist for the current month (e.g., no CI jobs have run yet), the projects table in the pipelines quota tab (`data-testid="pipelines-quota-tab-project-name"`) is not populated. This is a regression introduced by the removal of the `aggregate_ci_minutes_reads` feature flag. ## Root Cause The projects table is populated through the following chain: 1. The frontend `app.vue` component fires the `getProjectsCiMinutesUsage` GraphQL query, which calls `ciMinutesUsage` with a `namespaceId` and `date`. 2. The **GraphQL resolver** `ci_minutes_usage` in `ee/app/graphql/ee/types/query_type.rb` fetches `NamespaceMonthlyUsage` records via `NamespaceMonthlyUsage.for_namespace(root_namespace)` or `.by_namespace_and_date(root_namespace, date)`. 3. Each returned `NamespaceMonthlyUsage` record becomes the `object` in `NamespaceMonthlyUsageType`. 4. The `projects` field on `NamespaceMonthlyUsageType` resolves by calling `ProjectMonthlyUsage.for_namespace_monthly_usage(object)`, which uses `object.namespace` and `object.date` to find matching project usage records. 5. The frontend `app.vue` computed property `selectedMonthProjectData` finds the matching month node from the response, then extracts `projects.nodes`. If no matching month is found, it returns `{}`, and `projects` falls back to `[]` — resulting in an empty table. The issue is that the `projects` field resolution is **nested inside** the `NamespaceMonthlyUsage` GraphQL type. If no `NamespaceMonthlyUsage` record exists for the current month, the GraphQL query returns **no nodes at all**, meaning the `projects` resolver is never invoked. Previously, with the `aggregate_ci_minutes_reads` feature flag disabled, the old code path used `find_or_create_current` which **lazily created** a `NamespaceMonthlyUsage` record on read, guaranteeing a record always existed. The new code path (`all_current_usages`) is read-only and returns nothing when no record exists. ## Proposed Solution(s) Decouple the project monthly usages from the namespace monthly usages by fetching them separately rather than relying on `ProjectMonthlyUsage` being nested under `NamespaceMonthlyUsage` in the GraphQL schema. This could be done by either: - Performing **two separate GraphQL queries**: one for namespace-level usage and one for project-level usage independently. - Performing **one query** that fetches both namespace and project monthly usages as **separate top-level fields**, rather than nesting projects under the namespace usage type. Either approach ensures that project usage data can be displayed even when no namespace-level usage record exists for the selected month. ## Related - Feature flag removal MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/229428 - Feature flag rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/592211 - Original sharded CI minutes tracking issue: https://gitlab.com/gitlab-org/gitlab/-/work_items/490968
issue