modwright 0.1.0

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 (455) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +212 -0
  3. package/assets/claude/agents/mw-explore.md +46 -0
  4. package/assets/claude/agents/mw-fixture.md +33 -0
  5. package/assets/claude/agents/mw-rule-author.md +51 -0
  6. package/assets/claude/agents/mw-scaffold-author.md +48 -0
  7. package/assets/claude/skills/mw-author.md +59 -0
  8. package/assets/claude/skills/mw-new-item.md +51 -0
  9. package/assets/claude/skills/mw-new-spell.md +50 -0
  10. package/assets/claude/skills/mw-scaffold.md +59 -0
  11. package/assets/claude/skills/mw-ship.md +57 -0
  12. package/assets/claude/skills/mw-validate.md +51 -0
  13. package/assets/claude/skills/mw-verify.md +59 -0
  14. package/assets/nivalisnights/extract_resources.py +177 -0
  15. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
  16. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
  17. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
  18. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
  19. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
  20. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
  21. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
  22. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
  23. package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
  24. package/bridges/bg3-se/README.md +99 -0
  25. package/bridges/bg3-se/bridge.json +68 -0
  26. package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
  27. package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
  28. package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
  29. package/bridges/cp2077-cet/README.md +165 -0
  30. package/bridges/cp2077-cet/bridge.json +53 -0
  31. package/dist/core/bridge/arm.js +175 -0
  32. package/dist/core/bridge/cet-console.js +26 -0
  33. package/dist/core/bridge/cet-log.js +362 -0
  34. package/dist/core/bridge/index.js +11 -0
  35. package/dist/core/bridge/locate.js +35 -0
  36. package/dist/core/bridge/paths.js +34 -0
  37. package/dist/core/bridge/pending.js +89 -0
  38. package/dist/core/bridge/poll.js +155 -0
  39. package/dist/core/bridge/stage.js +100 -0
  40. package/dist/core/bridge/status.js +97 -0
  41. package/dist/core/bridge/types.js +145 -0
  42. package/dist/core/bridge/validate.js +107 -0
  43. package/dist/core/build/index.js +6 -0
  44. package/dist/core/build/manifest.js +47 -0
  45. package/dist/core/build/paths.js +32 -0
  46. package/dist/core/build/run.js +342 -0
  47. package/dist/core/build/stage.js +265 -0
  48. package/dist/core/build/steps/bg3.js +129 -0
  49. package/dist/core/build/steps/core.js +195 -0
  50. package/dist/core/build/steps/cyberpunk.js +95 -0
  51. package/dist/core/build/steps/listing.js +35 -0
  52. package/dist/core/build/types.js +13 -0
  53. package/dist/core/build/zip.js +148 -0
  54. package/dist/core/compat/check.js +113 -0
  55. package/dist/core/compat/pe.js +220 -0
  56. package/dist/core/compat/types.js +1 -0
  57. package/dist/core/compat/version.js +70 -0
  58. package/dist/core/deploy/guards.js +292 -0
  59. package/dist/core/deploy/index.js +5 -0
  60. package/dist/core/deploy/plan.js +696 -0
  61. package/dist/core/deploy/reload-apply.js +361 -0
  62. package/dist/core/deploy/reload.js +358 -0
  63. package/dist/core/deploy/sources.js +169 -0
  64. package/dist/core/deploy/types.js +1 -0
  65. package/dist/core/epic.js +54 -0
  66. package/dist/core/fsutil.js +191 -0
  67. package/dist/core/home.js +70 -0
  68. package/dist/core/knowledge/facts.js +229 -0
  69. package/dist/core/knowledge/index.js +4 -0
  70. package/dist/core/knowledge/search.js +112 -0
  71. package/dist/core/knowledge/store.js +123 -0
  72. package/dist/core/knowledge/types.js +1 -0
  73. package/dist/core/ledger/check.js +42 -0
  74. package/dist/core/ledger/hooks.js +80 -0
  75. package/dist/core/ledger/index.js +7 -0
  76. package/dist/core/ledger/query.js +17 -0
  77. package/dist/core/ledger/record.js +84 -0
  78. package/dist/core/ledger/status.js +53 -0
  79. package/dist/core/ledger/store.js +98 -0
  80. package/dist/core/ledger/types.js +108 -0
  81. package/dist/core/logs/index.js +4 -0
  82. package/dist/core/logs/registry.js +50 -0
  83. package/dist/core/logs/scan.js +195 -0
  84. package/dist/core/logs/triage.js +160 -0
  85. package/dist/core/logs/types.js +1 -0
  86. package/dist/core/lsx.js +10 -0
  87. package/dist/core/lz4.js +66 -0
  88. package/dist/core/mods.js +229 -0
  89. package/dist/core/process.js +49 -0
  90. package/dist/core/project/build-steps.js +83 -0
  91. package/dist/core/project/describe.js +74 -0
  92. package/dist/core/project/index.js +5 -0
  93. package/dist/core/project/load.js +146 -0
  94. package/dist/core/project/schema.js +264 -0
  95. package/dist/core/project/types.js +3 -0
  96. package/dist/core/prompts.js +72 -0
  97. package/dist/core/registry.js +35 -0
  98. package/dist/core/safety/backup.js +206 -0
  99. package/dist/core/safety/execute.js +188 -0
  100. package/dist/core/safety/index.js +5 -0
  101. package/dist/core/safety/plan.js +122 -0
  102. package/dist/core/safety/restore.js +172 -0
  103. package/dist/core/safety/types.js +1 -0
  104. package/dist/core/scaffold/bootstrap.js +7 -0
  105. package/dist/core/scaffold/catalog.js +28 -0
  106. package/dist/core/scaffold/claude-assets.js +271 -0
  107. package/dist/core/scaffold/collisions.js +64 -0
  108. package/dist/core/scaffold/emit.js +356 -0
  109. package/dist/core/scaffold/engine.js +680 -0
  110. package/dist/core/scaffold/ids.js +78 -0
  111. package/dist/core/scaffold/index.js +10 -0
  112. package/dist/core/scaffold/jsonpath.js +121 -0
  113. package/dist/core/scaffold/load.js +81 -0
  114. package/dist/core/scaffold/render.js +85 -0
  115. package/dist/core/scaffold/sequence.js +396 -0
  116. package/dist/core/scaffold/types.js +309 -0
  117. package/dist/core/steam.js +63 -0
  118. package/dist/core/surfaceutil.js +36 -0
  119. package/dist/core/testplan/check.js +67 -0
  120. package/dist/core/testplan/index.js +5 -0
  121. package/dist/core/testplan/load.js +100 -0
  122. package/dist/core/testplan/registry.js +317 -0
  123. package/dist/core/testplan/run.js +389 -0
  124. package/dist/core/testplan/types.js +82 -0
  125. package/dist/core/text/converters/bg3.js +50 -0
  126. package/dist/core/text/converters/cyberpunk.js +36 -0
  127. package/dist/core/text/converters/index.js +261 -0
  128. package/dist/core/text/diff/cr2w.js +180 -0
  129. package/dist/core/text/diff/index.js +16 -0
  130. package/dist/core/text/diff/loca.js +43 -0
  131. package/dist/core/text/diff/lsx.js +126 -0
  132. package/dist/core/text/handles.js +86 -0
  133. package/dist/core/text/index.js +6 -0
  134. package/dist/core/text/json.js +46 -0
  135. package/dist/core/text/templates/cache.js +71 -0
  136. package/dist/core/text/templates/index.js +3 -0
  137. package/dist/core/text/templates/library.js +245 -0
  138. package/dist/core/text/templates/types.js +51 -0
  139. package/dist/core/text/toolchain.js +16 -0
  140. package/dist/core/text/types.js +1 -0
  141. package/dist/core/text/validate.js +149 -0
  142. package/dist/core/text/xml.js +58 -0
  143. package/dist/core/toolchain/datafetch.js +151 -0
  144. package/dist/core/toolchain/env.js +63 -0
  145. package/dist/core/toolchain/features.js +170 -0
  146. package/dist/core/toolchain/index.js +8 -0
  147. package/dist/core/toolchain/install.js +191 -0
  148. package/dist/core/toolchain/locate.js +275 -0
  149. package/dist/core/toolchain/remember.js +84 -0
  150. package/dist/core/toolchain/run.js +318 -0
  151. package/dist/core/toolchain/specs.js +351 -0
  152. package/dist/core/toolchain/types.js +1 -0
  153. package/dist/core/types.js +1 -0
  154. package/dist/core/userconfig.js +66 -0
  155. package/dist/core/validate/context.js +139 -0
  156. package/dist/core/validate/index.js +5 -0
  157. package/dist/core/validate/registry.js +58 -0
  158. package/dist/core/validate/run.js +131 -0
  159. package/dist/core/validate/suppressions.js +91 -0
  160. package/dist/core/validate/types.js +2 -0
  161. package/dist/core/yamledit.js +51 -0
  162. package/dist/index.js +389 -0
  163. package/dist/server.js +1914 -0
  164. package/dist/surfaces/baldursgate3/compat.js +164 -0
  165. package/dist/surfaces/baldursgate3/identity.js +110 -0
  166. package/dist/surfaces/baldursgate3/index/build.js +331 -0
  167. package/dist/surfaces/baldursgate3/index/index.js +17 -0
  168. package/dist/surfaces/baldursgate3/index/info.js +40 -0
  169. package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
  170. package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
  171. package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
  172. package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
  173. package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
  174. package/dist/surfaces/baldursgate3/index/queries.js +327 -0
  175. package/dist/surfaces/baldursgate3/index/schema.js +62 -0
  176. package/dist/surfaces/baldursgate3/index.js +3 -0
  177. package/dist/surfaces/baldursgate3/logs.js +278 -0
  178. package/dist/surfaces/baldursgate3/modsettings.js +115 -0
  179. package/dist/surfaces/baldursgate3/pak.js +153 -0
  180. package/dist/surfaces/baldursgate3/settings.js +49 -0
  181. package/dist/surfaces/baldursgate3/surface.js +232 -0
  182. package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
  183. package/dist/surfaces/baldursgate3/validators/files.js +476 -0
  184. package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
  185. package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
  186. package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
  187. package/dist/surfaces/baldursgate3/validators/story.js +790 -0
  188. package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
  189. package/dist/surfaces/cyberpunk2077/compat.js +223 -0
  190. package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
  191. package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
  192. package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
  193. package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
  194. package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
  195. package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
  196. package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
  197. package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
  198. package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
  199. package/dist/surfaces/cyberpunk2077/index.js +3 -0
  200. package/dist/surfaces/cyberpunk2077/logs.js +742 -0
  201. package/dist/surfaces/cyberpunk2077/paths.js +12 -0
  202. package/dist/surfaces/cyberpunk2077/surface.js +218 -0
  203. package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
  204. package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
  205. package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
  206. package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
  207. package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
  208. package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
  209. package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
  210. package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
  211. package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
  212. package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
  213. package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
  214. package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
  215. package/dist/surfaces/eldenring/binders.js +111 -0
  216. package/dist/surfaces/eldenring/compat.js +166 -0
  217. package/dist/surfaces/eldenring/dcx.js +49 -0
  218. package/dist/surfaces/eldenring/index.js +13 -0
  219. package/dist/surfaces/eldenring/loaders.js +132 -0
  220. package/dist/surfaces/eldenring/logs.js +67 -0
  221. package/dist/surfaces/eldenring/paramdef.js +256 -0
  222. package/dist/surfaces/eldenring/params.js +129 -0
  223. package/dist/surfaces/eldenring/surface.js +121 -0
  224. package/dist/surfaces/eldenring/tools.js +52 -0
  225. package/dist/surfaces/eldenring/validators/binders.js +193 -0
  226. package/dist/surfaces/eldenring/validators/packages.js +159 -0
  227. package/dist/surfaces/eldenring/validators/params.js +334 -0
  228. package/dist/surfaces/eldenring/validators/profiles.js +287 -0
  229. package/dist/surfaces/index.js +34 -0
  230. package/dist/surfaces/nivalisnights/compat.js +229 -0
  231. package/dist/surfaces/nivalisnights/index/build.js +310 -0
  232. package/dist/surfaces/nivalisnights/index/index.js +5 -0
  233. package/dist/surfaces/nivalisnights/index/queries.js +231 -0
  234. package/dist/surfaces/nivalisnights/index.js +4 -0
  235. package/dist/surfaces/nivalisnights/logs.js +473 -0
  236. package/dist/surfaces/nivalisnights/surface.js +195 -0
  237. package/dist/surfaces/skyrimse/archives.js +229 -0
  238. package/dist/surfaces/skyrimse/compat.js +163 -0
  239. package/dist/surfaces/skyrimse/index.js +12 -0
  240. package/dist/surfaces/skyrimse/loadorder.js +174 -0
  241. package/dist/surfaces/skyrimse/logs.js +241 -0
  242. package/dist/surfaces/skyrimse/plugins.js +149 -0
  243. package/dist/surfaces/skyrimse/records.js +94 -0
  244. package/dist/surfaces/skyrimse/surface.js +240 -0
  245. package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
  246. package/dist/surfaces/skyrimse/validators/archives.js +110 -0
  247. package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
  248. package/dist/surfaces/skyrimse/validators/records.js +117 -0
  249. package/dist/surfaces/stardewvalley/compat.js +190 -0
  250. package/dist/surfaces/stardewvalley/config.js +42 -0
  251. package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
  252. package/dist/surfaces/stardewvalley/index/index.js +229 -0
  253. package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
  254. package/dist/surfaces/stardewvalley/index.js +12 -0
  255. package/dist/surfaces/stardewvalley/logs.js +307 -0
  256. package/dist/surfaces/stardewvalley/mods.js +182 -0
  257. package/dist/surfaces/stardewvalley/surface.js +244 -0
  258. package/dist/surfaces/stardewvalley/validators/content.js +321 -0
  259. package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
  260. package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
  261. package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
  262. package/dist/surfaces/subnautica2/compat.js +138 -0
  263. package/dist/surfaces/subnautica2/index.js +5 -0
  264. package/dist/surfaces/subnautica2/logs.js +129 -0
  265. package/dist/surfaces/subnautica2/paks.js +173 -0
  266. package/dist/surfaces/subnautica2/surface.js +151 -0
  267. package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
  268. package/dist/surfaces/valheim/compat.js +171 -0
  269. package/dist/surfaces/valheim/index/index.js +301 -0
  270. package/dist/surfaces/valheim/index/tables.js +103 -0
  271. package/dist/surfaces/valheim/index.js +11 -0
  272. package/dist/surfaces/valheim/logs.js +197 -0
  273. package/dist/surfaces/valheim/packaging.js +131 -0
  274. package/dist/surfaces/valheim/plugins.js +270 -0
  275. package/dist/surfaces/valheim/references.js +121 -0
  276. package/dist/surfaces/valheim/surface.js +223 -0
  277. package/dist/surfaces/valheim/validators/packaging.js +218 -0
  278. package/dist/surfaces/valheim/validators/plugins.js +287 -0
  279. package/dist/surfaces/valheim/validators/references.js +169 -0
  280. package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
  281. package/knowledge/baldursgate3/audio.voice.yaml +182 -0
  282. package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
  283. package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
  284. package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
  285. package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
  286. package/knowledge/baldursgate3/crash.causes.yaml +90 -0
  287. package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
  288. package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
  289. package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
  290. package/knowledge/baldursgate3/dialogue.yaml +122 -0
  291. package/knowledge/baldursgate3/feats.classes.yaml +164 -0
  292. package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
  293. package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
  294. package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
  295. package/knowledge/baldursgate3/journal.quests.yaml +214 -0
  296. package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
  297. package/knowledge/baldursgate3/localization.handles.yaml +92 -0
  298. package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
  299. package/knowledge/baldursgate3/origins.companions.yaml +144 -0
  300. package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
  301. package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
  302. package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
  303. package/knowledge/baldursgate3/process.launch.yaml +34 -0
  304. package/knowledge/baldursgate3/progressions.yaml +92 -0
  305. package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
  306. package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
  307. package/knowledge/baldursgate3/races.progression.yaml +228 -0
  308. package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
  309. package/knowledge/baldursgate3/scriptextender.yaml +252 -0
  310. package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
  311. package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
  312. package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
  313. package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
  314. package/knowledge/baldursgate3/stats.spells.yaml +293 -0
  315. package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
  316. package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
  317. package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
  318. package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
  319. package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
  320. package/knowledge/baldursgate3/ui.icons.yaml +412 -0
  321. package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
  322. package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
  323. package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
  324. package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
  325. package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
  326. package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
  327. package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
  328. package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
  329. package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
  330. package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
  331. package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
  332. package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
  333. package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
  334. package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
  335. package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
  336. package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
  337. package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
  338. package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
  339. package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
  340. package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
  341. package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
  342. package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
  343. package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
  344. package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
  345. package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
  346. package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
  347. package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
  348. package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
  349. package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
  350. package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
  351. package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
  352. package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
  353. package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
  354. package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
  355. package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
  356. package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
  357. package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
  358. package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
  359. package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
  360. package/knowledge/cyberpunk2077/player.control.yaml +918 -0
  361. package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
  362. package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
  363. package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
  364. package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
  365. package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
  366. package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
  367. package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
  368. package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
  369. package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
  370. package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
  371. package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
  372. package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
  373. package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
  374. package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
  375. package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
  376. package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
  377. package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
  378. package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
  379. package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
  380. package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
  381. package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
  382. package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
  383. package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
  384. package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
  385. package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
  386. package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
  387. package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
  388. package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
  389. package/knowledge/eldenring/formats.binders.yaml +237 -0
  390. package/knowledge/eldenring/launcher.me3.yaml +230 -0
  391. package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
  392. package/knowledge/eldenring/params.paramdef.yaml +149 -0
  393. package/knowledge/eldenring/params.regulation.yaml +142 -0
  394. package/knowledge/eldenring/saves.online.yaml +118 -0
  395. package/knowledge/eldenring/toolchain.cli.yaml +256 -0
  396. package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
  397. package/knowledge/skyrimse/archives.bsa.yaml +212 -0
  398. package/knowledge/skyrimse/install.detection.yaml +41 -0
  399. package/knowledge/skyrimse/loadorder.files.yaml +242 -0
  400. package/knowledge/skyrimse/plugins.esl.yaml +189 -0
  401. package/knowledge/skyrimse/plugins.format.yaml +224 -0
  402. package/knowledge/skyrimse/skse.runtime.yaml +283 -0
  403. package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
  404. package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
  405. package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
  406. package/knowledge/stardewvalley/game.versions.yaml +202 -0
  407. package/knowledge/stardewvalley/install.layout.yaml +277 -0
  408. package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
  409. package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
  410. package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
  411. package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
  412. package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
  413. package/knowledge/subnautica2/game.build.yaml +331 -0
  414. package/knowledge/subnautica2/modding.state.yaml +210 -0
  415. package/knowledge/subnautica2/ue5.containers.yaml +72 -0
  416. package/knowledge/subnautica2/ue5.paks.yaml +203 -0
  417. package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
  418. package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
  419. package/knowledge/valheim/bepinex.loader.yaml +247 -0
  420. package/knowledge/valheim/bepinex.plugins.yaml +251 -0
  421. package/knowledge/valheim/game.versions.yaml +321 -0
  422. package/knowledge/valheim/install.layout.yaml +216 -0
  423. package/knowledge/valheim/jotunn.library.yaml +334 -0
  424. package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
  425. package/knowledge/valheim/toolchain.build.yaml +111 -0
  426. package/package.json +29 -0
  427. package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
  428. package/scaffolds/baldursgate3/new-item.yaml +264 -0
  429. package/scaffolds/baldursgate3/new-mod.yaml +174 -0
  430. package/scaffolds/baldursgate3/new-passive.yaml +100 -0
  431. package/scaffolds/baldursgate3/new-project.yaml +118 -0
  432. package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
  433. package/scaffolds/baldursgate3/new-spell.yaml +102 -0
  434. package/scaffolds/baldursgate3/new-status.yaml +119 -0
  435. package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
  436. package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
  437. package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
  438. package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
  439. package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
  440. package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
  441. package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
  442. package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
  443. package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
  444. package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
  445. package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
  446. package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
  447. package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
  448. package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
  449. package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
  450. package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
  451. package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
  452. package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
  453. package/scaffolds/stardewvalley/new-project.yaml +184 -0
  454. package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
  455. package/scripts/mw-tool.mjs +184 -0
@@ -0,0 +1,579 @@
1
+ game: cyberpunk2077
2
+ topic: anims.authoring
3
+ title: authoring custom FPP melee grips, regrips, sway, lunge, heavies and finishers
4
+ facts:
5
+ - id: cp2077.anims.authoring.hand-position-report-was-improvement-not-regression
6
+ claim: "A user report that \"hand positions have moved\" (comparing the current build to the prior
7
+ baseline) was diagnosed via an A/B launch comparison as NOT a regression: the prior 08-20
8
+ baseline was materially worse everywhere the grip mattered, and the true remaining defect was
9
+ that the idle's own hand-posed right-hand grip was itself bad — because it fed every hold and
10
+ the whole crouch family through GRIP_SRC, the defect propagated everywhere except the block,
11
+ which kept its own independent hand-posed grip."
12
+ status: verified
13
+ source: ModWright field verification
14
+ tags:
15
+ - grip
16
+ - regression-diagnosis
17
+ - grip-src
18
+ - ab-comparison
19
+ - hand-position
20
+ detail: 'Concrete symptom that ruled out "the new hands are fine": fingers were visibly intersecting
21
+ the blade wherever the grip came from GRIP_SRC (idle, holds, crouch), exactly where the block
22
+ did not show the defect.'
23
+ - id: cp2077.anims.authoring.grip-transfer-must-use-palm-line-not-donor-wrist
24
+ claim: A naive grip-transfer (repointing weapon_rel/hand_rel from one hand-posed source pose to
25
+ another) silently assumes the source and the donor hold the wrist alike; replaying a donor's
26
+ untouched wrist under a source pose whose wrist was turned 86 degrees by hand-posing swung the
27
+ blade 0.426 m off the palm line (versus 0.115 m for the working approach). The working
28
+ transfer instead derives the roll term and palm midpoint FROM the source pose itself
29
+ (GRIP["roll_rel"], GRIP["palm_mid_local"]), turns BOTH wrists onto the re-fitted blade, and
30
+ iterates three rounds because turning a wrist moves the palm point the fit uses.
31
+ status: inferred
32
+ source: ModWright research
33
+ tags:
34
+ - grip-transfer
35
+ - palm-line
36
+ - weapon-rel
37
+ - hand-rel
38
+ - wrist-independence
39
+ detail: "Generalizes to: a grip is a relationship between the weapon and BOTH hands together;
40
+ anchoring the transfer to one hand only works while that hand is a fixed reference point,
41
+ which hand-posing specifically breaks. Offline result of the working transfer: 0.057/0.048 m
42
+ wrap-to-palm on all 12 transferred holds against the idle's own 0.063/0.049 m, and grip within
43
+ 0.1 degree of the idle on all 12. Status is inferred, not verified — the evidence is an
44
+ offline measurement; the transferred holds were separately seen in game 2026-08-21 but no note
45
+ records an in-game confirmation of the palm-line rule itself. Concrete source numbers:
46
+ GRIP[\"roll_rel\"] came out 152.3 degrees against the ROLL=180 constant it replaced."
47
+ - id: cp2077.anims.authoring.rotate-weapon-in-grip-not-grip-with-weapon
48
+ claim: "When a pose needs the weapon reoriented, pivoting the weapon ALONE about its own grip axis
49
+ (the line through the two wrap centroids) leaves the hands byte-identical to the pre-roll
50
+ pose; a rigid rotation of hands and weapon together as one piece instead forces the whole
51
+ angle through the wrists and can slide the wraps up to about 6 cm out of the palms. Measured
52
+ at a 75-degree weapon-only roll: wrists 108.5/39.5 degrees, identical before and after."
53
+ status: inferred
54
+ source: ModWright research
55
+ tags:
56
+ - rotate-weapon-in-grip
57
+ - grip-axis
58
+ - wrist-load
59
+ - deformation-free
60
+ detail: "Three tried rigid-rotation variants for the crouch pose (rigid roll on the wrist line,
61
+ elbow-solved roll, weapon-only roll) scored 125.5/80.9 degrees, 108.4/56.8, and 108.5/39.5
62
+ wrist load respectively — the weapon-only pivot exactly reproduced the idle's own wrist load,
63
+ and the wrist-line pivot was the one that \"tore the arms in game\". Also measured at roll 75:
64
+ wrap-to-palm unchanged at 0.0631/0.0492, blade tip elevation -57.3 -> +8.8 degrees, hang 0.901
65
+ -> 0.083 m. Status is inferred, not verified: these are offline measurements. The chosen ANGLE
66
+ was picked in game (cp2077.anims.authoring.crouch-roll-value-chosen-in-game); no note records
67
+ the user separately confirming in game that the weapon-only pivot left the hands unmoved."
68
+ - id: cp2077.anims.authoring.crouch-roll-value-chosen-in-game
69
+ claim: CROUCH_ROLL = 75 degrees (a rotation of the weapon alone about the line through both palms)
70
+ was chosen live in game by cycling candidate values with a CET console tool rather than by
71
+ offline preview alone; 75 was picked over the geometrically "flattest" option (60, dead level)
72
+ because it carries the blade tips slightly up, matching that a crouched player's enemies are
73
+ above them.
74
+ status: verified
75
+ source: ModWright field verification
76
+ tags:
77
+ - crouch-roll
78
+ - live-tuning
79
+ - cet-console
80
+ - user-decision
81
+ detail: The measured sweep (offline, no build needed) showed roll 60 as dead level (blade hangs 0.04
82
+ m below grip) and roll 0 as hanging 0.91 m below; 75 sits between the crouch's own 60-degree
83
+ "level" candidate and a fully raised guard.
84
+ - id: cp2077.anims.authoring.engine-limit-fpp-additive-ignores-spine-and-shoulders
85
+ claim: The FPP additive sway layer only honours LeftArm/RightArm and below plus the gun-space chain;
86
+ Spine3 and both shoulders are IGNORED by the engine at runtime. A build that authored the
87
+ entire ambient sway correction onto Spine3 (a geometrically elegant choice, since both
88
+ shoulders and the whole gun-space chain hang off Spine3 while the FPP camera does not)
89
+ measured a perfect zero-slip result offline (Blender reproduced the vanilla weapon path to
90
+ 0.09 mm) but rendered completely MOTIONLESS in game — idle, walk, crouch and block all dead
91
+ still.
92
+ status: verified
93
+ source: ModWright field verification
94
+ tags:
95
+ - engine-limit
96
+ - spine3
97
+ - fpp-additive
98
+ - sway
99
+ - launch-cost
100
+ detail: "Confirmed structurally by `_addbones.py`: in every vanilla additive, the first moving bone
101
+ in each arm chain is the upper arm, and Spine3/LeftShoulder/RightShoulder are exactly zero in
102
+ every one — the vanilla animators never used the spine because the additive layer cannot reach
103
+ it. The build was updated to gate every touched sway clip on
104
+ Spine3/Spine2/Spine1/Spine/Hips/LeftShoulder/RightShoulder staying at identity."
105
+ - id: cp2077.anims.authoring.no-base-independent-fix-for-full-ambient-sway
106
+ claim: Because the ambient-sway additive layer only reaches the arms (which form two separate
107
+ kinematic chains once the shoulders above them are unreachable), no single additive that keeps
108
+ the two arms perfectly moving together as one unit can serve every base pose without the
109
+ correction being conjugated by each base's own arm transform — meaning full pre-encoder-fix
110
+ sway amplitude and full base-independence are mutually exclusive, not a tuning failure to be
111
+ solved with more iteration.
112
+ status: inferred
113
+ source: ModWright research
114
+ tags:
115
+ - sway
116
+ - base-independence
117
+ - arm-chain
118
+ - structural-limit
119
+ detail: This structural conclusion predates and is independent of the later encoder root-cause
120
+ discovery (SWAY_GUNROT_CONST); it concerns the authored-signal side of the sway problem, not
121
+ the encoder-noise side.
122
+ - id: cp2077.anims.authoring.sway-damp-gain-tuning-superseded
123
+ claim: Before the encoder root cause was found, the sway defect was mitigated by tuning SWAY_DAMP
124
+ (uniformly scaling the vanilla arm-local sway; slip scales exactly with it, a pure trade) to
125
+ 0.85 and SWAY_GAIN (a left-arm-only rotation correction solved on the idle base, exact only on
126
+ that one base) to 0.25, calibrated so the idle's measured slip matched the level the user
127
+ already called correct on the block (0.0320 m) rather than reaching zero.
128
+ status: contradicted
129
+ source: ModWright research
130
+ tags:
131
+ - sway-damp
132
+ - sway-gain
133
+ - tuning
134
+ - dead-approach
135
+ detail: "Explicitly retired once the real root cause (encoder rotation noise on gun-space/IK bones)
136
+ was found and fixed: \"do NOT re-tune gain/damp, that trade is dead\" (a project's own notes).
137
+ See cp2077.anims.encoder.sway-gunrot-const-fix-verified-in-game for the superseding fix."
138
+ - id: cp2077.anims.authoring.crouch-still-softness-open
139
+ claim: After the sway root-cause fix, the crouch-still pose (which settles into melee_safepose, not
140
+ melee_crouchpose) still measures about 15.8 mm of slip versus 4 mm or less everywhere else,
141
+ because the sway's left-arm rotation correction is solved against ADDITIVE_BASE =
142
+ melee_idlepose and over-corrects on other bases; the prescribed fix, if the eye catches it, is
143
+ to re-pin the sway solve against melee_safepose (a new SWAY_BASE constant) and re-measure,
144
+ explicitly NOT to re-tune gain/damp.
145
+ status: unverified
146
+ source: ModWright research
147
+ tags:
148
+ - crouch-still
149
+ - melee_safepose
150
+ - sway-base
151
+ - open-item
152
+ detail: Left as an open item pending whether the user's eye ever catches it in normal play; not yet
153
+ re-pinned or re-measured as of the source's writing.
154
+ - id: cp2077.anims.authoring.wrist-budget-values-and-metric
155
+ claim: The calibrated per-side wrist load budget (bend plus twist) used to gate every authored grip
156
+ and pose is right hand <= 108.5 degrees, left hand <= 50.7 degrees, calibrated on static poses
157
+ already confirmed good in game. Palm-to-palm angle PARITY is explicitly NOT a valid grip
158
+ similarity metric — two confirmed-good shipped grips sit at 124 degrees apart from each other
159
+ — judge a grip only by palm-to-marker distance and wrist load.
160
+ status: inferred
161
+ source: ModWright research
162
+ tags:
163
+ - wrist-budget
164
+ - palm-parity
165
+ - grip-metric
166
+ - check-wrists
167
+ detail: Repeated across multiple authoring documents as a standing rule ("NEVER palm parity") after
168
+ being independently re-derived more than once.
169
+ - id: cp2077.anims.authoring.wrist-budget-untested-for-transient-loads
170
+ claim: The 108.5/50.7 degree wrist load budget was calibrated on four STATIC poses; its validity for
171
+ fast, transient mid-swing loads (as opposed to held poses) has never been confirmed in game,
172
+ and was deliberately left as a warning rather than a hard build failure on transient frames,
173
+ pending a launch verdict.
174
+ status: unverified
175
+ source: ModWright research
176
+ tags:
177
+ - wrist-budget
178
+ - transient-load
179
+ - static-vs-dynamic
180
+ - open-item
181
+ detail: "The stated policy: gate the plateaus (held poses) hard on this budget, warn-only on fast
182
+ transients, and let the launch judge whether the budget is too conservative for motion."
183
+ - id: cp2077.anims.authoring.grip-carry-wrist-configuration-closed-form
184
+ claim: "The transferable arm content of a grip that must move a hand while preserving its wrist feel
185
+ is the WRIST CONFIGURATION W = ForeArm^-1 @ Hand, reproduced per frame with two
186
+ hand-preserving, CLOSED-FORM degrees of freedom: forearm axial roll (about the elbow-to-wrist
187
+ line) and elbow swing (about the shoulder-to-hand line) — neither requires a per-frame search,
188
+ avoiding the jitter a discrete load-minimizing search produces (one documented search-based
189
+ approach moved the elbow 4.9 to 19.0 to 15.4 cm on three consecutive frames, jumping between
190
+ near-equal-error minima)."
191
+ status: inferred
192
+ source: ModWright research
193
+ tags:
194
+ - grip-carry
195
+ - wrist-configuration
196
+ - closed-form
197
+ - forearm-roll
198
+ - elbow-swing
199
+ detail: "Validation (offline): an offline grip-carry check recovers the Phase 1 katana relax EXACTLY
200
+ from its raw capture — residual 0.0000 degrees, elbow match 0.0000 m — with both a known-good
201
+ and a known-bad case exercised. This resolved what had been framed as a false dichotomy
202
+ between \"carry the donor's arm values\" (re-derives a documented failure: an earlier
203
+ GRIP_DELTA experiment that carried forearm values pushed hold grips to 0.566-0.640 m span
204
+ against an approved 0.509 m) and \"re-run a load-minimizing search per frame\" (inherits
205
+ jitter)."
206
+ - id: cp2077.anims.authoring.fingers-derived-never-carried
207
+ claim: Finger/hand-subtree bones must always be DERIVED fresh from the FINAL placed hand transform
208
+ on every frame, never carried through an intermediate rotation step; a routine that reorients
209
+ the hand after its children were already positioned orphans the fingers from the palm — the
210
+ general fix pattern is to rebuild the hand's children rigidly from the final hand transform
211
+ every time, which regrip_frame() already did and which fixed an adjacent defect in
212
+ solve_two_bone()'s hand-reorientation step.
213
+ status: inferred
214
+ source: ModWright research
215
+ tags:
216
+ - finger-derivation
217
+ - hand-subtree
218
+ - rebuild-from-final-hand
219
+ - builder-rule
220
+ detail: The specific defect found (relax_wrist rotating the hand's own subtree instead of excluding
221
+ it) was confirmed to be DEAD code in the shipping configuration at the time it was found, and
222
+ to never have perturbed actual weapon placement — only measurement diagnostics and finger
223
+ cosmetics were affected.
224
+ - id: cp2077.anims.authoring.sway-slip-proportional-to-turn-times-span
225
+ claim: The geometric law behind the ambient sway defect is slip is approximately proportional to
226
+ weapon_turn times grip_span; because the custom weapon's hands sit roughly 0.51 m apart versus
227
+ the donor katana's 0.093 m, the identical ambient sway rotation drags roughly 5-6 times more
228
+ haft length through the off hand than it does on the weapon the sway was originally authored
229
+ for.
230
+ status: inferred
231
+ source: ModWright research
232
+ tags:
233
+ - sway
234
+ - weapon-turn
235
+ - grip-span
236
+ - geometric-law
237
+ detail: "Measured comparison table (span in meters, slip per meter of span): katana base+add
238
+ 0.093/0.193, hammer base+add 0.473/0.012, the custom weapon 0.513/0.120 — the katana's own
239
+ sway is proportionally far worse but invisible only because its span is tiny."
240
+ - id: cp2077.anims.authoring.right-arm-repose-is-the-turn-amplifier
241
+ claim: Rebuilding a custom weapon's base pose from the donor one bone group at a time isolated the
242
+ weapon-turn increase under the shared ambient additive (3.66 to 5.22 degrees) entirely to the
243
+ RIGHT arm re-pose, not to the wrist changes or the left arm re-pose.
244
+ status: inferred
245
+ source: ModWright research
246
+ tags:
247
+ - right-arm
248
+ - weapon-turn
249
+ - isolation
250
+ - sway-source
251
+ detail: "Isolation table: donor arms + our wrists (turn 3.66), + our left arm (turn 3.66,
252
+ unchanged), + our right arm (turn 5.22 — the whole jump)."
253
+ - id: cp2077.anims.authoring.no-vanilla-clip-carries-lunge-travel
254
+ claim: Across a sweep of 1166 player-FPP-melee clips, root_excursion_m measures 0.0000 on every
255
+ single one — 58 clips do move some torso or leg bone by more than 1 mm, but none of that
256
+ displaces the body; the best-looking forward-hand-travel candidates were either camera-frame
257
+ artifacts (measured hand travel of +0.81 to +0.95 m collapses to +0.15/+0.17 m once measured
258
+ in the live per-frame camera basis instead of a frame-0-fixed basis, because the camera itself
259
+ travels 0.836 m during those clips) or monotonic pose-transition drift rather than a genuine
260
+ thrust-and-return; a custom finisher's forward lunge travel therefore has to be supplied by
261
+ the engine (record/script side), with the clip supplying only the arm and blade extension.
262
+ status: inferred
263
+ source: ModWright research
264
+ tags:
265
+ - lunge
266
+ - root-motion
267
+ - camera-frame-artifact
268
+ - no-clip-travel
269
+ detail: Exactly one attack-family clip in the whole census showed a genuine forward-out-and-back
270
+ drive above 0.25 m (default_melee_weapon/final_attack_03, +0.288 m at frame 9 of 46, returning
271
+ to net 0.000), and even that is an arm extension, not a lunge.
272
+ - id: cp2077.anims.authoring.entry-transition-and-terminal-pose-both-constrain-authoring
273
+ claim: "Because the Attack state's entry transition is a hard, zero-duration cut and the whole state
274
+ machine terminates attack clips exactly on melee_idlepose frame 0, every custom-authored swing
275
+ has a symmetric requirement: frame 0 must equal the CURRENT (re-posed) idle's grip exactly,
276
+ and the final frame must equal melee_idlepose frame 0 exactly, with a near-static, cut-safe
277
+ plateau covering the whole mapped cut window in between."
278
+ status: inferred
279
+ source: ModWright research
280
+ tags:
281
+ - entry-transition
282
+ - terminal-pose
283
+ - cut-safe-plateau
284
+ - authoring-constraint
285
+ detail: "Both live defects this constraint was written to fix were measured concretely before the
286
+ fix: a 0.42 m instantaneous hand snap on attack entry, and a 403.5 mm / 98.0 degree gap
287
+ between the re-posed idle and the vanilla idle every attack clip terminates onto."
288
+ - id: cp2077.anims.authoring.blade-rides-right-hand-not-palm-line-for-attacks
289
+ claim: "For authored ATTACK clips (as opposed to static holds), deriving the blade transform from a
290
+ fitted palm line between both hands is the wrong model: the fit becomes numerically
291
+ ill-conditioned at a stacked/katana-style grip (a 0.108 m span measured about 4.3x
292
+ ill-conditioned) and is UNDEFINED whenever the left hand is off the haft mid-regrip, which
293
+ every authored swing does at some point. The adopted model instead rigs the blade rigidly to
294
+ the RIGHT hand (X(t) = H_R(t) @ rel_R, with rel_R captured once from the END-grip reference),
295
+ then solves the LEFT hand onto the blade per a per-swing grip timeline."
296
+ status: inferred
297
+ source: ModWright research
298
+ tags:
299
+ - blade-placement
300
+ - right-hand-rigid
301
+ - palm-line
302
+ - ill-conditioned
303
+ - grip-timeline
304
+ detail: This is the design underlying build_attack2r.py; it removes a conditioning problem entirely
305
+ rather than mitigating it, and it matches how the engine itself composes a held weapon
306
+ (WeaponRight is a child bone of RightHand).
307
+ - id: cp2077.anims.authoring.regrip-windows-must-be-authored-in-state-time
308
+ claim: Because the record's three-segment retimer stretches each authored Phase segment
309
+ independently and by different factors per swing (e.g. one swing's startup plays at 2.67x,
310
+ another swing's recover at 2.63x), a release/regrip window or contact frame authored as a
311
+ fixed FRACTION of clip time can play up to about 3x faster or slower on screen than in the
312
+ Blender preview; regrip windows and contact frames must instead be expressed in state time
313
+ (seconds actually on screen) and mapped through each swing's own record durations into clip
314
+ frames at build time.
315
+ status: inferred
316
+ source: ModWright research
317
+ tags:
318
+ - regrip-window
319
+ - state-time
320
+ - clip-fraction
321
+ - retimer
322
+ - authoring-rule
323
+ detail: "Corollary: the authored contact frame goes at 0.899 of the startup segment when the retimer
324
+ engages (per cp2077.anims.graph.gameplay-hit-lands-near-active-phase-event), also expressed
325
+ through this same time mapping."
326
+ - id: cp2077.anims.authoring.boundary-grip-design-end-everywhere
327
+ claim: The project's boundary-grip design question — whether each chain-linked swing should open and
328
+ close on a shared END grip with its own out-and-back regrip inside the clip, versus carrying a
329
+ grip across chain links for a prettier but more fragile join — was resolved by the user in
330
+ favor of END-EVERYWHERE, on the grounds that opening and closing every swing at the same
331
+ END-grip pose is robust to every cut timing and entry path; chain-carried grips were offered
332
+ and declined.
333
+ status: contradicted
334
+ source: ModWright research
335
+ tags:
336
+ - boundary-grip
337
+ - end-grip
338
+ - chain-carried-grip
339
+ - user-decision
340
+ - dead-belief
341
+ detail: "Kept as the decision of 2026-08-23. REVERSED the same evening by the launch verdict on
342
+ build a4214cda: \"Vanilla chains ALTERNATE stroke direction (R->L, L->R, R->L...) and do NOT
343
+ return to baseline between chained swings. REVERSES the END-boundary decision.\" Superseded by
344
+ cp2077.anims.authoring.chain-links-open-on-predecessor-park. Its original consequence — each
345
+ swing's regrip authored entirely inside its own clip (END-CENTRE-END, END-KATANA-END) — no
346
+ longer holds past swing 0."
347
+ - id: cp2077.anims.authoring.chain-links-open-on-predecessor-park
348
+ claim: "Vanilla melee chains ALTERNATE stroke direction (right-to-left, then left-to-right, then
349
+ right-to-left) and do NOT return to a baseline pose between chained swings: each clip opens on
350
+ its predecessor's PARK pose, strokes through the screen-centre hit dot, parks on the far side
351
+ (which becomes the successor's cut-in window), and only its RECOVERY tail — played when the
352
+ chain stops — returns grip and pose to the idle. Entry to the first swing from the idle stays
353
+ a hard cut."
354
+ status: inferred
355
+ supersedes: cp2077.anims.authoring.boundary-grip-design-end-everywhere
356
+ source: ModWright research
357
+ tags:
358
+ - chain-join
359
+ - park-pose
360
+ - stroke-alternation
361
+ - cut-window
362
+ - authoring-rule
363
+ detail: 'Two companion rules were adopted from the same verdict: every melee swing must land on the
364
+ screen-centre hit dot (strokes are authored in CAMERA space), and ONE CLIP = ONE STROKE — a
365
+ windup-plus-strike-plus-return packed into a single clip fought the record retimer and read as
366
+ unreadable noise (user on the rejected build: swings 1 and 2 were "so fast I can perceive no
367
+ details"). Vanilla clips read fine at the same retime because their content is a single
368
+ stroke. The measured screen-space consequence of the park convention is
369
+ cp2077.anims.authoring.vanilla-swing-parks-off-screen-between-chain-links.'
370
+ - id: cp2077.anims.authoring.swing0-composite-donor-approved-in-game
371
+ claim: Swing 0 (combo_attack_01, the light-chain opener) shipped as a from-scratch AUTHORED forward
372
+ thrust rather than adopting a single donor whole, because no single vanilla clip on disk is a
373
+ genuine forward thrust; the closest composite reference blended pwa_knife combo_attack_03's
374
+ forward drive (the largest single-frame forward displacement measured in the whole shortlist)
375
+ with pwa_katana safe_attack's extension and held finish. Both hands stay on the END grips
376
+ throughout. The user approved this swing's pose and extension in game.
377
+ status: verified
378
+ source: ModWright field verification
379
+ tags:
380
+ - swing0
381
+ - donor-composite
382
+ - forward-thrust
383
+ - approved-in-game
384
+ detail: pwa_katana combo_attack_01 (rank 1 by record data) was explicitly rejected on inspection —
385
+ its arc is a descending diagonal chop, not a thrust in any component, and its shape was
386
+ reassigned to swing 2's spec instead.
387
+ - id: cp2077.anims.authoring.vanilla-swing-parks-off-screen-between-chain-links
388
+ claim: A screen-space trace of the vanilla katana clip occupying the swing-1 slot (combo_attack_02)
389
+ showed the clip parks the blade AND both hands fully OFF-SCREEN to the right (in-frame
390
+ fraction 0.00 through the whole cut window) after a roughly three-frame full-viewport
391
+ crossing, entering from off-screen left in its own windup; the chain's next link
392
+ (combo_attack_03) opens at that same off-right position and sweeps back to park off-screen
393
+ left, i.e. vanilla combos alternate off-screen parks rather than ending each swing framed in
394
+ view.
395
+ status: inferred
396
+ source: ModWright research
397
+ tags:
398
+ - screen-space-trace
399
+ - off-screen-park
400
+ - chain-alternation
401
+ - vanilla-reference
402
+ detail: This directly overturned five earlier rejected parametric builds of the corresponding custom
403
+ swing, all of which had ended the sweep framed fully in view — exactly what a real swing never
404
+ does, and what the user's rejections ("half way", "back in front") were describing.
405
+ - id: cp2077.anims.authoring.rigid-transform-of-prior-park-cannot-reach-off-screen-park
406
+ claim: "An exhaustive offline sweep of about 2.5 million candidate placements (5 degrees of freedom
407
+ across 6 tested grip widths) for a chained swing's parked pose, modeled as a rigid transform
408
+ of the PREDECESSOR swing's own park (yaw about the eye, forward push, lateral drift, pitch,
409
+ roll), found ZERO placements satisfying the measured vanilla park's screen geometry at any
410
+ tested grip width. The structural cause: the custom weapon's two hands sit roughly 0.5 m apart
411
+ on the haft (half-sword) versus the katana's roughly 0.15 m, so where vanilla parks its two
412
+ hands about 4 cm apart in depth, the equivalent half-sword grip would need about 31 cm of hand
413
+ depth separation, which no rigid transform of a single prior pose can produce."
414
+ status: inferred
415
+ source: ModWright research
416
+ tags:
417
+ - park-pose
418
+ - rigid-transform
419
+ - exhaustive-sweep
420
+ - half-sword-grip
421
+ - structural-limit
422
+ detail: "Confirmed the fallback predicted in advance by the project's own standing rule (\"if the
423
+ user rejects the v6 parametric attempt, do not tune parameters again — hand it to the user\"):
424
+ the park needed a free, hand-posed placement rather than a parametric one."
425
+ - id: cp2077.anims.authoring.one-hand-posed-frame-beat-five-parametric-iterations
426
+ claim: Across this authoring effort, a single hand-posed correction (the swing-0 "EXTEND" grip,
427
+ posed once by the user) landed correctly on the first attempt, and the correction it produced
428
+ turned out to be rotation-dominant (33 mm plus 40.8 degrees on the right hand, 73 mm plus 38.8
429
+ degrees on the left) — a shape no translation-focused parameter search would have found —
430
+ while five successive parametric iterations of a different swing's spec all failed against the
431
+ same user's rejections.
432
+ status: verified
433
+ source: ModWright field verification
434
+ tags:
435
+ - hand-posed
436
+ - parametric-tuning
437
+ - extend-grip
438
+ - authoring-strategy
439
+ detail: "The standing rule this produced: after one parametric attempt against a corrected, measured
440
+ specification, if the user still rejects it, switch to a user-hand-posed reference pose rather
441
+ than continuing to tune parameters."
442
+ - id: cp2077.anims.authoring.heavy-attack-phase-proportions
443
+ claim: "A heavy attack's phase proportions, measured from the vanilla katana heavy_attack_01 (42
444
+ frames) and used as a SHAPE reference (not a timing reference, since the vanilla clip's own
445
+ record retimes it) for a custom heavy swing: roughly 1 part chamber (a slow wind-up), 0.5 part
446
+ strike (a very fast few-frame swing), 2 parts dwell (a long, nearly frozen follow-through). An
447
+ early rejected draft had the dwell but built the chamber and the strike out of two
448
+ interpolated poses, and read as \"a slide rather than a swing\" specifically because it lacked
449
+ this proportion."
450
+ status: inferred
451
+ source: ModWright research
452
+ tags:
453
+ - heavy-attack
454
+ - phase-proportion
455
+ - chamber-strike-dwell
456
+ - katana-reference
457
+ detail: The interpolated draft was rejected by the user on its preview GIF ("really not working"),
458
+ not in game, which is why this is inferred. Vanilla's own katana heavy does not strike at the
459
+ record's stock attackEffectDelay frame (about frame 9 in a naive 1:1 mapping) — it strikes
460
+ around frame 13 of its own clip, because the katana's strong record carries nonzero
461
+ startup/active/recover durations that retime the whole clip; a heavy authored to play 1:1 (no
462
+ retimer) needs its own record durations reconsidered if the vanilla clip's shape is reused
463
+ as-is.
464
+ - id: cp2077.anims.authoring.heavy-attacks-hand-authored-by-user-on-ik-handle-rig
465
+ claim: After a pose-interpolation approach for a heavy attack was rejected on the preview GIF, the
466
+ heavy attacks were switched to direct user hand-authoring on a rig exposing 7 keyframeable IK
467
+ handles (HAND_L/R, ELBOW_L/R, SHOULDER_L/R, and a blade-carrying weapon-adjust handle that
468
+ also drags both hand handles along with it), overlaid with two animated reference skeletons
469
+ (vanilla katana and machete heavies) for shape comparison; the tooling samples the resulting
470
+ pose EVERY frame regardless of how sparsely the user keys, and the user later confirmed all
471
+ heavy attacks were done.
472
+ status: inferred
473
+ source: ModWright research
474
+ tags:
475
+ - heavy-attack
476
+ - hand-authoring
477
+ - ik-handle-rig
478
+ - reference-skeleton
479
+ - user-authored
480
+ detail: Because the user is the sole ground truth for a hand-authored path, the screen-geometry
481
+ gates run report-only (non-blocking) on this content rather than failing the build. The user
482
+ reported the work complete ("heavy attacks are all done", 2026-08-26); that is a statement
483
+ about authoring progress, not an in-game engine observation, so this fact is inferred rather
484
+ than verified.
485
+ - id: cp2077.anims.authoring.blade-rotation-cheap-translation-expensive-for-heavy-authoring
486
+ claim: On the heavy-attack hand-authoring rig, a 90-degree blade ROTATION about the grip axis left
487
+ both palms within about 2 cm of their reference markers (nearly free), while a 0.30 m blade
488
+ TRANSLATION put the far hand 0.83 m from its shoulder, saturating the arm's IK and pulling the
489
+ palm 16-22 cm off the grip; a heavy swing's visible travel should therefore come from rotating
490
+ the blade about the grip rather than translating it through space, matching how the vanilla
491
+ katana heavy's own 0.87 m stroke is mostly the weapon swinging about the hands rather than the
492
+ hands themselves travelling.
493
+ status: inferred
494
+ source: ModWright research
495
+ tags:
496
+ - blade-rotation
497
+ - blade-translation
498
+ - reach-limit
499
+ - heavy-authoring
500
+ detail: 'Stated as a rule of thumb for the user during hand-authoring: "if the arms straighten and
501
+ the hands visibly leave the haft, you are past the reach limit — pull the blade back in and
502
+ get the travel from rotation instead."'
503
+ - id: cp2077.anims.authoring.clip-coverage-audit-donor-grip-vs-authored-grip
504
+ claim: A full-set audit measuring hand span and each hand's distance from the WeaponRight bone axis
505
+ across all 97 clips in the shipped set found 47 of 72 non-additive clips fully re-authored
506
+ onto the custom weapon's own wide (0.18-0.58 m) half-sword grip, and 25 clips still holding
507
+ the donor katana's narrow (0.092-0.114 m) two-hands-together grip; of those 25, 16 are
508
+ reachable in normal gameplay (crouch/jump/equip attacks, weapon slide, block-deflect, being
509
+ parried) and are real outstanding work items, while 9 are structurally unreachable at the
510
+ shipped AttacksNumber setting and require no work unless that setting is later raised.
511
+ status: inferred
512
+ source: ModWright research
513
+ tags:
514
+ - clip-coverage-audit
515
+ - donor-grip
516
+ - reachable-clips
517
+ - unreachable-clips
518
+ detail: "Open contradiction the audit itself flags: the user reported the crouch attack looks GOOD
519
+ in play despite crouch_attack still measuring a donor-grip span, so either the melee state
520
+ machine leaves the crouch state before an attack actually plays that clip, or the defect
521
+ simply has not yet been seen — this needs settling before authoring effort is spent there."
522
+ - id: cp2077.anims.authoring.donor-pick-falling-slash-swing
523
+ claim: For a chain design's falling-slash swing, pwa_one_handed_blunt combo_attack_01 was picked
524
+ over other candidates as the only genuine top-right-to-bottom-left diagonal cut among the
525
+ shortlisted donors (40 degrees below horizontal), with the tighter, cleaner HOLD pose (0.014
526
+ to 0.062 m of wobble in the weapon frame) borrowed from pwa_katana heavy_attack_01 or
527
+ combo_attack_03 instead. pwa_katana heavy_attack_01 was explicitly rejected as a donor for the
528
+ ARC despite having the cleanest hold, because 10 of its 12 sampled first-person tiles show no
529
+ blade on screen at all.
530
+ status: inferred
531
+ source: ModWright research
532
+ tags:
533
+ - donor-pick
534
+ - falling-slash
535
+ - first-person-visibility
536
+ - contact-sheet
537
+ detail: "Picked by the user on 2026-08-23 from a 12-donor contact-sheet index — an offline preview
538
+ choice, not an in-game observation, hence inferred. General lesson recorded alongside this
539
+ pick: a donor's record name does not describe its actual arc (Phase 0's own warning,
540
+ reconfirmed here), and first-person BLADE VISIBILITY, not arc quality alone, is a hard filter
541
+ on donor viability."
542
+ - id: cp2077.anims.authoring.vanilla-light-chain-shared-swing-grammar
543
+ claim: "A comparative per-frame speed and rotation measurement of the katana, machete and hammer
544
+ vanilla light-attack chains found a shared grammar for a satisfying swing: a short
545
+ rotation-or-translation-led ANTICIPATION before the stroke that scales with weapon weight
546
+ (measured: 3 frames / 357 mm for a katana combo versus 10 frames / 651 mm for a hammer combo),
547
+ a 1-3 frame WHIP that peaks in speed exactly AT the contact frame (never decelerating into
548
+ contact), a multi-frame POST-IMPACT DWELL (longest on the finisher, 9 frames measured), and a
549
+ RECOVERY that always tapers toward near-zero speed over its last 3-5 frames rather than
550
+ arriving at the idle pose at speed."
551
+ status: inferred
552
+ source: ModWright research
553
+ tags:
554
+ - swing-grammar
555
+ - anticipation
556
+ - whip
557
+ - dwell
558
+ - recovery
559
+ - vanilla-reference
560
+ detail: The project's own earlier swing-2/swing-3 builds used a single decelerating smoothstep with
561
+ no rotation-led coil and no proportionate dwell, and were redesigned specifically to match
562
+ this measured grammar after the user asked for a pass studying "anticipation and pauses."
563
+ - id: cp2077.anims.authoring.mounted-vehicle-path-unaffected-by-lunge-record-change
564
+ claim: "The finisher's move-to-target lunge fix (enabling enableAdjustingPlayerPositionToTarget on
565
+ the finisher's attack record) does not affect bike or vehicle melee combat: the
566
+ mounted-vehicle path runs a distinct event class (MeleeMountedFinalAttackEvents) whose four
567
+ MountedStrongAttackAbstract records all explicitly set that field to false, and the mod's own
568
+ anim-steering script already early-returns for that mounted event class — though nothing
569
+ enforces this relationship if the finisher record is ever reparented away from its current
570
+ base."
571
+ status: inferred
572
+ source: ModWright research
573
+ tags:
574
+ - mounted-vehicle
575
+ - meleemountedfinalattackevents
576
+ - lunge
577
+ - risk
578
+ detail: Flagged specifically as a fragile-but-currently-safe invariant, not a structurally
579
+ guaranteed one, in case the finisher record's inheritance chain changes in a future edit.