# objects — the nouns One job: hold one card per durable noun in the app, so an editor can answer *what is this* and *what else moves* without reading the model tree. ## Inputs - Reference (every read): `../CONTEXT.md` — universes and traps - Reference (every write): `../_meta/schema.md`, `../_templates/object.md` - Working: the app tree — `app/models/`, `db/schema.rb`, `app/services/` ## Clusters Clustered by how an editor asks, not by where the files sit. | Cluster | The question it answers | Cards | |---|---|---| | `identity/` | who is this person and what may they do | user, student, teacher | | `org/` | how are school, time, and roster shaped | school, year, school-year, quarter, classroom, classroom-enrollment, grade-level | | `gradebook/` | how is earning recorded | grade-book, grade-entry | | `money/` | where do SIF dollars live | portfolio, portfolio-transaction, earnings-summary | | `trading/` | what is bought and held | stock, order, portfolio-stock, portfolio-position, portfolio-snapshot | | `announcement.md` | site-wide notices (singleton, unclustered) | announcement | Pure join tables with no behaviour of their own — `teacher_classrooms`, `classroom_grades` — do not get cards. They are described inside the parents they join. `classroom-enrollment` **does** get a card: it carries primary/unenroll behaviour. ## Process 1. Copy `../_templates/object.md`. Never start from a blank page. 2. Fill Shape from the source, citing `path:line`. Prefer `db/schema.rb` for columns and the model for behaviour. 3. Fill **If you change this** as Hits / Does not hit, **first-order only**. "Does not hit" must name the obvious next noun that is the *wrong* one — that line is the whole value of the card. 4. Set `status: verified` only with a date, a commit, and citations in the body. 5. Run `../_meta/build-index.sh`. ## Outputs - One card per noun, in its cluster folder - `_index.md` — regenerated, never hand-edited ## Human check Pick one card you did not write. Follow its first citation into the app tree. If the line it lands on does not state the claim, the card is wrong — fix the card, not the citation.