Add project docs, glossary, and licence

The Nuxt version is being rewritten in Go. This is the design that came out
of it, split by how each part ages:

- CONTEXT.md    glossary, English identifiers and Finnish UI wording
- docs/spec.md  behaviour: rules, submission pipeline, routes, API contract, schema
- docs/decisions.md  why, append-only
- docs/later.md      deliberately not in v1

testdata/ytdlp-noose.json is a real yt-dlp dump used to test metadata
prefill against a video with no track, artist or album tags.
This commit is contained in:
Esa Kataja
2026-07-31 19:37:22 +03:00
commit 2474b42175
7 changed files with 1252 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
# Levyraati
A private music review club for about ten friends. Members submit songs and review each other's
picks; other people's opinions of a song stay hidden until you've written your own.
Identifiers, schema, and routes are English. Rendered text is Finnish only. Each term below carries
both, so the UI uses one word per concept everywhere.
## Language
**Member**_jäsen_:
A person with an account. Every account is a member; there is no other kind.
_Avoid_: user, käyttäjä, account
**Admin**_ylläpitäjä_:
The operator of the installation. Not a member and not an account — a set of credentials on a
separate surface. Never submits, reviews, or appears in any list of people.
_Avoid_: admin user, superuser, role
**Invite**_kutsu_ / **invite code**_kutsukoodi_:
A one-time code that permits one registration. Spent only by a registration that succeeds.
**Song**_kappale_:
A published piece of music with its converted audio, submitted by a member. A row in `songs` is a
real song with no qualifier.
_Avoid_: track, biisi, levy (that's a record, the wrong unit)
**Submission**_(no Finnish noun; the member sees only the verb_ lähettää _and a status)_:
A song in flight — uploaded or downloaded, converting, not yet published. It becomes a Song at
Publish and ceases to exist as a Submission.
**Publish**_julkaise_:
The submitter's explicit act of turning a converted Submission into a Song. Never automatic.
**Review**_arvostelu_:
One member's score and written verdict on one song. At most one per member per song, and never on
your own song.
**Reviewer**_arvostelija_:
The member who wrote a review. Reviews are never anonymous.
**Score**_pisteet_:
An integer 1100 given in a review.
_Avoid_: rating, arvosana
**Reveal**:
Gaining access to other members' opinions of a song by having written your own review of it — or by
being its submitter. Covers the reviews and the song's average score, on every surface that names a
song. Enforced in the query, never in the rendering.
Per-song opinion is gated; whole-history aggregate is public. A member's profile shows counts and
averages over everything they have done, never how they reviewed any particular song.
**Edit window**:
The 30 minutes after a review's last change, during which its author may edit or delete it. Then the
review is on the record permanently.
**Locked** (of a song):
Having at least one review, which freezes its title, artist, and description and prevents the
submitter deleting it. A live state, not a one-way door: if the last review is deleted, the song is
editable again.
**Report**_palaute_:
A member's free-text note about something broken or annoying, carrying the page they were on. Open
until the admin resolves it. Deliberately has no category, priority, or severity.
_Avoid_: ticket, issue, bug, vikailmoitus
**Genre**_genre_:
One value from a fixed list, chosen by the submitter.
_Avoid_: tyylilaji, tag, category
**Ban**_estä_:
Ending a member's participation: login refused and live sessions dropped. Their songs and reviews
remain and continue to count. Reversible.
**Stats**_tilastot_:
The always-public leaderboards. The only place aggregate opinion is visible without having reviewed.