You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
feat(frontend): executive view on the redesign layout #903
Eyebrow with committee and quarter, title, "Copier le lien" and "Exporter le rapport" actions.
Four KPI tiles with quarter-on-quarter deltas (score, ALE, critical risks, average compliance).
"Cinq premières expositions" with inherent and targeted residual bars.
"Conformité par référentiel" bars with the counting footnote.
"Décisions attendues du comité" list with Reporter / Approuver, wired to real pending approvals (risk acceptances, mitigation budgets, exceptions). Backend added if the list does not exist.
Definition of done
The screen matches the design at 1440×900 in dark and light, checked side by side in a real browser; the comparison and any deliberate difference are written on this issue.
Loading skeleton, error with retry, and empty state exist for every block.
FR and EN strings, no hard-coded copy.
npx tsc -b --noEmit, npx vitest run on the touched features, and npx eslint on the touched files pass.
Backend changes, if any, come with TestXxx_Success, TestXxx_NotFound, TestXxx_Unauthorized, filter by tenant_id, and go test ./... passes.
Done — PR #928 on feat/903-executive, stacked on #927. Backend: defer endpoint + deferrals (migration 0071, application/governance/approval_engine_usecases.go), snapshot ALE / critical / compliance and quarter_baseline (migration 0072), ale_after on top risks, fix in repository/gorm_governance_repository.go (deferrals were never saved). Frontend: features/analytics/ExecutiveDashboard.tsx rewritten, old executive service removed, __tests__/committeeDecisions.test.tsx. Verified — go test ./... all ok · npx tsc -b --noEmit clean · eslint clean on touched files · npx vitest run 1013/1013 (twice) · live on Postgres at 1440×900, dark and light, side by side with the design: defer persisted across reload, approve, maker-checker refusal sent once, copy link, export → /reports/board. Criteria — 1 ✅ · 2 ✅ (deltas vs last snapshot before the quarter; "pas encore de relevé" when none) · 3 ✅ · 4 ✅ (footnote states the real counting rule, not "partiel compté pour moitié") · 5 ✅ (pending approvals, Reporter backend added) Next — merge #925 → #926 → #927 → #928 in order. Then #904. Blocked on — nothing. Not done: 414 px check (headed browser floor is 517 px, no overflow there); GET /analytics/executive now has no frontend caller, separate cleanup; risk ids show #xxxxxxxx until risks get a human reference.
Activity
alex-dembele commentedon Oct 9, 2026
executive view redesign — 2026-10-09
Done — PR #928 on
feat/903-executive, stacked on #927. Backend: defer endpoint +deferrals(migration 0071,application/governance/approval_engine_usecases.go), snapshot ALE / critical / compliance andquarter_baseline(migration 0072),ale_afteron top risks, fix inrepository/gorm_governance_repository.go(deferrals were never saved). Frontend:features/analytics/ExecutiveDashboard.tsxrewritten, old executive service removed,__tests__/committeeDecisions.test.tsx.Verified —
go test ./...all ok ·npx tsc -b --noEmitclean · eslint clean on touched files ·npx vitest run1013/1013 (twice) · live on Postgres at 1440×900, dark and light, side by side with the design: defer persisted across reload, approve, maker-checker refusal sent once, copy link, export → /reports/board.Criteria — 1 ✅ · 2 ✅ (deltas vs last snapshot before the quarter; "pas encore de relevé" when none) · 3 ✅ · 4 ✅ (footnote states the real counting rule, not "partiel compté pour moitié") · 5 ✅ (pending approvals, Reporter backend added)
Next — merge #925 → #926 → #927 → #928 in order. Then #904.
Blocked on — nothing. Not done: 414 px check (headed browser floor is 517 px, no overflow there);
GET /analytics/executivenow has no frontend caller, separate cleanup; risk ids show#xxxxxxxxuntil risks get a human reference.Merge pull request #928 from opendefender/feat/903-executive