Use when a repo has stale Pulse onboarding, legacy Python hooks, or a partial pre-3.0.0 install that needs Pulse v2-to-v3 migration.
Use this skill when a repo already has Pulse traces from an older layout and needs a safe path onto the current 3.x structure.
This is a migration wrapper, not a second installer. It reuses the existing onboarding authority from using-pulse/scripts/onboard_pulse.mjs so the mutation rules stay in one place.
pulse:preflight or pulse:using-pulse says the repo needs Pulse migration.pulse/onboarding.json exists but points at an older plugin version.codex/hooks.json or .codex/hooks/ still references legacy Python Pulse hooksMigration is read-only by default.
Preserve these boundaries without exception:
.codex/hooks.json entries.pulse/memory/, checkpoints, handoffs, runs, and other repo-local Pulse datacompact_prompt unless the user explicitly approves replacementCheck first:
node plugins/pulse/skills/v2-to-v3-migration/scripts/migrate_pulse_v2_to_v3.mjs --repo-root <project_root>
Apply after approval:
node plugins/pulse/skills/v2-to-v3-migration/scripts/migrate_pulse_v2_to_v3.mjs --repo-root <project_root> --apply
Only if the user explicitly approved replacing an unmanaged compact prompt:
node plugins/pulse/skills/v2-to-v3-migration/scripts/migrate_pulse_v2_to_v3.mjs --repo-root <project_root> --apply --allow-compact-prompt-replace
The script reports one of:
up_to_date — repo already matches the current Pulse layoutneeds_migration — repo needs migration or onboarding updates before normal v3 bootstrap can continuemissing_runtime — Node.js 18+ is not available, so migration cannot runThe payload also surfaces:
legacy_signals — why this looks like v2 or a stale installactions — the underlying onboarding actions that would be appliedrequires_confirmation — whether unmanaged compact_prompt replacement would need approvalpreservation_guarantees — the non-destructive boundaries the wrapper keeps intactlegacy_signals and actions.requires_confirmation = true, explain that Pulse will preserve the existing unmanaged compact prompt unless the user explicitly approves replacement.--apply.details.onboarding_apply.managed_assets.migration_summary.normalization_queue.pulse:using-pulse.The script owns safe file movement, provenance, conflict handling, and deterministic fallback formatting. The skill owns semantic normalization after the script finishes.
Use the queue, not a fresh repo-wide scan:
normalization_queue.learning_memory[]normalization_queue.critical_patterns[]Each queue entry includes bounded rewrite inputs:
source_pathdestination_pathsource_hashtarget_kinddestination_contains_fallbackNormalization rules:
.pulse/memory/learnings/, .pulse/memory/corrections/, and .pulse/memory/ratchet/.pulse/memory/critical-patterns.md as clean canonical entriesDo not hardwire a provider-specific API client into the migration script. This skill-level pass should be done by prompting the model after the script run.
up_to_date, continue through normal bootstrap.needs_migration, do not continue into planning or execution until the repo is updated or the user declines.missing_runtime, stop and have the user install or upgrade Node.js first.