@elite-dangerous-almanac/core 0.2.8 → 0.2.9

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 (262) hide show
  1. package/PROVENANCE/astro/SOURCES.md +13 -12
  2. package/PROVENANCE/commodities/SOURCES.md +50 -6
  3. package/PROVENANCE/equipment/SOURCES.md +98 -20
  4. package/PROVENANCE/i18n/SOURCES.md +186 -80
  5. package/PROVENANCE/ships/SOURCES.md +344 -200
  6. package/README.md +10 -2
  7. package/THIRD_PARTY_NOTICES.md +11 -3
  8. package/dist/astro/body-rings.d.ts +2 -2
  9. package/dist/astro/codex-region-lookup.d.ts +1 -1
  10. package/dist/astro/codex-region-lookup.js +1 -1
  11. package/dist/astro/hand-authored-regions.d.ts +1 -1
  12. package/dist/astro/index.d.ts +1 -1
  13. package/dist/astro/index.js +1 -1
  14. package/dist/astro/naming-region-origins.d.ts +1 -1
  15. package/dist/astro/naming-region-origins.js +1 -1
  16. package/dist/astro/nebulae-all.d.ts +4 -6
  17. package/dist/astro/nebulae-all.js +1 -1
  18. package/dist/astro/nebulae-all.js.map +1 -1
  19. package/dist/astro/nebulae-planetary.d.ts +4 -5
  20. package/dist/astro/nebulae-planetary.js +1 -1
  21. package/dist/astro/nebulae-procgen.d.ts +3 -3
  22. package/dist/astro/nebulae-real.d.ts +3 -3
  23. package/dist/astro/nebulae.d.ts +8 -8
  24. package/dist/astro/permit-locked-regions.d.ts +2 -2
  25. package/dist/astro/permit-locked-systems.d.ts +1 -1
  26. package/dist/astro/permit-locks.d.ts +2 -2
  27. package/dist/astro/procedural-system.d.ts +3 -3
  28. package/dist/astro/procedural-system.js +1 -1
  29. package/dist/astro/system-address.d.ts +1 -1
  30. package/dist/astro/system-address.js +1 -1
  31. package/dist/astro/system-name.js +1 -1
  32. package/dist/{chunk-XSLPWM5N.js → chunk-2J6NNI3Y.js} +1 -1
  33. package/dist/{chunk-DWRNXUAX.js → chunk-2KIZN3BY.js} +1 -1
  34. package/dist/{chunk-J7BM5NGK.js → chunk-2TY42PTF.js} +1 -1
  35. package/dist/{chunk-773VO2GK.js → chunk-4T3TTYUT.js} +1 -1
  36. package/dist/{chunk-773VO2GK.js.map → chunk-4T3TTYUT.js.map} +1 -1
  37. package/dist/{chunk-W5ULI75F.js → chunk-7C7NJWCF.js} +1 -1
  38. package/dist/{chunk-W5ULI75F.js.map → chunk-7C7NJWCF.js.map} +1 -1
  39. package/dist/{chunk-IMNOEFUE.js → chunk-7Y5EK2VO.js} +1 -1
  40. package/dist/{chunk-IMNOEFUE.js.map → chunk-7Y5EK2VO.js.map} +1 -1
  41. package/dist/{chunk-2OBUSQA7.js → chunk-AAU7OM47.js} +1 -1
  42. package/dist/{chunk-2OBUSQA7.js.map → chunk-AAU7OM47.js.map} +1 -1
  43. package/dist/{chunk-GIGRBFIJ.js → chunk-AC3U7LRK.js} +1 -1
  44. package/dist/{chunk-GIGRBFIJ.js.map → chunk-AC3U7LRK.js.map} +1 -1
  45. package/dist/{chunk-BJU27V6C.js → chunk-AUBV6S7V.js} +1 -1
  46. package/dist/{chunk-BJU27V6C.js.map → chunk-AUBV6S7V.js.map} +1 -1
  47. package/dist/{chunk-DI5RXSJR.js → chunk-BVLBS2QY.js} +1 -1
  48. package/dist/{chunk-DI5RXSJR.js.map → chunk-BVLBS2QY.js.map} +1 -1
  49. package/dist/{chunk-IN36YSS4.js → chunk-C3YZ5KTA.js} +1 -1
  50. package/dist/{chunk-IN36YSS4.js.map → chunk-C3YZ5KTA.js.map} +1 -1
  51. package/dist/{chunk-6UNAD74Z.js → chunk-C4FUV6GF.js} +1 -1
  52. package/dist/{chunk-6UNAD74Z.js.map → chunk-C4FUV6GF.js.map} +1 -1
  53. package/dist/chunk-CEF7SMB2.js +1 -0
  54. package/dist/chunk-CEF7SMB2.js.map +1 -0
  55. package/dist/chunk-E2HDF6PJ.js +1 -0
  56. package/dist/chunk-E2HDF6PJ.js.map +1 -0
  57. package/dist/{chunk-OFZGNWBT.js → chunk-ETREYN5U.js} +1 -1
  58. package/dist/{chunk-OFZGNWBT.js.map → chunk-ETREYN5U.js.map} +1 -1
  59. package/dist/{chunk-KBCA4GEZ.js → chunk-FP2TQJZP.js} +1 -1
  60. package/dist/{chunk-YJAH6DFY.js → chunk-G7WARJ3X.js} +1 -1
  61. package/dist/chunk-G7WARJ3X.js.map +1 -0
  62. package/dist/{chunk-Z4OUB4SJ.js → chunk-GLTCCDN5.js} +1 -1
  63. package/dist/{chunk-Z4OUB4SJ.js.map → chunk-GLTCCDN5.js.map} +1 -1
  64. package/dist/chunk-GVNTKCVF.js +1 -0
  65. package/dist/chunk-GVNTKCVF.js.map +1 -0
  66. package/dist/{chunk-Q6YDPREF.js → chunk-GZLD7RTK.js} +1 -1
  67. package/dist/{chunk-Q6YDPREF.js.map → chunk-GZLD7RTK.js.map} +1 -1
  68. package/dist/{chunk-SC4MEHVY.js → chunk-HIJR7DOC.js} +1 -1
  69. package/dist/{chunk-SC4MEHVY.js.map → chunk-HIJR7DOC.js.map} +1 -1
  70. package/dist/{chunk-ETWMPMZP.js → chunk-K5JK3XQB.js} +1 -1
  71. package/dist/{chunk-GRIK3EDH.js → chunk-KY7KSPU6.js} +1 -1
  72. package/dist/{chunk-GRIK3EDH.js.map → chunk-KY7KSPU6.js.map} +1 -1
  73. package/dist/{chunk-EHFHRQEP.js → chunk-M4STXLXO.js} +1 -1
  74. package/dist/{chunk-EHFHRQEP.js.map → chunk-M4STXLXO.js.map} +1 -1
  75. package/dist/{chunk-5YEHJM6V.js → chunk-OSMBAFRW.js} +1 -1
  76. package/dist/{chunk-5YEHJM6V.js.map → chunk-OSMBAFRW.js.map} +1 -1
  77. package/dist/chunk-PIU24HRN.js +1 -0
  78. package/dist/chunk-PIU24HRN.js.map +1 -0
  79. package/dist/{chunk-ELT3FEA4.js → chunk-PKKBYBL4.js} +1 -1
  80. package/dist/{chunk-ELT3FEA4.js.map → chunk-PKKBYBL4.js.map} +1 -1
  81. package/dist/{chunk-6HMIF2RJ.js → chunk-Q647OXON.js} +1 -1
  82. package/dist/{chunk-6HMIF2RJ.js.map → chunk-Q647OXON.js.map} +1 -1
  83. package/dist/{chunk-BMQM4JBL.js → chunk-QPT2WJYN.js} +1 -1
  84. package/dist/{chunk-BMQM4JBL.js.map → chunk-QPT2WJYN.js.map} +1 -1
  85. package/dist/{chunk-3WGXGBW5.js → chunk-R2AEZYX7.js} +1 -1
  86. package/dist/{chunk-FJIWJYKO.js → chunk-RA4YJBU5.js} +1 -1
  87. package/dist/chunk-RA4YJBU5.js.map +1 -0
  88. package/dist/{chunk-MRLUWHGI.js → chunk-RJ3ZLQRB.js} +1 -1
  89. package/dist/{chunk-MRLUWHGI.js.map → chunk-RJ3ZLQRB.js.map} +1 -1
  90. package/dist/chunk-SFEQXUIA.js +1 -0
  91. package/dist/{chunk-WV7QCDL5.js → chunk-SIL356HB.js} +1 -1
  92. package/dist/{chunk-WV7QCDL5.js.map → chunk-SIL356HB.js.map} +1 -1
  93. package/dist/{chunk-OLKOWR7S.js → chunk-SS7HVNP5.js} +1 -1
  94. package/dist/{chunk-OLKOWR7S.js.map → chunk-SS7HVNP5.js.map} +1 -1
  95. package/dist/chunk-TRGHPX2O.js +1 -0
  96. package/dist/chunk-TRGHPX2O.js.map +1 -0
  97. package/dist/{chunk-GMTAFUAG.js → chunk-TYRH73MO.js} +1 -1
  98. package/dist/{chunk-GMTAFUAG.js.map → chunk-TYRH73MO.js.map} +1 -1
  99. package/dist/{chunk-7TVFV3VO.js → chunk-U3IRMXMR.js} +1 -1
  100. package/dist/{chunk-A7IVMYNF.js → chunk-U73MBQ45.js} +1 -1
  101. package/dist/{chunk-A7IVMYNF.js.map → chunk-U73MBQ45.js.map} +1 -1
  102. package/dist/{chunk-IZIIGK3W.js → chunk-UE22QU7A.js} +1 -1
  103. package/dist/{chunk-IZIIGK3W.js.map → chunk-UE22QU7A.js.map} +1 -1
  104. package/dist/{chunk-DBDCOHI4.js → chunk-UI5RROGI.js} +1 -1
  105. package/dist/{chunk-DBDCOHI4.js.map → chunk-UI5RROGI.js.map} +1 -1
  106. package/dist/chunk-URRPEUIK.js +1 -0
  107. package/dist/{chunk-QJECDMQQ.js.map → chunk-URRPEUIK.js.map} +1 -1
  108. package/dist/chunk-UTWZZOSA.js +1 -0
  109. package/dist/chunk-UTWZZOSA.js.map +1 -0
  110. package/dist/chunk-UVX7RCMP.js +1 -0
  111. package/dist/chunk-UVX7RCMP.js.map +1 -0
  112. package/dist/{chunk-7ATBEOVC.js → chunk-WG4DPXJI.js} +1 -1
  113. package/dist/{chunk-XFDMCPDW.js → chunk-WZIBBJHA.js} +1 -1
  114. package/dist/{chunk-XFDMCPDW.js.map → chunk-WZIBBJHA.js.map} +1 -1
  115. package/dist/{chunk-7EWZGDWY.js → chunk-X3MXPE7G.js} +1 -1
  116. package/dist/{chunk-7EWZGDWY.js.map → chunk-X3MXPE7G.js.map} +1 -1
  117. package/dist/{chunk-JCYOE3C4.js → chunk-XQJERZUS.js} +1 -1
  118. package/dist/{chunk-JCYOE3C4.js.map → chunk-XQJERZUS.js.map} +1 -1
  119. package/dist/{chunk-SD6GNFDX.js → chunk-YBE5M27G.js} +1 -1
  120. package/dist/{chunk-SD6GNFDX.js.map → chunk-YBE5M27G.js.map} +1 -1
  121. package/dist/chunk-ZBUTGTZ3.js +1 -0
  122. package/dist/chunk-ZBUTGTZ3.js.map +1 -0
  123. package/dist/commodities/commodities-all.d.ts +2 -2
  124. package/dist/commodities/commodities-all.js +1 -1
  125. package/dist/commodities/commodities-rare.d.ts +3 -4
  126. package/dist/commodities/commodities-rare.js +1 -1
  127. package/dist/commodities/commodities-standard.d.ts +7 -7
  128. package/dist/commodities/commodities-standard.js +1 -1
  129. package/dist/commodities/commodities.d.ts +12 -12
  130. package/dist/commodities/commodities.js +1 -1
  131. package/dist/commodities/index.js +1 -1
  132. package/dist/equipment/engineering.d.ts +11 -6
  133. package/dist/equipment/engineering.js +1 -1
  134. package/dist/equipment/index.d.ts +4 -4
  135. package/dist/equipment/index.js +1 -1
  136. package/dist/equipment/modification-journal.js +1 -1
  137. package/dist/equipment/modifications.d.ts +23 -14
  138. package/dist/equipment/modifications.js +1 -1
  139. package/dist/equipment/suits.d.ts +2 -145
  140. package/dist/equipment/suits.js +1 -1
  141. package/dist/equipment/tools.d.ts +102 -0
  142. package/dist/equipment/tools.js +1 -0
  143. package/dist/equipment/tools.js.map +1 -0
  144. package/dist/equipment/upgrade-costs.d.ts +2 -3
  145. package/dist/equipment/upgrade-costs.js +1 -1
  146. package/dist/equipment/weapons.d.ts +2 -135
  147. package/dist/equipment/weapons.js +1 -1
  148. package/dist/i18n/blueprints.d.ts +2 -3
  149. package/dist/i18n/blueprints.js +1 -1
  150. package/dist/i18n/commodities.d.ts +36 -0
  151. package/dist/i18n/commodities.js +1 -0
  152. package/dist/i18n/commodities.js.map +1 -0
  153. package/dist/i18n/experimental-effect-descriptions.d.ts +5 -6
  154. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  155. package/dist/i18n/experimental-effects.d.ts +2 -3
  156. package/dist/i18n/experimental-effects.js +1 -1
  157. package/dist/i18n/index.d.ts +19 -9
  158. package/dist/i18n/index.js +1 -1
  159. package/dist/i18n/materials.d.ts +2 -4
  160. package/dist/i18n/materials.js +1 -1
  161. package/dist/i18n/micro-resources.d.ts +2 -4
  162. package/dist/i18n/micro-resources.js +1 -1
  163. package/dist/i18n/module-families.d.ts +3 -5
  164. package/dist/i18n/module-families.js +1 -1
  165. package/dist/i18n/modules.d.ts +3 -6
  166. package/dist/i18n/modules.js +1 -1
  167. package/dist/i18n/personal-modifications.d.ts +4 -6
  168. package/dist/i18n/personal-modifications.js +1 -1
  169. package/dist/i18n/personal-tools.d.ts +33 -0
  170. package/dist/i18n/personal-tools.js +1 -0
  171. package/dist/i18n/personal-tools.js.map +1 -0
  172. package/dist/i18n/personal-weapons.d.ts +3 -4
  173. package/dist/i18n/personal-weapons.js +1 -1
  174. package/dist/i18n/pre-engineered.d.ts +1 -1
  175. package/dist/i18n/slots.d.ts +2 -2
  176. package/dist/i18n/suits.d.ts +36 -6
  177. package/dist/i18n/suits.js +1 -1
  178. package/dist/materials/index.d.ts +4 -3
  179. package/dist/materials/index.js +1 -1
  180. package/dist/materials/materials-all.d.ts +2 -2
  181. package/dist/materials/materials-all.js +1 -1
  182. package/dist/materials/materials-raw.d.ts +3 -4
  183. package/dist/materials/materials-raw.js +1 -1
  184. package/dist/materials/materials.d.ts +18 -15
  185. package/dist/materials/materials.js +1 -1
  186. package/dist/materials/micro-resources-all.d.ts +2 -2
  187. package/dist/materials/micro-resources-all.js +1 -1
  188. package/dist/materials/micro-resources-component.d.ts +2 -2
  189. package/dist/materials/micro-resources-consumable.d.ts +2 -2
  190. package/dist/materials/micro-resources-data.d.ts +2 -2
  191. package/dist/materials/micro-resources-item.d.ts +2 -2
  192. package/dist/materials/micro-resources.d.ts +17 -14
  193. package/dist/materials/micro-resources.js +1 -1
  194. package/dist/ships/ammunition.d.ts +4 -4
  195. package/dist/ships/blueprint-costs.d.ts +13 -13
  196. package/dist/ships/blueprint-costs.js +1 -1
  197. package/dist/ships/blueprint-journal.d.ts +3 -3
  198. package/dist/ships/blueprint-journal.js +1 -1
  199. package/dist/ships/blueprints.d.ts +3 -3
  200. package/dist/ships/build-metrics.d.ts +2 -1
  201. package/dist/ships/build-metrics.js +1 -1
  202. package/dist/ships/default-loadouts.d.ts +2 -3
  203. package/dist/ships/default-loadouts.js +1 -1
  204. package/dist/ships/engineering-options.d.ts +29 -32
  205. package/dist/ships/engineering-options.js +1 -1
  206. package/dist/ships/engineering.d.ts +1 -2
  207. package/dist/ships/engineering.js +1 -1
  208. package/dist/ships/experimental-effect-costs.d.ts +1 -1
  209. package/dist/ships/gunsights.d.ts +3 -3
  210. package/dist/ships/heat.d.ts +1 -1
  211. package/dist/ships/index.d.ts +4 -5
  212. package/dist/ships/index.js +1 -1
  213. package/dist/ships/loadout-validation.d.ts +1 -1
  214. package/dist/ships/module-families.d.ts +1 -1
  215. package/dist/ships/modules-all.d.ts +2 -3
  216. package/dist/ships/modules-all.js +1 -1
  217. package/dist/ships/modules-core.d.ts +3 -3
  218. package/dist/ships/modules-hardpoint.d.ts +4 -5
  219. package/dist/ships/modules-hardpoint.js +1 -1
  220. package/dist/ships/modules-internal.d.ts +5 -6
  221. package/dist/ships/modules-internal.js +1 -1
  222. package/dist/ships/modules-utility.d.ts +3 -4
  223. package/dist/ships/modules-utility.js +1 -1
  224. package/dist/ships/modules.d.ts +26 -24
  225. package/dist/ships/modules.js +1 -1
  226. package/dist/ships/pre-engineered-stats.d.ts +1 -1
  227. package/dist/ships/pre-engineered-stats.js +1 -1
  228. package/dist/ships/pre-engineered.d.ts +9 -10
  229. package/dist/ships/pre-engineered.js +1 -1
  230. package/dist/ships/shield-capacitor.js +1 -1
  231. package/dist/ships/ship-loadout.d.ts +7 -7
  232. package/dist/ships/ship-loadout.js +1 -1
  233. package/dist/ships/ships.d.ts +1 -2
  234. package/dist/ships/ships.js +1 -1
  235. package/dist/ships/slots.d.ts +5 -5
  236. package/dist/ships/weapons.js +1 -1
  237. package/dist/suits-B37rAORs.d.ts +414 -0
  238. package/dist/{system-address-cyJaeZIS.d.ts → system-address-DmzXRD48.d.ts} +6 -4
  239. package/package.json +13 -1
  240. package/dist/chunk-77TT4K53.js +0 -1
  241. package/dist/chunk-DAQ3PJ4R.js +0 -1
  242. package/dist/chunk-DAQ3PJ4R.js.map +0 -1
  243. package/dist/chunk-DHACRCLI.js +0 -1
  244. package/dist/chunk-DHACRCLI.js.map +0 -1
  245. package/dist/chunk-FJIWJYKO.js.map +0 -1
  246. package/dist/chunk-IUSMAX5T.js +0 -1
  247. package/dist/chunk-IUSMAX5T.js.map +0 -1
  248. package/dist/chunk-LWNBWRKL.js +0 -1
  249. package/dist/chunk-LWNBWRKL.js.map +0 -1
  250. package/dist/chunk-MT5AHPNP.js +0 -1
  251. package/dist/chunk-MT5AHPNP.js.map +0 -1
  252. package/dist/chunk-QJECDMQQ.js +0 -1
  253. package/dist/chunk-YJAH6DFY.js.map +0 -1
  254. /package/dist/{chunk-XSLPWM5N.js.map → chunk-2J6NNI3Y.js.map} +0 -0
  255. /package/dist/{chunk-DWRNXUAX.js.map → chunk-2KIZN3BY.js.map} +0 -0
  256. /package/dist/{chunk-J7BM5NGK.js.map → chunk-2TY42PTF.js.map} +0 -0
  257. /package/dist/{chunk-KBCA4GEZ.js.map → chunk-FP2TQJZP.js.map} +0 -0
  258. /package/dist/{chunk-ETWMPMZP.js.map → chunk-K5JK3XQB.js.map} +0 -0
  259. /package/dist/{chunk-3WGXGBW5.js.map → chunk-R2AEZYX7.js.map} +0 -0
  260. /package/dist/{chunk-77TT4K53.js.map → chunk-SFEQXUIA.js.map} +0 -0
  261. /package/dist/{chunk-7TVFV3VO.js.map → chunk-U3IRMXMR.js.map} +0 -0
  262. /package/dist/{chunk-7ATBEOVC.js.map → chunk-WG4DPXJI.js.map} +0 -0
@@ -18,6 +18,7 @@ Referred to throughout by source name; the pin is here, once.
18
18
  | Elite Dangerous in-game verification | game version `4.4.0.3`; direct in-game observation | 2026-08-14 UTC |
19
19
  | Elite Dangerous in-game purchase capture | no game version recorded; nine `ModuleBuyAndStore` journal entries from market `128666762`, 17:34-17:37, at a 10% and a 2.5% outfitting discount | 2026-08-30 UTC |
20
20
  | Elite Dangerous in-game outfitting observation | no game version recorded; direct in-game observation that outfitting offers no non-SCO size-8 frame shift drive | 2026-08-30 UTC |
21
+ | Elite Dangerous Large Planetary Vehicle Hangar readings | **unreleased** — observation of the modules an unreleased update adds, plus outfitting and journal `ModuleBuy` readings at a 10% and 2.5% discount | 2026-09-02 UTC |
21
22
 
22
23
  Every `eddb.js` derivation uses the baseline snapshot unless its catalogue note names
23
24
  the Vessel Hangar snapshot.
@@ -32,13 +33,13 @@ re-derived from a public source.
32
33
  Each hull is **one record** carrying its identity, its stats, and its slot layout —
33
34
  identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
34
35
 
35
- - **File:** `ships.jsonc` (48 player-flyable hulls).
36
+ - **File:** `ships.jsonc` (the player-flyable hulls).
36
37
  - **Identity source:** FDevIDs `shipyard.csv`, columns `id,symbol,name,entitlement`.
37
38
  - **Identity derivation:** records are carried over in shipyard order (roughly the
38
39
  order hulls were introduced): internal `symbol` and display `name`. The CSV's
39
40
  numeric ship-type `id` column is dropped — hulls are keyed by `symbol`.
40
- `entitlement` is FDevIDs' DLC/grant token, kept only where the CSV gives one (28 of
41
- the 48 hulls carry no entitlement, so the field is omitted rather than stored empty).
41
+ `entitlement` is FDevIDs' DLC/grant token, kept only where the CSV gives one (most
42
+ hulls carry no entitlement, so the field is omitted rather than stored empty).
42
43
  - **Stats + slots source:** coriolis-data `ships/*.json` — `properties` for manufacturer,
43
44
  numeric size class and stats,
44
45
  `slots` + `bulkheads` for the layout.
@@ -56,8 +57,8 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
56
57
  Masses are tonnes, speeds m/s, rotation rates deg/s. The in-game hull audit below
57
58
  overrides registry values where they disagree.
58
59
  - **Speed is stored as installed endpoints.** An Elite Dangerous `4.4.0.3` hull audit
59
- recorded 2026-08-14 UTC supplies `minimumSpeed` and `maximumSpeed` directly for all 48
60
- hulls.
60
+ recorded 2026-08-14 UTC supplies `minimumSpeed` and `maximumSpeed` directly for every
61
+ hull.
61
62
  The game's ratio values carry no independent information:
62
63
  `minThrust = 100 * minimumSpeed / maximumSpeed` and
63
64
  `pipSpeed = (maximumSpeed - minimumSpeed) / (4 * maximumSpeed)`. The ratios are
@@ -67,8 +68,8 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
67
68
  - **Angular rates are stored as zero- and four-ENG-PIP endpoints.** The same game audit
68
69
  supplies `minPitch`, `minRoll` and `minYaw` from each flight-default block. The
69
70
  selected full-rate words come from the hull overrides; an exact `-1.0` override
70
- sentinel selects the corresponding flight-default word. This structure holds for all
71
- 48 player hulls. EDSY's public handling implementation independently identifies these
71
+ sentinel selects the corresponding flight-default word. This structure holds for every
72
+ player hull. EDSY's public handling implementation independently identifies these
72
73
  minima as zero-ENG-PIP values and linearly interpolates each axis to its full rate.
73
74
  - **Installed English display names are taken verbatim from the game.** The Elite
74
75
  Dangerous `4.4.0.3` localisation audit recorded 2026-08-14 UTC replaces eight compact
@@ -111,8 +112,8 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
111
112
  measurement of Frontier's game rather than a stat the game displays. The baseline is
112
113
  EDSY `eddb.js` `ship[…].heatdismax` from the pinned snapshot, joined by
113
114
  case-insensitive `fdname` / `symbol`. A complete maintainer-supplied thermal audit
114
- from Elite Dangerous `4.4.0.3`, recorded 2026-08-14 UTC, governs all 48 values and
115
- supplies the nine corrections and omissions listed above. The other 39 values agree
115
+ from Elite Dangerous `4.4.0.3`, recorded 2026-08-14 UTC, governs every value and
116
+ supplies the nine corrections and omissions listed above. Every other value agrees
116
117
  with EDSY exactly.
117
118
  Each value is the load in thermal-load units per second shed at heat level 1. The
118
119
  stored catalogue range is Hauler `16.2` through Cutter `72.58`.
@@ -131,7 +132,7 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
131
132
 
132
133
  ### Gunsights
133
134
 
134
- - **File:** `gunsights.jsonc` (48 player-flyable hulls, 234 weapon hardpoints).
135
+ - **File:** `gunsights.jsonc` (every hardpoint on every player-flyable hull).
135
136
  - **Derivation:** each observation is joined to `ships.jsonc` by case-insensitive hull
136
137
  symbol. Its hardpoints are joined by exact journal slot key to the hardpoints returned
137
138
  by `enumerateSlots`, then written in the existing `Ship.hardpoints` order. One observed
@@ -152,14 +153,14 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
152
153
  `48.7663916349` written `48.76639`. Exact zero and tiny near-zero values both describe
153
154
  centerline mounts; the residuals are numeric precision, not meaningful sub-millimetre
154
155
  displacements to interpret or normalize.
155
- - **Manual corrections:** none. All 48 hulls and all 234 of their hardpoint slot keys join
156
+ - **Manual corrections:** none. Every hull and every hardpoint slot key joins
156
157
  one-to-one without correction.
157
158
 
158
159
  ### Default loadouts
159
160
 
160
- - **File:** `default-loadouts.jsonc` (48 hulls, 831 fitted modules).
161
+ - **File:** `default-loadouts.jsonc` (every hull's stock modules).
161
162
  - **Primary source:** EDSY `eddb.js` `ship[*].stock`, from the baseline pinned snapshot.
162
- It carries all 48 current hulls, including the Lynx Highliner absent from the pinned
163
+ It carries every current hull, including the Lynx Highliner absent from the pinned
163
164
  coriolis-data revision, and distinguishes current stock modules such as SCO frame
164
165
  shift drives, Supercruise Assist and Advanced Docking Computer.
165
166
  - **Derivation:** the source ship is joined to `ships.jsonc` by case-insensitive Frontier
@@ -169,8 +170,8 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
169
170
  then through EDSY's global module table; the resulting Frontier `fdname` becomes the
170
171
  stored module `symbol`. Zero entries are empty optional, hardpoint or utility mounts
171
172
  and are omitted. The output stores the layout's canonical journal slot key, not the
172
- source array position. All 831 fitted symbols and mounts resolve against the checked-in
173
- ship and module catalogues and pass the same compatibility rules as `ShipLoadout`.
173
+ source array position. Every fitted symbol and mount resolves against the checked-in
174
+ ship and module catalogues and passes the same compatibility rules as `ShipLoadout`.
174
175
  - **Planetary approach suite:** EDSY treats the approach suite as a built-in outside its
175
176
  stock arrays. `int_planetapproachsuite_advanced` is added to every hull's dedicated
176
177
  `PlanetaryApproachSuite` mount. Coriolis-data stores id `4F` (the advanced suite) on 46
@@ -217,6 +218,25 @@ include the Sub-Surface Extraction Missile (`Hpt_Human_Extraction_Fixed_Medium`)
217
218
  alongside the displacement missile it varies, so it counts as a mining tool despite its
218
219
  unrelated symbol.
219
220
 
221
+ **`vesselHangar` takes three families, where the registries list one.** Both carry the
222
+ Type-11's `FighterBay01` as fighter-hangars-only — coriolis `"eligible": { "fh": 1 }`,
223
+ EDSY `{ifh:1}` — and both were read before the modules existed. A journal `ModuleBuy`
224
+ records `int_mkiilargebuggybay_size4_class3` bought into that mount, over the
225
+ `int_fighterbay_size5_class1` it replaced, and both **unreleased** Large Planetary Vehicle
226
+ Hangar lines fit there, so the stored rule takes `int_largebuggybay` and
227
+ `int_mkiilargebuggybay` beside `int_fighterbay`. The plain line's prefix covers its
228
+ `_Free` grants, which fit wherever their sold twins do. In-game readings govern where a
229
+ registry disagrees, and here the registries are not wrong so much as older than the
230
+ modules.
231
+
232
+ **Neither Large Planetary Vehicle Hangar line carries `restrictedToSlot`.** Fitting one
233
+ mount does not reserve a module to that kind of mount, and neither line could be reserved
234
+ to `vesselHangar` anyway: of the thirteen hulls the Mk II line is restricted to, only the
235
+ Type-11 has such a mount, so on the other twelve it must be fitting ordinary optionals,
236
+ and the plain line carries no hull restriction at all. Those thirteen are exactly the hulls that can carry a
237
+ ship-launched vessel, which is what makes the hull list and the mount reading one fact
238
+ rather than two.
239
+
220
240
  **`passenger` rests on a capture as well as on EDSY**, and needs to. `PASSENGER` is the
221
241
  one restricted family absent from EDSY's journal import map and its `ipc` eligibility
222
242
  check is commented out in `edsy.js`, so the reservation alone confirmed no journal
@@ -236,7 +256,7 @@ stored on the mount, for example `{ "size": 1, "name": "Slot14_Size1" }`.
236
256
  EDSY's own — `edsy.js` reads them in `Build.fromJournal()` and writes them in
237
257
  `exportJournal()`. Only EDSY carries them; coriolis-data does not model journal slot
238
258
  names at all, so the corroborating source has to be captures, and five are in hand —
239
- four SLEF exports and one journal — covering four of the 13 hulls with names of their
259
+ four SLEF exports and one journal — covering four of the hulls with names of their
240
260
  own (below). One is a journal rather
241
261
  than an export: `journal-lynx-highliner.jsonc` gives Frontier's own casing for a hull the
242
262
  Inara export already covers in lower case, and one thing that export does not — its
@@ -273,7 +293,7 @@ size differs from coriolis's.
273
293
  - **Lynx Highliner** `Slot01_Size6`, **`Passenger01`–`03`**, `Slot02_Size5`, …
274
294
  - **Panther Clipper Mk II** and **Type-11 Prospector** are carried too, though the
275
295
  regular numbering derives their names. They are kept so the stored table matches EDSY's
276
- 13 entries one for one.
296
+ entries one for one.
277
297
 
278
298
  **The `_SizeN` suffix is Frontier's, and on three hulls it is wrong.** The Keelback, Asp
279
299
  Scout and Type-7 name mounts with a class the hull does not have there. That is the
@@ -351,17 +371,17 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
351
371
  outfitting categories.
352
372
  - **Identity source:** FDevIDs `outfitting.csv`, columns
353
373
  `id,symbol,category,name,mount,guidance,ship,class,rating,entitlement`, supplemented
354
- for the six bundle-granted Vessel Hangars by the pinned CAPI response below.
374
+ for the six bundle-granted Vessel Hangars by the pinned CAPI response below and for
375
+ the nine unreleased Large Planetary Vehicle Hangars by the readings pinned above.
355
376
  - **Identity derivation:** the acquired FDevIDs module records are kept in CSV order
356
- within each category file. The catalogue contains 484 internal records and **1194**
357
- records across all four categories. The CSV's numeric `id`
377
+ within each category file. The CSV's numeric `id`
358
378
  column is dropped — modules are keyed by `symbol` — and rows marked `removed` are
359
379
  excluded because they are not current outfitting modules. `class` is FDevIDs' `class` — the
360
380
  module size (0–8) — and `rating` its grade letter (A–I); together they are the "5A"
361
381
  the outfitting screen shows. `mount` (Fixed / Gimballed / Turreted) and `guidance`
362
382
  (Dumbfire / Seeker / Swarm) are stored only on the hardpoints that carry them; `ship`
363
383
  names the hull an armour variant belongs to (armour is the one ship-specific module,
364
- so only the 241 armour records carry it); `entitlement` is kept only where it is a
384
+ so only the armour records carry it); `entitlement` is kept only where it is a
365
385
  real DLC/grant token. `name` is FDevIDs' descriptive English label, including expanded
366
386
  forms such as Frame Shift Drive and Auto Field-Maintenance Unit.
367
387
  - **The CSV's `category` column is not stored — the file states it.** It would be the
@@ -377,7 +397,7 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
377
397
  fitting or an ordinary optional internal fits any mount of its kind that is large
378
398
  enough, so there is no single mount to name.
379
399
  - **Derivation:** the value is the mount the module is sold for in the outfitting
380
- screen, assigned by symbol family — the 241 `*_Armour_*` records are `armour`, the
400
+ screen, assigned by symbol family — the `*_Armour_*` records are `armour`, the
381
401
  `Int_PowerPlant_*`/`Int_GuardianPowerplant_*` are `powerPlant`, and so on through
382
402
  `Int_Engine_*` and `Int_MkIIAgileBoost_Engine_*` (`thrusters`), `Int_Hyperdrive_*`
383
403
  (`frameShiftDrive`), `Int_LifeSupport_*`, `Int_PowerDistributor_*`/
@@ -386,18 +406,17 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
386
406
  II's `Int_MkIIAgileBoost_Engine_*` thrusters.
387
407
  - **A fuel tank is the one module built for two kinds of mount:** it is `fuelTank`
388
408
  and also fits any optional slot large enough, exactly as the game sells it.
389
- - **`kind` is the ordinary engineering-menu family.** The 1000 records mapped by
409
+ - **`kind` is the ordinary engineering-menu family.** The records mapped by
390
410
  `engineering-options.jsonc` repeat that map's group key in the compact on-disk `kind`
391
- field. The remaining 194 records carry no `kind` because they have no ordinary
392
- engineering menu; this includes the five Enzyme/AX weapons, the fixed Mining Laser and
393
- Abrasion Blaster, and the 16 cargo racks documented under Engineering options below.
411
+ field. The rest carry no `kind` because they have no ordinary
412
+ engineering menu; this includes the Enzyme/AX weapons, the fixed Mining Laser and
413
+ Abrasion Blaster, and the cargo racks documented under Engineering options below.
394
414
  The group source, derivation, split
395
415
  Guardian families and coverage are documented under Engineering options below; this
396
416
  field is a projection of that map, not a separate classification source.
397
417
  - **`familyId` groups every outfitting list.** Every record in all four catalogues
398
- carries the id of the family its outfitting list shows it under: 516 core modules in
399
- 8 families, 484 internal modules in 32, 159 hardpoints in 25, and 35 utility fittings
400
- in 12. No family crosses an outfitting category. The ids and their canonical English
418
+ carries the id of the family its outfitting list shows it under. No family crosses an
419
+ outfitting category. The ids and their canonical English
401
420
  names are `module-families.jsonc`, below; localized labels are
402
421
  `data/i18n/module-family-names.jsonc`. Variants remain with the base family rather
403
422
  than fragmenting a list: Bi-Weave and Prismatic generators are `shieldGenerators`;
@@ -406,8 +425,8 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
406
425
  `passengerCabins` and `vesselHangars`. Guardian and AX weapons retain their distinct
407
426
  family where their function differs. A core record's family follows from its `slot`,
408
427
  which is on every one of them, so the two never disagree.
409
- - **`supercruiseOvercharge` — the SCO drive line.** The 36
410
- `Int_Hyperdrive_Overcharge_*` records carry `true`; the 31 plain drives of the same
428
+ - **`supercruiseOvercharge` — the SCO drive line.** The
429
+ `Int_Hyperdrive_Overcharge_*` records carry `true`; the plain drives of the same
411
430
  sizes and ratings, and every other record in all four catalogues, omit it.
412
431
  - **Source:** FDevIDs `outfitting.csv`, which sells the two drive lines under distinct
413
432
  symbol families and names the Overcharge one `Frame Shift Drive (SCO)`. No registry
@@ -417,7 +436,7 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
417
436
  above, and it is applied once here so that consumers read a datum instead of
418
437
  matching `Int_Hyperdrive_Overcharge` themselves — which a pre-engineered or fitted
419
438
  article's symbol does not always let them do. Stored as a sparse flag rather than a
420
- `true`/`false` pair on all 67 drives, following `alwaysPowered` and
439
+ `true`/`false` pair on every drive, following `alwaysPowered` and
421
440
  `guardianZoneResistance`.
422
441
  - **Nothing else is derived from it.** The two lines share every jump constant this
423
442
  catalogue carries (`optMass`, `maxFuel`, `fuelMul`, `fuelPower`, and the
@@ -426,14 +445,14 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
426
445
  calculation reads the flag; the
427
446
  overcharged supercruise behaviour the drives are named for has no published figures
428
447
  and none are stored.
429
- - **`cabinCapacity` — a passenger cabin's berths.** The 23 `passengerCabins` records
448
+ - **`cabinCapacity` — a passenger cabin's berths.** The `passengerCabins` records
430
449
  carry it; every other record in all four catalogues omits it, and no cabin carries a
431
450
  zero. It is the module's own seat count, not the ship's.
432
451
  - **Source:** coriolis-data
433
452
  `modules/internal/{economy,business,first,luxury}_passenger_cabin.json` (`passengers`)
434
453
  and EDSY `eddb.js` (`cabincap`, whose `fdattr` is the journal's `CabinCapacity`), from
435
- the snapshots pinned above. The two agree on every one of the 14 Mk I cabins, so
436
- neither is preferred; the nine Mk II cabins rest on EDSY alone, which is where their
454
+ the snapshots pinned above. The two agree on every Mk I cabin, so
455
+ neither is preferred; the Mk II cabins rest on EDSY alone, which is where their
437
456
  masses come from as well. FDevIDs publishes no capacity column.
438
457
  - **Values:** Mk I economy 2/4/8/16/32 by size 2–6, business 3/6/10/16 by size 3–6,
439
458
  first 3/6/12 by size 4–6 and luxury 4/8 by size 5–6. Mk II economy 3/6/12/24/48 by
@@ -448,19 +467,20 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
448
467
  publishes one (`cabincls`, values `E`/`B`/`F`/`L`), which this catalogue does not
449
468
  copy: the symbol already states the class, uniformly across both lines. The symbol's
450
469
  `_ClassN` suffix — not the `class` field, which is the slot size — is 1/2/3/4 for
451
- economy/business/first/luxury on all 23 records, which is what the English `name` and
470
+ economy/business/first/luxury on every record, which is what the English `name` and
452
471
  EDSY's `cabincls` both agree with; the `rating` field is what does not state it, for
453
472
  the reason above. The Mk I line runs all four, the Mk II line economy and business
454
473
  only.
455
474
  - **EDSY's five `Int_PassengerCabin_Size{2..6}_Class0` "Prisoner Cells" rows are not
456
475
  carried**, capacity or otherwise: EDSY has them commented out with a null `fdid`, and
457
476
  the inclusion rule below excludes an identity no registry offers to players.
458
- - **`grantOnly` — the articles that arrive granted rather than sold.** Fifteen records
459
- carry `true`: the nine `*_free` starter fittings (power plant, thrusters, drive, life
460
- support, distributor, sensors, fuel tank, shield generator, cargo rack) and the six
461
- `*_Free` Vessel Hangars. Every other record omits it, and nothing carries `false`.
462
- - **Source:** Frontier's own symbol naming, and for the six hangars the pinned CAPI
463
- response, which lists them `bundle: true` under the grant tokens
477
+ - **`grantOnly` — the articles that arrive granted rather than sold.** The records that
478
+ carry `true` are the nine `*_free` starter fittings (power plant, thrusters, drive, life
479
+ support, distributor, sensors, fuel tank, shield generator, cargo rack), the six
480
+ `*_Free` Vessel Hangars and the three **unreleased** `*_Class3_Free` Large Planetary
481
+ Vehicle Hangars. Every other record omits it, and nothing carries `false`.
482
+ - **Source:** Frontier's own symbol naming, and for the six Vessel Hangars the pinned
483
+ CAPI response, which lists them `bundle: true` under the grant tokens
464
484
  `ELITE_V_MKIFIGHTERBAY_FREE` / `ELITE_V_MKIIFIGHTERBAY_FREE` — see "Records sourced
465
485
  outside the baseline registries" below, which also reads that response's zero as the
466
486
  bundle charge rather than a purchase price. No registry publishes a field for
@@ -484,10 +504,10 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
484
504
  and supplied by the repository owner. The game publishes no immutable identifier for
485
505
  its localisation tables, so the acquired table is the evidence; it is the same table
486
506
  that supplies `data/i18n/module-family-names.jsonc`.
487
- - **Derivation:** 58 of the 77 families are named by an in-game outfitting category and
507
+ - **Derivation:** most families are named by an in-game outfitting category and
488
508
  take that category's English label verbatim — which is why `Cargo Scanners` is
489
509
  `Manifest Scanners`, `Torpedo Pylons` is `Torpedoes` and `Mine Launchers` is `Mines`.
490
- The remaining 19 keep the Almanac's own descriptive name, because the outfitting
510
+ The rest keep the Almanac's own descriptive name, because the outfitting
491
511
  screen does not name them separately. Each id is the camelCase form of its English
492
512
  name with punctuation removed.
493
513
  - **Merged families.** Where the game lists several Almanac families under one category,
@@ -560,9 +580,9 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
560
580
  zero would zero their DPS) and `burstrof: 0` on the Mining Volley Repeater, whose
561
581
  burst is a single shot.
562
582
  - **`shotSpeed` and `reloadTime` are absent on the weapons that have neither, and
563
- that absence is an answer.** The 49 weapons with no `shotSpeed` are the lasers, rail
583
+ that absence is an answer.** The weapons with no `shotSpeed` are the lasers, rail
564
584
  guns, Gauss cannons and mine launchers — nothing there travels, so there is no
565
- projectile speed to move. The 41 with no `reloadTime` are a _different and smaller_
585
+ projectile speed to move. Those with no `reloadTime` are a _different and smaller_
566
586
  family, the pulse, burst, beam and mining lasers alone: they have no clip and never
567
587
  reload, while rail guns, Gauss cannons and mine launchers all reload and all carry
568
588
  the stat. Neither registry publishes a figure for either set, and EDSY's per-family
@@ -576,8 +596,8 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
576
596
  computers, and Coriolis's own code reads a missing mass as zero (`Module.getMass()` →
577
597
  `this.mass || 0`). This catalogue reads an absent field as _unknown_ instead, so a
578
598
  single such module would make a whole hull's mass — and with it its jump range —
579
- impossible to compute. The 104 affected records (`Int_FuelScoop_*` ×40,
580
- `Int_Repairer_*` ×40, `Int_Refinery_*` ×20, `Int_DockingComputer_{Standard,Advanced}`,
599
+ impossible to compute. The affected records (`Int_FuelScoop_*`,
600
+ `Int_Repairer_*`, `Int_Refinery_*`, `Int_DockingComputer_{Standard,Advanced}`,
581
601
  `ModularCargoBayDoor`, `Int_DroneControl_ResourceSiphon`) say so outright, matching
582
602
  upstream's own `"mass": 0` on `Int_DetailedSurfaceScanner_Tiny`. **Verified, not
583
603
  assumed:** summing the Deep Black's module masses with these families excluded gives
@@ -626,7 +646,7 @@ Thirteen stored fields supply the base values referenced by engineering recipes:
626
646
  scanner and sensor suite carries
627
647
  `scannerRange`, while `maximumRange` is reserved for weapons and non-scanner utility
628
648
  effects.
629
- - **`EnergyPerRegen` needs no stored value.** All 57 shield generators carry
649
+ - **`EnergyPerRegen` needs no stored value.** Every shield generator carries
630
650
  `distributorDraw`, and EDSY (`genpwr`) and coriolis (`distdraw`) both confirm it is the
631
651
  same stat under the journal's other name.
632
652
  - **Four figures no third-party registry lists, derived from the family rule.** Three
@@ -641,11 +661,11 @@ Thirteen stored fields supply the base values referenced by engineering recipes:
641
661
  join makes it a reading.
642
662
  - **A weapon with no maximum range carries no Long Range falloff leg.** That leg is
643
663
  stored upstream as an overwrite in `[0, 1]` — a flag meaning "damage falls off from
644
- maximum range." On the 33
645
- weapons `Weapon_LongRange` reaches that have no range at all (missile and torpedo
664
+ maximum range." On the weapons `Weapon_LongRange` reaches that have no range at all
665
+ (missile and torpedo
646
666
  racks, mine launchers, flak mortars, the AX dumbfires) there is nothing to resolve
647
667
  against, and the recipe's `Range` leg is inert there for the same reason; the flag is
648
- dropped rather than published as a one-metre falloff. Seven of the 33 do carry a real
668
+ dropped rather than published as a one-metre falloff. A few of them do carry a real
649
669
  `falloffRange` — the flak mortars, the AX dumbfire missiles and the Disruptor pulse
650
670
  laser — and keep it unchanged: only the sentinel is ever dropped, and no record's
651
671
  `falloffRange` is small enough to be mistaken for one.
@@ -664,7 +684,7 @@ Thirteen stored fields supply the base values referenced by engineering recipes:
664
684
 
665
685
  ### Deliberately absent fields
666
686
 
667
- - **`integrity` is absent on 82 non-armour records** because no registry publishes one
687
+ - **`integrity` is absent on some non-armour records** because no registry publishes one
668
688
  for those families and the game's module panel shows none. Guardian hull reinforcement
669
689
  packages are in that set and do draw power,
670
690
  so "no integrity" is not a shorthand for "inert".
@@ -684,33 +704,36 @@ Two starter capacities are derived rather than read:
684
704
  2^size across all eight sizes of both families, with no exception.
685
705
 
686
706
  **In-game coverage, stated separately from registry coverage.** In-game verification
687
- covers **1188/1194** catalogue identities. Numeric verification covers **947/1194**
688
- non-armour modules, and the other **241/1194** verified identities are the ship-specific
689
- armour modules; their class, mass, hull boost and resistances retain their registry
690
- provenance rather than being described as game-verified. The six bundle-granted Vessel
691
- Hangars rely on the public registry and CAPI evidence below. Their stats match their
692
- ordinary twins, but they have not been independently checked in the module panel.
693
-
694
- Every numeric field available through in-game verification was compared. Exact
695
- full-field coverage includes `powerDraw`
696
- 826/832, `bootTime` 822/828, power-plant output and efficiency 43/43 each, every FSD
697
- field 67/67, every thruster heat-rate record 40/40, all six distributor fields 49/49,
698
- sensor range and angle 41/41, shield mass/strength curves 57/57, shield regeneration
699
- 57/57, shield-cell timing/reinforcement/heat 40/40, fuel-scoop rate 40/40,
700
- interdictor range/facing 20/20, cargo capacity 16/16, fuel capacity 9/9, hull
701
- reinforcement 30/30, module protection 20/20, shield addition 10/10, Guardian jump
702
- boost 5/5, weapon armour piercing 157/157, burst rounds 18/18, burst rate 16/16 and
703
- rounds per shot 19/19. `powerDraw` and `bootTime` have no discrepancies at all.
704
-
705
- In-game verification did not yield the 1176 store prices, hardpoint reserve ammo (120),
706
- projectile speed (111), rail-gun charge time (3), or the 23 hardpoint scanners'
707
- range/angle/time fields. Twenty-one hardpoint maximum-range values, ECM heat and reload,
708
- the 241 armour modules, blueprint grade rolls and crafting costs remain unverified too.
707
+ covers every catalogue identity except two sets. The six bundle-granted Vessel Hangars
708
+ rely on the public registry and CAPI evidence below their stats match their ordinary
709
+ twins, but they have not been independently checked in the module panel. The six
710
+ **unreleased** Large Planetary Vehicle Hangars sit outside it altogether: the game does
711
+ not offer them yet, so nothing about them can be read from a panel until the update
712
+ ships. Numeric verification covers the non-armour modules; the ship-specific armour
713
+ modules' class, mass, hull boost and resistances retain their registry provenance rather
714
+ than being described as game-verified.
715
+
716
+ Every numeric field available through in-game verification was compared, and the
717
+ comparison reached every record carrying the field, apart from the two sets named above,
718
+ which sit outside in-game verification of `powerDraw` and
719
+ `bootTime`. The fields compared are `powerDraw`, `bootTime`, power-plant output and
720
+ efficiency, every FSD field, thruster heat rate, all six distributor fields, sensor
721
+ range and angle, shield mass/strength curves, shield regeneration, shield-cell
722
+ timing/reinforcement/heat, fuel-scoop rate, interdictor range and facing, cargo
723
+ capacity, fuel capacity, hull reinforcement, module protection, shield addition,
724
+ Guardian jump boost, weapon armour piercing, burst rounds, burst rate and rounds per
725
+ shot. Of those, `powerDraw` and `bootTime` agreed everywhere; where the others
726
+ disagreed, the corrections are tabulated below.
727
+
728
+ In-game verification did not yield store prices, hardpoint reserve ammo,
729
+ projectile speed, rail-gun charge time, or the hardpoint scanners'
730
+ range/angle/time fields. Hardpoint maximum-range values, ECM heat and reload,
731
+ the armour modules, blueprint grade rolls and crafting costs remain unverified too.
709
732
  It also did not unambiguously settle the shield-generator resistances, shield-booster
710
- properties or probe radius. Those values are not changed on guesswork. For the 34
733
+ properties or probe radius. Those values are not changed on guesswork. For the
711
734
  anti-xeno, Guardian and special weapons whose damage observed in-game does not reduce honestly
712
735
  to one conventional scalar, `damageComponents` preserves the exact amounts. The two
713
- channel types not established by in-game verification remain `unclassified`. Ten
736
+ channel types not established by in-game verification remain `unclassified`. The
714
737
  projectile-limited hardpoints carry their boundary parameters observed in-game in
715
738
  `projectileRange`; those parameters are not presented as effective ranges.
716
739
 
@@ -750,7 +773,7 @@ and its `PowerDraw` leg reads ×1.15 in the same block.
750
773
  A fourth label, `Jitter`, already resolved to `jitter`. A capture states it as
751
774
  `OriginalValue: 0` on a missile rack whose record holds no such field — a weapon that
752
775
  carries no jitter fires true. That zero is a value rather than an absence, so it is a
753
- `defaultBase` like `roundsPerShot`'s 1. It applies to the 66 weapons offered Rapid Fire,
776
+ `defaultBase` like `roundsPerShot`'s 1. It applies to the weapons offered Rapid Fire,
754
777
  its multi-cannon spelling, or Inertial Impact (`special_distortion_field`) that hold no
755
778
  jitter of their own.
756
779
 
@@ -759,10 +782,9 @@ external readings of an unmodified weapon's folded figure. On a beam laser the f
759
782
  trivial because `damage` is already per second; the huge and medium gimballed beams have
760
783
  no separate journal `Damage` reading.
761
784
 
762
- **Every module in every catalogue carries at least one stat** (1194/1194), and no
763
- record holds only a lone `mass`. 244 of the 828 `bootTime` values are `0` (every hardpoint
764
- among them); they are stored rather than omitted, because an absent field means
765
- absent.
785
+ **Every module in every catalogue carries at least one stat**, and no record holds only a
786
+ lone `mass`. Many `bootTime` values are `0` (every hardpoint among them); they are stored
787
+ rather than omitted, because an absent field means absent.
766
788
 
767
789
  **`Int_DroneControl_ResourceSiphon` has a mass of 0 t.** The value is read directly from
768
790
  in-game: 0 t mass, alongside integrity 20, power draw 0.4 MW and boot time 0 s. It is not
@@ -811,8 +833,8 @@ or where no corresponding in-game value was available:
811
833
  | `Hpt_HeatSinkLauncher_Turret_Tiny` | `ammoMaximum` | 3 | 2 | a journal states the base as 2, and EDSY agrees; in-game verification does not reach hardpoint reserve ammo |
812
834
  | `Hpt_Guardian_ShardCannon_Fixed_Medium` | `shotSpeed` | 1133 | 1133.333374 | Frontier's journal states the base beside the tech-broker Modified variant's engineered value |
813
835
 
814
- **In-game corrections.** Values are stored at the observed in-game precision. These groups
815
- account for 300 fields on 135 modules in addition to the Resource Siphon:
836
+ **In-game corrections.** Values are stored at the observed in-game precision. Beyond the
837
+ Resource Siphon, the corrections are:
816
838
 
817
839
  | Records | Fields | Stored in-game values |
818
840
  | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------ |
@@ -822,11 +844,11 @@ account for 300 fields on 135 modules in addition to the Resource Siphon:
822
844
  | `Int_MetaAlloyHullReinforcement_Size{1..5}_Class{1,2}` | caustic resistance | 0.02 on all ten |
823
845
  | shield generators | regeneration / broken regeneration | observed 1.06–5.76 values per symbol |
824
846
  | `Int_ShieldCellBank_Size1_Class2`; `Int_FuelScoop_Size4_Class5` | reserve ammo; scoop rate | 1; 0.343 t/s |
825
- | Beam Laser, Cannon, Fragment Cannon, Multi-Cannon, Plasma Accelerator, Rail Gun, Shock Cannon and Point Defence records | damage / thermal load | 34 scalar damage and 55 thermal-load corrections |
847
+ | Beam Laser, Cannon, Fragment Cannon, Multi-Cannon, Plasma Accelerator, Rail Gun, Shock Cannon and Point Defence records | damage / thermal load | `damage` and `thermalLoad` read from the module panel per symbol |
826
848
  | Advanced Plasma Accelerator, Imperial Hammer, Shock Cannons and Mk II Plasma Shock Accelerator | burst interval / combined rate of fire | exact cycle values derived with the catalogue's documented formula |
827
849
  | mining, utility and Guardian hardpoints | clip, distributor draw, reload, jitter, falloff and maximum range | observed values per symbol |
828
- | anti-xeno, Guardian and special weapons | scalar, distribution and exact damage components | 34 component records |
829
- | AX missiles, subsurface displacement missiles and seismic charge launchers | projectile boundary parameters; misleading ordinary ranges absent | ten records and 16 absences |
850
+ | anti-xeno, Guardian and special weapons | scalar, distribution and exact damage components | one component record per weapon |
851
+ | AX missiles, subsurface displacement missiles and seismic charge launchers | projectile boundary parameters; misleading ordinary ranges absent | `projectileRange` stored; `maximumRange` and `falloffRange` absent |
830
852
 
831
853
  In-game verification gives the integer thruster/FSD masses, 1.1/1.2 enhanced-thruster
832
854
  acceleration multipliers and the rising Guardian Shield Reinforcement integrity ladder.
@@ -869,7 +891,7 @@ heuristic does not keep rediscovering them:
869
891
  distributor integrity otherwise tracks 0.80× the A-rated standard ladder, which would
870
892
  put size 5 near 85; EDSY states 99 for both sizes. The duplicate is in the game data.
871
893
  - **`Int_DroneControl_Recon_Size5_Class1` `bootTime` really is 9.85** — the only
872
- non-integer boot time in all 1194 records, where its three family siblings are exactly 10.
894
+ non-integer boot time in the whole catalogue, where its three family siblings are exactly 10.
873
895
  EDSY gives `boottime:9.85`.
874
896
 
875
897
  ### Prices — `cost` on modules, `hullCost` / `retailCost` on hulls
@@ -884,11 +906,11 @@ the Lynx Highliner, which has no coriolis entry.
884
906
  Ship-specific **armour** is priced from each hull's `bulkheads` upstream, joined on hull
885
907
  and bulkhead name because those records carry no symbol upstream.
886
908
 
887
- - **All 48 hulls are priced. 1176 of 1194 modules are.** The 18 without a price are the
888
- fifteen grant/starter `*_free` variants, the two unsold Corrosion Resistant Cargo Racks
909
+ - **Every hull is priced, and nearly every module.** The ones without a price are the
910
+ grant/starter `*_free` variants, the two unsold Corrosion Resistant Cargo Racks
889
911
  (both Community Goal rewards) and `Int_ShieldGenerator_Size1_Class4` — no registry
890
- publishes a figure for them. The three Mk II Vessel Hangars are no longer among them:
891
- they are priced from an in-game purchase capture, below.
912
+ publishes a figure for them. The three Mk II Vessel Hangars are priced from an in-game
913
+ purchase capture, below.
892
914
  **`cost` is omitted, never set to 0**: `0` is a real price (the starter
893
915
  Lightweight Alloy bulkhead costs nothing), while omission means unknown.
894
916
  - **Sixteen duplicated symbols take the first occurrence's price.** Where coriolis-data
@@ -1102,7 +1124,10 @@ and size-6 racks): here the discount is stated rather than solved for.
1102
1124
  Clipper Mk II, and coriolis-data describes them as a "Panther Clipper storage rack")
1103
1125
  and the three Mk II Vessel Hangars → `["Explorer_NX", "PantherMkII", "LakonMiner"]`
1104
1126
  (EDSY has no record for the Mk II bays at all, so their restriction rests on
1105
- Frontier's update notes and Inara). Armour records use the `ship` field instead.
1127
+ Frontier's update notes and Inara), plus the three **unreleased** Mk II Large
1128
+ Planetary Vehicle Hangars → the thirteen hulls listed under "Records sourced outside
1129
+ the baseline registries" below, where the plain Large hangars beside them carry no
1130
+ restriction. Armour records use the `ship` field instead.
1106
1131
  - **`restrictedToSlot`** is the same idea one axis over: the slot restriction a module
1107
1132
  requires, so it fits only mounts carrying it — the mirror of a mount's `restriction`,
1108
1133
  and the half `restrictedToShips` cannot express. Five records have one: the two
@@ -1122,8 +1147,8 @@ and size-6 racks): here the discount is stated rather than solved for.
1122
1147
  optional: a plain cargo rack fits a `cargo` mount _and_ every unrestricted one, and
1123
1148
  does not carry it. The set of five is pinned, so widening it is a deliberate act.
1124
1149
  - **`exclusionGroup`** carries EDSY's one-per-ship `limit` families, renamed from its
1125
- compact ids to stable descriptive values. EDSY has 17 one-per-ship source families;
1126
- the stored set covers 194 internal and utility records in 16 of them: shield
1150
+ compact ids to stable descriptive values. The stored set covers the internal and
1151
+ utility records in all but one of EDSY's one-per-ship source families: shield
1127
1152
  generators (standard, bi-weave and prismatic
1128
1153
  share one group), fuel scoops, refineries, frame-shift-drive interdictors, Guardian
1129
1154
  FSD boosters, vessel hangars, docking computers, supercruise assist, multi-limpet
@@ -1133,10 +1158,10 @@ and size-6 racks): here the discount is stated rather than solved for.
1133
1158
  are not current outfitting records; `Int_SupercruiseAssist` matches EDSY's
1134
1159
  `Int_SuperCruiseAssist` case-insensitively, as Frontier symbols are matched elsewhere.
1135
1160
  The three Mk I bundle-granted and all six Mk II Vessel Hangars are absent from the
1136
- baseline table; they join to the separately pinned Vessel Hangar snapshot, where all
1137
- nine carry the same `limit:'ifh'` as the ordinary Mk I records.
1138
- - **`limitGroup` / `limitIncrease` preserve EDSY's non-exclusive fitting limit.** All
1139
- 33 current hardpoint records whose EDSY module carries `limit:'hex'` store
1161
+ baseline table; they join to the separately pinned Vessel Hangar snapshot, where each
1162
+ carries the same `limit:'ifh'` as the ordinary Mk I records.
1163
+ - **`limitGroup` / `limitIncrease` preserve EDSY's non-exclusive fitting limit.** Every
1164
+ current hardpoint record whose EDSY module carries `limit:'hex'` stores
1140
1165
  `limitGroup:'experimentalWeapon'`; the source's `eddb.limit.hex` is `4`. This is the
1141
1166
  shared AX/Guardian experimental-weapon allowance, not a name-based classification:
1142
1167
  the marked set is exactly the source set, including the Caustic Missile Rack and
@@ -1165,6 +1190,117 @@ and size-6 racks): here the discount is stated rather than solved for.
1165
1190
 
1166
1191
  Records not in coriolis-data / FDevIDs at the acquired revisions:
1167
1192
 
1193
+ - **Large Planetary Vehicle Hangars — nine records that are UNRELEASED.** They are
1194
+ carried ahead of the update that adds them, and split into a line that is observed and
1195
+ a line that is not:
1196
+ - `Int_LargeBuggyBay_Size{2,4,6}_Class3` and their `_Free` grant twins, named **Large
1197
+ Planetary Vehicle Hangar** — identity and stats from the in-game observation pinned
1198
+ above.
1199
+ - `Int_MkIILargeBuggyBay_Size{2,4,6}_Class3`, named **Mk II Large Planetary Vehicle
1200
+ Hangar** — stats from the same observation, with the size-4 identity, its price and
1201
+ its mount read from a journal `ModuleBuy`. See "The Mk II line's identity comes from
1202
+ a journal" below.
1203
+
1204
+ No registry carries any of the nine, and the game cannot be asked about most of them
1205
+ until the update ships, so none is registry-confirmed and all are outside in-game
1206
+ *verification* as this file uses the term — including the size-4 Mk II record, which a
1207
+ journal does carry. #16 tracks the verification and lists what closes it; a reading on
1208
+ release that disagrees wins outright, symbols included.
1209
+ - **The observed line's identity is settled.** The symbol is `Int_LargeBuggyBay_`, not
1210
+ the `Int_BuggyBay_…_Class3` this catalogue first guessed — the same `Large` prefix
1211
+ Frontier uses for `Int_LargeCargoRack_Size{7,8}_Class1`, whose display name is "Mk II
1212
+ Cargo Rack". The observation also carries three `_Free` grant twins, spelled as the
1213
+ Vessel Hangars' are.
1214
+ - **Observed stats.** Integrity 30 and boot time 5 s throughout, matching every shipped
1215
+ hangar; mass 12/20/34 t and power draw 0.75/1.2/1.8 MW at sizes 2, 4 and 6. The
1216
+ `_Free` twins carry the same four values as their sold twins, so they are stored with
1217
+ them rather than left blank.
1218
+ - **The size-2 record was derived before it was observed, and the derivation held.**
1219
+ It was reasoned from two relations across the shipped hangars — the Large hangar
1220
+ taking the shipped `Class1` mass and the shipped `Class2` power draw — which
1221
+ produced exactly the 12 t and 0.75 MW later observed. The relations are recorded
1222
+ because they still carry the Mk II line, which has no observation.
1223
+ - **`rating` is `F`, and a `C` alongside it is a mapping artefact.** The shipped
1224
+ hangars are `Class1` rating H and `Class2` rating G, so this family does not use the
1225
+ ordinary class-to-letter ladder that would make a `Class3` record a C. F continues
1226
+ its own ladder and F is what the outfitting panel reads, which settles it: the
1227
+ panel is the grade letter's source everywhere in this catalogue. The `C` seen beside
1228
+ these records is what a generic quality-tier mapping produces, applied to a family
1229
+ that does not use that ladder, and it is not carried.
1230
+ - **`vehicleSlots` is observed as 1, 2 and 4 by size — and still not stored.** The
1231
+ observation carries the count for both lines and it matches the shipped hangars of
1232
+ the same sizes. No module record in this catalogue carries a vehicle-slot field, the
1233
+ six shipped hangars included, so adding one is a schema change covering all fifteen
1234
+ hangars rather than something to smuggle in beside unreleased records. The figures
1235
+ are kept here so they are not lost.
1236
+ - **`entitlement` is omitted.** The six shipped hangars carry
1237
+ `ELITE_HORIZONS_V_PLANETARY_LANDINGS`; the Mk II Vessel Hangars, the closest recent
1238
+ addition of the same shape, carry no token at all. Nothing states one for these, and
1239
+ an invented token would be worse than an absent one. The `_Free` twins take
1240
+ `grantOnly` from Frontier's own `_Free` suffix, as §`grantOnly` describes, and no
1241
+ token either.
1242
+ - **The Mk II line's identity comes from a journal.** A `ModuleBuy` entry names
1243
+ `$int_mkiilargebuggybay_size4_class3_name;`, localised "Mk II Large Planetary Vehicle
1244
+ Hangar" — so the prefix is `Int_MkIILargeBuggyBay_`, one word, and the earlier
1245
+ `Int_BuggyBayMk2_` guess is gone. Its stats are 9/15/25.5 t at 0.5/0.8/1.2 MW,
1246
+ integrity 30 and boot time 5 s, at sizes 2, 4 and 6.
1247
+ - **Only the size-4 identity is read; the other two are extended from it.** The
1248
+ journal names one module. Sizes 2 and 6 keep the same prefix and the same
1249
+ `_Size{n}_Class3` shape, which is how every other sized family in this catalogue
1250
+ spells itself, and their stats are observed. It is a narrow extension of a read
1251
+ identity rather than a guess, but it is still an extension.
1252
+ - **The casing is reconstructed.** A journal spells a symbol in lower case, and
1253
+ FDevIDs — which supplies casing everywhere else here — has no row yet.
1254
+ `Int_MkIILargeBuggyBay_` follows `Int_MkII_PassengerCabin_`'s `MkII` and the
1255
+ observed `Int_LargeBuggyBay_`, minus the separator the journal shows is absent.
1256
+ Nothing turns on it: this catalogue matches symbols case-insensitively.
1257
+ - **The Mk II line has no observed `_Free` grant twin**, where the plain line has
1258
+ three. Whether that is a real asymmetry or a gap in what has been seen is open.
1259
+ - **Only the Mk II records are ship-restricted**, to the thirteen hulls reported:
1260
+ `TypeX_2`, `Anaconda`, `BelugaLiner`, `Explorer_NX`, `Federation_Corvette`,
1261
+ `Federation_Gunship`, `Cutter`, `Independant_Trader`, `Krait_MkII`, `PantherMkII`,
1262
+ `Type9`, `Type9_Military` and `LakonMiner` — stored in the order they were reported.
1263
+ The plain line carries no restriction, and nothing read so far shows one. **How wide
1264
+ that line's hull coverage actually is has not been established**, so its absent
1265
+ restriction is the reading its silence supports rather than a positive fact.
1266
+ - **The thirteen are exactly the hulls that can carry a ship-launched vessel**, and
1267
+ the journal reading is what makes that legible rather than coincidental: the Mk II
1268
+ hangar was bought into the Type-11's `FighterBay01`, the one vessel-hangar-restricted
1269
+ mount in the catalogue, over the Vessel Hangar it replaced. §`restriction` carries
1270
+ the mount half of this, including why neither line takes `restrictedToSlot`.
1271
+ - **Prices are stored at list, recovered from six discounted readings** — one per sold
1272
+ record, all at a 10% and a 2.5% outfitting discount. The readings are 28 431 at size
1273
+ 2, 113 724 at size 4 and 909 792 at size 6, **the same figure for the plain and the
1274
+ Mk II record at each size**. Run each through the discount model §Prices measures —
1275
+ `paid = ceil(ceil(list * 9/10) * 39/40)` — and all three come back exactly from a
1276
+ round list figure that is 1.5x the shipped `Class2` hangar of the same size: 32 400,
1277
+ 129 600 and 1 036 800 against 21 600, 86 400 and 691 200. `cost` stores that recovered
1278
+ list price, as it does everywhere else. This overrides an early note that the size-2
1279
+ figure carried no 2.5% discount: undiscounted, 28 431 would be 1.316x its `Class2`
1280
+ sibling, against a 1.5x that lands on a round number and holds for all three sizes at
1281
+ once. The size-4 Mk II reading is a journal `ModuleBuy` `BuyPrice`; the rest are
1282
+ outfitting readings.
1283
+ - **The two lines really do share a price, and that was doubted here.** A Mk II
1284
+ article costing exactly its plain sibling is not how the Mk I and Mk II Vessel
1285
+ Hangars behave, which differ at every size, so this file previously called the
1286
+ shared size-6 figure unlikely to survive. Readings at all three sizes, taken for
1287
+ both lines, say otherwise. The price tracks the size, not the mark.
1288
+ - **No reading pins its list price on its own.** Under a ceiling at each step,
1289
+ `list - 1` reproduces the same paid figure for all three sizes (32 399, 129 599 and
1290
+ 1 036 799 do), exactly as `unique: false` marks two rows of the purchase capture.
1291
+ What settles them is the 1.5x relation landing on a round number three times over,
1292
+ and that is weaker than a reading — the one part of the price story a release does
1293
+ not automatically confirm.
1294
+ - **The `_Free` twins carry no price**, as the bundle-granted Vessel Hangars do not:
1295
+ a grant has no list price, and `cost` is omitted rather than set to 0.
1296
+ - **They are exempt from nothing else.** The nine carry stats, so they are among the
1297
+ records carrying at least one; the six sold ones carry a price; and all nine are
1298
+ outside in-game verification, which the `registryOnlyIdentities` count in
1299
+ `fixtures/ships/module-stats.jsonc` pins alongside the bundle-granted Vessel Hangars.
1300
+ `data/i18n/module-names.jsonc` carries the plain line's name in all six locales; the
1301
+ Mk II line's English is read and its five other locales are constructed, which
1302
+ §`module-names.jsonc` there records as a manual correction.
1303
+
1168
1304
  - **Vessel Hangars** — the three Mk II records
1169
1305
  (`Int_FighterBayMk2_Size{5,6,7}_Class1`) have the same operational stats as the Mk I
1170
1306
  bays at half the mass (10/20/30 t, integrity 60/80/120, power
@@ -1228,12 +1364,12 @@ Records not in coriolis-data / FDevIDs at the acquired revisions:
1228
1364
  same _kind_ of judgement on thinner evidence, and a contrary in-game reading should
1229
1365
  reverse it.
1230
1366
  - **The 2026-08-14 in-game audit's totals counted these five as verified, and are
1231
- restated.** That audit reported `identityMatches` 1193 of 1199 with 952 non-armour
1232
- modules checked numerically, and "every FSD field 72/72" — figures that could not have
1233
- been true of five records the game does not offer. The corrected accounting is 1188
1234
- identity matches, 947 non-armour modules and 67/67 FSD fields, with
1235
- `registryOnlyIdentities` at 6. Those are the standing audit figures; the source
1236
- capture itself has not changed.
1367
+ corrected here.** That audit reported `identityMatches` 1193 of 1199 with 952
1368
+ non-armour modules checked numerically, and "every FSD field 72/72" — figures that
1369
+ could not have been true of five records the game does not offer. Corrected, those
1370
+ five drop out of the identity, non-armour and FSD totals alike. They leave the
1371
+ catalogue; they do not join the registry-only set, which stays limited to the
1372
+ bundle-granted Vessel Hangars. The source capture itself has not changed.
1237
1373
  - **1B Shield Generator** (`Int_ShieldGenerator_Size1_Class4`) — a gap in FDevIDs, not
1238
1374
  in the game: every other shield-generator size carries all five ratings, and size 1
1239
1375
  ran E/D/C/A with **B missing**. The module is real, so the record is carried with the
@@ -1265,6 +1401,15 @@ Records not in coriolis-data / FDevIDs at the acquired revisions:
1265
1401
  the three unknown fields are omitted.
1266
1402
  - The built-in **Cargo Hatch** is stored once as `ModularCargoBayDoor`; per-hull
1267
1403
  duplicates of the same fitting are not carried separately.
1404
+ - **The nine Large Planetary Vehicle Hangars are a standing exception, and the only
1405
+ one.** No registry lists them and no player-facing capture establishes them, because
1406
+ the update that adds them has not shipped — so the rule, read as written, excludes
1407
+ them. They are carried anyway so that the work of adding them is reviewable before
1408
+ release rather than after; §"Records sourced outside the baseline registries" says
1409
+ which are observed, which are reported and which are guessed. The exception closes
1410
+ the moment the update ships: either a real source confirms them, and they become
1411
+ ordinary records, or it does not, and they come out — #16. It is not a precedent for
1412
+ carrying any other unreleased identity.
1268
1413
 
1269
1414
  ## Engineering (blueprints and experimental effects)
1270
1415
 
@@ -1333,7 +1478,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1333
1478
 
1334
1479
  - **Files:** `blueprints.jsonc` (per-blueprint, per-grade stat modifiers),
1335
1480
  `blueprint-costs.jsonc` (the matching per-grade material requirements),
1336
- `blueprint-merc-coin-costs.jsonc` (the per-roll Merc-Coin amounts the 25 recipes that
1481
+ `blueprint-merc-coin-costs.jsonc` (the per-roll Merc-Coin amounts the recipes that
1337
1482
  charge a currency bill alongside those materials),
1338
1483
  `blueprint-journal-names.jsonc` (the three recipe ids whose journal spelling collides
1339
1484
  with another recipe), `experimental-effects.jsonc` (special-effect stat modifiers and
@@ -1349,14 +1494,14 @@ up straight through with no disambiguation at all. Both paths are evidence that
1349
1494
  - **Display names:** each blueprint and experimental effect carries its `name`.
1350
1495
  Effect names are the English strings observed in-game. Blueprint names are coriolis
1351
1496
  `blueprint.name` for the 81 blueprints coriolis carries, and the Operations dossier's
1352
- display label for the other 26 — the 25 Operations keys and `GuardianModule_Sturdy`,
1497
+ display label for the rest — the Operations keys and `GuardianModule_Sturdy`,
1353
1498
  which is journal-keyed but absent from coriolis, so its name comes from the Inara
1354
1499
  registry like the Operations keys' own.
1355
1500
  - **These are the short modifier labels, not the full outfitting-panel
1356
1501
  strings — deliberately.** The panel calls `Weapon_LongRange` "Long-Range Weapon",
1357
1502
  `ShieldBooster_HeavyDuty` "Heavy Duty Shield Booster" and
1358
1503
  `Armour_Advanced` "Lightweight Armour"; this catalogue says "Long range", "Heavy
1359
- duty" and "Lightweight". Nearly all 81 differ that way, because a blueprint's name
1504
+ duty" and "Lightweight". Nearly all of them differ that way, because a blueprint's name
1360
1505
  is read next to the module it is applied to, where repeating the module's own name
1361
1506
  is noise. The convention is house style and is kept: switching to the panel strings
1362
1507
  would change every blueprint record's `name` for no gain. Two names were wrong in
@@ -1365,12 +1510,11 @@ up straight through with no disambiguation at all. Both paths are evidence that
1365
1510
  and `special_choke_canister` **"Ion Disruption"** (not "Ion Disruptor").
1366
1511
  - **Blueprint journal names — three collisions, stored separately from mechanics.**
1367
1512
  `blueprint-journal-names.jsonc` maps a recipe id only when the id the game writes for it
1368
- is a key some _other_ record already answers to. The other 104 need no entry for two
1369
- different reasons 79
1370
- because their key already is the id a journal writes (including Anti-Guardian Zone
1371
- Resistance as `GuardianModule_Sturdy`), and 25 because they are Operations ids for
1372
- which no journal spelling has been observed 21 of them recipes a module is sold
1373
- already carrying and four recipes a player rolls at an engineer. The three that do are
1513
+ is a key some _other_ record already answers to. Every other recipe needs no entry for
1514
+ one of two reasons: its key already is the id a journal writes (including Anti-Guardian
1515
+ Zone Resistance as `GuardianModule_Sturdy`), or it is an Operations id for
1516
+ which no journal spelling has been observed most of them recipes a module is sold
1517
+ already carrying, and four recipes a player rolls at an engineer. The three that do are
1374
1518
  `Scanner_LongRange` and `Scanner_WideAngle`, coriolis keys
1375
1519
  for recipes the game writes as `Sensor_LongRange` / `Sensor_WideAngle` — the same ids it
1376
1520
  writes for the sensor suites' own Long Range and Wide Angle, which are different recipes
@@ -1458,7 +1602,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1458
1602
  repository contains no raw `Loadout` capture of this blueprint.
1459
1603
  Their per-roll `materials` are from the same registry (resolved to Frontier material
1460
1604
  `symbol`s against the `materials` domain). Where that same crafting-cost table lists a
1461
- per-roll **Merc-Coin** amount beside them — on the 25 recipes named under "Merc-Coin
1605
+ per-roll **Merc-Coin** amount beside them — on the recipes named under "Merc-Coin
1462
1606
  crafting cost" below, which is every recipe in this bullet except the Anti-Guardian one
1463
1607
  — the amount is a currency rather than a material, so it is stored separately, in
1464
1608
  `blueprint-merc-coin-costs.jsonc`. Some totals are
@@ -1476,20 +1620,21 @@ up straight through with no disambiguation at all. Both paths are evidence that
1476
1620
  `EngineeringMaterial` list would put something with no `symbol` in the materials domain.
1477
1621
  Amounts are **per roll**, exactly as the material recipes are, so pricing a climb weights
1478
1622
  each grade by its roll count.
1479
- - **25 recipes charge one, and no other blueprint does.** Inara's blueprint index marks
1480
- a charging recipe by rendering its name in the coin colour, and the marked set is
1481
- exactly the 21 bespoke grade-2–5 recipes a bought Mercenary article climbs plus the
1623
+ - **A minority of recipes charge one.** Inara's blueprint
1624
+ index marks a charging recipe by rendering its name in the coin colour, and the marked
1625
+ set is exactly the bespoke grade-2–5 recipes a bought Mercenary article climbs plus the
1482
1626
  four Operations recipes an ordinary menu lists at grades 1–5 (`FuelScoop_Efficiency`
1483
1627
  and the three `*Laser_ThermalPlasmaConversion`) — 18 marked rows of the 197 the index
1484
- lists, because one published recipe can answer to more than one stored id. An ordinary
1485
- engineer recipe is therefore **absent rather than zero**, and `GuardianModule_Sturdy`
1628
+ lists, fewer than the ids they price because one published recipe can answer to more
1629
+ than one stored id. An ordinary engineer recipe is therefore **absent rather than
1630
+ zero**, and `GuardianModule_Sturdy`
1486
1631
  is absent for the same reason. That index is the whole evidence for the negative half
1487
1632
  of the claim: it is a completeness reading of one listing, not 197 pages checked one
1488
1633
  by one. Acquired 2026-08-22 UTC; the pages are live and expose no immutable revision.
1489
1634
  - **Every row is joined to its blueprint symbol by its own material recipe, not by name.** Inara
1490
1635
  publishes one page per recipe, keyed by its display name; each of the 18 pages' per-grade
1491
1636
  material lists was compared against `blueprint-costs.jsonc` before its Merc-Coin figures
1492
- were taken, and all 25 rows agree on every grade, every material and every count. That is what
1637
+ were taken, and every row agrees on every grade, every material and every count. That is what
1493
1638
  binds "Rail Gun — Enduring feedback" to `RailGun_LongShot` rather than a guess at the
1494
1639
  display name.
1495
1640
  - **One published recipe, several stored ids, one set of amounts.** Inara publishes a
@@ -1539,9 +1684,9 @@ up straight through with no disambiguation at all. Both paths are evidence that
1539
1684
  - **Cross-checked against coriolis-data** (commit
1540
1685
  `0db9234b5b9ce8c939ea84133d7ce336eea88e27`, acquired 2026-08-01 UTC), which holds the
1541
1686
  same facts split across `modifications/modifierActions.json` (modifiers) and
1542
- `modifications/specials.json` (recipes). All 86 active effects here appear in
1543
- `specials.json`; **84** have a `modifierActions.json` entry to diff against — the two
1544
- that do not, `special_blinding_shell` and `special_smart_rounds`, are qualitative
1687
+ `modifications/specials.json` (recipes). Every active effect here appears in
1688
+ `specials.json`; all but two have a `modifierActions.json` entry to diff against — the
1689
+ two that do not, `special_blinding_shell` and `special_smart_rounds`, are qualitative
1545
1690
  records this file stores with no modifiers either. The two sources agree everywhere
1546
1691
  once each one's conventions are accounted for: coriolis stores the four resistances
1547
1692
  as `modmod` percentage points where this file stores fractions (hull and shield boost
@@ -1555,7 +1700,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1555
1700
  `ammomax: -100` leg (stored here as `AmmoMaximum −1`, the "reloads from ship fuel"
1556
1701
  mechanic) that coriolis's `modifierActions` does not carry at all; and coriolis
1557
1702
  splits Plasma Slug by weapon family where EDSY does not, discussed next.
1558
- - **Weapon-combat experimental effects are carried in full** — 29 of them (Auto Loader,
1703
+ - **Weapon-combat experimental effects are carried in full** (Auto Loader,
1559
1704
  Corrosive Shell, Force Shell, FSD Interrupt, Plasma Slug, …). A purely-qualitative one —
1560
1705
  a gameplay flag with no numeric magnitude the data exposes — carries an **empty
1561
1706
  `modifiers` list and a human-readable `description`** instead; effects that do have
@@ -1577,7 +1722,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1577
1722
  `journal-federation-corvette.jsonc` independently settles High Yield Shell, stating
1578
1723
  `$Kinetic;` 100 → 50 and `$Explosive;` 0 → 50 for its large gimballed cannon. The
1579
1724
  three sourced conversions remain a lower bound rather than a count:
1580
- **eleven** of the 40 effects an engineer offers a weapon carry no `description` at all —
1725
+ several of the effects an engineer offers a weapon carry no `description` at all —
1581
1726
  `special_incendiary_rounds` and `special_emissive_munitions` among them — so for those
1582
1727
  the data neither states a conversion nor rules one out.
1583
1728
 
@@ -1631,7 +1776,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1631
1776
  - **Availability is a property of the module, not of the blueprint.** A Pulse Laser and a
1632
1777
  Rail Gun both take the Efficient blueprint but offer different experimental effects, so
1633
1778
  "which experimentals go with blueprint X" has no single answer. Modules are therefore
1634
- grouped (48 groups covering 1000 ordinary engineering menus) and each group lists the
1779
+ grouped one group per ordinary engineering menu and each group lists the
1635
1780
  `blueprints` and `experimentals` it offers.
1636
1781
  - **A group carries no display name.** The grouping is this repository's own partition of
1637
1782
  the modules sharing one menu; the game publishes no engineering-group label, heading
@@ -1641,7 +1786,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1641
1786
  (`cannons` Russian "Пушки" against the family's "Орудия", `moduleReinforcements`
1642
1787
  Brazilian Portuguese title case against the family's sentence case). Consumers name a
1643
1788
  group by joining a module's `familyId` to `module-families.jsonc`. The two partitions
1644
- do not coincide exactly: 47 of the 48 groups sit wholly inside one family, while
1789
+ do not coincide exactly: nearly every group sits wholly inside one family, while
1645
1790
  `heatSinkLaunchers` covers both `heatsinkLaunchers` and `causticSinkLaunchers`, and the
1646
1791
  `fsd` and `hullReinforcements` families are each split across two groups.
1647
1792
  - **Source:** EDSY `eddb.js`, whose module-group tables carry each group's `blueprints`
@@ -1651,9 +1796,8 @@ up straight through with no disambiguation at all. Both paths are evidence that
1651
1796
  `modifications/modules.json`, which carries the same per-group lists keyed by the
1652
1797
  journal `BlueprintName`s this catalogue joins on.
1653
1798
  - **Coverage: every retained group EDSY's `mtype` table gives a `blueprints:` key.** After
1654
- the corrections below, that is 48 groups over 1000
1655
- modules, including
1656
- bulkheads (the 241 ship armour records), life
1799
+ the corrections below, the grouped modules include
1800
+ bulkheads (the ship armour records), life
1657
1801
  support, sensors, the Detailed Surface Scanner, refineries, AFMUs, fuel
1658
1802
  scoops, FSD interdictors and boosters, Guardian module and shield reinforcement, the
1659
1803
  four engineerable limpet controllers, chaff, heat sink and caustic sink launchers,
@@ -1676,30 +1820,32 @@ up straight through with no disambiguation at all. Both paths are evidence that
1676
1820
  - **The ordinary halves must not list `GuardianModule_Sturdy`**, which is an
1677
1821
  Anti-Guardian recipe on a non-Guardian module and EDSY denies it. `powerPlants`,
1678
1822
  `powerDistributors` and `hullReinforcements` therefore hold ordinary modules only,
1679
- and the 25 Guardian ones sit in the three groups above.
1680
- - **14 modules are absent from the registry-derived result because upstream denies them
1681
- every blueprint:** eight AX multi-cannons, five of the seven mining tools, and the Mk II
1823
+ and the Guardian ones sit in the three groups above.
1824
+ - **Some modules are absent from the registry-derived result because upstream denies them
1825
+ every blueprint:** the AX multi-cannons, most of the mining tools, and the Mk II
1682
1826
  Plasma Shock Accelerator. The two gimballed AX multi-cannons are removed by the in-game
1683
- correction below, while `plasmaAccelerators` retains 4 of its 5 modules. The other two mining tools
1684
- are the manually corrected Mining Laser and Abrasion Blaster below, so all seven lack
1685
- an ordinary menu and the empty `miningToolsLasers` group is not retained.
1686
- The ten plain Module Reinforcement Packages are denied their family's only recipe
1687
- and are absent too, which leaves `moduleReinforcements` holding the ten Guardian
1827
+ correction below, while the `plasmaAccelerators` family keeps every module but the
1828
+ Mk II. The
1829
+ remaining mining tools are the manually corrected Mining Laser and Abrasion Blaster
1830
+ below, so no mining tool has an ordinary menu and the empty `miningToolsLasers` group
1831
+ is not retained.
1832
+ The plain Module Reinforcement Packages are denied their family's only recipe
1833
+ and are absent too, which leaves `moduleReinforcements` holding the Guardian
1688
1834
  packages.
1689
- - **The 194 modules absent have no ordinary engineering menu.** For 171 this comes from
1690
- the pinned registries. Whole families first, both registries
1835
+ - **The modules that are absent have no ordinary engineering menu.** For most this comes
1836
+ from the pinned registries. Whole families first, both registries
1691
1837
  agreeing: fuel tanks, passenger cabins, the repair/recon/research/decontamination and
1692
1838
  multi-limpet controllers, meta-alloy and ordinary module reinforcement, the Pulse Wave
1693
1839
  Analyser, the mining launchers, Shock Cannons, Nanite Torpedo Pylons, fighter and
1694
1840
  vehicle hangars, the docking computers and Supercruise Assist, the module stabilisers,
1695
1841
  the planetary approach suites, the cargo hatch and
1696
1842
  the AX utility modules (Xeno Scanners, Shutdown Field Neutralisers), followed by the
1697
- individually denied modules described above. The other 23 are the five weapons, fixed
1698
- Mining Laser, Abrasion Blaster and 16 cargo racks corrected from the registry-derived
1699
- result below.
1700
- They and the size-5 class-2 Module Reinforcement Package within the registry-derived
1701
- 171 have no stock menu, but qualifying Mercenary articles remain upgradeable through
1702
- their bespoke recipes.
1843
+ individually denied modules described above. The rest are the Enzyme and AX articles,
1844
+ the fixed Mining Laser, the Abrasion Blaster and the cargo racks corrected from the
1845
+ registry-derived result below.
1846
+ They and the size-5 class-2 Module Reinforcement Package the registries already leave
1847
+ ungrouped have no stock menu, but qualifying Mercenary articles remain upgradeable
1848
+ through their bespoke recipes.
1703
1849
  - **EDSY's `_X_` prefix means "not applicable" and is honoured**, not stripped: the
1704
1850
  Detailed Surface Scanner's group lists only `iss_er` (`Sensor_Expanded`), because its
1705
1851
  three other entries are `_X_`-marked. The `Decorative_*` entries on the remote-release
@@ -1720,18 +1866,17 @@ up straight through with no disambiguation at all. Both paths are evidence that
1720
1866
  Range and Wide Angle where the sensor suites take the `Sensor_*` ones. (Their other
1721
1867
  four ids are unaffected: `Sensor_FastScan` and the generic `Misc_*` trio, exactly as
1722
1868
  coriolis has them.) The shared symbol is not a defect in EDSY's table, and §Scanner
1723
- Long Range and Wide Angle below is what follows from that. Eleven groups carry a
1724
- substitution; the substituted lists are then checked against coriolis's own, as are
1725
- the nine further groups it carries a list for
1726
- 20 in all, every one an exact match. Chaff, heat sink, point defence and ECMs keep the
1869
+ Long Range and Wide Angle below is what follows from that. Every substituted list,
1870
+ and every further group coriolis carries a list for, was checked against coriolis's
1871
+ own and matches exactly. Chaff, heat sink, point defence and ECMs keep the
1727
1872
  generic `Misc_*` ids: there coriolis agrees with EDSY.
1728
- - **Nine retained groups rest on EDSY alone**, because coriolis carries no blueprint list for
1729
- them at all: the Guardian-only groups (`guardianPowerPlants`,
1873
+ - **Some retained groups rest on EDSY alone**, because coriolis carries no blueprint
1874
+ list for them at all: the Guardian-only groups (`guardianPowerPlants`,
1730
1875
  `guardianPowerDistributors`, `guardianHullReinforcements`, `moduleReinforcements`,
1731
1876
  `shieldReinforcements`, `fsdBoosters`, `guardianGauss`, `guardianPlasma` and
1732
1877
  `guardianShard`). That is coriolis being
1733
1878
  silent rather than contradicting — its Guardian groups are empty objects — but it
1734
- means the second registry corroborates 39 of the 48 groups, not
1879
+ means the second registry corroborates most groups, not
1735
1880
  all of them. The Guardian-weapon menus are independently settled by the in-game
1736
1881
  observations below: stock weapons take Anti-Guardian Zone Resistance alone, while
1737
1882
  the pre-engineered articles are final.
@@ -1739,12 +1884,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1739
1884
  EDSY has a single Overcharged for every weapon; coriolis splits it, and `multiCannons`
1740
1885
  lists coriolis's `MC_Overcharged`. See "Multi-cannon Overcharged: one journal id, two
1741
1886
  recipes" below for the evidence and for what the split costs.
1742
- - **The groups name 85 of the 107 blueprints.** Of the other 22, 21 are Operations keys
1743
- of modules sold already engineered rather than offered in a menu; the last is the
1887
+ - **The groups do not name every blueprint.** The ones they miss are Operations keys
1888
+ of modules sold already engineered rather than offered in a menu, plus the
1744
1889
  fixed Expanded Cargo Rack reward identity. Four Operations keys _are_ named by a
1745
1890
  group, because they are recipes a player applies — see "Four Operations recipes are
1746
1891
  listed by a menu" below.
1747
- - **9 modules are bound by the family rule, not by a source row.** EDSY has no live
1892
+ - **A few modules are bound by the family rule, not by a source row.** EDSY has no live
1748
1893
  entry for `Int_ShieldGenerator_Size1_Class4` (present but commented out, and naming
1749
1894
  its `mtype` — `isg`), nor for eight of the `*_free` starter fittings. Each takes its
1750
1895
  family's group, on the same rule the stats above use: a `*_free` variant is its priced
@@ -1759,12 +1904,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1759
1904
  - **File order is derivable:** `modules` is written group by group in the order `groups`
1760
1905
  declares them, and within a group in module-catalogue order, so a re-derivation from the
1761
1906
  same sources reproduces the file rather than reshuffling it.
1762
- - **`exclusions` are the exceptions, and they are real.** 23 modules take their group's
1763
- blueprints but not all of its experimental effects: 13 Multi-cannons cannot take Phasing
1764
- Sequence, six dumbfire racks cannot take Drag Munitions, four missile racks are short of
1765
- Penetrator Munitions or FSD Interrupt. Upstream these are an exclusion map. A module
1766
- absent from `exclusions` takes its whole group's list. All seven mining tools
1767
- that would otherwise be listed here are absent from the catalogue entirely, taking no
1907
+ - **`exclusions` are the exceptions, and they are real.** Some modules take their group's
1908
+ blueprints but not all of its experimental effects: most Multi-cannons cannot take
1909
+ Phasing Sequence, dumbfire racks cannot take Drag Munitions, and some missile racks are
1910
+ short of Penetrator Munitions or FSD Interrupt. Upstream these are an exclusion map. A module
1911
+ absent from `exclusions` takes its whole group's list. Every mining tool
1912
+ that would otherwise be listed here is absent from the catalogue entirely, taking no
1768
1913
  ordinary blueprint either.
1769
1914
  - **The fixed Mining Laser and Abrasion Blaster have no ordinary engineering menu.** Both
1770
1915
  are removed from `modules`, despite EDSY assigning them to `miningToolsLasers` with
@@ -1783,12 +1928,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1783
1928
  - **Expanded Cargo Rack is a fixed reward identity, not an ordinary cargo-rack recipe.**
1784
1929
  EDSY and coriolis expose `CargoRack_IncreasedCapacity` as the grade-5 identity carried
1785
1930
  by the size-5 and size-6 community-goal articles catalogued in `pre-engineered.jsonc`.
1786
- Direct in-game menu confirmation recorded 2026-08-18 UTC establishes that none of the
1787
- 16 stock cargo-rack identities — ordinary, corrosion-resistant, or Mk II — has an
1931
+ Direct in-game menu confirmation recorded 2026-08-18 UTC establishes that no
1932
+ stock cargo-rack identity — ordinary, corrosion-resistant, or Mk II — has an
1788
1933
  ordinary engineering menu; there is no immutable revision for an in-game observation.
1789
1934
  The fixed articles keep their sourced modifier blocks and remain identifiable without
1790
1935
  granting the same state to a stock rack. A re-derivation must drop the `cargoRacks`
1791
- group, all 16 module mappings, and the corresponding projected `kind` fields in
1936
+ group, its module mappings, and the corresponding projected `kind` fields in
1792
1937
  `modules-internal.jsonc`.
1793
1938
  - **The Enzyme Missile Rack and AX weapons have no ordinary engineering menu.** Direct
1794
1939
  in-game confirmation recorded 2026-08-18 UTC establishes that the Enzyme Missile Rack,
@@ -1798,23 +1943,23 @@ up straight through with no disambiguation at all. Both paths are evidence that
1798
1943
  through grades 2–5 of its bespoke `EnzymeMissileRack_HighYield` recipe. Its separately
1799
1944
  catalogued grade-5 High Capacity community-goal article is final. The Enhanced AX
1800
1945
  Multi-Cannons and AX Missile Racks in `pre-engineered.jsonc` are fixed tech-broker
1801
- variants and cannot be engineered further. All five fixed articles carry
1802
- `engineeringLocked: true`; the multi-cannons retain Frontier's journal identity
1803
- `Weapon_Overcharged`, not the ordinary multi-cannon menu key `MC_Overcharged`. A
1946
+ variants and cannot be engineered further. The community-goal Enzyme article, both
1947
+ multi-cannons and both racks carry `engineeringLocked: true`; the multi-cannons retain
1948
+ Frontier's journal identity `Weapon_Overcharged`, not the ordinary multi-cannon menu key `MC_Overcharged`. A
1804
1949
  re-derivation must drop the
1805
1950
  `experimentalWeapons`, `antiXenoMissileRacks` and `antiXenoMultiCannons` groups, their
1806
1951
  five module mappings and the corresponding projected `kind` fields in
1807
1952
  `modules-hardpoint.jsonc`.
1808
- - **An empty experimental menu is still distinct from no menu.** 27 of the 48 groups offer
1809
- no experimental at all, so 368 of the 1000 grouped modules have an empty experimental
1953
+ - **An empty experimental menu is still distinct from no menu.** Many groups offer
1954
+ no experimental at all, so their modules have an empty experimental
1810
1955
  list while retaining blueprints.
1811
1956
  - **Key form:** the Anti-Guardian blueprint is listed under `GuardianModule_Sturdy`, the id
1812
1957
  a Loadout writes and the one EDSY uses — the same and only spelling `blueprints.jsonc`
1813
1958
  keys it under.
1814
- - **Anti-Guardian Zone Resistance carries no experimental effect.** All nine groups
1815
- offering `GuardianModule_Sturdy` store `"experimentals": []`, including
1959
+ - **Anti-Guardian Zone Resistance carries no experimental effect.** Every group
1960
+ offering `GuardianModule_Sturdy` stores `"experimentals": []`, including
1816
1961
  `guardianGauss`, `guardianPlasma` and `guardianShard`.
1817
- - There are no pre-engineered Guardian module reward variants. The seven Guardian
1962
+ - There are no pre-engineered Guardian module reward variants. The Guardian
1818
1963
  variants are weapons, whose ordinary recipes identify final purchases rather than
1819
1964
  engineer rolls.
1820
1965
  - **Neither registry publishes this, and a re-derivation will not reproduce it.**
@@ -1834,7 +1979,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1834
1979
  Guardian power plant, distributor or hull reinforcement package at all. Its
1835
1980
  Guardian-weapon entries are final pre-engineered articles, a separate case recorded
1836
1981
  below.
1837
- - The 25 modules in the three split families above (`guardianPowerPlants`,
1982
+ - The modules in the three split families above (`guardianPowerPlants`,
1838
1983
  `guardianPowerDistributors` and `guardianHullReinforcements`) therefore carry no
1839
1984
  experimental effects in the catalogue at all. Blueprints are unaffected on every
1840
1985
  module.
@@ -1879,7 +2024,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1879
2024
  stock weapon's engineering menu.
1880
2025
 
1881
2026
  So these recipes reach the weapons only as **pre-engineered identities**, and no menu
1882
- lists them: `pre-engineered.jsonc` marks all seven catalogued Guardian-weapon variants
2027
+ lists them: `pre-engineered.jsonc` marks every catalogued Guardian-weapon variant
1883
2028
  `engineeringLocked: true`, and the 18 build-corpus entries that name one are final
1884
2029
  articles rather than recipes a player may apply.
1885
2030
 
@@ -1895,7 +2040,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1895
2040
 
1896
2041
  ### A tech-broker unlock may be sold under its own name
1897
2042
 
1898
- Nineteen of the tech-broker variants are not sold as the plain base module. Each carries
2043
+ Some tech-broker variants are not sold as the plain base module. Each carries
1899
2044
  one of three markers, supplied by repository-owner in-game verification (2026-08-30 UTC);
1900
2045
  no registry publishes them, and the game exposes no immutable identifier for its
1901
2046
  outfitting strings.
@@ -1962,12 +2107,12 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
1962
2107
  `{ symbol, name, blueprint, grade, acquisition }`, plus any sourced stat block and
1963
2108
  price. The game reports these articles under the base module symbol rather than a
1964
2109
  distinct variant symbol.
1965
- - **`acquisition` says where each remaining variant comes from.** 73 records: 22 `mercenary`,
1966
- 30 `communityGoal` and 21 `techBroker`.
2110
+ - **`acquisition` says where each remaining variant comes from** `mercenary`,
2111
+ `communityGoal` or `techBroker`.
1967
2112
  - **`mercenary`** — the Merc-Coin shop rows. Source: the in-game outfitting and
1968
2113
  blueprint registries, cross-checked against Inara's outfitting and blueprint registries
1969
2114
  acquired 2026-08-07 UTC (no immutable revision exposed) and Frontier's update notes.
1970
- All 22 are grade 1, and that is the point: the
2115
+ Every one is grade 1, and that is the point: the
1971
2116
  purchased module already
1972
2117
  contains the grade-1 pre-engineering, which is exactly why these blueprints' own
1973
2118
  recipes start at grade 2 (see the Operations section above). The two facts are
@@ -1980,14 +2125,14 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
1980
2125
  stocks it; both Lockdown recipes run grades 2–5, the weapon-reward range that marks a
1981
2126
  module as bought pre-engineered; and it is the only grade-2–5 Operations recipe in the
1982
2127
  file
1983
- that would otherwise have no row, all 20 others having one. Price and size confirmed
2128
+ that would otherwise have no row, every other one having one. Price and size confirmed
1984
2129
  2026-08-07 UTC against an index of the Inara outfitting listing, which
1985
2130
  reports the MERC Lockdown Seeker Missile Rack [Fixed] at 900 MC for the 3A and 800 MC
1986
2131
  for the 2B. This is an index reading rather than a pinned page capture. Both halves check
1987
2132
  against rows already here — the large rack is 3A and its other Merc row is 900 MC, the
1988
2133
  medium is 2B and its Lockdown row is 800 MC — and that corroboration is what carries
1989
2134
  the weight.
1990
- - **Ten of the 22 carry a default experimental effect** applied beside the grade-1
2135
+ - **Some Merc rows carry a default experimental effect** applied beside the grade-1
1991
2136
  blueprint, recorded as `experimentalEffectSymbol`: Screening Shell on both Double
1992
2137
  Screaming Fragment Cannons, Incendiary Rounds on the Long Range Mining Laser,
1993
2138
  Phasing Sequence on the Rapid Phase Multi-Cannon, Feedback Cascade on the Enduring
@@ -1996,15 +2141,15 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
1996
2141
  Seeker Missile Racks. Source: repository-owner in-game observation, recorded
1997
2142
  2026-08-29 UTC; no registry publishes them. These rows still carry no `modifiers`:
1998
2143
  the effect is recorded, the unpublished grade-1 blueprint transformation is not.
1999
- - **Two independent checks each corroborate nine of the ten, and between them cover
2000
- all ten.** The first: the effect is one the stock module's own experimental menu
2144
+ - **Two independent checks each corroborate all but one, and between them cover
2145
+ every row.** The first: the effect is one the stock module's own experimental menu
2001
2146
  offers, so the shop is baking in an effect the module can carry
2002
2147
  (`engineering-options.jsonc`). That covers every row but the Mining Laser, whose
2003
2148
  base module offers no experimental effect at all. The second: the same base module
2004
2149
  already carries the same effect on a catalogued community-goal or tech-broker
2005
2150
  variant. That covers every row but the large Drag Seeker Missile Rack, whose
2006
2151
  corroboration is its medium twin rather than a variant of its own symbol.
2007
- - **The mining laser is the weakest of the ten.** Incendiary Rounds is outside
2152
+ - **The mining laser is the weakest of them.** Incendiary Rounds is outside
2008
2153
  `Hpt_MiningLaser_Fixed_Small`'s experimental menu — it is the only row a shop menu
2009
2154
  could not have offered — so only the twin check speaks for it, and a twin is
2010
2155
  consistency more than evidence. It is recorded because it was observed. The
@@ -2016,12 +2161,12 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2016
2161
  EDSY's stored-module presets, which record each reward as an encoded module state; the
2017
2162
  blueprint, grade and experimental effect were
2018
2163
  decoded from that state rather than inferred from its display label. All ids join to
2019
- the blueprint, experimental-effect and module catalogues. 28 of the 30 are grade 5;
2020
- 8 carry an experimental effect. Acquired 2026-08-01 UTC.
2164
+ the blueprint, experimental-effect and module catalogues. All but two are grade 5, and
2165
+ some carry an experimental effect. Acquired 2026-08-01 UTC.
2021
2166
  - **`techBroker`** — modules unlocked at a tech broker, from the same EDSY presets and
2022
2167
  decoded the same way. Human brokers stock the "V1" drives, the SCO drives and a
2023
2168
  seeker rack; the Guardian weapon rows come from the Salvation, Azimuth and Sirius
2024
- brokers. 14 of the 21 are grade 5 — the seven grade-1 rows are the Guardian weapons
2169
+ brokers. Most are grade 5 — the grade-1 rows are the Guardian weapons
2025
2170
  and a heat sink launcher, where the blueprint named does define a grade 1, so the
2026
2171
  grade is a real grade of a real recipe rather than the Merc-shop convention.
2027
2172
  Acquired 2026-08-01 UTC.
@@ -2031,13 +2176,13 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2031
2176
  route ever existed.
2032
2177
  - **`name` is the base module's name, except on the Merc-shop rows.** A community-goal or
2033
2178
  tech-broker article is listed under the module it fits as, so those rows carry the
2034
- catalogue name verbatim. The 22 `mercenary` rows do not: the shop sells the
2179
+ catalogue name verbatim. The `mercenary` rows do not: the shop sells the
2035
2180
  "Far-Reaching Abrasion Blaster" and the "Support Focused Power Distributor" under those
2036
- names, 14 distinct ones over the 22 rows. Supplied by the repository owner from the
2181
+ names. Supplied by the repository owner from the
2037
2182
  in-game shop listing, acquired 2026-08-22 UTC; the registries carry the transformation,
2038
2183
  not the label. Their localized values are recorded in `data/i18n/SOURCES.md`.
2039
- - **`engineeringLocked: true` marks 12 final weapon rows:** the seven pre-engineered
2040
- Guardian weapons and the five fixed Enzyme/AX articles. Their evidence is recorded once
2184
+ - **`engineeringLocked: true` marks the final weapon rows:** the pre-engineered
2185
+ Guardian weapons and the fixed Enzyme/AX articles. Their evidence is recorded once
2041
2186
  under Engineering options.
2042
2187
  - **A reward variant is not reproducible by engineering the same blueprint.** Alongside
2043
2188
  its blueprint and effect, each reward carries hand-set modifier overrides no blueprint
@@ -2049,7 +2194,7 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2049
2194
  Resistant Cargo Racks carry no engineering at all. They already exist as ordinary
2050
2195
  module records (`Int_CorrosionProofCargoRack_Size{5,6}_Class1`), so there is no pairing
2051
2196
  to record.
2052
- - **`mercCoinCost` is the shop price in Merc Coin**, on the 22 `mercenary` rows and
2197
+ - **`mercCoinCost` is the shop price in Merc Coin**, on the `mercenary` rows and
2053
2198
  nowhere else. Source: the in-game outfitting registry, with the variants and prices
2054
2199
  corroborated by Inara's outfitting registry acquired 2026-08-07 UTC; no immutable
2055
2200
  revision is exposed.
@@ -2063,7 +2208,7 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2063
2208
  and grade, then translated into the Almanac's own vocabulary — EDSY's attribute names
2064
2209
  map to journal Modifier Labels through its own table, and resistances, which EDSY
2065
2210
  stores in a different form from this repo, are converted using the module's base
2066
- resistance. 51 rows carry one; the 22 `mercenary` rows do not, because no registry
2211
+ resistance. Every row carries one except the `mercenary` rows, because no registry
2067
2212
  publishes the grade-1 pre-engineering they arrive with and a guess is worse than an
2068
2213
  omission.
2069
2214
  - **Values are the authored decimals, recovered rather than rounded.** The presets
@@ -2072,7 +2217,7 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2072
2217
  as `+20%` yields `0.199997`. Rounding that by eye would be a guess, so instead each
2073
2218
  value is the **shortest decimal that re-encodes to the identical 20 bits**: the
2074
2219
  figure the encoder was originally given, checked by re-encoding rather than assumed.
2075
- All 51 stat blocks recover exactly; a value with no short round-tripping form would
2220
+ Every stat block recovers exactly; a value with no short round-tripping form would
2076
2221
  have been kept as decoded, and none needed it. This is what makes the 5A "FSD V1"
2077
2222
  resolve to a whole 1785 optimal mass (from `+0.7`) instead of 1785.0126 (from
2078
2223
  `0.699988`).
@@ -2085,9 +2230,8 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2085
2230
  multiplier it implies, and re-encode. Where that lands on the stored bits (within the
2086
2231
  encoder's own one-unit rounding), the source cannot tell the two apart and the round
2087
2232
  stat is what was authored, so it is stored as an **`overwrite` of the stat** — exact,
2088
- and the shape a journal reports a pre-engineered modifier in anyway. **14 modifiers**
2089
- across 7 modules are stored this way, and the file holds 20 `overwrite` modifiers
2090
- over 11 modules in all.
2233
+ and the shape a journal reports a pre-engineered modifier in anyway. A minority of
2234
+ modifiers are stored this way, alongside the file's other `overwrite` modifiers.
2091
2235
  Worth stating plainly, because the blueprint name invites the opposite reading: the
2092
2236
  Shard's `MaximumRange` ×1.7647 with `FalloffRange` ×0.88235 is **not** a Long Range
2093
2237
  roll of any grade. It is a bespoke stat block, as every reward variant's is.
@@ -2109,11 +2253,11 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2109
2253
  itself.
2110
2254
  - **Burst interval has to be added to the decoder's output by hand.** EDSY carries no
2111
2255
  journal Label for `bstint` — the journal reports the resulting `RateOfFire`, never the
2112
- interval it comes from — so a straight decode drops it, leaving the 13 variants whose
2256
+ interval it comes from — so a straight decode drops it, leaving the variants whose
2113
2257
  stat block changes a burst pattern on the _stock_ cadence, and four of them (the two frag cannons
2114
2258
  and the two Guardian gauss cannons) inconsistent as well as slow, carrying the
2115
2259
  engineered `BurstSize` — and, on the gauss cannons, the engineered `BurstRateOfFire` —
2116
- against a stock interval. All 13 are stored under **`BurstInterval`**, the same label
2260
+ against a stock interval. Each is stored under **`BurstInterval`**, the same label
2117
2261
  the Rapid Fire and High Capacity blueprint features use (see the Engineering section
2118
2262
  above), and it is the file's one departure from what the decoder emits: re-running the
2119
2263
  decoder over the same EDSY revision reproduces every other byte.