docs: add ubiquitous language, QFD design, and ADRs

This commit is contained in:
Julien Calixte
2026-06-20 02:09:09 +02:00
parent 68a8c303d9
commit cbbd61b6f4
5 changed files with 345 additions and 0 deletions

105
CONTEXT.md Normal file
View File

@@ -0,0 +1,105 @@
# meadows
The ubiquitous language for **meadows** — a web app for building systems-thinking
models (stock-and-flow diagrams with feedback loops) in the spirit of Donella
Meadows' *Thinking in Systems*. The diagram is the product now; numeric simulation
is a planned later phase, so the language is chosen to be simulation-ready.
## Language
**System**:
The real-world thing being studied — an interconnected set of elements producing
a behaviour over time. It is the *referent*, never the artifact in the app.
_Avoid_: model, diagram, map (those are the artifact, not the real thing).
**Model**:
One saved document — a simplified representation of a System, made of Stocks,
Flows, Converters, and Information Links. The unit of save / export / reopen.
_Avoid_: system, diagram, map, canvas, sheet, project.
**Stock**:
An accumulation that holds a quantity over time — the system's memory (e.g. water
in a bathtub, money in an account, a population).
_Avoid_: Box, level, container, node.
**Flow**:
A rate that moves quantity into (**inflow**) or out of (**outflow**) a Stock —
the only element that can change a Stock's value; drawn as a pipe with a valve.
Inflow/outflow is one Flow's direction relative to a given Stock, not a separate
element type (a stock→stock Flow is an outflow for one and an inflow for the
other). _Avoid_: faucet, drain, pipe, rate (that's the Flow's value), arrow.
**Converter**:
A stateless helper value, recomputed each instant from its inputs (or a fixed
constant), that feeds Flows or other Converters via Information Links — e.g.
`birth rate = fertility × 0.01`. A constant is a Converter with no inputs.
_Avoid_: variable (Stocks and Flows are variables too), function, auxiliary,
parameter, node.
**Information Link**:
A connector showing that one element's value influences a Flow's or Converter's
value; carries no quantity, never changes a Stock. _Avoid_: arrow, dependency,
edge, connector.
**Source** / **Sink**:
The model boundary on an open Flow end — a **Source** is where a Flow originates
outside the model (unlimited supply), a **Sink** is where it disappears. Drawn as
a cloud, auto-rendered when a Flow has no Stock at one end. _Avoid_: cloud (that's
the symbol, not the term), external, environment.
**Polarity**:
The sign on an Information Link (and inherent to a Flow): `+` when more cause
means more effect, `` when more cause means less effect. The input that lets
loops be classified. _Avoid_: sign, direction (direction is inflow/outflow),
weight.
**Feedback Loop**:
A closed cycle in the wiring (Stock → … → Flow → same Stock); **detected** from
structure, never stored or hand-drawn. Classified by the product of polarities
around the cycle. _Avoid_: cycle (internal term), circle, circuit.
**Reinforcing**:
A Feedback Loop with an even number of `` polarities — it amplifies change (the
snowball); labelled `R`. _Avoid_: positive, self-reinforcing, vicious/virtuous.
**Balancing**:
A Feedback Loop with an odd number of `` polarities — it counteracts change and
seeks a goal (the thermostat); labelled `B`. _Avoid_: negative, stabilizing,
goal-seeking.
## Relationships
- A **Stock** is the only stateful element — it accumulates (∫ flows) and has
memory; it changes **only** through **Flows**.
- A **Flow** and a **Converter** are stateless — recomputed each instant from
their inputs; neither has memory.
- An **Information Link** feeds a **Stock**, **Flow**, or **Converter** value
into a **Flow** or **Converter** (never into a Stock — Stocks change only via
Flows), and carries a **Polarity**.
- A **Feedback Loop** is a detected cycle in the wiring; it is **Reinforcing**
when it has an even number of `` polarities, **Balancing** when odd.
## Example dialogue
> **Dev:** "For a population model, **Population** is a **Stock**, and **births**
> is a **Flow** into it — an inflow. Where do the births come from?"
> **Modeller:** "From outside the model — so the Flow's other end is a **Source**
> cloud. Same with **deaths**: an outflow from Population to a **Sink**."
> **Dev:** "And births depend on how many people there are?"
> **Modeller:** "Right — an **Information Link** from Population to the births
> Flow, with `+` **Polarity**: more people, more births. That closes a cycle, so
> the app detects a **Feedback Loop**. Even number of `` links — zero here — so
> it's **Reinforcing**."
> **Dev:** "And `birth rate = fertility × 0.01`?"
> **Modeller:** "That's a **Converter** — stateless, recomputed each step. The
> Population Stock is the only thing that remembers."
## Flagged ambiguities
- "arrow" was used for two distinct things — resolved into **Flow** (moves
material, changes a Stock) and **Information Link** (carries influence only).
- "function" was the user's word for the stateless helper — resolved to
**Converter** (avoids collision with programming "function" and with the
stateful Stock).
- "positive / negative feedback" — resolved to **Reinforcing** / **Balancing**
(Meadows' preferred terms; `+/` is reserved for link **Polarity**).