docs: capture design from walk-with-me (CONTEXT, DESIGN, ADR-0001)
This commit is contained in:
67
CONTEXT.md
Normal file
67
CONTEXT.md
Normal 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**.
|
||||
Reference in New Issue
Block a user