# AGENTS.md — apps/dashboard ## Visual changes need a human An agent cannot verify rendering. If a change alters layout, styling or any visible behaviour, say so and ask for confirmation rather than reporting it as done. Prefer taking on work in `packages/services`, `packages/api` and the route handlers, where `pnpm verify` and the test suites are real evidence. ## Runtimes The whole tRPC surface is served from `apps/dashboard/src/app/api/trpc/lambda/[trpc]/route.ts` on the **Node.js** runtime — several routers pull Node-only SDKs (`@slack/web-api`, email and notification clients). Node-only dependencies inside `@openstatus/services` are still forbidden, because `apps/workflows` runs the same code on Deno. ## Client boundary A `"use client"` file must not **value**-import the schema barrel `@openstatus/db/src/schema` — it drags Drizzle and the whole schema graph into the browser bundle. Import the specific sub-path instead (`@openstatus/db/src/schema/page_components/constants`), or split the pure-zod part into a sibling file. `import type` from the barrel is fine; types erase. ## Chat tool renderers Reuse the dashboard's own primitives — `TableCell*`, `ResultTable`, `ChangesTable`. Do not build bespoke chrome for a tool result. Persisted chat messages are validated on write, which is what makes the `asUIMessages` cast in `apps/dashboard/src/components/chat/use-chat-session.ts` safe. Keep casts of that kind in one named helper.