docs: capture design from walk-with-me (CONTEXT, DESIGN, ADR-0001)

This commit is contained in:
Julien Calixte
2026-06-26 16:16:05 +01:00
parent 645bd6ff27
commit fc039ac0fc
3 changed files with 199 additions and 0 deletions

67
CONTEXT.md Normal file
View File

@@ -0,0 +1,67 @@
# 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**.