@elite-dangerous-almanac/core 0.1.0-beta.9 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +71 -12
  2. package/PROVENANCE/ships/SOURCES.md +74 -48
  3. package/README.md +34 -2
  4. package/THIRD_PARTY_NOTICES.md +3 -3
  5. package/dist/astro/codex-region-lookup.js +1 -1
  6. package/dist/astro/codex-region.js +1 -1
  7. package/dist/astro/galaxy-grid.js +1 -1
  8. package/dist/astro/index.js +1 -1
  9. package/dist/astro/mass-code.js +1 -1
  10. package/dist/astro/naming-region-origins.js +1 -1
  11. package/dist/astro/nebulae.js +1 -1
  12. package/dist/astro/permit-locked-regions.js +1 -1
  13. package/dist/astro/permit-locked-systems.js +1 -1
  14. package/dist/astro/permit-locks.js +1 -1
  15. package/dist/astro/procedural-system.js +1 -1
  16. package/dist/astro/sector-name.js +1 -1
  17. package/dist/astro/system-address-input.js +1 -1
  18. package/dist/astro/system-address.js +1 -1
  19. package/dist/astro/system-name.js +1 -1
  20. package/dist/{chunk-KQDJTDLV.js → chunk-2J2UV4ZX.js} +1 -1
  21. package/dist/{chunk-DB54PH3X.js → chunk-6EPYVBAX.js} +1 -1
  22. package/dist/{chunk-U6TMCYA6.js → chunk-6EUVIZAS.js} +1 -1
  23. package/dist/chunk-6RLMBSXE.js +1 -0
  24. package/dist/chunk-6RLMBSXE.js.map +1 -0
  25. package/dist/{chunk-NWPK6Q3S.js → chunk-ADLVPKUV.js} +1 -1
  26. package/dist/{chunk-S4DBNX2B.js → chunk-BKWLI44T.js} +1 -1
  27. package/dist/chunk-BMM6GQAU.js +1 -0
  28. package/dist/chunk-BMM6GQAU.js.map +1 -0
  29. package/dist/{chunk-WV5YM7H5.js → chunk-BMT3U46U.js} +1 -1
  30. package/dist/chunk-CTJQPQRA.js +1 -0
  31. package/dist/{chunk-NSSWYRHN.js.map → chunk-CTJQPQRA.js.map} +1 -1
  32. package/dist/chunk-DAQ3PJ4R.js +1 -0
  33. package/dist/chunk-DAQ3PJ4R.js.map +1 -0
  34. package/dist/{chunk-BTPV5CIF.js → chunk-DI5RXSJR.js} +1 -1
  35. package/dist/{chunk-YDBRGW4G.js → chunk-DLLBARN5.js} +1 -1
  36. package/dist/{chunk-J2PNZQY4.js → chunk-DVL5RBKX.js} +1 -1
  37. package/dist/{chunk-VXVUEF5U.js → chunk-E3BRVGJJ.js} +1 -1
  38. package/dist/{chunk-MFV4VZFP.js → chunk-EBAHNZ36.js} +1 -1
  39. package/dist/{chunk-BSOIPL4A.js → chunk-EJMNNQIS.js} +1 -1
  40. package/dist/{chunk-BSOIPL4A.js.map → chunk-EJMNNQIS.js.map} +1 -1
  41. package/dist/{chunk-QF3NYGUJ.js → chunk-EKWLAHRG.js} +1 -1
  42. package/dist/chunk-EU42PAV4.js +1 -0
  43. package/dist/{chunk-32PVERNH.js.map → chunk-EU42PAV4.js.map} +1 -1
  44. package/dist/{chunk-Q22LXT53.js → chunk-FEER4ERG.js} +1 -1
  45. package/dist/{chunk-G3AMKCOE.js → chunk-FGNJ7EVM.js} +1 -1
  46. package/dist/{chunk-JWJ7RSZC.js → chunk-G3265B27.js} +1 -1
  47. package/dist/chunk-GKDEI2SQ.js +1 -0
  48. package/dist/chunk-GKDEI2SQ.js.map +1 -0
  49. package/dist/chunk-GOMBLS2T.js +1 -0
  50. package/dist/chunk-GOMBLS2T.js.map +1 -0
  51. package/dist/{chunk-V3DW67W2.js → chunk-GRIK3EDH.js} +1 -1
  52. package/dist/chunk-H3HMVGEY.js +1 -0
  53. package/dist/chunk-H3HMVGEY.js.map +1 -0
  54. package/dist/{chunk-UXZJMZEU.js → chunk-HRVIHQ4A.js} +1 -1
  55. package/dist/{chunk-QTDBO7R2.js → chunk-IYU4WLFM.js} +1 -1
  56. package/dist/{chunk-5EUX3L76.js → chunk-JWWYAMGD.js} +1 -1
  57. package/dist/chunk-KAA4VOOB.js +1 -0
  58. package/dist/chunk-KAA4VOOB.js.map +1 -0
  59. package/dist/{chunk-ZFT56QFR.js → chunk-L7CLUYZ6.js} +1 -1
  60. package/dist/{chunk-4AE22CHV.js → chunk-M5IBENCW.js} +1 -1
  61. package/dist/chunk-M5IBENCW.js.map +1 -0
  62. package/dist/{chunk-IH4NXKVW.js → chunk-NEEFT7WH.js} +1 -1
  63. package/dist/{chunk-VZXL5KBR.js → chunk-NLBUKXNV.js} +1 -1
  64. package/dist/{chunk-4OSCSACF.js → chunk-OCND33TO.js} +1 -1
  65. package/dist/{chunk-PMJG7PHU.js → chunk-PHPLZEFS.js} +1 -1
  66. package/dist/chunk-PKWVG2JY.js +1 -0
  67. package/dist/chunk-PKWVG2JY.js.map +1 -0
  68. package/dist/chunk-PNZCLQDJ.js +1 -0
  69. package/dist/{chunk-53ERRGPM.js.map → chunk-PNZCLQDJ.js.map} +1 -1
  70. package/dist/{chunk-DACZE3HX.js → chunk-POZTXBSN.js} +1 -1
  71. package/dist/chunk-Q4E2V6RE.js +1 -0
  72. package/dist/chunk-Q4E2V6RE.js.map +1 -0
  73. package/dist/{chunk-DNTN34M4.js → chunk-QI22FKBG.js} +1 -1
  74. package/dist/chunk-QTZPA2FR.js +1 -0
  75. package/dist/{chunk-TH4S5MVD.js.map → chunk-QTZPA2FR.js.map} +1 -1
  76. package/dist/{chunk-MNXWK7PA.js → chunk-R26GVRMI.js} +1 -1
  77. package/dist/{chunk-I7PIDRMU.js → chunk-RAO35XDF.js} +1 -1
  78. package/dist/chunk-TFPIPIMU.js +1 -0
  79. package/dist/chunk-TFPIPIMU.js.map +1 -0
  80. package/dist/chunk-TLA6LHLN.js +1 -0
  81. package/dist/{chunk-V4C6FIE2.js.map → chunk-TLA6LHLN.js.map} +1 -1
  82. package/dist/{chunk-JYQE53FL.js → chunk-TMMGS6TC.js} +1 -1
  83. package/dist/{chunk-ZAHNOQGG.js → chunk-UBYO7VZR.js} +1 -1
  84. package/dist/{chunk-Z4GTTB7I.js → chunk-UXBCLFGU.js} +1 -1
  85. package/dist/{chunk-RKLJ7EEE.js → chunk-UXFMVZAY.js} +1 -1
  86. package/dist/chunk-VB3XZGIB.js +1 -0
  87. package/dist/chunk-VB3XZGIB.js.map +1 -0
  88. package/dist/chunk-VKN65H2U.js +1 -0
  89. package/dist/chunk-VKN65H2U.js.map +1 -0
  90. package/dist/chunk-VSNS7Y3M.js +1 -0
  91. package/dist/chunk-VSNS7Y3M.js.map +1 -0
  92. package/dist/{chunk-MPZGCTRG.js → chunk-VZZUNSDF.js} +1 -1
  93. package/dist/chunk-VZZUNSDF.js.map +1 -0
  94. package/dist/{chunk-ZJB5UYNE.js → chunk-W5G2NUCZ.js} +1 -1
  95. package/dist/{chunk-ZJB5UYNE.js.map → chunk-W5G2NUCZ.js.map} +1 -1
  96. package/dist/{chunk-IJRKEODR.js → chunk-WNGQ3IAM.js} +1 -1
  97. package/dist/{chunk-VARPO47V.js → chunk-XN6Q7LWU.js} +1 -1
  98. package/dist/chunk-XT6KKGSE.js +1 -0
  99. package/dist/chunk-XT6KKGSE.js.map +1 -0
  100. package/dist/{chunk-KMFUCORC.js → chunk-Y6UZWNP4.js} +1 -1
  101. package/dist/{chunk-QMQHIZGS.js → chunk-YU5GND2Q.js} +1 -1
  102. package/dist/chunk-YU5GND2Q.js.map +1 -0
  103. package/dist/commodities/commodities.js +1 -1
  104. package/dist/commodities/index.js +1 -1
  105. package/dist/equipment/index.js +1 -1
  106. package/dist/equipment/modification-costs.js +1 -1
  107. package/dist/equipment/modification-journal.js +1 -1
  108. package/dist/equipment/modifications.js +1 -1
  109. package/dist/equipment/suits.js +1 -1
  110. package/dist/equipment/upgrade-costs.js +1 -1
  111. package/dist/equipment/weapons.js +1 -1
  112. package/dist/i18n/blueprints.js +1 -1
  113. package/dist/i18n/diagnostics.d.ts +62 -0
  114. package/dist/i18n/diagnostics.js +1 -0
  115. package/dist/i18n/diagnostics.js.map +1 -0
  116. package/dist/i18n/engineering-groups.d.ts +20 -0
  117. package/dist/i18n/engineering-groups.js +1 -0
  118. package/dist/i18n/engineering-groups.js.map +1 -0
  119. package/dist/i18n/experimental-effect-descriptions.d.ts +20 -0
  120. package/dist/i18n/experimental-effect-descriptions.js +1 -0
  121. package/dist/i18n/experimental-effect-descriptions.js.map +1 -0
  122. package/dist/i18n/experimental-effects.js +1 -1
  123. package/dist/i18n/index.d.ts +27 -0
  124. package/dist/i18n/index.js +1 -1
  125. package/dist/i18n/materials.js +1 -1
  126. package/dist/i18n/micro-resources.js +1 -1
  127. package/dist/i18n/modules.js +1 -1
  128. package/dist/i18n/pre-engineered.d.ts +39 -0
  129. package/dist/i18n/pre-engineered.js +1 -0
  130. package/dist/i18n/pre-engineered.js.map +1 -0
  131. package/dist/i18n/ships.d.ts +36 -0
  132. package/dist/i18n/ships.js +1 -0
  133. package/dist/i18n/ships.js.map +1 -0
  134. package/dist/i18n/slots.d.ts +42 -0
  135. package/dist/i18n/slots.js +1 -0
  136. package/dist/i18n/slots.js.map +1 -0
  137. package/dist/materials/index.js +1 -1
  138. package/dist/materials/materials-all.js +1 -1
  139. package/dist/materials/materials.js +1 -1
  140. package/dist/materials/micro-resources-all.js +1 -1
  141. package/dist/materials/micro-resources.js +1 -1
  142. package/dist/ships/blueprint-costs.d.ts +13 -11
  143. package/dist/ships/blueprint-costs.js +1 -1
  144. package/dist/ships/blueprint-costs.js.map +1 -1
  145. package/dist/ships/blueprint-journal.d.ts +6 -7
  146. package/dist/ships/blueprint-journal.js +1 -1
  147. package/dist/ships/blueprints.js +1 -1
  148. package/dist/ships/default-loadouts.js +1 -1
  149. package/dist/ships/engineering-options.d.ts +28 -29
  150. package/dist/ships/engineering-options.js +1 -1
  151. package/dist/ships/experimental-effect-costs.js +1 -1
  152. package/dist/ships/experimental-effects.js +1 -1
  153. package/dist/ships/gunsights.js +1 -1
  154. package/dist/ships/heat.d.ts +22 -0
  155. package/dist/ships/heat.js +1 -1
  156. package/dist/ships/index.d.ts +6 -5
  157. package/dist/ships/index.js +1 -1
  158. package/dist/ships/loadout-calculations.d.ts +21 -11
  159. package/dist/ships/loadout-calculations.js +1 -1
  160. package/dist/ships/loadout-validation.d.ts +7 -6
  161. package/dist/ships/loadout-validation.js +1 -1
  162. package/dist/ships/modules-all.js +1 -1
  163. package/dist/ships/modules-hardpoint.js +1 -1
  164. package/dist/ships/modules-internal.js +1 -1
  165. package/dist/ships/modules.d.ts +5 -5
  166. package/dist/ships/modules.js +1 -1
  167. package/dist/ships/power.d.ts +39 -11
  168. package/dist/ships/power.js +1 -1
  169. package/dist/ships/pre-engineered-stats.d.ts +20 -4
  170. package/dist/ships/pre-engineered-stats.js +1 -1
  171. package/dist/ships/pre-engineered.d.ts +7 -8
  172. package/dist/ships/pre-engineered.js +1 -1
  173. package/dist/ships/shield-recovery.d.ts +12 -6
  174. package/dist/ships/shield-recovery.js +1 -1
  175. package/dist/ships/ship-loadout.d.ts +1793 -19
  176. package/dist/ships/ship-loadout.js +1 -1
  177. package/dist/ships/ships.js +1 -1
  178. package/dist/ships/slef.js +1 -1
  179. package/dist/ships/slots.js +1 -1
  180. package/dist/ships/source-purchase.js +1 -1
  181. package/package.json +26 -2
  182. package/dist/chunk-32PVERNH.js +0 -1
  183. package/dist/chunk-4AE22CHV.js.map +0 -1
  184. package/dist/chunk-4WC5NHBJ.js +0 -1
  185. package/dist/chunk-4WC5NHBJ.js.map +0 -1
  186. package/dist/chunk-53ERRGPM.js +0 -1
  187. package/dist/chunk-5W43EQEQ.js +0 -1
  188. package/dist/chunk-5W43EQEQ.js.map +0 -1
  189. package/dist/chunk-76XKY2Y2.js +0 -1
  190. package/dist/chunk-76XKY2Y2.js.map +0 -1
  191. package/dist/chunk-B5TT26XE.js +0 -1
  192. package/dist/chunk-B5TT26XE.js.map +0 -1
  193. package/dist/chunk-BYBT5XSW.js +0 -1
  194. package/dist/chunk-BYBT5XSW.js.map +0 -1
  195. package/dist/chunk-KLIYDSYF.js +0 -1
  196. package/dist/chunk-KLIYDSYF.js.map +0 -1
  197. package/dist/chunk-MPZGCTRG.js.map +0 -1
  198. package/dist/chunk-NSSWYRHN.js +0 -1
  199. package/dist/chunk-QMQHIZGS.js.map +0 -1
  200. package/dist/chunk-RF2IKLWQ.js +0 -1
  201. package/dist/chunk-RF2IKLWQ.js.map +0 -1
  202. package/dist/chunk-TH4S5MVD.js +0 -1
  203. package/dist/chunk-V4C6FIE2.js +0 -1
  204. package/dist/ship-loadout-BsfKbvKe.d.ts +0 -1455
  205. /package/dist/{chunk-KQDJTDLV.js.map → chunk-2J2UV4ZX.js.map} +0 -0
  206. /package/dist/{chunk-DB54PH3X.js.map → chunk-6EPYVBAX.js.map} +0 -0
  207. /package/dist/{chunk-U6TMCYA6.js.map → chunk-6EUVIZAS.js.map} +0 -0
  208. /package/dist/{chunk-NWPK6Q3S.js.map → chunk-ADLVPKUV.js.map} +0 -0
  209. /package/dist/{chunk-S4DBNX2B.js.map → chunk-BKWLI44T.js.map} +0 -0
  210. /package/dist/{chunk-WV5YM7H5.js.map → chunk-BMT3U46U.js.map} +0 -0
  211. /package/dist/{chunk-BTPV5CIF.js.map → chunk-DI5RXSJR.js.map} +0 -0
  212. /package/dist/{chunk-YDBRGW4G.js.map → chunk-DLLBARN5.js.map} +0 -0
  213. /package/dist/{chunk-J2PNZQY4.js.map → chunk-DVL5RBKX.js.map} +0 -0
  214. /package/dist/{chunk-VXVUEF5U.js.map → chunk-E3BRVGJJ.js.map} +0 -0
  215. /package/dist/{chunk-MFV4VZFP.js.map → chunk-EBAHNZ36.js.map} +0 -0
  216. /package/dist/{chunk-QF3NYGUJ.js.map → chunk-EKWLAHRG.js.map} +0 -0
  217. /package/dist/{chunk-Q22LXT53.js.map → chunk-FEER4ERG.js.map} +0 -0
  218. /package/dist/{chunk-G3AMKCOE.js.map → chunk-FGNJ7EVM.js.map} +0 -0
  219. /package/dist/{chunk-JWJ7RSZC.js.map → chunk-G3265B27.js.map} +0 -0
  220. /package/dist/{chunk-V3DW67W2.js.map → chunk-GRIK3EDH.js.map} +0 -0
  221. /package/dist/{chunk-UXZJMZEU.js.map → chunk-HRVIHQ4A.js.map} +0 -0
  222. /package/dist/{chunk-QTDBO7R2.js.map → chunk-IYU4WLFM.js.map} +0 -0
  223. /package/dist/{chunk-5EUX3L76.js.map → chunk-JWWYAMGD.js.map} +0 -0
  224. /package/dist/{chunk-ZFT56QFR.js.map → chunk-L7CLUYZ6.js.map} +0 -0
  225. /package/dist/{chunk-IH4NXKVW.js.map → chunk-NEEFT7WH.js.map} +0 -0
  226. /package/dist/{chunk-VZXL5KBR.js.map → chunk-NLBUKXNV.js.map} +0 -0
  227. /package/dist/{chunk-4OSCSACF.js.map → chunk-OCND33TO.js.map} +0 -0
  228. /package/dist/{chunk-PMJG7PHU.js.map → chunk-PHPLZEFS.js.map} +0 -0
  229. /package/dist/{chunk-DACZE3HX.js.map → chunk-POZTXBSN.js.map} +0 -0
  230. /package/dist/{chunk-DNTN34M4.js.map → chunk-QI22FKBG.js.map} +0 -0
  231. /package/dist/{chunk-MNXWK7PA.js.map → chunk-R26GVRMI.js.map} +0 -0
  232. /package/dist/{chunk-I7PIDRMU.js.map → chunk-RAO35XDF.js.map} +0 -0
  233. /package/dist/{chunk-JYQE53FL.js.map → chunk-TMMGS6TC.js.map} +0 -0
  234. /package/dist/{chunk-ZAHNOQGG.js.map → chunk-UBYO7VZR.js.map} +0 -0
  235. /package/dist/{chunk-Z4GTTB7I.js.map → chunk-UXBCLFGU.js.map} +0 -0
  236. /package/dist/{chunk-RKLJ7EEE.js.map → chunk-UXFMVZAY.js.map} +0 -0
  237. /package/dist/{chunk-IJRKEODR.js.map → chunk-WNGQ3IAM.js.map} +0 -0
  238. /package/dist/{chunk-VARPO47V.js.map → chunk-XN6Q7LWU.js.map} +0 -0
  239. /package/dist/{chunk-KMFUCORC.js.map → chunk-Y6UZWNP4.js.map} +0 -0
@@ -107,31 +107,90 @@ translation.
107
107
  same Brazilian Portuguese game text. `pt-BR` lookups resolve these values through the
108
108
  regional-to-language fallback.
109
109
 
110
- ## Deliberate absence: ship names
110
+ ## `ship-names.jsonc`
111
111
 
112
- - **Acquired:** 2026-08-14 UTC.
112
+ - **Acquired:** 2026-08-18 UTC.
113
113
  - **Odyssey Materials Helper revision:** commit
114
114
  `23343c453938e724f317c56e9eb7db0dbfa71f78`;
115
115
  `application/src/main/resources/locale/ships/ships.csv` has SHA-256
116
116
  `6785f7cea00f36ca0a853091fd88f8ed5481a60f55c269643bff1ab0c3d6993d`.
117
117
  - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
118
118
  database version `424009901`, last-modified marker `20260810`.
119
- - **Evaluation:** each of the 48 current ship symbols is joined to Odyssey Materials
119
+ - **Derivation:** each of the 48 current ship symbols and canonical English names comes
120
+ from `data/ships/ships.jsonc`. The symbol is joined to Odyssey Materials
120
121
  Helper's `ships.name.*` key after removing punctuation and folding case. EDSY's
121
122
  `eddb.js` `ship.fdname` supplies the second join, with explicit `ship-<id>` language
122
123
  entries filling locales absent from the CSV. The resulting source-backed coverage is
123
- 44 ships in Spanish, 42 in French, 38 in Portuguese, 45 in Russian and 44 in Chinese;
124
+ 48 ships in Spanish, 44 in French, 38 in Portuguese, 48 in Russian, 48 in
125
+ Simplified Chinese and 47 in Georgian;
124
126
  no accepted source carries a German ship-name table.
125
- - **Standing conclusion:** all 213 resulting non-English values are byte-for-byte equal
126
- to the canonical English ship names. A ship-name localization catalogue would
127
- therefore publish no translated information and is deliberately absent. A source
128
- carrying at least one genuinely localized ship name would justify revisiting this
129
- conclusion.
127
+ - **Standing conclusion:** every source-backed non-English value is byte-for-byte equal
128
+ to the canonical English ship name. The explicit values remain in the catalogue so a
129
+ lookup distinguishes a source-backed same spelling from an unavailable translation.
130
+ - **Manual corrections:** none.
131
+
132
+ ## `ship-manufacturer-names.jsonc`
133
+
134
+ - **Acquired:** 2026-08-18 UTC.
135
+ - **Derivation:** all 48 symbol-to-manufacturer values are projected directly from
136
+ `data/ships/ships.jsonc`, whose pinned sources and corrections are recorded in
137
+ `data/ships/SOURCES.md`. Repeated manufacturer strings remain keyed by ship symbol so
138
+ consumers need no separate manufacturer identity space.
139
+ - **Coverage:** canonical English covers every ship. The accepted sources carry no
140
+ localized manufacturer labels.
141
+ - **Manual corrections:** none.
142
+
143
+ ## `engineering-group-names.jsonc`
144
+
145
+ - **Acquired:** 2026-08-18 UTC.
146
+ - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
147
+ database version `424009901`, last-modified marker `20260810`; `lang-en.json`,
148
+ `lang-pt.json` and `lang-ru.json` have Git blob ids
149
+ `9b199db635f7b968b75c8e9a14bdce68e37e4120`,
150
+ `493fa09c4d4a11f0282e1e4076a67fed8d7f317e` and
151
+ `36496372d056754c34da03ca6836e27987c96b6a` respectively.
152
+ - **Derivation:** each of the 48 group ids and its canonical English name is projected
153
+ from `data/ships/engineering-options.jsonc`. That catalogue derives its group menus
154
+ from EDSY, with the supplemental sources and corrections recorded in
155
+ `data/ships/SOURCES.md`. Where a canonical English name matches an EDSY `mtype-*`
156
+ value in `lang-en.json` byte-for-byte and uniquely, explicit values with the same key
157
+ are copied from `lang-pt.json` and `lang-ru.json`.
158
+ - **Coverage:** canonical English covers every engineering option group. Portuguese and
159
+ Russian each cover 44 of 48. The Guardian power-plant, power-distributor and
160
+ hull-reinforcement groups have no distinct EDSY label, and EDSY carries no Portuguese
161
+ or Russian value for `frameShiftDrivesSCO`.
162
+ - **Manual corrections:** none.
163
+
164
+ ## `experimental-effect-descriptions.jsonc`
165
+
166
+ - **Acquired:** 2026-08-18 UTC.
167
+ - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
168
+ database version `424009901`, last-modified marker `20260810`.
169
+ - **Derivation:** the 29 effects with a `description` project that canonical English
170
+ value from `data/ships/experimental-effects.jsonc`. Effects without a source-backed
171
+ description remain absent rather than receiving generated prose.
172
+ - **Coverage:** canonical English covers 29 of 86 effects. The accepted sources carry no
173
+ localized description table.
174
+ - **Manual corrections:** none.
175
+
176
+ ## `pre-engineered-variant-names.jsonc`
177
+
178
+ - **Acquired:** 2026-08-18 UTC.
179
+ - **Derivation:** all 76 compound identities and English names come from
180
+ `data/ships/pre-engineered.jsonc`. An identity combines the base module symbol,
181
+ blueprint, optional experimental effect and acquisition route. When a variant name
182
+ exactly matches its base module's canonical name, it reuses that record from
183
+ `module-names.jsonc`; the 28 distinct display records are stored once. Fixed reward
184
+ names such as the three `Decorative_*` festive launchers remain canonical English.
185
+ - **Coverage:** English covers every variant. Ordinary names inherit the explicit
186
+ localized values available for their base module; fixed reward names have no accepted
187
+ translation source.
130
188
  - **Manual corrections:** none.
131
189
 
132
190
  ## Known gaps
133
191
 
134
192
  Localized coverage follows the accepted sources and is not complete for every catalogue or
135
- locale. Missing values are observable as `null`, never an English fallback. Expanding
136
- source-backed coverage, localized slot labels and higher-level generated text remains
137
- tracked by [#245](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/245).
193
+ locale. The accepted sources carry only canonical English for some engineering-group labels,
194
+ slot and restriction labels, fixed reward names, and structured loadout, calculation, SLEF
195
+ and edit messages. Missing source-backed translations remain tracked by
196
+ [#320](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/320).
@@ -379,11 +379,11 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
379
379
  II's `Int_MkIIAgileBoost_Engine_*` thrusters.
380
380
  - **A fuel tank is the one module built for two kinds of mount:** it is `fuelTank`
381
381
  and also fits any optional slot large enough, exactly as the game sells it.
382
- - **`kind` is the ordinary engineering-menu family.** The 1026 records mapped by
382
+ - **`kind` is the ordinary engineering-menu family.** The 1005 records mapped by
383
383
  `engineering-options.jsonc` repeat that map's group key in the compact on-disk `kind`
384
- field. Of the remaining 173 records, 171 carry no `kind` because the pinned sources
385
- publish no engineering family for them; the fixed Mining Laser and Abrasion Blaster
386
- omit the family as the in-game correction documented under Engineering options below.
384
+ field. The remaining 194 records carry no `kind` because they have no ordinary
385
+ engineering menu; this includes the five Enzyme/AX weapons, the fixed Mining Laser and
386
+ Abrasion Blaster, and the 16 cargo racks documented under Engineering options below.
387
387
  The group source, derivation, split
388
388
  Guardian families and coverage are documented under Engineering options below; this
389
389
  field is a projection of that map, not a separate classification source.
@@ -1100,8 +1100,9 @@ up straight through with no disambiguation at all. Both paths are evidence that
1100
1100
  qualitative descriptions), and `experimental-effect-costs.jsonc` (the matching
1101
1101
  one-application material costs).
1102
1102
  Stored modifier labels use journal `Modifier` **Labels**. Each blueprint is `{ name, grades }`
1103
- (each grade `{ features, damageDistribution? }`), with its cost file keyed by the same
1104
- blueprint and grade ids. Each experimental effect is
1103
+ (each grade `{ features, damageDistribution? }`). The cost file uses the same ids and
1104
+ grades for the craftable subset; fixed reward identities without an ordinary cost are
1105
+ absent. Each experimental effect is
1105
1106
  `{ name, modifiers, damageDistribution?, description? }`, with its cost file keyed by
1106
1107
  the same effect ids.
1107
1108
  - **Display names:** each blueprint and experimental effect carries its `name`.
@@ -1150,8 +1151,11 @@ up straight through with no disambiguation at all. Both paths are evidence that
1150
1151
  resolves each to the material's Frontier `symbol` against the `materials` domain at
1151
1152
  generation time, emitting `{ symbol, name, count }` per requirement (join `symbol` to
1152
1153
  `materials` for the material's own grade and category). **Kept as-is:**
1153
- `CargoRack_IncreasedCapacity` grade 5 has no components upstream, so its `materials`
1154
- is an empty list (the grade still resolves) rather than being dropped.
1154
+ `CargoRack_IncreasedCapacity` grade 5 has no components upstream. That absence does
1155
+ not establish a zero-cost crafting route: the id describes the two fixed Expanded
1156
+ Cargo Rack community-goal articles in `pre-engineered.jsonc`, so it remains in the
1157
+ mechanics catalogue for their modifier block but is absent from
1158
+ `blueprint-costs.jsonc`.
1155
1159
  - **Operations pre-engineered blueprints — from the in-game / Inara blueprint registry**
1156
1160
  (not in coriolis at the acquired commit): the Merc-Coin weapon rewards and the
1157
1161
  general/core/optional recipes (the **Operations keys**, e.g. `FuelScoop_Efficiency`,
@@ -1346,7 +1350,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1346
1350
  - **Availability is a property of the module, not of the blueprint.** A Pulse Laser and a
1347
1351
  Rail Gun both take the Efficient blueprint but offer different experimental effects, so
1348
1352
  "which experimentals go with blueprint X" has no single answer. Modules are therefore
1349
- grouped (52 groups covering 1026 ordinary engineering menus) and each group lists the
1353
+ grouped (48 groups covering 1005 ordinary engineering menus) and each group lists the
1350
1354
  `blueprints` and `experimentals` it offers.
1351
1355
  - **Source:** EDSY `eddb.js`, whose module-group tables carry each group's `blueprints`
1352
1356
  and `expeffects` lists and which modules belong to each group, and whose module records
@@ -1355,14 +1359,14 @@ up straight through with no disambiguation at all. Both paths are evidence that
1355
1359
  `modifications/modules.json`, which carries the same per-group lists keyed by the
1356
1360
  journal `BlueprintName`s this catalogue joins on.
1357
1361
  - **Coverage: every retained group EDSY's `mtype` table gives a `blueprints:` key.** After
1358
- the Mining Laser and Abrasion Blaster corrections below, that is 52 groups over 1026
1362
+ the corrections below, that is 48 groups over 1005
1359
1363
  modules, including
1360
1364
  bulkheads (the 241 ship armour records), life
1361
- support, sensors, the Detailed Surface Scanner, cargo racks, refineries, AFMUs, fuel
1365
+ support, sensors, the Detailed Surface Scanner, refineries, AFMUs, fuel
1362
1366
  scoops, FSD interdictors and boosters, Guardian module and shield reinforcement, the
1363
1367
  four engineerable limpet controllers, chaff, heat sink and caustic sink launchers,
1364
- point defence, ECMs, the KWS/manifest/wake scanners, the Guardian Gauss/Plasma/Shard
1365
- weapons, the AX missile racks and the Enzyme Missile Rack.
1368
+ point defence, ECMs, the KWS/manifest/wake scanners, and the Guardian
1369
+ Gauss/Plasma/Shard weapons.
1366
1370
  - **A group is one menu, so `noblueprints` splits a family in two.** EDSY denies
1367
1371
  blueprints per module as well as per group (`edsy.js` `setBlueprintID` refuses a
1368
1372
  denied id; `'*'` means the module is not modifiable at all), and for three families
@@ -1381,16 +1385,16 @@ up straight through with no disambiguation at all. Both paths are evidence that
1381
1385
  Anti-Guardian recipe on a non-Guardian module and EDSY denies it. `powerPlants`,
1382
1386
  `powerDistributors` and `hullReinforcements` therefore hold ordinary modules only,
1383
1387
  and the 25 Guardian ones sit in the three groups above.
1384
- - **14 modules are absent because upstream denies them every blueprint:** eight AX
1385
- multi-cannons (all but the two gimballed), five of the seven mining tools, and the
1386
- Mk II Plasma Shock Accelerator which is why `antiXenoMultiCannons` holds 2 of that
1387
- family's 10 modules and `plasmaAccelerators` 4 of its 5. The other two mining tools
1388
+ - **14 modules are absent from the registry-derived result because upstream denies them
1389
+ every blueprint:** eight AX multi-cannons, five of the seven mining tools, and the Mk II
1390
+ Plasma Shock Accelerator. The two gimballed AX multi-cannons are removed by the in-game
1391
+ correction below, while `plasmaAccelerators` retains 4 of its 5 modules. The other two mining tools
1388
1392
  are the manually corrected Mining Laser and Abrasion Blaster below, so all seven lack
1389
1393
  an ordinary menu and the empty `miningToolsLasers` group is not retained.
1390
1394
  The ten plain Module Reinforcement Packages are denied their family's only recipe
1391
1395
  and are absent too, which leaves `moduleReinforcements` holding the ten Guardian
1392
1396
  packages.
1393
- - **The 173 modules absent have no ordinary engineering menu.** For 171 this comes from
1397
+ - **The 194 modules absent have no ordinary engineering menu.** For 171 this comes from
1394
1398
  the pinned registries. Whole families first, both registries
1395
1399
  agreeing: fuel tanks, passenger cabins, the repair/recon/research/decontamination and
1396
1400
  multi-limpet controllers, meta-alloy and ordinary module reinforcement, the Pulse Wave
@@ -1398,11 +1402,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1398
1402
  vehicle hangars, the docking computers and Supercruise Assist, the module stabilisers,
1399
1403
  the planetary approach suites, the cargo hatch and
1400
1404
  the AX utility modules (Xeno Scanners, Shutdown Field Neutralisers), followed by the
1401
- individually denied modules described above. The other two are the fixed Mining Laser
1402
- and Abrasion Blaster, corrected from the registry-derived result below. They and the
1403
- size-5 class-2 Module Reinforcement Package within the registry-derived 171 have no
1404
- stock menu, but their purchased Mercenary articles remain upgradeable through their
1405
- bespoke recipes.
1405
+ individually denied modules described above. The other 23 are the five weapons, fixed
1406
+ Mining Laser, Abrasion Blaster and 16 cargo racks corrected from the registry-derived
1407
+ result below.
1408
+ They and the size-5 class-2 Module Reinforcement Package within the registry-derived
1409
+ 171 have no stock menu, but qualifying Mercenary articles remain upgradeable through
1410
+ their bespoke recipes.
1406
1411
  - **EDSY's `_X_` prefix means "not applicable" and is honoured**, not stripped: the
1407
1412
  Detailed Surface Scanner's group lists only `iss_er` (`Sensor_Expanded`), because its
1408
1413
  three other entries are `_X_`-marked. The `Decorative_*` entries on the remote-release
@@ -1428,27 +1433,25 @@ up straight through with no disambiguation at all. Both paths are evidence that
1428
1433
  the nine further groups it carries a list for —
1429
1434
  20 in all, every one an exact match. Chaff, heat sink, point defence and ECMs keep the
1430
1435
  generic `Misc_*` ids: there coriolis agrees with EDSY.
1431
- - **12 retained groups rest on EDSY alone**, because coriolis carries no blueprint list for
1432
- them at all: the nine Guardian-only groups (`guardianPowerPlants`,
1436
+ - **Nine retained groups rest on EDSY alone**, because coriolis carries no blueprint list for
1437
+ them at all: the Guardian-only groups (`guardianPowerPlants`,
1433
1438
  `guardianPowerDistributors`, `guardianHullReinforcements`, `moduleReinforcements`,
1434
- `shieldReinforcements`, `fsdBoosters`, `guardianGauss`, `guardianPlasma`,
1435
- `guardianShard`), `antiXenoMissileRacks`, `experimentalWeapons` and
1436
- `antiXenoMultiCannons`. That is coriolis being
1437
- silent rather than contradicting its Guardian and anti-xeno groups are empty
1438
- objects — but it means the second registry corroborates 40 of the 52 groups, not
1439
+ `shieldReinforcements`, `fsdBoosters`, `guardianGauss`, `guardianPlasma` and
1440
+ `guardianShard`). That is coriolis being
1441
+ silent rather than contradicting — its Guardian groups are empty objects — but it
1442
+ means the second registry corroborates 39 of the 48 groups, not
1439
1443
  all of them. The Guardian-weapon menus are independently settled by the in-game
1440
1444
  observations below: stock weapons take Anti-Guardian Zone Resistance alone, while
1441
1445
  the pre-engineered articles are final.
1442
1446
  - **The multi-cannon Overcharged is the one place a group follows coriolis over EDSY.**
1443
1447
  EDSY has a single Overcharged for every weapon; coriolis splits it, and `multiCannons`
1444
- lists coriolis's `MC_Overcharged`. `antiXenoMultiCannons` lists that key too, but not
1445
- for that reason coriolis carries no blueprint list for an anti-xeno group, so it is
1446
- EDSY being followed into coriolis's spelling. See "Multi-cannon Overcharged: one
1447
- journal id, two recipes" below for the evidence and for what the split costs.
1448
- - **The groups name 86 of the 107 blueprints.** The other 21 are accounted for: they are
1449
- Operations keys of modules sold already engineered rather than offered in a menu. Four
1450
- Operations keys _are_ named by a group, because they are recipes a player applies — see
1451
- "Four Operations recipes are listed by a menu" below.
1448
+ lists coriolis's `MC_Overcharged`. See "Multi-cannon Overcharged: one journal id, two
1449
+ recipes" below for the evidence and for what the split costs.
1450
+ - **The groups name 85 of the 107 blueprints.** Of the other 22, 21 are Operations keys
1451
+ of modules sold already engineered rather than offered in a menu; the last is the
1452
+ fixed Expanded Cargo Rack reward identity. Four Operations keys _are_ named by a
1453
+ group, because they are recipes a player applies see "Four Operations recipes are
1454
+ listed by a menu" below.
1452
1455
  - **14 modules are bound by the family rule, not by a source row.** EDSY has no live
1453
1456
  entry for `Int_Hyperdrive_Size8_Class{1..5}` or `Int_ShieldGenerator_Size1_Class4`
1454
1457
  (both present but commented out, and both naming their `mtype` — `cfsd` and `isg`),
@@ -1486,8 +1489,33 @@ up straight through with no disambiguation at all. Both paths are evidence that
1486
1489
  correction by dropping both module mappings, the now-empty `miningToolsLasers` group,
1487
1490
  both projected `kind` fields in `modules-hardpoint.jsonc`, and the Abrasion Blaster's
1488
1491
  now-unreachable experimental exclusion.
1489
- - **An empty experimental menu is still distinct from no menu.** 30 of the 52 groups offer
1490
- no experimental at all, so 387 of the 1026 grouped modules have an empty experimental
1492
+ - **Expanded Cargo Rack is a fixed reward identity, not an ordinary cargo-rack recipe.**
1493
+ EDSY and coriolis expose `CargoRack_IncreasedCapacity` as the grade-5 identity carried
1494
+ by the size-5 and size-6 community-goal articles catalogued in `pre-engineered.jsonc`.
1495
+ Direct in-game menu confirmation recorded 2026-08-18 UTC establishes that none of the
1496
+ 16 stock cargo-rack identities — ordinary, corrosion-resistant, or Mk II — has an
1497
+ ordinary engineering menu; there is no immutable revision for an in-game observation.
1498
+ The fixed articles keep their sourced modifier blocks and remain identifiable without
1499
+ granting the same state to a stock rack. A re-derivation must drop the `cargoRacks`
1500
+ group, all 16 module mappings, and the corresponding projected `kind` fields in
1501
+ `modules-internal.jsonc`.
1502
+ - **The Enzyme Missile Rack and AX weapons have no ordinary engineering menu.** Direct
1503
+ in-game confirmation recorded 2026-08-18 UTC establishes that the Enzyme Missile Rack,
1504
+ both plain fixed AX Missile Racks and both gimballed Enhanced AX Multi-Cannons cannot
1505
+ receive ordinary engineering; there is no immutable revision for an in-game observation.
1506
+ The Enzyme Missile Rack bought from a Mercenary contact at grade 1 remains upgradeable
1507
+ through grades 2–5 of its bespoke `EnzymeMissileRack_HighYield` recipe. Its separately
1508
+ catalogued grade-5 High Capacity community-goal article is final. The Enhanced AX
1509
+ Multi-Cannons and AX Missile Racks in `pre-engineered.jsonc` are fixed tech-broker
1510
+ variants and cannot be engineered further. All five fixed articles carry
1511
+ `engineeringLocked: true`; the multi-cannons retain Frontier's journal identity
1512
+ `Weapon_Overcharged`, not the ordinary multi-cannon menu key `MC_Overcharged`. A
1513
+ re-derivation must drop the
1514
+ `experimentalWeapons`, `antiXenoMissileRacks` and `antiXenoMultiCannons` groups, their
1515
+ five module mappings and the corresponding projected `kind` fields in
1516
+ `modules-hardpoint.jsonc`.
1517
+ - **An empty experimental menu is still distinct from no menu.** 27 of the 48 groups offer
1518
+ no experimental at all, so 368 of the 1005 grouped modules have an empty experimental
1491
1519
  list while retaining blueprints.
1492
1520
  - **Key form:** the Anti-Guardian blueprint is listed under `GuardianModule_Sturdy`, the id
1493
1521
  a Loadout writes and the one EDSY uses — the same and only spelling `blueprints.jsonc`
@@ -1519,8 +1547,8 @@ up straight through with no disambiguation at all. Both paths are evidence that
1519
1547
  `guardianPowerDistributors` and `guardianHullReinforcements`) therefore carry no
1520
1548
  experimental effects in the catalogue at all. Blueprints are unaffected on every
1521
1549
  module.
1522
- - **Multi-cannon Overcharged uses a distinct stored key.** The `multiCannons` and
1523
- `antiXenoMultiCannons` menus list `MC_Overcharged`; other weapon menus list
1550
+ - **Multi-cannon Overcharged uses a distinct stored key.** The `multiCannons` menu lists
1551
+ `MC_Overcharged`; other weapon menus list
1524
1552
  `Weapon_Overcharged`. Coriolis `modifications/modules.json` assigns the first key to
1525
1553
  multi-cannons and the second to six other weapon groups, while
1526
1554
  `modifications/blueprints.json` gives both the journal fdname
@@ -1529,8 +1557,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1529
1557
  `modifications/blueprints.json` was acquired 2026-08-07 UTC and has SHA-256
1530
1558
  `cba5a11fc7728e0d1da63fcbbc8d9dfedf9fbc51c99692ee187c7bf0293b3fa1`.
1531
1559
  - EDSY uses one `wpn_oc` recipe and includes the clip reduction on every listed
1532
- multi-cannon group. Coriolis has no AX multi-cannon menu, so the AX binding combines
1533
- EDSY's group coverage with coriolis's key for the clip-bearing recipe.
1560
+ multi-cannon group.
1534
1561
  - Frontier journal captures independently show `Weapon_Overcharged` without an
1535
1562
  `AmmoClipSize` modifier on a large gimballed cannon
1536
1563
  (`journal-federation-corvette.jsonc`), a medium fixed fragment cannon
@@ -1539,8 +1566,6 @@ up straight through with no disambiguation at all. Both paths are evidence that
1539
1566
  modifier legs reproduce the published recipe values. EDEngineer's
1540
1567
  `blueprints.json` likewise assigns the clip reduction to multi-cannon types and not
1541
1568
  to cannon, fragment-cannon or plasma-accelerator types.
1542
- - The two Merc-Coin AX multi-cannon rows in `pre-engineered.jsonc` use
1543
- `MC_Overcharged`, matching the menu binding and the clip-bearing recipe.
1544
1569
  - **An ordinary recipe on a Guardian weapon identifies a final purchase, not an engineer
1545
1570
  roll.** The three Guardian weapon groups list **only** Anti-Guardian Zone Resistance,
1546
1571
  exactly as the six Guardian _module_ groups do. `Weapon_RapidFire` on `guardianGauss`,
@@ -1664,8 +1689,9 @@ up straight through with no disambiguation at all. Both paths are evidence that
1664
1689
  and several rows are annotated as having been obtainable both ways — the six SCO "V1"
1665
1690
  drives most obviously. `acquisition` records the tag; it is not a claim that no other
1666
1691
  route ever existed.
1667
- - **`engineeringLocked: true` marks all seven pre-engineered Guardian-weapon rows as
1668
- final.** The source and capture evidence are recorded once under Engineering options.
1692
+ - **`engineeringLocked: true` marks 12 final weapon rows:** the seven pre-engineered
1693
+ Guardian weapons and the five fixed Enzyme/AX articles. Their evidence is recorded once
1694
+ under Engineering options.
1669
1695
  - **A reward variant is not reproducible by engineering the same blueprint.** Alongside
1670
1696
  its blueprint and effect, each reward carries hand-set modifier overrides no blueprint
1671
1697
  grants — that is what makes it a reward rather than a shortcut. The `blueprint` /
package/README.md CHANGED
@@ -48,8 +48,8 @@ The package has six feature areas:
48
48
  - `astro`: procedural names, id64 addresses, regions, nebulae and permit locks;
49
49
  - `ships`: ships, modules, SLEF loadouts, engineering and build metrics;
50
50
  - `equipment`: Odyssey suits, handheld weapons, grade upgrades and modifications;
51
- - `i18n`: sparse localized module, blueprint, experimental-effect, material and
52
- micro-resource names;
51
+ - `i18n`: sparse localized catalogue names, descriptions, slot labels and structured
52
+ diagnostic messages;
53
53
  - `materials`: ship engineering materials and Odyssey micro resources;
54
54
  - `commodities`: standard and rare market goods.
55
55
 
@@ -67,6 +67,29 @@ assets/ships/<symbol>/schematic-bottom.svg
67
67
  package files rather than JavaScript subpath exports, so applications can copy them from
68
68
  the installed package into their own public or bundled asset directory.
69
69
 
70
+ The two schematics expose a stable annotation contract for hull-anatomy interfaces:
71
+
72
+ - Each annotated feature is a `<g>` group carrying a `data-feature` category. The
73
+ current categories are `canopy`, `cargo_hatch`, `engine`, `fighter_bay`, `hardpoint`,
74
+ `heat_vent`, `landing_gear`, `thruster`, and `utility_mount`.
75
+ - A weapon mount has `data-feature="hardpoint"`; a utility mount has
76
+ `data-feature="utility_mount"`. Both carry `data-journal-slot`, whose value is the
77
+ exact journal-compatible slot key returned by `enumerateSlots`. Other feature
78
+ categories do not carry a journal slot key.
79
+ - Every hardpoint and utility slot in the hull catalogue occurs on at least one of the
80
+ two schematics. A slot occurs at most once per side, but the same slot may occur once
81
+ on both sides. Treat those as two views of one game slot, not two mounts.
82
+ - Drawing order, element IDs, `data-model-socket`, coordinates, colours, and other SVG
83
+ details are presentation data, not stable identities. IDs repeat between asset files,
84
+ so scope each schematic when inlining more than one. Select interactive geometry by
85
+ `data-feature` and `data-journal-slot` only.
86
+
87
+ The schematic documents are safe to embed inline as supplied: they contain only static
88
+ `svg`, `g`, `path`, and `circle` elements; no scripts, styles, event-handler attributes,
89
+ foreign or media elements, links, external references, or CSS `url()` values. This
90
+ content guarantee applies to the unmodified package files; applications remain
91
+ responsible for any transformations or user-supplied replacements.
92
+
70
93
  ## Examples
71
94
 
72
95
  ```ts
@@ -129,15 +152,19 @@ pinned sources carry no translation instead of silently substituting English:
129
152
  ```ts
130
153
  import {
131
154
  getBlueprintName,
155
+ getEngineeringGroupName,
132
156
  getMaterialName,
133
157
  getMicroResourceName,
134
158
  getModuleName,
159
+ getShipName,
135
160
  } from '@elite-dangerous-almanac/core/i18n';
136
161
 
137
162
  getModuleName('Int_Hyperdrive_Size6_Class5', 'de-DE'); // -> "Frameshiftantrieb"
138
163
  getBlueprintName('FSD_LongRange', 'fr-FR'); // -> "Portée FSD améliorée"
139
164
  getMaterialName('GridResistors', 'de'); // -> "Gitterwiderstände"
140
165
  getMicroResourceName('graphene', 'fr'); // -> "Graphène"
166
+ getShipName('empire_trader', 'fr'); // -> "Imperial Clipper"
167
+ getEngineeringGroupName('frameShiftDrives', 'de'); // -> null
141
168
  ```
142
169
 
143
170
  The functions return an explicit source value verbatim, so a source-backed spelling may
@@ -146,6 +173,11 @@ Unqualified `zh` selects the source's Simplified Chinese (`zh-CN`) names. Explic
146
173
  different Chinese scripts or regions such as `zh-TW` do not fall back to Simplified
147
174
  Chinese and return `null` unless a matching source is added.
148
175
 
176
+ The same contract covers ship manufacturers, pre-engineered variant names, engineering
177
+ group names, experimental-effect descriptions, loadout-slot and restriction labels, and
178
+ structured loadout, calculation, SLEF and edit messages. A family whose accepted source
179
+ currently supplies only English returns `null` for every non-English locale.
180
+
149
181
  Registry lookups ignore case and surrounding whitespace. Material, commodity and
150
182
  module lookups search their complete registry by default and accept an optional
151
183
  catalogue to narrow the results. Nebula queries require an explicit catalogue so the
@@ -81,7 +81,7 @@ a verbatim copy produced at build time — edit this file, never the copy.
81
81
  engineering menus, per-ship module-count limits and fitted stabiliser increases, the
82
82
  baseline per-hull maximum heat dissipation, the
83
83
  Lynx Highliner's hull/slot figures and zero-pip minimum pitch, the journal slot names,
84
- localized module, blueprint and experimental-effect names, and the
84
+ localized module, blueprint, experimental-effect and engineering option-group names, and the
85
85
  attribute-to-journal-Label mapping. The values are Elite Dangerous game data — see the
86
86
  Frontier notice below. Heat dissipation is the one entry the game never shows a player:
87
87
  it is community measurement of Frontier's game, described under Algorithms above, and
@@ -193,8 +193,8 @@ and
193
193
  [`data/commodities/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/commodities/SOURCES.md),
194
194
  with the rules those files follow in
195
195
  [`data/SNAPSHOTS.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/SNAPSHOTS.md).
196
- Those files live in the repository only this file is also published inside the npm
197
- package, where they are not present, so the links are absolute.
196
+ The npm package includes matching copies under `PROVENANCE/` (without the `data/`
197
+ prefix); the links above are absolute so they resolve from inside the package too.
198
198
 
199
199
  If you add or change data, port an algorithm, or add a dependency that warrants credit,
200
200
  add it here and record the provenance where the data lives.