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.
Keyed submission remains identifiable in inspection. Inspection reconciles partial processing. Restoration retains an inspectable link and exclusions. The interaction scenarios use the related capabilities' rule references and identify the shared fixture and observable outcome.
Coverage
Rulecovered
Transitiongap: FND-PFM-DJE-065
Validationcovered
Permissioncovered
Edgegap: FND-PFM-DJE-065
Failuregap: FND-PFM-DJE-065
Boundarycovered
Concurrencygap: FND-PFM-DJE-065
Invariantcovered
Interactioncovered
Test Scenarios
10 scenarios proving CAP-PFM-DJE-005; 5 bound to an existing test.
01Job visibility follows the caller’s authoritypermissionapinegativetest
Create jobs from two submitters, only one with workspace-wide visibility.
Steps
[
{
"do": "List jobs and attempt to read the other submitter’s job.",
"expect": "The privileged caller sees both; the other sees only their own and receives not found for the other job.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/list-contact-data-jobs.integration.spec.js#answers a holder of the bulk key both jobs, whoever submitted them (premise)"
}
]
Expected
The privileged caller sees both; the other sees only their own and receives not found for the other job.
[
{
"do": "Filter by a valid state, an impossible state and an unknown parameter.",
"expect": "The valid filter narrows results; invalid filter input receives 400.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/e2e/data-jobs.e2e.spec.js#refuses a state no job can be in with 400, rather than a filter it quietly ignores"
}
]
Expected
The valid filter narrows results; invalid filter input receives 400.
[
{
"do": "Read successive result and refusal pages and apply an outcome filter.",
"expect": "Rows remain in sequence without repetition and match the requested outcome.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers a page of results in item order, each with its outcome"
}
]
Expected
Rows remain in sequence without repetition and match the requested outcome.
[
{
"do": "Inspect the changed contacts’ history.",
"expect": "Revisions identify job source, submitter and batch.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#records a job as the source of that revision, not a console"
}
]
Expected
Revisions identify job source, submitter and batch.
[
{
"do": "Run the planned retention task, inspect the job and request rollback.",
"expect": "Expired evidence is removed and rollback is refused outside its window.",
"provenance": "proposed",
"source": "services-platform:docs/milestones/PLAT-M19-data-job-engine-foundations.md#D6"
}
]
Expected
Expired evidence is removed and rollback is refused outside its window.
Prepare idempotency entries of different ages in two workspaces.
Steps
[
{
"do": "Purge one workspace twice.",
"expect": "Only its entries older than 30 days disappear; the second purge removes nothing.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/tests/integration/submission-purge.integration.spec.ts#deletes the tenant's rows older than 30 days and keeps the rest, the row exactly 30 days old included"
}
]
Expected
Only its entries older than 30 days disappear; the second purge removes nothing.
[
{
"do": "Search for a producer key, inspect refusal-code counts and request refusal export.",
"expect": "The matching results, grouped totals and generated data export are available.",
"provenance": "proposed",
"source": "services-platform:docs/milestones/plans/PLAT-M21-plan.md#Added 2026-10-22 (from PLAT-M19 review R3): results at scale, server side"
}
]
Expected
The matching results, grouped totals and generated data export are available.
Create an authorized caller and two selected contacts.
Steps
[
{
"do": "Submit a keyed update, repeat it, process it, and read its job and result pages.",
"expect": "Both submissions identify the same job and inspection contains each input position once.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the second submission with the first job, having written nothing; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the next page from the cursor the last one gave, so no item is read twice"
}
]
Expected
Both submissions identify the same job and inspection contains each input position once.
Data
Create an authorized caller and two selected contacts.
Prepare valid, invalid and inaccessible contacts in one job.
Steps
[
{
"do": "Process the job and read all result and refusal pages alongside the changed records' history.",
"expect": "The pages account for each position; eligible changes have attribution and refusals disclose no record values.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses the other five, counting each as what refused it; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#names the rule a refused value broke, and quotes no value of the record; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the next page from the cursor the last one gave, so no item is read twice; 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"
}
]
Expected
The pages account for each position; eligible changes have attribution and refusals disclose no record values.
Data
Prepare valid, invalid and inaccessible contacts in one job.
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.