Description
Le problème
Un Menhir s’est présenté au guichet la semaine dernière. On l’a poliment dirigé vers le portail. Le portail a brisé…
Il faudra donc modifier notre quota unique pour tenir compte des voies possibles en fonction de l’espèce.
Qu’est-ce qu’une voie
Il y a maintenant trois moyens pour quitter le Carrefours que l’on nomme des voies.
Le portail ouvre une brèche, laisse entrer, referme. Il ne compte que le nombre de voyageurs passés. Quidams et Pyrophores l’empruntent.
Le courant n’ouvre rien : il dissout le corps et le reconstitue à l’arrivée. C’est parfaitement sûr et parfaitement désagréable. Il ne compte pas les gens, il compte la masse. Plantagenêts et Ondins l’empruntent.
Le convoi lourd est une nacelle blindée qu’on propulse à travers. Elle coûte le même prix pleine ou vide : on ne la lance donc jamais à moins de la moitié de sa capacité, et un Menhir seul devant dix places attend qu’il s’en présente quatre autres. Les Menhirs n’ont pas le choix : le portail les refuse et le courant les recomposerait en gravier.
⚠️ Trois procédés, trois unités incompatibles. Une place de convoi ne se convertit pas en kilogrammes de courant. Et une dimension peut très bien desservir les portails sans avoir jamais entendu parler des convois.
Ce qu’une dimension dessert
Les règles d’entrée d’une dimension se déclinent désormais voie par voie : un quota d’entrée et un tarif de traversée par voie desservie.
Le tarif unique par dimension n’existe plus : ouvrir un portail et ouvrir un courant sont deux ouvertures différentes, facturées séparément.
Une dimension peut très bien accueillir utiliser des portails et n’avoir aucun convoi. Dans ce cas la voie est close, et personne ne passera jamais par cette voie. Ce n’est pas la même chose qu’une voie desservie dont le quota d’entrée est nul cette semaine : celle-là rouvrira (voir critère 9).
Je n’ai pas mon mot à dire sur ce découpage. Une dimension close aux convois l’est parce qu’elle l’a décidé, et j’ai cessé de me présenter aux assemblées de l’Alliance, on ne m’écoute jamais ou quelqu’un finit toujours par y mettre son veto…
Les voies et leurs règles
| Voie | Pour | Se compte en | Contraintes |
|---|---|---|---|
| Portail | Quidams, Pyrophores | voyageurs | aucune ; on entre, on sort |
| Courant | Plantagenêts, Ondins | kilogrammes | on y entre en masse ; un voyageur passe entier ou pas du tout |
| Convoi lourd | Menhirs | voyageurs | un seul par audience et par dimension, et il refuse de partir s’il n’est pas au moins à moitié plein |
Le courant
Le courant se remplit en masse. Un voyageur n’y entre que si sa masse entière tient dans ce qui reste. S’il est trop lourd, je passe au suivant, qui peut très bien tenir. Le courant n’est donc pas premier arrivé premier servi au sens strict (voir critère 4 et l’exemple 1).
Le convoi lourd
Il ne part qu’un convoi par dimension et par audience, et il refuse de partir s’il n’est pas rempli au moins à moitié arrondi à l’entier supérieur (ex.: convoi de 7, min de 4) et acec un minimum d’une personne. Un Menhir seul devant un convoi de dix entrées attend, et attendra, jusqu’à ce que quatre autres Menhirs se présentent (voir critère 5 et l’exemple 2).
Quand il refuse de partir, aucun de ses candidats n’embarque, et ils conservent tous leur ancienneté.
Impacts sur le consulat
Les droits consulaires, voie par voie
Chaque voie desservie porte son propre tarif, et ce tarif se divise entre les seuls embarqués de cette voie et de cette dimension. Rien ne circule d’une voie à l’autre.
Le portail et le convoi se divisent par tête : le tarif ÷ le nombre d’embarqués donne ce que chacun paie.
Le courant, lui, ne connaît pas les têtes. Son tarif se divise par la masse embarquée totale, ce qui donne un prix au kilogramme, et chacun paie ce prix multiplié par sa propre masse. Un Ondin de 120 kg paie donc le double d’un Ondin de 60 kg, ce qui a paru évident à tout le monde sauf aux Ondins (voir critères 8A et 8B et l’exemple 1).
⚠️ L’arrondi porte sur l’unité facturée : le montant par voyageur au portail et au convoi, le prix au kilogramme au courant. Comme les masses sont des kilogrammes entiers, la note d’un voyageur du courant tombe ensuite juste, et il n’y a qu’un seul arrondi.
Déroulement d’une audience
| Actions possibles |
|---|
| Déposer les règles d’entrée d’une dimension : un quota d’entrée et un tarif de traversée par voie desservie. |
| Conséquences d’une audience (en ordre) |
|---|
| 1. Dépouiller les cahiers non encore lus. |
| 2. Ouvrir les passages de chaque dimension, voie par voie. |
| 3. Attribuer les entrées et faire embarquer, voie par voie. |
| 4. Calculer les droits consulaires. |
| 5. Refermer les passages ; les quotas non utilisés sont perdus. |
Conditions de succès
📎 Ce que « croissant » et « ordre alphabétique » veulent dire exactement : les départages, dans le fonctionnement.
| # | Description |
|---|---|
| 1 | La voie qu’emprunte un voyageur découle de son espèce. |
| 2 | Les quotas d’entrée sont indépendants d’une voie à l’autre et d’une dimension à l’autre. |
| 3 | Le courant se remplit en masse ; un voyageur n’embarque que si sa masse entière tient dans ce qui reste. |
| 4 | Un voyageur trop lourd pour le courant restant est passé, et le candidat suivant est examiné. |
| 5 | Un convoi qui n’atteint pas la moitié de son quota ne part pas : aucun de ses candidats n’embarque, et tous conservent leur ancienneté. |
| 6 | Un quota d’entrée et un tarif appartiennent au couple (dimension, voie). Une dimension n’a donc au plus qu’une voie de chaque type, et deux dimensions qui desservent la même voie ne partagent rien. |
| 7 | L’ordre d’examen reste l’ancienneté croissante puis le numéro d’existence croissant, à l’intérieur de chaque voie. |
| 8A | Chaque voie desservie porte son propre tarif de traversée. Ce tarif est divisé entre les seuls embarqués de cette voie et de cette dimension, et arrondi une seule fois, sur l’unité facturée. |
| 8B | Le portail et le convoi facturent par voyageur : tarif ÷ nombre d’embarqués. Le courant facture au kilogramme : tarif ÷ masse embarquée totale, arrondi, puis multiplié par la masse de chaque voyageur. |
| 8C | Un tarif divisé par zéro embarqué ne se perçoit pas : une voie qui s’ouvre sans que personne n’embarque, y compris un convoi qui refuse de partir, ne rapporte rien. |
| 9 | Une dimension sans règles d’entrée n’ouvre aucune voie. Un dépôt de règles d’entrée remplace intégralement le précédent : une voie absente du nouveau dépôt devient close. |
| 10 | Les droits consulaires doivent être calculés selon les paramètres de la voie empruntée, et non selon ceux de la dimension. |
🖥️ À l’écran
- Pour chaque dimension, l’état des trois voies : le quota annoncé et qui attend. Une voie close et une voie au quota nul doivent se distinguer à l’œil, car c’est la différence entre attendre et ne jamais partir.
- Pour la dernière audience, voie par voie, ce qui a été consommé et ce qui est resté sur le quai. C’est un autre écran : il regarde un tour qui a eu lieu, pas des règles en vigueur.
- Pour chaque convoi : combien de candidats, et combien il en faudrait pour qu’il parte. C’est l’écran qui permet à un Menhir de savoir s’il doit espérer.
- Pour chaque voie : le tarif annoncé, l’unité dans laquelle il se divise et ce qu’il a donné à la dernière audience. Lire « 1000,00 » à côté de « 5,56 le kg » est la seule façon de comprendre pourquoi une traversée coûte 667,20 à un Ondin.
API
| Dans le texte | Dans l’API |
|---|---|
| portail, courant, convoi lourd | PORTAL, CURRENT, CONVOY |
✅ Transmettre le journal d’une nuit
POST /night-logs — le fait d’admission gagne l’espèce du voyageur.
{
...
"species": "MENHIR"::string(QUIDAM | PYROPHORE | PLANTAGENET | MERFOLK | MENHIR),
...
}
L’auberge ignore ce qu’est une voie. Elle inscrit l’espèce parce qu’elle la connaît, et c’est le Consulat qui en déduit la voie (voir critère 1).
✅ Déposer les règles d’entrée d’une dimension
PUT /dimensions/<dimension::string(SALARIA | BOUCANIA | HYLEE | NIMBE | NOCTAMBULIE | TESSELLE)>/entry-rules — les quotas et les tarifs se déclinent par voie. Le crossingFee unique de CONSUL disparaît.
{
"lanes": [
{ "lane": "PORTAL"::string(PORTAL | CURRENT | CONVOY), "entryQuota": 4::int, "crossingFee": 500.00::float },
{ "lane": "CURRENT"::string(PORTAL | CURRENT | CONVOY), "entryQuota": 300::int, "crossingFee": 1000.00::float },
{ "lane": "CONVOY"::string(PORTAL | CURRENT | CONVOY), "entryQuota": 0::int, "crossingFee": 1200.00::float }
]
}
entryQuota se lit en voyageurs pour le portail et le convoi, en kilogrammes pour le courant.
crossingFee est toujours une somme en pièces, mais elle ne se divise pas par la même chose : 500 pièces sur un portail de 4 font au mieux 125 pièces par voyageur, tandis que 1000 pièces sur un courant de 300 kg font au mieux 3,33 pièces le kilogramme.
Une voie absente de lanes est close. Une voie présente avec un quota de 0 est desservie, mais ne reprend personne à cette audience-ci ; son tarif reste déclaré et ne se perçoit pas.
➡️ HTTP 202 Accepted
✅ Consulter les règles d’entrée et l’état des voies
GET /dimensions
⚠️ GET /dimensions/<dimension>/entry-rules n’existe plus, et son erreur NO_ENTRY_RULES avec elle. Une route unique retourne les six dimensions et leurs voies, desservies ou non ; il n’y a donc plus rien à ne pas trouver.
➡️ HTTP 200 Ok
[
{
"dimension": "SALARIA"::string(SALARIA | BOUCANIA | HYLEE | NIMBE | NOCTAMBULIE | TESSELLE),
"lanes": [
{
"lane": "PORTAL"::string(PORTAL | CURRENT | CONVOY),
"status": "SERVED"::string(SERVED | CLOSED),
"entryQuota": null || 4::int,
"crossingFee": null || 500.00::float,
"waitingTravellers": 3::int,
"departureThreshold": null || 5::int
}, ...
]
}, ...
]
⚠️ lanes contient toujours les trois voies, pour les six dimensions, même celles qui n’ont jamais rien déposé pour cette voie.
⚠️ Tout ce que cette route retourne décrit l’état au sortir de la dernière audience, et rien d’autre. Un dépôt de règles d’entrée reçu depuis n’a pas encore été exécuté : il attend l’ouverture de la prochaine audience et ne paraît pas ici. Avant la toute première audience, les six dimensions ont leurs trois voies closes.
lane: la voie décrite. Les trois sont toujours présentes, dans l’ordre que vous voudrez.status:SERVEDsi le dernier dépôt exécuté mentionne cette voie,CLOSEDsinon.entryQuota: le quota de ce dépôt,nullsur une voie close. En voyageurs pour le portail et le convoi, en kilogrammes pour le courant.crossingFee: le tarif de ce dépôt,nullsur une voie close.waitingTravellers: les dossiers encore en attente de cette voie, qu’ils aient été examinés et passés, ou que leur voie ne se soit jamais ouverte. Se compte en voyageurs, y compris au courant.departureThreshold: le nombre d’embarqués qu’il faut au convoi pour qu’il se mette en marche, soit la moitié de son quota arrondie à l’entier supérieur. Il vautnullsur le portail, sur le courant, et sur un convoi de voie close. Lu à côté dewaitingTravellers, c’est le chiffre qui dit à un Menhir s’il doit espérer.
Ce qu’une audience a consommé et perdu ne se lit pas ici, mais dans GET /hearings/last. Les deux routes ne se distinguent pas par l’instant qu’elles décrivent, qui est le même, mais par ce qu’elles énumèrent : ici les dix-huit couples dimension–voie, quoi qu’il leur soit arrivé ; là-bas les seuls passages qui se sont ouverts.
⚠️ Une voie close et une voie au quota nul se distinguent par status, jamais par entryQuota. SERVED avec un quota de 0 rouvrira, CLOSED n’attend rien (voir critère 9). Une voie close peut très bien avoir des candidats en attente, et ce sont eux qui n’iront jamais nulle part (voir l’exemple 4).
✅ Consulter la dernière audience
GET /hearings/last — crossings se décline maintenant par couple dimension–voie, et le tarif y figure avec son unité.
⚠️ feePerTraveller est renommé feePerUnit, et il gagne un feeUnit qui dit de quelle unité il s’agit. Ce n’est pas un changement cosmétique : en CONSUL, le tarif ne pouvait se diviser que par des voyageurs, et le nom du champ pouvait le dire. Ici, il se divise par des voyageurs ou par des kilogrammes selon la voie, et aucun nom fixe ne peut plus le dire.
{
...
"crossings": [
{
"dimension": "HYLEE"::string(SALARIA | BOUCANIA | HYLEE | NIMBE | NOCTAMBULIE | TESSELLE),
"lane": "CURRENT"::string(PORTAL | CURRENT | CONVOY),
"entryQuota": 200::int,
"quotaUsed": 180::int,
"quotaLost": 20::int,
"boardedTravellers": ["EX-11", "EX-08"]::string[],
"crossingFee": 1000.00::float,
"feeUnit": "PER_KG"::string(PER_TRAVELLER | PER_KG),
"feePerUnit": 5.56::float,
"collected": 1000.80::float
}, ...
],
"totalCollected": 1000.80::float
}
Les champs se lisent en deux familles, et le suffixe dit laquelle :
entryQuota,quotaUsed,quotaLostparlent du quota, donc dans l’unité de la voie : en voyageurs au portail et au convoi, en kilogrammes au courant.quotaUsed + quotaLost = entryQuota, toujours.boardedTravellers, commewaitingTravellersdansGET /dimensions, compte des voyageurs, quelle que soit la voie.
Au courant d’Hylée, quotaUsed vaut donc 180 pendant que boardedTravellers en contient 2. Deux nombres dans le même objet, deux unités.
feePerUnit et collected sont null quand personne n’a embarqué. totalCollected est la somme des collected, et elle ne vaut presque jamais la somme des crossingFee : voir l’exemple 1.
✅ Consulter un dossier
GET /files/<existenceNumber::string>/<visit::int> et GET /files/<existenceNumber::string>/current — le dossier gagne l’espèce et la voie qui en découle.
{
...
"species": "MENHIR"::string(QUIDAM | PYROPHORE | PLANTAGENET | MERFOLK | MENHIR),
"lane": "CONVOY"::string(PORTAL | CURRENT | CONVOY),
...
}
L’espèce vient du fait d’admission. La voie n’y est pas : c’est moi qui la déduis, et c’est pour qu’on puisse vérifier cette déduction dossier par dossier que je l’affiche à côté (voir critère 1).
⚠️ Une venue close garde l’espèce et la voie qu’elle avait à sa clôture, comme tout le reste de son contenu.
💡 Exemple 1 — le courant saute un voyageur, et facture au kilo
Le courant vers Hylée s’ouvre avec un quota d’entrée de 200 kg et un tarif de traversée de 1000,00 pièces. Trois candidats, par ancienneté :
| Ordre | Voyageur | Masse | Résultat |
|---|---|---|---|
| 1 | Ondin, 120 kg | 120 | embarque — reste 80 kg |
| 2 | Plantagenêt, 90 kg | 90 | passé — 90 > 80 |
| 3 | Ondin, 60 kg | 60 | embarque — reste 20 kg |
Le Plantagenêt de 90 kg attend l’audience suivante, alors qu’un voyageur plus récent que lui est parti. C’est la règle : le courant prend ce qui rentre.
Les droits se calculent ensuite sur la masse embarquée, pas sur le quota et pas sur les candidats :
| Étape | Calcul | Résultat |
|---|---|---|
| masse embarquée | 120 + 60 | 180 kg |
| prix au kilogramme | 1000,00 ÷ 180 = 5,5555… | 5,56 |
| l’Ondin de 120 kg | 5,56 × 120 | 667,20 |
| l’Ondin de 60 kg | 5,56 × 60 | 333,60 |
| perçu | 1000,80 |
Trois pièges dans le même calcul. Diviser par 200 kg au lieu de 180 fait payer le quota perdu. Diviser par 270 kg fait payer le Plantagenêt, qui n’est allé nulle part. Et diviser par 2 voyageurs donne 500,00 chacun, ce qui est la réponse du portail, pas celle du courant.
Les 0,80 pièces de trop sont le même accident qu’à CONSUL : l’arrondi monte, et il monte 180 fois.
💡 Exemple 2 — le convoi qui ne part pas
Le convoi vers Tesselle a un quota d’entrée de 10 voyageurs ; il lui en faut donc au moins 5 pour se mettre en marche.
Trois Menhirs attendent. Le convoi ne part pas. Aucun des trois n’embarque, et tous trois se présenteront à l’audience suivante avec la même ancienneté qu’avant.
À l’audience suivante, deux nouveaux Menhirs se présentent. Ils sont cinq : le convoi part, et les cinq embarquent, y compris les deux nouveaux, puisque le quota le permet.
💡 Exemple 3 — la même voie, deux dimensions, deux quotas
Une seule audience. Salaria et Tesselle desservent toutes deux le portail et le convoi.
| Dimension | Voie | Quota d’entrée | Tarif | Candidats | Issue |
|---|---|---|---|---|---|
| Salaria | portail | 4 | 500,00 | 1 Quidam | embarque ; 3 entrées perdues |
| Salaria | convoi | 6 | 1200,00 | 4 Menhirs | 4 ≥ 3, le convoi part ; 2 entrées perdues |
| Tesselle | portail | 0 | 500,00 | 2 Pyrophores | refusés cette audience-ci |
| Tesselle | convoi | 10 | 1800,00 | 2 Menhirs | 2 < 5, le convoi ne part pas |
Quatre quotas, quatre comptes séparés. Les trois entrées de portail que Salaria n’a pas consommées ne servent pas aux deux Pyrophores de Tesselle, bien qu’il s’agisse de la même voie. Les deux entrées de convoi restées libres chez Salaria ne servent pas non plus aux deux Menhirs de Tesselle, qui repartiront attendre avec leur ancienneté intacte.
Deux convois ont pourtant été formés le même soir, un par dimension : c’est permis, le plafond se compte par dimension. Ce qui ne serait pas permis, c’est un second convoi vers Salaria pour ramasser d’éventuels retardataires.
Le tarif de traversée suit le même découpage, et il n’est plus le même d’une voie à l’autre. L’unique Quidam du portail de Salaria paie 500,00 à lui seul, pendant que les quatre Menhirs du convoi de Salaria se partagent 1200,00 et paient 300,00 chacun. Deux voies, deux tarifs, deux partages, aucune communication : le Quidam ne bénéficie pas du monde qu’il y a dans le convoi.
Un tarif déclaré n’est pas un tarif perçu (voir critère 8C).
💡 Exemple 4 — une voie close est close pour de bon
Les règles d’entrée déposées par Nimbe portent un portail et un courant, mais aucun convoi.
Un Menhir de Nimbe attend au guichet. Il attendra toujours : sa voie est close, et aucune audience ne la rouvrira. Le portail de Nimbe peut se refermer vide chaque semaine, ça ne changera rien.
Il faudrait que Nimbe dépose de nouvelles règles d’entrée mentionnant le convoi. Nimbe ne le fera pas, et je ne peux pas le lui demander.