# photofetch Pick a Napta **Project** and see a grid of its **Members** — each shown with their Slack **Avatar**, name, and **Role**. The shared vocabulary below is the ubiquitous language: it must appear verbatim in conversation, code, tests, commits, and docs. ## Language **Project**: A Napta project that people are staffed on; the unit you select to see its team. _Avoid_: mission, engagement. **Person**: An employee in Napta (a Napta `user`), carrying an email, first/last name, and Position. _Avoid_: collaborator, resource, user (ambiguous — there are no app accounts). **Staffing Assignment**: A Napta `user_project` row linking one Person to one Project; may be real or `simulated`. _Avoid_: allocation, booking. **Member**: A Person with a real (non-`simulated`) Staffing Assignment on the selected Project who is still an active employee — one cell in the grid. _Avoid_: teammate, staff. **Role**: A Member's Napta job Position (`user_position`), shown under their name. _Avoid_: title, grade, seniority. **Match**: The link from a Member to their Slack profile, made by equal email. A Member is _matched_ or _unmatched_. _Avoid_: lookup, mapping. **Avatar**: A matched Member's Slack profile picture. Unmatched Members fall back to an initials Avatar. _Avoid_: photo, picture, image. **Selection**: The set of one or more Projects currently chosen, whose teams are shown together. _Avoid_: filter. **Project Group**: One selected Project plus its Members — a section in the grid and a folder in an Export. _Avoid_: section, bucket. **Export**: A downloadable zip of Member Avatars, organized as one folder per Project Group (folder named after the Project). _Avoid_: download, dump. ## Relationships - A **Project** has many **Staffing Assignments**; each Assignment links one **Person**. - A **Member** is a **Person** with a qualifying **Staffing Assignment** on a selected **Project**. - A **Member** has exactly one **Role** and at most one **Avatar** (via an email **Match**). - A **Selection** contains one or more **Projects**; each renders as a **Project Group**. - A Person staffed on several selected **Projects** appears in each of those **Project Groups**. - An **Export** writes one folder per **Project Group**, holding its Members' **Avatar** files. ## Example dialogue > **Dev:** "When I pick a **Project**, do I show every **Person** who has a **Staffing Assignment** on it?" > **Domain expert:** "Only real ones — drop the `simulated` assignments, and drop people who've left." > **Dev:** "And if a **Member**'s email has no **Match** in Slack?" > **Domain expert:** "Still show them — initials **Avatar**, real name and **Role**. A missing photo isn't a missing person." ## Flagged ambiguities - "user" is avoided: Napta calls a Person a `user`, but photofetch has no login/accounts, so the word would mislead. A Person on the selected Project is a **Member**.