@nguyenphp/antigravity-marketing 1.0.16 → 1.0.19

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 (376) hide show
  1. package/README.md +187 -74
  2. package/bin/index.js +4 -4
  3. package/package.json +4 -3
  4. package/templates/.agent/agents/backend-specialist.md +263 -0
  5. package/templates/.agent/agents/database-architect.md +226 -0
  6. package/templates/.agent/agents/debugger.md +225 -0
  7. package/templates/.agent/agents/devops-engineer.md +242 -0
  8. package/templates/.agent/agents/documentation-writer.md +104 -0
  9. package/templates/.agent/agents/explorer-agent.md +73 -0
  10. package/templates/.agent/agents/frontend-specialist.md +527 -0
  11. package/templates/.agent/agents/game-developer.md +162 -0
  12. package/templates/.agent/agents/mobile-developer.md +377 -0
  13. package/templates/.agent/agents/orchestrator.md +400 -0
  14. package/templates/.agent/agents/penetration-tester.md +188 -0
  15. package/templates/.agent/agents/performance-optimizer.md +187 -0
  16. package/templates/.agent/agents/project-planner.md +403 -0
  17. package/templates/.agent/agents/security-auditor.md +170 -0
  18. package/templates/.agent/agents/seo-specialist.md +111 -0
  19. package/templates/.agent/agents/test-engineer.md +158 -0
  20. package/templates/.agent/rules/GEMINI.md +248 -0
  21. package/templates/.agent/skills/analytics-marketing/SKILL.md +172 -324
  22. package/templates/.agent/skills/api-patterns/SKILL.md +81 -0
  23. package/templates/.agent/skills/api-patterns/api-style.md +42 -0
  24. package/templates/.agent/skills/api-patterns/auth.md +24 -0
  25. package/templates/.agent/skills/api-patterns/documentation.md +26 -0
  26. package/templates/.agent/skills/api-patterns/graphql.md +41 -0
  27. package/templates/.agent/skills/api-patterns/rate-limiting.md +31 -0
  28. package/templates/.agent/skills/api-patterns/response.md +37 -0
  29. package/templates/.agent/skills/api-patterns/rest.md +40 -0
  30. package/templates/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  31. package/templates/.agent/skills/api-patterns/security-testing.md +122 -0
  32. package/templates/.agent/skills/api-patterns/trpc.md +41 -0
  33. package/templates/.agent/skills/api-patterns/versioning.md +22 -0
  34. package/templates/.agent/skills/app-builder/SKILL.md +75 -0
  35. package/templates/.agent/skills/app-builder/agent-coordination.md +71 -0
  36. package/templates/.agent/skills/app-builder/feature-building.md +53 -0
  37. package/templates/.agent/skills/app-builder/project-detection.md +34 -0
  38. package/templates/.agent/skills/app-builder/scaffolding.md +118 -0
  39. package/templates/.agent/skills/app-builder/tech-stack.md +40 -0
  40. package/templates/.agent/skills/app-builder/templates/SKILL.md +39 -0
  41. package/templates/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  42. package/templates/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  43. package/templates/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  44. package/templates/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  45. package/templates/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  46. package/templates/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  47. package/templates/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  48. package/templates/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
  49. package/templates/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
  50. package/templates/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
  51. package/templates/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
  52. package/templates/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  53. package/templates/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
  54. package/templates/.agent/skills/architecture/SKILL.md +55 -0
  55. package/templates/.agent/skills/architecture/context-discovery.md +43 -0
  56. package/templates/.agent/skills/architecture/examples.md +94 -0
  57. package/templates/.agent/skills/architecture/pattern-selection.md +68 -0
  58. package/templates/.agent/skills/architecture/patterns-reference.md +50 -0
  59. package/templates/.agent/skills/architecture/trade-off-analysis.md +77 -0
  60. package/templates/.agent/skills/banner-design/SKILL.md +192 -0
  61. package/templates/.agent/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
  62. package/templates/.agent/skills/bash-linux/SKILL.md +199 -0
  63. package/templates/.agent/skills/behavioral-modes/SKILL.md +242 -0
  64. package/templates/.agent/skills/brainstorming/SKILL.md +163 -0
  65. package/templates/.agent/skills/brainstorming/dynamic-questioning.md +350 -0
  66. package/templates/.agent/skills/brand/SKILL.md +97 -0
  67. package/templates/.agent/skills/brand/references/approval-checklist.md +169 -0
  68. package/templates/.agent/skills/brand/references/asset-organization.md +157 -0
  69. package/templates/.agent/skills/brand/references/brand-guideline-template.md +140 -0
  70. package/templates/.agent/skills/brand/references/color-palette-management.md +186 -0
  71. package/templates/.agent/skills/brand/references/consistency-checklist.md +94 -0
  72. package/templates/.agent/skills/brand/references/logo-usage-rules.md +185 -0
  73. package/templates/.agent/skills/brand/references/messaging-framework.md +85 -0
  74. package/templates/.agent/skills/brand/references/typography-specifications.md +214 -0
  75. package/templates/.agent/skills/brand/references/update.md +118 -0
  76. package/templates/.agent/skills/brand/references/visual-identity.md +96 -0
  77. package/templates/.agent/skills/brand/references/voice-framework.md +88 -0
  78. package/templates/.agent/skills/brand/scripts/extract-colors.cjs +341 -0
  79. package/templates/.agent/skills/brand/scripts/inject-brand-context.cjs +349 -0
  80. package/templates/.agent/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
  81. package/templates/.agent/skills/brand/scripts/validate-asset.cjs +387 -0
  82. package/templates/.agent/skills/brand/templates/brand-guidelines-starter.md +275 -0
  83. package/templates/.agent/skills/clean-code/SKILL.md +201 -0
  84. package/templates/.agent/skills/code-review-checklist/SKILL.md +109 -0
  85. package/templates/.agent/skills/copywriting/SKILL.md +250 -0
  86. package/templates/.agent/skills/database-design/SKILL.md +52 -0
  87. package/templates/.agent/skills/database-design/database-selection.md +43 -0
  88. package/templates/.agent/skills/database-design/indexing.md +39 -0
  89. package/templates/.agent/skills/database-design/migrations.md +48 -0
  90. package/templates/.agent/skills/database-design/optimization.md +36 -0
  91. package/templates/.agent/skills/database-design/orm-selection.md +30 -0
  92. package/templates/.agent/skills/database-design/schema-design.md +56 -0
  93. package/templates/.agent/skills/database-design/scripts/schema_validator.py +172 -0
  94. package/templates/.agent/skills/deployment-procedures/SKILL.md +241 -0
  95. package/templates/.agent/skills/docker-expert/SKILL.md +409 -0
  96. package/templates/.agent/skills/frontend-design/animation-guide.md +331 -0
  97. package/templates/.agent/skills/frontend-design/color-system.md +311 -0
  98. package/templates/.agent/skills/frontend-design/decision-trees.md +418 -0
  99. package/templates/.agent/skills/frontend-design/motion-graphics.md +306 -0
  100. package/templates/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  101. package/templates/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  102. package/templates/.agent/skills/frontend-design/typography-system.md +345 -0
  103. package/templates/.agent/skills/frontend-design/ux-psychology.md +541 -0
  104. package/templates/.agent/skills/frontend-design/visual-effects.md +383 -0
  105. package/templates/.agent/skills/frontend-slides/SKILL.md +92 -0
  106. package/templates/.agent/skills/frontend-slides/STYLE_PRESETS.md +347 -0
  107. package/templates/.agent/skills/frontend-slides/animation-patterns.md +110 -0
  108. package/templates/.agent/skills/frontend-slides/examples/n8n-jupviec-automation.html +789 -0
  109. package/templates/.agent/skills/frontend-slides/examples/n8n-jupviec-automation.pptx +0 -0
  110. package/templates/.agent/skills/frontend-slides/html-template.md +347 -0
  111. package/templates/.agent/skills/frontend-slides/scripts/export-pptx.py +58 -0
  112. package/templates/.agent/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  113. package/templates/.agent/skills/frontend-slides/viewport-base.css +153 -0
  114. package/templates/.agent/skills/game-development/2d-games/SKILL.md +119 -0
  115. package/templates/.agent/skills/game-development/3d-games/SKILL.md +135 -0
  116. package/templates/.agent/skills/game-development/SKILL.md +167 -0
  117. package/templates/.agent/skills/game-development/game-art/SKILL.md +185 -0
  118. package/templates/.agent/skills/game-development/game-audio/SKILL.md +190 -0
  119. package/templates/.agent/skills/game-development/game-design/SKILL.md +129 -0
  120. package/templates/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
  121. package/templates/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
  122. package/templates/.agent/skills/game-development/pc-games/SKILL.md +144 -0
  123. package/templates/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
  124. package/templates/.agent/skills/game-development/web-games/SKILL.md +150 -0
  125. package/templates/.agent/skills/geo-fundamentals/SKILL.md +156 -0
  126. package/templates/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
  127. package/templates/.agent/skills/growth-engine/SKILL.md +244 -0
  128. package/templates/.agent/skills/i18n-localization/SKILL.md +154 -0
  129. package/templates/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  130. package/templates/.agent/skills/lint-and-validate/SKILL.md +45 -0
  131. package/templates/.agent/skills/lint-and-validate/scripts/lint_runner.py +172 -0
  132. package/templates/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
  133. package/templates/.agent/skills/marketing-report-expert/SKILL.md +70 -0
  134. package/templates/.agent/skills/mcp-builder/SKILL.md +176 -0
  135. package/templates/.agent/skills/minimax-docx/LICENSE +21 -0
  136. package/templates/.agent/skills/minimax-docx/SKILL.md +274 -0
  137. package/templates/.agent/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
  138. package/templates/.agent/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
  139. package/templates/.agent/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
  140. package/templates/.agent/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
  141. package/templates/.agent/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
  142. package/templates/.agent/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
  143. package/templates/.agent/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
  144. package/templates/.agent/skills/minimax-docx/references/cjk_typography.md +357 -0
  145. package/templates/.agent/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
  146. package/templates/.agent/skills/minimax-docx/references/comments_guide.md +191 -0
  147. package/templates/.agent/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
  148. package/templates/.agent/skills/minimax-docx/references/design_principles.md +819 -0
  149. package/templates/.agent/skills/minimax-docx/references/openxml_element_order.md +308 -0
  150. package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
  151. package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
  152. package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
  153. package/templates/.agent/skills/minimax-docx/references/openxml_namespaces.md +82 -0
  154. package/templates/.agent/skills/minimax-docx/references/openxml_units.md +72 -0
  155. package/templates/.agent/skills/minimax-docx/references/scenario_a_create.md +284 -0
  156. package/templates/.agent/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
  157. package/templates/.agent/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
  158. package/templates/.agent/skills/minimax-docx/references/track_changes_guide.md +200 -0
  159. package/templates/.agent/skills/minimax-docx/references/troubleshooting.md +506 -0
  160. package/templates/.agent/skills/minimax-docx/references/typography_guide.md +294 -0
  161. package/templates/.agent/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
  162. package/templates/.agent/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
  163. package/templates/.agent/skills/minimax-docx/scripts/docx_preview.sh +37 -0
  164. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
  165. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
  166. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
  167. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
  168. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
  169. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
  170. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
  171. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
  172. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
  173. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
  174. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
  175. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
  176. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
  177. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
  178. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
  179. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
  180. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
  181. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
  182. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
  183. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
  184. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
  185. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
  186. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
  187. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
  188. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
  189. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
  190. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
  191. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
  192. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
  193. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
  194. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
  195. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
  196. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
  197. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
  198. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
  199. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
  200. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
  201. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
  202. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
  203. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
  204. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
  205. package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
  206. package/templates/.agent/skills/minimax-docx/scripts/env_check.sh +196 -0
  207. package/templates/.agent/skills/minimax-docx/scripts/setup.ps1 +274 -0
  208. package/templates/.agent/skills/minimax-docx/scripts/setup.sh +504 -0
  209. package/templates/.agent/skills/minimax-multimodal-toolkit/SKILL.md +359 -0
  210. package/templates/.agent/skills/minimax-pdf/README.md +222 -0
  211. package/templates/.agent/skills/minimax-pdf/SKILL.md +201 -0
  212. package/templates/.agent/skills/minimax-pdf/design/design.md +381 -0
  213. package/templates/.agent/skills/minimax-pdf/scripts/cover.py +1579 -0
  214. package/templates/.agent/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
  215. package/templates/.agent/skills/minimax-pdf/scripts/fill_write.py +242 -0
  216. package/templates/.agent/skills/minimax-pdf/scripts/make.sh +491 -0
  217. package/templates/.agent/skills/minimax-pdf/scripts/merge.py +112 -0
  218. package/templates/.agent/skills/minimax-pdf/scripts/palette.py +559 -0
  219. package/templates/.agent/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
  220. package/templates/.agent/skills/minimax-pdf/scripts/render_body.py +1055 -0
  221. package/templates/.agent/skills/minimax-pdf/scripts/render_cover.cjs +111 -0
  222. package/templates/.agent/skills/minimax-xlsx/SKILL.md +138 -0
  223. package/templates/.agent/skills/minimax-xlsx/references/create.md +691 -0
  224. package/templates/.agent/skills/minimax-xlsx/references/edit.md +684 -0
  225. package/templates/.agent/skills/minimax-xlsx/references/fix.md +37 -0
  226. package/templates/.agent/skills/minimax-xlsx/references/format.md +768 -0
  227. package/templates/.agent/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
  228. package/templates/.agent/skills/minimax-xlsx/references/read-analyze.md +97 -0
  229. package/templates/.agent/skills/minimax-xlsx/references/validate.md +772 -0
  230. package/templates/.agent/skills/minimax-xlsx/scripts/formula_check.py +422 -0
  231. package/templates/.agent/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
  232. package/templates/.agent/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
  233. package/templates/.agent/skills/minimax-xlsx/scripts/style_audit.py +575 -0
  234. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
  235. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
  236. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
  237. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
  238. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
  239. package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
  240. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
  241. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
  242. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
  243. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
  244. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
  245. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
  246. package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
  247. package/templates/.agent/skills/mobile-design/SKILL.md +394 -0
  248. package/templates/.agent/skills/mobile-design/decision-trees.md +516 -0
  249. package/templates/.agent/skills/mobile-design/mobile-backend.md +491 -0
  250. package/templates/.agent/skills/mobile-design/mobile-color-system.md +420 -0
  251. package/templates/.agent/skills/mobile-design/mobile-debugging.md +122 -0
  252. package/templates/.agent/skills/mobile-design/mobile-design-thinking.md +357 -0
  253. package/templates/.agent/skills/mobile-design/mobile-navigation.md +458 -0
  254. package/templates/.agent/skills/mobile-design/mobile-performance.md +767 -0
  255. package/templates/.agent/skills/mobile-design/mobile-testing.md +356 -0
  256. package/templates/.agent/skills/mobile-design/mobile-typography.md +433 -0
  257. package/templates/.agent/skills/mobile-design/platform-android.md +666 -0
  258. package/templates/.agent/skills/mobile-design/platform-ios.md +561 -0
  259. package/templates/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
  260. package/templates/.agent/skills/mobile-design/touch-psychology.md +537 -0
  261. package/templates/.agent/skills/nestjs-expert/SKILL.md +552 -0
  262. package/templates/.agent/skills/nextjs-best-practices/SKILL.md +203 -0
  263. package/templates/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
  264. package/templates/.agent/skills/parallel-agents/SKILL.md +175 -0
  265. package/templates/.agent/skills/performance-profiling/SKILL.md +143 -0
  266. package/templates/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
  267. package/templates/.agent/skills/plan-writing/SKILL.md +152 -0
  268. package/templates/.agent/skills/powershell-windows/SKILL.md +167 -0
  269. package/templates/.agent/skills/ppc-advertising/SKILL.md +183 -475
  270. package/templates/.agent/skills/pptx-generator/SKILL.md +249 -0
  271. package/templates/.agent/skills/pptx-generator/references/design-system.md +392 -0
  272. package/templates/.agent/skills/pptx-generator/references/editing.md +162 -0
  273. package/templates/.agent/skills/pptx-generator/references/pitfalls.md +112 -0
  274. package/templates/.agent/skills/pptx-generator/references/pptxgenjs.md +420 -0
  275. package/templates/.agent/skills/pptx-generator/references/slide-types.md +413 -0
  276. package/templates/.agent/skills/prisma-expert/SKILL.md +355 -0
  277. package/templates/.agent/skills/python-patterns/SKILL.md +441 -0
  278. package/templates/.agent/skills/react-patterns/SKILL.md +198 -0
  279. package/templates/.agent/skills/red-team-tactics/SKILL.md +199 -0
  280. package/templates/.agent/skills/remotion-best-practices/SKILL.md +45 -111
  281. package/templates/.agent/skills/remotion-best-practices/rules/3d.md +4 -4
  282. package/templates/.agent/skills/remotion-best-practices/rules/animations.md +5 -7
  283. package/templates/.agent/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  284. package/templates/.agent/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  285. package/templates/.agent/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  286. package/templates/.agent/skills/remotion-best-practices/rules/assets.md +78 -0
  287. package/templates/.agent/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
  288. package/templates/.agent/skills/remotion-best-practices/rules/audio.md +1 -4
  289. package/templates/.agent/skills/remotion-best-practices/rules/calculate-metadata.md +47 -17
  290. package/templates/.agent/skills/remotion-best-practices/rules/can-decode.md +75 -0
  291. package/templates/.agent/skills/remotion-best-practices/rules/charts.md +80 -48
  292. package/templates/.agent/skills/remotion-best-practices/rules/compositions.md +22 -14
  293. package/templates/.agent/skills/remotion-best-practices/rules/display-captions.md +79 -21
  294. package/templates/.agent/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  295. package/templates/.agent/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
  296. package/templates/.agent/skills/remotion-best-practices/rules/fonts.md +96 -54
  297. package/templates/.agent/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  298. package/templates/.agent/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  299. package/templates/.agent/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
  300. package/templates/.agent/skills/remotion-best-practices/rules/gifs.md +21 -18
  301. package/templates/.agent/skills/remotion-best-practices/rules/images.md +6 -2
  302. package/templates/.agent/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  303. package/templates/.agent/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  304. package/templates/.agent/skills/remotion-best-practices/rules/lottie.md +10 -7
  305. package/templates/.agent/skills/remotion-best-practices/rules/maps.md +412 -0
  306. package/templates/.agent/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  307. package/templates/.agent/skills/remotion-best-practices/rules/measuring-text.md +140 -0
  308. package/templates/.agent/skills/remotion-best-practices/rules/parameters.md +109 -0
  309. package/templates/.agent/skills/remotion-best-practices/rules/sequencing.md +13 -1
  310. package/templates/.agent/skills/remotion-best-practices/rules/sfx.md +26 -0
  311. package/templates/.agent/skills/remotion-best-practices/rules/subtitles.md +36 -0
  312. package/templates/.agent/skills/remotion-best-practices/rules/tailwind.md +11 -0
  313. package/templates/.agent/skills/remotion-best-practices/rules/text-animations.md +4 -115
  314. package/templates/.agent/skills/remotion-best-practices/rules/timing.md +19 -19
  315. package/templates/.agent/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  316. package/templates/.agent/skills/remotion-best-practices/rules/transitions.md +117 -42
  317. package/templates/.agent/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
  318. package/templates/.agent/skills/remotion-best-practices/rules/trimming.md +51 -0
  319. package/templates/.agent/skills/remotion-best-practices/rules/voiceover.md +99 -0
  320. package/templates/.agent/skills/seo-fundamentals/SKILL.md +83 -441
  321. package/templates/.agent/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
  322. package/templates/.agent/skills/server-management/SKILL.md +161 -0
  323. package/templates/.agent/skills/systematic-debugging/SKILL.md +109 -0
  324. package/templates/.agent/skills/tdd-workflow/SKILL.md +149 -0
  325. package/templates/.agent/skills/testing-patterns/SKILL.md +178 -0
  326. package/templates/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
  327. package/templates/.agent/skills/tutorial-video-expert/SKILL.md +88 -0
  328. package/templates/.agent/skills/typescript-expert/SKILL.md +429 -0
  329. package/templates/.agent/skills/ui-ux-pro-max/SKILL.md +1 -1
  330. package/templates/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -0
  331. package/templates/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -0
  332. package/templates/.agent/skills/ui-ux-pro-max/data/icons.csv +101 -0
  333. package/templates/.agent/skills/ui-ux-pro-max/data/landing.csv +31 -0
  334. package/templates/.agent/skills/ui-ux-pro-max/data/products.csv +97 -0
  335. package/templates/.agent/skills/ui-ux-pro-max/data/prompts.csv +24 -0
  336. package/templates/.agent/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  337. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  338. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  339. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  340. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  341. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  342. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  343. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  344. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  345. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  346. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  347. package/templates/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  348. package/templates/.agent/skills/ui-ux-pro-max/data/styles.csv +59 -0
  349. package/templates/.agent/skills/ui-ux-pro-max/data/typography.csv +58 -0
  350. package/templates/.agent/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  351. package/templates/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  352. package/templates/.agent/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  353. package/templates/.agent/skills/ui-ux-pro-max/scripts/core.py +257 -0
  354. package/templates/.agent/skills/ui-ux-pro-max/scripts/design_system.py +487 -0
  355. package/templates/.agent/skills/ui-ux-pro-max/scripts/search.py +76 -0
  356. package/templates/.agent/skills/vision-analysis/SKILL.md +174 -0
  357. package/templates/.agent/skills/vue-expert/SKILL.md +374 -0
  358. package/templates/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
  359. package/templates/.agent/skills/vulnerability-scanner/checklists.md +121 -0
  360. package/templates/.agent/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
  361. package/templates/.agent/skills/webapp-testing/SKILL.md +187 -0
  362. package/templates/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
  363. package/templates/.agent/workflows/analyze.md +3 -0
  364. package/templates/.agent/workflows/brainstorm.md +113 -0
  365. package/templates/.agent/workflows/brand-report.md +44 -0
  366. package/templates/.agent/workflows/create.md +59 -0
  367. package/templates/.agent/workflows/debug.md +103 -0
  368. package/templates/.agent/workflows/deploy.md +176 -0
  369. package/templates/.agent/workflows/enhance.md +63 -0
  370. package/templates/.agent/workflows/orchestrate.md +237 -0
  371. package/templates/.agent/workflows/plan.md +89 -0
  372. package/templates/.agent/workflows/preview.md +80 -0
  373. package/templates/.agent/workflows/report.md +49 -0
  374. package/templates/.agent/workflows/status.md +86 -0
  375. package/templates/.agent/workflows/test.md +144 -0
  376. package/templates/.agent/workflows/ui-ux-pro-max.md +231 -0
@@ -0,0 +1,772 @@
1
+ # Formula Validation & Recalculation Guide
2
+
3
+ Ensure every formula in an xlsx file is provably correct before delivery. A file that opens without visible errors is not a passing file — only a file that has cleared both validation tiers is a passing file.
4
+
5
+ ---
6
+
7
+ ## Foundational Rules
8
+
9
+ - **Never declare PASS without running `formula_check.py` first.** Visual inspection of a spreadsheet is not validation.
10
+ - **Tier 1 (static) is mandatory in every scenario.** Tier 2 (dynamic) is mandatory when LibreOffice is available. If it is unavailable, you must state this explicitly in the report — you may not silently skip it.
11
+ - **Never use openpyxl with `data_only=True` to check formula values.** Opening and saving a workbook in `data_only=True` mode permanently replaces all formulas with their last cached values. Formulas cannot be recovered afterward.
12
+ - **Auto-fix only deterministic errors.** Any fix that requires understanding business logic must be flagged for human review.
13
+
14
+ ---
15
+
16
+ ## Two-Tier Validation Architecture
17
+
18
+ ```
19
+ Tier 1 — Static Validation (XML scan, no external tools)
20
+
21
+ ├── Detect: all 7 Excel error types already cached in <v> elements
22
+ ├── Detect: cross-sheet references pointing to nonexistent sheets
23
+ ├── Detect: formula cells with t="e" attribute (error type marker)
24
+ └── Tool: formula_check.py + manual XML inspection
25
+
26
+ ▼ (if LibreOffice is present)
27
+ Tier 2 — Dynamic Validation (LibreOffice headless recalculation)
28
+
29
+ ├── Executes all formulas via the LibreOffice Calc engine
30
+ ├── Populates <v> cache values with real computed results
31
+ ├── Exposes runtime errors invisible before recalculation
32
+ └── Follow-up: re-run Tier 1 on the recalculated file
33
+ ```
34
+
35
+ **Why two tiers?**
36
+
37
+ openpyxl and all Python xlsx libraries write formula strings (e.g. `=SUM(B2:B9)`) into `<f>` elements but do not evaluate them. A freshly generated file has empty `<v>` cache elements for every formula cell. This means:
38
+
39
+ - Tier 1 can only catch errors that are already encoded in the XML — either as `t="e"` cells or as structurally broken cross-sheet references.
40
+ - Tier 2 uses LibreOffice as the actual calculation engine, runs every formula, fills `<v>` with real results, and surfaces runtime errors (`#DIV/0!`, `#N/A`, etc.) that can only appear after computation.
41
+
42
+ Neither tier alone is sufficient. Together they cover the full correctability surface.
43
+
44
+ ---
45
+
46
+ ## Tier 1 — Static Validation
47
+
48
+ Static validation requires no external tools. It works directly on the ZIP/XML structure of the xlsx file.
49
+
50
+ ### Step 1: Run formula_check.py
51
+
52
+ **Standard (human-readable) output:**
53
+
54
+ ```bash
55
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/file.xlsx
56
+ ```
57
+
58
+ **JSON output (for programmatic processing):**
59
+
60
+ ```bash
61
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/file.xlsx --json
62
+ ```
63
+
64
+ **Single-sheet mode (faster for targeted checks):**
65
+
66
+ ```bash
67
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/file.xlsx --sheet Summary
68
+ ```
69
+
70
+ **Summary mode (counts only, no per-cell detail):**
71
+
72
+ ```bash
73
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/file.xlsx --summary
74
+ ```
75
+
76
+ Exit codes:
77
+ - `0` — no hard errors (PASS or PASS with heuristic warnings)
78
+ - `1` — hard errors detected, or file cannot be opened (FAIL)
79
+
80
+ #### What formula_check.py examines
81
+
82
+ The script opens the xlsx as a ZIP archive without using any Excel library. It reads `xl/workbook.xml` to enumerate sheet names and named ranges, reads `xl/_rels/workbook.xml.rels` to map each sheet to its XML file, then iterates every `<c>` element in every worksheet.
83
+
84
+ It performs five checks:
85
+
86
+ 1. **Error-value detection**: If the cell has `t="e"`, its `<v>` element contains an Excel error string. The cell is recorded with its sheet name, cell reference (e.g. `C5`), the error value, and the formula text if present.
87
+
88
+ 2. **Broken cross-sheet reference detection**: If the cell has an `<f>` element, the script extracts all sheet names referenced in the formula (both `SheetName!` and `'Sheet Name'!` syntax). Each name is compared against the list of sheets in `workbook.xml`. A mismatch is a broken reference.
89
+
90
+ 3. **Unknown named-range detection (heuristic)**: Identifiers in formulas that are not function names, not cell references, and not found in `workbook.xml`'s `<definedNames>` are flagged as `unknown_name_ref` warnings. This is a heuristic — false positives are possible; always verify manually.
91
+
92
+ 4. **Shared formula integrity**: Shared formula consumer cells (those with only `<f t="shared" si="N"/>`) are skipped for formula counting and cross-ref checks because they inherit the primary cell's formula. Only the primary cell (with `ref="..."` attribute and formula text) is checked and counted.
93
+
94
+ 5. **Malformed error cells**: Cells with `t="e"` but no `<v>` child element are flagged as structural XML issues.
95
+
96
+ Hard errors (exit code 1): `error_value`, `broken_sheet_ref`, `malformed_error_cell`, `file_error`
97
+ Soft warnings (exit code 0): `unknown_name_ref` — must be verified manually but do not block delivery alone
98
+
99
+ #### Reading formula_check.py human-readable output
100
+
101
+ A clean file looks like this:
102
+
103
+ ```
104
+ File : /tmp/budget_2024.xlsx
105
+ Sheets : Summary, Q1, Q2, Q3, Q4, Assumptions
106
+ Formulas checked : 312 distinct formula cells
107
+ Shared formula ranges : 4 ranges
108
+ Errors found : 0
109
+
110
+ PASS — No formula errors detected
111
+ ```
112
+
113
+ A file with errors looks like this:
114
+
115
+ ```
116
+ File : /tmp/budget_2024.xlsx
117
+ Sheets : Summary, Q1, Q2, Q3, Q4, Assumptions
118
+ Formulas checked : 312 distinct formula cells
119
+ Shared formula ranges : 4 ranges
120
+ Errors found : 4
121
+
122
+ ── Error Details ──
123
+ [FAIL] [Summary!C12] contains #REF! (formula: Q1!A0/Q1!A1)
124
+ [FAIL] [Summary!D15] references missing sheet 'Q5'
125
+ Formula: Q5!D15
126
+ Valid sheets: ['Assumptions', 'Q1', 'Q2', 'Q3', 'Q4', 'Summary']
127
+ [FAIL] [Q1!F8] contains #DIV/0!
128
+ [WARN] [Q2!B10] uses unknown name 'GrowthAssumptions' (heuristic — verify manually)
129
+ Formula: SUM(GrowthAssumptions)
130
+ Defined names: ['RevenueRange', 'CostRange']
131
+
132
+ FAIL — 3 error(s) must be fixed before delivery
133
+ WARN — 1 heuristic warning(s) require manual review
134
+ ```
135
+
136
+ Interpretation of each line:
137
+ - `[FAIL] [Summary!C12] contains #REF! (formula: Q1!A0/Q1!A1)` — The cell has `t="e"` and `<v>#REF!</v>`. The formula references row 0, which does not exist in Excel's 1-based system. This is an off-by-one error in a generated reference.
138
+ - `[FAIL] [Summary!D15] references missing sheet 'Q5'` — The formula contains `Q5!D15`, but no sheet named `Q5` exists in the workbook. The valid sheet list is provided for comparison.
139
+ - `[FAIL] [Q1!F8] contains #DIV/0!` — This cell's `<v>` is already an error value (the file was previously recalculated). The formula divided by zero.
140
+ - `[WARN] [Q2!B10] uses unknown name 'GrowthAssumptions'` — The identifier `GrowthAssumptions` appears in the formula but is not in `<definedNames>`. This may be a typo or a name that was accidentally omitted. It is a heuristic warning — verify manually. The warning alone does not block delivery.
141
+
142
+ #### Reading formula_check.py JSON output
143
+
144
+ ```json
145
+ {
146
+ "file": "/tmp/budget_2024.xlsx",
147
+ "sheets_checked": ["Summary", "Q1", "Q2", "Q3", "Q4", "Assumptions"],
148
+ "formula_count": 312,
149
+ "shared_formula_ranges": 4,
150
+ "error_count": 4,
151
+ "errors": [
152
+ {
153
+ "type": "error_value",
154
+ "error": "#REF!",
155
+ "sheet": "Summary",
156
+ "cell": "C12",
157
+ "formula": "Q1!A0/Q1!A1"
158
+ },
159
+ {
160
+ "type": "broken_sheet_ref",
161
+ "sheet": "Summary",
162
+ "cell": "D15",
163
+ "formula": "Q5!D15",
164
+ "missing_sheet": "Q5",
165
+ "valid_sheets": ["Assumptions", "Q1", "Q2", "Q3", "Q4", "Summary"]
166
+ },
167
+ {
168
+ "type": "error_value",
169
+ "error": "#DIV/0!",
170
+ "sheet": "Q1",
171
+ "cell": "F8",
172
+ "formula": null
173
+ },
174
+ {
175
+ "type": "unknown_name_ref",
176
+ "sheet": "Q2",
177
+ "cell": "B10",
178
+ "formula": "SUM(GrowthAssumptions)",
179
+ "unknown_name": "GrowthAssumptions",
180
+ "defined_names": ["RevenueRange", "CostRange"],
181
+ "note": "Heuristic check — verify manually if this is a false positive"
182
+ }
183
+ ]
184
+ }
185
+ ```
186
+
187
+ Field reference:
188
+
189
+ | Field | Meaning |
190
+ |-------|---------|
191
+ | `type: "error_value"` | Cell has `t="e"` — an Excel error is stored in the `<v>` element |
192
+ | `type: "broken_sheet_ref"` | Formula references a sheet name not present in workbook.xml |
193
+ | `type: "unknown_name_ref"` | Formula references an identifier not in `<definedNames>` (heuristic, soft warning) |
194
+ | `type: "malformed_error_cell"` | Cell has `t="e"` but no `<v>` child — structural XML problem |
195
+ | `type: "file_error"` | The file could not be opened (bad ZIP, not found, etc.) |
196
+ | `sheet` | The sheet where the error was found |
197
+ | `cell` | Cell reference in A1 notation |
198
+ | `formula` | The full formula text from the `<f>` element (null if not present) |
199
+ | `error` | The error string from `<v>` (for `error_value` type) |
200
+ | `missing_sheet` | The sheet name extracted from the formula that does not exist |
201
+ | `valid_sheets` | All sheet names actually present in workbook.xml |
202
+ | `unknown_name` | The identifier that was not found in `<definedNames>` |
203
+ | `defined_names` | All named ranges actually present in workbook.xml |
204
+ | `shared_formula_ranges` | Count of shared formula definitions (top-level `<f t="shared" ref="...">` elements) |
205
+
206
+ ### Step 2: Manual XML inspection
207
+
208
+ When formula_check.py reports errors, unpack the file to inspect the raw XML:
209
+
210
+ ```bash
211
+ python3 SKILL_DIR/scripts/xlsx_unpack.py /path/to/file.xlsx /tmp/xlsx_inspect/
212
+ ```
213
+
214
+ Navigate to the worksheet file for the reported sheet. The sheet-to-file mapping is in `xl/_rels/workbook.xml.rels`. For example, if `rId1` maps to `worksheets/sheet1.xml`, then sheet1.xml is the file for the sheet with `r:id="rId1"` in `xl/workbook.xml`.
215
+
216
+ For each reported error cell, locate the `<c r="CELLREF">` element and examine:
217
+
218
+ **For `error_value` errors:**
219
+ ```xml
220
+ <!-- This is what an error cell looks like in XML -->
221
+ <c r="C12" t="e">
222
+ <f>Q1!C10/Q1!C11</f>
223
+ <v>#DIV/0!</v>
224
+ </c>
225
+ ```
226
+
227
+ Ask:
228
+ - Is the `<f>` formula syntactically correct?
229
+ - Does the cell reference in the formula point to a row/column that exists?
230
+ - If it is a division, is it possible the denominator cell is empty or zero?
231
+
232
+ **For `broken_sheet_ref` errors:**
233
+
234
+ Check `xl/workbook.xml` for the actual sheet list:
235
+
236
+ ```xml
237
+ <sheets>
238
+ <sheet name="Summary" sheetId="1" r:id="rId1"/>
239
+ <sheet name="Q1" sheetId="2" r:id="rId2"/>
240
+ <sheet name="Q2" sheetId="3" r:id="rId3"/>
241
+ </sheets>
242
+ ```
243
+
244
+ Sheet names are case-sensitive. `q1` and `Q1` are different sheets. Compare the name in the formula exactly against the names here.
245
+
246
+ ### Step 3: Cross-sheet reference audit (multi-sheet workbooks)
247
+
248
+ For workbooks with 3 or more sheets, run a broader cross-reference audit after unpacking:
249
+
250
+ ```bash
251
+ # Extract all formulas containing cross-sheet references
252
+ grep -h "<f>" /tmp/xlsx_inspect/xl/worksheets/*.xml | grep "!"
253
+
254
+ # List all actual sheet names from workbook.xml
255
+ grep -o 'name="[^"]*"' /tmp/xlsx_inspect/xl/workbook.xml | grep -v sheetId
256
+ ```
257
+
258
+ Every sheet name appearing in formulas (in the form `SheetName!` or `'Sheet Name'!`) must appear in the workbook sheet list. If any do not match, that is a broken reference even if formula_check.py did not catch it (which can happen with shared formulas where only the primary cell is examined).
259
+
260
+ To check shared formulas specifically, look for `<f t="shared" ref="...">` elements:
261
+
262
+ ```xml
263
+ <!-- Shared formula: defined on D2, applied to D2:D100 -->
264
+ <c r="D2"><f t="shared" ref="D2:D100" si="0">Q1!B2*C2</f><v></v></c>
265
+
266
+ <!-- Shared formula consumers: only si is present, no formula text -->
267
+ <c r="D3"><f t="shared" si="0"/><v></v></c>
268
+ ```
269
+
270
+ formula_check.py reads the formula text from the primary cell (`D2` above). The referenced sheet `Q1` in that formula applies to the entire range `D2:D100`. If the sheet is broken, all 99 rows are broken even though they appear as empty `<f>` elements.
271
+
272
+ ---
273
+
274
+ ## Tier 2 — Dynamic Validation (LibreOffice Headless)
275
+
276
+ ### Check LibreOffice availability
277
+
278
+ ```bash
279
+ # Check macOS (typical install location)
280
+ which soffice
281
+ /Applications/LibreOffice.app/Contents/MacOS/soffice --version
282
+
283
+ # Check Linux
284
+ which libreoffice || which soffice
285
+ libreoffice --version
286
+ ```
287
+
288
+ If neither command returns a path, LibreOffice is not installed. Record "Tier 2: SKIPPED — LibreOffice not available" in the report and proceed to delivery with Tier 1 results only.
289
+
290
+ ### Install LibreOffice (if permitted in the environment)
291
+
292
+ macOS:
293
+ ```bash
294
+ brew install --cask libreoffice
295
+ ```
296
+
297
+ Ubuntu/Debian:
298
+ ```bash
299
+ sudo apt-get install -y libreoffice
300
+ ```
301
+
302
+ ### Run headless recalculation
303
+
304
+ Use the dedicated recalculation script. It handles binary discovery across macOS and Linux, works from a temporary copy of the input (preserving the original), and provides structured output and exit codes compatible with the validation pipeline.
305
+
306
+ ```bash
307
+ # Check LibreOffice availability first
308
+ python3 SKILL_DIR/scripts/libreoffice_recalc.py --check
309
+
310
+ # Run recalculation (default timeout: 60s)
311
+ python3 SKILL_DIR/scripts/libreoffice_recalc.py /path/to/input.xlsx /tmp/recalculated.xlsx
312
+
313
+ # For large or complex files, extend the timeout
314
+ python3 SKILL_DIR/scripts/libreoffice_recalc.py /path/to/input.xlsx /tmp/recalculated.xlsx --timeout 120
315
+ ```
316
+
317
+ Exit codes from `libreoffice_recalc.py`:
318
+ - `0` — recalculation succeeded, output file written
319
+ - `2` — LibreOffice not found (note as SKIPPED in report; not a hard failure)
320
+ - `1` — LibreOffice found but failed (timeout, crash, malformed file)
321
+
322
+ **What the script does internally:**
323
+
324
+ LibreOffice's `--convert-to xlsx` command opens the file using the full Calc engine with the `--infilter="Calc MS Excel 2007 XML"` filter, executes every formula, writes computed values into the `<v>` cache elements, and saves the output. This is the closest server-side equivalent of "open in Excel and press Save." The script also passes `--norestore` to prevent LibreOffice from attempting to restore previous sessions, which can cause hangs in automated environments.
325
+
326
+ **If LibreOffice is not installed:**
327
+
328
+ macOS:
329
+ ```bash
330
+ brew install --cask libreoffice
331
+ ```
332
+
333
+ Ubuntu/Debian:
334
+ ```bash
335
+ sudo apt-get install -y libreoffice
336
+ ```
337
+
338
+ **If the script times out (libreoffice_recalc.py exits with code 1 and "timed out" message):**
339
+
340
+ Record "Tier 2: TIMEOUT — LibreOffice did not complete within Ns" in the report. Do not retry in a loop. Investigate whether the file has circular references or extremely large data ranges.
341
+
342
+ ### Re-run Tier 1 after recalculation
343
+
344
+ After LibreOffice recalculation, the `<v>` elements contain real computed values. Errors that were invisible before (because `<v>` was empty in a freshly generated file) now appear as `t="e"` cells with actual error strings.
345
+
346
+ ```bash
347
+ python3 SKILL_DIR/scripts/formula_check.py /tmp/recalculated.xlsx
348
+ ```
349
+
350
+ This second Tier 1 pass is the definitive runtime error check. Any errors it finds are real calculation failures that must be fixed.
351
+
352
+ ---
353
+
354
+ ## All 7 Error Types — Causes and Fix Strategies
355
+
356
+ ### #REF! — Invalid Cell Reference
357
+
358
+ **What it means:** The formula references a cell, range, or sheet that no longer exists or never existed.
359
+
360
+ **Common causes in generated files:**
361
+ - Off-by-one error in row/column calculation (e.g., referencing row 0 which does not exist in Excel's 1-based system)
362
+ - Column letter computed incorrectly (e.g., column 64 maps to `BL`, not `BK`)
363
+ - Formula references a sheet that was never created or was renamed
364
+
365
+ **XML signature:**
366
+ ```xml
367
+ <c r="D5" t="e">
368
+ <f>Sheet2!A0</f>
369
+ <v>#REF!</v>
370
+ </c>
371
+ ```
372
+
373
+ **Fix — correct the reference:**
374
+ ```xml
375
+ <c r="D5">
376
+ <f>Sheet2!A1</f>
377
+ <v></v>
378
+ </c>
379
+ ```
380
+
381
+ Note: remove `t="e"` and clear `<v>` after correcting the formula. The error type marker belongs to the cached state, not the formula.
382
+
383
+ **Auto-fixable?** Only if the correct target can be determined with certainty from the surrounding context. Otherwise flag for human review.
384
+
385
+ ---
386
+
387
+ ### #DIV/0! — Division by Zero
388
+
389
+ **What it means:** The formula divides by a value that is zero or an empty cell (empty cells evaluate to 0 in arithmetic context).
390
+
391
+ **Common causes in generated files:**
392
+ - Percentage change formula `=(B2-B1)/B1` where `B1` is empty or zero
393
+ - Rate formula `=Value/Total` where the total row hasn't been populated yet
394
+
395
+ **XML signature:**
396
+ ```xml
397
+ <c r="C8" t="e">
398
+ <f>B8/B7</f>
399
+ <v>#DIV/0!</v>
400
+ </c>
401
+ ```
402
+
403
+ **Fix — wrap with IFERROR:**
404
+ ```xml
405
+ <c r="C8">
406
+ <f>IFERROR(B8/B7,0)</f>
407
+ <v></v>
408
+ </c>
409
+ ```
410
+
411
+ Alternative — explicit zero check:
412
+ ```xml
413
+ <c r="C8">
414
+ <f>IF(B7=0,0,B8/B7)</f>
415
+ <v></v>
416
+ </c>
417
+ ```
418
+
419
+ **Auto-fixable?** Yes. Wrapping with `IFERROR(...,0)` is safe for most financial formulas. If the business expectation is that the result should display as blank rather than zero, use `IFERROR(...,"")` instead.
420
+
421
+ ---
422
+
423
+ ### #VALUE! — Wrong Data Type
424
+
425
+ **What it means:** The formula attempts an arithmetic or logical operation on a value of the wrong type (e.g., adding a text string to a number).
426
+
427
+ **Common causes in generated files:**
428
+ - A cell intended to hold a number was written as a string type (`t="s"` or `t="inlineStr"`) instead of a numeric type
429
+ - A formula references a cell containing text (e.g., a unit label like "thousands") and treats it as a number
430
+
431
+ **XML signature:**
432
+ ```xml
433
+ <c r="F3" t="e">
434
+ <f>E3+D3</f>
435
+ <v>#VALUE!</v>
436
+ </c>
437
+ ```
438
+
439
+ **Fix — check source cells for incorrect type:**
440
+
441
+ If `D3` was incorrectly written as a string:
442
+ ```xml
443
+ <!-- Wrong: numeric value stored as string -->
444
+ <c r="D3" t="inlineStr"><is><t>1000</t></is></c>
445
+
446
+ <!-- Correct: numeric value stored as number (t attribute omitted or "n") -->
447
+ <c r="D3"><v>1000</v></c>
448
+ ```
449
+
450
+ Alternatively, wrap the formula with `VALUE()` conversion:
451
+ ```xml
452
+ <c r="F3">
453
+ <f>VALUE(E3)+VALUE(D3)</f>
454
+ <v></v>
455
+ </c>
456
+ ```
457
+
458
+ **Auto-fixable?** Partially. If the source cell type is visibly wrong (a number stored as string), fix the type. If the cause is ambiguous (the cell is supposed to contain text), flag for human review.
459
+
460
+ ---
461
+
462
+ ### #NAME? — Unrecognized Name
463
+
464
+ **What it means:** The formula contains an identifier that Excel does not recognize — either a misspelled function name, an undefined named range, or a function that is not available in the target Excel version.
465
+
466
+ **Common causes in generated files:**
467
+ - LLM writes a function name with a typo: `SUMIF` written as `SUMIFS` when only 3 arguments are provided, or `XLOOKUP` used in a context targeting Excel 2010
468
+ - Named range referenced in formula does not exist in `xl/workbook.xml`
469
+
470
+ **XML signature:**
471
+ ```xml
472
+ <c r="B2" t="e">
473
+ <f>SUMSQ(A2:A10)</f>
474
+ <v>#NAME?</v>
475
+ </c>
476
+ ```
477
+
478
+ **Fix — verify function name and named ranges:**
479
+
480
+ Check named ranges in `xl/workbook.xml`:
481
+ ```xml
482
+ <definedNames>
483
+ <definedName name="RevenueRange">Sheet1!$B$2:$B$13</definedName>
484
+ </definedNames>
485
+ ```
486
+
487
+ If the formula references `RevenuRange` (typo), correct it to `RevenueRange`:
488
+ ```xml
489
+ <c r="B2">
490
+ <f>SUM(RevenueRange)</f>
491
+ <v></v>
492
+ </c>
493
+ ```
494
+
495
+ **Auto-fixable?** Only if the correct name is unambiguous (e.g., a single close match exists). Otherwise flag for human review — function name fixes require understanding the intended calculation.
496
+
497
+ ---
498
+
499
+ ### #N/A — Value Not Available
500
+
501
+ **What it means:** A lookup function (VLOOKUP, HLOOKUP, MATCH, INDEX/MATCH, XLOOKUP) searched for a value that does not exist in the lookup table.
502
+
503
+ **Common causes in generated files:**
504
+ - Lookup key exists in the formula but the lookup table is empty or not yet populated
505
+ - Key format mismatch (text "2024" vs numeric 2024)
506
+
507
+ **XML signature:**
508
+ ```xml
509
+ <c r="G5" t="e">
510
+ <f>VLOOKUP(F5,Assumptions!$A$2:$B$20,2,0)</f>
511
+ <v>#N/A</v>
512
+ </c>
513
+ ```
514
+
515
+ **Fix — wrap with IFERROR for missing-match tolerance:**
516
+ ```xml
517
+ <c r="G5">
518
+ <f>IFERROR(VLOOKUP(F5,Assumptions!$A$2:$B$20,2,0),0)</f>
519
+ <v></v>
520
+ </c>
521
+ ```
522
+
523
+ **Auto-fixable?** Adding `IFERROR` is safe if a zero default is acceptable. If the lookup failure indicates a data integrity problem (the key should always be present), do not auto-fix — flag for human review.
524
+
525
+ ---
526
+
527
+ ### #NULL! — Empty Intersection
528
+
529
+ **What it means:** The space operator (which computes the intersection of two ranges) was applied to two ranges that do not intersect.
530
+
531
+ **Common causes in generated files:**
532
+ - Accidental space between two range references: `=SUM(A1:A5 C1:C5)` instead of `=SUM(A1:A5,C1:C5)`
533
+ - Rarely seen in typical financial models; usually indicates a formula generation error
534
+
535
+ **XML signature:**
536
+ ```xml
537
+ <c r="H10" t="e">
538
+ <f>SUM(A1:A5 C1:C5)</f>
539
+ <v>#NULL!</v>
540
+ </c>
541
+ ```
542
+
543
+ **Fix — replace space with comma (union) or colon (range):**
544
+ ```xml
545
+ <!-- Union of two separate ranges -->
546
+ <c r="H10">
547
+ <f>SUM(A1:A5,C1:C5)</f>
548
+ <v></v>
549
+ </c>
550
+ ```
551
+
552
+ **Auto-fixable?** Yes. The space operator is almost never intentional in generated formulas. Replacing with a comma is safe.
553
+
554
+ ---
555
+
556
+ ### #NUM! — Numeric Error
557
+
558
+ **What it means:** A formula produced a number that Excel cannot represent (overflow, underflow) or a mathematical operation that has no real-number result (square root of negative, LOG of zero or negative).
559
+
560
+ **Common causes in generated files:**
561
+ - IRR or NPV formula where the cash flow series has no convergent solution
562
+ - `SQRT()` applied to a cell that can be negative
563
+ - Very large exponentiation
564
+
565
+ **XML signature:**
566
+ ```xml
567
+ <c r="J15" t="e">
568
+ <f>IRR(B5:B15)</f>
569
+ <v>#NUM!</v>
570
+ </c>
571
+ ```
572
+
573
+ **Fix — add a conditional guard:**
574
+ ```xml
575
+ <c r="J15">
576
+ <f>IFERROR(IRR(B5:B15),"")</f>
577
+ <v></v>
578
+ </c>
579
+ ```
580
+
581
+ For SQRT:
582
+ ```xml
583
+ <c r="K5">
584
+ <f>IF(A5>=0,SQRT(A5),"")</f>
585
+ <v></v>
586
+ </c>
587
+ ```
588
+
589
+ **Auto-fixable?** Partially. Wrapping with `IFERROR` suppresses the error display but does not fix the underlying calculation issue. Flag the cell for human review even after applying the IFERROR wrapper.
590
+
591
+ ---
592
+
593
+ ## Auto-Fix vs. Human Review Decision Matrix
594
+
595
+ | Error Type | Auto-Fix Safe? | Condition | Action |
596
+ |------------|---------------|-----------|--------|
597
+ | `#DIV/0!` | Yes | Always | Wrap with `IFERROR(formula,0)` |
598
+ | `#NULL!` | Yes | Always | Replace space operator with comma |
599
+ | `#REF!` | Yes | Only if correct target is unambiguous from context | Correct reference; otherwise flag |
600
+ | `#NAME?` | Yes | Only if typo has exactly one plausible correction | Fix name; otherwise flag |
601
+ | `#N/A` | Conditional | If a zero/blank default is business-acceptable | Add IFERROR wrapper; document assumption |
602
+ | `#VALUE!` | Conditional | Only if source cell type is clearly wrong | Fix type; otherwise flag |
603
+ | `#NUM!` | No | Always | Add IFERROR to suppress display, then flag |
604
+ | Broken sheet ref | Yes | Only if renamed sheet can be identified from workbook.xml | Correct name |
605
+ | Business logic errors | Never | Any case | Human review only |
606
+
607
+ **What counts as a business logic error (never auto-fix):**
608
+ - A formula that produces a wrong number but no Excel error (e.g., `=SUM(B2:B8)` when the intent was `=SUM(B2:B9)`)
609
+ - A formula where the IFERROR default value is meaningful (e.g., whether to use 0, blank, or a prior-period value)
610
+ - Any formula where fixing the error requires knowing what the formula was supposed to calculate
611
+
612
+ ---
613
+
614
+ ## Delivery Standard — Validation Report
615
+
616
+ Every validation task must produce a structured report. This report is the deliverable, regardless of whether errors were found.
617
+
618
+ ### Required report format
619
+
620
+ ```markdown
621
+ ## Formula Validation Report
622
+
623
+ **File**: /path/to/filename.xlsx
624
+ **Date**: YYYY-MM-DD
625
+ **Sheets checked**: Sheet1, Sheet2, Sheet3
626
+ **Total formulas scanned**: N
627
+
628
+ ---
629
+
630
+ ### Tier 1 — Static Validation
631
+
632
+ **Status**: PASS / FAIL
633
+ **Tool**: formula_check.py (direct XML scan)
634
+
635
+ | Sheet | Cell | Error Type | Detail | Fix Applied |
636
+ |-------|------|-----------|--------|-------------|
637
+ | Summary | C12 | #REF! | Formula: Q1!A0 | Corrected to Q1!A1 |
638
+ | Summary | D15 | broken_sheet_ref | References missing sheet 'Q5' | Renamed to Q4 |
639
+
640
+ _(If no errors: "No errors detected.")_
641
+
642
+ ---
643
+
644
+ ### Tier 2 — Dynamic Validation
645
+
646
+ **Status**: PASS / FAIL / SKIPPED
647
+ **Tool**: LibreOffice headless (version X.Y.Z) / Not available
648
+
649
+ _(If SKIPPED: state the reason — LibreOffice not installed, timeout, etc.)_
650
+
651
+ | Sheet | Cell | Error Type | Detail | Fix Applied |
652
+ |-------|------|-----------|--------|-------------|
653
+ | Q1 | F8 | #DIV/0! | Formula: C8/C7 | Wrapped with IFERROR |
654
+
655
+ _(If no errors: "No runtime errors detected after recalculation.")_
656
+
657
+ ---
658
+
659
+ ### Summary
660
+
661
+ - **Total errors found**: N
662
+ - **Auto-fixed**: N (list types)
663
+ - **Flagged for human review**: N (list cells and reason)
664
+ - **Final status**: PASS (ready for delivery) / FAIL (blocked)
665
+
666
+ ### Human Review Required
667
+
668
+ | Cell | Error | Reason Auto-Fix Not Applied |
669
+ |------|-------|----------------------------|
670
+ | Q2!B15 | #NUM! | IRR formula — business must confirm cash flow inputs |
671
+ ```
672
+
673
+ ### Minimum required fields
674
+
675
+ The report is invalid (and delivery is blocked) if any of these are missing:
676
+ - File path and date
677
+ - Which sheets were checked
678
+ - Total formula count
679
+ - Tier 1 status with explicit PASS/FAIL
680
+ - Tier 2 status with explicit PASS/FAIL/SKIPPED and reason if SKIPPED
681
+ - For every error: sheet, cell, error type, and disposition (fixed or flagged)
682
+ - Final delivery status
683
+
684
+ ---
685
+
686
+ ## Common Scenarios
687
+
688
+ ### Scenario 1: Validate immediately after creating a new file
689
+
690
+ When `create.md` workflow produces a new xlsx, run validation before any delivery response.
691
+
692
+ ```bash
693
+ # Step 1: Static check on the freshly written file
694
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/output.xlsx
695
+
696
+ # Step 2: Dynamic check (if LibreOffice available)
697
+ python3 SKILL_DIR/scripts/libreoffice_recalc.py /path/to/output.xlsx /tmp/recalculated.xlsx
698
+ python3 SKILL_DIR/scripts/formula_check.py /tmp/recalculated.xlsx
699
+ ```
700
+
701
+ Expected behavior on a freshly created file: Tier 1 will find zero `error_value` errors (because `<v>` elements are empty, not error-valued). It will find any broken cross-sheet references if sheet names were misspelled. Tier 2 will populate `<v>` and reveal runtime errors like `#DIV/0!`.
702
+
703
+ If Tier 2 reveals errors, fix them in the source XML (not the recalculated copy), repack, and re-run both tiers.
704
+
705
+ ### Scenario 2: Validate after editing an existing file
706
+
707
+ When `edit.md` workflow modifies an existing xlsx, validate only the affected sheets if the edit was surgical. If the edit touched shared formulas or cross-sheet references, validate all sheets.
708
+
709
+ ```bash
710
+ # Targeted static check — look at specific sheet
711
+ # (formula_check.py checks all sheets; examine only the relevant section of output)
712
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/edited.xlsx --json \
713
+ | python3 -c "
714
+ import json, sys
715
+ r = json.load(sys.stdin)
716
+ for e in r['errors']:
717
+ if e.get('sheet') in ['Summary', 'Q1']:
718
+ print(e)
719
+ "
720
+ ```
721
+
722
+ Always run Tier 2 after edits that modify formulas, even if Tier 1 passes. Edits to data ranges can cause previously-valid formulas to produce runtime errors.
723
+
724
+ ### Scenario 3: User provides a file with suspected formula errors
725
+
726
+ When a user submits a file and reports wrong values or visible errors:
727
+
728
+ ```bash
729
+ # Step 1: Static scan — find all error cells
730
+ python3 SKILL_DIR/scripts/formula_check.py /path/to/user_file.xlsx --json > /tmp/validation_results.json
731
+
732
+ # Step 2: Unpack for manual inspection
733
+ python3 SKILL_DIR/scripts/xlsx_unpack.py /path/to/user_file.xlsx /tmp/xlsx_inspect/
734
+
735
+ # Step 3: Dynamic recalculation
736
+ python3 SKILL_DIR/scripts/libreoffice_recalc.py /path/to/user_file.xlsx /tmp/user_file_recalc.xlsx
737
+
738
+ # Step 4: Re-validate recalculated file
739
+ python3 SKILL_DIR/scripts/formula_check.py /tmp/user_file_recalc.xlsx --json > /tmp/validation_after_recalc.json
740
+
741
+ # Step 5: Compare before and after
742
+ python3 - <<'EOF'
743
+ import json
744
+ before = json.load(open("/tmp/validation_results.json"))
745
+ after = json.load(open("/tmp/validation_after_recalc.json"))
746
+ print(f"Before recalc: {before['error_count']} errors")
747
+ print(f"After recalc: {after['error_count']} errors")
748
+ EOF
749
+ ```
750
+
751
+ If errors appear only after recalculation (not in the original static scan), the formulas were syntactically correct but produce wrong results at runtime. These are runtime errors that require formula-level fixes, not XML-structure fixes.
752
+
753
+ If errors appear in both scans, they were already cached in `<v>` before recalculation — the file was previously opened by Excel/LibreOffice and the errors persisted.
754
+
755
+ ---
756
+
757
+ ## Critical Pitfalls
758
+
759
+ **Pitfall 1: openpyxl `data_only=True` destroys formulas.**
760
+ Opening a workbook with `data_only=True` reads cached values instead of formulas. If you then save the workbook, all `<f>` elements are permanently removed and replaced with their last-cached values. Never use this mode for validation workflows.
761
+
762
+ **Pitfall 2: Empty `<v>` is not the same as a passing formula.**
763
+ A freshly generated file has empty `<v>` elements for all formula cells. formula_check.py will not report these as errors — they are not yet errors. They become errors only after recalculation if the calculated value is an error type. This is why Tier 2 is mandatory.
764
+
765
+ **Pitfall 3: Shared formula errors affect the entire range.**
766
+ If a shared formula's primary cell has a broken reference, every cell in the shared range (`ref="D2:D100"`) inherits that broken reference. The count of logical errors can be much larger than the count of distinct error entries in formula_check.py output. When fixing a broken shared formula, fix the primary cell's `<f t="shared" ref="...">` element; the consumers (`<f t="shared" si="N"/>`) automatically inherit the corrected formula.
767
+
768
+ **Pitfall 4: Sheet names are case-sensitive.**
769
+ `=q1!B5` and `=Q1!B5` are different references. Excel internally treats them the same, but formula_check.py's string comparison is case-sensitive. If a formula uses a lowercase sheet name that matches an uppercase sheet in the workbook, it will be flagged as a broken reference. The fix is to match the exact case in `workbook.xml`.
770
+
771
+ **Pitfall 5: `--convert-to xlsx` does not guarantee formula preservation.**
772
+ LibreOffice's conversion can occasionally alter certain formula types (array formulas, dynamic array functions like `SORT`, `UNIQUE`). After Tier 2, if the recalculated file shows formula changes unrelated to error fixing, do not deliver the recalculated file directly — use the original file with targeted XML fixes instead.