@elite-dangerous-almanac/core 0.1.0-beta.8 → 0.1.1

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 (249) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +125 -17
  2. package/PROVENANCE/materials/SOURCES.md +33 -12
  3. package/PROVENANCE/ships/SOURCES.md +74 -48
  4. package/README.md +47 -5
  5. package/THIRD_PARTY_NOTICES.md +14 -12
  6. package/dist/astro/codex-region-lookup.js +1 -1
  7. package/dist/astro/codex-region.js +1 -1
  8. package/dist/astro/galaxy-grid.js +1 -1
  9. package/dist/astro/index.js +1 -1
  10. package/dist/astro/mass-code.js +1 -1
  11. package/dist/astro/naming-region-origins.js +1 -1
  12. package/dist/astro/nebulae.js +1 -1
  13. package/dist/astro/permit-locked-regions.js +1 -1
  14. package/dist/astro/permit-locked-systems.js +1 -1
  15. package/dist/astro/permit-locks.js +1 -1
  16. package/dist/astro/procedural-system.js +1 -1
  17. package/dist/astro/sector-name.js +1 -1
  18. package/dist/astro/system-address-input.js +1 -1
  19. package/dist/astro/system-address.js +1 -1
  20. package/dist/astro/system-name.js +1 -1
  21. package/dist/{chunk-DYFUHGJQ.js → chunk-2J2UV4ZX.js} +1 -1
  22. package/dist/{chunk-DB54PH3X.js → chunk-6EPYVBAX.js} +1 -1
  23. package/dist/{chunk-U6TMCYA6.js → chunk-6EUVIZAS.js} +1 -1
  24. package/dist/chunk-6RLMBSXE.js +1 -0
  25. package/dist/chunk-6RLMBSXE.js.map +1 -0
  26. package/dist/{chunk-NWPK6Q3S.js → chunk-ADLVPKUV.js} +1 -1
  27. package/dist/{chunk-S4DBNX2B.js → chunk-BKWLI44T.js} +1 -1
  28. package/dist/chunk-BMM6GQAU.js +1 -0
  29. package/dist/chunk-BMM6GQAU.js.map +1 -0
  30. package/dist/{chunk-WV5YM7H5.js → chunk-BMT3U46U.js} +1 -1
  31. package/dist/chunk-CTJQPQRA.js +1 -0
  32. package/dist/{chunk-NSSWYRHN.js.map → chunk-CTJQPQRA.js.map} +1 -1
  33. package/dist/{chunk-5H74FKY7.js → chunk-DAQ3PJ4R.js} +1 -1
  34. package/dist/{chunk-BTPV5CIF.js → chunk-DI5RXSJR.js} +1 -1
  35. package/dist/{chunk-ELIZXUMI.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-EKWLAHRG.js +1 -0
  42. package/dist/chunk-EKWLAHRG.js.map +1 -0
  43. package/dist/chunk-EU42PAV4.js +1 -0
  44. package/dist/{chunk-32PVERNH.js.map → chunk-EU42PAV4.js.map} +1 -1
  45. package/dist/{chunk-NQ2ID6BF.js → chunk-FEER4ERG.js} +1 -1
  46. package/dist/{chunk-DHOCTGWB.js → chunk-FGNJ7EVM.js} +1 -1
  47. package/dist/{chunk-JWJ7RSZC.js → chunk-G3265B27.js} +1 -1
  48. package/dist/chunk-GKDEI2SQ.js +1 -0
  49. package/dist/chunk-GKDEI2SQ.js.map +1 -0
  50. package/dist/chunk-GOMBLS2T.js +1 -0
  51. package/dist/chunk-GOMBLS2T.js.map +1 -0
  52. package/dist/{chunk-V3DW67W2.js → chunk-GRIK3EDH.js} +1 -1
  53. package/dist/{chunk-RIT6MOO5.js → chunk-GVLDFJEY.js} +1 -1
  54. package/dist/{chunk-RIT6MOO5.js.map → chunk-GVLDFJEY.js.map} +1 -1
  55. package/dist/chunk-H3HMVGEY.js +1 -0
  56. package/dist/chunk-H3HMVGEY.js.map +1 -0
  57. package/dist/chunk-HRVIHQ4A.js +1 -0
  58. package/dist/chunk-HRVIHQ4A.js.map +1 -0
  59. package/dist/{chunk-QTDBO7R2.js → chunk-IYU4WLFM.js} +1 -1
  60. package/dist/{chunk-5EUX3L76.js → chunk-JWWYAMGD.js} +1 -1
  61. package/dist/chunk-KAA4VOOB.js +1 -0
  62. package/dist/chunk-KAA4VOOB.js.map +1 -0
  63. package/dist/{chunk-ZFT56QFR.js → chunk-L7CLUYZ6.js} +1 -1
  64. package/dist/chunk-M5IBENCW.js +1 -0
  65. package/dist/chunk-M5IBENCW.js.map +1 -0
  66. package/dist/{chunk-IH4NXKVW.js → chunk-NEEFT7WH.js} +1 -1
  67. package/dist/{chunk-VZXL5KBR.js → chunk-NLBUKXNV.js} +1 -1
  68. package/dist/{chunk-4OSCSACF.js → chunk-OCND33TO.js} +1 -1
  69. package/dist/chunk-P2QOL63K.js +1 -0
  70. package/dist/chunk-P2QOL63K.js.map +1 -0
  71. package/dist/{chunk-PMJG7PHU.js → chunk-PHPLZEFS.js} +1 -1
  72. package/dist/chunk-PKWVG2JY.js +1 -0
  73. package/dist/chunk-PKWVG2JY.js.map +1 -0
  74. package/dist/chunk-PNZCLQDJ.js +1 -0
  75. package/dist/{chunk-WASJ5U5A.js.map → chunk-PNZCLQDJ.js.map} +1 -1
  76. package/dist/{chunk-DACZE3HX.js → chunk-POZTXBSN.js} +1 -1
  77. package/dist/chunk-Q4E2V6RE.js +1 -0
  78. package/dist/chunk-Q4E2V6RE.js.map +1 -0
  79. package/dist/{chunk-DNTN34M4.js → chunk-QI22FKBG.js} +1 -1
  80. package/dist/chunk-QTZPA2FR.js +1 -0
  81. package/dist/{chunk-TH4S5MVD.js.map → chunk-QTZPA2FR.js.map} +1 -1
  82. package/dist/{chunk-PRFXKOCZ.js → chunk-R26GVRMI.js} +1 -1
  83. package/dist/{chunk-I7PIDRMU.js → chunk-RAO35XDF.js} +1 -1
  84. package/dist/chunk-TFPIPIMU.js +1 -0
  85. package/dist/chunk-TFPIPIMU.js.map +1 -0
  86. package/dist/{chunk-JYQE53FL.js → chunk-TMMGS6TC.js} +1 -1
  87. package/dist/{chunk-ZAHNOQGG.js → chunk-UBYO7VZR.js} +1 -1
  88. package/dist/{chunk-Z4GTTB7I.js → chunk-UXBCLFGU.js} +1 -1
  89. package/dist/{chunk-RKLJ7EEE.js → chunk-UXFMVZAY.js} +1 -1
  90. package/dist/chunk-VB3XZGIB.js +1 -0
  91. package/dist/chunk-VB3XZGIB.js.map +1 -0
  92. package/dist/chunk-VKN65H2U.js +1 -0
  93. package/dist/chunk-VKN65H2U.js.map +1 -0
  94. package/dist/{chunk-MPZGCTRG.js → chunk-VZZUNSDF.js} +1 -1
  95. package/dist/chunk-VZZUNSDF.js.map +1 -0
  96. package/dist/{chunk-ZJB5UYNE.js → chunk-W5G2NUCZ.js} +1 -1
  97. package/dist/{chunk-ZJB5UYNE.js.map → chunk-W5G2NUCZ.js.map} +1 -1
  98. package/dist/{chunk-CI3ACMRA.js → chunk-WHWFKHV3.js} +1 -1
  99. package/dist/{chunk-CI3ACMRA.js.map → chunk-WHWFKHV3.js.map} +1 -1
  100. package/dist/{chunk-IJRKEODR.js → chunk-WNGQ3IAM.js} +1 -1
  101. package/dist/chunk-WVKRSRLO.js +1 -0
  102. package/dist/chunk-WVKRSRLO.js.map +1 -0
  103. package/dist/{chunk-ESEM3LPU.js → chunk-XN6Q7LWU.js} +1 -1
  104. package/dist/chunk-XT6KKGSE.js +1 -0
  105. package/dist/chunk-XT6KKGSE.js.map +1 -0
  106. package/dist/{chunk-KMFUCORC.js → chunk-Y6UZWNP4.js} +1 -1
  107. package/dist/commodities/commodities.js +1 -1
  108. package/dist/commodities/index.js +1 -1
  109. package/dist/equipment/index.js +1 -1
  110. package/dist/equipment/modification-costs.js +1 -1
  111. package/dist/equipment/modification-journal.js +1 -1
  112. package/dist/equipment/modifications.js +1 -1
  113. package/dist/equipment/suits.js +1 -1
  114. package/dist/equipment/upgrade-costs.js +1 -1
  115. package/dist/equipment/weapons.js +1 -1
  116. package/dist/i18n/blueprints.js +1 -1
  117. package/dist/i18n/diagnostics.d.ts +62 -0
  118. package/dist/i18n/diagnostics.js +1 -0
  119. package/dist/i18n/diagnostics.js.map +1 -0
  120. package/dist/i18n/engineering-groups.d.ts +20 -0
  121. package/dist/i18n/engineering-groups.js +1 -0
  122. package/dist/i18n/engineering-groups.js.map +1 -0
  123. package/dist/i18n/experimental-effect-descriptions.d.ts +20 -0
  124. package/dist/i18n/experimental-effect-descriptions.js +1 -0
  125. package/dist/i18n/experimental-effect-descriptions.js.map +1 -0
  126. package/dist/i18n/experimental-effects.js +1 -1
  127. package/dist/i18n/index.d.ts +30 -1
  128. package/dist/i18n/index.js +1 -1
  129. package/dist/i18n/materials.d.ts +31 -0
  130. package/dist/i18n/materials.js +1 -0
  131. package/dist/i18n/materials.js.map +1 -0
  132. package/dist/i18n/micro-resources.d.ts +31 -0
  133. package/dist/i18n/micro-resources.js +1 -0
  134. package/dist/i18n/micro-resources.js.map +1 -0
  135. package/dist/i18n/modules.js +1 -1
  136. package/dist/i18n/pre-engineered.d.ts +39 -0
  137. package/dist/i18n/pre-engineered.js +1 -0
  138. package/dist/i18n/pre-engineered.js.map +1 -0
  139. package/dist/i18n/ships.d.ts +36 -0
  140. package/dist/i18n/ships.js +1 -0
  141. package/dist/i18n/ships.js.map +1 -0
  142. package/dist/i18n/slots.d.ts +42 -0
  143. package/dist/i18n/slots.js +1 -0
  144. package/dist/i18n/slots.js.map +1 -0
  145. package/dist/materials/index.js +1 -1
  146. package/dist/materials/materials.js +1 -1
  147. package/dist/materials/micro-resources-all.d.ts +2 -2
  148. package/dist/materials/micro-resources-all.js +1 -1
  149. package/dist/materials/micro-resources-data.d.ts +3 -3
  150. package/dist/materials/micro-resources-data.js +1 -1
  151. package/dist/materials/micro-resources-item.d.ts +3 -3
  152. package/dist/materials/micro-resources-item.js +1 -1
  153. package/dist/materials/micro-resources.d.ts +8 -8
  154. package/dist/materials/micro-resources.js +1 -1
  155. package/dist/ships/blueprint-costs.d.ts +13 -11
  156. package/dist/ships/blueprint-costs.js +1 -1
  157. package/dist/ships/blueprint-costs.js.map +1 -1
  158. package/dist/ships/blueprint-journal.d.ts +6 -7
  159. package/dist/ships/blueprint-journal.js +1 -1
  160. package/dist/ships/blueprints.js +1 -1
  161. package/dist/ships/default-loadouts.js +1 -1
  162. package/dist/ships/distributor.d.ts +98 -0
  163. package/dist/ships/distributor.js +1 -0
  164. package/dist/ships/distributor.js.map +1 -0
  165. package/dist/ships/engineering-options.d.ts +28 -29
  166. package/dist/ships/engineering-options.js +1 -1
  167. package/dist/ships/experimental-effect-costs.js +1 -1
  168. package/dist/ships/experimental-effects.js +1 -1
  169. package/dist/ships/gunsights.js +1 -1
  170. package/dist/ships/index.d.ts +9 -6
  171. package/dist/ships/index.js +1 -1
  172. package/dist/ships/loadout-calculations.d.ts +21 -11
  173. package/dist/ships/loadout-calculations.js +1 -1
  174. package/dist/ships/loadout-validation.d.ts +7 -6
  175. package/dist/ships/loadout-validation.js +1 -1
  176. package/dist/ships/modules-all.js +1 -1
  177. package/dist/ships/modules-hardpoint.js +1 -1
  178. package/dist/ships/modules-internal.js +1 -1
  179. package/dist/ships/modules.d.ts +5 -5
  180. package/dist/ships/modules.js +1 -1
  181. package/dist/ships/power.d.ts +39 -11
  182. package/dist/ships/power.js +1 -1
  183. package/dist/ships/pre-engineered-stats.d.ts +20 -4
  184. package/dist/ships/pre-engineered-stats.js +1 -1
  185. package/dist/ships/pre-engineered.d.ts +7 -8
  186. package/dist/ships/pre-engineered.js +1 -1
  187. package/dist/ships/shield-recovery.d.ts +12 -6
  188. package/dist/ships/shield-recovery.js +1 -1
  189. package/dist/ships/ship-loadout.d.ts +1792 -18
  190. package/dist/ships/ship-loadout.js +1 -1
  191. package/dist/ships/ships.js +1 -1
  192. package/dist/ships/slef.js +1 -1
  193. package/dist/ships/slots.js +1 -1
  194. package/dist/ships/source-purchase.js +1 -1
  195. package/package.json +39 -3
  196. package/dist/chunk-32PVERNH.js +0 -1
  197. package/dist/chunk-5W43EQEQ.js +0 -1
  198. package/dist/chunk-5W43EQEQ.js.map +0 -1
  199. package/dist/chunk-76XKY2Y2.js +0 -1
  200. package/dist/chunk-76XKY2Y2.js.map +0 -1
  201. package/dist/chunk-B5TT26XE.js +0 -1
  202. package/dist/chunk-B5TT26XE.js.map +0 -1
  203. package/dist/chunk-HOKW2EWE.js +0 -1
  204. package/dist/chunk-HOKW2EWE.js.map +0 -1
  205. package/dist/chunk-IZGYEP2X.js +0 -1
  206. package/dist/chunk-IZGYEP2X.js.map +0 -1
  207. package/dist/chunk-JWRV67UY.js +0 -1
  208. package/dist/chunk-JWRV67UY.js.map +0 -1
  209. package/dist/chunk-MPZGCTRG.js.map +0 -1
  210. package/dist/chunk-NSSWYRHN.js +0 -1
  211. package/dist/chunk-RF2IKLWQ.js +0 -1
  212. package/dist/chunk-RF2IKLWQ.js.map +0 -1
  213. package/dist/chunk-TH4S5MVD.js +0 -1
  214. package/dist/chunk-WASJ5U5A.js +0 -1
  215. package/dist/ship-loadout-B5mQ1l-N.d.ts +0 -1411
  216. /package/dist/{chunk-DYFUHGJQ.js.map → chunk-2J2UV4ZX.js.map} +0 -0
  217. /package/dist/{chunk-DB54PH3X.js.map → chunk-6EPYVBAX.js.map} +0 -0
  218. /package/dist/{chunk-U6TMCYA6.js.map → chunk-6EUVIZAS.js.map} +0 -0
  219. /package/dist/{chunk-NWPK6Q3S.js.map → chunk-ADLVPKUV.js.map} +0 -0
  220. /package/dist/{chunk-S4DBNX2B.js.map → chunk-BKWLI44T.js.map} +0 -0
  221. /package/dist/{chunk-WV5YM7H5.js.map → chunk-BMT3U46U.js.map} +0 -0
  222. /package/dist/{chunk-5H74FKY7.js.map → chunk-DAQ3PJ4R.js.map} +0 -0
  223. /package/dist/{chunk-BTPV5CIF.js.map → chunk-DI5RXSJR.js.map} +0 -0
  224. /package/dist/{chunk-ELIZXUMI.js.map → chunk-DLLBARN5.js.map} +0 -0
  225. /package/dist/{chunk-J2PNZQY4.js.map → chunk-DVL5RBKX.js.map} +0 -0
  226. /package/dist/{chunk-VXVUEF5U.js.map → chunk-E3BRVGJJ.js.map} +0 -0
  227. /package/dist/{chunk-MFV4VZFP.js.map → chunk-EBAHNZ36.js.map} +0 -0
  228. /package/dist/{chunk-NQ2ID6BF.js.map → chunk-FEER4ERG.js.map} +0 -0
  229. /package/dist/{chunk-DHOCTGWB.js.map → chunk-FGNJ7EVM.js.map} +0 -0
  230. /package/dist/{chunk-JWJ7RSZC.js.map → chunk-G3265B27.js.map} +0 -0
  231. /package/dist/{chunk-V3DW67W2.js.map → chunk-GRIK3EDH.js.map} +0 -0
  232. /package/dist/{chunk-QTDBO7R2.js.map → chunk-IYU4WLFM.js.map} +0 -0
  233. /package/dist/{chunk-5EUX3L76.js.map → chunk-JWWYAMGD.js.map} +0 -0
  234. /package/dist/{chunk-ZFT56QFR.js.map → chunk-L7CLUYZ6.js.map} +0 -0
  235. /package/dist/{chunk-IH4NXKVW.js.map → chunk-NEEFT7WH.js.map} +0 -0
  236. /package/dist/{chunk-VZXL5KBR.js.map → chunk-NLBUKXNV.js.map} +0 -0
  237. /package/dist/{chunk-4OSCSACF.js.map → chunk-OCND33TO.js.map} +0 -0
  238. /package/dist/{chunk-PMJG7PHU.js.map → chunk-PHPLZEFS.js.map} +0 -0
  239. /package/dist/{chunk-DACZE3HX.js.map → chunk-POZTXBSN.js.map} +0 -0
  240. /package/dist/{chunk-DNTN34M4.js.map → chunk-QI22FKBG.js.map} +0 -0
  241. /package/dist/{chunk-PRFXKOCZ.js.map → chunk-R26GVRMI.js.map} +0 -0
  242. /package/dist/{chunk-I7PIDRMU.js.map → chunk-RAO35XDF.js.map} +0 -0
  243. /package/dist/{chunk-JYQE53FL.js.map → chunk-TMMGS6TC.js.map} +0 -0
  244. /package/dist/{chunk-ZAHNOQGG.js.map → chunk-UBYO7VZR.js.map} +0 -0
  245. /package/dist/{chunk-Z4GTTB7I.js.map → chunk-UXBCLFGU.js.map} +0 -0
  246. /package/dist/{chunk-RKLJ7EEE.js.map → chunk-UXFMVZAY.js.map} +0 -0
  247. /package/dist/{chunk-IJRKEODR.js.map → chunk-WNGQ3IAM.js.map} +0 -0
  248. /package/dist/{chunk-ESEM3LPU.js.map → chunk-XN6Q7LWU.js.map} +0 -0
  249. /package/dist/{chunk-KMFUCORC.js.map → chunk-Y6UZWNP4.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  # Localized game-name catalogues
2
2
 
3
3
  These catalogues keep the canonical English display names already published by the
4
- ships data domain and add only localized values carried explicitly by the pinned community
5
- sources. They are deliberately sparse: absence means that no accepted source carried a
6
- value, and the lookup API returns `null` for that locale rather than treating English as
7
- a translation.
4
+ ships data domain and add only localized values carried explicitly by accepted sources.
5
+ They are deliberately sparse: absence means that no accepted source carried a value, and
6
+ the lookup API returns `null` for that locale rather than treating English as a
7
+ translation.
8
8
 
9
9
  ## `module-names.jsonc`
10
10
 
@@ -58,31 +58,139 @@ a translation.
58
58
  Spanish, French, Portuguese and Russian.
59
59
  - **Manual corrections:** none.
60
60
 
61
- ## Deliberate absence: ship names
61
+ ## `material-names.jsonc`
62
62
 
63
- - **Acquired:** 2026-08-14 UTC.
63
+ - **Acquired:** 2026-08-16 UTC.
64
+ - **Odyssey Materials Helper revision:** commit
65
+ `23343c453938e724f317c56e9eb7db0dbfa71f78`.
66
+ - **Derivation:** each of the 146 current symbols and its canonical English name comes
67
+ from the three `data/materials/materials-*.jsonc` catalogues. The lower-cased symbol
68
+ joins directly to the final component of Odyssey Materials Helper's message key in
69
+ `locale/material/horizons/{raw,manufactured,encoded}.csv`; only that row's explicit
70
+ localized columns are copied. The source's English column is not copied because the
71
+ owning materials catalogues remain authoritative for canonical names. The canonical
72
+ English values therefore keep the existing `Segment` spelling and omit the source's
73
+ parenthetical Guardian and Thargoid category labels where the owning catalogue does;
74
+ localized columns remain verbatim source values.
75
+ - **Coverage:** English, Spanish and Russian cover all 146 materials. The explicit
76
+ translations cover 128 in German, 140 in French, 140 in Portuguese and 28 in
77
+ Georgian. Fourteen of the source's Georgian values are byte-for-byte equal to the
78
+ canonical English spelling and are retained verbatim; they are explicit source values,
79
+ not lookup-generated fallbacks. The pinned source carries no Simplified Chinese
80
+ material names.
81
+ - **Manual corrections:** none.
82
+
83
+ ## `micro-resource-names.jsonc`
84
+
85
+ - **Acquired:** 2026-08-16 UTC.
86
+ - **Odyssey Materials Helper revision:** commit
87
+ `23343c453938e724f317c56e9eb7db0dbfa71f78`.
88
+ - **Supplemental source:** in-game verification, acquired 2026-08-16 UTC; immutable
89
+ revision unavailable.
90
+ - **Derivation:** each of the 226 current symbols and its canonical English name comes
91
+ from the four `data/materials/micro-resources-*.jsonc` catalogues. The 196 FDevIDs-backed
92
+ records join directly to the final component of Odyssey Materials Helper's message key
93
+ in `locale/material/odyssey/{asset,consumable,data,good}.csv`; only that row's explicit
94
+ localized columns are copied. Twenty-eight of the 30 in-game-backed records also have
95
+ rows in Odyssey Materials Helper, while `PowerVirus` and
96
+ `SmallCapacityPowerRegulator` do not. All 30 take the explicit in-game `name` values for
97
+ German, Spanish, French, Brazilian Portuguese and Russian. The Brazilian Portuguese
98
+ values are stored under `pt`, matching the existing catalogue values described below.
99
+ In both cases the owning catalogue remains authoritative for canonical English names.
100
+ - **Coverage:** English, Spanish and Russian cover all 226 micro resources. The explicit
101
+ translations cover 218 in German and Portuguese, 225 in French, 6 in Simplified Chinese
102
+ and 10 in Georgian. Five of the source's Georgian values are byte-for-byte equal to the
103
+ canonical English spelling and are retained verbatim; they are explicit source values,
104
+ not lookup-generated fallbacks.
105
+ - **Manual corrections:** the 30 in-game values labelled Brazilian Portuguese are stored
106
+ under `pt`, matching the 188 existing Portuguese entries because both sets contain the
107
+ same Brazilian Portuguese game text. `pt-BR` lookups resolve these values through the
108
+ regional-to-language fallback.
109
+
110
+ ## `ship-names.jsonc`
111
+
112
+ - **Acquired:** 2026-08-18 UTC.
64
113
  - **Odyssey Materials Helper revision:** commit
65
114
  `23343c453938e724f317c56e9eb7db0dbfa71f78`;
66
115
  `application/src/main/resources/locale/ships/ships.csv` has SHA-256
67
116
  `6785f7cea00f36ca0a853091fd88f8ed5481a60f55c269643bff1ab0c3d6993d`.
68
117
  - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
69
118
  database version `424009901`, last-modified marker `20260810`.
70
- - **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
71
121
  Helper's `ships.name.*` key after removing punctuation and folding case. EDSY's
72
122
  `eddb.js` `ship.fdname` supplies the second join, with explicit `ship-<id>` language
73
123
  entries filling locales absent from the CSV. The resulting source-backed coverage is
74
- 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;
75
126
  no accepted source carries a German ship-name table.
76
- - **Standing conclusion:** all 213 resulting non-English values are byte-for-byte equal
77
- to the canonical English ship names. A ship-name localization catalogue would
78
- therefore publish no translated information and is deliberately absent. A source
79
- carrying at least one genuinely localized ship name would justify revisiting this
80
- 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.
81
188
  - **Manual corrections:** none.
82
189
 
83
190
  ## Known gaps
84
191
 
85
- Localized coverage follows the pinned sources and is not complete for every catalogue or
86
- locale. Missing values are observable as `null`, never an English fallback. Expanding
87
- source-backed coverage, localized slot labels and higher-level generated text remains
88
- tracked by [#245](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/245).
192
+ Localized coverage follows the accepted sources and is not complete for every catalogue or
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).
@@ -1,9 +1,9 @@
1
1
  # Data sources — `data/materials/`
2
2
 
3
- **Acquired:** 2026-07-24. **Upstream revision:** unavailable for both sources below.
4
-
5
3
  ## Materials — raw, manufactured, encoded
6
4
 
5
+ **Acquired:** 2026-07-24. **Upstream revision:** unavailable for both sources below.
6
+
7
7
  - **Files:** `materials-raw.jsonc`, `materials-manufactured.jsonc`,
8
8
  `materials-encoded.jsonc`.
9
9
  - **Primary source:** EDCD FDevIDs, `material.csv`. It provides, for each material, the
@@ -52,18 +52,39 @@ grade 3), which is why it is used to fill the gap.
52
52
 
53
53
  - **Files:** `micro-resources-component.jsonc`, `micro-resources-consumable.jsonc`,
54
54
  `micro-resources-data.jsonc`, `micro-resources-item.jsonc`.
55
- - **Source:** EDCD FDevIDs, `microresources.csv`. It provides, for each micro resource,
56
- the internal symbol, category (Component / Consumable / Data / Item) and English display
57
- name.
55
+ - **Sources:**
56
+ - EDCD FDevIDs `microresources.csv`, acquired 2026-07-24; upstream revision
57
+ unavailable. It provides 196 records, including each internal symbol,
58
+ category (Component / Consumable / Data / Item) and English display name.
59
+ - In-game verification, acquired 2026-08-16 UTC; immutable revision unavailable. It
60
+ provides 30 player-facing identities absent from the FDevIDs snapshot, their internal
61
+ identifiers and English display names, and player categories for 29 of them.
62
+ `PowerMegashipData` is the exception documented under manual corrections.
63
+ - Inara component pages, acquired 2026-08-16 UTC; immutable revision unavailable. Its
64
+ six Power data pages independently classify Power Association Data, Power Classified
65
+ Data, Power Industrial Data, Power Injection Malware, Power Megaship Data and Power
66
+ Political Data as Odyssey data resources.
58
67
  - **Derivation:**
59
- - `symbol` is FDevIDs' internal id (e.g. `graphene`) — what the player journal reports
60
- with the same field and meaning as on a ship, module or material.
61
- Frontier's numeric micro-resource id from the CSV is **not** carried.
68
+ - `symbol` is the source's internal id (e.g. `graphene`) — what the player journal
69
+ reports with the same field and meaning as on a ship, module or material. Frontier's
70
+ numeric micro-resource id from the FDevIDs CSV is **not** carried.
62
71
  - `name` is the English display name (`Graphene`).
63
- - FDevIDs' category is lower-cased to `component` / `consumable` / `data` / `item`
64
- (matching how ship modules and materials spell their category). Each data file holds
65
- exactly one category, so the category is represented by the file rather than repeated
66
- on every record.
72
+ - The source category is lower-cased to `component` / `consumable` / `data` / `item`
73
+ (matching how ship modules and materials spell their category). In-game `assets` map
74
+ to `component` and `goods` map to `item`. Each data file holds exactly one category,
75
+ so the category is represented by the file rather than repeated on every record.
67
76
  - Micro resources have **no grade and no line** — those belong to the ship-side
68
77
  engineering materials above; each data-file record is a plain `{ symbol, name }`
69
78
  registry record.
79
+ - Three registered identities are deliberately absent: `FlightData` and
80
+ `Humanoid_ShieldGrenade_Bubble` have no localization and are not player-facing
81
+ resources; `NOCData_Tutorial` is the tutorial-only duplicate of `NOCData` and has the
82
+ same English display name. The localized, player-facing
83
+ `SmallCapacityPowerRegulator` record is retained.
84
+ - **Manual corrections:** `PowerMegashipData` is assigned to `data`. The encoded-material
85
+ classification attached to its in-game localization record is rejected: Inara
86
+ classifies it alongside the other five Power data resources, establishing that it is an
87
+ Odyssey micro resource with no material grade or line. The in-game English names are
88
+ otherwise retained verbatim, including
89
+ `Installation Intelligence Report`, `Personal Protective Equipment` and
90
+ `Contaminated Spire Compound` where the community table differs.
@@ -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,7 +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 and experimental-effect names;
51
+ - `i18n`: sparse localized catalogue names, descriptions, slot labels and structured
52
+ diagnostic messages;
52
53
  - `materials`: ship engineering materials and Odyssey micro resources;
53
54
  - `commodities`: standard and rare market goods.
54
55
 
@@ -66,6 +67,29 @@ assets/ships/<symbol>/schematic-bottom.svg
66
67
  package files rather than JavaScript subpath exports, so applications can copy them from
67
68
  the installed package into their own public or bundled asset directory.
68
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
+
69
93
  ## Examples
70
94
 
71
95
  ```ts
@@ -126,15 +150,33 @@ do not bundle them. English names are complete; other locales return `null` wher
126
150
  pinned sources carry no translation instead of silently substituting English:
127
151
 
128
152
  ```ts
129
- import { getBlueprintName, getModuleName } from '@elite-dangerous-almanac/core/i18n';
153
+ import {
154
+ getBlueprintName,
155
+ getEngineeringGroupName,
156
+ getMaterialName,
157
+ getMicroResourceName,
158
+ getModuleName,
159
+ getShipName,
160
+ } from '@elite-dangerous-almanac/core/i18n';
130
161
 
131
162
  getModuleName('Int_Hyperdrive_Size6_Class5', 'de-DE'); // -> "Frameshiftantrieb"
132
163
  getBlueprintName('FSD_LongRange', 'fr-FR'); // -> "Portée FSD améliorée"
164
+ getMaterialName('GridResistors', 'de'); // -> "Gitterwiderstände"
165
+ getMicroResourceName('graphene', 'fr'); // -> "Graphène"
166
+ getShipName('empire_trader', 'fr'); // -> "Imperial Clipper"
167
+ getEngineeringGroupName('frameShiftDrives', 'de'); // -> null
133
168
  ```
134
169
 
135
- Unqualified `zh` selects the source's Simplified Chinese (`zh-CN`) module names.
136
- Explicitly different Chinese scripts or regions such as `zh-TW` do not fall back to
137
- Simplified Chinese and return `null` unless a matching source is added.
170
+ The functions return an explicit source value verbatim, so a source-backed spelling may
171
+ happen to equal English; the library itself never supplies an English fallback.
172
+ Unqualified `zh` selects the source's Simplified Chinese (`zh-CN`) names. Explicitly
173
+ different Chinese scripts or regions such as `zh-TW` do not fall back to Simplified
174
+ Chinese and return `null` unless a matching source is added.
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.
138
180
 
139
181
  Registry lookups ignore case and surrounding whitespace. Material, commodity and
140
182
  module lookups search their complete registry by default and accept an optional
@@ -33,7 +33,7 @@ a verbatim copy produced at build time — edit this file, never the copy.
33
33
  boost and rotation through the thruster-mass and ENG-pip curves; shield strength and its
34
34
  mass curve; shield collapse delay, regeneration and SYS-capacitor recovery timing; armour
35
35
  hit points; resistance stacking with its diminishing returns; weapon DPS / capacitor
36
- draw / heat; and WEP-pip recharge with weapons-capacitor endurance. It credits the
36
+ draw / heat; SYS- and WEP-pip recharge; and weapons-capacitor endurance. It credits the
37
37
  original Frontier-forum research the formulas come from.
38
38
  - **The heat model** — the equilibrium heat level a thermal load settles at, how heat
39
39
  moves towards it over time, and the multiplier a drained weapons capacitor puts on a
@@ -49,9 +49,10 @@ a verbatim copy produced at build time — edit this file, never the copy.
49
49
  the game displays. Both
50
50
  describe Frontier's game and fall under the same Frontier notice as every other stat
51
51
  here; what differs is how they were arrived at, not who owns them.
52
- - **The jump-range and fuel algorithm**, **per-axis ENG-pip handling**, the **engineered
53
- ammunition rounding** rule and the **build metrics above** are cross-checked against, or
54
- ported as fact from, EDSY (credited under Data below). The jump-range model derives from
52
+ - **The jump-range and fuel algorithm**, **per-axis ENG-pip handling**, **ENG-capacitor
53
+ pip-scaled recharge**, the **engineered ammunition rounding** rule and the **build metrics
54
+ above** are cross-checked against, or ported as fact from, EDSY (credited under Data below).
55
+ The jump-range model derives from
55
56
  Frontier's "mass effect on hyperspace range" description; Coriolis carries the same maths
56
57
  for the metrics, and a clip round-up that omits EDSY's burst step, where EDSY is followed.
57
58
  - **Galactic codex region lookup** — resolving a region from galactic coordinates or from a
@@ -80,7 +81,7 @@ a verbatim copy produced at build time — edit this file, never the copy.
80
81
  engineering menus, per-ship module-count limits and fitted stabiliser increases, the
81
82
  baseline per-hull maximum heat dissipation, the
82
83
  Lynx Highliner's hull/slot figures and zero-pip minimum pitch, the journal slot names,
83
- localized module, blueprint and experimental-effect names, and the
84
+ localized module, blueprint, experimental-effect and engineering option-group names, and the
84
85
  attribute-to-journal-Label mapping. The values are Elite Dangerous game data — see the
85
86
  Frontier notice below. Heat dissipation is the one entry the game never shows a player:
86
87
  it is community measurement of Frontier's game, described under Algorithms above, and
@@ -91,7 +92,7 @@ a verbatim copy produced at build time — edit this file, never the copy.
91
92
  - **[Inara](https://inara.cz/)** — the blueprint and outfitting registries behind the
92
93
  Operations pre-engineered blueprints and shop rows, the ship pages used to corroborate
93
94
  hull layouts, and the component pages that grade the Thargoid caustic / Titan materials
94
- absent from FDevIDs.
95
+ absent from FDevIDs and classify Power Megaship Data as an Odyssey data resource.
95
96
  - **[EliteDangerousRegionMap](https://github.com/klightspeed/EliteDangerousRegionMap)** by
96
97
  **Ben Peddell** ([klightspeed](https://github.com/klightspeed)), **MIT** — the 42
97
98
  galactic codex regions, their ids and their lookup geometry. Original region-boundary
@@ -117,8 +118,9 @@ a verbatim copy produced at build time — edit this file, never the copy.
117
118
  **Jixxed**, **MIT** — supplies the personal suit and handheld-weapon identities, stats,
118
119
  journal symbols, grade-upgrade recipes and engineer-applied modification recipes. A
119
120
  CAPI response in its test resources also corroborates the six bundle-granted Vessel
120
- Hangar variants. The values and response are factual Elite Dangerous game data. Its MIT
121
- notice is reproduced below.
121
+ Hangar variants. Its language tables supply localized engineering-material and Odyssey
122
+ micro-resource display names. The values and response are factual Elite Dangerous game
123
+ data. Its MIT notice is reproduced below.
122
124
  - **[msarilar/EDEngineer](https://github.com/msarilar/EDEngineer)**, **MIT** for its code
123
125
  — its `blueprints.json` corroborates which weapons the Overcharged recipe gives a clip
124
126
  penalty to. The values are game data.
@@ -191,8 +193,8 @@ and
191
193
  [`data/commodities/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/commodities/SOURCES.md),
192
194
  with the rules those files follow in
193
195
  [`data/SNAPSHOTS.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/SNAPSHOTS.md).
194
- Those files live in the repository only this file is also published inside the npm
195
- 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.
196
198
 
197
199
  If you add or change data, port an algorithm, or add a dependency that warrants credit,
198
200
  add it here and record the provenance where the data lives.
@@ -201,8 +203,8 @@ add it here and record the provenance where the data lives.
201
203
 
202
204
  ## Odyssey Materials Helper license
203
205
 
204
- The personal-equipment data is derived from Odyssey Materials Helper, whose MIT notice
205
- is reproduced as required:
206
+ The personal-equipment data and localized material and micro-resource name tables are
207
+ derived from Odyssey Materials Helper, whose MIT notice is reproduced as required:
206
208
 
207
209
  ```
208
210
  Copyright (c) 2026 Jixxed