Skip to content

ci: split backend/frontend pipelines, pin SDK, dedupe test load#1250

Merged
iammukeshm merged 4 commits into
mainfrom
chore/admin-ux-a11y-perf-pass
May 27, 2026
Merged

ci: split backend/frontend pipelines, pin SDK, dedupe test load#1250
iammukeshm merged 4 commits into
mainfrom
chore/admin-ux-a11y-perf-pass

Conversation

@iammukeshm
Copy link
Copy Markdown
Member

@
Brings the new CI pipeline onto main.

  • Split monolithic ci.yml into path-scoped backend.yml + frontend.yml so a
    client-only change never builds/tests the API and vice versa.
  • Unit + integration tests each run once; coverage job merges their reports
    instead of re-running the whole solution.
  • Frontend CI: lint + tsc/vite build + Playwright E2E (admin + dashboard).
  • global.json pins the .NET 10 GA SDK (excluded from the template).
  • Always-run "Backend CI"/"Frontend CI" gate jobs for required status checks.

Both pipelines verified green on this branch.

🤖 Generated with Claude Code
@

iammukeshm and others added 4 commits May 27, 2026 11:32
chore(docker): remove redundant root docker-compose.yml

Local dev is covered by Aspire (FSH.Starter.AppHost) and production by
deploy/docker/docker-compose.yml. The root quick-run compose duplicated
infra config with no unique role; nothing references it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@
Audit-driven fixes across the operator console. No backend or
BuildingBlocks changes; all verified (tsc clean, eslint 2 errors -> 0,
build OK, Playwright 93/93).

Build-red + real bugs:
- fix 2 lint errors: drop the unused `grant` prop on RowActions
  (active-grants-card) and the dangling `react/no-danger` disable
  directive that referenced an uninstalled rule (security).
- App.tsx: wrap RouterProvider in a top-level Suspense so the public
  lazy routes (login, password reset, confirm-email) have a boundary on
  cold chunk fetch instead of throwing.

Accessibility (admin had no eslint-plugin-jsx-a11y — now added):
- Field primitive now threads aria-describedby + aria-invalid to its
  control, so every RHF form announces hints/errors (one fix, all forms).
- notification-bell: drop the focusable aria-hidden click-away
  (tabIndex=-1), remove the invalid role="menu", add Escape-to-close,
  and stop redefining a component inside render.
- skip-to-content link + <main id> landmark in AppShell.
- accessible names on unlabelled search/filter inputs (users, audits x3,
  impersonate) and the icon-only webhook delete button.
- Segmented toggle gets role="group" + aria-pressed; impersonation
  details disclosure gets aria-expanded.
- role="alert" on login/users/tenants inline errors; role="status" on
  loaders; reduced-motion now also stops Tailwind's animate-spin.

Performance:
- impersonation list: collapse two overlapping 5s take:200 polls into one
  fetch + client-side filtering/counts.
- notification-bell: coalesce the per-event invalidation burst.
- security: lazy-import the ~50KB qrcode lib only at 2FA enrollment.

Correctness:
- sessions revoke: track in-flight ids in a Set so concurrent revokes
  don't clear each other's busy state (user-sessions-card + settings).
- invoices row: real <button> inside the <li> instead of a
  noninteractive <li role="button">.
- mobile-nav: capture the trigger node in the effect (ref-in-cleanup).

Tooling: add eslint-plugin-jsx-a11y (recommended) with no-autofocus off
and label-has-associated-control depth:3; lint passes clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ci: split backend/frontend pipelines, pin SDK, dedupe test load

Replace the monolithic ci.yml with path-scoped backend.yml + frontend.yml so
a client-only change never builds/tests the API and vice versa.

- backend.yml: unit + integration each run ONCE with coverage collection; the
  coverage job now merges those reports instead of re-running the whole solution
  (the old double-run was the bulk of the load). Vuln scan gates on direct
  vulnerable packages. Drops the fragile bin/obj artifact hand-off.
- frontend.yml: lint + tsc/vite build + Playwright E2E, matrixed over admin and
  dashboard (Node 22, npm-cached) — the frontend had no CI before.
- global.json pins the .NET 10 GA SDK; all workflows use global-json-file and
  drop dotnet-quality: preview. Excluded from the template so scaffolded
  consumer projects are unaffected.
- Always-running "Backend CI" / "Frontend CI" gate jobs report green when their
  side is skipped, so required status checks resolve on cross-cutting PRs.

NOTE: branch protection must require the new "Backend CI"/"Frontend CI" checks.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@
@iammukeshm iammukeshm merged commit d8f91bc into main May 27, 2026
12 checks passed
@iammukeshm iammukeshm deleted the chore/admin-ux-a11y-perf-pass branch May 27, 2026 06:56
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