Projects
A Project is a folder that organizes meetings by initiative, client, or program. Every meeting belongs to at most one project (or none — those land in "Unfiled").
What's in a project
Each project has a name, an optional client name, a color stripe, and a default namespace. The namespace is the memory bucket that new transcripts and extractions land in by default — useful when you want all "Claims 8.0" memories searchable under one tag.
Org-wide access
For now, every member of your org sees every project. We don't have per-project member permissions in v1. If you need to keep client A's project hidden from client B's team, tell us — we'll add Project Members in a follow-up phase.
How auto-assignment works
The classifier runs at the tail of every meeting ingestion, with two stages:
- Rules first. Your pinned rules (created by clicking "Always for this pattern" on the confirmation banner) match by title keyword, attendee domain, attendee email, or source kind. A match is authoritative — no LLM call.
- LLM fallback. If no rule matches, a single small call (gpt-4o-mini or Claude Haiku) picks the most likely project from your list, with a confidence score. Below 0.6 confidence, the meeting lands as Unfiled — better safe than sticky.
Hard timeout: 1.5 seconds. If the model is slow or unavailable, the meeting still ingests; it just won't be auto-filed.
The confirmation banner
Auto-assigned meetings show an amber banner: "Auto-assigned to X — confirm?" with three buttons.
- Keep — accept the assignment, dismiss the banner.
- Move — file elsewhere via the Move-to dropdown.
- Always for this pattern — accept AND pin a rule so similar meetings skip the LLM next time. Today we infer the strongest signal from the meeting title automatically. A future polish pass will let you pick the dimension explicitly (title vs attendee domain vs source) from a confirm modal.
Archive
Archiving a project sets its archived = true flag and unsets project_id on every meeting that belonged to it. The project row stays in the database for audit; the meetings reappear under "Unfiled" where you can re-file them.
If you archived by mistake, the project row stays in the DB with archived = true. An admin can flip it back via a one-line SQL update. A future polish pass adds an Archived tab + restore button so you don't need SQL.
Moving meetings manually
Every meeting card on the cross-project list has a Move to ▾ dropdown. Picking a destination is instant (optimistic update) and persists via PATCH /api/meetings/[id] with body { project_id: "<uuid|null>" }.