Files
ai-tax-agent/docs/FRONTEND.md
harkon b324ff09ef
Some checks failed
CI/CD Pipeline / Code Quality & Linting (push) Has been cancelled
CI/CD Pipeline / Policy Validation (push) Has been cancelled
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-coverage) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-extract) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-firm-connectors) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-forms) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-hmrc) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-ingestion) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-kg) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-normalize-map) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-ocr) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rag-indexer) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rag-retriever) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-reason) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (svc-rpa) (push) Has been cancelled
CI/CD Pipeline / Build Docker Images (ui-review) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-coverage) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-extract) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-kg) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (svc-rag-retriever) (push) Has been cancelled
CI/CD Pipeline / Security Scanning (ui-review) (push) Has been cancelled
CI/CD Pipeline / Generate SBOM (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Notifications (push) Has been cancelled
Initial commit
2025-10-11 08:41:36 +01:00

13 KiB

ROLE

You are a Senior Frontend Engineer + UX Lead building the reviewer/agent UI for the accounting platform. Authentication and authorization are centralized at the edge (Traefik + Authentik ForwardAuth); the UI never implements OIDC flows. Your job is to deliver a production-grade, accessible, test-covered web app that orchestrates the workflows over our backend services.

OBJECTIVE

Ship a Next.js app that enables preparers/reviewers to:

  1. onboard clients and see coverage status,
  2. ingest and review documents with PDF/bbox evidence,
  3. run coverage checks, generate clarifying questions, and upload missing evidence,
  4. do RAG + KG guidance searches with citations,
  5. compute and verify schedules with line-by-line lineage,
  6. generate filled forms and evidence packs,
  7. optionally submit to HMRC,
  8. audit everything with a timeline and explanations.

STACK (USE EXACTLY)

  • Framework: Next.js 14 (App Router) + React 18 + TypeScript strict
  • UI: Tailwind CSS + shadcn/ui, lucide-react icons, recharts (light charts)
  • State/data: TanStack Query (API caching), Zustand (light UI state), React Hook Form + Zod (forms/validation)
  • Docs/PDF: pdfjs-dist + custom bbox highlight overlays (Canvas); thumbnails & page nav
  • Graph view: cytoscape.js (lineage/path rendering)
  • Table/grid: TanStack Table (virtualized where needed)
  • Testing: Playwright (E2E), React Testing Library + Vitest/Jest DOM (unit), axe-core (a11y)
  • Quality: ESLint (typescript + jsx-a11y), TypeScript strict, Prettier, ruff not needed in UI; but keep mypy rules for any Python scripts in tooling (if any)
  • Telemetry: OpenTelemetry web SDK (trace + user actions), Sentry (optional), Web Vitals
  • i18n: next-intl (scaffold en-GB; key-based)
  • Build: Dockerfile (node:20-alpine → distroless), environment via NEXT_PUBLIC_*
  • Auth: none in-app. Rely on Traefik + Authentik; obtain claims via /api/me (proxied to svc-gateway or a tiny Next.js route that just echoes forwarded headers from Traefik).

TRUST & SECURITY MODEL

  • All requests go through Traefik; the UI does not accept user-supplied auth headers.
  • Use /api/me to read X-Authenticated-User|Email|Groups (in SSR/server actions).
  • RBAC in UI is feature-gating only (hide/disable controls) — backend still enforces.
  • Never render PII from vector search. RAG view must display pii_free:true payloads only.

TARGET SERVICES (HTTP JSON)

  • svc-coverage: /v1/coverage/check, /v1/coverage/clarify, /admin/coverage/reload, /v1/coverage/policy
  • svc-ingestion: /v1/ingest/upload, /v1/ingest/url, /v1/docs/{doc_id}
  • svc-ocr: /v1/ocr/{doc_id}
  • svc-extract: /v1/extract/{doc_id}
  • svc-normalize-map: /v1/map/{doc_id}, /v1/map/{doc_id}/preview
  • svc-kg: /v1/kg/lineage/{node_id}, /v1/kg/cypher (admin), /v1/kg/export/rdf
  • svc-rag-retriever: /v1/rag/search
  • svc-reason: /v1/reason/compute_schedule, /v1/reason/explain/{schedule_id}
  • svc-forms: /v1/forms/fill, /v1/forms/evidence_pack
  • svc-hmrc: /v1/hmrc/submit, /v1/hmrc/submissions/{id}
  • svc-firm-connectors: /v1/firm/sync, /v1/firm/objects

USERS & ROLES

  • Preparer (default): do coverage, ingest, compute, fill forms.
  • Reviewer: approve/override low-confidence items, sign off.
  • Admin: can reload coverage policy, run KG Cypher tool, manage feature flags.

PRIMARY FLOWS (SCREENS)

  1. Dashboard

    • Coverage progress per client & schedule (chips: ok/partial/blocking)
    • Tasks: clarifications pending, missing evidence, review requests
    • Quick actions: Run Coverage, Upload Evidence, Compute Schedules
  2. Client → Evidence Inbox

    • Drag-and-drop upload (multi), URL import, RPA sync trigger button
    • List of documents with kind (P60, LettingAgentStatements...), tax year, confidence badges
    • Click opens PDF Viewer with bbox highlights (left: pages; right: extracted fields & evidence tags)
  3. Coverage Check

    • CoverageMatrix per schedule: rows = evidence items, cols = status/boxes
    • Status chips: present_verified (green), present_unverified (amber), missing/conflicting (red)
    • ClarifyPanel: generates question via /v1/coverage/clarify with citations
    • Inline Upload buttons mapped to svc-ingestion with tag= set to evidence.id
  4. RAG + Guidance

    • Search bar (+ filters: tax_year, schedule, topic), results with citations
    • Clicking a citation can deep-link to a PDF doc_id/page/bbox (if local doc) or open URL (if guidance)
  5. Schedules & Calculations

    • Select schedule (SA102/SA103…): Compute → show FormBox table (box_id, description, value, source)
    • Per-row Explain opens Lineage Drawer: graph path (FormValue ↔ Evidence ↔ Document) via cytoscape
    • Editable cells (if user override allowed) with reason + evidence attachment; show diff
  6. Forms & Evidence Pack

    • Generate PDFs (download viewer); Evidence Pack download (ZIP + manifest)
    • Checklist (“All blocking gaps resolved”, “Reviewer sign-off received”)
  7. Submission

    • Pre-flight checks, HMRC mode banner (stub/sandbox/live)
    • Submit; show submission_id and status; link to timeline
  8. Timeline & Audit

    • Event list (ingested, OCR, extracted, mapped, computed, submitted)
    • Filter by service; click to jump to relevant screen or doc
  9. Admin

    • Coverage policy viewer, hot-reload button
    • KG Cypher tool (admin only); feature flags (read-only switch list with notes)

ROUTE MAP (Next.js App Router)

/                             -> Dashboard
/clients                      -> Client list (search)
/clients/[clientId]           -> Client overview (tabs)
/clients/[clientId]/evidence  -> Evidence Inbox + PDF viewer
/clients/[clientId]/coverage  -> Coverage Check + ClarifyPanel
/clients/[clientId]/rag       -> RAG + Guidance (citations)
/clients/[clientId]/schedules -> Schedule picker + tables
/clients/[clientId]/forms     -> PDFs + Evidence Pack
/clients/[clientId]/submit    -> HMRC submission
/audit                        -> Global timeline
/admin                        -> Admin home
/admin/policy                 -> View/reload coverage
/admin/kg                     -> Cypher tool (admin)
/me                           -> Me (claims, groups)

PROJECT LAYOUT

ui-review/
  app/
    (dashboard)/page.tsx
    clients/[clientId]/(layout).tsx
    clients/[clientId]/overview/page.tsx
    clients/[clientId]/evidence/page.tsx
    clients/[clientId]/coverage/page.tsx
    clients/[clientId]/rag/page.tsx
    clients/[clientId]/schedules/page.tsx
    clients/[clientId]/forms/page.tsx
    clients/[clientId]/submit/page.tsx
    audit/page.tsx
    admin/policy/page.tsx
    admin/kg/page.tsx
    me/route.ts
    api/me/route.ts           # echoes forwarded claims for the app
    layout.tsx                # shell, nav, toasts
    globals.css
    middleware.ts             # route guard reading forwarded headers (server-only)
  components/
    upload-dropzone.tsx
    status-chip.tsx
    coverage-matrix.tsx
    clarify-panel.tsx
    pdf-viewer.tsx            # pdfjs + bbox overlays
    evidence-card.tsx
    lineage-graph.tsx         # cytoscape graph
    schedule-table.tsx
    value-cell.tsx
    explain-drawer.tsx
    rag-search.tsx
    citations-list.tsx
    timeline.tsx
  lib/
    api.ts                    # typed fetch; baseURL; error & retry
    clients.ts                # per-service client wrappers (TanStack Query)
    auth.ts                   # /api/me parsing; role helpers
    bbox.ts                   # bbox geometry utils
    types.ts                  # shared UI types (zod)
    feature-flags.ts          # remote flags (read-only)
    formatting.ts             # money/date utils (en-GB)
  hooks/
    use-claims.ts
    use-coverage.ts
    use-rag.ts
    use-pdf.ts
  styles/
    shadcn.css
  public/
    icons/
  tests/
    e2e/
    unit/
    a11y/
  .env.example
  Dockerfile
  next.config.mjs
  tailwind.config.ts
  postcss.config.js
  package.json
  tsconfig.json
  eslint.config.mjs
  playwright.config.ts

API CLIENTS (STRICT TYPES)

  • Create zod schemas for each service response and infer TypeScript types.

  • Wrap fetch with:

    • base URL from NEXT_PUBLIC_API_BASE (Traefik hostname, e.g., https://api.local)
    • credentials: "include" (SSO cookie path through Traefik)
    • retries (idempotent GET), exponential backoff; error normalization {type,title,status,detail,trace_id}
  • Use TanStack Query for caching, optimistic updates on overrides, and background refetch.

KEY COMPONENT DETAILS

PDF Viewer (pdf-viewer.tsx)

  • Render via pdfjs-dist.
  • Overlay layer draws rectangles from bbox {page, x, y, w, h}; clicking highlight scrolls to corresponding extracted field; right panel shows evidence details (doc_id, page, confidence, mapping to boxes).
  • Keyboard shortcuts: J/K page nav; H toggle highlights; Z zoom.

Coverage Matrix (coverage-matrix.tsx)

  • Inputs: CoverageReport.
  • Rows: evidence items; columns: status chip, boxes (expand to show list), actions (Upload, Clarify).
  • “Clarify” opens clarify-panel.tsx which calls /v1/coverage/clarify and produces copyable text + citations + upload actions.

Lineage Graph (lineage-graph.tsx)

  • Render path: FormValue → Evidence → Document (+ any Rule/Calculation nodes).
  • Click a node jumps to PDF viewer at the correct page/bbox (if Document is local).
  • Cytoscape style: clean, accessible (labels, readable contrast).

Schedule Table (schedule-table.tsx)

  • Columns: box_id, description, value, source, confidence, explain
  • Explain button opens explain-drawer.tsx which shows lineage graph + textual explanation trace (and citations if RAG guidance was used).

ACCESSIBILITY & UX

  • WCAG 2.2 AA: all interactive components keyboard accessible; focus outlines; ARIA labels
  • Axe checks in unit and e2e tests; Lighthouse accessibility ≥ 95
  • Colour-blind safe palette; do not encode status only by colour — use icon + label

PERFORMANCE

  • Code-split per route; lazy-load heavy views (PDF, graph)
  • Virtualize long tables and evidence lists
  • Preload API data via RSC loaders on server when appropriate
  • Web Vitals: LCP < 2.5s on local; keep JS bundle sizes modest

ENV & INTEGRATION

  • .env (copied to .env.local):

    • NEXT_PUBLIC_API_BASE=https://api.local
    • NEXT_PUBLIC_APP_BASE=https://ui.local
    • NEXT_PUBLIC_FEATURE_FLAGS_URL= (optional)
    • AUTHENTIK_LOGOUT_URL= (show Sign Out link to edge logout endpoint)
  • Traefik labels for the UI container:

    • Router rule Host(\ui.local`)` to UI service
    • Middleware authentik-forwardauth and rate-limit
  • The UI calls backend at https://api.local/* via Traefik.

TESTING (MANDATORY)

  • Unit (React Testing Library):

    • coverage-matrix status rendering and actions
    • clarify-panel formatting with alternatives and citations
    • pdf-viewer highlight click → scroll and selection state
    • lineage-graph node click → callback invoked
  • E2E (Playwright):

    • Login is handled by Traefik SSO; for local, place the UI behind the gateway.
    • Scenario: Upload docs → Run coverage → See blocking gaps → Generate clarify text → Upload alt evidence → Re-run coverage → OK → Compute schedule → Explain lineage → Generate forms → (stub) submit
  • A11y: axe-core checks on major pages; fix violations.

QUALITY GATES (CI)

  • ESLint (eslint.config.mjs with @typescript-eslint + jsx-a11y)

  • TypeScript strict: true (no implicit any/any)

  • Prettier format check

  • Playwright E2E (headless)

  • Lighthouse CI (Dashboard, Coverage, Schedules) with budgets:

    • Performance ≥ 80 (local), Accessibility ≥ 95, Best Practices ≥ 90

DELIVERABLES (RETURN ALL AS CODE BLOCKS)

  1. README.md (local run with Traefik SSO; env vars; routes; role matrix)
  2. package.json (scripts: dev, build, start, lint, typecheck, test, e2e, a11y, lighthouse)
  3. tsconfig.json (strict true; noUncheckedIndexedAccess true)
  4. eslint.config.mjs + .prettier*
  5. next.config.mjs (headers passthrough; image domains)
  6. tailwind.config.ts + postcss.config.js
  7. app/layout.tsx, app/(dashboard)/page.tsx, route pages listed above
  8. app/api/me/route.ts (server only: echo forwarded claims)
  9. middleware.ts (SSR gate: if no forwarded claims, show “Not Authenticated”)
  10. components/* (all listed)
  11. lib/* (typed API, bbox utils, auth helpers, formatting)
  12. hooks/* (coverage, rag, pdf, claims)
  13. tests/unit/*, tests/e2e/*, tests/a11y/*
  14. Dockerfile, .env.example, playwright.config.ts

ACCEPTANCE CRITERIA (DoD)

  • Runs behind Traefik + Authentik; no in-app auth.
  • Coverage Check renders matrix, generates clarifying questions with citations, and triggers uploads.
  • PDF Viewer highlights bboxes and navigates correctly; lineage jumps to precise evidence.
  • Schedules compute and render with Explain showing graph & textual explanation with citations.
  • RAG results include citations and never display PII.
  • All pages pass Axe checks; Lighthouse thresholds met.
  • CI green (lint, typecheck, unit, e2e, a11y, lighthouse).

START

Generate the full ui-review application with the files and behavior above. Include typed API clients, strict TypeScript, accessible components, test suites, and Dockerfile.