# Steps & Screens for APIs and web apps — handoff **Status:** plan, written 2026-08-28 at the end of the session that built the Steps view and the readings it rests on (Expo + React Native app, `amniservices-mobile-app`). **Updated the same day, later sessions: P0–P6 are built** (see the per-item notes marked *Built*); P7's agent A/B numbers are open. Every claim about what a resolver emits *today* was verified against the source on this date — re-verify before building on it, the resolvers move. What was learned building it, beyond the plan: the index keeps only the LAST segment of a deep member call (`create` for `prisma.user.create`) and name-matches it — often to the wrong `create` at confidence 0.4 — so the Steps walk reads every call **as written** from the tree at request time (`callSitesForFile`) and classifies on the chain; and the declared types of a class's members (`private readonly usersService: UsersService`, `OwnerRepository owners`) are read from the class body (`memberTypesInTree`) to send `this.usersService.findByEmail(…)` where the type says and to call `owners.save` the database. Validation pictures: `gothinkster/node-express-realworld-example-app`, `brocoders/nestjs-boilerplate`, `nestjs/nest/sample`, `fastapi/full-stack-fastapi-template`, `Netflix/dispatch`, `spring-projects/spring-petclinic`, `spring-petclinic/spring-petclinic-kotlin`, `dotnet-architecture/eShopOnWeb`, `jqlang/jq`, `redis/redis`, `android/nowinandroid`, `Dimillian/IceCubesApp`, `TryGhost/Ghost` — each shot headlessly (`codegraph ui --no-open` + Playwright) and read against the mobile app's picture. **Goal.** The two pictures — **Screens** (`#/screens`, design spec §3.12) and **Steps** (`#/steps`, §3.13) — must be as good on an Express / NestJS / Fastify API, a Next.js / React Router / SvelteKit web app, and a monorepo that has both, as they are on the mobile app today. "As good" is defined precisely in §1 below; it is not "draws something". Companion reading, in this order: `docs/design/codegraph-ui-design-spec.md` §1 (principles), §3.12, §3.13, §3.14; `CHANGELOG.md` `[Unreleased]` (the user-facing description of what shipped); `docs/design/dynamic-dispatch-coverage-playbook.md` (the coverage rules and the validation method — **"partial coverage is worse than none"** governs everything here); `CLAUDE.md` (tests, kernel, docs). --- ## 1. The bar: what "up to par" means On the mobile app, selecting `/capture/review` and walking to the upload gives the reader, per link: | Reading | Example | Where it comes from | |---|---|---| | **The step itself, typed** | `⇢ finalizeCaptureSession` (native call), `⇠ onZipComplete` (native event), `setZipUri` (store action), `axios.post(\`…/oauth/token\`, {…})` (leaves the index) | `src/ui-server/api/steps.ts` classification | | **FIRES FROM** — what triggers it | `onSubmit · useFormik(…) in LoginButton`, `onPress ·