{
 "id": "kx-style-kit",
 "name": "Charte KX — kit de style cargo",
 "version": "1.0",
 "_doc": "Métriques imposées à tous les composants, modules et coques. Lues par src/kit_*.py, vérifiées par tools/kit_lint.py. Unités : mètres (modèle), millimètres (feuille SVG).",
 "grid": {
  "U": 0.25,
  "u": 0.05,
  "_rule": "Toute cote structurelle (enveloppe, slot, plaque, nervure, cadre) est un multiple de u = U/5. Les têtes de rivets et biseaux XS sont des exceptions micro listées ici."
 },
 "slots": {
  "C1": {
   "L": 3.0,
   "W": 2.0,
   "H": 2.0,
   "label": "Slot simple C1 (12U × 8U × 8U)"
  },
  "C2": {
   "L": 6.25,
   "W": 2.0,
   "H": 2.0,
   "label": "Slot double C2 (25U × 8U × 8U) = 2 × C1 + 1 nervure"
  },
  "clearance": 0.05,
  "rib_gap": 0.25,
  "_rule": "Un module occupe le slot moins le jeu (0,05 m par face). Deux slots C1 consécutifs sont séparés d'une nervure de 1U ; C2 = 2 × C1 + 1U, donc un C2 remplace exactement deux C1 alignés."
 },
 "interface": {
  "name": "KX-4",
  "casting": {
   "size": 0.2,
   "bevel": 0.025,
   "slot_hole": [
    0.1,
    0.05
   ]
  },
  "twistlock_inset": 0.1,
  "umbilical": {
   "r": 0.15,
   "bolts": 6,
   "pos": [
    0,
    0
   ]
  },
  "plate_t": 0.05,
  "_rule": "8 pièces de coin KX (cube 0,20 biseauté) aux coins de l'enveloppe module. 4 verrous tournants au plancher du slot sous les coins bas (retrait 0,10), 4 bras de serrage en tête sous les coins hauts, 1 prise ombilicale Ø0,30 au centre du plancher."
 },
 "rivet": {
  "micro": {
   "d": 0.03,
   "h": 0.012,
   "pitch": 0.15,
   "edge": 0.05,
   "segs": 6
  },
  "macro": {
   "d": 0.06,
   "h": 0.02,
   "pitch": 0.3,
   "edge": 0.1,
   "segs": 6
  },
  "_rule": "Rangée centrée : n = floor((L − 2·edge)/pitch) + 1, pas constant, marge ≥ edge. Macro = micro × 2 (coques)."
 },
 "bevel": {
  "angle_deg": 45,
  "sizes": {
   "XXS": 0.01,
   "XS": 0.025,
   "S": 0.05,
   "M": 0.1,
   "L": 0.2,
   "XL": 0.4
  },
  "ratio": 0.1,
  "_rule": "Biseau toujours à 45°. Taille = 1/10 de la plus petite dimension de la pièce, arrondie à la taille normalisée inférieure (minimum XXS)."
 },
 "plates": {
  "module": 0.5,
  "hull": 1.0,
  "seam_w": 0.01,
  "_rule": "Joints de bordé tous les 2U sur les modules, 4U sur les coques ; joints alignés sur la grille d'origine de la pièce."
 },
 "frame": {
  "rail": 0.1,
  "rail_bevel": 0.025,
  "rib_t": 0.1,
  "rib_d": 0.2,
  "rib_pitch": 0.5
 },
 "markings": {
  "band_h": 0.15,
  "band_z": 1.45,
  "hazard_w": 0.1,
  "id_h": 0.2
 },
 "palette": {
  "bg": "#0a1a33",
  "ink": "#eef7ff",
  "cyan": "#62d6ff",
  "dim": "#7fd6ff",
  "muted": "#7f9cc4",
  "marking": "#ffad5c",
  "slot": "#ff9a3c",
  "cut": "#ff6f61",
  "hull": "#c9ccd2",
  "frame": "#3a3f4a",
  "plate": "#9aa3b0",
  "iface": "#f2b705",
  "rock": "#4a3f36",
  "codes": {
   "LIQ": "#2f7fd0",
   "BOX": "#e0573a",
   "ORE": "#c8962e",
   "CRYO": "#8fd3ff",
   "BIO": "#b06ad8"
  },
  "_rule": "Aucun vert (teinte 70°–170°) nulle part : art, UI, SVG. Vérifié par kit_lint."
 },
 "strokes": {
  "outline": 0.35,
  "detail": 0.2,
  "seam": 0.1,
  "hidden": 0.13,
  "slot": 0.3,
  "hatch": 0.12,
  "dash_hidden": "1.2 0.8",
  "dash_slot": "2.4 1.2",
  "dash_axis": "6 1.2 1 1.2",
  "view_scale": {
   "ortho": 1.0,
   "iso": 0.85,
   "detail": 1.3
  },
  "hatch_spacing": 1.2,
  "hatch_angle": 45
 },
 "type": {
  "family": "IBM Plex Sans Condensed",
  "mono": "IBM Plex Mono",
  "title": 6.2,
  "label": 2.4,
  "callout": 2.2,
  "slot_id": 3.2,
  "small": 1.8
 },
 "scale_classes": {
  "micro": {
   "rivet": "micro",
   "bevel": [
    "XXS",
    "XS",
    "S"
   ],
   "plate": "module"
  },
  "macro": {
   "rivet": "macro",
   "bevel": [
    "M",
    "L",
    "XL"
   ],
   "plate": "hull"
  }
 },
 "budget": {
  "_doc": "Plafonds de triangles par classe d'objet (mesh plein, hors filaire). Vérifiés par src/chain/chain_qa.py sur build/kit/manifest/*.dims.json.",
  "triangles": {
   "component": 2500,
   "module": 20000,
   "hull": 45000,
   "assembly": 100000
  }
 },
 "gameplay": {
  "_doc": "Fiche gameplay calculée (src/chain/chain_gameplay.py). Volume utile = enveloppe du module (manifeste) × usable ; charge = volume utile × densité de la denrée ; masse module = tare + charge ; masse assemblage = coque à vide + Σ modules ; coût = coque + Σ modules. Tares et masses à vide alignées sur specs/kit/stats.json (configurateur) ; densités choisies pour retrouver ses charges pleines à 1 % près.",
  "units": {
   "mass": "t",
   "volume": "m³",
   "density": "t/m³",
   "cost": "cr"
  },
  "cargo": {
   "LIQ": {
    "density": 1.0,
    "label": "liquides"
   },
   "BOX": {
    "density": 0.6,
    "label": "fret sec"
   },
   "ORE": {
    "density": 2.33,
    "label": "minerai"
   },
   "CRYO": {
    "density": 0.69,
    "label": "cryogénie"
   },
   "BIO": {
    "density": 0.32,
    "label": "vivant"
   }
  },
  "modules": {
   "mod_liq": {
    "usable": 0.75,
    "tare_t": 2.2,
    "cost_cr": 700
   },
   "mod_box": {
    "usable": 0.935,
    "tare_t": 2.4,
    "cost_cr": 900
   },
   "mod_ore": {
    "usable": 0.56,
    "tare_t": 3.1,
    "cost_cr": 500
   },
   "mod_cryo": {
    "usable": 0.61,
    "tare_t": 3.4,
    "cost_cr": 1800
   },
   "mod_bio": {
    "usable": 0.975,
    "tare_t": 6.8,
    "cost_cr": 3200
   }
  },
  "hulls": {
   "hull_s": {
    "dry_t": 18.0,
    "cost_cr": 7000
   },
   "hull_m": {
    "dry_t": 34.0,
    "cost_cr": 12000
   },
   "hull_l": {
    "dry_t": 46.0,
    "cost_cr": 19000
   }
  }
 }
}