# Rang d'apparition — schéma 70

Un numéro d'ordre, unique dans sa collection, qui dit à quel moment du jeu une
fiche se rencontre. Il sert à ranger les données, pas à décider quoi que ce soit
en jeu : rien ne le lit encore côté runtime.

Douze collections le portent — celles que le joueur rencontre dans un ordre :
`enemies`, `recipes`, `ingredients`, `restaurant_elements`, `customer_profiles`,
`weapons`, `equipment`, `upgrade_nodes`, `biomes`, `dimensions`, `rooms`,
`story_scenes`. Un pattern d'attaque n'apparaît pas : il s'exécute, et n'a donc
pas de rang. La liste est écrite une fois de chaque côté : `RANKED_COLLECTIONS`
dans `config.php` et dans `assets/app.js`, `_apply_appearance_ranks()` dans
`data_catalog.gd`.

## Il se déplace, il ne se saisit pas

Un rang tapé à la main finit toujours par en doubler un autre. Le champ s'affiche
sous l'identifiant, non modifiable, avec deux boutons et une liste. Ce qu'une
fiche bouscule glisse d'un cran pour combler le vide qu'elle laisse : du rang 10
au rang 5, l'ancien 5 passe en 6, l'ancien 6 en 7, et le 9 prend le 10. Un pas de
±1 n'est que le cas où le décalage ne touche qu'une seule voisine.

Une fiche neuve, clonée, ou écrite avant ce champ n'a pas de rang : elle le reçoit
à la fin la première fois que son onglet s'affiche. On ne devine pas une place que
l'auteur n'a pas encore donnée.

## La publication garde la numérotation dense

`apply_appearance_ranks()` lit le rang **dans la source**, pas dans la sortie des
normaliseurs : ceux-ci bâtissent des tableaux explicites et ne recopient pas ce
champ. Le relire sur leur sortie rendait toujours zéro, et l'ordre choisi par
l'auteur était silencieusement remplacé par l'ordre du fichier.

La sortie est toujours une permutation dense de 1 à N. Un trou laissé par une
suppression, un doublon, ou une fiche sans rang se referment là ; l'ordre voulu
par l'auteur est conservé. Le jeu peut donc recopier le rang sans s'en méfier —
`_rank_collection()` ne renumérote lui-même que si ce qu'il lit n'est pas une
permutation, ce qui n'arrive qu'avec une donnée écrite à la main.

## Les listes

Chaque onglet rangé propose « Rang d'apparition » dans son sélecteur de tri, en
tête des tris qui lui sont propres. Le tri par défaut reste le nom.

Contrôles : `appearance_rank_test.js`, `appearance_rank_validation_test.php`,
puis la batterie de `CLAUDE.md`. Migration idempotente :
`tools/game-data-manager/migrate_schema_70.php`.
