build(gate): forbid production code from importing authoring tools

The architecture check scans tools/ for duplicate class names and fails
when game/ or content/ references res://tools/. The three tools scripts
drop their global class_name (every caller preloads them), and ADR 0012
records that tools/ depends on the domain only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
OlivierandClaude Opus 5.5 committed 2026-10-06 20:57:00 +02:00
1 parent 30cc2f635f
commit dbd207ef1b
5 files changed
+11 -4

No files matched your search

@@ -30,7 +30,9 @@ dépôt et sa production.
(plateau, crête, piton, sillon, rupture de pente, rides, rugosité (plateau, crête, piton, sillon, rupture de pente, rides, rugosité
déterministe par graine). La recette est le document d'auteur versionné ; déterministe par graine). La recette est le document d'auteur versionné ;
le résultat est écrit en `.res` binaire sous `content/sites/`. Le jeu ne le résultat est écrit en `.res` binaire sous `content/sites/`. Le jeu ne
génère jamais de terrain à l'exécution. génère jamais de terrain à l'exécution. `tools/` dépend du domaine
(`game/domain/`) et de rien d'autre ; aucun code sous `game/` ou `content/`
ne dépend de `tools/`, ce que la barrière d'architecture vérifie.
4. Un PNG 16 bits n'est pas utilisé pour les hauteurs : le chargeur d'images 4. Un PNG 16 bits n'est pas utilisé pour les hauteurs : le chargeur d'images
de Godot ramène les PNG 16 bits en 8 bits, soit des marches de 0,27 m sur de Godot ramène les PNG 16 bits en 8 bits, soit des marches de 0,27 m sur
68 m de dénivelé. Un PNG 8 bits de prévisualisation est produit pour la 68 m de dénivelé. Un PNG 8 bits de prévisualisation est produit pour la
+8
View File
@@ -38,6 +38,9 @@ source_directories="src tests"
if [ -d game ]; then if [ -d game ]; then
source_directories="$source_directories game" source_directories="$source_directories game"
fi fi
if [ -d tools ]; then
source_directories="$source_directories tools"
fi
duplicate_classes="$( duplicate_classes="$(
rg --no-filename -o \ rg --no-filename -o \
@@ -57,6 +60,11 @@ if [ -d game ]; then
test_imports="$(rg -n 'res://tests/' game --glob '*.gd' || true)" test_imports="$(rg -n 'res://tests/' game --glob '*.gd' || true)"
fail_with_matches "production imports test code" "$test_imports" fail_with_matches "production imports test code" "$test_imports"
tool_imports="$(
rg -n 'res://tools/' game content --glob '*.gd' --glob '*.tscn' --glob '*.tres' 2>/dev/null || true
)"
fail_with_matches "production imports authoring tools" "$tool_imports"
poc_references="$(rg -n 'poc_[ab]|POC_[AB]' game --glob '*.gd' --glob '*.tscn' || true)" poc_references="$(rg -n 'poc_[ab]|POC_[AB]' game --glob '*.gd' --glob '*.tscn' || true)"
fail_with_matches "production contains a prototype dependency" "$poc_references" fail_with_matches "production contains a prototype dependency" "$poc_references"
-1
View File
@@ -1,4 +1,3 @@
class_name SiteTerrainBaker
extends RefCounted extends RefCounted
const SonarMaterial = preload("res://game/domain/sonar/sonar_material.gd") const SonarMaterial = preload("res://game/domain/sonar/sonar_material.gd")
@@ -1,4 +1,3 @@
class_name VehicleTestTerrainRecipe
extends RefCounted extends RefCounted
const SiteTerrainBaker = preload("res://tools/site_terrain_baker.gd") const SiteTerrainBaker = preload("res://tools/site_terrain_baker.gd")
-1
View File
@@ -1,4 +1,3 @@
class_name Zone1VigilantRecipe
extends RefCounted extends RefCounted
const SiteTerrainBaker = preload("res://tools/site_terrain_baker.gd") const SiteTerrainBaker = preload("res://tools/site_terrain_baker.gd")