Governed Migration Execution
Execute PQC migration plans with hash-bound review, four-eyes approval, durable waves, recovery, and reconciliation evidence.
QNSI treats cryptographic migration as a controlled change, not a bulk key-rotation button. The execution workflow binds operator approval to an exact dry-run, records every control event, divides large estates into durable waves, and stops ambiguous provider outcomes from being reported as successful without evidence.
New execution is entitlement and feature gated. Read-only execution history remains available so operators can investigate prior work even when the execution feature is disabled.
Control flow
- Discover and assess. Complete discovery and review the assets selected by the current migration plan.
- Dry-run. QNSI returns targeted assets, connector availability, warnings, estimated
duration, and a SHA-256
planSnapshotHash. - Request execution. Submit that exact hash. QNSI recomputes the plan and rejects the
request with
409if anything changed. - Approve. A different authenticated operator approves the pending execution. The requester cannot approve their own change.
- Execute in waves. QNSI dispatches durable per-asset actions in bounded waves and records progress, rollback metadata, and control events.
- Confirm or reconcile. Customer-driven cutovers require confirmation. Ambiguous managed provider outcomes require verification evidence before their state can advance.
- Export evidence. Execution, wave, action, control-event, and reconciliation records feed the migration evidence pack.
Dry-run and hash confirmation
curl -sS -X POST \
https://api.qnsi.heossi.com/proxy/crypto/v1/migration/dry-run \
-H "Authorization: Bearer $TOKEN" \
-H "x-qnsp-tenant: $TENANT_ID"
Preserve the returned planSnapshotHash, review the target counts and warnings, then request
execution:
curl -sS -X POST \
https://api.qnsi.heossi.com/proxy/crypto/v1/migration/execute \
-H "Authorization: Bearer $TOKEN" \
-H "x-qnsp-tenant: $TENANT_ID" \
-H "content-type: application/json" \
--data '{"planSnapshotHash":"<64-hex-character-hash>"}'
A hash mismatch means the estate or plan changed after review. Run a new dry-run; do not reuse or override the old confirmation.
Four-eyes approval
The execution enters a pending-approval state. A second operator with migration:execute
permission approves it:
curl -sS -X POST \
"https://api.qnsi.heossi.com/proxy/crypto/v1/migration/executions/$EXECUTION_ID/approve" \
-H "Authorization: Bearer $APPROVER_TOKEN" \
-H "x-qnsp-tenant: $TENANT_ID"
QNSI records requester, approver, timestamps, the approved plan hash, and the authenticated principal behind each control action.
Pause, resume, and cancel
Pause stops dispatching new asset actions while preserving completed work and durable state:
curl -sS -X POST \
"https://api.qnsi.heossi.com/proxy/crypto/v1/migration/executions/$EXECUTION_ID/pause" \
-H "Authorization: Bearer $TOKEN" \
-H "x-qnsp-tenant: $TENANT_ID" \
-H "content-type: application/json" \
--data '{"reason":"Change window closed pending application validation"}'
Resume and cancel use:
POST /crypto/v1/migration/executions/:id/resume
POST /crypto/v1/migration/executions/:id/cancel
Every pause, resume, approval, cancellation, cutover confirmation, and reconciliation is written to both the execution control ledger and the tenant audit stream.
Durable waves and recovery
Large estates are divided into ordered migration waves. Inspect them together with per-asset actions:
GET /crypto/v1/migration/executions/:id/waves
GET /crypto/v1/migration/executions/:id/asset-actions
GET /crypto/v1/migration/executions/:id/control-events
GET /crypto/v1/migration/cutover-progress
Workers claim execution through a renewable lease. If a worker exits, QNSI recovers pending or lease-expired work without discarding completed actions. Recovery does not silently convert an unknown provider result into success.
Customer-driven cutover
Some providers or workloads require the customer to switch an application reference after
QNSI prepares the destination key. The asset remains awaiting_cutover until an authorized
operator confirms it:
POST /crypto/v1/migration/asset-actions/:id/confirm-cutover
Confirm only after the application uses the destination key reference and rollback has been validated.
Reconcile ambiguous provider outcomes
A timeout after sending a provider request does not prove failure: the provider may have applied the change before the response was lost. QNSI marks that action as requiring verification. An operator then supplies evidence:
curl -sS -X POST \
"https://api.qnsi.heossi.com/proxy/crypto/v1/migration/asset-actions/$ACTION_ID/reconcile" \
-H "Authorization: Bearer $TOKEN" \
-H "x-qnsp-tenant: $TENANT_ID" \
-H "content-type: application/json" \
--data '{
"outcome":"confirmed_completed",
"evidence":{
"providerRequestId":"provider-request-123",
"verificationMethod":"Read destination key metadata from provider API",
"verifiedAt":"2026-07-20T00:00:00.000Z",
"artifactHash":"<sha256-of-retained-verification-artifact>"
}
}'
Allowed outcomes are confirmed_completed and confirmed_not_applied. Reconciliation records
are immutable and available at:
GET /crypto/v1/migration/executions/:id/reconciliation-events
Operating checklist
- Complete discovery before trusting posture or migration targets.
- Store the dry-run and plan hash with the change ticket.
- Use separate requester and approver identities.
- Start with a bounded wave and validate application behavior before expanding.
- Pause when the change window closes; do not cancel merely to stop dispatch.
- Treat
verification_requiredas unresolved until provider evidence is retained and hashed. - Export the evidence pack after the final wave and keep it with the rollback record.
See Migration Checklist, Migration Journey, and API Route Catalog for the complete customer workflow and wire surface.