- Rust 68.3%
- Shell 21.9%
- Python 5%
- Nix 4.8%
|
Some checks failed
CI / ci (push) Failing after 9m40s
Deux propositions de Larry, faites. 1. kleroterion --etat <fichier> lit un état fourni EXPLICITEMENT, jamais par défaut. Le banc écrit le fichier et joue les deux cas : avec 2 authentificateurs logiciels, la cellule REFUSE en code 78 avec ses motifs nommés et le laboratoire DÉMARRE ; état vide, les deux démarrent. Le même état, deux issues — c'est cela que « deux images distinctes » veut dire, et rien ne le montrait. Même principe que l'urne du banc 1 : des entrées choisies pour l'épreuve, pas une source simulée. Une directive inconnue est un refus (code 64), jamais une ligne ignorée : un état lu à moitié est pire qu'un état absent, il se présente comme complet. Sans --etat, le nœud démarre ET L'IMPRIME — sans cette ligne on ne distinguerait pas « vérifié et accepté » de « rien à vérifier ». EN_ATTENDANT_L_ANNUAIRE est surveillé comme en_attendant_le_journal, et le déclencheur est l'USAGE, pas l'existence : la crate annuaire existe depuis longtemps, ce qui compte est que le nœud en dépende. Les TROIS états sont distingués et éprouvés, y compris celui qu'on oublie — marqueur effacé sans que la source arrive : effacer le marqueur ne fait pas arriver la source. 2. La cage réseau sans pont, établie sur pièce. Deux compteurs d'observation, aucune règle de refus, et une requête depuis un conteneur sans racine : skuid 1000 passe de 14 à 22 paquets, skuid 0 reste à 14. Le trafic d'un conteneur sans racine porte bien le skuid de l'utilisateur de service, donc le filtrage du §2.5 se fera sur la chaîne output par propriétaire. Deux réserves dites : le reset des compteurs n'a pas pris, c'est le DELTA qui est lu ; et le curl d'essai a échoué sur TLS, les paquets comptés sont ceux de la poignée de main — assez pour l'attribution, pas pour le contenu. Rien n'a été posé, table d'essai et image jetable retirées. Et une faute de garde, la même que trois fois déjà : ma documentation, en NOMMANT en_attendant_le_journal, déclenchait le jalon qui le surveille. Un contrôle qui punit la mention fait effacer l'explication plutôt que le marqueur. Les gardes de jalon ignorent désormais les lignes de commentaire, et mordent toujours — revérifié après le changement. Noté pour le §2.4 : le processus principal du nœud se termine, donc une image dont il est le Cmd est un conteneur ARRÊTÉ. Correct pour ce qu'il prouve ; quand il deviendra le service, le banc devra vérifier qu'il reste en vie et qu'il répond. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .cargo | ||
| .claude/rules | ||
| .forgejo/workflows | ||
| banc | ||
| ci | ||
| crates | ||
| docs | ||
| outils | ||
| vendor | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CONTRIBUTING.md | ||
| flake.lock | ||
| flake.nix | ||
| images.lock.nix | ||
| LICENSE | ||
| LICENSE-docs | ||
| README.en.md | ||
| README.md | ||
Klérotèrion
Tools for a cell: 20 to 150 people who deliberate, draw their roles by lot and vote in secret, with no centre.
The name is the Athenian allotment machine — a stone slab with rows of slots, standing at the entrance, which anyone could watch working.
What is authoritative
docs/spec-cellules-v26.md (in French). If this README, the documentation, the mock-up or the code disagree with it, the specification wins.
Status
Edition 1 frozen, four code pieces in place. The specification no longer changes by replacement: every change is a numbered erratum, tied to a clause and to a test.
| Crate | What it does |
|---|---|
dates |
the normative date format, one single definition for the whole repository |
tirage |
§2.4, byte by byte, pure — reproduces the edition 1 vectors |
regles |
the rules file: strict reading, digest, the circle's common protocol, local invariants |
mandats |
decisions 4, 12 and 13: rotation, accumulation, disjointness, waiting period, ostracism |
37 clauses in the registry (annex E), 21 carried by a named test. CI fails if one of them loses its test, if a normative sentence is reworded without an erratum, or if a bench no longer replays.
Still to write, in order: governance (contradictor, ostracism, mobility), identity service, log, flake and images, brick wiring, portal.
banc/ mechanically replays what a cell would check. Each piece ships its
scenario in the same differential as itself, never afterwards — and each
bench prints what it does not replace, starting with reading the paper
register aloud.
The draw, and how to check it yourself
label = "kleroterion/tirage/v1" ‖ 0x00 ‖ epoch (8 bytes) ‖ role length (1 byte) ‖ role
digest = SHA-256(label ‖ seed (32 bytes) ‖ id length (2 bytes) ‖ id)
ranking = terms served ascending, then digest ascending, then identifier ascending
The cell publishes the case file — eligible people and their counters — and its digest before the draw. A draw whose case file was not published first is void.
python3 docs/spec-cellules-vecteur-tirage.py
node docs/spec-cellules-vecteur-tirage.mjs
./ci/ci.sh
What this project does not write
No cryptographic primitive, no consensus protocol. Voting is Belenios, deliberation Loomio and Pol.is, voice Linphone and Flexisip, the log an existing witness network (C2SP tlog-witness). We package them; we do not modify them.
Where this repository lives
Canonical address: https://git.floating-coconuts.com/SuperTarAnTa/kleroterion. Codeberg is a write-only mirror, never referenced by CI or by project links.
The NixOS module and the Podman composition pull images and releases from the canonical forge, but the reference is always the digest, never the address: anything that does not match the published digest is refused, wherever it came from.
Licences
Code: AGPL-3.0. Documentation (docs/): CC BY-SA 4.0.