admin-readiness-gapsrun.md00_intake/stub.mdThree sections are not stored data but computed status over everything else: the readiness tiles (ready-to-go-live + the five readiness checks + config-gaps count), the ServiceModelCard (each service stage Complete | Missing), and the ConfigGapsPanel (what is missing + the action to fix it). While the upstream config sections were on mock these had nothing real to aggregate; once they are real, this capstone replaces the last of the dummy data with a genuine derivation.
slaConfigured (from SLA config), serviceModelDefined (from service-stage status),
integrationsConnected (from the integration registry), rolesAssigned (from People), and
commercialRulesSet (from commercial tenant-settings) — plus readyToGoLive and configGapsCount.configGapsCount and the panel agree, and update as upstream config is completed.touches: apps/web/components/admin/dashboard/{readiness-tiles,service-model-card,config-gaps-panel}.tsx,
plus a per-tenant readiness derivation in the admin data loader.01_define/output/spec.mdThree sections of the admin "Platform setup" dashboard are not stored data but computed status
over everything else: the readiness tiles (ready-to-go-live + the five readiness checks + the
config-gaps count), the ServiceModelCard (each service stage Complete | Missing), and the
ConfigGapsPanel (what is missing + the action to fix it). These are the last three props on the page
still fed from lib/mock/admin.ts — d.readiness, d.serviceModel.stages, and d.configGaps —
while every upstream config section (SLA, commercial, integrations, people, escalation) is now backed
by real per-tenant data via loadAdminDashboardData. This capstone (feature 7 of 7 in the
admin-dashboard-data epic) derives those three from the real signals, removing the last dummy data
and giving admins a truthful go-live picture. It advances Build the Bridge / Q2 2026 Objective 3 —
Validate Technical Infrastructure & Payout Flow: an admin cannot trust the payout/operational flow
until the dashboard reflects what is actually configured.
Add a per-tenant readiness derivation to loadAdminDashboardData that computes everything from
data already loaded in that function — no new DB reads — and feed the page from it instead of mock
d. The three target components are already prop-driven and need no change beyond receiving real
values.
slaConfigured — sla.status === "Complete" (all SLA stages covered).serviceModelDefined — every service-model stage is Complete (no missing stage; see below).integrationsConnected — at least one connected integration whose status is connected.rolesAssigned — people.missingRoles.length === 0 (all required roles filled).commercialRulesSet — commercial.status === "Complete" (vendor % and pricing rules set).readyToGoLive — true only when all five checks are true.Complete | Missing status over the canonical
SLA_STAGES vocabulary (Request, BRD, Bidding, Delivery, Billing, CSAT) from whether its required
config exists: a stage is Complete when its SLA stage is covered, with Billing additionally
requiring commercial config to be Complete (Billing = Missing until commercial rules are set).href to the admin page that resolves it), replacing the hard-coded mock gaps. Mapping:slaConfigured → "SLA not fully configured" → /admin/slaserviceModelDefined → "Service model incomplete" → /admin/setupintegrationsConnected → "No integration connected" → /admin/integrationsrolesAssigned → "Required roles unassigned" → /admin/users (list the missing roles in impact)commercialRulesSet → "Commercial rules not set" → /admin/commercialconfigGapsCount — gaps.length, so the tile count and the panel always agree.Extend AdminDashboardData/AdminDashboardReadiness (or add an AdminDashboardReadinessChecks
field) to carry readyChecks, readyToGoLive, configGapsCount, the derived serviceModel.stages,
and the configGaps array, and remove the corresponding d.* references from the page.
readyToGoLive that is true only when all
five checks pass — no values read from lib/mock/admin.ts.SLA_STAGES vocabulary.configGapsCount equals the number of entries the panel renders, and both update as upstream
config is completed (gaps disappear, checks flip, readyToGoLive becomes true).d / adminData from @/lib/mock/admin.loadAdminDashboardData already loads.02_build/output/notes.mdfeat: admin-readiness-gaps — derive readiness, service model & config gapsapps/web/lib/admin-dashboard-data.ts: added the readiness derivation to
loadAdminDashboardData. It computes the five readyChecks, readyToGoLive, the per-stage
serviceModel.stages, the configGaps list, and configGapsCount from data already loaded in the
function. The only added DB read is slaConfigService.getSlaDefinitions — needed to know which
SLA stages are covered (the summary only exposes a count) so each service stage can be scored.
New exported types: AdminReadinessChecks, AdminServiceStage, AdminConfigGap; extended
AdminDashboardReadiness and AdminDashboardData.apps/web/app/(app)/admin/dashboard/page.tsx: wired ReadinessTiles, ServiceModelCard, and
ConfigGapsPanel to the real derived data and removed the @/lib/mock/admin import.apps/web/lib/mock/admin.ts: deleted — it was the last consumer-less dummy-data file for this
dashboard (no other importer in the repo), so removing it completes the epic's goal of replacing
the last of the mock data.slaConfigured = SLA summary status is Complete (all six stages covered).serviceModelDefined = every service-model stage is Complete.integrationsConnected = at least one integration whose status is not disconnected.rolesAssigned = no missing required roles.commercialRulesSet = commercial status is Complete (vendor % and pricing rules).Complete when its SLA stage is covered; Billing additionally requires
commercial config to be Complete.configGaps: one entry per unmet check, in readiness-tile order; configGapsCount = configGaps.length.readyToGoLive — page reads
readiness.*, no lib/mock/admin values.SLA_STAGES vocabulary.configGapsCount equals the panel length (both computed from the same configGaps array) and
update together as upstream config is completed.d / adminData from @/lib/mock/admin (file
deleted)."connected", but the real IntegrationStatus
enum is healthy | warning | disconnected — implemented as "any non-disconnected integration"
(a warning integration is still a live connection). Flagging in case a stricter "healthy-only"
bar is preferred./admin/setup,
/admin/users, plus /admin/sla, /admin/integrations, /admin/commercial).03_ship/output/changelog.mdYour platform setup dashboard now tells you, from your real configuration, whether you are ready to go live:
This completes making your platform setup dashboard reflect your organisation's real configuration.
(Published in this PR by appending the section above to apps/help/app/changelog/page.mdx.)
03_ship/output/investor-update.mdThe admin platform-setup dashboard now derives go-live readiness from each customer's real configuration — the last of the placeholder data is gone. An admin sees a single, honest "ready to go live" verdict backed by five live checks (SLAs, service model, integrations, roles, commercial rules), with any remaining gaps listed and linked to the exact page that fixes them. This advances Build the Bridge and our Q2 objective to Validate Technical Infrastructure & Payout Flow: a customer can now confirm their setup is genuinely complete before running live, payment-bearing transactions.
03_ship/output/pr.mdapps/docs/technical page documents the admin dashboard tiles)apps/docs/business page documents these tiles; consistent with the prior six epic features)loadAdminDashboardData plus one added read
(getSlaDefinitions, needed to score per-stage service-model status) — no N+1 or extra round-trips. Accepted.IntegrationStatus enum has no connected value (spec's wording); flagged to the user, no objection. Accepted.apps/web/lib/mock/admin.ts deleted (no remaining importer) — completes the epic's
remove-the-mock goal. Accepted.readyToGoLive — page reads readiness.*, mock removed.SLA_STAGES.configGapsCount equals panel length (same configGaps array) and both update as config lands.d/adminData from @/lib/mock/admin (file deleted).