Date: October 22, 2026 (America/New_York). Scope: milestone 1 only. Status: milestone 1 implemented and verified locally. The full initial beta still requires milestones 2–4.
| Area | Main files |
|---|---|
| UI | app/page.tsx, app/layout.tsx, app/globals.css, components/workspace.tsx, components/contact-editor.tsx, components/primitives.tsx |
| API/auth/media | app/api/{auth,library,contacts,groups,photos}/route.ts, lib/server/api.ts |
| Pure domain | lib/domain/{model,identify,improve,fixtures}.ts |
| Database | supabase/migrations/202610220001_recognition.sql and 202610220002_explicit_grants.sql |
| Local setup | supabase/config.toml, .env.example, scripts/{local-env,local-client,local-fixture-accounts,seed-local}.ts |
| Verification | tests/domain.test.ts, tests/authorization.test.ts, tests/browser/recognition.spec.ts, playwright.config.ts, synthetic photo fixture |
Migration 001 creates contacts, beta memberships, sources, affiliations, notes, encounters, observations, groups, memberships and photos, along with the private bucket, RLS and transactional save_contact. Migration 002 makes grants explicit and adds database-level method/alias validation. Both were applied to real local PostgreSQL without resetting a user library.
Environment: macOS arm64, Node 22.17.0, npm 10.9.2, Docker engine 29.8.2, Supabase CLI 2.121.0, PostgreSQL image 17.11.0.004. Locked application dependencies include Next 16.4.2, React 19.3.1, TypeScript 6.0.3, Tailwind 4.3.3, Supabase JS 2.118.0, SSR 0.12.7, Vitest 5.0.5 and Playwright 1.64.1.
| Exact command | Actual result |
|---|---|
npx supabase init |
Completed after granting local CLI settings-directory access. |
npx supabase start |
Completed, using local Docker containers; migration 001 applied. |
npx tsx scripts/local-env.ts |
Wrote ignored .env.local without displaying credentials. |
npm run seed:local |
Created approved Alex/Blair and an uninvited test identity, two isolated eight-person libraries. No invitation email sent. |
npx supabase migration up --local |
Migration 002 applied successfully. |
npm test |
24 passed, 0 failed; network-free domain tests. |
npm run typecheck |
Passed, exit 0. |
npm run lint |
Passed, exit 0, no warnings after fixing the initial PostCSS export warning. |
npx prettier --check 'app/**/*.{ts,tsx,css}' 'components/**/*.{ts,tsx}' 'lib/**/*.ts' 'scripts/**/*.ts' 'tests/**/*.ts' '*.{ts,mjs,json}' |
Passed after formatting two remaining setup/test files. |
npm run build |
Passed with webpack; homepage plus five dynamic API routes built. |
npm run test:integration |
7 passed, 0 failed, 0 skipped, after both migrations; real Auth/Postgres/Storage, no authorization mocks. |
npx playwright install chromium |
Installed Chromium 156.0.8078.4, Playwright revision 1248. |
npm run test:e2e |
3 passed, 0 failed, 5.9 seconds on the final run; Chromium against the production server and actual local backend, including final Improve empty-search recovery. |
npm audit --omit=dev --json |
0 production vulnerabilities. |
npm audit --json |
5 high findings in the development lint chain (braces → micromatch → fast-glob → Next ESLint plugin/config). No compatible patched version was offered; suggested downgrade to Next 14 lint configuration was not applied. |
The initial domain run exposed missing multiword alias recognition; fixed and all 24 tests subsequently passed. The initial Turbopack build failed because its CSS worker could not bind a local port, including on an escalated retry. Both scripts now explicitly use supported webpack, which passes. The first seed attempt exposed the CLI’s coupling between email-provider enablement and its email-signup setting: email login stays enabled, while global public signup remains disabled; the integration suite verifies signup rejection. Initial browser discovery encountered Node’s CommonJS/ESM loader issue with unrelated runtime SDK/image imports; the browser suite now uses isolated fixture constants and a static synthetic image. Browser selectors were also corrected to use accessible combobox roles, exclude Next’s empty route-announcer alert, and distinguish the visible gallery from the intentionally preserved hidden Contacts grid. Browser execution caught a real origin-check mismatch from Next’s reconstructed internal URL; mutations now compare to the explicit APP_ORIGIN instead of an internal hostname or forwarded header.
Domain tests cover C01–C15, C18–C20, chip removal, simultaneous affiliations/history labels, note-source preservation, Improve updates and input validation. The seven integration tests cover A01–A08 and B01/B03/B05: direct reads, private note search, identical names across accounts, forged ownership, foreign relationships, denied membership, disabled signup, private downloads/overwrites/deletes, anonymous access, revoked access, transactional rollback, revisions and preservation of original notes/meeting context.
The browser suite verified the actual Contacts → Improve → Identify path, reload persistence, private photo display, malformed-image rejection, no-store media responses, exact original-note access, keyboard Enter/Escape and focus restoration, grid/list/search preservation, account switching, deletion, rejected-batch recovery, honest empty results, scopes and skipped fields at 1440×900 and 1280×800. It recorded zero browser runtime errors and zero browser requests to nonlocal hosts in the full workflow. Production API checks also rejected missing-origin requests, invalid input and an uninvited user.
Screenshots are produced in test-results/: contacts-1280.png, identify-1280.png, identify-1440.png, improve-1280.png, recognition-card-1440.png and profile-expanded-1440.png. The main three workspaces, recognition card and expanded profile were visually inspected; layout, text, cards and controls were readable with no horizontal overflow in the tested desktop layouts. The solid-color photo is an explicitly synthetic upload-validation fixture. Failed-run fixtures were removed; subsequent browser runs automatically clean up their own exact contact on failure or success.
See the root README.md for full steps. In this workspace the local backend and .env.local have been configured. For a new checkout:
npm ci
npm run db:start
npx tsx scripts/local-env.ts
npm run seed:local
npm run dev
Open http://127.0.0.1:3000. Synthetic local login: alex@recall.test / Local-Recall-Only-2026! (Blair uses the same local-only password). These credentials are documented fixtures, not production secrets. APP_ORIGIN defaults to that exact application URL. For a local production run use npm run build then npm run start. The verified production server was left running at that local URL, with the local Supabase stack running, at handoff.
Docker, Node/npm and initial dependency/image/browser downloads are prerequisites. No hosted Supabase project or cloud credentials are required. Local scripts reject remote URLs. npm run db:stop preserves local volumes; npm run db:reset is destructive and must only be used on a disposable test library.
No hosted deployment, live invitations, paid APIs, AI provider, production email, external integrations or production backup/retention behavior was tested or configured. Safari/Firefox, full accessibility audit, very large libraries, production concurrency explicit expired/malformed-cookie browser scenarios, and an independent clean-machine setup remain unverified. Anonymous and revoked-access cases were exercised. The first local Docker/database setup was executed here.
Next authorized task would be milestone 2: CSV/vCard import with preview/errors, raw-preserving quick-add, optional onboarding, smart/nested groups, broader history editing, duplicate review and explicitly approved reversible merges. None of that work has begun. Milestone 3 enrichment and milestone 4 beta hardening, plus all later events/practice/follow-up/provider work, remain deferred. No deployment, external changes or paid calls were made.