customer-detail-parityrun.md01_define/output/spec.mdWeb's customer sub-pages diverged from demo's agreed design — a gap this
demo-web-parity epic exists to close, advancing the Refine the Bridge
initiative (Q2 2026 — O1 vendor engagement: customer-side clarity is what
sustains delivery and CSAT). Three divergences remain now that the shared
DetailPageShell and design tokens have already landed (stubs
detail-page-shell-web and design-system-reconciliation, both done):
apps/web/app/(app)/customer/activity/page.tsx:89) instead of
rendering demo's three impact variants off each entry's impactTag, and it
drops demo's latest-update summary banner (the data — latestSummary /
latestTime — already flows from getCustomerActivity; only the page
ignores it).Re-skin the three customer pages to demo's design, keeping web's real (server-resolved) data:
AlertBanner fed by the feed's latestSummary + latestTime) at the top of
the activity card, and render each entry's impact badge through a
three-variant config (no-impact / minor-delay / delays-go-live) keyed
off the entry's impactTag, replacing the hardcoded "No impact" literal. This
is UI-only: the activity service is unchanged, so today's real entries still
resolve to no-impact until a future health-engine feature supplies an impact
signal — the page gains the capability to show the right variant, not
fabricated impact (see Out of scope)./projects/create (web's
project-intake flow, the equivalent of demo's /project-discovery).latestSummary and latestTime (and rendering the empty-state copy when there is no activity).no-impact → "No impact", minor-delay → "Minor delay", delays-go-live → "Delays go live") keyed off the entry's impactTag, not a hardcoded literal — so an entry carrying a non-no-impact tag would render the matching amber/red badge./projects/create.DetailPageShell with the existing back-navigation, real tenant/customer-scoped data, and empty-state fallbacks; pnpm lint and typecheck pass.impactTag but does not add service-side
derivation. Real entries continue to resolve to no-impact until a future
feature supplies the signal. Documented divergence: web shows honest
(currently uniform) impact rather than demo's mock variety.getCustomerActivity / the finance resolver or their data
shapes — the pages consume the existing server contracts unchanged.none — the two design forks (impact-tag depth; invoices richness) were resolved with the owner during Define: UI-only impact wiring, and demo's two-card frame retaining web's richer finance KPIs.
02_build/output/notes.mdfeat: customer-detail-parity — activity impact tags + summary banner, two-card invoices, dashboard CTAapps/web/components/dashboard/customer/impact-badge.tsx (new): shared
ImpactBadge + ImpactTag — the three-variant config
(no-impact / minor-delay / delays-go-live) lifted out of value-section
so the activity page, invoices, and the dashboard share one vocabulary.apps/web/app/(app)/customer/activity/page.tsx: added the latest-update
summary banner (AlertBanner, fed by the feed's latestSummary /
latestTime) and replaced the hardcoded "No impact" literal with
<ImpactBadge impact={item.impactTag} />. UI-only — the activity service is
unchanged (real entries still resolve to no-impact until a health-engine
feature supplies impact; documented divergence in the spec).apps/web/app/(app)/customer/invoices/page.tsx: replaced the 4-KPI grid +
standalone progress/next-due cards with demo's two-card frame — "Payments so
far" (paid + work-delivered StatBoxes, delivered-vs-total progress, and the
retained live KPIs: total contract, paid to date, outstanding) and "Next
payment due" (warning banner + ref/date/amount rows).apps/web/app/(app)/customer/dashboard/page.tsx: added the "Start a new
project" CTA (Compass icon, outline Button) linking to /projects/create
in the header, alongside the existing project-id badge.apps/web/components/dashboard/customer/value-section.tsx: refactored to
consume the shared ImpactBadge (removed the now-duplicated local config).latestSummary / latestTime; empty-state copy still renders when there is no activity (banner suppressed when latestSummary is null).ImpactBadge keyed off entry.impactTag — a non-no-impact tag renders the matching amber/red badge — no hardcoded literal./projects/create (confirmed customer-allowed in route-policies.ts).DetailPageShell with back-navigation, real tenant/customer-scoped data, and empty-state fallbacks; lint/typecheck run in CI.StatBox, SummaryRow, AlertBanner), and add no
new service/data contracts. entry.impactTag ("no-impact") is assignable to
the widened ImpactTag prop, so no type error from the UI-only wiring./projects/create is web's intake flow (the equivalent of demo's
/project-discovery), confirmed customer-accessible.03_release/output/changelog.mdLive entry: apps/help/app/changelog/2026-07-27-customer-detail-parity/page.mdx
Your customer pages now work the way the rest of Sustentus does. Project activity opens with a summary of your latest update, and every entry is labelled with its impact on your go-live date, so you can see at a glance what matters. Your invoices page brings everything into two simple cards — what you have paid and what has been delivered against it, and the next payment due — while still showing the full picture: total contract, outstanding, and the exact invoice coming up. And you can now start a new project straight from your dashboard header.
03_release/output/investor-update.mdWho it's for: Customers What shipped: The customer activity, invoices and dashboard pages now match our shared design — a latest-update summary, impact-tagged activity, a two-card payments view, and a one-click start-a-new-project action. Why it matters: Sharper dashboard usability under Refine the Bridge, supporting Q2 Objective 1 — establish product-market fit with vendor partners.
All five acceptance criteria verified on the preview deploy.
Dig deeper: <merged-PR URL> · <changelog entry URL>
03_release/output/release.md/projects/create was already customer-allowed). The CTA surfaces an existing flow; only presentation changedmain ref was stale so main...HEAD over-reported — verified against origin/main...HEAD and the PR's own changed-files count.ImpactBadge (+ ImpactTag) from value-section so the activity page, invoices, and dashboard share one impact-tag vocabulary rather than triplicating the config — a simplification, not new surface. Refactored value-section onto it.type not interface, named imports, sentence-case copy, cn() for class merging, server components (no needless "use client"). No dead code, debug, or leftover scaffolding.latestSummary/latestTime; empty-state copy still renders when there is no activity (banner suppressed when latestSummary is null).ImpactBadge keyed off entry.impactTag — a non-no-impact tag renders amber/red — no hardcoded literal./projects/create (verified customer-allowed in route-policies.ts).DetailPageShell with back-navigation, real tenant/customer-scoped data, and empty-state fallbacks; format/lint/typecheck green in CI.