@wix/agent-skills 1.33.1 → 1.34.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 (616) hide show
  1. package/README.md +2 -0
  2. package/package.json +1 -1
  3. package/skills/wix-export/SKILL.md +83 -0
  4. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  5. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  6. package/skills/wix-harmony-editor/SKILL.md +317 -0
  7. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  8. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  10. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  11. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  12. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  13. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  14. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  15. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  16. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  17. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  18. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  19. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  20. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  21. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  22. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  24. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  25. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  26. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  27. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  28. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  29. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  30. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  31. package/skills/wix-headless/SKILL.md +7 -2
  32. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  33. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  34. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  35. package/skills/wix-headless/references/SEED.md +3 -2
  36. package/skills/wix-headless/references/SETUP.md +1 -0
  37. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  40. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  41. package/skills/wix-headless-kit/SKILL.md +110 -21
  42. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  43. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  44. package/skills/wix-headless-kit/guides/migration.md +49 -17
  45. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  46. package/skills/wix-headless-kit/install/context.mjs +61 -6
  47. package/skills/wix-headless-kit/install/pins.json +1 -1
  48. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  49. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  50. package/skills/wix-headless-replatform/SKILL.md +116 -0
  51. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  52. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  53. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  54. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  55. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  56. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  57. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  58. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  59. package/skills/wix-headless-replatform/references/safety.md +19 -0
  60. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  61. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  62. package/skills/wix-headless-replatform/registry/README.md +20 -0
  63. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  64. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  67. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  68. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  69. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  70. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  71. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  72. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  73. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  74. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  75. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  76. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  77. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  78. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  81. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  82. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  83. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  85. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  86. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  87. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  88. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  89. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  90. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  91. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  92. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  93. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  94. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  95. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  96. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  97. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  98. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  99. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  100. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  101. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  102. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  106. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  107. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  108. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  109. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  110. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  111. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  112. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  113. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  114. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  115. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  116. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  117. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  118. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  120. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  121. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  124. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  125. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  126. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  127. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  128. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  131. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  134. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  135. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  136. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  137. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  138. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  139. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  140. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  141. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  142. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  143. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  144. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  145. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  146. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  148. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  149. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  150. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  153. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  156. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  160. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  161. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  162. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  163. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  164. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  165. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  166. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  167. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  168. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  172. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  173. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  174. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  178. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  179. package/skills/wix-import/SKILL.md +90 -0
  180. package/skills/wix-manage/SKILL.md +13 -3
  181. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  182. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  183. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  184. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  185. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  186. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  187. package/skills/wix-replatform/.publish-manifest.json +5 -5
  188. package/skills/wix-replatform/CLI.md +162 -0
  189. package/skills/wix-replatform/README.md +52 -0
  190. package/skills/wix-replatform/SKILL.md +229 -684
  191. package/skills/wix-replatform/console/account.css +1 -0
  192. package/skills/wix-replatform/console/app.css +1 -0
  193. package/skills/wix-replatform/console/app.js +117 -0
  194. package/skills/wix-replatform/console/index.html +4 -0
  195. package/skills/wix-replatform/console/json.css +11 -0
  196. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  197. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  198. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  199. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  200. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  201. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  202. package/skills/wix-replatform/lib/config-env.js +85 -11
  203. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  204. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  205. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  206. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  207. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  208. package/skills/wix-replatform/lib/destination-http.js +81 -0
  209. package/skills/wix-replatform/lib/destination-route.js +98 -0
  210. package/skills/wix-replatform/lib/destination.js +919 -0
  211. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  212. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  213. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  214. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  215. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  216. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  217. package/skills/wix-replatform/lib/execution-log.js +170 -0
  218. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  219. package/skills/wix-replatform/lib/execution-state.js +22 -0
  220. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  221. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  222. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  223. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  224. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  225. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  226. package/skills/wix-replatform/lib/link-audit.js +173 -0
  227. package/skills/wix-replatform/lib/link-census.js +194 -0
  228. package/skills/wix-replatform/lib/link-plan.js +148 -0
  229. package/skills/wix-replatform/lib/link-verification.js +274 -0
  230. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  231. package/skills/wix-replatform/lib/local-state.js +869 -30
  232. package/skills/wix-replatform/lib/member-completion.js +658 -0
  233. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  234. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  235. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  236. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  237. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  238. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  239. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  240. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  241. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  242. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  243. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  244. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  245. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  246. package/skills/wix-replatform/lib/progress-log.js +19 -3
  247. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  248. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  249. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  250. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  251. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  252. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  253. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  254. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  255. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  256. package/skills/wix-replatform/lib/run-controller.js +401 -0
  257. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  258. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  259. package/skills/wix-replatform/lib/source-access.js +231 -0
  260. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  261. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  262. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  263. package/skills/wix-replatform/lib/task-state.js +110 -0
  264. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  265. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  266. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  267. package/skills/wix-replatform/lib/url-verification.js +315 -0
  268. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  269. package/skills/wix-replatform/lib/user-actions.js +264 -0
  270. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  271. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  272. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  273. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  274. package/skills/wix-replatform/lib/write-verification.js +274 -0
  275. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  276. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  277. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  278. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  279. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  280. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  281. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  282. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  283. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  284. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  285. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  286. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  287. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  288. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  289. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  290. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  291. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  292. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  293. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  294. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  295. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  296. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  297. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  298. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  299. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  300. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  301. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  302. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  303. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  304. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  305. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  306. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  307. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  308. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  309. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  310. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  311. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  312. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  313. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  314. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  315. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  316. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  317. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  318. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  319. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  320. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  321. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  322. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  323. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  324. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  325. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  348. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  349. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  350. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  351. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  352. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  353. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  354. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  355. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  356. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  357. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  358. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  359. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  360. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  361. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  362. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  363. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  364. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  365. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  390. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  394. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  417. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  420. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  421. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  422. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  423. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  424. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  425. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  426. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  427. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  428. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  429. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  430. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  431. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  432. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  433. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  434. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  435. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  436. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  437. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  438. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  439. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  527. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  530. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  531. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  532. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  534. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  535. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  538. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  542. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  571. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  572. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  573. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  574. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  575. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  576. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  577. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  578. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  579. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  580. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  581. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  582. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  583. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  584. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  585. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  586. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  587. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  588. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  589. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  590. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  591. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  592. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  593. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  594. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  595. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  596. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  597. package/skills/wix-replatform/scripts/replatform.js +436 -0
  598. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  599. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  600. package/skills/wix-replatform/scripts/user-action.js +58 -0
  601. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  602. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  603. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  604. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  605. package/skills/wix-vibe-headless/SKILL.md +7 -3
  606. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  607. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  608. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  609. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  610. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  611. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  612. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  613. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  614. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  615. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  616. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -34,7 +34,9 @@ Do not proceed until:
34
34
  - when `SAFE_MODE=true` or `DRY_RUN=true`, the post-codegen code-safety review exists and
35
35
  has been accepted before execution approval is sought
36
36
  - the **execution plan report has been presented and the user has accepted it** (see
37
- below)
37
+ below). In explicit user-requested `1-click mode` (`automationMode=one_click`,
38
+ `source=user`), the same report is still required, but it is recorded as accepted by the
39
+ agent once all blockers/gaps are surfaced and no unresolved hard stop remains.
38
40
 
39
41
  Prefer the machine-readable execution artifacts above. `execution/review/import-plan.md`
40
42
  is a human-facing review artifact, not the primary execution contract.
@@ -43,8 +45,8 @@ Before live import and again before final reporting, validate
43
45
  `execution/review/import-plan.freshness.json` with the deterministic freshness helper:
44
46
 
45
47
  ```bash
46
- node skills/replatform/scripts/artifact-freshness.js check migrations/<project> \
47
- --domains-dir skills/replatform/resources/rp-target-wix/domains \
48
+ node skills/wix-replatform/scripts/artifact-freshness.js check migrations/<project> \
49
+ --domains-dir skills/wix-replatform/resources/rp-target-wix/domains \
48
50
  --delta execution/review/import-plan-delta.md
49
51
  ```
50
52
 
@@ -87,15 +89,64 @@ the user accepts. The report must show:
87
89
  source IDs are the stable migration key, while many native Wix target IDs are
88
90
  server-assigned. The plan must state whether each entity re-run resolves via a
89
91
  client-controlled source-id field on the target or via the durable local
90
- `sourceId -> targetId` crosswalk. The plan must state the crosswalk authority
91
- (`local`) and CMS mirror mode (`none`, `download`, `upload`, or `download-and-upload`).
92
+ `sourceId -> targetId` crosswalk. Local `state/crosswalk/crosswalk.ndjson` is the sole
93
+ runtime authority for resume/idempotency — never CMS. The plan must state the crosswalk
94
+ authority (`local`) and the mapper-selected CMS mirror mode (`none`, `download`, `upload`,
95
+ or `download-and-upload`); CMS `ImportCrosswalk` is OPTIONAL by design, not a default,
96
+ because Wix CMS quotas are plan-based and shared across every custom collection on the
97
+ site — a large migration's full crosswalk can be many times a lower-tier plan's total item
98
+ quota, so treating the mirror as mandatory risks spending site data capacity the migration
99
+ has no business claiming by default. Only enable a mirror mode when the user opted into
100
+ site-local reference data (see `rp-execute-setup` → "Import crosswalk CMS mirror").
101
+ When a mirror mode other than `none` IS selected: provisioning the collection is not the
102
+ same thing as keeping it in sync — a run can provision the
103
+ collection at setup time and then never write to it again during import, leaving every
104
+ entity's crosswalk invisible on the site itself until a one-time backfill catches it up.
105
+ `rp-target-wix/lib/wix-writers.js`'s `syncImportCrosswalk` (batches of up to 1000 through
106
+ `bulkSaveDataItems`, item id the row's own `sourceStableKey`, matching the approved
107
+ download-side dedupe contract exactly — see the KNOWN, UNRESOLVED LIMITATION comment on
108
+ `buildImportCrosswalkItem`: sourceStableKey is only unique within one migration, so two different projects against the same source system that happen to import the
109
+ same entityType+sourceId still collide, and closing that gap needs its own approved
110
+ identity/schema decision, not an ad hoc id prefix) is the primitive that keeps it current, and
111
+ `rp-import-codegen` wires it in: a generated run with a mirror mode of `upload` or
112
+ `download-and-upload` performs **exactly one snapshot pass, after the last entity write**,
113
+ projecting the finished local crosswalk through `local-state.js`'s
114
+ `crosswalkRowsToMirrorItemInputs` and uploading it with `syncImportCrosswalk`. The pass is
115
+ never inline per entity and never a per-batch checkpoint: a mirror write riding alongside
116
+ each record multiplies the calls the site absorbs during the run and makes a slow collection
117
+ a drag on the import it only describes. With `none` or `download` the generated run touches
118
+ the collection zero times — no reads, no writes, no empty pass reported as success — because
119
+ site storage is a shared plan-based allowance and a large ledger can be a meaningful
120
+ fraction of a smaller plan's whole quota.
121
+ Never make native-entity import correctness
122
+ depend on the mirror succeeding: a non-zero `totalFailures`, or a thrown transport error,
123
+ marks the mirror step failed and is reported as a shortfall in the execution artifacts, while
124
+ every imported record stays imported and the run itself is not failed.
125
+ - **Destination and collisions — required whenever `WIX_SITE_STRATEGY=existing`.** Name
126
+ the destination site, and say plainly that it is a site the user already owns and that
127
+ this import will change it. Then quantify the overlap: for each entity type, how many
128
+ source records match something already on the site (by crosswalk, then by the mapping's
129
+ natural key), and what will happen to each — **skipped** or **augmented**, never replaced
130
+ and never deleted. A user accepting "Migrate" on their live store is accepting these
131
+ specific writes; a plan that reports only "120 products" is asking them to consent to
132
+ something they cannot see. If the overlap cannot be computed before writing, say that
133
+ too, and say what the import will do when it meets one.
92
134
  - **URL preservation:** for public routed entities, state that source URL artifacts will
93
135
  be captured locally under `state/url-preservation/`. List the public entity types whose
94
136
  base paths and slugs will be tracked, any entity whose target route is deferred to the
95
137
  website-builder phase, and whether redirects will be recorded as plans. The current
96
138
  import phase must say that redirects and site routing are **not applied**.
97
- - **Notification mute (spec 0012).** State that site notifications will be muted before
98
- migration writes begin when mute is in effect. For a **new site** this is a one-line
139
+ Backend import stays plan-only: it records source URLs and source-authored redirect
140
+ definitions (`node skills/wix-replatform/scripts/url-redirects.js sources`), then runs the
141
+ offline `url-redirects.js report` and passes its projection
142
+ (`execution/url-preservation-report.json`, status `pending_website_build` until final routes
143
+ exist) as `completion-report.json.urlPreservation`. It never runs `apply` or `verify`, never
144
+ probes the public website and never changes DNS; those are post-build helper operations the
145
+ cutover step schedules.
146
+ - **Notification mute.** State that site notifications will be muted before
147
+ import when required by the resolved site strategy/config, and how the owner can later
148
+ ask for an unmute. State that site notifications will be muted before migration writes
149
+ begin when mute is in effect. For a **new site** this is a one-line
99
150
  factual disclosure (the mute is unconditional). For an **existing site that opted in**
100
151
  (`WIX_MUTE_NOTIFICATIONS=on`) the disclosure is **mandatory and prominent** and must
101
152
  state all three points:
@@ -109,6 +160,11 @@ the user accepts. The report must show:
109
160
  rejects the mute line, revert to the existing-site default (`off`) and regenerate the
110
161
  affected artifacts before seeking acceptance again.
111
162
 
163
+ In explicit user-requested `1-click mode`, do not skip this report. Generate it, make sure it
164
+ reflects the real setup changes / data writes / blockers, record it as accepted by the agent,
165
+ and continue without waiting for a human response. A missing mode or a non-user-authored
166
+ `one_click` value must follow the normal user-approval path.
167
+
112
168
  Persist this in `execution/review/import-plan.md` (or a sibling report). This is the defined approval
113
169
  checkpoint: the job pauses, surfaces the plan to the user, and resumes **only** on
114
170
  accept. Nothing is written before acceptance.
@@ -189,7 +245,8 @@ contain required values:
189
245
  - `SAFE_MODE_PHONE_NUMBER` when `SAFE_MODE` is enabled
190
246
  - `migrations/<project>/config/source.<platform>.env`
191
247
  - platform-specific source values, for example WordPress:
192
- `WP_BASE_URL`, `WP_USERNAME`, `WP_APPLICATION_PASSWORD`
248
+ `WP_BASE_URL`; `WP_USERNAME` and `WP_APPLICATION_PASSWORD` for authenticated REST
249
+ reads; and `WMH2_MIGRATION_KEY` when the generated bridge reader selected signed auth
193
250
 
194
251
  The generated script should load these files and then allow process env to override them.
195
252
  `WIX_SITE_STRATEGY` is always required. `WIX_SITE_ID` is required before execution writes
@@ -203,9 +260,9 @@ the generated runtime supports that same key. If the generated import path needs
203
260
  different Wix credential, name that key explicitly in the generated artifacts.
204
261
 
205
262
  If execution is blocked because a RePlatform `new site` + `headless` target was never
206
- created, route back to the **Wix CLI headless scaffold** step defined in `replatform` →
207
- "Headless site creation" (`npm create @wix/new@latest headless`). The account-level Projects
208
- API is deprecated for this workflow (it produced non-headless sites).
263
+ created, route back to `resources/rp-destination/`, which scaffolds via
264
+ `npm create @wix/new@latest headless`. The account-level Projects API is deprecated for
265
+ this workflow (it produced non-headless sites).
209
266
 
210
267
  When the accepted next run is dry-run, missing or blank `WIX_AUTH_TOKEN` and
211
268
  `WIX_SITE_ID` are not blockers unless a local artifact requires the site ID as a stable
@@ -239,10 +296,12 @@ CLI account should create the site and mint this token.
239
296
  1. Resolve the active project.
240
297
  2. Review the machine execution artifacts and generated code; present the execution plan
241
298
  report and obtain acceptance (see above) before any write.
242
- 2b. Prepare deterministic local execution state before any setup/import write:
299
+ 2b. **Precondition, not a step you can skip by not reading this line.** The import path checks
300
+ that execution state was prepared and refuses to write without it. Prepare deterministic
301
+ local execution state before any setup/import write:
243
302
 
244
303
  ```bash
245
- node skills/replatform/scripts/execution-state-prepare.js migrations/<project>
304
+ node skills/wix-replatform/scripts/execution-state-prepare.js migrations/<project>
246
305
  ```
247
306
 
248
307
  This validates `execution/execution-manifest.json`, initializes or validates
@@ -250,6 +309,47 @@ CLI account should create the site and mint this token.
250
309
  `state/attempts/write-attempts.ndjson`, initializes `state/url-preservation/`
251
310
  artifacts when URL preservation is enabled, and blocks CMS mirror download flows unless
252
311
  local state is absent and explicit CMS mirror rows have been provided to seed it.
312
+ 2d. Verify the generated import entrypoints satisfy the entry contract, before any entity
313
+ write:
314
+
315
+ ```bash
316
+ node skills/wix-replatform/scripts/import-contract-verify.js migrations/<project>
317
+ ```
318
+
319
+ For a filtered run, pass its identical selection after `--` (for example
320
+ `-- --entity <entity> --failed-only`). For selected bridge-backed entities/dependants,
321
+ the verifier first checks actual generated wiring and helper versions against the
322
+ committed emitter, before running any generated entrypoint. An unrelated native-only
323
+ selection does not check another plugin's artifact readiness. Source preparation/full
324
+ manifests are checked by the shared runtime at selected dispatch; missing preparation
325
+ holds only affected scopes with existing Import Operator tasks. Follow
326
+ `rp-source-wordpress/PLUGIN-READ-PLANS.md`; do not bypass those wrappers.
327
+
328
+ This then spawns each generated import entrypoint with `--describe`, parses the single JSON
329
+ object it prints, and checks it against the generated-importer contract. It writes no state
330
+ and touches no target. A non-zero exit **aborts the import** and routes back to codegen —
331
+ no degraded mode, no skip flag — naming every missing selection mode and every misplaced
332
+ ledger path at once.
333
+
334
+ The selective modes (`--entity`, `--source-type`, `--missing-only`, `--failed-only`,
335
+ `--deferred-only`, `--unresolved-only`) are a **requirement on the generated importer**, not
336
+ an operator option: an importer that cannot offer targeted recovery is one whose only
337
+ recovery is an unfiltered full re-pass, which is how a journal ends up with several rows per
338
+ record. The importer also checks itself, as the first statement of its `main()`; this step
339
+ is what catches an importer that never emitted that check at all.
340
+
341
+ 2c. Resolve every request under `state/blocked-data-requests/` with the shared
342
+ `lib/blocked-data-requests.js` helper before normal extraction. Reuse a current immutable
343
+ snapshot within `fulfillment.freshnessWindowHours` without probing the source. After the
344
+ window, attempt exactly one refresh: write the next version on success; on failure keep the
345
+ prior snapshot and mark it `stale: true`. With no snapshot, `csv-upload` checks and parses
346
+ `expectedInputPath`, while `bridge-plugin` probes the live `/wp-json` namespace list and then
347
+ calls `extractionRoute`; never check a local path for a bridge request. Reconciled data is
348
+ merged into that capability's extraction input. Present-but-invalid or partial data is
349
+ discarded and marked `invalid`; missing data uses the target entity's existing default.
350
+ Never create `declined` unless a human explicitly declined during an interactive review.
351
+ Stamp every write attempt using real blocked data with the snapshot version, extraction
352
+ timestamp, and checksum it actually consumed.
253
353
  3. Run a safe validation path first when possible, such as dry-run, sample batch, or read-only validation.
254
354
  For dry-run, invoke the same generated setup/import entrypoints with `DRY_RUN=true` or
255
355
  `--dry-run`. Do not use an agent/MCP hand-built substitute. The shared Wix runtime must
@@ -270,15 +370,38 @@ CLI account should create the site and mint this token.
270
370
  that record to Wix.
271
371
  If the run needs live Stores evidence during setup or recovery, use the shared
272
372
  verification CLI and persist its JSON artifact:
273
- `node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count --artifact migrations/<project>/execution/stores-product-count-verification.json`
373
+ `node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count --artifact migrations/<project>/execution/stores-product-count-verification.json`
274
374
  or `stores product-by-source-marker --marker-path <path> --marker-value <value>`.
275
375
  Do not write migration-local verification snippets for Stores product counts,
276
376
  source-marker lookups, subscription probes, or probe cleanup.
277
- 3b. **Clear the default demo catalog first.** A freshly provisioned Wix Stores catalog (and
278
- `wix-headless`'s seed) ships ~12 placeholder demo products + demo categories. Delete them
279
- before importing (keep the system `All Products` category) so the final store holds only
280
- the migrated data — otherwise a clean 100-product import reads as 112. Applies in both
281
- delivery modes.
377
+ 3b. **Clear the default demo catalog first — only when all three conditions hold.** A
378
+ freshly provisioned Wix Stores catalog (and `wix-headless`'s seed) ships ~12 placeholder
379
+ demo products + demo categories. Wiping them before importing is correct ONLY on a site
380
+ you created on this turn from a live source — never as a general cleanup step. All three
381
+ must hold; check them before deleting anything:
382
+
383
+ 1. `WIX_SITE_STRATEGY=new`, **and**
384
+ 2. the source is a **live site**, not supplied files (`sourceMode=files_only`), **and**
385
+ 3. **you created the destination site on this turn.**
386
+
387
+ Each one guards against a different way of destroying data that is not template seed:
388
+
389
+ - **Existing site ⇒ never.** The catalog belongs to the owner; a bulk delete here is
390
+ data loss this pipeline cannot undo.
391
+ - **File-provided run ⇒ never, whatever the strategy.** File drops are recurring by
392
+ design — they can accumulate onto one site over multiple runs, so wiping on drop 2..N
393
+ would delete what an earlier drop imported, and the wipe cannot tell template seed
394
+ from migrated data.
395
+ - **A later turn ⇒ never.** This is the condition most likely to be missed: on turn two
396
+ of a new-site run, `WIX_SITE_STRATEGY` still reads `new` and the source is still a
397
+ live site, so only "did I create the destination on this turn" separates clearing the
398
+ template's placeholders from deleting the previous turn's import.
399
+
400
+ When in doubt, skip it — leaving a few template products behind is a cosmetic defect the
401
+ owner can fix later; deleting their catalog is not recoverable. When all three hold,
402
+ delete the default demo products and categories (keep the system `All Products`
403
+ category) so the final store holds only the migrated data — otherwise a clean
404
+ 100-product import reads as 112. Applies in both delivery modes.
282
405
  4. **Run source extraction first** using the generated extraction entrypoint (for example
283
406
  `node src/extract/run-extract.js`). This step writes durable source files under the
284
407
  project and must complete before the write phase unless the extraction artifacts are
@@ -302,20 +425,291 @@ CLI account should create the site and mint this token.
302
425
  If the execution manifest enables CMS mirror download, fetch CMS rows before this step
303
426
  and pass them to the deterministic state-preparation layer; the generated import may use
304
427
  only local crosswalk state after preparation succeeds.
305
- 6. Capture compact reports, audit-log references, errors, retries, skipped records, and
306
- checkpoint information from the shared runtime outputs. If a dependency phase has
307
- systemic failures, stop before downstream writes that depend on it. Example:
308
- product-category failures must block product writes unless the accepted execution plan
309
- explicitly says category assignment is best-effort.
428
+ 5b. **App routes and internal links.** After relevant apps are
429
+ installed, inspect/configure only the schema-backed per-family routes supported by
430
+ `rp-target-wix` capability knowledge; store saved-state read-back under
431
+ `state/url-preservation/app-page-routes.json`. After backend import, run the generated
432
+ `internal-link-audit.js plan` input over the complete captured inventory. It performs
433
+ local counting with no destination request or model call and writes
434
+ `state/url-preservation/link-audit.json`. A backend-only run leaves destinations pending
435
+ and unresolved occurrences without invented paths. Do not call the post-frontend
436
+ `verify` entrypoint until the frontend exists. That step first makes at most 20 read-only
437
+ calibration checks inside a two-minute sub-cap, records the estimate against the
438
+ approved 30-minute live-work and 100,000 exception-review-token ceilings, then checks
439
+ samples and destinations and invokes only compatible non-blog writers. Unknown or
440
+ incompatible writer ownership blocks affected writes before mutation, while disjoint
441
+ safe fields may proceed. Blog-post link writes remain pending until a dedicated writer
442
+ can consume verified destinations through its checkpointed post-frontend lifecycle.
443
+ Supply planned destination content revisions with containing record identities. The
444
+ shared verifier applies structured patches once per logical record and field through
445
+ its durable write journal; adapter callbacks supply revisioned read/write and rendered
446
+ checks, not direct per-link repair. A budget hold survives re-planning and resumes only
447
+ after the plan records the owner's decision reference and approved ceilings.
448
+ Refresh the audit, completion report and website handoff after the post-frontend step
449
+ and after affected source catch-up. Keep incomplete writer integration and unverified
450
+ link coverage pending in those artifacts.
451
+ 6. Use `lib/dependency-readiness.js` immediately before each dependent batch, including
452
+ selective recovery. The generated importer binds its task, evaluates current readiness,
453
+ and calls `gateBatch`; only its `send` payloads may reach a task-capability Wix client,
454
+ carrying `sourceStableKey` and the current `readinessGrant`. A task-level unknown or
455
+ unapproved exclusion stops before its first batch. A permitted partial per-record
456
+ dependency defers only records whose required references are unresolved. Setup is
457
+ all-or-nothing: every bound step must pass on the current destination before any
458
+ setup-derived reference can resolve. An empty dependency passes only with a current
459
+ complete zero-row extract and full task-pass evidence. Never infer readiness from task
460
+ order, a success count, a crosswalk row alone, dry-run state, or prose best-effort consent.
461
+ Capture compact reports, audit-log references, errors, retries, skipped records, and
462
+ checkpoint information from the shared runtime outputs.
310
463
  Safe-mode outputs must be summarized by counts and paths only: include skipped
311
464
  safe-mode blocked record counts, the project-relative
312
465
  `state/safe-mode/blocked-records.ndjson` path when present, and the
313
466
  `state/safe-mode/email-replacements.ndjson` row count/path when replacement rows were
314
467
  written. Do not print original email addresses or phone numbers from the recovery
315
468
  ledger.
469
+ 6b. **Reconcile bearer-voucher drift against a fresh source read — required, before cutover.**
470
+ Run this after every write pass has finished and before anything declares the run
471
+ complete. It is required whenever the accepted scope included coupons **and** the source
472
+ carried at least one coupon with a usage limit. When neither holds, record
473
+ `voucherReconciliation: "not-applicable"` in the completion report and do nothing else — a
474
+ source with no usage-limited coupons still answers out loud, because silence and success look
475
+ identical in a report.
476
+
477
+ **Deadline: before cutover, while the source is still the system of record.** Two reasons,
478
+ and together they are why running it late is the same as never running it:
479
+
480
+ 1. the step compares a **fresh read of the source** against the target, and once the source
481
+ stops being the system of record that fresh source read stops existing; and
482
+ 2. the **target exposes no redemption count** for a coupon on any surface, so the question
483
+ cannot be answered from the target alone afterwards.
484
+
485
+ Miss the deadline and which codes were already spent becomes permanently unknowable, on an
486
+ instrument made of money.
487
+
488
+ **Use the shipped module, `rp-target-wix/lib/coupon-redemption-drift.js`.** A
489
+ migration-local reimplementation of the classification, the plan, the request builder or the
490
+ verification is forbidden: each one carries a trap that stays invisible until it costs money.
491
+
492
+ 1. Re-read the source coupon rows **now** — never the discovery snapshot, which is precisely
493
+ what went stale — and read each imported coupon back from the target.
494
+ 2. Per import receipt: `classifyPostImportDrift({ receipt, freshCoupon, targetCoupon })`. It
495
+ returns exactly five post-import outcomes: `voucher-drift-reconciled`,
496
+ `voucher-drift-remedy-pending`, `voucher-source-row-missing`, `voucher-target-row-missing`
497
+ and `voucher-target-state-unreadable`. An unsupported face-value precision is the boolean
498
+ `verdict.facePrecisionUnsupported` riding alongside whichever of those five applies —
499
+ wire on that flag; it is never `verdict.outcome`, so a branch for it in a
500
+ `switch (verdict.outcome)` is a branch nothing can ever reach.
501
+ 3. `buildVoucherDriftPlan({ verdicts, ordersByCouponCode, currency })` turns the verdicts into
502
+ the owner-approval plan: `counts`, one `rows` entry per code carrying its face value, the
503
+ orders that reference it and the proposed remedy, and `liability` — the money still live.
504
+ The plan is `readOnly: true` and has no apply path, by construction. Run twice on the same
505
+ inputs it produces the same plan.
506
+ 4. **The owner rules per code, including in one-click mode.** One-click is a promise about how
507
+ little the operator has to decide, never a licence to decide on the merchant's behalf about
508
+ their money: deactivating a code a customer legitimately holds destroys value too, and the
509
+ merchant might already have honoured a voucher off-system. Nothing in this step writes
510
+ without an explicit per-code decision.
511
+ 5. Build an approved remedy **only** with `buildRemedyRequest({ couponId, remedy, setTags })`.
512
+ It emits the one request shape that actually writes — a specification carrying only the
513
+ changed fields plus the matching field mask. **Never build the body from the coupon you
514
+ just read:** the full specification alongside a narrow field mask is accepted with `200`,
515
+ an empty body, and no write at all. Record the response status; do not interpret it.
516
+ 6. Wait a settle, read the coupon back, and let
517
+ `verifyRemedyApplied({ remedy, responseStatus, readBackAfterSettle, settleMs })` decide. A
518
+ 2xx is not evidence. No read-back, a read-back that still shows the coupon live, and a
519
+ read-back with no readable `active` flag are each `remedy-unverified` — reported unknown,
520
+ never applied. For a deactivation, a coupon that does not read back at all is unknown too,
521
+ never success.
522
+
523
+ ⚠️ **This is not the coupon pass and must not be folded into it.** The coupon pass writes
524
+ coupons; this step re-reads the source *afterwards*, which is the entire point. Run inside the
525
+ import, it returns the answer the import already had.
526
+
527
+ ⚠️ **It is not the rerun pass either** (see "Rerunning an import for new and modified
528
+ records"). A rerun covers new and changed records; a voucher spent since the write is neither
529
+ — nothing the rerun compares changed. They are separate obligations at an agreed cutover.
530
+
531
+ ⚠️ **Expect to run this step more than once.** It is idempotent and safe at the end of every
532
+ execution, but its deadline is cutover, so re-invoke it close to actual cutover. The
533
+ completion record from the **last invocation before cutover** is the authoritative answer; an
534
+ earlier `not-run` or `plan-pending-owner` is a warning that the obligation is still open, not
535
+ a verdict that it was skipped.
536
+
537
+ Record the result in `execution/completion-report.json` as `voucherReconciliation`, one of
538
+ `not-applicable | reconciled | plan-pending-owner | remedied | not-run` (see "Completion
539
+ report contract").
540
+
316
541
  7. Save durable execution artifacts, including the authoritative completion artifact and
317
542
  deterministic user-facing completion summary.
318
543
 
544
+ ## Contacts/Members disposition (safe-mode vs. real, live at the destination)
545
+
546
+ LIVE-VERIFIED: when `SAFE_MODE=true` covers `crm/contact`, every created Contact carries a
547
+ mock `replatform+contact_<id>@wix.com` email (see `mockEmailForEntity` in
548
+ `rp-target-wix/lib/wix-writers.js`). What that means for login identity depends on whether
549
+ `members/member` is itself a generated import target for this run, per `rp-import-codegen`'s
550
+ member pass:
551
+
552
+ - **`members/member` NOT in the generated scope:** the contact-import pass alone builds no
553
+ Wix Members (`memberCrosswalk` is stubbed to always return `null` so order/blog author
554
+ resolution has something safe to call), so no customer gets a real, usable login identity
555
+ from this run at all — safe-mode or not. Promoting a contact to real-email-plus-Member is
556
+ then a distinct, separate, later write (see `rp-target-wix/lib/wix-writers.js`'s
557
+ `ensureMember` composite: read the contact's current revision, update its email/phone from
558
+ the real source values only when the current email still matches the safe-mode mock
559
+ pattern, then call `ensureMember` with the same real loginEmail so the created Member lands
560
+ on that same contact rather than a duplicate).
561
+ - **`members/member` IS in the generated scope:** the generated member pass runs `ensureMember`
562
+ directly against each registered customer's REAL email in its own loop before order history,
563
+ regardless of the `crm/contact` SAFE_MODE setting — that pass does not read or wait on the
564
+ safe-mode mock email at all, it goes straight to `ensureMember({loginEmail: customer.email, ...})`.
565
+ In this case customers DO get a real Member from the entity-import pass itself; a contact
566
+ left on a safe-mode mock email from a separate `crm/contact` pass is not the same customer
567
+ state as "no Member exists" and must not be reported as if it were.
568
+
569
+ Do not state either version as the migration's blanket behavior without checking which one
570
+ this run's actual generated scope produces.
571
+
572
+ Two requirements follow, both non-negotiable when `crm/contact` is in scope:
573
+
574
+ 1. **Ask before the contact import runs, in plain language — but only offer a choice the
575
+ generated scope can actually honor, not by assuming a SAFE_MODE default:**
576
+ - If `members/member` is NOT a generated target for this run: this pass never creates a
577
+ Member either way (see above), so do not offer "create a Wix Member directly" as an
578
+ option — that path does not exist without a member pass. Ask instead: "Import contacts
579
+ with their real email now, or with temporary safe-mode emails for review first? Either
580
+ way, no customer gets a Member or a login identity from this run alone — that is always
581
+ a distinct, later step (add `members/member` to the scope, or run the separate
582
+ promotion write afterward)." Record the answer in the execution plan/consent artifact
583
+ next to the SAFE_MODE decision; do not let an unset `SAFE_MODE` env var (which defaults
584
+ to `true`) decide this silently.
585
+ - If `members/member` IS a generated target: do **not** offer the safe-mode-contacts
586
+ choice at all. The member pass creates each registered customer's Member
587
+ directly against their REAL email regardless of `crm/contact`'s own SAFE_MODE setting,
588
+ and reconciles by that real loginEmail — a contact the SAFE_MODE pass created earlier
589
+ under the mock email will not match it, so the member pass creates a SECOND, separate
590
+ contact on the real email instead of landing on the existing one. This is a real
591
+ duplicate-contact gap, not a hypothetical: the ordering rule needed to prevent it (never
592
+ pre-create a safe-mode contact for someone who will become a member) is tracked as an
593
+ open, unresolved decision, not something already implemented. Until that ordering is
594
+ implemented, `crm/contact` must run in real-email mode whenever `members/member` is
595
+ also in scope, and the plan must say so plainly rather than presenting a safe-mode
596
+ choice it cannot deliver.
597
+ 2. **Every completion/status summary that touches contacts must report the disposition
598
+ explicitly and by count**, whichever path was chosen: how many contacts still carry a
599
+ safe-mode temp email with no Member (and therefore need a follow-up promotion run before
600
+ they have a real email on file or can log in), vs. how many were promoted to a real email
601
+ + Member. A status report that only says "N contacts imported" without this breakdown is
602
+ incomplete — the operator cannot tell from that alone whether any customer can currently be
603
+ reached or log in.
604
+
605
+ ## Email marketing consent
606
+
607
+ When the source records a real per-record consent signal for marketing email (e.g. a
608
+ WooCommerce order's checkout consent-checkbox meta, not mere presence as a customer), do not
609
+ write it to Wix Email Subscriptions yet. `crm/email-subscription`'s `bulkUpsertEmailSubscriptions`
610
+ writer (`rp-target-wix/lib/wix-writers.js`) is mechanically live-verified — keyed by email
611
+ address, covers guest-checkout consent with no Contact behind it, sets a status only with no
612
+ confirmation/marketing email triggered — but the entity's `preferredWrite.importSafe` stays
613
+ `false` because two product decisions are still unresolved: how several orders for one email
614
+ fold to a single subscription state (`order-scoped-consent-has-no-decided-fold-rule`), and
615
+ whether Email Subscriptions or the separate Marketing Consent API is the authoritative write
616
+ target (`email-subscriptions-vs-marketing-consent-api-unresolved`). Surface the gap and these
617
+ two open questions to the user rather than deciding either one inside an import run; only
618
+ proceed once both are resolved and `importSafe` reflects that.
619
+
620
+ ## Rerunning an import for new and modified records
621
+
622
+ The source keeps trading after an import finishes: newer records arrive, earlier
623
+ records change, earlier failures are still missing. A rerun reuses the same project,
624
+ destination, mapping, generated importer and crosswalk — it is not a fresh migration, and any
625
+ mapping or scope change goes back through the existing gates.
626
+
627
+ Catch-up may extend the end of the range to the new capture time. It does **not** pull older
628
+ history the accepted scope excluded, and it does **not** propagate deletions.
629
+
630
+ ⚠️ A rerun does **not** cover bearer-voucher drift, and must never be reported as having done
631
+ so. A voucher spent at source since the import is neither a new record nor a changed one in
632
+ anything `selectRerunRecords` compares. That obligation is workflow step 6b, it is separate,
633
+ and it is deadlined at cutover.
634
+
635
+ **Selection.** Refresh the agreed scope and bucket it against the crosswalk with
636
+ `lib/import-recovery.js`'s `selectRerunRecords` — create missing, skip unchanged, update
637
+ changed, and report `unknown` where there is no usable comparison evidence. The pre-existing
638
+ `--missing-only` and `--failed-only` filters are **not** a delta between them: missing-only
639
+ excludes every crosswalk hit, so a changed record is never seen, and failed-only only revisits
640
+ what was already attempted. Read refreshed files covering the whole agreed scope; a
641
+ modified-since optimization is allowed only when it still includes boundary records, older
642
+ retries and unresolved decisions.
643
+
644
+ **The version pair.** Every confirmed write records the source's version (`sourceVersionField`
645
+ + `sourceVersion`, or a declared `sourceHash` fallback) and the Wix `targetRevision` returned by
646
+ that write, via `nextCrosswalkBaseline`. A confirmed write that returns **no** revision does not
647
+ advance the pair at all — **including a first create**. Half a pair is not a baseline: a source
648
+ version saying "applied" with no revision leaves the next update with no concurrency guard, and
649
+ on a re-write it would pair a new source version with a pre-write revision and self-conflict.
650
+ Both reconcile instead. A linked record with no saved revision is likewise reported `unknown`
651
+ rather than updated, which also covers legacy rows written before the pair existed. Treat both as opaque; never increment a revision
652
+ locally. A failed, conflicted, dry-run or skipped write **must not** advance the pair — that is
653
+ what keeps the record eligible for recovery instead of recorded as applied. Missing metadata on
654
+ an old row is `unknown`, never "unchanged".
655
+
656
+ **Conflicts are a user decision, including in one-click mode.** When Wix rejects an update
657
+ because its revision moved, stop updating that record and show the user the error, the record,
658
+ and the source changes proposed for it — `lib/rerun-conflicts.js` builds that review and
659
+ classifies the error. Ask once per record, not per field. **Never silently fetch a newer
660
+ revision and retry**; there is deliberately no such helper. Unrelated records continue; work
661
+ depending on the unresolved update stays blocked.
662
+
663
+ ⚠️ **The conflict-code list is incomplete by design.** Only `INVALID_REVISION` has been
664
+ observed live (on a delivery profile). Products v3 and Contacts v5 conflict codes
665
+ are **not** known, so they are absent rather than guessed. Two things keep that safe: the
666
+ accepted mapping can declare an entity's real codes (`entityConflictCodes`), and an
667
+ unrecognized 409 on a revision-carrying update classifies as `possible_revision_conflict` —
668
+ which goes to a human, never to an auto-retry and never silently into an ordinary failure. When
669
+ a real conflict code is observed, record it in the entity's declared codes and in
670
+ `OBSERVED_REVISION_CONFLICT_CODES` with its evidence.
671
+
672
+ On **override**, read the latest Wix record, show which values would be replaced, and write
673
+ against the revision the user actually reviewed. A further conflict is another decision. On
674
+ **keep**, leave Wix alone and record the choice against that exact source version and reviewed
675
+ revision in the recovery log — never as a crosswalk baseline, because the source version was
676
+ never applied — persist it through the recovery entry's `conflictDecisions[]` and read it back
677
+ with `latestConflictDecisionFor`, so a later rerun does not re-ask a question the user already
678
+ answered or silently overwrite what they chose to keep. `loadRecoveryLog` returns an **array**;
679
+ pass it straight in. Do not report a kept change as imported,
680
+ and do not retry it silently later.
681
+
682
+ **Dependencies and safety.** Resolve contacts, products and other dependencies before their
683
+ dependants. A record with an uncertain prior attempt (`deferred`, `needs_verification`,
684
+ `succeeded_unverified`, `started`) is reconciled before it is written — `selectRerunRecords`
685
+ routes it to `needsReconciliation` whether it is linked or not. Unlinked, an unconfirmed earlier
686
+ write may already exist and creating again would duplicate it. **Linked, the danger is subtler:**
687
+ if the previous write landed and the process died before saving its baseline, the saved revision
688
+ is already stale, so re-sending it makes the importer collide with its own write and report that
689
+ to the user as a merchant edit.
690
+
691
+ Updates touch only the fields the accepted mapping covers and preserve unrelated Wix values.
692
+ Each entity needs a verified update operation **and** conflict protection; without both,
693
+ `updateSupportFor` returns `report_for_review` and the record is reported rather than pushed
694
+ through a create/import operation. This is **enforced in code**, not only documented: the
695
+ accepted mapping declares `{ writerId, revisionParam }` per entity, and an entity missing
696
+ either is refused. It **fails closed** — a rerun that does not declare `targetEntityRef` at all
697
+ gets `report_for_review` for every changed record, because an absent declaration is not evidence
698
+ that an update is safe. The order family (`ecom/order` and its child entities) is denied outright
699
+ with `neverFallBackToCreate` — Update Order exposes a restricted field set and no general
700
+ revision parameter, and a same-id Import Order is an unguarded whole-body replacement that
701
+ clears omitted fields.
702
+
703
+ **Scope and deletions.** Pass the accepted scope as `inScope`; excluded records are reported
704
+ `outOfScope` and never actioned. Deletions need no rule beyond the refreshed set: a record
705
+ absent from the source is never iterated, so absence can never become a delete instruction.
706
+
707
+ **Reporting.** Before writes, show the selected scope with counts of new, changed, unchanged
708
+ and unresolved. Afterwards report created, updated, unchanged, kept-in-Wix-by-user-choice,
709
+ conflicted, failed, blocked and out-of-scope, with errors and affected records. Unknown counts
710
+ are not zero. Name the source capture time: a trading source may need another rerun or an
711
+ agreed cutover.
712
+
319
713
  ## Required final report contents
320
714
 
321
715
  When execution finishes, the deterministic completion outputs must explicitly include:
@@ -335,12 +729,28 @@ When execution finishes, the deterministic completion outputs must explicitly in
335
729
  would update, would delete, would require live lookup, and local validation failures.
336
730
  Do not report dry-run rows as created, updated, imported, installed, published, or
337
731
  verified in Wix.
732
+ - blocked-data request outcomes from `completion-report.json`, including every dependent
733
+ entity/field outcome, the worst-severity aggregate, whether a used snapshot is stale, and the
734
+ exact snapshot version/extraction timestamp/checksum. A 1-click `missing` request must say the
735
+ run did not pause to ask; an invalid input that fell back successfully is a warning, not a
736
+ write failure.
338
737
  - an explicit statement that URL redirects/site routing were not applied in the current
339
- import phase when `urlPreservation.applyRedirects` is `false`
738
+ import phase when `urlPreservation.applyRedirects` is `false`, the old-link status from
739
+ `completion-report.json.urlPreservation`, and that old emails and bookmarks may fail until
740
+ redirects are applied and verified on the public domain
340
741
  - a plain-language distinction between:
341
742
  - **catalog/data imported successfully**
342
743
  - **website/homepage built successfully**
343
- - **notification-mute state (spec 0012) — in every terminal report** (completed, halted
744
+ - **the voucher-reconciliation answer — in every terminal report of a run whose accepted
745
+ scope included coupons** (workflow step 6b). State in plain language which of
746
+ `not-applicable`, `reconciled`, `plan-pending-owner`, `remedied` or `not-run` the run
747
+ recorded, and say what it means: `plan-pending-owner` means money is still redeemable a
748
+ second time on the merchant's live store and the owner has decisions outstanding per code;
749
+ `not-run` means the step was due and did not happen, and that the answer expires at cutover
750
+ because the fresh source read stops existing and the target exposes no redemption count.
751
+ Never infer this from the coupon write counts — report the recorded field, and report a
752
+ missing field as `not-run`.
753
+ - **notification-mute state — in every terminal report** (completed, halted
344
754
  to needs-user, or aborted; an aborted run is exactly the case where the owner is least
345
755
  likely to remember the mute happened). Derive "was muted" **only from recorded state**
346
756
  — the `mute-site-notifications` item in `setup/setup-verification.json` and the import
@@ -357,7 +767,7 @@ Do not report a successful catalog import as if it automatically means a finishe
357
767
  website. If the homepage/root preview is still blank or no site shell has been built,
358
768
  say that explicitly in the final report.
359
769
 
360
- State the **delivery mode** explicitly (see `replatform` → "Delivery mode"):
770
+ State the **delivery mode** explicitly (see `wix-replatform` → "Delivery mode"):
361
771
 
362
772
  - **`management` mode (default):** report that the deliverable is a **Wix-managed headless
363
773
  backend** — data migrated and manageable from the dashboard, with **no customer-facing
@@ -367,6 +777,21 @@ State the **delivery mode** explicitly (see `replatform` → "Delivery mode"):
367
777
  - **`website` mode:** report the **storefront URL** produced by `wix-headless` and confirm
368
778
  the released site serves the migrated catalog (not demo data).
369
779
 
780
+ ## Inventory completion and resume
781
+
782
+ Run the generated inventory reconciliation for new AND previously crosswalked products.
783
+ Require the current inventory setup/canary receipt before stock writes, retaining the run's
784
+ notification guard. After each batch persist stock outcomes separately from product success.
785
+ If stock failed, resume only stock using existing product/variant IDs; never recreate a
786
+ product or increment a quantity to recover it.
787
+
788
+ Include `state/inventory-report.json` in the completion inputs: intended variant denominator,
789
+ reconciled/created/updated, failed/unverified, and source decision-needed counts. Unknown stock
790
+ and missing variants remain visible. Any unresolved inventory makes catalog completion partial;
791
+ a product count or HTTP 200 cannot clear it. Compare source versus verified target availability
792
+ per variant and summarize out-of-stock counts. A source with available variants cannot pass
793
+ with an entirely unavailable target. Dry-run inventory outcomes are simulated, never live proof.
794
+
370
795
  ## Completion artifact authority
371
796
 
372
797
  At the end of the run, artifact authority should be explicit:
@@ -379,6 +804,267 @@ At the end of the run, artifact authority should be explicit:
379
804
  This skill should not treat `execution-log.md` as the canonical source for final
380
805
  imported/skipped/failed counts when `completion-report.json` exists.
381
806
 
807
+ That ordering is unchanged. What changed is that all four artifacts now actually get written,
808
+ by shipped code, rather than being required by this document and produced by nothing:
809
+
810
+ - `execution-log.md` — `appendExecutionLog(projectDir, entry)` in `lib/execution-log.js`.
811
+ Append-only: a resumed or recovery pass adds entries and never truncates or regenerates the
812
+ file, and every entry carries its own `runId` so a later pass's entries are distinguishable
813
+ from the first pass's without reading timestamps. Append one entry per lifecycle event: each
814
+ import step started and finished, every batch flush, every recovery pass, the completion
815
+ write, and the handoff generation.
816
+ - `execution/completion-report.json` and `execution/review/completion-summary.md` —
817
+ `writeCompletionReport(projectDir, report)` in `lib/completion-report.js`. The summary is
818
+ **rendered from the report object**, never composed independently and never derived from
819
+ `execution-log.md`. The writer itself joins source coverage (below); pass it the report from
820
+ `createCompletionReport` unchanged and never add `sourceCoverage` yourself — it refuses that.
821
+ - `execution/live-import-summary.json` — `writeLiveImportSummary` in `lib/import-recovery.js`,
822
+ called after **every batch**, not once at the end. See "Per-batch accounting" below.
823
+
824
+ For order history, use the generated accounting block from `rp-import-codegen`: collect the
825
+ final per-order stage outcomes with `collectOrderStageResiduals` and pass its rows to
826
+ `createCompletionReport` before calling `writeCompletionReport`. Omitted stage accounting is
827
+ refused for order reports. Persist these compact outcomes with batch accounting and restore
828
+ them on resume; a retry is not a second imported order, and a recovered stage must replace
829
+ its earlier failure. Check the saved report and summary for both the incomplete status and
830
+ the affected source keys when any payment, refund, or invoice stage failed.
831
+
832
+ `appendExecutionLog` is not a heartbeat. Liveness and progress output for watching a running
833
+ script is `lib/progress-log.js`, writes to a caller-supplied path, and is a separate contract.
834
+
835
+ ### Poll the health-check script, and redispatch on a stalled verdict
836
+
837
+ Do not drive a long-running generated `run-import.js`/`run-extract.js` by raw `tail -n 1`
838
+ alone once it has been launched. After dispatching the script, poll
839
+ `skills/wix-replatform/scripts/execution-health-check.js <projectDir> [--script <name>]
840
+ [--stale-after <duration>]` on an interval — default every 3 minutes; a shorter interval is
841
+ fine for a small run — instead of, or in addition to, the raw last-line tail. The
842
+ script reads `execution/progress.ndjson` and `execution/completion-report.json` and
843
+ answers exactly one question: `healthy`, `stalled`, or `complete`.
844
+
845
+ On a `stalled` verdict, treat it **exactly like a crashed process already found in
846
+ `execution/progress.ndjson`** — the same recovery as any other abnormal exit: redispatch a
847
+ fresh run from the last durable checkpoint. Never wait indefinitely on a subagent's own
848
+ promised resume ("it will pick back up on its own") once the health check reports
849
+ `stalled`; a subagent's own claim about its future behavior is not evidence, and what
850
+ this check exists to catch is a healthy run mistaken for one that would
851
+ never call back. A `healthy` verdict is not itself proof of eventual completion — keep
852
+ polling on the same interval until the verdict is `complete` or `stalled`.
853
+
854
+ Before redispatching on a `stalled` verdict, confirm the project's `run-import.js` (or
855
+ `run-extract.js`) was actually generated with the heartbeat wrapping — a project
856
+ codegen'd before this instruction existed may have entity-pass functions that never call
857
+ `withHeartbeat`/`startHeartbeat` at all, in which case `stalled` reflects an instrumentation
858
+ gap in that generated file, not the process. Grep the generated script for `withHeartbeat` /
859
+ `startHeartbeat`; if a write loop is missing it, retrofit that loop the same way
860
+ `rp-import-codegen/SKILL.md` describes for newly generated code before trusting the verdict
861
+ enough to kill and redispatch.
862
+
863
+ ### Entity-by-entity QA is mandatory before treating an import phase as done
864
+
865
+ `wix-replatform`'s router requires a phase-level QA subagent at the end of the import phase
866
+ (its "Route before acting" step 5). For import, that review must be entity-by-entity against
867
+ the accepted mapping plan (`mapping/entity-decisions/*.json`), not a read of the top-level
868
+ `status` field in `execution/completion-report.json` or a paragraph of prose asserting the run
869
+ went well. A dedicated QA subagent — never the Developer subagent that produced the report,
870
+ and never the routing agent's own read of the summary — must, for every mapped entity/subtype:
871
+
872
+ - confirm its `completion-report.json` row reconciles (`imported + alreadyPresentByCrosswalk +
873
+ deferred + failed == inScope`) and is backed by real rows in `state/attempts/write-attempts.ndjson`
874
+ or `state/crosswalk/crosswalk.ndjson` — a bare counter with no corresponding ledger rows is a
875
+ swallowed error, not a clean pass;
876
+ - for any entity reported blocked, deferred, or skipped, independently re-verify the stated
877
+ reason is still true right now (spot-check the live source data or the live destination API,
878
+ not the report's own prose) — a blocked reason written on an earlier pass can go stale the
879
+ moment its underlying cause is fixed elsewhere, and nothing re-checks it automatically;
880
+ - treat "the user already decided to defer this" as a real answer only when a decision file
881
+ actually records that choice; an assumption that a gap must be a deferred product decision,
882
+ invented to explain why nothing ran, is not a substitute for checking.
883
+
884
+ If QA finds a stale reason, an unverified blocked status, or a swallowed failure, it must
885
+ demand a fresh Developer dispatch for that entity before the phase is reviewed — a plausible
886
+ top-level status string never closes this out on its own. Repeat this full entity-by-entity
887
+ pass after every resumed or recovery run, not only the first: a dispatch that fixes one
888
+ entity's crash or slowness does not certify any other entity's completeness, and a phase
889
+ already marked reviewed goes back to "needs review" the moment a later pass changes its
890
+ completion report.
891
+
892
+ **Finish the pass by writing the attestation, not by saying so in prose**. Once
893
+ every mapped entity/subtype above has been checked, compile the per-entity results (the ten
894
+ `completion-report.js` fields for a full-mode row, or `imported`/`skipped` for a quick-mode
895
+ row, plus `blockedReasonsReverified` for any row with a blocked, deferred, failed, unresolved
896
+ or skipped count) into a JSON array and run:
897
+
898
+ ```
899
+ node skills/wix-replatform/scripts/entity-qa-attestation.js <projectDir> \
900
+ --entities-file <path to the compiled per-entity results> \
901
+ --verified-by <QA subagent label>
902
+ ```
903
+
904
+ This computes the completion report's own digest, resolves the independent mapped-entity
905
+ coverage source (`mapping/mapping-plan.json`, or `quick-mode/plan.json` for quick mode), and
906
+ writes `execution/qa/entity-qa-attestation.json` only if it validates. Finalization
907
+ (`orchestration-router.js` / `scripts/migration-completion.js`) now refuses without a fresh,
908
+ complete attestation matching the report that is shipping — a missing, stale or failed
909
+ attestation routes the run back to this pass, never to a silent "completed". A count the
910
+ writer reports as mismatched is the same defect this section already requires: send that
911
+ entity back to a fresh Developer dispatch, then re-run the full pass and the writer.
912
+
913
+ ## Per-batch accounting
914
+
915
+ Flush the run's accounting into the project after every batch, through the same shared writer
916
+ that produces the final record. An importer that holds its counters until the end loses them to
917
+ any interruption, and a long import redirected to a temporary file loses them to the shell; a
918
+ run that dies halfway must still leave a truthful partial account.
919
+
920
+ **Counts are held, never re-derived.** The figures come from the importer's own counters for the
921
+ current run. A count recovered by re-reading the append-only attempt ledger afterwards sweeps in
922
+ dry-run passes, retried batches and earlier recovery passes — that is how a run's counts inflate well past the number of records.
923
+
924
+ ### Coverage check against the attempt journal
925
+
926
+ Every `writeLiveImportSummary` flush that names a run id checks its held counters against that
927
+ run's own rows in `state/attempts/write-attempts.ndjson`, and adds the result as `coverageCheck`
928
+ on the written summary. The held counters are never replaced; a disagreement is reported, not
929
+ hidden, and the write still completes.
930
+
931
+ At the end of the run, pass the run's own `coverageCheck` to `createCompletionReport` — read it
932
+ back from `execution/live-import-summary.json` and use it only when its `runId` equals the run
933
+ being completed (`input.runId`); `live-import-summary.json` is one file shared by every run,
934
+ so "the last `coverageCheck` in the file" is never a safe substitute for checking the run id. Also
935
+ pass `coverageCheckExpected: true` whenever this run called `writeLiveImportSummary` with a run id
936
+ at least once, so an omitted or rejected-run-id check is recognized as this run's own unresolved
937
+ gap rather than silently ignored. This is opt-in: an existing importer that
938
+ has not adopted this contract never sets `coverageCheckExpected`, and a missing check there changes
939
+ nothing — do not set it for a project that never calls `writeLiveImportSummary` with a run id.
940
+
941
+ Do not present a held count as confirmed before this check runs: `coverageCheck.status` is
942
+ `"agrees"`, `"mismatch"`, or `"unchecked"`, and only `"agrees"` means the journal
943
+ corroborates it.
944
+
945
+ ## Reporting records that did not arrive
946
+
947
+ Records that did not arrive go into four separate sections of the completion report, never
948
+ merged into one list of issues, because they need four different responses:
949
+
950
+ | Field | Meaning |
951
+ | --- | --- |
952
+ | `losses[]` | Permanent losses — the destination cannot represent the record and no retry changes that |
953
+ | `exclusions[]` | Deliberate exclusions — we chose not to import these, with a count, a rationale, and whether an operator gate was recorded |
954
+ | `unresolved[]` | Written to the destination but not mapped, or mapped but unaccounted |
955
+ | `droppedFields[]` | The record arrived in a degraded form — the one that vanishes most easily, because the record count reconciles perfectly |
956
+
957
+ Each section renders even when empty, with an explicit "None." An omitted section is
958
+ indistinguishable from one nobody checked.
959
+
960
+ Anything the operator must do by hand goes in `operatorActions[]`, which renders **above** the
961
+ counts, each entry carrying a severity and a deadline reason.
962
+
963
+ `writeCompletionReport` also appends source access that outlives the migration
964
+ (`lib/source-access.js`). For a Shopify private-data run that connected, that is
965
+ `shopify-staff-account-removal` (`high`, entity the store domain): the store owner removes the
966
+ migration staff account after cutover and after the last Shopify read. It is listed on every
967
+ report, including an otherwise complete one, until the Import Operator records the owner's
968
+ confirmation with `rp-source-shopify` `scripts/shopify-session-check.js --confirm-staff-removal
969
+ owner-removed-account`; when the record is unreadable or missing the action says so and
970
+ `--repair-staff-access` rebuilds it as pending. It never changes the report's status.
971
+
972
+ For a Shopify run with any `shopify:customer-<kind>`, `shopify:order-<kind>` or
973
+ `shopify:customers-withheld-identity` coverage row, the writer also appends
974
+ `shopify-withheld-details-export` (`high`). A loss disposition does not close it: Shopify still
975
+ holds the only copy. After the final catch-up, the merchant exports customers and orders from
976
+ Shopify Admin; **Requires Import Operator** to run `rp-source-shopify`'s
977
+ `shopify-discovery.js --project <project> --confirm-withheld-export owner-exported`, regenerate
978
+ the report and verify the action is gone. A later extract `readAt` or a new withheld row reopens
979
+ it. The catch-up/checklist integration is not wired yet; the completion report is the
980
+ current durable handoff.
981
+
982
+ Shopify extract stop codes (`rp-source-shopify`), each a stop, never a retry loop. A source
983
+ catch-up (rerun for new and modified records) runs `shopify-extract.js --catch-up`, which reads
984
+ the whole store again in full; its **final re-read after Shopify activity stops** is a cutover
985
+ task for the Import Operator (check that `data/source-extract/extract-manifest.json` is
986
+ `complete` and every `readAt` is after the time activity stopped):
987
+
988
+ | Code | Meaning / next step |
989
+ | --- | --- |
990
+ | `source_auth_expired` | The CLI session lapsed. The stopping script creates a `manual_action` (`stage: execution`); run the session check (with `--connect` if asked), answer it, and the extract resumes from its manifest. **Requires Import Operator** |
991
+ | `shopify_throttled` | Shopify throttled one read on all 6 calls (31 s of backoff); re-run the extract later |
992
+ | `shopify_bulk_overdue` | A Shopify bulk export is still preparing after 4 hours. The extract holds at `awaiting_user_action` (exit 3) with one `question` action: answer `wait` (4 more hours) or `abort`, then run `shopify-extract.js` again. No duplicate question is created on restart |
993
+ | `shopify_bulk_overdue_aborted` | The operator answered `abort`: that dataset is `failed` with its `capture-failed` row `shopify:<entity>`; Shopify's operation is not cancelled. **Requires Import Operator**: `shopify-extract.js --retry-failed` reads it again |
994
+ | `shopify_bulk_failed` | A bulk dataset failed twice, was refused with `ACCESS_DENIED` and an unattributed cause, or is still `failed` from an earlier start. The extract stops on every start until the operator runs `shopify-extract.js --retry-failed` after fixing the cause in the message; then record the coverage decision `provided` for `shopify:<entity>`, or show the merchant the row at mapping. **Requires Import Operator** |
995
+ | `shopify_protected_fields_withheld` | A customer/order denial was re-probed with four ordinary 3-record reads and one or more error paths named a newly withheld kind, or a customer had no readable identity after projection. The new row is already upserted and promoted. Return through mapping for that exact coverageId; after mapping, the denied query resets with the narrower projection and finished queries do not rerun. A pathless or unrelated diagnostic uses `shopify_bulk_failed` instead and never narrows the projection |
996
+ | `shopify_bulk_download_failed` | The bulk file could not be downloaded whole (wrong status, size, final newline or a line that does not parse; or expired links) after the bounded retries. Same recovery as `shopify_bulk_failed` |
997
+ | `shopify_bulk_orphan_child` | A bulk file had a child row with no parent, or of a type the adapter does not fold. Same recovery; report it, because the bulk format may have changed |
998
+ | `shopify_extract_count_short` | The extract received fewer customers or orders than Shopify's exact count. The row `shopify:customers` / `shopify:orders` goes back through mapping for the merchant's decision; `--retry-failed` reads the dataset again |
999
+ | `shopify_extract_count_inexact` | Shopify gave only an "at least" count (or the count read failed). Never a pass: same row and recovery |
1000
+ | `shopify_gift_card_codes_unreadable` | Gift cards first appeared during extract. `shopify:gift-card-codes` was added and promoted; return to mapping for its disposition before continuing |
1001
+ | `shopify_gift_card_count_short` | The gift-card bulk read contains fewer cards created by its start than Shopify's exact count. The entry is `failed`; fix the cause and run `shopify-extract.js --retry-failed` for a new gated read. **Requires Import Operator** |
1002
+ | `shopify_gift_card_count_inexact` | Shopify returned a non-`EXACT` count, rejected the read-bound filter, or the count still failed after its bounded retries. Same failed-entry recovery; never treat it as zero or nothing owed |
1003
+ | `shopify_gift_card_amount_invalid` | A gift-card balance or initial value was not a plain decimal. The gated read failed before `done`; fix/report the source shape and use `--retry-failed` |
1004
+ | `shopify_extract_store_mismatch` / `shopify_extract_files_missing` | The extract manifest belongs to another store, or says `complete` but its final files are gone (run `shopify-extract.js --catch-up`). Nothing was read or changed |
1005
+ | `shopify_cli_node_unsupported` | Node.js older than 22.12: switch this terminal to Node.js 22.12 or later (for example the current LTS), check `node --version`, run the session check again. Nothing was installed or read. **Requires Import Operator** |
1006
+ | `shopify_cli_version_changed` | The adapter's CLI is not 4.8.3; reinstall through the session check with `--install` (operator consent) |
1007
+ | `shopify_cli_incompatible` | The adapter's CLI install is damaged; reinstall with `--install` |
1008
+ | `shopify_api_version_unsupported` | Shopify no longer accepts the pinned API version; stop and report — moving the pin is a tested code change |
1009
+
1010
+ ### CMS fallback for recognized plugin capabilities
1011
+
1012
+ A recognized plugin capability reaches CMS only with a signed eligibility entry **and** this
1013
+ migration's merchant approval (`pluginCmsFallback:<capability>`, recorded at the mapping
1014
+ review). Apply only the CMS fallbacks the merchant approved; write nothing for pending or
1015
+ declined ones; never delete or overwrite CMS data an earlier run wrote.
1016
+
1017
+ **Write-time guard (before any CMS write of a recognized capability).** Run it with the
1018
+ capability the plan is about to write, and write zero records for it unless it is allowed:
1019
+
1020
+ ```bash
1021
+ node skills/wix-replatform/scripts/cms-fallback.js guard --project-dir <project> --capability <capability>
1022
+ ```
1023
+
1024
+ Exit `2` means refused: the coverage row is not an approved CMS fallback, the approval fails
1025
+ the shape check or no longer matches the register, or the current resolution digest differs
1026
+ from the one in `plugin-coverage.json`, the mapping plan or the setup plan. Generated import
1027
+ code may call `cmsFallbackWriteGuard(projectDir, { attempted })` from
1028
+ `skills/wix-replatform/lib/plugin-cms-fallback.js` directly. The router is the primary gate;
1029
+ this is defence in depth.
1030
+
1031
+ **Completion.** Pass `cmsFallback: { coverage, refusals, writes, previousReport }` to
1032
+ `createCompletionReport` — `coverage` is `discovery/plugin-coverage.json`, `refusals` the
1033
+ guard's refusals, `writes` this run's CMS writes per approved capability
1034
+ (`{ capability, collections[], count }`), `previousReport` the prior
1035
+ `execution/completion-report.json` when one exists. It derives one operator action per case
1036
+ and persists `cmsFallbackWrites` for the next run:
1037
+
1038
+ | `code` | Severity | When |
1039
+ | --- | --- | --- |
1040
+ | `plugin-cms-fallback-feature-absent` | medium | an approved fallback: records archived in CMS; the plugin's feature is not restored — rebuild or replace it in Wix |
1041
+ | `plugin-cms-fallback-undecided` | high when records exist | eligible but pending (awaiting, stale, quarantined, or target knowledge unavailable): records were not migrated |
1042
+ | `plugin-cms-fallback-declined` | high when records exist | the merchant declined: records were not migrated |
1043
+ | `plugin-cms-fallback-withdrawn` | high | CMS records written by an earlier run under an answer that no longer applies (declined, stale, superseded by a native target, no longer eligible): names the collection(s) and count; the Cutover Operator keeps or removes them by hand |
1044
+ | `plugin-cms-fallback-write-refused` | high | the write-time guard refused a write. **Requires Import Operator:** rerun from the router so coverage and both plans are regenerated, then import again |
1045
+
1046
+ Resolution stays split: a reconciled CMS collection resolves *storage* only; the
1047
+ `feature-absent` item is resolved only by a manual check that the replacement feature works on
1048
+ the Wix site.
1049
+
1050
+ ## Cause attribution
1051
+
1052
+ A failure carried into the completion report or the handoff takes one of exactly three shapes.
1053
+ There is no fourth, and no bare free-text cause:
1054
+
1055
+ | `causeConfidence` | Requires | Renders as |
1056
+ | --- | --- | --- |
1057
+ | `verified-source` | a named destination-side check that ruled the destination out, recorded with its result | the cause, followed by the check |
1058
+ | `verified-target` | a named destination-side check that confirmed a destination or same-run cause | the cause, followed by the check |
1059
+ | `unverified` | nothing | `cause unverified`, and **no cause text at all** |
1060
+
1061
+ The check is recorded as `{ kind, target, result }`. An `unverified` row must not carry a
1062
+ `cause` string — `writeCompletionReport` refuses one that does. A hypothesis printed next to the
1063
+ word "unverified" is read as a finding by everyone skimming. A migration must not copy a source
1064
+ defect forward, and it must equally not invent one: an unchecked "the source data is bad" costs
1065
+ the merchant a trip into their old platform to fix data that was never broken, and it closes the
1066
+ only investigation that would have found the real cause.
1067
+
382
1068
  ## Localhost media before live import
383
1069
 
384
1070
  When source media URLs are local/private, ask the user to choose one path before live
@@ -404,20 +1090,51 @@ Non-media entities may continue if the execution plan clearly excludes or defers
404
1090
  - `migrations/<project>/execution/live-import-summary.json`
405
1091
  - `migrations/<project>/execution/completion-report.json`
406
1092
  - `migrations/<project>/execution/review/completion-summary.md`
1093
+ - `migrations/<project>/execution/review/migration-handoff.md` and its
1094
+ `migration-handoff.json` sidecar — the run's account of the migration, generated **after the
1095
+ last write** from the final outcome record. `generatePostExecutionHandoff` refuses and returns
1096
+ a typed reason when there is no `execution/completion-report.json`; it never writes a clean
1097
+ document from the plan
407
1098
  - `migrations/<project>/execution/recovery-log.json` for every resumed, partial,
408
- missing-only, failed-only, or deferred-only run
1099
+ missing-only, failed-only, deferred-only, or unresolved-only run
1100
+ - `migrations/<project>/execution/unresolved-writes.ndjson` — the re-read queue: one row per
1101
+ record whose latest journal status is unresolved (`succeeded_unverified`, or a `started` row
1102
+ with no terminal follow-on). A projection rebuilt from the attempt journal, never a source of
1103
+ truth; deleting it loses nothing
1104
+ - `migrations/<project>/state/attempts/write-attempts.ndjson` — the append-only per-record
1105
+ ledger. Never rewritten, trimmed or rotated; a validation pass writes to
1106
+ `state/sample/attempts/write-attempts.ndjson` instead and never opens this file
409
1107
  - audit/report artifacts emitted by the shared import runtime
410
1108
 
1109
+ ## Dependency recovery and cutover handoff
1110
+
1111
+ Read `execution/dependency-readiness.json` for task blockers, affected source keys and the
1112
+ named recovery. The gate derives it from current site-bound task passes, latest attempt
1113
+ outcomes, verified local mappings, setup receipt and approved census/field rules; editing
1114
+ the projection cannot unlock writes. Preserve `state/readiness/task-passes.ndjson` across
1115
+ resumes. Legacy or foreign-site evidence requires the named reconciliation/read-back.
1116
+ Never adopt an unverified candidate ID or resend an order to repair dependency evidence.
1117
+
1118
+ Retain record deferrals in the existing attempt journal and reference-fidelity/cardinality
1119
+ gaps in `mapping/review/mapping-gaps.json`. Generate the shared completion report so its
1120
+ `operatorActions` carry the affected work, prerequisites, next action, resolution evidence
1121
+ and **Requires Import Operator** / **Copy prompt for Import Operator** instructions.
1122
+ The Cutover Operator works on another machine: recovery requiring the original project
1123
+ must name that role and prompt. Resolve the underlying producer/approval/reference,
1124
+ reevaluate, then resume only eligible deferred records. These artifacts preserve the handoff;
1125
+ future cutover UI ingestion is not yet wired.
1126
+
411
1127
  ## Recovery artifact contract
412
1128
 
413
1129
  Targeted recovery is a first-class import mode, not a side script. Every selective,
414
- resumed, partial, missing-only, failed-only, or deferred-only run must append one entry to
1130
+ resumed, partial, missing-only, failed-only, deferred-only, or unresolved-only run must append one entry to
415
1131
  `execution/recovery-log.json` and update `execution/live-import-summary.json` through the
416
1132
  same shared summary writer used by the main import path.
417
1133
 
418
1134
  Each recovery entry must include:
419
1135
 
420
1136
  - recovery id
1137
+ - run id — the id the importer minted at process start, so the entry is attributable to a pass
421
1138
  - timestamp
422
1139
  - selection filters
423
1140
  - reason
@@ -427,6 +1144,9 @@ Each recovery entry must include:
427
1144
  - already present
428
1145
  - failed
429
1146
  - deferred
1147
+ - unresolved — its own count, **never** summed into `failed`. A write whose outcome we do not
1148
+ know is read back, not re-sent, and a recovery record that folds it into the failure count
1149
+ reconciles arithmetically and is wrong
430
1150
  - crosswalk changes
431
1151
  - summary changes
432
1152
  - operator-visible outcome
@@ -436,6 +1156,27 @@ Do not overwrite earlier recovery entries. Failed or deferred records from an ea
436
1156
  attempt must remain visible after a later successful recovery; the newer recovery entry and
437
1157
  summary delta explain what changed.
438
1158
 
1159
+ ## Shipping delivery estimates on a finished project
1160
+
1161
+ Before the delivery-estimate fix, generated importers sent the delivery estimate under a name Wix drops, so
1162
+ their shipping options show no delivery time. Earlier migrations are reported, **never edited**.
1163
+ For a finished project whose importer predates that fix, run:
1164
+
1165
+ ```bash
1166
+ node skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js --project-dir <projectDir>
1167
+ ```
1168
+
1169
+ - It only reads Wix (GET); it never POSTs or PATCHes. It reads the crosswalk, the attempt
1170
+ journal, `orchestration/decisions.json`, the extract if present, and Site Properties once.
1171
+ - It writes `execution/shipping-estimates.json`, replaces the shipping `operatorActions` in
1172
+ `execution/completion-report.json`, and regenerates the post-execution handoff.
1173
+ - The only other local write is one crosswalk upsert when a recorded
1174
+ `shipping-option-target-missing:<optionKey>` decision of `recreated:<id>` adopts a new id.
1175
+ - Rerun it after a decision is recorded or a delivery time is entered in Business Manager. That is
1176
+ how a finished project closes its shipping items.
1177
+ - `--list <code>` prints every option recorded under that code, with no Wix call. Use it to relay
1178
+ a list of more than 15 options to the Cutover Operator.
1179
+
439
1180
  ## Completion report contract
440
1181
 
441
1182
  This skill should expect the shared import runtime to emit a machine-readable completion
@@ -454,7 +1195,37 @@ artifact and should preserve it as the primary post-run result.
454
1195
  - grouped failure outcomes
455
1196
  - mismatch rows where source, import, and crosswalk counts do not reconcile
456
1197
  - URL preservation summary counts and artifact paths when URL preservation is enabled
1198
+ - `voucherReconciliation` — the answer to workflow step 6b, exactly one of:
1199
+
1200
+ | Value | Meaning |
1201
+ | --- | --- |
1202
+ | `not-applicable` | the accepted scope excluded coupons, or the source carried no usage-limited coupon |
1203
+ | `reconciled` | the step ran and every voucher reconciled |
1204
+ | `plan-pending-owner` | a plan was produced and is awaiting the owner's decisions per code |
1205
+ | `remedied` | approved remedies were applied and each was confirmed by a post-settle read-back |
1206
+ | `not-run` | the step was due and did not run |
1207
+
1208
+ There is no default. For a run whose scope included coupons, a **missing field reads as
1209
+ `not-run`, never as `not-applicable`** — an absent answer is exactly the state this field
1210
+ exists to make visible, and defaulting it to the benign value rebuilds the defect. `not-run`
1211
+ and `plan-pending-owner` are named in the completion headline and raise the final status to
1212
+ at least `complete_with_warnings` under the highest-severity rule below.
457
1213
  - dashboard/editor/preview destinations
1214
+ - `sourceCoverage[]` and `sourceCoverageRecorded` (report schema v2) — what the source held
1215
+ that was never captured. `writeCompletionReport` joins `discovery/source-coverage.json`,
1216
+ `mapping/review/mapping-gaps.json` and `orchestration/decisions.json` by `coverageId` and folds
1217
+ the result into the one status. An open row is a gated exclusion (no floor; one grouped
1218
+ headline line), an ungated exclusion (`complete_with_warnings`), an accepted loss
1219
+ (`incomplete_with_failures`), or unresolved data — auth-gated, unsupported, skipped by rule,
1220
+ failed or declared-not-observed with a gap or a `declined` decision —
1221
+ (`incomplete_with_mismatches`, one headline line per capability). In-scope auth-gated,
1222
+ capture-failed and declared-not-observed rows also add a `high` `operatorActions[]` row: the
1223
+ source is still the only copy. The writer refuses when a stamped project's coverage file is
1224
+ missing or does not reconcile. A project whose `source-schema.json` has no
1225
+ `sourceCoverageContract` stamp (discovery from before this contract) records
1226
+ `sourceCoverageRecorded: false` and at least `complete_with_warnings`. Recovering a source
1227
+ route or credential is Import Operator work before execution; the handoff's *Not migrated
1228
+ from the source* section only tells the Cutover Operator what to recreate or confirm in Wix.
458
1229
  - artifact references for logs and diagnostics
459
1230
 
460
1231
  `execution/live-import-summary.json` should carry the same `entityCompleteness` accounting
@@ -527,3 +1298,72 @@ for final imported/skipped/failed counts.
527
1298
  - Prefer dry-runs or sample batches before full import.
528
1299
  - Stop on systemic mapping or write failures rather than amplifying bad writes.
529
1300
  - Preserve enough logging to support replay and debugging.
1301
+
1302
+ ### On a destination the run did not create, the import is ADDITIVE — always
1303
+
1304
+ Every rule below is unconditional when `WIX_SITE_STRATEGY=existing`. The site holds the
1305
+ owner's live business data, and nothing in this pipeline can undo a bulk write.
1306
+
1307
+ - **Never delete a pre-existing entity.** No products, categories, collections, posts,
1308
+ media or coupons — not to clear a failed partial import, not to "start clean" before a
1309
+ retry, not to resolve a collision. There is no reason good enough; a failed import is
1310
+ recovered by re-running an idempotent one, not by clearing the target.
1311
+ - **Never wipe the demo catalog.** That cleanup exists for a template's placeholder
1312
+ products on a site this run just scaffolded (see `resources/rp-destination/`). On an
1313
+ existing site those products are the owner's.
1314
+ - **Skip, do not overwrite.** A record already present — by crosswalk, then by the
1315
+ mapping's natural key — is skipped and counted as `skipped`, not rewritten. Only augment
1316
+ a pre-existing entity when the plan the user accepted says so for that entity type.
1317
+ **One narrow exception: a rerun's accepted update path.** A linked record whose
1318
+ source version changed may be updated through its entity's verified update writer, carrying
1319
+ the crosswalk's saved `targetRevision`. The crosswalk check still runs before every create;
1320
+ what the exception replaces is only the blanket skip of linked records, and only for the
1321
+ accepted update path. Matching a *pre-existing* Wix record by natural key never authorizes
1322
+ updating it — that stays the collision policy above.
1323
+ - **Never blank a field the source does not carry.** A source without a field means "no
1324
+ information", not "empty" — writing the empty value deletes data the owner entered by
1325
+ hand. Send partial updates; never a full replace built from source-only fields.
1326
+ - **Report what was left alone.** The completion report must count `skipped` alongside
1327
+ `imported` and `failed`, so the user can reconcile the plan's collision inventory against
1328
+ what actually happened. "Nothing was touched here" is a result, not an omission.
1329
+
1330
+ Default-location inventory completion requires both the Inventory item and the same Catalog variant to agree on availability. The reconciler checks this on fresh writes and no-write reruns. A Catalog disagreement or failed read stays unverified; retain it for recovery without blindly rewriting stock.
1331
+
1332
+
1333
+ ## Contact/product verification before completion
1334
+
1335
+ Execute generated contact/product callers through the shared verified import wrappers.
1336
+ Use the verification-state loader to read `state/write-verification.json` plus atomic
1337
+ batch checkpoints in `state/write-verification-journal/`. It replays committed checkpoints
1338
+ after interruption; the final snapshot compacts them. Published crosswalks carry receipt
1339
+ references, while expected/actual entities remain in protected verification state. Candidate IDs are recovery information, not usable mappings. A crosswalk hit
1340
+ or a `--missing-only` selection still requires target identity/value verification.
1341
+ Preserve uncertain write outcomes and reconcile before retrying; do not create again
1342
+ because the response was lost. Never repair historical contamination by blanket clearing.
1343
+
1344
+ Shared completion inputs must include `siteId`, each contact/product row's intended
1345
+ `sourceKeys`, `verificationKind: "contact"` or `"product"` from the accepted mapping,
1346
+ and `verification[entity]` from the wrapper. Declare `verificationKind: "none"` explicitly
1347
+ for entities outside these comparators; an unknown name without a policy stays incomplete. Count-only completion cannot
1348
+ satisfy these entities. Missing or conflicting evidence yields incomplete status and a
1349
+ reconciliation action. Explicitly empty source sets have no data; empty reports cannot
1350
+ cover a nonempty set. Quick Shopify separately records its product read-back results and
1351
+ keeps stock permission failures partial and resumable; setup still does not write stock.
1352
+
1353
+
1354
+ The mere presence of `state/.lock/` does not mean an importer is running. Each importer
1355
+ owns a uniquely named PID/host claim there, and a resume automatically removes claims
1356
+ whose local process is dead (including after SIGKILL). A live process continues to block
1357
+ concurrent imports. For a claim from another host, an unrecognized legacy file, or a reused
1358
+ PID, first confirm that its importer is stopped on the owning host, then remove only that
1359
+ claim file and rerun the same command. Do not remove a live owner's claim or the whole state
1360
+ folder. An empty legacy `.lock` directory needs no manual cleanup.
1361
+
1362
+ A failed target read keeps the previous verified crosswalk mapping and receipt reference.
1363
+ The current verification report remains partial, so that retained mapping does not turn a
1364
+ failed read into a new completion claim. Revoke mappings when identity is contradicted;
1365
+ value-only differences require the existing update/review flow.
1366
+
1367
+ ## Discovered-set outcome handoff
1368
+
1369
+ After writing the final completion report and before generating the post-execution handoff, run `node scripts/discovered-set-status.js build <projectDir>` in standard mode. It joins the approved discovered scope to actual outcomes, with unknown counts retained as unknown. Its Import Operator prompts stay in the handoff under Urgent Operator Actions; send those prompts to the Import Operator for recovery in the original migration environment. Do not resolve partial, failed, deferred or pending scope by ticking a manual acknowledgement. Only a merchant or Cutover Operator may record completed `manual-open` work through `scripts/discovered-set-status.js resolve`, with short evidence containing no record values. Quick mode keeps its existing path.