# Design note — points, ranks and a leaderboard

**Dated 2026-08-05. Written before the code, per the provenance practice in
[ROADMAP.md](../../ROADMAP.md#proving-independence).**

---

## The job to be done

A forum with no visible progression is one where a member's tenth post feels
exactly like their first. Recognising the people who show up and help is what
turns a comment section into a community.

That is the case *for* this. There is also a real case against, and it has to
shape the design rather than be waved away.

## Decision 0 — rewarding volume produces volume

Every points system teaches people what the community values. A system that
counts posts teaches people to post; a forum that rewards posting gets more
posting, not more help.

So:

- The default weighting puts **reactions received well above posts written**.
  Somebody else has to think what you wrote was worth marking.
- **Every value is configurable, including to zero**, and the admin screen says
  what each one teaches.
- The **whole system is off until it is switched on.** A community that does
  not want scores should not have to remove them.

None of that stops a determined farmer. It does stop the software quietly
insisting that posting a lot is the same as being useful.

## Decision 1 — a ledger, not a counter

Points are rows: who, how many, why, and what caused it.

A counter cannot answer "why do I have 340 points", cannot be recomputed after
a settings change, and — the one that matters — cannot be **reversed** when the
post that earned them is deleted. A counter drifts, and a drifted score is one
people stop believing in.

Each row carries the thing that caused it, and the pair is unique, so awarding
is idempotent: the same reaction processed twice does not pay twice.

## Decision 2 — deleting the cause removes the points

Delete a post and its points go with it. Un-react and the points go back.

Otherwise the leaderboard is a record of everything that was *ever* posted,
including the spam that has been cleaned up, and the fastest route to the top
is to post rubbish and let a moderator tidy it away.

## Decision 3 — ranks are thresholds, computed, never stored

A rank is a name and a minimum. Somebody's rank is whatever the highest
threshold they have passed is, worked out when it is displayed.

Storing a rank on the member row means every settings change needs a migration
across every account, and every drift is visible as somebody wearing a title
they have not earned.

## Decision 4 — the leaderboard has a period, and the default is not all time

**This week**, **this month**, **all time**.

An all-time-only leaderboard is the same five people forever. It tells everybody
who joined later that the contest was over before they arrived, which is the
opposite of what the feature is for. The ledger carries dates, so a period
costs nothing but a `WHERE`.

## Decision 5 — the numbers are the member's, and they follow the same rules as the rest

Points and rank are:

- shown on the profile and, optionally, beside posts;
- **in the data export**, because they are things the site holds about somebody;
- **erased with the account**, along with everything else.

That last pair is not an afterthought. Anything storing personal data has to
say so to the export and the erasure at the moment it is written, or a subject
access response quietly becomes wrong.

## Decision 6 — no daily-visit points, ever

Rewarding somebody for arriving teaches them to arrive and leave. It inflates
every engagement number an operator looks at while making the forum worse, and
it is the single most common mistake in this class of feature.

## What this does not do

- **No badges yet.** Threshold-driven badges are the natural next step and want
  their own note — awarding, revoking, and what happens when a threshold moves.
- **No manual point grants.** An operator handing out points turns a measure
  into a currency and every dispute into a support ticket.
- **No per-forum weighting.** "Posts in Support are worth double" is a real
  request and a real rabbit hole.
- **No negative points.** Moderation is for behaviour; a score that can go down
  turns every removed post into an argument.
