The structured coverage rows link required rules to their scenarios. A covered category has a defined check; executable coverage and successful execution require separate evidence. The category map keeps incomplete lifecycle matrices and other missing checks visible as findings.
Applied restoration prevents reopening original blocked work. Restoration retains an inspectable link and exclusions. An edit after restoration planning remains protected. A completed hard deletion offers no restoration. The interaction scenarios use the related capabilities' rule references and identify the shared fixture and observable outcome.
Coverage
Rulegap: FND-PFM-DJE-068
Transitiongap: FND-PFM-DJE-068
Validationcovered
Permissioncovered
Edgecovered
Failuregap: FND-PFM-DJE-068
Boundarycovered
Concurrencycovered
Invariantgap: FND-PFM-DJE-068
Interactioncovered
Test Scenarios
10 scenarios proving CAP-PFM-DJE-008; 4 bound to an existing test.
[
{
"do": "Prepare its restoration plan.",
"expect": "The separate validated job links to the original and retains the overwritten values for eligible records.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#answers a rollback job of its own, linked to the job it compensates"
}
]
Expected
The separate validated job links to the original and retains the overwritten values for eligible records.
[
{
"do": "Plan and apply rollback.",
"expect": "Eight contacts are restored; two exclusions identify changed fields, editors and times while preserving their edits.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#plans a rollback of the eight nobody touched, and refuses the two somebody did"
}
]
Expected
Eight contacts are restored; two exclusions identify changed fields, editors and times while preserving their edits.
Supply an unversioned plan and separately edit a record after a valid plan.
Steps
[
{
"do": "Attempt planning and application.",
"expect": "The unversioned plan creates no job; the later edit produces a conflict.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/tests/integration/rollback-and-retry.integration.spec.ts#refuses a rollback plan with an unversioned item, and writes no rollback job"
}
]
Expected
The unversioned plan creates no job; the later edit produces a conflict.
Prepare delete, running and already-restored job states.
Steps
[
{
"do": "Evaluate rollback availability for each and for a merely planned rollback.",
"expect": "Unsupported cases return their refusal codes; planning alone does not block another plan.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/data-job-actions.spec.ts#refuses Rollback by the code the service would answer"
}
]
Expected
Unsupported cases return their refusal codes; planning alone does not block another plan.
Prepare a job that sets a title and a custom value on ten contacts.
Steps
[
{
"do": "Plan restoration and inspect its refusals.",
"expect": "Those contacts are non-reversible as whole records; their titles are not independently restored.",
"provenance": "proposed",
"source": "react-console:acceptance/crm/playwright/journeys/data-operations/CRM-ACC-0659.spec.ts#CRM-ACC-0659"
}
]
Expected
Those contacts are non-reversible as whole records; their titles are not independently restored.
Use a caller with bulk access but no update permission.
Steps
[
{
"do": "Request rollback planning.",
"expect": "The proposed API proof expects 403.",
"provenance": "proposed",
"source": "macroservice-libraries:packages/data-jobs/src/data-job-actions.spec.ts#offers Rollback for a finished job, requiring the bulk key and the per-record key the plan re-checks"
}
]
Finish an update with reversible changes and blocked input.
Steps
[
{
"do": "Plan a restoration, verify planning alone leaves retry available, apply the restoration, and attempt retry of the original.",
"expect": "Only application of restoration prevents later retry; restored values stay intact.",
"provenance": "proposed",
"source": "macroservice-libraries:packages/data-jobs/src/tests/integration/rollback-and-retry.integration.spec.ts#refuses to retry a job that has been rolled back, so its blocked rows are not written after the undo; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#plans it already validated, because planning a rollback IS validating it; macroservice-libraries:packages/data-jobs/README.md#Rolling a job back"
}
]
Expected
Only application of restoration prevents later retry; restored values stay intact.
Data
Finish an update with reversible changes and blocked input.
Complete a contact title update and edit one affected title afterward.
Steps
[
{
"do": "Plan and apply restoration, then inspect both jobs and the excluded contact.",
"expect": "The restoration is linked to the original; reversible contacts are restored and the later edit remains with an exclusion.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#stamps the job on the revision, so every record one job changed can be listed; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#plans it already validated, because planning a rollback IS validating it; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#says which field changed since the job and when, without saying what it was changed to"
}
]
Expected
The restoration is linked to the original; reversible contacts are restored and the later edit remains with an exclusion.
Data
Complete a contact title update and edit one affected title afterward.
Complete an update and plan its restoration using current versions.
Steps
[
{
"do": "Edit a reversible contact after planning and approve the restoration.",
"expect": "The later edit survives as a changed-since conflict while other reversible contacts are restored.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-versions.integration.spec.js#skips the contact that changed after the validation as a named conflict; services-crm:modules/data-jobs/services/operations/contact-update.ts:prevalidate; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#says which field changed since the job and when, without saying what it was changed to; macroservice-libraries:packages/data-jobs/src/tests/integration/rollback-and-retry.integration.spec.ts#refuses a rollback plan with an unversioned item, and writes no rollback job"
}
]
Expected
The later edit survives as a changed-since conflict while other reversible contacts are restored.
Data
Complete an update and plan its restoration using current versions.
[
{
"do": "Validate and approve deletion, inspect its receipts, and request rollback.",
"expect": "Deleted records remain absent and the unsupported restoration creates no compensating job.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-delete.integration.spec.js#removed, per collection, exactly the number of rows the validation had counted; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-rollback.integration.spec.js#refuses the rollback, because there is no undo for a hard delete; macroservice-libraries:packages/data-jobs/src/data-job-actions.spec.ts#does not offer Rollback once a rollback has been applied, by the code the route answers, and still does while one is only planned"
}
]
Expected
Deleted records remain absent and the unsupported restoration creates no compensating job.