19 LANG_PUBLIC_TOPOLOGY_UNRESOLVED: ['high', 'before multilingual planning', 'Update the named public-language evidence, rerun topology discovery, and leave default import results unchanged.', 'Current topology artifact proves the locale state.'],
20 LANG_PUBLIC_SOURCE_GAP: ['medium', 'before launch', 'Rerun public discovery for the named locale/object/field if new public evidence is supplied; do not request private credentials in this phase. If the owner accepts the gap, record accept-gap with the decision recorder.', 'Imported value or a current accept-gap decision.'],
21 LANG_PUBLIC_IDENTITY_UNRESOLVED: ['high', 'during discovery and mapping', 'Capture an API-supported stable source-to-Wix member ID or record an owner-approved accept-gap decision; never join by text or position.', 'Pairing receipt or a current accept-gap decision.'],
22 LANG_TARGET_SETUP_CONFIRMATION_REQUIRED: ['high', 'before multilingual setup', 'Show the owner the exact setup proposal, record confirm-setup or decline-setup with the decision recorder, and rerun setup only after a matching confirmation.', 'Current decision plus locale/settings read-back, or a matching decline.'],
23 LANG_TARGET_LOCALE_NOT_READY: ['high', 'before sidecar mapping', 'Inspect the setup result, wait only within the bounded policy, and resume after locale/settings read-back passes.', 'Current locale/settings read-back.'],
24 LANG_TARGET_DEFAULT_CONTENT_NOT_READY: ['high', 'after default import', 'Confirm the named default-object receipt, refresh translation content, and resume only when the entity and keys resolve.', 'Current capability manifest resolves the entity and keys.'],
25 LANG_TARGET_SCHEMA_UNRESOLVED: ['high', 'during sidecar mapping', 'Refresh the named Wix schema/content inventory and resume only when its schema, parent, and concrete key are proven.', 'Current capability manifest resolves the schema chain.'],
26 LANG_TARGET_FIELD_UNSUPPORTED: ['medium', 'during mapping', 'Preserve the named unsupported-field gap; record accept-gap only after the owner accepts it, and rerun only after Wix exposes a compatible writable field.', 'Compatible current manifest or a current accept-gap decision.'],
27 LANG_TARGET_PLAN_BLOCKED: ['high', 'before execution', 'Inspect the named plan row, assign a specific supported reason when possible, and do not mutate the target while it remains generic.', 'Rebuilt plan row has a specific decision and reason.'],
28 LANG_TARGET_MUTATION_UNVERIFIED: ['high', 'before first route use', 'Run the named documented route on a disposable target, record versioned request/read-back evidence without secrets, and rebuild the plan; never mark it verified from documentation alone.', 'Versioned disposable-site contract evidence.'],
29 LANG_RECOVERY_JOURNAL_NOT_READY: ['high', 'before value mutation', 'Repair or provision the administrator-only recovery collection, verify its permissions and typed-row read-back, then rebuild the plan.', 'Collection schema and permissions check plus typed-row read-back digest.'],
30 LANG_TARGET_TRANSLATION_OVERWRITTEN: ['high', 'after verified overwrite and before launch', 'Tell the owner which named values were replaced and how to request restore, then record ack-overwrite-notice with the decision recorder. If the owner requests restore, record request-restore with the recovery row ID.', 'Recovery reference and verified replacement plus a current acknowledgement decision.'],
31 LANG_TRANSLATION_RESTORE_REQUIRED: ['high', 'after owner request', 'Run the multilingual restore command for the named recovery-row ID; stop if the live replacement digest no longer matches, and retain a refusal as an open action.', 'Passing restore receipt and target read-back.'],
32 LANG_SOURCE_TRANSLATION_REMOVED: ['medium', 'during catch-up', 'Leave the named target field unchanged. If the owner accepts retaining it, record accept-retained-removal with the decision recorder; otherwise rerun only after the source supplies a value.', 'Source value returns or a current accept-retained-removal decision.'],
33 LANG_RECOVERY_JOURNAL_REMOVE: ['medium', 'after the cutover recovery window', 'After the owner separately authorizes removal, record authorize-journal-removal, delete the recovery collection without exporting it, and prove it is absent.', 'Current authorization decision and collection-absence read-back.'],
34 LANG_PUBLIC_READBACK_MISMATCH: ['high', 'after an attempt', 'Reconcile the named write step with Wix, restore from the target recovery row if required, and retry only unverified fields.', 'Passing value, publication, visibility, and snapshot receipt.'],
35 LANG_PRIVATE_SOURCE_DEFERRED: ['medium', 'after public verification', 'Route the named field to the private-source phase. If the owner accepts leaving it unmigrated, record accept-gap with the decision recorder.', 'Private-source receipt or a current accept-gap decision.'],
36 LANG_FRONTEND_DEFERRED: ['medium', 'after application receipt', 'Route the named presentation field to frontend work. If the owner accepts leaving it out, record accept-gap with the decision recorder.', 'Frontend receipt or a current accept-gap decision.'],
101 prerequisites: ['Owner restore request is recorded with a recovery row ID.', 'Resume the original migration environment with destination credentials.'],
102 resolutionEvidence: template[3],
103 }];
104 });
105}
106
107function durableOverwriteAction(row) {
108 const stored = row.operatorAction;
109 if (!stored || stored.reasonCode !== 'LANG_TARGET_TRANSLATION_OVERWRITTEN') return null;
206 prerequisites: ['Recovery window has ended.', 'Owner separately authorizes deletion.', 'Resume the original migration environment with destination credentials.'],
221 if (ready) headline.push({ code: 'LANG_PUBLIC_READY', entity: `multilingual-public:${locale}`, subtype: locale, message: `${locale}: public application translations are verified and published; frontend work is separate.` });