VN Von Neumann Game

Journal des changements

Changelog

Toutes les modifications notables de Von Neumann Game seront documentées ici, avec une attention particulière aux changements qui peuvent impacter les frontends et les intégrations API.

2026-08-31

Changed

  • Contrôle Others « défense étoile — attente » : les sentinelles réagissent désormais aux activités des Mannys, missiles de sondes, objets éjectés ou récupérés, trajectoires d'astéroïdes motorisés et marqueurs de navigation. Elles appliquent l'ordre de priorité missile/laser demandé, poursuivent le laser dix minutes avant repli et conservent sur place les éclaireurs engagés contre une Manny éjectée ou un astéroïde motorisé.
  • API v129 / scans Others : les observations de flotte utilisent désormais la route dédiée GET /api/others/sector?shipId=…&x=…&y=…&z=…. GET /api/sector redevient exclusivement un scan de sondes et refuse shipId. La précision du nouveau point d’API conserve les règles de distance, de temps de résidence et d’historique privé de la flotte ; les sondes et vaisseaux détectés, accompagnés de leur statut courant, ne sont exposés que lorsqu’un vaisseau actif de cette flotte est physiquement présent dans le secteur interrogé.

2026-08-30

Changed

  • Combat Others : lorsqu’une Manny distante est verrouillée par un laser, sa sonde propriétaire reçoit désormais une alerte critique si les deux secteurs communiquent par le même réseau SCUT. L’alerte nomme la Manny, indique son secteur relatif et rappelle sa destruction après dix minutes si le laser ne cesse pas.
  • Documentation OpenAPI : ajout de la route sonde GET /api/probe/{probeId}/sector/autonomous-units dans la catégorie sectors, avec son contrat de pagination et la représentation minimale des Mannys et auxiliaires Others détectés localement.
  • Contrôle Others : ajout de scripts/others_control/defense_etoile_attente.py, qui maintient jusqu'à douze sentinelles autour d'un vaisseau mère, évite les destinations déjà occupées ou réservées par un mouvement, rappelle progressivement les vaisseaux hors formation et exclut seulement les trous noirs confirmés par un scan détaillé. Sa boucle se cale sur les échéances de mouvement et conserve un contrôle de veille plafonné à cinq minutes.
  • Outils Others : create-others-fleet.php et create-others-standard-ship.php remplissent désormais le réservoir de deutérium du vaisseau créé à sa capacité maximale. Les créations issues du gameplay restent inchangées.
  • Outils Others : ajout de scripts/delete_others_fleet.php, qui supprime transactionnellement une flotte désignée par son vaisseau mère, ses vaisseaux, auxiliaires, actions, inventaires, missiles lancés et événements scheduler associés. Les missiles adverses visant la flotte et l'audit opérateur sont conservés.

2026-08-29

Changed

  • API v128 / cartographie Others : chaque flotte historise ses secteurs visités dans la table relationnelle dédiée others_visited_sectors, sans alimenter les statistiques des sondes. GET /api/others/fleets/{fleetId}/visited-sectors expose cet historique paginé dans le référentiel relatif au home du propriétaire, et les scans BOB via GET /api/sector?shipId=… retrouvent immédiatement le niveau de détail précis d'un secteur déjà visité par cette flotte seulement. Migration obligatoire avant redémarrage : exécuter php scripts/one-shot-scripts/migrate-others-visited-sectors.php --database-config=….
  • API v127 / mouvements Others : les représentations de vaisseaux détenus exposent désormais movement, avec la phase active, la destination relative au home du propriétaire et arrivalAt. Les scans de sondes et les scans génériques ne reçoivent pour leur part que le vecteur directionnel normalisé d'un mouvement détecté, sans destination, distance ni échéance.
  • API v126 / navigation Others : les coordonnées des vaisseaux sont désormais exposées relativement au secteur home de leur propriétaire, commun à toute la flotte et présenté comme (0, 0, 0). Les auxiliaires séparés de leur porteur exposent leur secteur dans ce même référentiel ; les auxiliaires embarqués ou présents avec leur porteur ne le dupliquent pas.
  • Rupture de contrat Others : le champ target de POST /api/others/ships/{shipId}/move et POST /api/others/fleets/{fleetId}/move désigne désormais la destination relativement au home du propriétaire. Il ne représente plus un déplacement depuis la position courante du vaisseau ou de la mère.

2026-08-28

Changed

  • API v125 / lancement de missiles par les Mannys : ajout de POST /api/probe/{probeId}/mannies/{mannyId}/ignite_missile, sans Idempotency-Key. Son payload exige targetId et accepte un missileItemId facultatif ; en son absence, le premier missile disponible de l’inventaire est choisi. La Manny reste occupée une minute avant le lancement. POST /api/probe/{probeId}/missiles est désormais déprécié au profit de cette route.
  • API v124 / impacts d’astéroïdes motorisés : la sonde lanceuse reçoit désormais une alerte persistante récapitulant le résultat uniquement si elle est encore physiquement présente dans le secteur à la résolution. Une sonde ou un vaisseau Others victime reçoit sa propre alerte critique de dégâts, avec le pourcentage d’intégrité perdue lorsque la cible survit. Les effets sur les étoiles, planètes et astéroïdes sont récapitulés au seul lanceur.
  • Migration obligatoire avant redémarrage : scheduler arrêté, exécuter php scripts/one-shot-scripts/migrate-asteroid-impact-alerts.php --database-config=… afin d’ajouter la référence canonique de la sonde lanceuse aux trajectoires. Les trajectoires historiques conservent explicitement un lanceur inconnu et ne peuvent donc produire que l’éventuelle alerte de victime.

2026-08-27

Changed

  • API v123 / attente de stockage Manny : l’entrée en waiting_for_space expose désormais task.waitingForSpaceSince. Après sept jours continus sans capacité suffisante, la Manny abandonne automatiquement sa cargaison et retente son amarrage ; si son propre emplacement de 0,05 ECE reste indisponible, elle est détachée de sa sonde et devient un objet de secteur abandoned récupérable.
  • Migration obligatoire avant redémarrage : scheduler arrêté, exécuter php scripts/one-shot-scripts/migrate-manny-waiting-for-space-timeouts.php --database-config=…. Comme l’ancien modèle ne conservait pas la date exacte d’entrée en attente, la migration initialise explicitement le délai des tâches existantes à son heure d’exécution.
  • Mouvements sécurisés SCUT : lorsqu’un trajet relie deux secteurs possédant chacun un relais actif avec balise de transit dans le même réseau, la perte totale d’intégrité à l’arrivée est désormais plafonnée à 9 points de pourcentage, en complément de la protection existante contre la destruction à haute vélocité.
  • Minage Manny : la récupération d’un container détaché rappelle désormais toutes les Mannys qui le minent, même si elles appartiennent à une autre sonde. Le déclenchement d’un astéroïde motorisé rappelle de la même manière les Mannys qui minent vers l’un de ses containers attachés, avec la raison target_container_departed_with_asteroid. La recherche s’appuie sur la projection SQL indexée manny_tasks.target_container_id et ne parcourt pas les événements du scheduler.
  • Migration obligatoire avant redémarrage : exécuter php scripts/one-shot-scripts/migrate-manny-target-container-index.php --database-config=… afin de reconstruire la projection des containers cibles et de créer son index. Le script administratif recall-failed-container-miners.php permet en outre de rappeler explicitement, par joueur, les anciennes Mannys restées bloquées après la disparition de leur container cible.
  • API v122 / détection des missiles : les scans courants de GET /api/probe/sector et GET /api/probe/{probeId}/sector exposent désormais chaque missile en vol depuis l’état canonique indexé de others_projectiles, sans parcourir les événements du scheduler. Le champ targetsCurrentProbe indique si la sonde observatrice est la cible déclarée. /sensors affiche alors une alerte rouge vivante avec le compte à rebours d’impact ; les autres missiles restent visibles dans la liste des objets sans déclencher ce panneau.
  • Interface : la checklist « Préparation » de /movement indique désormais si l’intégrité minimale de 10 % est atteinte et bloque localement l’ordre de mouvement dans le cas contraire, en complément de la validation autoritaire de l’API.
  • API v121 / intégrité des sondes : une sonde dont l’intégrité est strictement inférieure à 10 % ne peut plus préparer un déplacement (probe_integrity_too_low). Les dégâts sont plafonnés à l’intégrité restante et tout passage à 0 % place immédiatement la sonde au statut dead.
  • API v120 / résolution des missiles : à l’impact, le lanceur reçoit le résultat seulement s’il est encore physiquement présent dans le secteur et la victime reçoit sa propre alerte de dégâts. Pour une sonde ou un vaisseau Others survivant, les dégâts sont exprimés en pourcentage de son intégrité maximale. Les vaisseaux disposent désormais d’alertes persistantes via GET /api/others/alerts et peuvent les acquitter via PATCH /api/others/alerts/{alertId}.
  • Migration obligatoire avant redémarrage : exécuter php scripts/one-shot-scripts/migrate-others-alerts.php --database-config=… afin de créer le stockage canonique des alertes Others.
  • API v119 / alertes missiles : l’alerte de lancement indique désormais le type et l’identifiant public de la cible supposée (ainsi que son nom pour une sonde ou une Manny). Une sonde directement ciblée reçoit la phase canonique weapon_targeted, affichée par la WebUI sous forme d’alerte critique rouge clignotante ; les autres observateurs du secteur conservent l’alerte verte weapon.
  • Interface : le groupe « Secteur » de /mannies permet désormais de préparer le lancement d’un missile depuis la sonde courante, avec sélection du missile en soute et d’une cible locale détectée. La tâche de préparation d’une minute dispose aussi de son propre état d’avancement dans la carte de la Manny.
  • Documentation OpenAPI : chaque opération possède désormais une catégorie fonctionnelle explicite, sans reliquat dans le groupe implicite default. Les 17 catégories sont déclarées dans leur ordre d’affichage Swagger, de system à default probe. Cette dernière explique l’équivalence avec les routes explicites portant un probeId, utilise automatiquement la sonde par défaut du joueur et reste volontairement isolée des catégories fonctionnelles. Les opérations canoniques transversales apparaissent aussi sous leurs catégories secondaires pertinentes : actions Manny sur les secteurs, inventaires, sondes, missiles, améliorations, SCUT et astéroïdes motorisés, avertissements sous movement, et partage de plans sous scut. Les opérations taguées sont définies directement, sans $ref d’opération susceptible de faire disparaître un endpoint lors de l’ouverture d’un accordéon Swagger. Les catégories Swagger sont repliées par défaut.
  • API v118 / Others : ajout de la branche opérateur protégée par can_control_others, de l’idempotence globale au compte et de l’audit des commandes. Les flottes, vaisseaux, auxiliaires, actions, inventaires, transferts, déplacements, moissons, fabrications, lasers et missiles disposent d’identifiants opaques et n’exposent jamais de coordonnées absolues. Son contrat autonome est séparé dans docs/openapi-others.yaml et dispose de son interface Swagger sur /api-docs-others ; l’API principale reste documentée sur /api-docs.
  • Gameplay Others : ajout des quatorze lots du modèle de faction, dans leur ordre de dépendance : persistance et scripts administratifs, scans BOB et unités autonomes, déplacements individuels/de flotte avec annulation, stocks planétaires canoniques, logistique, tâches auxiliaires et structures dormantes, moisson en essaim, ateliers, visibilité et alertes, laser, missiles partagés avec les sondes, dégâts et dissolution de flotte.
  • Missiles : la recette Manny missile consomme un battery_pack, deux micro_conductor, 0,20 ECE de métaux et 0,10 ECE de composés carbonés en une heure pour une sortie de 0,05 ECE. Le lancement depuis une sonde réserve une Manny pendant une minute ; le lancement Others est planifié à échéance immédiate. Dans les deux cas, seuls les passages du scheduler créent puis résolvent le projectile.
  • Secteurs : chaque planète possède désormais des resourceAmounts déterministes et le marqueur strict harvestedByOthers. Les API de scan n’en dérivent que des proportions par tranches de dix points. Les auxiliaires Others perdus ou détruits deviennent des structures persistantes inspectables et minables par les Mannys.
  • Combat : les astéroïdes motorisés acceptent les vaisseaux mère et standards Others physiquement présents comme cibles. Un impact relativiste détruit le vaisseau ; la destruction du vaisseau mère dissout exclusivement sa flotte, retire ses standards et laisse les projectiles déjà lancés achever leur cycle autonome.
  • Migration obligatoire avant redémarrage : exécuter migrate-others-schema.php, migrate-others-integrity.php, migrate-others-combat-schema.php puis add-planet-resource-amounts.php avec le bon --database-config. Les scripts refusent d’inventer un propriétaire ou de convertir implicitement des projectiles historiques.
  • API v117 / scheduler : les lectures et commandes Manny ne finalisent plus opportunément les tâches échues. Seul le worker scheduler applique désormais les transitions temporelles de toutes les familles de tâches ; les GET exposent le dernier état persisté et conservent leur délai de polling pour laisser le worker se stabiliser.
  • Stockage : le container cœur et l’affectation initiale des Mannys sont créés avec la sonde (inscription, réinstanciation, assemblage et outils de création), au lieu d’être initialisés paresseusement par un GET. Les accès ordinaires valident désormais le stockage sans l’écrire ; avant redémarrage sur une base contenant des sondes non initialisées ou incohérentes, exécuter explicitement php scripts/one-shot-scripts/repair-storage-containers.php --database-config=var/database-prod.json.

2026-08-21

Changed

  • Gameplay : l’encombrement d’un deuterium_engine passe de 0,06 à 0,05 ECE. Un moteur à la dérive tient désormais dans la capacité d’emport d’une Manny et redevient donc récupérable avec l’action salvage.
  • Stockage : les ressources en métaux, glace et composés carbonés n’ont plus de totaux dupliqués dans neumann_probes ; les lignes des containers sont désormais l’unique source de vérité. Pour déployer sur une base existante : arrêter l’application et le scheduler, déployer ce code, vérifier avec php scripts/one-shot-scripts/remove-legacy-probe-resource-stocks.php --dry-run --database-config=var/database-prod.json, relancer sans --dry-run, puis seulement redémarrer les services.
  • Maintenance : ajout de scripts/audit-deprecated-endpoints.py, sans dépendance externe, pour extraire les opérations deprecated: true d’OpenAPI et compter leurs usages dans les journaux d’accès Nginx courants ou compressés, sans afficher les adresses IP.
  • API v116 : suppression de l’ancien alias POST /api/probe/mannies/{mannyId}/inspect-asteroid et de sa variante ciblant explicitement une sonde ; utiliser inspect-sector-object. L’audit des 9 817 900 lignes de journaux Nginx disponibles n’a relevé aucun appel à cet alias.
  • Ressources : suppression de toute compatibilité d’exécution avec l’ancien type other dans les compositions, astéroïdes, Mannys de secteur et tâches minières. scripts/one-shot-scripts/cleanup-legacy-resources.php, désormais fonctionnel et testé, réalise explicitement l’audit/migration de SQL, des payloads de tâches et événements, des règles de stockage et des fichiers de secteurs avant déploiement ; SchemaInitializer ne convertit plus silencieusement cargo_other.
  • Secteurs : SectorFileRepository refuse désormais explicitement les anciennes collections JSON de containers détachés et les objets detached_container, au lieu de les ignorer à chaque lecture. Le nouveau script idempotent scripts/one-shot-scripts/cleanup-legacy-detached-container-json.php retire uniquement ces références des fichiers, sans accès ni écriture SQL ; le filtrage lors des sauvegardes reste en place pour les containers agrégés depuis la base.
  • Base de données : SchemaInitializer est recompilé en schéma canonique actuel et ne contient plus l’historique des détections, ALTER TABLE et backfills déjà déployés. Les index jusque-là ajoutés uniquement par ces rattrapages font désormais partie du socle. Les futures évolutions structurelles continueront de passer par l’initializer ; les scripts one-shot sont réservés aux données et aux JSON de secteurs.
  • Interface : la page des Mannys ne remplace plus silencieusement un échec de /api/crafting-recipes par une recette de marque-page codée en dur. Les formulaires de fabrication indiquent désormais que les recettes sont indisponibles, restent désactivés et proposent de recharger explicitement le catalogue.
  • Interface : suppression de l’ancienne vue de discussion du forum, cachée au chargement depuis le passage aux fils intégrés dans les catégories, ainsi que de ses écouteurs JavaScript et styles résiduels.
  • Statistiques : suppression de l’ancien alias topVisitedProbes du JSON généré et du fallback WebUI associé ; le podium des explorateurs utilise exclusivement topVisitedPlayers.

2026-08-20

Fixed

  • API : l’inspection d’un grand réseau SCUT ne charge plus en mémoire les couvertures détaillées du réseau et de chacun de ses relais. Le nombre de secteurs et les sondes couvertes sont désormais résolus directement en SQL, évitant les erreurs 500 par dépassement de la limite mémoire PHP-FPM.

2026-08-19

Changed

  • Outils : scripts/add-dormant-construct.php accepte désormais --type=<type> pour forcer le scénario d’une nouvelle structure et --list-types pour afficher les quatre types disponibles ; les astéroïdes à ancrage distribué et anatiformes reçoivent aussi leur intitulé spécialisé.
  • API v115 : un nouveau dormant construct « Anatiform asteroid » permet à une Manny de récupérer le blueprint « Anatiform Asteroid Sculpting » ; son rapport illustré utilise https://neumann-probe.net/images/duck-asteroid.png. Le nouveau POST /api/probe/{probeId}/mannies/{mannyId}/sculpt-duck-asteroid, réservé aux joueurs qui possèdent ce blueprint, sculpte en deux jours un astéroïde local. Une annulation avant l’échéance ne modifie pas l’astéroïde.
  • API v115 : les astéroïdes ainsi sculptés exposent le champ optionnel distinctiveFeature: "Sculpted in the shape of a duck" dans leurs représentations publiques. Ils conservent toutes les propriétés et actions des astéroïdes ordinaires, notamment le minage et la motorisation.
  • Interface : dans le groupe « Secteur » de /mannies, le formulaire de sculpture n’apparaît qu’avec le blueprint correspondant. Les scans courant et précis de /sensors les identifient comme des « Astéroïdes en forme de canard ».
  • API v114 : chaque alerte retournée par GET /api/probe/alerts et ses variantes ciblant une sonde expose désormais illustrationImageUrl, URL HTTP(S) absolue nullable. Avant de redémarrer l’application sur une base existante, exécuter puis rejouer php scripts/one-shot-scripts/migrate-alert-illustration-images.php --database-config=config/database.json ; le second passage doit annoncer column_added=no.
  • Interface : /alerts affiche l’éventuelle illustration sous le texte de l’alerte, sur toute la largeur intérieure de la carte, en conservant son ratio d’origine.
  • Interface : la page /scut permet désormais de choisir un blueprint connu et une sonde appartenant à un autre joueur dans le réseau sélectionné, puis de partager ce blueprint. Les sondes du joueur émetteur sont exclues des destinataires et l’interface confirme aussi les partages idempotents.
  • API v113 : ajout de POST /api/probe/{probeId}/probe-improvement-blueprints/{improvementId}/share. Le joueur authentifié peut copier un blueprint connu vers le propriétaire d’une autre sonde uniquement lorsque les deux sondes sont couvertes par un même réseau SCUT actif ; la simple présence dans un même secteur ne suffit pas. L’opération est idempotente et crée sur la sonde destinataire une alerte persistante blueprint_shared, dédupliquée lors des rejeux.
  • API v112 : ajout de DELETE /api/probe/alerts/{alertId} et DELETE /api/probe/damage-warnings/{damageWarningId}, ainsi que de leurs variantes ciblant explicitement une sonde. Une suppression n’est autorisée que pour une alerte appartenant à la sonde sélectionnée du joueur authentifié ; toute autre ressource répond 404.
  • Interface : les alertes persistantes de /alerts disposent désormais d’une icône de suppression ; les avertissements de dégâts utilisent leur endpoint dédié.
  • Documentation API : Swagger propose désormais un sélecteur d’exemple « System impact / Sector transfer » pour préremplir la commande de lancement d’un astéroïde motorisé, expose explicitement les deux valeurs autorisées de mode et détaille la probabilité décroissante de capture après la traversée de secteurs vides.
  • API v111 : ajout des trajectoires persistantes d’astéroïdes motorisés. POST /api/probe/{probeId}/asteroids/{asteroidId}/trajectories lance soit un impact local relativiste, soit un transfert vers un voisin FCC, et GET /api/probe/{probeId}/asteroid-trajectories/{trajectoryId} expose uniquement la télémétrie détectable dans le secteur courant, sans coordonnée absolue. Les phases sont exécutées et rejouées de façon idempotente par le scheduler.
  • API v111 : l’alerte d’allumage d’une trajectoire system_impact indique désormais l’identifiant opaque de la cible et son type (probe, asteroid, planet ou star).
  • API v111 : les astéroïdes motorisés ont désormais un réservoir binaire explicite (motorFuelStatus: full|empty). La motorisation consomme aussi deux plaques d’acier et 0,2 point de deutérium, attribue un nouvel identifiant opaque, et POST /api/probe/{probeId}/mannies/{mannyId}/refuel-motorized-asteroid permet à une Manny de refaire le plein avant son retour automatique.
  • Moteur : les impacts gèrent étoiles, planètes, astéroïdes et sondes avec énergie relativiste, dégâts ou fragmentation déterministes, tandis que les transferts traversent un secteur par 24 heures, tentent une capture pondérée, conservent containers et signets, et disparaissent après une capture par trou noir.
  • Migration obligatoire : ajout de scripts/one-shot-scripts/migrate-asteroid-trajectories.php. Worker arrêté, ce script convertit les anciens astéroïdes motorisés au format strict avec réservoir plein et installe la table SQL des trajectoires ; aucun fallback de lecture de l’ancien format n’est conservé.
  • Interface : /mannies propose le ravitaillement et le lancement des astéroïdes motorisés, affiche les prérequis complets et les estimations de durée.
  • Interface : l’aide du formulaire « Lancer un astéroïde motorisé » s’adapte désormais au mode choisi et explique séparément l’impact dans le système ou le transfert intersectoriel avec sa probabilité décroissante de capture.
  • Interface : /sensors met désormais en exergue tout astéroïde motorisé en mouvement détecté par le scan du secteur courant, avec le mode et la phase de trajectoire, la cible, la vitesse ou la progression, ainsi qu’un compte à rebours local jusqu’à l’impact ou au prochain franchissement de secteur.
  • Correction WebUI : depuis la route canonique /mannies, les actions de motorisation, de ravitaillement et de lancement ciblent désormais explicitement la sonde courante ; elles ne construisent plus une ancienne URL générique qui répondait Endpoint not found.
  • Correction WebUI : le prérequis de motorisation mentionne et vérifie désormais l’intégralité du coût — un moteur au deutérium, quatre barres d’acier, deux plaques d’acier et 0,2 point de deutérium.
  • API v110 : les scans détaillés de GET /api/probe/sector, GET /api/probe/{probeId}/sector et GET /api/sector exposent désormais motorized sur les astéroïdes présents dans les listes générales bookmarkTargets, en plus de minableTargets. Ce champ reste absent des autres types d’objets.
  • Interface : le détail des corps d’un système dans le scan Sensors affiche désormais « Propulsion : Installée » pour les astéroïdes motorisés.
  • Interface : les champs de saisie Swagger de /api-docs utilisent désormais un texte sombre sur fond blanc, sans hériter de la couleur claire des formulaires généraux de la WebUI.
  • API v109 : GET /api/probe/probe-improvements-available et sa variante ciblant une sonde exposent désormais installableOnProbe pour chaque blueprint. La valeur est false pour distributed_thrust_anchoring, dont l’installation cible les astéroïdes, et true pour les améliorations de sonde.
  • Interface : le formulaire d’amélioration de sonde filtre les blueprints selon installableOnProbe; distributed_thrust_anchoring reste disponible pour la motorisation des astéroïdes sans être proposé comme amélioration de sonde.
  • Maintenance : force-pending-scheduled-events-now.php avance aussi les échéances métier des tâches Manny et de tous les mouvements encore actifs. Il recrée l’événement terminal d’un mouvement dont les événements ont déjà été consommés, afin que le prochain passage du scheduler termine réellement le transit au lieu de laisser la sonde bloquée.
  • API v108 : ajout de POST /api/probe/{probeId}/mannies/{mannyId}/motorize-asteroid. Après déblocage du blueprint Distributed Thrust Anchoring, une Manny peut consommer un moteur au deutérium et quatre barres d’acier pour motoriser durablement un astéroïde du secteur, sans empêcher son minage, puis revient automatiquement vers la sonde. La WebUI /mannies affiche alors l’action « Installer une propulsion sur un astéroïde » dans le groupe Secteur.

2026-08-14

Fixed

  • API : les réponses Manny exposent de nouveau task.consumedItems pour les fabrications en cours, notamment dans la réponse de POST /api/probe/{probeId}/mannies/{mannyId}/craft.

2026-08-13

Changed

  • API v107 : ajout de POST /api/probe/{probeId}/storage-containers/{containerId}/crafting-reservations/reassign, qui réaffecte atomiquement les réservations de sortie des crafts actifs vers d’autres containers compatibles, ou répond 409 crafting_reservations_cannot_be_reassigned sans modification si la vidange complète est impossible.
  • Interface : les conflits de réservation rencontrés en détachant ou larguant un container depuis /mannies ou l’inventaire proposent désormais de réaffecter les réservations de fabrication, avec un message explicite si aucun autre container compatible n’a assez de place.
  • Interface : l’alerte de stockage fragile affiche désormais le seuil réel de rupture selon le modèle et les améliorations de la sonde (5/10 pour une sonde standard, 2/4 pour une tanker), au lieu d’annoncer systématiquement 5 containers supplémentaires.
  • API : les transferts de Manny, de deutérium et de containers entre sondes sont désormais refusés avec probe_already_moving si la sonde source ou cible est en mouvement, afin d’éviter qu’une arrivée dans un autre secteur fasse échouer le transfert et laisse la Manny ou le container hors de portée.
  • Interface : le refus probe_already_moving d’un transfert inter-sondes affiche désormais un message explicite et traduit, sans requête ni polling supplémentaire.

2026-08-07

Fixed

  • Moteur : l’inspection Manny d’un astéroïde découvre désormais tous les containers qui y sont cachés, au lieu de ne révéler que le premier.

2026-08-05

Fixed

  • Interface : le champ de quantité du transfert de deutérium dans /mannies n'est plus prérempli et peut rester vide pendant la saisie.
  • Interface : dans le détail d’une recette, un astérisque et une note signalent désormais les quantités disponibles déjà diminuées par la préparation d’ingrédients intermédiaires précédents.

2026-08-04

Fixed

  • Moteur : lorsqu'un container détaché ciblé par un minage Manny s'est rempli entre l'ordre et son échéance, la Manny dépose seulement la quantité encore admissible, laisse le reliquat dans l'astéroïde et termine son retour au lieu d'être différée indéfiniment par le scheduler.

Changed

  • API : les erreurs de POST /api/probe/{probeId}/mannies/tasks indiquent désormais le mannyId rejeté en plus de son taskIndex.
  • Maintenance : ajout de scripts/purge-scheduled-events.php pour supprimer quotidiennement, par lots, les événements terminés depuis plus de 30 jours sans toucher aux événements actifs.

2026-08-02

Fixed

  • Interface : le rafraîchissement périodique de /inventories ne replie plus le formulaire de déplacement ou de détachement d’un container pendant sa saisie.
  • API/WebUI : les détachements et largages de containers refusent désormais avec 409 storage_container_reserved tout container dont de l’espace est réservé pour le résultat d’un craft actif ; /mannies et l’inventaire affichent un message explicite.
  • Moteur : la finalisation d’un craft dont la réservation de stockage est devenue invalide termine désormais proprement la tâche Manny, libère la réservation et conserve invalid_cargo_reservation comme motif d’échec métier.
  • Correction du worker de planification : un renouvellement de lease effectué dans la même seconde n'est plus pris pour une perte de verrou MariaDB, les transitions de lease échouent désormais explicitement, et un script permet de récupérer les événements running pendant un arrêt contrôlé.

Changed

  • API : GET /api/probe/{probeId}/mannies et GET /api/probe/{probeId}/mannies/{mannyId} exposent désormais taskStartTime (ISO-8601, nullable) avec les détails des tâches Manny.
  • Performance/fiabilité : la sortie d'une fabrication Manny ou imprimante est désormais déposée directement dans le container réservé au lancement ; la réservation n'est libérée qu'après la création réussie, sans recalcul global de placement à l'échéance.
  • Performance : la finalisation d'un craft ne verrouille plus toute la sonde, seulement la ligne du Manny propriétaire de la réservation. Les crafts actifs antérieurs doivent être préparés, worker arrêté, avec scripts/migrate-active-crafts-to-output-reservations.php ; le scheduler ne contient aucun chemin de compatibilité implicite.
  • Performance : chaque placement d'objet ou de ressource calcule désormais une seule fois l'occupation globale et les transferts entrants réservés, puis réutilise cet instantané pour parcourir les containers candidats.
  • Fiabilité/performance : ensureProbeStorage() n'effectue plus de réparation opportuniste lors des lectures et placements. Une sonde neuve et vide reste initialisée normalement ; les containers manquants, inventaires orphelins et migrations de stocks passent désormais par l'opération explicite repairProbeStorage() du script de maintenance.
  • Fiabilité scheduler : les événements running portent désormais l'identifiant de leur worker et un bail renouvelable. Le worker récupère périodiquement les événements dont le bail a expiré, tandis que les transitions done, failed et pending vérifient encore la propriété du verrou.
  • Statistiques publiques : ajout d'un podium des joueurs selon la distance de leur sonde la plus éloignée par rapport à leur secteur de départ, sans exposer de coordonnées absolues.

2026-08-01

Changed

  • API v106 : le minage Manny ne crée plus d'étapes intermédiaires dans le scheduler. La durée complète (trajets compris) est calculée au lancement, puis l'extraction et le dépôt sont transactionnés à l'échéance finale, après vérification de la place disponible.
  • Migration : ajout de scripts/migrate-mining-to-terminal-events.php pour convertir, worker arrêté, les minages actifs vers leur unique événement terminal et restituer aux astéroïdes les cargaisons encore en vol.
  • Performance : démarrer une fabrication Manny ou imprimante ne rafraîchit plus toutes les tâches de la sonde ; chaque sortie réserve désormais durablement son volume et son container dès le début de la fabrication, puis le scheduler remplace cette réservation par l’objet produit.
  • API v105 : ajout de DELETE /api/probe/{probeId}/move pour annuler un déplacement encore en préparation, rembourser son deutérium réservé et neutraliser ses événements planifiés.
  • Interface : les pages /, /{probeId} et /movement proposent l’annulation d’un déplacement pendant sa préparation ; le bouton disparaît à l’échéance calculée localement sans polling supplémentaire.
  • API : GET /api/probe/{probeId}/messages (et sa variante sur la sonde par défaut) accepte désormais status=unread pour ne retourner que les messages non lus.
  • Interface : le polling léger du voyant de messagerie ne charge plus que les messages non lus ; la page /messaging conserve sa liste complète et sa pagination.
  • API : GET /api/probe/{probeId}/alerts (et sa variante sur la sonde par défaut) accepte désormais status=unread pour ne retourner que les alertes non lues.
  • Interface : le polling léger du voyant d’alertes ne charge plus que les alertes non lues ; la page /alerts conserve sa liste complète.

2026-07-31

Changed

  • Interface : /inventories permet désormais de jeter les balises de transit SCUT ; elles deviennent des objets dérivants récupérables dans le secteur comme les autres composants.
  • Interface : le sélecteur « Vue inventaire » de /inventories classe désormais les containers par nom, dans l’ordre alphabétique de la langue affichée.
  • Maintenance : les scripts d’assistance en deutérium ignorent désormais les astéroïdes épuisés par le minage, y compris leur reliquat d’arrondi de 0,0001 container, tout en continuant d’éviter les réserves encore exploitables.
  • Interface : /mannies détaille désormais les détachements de container destinés à une autre sonde en affichant le container et le nom de la sonde cible pendant la tâche.
  • Scheduler : le worker est désormais seul responsable des trajets, ticks d’extraction, retours et dépôts intermédiaires du minage Manny ; les appels API ne font plus avancer le monde par effet de lecture.
  • Migration : ajout de scripts/migrate-active-mining-to-scheduler-transitions.php pour réveiller une fois les minages déjà actifs lors du déploiement.
  • Interface : /mannies borne désormais son polling à une requête groupée toutes les 5 secondes et temporise les transitions scheduler échues, afin d’éviter une boucle rapide menant au statut HTTP 429 lorsque le worker tarde à persister une transition.

2026-07-30

Changed

  • Performance API : les inventaires inclus dans GET /api/probe, GET /api/probe/{probeId}, GET /api/probe/sector et GET /api/probe/{probeId}/sector utilisent désormais une projection Manny légère qui ne charge ni n’actualise les tâches et omet currentTask et taskProgressPercent.
  • API v104 : ajout de GET /api/probe/{probeId}/mannies/{mannyId} pour obtenir et actualiser l’état complet d’une seule Manny.
  • Interface : l’inventaire laisse demander l’éjection d’une Manny sans précharger son état de tâche ; l’endpoint d’éjection effectue la validation autoritative et signale notamment une Manny occupée.

2026-07-29

Changed

  • Déplacement : chaque voyage consomme désormais un coût fixe de 2 points de deutérium, configuré par movement.fuelCostPoints, et son départ est refusé si le stock ne couvre pas le trajet complet, décélération comprise.
  • Transfert de deutérium : les crédits vers la cible et les remboursements de surplus utilisent désormais des mises à jour SQL atomiques, afin qu’une livraison minière ou un autre transfert simultané ne puisse plus écraser une réservation déjà débitée.
  • Interface : lorsqu'un appel API reçoit une réponse 401, le client vérifie une seule fois la session via /api/me et recharge la page si elle a expiré afin de revenir à l'authentification, sans multiplier les contrôles lors des rafraîchissements simultanés.

2026-07-28

Changed

  • Performance : les inventaires inclus dans GET /api/probe, GET /api/probe/{probeId} et GET /api/probe/sector utilisent désormais le hint Manny borné à dix tâches échues, comme la liste des Mannies, au lieu de rafraîchir toutes les tâches actives.
  • Performance : les réponses API qui préparent les Mannies avant de construire l’inventaire réutilisent désormais cette préparation et n’exécutent plus deux fois ensureProbeStorage() dans la même requête.
  • Performance : la réparation automatique du stockage charge désormais les identifiants des conteneurs en une fois et vérifie en mémoire les items additional_container, supprimant une requête SQL par conteneur à chaque lecture d’inventaire.
  • Performance : les lectures de la liste des Mannies ne rafraîchissent opportunément que les dix tâches échues les plus anciennes par requête. Le worker scheduler reste responsable du traitement principal, tandis que les polls suivants absorbent progressivement un éventuel retard sans multiplier les verrous de sonde.
  • Interface : l’avertissement du forum présente désormais le canal communautaire et recommande le serveur Discord de Neumann Probe dans ses versions française et anglaise.
  • Maintenance : ajout d’un audit en lecture seule des conteneurs détachés stockés dans les JSON de secteurs, avec détection des doublons, collisions d’identifiants et snapshots incomplets.
  • Stockage : les conteneurs détachés drifting, hidden et dropped_on_planet sont désormais conservés dans des tables SQL normalisées plutôt que dans les JSON de secteurs. Ils persistent après la destruction de leur sonde d’origine. Le script scripts/migrate-detached-containers-to-database.php assure la bascule ponctuelle et renomme de façon déterministe les identifiants dupliqués.

2026-07-27

Fixed

  • Performance : les requêtes HTTP et le scheduler ouvrent désormais la base sans rejouer l’initialisation complète du schéma. Les migrations restent réservées aux appels explicites, et la migration MySQL des messages ne relance plus de ALTER TABLE lorsque les références de sondes sont déjà nullables.
  • Performance : l’affectation atomique d’un lot de tâches Manny rafraîchit désormais les tâches existantes une seule fois et réutilise le verrou de la sonde, au lieu de rescanner toutes les Mannies pour chaque ordre.

Changed

  • Interface : l’assemblage Manny permet de choisir le modèle generic ou deuterium_tanker, adapte la recette et sa description au choix, puis transmet le modèle à l’API. La fiche d’une sonde affiche désormais séparément son type et son modèle.
  • API v103 : ajout du modèle de sonde deuterium_tanker à l’assemblage Manny. Il possède une capacité de 400 points de deutérium (800 avec compression), consomme en plus 10 steel_plate, 2 linear_actuator et 1 integrated_circuit, et subit le risque de rupture de container dès le deuxième container additionnel (le quatrième avec les fixations renforcées). Le champ model des sondes vaut generic par défaut.
  • Statistiques publiques : le podium des activateurs SCUT regroupe désormais les relais par joueur, toutes ses sondes confondues.
  • Maintenance : ajout d’un worker scheduler permanent, conçu pour être supervisé par systemd, qui traite les événements à leur échéance avec une veille bornée à cinq secondes.

2026-07-26

Changed

  • API v102 : ajout de POST /api/probe/{probeId}/mannies/tasks pour attribuer en une requête plusieurs tâches Manny, avec les mêmes payloads que les endpoints unitaires, des résultats ordonnés et une application atomique (tout le lot ou rien).
  • API v101 : les routes authentifiées sont limitées par token à 60 requêtes sur toute fenêtre glissante de 60 secondes via Redis et un script Lua atomique ; les réponses exposent les en-têtes de quota, les dépassements renvoient 429 avec Retry-After, et une indisponibilité Redis laisse temporairement passer les requêtes.
  • Interface : /mannies rafraîchit immédiatement les alertes de la sonde sélectionnée lorsqu’une Manny termine un largage de conteneur sur une planète.
  • Scénario Oracle : si les archives biologiques sont larguées sur une destination invalide et que la mission échoue, la planète demandeuse perd définitivement son statut de planète habitée.
  • Scénario Oracle : une planète dont la mission a été validée peut être consultée par tout joueur présent dans son secteur, avec un unique délai de 24 heures partagé entre tous ses visiteurs.
  • Scénario : ajout de la première étape de la mission oracle ; lors du premier contact, la planète envoie directement son message, place deux biological_archive récupérables en dérive et alerte la sonde de leur destination souhaitée, sans énigme préalable.
  • Scénario Oracle : le largage planétaire d’un conteneur compte désormais les biological_archive au niveau du joueur, invite à livrer la seconde archive, suggère un retour vers la planète demandeuse après deux livraisons et fait échouer la mission si la planète cible n’est pas différente et strictement plus habitable que le seuil configurable.
  • Scénario Oracle : après livraison des deux archives, le retour de l’une des sondes du joueur dans le secteur demandeur termine la mission et déclenche un message planétaire annonçant la future consultation quotidienne de l’Oracle.
  • Scénario Oracle : une mission terminée permet désormais d’envoyer à la planète le username d’un joueur pour recevoir la direction approximative normalisée de sa sonde par défaut et sa distance ; une recherche réussie applique un délai partagé de 24 heures, contrairement aux noms inconnus.
  • Interface : /inventories propose de nouveau les relais SCUT et les balises de transit SCUT dans les éléments filtrables de “Manage storage rules by container”, même lorsqu’aucun exemplaire n’est actuellement en stock.

2026-07-24

Changed

  • API v100 : les secteurs visités sont désormais historisés par sonde. GET /api/probe/{probeId}/visited-sectors et sa variante pour la sonde par défaut ne renvoient que l’historique de cette sonde.
  • API v100 : ajout de GET /api/visited-sectors, qui renvoie l’ensemble dédupliqué des secteurs visités par toutes les sondes du joueur.
  • Maintenance : ajout de scripts/migrate-visited-sectors-to-probes.php pour reconstruire l’historique par sonde depuis les mouvements lors du déploiement.

2026-07-22

Changed

  • API v99 : les observations de secteur exposent scutCoverageStatus (covered, uncovered ou unknown) et ne révèlent sur un secteur non visité que les réseaux SCUT dont le joueur a déjà visité au moins un secteur couvert.
  • Interface : /sensors et /sensors/{probeId} indiquent désormais si le secteur du scan principal, chaque secteur voisin scanné et chaque secteur visité sont couverts ou non par un réseau SCUT.
  • Interface : /sensors ne rafraîchit plus automatiquement le scan affiché ; les coordonnées en cours de saisie restent intactes jusqu’à un scan ou un rafraîchissement explicitement demandé.
  • API v98 : GET /api/probe/mannies et GET /api/probe/{probeId}/mannies exposent nextUsefulRefreshDelayMs, le délai recommandé avant le prochain polling utile: prochaine fin de tâche Manny, ou 30000 ms lorsqu’aucune tâche n’a de fin planifiée.
  • Interface : /mannies utilise nextUsefulRefreshDelayMs pour espacer automatiquement ses rafraîchissements quand aucune fin de tâche n’est attendue.
  • Interface : le formulaire de craft /mannies détaille désormais les sous-composants automatiquement préparés pour les recettes profondes comme Manny, afin de rendre visibles les barres, plaques et autres pièces nécessaires aux composants intermédiaires.
  • Interface : quand /mannies mine uniquement du deutérium, le champ de quantité utilise désormais des points de cuve; la requête garde l’unité moteur en ECE avec la conversion 1 point = 0.01 ECE minée.
  • API v97 : les astéroïdes nouvellement générés reçoivent désormais un nom public déterministe basé sur leurs réserves par ordre de quantité et un court hash, par exemple Ice Deut 15ce; ce nom ressort dans /api/probe/sector, /api/sector et les cibles minables imbriquées des systèmes solaires.
  • Interface : dans /mannies, l’action Mine the sector affiche le nom public de l’astéroïde dans le sélecteur d’objet à miner dès que le secteur expose ce nom.
  • Maintenance : ajout de scripts/name-generated-asteroids.php pour renommer les astéroïdes déjà persistés dans les JSON de secteurs, avec --universe-path, --world-seed, --keep-existing et --dry-run.

2026-07-21

Changed

  • Performance : les lectures API de sonde calculent désormais les phases de mouvement en cours sans verrou ni réécriture systématique; seules les arrivées, les checks de destruction et les événements scheduler persistent les transitions.
  • Performance : l’authentification par session ou clef API ne réécrit plus last_used_at à chaque requête; la trace d’usage est désormais rafraîchie au plus toutes les 5 minutes par token.

2026-07-16

Changed

  • Performance : l’authentification par session ou clef API ne réécrit plus last_used_at à chaque requête; la trace d’usage est désormais rafraîchie au plus toutes les 5 minutes par token.

2026-07-21

Changed

  • API v96 : ajout de POST /api/probe/{probeId}/mannies/{mannyId}/install-scut-transit-beacon et de sa variante sonde par défaut pour installer, via une Manny, un scut_transit_beacon sur un relais SCUT actif du secteur courant; l’action dure 5 minutes, consomme le module, et les payloads de relais SCUT exposent désormais isTransitBeacon.
  • Gameplay : un trajet entre deux secteurs qui contiennent chacun un relais SCUT actif équipé d’un scut_transit_beacon dans le même réseau SCUT ignore désormais le risque de destruction de la sonde, tout en conservant les risques de détachement des containers.
  • WebUI : la page /movement liste désormais les corridors SCUT sécurisés disponibles depuis le secteur courant quand un relais actif équipé d’une balise de transit mène vers d’autres relais équipés du même réseau.
  • WebUI : dans /movement, les tuiles de corridors SCUT sécurisés déclenchent désormais directement le saut vers les coordonnées de la tuile via INITIATE JUMP.
  • WebUI : la page /sensors précise désormais quand un relais SCUT détecté est équipé d’une balise de transit.
  • WebUI : la page /mannies expose maintenant l’action de secteur Baliser un relais SCUT, avec choix d’un relais actif non équipé et validation conditionnée à la présence d’un scut_transit_beacon en inventaire.
  • WebUI : la page /scut indique désormais, dans la liste des relais, si chaque relais possède une balise de transit SCUT.
  • Gameplay : les coûts de craft en deutérium restent désormais exprimés en ECE fixes même sur les sondes avec réservoir compressé; un réservoir à 100/200% fournit donc 1.0 ECE au craft, et non 0.5 ECE.
  • Debug : scripts/add-inventory-item.php cible désormais une sonde avec <probe-id> ou --probe-id=<id>; --player-id=<id> reste disponible comme raccourci legacy vers la sonde par défaut.
  • API v95 : ajout de la recette Manny scut_transit_beacon, un module SCUT léger destiné à être installé plus tard sur les relais actifs; il consomme 1 integrated_circuit, 1 battery_pack, 1 micro_conductor, 2 steel_plate et 0.05 ECE de deutérium, pour une durée directe de 1 heure.
  • Stats : les métriques publiques Missions réussies et Missions échouées sont désormais calculées depuis probe_missions au lieu de rester à zéro, en respectant l’exclusion des joueurs sans sonde comptabilisée dans les stats publiques.
  • API v94 : lorsqu’une sonde secondaire est détruite ou piégée alors que le joueur possède d’autres sondes, elle est supprimée immédiatement et une alerte probe_destroyed est créée sur la sonde principale sans coordonnées absolues; lorsqu’une sonde principale est détruite, le basculement automatique choisit désormais la sonde survivante la plus proche. Les Mannys déjà hors de la sonde détruite deviennent des objets de secteur abandoned, détachés de leur ancienne sonde et récupérables par une sonde de passage.
  • Maintenance : ajout de scripts/delete-probe.php pour supprimer une sonde terminale par id, avec --database-config, --dry-run, refus de supprimer la dernière sonde du joueur, et conservation des données rattachées au joueur.
  • API v93 : ajout de POST /api/probe/mannies/{mannyId}/transfer-to-probe et de sa variante avec {probeId} pour transférer une Manny vers une autre sonde possédée du même secteur, ou vers une sonde dans le secteur distant de la Manny via SCUT; la durée est celle d’un détachement de container et les tâches en cours sont annulées avec la logique de recall avant le transfert.
  • Interface : /mannies ajoute l’ordre “Transférer la Manny vers une sonde” dans le groupe Secteur, avec sélection paresseuse des sondes ou drones possédés disponibles dans le secteur de la Manny.
  • Interface : les erreurs de craft Manny dues au stockage insuffisant sont affichées comme un problème de place, et non comme un manque générique de ressources.
  • API v92 : lorsqu’un assemblage de sonde par Manny est annulé via POST /api/probe/mannies/{mannyId}/recall, les composants et les deux containers consommés au démarrage sont désormais relâchés comme piles d’items à la dérive dans le secteur d’assemblage.
  • Maintenance : ajout de scripts/generate-threejs-point-cloud-sectors.php pour exporter les secteurs générés, visités, occupés par une sonde et couverts par SCUT en nuages de points JSON chargeables par Three.js, dont une scène sector-point-clouds-threejs-editor.json importable dans l’éditeur Three.js.

2026-07-14

Changed

  • API v91 : POST /api/probe/mannies/{mannyId}/detach-storage-container accepte le mode attach_to_probe avec objectId ciblant une autre sonde possédée dans le même secteur; à la fin du délai, le container et son contenu sont réattachés à l’inventaire de cette sonde.
  • Interface : /mannies et /inventories proposent le mode “Attach to another probe” pour détacher un container puis le rattacher à une autre sonde ou drone possédé dans le même secteur.
  • Interface : /inventories reconstruit le panneau “Manage storage rules by container” quand les règles reçues changent, tout en conservant l’accordéon ouvert, afin de refléter les modifications faites directement via l’API.
  • API v90 : ajout du journal de bord rattaché à chaque sonde, avec stockage probe_logbook_pages et endpoints GET /api/probe/{probeId}/logbook-pages, POST /api/probe/{probeId}/logbook-page, GET/PATCH/DELETE /api/probe/{probeId}/logbook-page/{logbookPageId}.
  • Interface : la page Sonde affiche le journal de bord de la sonde sélectionnée, chargé à l’ouverture et après création, modification ou suppression, sans polling.
  • Interface : /inventories affiche le nom de chaque Manny directement après le libellé Manny dans les cartes d’inventaire.
  • API v89 : GET /api/sector conserve sector.distance pour rétrocompatibilité en l’exprimant depuis la sonde par défaut, et ajoute sector.distances avec la distance du secteur demandé depuis chaque sonde possédée ainsi que la sonde effectivement utilisée pour le scan.
  • Interface : /sensors affiche désormais la distance du secteur scanné depuis la sonde sélectionnée par l’utilisateur, même quand sector.distance reste exprimé depuis la sonde par défaut pour rétrocompatibilité.

2026-07-13

Changed

  • Interface : /mannies ajoute des filtres d’état et de portée, un tri par nom, tâche ou secteur, et une commande de réinitialisation pour organiser la liste des Mannys sans changer le contrat API.

2026-07-09

Changed

  • API v88 : les piles d’items à la dérive dont chaque unité dépasse la capacité d’emport d’une Manny ne sont plus exposées avec salvageable: true dans les scans de secteur; cela masque notamment les anciens drifting_item scut_relay, tandis que les vrais relais SCUT éteints restent récupérables.
  • Interface : /mannies ne propose plus les relais SCUT activés ou les anciens items scut_relay trop volumineux dans “Récupérer un objet à la dérive”; seuls les relais éteints explicitement récupérables restent listés.
  • Gameplay : une tâche Manny “Assemble a new probe” arrivée à terme se finalise désormais même si la sonde-mère a quitté le secteur entre-temps; le drone est créé dans le secteur où la Manny assemblait la sonde.
  • API v87 : les noms API des items et stocks d’inventaire exposés par les endpoints de sonde sont désormais canoniques en anglais; exécuter php scripts/migrate-probe-item-names.php --database-config=config/database.json après le déploiement pour normaliser les lignes probe_items existantes.
  • Stats : le podium des explorateurs classe désormais les joueurs par nombre de secteurs visités, toutes leurs sondes possédées confondues.
  • Stats : la distance entre les deux sondes les plus proches ignore désormais les paires de sondes appartenant au même joueur.
  • API v86 : GET /api/sector utilise désormais la sonde possédée reachable la plus proche du secteur demandé quand elle fournit un scan valide, en ignorant les candidates encore en insufficient_scan_data.
  • API v85 : les entrées sector.probes de /api/probe/sector exposent désormais owned pour distinguer les sondes du joueur authentifié des sondes étrangères dans le secteur courant.
  • WebUI : l’alerte de sonde détectée dans le secteur ignore désormais les autres sondes possédées par le joueur.
  • API v84 : les blueprints d’améliorations de sonde sont désormais connus au niveau joueur et partagés par toutes ses sondes; GET /api/probe/{probeId}/probe-improvements-available retourne les améliorations connues du joueur propriétaire de la sonde sélectionnée, avec done calculé pour cette sonde précise. La migration de production dédiée est php scripts/migrate-probe-improvements.php.
  • API v83 : ajout de POST /api/probe/mannies/{mannyId}/transfer-deuterium-to-probe et de sa variante /api/probe/{probeId}/mannies/{mannyId}/transfer-deuterium-to-probe; une Manny réserve immédiatement du deutérium de la sonde source, réalise le transfert en 5 minutes vers une sonde ou un drone du même secteur, remplit la cible au maximum et rend le surplus à la source.
  • Interface : /mannies ajoute l’ordre “Transfer deuterium to a probe or drone” dans le groupe Containers, avec choix de la sonde cible du même secteur et de la quantité; le taux de deutérium de la cible n’est affiché que lorsqu’il est accessible pour la sonde du joueur.
  • API v82 : lorsqu’une sonde par défaut est détruite par collision de déplacement ou piégée par un trou noir, l’esprit du joueur bascule automatiquement vers une autre sonde opérationnelle du joueur si elle existe; l’ancienne sonde est supprimée sans effacer les données rattachées au joueur, et une alerte mind_snapshot_transferred en anglais est créée sur la nouvelle sonde.
  • OpenAPI : les opérations {probeId} réutilisées pour les déplacements de stock, messages, alertes, warnings, secteurs visités, secteur courant, déplacement, Mannys et impression atomique déclarent maintenant probeId au niveau opération pour l’affichage Swagger UI.
  • Scheduler : les tâches actives des Mannys sont désormais liées à scheduled_events via mannies.task_scheduled_event_id; le cron scripts/scheduler.php peut les finaliser avec les mêmes handlers que les refresh API. Après déploiement, exécuter php scripts/migrate-manny-tasks-to-scheduled-events.php --database-config=config/database.json.

2026-07-07

Changed

  • API v81 : ajout de POST /api/probe/mannies/{mannyId}/assemble-probe, une tâche Manny extérieure de 3 heures qui consomme 2 containers vides, 1 deuterium_engine, 1 scut_relay, 5 electric_motor, 2 atomic_printer_part et 4 solar_panel, puis crée une sonde drone-N appartenant au joueur et y transfère la Manny.
  • Interface : l’accordéon Fabrication des Mannys propose “Assemble a new probe”, avec description, liste des composants et sélection de deux containers vides.
  • API v80 : ajout des recettes atomic_printer_part et deuterium_engine; la pièce d’imprimante atomique se fabrique via l’imprimante atomique en 45 minutes, et le moteur au deutérium s’assemble via Manny en 2 heures avec 0.5 ECE de deutérium direct.
  • Interface : ajout des libellés et descriptions FR/EN pour les pièces d’imprimante atomique et moteurs au deutérium dans les pages Mannys et Inventaires.

2026-07-06

Changed

  • API v79 : GET /api/probes expose isReachable pour chaque sonde, vrai quand elle est la sonde par défaut, dans le même secteur, ou joignable via une couverture SCUT partagée.
  • Interface : la page Sonde affiche le nom et le type de la sonde, permet de la renommer quand elle est joignable, et propose depuis la sonde principale une bascule d’instance vers un drone joignable.
  • Interface : les pages ciblant une sonde injoignable harmonisent leur avertissement hors portée et réduisent les pages Capteurs, Mouvement, SCUT, Messagerie et Alertes à leur titre, rafraîchissement et message d’avertissement.
  • Interface : le sélecteur de sonde du nav-panel indique les sondes inaccessibles.
  • Interface : le libellé Mannys & printer du nav-panel anglais n’affiche plus l’entité HTML échappée.

2026-07-04

Changed

  • API v78 : GET /api/probe/{probeId} limite désormais une sonde possédée hors secteur courant et hors réseau SCUT partagé à id, name, status: out_of_scut_range et sector relatif.
  • Maintenance : ajout de scripts/add-drone-probe.php pour créer une sonde drone exclue des stats publiques, avec une Manny manny-drone déjà placée dans son stockage.
  • Interface : les pages principales acceptent un ID de sonde dans l’URL, le nav-panel propose un sélecteur de sonde active, et les liens de navigation conservent cet ID pour les sondes non défaut.
  • API v77 : les endpoints opérationnels de sonde acceptent désormais des variantes /api/probe/{probeId}/... pour agir sur une sonde possédée non défaut, à condition qu’elle soit dans le même secteur que la sonde par défaut ou joignable par le même réseau SCUT.
  • API v76 : les missions sont désormais rattachées au joueur (probe_missions.player_id) et restent visibles depuis /api/probe/missions après un changement de sonde par défaut; le script scripts/migrate-probe-missions-to-player.php migre les bases existantes depuis probe_id.
  • API v75 : PATCH /api/probe/{probeId} permet de définir la sonde par défaut si la sonde par défaut actuelle et la sonde cible sont dans le même secteur ou dans des secteurs couverts par le même réseau SCUT.
  • API v74 : GET /api/probe retourne désormais explicitement la sonde par défaut, GET /api/probes liste les sondes du joueur avec defaultProbeId et isDefault, et GET /api/probe/{probeId} retourne une sonde possédée ou 404 sinon.
  • Base de données : préparation interne du modèle multi-sondes avec players.default_probe_id et un lien one-to-many de players vers neumann_probes.

Fixed

  • Interface : les liens du nav-panel pour les sondes non défaut ne dupliquent plus l’ID de sonde (/sensors/537/537).
  • Interface : /inventories ne propose plus l’imprimante atomique ni les containers additionnels dans les items filtrables de “Manage storage rules by container”.
  • API : le minage Manny vers un container détaché n’exige plus 0,05 ECE de place libre fantôme dans la sonde quand la Manny qui part libère déjà son propre emplacement.
  • Debug : scripts/add-deuterium-asteroid-alert.php et scripts/add-deuterium-asteroid-alerts-for-low-fuel.php n’ajoutent plus d’astéroïde ni d’alerte dans les secteurs qui contiennent déjà un astéroïde avec du deutérium, et l’alerte injectée est désormais rédigée en anglais.

2026-07-03

Fixed

  • Interface : /inventories conserve désormais l’accordéon “Manage storage rules by container” ouvert pendant les refreshs, qui ne mettent plus à jour que les métriques et les inventaires quand ce panneau est déplié.
  • Base de données : l’initialisation MySQL ajoute désormais la colonne générée probe_movements.active_probe_id avant de créer son index unique, ce qui évite de bloquer l’authentification sur les bases existantes après le passage InnoDB.
  • Interface : /authbypwd affiche désormais un message traduit avec un statut 503 quand le stockage d’authentification est indisponible, au lieu d’une erreur 500 vide.
  • API : les mutateurs critiques de sonde/Manny/stockage passent désormais par le verrou transactionnel withProbeLock; les complétions Manny ne s’appuient plus sur un flock fichier pour le minage, et la base impose un seul mouvement actif par sonde avec tables MySQL créées explicitement en InnoDB.
  • API v73 : POST /api/probe/storage-moves refuse désormais de déplacer les items additional_container; tant qu’ils ne sont pas détachés ou cachés sur un astéroïde, ils restent liés au stockage interne de la sonde.
  • Interface : /inventories masque le bouton “Move” sur les lignes de containers additionnels tout en conservant l’alignement des contrôles.
  • Maintenance : ajout de scripts/relink-additional-containers-to-core.php pour remettre les additional_container déjà stockés dans un container vers probe-core après déploiement, et supprimer les containers orphelins vides dont l’item backing a déjà disparu.

2026-07-01

Changed

  • API : ApiKernel utilise désormais un routeur déclaratif, avec les routes Forum déplacées dans un controller dédié et leur sérialisation dans un presenter, sans changement de contrat public.
  • API : les routes /api/probe/mannies et /api/probe/atomic-printer/craft sont déplacées dans ProbeManniesApiController, avec leur présentation dans ProbeManniesApiPresenter, sans changement de contrat public.
  • Manny : MannyService délègue désormais la présentation publique des Mannys à un presenter dédié et le rafraîchissement des tâches à des handlers typés par tâche, sans changement de contrat API.
  • API v67 : ajout du stockage probe_improvements, de GET /api/probe/probe-improvements-available et de POST /api/probe/mannies/{mannyId}/improve-probe; la première amélioration, deuterium_compression, consomme 1 electric_motor et 2 steel_bar, dure 5 minutes et porte la cuve de deutérium à 200 % une fois terminée.
  • API v68 : POST /api/probe/mannies/{mannyId}/inspect-sector-object accepte aussi une Manny inactive dans un secteur distant couvert par le même réseau SCUT que la sonde; l’objet inspecté doit se trouver dans le secteur de cette Manny, qui reste oubliée sur place à la fin de l’inspection.
  • API v69 : ajout de l’amélioration reinforced_container_couplings via GET /api/probe/probe-improvements-available et POST /api/probe/mannies/{mannyId}/improve-probe; elle consomme 1 integrated_circuit et 0.4 ECE de carbon_compounds, dure 5 minutes et ignore 5 containers supplémentaires dans le calcul du risque de rupture de container au déplacement.
  • API v70 : terminer POST /api/probe/mannies/{mannyId}/inspect-sector-object sur un dormant_construct crée une alerte manny_report avec un message de rapport en anglais et débloque soit deuterium_compression, soit reinforced_container_couplings; le scénario choisi est persisté dans le JSON du secteur sans être exposé dans les scans API.
  • API v71 : POST /api/probe/mannies/{mannyId}/recover-storage-container interrompt les Mannys qui minent vers le container récupéré; elles larguent leur cargo minier éventuel et repassent en tâche returning avec la raison target_container_recovered.
  • API v64 : ajout des objets de secteur dormant_construct, exposés uniquement dans les scans détaillés de /api/probe/sector et /api/sector.
  • API v65 : POST /api/probe/mannies/{mannyId}/inspect-sector-object remplace l’action spécialisée inspect-asteroid, désormais dépréciée. L’inspection accepte les astéroïdes, les dormant_construct et les containers détachés visibles ou déjà découverts; les rapports de contenu de containers créent une alerte manny_report.
  • API v66 : l’arrivée d’une sonde dans un secteur contenant un dormant_construct crée une alerte persistante sector_object_detected en anglais invitant à envoyer une Manny l’inspecter.
  • Génération : les nouveaux secteurs ont désormais 1 chance sur 200 de contenir un Dormant construct; scripts/add-dormant-construct.php permet d’en ajouter un à un secteur, et scripts/backfill-dormant-constructs.php peut compléter les secteurs JSON non visités déjà générés.
  • Interface : /mannies propose l’action générique “Inspecter un objet du secteur” et /alerts met les rapports de Manny en évidence avec un style dédié.
  • Interface : une Manny inactive dans un secteur distant joignable via SCUT peut désormais recevoir l’action “Inspect a sector object” depuis /mannies; la liste des objets inspectables provient du scan /api/sector du secteur de la Manny.
  • Interface : /mannies regroupe les ordres Manny en accordéons Probe/Sector/Containers/Craft et ajoute “Improve the probe”, avec sélection des améliorations disponibles et vérification des ressources nécessaires.

Fixed

  • API v72 : POST /api/probe/storage-moves soustrait désormais le volume déjà réservé par les autres déplacements Manny vers le même container avant d’accepter un ordre, afin d’éviter de dépasser sa capacité.
  • Interface : la page Probe affiche désormais une métrique Améliorations installées, chargée une seule fois depuis /api/probe/probe-improvements-available, avec un résumé des deux premières améliorations et un +N si la liste est plus longue.
  • Interface : la métrique Deuterium de la page Probe affiche désormais en petit le plafond amélioré, par exemple max 200, quand fuel.maxDeuterium dépasse la valeur standard.
  • API : les rapports d’inspection Manny sont idempotents pour une même fin de tâche, afin d’éviter plusieurs alertes manny_report identiques quand la complétion est rafraîchie simultanément.
  • API : les rapports d’inspection Manny créés hors déplacement ne provoquent plus d’erreur 500 sur /api/probe/sector, /api/probe/mannies ou /api/probe/alerts; probe_damage_warnings.movement_id accepte désormais NULL pour ces alertes autonomes.
  • API : les nouveaux rapports Manny de contenu de container sont désormais générés en anglais, y compris quand aucun contenu n’est détecté.

2026-06-28

Changed

  • Stockage : les couvertures SCUT ne sont plus stockées dans des colonnes JSON covered_sectors_json; elles passent par la table relationnelle scut_covered_sectors. Après déploiement sur une base existante, exécuter php scripts/migrate-scut-coverage.php.
  • API v58 : GET /api/probe/mannies expose les détails de tâche d’une Manny éloignée seulement si son secteur et celui de la sonde sont couverts par le même réseau SCUT; sinon currentTask vaut unknown_too_far et le payload/progrès de tâche est masqué.
  • API v59 : POST /api/probe/mannies/{mannyId}/recall accepte désormais l’arrêt distant d’une Manny active située dans un secteur couvert par le même réseau SCUT que la sonde; la Manny ne revient pas, sa tâche est annulée et elle est enregistrée comme forgotten dans son secteur.
  • API v60 : POST /api/probe/mannies/{mannyId}/mine accepte désormais l’ordre pour une Manny oubliée située dans un secteur distant couvert par le même réseau SCUT que la sonde, à condition de déposer le minage dans un container détaché du secteur de la Manny.
  • API v61 : les messages publics ProbeDamageWarning.message des alertes de rupture de container pendant un mouvement utilisent désormais les coordonnées relatives du joueur et ne divulguent plus les coordonnées absolues du secteur.
  • API v62 : les containers détachés cachés sur astéroïde ne sont plus exposés comme récupérables via POST /api/probe/mannies/{mannyId}/salvage; ils restent récupérables via POST /api/probe/mannies/{mannyId}/recover-storage-container.
  • API v63 : docs/openapi.yaml documente explicitement les champs SCUT relay-only des SectorObject, dont status, coverageRadiusSectors, network, createdByProbeId, createdByProbeName et la convention id string vers relayId entier.
  • Interface : /mannies affiche les tâches distantes joignables via SCUT avec la progression habituelle et une mention courte de liaison SCUT, tout en conservant “Trop éloignée” hors portée.
  • Interface : la mention de tâche distante via SCUT est maintenant visible directement dans le bouton d’accordéon Manny, et l’action de rappel distante est libellée comme un abandon de tâche.
  • Interface : une Manny oubliée mais encore dans un secteur couvert par le même réseau SCUT s’affiche maintenant comme inactive avec la mention “Secteur distant via SCUT”, au lieu de “Trop éloignée”.
  • Interface : une Manny oubliée joignable via SCUT propose désormais uniquement l’action “Mine the sector”, alimentée par /api/sector pour cibler le secteur de la Manny et limiter “Store in” aux containers détachés de ce secteur.
  • Interface : /sensors affiche maintenant le joueur et l’âge de pose des marque-pages de navigation dans le scan courant, les tuiles de secteurs voisins et les scans détaillés des secteurs visités.
  • Interface : /mannies ne propose plus les containers détachés cachés dans “Récupérer un objet à la dérive”; ils restent listés dans “Récupérer un container détaché”.

Fixed

  • Manny : les livraisons de minage parallèles incrémentent désormais les stocks de la sonde sans écraser les apports d’une autre Manny, y compris pour le deutérium stocké dans la cuve dédiée.
  • Interface : /mannies ne propose plus de récupérer un container détaché caché uniquement connu via une ancienne détection Manny; le formulaire suit les containers présents dans le scan du secteur courant.
  • Authentification : les sessions créées avec Se souvenir de moi prolongent désormais automatiquement leur expiration à chaque nouvelle requête WebUI/API portant le cookie.

2026-06-27

Changed

  • Interface : ajout de la page /scut “SCUT Network”, avec LED de couverture dans le nav-panel, synthèse du réseau courant, sondes détectées et relais listés avec coordonnées relatives.
  • Statistiques publiques : ajout des podiums SCUT des activateurs de relais allumés et des réseaux les plus étendus, ainsi que du nombre de secteurs couverts par au moins un réseau SCUT.
  • API v57 : les endpoints de messages peuvent exposer type: unknown pour les émetteurs inconnus; scripts/add-origin-anomaly-alerts.php diffuse maintenant le message des plans SCUT après 60 s, puis une seconde alerte d’intégration des plans.
  • API v56 : ajout des alertes persistantes anomaly_detected et du script CLI scripts/add-origin-anomaly-alerts.php, qui injecte une alerte d’anomalie vers l’origine absolue pour chaque sonde avec une direction approximative relative à sa position courante.
  • API v55 : les relais SCUT conservent l'id historique de leur sonde créatrice sans clé étrangère bloquante; les payloads de relais exposent createdByProbeName, avec le fallback death probe quand cet id ne correspond plus à une sonde existante.
  • Interface : /messaging propose aussi les sondes joignables via les réseaux SCUT couvrant le secteur courant.
  • Interface : /mannies propose l’action Manny d’activation d’un relais SCUT éteint, avec sélection du relais et nom de réseau facultatif, en vérifiant la présence d’un circuit intégré en stock.
  • API v54 : POST /api/probe/inventory/{itemId}/jettison déploie désormais un item scut_relay comme relais SCUT éteint dans le secteur courant, exposé comme récupérable par les Mannys.
  • API v53 : POST /api/probe/mannies/{mannyId}/turn-on-relay exige désormais une étoile dans le secteur courant (scut_relay_requires_star) et POST /api/probe/mannies/{mannyId}/salvage peut récupérer un relais SCUT éteint présent dans le secteur.

Fixed

  • Interface : un item scut_relay en inventaire peut de nouveau être jetisonné depuis la WebUI pour déployer un relais SCUT éteint dans le secteur.
  • Manny : deux Mannys ne peuvent plus démarrer simultanément la récupération du même relais SCUT éteint.

2026-06-26

Added

  • API v52 : ajout des recettes craftables solar_panel et scut_relay; un relais SCUT complet demande environ 72 h de craft cumulé par une Manny et l'imprimante atomique, hors temps de minage.

2026-06-25

Added

  • API v51 : ajout des relais SCUT persistés en base, de l'action Manny POST /api/probe/mannies/{mannyId}/turn-on-relay, de GET /api/probe/scut-network/{scutNetworkId}, de la couverture scutNetworks dans les scans et de la messagerie entre sondes couvertes par un même réseau SCUT.
  • Debug : ajout de scripts/create-scut-relay.php pour créer un relais SCUT éteint dans un secteur absolu donné.

Changed

  • Interface : /mannies exclut les détails de probe.inventory des hashes de cartes pour éviter les reconstructions inutiles pendant le polling; les formulaires dépendants de l'inventaire sont construits à l'ouverture de leur accordéon après rafraîchissement de /api/probe.

Fixed

  • API : la restauration d'un snapshot d'esprit supprime maintenant les alertes de dégâts avant les mouvements, purge les missions de l'ancienne sonde et conserve les relais SCUT en retirant seulement leur référence à la sonde détruite, évitant un internal_error sur les sondes mortes avec historique riche.
  • API v50 : les payloads publics de taches Manny n'exposent plus les objets internes de reservation de container detache ni les secteurs cibles absolus.
  • Stockage : la récupération d'un container détaché est désormais idempotente, afin qu'un refresh concurrent ou répété ne recrée pas plusieurs containers portant le même libellé dans l'inventaire.

2026-06-24

Added

  • API v49 : ajout de POST /api/probe/mannies/{mannyId}/refill-deuterium-tank, une tache Manny d'une minute qui remplit le reservoir de deuterium de la sonde quand une station de recharge est presente dans le secteur courant.
  • API v48 : le scenario return_to_space_program attend maintenant 48 heures apres les dons de materiaux avant de faire apparaitre une station de recharge en deuterium dans les scans detailles du secteur; la reussite est persistee pour le joueur et les contributeurs.
  • Interface : /mannies propose l'action de recharge du reservoir de deuterium uniquement lorsqu'une station de recharge en deuterium est detectee dans le secteur courant.
  • Interface : /sensors met en exergue les stations de recharge en deuterium detectees dans les tuiles des secteurs deja visites, avant le scan detaille.

Changed

  • Interface : /mannies rafraichit les informations des Mannys toutes les 5 secondes et apres validation d'une tache, sans reconstruire les cartes dont le hash d'etat n'a pas change; les pourcentages de progression et le temps restant a la minute defilent localement sans polling additionnel.
  • Interface : /sensors met en exergue les waypoint bookmarks detectes dans les tuiles des secteurs deja visites, avant le scan detaille.

Fixed

  • Stockage : les collections de containers détachés d'un secteur dedoublonnent les entrées par identifiant, y compris au chargement, pour éviter la multiplication des containers cachés sur astéroïde et leur remplissage en double par les Mannys.

2026-06-23

Added

  • Ops : ajout de scripts/migrate-sqlite-to-mysql.php pour migrer la base SQLite active vers une base MySQL/MariaDB future, verrouiller la source pendant la copie et basculer config/database.json après succès.
  • Scénario : return_to_space_program envoie un message planétaire final quand les dons atteignent 5 ECE de métaux et 1 ECE de composés carbonés, avec diffusion aux contributeurs présents dans le secteur.

Fixed

  • Stockage : récupérer un container détaché ne bloque plus si un container reconstruit a repris le même identifiant technique; la récupération recrée alors un identifiant libre en conservant le contenu.
  • Interface : les vues Inventaires et Mannys affichent désormais le nom personnalisé du container interne de la sonde au lieu de le remplacer systématiquement par le libellé traduit par défaut.
  • Base de donnees : les index MariaDB des endpoints de messagerie utilisent des longueurs de préfixe compatibles avec la limite de clé InnoDB en utf8mb4.
  • Base de donnees : players.username utilise une collation binaire sous MariaDB, afin de conserver l'unicite sensible a la casse de la base SQLite pendant la migration.

2026-06-18

Added

  • API v40 : /api/probe/alerts peut exposer des alertes sector_object_detected avec un objet detecte dans le secteur relatif.
  • Debug : ajout de scripts/add-deuterium-asteroid-alert.php et scripts/add-deuterium-asteroid-alerts-for-low-fuel.php pour injecter des asteroides de deuterium et avertir les joueurs concernes.
  • Debug : ajout de scripts/add-inventory-item.php pour injecter des objets, containers additionnels ou Mannys dans l'inventaire d'un joueur de developpement.
  • API v38 : /api/probe/missions et les reponses de mission n'exposent plus de coordonnees absolues dans les descriptions, metadata ou createdByEvent; les secteurs publics y sont convertis en sector.relative.
  • API v37 : les arrivees dans un secteur jamais visite contenant une planete habitee peuvent declencher un scenario de premier contact pondere par gameplay.intelligentLife.scenarios; le premier scenario implemente, return_to_space_program, cree une mission Premier contact et un message planetaire en nombres premiers.
  • Debug : ajout de scripts/force-inhabited-planet.php pour injecter en CLI une planete habitee dans un secteur donne.
  • API v42 : le premier contact return_to_space_program demande maintenant 5 ECE de métaux et 1 ECE de composés carbonés, puis comptabilise les matériaux largués par container sur la planète avec le joueur donateur.
  • API v43 : ajout de POST /api/probe/mannies/{mannyId}/drop-manny-cargo pour larguer immédiatement la cargaison d’une Manny en attente de place et retenter son retour à bord.
  • API v44 : ajout de PATCH /api/probe/storage-containers/{containerId} pour renommer un container de stockage via son champ label.
  • API v45 : POST /api/probe/mannies/{mannyId}/mine accepte targetContainerId pour déposer les ressources minées dans un container détaché visible ou caché sur astéroïde.
  • API v46 : POST /api/probe/mannies/{mannyId}/detach-storage-container expose artificialObjectDetected lors d’un détachement hidden_on_asteroid, avec l’id du container caché et l’astéroïde cible.
  • API v47 : les containers cachés sur astéroïde persistent leurs découvreurs dans discoveredByPlayerIds et remontent dans /api/probe/sector uniquement pour ces joueurs.
  • Scénario : chaque largage de matériaux demandé par return_to_space_program déclenche un message de remerciement planétaire indiquant les matériaux restant à envoyer.
  • Interface : dans /inventories, le filtre par container propose une action de renommage quand un container précis est sélectionné.
  • Interface : dans /mannies, une Manny waiting_for_space propose de rentrer sans sa cargaison.
  • Interface : dans /mannies, le formulaire de minage peut envoyer les ressources vers un container détaché visible ou détecté sur l’astéroïde ciblé.
  • Interface : ajout d’une vraie page 404 avec retour vers l’accueil, utilisée comme route frontend par défaut quand aucune route ne correspond.
  • Stats : ajout du podium des découvreurs de mondes habités par une espèce intelligente sur /stats.
  • Stats : les trois podiums de /stats proposent un bouton pour afficher les 9 premiers du classement.

Fixed

  • API v41 : le rappel d'une Manny sortie depuis moins d'un temps de trajet la fait maintenant faire demi-tour; la duree de retour correspond au temps deja passe sur la tache annulee.
  • API v39 : /api/probe/sector, la messagerie, les alertes de vie intelligente et les reponses de mission remplacent les noms publics de planetes habitees qui contiendraient les coordonnees absolues du secteur par un libelle public sans coordonnees absolues; la messagerie n'utilise plus l'identifiant technique d'une planete comme libelle de destinataire.
  • Debug : scripts/force-inhabited-planet.php genere maintenant un id opaque et stable par secteur pour ses planetes forcees, et retire l'ancien objet debug du meme secteur lorsqu'il est relance.
  • Debug : scripts/teleport-probe.php finalise désormais les téléportations via ProbeMovementService, afin de déclencher les effets d'arrivée comme les scénarios de premier contact.
  • Scénarios : observer un secteur courant contenant une planète habitée lance désormais le premier contact manquant, même si l'arrivée normale a été contournée par un outil de debug.
  • Stockage : les synchronisations d'inventaire ne reconstruisent plus les ressources des containers depuis des totaux historiques potentiellement périmés, ce qui pouvait effacer des matériaux lors de requêtes concurrentes de minage ou de craft.
  • Interface : la carte de l'imprimante atomique dans Mannys & imprimante utilise maintenant le libelle traduit en anglais.
  • Interface : les rafraîchissements automatiques de la page Inventaires ne réinitialisent plus les règles de stockage en cours de modification.
  • Interface : la page /movement propose désormais par défaut les coordonnées courantes de la sonde et garde le bouton de saut désactivé tant qu'une autre destination valide n'est pas saisie; les destinations ouvertes depuis Sensors and radars > Prepare jump restent préremplies.
  • Interface : la page /movement affiche un avertissement discret lorsqu'une destination atteint la distance où un risque de destruction en croisière apparaît.
  • Interface : la page /sensors affiche un journal repliable des secteurs précédemment visités, chargé par lots de 9 avec les scans détaillés disponibles.
  • Debug : ajout de scripts/sector-json.php pour afficher en CLI le JSON brut d'un secteur à partir de ses coordonnées absolues.

2026-06-17

Added

  • API v36 : ajout de POST /api/probe/mind-snapshot/reassign pour réassigner le snapshot d'esprit d'une sonde morte ou piégée par un trou noir vers une nouvelle sonde, avec reset du référentiel local à 0,0,0.
  • API v35 : ajout du socle générique des missions de sonde avec persistance probe_missions / probe_mission_steps, objets Mission / MissionStep, GET /api/probe/missions (/api/probe/mission en alias) et POST /api/probe/missions/{missionId}/abandon.
  • API v34 : la messagerie /api/probe/messages accepte des destinataires typés via recipient.type (probe par défaut, ou planet) et recipient.id.
  • Messagerie : les messages exposent désormais sender.type et recipient.type; les endpoints peuvent être une sonde (probeId) ou une planète habitée (planetId).
  • Interface : la page /messaging permet d’envoyer un message aux sondes du secteur courant et aux planètes habitées détectées dans ce secteur.
  • API v32 : ajout de POST /api/probe/mind-snapshot/reassign pour réassigner le snapshot d'esprit d'une sonde morte ou piégée par un trou noir vers une nouvelle sonde, avec reset du référentiel local à 0,0,0.
  • Interface : les sondes mortes ou piégées par un trou noir affichent maintenant une alerte explicite avec une action de réattribution du snapshot d'esprit.
  • Debug : ajout de scripts/userinfos.php pour auditer en CLI l'état complet d'une sonde, dont position absolue/relative, inventaire brut, secteurs visités, mouvements et événements planifiés.

Fixed

  • Base de donnees : l'initialisation d'une ancienne table probe_messages migre maintenant les colonnes sender_type / recipient_type avant de creer leurs index, evitant un crash au demarrage apres changement de branche.
  • Craft : un craft terminé alors que le cargo est plein ne casse plus GET /api/probe ou GET /api/probe/mannies; il reste en attente de place et se finalise après libération de stockage.
  • Stockage : GET /api/probe/mannies initialise/répare désormais le container interne de la sonde, réattache les items/Mannys à bord dont le container a disparu et libère les Mannys coincés sur un déplacement de stockage expiré devenu impossible.
  • Interface : le container interne de la sonde est traduit en anglais dans les vues d'inventaire.

2026-06-15

Added

  • API v31 : les observations détaillées de secteur exposent habitabilityScore sur les planètes des secteurs courants ou déjà visités.
  • API v30 : ajout des recettes thermal_protection_shell, parachute_pack, descent_guidance_module et atmospheric_drop_kit.
  • API : ajout de POST /api/probe/mannies/{mannyId}/drop-storage-container pour larguer un container additionnel sur une planète avec consommation d’un kit de largage atmosphérique.
  • Secteurs : les containers largués sur planète sont persistés dans le JSON du secteur avec originProbeId, sans être exposés dans les observations API pour le moment.
  • Interface : ajout du formulaire Manny “Larguer un container sur une planète”.
  • Stats : ajout du nombre de planètes habitables dans les secteurs générés et dans les secteurs visités.
  • Interface : la page /sensors affiche le score d’habitabilité des planètes et documente ce score avec les unités.

Fixed

  • Craft : la complétion d’une fabrication est idempotente, évitant qu’un double rafraîchissement concurrent crée deux containers, items ou Mannys pour une seule tâche.

2026-06-14

Added

  • Stats : ajout du nombre de waypoints installés dans l'univers et d'un podium des joueurs en ayant installé le plus.
  • Stats : ajout d'un podium des sondes ayant visité le plus de secteurs sur la page publique des statistiques.
  • Stats : ajout du champ neumann_probes.exclude_from_stats pour retirer des sondes des statistiques publiques.

Fixed

  • Interface : le panneau de navigation utilise désormais le même fond que l'espace de travail.
  • Interface : dans Inventaires, les compteurs de total sont alignés avec les compteurs des lignes par container.
  • Interface : la case Se souvenir de moi est de nouveau transmise lors d'une connexion OAuth, afin de poser un cookie de session persistant.

2026-06-13

Added

  • API v28 : les posts du forum exposent désormais firstMessageId et les réponses de détail de post incluent firstMessage.
  • API v27 : les messages du forum exposent editedAt, renseigné lorsqu’un message a été modifié.
  • API v26 : ajout d’un forum léger sous /api/forum/*, avec catégories ordonnées, posts et messages/réponses.
  • Forum : ajout des endpoints GET|POST /api/forum/categories, GET|PATCH|DELETE /api/forum/categories/{categoryId}, GET|POST /api/forum/posts, GET|PATCH|DELETE /api/forum/posts/{postId}, GET|POST /api/forum/posts/{postId}/messages et PATCH|DELETE /api/forum/messages/{messageId}.
  • Forum : les catégories sont réservées aux joueurs forumAdmin; les joueurs forumModerator ou forumAdmin peuvent épingler, modifier et supprimer tous les posts et messages.
  • Joueurs : ajout des flags persistants forumAdmin et forumModerator, exposés dans /api/me.

Changed

  • Craft : clarification de la description du marque-page de navigation dans l’interface et les exemples API.
  • Forum : GET /api/forum/posts/{postId} sépare le message initial dans firstMessage; le tableau messages contient uniquement les réponses paginées.
  • Forum : l’auteur d’un message peut désormais modifier son propre message via PATCH /api/forum/messages/{messageId}; les modérateurs et admins conservent le droit de modifier tous les messages.
  • Les clients typés doivent accepter apiVersion: 28 et les nouveaux schémas ForumCategory*, ForumPost*, ForumMessage*, les champs ForumPost.firstMessageId, ForumMessage.editedAt, firstMessage sur les réponses de détail/création de post, ainsi que les champs forumAdmin et forumModerator sur Player.

Fixed

  • Interface : la recette sélectionnée dans Mannys & imprimante > Fabriquer reste conservée après les rafraîchissements automatiques.

2026-06-12

Added

  • API v25 : ajout des warnings persistants de dégâts de mouvement avec GET /api/probe/damage-warnings et PATCH /api/probe/damage-warnings/{damageWarningId} pour marquer un warning comme lu.
  • Mouvement : à partir de 5 containers additionnels, un saut peut casser un lien de container avec 10% de risque, puis +10 points par container supplémentaire jusqu’à 100%.
  • Mouvement : le container perdu est tiré au sort dès l’initiation du saut, puis devient un container dérivant avec son contenu dans le secteur de départ en fin d’accélération ou dans le secteur d’arrivée en début de décélération.
  • API v24 : ajout des recettes electric_motor, battery_pack, linear_actuator et manny.
  • Craft : la fabrication d’une Manny crée désormais une vraie entité Manny stockée dans la sonde, avec l’encombrement et la capacité cargo standards.

Changed

  • Craft : le calcul des composants manquants est désormais récursif, afin qu’une recette puisse embarquer plusieurs niveaux de sous-recettes dans son coût et sa durée.
  • Interface : les écrans Mannys & imprimante et Inventaires affichent les nouveaux composants et calculent récursivement la disponibilité des ingrédients.
  • Interface : les warnings de dégâts non lus mettent l’onglet Alertes en style warning et s’acquittent via l’API au lieu du stockage local.
  • Déploiement : le schéma initialise automatiquement la table probe_damage_warnings et ses index.
  • Les clients typés doivent accepter apiVersion: 25, les nouveaux types d’items electric_motor, battery_pack et linear_actuator, la recette/sortie manny, ainsi que les schémas ProbeDamageWarning*.

Fixed

  • Interface : les panneaux interactifs ouverts dans les listes de métriques conservent maintenant leur état lors des rafraîchissements automatiques.

2026-06-11

Changed

  • Réécriture complète de la Web UI : l’ancien template monolithique a été remplacé par un shell commun templates/main.html, des templates dédiés par page et des scripts JavaScript spécifiques par écran.
  • Les anciens panneaux console sont désormais accessibles comme pages web autonomes : /, /sensors, /movement, /inventories, /mannies, /messaging et /alerts.
  • Les pages publiques /about, /changelog, /stats et /api-docs ont été intégrées au même système de routes frontend, avec Swagger UI sur /api-docs.
  • Le sélecteur de langue persiste maintenant le choix dans un cookie, reste sur la route courante et recharge le dictionnaire i18n avec une URL versionnée.
  • Le menu tutoriel du header ouvre les tutoriels intégrés; après une première connexion OAuth et le choix du pseudonyme, le joueur est redirigé vers /?tutorial=context.

Removed

  • Suppression de l’ancien template templates/home.html, qui n’était plus utilisé depuis la migration vers les routes frontend dédiées.

2026-06-09

Added

  • Ajout de la page publique /stats, accessible depuis le pied de page, qui affiche les statistiques agrégées de l’univers depuis var/stats.json.
  • Ajout du script scripts/generate-stats.php pour générer le JSON de statistiques destiné à une tâche CRON quotidienne.
  • Les statistiques couvrent notamment les sondes, secteurs générés et visités, trous noirs, astéroïdes par ressource minable, Mannys perdus ou oubliés, containers détachés et distances extrêmes entre sondes.

2026-06-08

Added

  • API v23 : ajout du détachement de containers additionnels par Manny, en mode dérivant (drifting) ou caché sur astéroïde (hidden_on_asteroid), avec conservation du contenu et des règles de routing.
  • API : ajout de POST /api/probe/mannies/{mannyId}/detach-storage-container, POST /api/probe/mannies/{mannyId}/inspect-asteroid et POST /api/probe/mannies/{mannyId}/recover-storage-container; le salvage existant peut aussi récupérer un container détaché dérivant.
  • API : les containers cachés sur astéroïde peuvent être détectés lors du minage ou d’une inspection Manny via artificialObjectDetected, sans exposer leur contenu.

Changed

  • Interface : le temps restant d’un déplacement dans l’onglet Sonde se met maintenant à jour localement et rafraîchit les données à l’arrivée.
  • Interface : amélioration de l’onglet Capteurs et radars, qui désactive désormais le bouton Scanner quand la somme des coordonnées relatives est impaire.
  • Interface : dans Mannys & imprimante, une Manny située dans un autre secteur affiche Trop éloignée dans son accordéon et ne conserve que la métrique Position au dépliage.
  • Les clients typés doivent accepter apiVersion: 23, les tâches Manny detaching_storage_container et inspecting_asteroid, ainsi que le type de secteur detached_container.

Fixed

  • API : lorsqu’une sonde revient dans le secteur d’une Manny forgotten qui lui appartient encore, la Manny inactive est automatiquement remise à bord si une place de stockage est disponible, et l’objet de secteur forgotten est supprimé.
  • JS : une tentative de scan avec des coordonnées relatives invalides efface maintenant le résultat du scan précédent tout en conservant le message d’erreur existant.
  • JS : la liste des Mannys est resynchronisée après le chargement du secteur courant de la sonde afin d’afficher correctement les Mannys trop éloignées.

2026-06-06

Added

  • API v16 : ajout de la messagerie inter-sondes avec POST /api/probe/messages, GET /api/probe/messages et PATCH /api/probe/messages/{messageId}/read.
  • Un message peut être envoyé uniquement à une autre sonde présente dans le même secteur que la sonde émettrice.
  • Les messages reçus exposent l’émetteur, le destinataire, le secteur relatif, le corps du message, le statut unread / read, readAt, createdAt et updatedAt.
  • API v18 : ajout de GET /api/probe/messages/sent pour consulter les messages envoyés par la sonde courante avec la même pagination que les messages reçus.
  • Interface : ajout de l’onglet Messagerie entre Mouvement et Alertes, avec envoi à une sonde du secteur, liste des messages reçus et passage des messages non lus au statut read.

Changed

  • API v17 : GET /api/probe/messages retourne par défaut les 50 derniers messages reçus et accepte les paramètres optionnels limit et offset pour consulter l’historique.
  • La réponse de GET /api/probe/messages expose désormais un objet pagination avec limit, offset, count, total et hasMore.
  • API v19 : GET /api/probe/messages/sent n’expose plus l’état de lecture du message (status, readAt, updatedAt).
  • Interface : la vue Messagerie sépare maintenant Messages reçus et Messages envoyés en onglets de classeur.
  • Interface : l’onglet Messages envoyés n’affiche plus de statut Lu / Non lu.
  • Interface : les règles de stockage par container utilisent des listes à sélection multiple avec une aide contextualisée et empêchent un même type d’être choisi dans plusieurs règles du même container.
  • API v20 : les objets détaillés de /api/sector et /api/probe/sector exposent désormais massUnit et radiusUnit quand mass / radius sont présents.
  • Interface : les masses et rayons des corps détectés affichent leur unité (M☉, R☉, M🜨, R🜨, km, AU) et l’onglet Capteurs et radars explique ces unités.
  • Interface : le dictionnaire de traduction JS est désormais servi via un JSON versionné et cacheable au lieu d’être injecté inline dans le HTML.
  • API v21 : ajout des recettes micro_conductor, ceramic_insulator, crystal_substrate, dopant_matrix et integrated_circuit, fabriquées via l’imprimante atomique.
  • Interface : l’Imprimante 3D atomique est renommée Imprimante atomique, et les nouveaux composants de circuit sont affichés dans les inventaires, recettes et règles de stockage.
  • Craft : les coûts de deutérium des recettes sont vérifiés et consommés en ECE de cuve, afin que 0.13 ECE corresponde à 13% d’une cuve pleine.
  • API v22 : ajout de POST /api/probe/atomic-printer/craft pour lancer les recettes de l’imprimante atomique avec réservation automatique d’une Manny assistante.
  • Interface : l’onglet Mannys devient Mannys & imprimante; l’imprimante atomique y apparaît comme poste de fabrication et les Mannys réservées affichent Assistance à l’imprimante.

Breaking Changes

  • Les clients typés doivent accepter apiVersion: 22, les nouveaux schémas ProbeMessage*, le champ pagination sur ProbeMessagesResponse et les nouveaux types d’items de craft électronique.
  • Les recettes atomic_3d_printer doivent être lancées via POST /api/probe/atomic-printer/craft; POST /api/probe/mannies/{mannyId}/craft est réservé aux recettes fabriquées directement par une Manny.
  • Les clients de GET /api/probe/messages/sent doivent utiliser ProbeSentMessagesResponse : les champs status, readAt et updatedAt ne sont plus présents sur les messages envoyés.

2026-06-05

Added

  • Rédaction et intégration des tutoriels de premiers pas : contexte de la sonde, déplacement et utilisation des Mannys, avec illustrations agrandissables.

Changed

  • API v15 : l’installation d’un waypoint-bookmark passe par POST /api/probe/mannies/{mannyId}/install-bookmark et crée une tâche Manny installing_waypoint_bookmark de 10 secondes.
  • L’ancien endpoint instantané /api/probe/waypoint-bookmarks/{itemId}/deploy n’est plus exposé dans l’API publique.
  • L’interface Actions ne contient plus le formulaire “Poser un marque-page”; l’action est disponible dans Mannys > Attribuer une tâche à la Manny.
  • L’ordre consomme un waypoint-bookmark en stock au lancement de la tâche, puis conserve la persistance existante des waypointBookmarks sur l’objet ciblé.

Breaking Changes

  • Les clients typés doivent accepter apiVersion: 15 et la nouvelle tâche Manny installing_waypoint_bookmark.

2026-06-04

Added

  • API v14 : ajout de la gestion des stocks par container (probe-core + containers supplémentaires individuels).
  • Ajout des endpoints /api/probe/storage-containers, /api/probe/storage-containers/{containerId}, /api/probe/storage-containers/{containerId}/rules et /api/probe/storage-moves.
  • Ajout du script scripts/migrate-storage-containers.php pour répartir les stocks existants selon la règle par défaut.
  • L’interface des sous-systèmes affiche les lignes d’inventaire par container et permet de filtrer l’inventaire par container.
  • Ajout de l’accordéon “Gérer les règles de stockage par container”.
  • L’interface d’inventaire ajoute des actions par ligne de container pour déplacer le stock via une Manny ou le jeter dans l’espace avec confirmation.
  • Ajout de CHANGELOG.md comme source de vérité versionnée pour les changements du projet.
  • Ajout de la route /changelog, qui affiche ce changelog en HTML depuis le site.
  • Ajout de config/gameplay.json et config/universe.json pour centraliser les curseurs de gameplay et de génération procédurale.

Changed

  • /api/probe conserve l’inventaire global, mais les items exposent maintenant leur container et les ressources exposent leurs lignes containers.
  • Le déplacement de stock entre containers passe par une tâche Manny moving_stockage.
  • /api/probe/storage-moves accepte des lots itemIds / targetMannyIds, et le jettison de ressources peut cibler un containerId.
  • L’imprimante 3D atomique reste dans la sonde et ne peut pas être déplacée; le deutérium reste dans sa cuve dédiée.
  • Les fichiers config/*-local.json surchargent les configurations versionnées sans être suivis par Git.

Breaking Changes

  • Les clients typés doivent accepter apiVersion: 14, le champ inventory.containers, les placements de stock par container et la nouvelle tâche Manny moving_stockage.
  • Stockage Manny : suppression de mannies.task_payload_json; les payloads canoniques sont joints depuis scheduled_events, les champs opérationnels sont projetés dans manny_tasks et les items consommés sont stockés dans manny_task_consumed_items. Exécuter php scripts/one-shot-scripts/migrate-manny-task-storage.php --database-config=var/database-prod.json avant de déployer le nouveau code.
  • Scheduler : le claim d’un événement réutilise désormais l’objet déjà hydraté et ne relit plus la ligne ni son JSON après l’acquisition du verrou.
  • Stockage des items : remplacement de probe_items.metadata_json et detached_storage_container_items.metadata_json par des colonnes relationnelles pour la fabrication, le bonus de capacité et la source de restauration; seules les métadonnées administratives rares restent dans audit_metadata_json. Exécuter php scripts/one-shot-scripts/migrate-item-metadata-storage.php --database-config=var/database-prod.json avant de déployer le nouveau code.