Rules sources — what is verified, what is a variant, what needs a player
Audit of 2026-10-30. Every scoring constant and calendar algorithm in
packages/scoring, packages/lunar and the four apps was traced to
its source in docs/specs/rules/*.md, and the primary sources were re-read on
2026-10-30 (web). The engine passes 644 tests (521 scoring, 118 lunar, 5 app-core) that
encode the worked examples of the specs.
Status key: - Verified — the value is read from an official rule book
(federation document) or an astronomical reference and matches the code. -
Variant — a regional / house rule with no single authority; the code offers
it as a setting, the default is a documented choice. - Needs player — no
primary source found; the value comes from a secondary source (pagat.com, Wikipedia,
Jass-Wiki) or was chosen by us and must be confirmed by a native player or expert before
launch (see docs/specs/rules/OPEN_QUESTIONS.md).
Primary sources (read directly)
| Game | Authority | Document | Re-read 2026-10-30 |
|---|---|---|---|
| Belote classique, contrée, coinche | Fédération Française de Belote (FFB) | Règles officielles de Belote 27.01.2016; Belote Contrée 27.01.2016; Belote Coinchée (undated) — ffbelote.org/documents/ | yes, all three |
| Tarot | Fédération Française de Tarot (FFT) | Règlement officiel RO201206 (1 July 2012) — fftarot.fr | yes |
| Skat | Deutscher Skatverband (DSkV) / ISPA | Internationale Skatordnung 2022 (ISkO); Spielliste 5er-Tisch 60 Spiele — dskv.de | yes |
| Doppelkopf | Deutscher Doppelkopf-Verband (DDV) | Turnier-Spielregeln, Stand 21.02.2026 — doko-verband.de | yes |
| Schafkopf | Schafkopfschule e. V. München | Turnierregeln 2020-01 (tariff, Tout ×2, Sie ×4); 2024 edition for the Laufende caps (read 2026-10-29) | yes (2020) |
| Rommé | DSkV | Internationale Rommé-Ordnung 02.07.2012 | yes |
| Jass (Weis) | Jassverband Schweiz | Jass-Wiki Weispunkte (jasswiki.ch/weis-regeln/weispunkte/) | yes |
| Jass (Schieber, slate) | — no federation rule book online — | pagat.com Schieber Jass (DE); de.wikipedia Jass; jasvel.org Jasstafel schreiben. The reference book Puur Näll As (AGM AGMüller) is not read | yes (secondary) |
| Lunar astronomy | Jean Meeus, Astronomical Algorithms 2nd ed. (1998), ch. 22, 25, 47, 48, 49 | implemented from the book | — |
| Lunar tradition | Maria Thun Aussaattage (constellations); Paungger & Poppe Das Mondjahr (tropical signs) | only the Penguin excerpt of Mondjahr 2027 Garten read; icalendrier.fr 2026 (constellation calendar) used for a 365-day comparison | partly |
A. Jasstafel (CH)
| Item | Value in code | Source | Status |
|---|---|---|---|
| Card values, trump (Under 20, Nell 14, A 11, K 4, O 3, Banner 10), plain suits, last trick +5, 157 per hand | jass/schieber.ts |
pagat Schieber; de.wikipedia Jass; Jass-Wiki | Verified (secondary sources agree; 157 is arithmetic) |
| Obenabe: 8 = 8 points | same | pagat; de.wikipedia | Verified |
| Undenufe: 6 = 11, A = 0 (modern) / A = 11, 6 = 0 (old) | setting, default modern | de.wikipedia ("Swiss variant: 6 counts 11, A 0; Vorarlberg/South Tyrol keep the standard values"); pagat ("most players now…") | Verified as the common CH practice; the old values stay an option |
| Match = 157 + 100 = 257 | same | pagat; de.wikipedia; jasvel | Verified |
| Weis table: Dreiblatt 20, Vierblatt 50, Fünfblatt 100, Sechsblatt 150, Siebenblatt 200, Achtblatt 250, Neunblatt 300, vier Gleiche 100 (incl. 6/7/8), vier Nell 150, vier Puur 200, Stöck 20 | jass/weis.ts |
Jass-Wiki Weispunkte (Jassverband Schweiz) | Verified |
| Weis comparison (points → more cards → higher top card, lower in Undenufe → trump → first announced) | same | Jass-Wiki (identical five steps) | Verified |
| Kreuzweis allowed, both count | setting, default on | Jass-Wiki ("Beide Weise gelten") | Verified; some tables exclude it (option) |
| Stöck scored by its own team regardless of Weis | same | Jass-Wiki ("Stöck werden immer von der eigenen Partei geschrieben") | Verified |
| Multipliers: Eichel/Rosen ×1, Schellen/Schilten ×2, Obenabe ×3, Undenufe ×4 | preset 1 (default) | pagat: ×4 Undenufe. de.wikipedia: "Obenabe and Undenufe ×3, one variant ×4". Appenzell 2–7 (wiki) | Variant — ×3 vs ×4 Undenufe is the biggest open default (Q2 / A1); both presets exist. 2026-11-01 AI review: ChatGPT and Gemini keep ×4; Perplexity says ×3 citing pmu.ch Schieber-Jass (not readable by us). Default unchanged |
| French deck: which suits are ×2 | setting | pagat (black ×1, red ×2) vs de.wikipedia (red ×1, black ×2) contradict | Needs player (Romandie) |
| Target score default | 2500 (1000 / 1500 / 2000 / 3000 options) | de.wikipedia "1000 or 2500"; pagat 3000 (with Bergpreis 1500); jasvel "1000, 1500, 2500, 3000 in practice"; Romandie règlement 1000/1500/2000 | Variant; no printed-slate source yet (A3) |
| Finish order Stöck → Wys → Stich | default | de.wikipedia "most common Swiss rule"; Stöck-Stich-Wys also known; Vorarlberg Stich-Stöck-Wys; jasvel lists Weis → Stöck → Stich | Variant (setting exists) |
| Z slate convention: top line 100, diagonal 50, bottom line 20, remainder as a number; groups of five crossed | components/z-slate.tsx |
de.wikipedia Jass (Jasstafel section), jasvel.org Jasstafel schreiben ("Oben die Hunderter, in der Mitte die Fünfziger, unten die Zwanziger"), pagat DE | Verified — closes the open item. There is no fifth line; the extra marks on a real slate are a V = 500 and X = 1000 written on the top line (wiki, jasvel), and fifties are often drawn in crossed pairs (= 100). Optional UI polish, not a scoring rule |
| Schneider (loser under half), Bergpreis (half target) | options, off | pagat | Variant |
| Coiffeur: factors Eichel 1 … Gusti 10, Weis/Stöck off, points ÷ 10 before the factor, Match bonus 257 | jass/coiffeur.ts |
pagat Coiffeur; de.wikipedia; factor table 1–10 matches a 2022 Swiss club document (cited by an AI review 2026-11-01, not seen by us); Puur Näll As not read. Since 2026-11-01 the new-game screen offers the counting method (÷10 before or after the factor, or full points), Match bonus on/off and Stöck on/off | Needs player (A10–A12) |
| Differenzler: penalty = |prediction − points|, settlement vs. average | jass/differenzler.ts |
pagat; Eidg. Differenzler-Jass-Verband rules not read | Needs player (A13–A14) |
| Molotow: fewest points wins, Tischweis +, hand Weis −, Strich boards | jass/molotow.ts |
jassverzeichnis.ch; Jass-Wiki; pagat; sources disagree on the end rule | Needs player (A15–A18) |
| Bieter / Pandur / Sidi Barrani / Schellenjass / Handjass boards | jass/points-board.ts |
Jass-Wiki (recommendations), pagat, Gastro Suisse règlement (Romandie names) |
Needs player (A19–A25). Pandur inheritance checked 2026-11-01 on
jasswiki.ch/varianten/pandur: on a missed bid both opponents
and the dealer write the bid's Schreibpunkte (2/3/4/5/6 by bid
height); no fixed-2 rule there, so the default onFailure is confirmed and
twoFixed stays a house-rule option
|
B. Compteur Belote & Tarot (FR)
| Item | Value in code | Source | Status |
|---|---|---|---|
| Belote card values (trump J 20, 9 14, A 11, 10 10, K 4, Q 3; plain J 2, 9 0), 162 incl. dix de der 10, capot 252 | belote/*.ts |
FFB Belote 2016 §values; FFB Contrée; FFB Coinche | Verified |
| Sans Atout A = 19; Tout Atout J 13, 9 9, A 6, 10 5, K 3, Q 2 (Coinche); Tout Atout with trump values 258 → ×162/258 conversion (Contrée §11.3, 198 → 124 + 20) | per preset | FFB Coinche; FFB Contrée | Verified |
| Belote-rebelote 20; up to 4 belotes (80) in Tout Atout | same | FFB Coinche | Verified |
| Classic: success = strictly more than the defence (belote included); chute → defence 162 (252 on capot); belote "imprenable"; litige 81–81 held to the next deal (tournament option); rounding to 10 optional (85 → 90, 84 → 80) | preset "classique" | FFB Belote 2016 | Verified |
| Contrée: bids 80–160 by tens or capot; contré ×2 / surcontré ×4; belote lost on chute; rounding always to 10; two décomptes (points faits / faits + demandés); Note 1 (2C + 160 instead of 2C + 320); Note 2 (unbid capot contré = 320 + 100 = 420); end-of-game example 1770 + 120 + 110 | preset "contrée" | FFB Contrée 2016 (text) | Verified |
| Contrée table values 160 (chute) / 320 / 640 / 500 (capot bid) / 1000 / 2000 | belote/contree |
FFB Contrée p. 7 — the table is an image, transcribed by us; cross-checked 2026-10-30 with fr.wikipedia Belote contrée (chute 160 + contract + belote; capot réussi 500; capot chuté 410 = 250 + 160, offered as an option) | Verified by cross-check; the FFB image itself still worth one look by a FR player (B7) |
| Contrée target 2001 (Cannes tournaments) | option | tournament règlements (recorded 2026-10-30) | Variant |
| Coinche: announcements (carré J 200, 9 150, A/10/K/Q 100; Sans Atout carrés A 200, 10 150, others 100; cent 100, cinquante 50, tierce 20); capot 250; success = bid reached and more points; chute → 160 + announcements + belote + contract, ×2 / ×4; rounding to 10 | preset "coinche" | FFB Coinche | Verified |
| Which game a café table plays by default, targets 1000 / 2000 / 3000 at home | defaults 1000 / 2000 / 2000 | FFB leaves the target to the organiser; fr.wikipedia "usually 3000" for contrée; pagat 2000 | Variant (B1–B2) |
| Tarot card points (bout/roi 4.5, dame 3.5, cavalier 2.5, valet 1.5, other 0.5 = 91) | tarot/tarot.ts |
FFT RO201206 | Verified |
| Targets 56 / 51 / 41 / 36 by bouts; base 25; Petite ×1, Garde ×2, Garde sans ×4, Garde contre ×6 | same | FFT | Verified |
| Petit au bout 10 × multiplier, "quel que soit le résultat" | same | FFT | Verified |
| Poignée 20 / 30 / 40, not multiplied, to the winner of the deal; trumps needed 10/13/15 (4 players), 13/15/18 (3), 8/10/13 (5) | POIGNEE_TRUMPS |
FFT pp. 3–12 | Verified (4-player values apply at 3 and 5; FFT gives no separate values) |
| Chelem +400 / +200 / −200; defence chelem +200 each; Excuse on the last trick changes sides except in a chelem | same | FFT | Verified |
| 4 players: defenders −X each, taker +3X; 5 players: taker 2/3, partner 1/3 (2X / X); 3 players: taker ×2, half-points to the winning side | same | FFT (3- and 5-player pages) | Verified |
| Pousse (×1/2/4/8/12), poignée 10/20/40 variant, misère, petit chelem | options | pagat (traditional) | Variant |
| 6 players all playing (12 cards, chien 6, poignées 6/8/10, −0.75X per defender); 6–8 with morts rotation; double appel at 7–8 | tarot 6–8 modes |
tarot-multijoueur.com; competitor feature lists; no federation rule | Needs player (B14–B16) |
C. Skat & Doppelkopf Liste (DE)
| Item | Value in code | Source | Status |
|---|---|---|---|
| Skat Augen (J 2, A 11, 10 10, K 4, Q 3) = 120; base values Karo 9 / Herz 10 / Pik 11 / Kreuz 12 / Grand 24; Null 23 / 35 / 46 / 59 | skat/skat.ts |
ISkO 2022 §2.2–2.4 | Verified |
| Gewinnstufen (Skat game 1–3; Hand game 2–7 incl. Schneider/Schwarz angesagt, Offen), Schneider ≤ 30, Schwarz = no trick | same | ISkO §2.5 | Verified |
| Lost game −2 × value (incl. Hand games) | same | ISkO §2.5.11 | Verified |
| Überreizt: smallest multiple of the base ≥ bid, lost ×2; Schneider can rescue | same | ISkO §3.6 (+ example) | Verified |
| Seeger-Fabian: ±50 per won/lost game; +30 to each other player at a 4-table, +40 at a 3-table; ranking tie-breaks | skat/seeger-fabian.ts |
ISkO / SkWO §6.3.1 | Verified |
| Series 48 deals (4-table) / 36 (3-table) | same | pagat (not in the ISkO text) | Verified via pagat; DSkV list PDFs agree |
| 5-player table: seating (first half: dealer's two left neighbours + the right one; second half: three left neighbours), +24 per other player's lost game, 60-deal series | skat/list.ts |
ISkO §3.2.7; DSkV Spielliste 5er-Tisch 60 Spiele | Verified |
| 2001 proposal (40 to the two active opponents only) | option | pagat | Variant |
| Kontra / Re ×2 / ×4 (score, not value); Ramsch (simple −10, Jungfrau 15/−20, Durchmarsch +120, Augenramsch); Bock rounds (= number of players, triggers configurable, sequential vs simultaneous); "Hand wird nicht bestraft"; Bierlachs 301/401 | options | pagat Skat (variations); de.wikipedia; survey 2026-10-29 | Variant — official rules have none of these; defaults from pagat and the survey (C1–C7) |
| Doppelkopf Augen (A 11, 10 10, K 4, Q 3, J 2, 9 0) = 240; Re wins with 121 (120 when only Kontra announced); Kontra with 120 | doppelkopf/doppelkopf.ts |
DDV TSR 2026 §7.1 | Verified |
| Game points: gewonnen 1; unter 90/60/30/schwarz +1 each; Re / Kontra +2 each; each Absage +1; reaching the threshold against an Absage +1 | same | TSR §7.2.2 | Verified |
| Sonderpunkte (gegen die Alten, Doppelkopf ≥ 40, Fuchs, Karlchen) 1 each, netted first, normal game only | same | TSR §7.2.3 | Verified |
| Solo: player ±3P, opponents ∓P; list check sum 0 and all even / all odd | same | TSR §7.2.4, §7.3.3 | Verified |
| Both parties fail their Absagen → nobody wins, only (a)/(e)/(f) + Sonderpunkte | same | TSR §7.1.3 | Verified text; whether (a) includes the base point needs a DDV referee (C10) |
| Hochzeit clarification trick: trump or plain suit | same | TSR §4.4.3 | Verified |
| 24 deals per round, Pflichtsolo | tournament mode | TSR §8 | Verified |
| Re/Kontra as doubling, old "lose everything" rule, Fuchs/Karlchen extras, Bock triggers, 5-player rotation | options | pagat Doppelkopf variants | Variant (C9, C12) |
| Schafkopf tariff: Rufspiel 10 ¢, Solo/Wenz 50 ¢, +10 ¢ per Schneider / Schwarz / Laufender; Tout ×2, Sie ×4; point scheme 1/2/3 and 6/9/12/18/24 | schafkopf/*.ts |
Schafkopfschule Turnierregeln 2020-01 (tariff, Tout, Sie), 2024 edition (Laufende caps 14 / 8 / 4) | Verified (tournament); home tariffs vary (C13) |
| Schafkopf Kontra/Legen, Ramsch, point-mode ties | options | de.wikipedia, pagat | Variant (C15) |
| Rommé: A 11, K/Q/J 10, joker 20 in hand, first meld ≥ 40; round bonuses 15/12/10/8/5; penalty tiers; (bonus − penalty) × 10 − card points | romme/romme.ts DSkV preset |
DSkV Rommé-Ordnung 2012 §2.2, §5, §7 | Verified |
| Rommé home preset (minus Augen, Hand-Rommé ×2, 100 if not opened) | preset | de.wikipedia | Variant (C16) |
D. Mondkalender (DE/FR)
| Item | Value in code | Source | Status |
|---|---|---|---|
| Moon longitude/latitude/distance (Meeus ch. 47, 60-term series), Sun (ch. 25), nutation (ch. 22), illumination (ch. 48), phases (ch. 49), ΔT (Espenak–Meeus polynomial) | lunar/astronomy.ts |
Meeus 1998 | Verified by the anchors below |
| Phase anchors: 2024-04-08 new 18:21; 2025-03-14 full 06:55; 2026-03-03 full 11:38; 2026-08-12 new 17:37 (±3 min tests) | astronomy.test.ts |
Checked 2026-10-30: timeanddate gives 2026-03-03 full moon 11:37 UTC (engine 11:37:57), 2026-03-19 new 01:23 (engine 01:23:30); NASA greatest-eclipse times 11:34 / 17:46 UT are a different instant and must not be used as phase times (spec §8 note) | Verified |
| Ascending / descending moon = sign of dδ/dt; "Wende" turning points | calendar.ts |
Checked 2026-10-30 against the published 2026 Pflanzzeit windows (farbenundleben.de, Thun method): 21.04 14:00 / 05.05 13:00 / 18.05 23:00 / 01.06 18:00 local — engine 12:59 / 13:22 / 21:26 / 18:48. All within 1.5 h of the published (hour-rounded) times; the declination is flat at the turning point so this is the expected tolerance. 365/365 days agree with icalendrier.fr | Verified |
| Constellation boundaries (J2000 ecliptic longitudes 29 / 53.5 / 90 / 118 / 138 / 174 / 218 / 241 / 248 Ophiuchus / 266 / 300 / 328 / 352, precessed 50.29″/yr) | zodiac.ts |
IAU boundaries; cross-checked 2026-10-30 with the Sun's constellation entry dates (TH Rosenheim observatory table: Aries 19.04, Taurus 14.05, Gemini 21.06, Cancer 20.07, Leo 11.08, Virgo 17.09, Libra 31.10, Scorpius 23.11, Ophiuchus 30.11, Sagittarius 18.12, Capricornus 20.01, Aquarius 16.02, Pisces 12.03) — all match within 1° | Verified as the astronomical boundaries |
| Thun's boundaries | Ophiuchus folded into Scorpio; otherwise IAU | icalendrier.fr (constellation calendar) agrees on 331/365 day types; the 34 differences are at six boundaries (mostly Scorpius→Sagittarius, earlier by ≤ 1 day). Thun adjusted the astronomical boundaries in her calendar; no published table found | Needs expert — one month of a printed Aussaattage calendar settles it (D2, D3) |
| Element → day type (Earth root, Water leaf, Air flower, Fire fruit) | zodiac.ts |
Thun tradition; confirmed by bienenzeitung.ch, farbenundleben.de, gartenbauschule-huenibach.ch, Paungger & Poppe excerpt | Verified (tradition, consistent across sources) |
| Tropical signs (Paungger & Poppe), sidereal option (Lahiri 23.853° J2000 + precession, Fagan-Bradley 24.736°) | zodiac.ts |
de.wikipedia Tierkreiszeichen; standard ayanamsa values | Verified |
| Activity rules: sow above-ground waxing, roots waning, planting/transplanting descending (Thun) or Virgo (P&P), pruning waning / descending, grafting waxing / ascending, weeding waning, pests waning, harvest storage waning | activities.ts |
Paungger & Poppe Mondjahr 2027 Garten excerpt (authors' text); Thun method per bienenzeitung.ch / farbenundleben.de (descending = Pflanzzeit, ascending = harvest fruit, prune vigorous growth) | Verified for the listed activities |
Activities flagged sourced: false: fertilise, soil work, cuttings, lawn,
houseplant watering, root/flower harvest
|
placeholders | farbenundleben.de lists fertilising and soil work under the descending moon (Thun) — a candidate source, not yet applied | Needs expert (D6) |
| Node / perigee / apogee "avoid" days: whole local day | setting | icalendrier.fr marks the whole day (54/54 agree); Thun's window width unknown | Variant (D5) |
| Hair / nail / household days | not built | Paungger & Poppe main calendar not read | Needs source (D7) |
| Default school per market (Thun default) | setting | FR: icalendrier.fr follows the constellations; DE: both books sell | Needs gardener (D1) |
Season windows (apps/mondkalender/src/lib/season.ts)
|
months per activity, one table for DE/AT/CH and one for FR (app language); fruit trees
and berry bushes split out as "Obstgehölze pflanzen" (plantTree)
|
First written without a source; plausibility check 2026-10-30 against Plantura Aussaatkalender (DE). 2026-11-01: reviewed by three AI assistants with the prompts in project-files/expert-prompts (ChatGPT and Gemini without citations; Perplexity citing NDR Aussaat-Kalender, Mein schöner Garten, meine-ernte.de, Rustica, sememoi.com — links not opened by us, NDR blocked from our network). Rule: a month changed only where two of three agreed. Result: tomatoes/zucchini planting May–June (split from fruit trees), leaf harvest to December; everything else kept. Fruit trees DE Mar–Apr + Sep–Nov, FR Oct–Mar (ChatGPT only; the others did not split). Catalog plants in "Mein Garten" use their own months instead of the broad window | Needs gardener (DE + FR) before launch |
What a real player / expert still has to answer
The engine runs with a documented default for each of these; an answer changes a setting or a default, not the code.
- CH Jass: Undenufe ×3 or ×4 default; default target (2500?) and what the printed slates show; French-deck suit multipliers; Coiffeur arithmetic (÷10, Match bonus); Differenzler federation rules; Molotow end rule; Bieter / Pandur / Sidi Barrani / Schellenjass details. A copy of Puur Näll As would answer most of A10–A25.
- FR Belote / Tarot: which preset a café table calls "la belote"; home targets; one look at the FFB contrée table image (p. 7) to confirm 500 / 1000 / 2000; Tarot 6–8 players with morts and double appel (no federation rule exists); pousse still played?
- DE Skat / Doppelkopf: home list style and Bock/Ramsch conventions (survey partly done); TSR 7.1.3 base point (DDV referee); Doppelkopf Re/Kontra doubling vs +2 at home; Schafkopf home tariff; Rommé home preset.
- Mondkalender: one month of a printed Maria Thun Aussaattage (boundaries, node window), a Paungger & Poppe calendar (hair/care rules, the open activities), and a DE and a FR gardener for the season windows.