---
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
finding_evidence:
  - finding: FND-PFM-MTD-001
    source: 'specs/PRODUCT-AREAS.md (MOD-PFM-MTD row, before this draft); services-platform:docs/milestones/PLAT-M11-eligibility-rules.md; react-console tree at baf6dae3'
  - finding: FND-PFM-MTD-002
    source: 'react-console:acceptance/extensibility/inventory/capabilities.json; services-platform:modules/custom-objects/aws/logic/business-events.lambda.ts'
  - finding: FND-PFM-MTD-003
    source: 'services-platform:docs/milestones/PLAT-M6-custom-record-relationships.md (Status, Engineering Verified, Runs)'
  - finding: FND-PFM-MTD-004
    source: 'services-platform:docs/milestones/PLAT-M7-custom-record-loads-reports-events.md; modules/custom-objects/aws/logic/business-events.lambda.ts; modules/associations/aws/api/association-data-jobs.routes.ts'
  - finding: FND-PFM-MTD-005
    source: 'services-platform:docs/milestones/PLAT-M10-image-and-file-fields.md (Status In Progress); docs/files.md#Limits; docs/assets.md#10. Decisions and known limits'
  - finding: FND-PFM-MTD-006
    source: 'react-console:lib/layout-designer/persistence.ts; app/(console)/console/[tenantId]/configuration/[module]/recordLayouts/[recordType]/designer/page.tsx; services-platform:docs/standards/custom-field-capability.md#4. What enabling custom fields requires'
  - finding: FND-PFM-MTD-007
    source: 'services-platform:aws/api/platform.routes.ts:platformPermissionCatalog; aws/platform.service.ts (METADATA_PERMISSIONS, FIELD_LABELS_PERMISSIONS, LAYOUTS_PERMISSIONS)'
  - finding: FND-PFM-MTD-008
    source: 'services-platform:modules/layouts/purposes.ts:LAYOUT_PURPOSES; modules/metadata/capabilities/approved-custom-field-objects.ts; docs/standards/custom-field-capability.md#4. What enabling custom fields requires'
  - finding: FND-PFM-MTD-009
    source: 'services-platform:modules/custom-objects/services/persistence/custom-objects.ts (limits schema); docs/custom-objects.md#1. The object: platform.custom_objects (limits); tests/acceptance/custom-objects/journeys/definitions/CO-ACC-0014.spec.js#step 5; journeys/records/CO-ACC-0163.spec.js#step 3'
  - finding: FND-PFM-MTD-010
    source: 'services-platform:modules/custom-objects/services/maintenance/tenant-participant.ts; docs/custom-objects.md#Import, export and reset; tests/acceptance/custom-objects/journeys/definitions/CO-ACC-0015.spec.js#step 4: the impl admin puts vessel back unchanged and is refused: its display property is gone'
  - finding: FND-PFM-MTD-011
    source: 'services-platform:tests/acceptance/custom-objects/journeys/data-operations/CO-ACC-0402.spec.js (steps 6 and 7)'
  - finding: FND-PFM-MTD-012
    source: 'services-platform:docs/metadata.md#Data types and display types (html); modules/custom-objects/services/persistence/custom-object-records.ts (no sanitising step)'
  - finding: FND-PFM-MTD-013
    source: 'services-platform:modules/associations/services/persistence/association-types.ts (from_required, to_required stored only); docs/associations.md#1. The tables'
  - finding: FND-PFM-MTD-014
    source: 'services-platform:docs/associations.md#The contract for another service (docs/debt/association-owner-obligations.md); modules/custom-objects/services/persistence/custom-object-records.ts:registerRecordDeletionCheck'
  - finding: FND-PFM-MTD-015
    source: 'services-platform:docs/custom-objects.md#19. Records: portal rules; #20. Records: exposure'
  - finding: FND-PFM-MTD-016
    source: 'services-platform:docs/custom-objects.md#13. Records: the rules every write enforces (Defaults)'
  - finding: FND-PFM-MTD-017
    source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:rebuildUniqueValues; modules/metadata/services/persistence/custom-fields.ts:assertUniqueRuleAllowed'
  - finding: FND-PFM-MTD-018
    source: 'react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S08.spec.ts (title and header comment); services-platform:docs/milestones/PLAT-M6-custom-record-relationships.md#Changes requested'
  - finding: FND-PFM-MTD-019
    source: 'services-platform:docs/record-history.md#What is open; docs/associations.md#7a. History'
  - finding: FND-PFM-MTD-020
    source: 'react-console:acceptance/custom-objects/README.md; acceptance/custom-objects/inventory/*.json (evidence_commits)'
  - finding: FND-PFM-MTD-021
    source: 'services-platform:docs/metadata.md#Capabilities: which objects may have custom fields, forms and layouts (R2-ARCH-001); docs/milestones/plans/PLAT-M9-plan.md#PLAT-M9-S05'
  - finding: FND-PFM-MTD-022
    source: 'services-platform:docs/proposals/custom-objects/09-decisions.md#D-16; modules/associations/services/persistence/association-types.ts:MAX_QUERY_ASSOCIATION_TYPES'
  - finding: FND-PFM-MTD-023
    source: 'services-platform:modules/custom-objects/aws/api/custom-objects.routes.ts:getCustomObjectsNavigation; docs/custom-objects.md#9. Routes'
  - finding: FND-PFM-MTD-024
    source: 'services-platform:modules/{metadata,layouts,custom-objects,associations,files}/aws/api/*.routes.ts'
  - finding: FND-PFM-MTD-025
    source: 'services-platform:docs/custom-objects.md#The placement of an object'
  - finding: FND-PFM-MTD-026
    source: 'services-platform:docs/milestones/PLAT-M6-custom-record-relationships.md#Runs; docs/milestones/PLAT-M5-custom-records.md#Runs'
  - finding: FND-PFM-MTD-027
    source: 'services-platform:docs/metadata.md#Capabilities (The transition); docs/milestones/PLAT-M9-custom-field-capability.md#Known follow-ups'
  - finding: FND-PFM-MTD-028
    source: 'services-platform:modules/custom-objects/services/access/record-access.ts; docs/milestones/PLAT-M5-custom-records.md#PLAT-M5 D10'
  - finding: FND-PFM-MTD-029
    source: 'services-platform:docs/custom-objects.md#Events (docs/debt/association-update-events.md, docs/debt/merge-association-events.md)'
  - finding: FND-PFM-MTD-030
    source: 'services-platform:docs/custom-objects.md#Import, export and reset (Export; docs/debt/custom-object-export-e2e.md)'
  - finding: FND-PFM-MTD-31
    source: briefs/planning/platform-metadata.brief.md (absent at docs starting commit and origin/master)
  - finding: FND-PFM-MTD-32
    source: 'services-platform:modules/metadata/services/field-lifecycle/archive-field.ts:archiveField'
  - finding: FND-PFM-MTD-33
    source: 'services-platform:modules/metadata/services/persistence/custom-fields.ts:createCustomField'
  - finding: FND-PFM-MTD-34
    source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:requireRecordRules'
  - finding: FND-PFM-MTD-35
    source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:deleteRecord'
  - finding: FND-PFM-MTD-36
    source: 'services-platform:modules/custom-objects/services/persistence/custom-objects.ts:activateCustomObject; services-platform:modules/custom-objects/services/persistence/custom-objects.ts:archiveCustomObject'
  - finding: FND-PFM-MTD-37
    source: 'services-platform:modules/metadata/services/registration/register-application.ts:registerApplication; services-platform:modules/custom-objects/services/persistence/business-events.ts:sweepBusinessEvents; services-platform:modules/custom-objects/services/persistence/record-revisions.ts:purgeTenantRecordRevisions; services-platform:modules/associations/services/maintenance/tenant-participant.ts'
  - finding: FND-PFM-MTD-38
    source: 'services-platform:modules/files/services/uploads/issue-upload.ts:issueUpload; services-platform:modules/files/services/persistence/file-uploads.ts:requireUploadDeclaration'
  - finding: FND-PFM-MTD-39
    source: 'services-platform:modules/metadata/tests/integration/services/registration/register-application.integration.spec.js; services-platform:modules/metadata/tests/e2e/custom-fields.e2e.spec.js; react-console:components/configuration/fields/field-editor.tsx'
  - finding: FND-PFM-MTD-40
    source: 'services-platform:modules/associations/services/persistence/associations.ts:updateAssociation; services-platform:modules/associations/services/persistence/associations.ts:endAssociation; services-platform:modules/associations/services/persistence/associations.ts:deleteAssociation'
  - finding: FND-PFM-MTD-041
    source: 'services-platform:modules/custom-objects/history/custom-object-record-history.config.ts:presentationOf; services-platform:docs/record-history.md#What is open'
  - finding: FND-PFM-MTD-042
    source: 'services-platform:modules/custom-objects/services/assets/custom-object-record-assets.ts (header: no cleanup functions yet); docs/debt/custom-object-asset-cleanup.md; docs/assets.md#7. The lifecycle record and cleanup'
  - finding: FND-PFM-MTD-043
    source: 'services-platform:modules/metadata/services/field-lifecycle/archive-field.ts:archiveField; modules/quick-search/services/rebuild/request-rebuild.ts:startRequestedRebuild; docs/jobs.md (startJobOrLeaveToReconciler for API-facing submitters)'
  - finding: FND-PFM-MTD-044
    source: 'services-platform:modules/quick-search/services/configuration/degrade-fields.ts:degradeRetiredFields, QUICK_SEARCH_RETIREMENT_REBUILD_LIMIT; modules/metadata/services/registration/register-application.ts:registerApplication'
  - finding: FND-PFM-MTD-045
    source: 'services-platform:modules/associations/services/maintenance/tenant-participant.ts (RESET_TABLES: the associations only); modules/tenants/services/lifecycle/reset-participants.ts (keeps the association types); docs/associations.md#8. Tenant lifecycle (says a reset empties both); planning BR-CAP-PFM-MTD-019-10'
  - finding: FND-PFM-MTD-046
    source: 'react-console:lib/custom-objects/designer/pending-owner.ts; lib/custom-objects/designer/save.ts:activateObject'
  - finding: FND-PFM-MTD-047
    source: 'react-console:lib/forms/custom-objects/owner.ts:applyOwnerChange; components/console/custom-objects/record-editor.tsx:settleOwner'
  - finding: FND-PFM-MTD-048
    source: 'react-console:lib/configuration/fields/live-adapter.ts (saveRules, arrangeFields); lib/configuration/fields/field-rules.ts:FieldRulesNotSavedError'
  - finding: FND-PFM-MTD-049
    source: 'react-console:components/configuration/resources/presentation.tsx (layoutSeeds, recordLayoutResources); lib/configuration/areas.ts (record-layouts targets)'
  - finding: FND-PFM-MTD-050
    source: 'react-console:lib/configuration/fields/record-type-source.ts:selectCustomFieldObjects; services-platform:modules/metadata/aws/api/metadata.routes.ts (listObjects ?capability=)'
  - finding: FND-PFM-MTD-051
    source: 'react-console:components/record-explorer/use-recipe-explorer.ts (createGenerateAsk); lib/record-explorer/ask.ts; lib/api/generate-query.ts; services-platform:modules/queries/aws/api/queries.routes.ts (generate); specs/platform/metadata/MODULE.md (no inference sentence)'
  - finding: FND-PFM-MTD-052
    source: 'services-platform:docs/business-events.md#4. Delivery: the dispatcher, the consumer, the intake; modules/custom-objects/services/dispatch/business-events.ts; services/persistence/business-events.ts:sweepBusinessEvents'
  - finding: FND-PFM-MTD-053
    source: 'services-platform:docs/files.md#What is recorded (docs/debt/file-uploads-ledger-pruning.md); modules/files/db/file-uploads.table.ts'
  - finding: FND-PFM-MTD-054
    source: 'services-platform:docs/layouts.md#The capability role (follow-up for platform-database: CAPABILITY_ROLES)'
  - finding: FND-PFM-MTD-055
    source: 'specs/platform/metadata/MODULE.md (does_not_own: data-job orchestration owner MOD-PFM-OPS); specs/PRODUCT-AREAS.md (MOD-PFM-DJE owns modules/data-jobs/**)'
  - finding: FND-PFM-MTD-082
    source: 'services-platform:tests/acceptance/custom-objects/deployed/associations/CO-ACC-0256.spec.js#steps 2 and 3'
    provenance: test
    note: 'The original detailed scenario also claimed a restricting deletion through CRM, but the cited deployed test only executes an owner cascade. The scenario is narrowed to the existing cascade assertions; restricting CRM deletion still needs a dedicated executable case.'
testing_coverage_gaps:
  - id: FND-PFM-MTD-063
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-001
      - ATS-PFM-MTD-001
      - BR-CAP-PFM-MTD-001-10
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-001-keep-platform-s-catalogue-of-record-types-equal-to-what-each.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-001-registered-declaration-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-001-register-an-application-s-record-types-at-deploy.md
    missing_categories:
      - permission
      - edge
      - concurrency
    rules_without_scenarios:
      - BR-CAP-PFM-MTD-001-10
    scenarios_without_executables:
      - ATS-PFM-MTD-001-08
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: IAM invocation of platform_metadata_registration (no permission key)
          where_checked: api
          scope: global
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-001
        transitions:
          - from: unregistered
            to: live
            trigger: A deploy submits a first declaration.
            source: 'services-platform:modules/metadata/tests/integration/services/registration/register-application.integration.spec.js#resolves a field the manifest says nothing a'
          - from: live
            to: live
            trigger: A deploy submits an existing declaration again.
            source: 'services-platform:modules/metadata/services/registration/register-application.ts:registerApplication'
          - from: live
            to: retired
            trigger: A deploy omits a previously registered declaration.
            source: 'services-platform:modules/metadata/tests/integration/services/registration/register-application.integration.spec.js#revives the fields when the full manifest returns'
          - from: retired
            to: live
            trigger: A deploy restores an omitted declaration to its manifest.
            source: 'services-platform:modules/metadata/tests/integration/services/registration/register-application.integration.spec.js#revives the fields when the full manifest returns'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-001-04
      - INV-DOM-PFM-MTD-001-05
      - INV-DOM-PFM-MTD-001-06
      - INV-DOM-PFM-MTD-001-07
      - INV-DOM-PFM-MTD-001-08
    workflow_seams:
      - workflow: WF-PFM-MTD-001
        capabilities: &ref_0
          - CAP-PFM-MTD-001
          - CAP-PFM-MTD-003
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-001-register-an-application-s-record-types-at-deploy.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-064
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-002
      - ATS-PFM-MTD-002
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-002-tell-every-screen-what-fields-a-record-type-has-and-how-each.md
    missing_categories:
      - validation
      - permission
      - edge
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-002-07
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.metadata.read
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-001-01
      - INV-DOM-PFM-MTD-001-02
      - INV-DOM-PFM-MTD-001-03
      - INV-DOM-PFM-MTD-001-04
      - INV-DOM-PFM-MTD-001-05
      - INV-DOM-PFM-MTD-001-08
    workflow_seams: []
    provenance: unknown
  - id: FND-PFM-MTD-065
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-003
      - ATS-PFM-MTD-003
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-003-offer-custom-fields-forms-and-layouts-only-on-the-record-types.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-001-register-an-application-s-record-types-at-deploy.md
    missing_categories:
      - edge
      - failure
      - boundary
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-003-07
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.metadata.read
          where_checked: api
          scope: tenant
        - key: platform.custom-fields.create
          where_checked: api
          scope: tenant
        - key: platform.layouts.create
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-001-01
      - INV-DOM-PFM-MTD-001-02
      - INV-DOM-PFM-MTD-001-03
      - INV-DOM-PFM-MTD-001-05
      - INV-DOM-PFM-MTD-001-06
      - INV-DOM-PFM-MTD-001-07
    workflow_seams:
      - workflow: WF-PFM-MTD-001
        capabilities: *ref_0
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-001-register-an-application-s-record-types-at-deploy.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-066
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-004
      - ATS-PFM-MTD-004
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-004-call-a-standard-field-by-the-workspace-s-own-name.md
    missing_categories:
      - permission
      - failure
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-004-07
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.field-labels.update
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-001-01
      - INV-DOM-PFM-MTD-001-02
      - INV-DOM-PFM-MTD-001-03
      - INV-DOM-PFM-MTD-001-04
      - INV-DOM-PFM-MTD-001-06
      - INV-DOM-PFM-MTD-001-07
      - INV-DOM-PFM-MTD-001-08
    workflow_seams: []
    provenance: unknown
  - id: FND-PFM-MTD-067
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-005
      - ATS-PFM-MTD-005
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-005-add-the-workspace-s-own-fields-to-a-record-type-and-evolve.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-002-custom-field-definition-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-002-archive-a-custom-field-and-bring-search-into-line.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-003-save-a-field-definition-and-its-rules.md
    missing_categories:
      - permission
      - edge
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-005-13
      - ATS-PFM-MTD-005-14
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.custom-fields.read
          where_checked: api
          scope: tenant
        - key: platform.custom-fields.create
          where_checked: api
          scope: tenant
        - key: platform.custom-fields.update
          where_checked: api
          scope: tenant
        - key: platform.custom-fields.delete
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-002
        transitions:
          - from: absent
            to: live
            trigger: An administrator adds a custom field.
            source: 'services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.integration.spec.js#refuses a key an archived field of the tenant still holds'
          - from: live
            to: live
            trigger: An administrator saves a definition or rule set.
            source: 'services-platform:modules/metadata/tests/e2e/custom-fields.e2e.spec.js#refuses a stale version as 409'
          - from: live
            to: archived
            trigger: An administrator archives a live definition.
            source: 'services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#removes a field’s rules when the field is arch'
          - from: archived
            to: live
            trigger: An administrator restores an archived definition.
            source: 'services-platform:modules/metadata/services/persistence/custom-fields.ts:restoreCustomField'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-002-04
      - INV-DOM-PFM-MTD-002-06
      - INV-DOM-PFM-MTD-002-07
      - INV-DOM-PFM-MTD-002-08
      - INV-DOM-PFM-MTD-002-09
    workflow_seams:
      - workflow: WF-PFM-MTD-002
        capabilities: &ref_1
          - CAP-PFM-MTD-005
          - CAP-PFM-MTD-006
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-002-archive-a-custom-field-and-bring-search-into-line.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-003
        capabilities: &ref_2
          - CAP-PFM-MTD-005
          - CAP-PFM-MTD-006
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-003-save-a-field-definition-and-its-rules.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-068
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-006
      - ATS-PFM-MTD-006
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-006-make-a-field-required-shown-unique-defaulted-or-exposed-by.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-002-custom-field-definition-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-002-archive-a-custom-field-and-bring-search-into-line.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-003-save-a-field-definition-and-its-rules.md
    missing_categories:
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-006-10
      - ATS-PFM-MTD-006-11
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.custom-fields.read
          where_checked: api
          scope: tenant
        - key: platform.custom-fields.update
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-002
        transitions:
          - from: absent
            to: live
            trigger: An administrator adds a custom field.
            source: 'services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.integration.spec.js#refuses a key an archived field of the tenant still holds'
          - from: live
            to: live
            trigger: An administrator saves a definition or rule set.
            source: 'services-platform:modules/metadata/tests/e2e/custom-fields.e2e.spec.js#refuses a stale version as 409'
          - from: live
            to: archived
            trigger: An administrator archives a live definition.
            source: 'services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.rules.integration.spec.js#removes a field’s rules when the field is arch'
          - from: archived
            to: live
            trigger: An administrator restores an archived definition.
            source: 'services-platform:modules/metadata/services/persistence/custom-fields.ts:restoreCustomField'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-002-01
      - INV-DOM-PFM-MTD-002-02
      - INV-DOM-PFM-MTD-002-03
      - INV-DOM-PFM-MTD-002-04
      - INV-DOM-PFM-MTD-002-05
    workflow_seams:
      - workflow: WF-PFM-MTD-002
        capabilities: *ref_1
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-002-archive-a-custom-field-and-bring-search-into-line.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-003
        capabilities: *ref_2
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-003-save-a-field-definition-and-its-rules.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-069
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-007
      - ATS-PFM-MTD-007
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-007-give-a-person-a-safe-short-lived-place-to-upload-a-picture-or.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-007-custom-record-file-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-013-stage-an-upload-and-hand-it-to-the-save.md
    missing_categories:
      - transition
      - failure
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-007-08
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.files.upload
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-007
        transitions:
          - from: preparing
            to: ready
            trigger: File preparation completes successfully.
            source: 'services-platform:docs/assets.md#5. Prepare, then commit'
          - from: ready
            to: attached
            trigger: The record save commits a prepared reference.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:createRecord'
          - from: preparing
            to: abandoned
            trigger: File preparation is refused or fails.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: ready
            to: abandoned
            trigger: Persistence rejects the prepared save.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: attached
            to: detached
            trigger: Committed content stops referencing the file.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:deleteWithRules'
          - from: detached
            to: discarding
            trigger: A scheduled cleanup sweep would claim a detached entry.
            source: 'services-platform:docs/debt/custom-object-asset-cleanup.md'
          - from: abandoned
            to: discarding
            trigger: A cleanup sweep would claim an abandoned copy after its grace period.
            source: 'services-platform:docs/debt/custom-object-asset-cleanup.md'
          - from: discarding
            to: retired
            trigger: A cleanup consumer would retire detached content.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: discarding
            to: discarded
            trigger: A cleanup consumer would dispose of abandoned content.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: discarding
            to: attached
            trigger: A cleanup consumer would discover a surviving record reference.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: discarding
            to: failed
            trigger: A final queue attempt would fail.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
    workflow_seams:
      - workflow: WF-PFM-MTD-005
        capabilities: &ref_5
          - CAP-PFM-MTD-012
          - CAP-PFM-MTD-007
          - CAP-PFM-MTD-014
          - CAP-PFM-MTD-015
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-013
        capabilities: &ref_6
          - CAP-PFM-MTD-007
          - CAP-PFM-MTD-012
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-013-stage-an-upload-and-hand-it-to-the-save.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-070
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-008
      - ATS-PFM-MTD-008
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-008-keep-the-workspace-s-forms-and-page-layouts-governed-by-the.md
    missing_categories:
      - transition
      - edge
      - failure
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-008-12
    related_without_explicit_interaction:
      - CAP-PFM-MTD-002
    permission_matrix:
      permissions:
        - key: platform.layouts.read
          where_checked: api
          scope: tenant
        - key: platform.layouts.create
          where_checked: api
          scope: tenant
        - key: platform.layouts.update
          where_checked: api
          scope: tenant
        - key: platform.layouts.delete
          where_checked: api
          scope: tenant
        - key: 'crm.contact-layouts.read, .create, .update, .delete and the other purpose owners'' administration keys'
          where_checked: service
          scope: tenant
        - key: 'crm.contacts.read, crm.organizations.read, committees.committees.read, platform.custom-records.read (consumption)'
          where_checked: service
          scope: tenant
        - key: 'platform.custom-objects.read, .create, .update, .delete (administration of custom object purposes)'
          where_checked: service
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-003-03
    workflow_seams: []
    provenance: unknown
  - id: FND-PFM-MTD-071
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-009
      - ATS-PFM-MTD-009
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-009-design-a-record-type-of-the-organization-s-own-and-bring-it.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-003-custom-object-definition-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-004-design-activate-and-own-a-custom-object.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
    missing_categories:
      - permission
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-009-12
      - ATS-PFM-MTD-009-13
      - ATS-PFM-MTD-009-14
    related_without_explicit_interaction:
      - CAP-PFM-MTD-011
    permission_matrix:
      permissions:
        - key: platform.custom-objects.read
          where_checked: api
          scope: tenant
        - key: platform.custom-objects.create
          where_checked: api
          scope: tenant
        - key: platform.custom-objects.update
          where_checked: api
          scope: tenant
        - key: platform.custom-objects.delete
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-003
        transitions:
          - from: absent
            to: draft
            trigger: An administrator creates an object definition.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses the fifty-first object of a tenant, w'
          - from: draft
            to: active
            trigger: An administrator activates a draft.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses activating a draft whose display prop'
          - from: draft
            to: archived
            trigger: An administrator archives a draft.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-objects.ts:archiveCustomObject'
          - from: active
            to: archived
            trigger: An administrator archives an active definition.
            source: 'services-platform:modules/layouts/tests/e2e/custom-object-forms.e2e.spec.js#answers 404 for a stored form once its custom object is archived'
          - from: archived
            to: draft
            trigger: An administrator restores the definition.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#restores an archived object as a draft, keepi'
          - from: draft
            to: draft
            trigger: An administrator replaces draft settings.
            source: 'services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a replacement that changes the status, which only the actions chang'
          - from: active
            to: active
            trigger: An administrator replaces active settings.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses turning publication off while the rec'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-004-07
      - INV-DOM-PFM-MTD-004-09
    workflow_seams:
      - workflow: WF-PFM-MTD-004
        capabilities: &ref_3
          - CAP-PFM-MTD-009
          - CAP-PFM-MTD-010
          - CAP-PFM-MTD-017
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-004-design-activate-and-own-a-custom-object.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-015
        capabilities: &ref_4
          - CAP-PFM-MTD-009
          - CAP-PFM-MTD-010
          - CAP-PFM-MTD-015
          - CAP-PFM-MTD-019
          - CAP-PFM-MTD-014
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-072
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-010
      - ATS-PFM-MTD-010
      - BR-CAP-PFM-MTD-010-09
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-010-put-custom-objects-where-staff-look-for-them.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-004-custom-app-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-004-design-activate-and-own-a-custom-object.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
    missing_categories:
      - rule
      - edge
      - failure
      - boundary
      - concurrency
      - invariant
    rules_without_scenarios:
      - BR-CAP-PFM-MTD-010-09
    scenarios_without_executables:
      - ATS-PFM-MTD-010-07
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.custom-objects.read
          where_checked: api
          scope: tenant
        - key: platform.custom-objects.create
          where_checked: api
          scope: tenant
        - key: platform.custom-objects.update
          where_checked: api
          scope: tenant
        - key: platform.custom-objects.delete
          where_checked: api
          scope: tenant
        - key: platform.custom-records.read
          where_checked: api
          scope: record
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-004
        transitions:
          - from: absent
            to: live
            trigger: An administrator creates a custom app.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses the key of a platform application, which'
          - from: live
            to: live
            trigger: An administrator changes app presentation.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-apps.ts'
          - from: live
            to: archived
            trigger: An administrator archives the app.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an a'
          - from: archived
            to: live
            trigger: An administrator restores the app.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-apps.ts'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-004-01
      - INV-DOM-PFM-MTD-004-02
      - INV-DOM-PFM-MTD-004-03
      - INV-DOM-PFM-MTD-004-04
      - INV-DOM-PFM-MTD-004-05
      - INV-DOM-PFM-MTD-004-06
      - INV-DOM-PFM-MTD-004-08
      - INV-DOM-PFM-MTD-004-09
    workflow_seams:
      - workflow: WF-PFM-MTD-004
        capabilities: *ref_3
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-004-design-activate-and-own-a-custom-object.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-015
        capabilities: *ref_4
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-073
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-011
      - ATS-PFM-MTD-011
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-011-decide-which-staff-reach-a-custom-object-s-records-and-which.md
    missing_categories:
      - transition
      - edge
      - failure
      - boundary
      - concurrency
      - invariant
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-011-08
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.custom-records.read
          where_checked: api
          scope: record
        - key: platform.custom-records.query
          where_checked: api
          scope: record
        - key: platform.custom-records.create
          where_checked: api
          scope: record
        - key: platform.custom-records.update
          where_checked: api
          scope: record
        - key: platform.custom-records.delete
          where_checked: api
          scope: record
        - key: platform.custom-records.publish
          where_checked: api
          scope: record
        - key: platform.custom-records.export
          where_checked: api
          scope: record
        - key: platform.custom-records.history
          where_checked: api
          scope: record
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-004-01
      - INV-DOM-PFM-MTD-004-02
      - INV-DOM-PFM-MTD-004-03
      - INV-DOM-PFM-MTD-004-04
      - INV-DOM-PFM-MTD-004-05
      - INV-DOM-PFM-MTD-004-06
      - INV-DOM-PFM-MTD-004-07
      - INV-DOM-PFM-MTD-004-08
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
    workflow_seams: []
    provenance: unknown
  - id: FND-PFM-MTD-074
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-012
      - ATS-PFM-MTD-012
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-012-keep-the-records-of-a-custom-object-validated-by-its-properties.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-005-custom-record-retention-lifecycle.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-007-custom-record-file-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-006-change-a-custom-record-s-owner-after-its-save.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-012-load-custom-records-and-links-from-a-file.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-013-stage-an-upload-and-hand-it-to-the-save.md
    missing_categories:
      - permission
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-012-15
      - ATS-PFM-MTD-012-16
      - ATS-PFM-MTD-012-18
      - ATS-PFM-MTD-012-19
    related_without_explicit_interaction:
      - CAP-PFM-MTD-011
    permission_matrix:
      permissions:
        - key: platform.custom-records.read
          where_checked: api
          scope: record
        - key: platform.custom-records.create
          where_checked: api
          scope: record
        - key: platform.custom-records.update
          where_checked: api
          scope: record
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-005
        transitions:
          - from: absent
            to: live
            trigger: A person or load creates a custom record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults a date to the tenant’s today,'
          - from: live
            to: live
            trigger: A person or load changes stored properties.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears every property a replacement le'
          - from: live
            to: archived
            trigger: An administrator archives the record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#archives a record with everything kept'
          - from: archived
            to: live
            trigger: An administrator restores the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:restoreRecord'
          - from: live
            to: deleted
            trigger: A direct deletion or owner cascade removes a live record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes every dependant’s event before'
          - from: archived
            to: deleted
            trigger: A direct deletion or owner cascade removes an archived record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:deleteRecord'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
      - state: STATE-PFM-MTD-007
        transitions:
          - from: preparing
            to: ready
            trigger: File preparation completes successfully.
            source: 'services-platform:docs/assets.md#5. Prepare, then commit'
          - from: ready
            to: attached
            trigger: The record save commits a prepared reference.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:createRecord'
          - from: preparing
            to: abandoned
            trigger: File preparation is refused or fails.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: ready
            to: abandoned
            trigger: Persistence rejects the prepared save.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: attached
            to: detached
            trigger: Committed content stops referencing the file.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:deleteWithRules'
          - from: detached
            to: discarding
            trigger: A scheduled cleanup sweep would claim a detached entry.
            source: 'services-platform:docs/debt/custom-object-asset-cleanup.md'
          - from: abandoned
            to: discarding
            trigger: A cleanup sweep would claim an abandoned copy after its grace period.
            source: 'services-platform:docs/debt/custom-object-asset-cleanup.md'
          - from: discarding
            to: retired
            trigger: A cleanup consumer would retire detached content.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: discarding
            to: discarded
            trigger: A cleanup consumer would dispose of abandoned content.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: discarding
            to: attached
            trigger: A cleanup consumer would discover a surviving record reference.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
          - from: discarding
            to: failed
            trigger: A final queue attempt would fail.
            source: 'services-platform:docs/assets.md#7. The lifecycle record and cleanup'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
    workflow_seams:
      - workflow: WF-PFM-MTD-005
        capabilities: *ref_5
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-006
        capabilities: &ref_9
          - CAP-PFM-MTD-012
          - CAP-PFM-MTD-018
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-006-change-a-custom-record-s-owner-after-its-save.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-012
        capabilities: &ref_8
          - CAP-PFM-MTD-016
          - CAP-PFM-MTD-012
          - CAP-PFM-MTD-018
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-012-load-custom-records-and-links-from-a-file.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-013
        capabilities: *ref_6
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-013-stage-an-upload-and-hand-it-to-the-save.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-075
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-013
      - ATS-PFM-MTD-013
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-013-publish-archive-restore-and-delete-custom-records-deliberately.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-005-custom-record-retention-lifecycle.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-006-custom-record-publication.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
    missing_categories:
      - validation
      - edge
      - boundary
      - concurrency
      - invariant
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-013-10
      - ATS-PFM-MTD-013-11
    related_without_explicit_interaction:
      - CAP-PFM-MTD-011
    permission_matrix:
      permissions:
        - key: platform.custom-records.publish
          where_checked: api
          scope: record
        - key: platform.custom-records.delete
          where_checked: api
          scope: record
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-005
        transitions:
          - from: absent
            to: live
            trigger: A person or load creates a custom record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults a date to the tenant’s today,'
          - from: live
            to: live
            trigger: A person or load changes stored properties.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears every property a replacement le'
          - from: live
            to: archived
            trigger: An administrator archives the record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#archives a record with everything kept'
          - from: archived
            to: live
            trigger: An administrator restores the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:restoreRecord'
          - from: live
            to: deleted
            trigger: A direct deletion or owner cascade removes a live record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes every dependant’s event before'
          - from: archived
            to: deleted
            trigger: A direct deletion or owner cascade removes an archived record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:deleteRecord'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
      - state: STATE-PFM-MTD-006
        transitions:
          - from: draft
            to: published
            trigger: An administrator selects published for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: pending_review
            to: published
            trigger: An administrator selects published for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: unpublished
            to: published
            trigger: An administrator selects published for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: published
            to: unpublished
            trigger: An administrator selects unpublished for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: published
            to: draft
            trigger: An administrator selects draft for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: published
            to: pending_review
            trigger: An administrator selects pending review for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: draft
            to: pending_review
            trigger: An administrator selects pending review for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: pending_review
            to: draft
            trigger: An administrator selects draft for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: draft
            to: draft
            trigger: An administrator selects draft for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: draft
            to: unpublished
            trigger: An administrator selects unpublished for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: pending_review
            to: pending_review
            trigger: An administrator selects pending review for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: pending_review
            to: unpublished
            trigger: An administrator selects unpublished for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: published
            to: published
            trigger: An administrator selects published for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: unpublished
            to: draft
            trigger: An administrator selects draft for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: unpublished
            to: pending_review
            trigger: An administrator selects pending review for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
          - from: unpublished
            to: unpublished
            trigger: An administrator selects unpublished for the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
    workflow_seams:
      - workflow: WF-PFM-MTD-007
        capabilities: &ref_7
          - CAP-PFM-MTD-013
          - CAP-PFM-MTD-019
          - CAP-PFM-MTD-015
          - CAP-PFM-MTD-014
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-076
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-014
      - ATS-PFM-MTD-014
      - BR-CAP-PFM-MTD-014-07
      - BR-CAP-PFM-MTD-014-08
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-014-see-every-change-to-a-custom-record-and-who-made-it.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-009-move-links-and-references-when-crm-merges-duplicates.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-014-capture-a-custom-record-s-change-history-at-commit.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
    missing_categories:
      - validation
      - edge
      - failure
      - boundary
      - concurrency
      - invariant
    rules_without_scenarios:
      - BR-CAP-PFM-MTD-014-07
      - BR-CAP-PFM-MTD-014-08
    scenarios_without_executables:
      - ATS-PFM-MTD-014-07
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.custom-records.history
          where_checked: api
          scope: record
        - key: platform.custom-records.read
          where_checked: service
          scope: record
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
      - INV-DOM-PFM-MTD-006-01
      - INV-DOM-PFM-MTD-006-02
      - INV-DOM-PFM-MTD-006-03
      - INV-DOM-PFM-MTD-006-04
      - INV-DOM-PFM-MTD-006-05
      - INV-DOM-PFM-MTD-006-06
      - INV-DOM-PFM-MTD-006-07
      - INV-DOM-PFM-MTD-006-08
      - INV-DOM-PFM-MTD-006-09
      - INV-DOM-PFM-MTD-006-10
    workflow_seams:
      - workflow: WF-PFM-MTD-005
        capabilities: *ref_5
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-007
        capabilities: *ref_7
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-009
        capabilities: &ref_11
          - CAP-PFM-MTD-019
          - CAP-PFM-MTD-014
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-009-move-links-and-references-when-crm-merges-duplicates.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-014
        capabilities:
          - CAP-PFM-MTD-014
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-014-capture-a-custom-record-s-change-history-at-commit.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-015
        capabilities: *ref_4
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-077
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-015
      - ATS-PFM-MTD-015
      - BR-CAP-PFM-MTD-015-06
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-015-announce-every-custom-record-and-link-change-to-the-rest-of.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-008-business-event-delivery.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-008-apply-relationship-rules-when-crm-deletes-a-contact-or.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-010-deliver-committed-business-events.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-011-sweep-the-business-event-ledger-nightly.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
    missing_categories:
      - transition
      - permission
      - boundary
      - concurrency
    rules_without_scenarios:
      - BR-CAP-PFM-MTD-015-06
    scenarios_without_executables:
      - ATS-PFM-MTD-015-08
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: system (no user permission key; events are written by the record and link writes)
          where_checked: service
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-008
        transitions:
          - from: waiting
            to: claimed
            trigger: The dispatcher obtains waiting work.
            source: 'services-platform:modules/custom-objects/services/dispatch/business-events.ts:dispatchPlatformBusinessEvents'
          - from: claimed
            to: in_transit
            trigger: The queue accepts all destination messages.
            source: 'services-platform:modules/custom-objects/tests/integration/services/dispatch/business-events.integration.spec.js#keeps its queue row, claimed, for the next run'
          - from: claimed
            to: waiting
            trigger: A send fails or the claim expires.
            source: 'services-platform:modules/custom-objects/tests/integration/services/dispatch/business-events.integration.spec.js#keeps its queue row, claimed, for the next run'
          - from: claimed
            to: undelivered
            trigger: Dispatch finds no eligible destination.
            source: 'services-platform:docs/business-events.md#4. Delivery: the dispatcher, the consumer, the intake'
          - from: in_transit
            to: delivered
            trigger: The consumer succeeds at a destination.
            source: 'services-platform:modules/custom-objects/tests/integration/services/dispatch/business-events.integration.spec.js#answers the one message whose destination refus'
          - from: in_transit
            to: in_transit
            trigger: A destination attempt fails.
            source: 'services-platform:modules/custom-objects/tests/integration/services/dispatch/business-events.integration.spec.js#answers the one message whose destination refus'
          - from: in_transit
            to: dead_lettered
            trigger: Repeated delivery reaches its retry limit.
            source: 'services-platform:docs/business-events.md#4. Delivery: the dispatcher, the consumer, the intake'
          - from: delivered
            to: swept
            trigger: The nightly retention sweep visits an old fact.
            source: 'services-platform:modules/custom-objects/services/persistence/business-events.ts:sweepBusinessEvents'
          - from: undelivered
            to: swept
            trigger: The nightly sweep visits an unsent old fact.
            source: 'services-platform:modules/custom-objects/services/persistence/business-events.ts:sweepBusinessEvents'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
      - INV-DOM-PFM-MTD-006-01
      - INV-DOM-PFM-MTD-006-02
      - INV-DOM-PFM-MTD-006-03
      - INV-DOM-PFM-MTD-006-04
      - INV-DOM-PFM-MTD-006-05
      - INV-DOM-PFM-MTD-006-06
      - INV-DOM-PFM-MTD-006-07
      - INV-DOM-PFM-MTD-006-08
      - INV-DOM-PFM-MTD-006-09
      - INV-DOM-PFM-MTD-006-10
    workflow_seams:
      - workflow: WF-PFM-MTD-005
        capabilities: *ref_5
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-005-save-a-custom-record-with-its-files.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-007
        capabilities: *ref_7
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-008
        capabilities: &ref_10
          - CAP-PFM-MTD-019
          - CAP-PFM-MTD-015
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-008-apply-relationship-rules-when-crm-deletes-a-contact-or.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-010
        capabilities:
          - CAP-PFM-MTD-015
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-010-deliver-committed-business-events.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-011
        capabilities:
          - CAP-PFM-MTD-015
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-011-sweep-the-business-event-ledger-nightly.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-015
        capabilities: *ref_4
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-078
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-016
      - ATS-PFM-MTD-016
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-016-load-custom-records-and-their-links-from-a-file-again-and-again.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-012-load-custom-records-and-links-from-a-file.md
    missing_categories:
      - transition
      - boundary
      - concurrency
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-016-08
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.associations.create
          where_checked: api
          scope: tenant
        - key: platform.associations.update
          where_checked: service
          scope: tenant
        - key: platform.custom-records.create
          where_checked: service
          scope: record
        - key: platform.custom-records.update
          where_checked: service
          scope: record
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit: []
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
      - INV-DOM-PFM-MTD-006-01
      - INV-DOM-PFM-MTD-006-02
      - INV-DOM-PFM-MTD-006-03
      - INV-DOM-PFM-MTD-006-04
      - INV-DOM-PFM-MTD-006-05
      - INV-DOM-PFM-MTD-006-06
      - INV-DOM-PFM-MTD-006-07
      - INV-DOM-PFM-MTD-006-08
      - INV-DOM-PFM-MTD-006-09
      - INV-DOM-PFM-MTD-006-10
    workflow_seams:
      - workflow: WF-PFM-MTD-012
        capabilities: *ref_8
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-012-load-custom-records-and-links-from-a-file.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-079
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-017
      - ATS-PFM-MTD-017
      - BR-CAP-PFM-MTD-017-07
      - BR-CAP-PFM-MTD-017-08
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-017-define-how-two-kinds-of-record-relate.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-009-relationship-type-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-004-design-activate-and-own-a-custom-object.md
    missing_categories:
      - edge
      - failure
      - boundary
      - invariant
    rules_without_scenarios:
      - BR-CAP-PFM-MTD-017-07
      - BR-CAP-PFM-MTD-017-08
    scenarios_without_executables:
      - ATS-PFM-MTD-017-09
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.association-types.read
          where_checked: api
          scope: tenant
        - key: platform.association-types.create
          where_checked: api
          scope: tenant
        - key: platform.association-types.update
          where_checked: api
          scope: tenant
        - key: platform.association-types.delete
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-009
        transitions:
          - from: absent
            to: active
            trigger: An administrator creates an active type.
            source: 'services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#answers 400 to a type of a draft custom object, naming it as not active'
          - from: absent
            to: inactive
            trigger: An administrator creates an initially inactive type.
            source: 'services-platform:modules/associations/services/persistence/association-types.ts:createAssociationType'
          - from: active
            to: active
            trigger: An administrator replaces type policy or labels.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#refuses a change of cardinality, the shape o'
          - from: active
            to: inactive
            trigger: An administrator deactivates a type or removes a currently used type.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#deactivates a type an association names inst'
          - from: inactive
            to: active
            trigger: An administrator reactivates a type.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#deactivates a type an association names inst'
          - from: active
            to: absent
            trigger: An administrator removes an unused active type.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#records a delete and a deactivation in the s'
          - from: inactive
            to: absent
            trigger: An administrator removes an unused inactive type.
            source: 'services-platform:modules/associations/services/persistence/association-types.ts:deleteAssociationType'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-006-04
      - INV-DOM-PFM-MTD-006-05
      - INV-DOM-PFM-MTD-006-06
      - INV-DOM-PFM-MTD-006-07
      - INV-DOM-PFM-MTD-006-08
      - INV-DOM-PFM-MTD-006-09
      - INV-DOM-PFM-MTD-006-10
    workflow_seams:
      - workflow: WF-PFM-MTD-004
        capabilities: *ref_3
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-004-design-activate-and-own-a-custom-object.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-080
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-018
      - ATS-PFM-MTD-018
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-018-link-records-to-one-another-dated-primary-and-in-force-until.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-010-link-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-006-change-a-custom-record-s-owner-after-its-save.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-012-load-custom-records-and-links-from-a-file.md
    missing_categories:
      - rule
      - edge
    rules_without_scenarios: []
    scenarios_without_executables:
      - ATS-PFM-MTD-018-12
      - ATS-PFM-MTD-018-13
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: platform.associations.read
          where_checked: api
          scope: tenant
        - key: platform.associations.create
          where_checked: api
          scope: tenant
        - key: platform.associations.update
          where_checked: api
          scope: tenant
        - key: platform.associations.delete
          where_checked: api
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-010
        transitions:
          - from: absent
            to: in_force
            trigger: A person or load creates a current link.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses a record associated with itself'
          - from: in_force
            to: in_force
            trigger: A person or load replaces current link attributes.
            source: 'services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#answers 400 to a replacement that names another record'
          - from: in_force
            to: ended
            trigger: 'An ending, removal of an open dated link, calendar passage or merge collision reaches an ended state.'
            source: 'services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#still holds the place on the end date it'
          - from: ended
            to: in_force
            trigger: A person or load reopens an ended link.
            source: 'services-platform:tests/acceptance/custom-objects/journeys/data-operations/CO-ACC-0402.spec.js#step 6: a CRW-1 line with only isPrimary replaces the association'
          - from: in_force
            to: removed
            trigger: A direct removal or endpoint deletion removes a current link.
            source: 'services-platform:modules/associations/tests/integration/db/apply-endpoint-deletion.integration.spec.js#answers what endpointDeletionOutcome says for an open as'
          - from: ended
            to: removed
            trigger: A person or endpoint deletion removes an ended link.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#removes a link that has an end date when'
          - from: absent
            to: ended
            trigger: A person or load creates a link with an end day in the past.
            source: 'services-platform:modules/associations/services/persistence/associations.ts:createAssociation'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-006-01
      - INV-DOM-PFM-MTD-006-02
      - INV-DOM-PFM-MTD-006-03
      - INV-DOM-PFM-MTD-006-08
      - INV-DOM-PFM-MTD-006-09
      - INV-DOM-PFM-MTD-006-10
    workflow_seams:
      - workflow: WF-PFM-MTD-006
        capabilities: *ref_9
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-006-change-a-custom-record-s-owner-after-its-save.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-012
        capabilities: *ref_8
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-012-load-custom-records-and-links-from-a-file.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-081
    kind: coverage-gap
    severity: medium
    affects:
      - CAP-PFM-MTD-019
      - ATS-PFM-MTD-019
      - BR-CAP-PFM-MTD-019-10
    source:
      - specs/platform/metadata/planning/capabilities/CAP-PFM-MTD-019-apply-each-relationship-s-rule-when-a-linked-record-is-deleted.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-005-custom-record-retention-lifecycle.md
      - specs/platform/metadata/design/state-models/STATE-PFM-MTD-010-link-lifecycle.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-008-apply-relationship-rules-when-crm-deletes-a-contact-or.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-009-move-links-and-references-when-crm-merges-duplicates.md
      - specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
    missing_categories:
      - transition
      - validation
      - failure
      - concurrency
    rules_without_scenarios:
      - BR-CAP-PFM-MTD-019-10
    scenarios_without_executables:
      - ATS-PFM-MTD-019-10
    related_without_explicit_interaction: []
    permission_matrix:
      permissions:
        - key: rhythm_crm_app and rhythm_platform_app execution of the endpoint deletion and merge functions (no user key)
          where_checked: database
          scope: tenant
      note: 'Existing permission scenarios are retained; every remaining action, refusal and object-scope combination needs an explicit scenario-to-permission matrix before complete permission coverage is claimed.'
    state_transition_audit:
      - state: STATE-PFM-MTD-005
        transitions:
          - from: absent
            to: live
            trigger: A person or load creates a custom record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults a date to the tenant’s today,'
          - from: live
            to: live
            trigger: A person or load changes stored properties.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears every property a replacement le'
          - from: live
            to: archived
            trigger: An administrator archives the record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#archives a record with everything kept'
          - from: archived
            to: live
            trigger: An administrator restores the record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:restoreRecord'
          - from: live
            to: deleted
            trigger: A direct deletion or owner cascade removes a live record.
            source: 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes every dependant’s event before'
          - from: archived
            to: deleted
            trigger: A direct deletion or owner cascade removes an archived record.
            source: 'services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:deleteRecord'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
      - state: STATE-PFM-MTD-010
        transitions:
          - from: absent
            to: in_force
            trigger: A person or load creates a current link.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/associations.integration.spec.js#refuses a record associated with itself'
          - from: in_force
            to: in_force
            trigger: A person or load replaces current link attributes.
            source: 'services-platform:modules/associations/tests/e2e/associations.e2e.spec.js#answers 400 to a replacement that names another record'
          - from: in_force
            to: ended
            trigger: 'An ending, removal of an open dated link, calendar passage or merge collision reaches an ended state.'
            source: 'services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#still holds the place on the end date it'
          - from: ended
            to: in_force
            trigger: A person or load reopens an ended link.
            source: 'services-platform:tests/acceptance/custom-objects/journeys/data-operations/CO-ACC-0402.spec.js#step 6: a CRW-1 line with only isPrimary replaces the association'
          - from: in_force
            to: removed
            trigger: A direct removal or endpoint deletion removes a current link.
            source: 'services-platform:modules/associations/tests/integration/db/apply-endpoint-deletion.integration.spec.js#answers what endpointDeletionOutcome says for an open as'
          - from: ended
            to: removed
            trigger: A person or endpoint deletion removes an ended link.
            source: 'services-platform:modules/associations/tests/integration/services/persistence/associations.in-force.integration.spec.js#removes a link that has an end date when'
          - from: absent
            to: ended
            trigger: A person or load creates a link with an end day in the past.
            source: 'services-platform:modules/associations/services/persistence/associations.ts:createAssociation'
        note: Existing lifecycle scenarios cover selected paths. Every listed transition needs an explicit executable case or a dedicated proposed scenario; aggregate category coverage does not claim complete transition coverage.
    invariants_without_explicit_proof:
      - INV-DOM-PFM-MTD-005-01
      - INV-DOM-PFM-MTD-005-02
      - INV-DOM-PFM-MTD-005-03
      - INV-DOM-PFM-MTD-005-04
      - INV-DOM-PFM-MTD-005-05
      - INV-DOM-PFM-MTD-005-06
      - INV-DOM-PFM-MTD-005-07
      - INV-DOM-PFM-MTD-005-08
      - INV-DOM-PFM-MTD-005-09
      - INV-DOM-PFM-MTD-005-10
      - INV-DOM-PFM-MTD-005-11
      - INV-DOM-PFM-MTD-005-12
      - INV-DOM-PFM-MTD-006-01
      - INV-DOM-PFM-MTD-006-02
      - INV-DOM-PFM-MTD-006-03
      - INV-DOM-PFM-MTD-006-04
      - INV-DOM-PFM-MTD-006-05
      - INV-DOM-PFM-MTD-006-06
      - INV-DOM-PFM-MTD-006-07
    workflow_seams:
      - workflow: WF-PFM-MTD-007
        capabilities: *ref_7
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-007-delete-a-custom-record-under-its-relationship-rules.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-008
        capabilities: *ref_10
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-008-apply-relationship-rules-when-crm-deletes-a-contact-or.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-009
        capabilities: *ref_11
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-009-move-links-and-references-when-crm-merges-duplicates.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
      - workflow: WF-PFM-MTD-015
        capabilities: *ref_4
        source: specs/platform/metadata/design/workflows/WF-PFM-MTD-015-reset-or-delete-a-workspace-s-metadata-and-custom.md
        note: 'Complete seam failure, retry and cross-capability coverage remains unverified; the interaction scenario identifies the proposed joint outcome.'
    provenance: unknown
  - id: FND-PFM-MTD-083
    kind: coverage-gap
    severity: medium
    affects:
      - TST-PFM-MTD-011
      - TST-PFM-MTD-012
      - TST-PFM-MTD-015
      - TST-PFM-MTD-021
      - TST-PFM-MTD-028
      - TST-PFM-MTD-029
      - TST-PFM-MTD-030
      - TST-PFM-MTD-031
      - TST-PFM-MTD-032
      - TST-PFM-MTD-033
      - TST-PFM-MTD-034
      - TST-PFM-MTD-035
      - TST-PFM-MTD-038
      - TST-PFM-MTD-040
      - TST-PFM-MTD-042
      - TST-PFM-MTD-046
      - TST-PFM-MTD-047
      - TST-PFM-MTD-050
      - TST-PFM-MTD-054
      - TST-PFM-MTD-055
      - TST-PFM-MTD-059
      - TST-PFM-MTD-061
      - TST-PFM-MTD-062
      - TST-PFM-MTD-063
      - TST-PFM-MTD-066
      - TST-PFM-MTD-068
      - TST-PFM-MTD-071
      - TST-PFM-MTD-079
      - TST-PFM-MTD-080
      - TST-PFM-MTD-081
      - TST-PFM-MTD-086
      - TST-PFM-MTD-089
      - TST-PFM-MTD-090
      - TST-PFM-MTD-091
      - TST-PFM-MTD-092
      - TST-PFM-MTD-094
      - TST-PFM-MTD-095
      - TST-PFM-MTD-096
      - TST-PFM-MTD-097
      - TST-PFM-MTD-099
      - TST-PFM-MTD-100
      - TST-PFM-MTD-101
      - TST-PFM-MTD-102
      - TST-PFM-MTD-103
      - TST-PFM-MTD-106
      - TST-PFM-MTD-111
      - TST-PFM-MTD-114
      - TST-PFM-MTD-119
      - TST-PFM-MTD-121
      - TST-PFM-MTD-122
      - TST-PFM-MTD-125
      - TST-PFM-MTD-140
    provenance: unknown
    source:
      - 'react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S11.spec.ts'
      - 'react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S12.spec.ts'
      - 'react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S01.spec.ts'
      - 'react-console:acceptance/custom-objects/playwright/journeys/PLAT-M6-S07.spec.ts'
      - 'react-console:e2e/mock/contact-forms.mock.spec.ts'
      - 'react-console:e2e/mock/custom-object-designer.mock.spec.ts'
      - 'react-console:e2e/mock/custom-object-navigation.mock.spec.ts'
      - 'react-console:e2e/mock/custom-object-properties.mock.spec.ts'
      - 'react-console:e2e/mock/custom-objects-owner-card.mock.spec.ts'
      - 'react-console:e2e/mock/custom-objects.mock.spec.ts'
      - 'react-console:e2e/mock/fields-custom-object.mock.spec.ts'
      - 'react-console:e2e/mock/relationship-types.mock.spec.ts'
      - 'services-platform:modules/associations/tests/integration/db/association-types.table.integration.spec.js'
      - 'services-platform:modules/associations/tests/integration/db/associations.table.integration.spec.js'
      - 'services-platform:modules/associations/tests/integration/services/persistence/association-types.queries.integration.spec.js'
      - 'services-platform:modules/associations/tests/integration/services/persistence/associations.queries.integration.spec.js'
      - 'services-platform:modules/associations/tests/integration/services/persistence/endpoints.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/e2e/custom-object-record-history.e2e.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/db/custom-object-records.table.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/db/custom-objects.table.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/business-events.queries.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.queries.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-endpoints.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-recipes.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.queries.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.queries.integration.spec.js'
      - 'services-platform:modules/custom-objects/tests/integration/services/persistence/record-revisions.queries.integration.spec.js'
      - 'services-platform:modules/files/tests/integration/db/file-uploads.table.integration.spec.js'
      - 'services-platform:modules/files/tests/integration/services/persistence/file-uploads.integration.spec.js'
      - 'services-platform:modules/files/tests/integration/services/persistence/file-uploads.queries.integration.spec.js'
      - 'services-platform:modules/layouts/tests/e2e/console-forms-api.e2e.spec.js'
      - 'services-platform:modules/layouts/tests/e2e/portal-forms-api.e2e.spec.js'
      - 'services-platform:modules/layouts/tests/e2e/portal-page-layouts-api.e2e.spec.js'
      - 'services-platform:modules/layouts/tests/integration/db/console-forms.table.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/db/console-page-layouts.table.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/db/portal-forms.table.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/db/portal-page-layouts.table.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/console-forms.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/console-forms.queries.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/console-page-layouts.queries.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.queries.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/portal-page-layouts.integration.spec.js'
      - 'services-platform:modules/layouts/tests/integration/services/persistence/portal-page-layouts.queries.integration.spec.js'
      - 'services-platform:modules/metadata/tests/e2e/metadata-api-observability.e2e.spec.js'
      - 'services-platform:modules/metadata/tests/integration/db/registered-collections.table.integration.spec.js'
      - 'services-platform:modules/metadata/tests/integration/db/standard-field-label-overrides.table.integration.spec.js'
      - 'services-platform:modules/metadata/tests/integration/services/persistence/custom-fields.queries.integration.spec.js'
      - 'services-platform:modules/metadata/tests/integration/services/persistence/registered-objects.integration.spec.js'
      - 'services-platform:modules/metadata/tests/integration/services/persistence/registered-objects.queries.integration.spec.js'
      - 'services-platform:modules/metadata/tests/integration/services/persistence/standard-field-label-overrides.queries.integration.spec.js'
      - 'react-console:e2e/layout/page-layouts.spec.ts'
    note: These existing executable suites have no matching ATS or FAS scenario proven by their actual assertions; implements remains empty.
  - id: FND-PFM-MTD-084
    kind: coverage-gap
    severity: medium
    affects:
      - FAS-PFM-MTD-01-01
      - FAS-PFM-MTD-01-02
      - FAS-PFM-MTD-01-03
      - FAS-PFM-MTD-01-04
      - FAS-PFM-MTD-01-05
      - FAS-PFM-MTD-02-01
      - FAS-PFM-MTD-02-03
      - FAS-PFM-MTD-02-04
      - FAS-PFM-MTD-02-05
      - FAS-PFM-MTD-03-02
      - FAS-PFM-MTD-03-03
      - FAS-PFM-MTD-03-04
      - FAS-PFM-MTD-05-02
      - FAS-PFM-MTD-05-04
    provenance: unknown
    source:
      - specs/platform/metadata/planning/features/FEAT-PFM-MTD-01-record-type-registry.md
      - specs/platform/metadata/planning/features/FEAT-PFM-MTD-02-custom-fields-and-files.md
      - specs/platform/metadata/planning/features/FEAT-PFM-MTD-03-forms-and-page-layouts.md
      - specs/platform/metadata/planning/features/FEAT-PFM-MTD-04-custom-object-design.md
      - specs/platform/metadata/planning/features/FEAT-PFM-MTD-05-custom-records.md
      - specs/platform/metadata/planning/features/FEAT-PFM-MTD-06-relationships-between-records.md
    note: These proposed feature scenarios have no existing executable suite proving the full joint outcome.
continuation_findings:
  - id: FND-PFM-MTD-085
    kind: inconsistency
    severity: medium
    statement: >-
      Four permanent finding identifiers have competing control-gap and testing-gap descriptions;
      this continuation preserves both records and requires an explicit identity decision.
    affects:
      - FND-PFM-MTD-063
      - FND-PFM-MTD-064
      - FND-PFM-MTD-065
      - FND-PFM-MTD-066
    provenance: documented
    source:
      - rhythm-v2-docs:specs/platform/metadata/ID_REGISTRY.md#Testing Back-fill Allocations
      - rhythm-v2-docs:specs/platform/metadata/FINDINGS.md#Testing Coverage Findings
    note: >-
      The registry labels these identifiers as control gaps, while testing_coverage_gaps and the
      visible findings table describe capability proof gaps. The control_gap_evidence entries
      concern asset cleanup, search retirement, owner replacement and concurrent registration;
      those concerns already have related findings. No identifier is renumbered or reused in this
      continuation. The registry summary now includes allocations through this finding.
control_gap_evidence:
  - finding: FND-PFM-MTD-063
    controls:
      - TC-DAT-003
      - TC-DAT-004
      - TC-AVL-004
      - TC-PI-004
    provenance: observed
    source: 'services-platform:modules/custom-objects/services/assets/custom-object-record-assets.ts (header: no cleanup functions yet); docs/debt/custom-object-asset-cleanup.md; docs/assets.md#7. The lifecycle record and cleanup'
    related_finding: FND-PFM-MTD-042
  - finding: FND-PFM-MTD-064
    controls:
      - TC-PI-004
      - TC-AVL-004
    provenance: observed
    source: 'services-platform:modules/quick-search/services/configuration/degrade-fields.ts:degradeRetiredFields, QUICK_SEARCH_RETIREMENT_REBUILD_LIMIT; modules/metadata/services/registration/register-application.ts:registerApplication'
    related_finding: FND-PFM-MTD-044
  - finding: FND-PFM-MTD-065
    controls:
      - TC-AVL-004
      - TC-PI-004
    provenance: observed
    source: 'react-console:lib/forms/custom-objects/owner.ts:applyOwnerChange; components/console/custom-objects/record-editor.tsx:settleOwner'
    related_finding: FND-PFM-MTD-047
  - finding: FND-PFM-MTD-066
    controls:
      - TC-PI-003
      - TC-CHG-007
    provenance: observed
    source: '`services-platform:modules/metadata/services/registration/register-application.ts:registerApplication`; `services-platform:modules/metadata/services/persistence/registered-objects.ts`'
    related_finding: FND-PFM-MTD-056
---

# Examination Findings and Product Questions

## Findings

| id | severity | statement | affects | evidence | kind |
|---|---|---|---|---|---|
| `FND-PFM-MTD-001` | medium | The original registry scope included the eligibility milestone while omitting milestones for loads, events, console delivery and field capability. Several console paths were unavailable and implementation paths were missing. The draft’s registry update repairs that scope description. | `MOD-PFM-MTD` | Structured evidence | inconsistency |
| `FND-PFM-MTD-002` | low | The extensibility inventory primarily describes integration registry and invocation work. Only three business-event delivery entries belong to this module; the remaining inventory stays with the integrations module. | `MOD-PFM-MTD`, `CAP-PFM-MTD-015` | Structured evidence | inconsistency |
| `FND-PFM-MTD-003` | medium | The relationship milestone remains in progress and lacks an Engineering Verified run. Its recorded layers passed, but verification is held for an owner-picker scenario associated with the earlier console milestone. Approved plans and decisions establish relationship intent; acceptance completion does not. | `CAP-PFM-MTD-017`, `CAP-PFM-MTD-018`, `CAP-PFM-MTD-019`, `JNY-PFM-MTD-002`, `JNY-PFM-MTD-004`, `JNY-PFM-MTD-005` | Structured evidence | debt |
| `FND-PFM-MTD-004` | medium | The loads and events milestone remains proposed without an approved plan. Its record describes unlanded work even though the pinned tree contains load handlers, event storage, dispatch and sweeping. The affected capabilities retain proposed intent. | `CAP-PFM-MTD-015`, `CAP-PFM-MTD-016` | Structured evidence | inconsistency |
| `FND-PFM-MTD-005` | medium | The attachment milestone has no Engineering Verified run. Upload issuance is implemented, while uploader checking and web-address copying during save depend on shared assets and record owners beyond this module’s proof. Issuance does not apply a field-specific smaller size limit. | `CAP-PFM-MTD-007`, `BR-CAP-PFM-MTD-007-08` | Structured evidence | debt |
| `FND-PFM-MTD-006` | medium | The contact page designer stores draft and published documents in browser storage. Platform’s shared layout storage is therefore not the publication destination, and other browsers do not receive that publication. The standard expects shared configured layouts and leaves the engine choice open. | `BR-CAP-PFM-MTD-008-13`, `CAP-PFM-MTD-008` | Structured evidence | inconsistency |
| `FND-PFM-MTD-007` | low | The permission catalogue includes metadata, label and layout keys without corresponding route requirements. Publishing a permission resource does not establish an operation. Bulk custom-field access is consumed by dependent data-job routes. | `CAP-PFM-MTD-002`, `CAP-PFM-MTD-004`, `CAP-PFM-MTD-008` | Structured evidence | debt |
| `FND-PFM-MTD-008` | medium | Four approved additional-field categories lack layout purposes: committee nominations, memberships, organizational units and membership applications. Their form and layout requests fail despite the standard’s associated presentation obligation. No in-scope deferral decision establishes an exception. | `CAP-PFM-MTD-003`, `CAP-PFM-MTD-008` | Structured evidence | debt |
| `FND-PFM-MTD-009` | medium | Object settings accept and retain per-owner record and per-record link limits without enforcing them. An owner can receive records beyond the stored cap, contrary to the documented enforcement claim. | `BR-CAP-PFM-MTD-009-11` | Structured evidence | defect |
| `FND-PFM-MTD-010` | medium | Reset retains custom-object definitions, including active ones, while removing their properties and rules. Until package restoration, the retained definition lacks its naming property and cannot be replaced unchanged. The recorded reset decision does not settle property retention. | `BR-CAP-PFM-MTD-009-10`, `OQ-PFM-MTD-001` | Structured evidence | inconsistency |
| `FND-PFM-MTD-011` | medium | A link-load correction replaces link attributes as a complete set. Supplying only primary clears omitted dates, position and notes; omitting an existing end date reopens the connection. Partial correction files can therefore change history without warning. | `BR-CAP-PFM-MTD-016-06`, `CAP-PFM-MTD-016` | Structured evidence | defect |
| `FND-PFM-MTD-012` | medium | The metadata contract assigns HTML sanitization to value storage, but custom-record writes convert and retain HTML without a sanitizing step. No scoped test proves sanitization, leaving a gap before markup reaches member or public consumers. | `CAP-PFM-MTD-012`, `SC-CAP-PFM-MTD-012-03` | Structured evidence | defect |
| `FND-PFM-MTD-013` | medium | Endpoint requirement flags are stored on relationship types but are not checked by custom-record or link writes. The documented owner responsibility therefore does not prevent a record from existing without its required connection. | `BR-CAP-PFM-MTD-017-07` | Structured evidence | defect |
| `FND-PFM-MTD-014` | low | A deletion-check registration seam exists without a registered consumer. Cross-service cascades do not consult that seam, so future submission protections would need explicit integration to cover cascaded removal. | `BR-CAP-PFM-MTD-013-10`, `CAP-PFM-MTD-019` | Structured evidence | debt |
| `FND-PFM-MTD-015` | low | Ownership predicates and exposure projections have tests, while member and public record routes remain absent under the recorded portal pause. Stored portal operation settings do not establish a delivered member workflow. | `BR-CAP-PFM-MTD-011-07`, `BR-CAP-PFM-MTD-011-06`, `CAP-PFM-MTD-011` | Structured evidence | debt |
| `FND-PFM-MTD-016` | low | The caller-organization default is accepted but resolves no value because the signed context supplies no organization. The available option consequently has no filling effect. | `BR-CAP-PFM-MTD-006-04`, `BR-CAP-PFM-MTD-012-05` | Structured evidence | undocumented |
| `FND-PFM-MTD-017` | low | Only custom-object records register the checker needed to enable uniqueness. Registered record categories therefore reject unique rules despite sharing the rule vocabulary. | `BR-CAP-PFM-MTD-006-03` | Structured evidence | undocumented |
| `FND-PFM-MTD-018` | low | The builder-deletion browser test retains a title suggesting partial deletion. Its assertions instead prove refusal and complete rollback, matching the corrected all-or-nothing decision. Evidence strength follows those assertions. | `BR-CAP-PFM-MTD-013-05`, `JNY-PFM-MTD-005` | Structured evidence | inconsistency |
| `FND-PFM-MTD-019` | medium | Platform retains relationship revisions for native endpoints, but CRM’s drawer reads CRM history alone. Staff do not see those linked-record changes in the contact or organization timeline; the service records this integration gap. | `BR-CAP-PFM-MTD-014-05`, `OQ-PFM-MTD-003` | Structured evidence | debt |
| `FND-PFM-MTD-020` | low | The legacy custom-object inventory and README describe an earlier branch with no console screens and a pending console decision. The pinned tree contains screens and browser specifications under the later milestone approach. Legacy capabilities are superseded; the earlier rule inventory is a seed rather than a completed row-by-row reconciliation. | `MOD-PFM-MTD` | Structured evidence | inconsistency |
| `FND-PFM-MTD-021` | low | The shared metadata contract enforces the obligation to declare forms and layouts with additional fields. Platform’s scoped tests do not demonstrate that contract refusal, so the rule retains documentary evidence pending an appropriate integration proof. | `BR-CAP-PFM-MTD-003-03` | Structured evidence | debt |
| `FND-PFM-MTD-022` | low | The recorded decision limits relationship-type counts per workspace and endpoint category. Persistence does not enforce either limit; query description instead bounds its type read and logs overflow. | `BR-CAP-PFM-MTD-017-08` | Structured evidence | defect |
| `FND-PFM-MTD-023` | low | The custom-navigation operation exists in routes but is absent from the contract’s route tables. Its availability is therefore implementation evidence with a documentation gap. | `CAP-PFM-MTD-010` | Structured evidence | undocumented |
| `FND-PFM-MTD-024` | low | The scoped modules contain eighty-six literal operation identities and three factory-generated health routes. Dependent custom-record data-job declarations belong to the data-job engine and are excluded from that literal count. | `MOD-PFM-MTD` | Structured evidence | inconsistency |
| `FND-PFM-MTD-025` | low | The definition retains a legacy navigation hint alongside validated app placement. Writes do not reconcile the two settings, and the contract leaves removal of the older hint undecided. | `CAP-PFM-MTD-010` | Structured evidence | debt |
| `FND-PFM-MTD-026` | medium | A bound test establishes its asserted behavior, not a passing execution at the pinned commits. Recorded live runs contain an owner-picker failure and earlier API failures, so current acceptance needs execution evidence. | `JNY-PFM-MTD-002`, `ATS-PFM-MTD-012`, `ATS-PFM-MTD-018` | Structured evidence | debt |
| `FND-PFM-MTD-027` | low | Transition compatibility supplies all capabilities to approved categories that omit declarations and warns on certain query registrations without refusing them. Owning-service declarations and removals from unapproved categories remain outside this module’s completed work. | `CAP-PFM-MTD-003`, `BR-CAP-PFM-MTD-003-04` | Structured evidence | debt |
| `FND-PFM-MTD-028` | low | Role-restricted reach depends on Security’s object-scoped assignments. This module stores and applies the access mode; creating the scoped role assignment belongs to Security. | `CAP-PFM-MTD-011`, `JNY-PFM-MTD-003` | Structured evidence | undocumented |
| `FND-PFM-MTD-029` | low | Link-attribute updates and merge-driven link movements or endings emit no business announcements. Service debt records retain both omissions. | `BR-CAP-PFM-MTD-015-08` | Structured evidence | debt |
| `FND-PFM-MTD-030` | low | The custom-record export key has no requiring route. Exports use the query layer, and custom-object dataset end-to-end confirmation remains recorded debt. | `BR-CAP-PFM-MTD-011-05`, `CAP-PFM-MTD-016` | Structured evidence | debt |

| `FND-PFM-MTD-31` | medium | The planning brief named by the examination job is absent from the starting checkout and the fetched default branch. Examination uses the supplied job instructions and pinned product records; draft compliance with that missing brief remains unknown. | `MOD-PFM-MTD` | Structured evidence | undocumented |
| `FND-PFM-MTD-32` | medium | Indexed-field archival commits a degradation record and rebuild request; the search documents change later. The draft incorrectly promised immediate document rewriting. The corrected rule is observed in the archive coordinator, while its existing test binding demonstrates the completed rebuild. | `BR-CAP-PFM-MTD-005-08` | Structured evidence | inconsistency |
| `FND-PFM-MTD-33` | low | The field-count limit is checked only for custom objects. The draft extends it to registered record types; the corrected rule limits that claim to custom-object properties. | `BR-CAP-PFM-MTD-005-09`, `ATS-PFM-MTD-005-09` | Structured evidence | inconsistency |
| `FND-PFM-MTD-34` | medium | Visibility validation checks submitted changes rather than every retained value. Changing a controlling property can leave an untouched hidden value stored. The added acceptance scenario is proposed because no existing binding proves this transition. | `BR-CAP-PFM-MTD-012-04`, `ATS-PFM-MTD-012-15` | Structured evidence | undocumented |
| `FND-PFM-MTD-35` | medium | Direct deletion does not reject a record merely because it is archived, provided its object is active and deletion checks pass. The draft says archived records accept only restoration. The correction and proposed deletion scenario distinguish record archival from object archival. | `BR-CAP-PFM-MTD-012-11`, `BR-CAP-PFM-MTD-013-02`, `ATS-PFM-MTD-012-16` | Structured evidence | inconsistency |
| `FND-PFM-MTD-36` | medium | Activation writes shared Explorer query recipes, rather than personal saved views. The object archive operation contains no recipe retirement call. The draft conflates those records and promises retirement; the corrected rule and a proposed scenario expose the actual boundary. | `BR-CAP-PFM-MTD-009-12`, `ATS-PFM-MTD-009-12` | Structured evidence | inconsistency |
| `FND-PFM-MTD-37` | medium | Additional must-prove obligations lack a bound acceptance scenario: post-registration search degradation, custom-app lifecycle cleanup, history filtering and purge protection, queued-event retention, and relationship cleanup on workspace reset or deletion. Existing documentation and service code describe these behaviours; approval requires explicit proof at the relevant boundary. | `BR-CAP-PFM-MTD-001-10`, `BR-CAP-PFM-MTD-010-09`, `BR-CAP-PFM-MTD-014-07`, `BR-CAP-PFM-MTD-015-06`, `BR-CAP-PFM-MTD-019-10` | Structured evidence | debt |
| `FND-PFM-MTD-38` | medium | Upload issuance signs an expiring address and records an issue but does not consume a one-use token. The draft calls that address single-use without evidence. Issuance also validates the declaration rather than checking whether the named field exists or accepts the requested kind. Save-side enforcement remains a separate obligation. | `CAP-PFM-MTD-007` | Structured evidence | undocumented |
| `FND-PFM-MTD-39` | medium | Some composite proof claims exceed the assertions in their bindings: collection retirement in registration, portal absence as a route inventory claim, and the contact-field journey rendering a newly created field in a browser. Database integration scenarios are corrected to the API tier; the contact journey is narrowed to description evidence and remains partially observed. Each listed test exists, but an execution pass and complete end-to-end proof are separate questions. | `BR-CAP-PFM-MTD-001-02`, `BR-CAP-PFM-MTD-011-07`, `JNY-PFM-MTD-006` | Structured evidence | debt |
| `FND-PFM-MTD-40` | medium | Link maintenance rejects applicable record locks even after the relationship type is deactivated. The added rule and proposed acceptance scenario cover those service refusals; no existing bound test proves their combined lifecycle case. | `BR-CAP-PFM-MTD-018-13`, `ATS-PFM-MTD-018-12` | Structured evidence | debt |

| `FND-PFM-MTD-041` | medium | Current descriptions and audience exposure filter revision presentation, leaving archived property values retained but undisplayed. A focused archive-then-history acceptance binding is absent. The history record also identifies concurrent opposite-direction link capture as a deadlock case that depends on caller retry; no scoped proof establishes that retry boundary. | `BR-CAP-PFM-MTD-014-08`, `CAP-PFM-MTD-014` | Structured evidence | debt |
| `FND-PFM-MTD-042` | high | The custom record store's file cleanup is not deployed. Files of deleted records, replaced files and copies of refused saves are marked for retirement or discard, but nothing retires them, so they stay at their permanent addresses and remain fetchable by anyone holding the address. Deletion therefore does not remove a person's picture or document as the asset decision expects. | `BR-CAP-PFM-MTD-013-03`, `WF-PFM-MTD-005`, `WF-PFM-MTD-007`, `STATE-PFM-MTD-007`, `ADR-PFM-MTD-013` | Structured evidence | debt |
| `FND-PFM-MTD-043` | medium | Archiving a custom field starts its search rebuild after the commit with a plain start. If the start fails, the request answers an error although the field is archived, a retry is refused as already archived, and the rebuild waits for the reconciler to settle it as never started. The jobs standard asks API-facing submitters to leave a failed start to the reconciler and answer success. | `WF-PFM-MTD-002`, `BR-CAP-PFM-MTD-005-08`, `SVC-PFM-MTD-metadata` | Structured evidence | defect |
| `FND-PFM-MTD-044` | medium | After a registration retires fields, the search fan-out walks workspaces one at a time, logs and skips any workspace it cannot degrade, and stops after one hundred rebuilds. Skipped and remaining workspaces keep the retired field's values in search until someone rebuilds, and the deploy is told nothing; no reconciliation picks them up. | `WF-PFM-MTD-001`, `BR-CAP-PFM-MTD-001-10`, `STATE-PFM-MTD-001` | Structured evidence | debt |
| `FND-PFM-MTD-045` | medium | Planning says a workspace reset empties both relationship types and links. The code and the reset decision keep the types, which kept custom objects name as owners, and empty only the links; the module's own contract document repeats the planning wording. The planning rule needs correcting to match the decided behaviour. | `BR-CAP-PFM-MTD-019-10`, `WF-PFM-MTD-015` | Structured evidence | inconsistency |
| `FND-PFM-MTD-046` | medium | The owner chosen while a custom object is a draft is kept only in the browser that made it. Activating the object from another browser, by another administrator, or after the browser's storage is cleared activates it with no owner and no warning. | `WF-PFM-MTD-004`, `SCR-PFM-MTD-011`, `OQ-PFM-MTD-005` | Structured evidence | defect |
| `FND-PFM-MTD-047` | medium | A custom record and its owner are saved by separate calls: the record, then removal of the old owner link, then the new link. A failure after the removal leaves the record with no owner; the person is told for ten seconds and nothing restores the previous owner. Required-owner flags do not prevent it. | `WF-PFM-MTD-006`, `SCR-PFM-MTD-015`, `SCR-PFM-MTD-017`, `OQ-PFM-MTD-004` | Structured evidence | debt |
| `FND-PFM-MTD-048` | low | A field's definition and its rules are saved by separate calls, and arranging properties is one replacement per property. A refused rule set leaves the field saved with its previous rules, and a refusal part way through an arrangement leaves the properties partly moved. | `WF-PFM-MTD-003`, `SCR-PFM-MTD-003`, `OQ-PFM-MTD-004` | Structured evidence | debt |
| `FND-PFM-MTD-049` | medium | The Record Layouts screen lists sample rows built into the console rather than the workspace's stored page layouts, offers record types without the page layout capability, and saves nothing to Platform. Its contract is left open until the publication destination is decided. | `SCR-PFM-MTD-008`, `BR-CAP-PFM-MTD-003-06`, `OQ-PFM-MTD-002` | Structured evidence | inconsistency |
| `FND-PFM-MTD-050` | low | The Fields chooser filters the record type list itself to contacts, organizations and custom objects instead of asking the registry for record types holding custom fields. Approved record types such as committees are not offered once their owners declare them. | `SCR-PFM-MTD-001`, `BR-CAP-PFM-MTD-003-07` | Structured evidence | inconsistency |
| `FND-PFM-MTD-051` | low | This module asks no model a question, but the custom record list's Ask box sends the question to the Queries module's query generation when that is switched on. The module charter carries no sentence saying the module performs no inference, and the Queries module owes the inference operation for its generation. | `SCR-PFM-MTD-014`, `MOD-PFM-MTD` | Structured evidence | undocumented |
| `FND-PFM-MTD-052` | low | While no native subscriber and no integration router exist, every business event is removed from the outbox without any message and survives only in the ledger for ninety days. A destination added later never hears about earlier changes. | `WF-PFM-MTD-010`, `STATE-PFM-MTD-008`, `OQ-PFM-MTD-006` | Structured evidence | undocumented |
| `FND-PFM-MTD-053` | low | Every upload issue is recorded and the records are never pruned; the ledger grows with every picked file whether or not it is saved. | `WF-PFM-MTD-013`, `SVC-PFM-MTD-files` | Structured evidence | debt |
| `FND-PFM-MTD-054` | medium | Owners write layout assignments through a dedicated database role whose membership depends on a database bootstrap change recorded as an open follow-up. Until it lands, an owner's assignment writes in a deployed environment would be refused; this module cannot confirm whether it has landed. | `DOM-PFM-MTD-003`, `SVC-PFM-MTD-layouts`, `INV-DOM-PFM-MTD-003-04` | Structured evidence | debt |
| `FND-PFM-MTD-055` | low | The module charter names the jobs, audit and licensing module as the owner of data job orchestration, while the registry of modules gives data jobs to the Data Job Engine module. The design delegates loads to the Data Job Engine. | `MOD-PFM-MTD`, `WF-PFM-MTD-012` | Structured evidence | inconsistency |
| `FND-PFM-MTD-056` | medium | Individual registration upserts lock rows, but complete manifests have no application-wide lock; concurrent releases have no proved last-release-wins guarantee. | `WF-PFM-MTD-001`, `STATE-PFM-MTD-001` | `services-platform:modules/metadata/services/registration/register-application.ts:registerApplication`; `services-platform:modules/metadata/services/persistence/registered-objects.ts` | debt |
| `FND-PFM-MTD-057` | medium | The draft omitted accepted publication and past-dated link transitions and overstated version guards; the design examination corrects these descriptions without changing planning. | `STATE-PFM-MTD-002`, `STATE-PFM-MTD-006`, `STATE-PFM-MTD-009`, `STATE-PFM-MTD-010` | `services-platform:modules/custom-objects/services/persistence/custom-object-records.ts:publishRecord`; `services-platform:modules/associations/services/persistence/associations.ts`; `services-platform:modules/metadata/services/persistence/custom-fields.ts:restoreCustomField` | inconsistency |
| `FND-PFM-MTD-058` | medium | The custom-record list consumes query generation when enabled, but its draft inference list was empty; the examination adds the consumed operation contract while Queries retains execution ownership. | `SCR-PFM-MTD-014`, `IOP-PFM-MTD-001` | `react-console:components/record-explorer/use-recipe-explorer.ts`; `services-platform:modules/queries/services/generate/generation-runner.ts:GENERATE_QUERY_OPERATION_KEY` | inconsistency |
| `FND-PFM-MTD-059` | low | The draft calls existing screens approved and requires new visual designs for behavior changes without a cited decision; those claims are removed because implementation does not establish approval. | `SCR-PFM-MTD-001`, `SCR-PFM-MTD-008`, `SCR-PFM-MTD-009` | `rhythm-v2-docs:specs/CONVENTIONS.md#6. Document Form`; `rhythm-v2-docs:specs/CONVENTIONS.md#10. Deferred Kinds` | undocumented |
| `FND-PFM-MTD-060` | medium | The requested design brief is absent and planning artifacts retain draft status; their confirmed product origins are available, but this checkout does not establish approval of the planning layer itself. | `SVC-PFM-MTD-metadata`, `ADR-PFM-MTD-014` | `rhythm-v2-docs:briefs/design/platform-metadata.brief.md` (absent at the starting commit); `rhythm-v2-docs:specs/platform/metadata/planning/capabilities/` (draft status) | undocumented |
| `FND-PFM-MTD-061` | low | One archival hop claimed test provenance from service code, and CRM cascades pointed to the adapter that only returns cascade targets; the examination corrects provenance and points to the database implementation. | `WF-PFM-MTD-002`, `WF-PFM-MTD-008` | `services-platform:modules/metadata/services/field-lifecycle/archive-field.ts`; `services-platform:db/migrations/20261020023906_apply_endpoint_deletion.sql`; `services-platform:db/migrations/20261021162402_associations_in_force_until_end_date.sql`; `services-platform:modules/associations/services/persistence/associations.ts:applyEndpointDeletion` | inconsistency |
| `FND-PFM-MTD-062` | medium | A minute schedule does not bound delivery during errors or throttling, and the pinned tree does not establish whether an external router parameter exists in a deployed environment. | `WF-PFM-MTD-010`, `STATE-PFM-MTD-008`, `SVC-PFM-MTD-custom-objects` | `services-platform:modules/custom-objects/services/dispatch/business-events.ts`; `services-platform:modules/custom-objects/aws/logic/business-events.lambda.ts` | undocumented |

## Open Questions

| id | question | why_it_matters | options | recommendation | affects |
|---|---|---|---|---|---|
| `OQ-PFM-MTD-001` | Which parts of an object definition survive workspace reset? | Reset currently preserves active objects while removing the properties needed to use them. The recorded decision retains record categories without resolving that mismatch. | A: retain properties and rules while clearing record data. B: require a property-restoring package after every reset. C: archive active definitions until configuration is restored. | The product should retain properties and rules with their objects so reset leaves a usable definition while replacing its data. | `CAP-PFM-MTD-009`, `BR-CAP-PFM-MTD-009-10`, `FND-PFM-MTD-010` |
| `OQ-PFM-MTD-002` | What is the shared publication destination for record page designs? | Contact layouts currently publish only within one browser despite available shared storage and assignment protection. The consumer engine remains an open choice. | A: save and publish through shared layout storage and owner assignments. B: retain browser drafts until the engine decision. C: remove the designer and use description-generated pages. | The product should publish page designs through Platform storage and assignments so every user receives the same configuration while rendering can evolve. | `CAP-PFM-MTD-008`, `BR-CAP-PFM-MTD-008-13`, `FND-PFM-MTD-006` |
| `OQ-PFM-MTD-003` | How should native-record timelines present Platform relationship changes? | Platform records the revisions, but CRM’s timeline does not read them. A person inspecting a contact therefore misses linked-record changes. | A: combine CRM and Platform revisions in one timeline. B: present a separate relationship-history panel. C: retain these revisions only on the custom-record surface. | The product should combine the timelines so staff can inspect the person’s changes in one place, using revisions already retained for that endpoint. | `CAP-PFM-MTD-014`, `BR-CAP-PFM-MTD-014-05`, `FND-PFM-MTD-019` |
| `OQ-PFM-MTD-004` | Should the console's multi-call saves become single service operations? | A record and its owner, a field and its rules, and an object and its owner type are each saved by several calls with no compensation, so partial states reach staff and depend on a short message. | A: add composite service operations (a record write that names its owner; a field write that carries its rules; activation that creates the owner type). B: keep the calls and add console compensation. C: keep the current behaviour and state it. | A: one transaction per action removes the partial states; compensation from a browser can itself fail. | `WF-PFM-MTD-003`, `WF-PFM-MTD-004`, `WF-PFM-MTD-006`, `ADR-PFM-MTD-012`, `FND-PFM-MTD-047`, `FND-PFM-MTD-048` |
| `OQ-PFM-MTD-005` | Where is a draft custom object's intended owner kept? | Relationship types refuse draft objects, so the owner chosen during design is held in one browser and lost elsewhere. | A: store the intended owner on the object definition and create the owner type in the activation transaction. B: let relationship types name draft objects so the owner type is made at once. C: keep the browser storage. | A: the definition is the shared record of the design, and activation already checks the owner. | `WF-PFM-MTD-004`, `DOM-PFM-MTD-004`, `FND-PFM-MTD-046` |
| `OQ-PFM-MTD-006` | Should events published before a destination existed be replayed to it? | Today events with no destination are never sent and are swept after ninety days, so an integration or automation switched on later starts from nothing. | A: replay the ledger window to a newly registered destination. B: deliver only events after registration. C: let each destination ask for a bounded replay. | B for now with the behaviour stated, and C when the integration router lands, because unbounded replay can surprise a new subscriber. | `WF-PFM-MTD-010`, `STATE-PFM-MTD-008`, `FND-PFM-MTD-052` |

## Testing Coverage Findings

| Id | Severity | Statement | Affects | Evidence | Kind |
|---|---|---|---|---|---|
| `FND-PFM-MTD-063` | medium | Keep the Record Catalogue Current has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-001`, `ATS-PFM-MTD-001` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-064` | medium | Describe Records for Shared Clients has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-002`, `ATS-PFM-MTD-002` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-065` | medium | Keep Configurability Within Product Scope has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-003`, `ATS-PFM-MTD-003` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-066` | medium | Use Workspace Labels for Standard Fields has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-004`, `ATS-PFM-MTD-004` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-067` | medium | Extend Records With Durable Custom Fields has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-005`, `ATS-PFM-MTD-005` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-068` | medium | Configure Field Requirements and Exposure has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-006`, `ATS-PFM-MTD-006` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-069` | medium | Prepare Image and File Uploads has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-007`, `ATS-PFM-MTD-007` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-070` | medium | Manage Shared Forms and Record Layouts has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-008`, `ATS-PFM-MTD-008` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-071` | medium | Bring a Custom Record Type Into Use has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-009`, `ATS-PFM-MTD-009` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-072` | medium | Make Custom Records Discoverable has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-010`, `ATS-PFM-MTD-010` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-073` | medium | Control Custom Record Audiences has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-011`, `ATS-PFM-MTD-011` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-074` | medium | Maintain Valid Custom Records has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-012`, `ATS-PFM-MTD-012` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-075` | medium | Retire or Publish Custom Records has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-013`, `ATS-PFM-MTD-013` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-076` | medium | Explain Custom Record Changes has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-014`, `ATS-PFM-MTD-014` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-077` | medium | Deliver Committed Record and Link Events has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-015`, `ATS-PFM-MTD-015` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-078` | medium | Load and Reconcile Record Files has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-016`, `ATS-PFM-MTD-016` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-079` | medium | Define Meaningful Record Relationships has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-017`, `ATS-PFM-MTD-017` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-080` | medium | Maintain Dated Links Between Records has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-018`, `ATS-PFM-MTD-018` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-081` | medium | Preserve Relationships Through Deletion and Merge has remaining proof obligations across detailed lifecycle, permission, invariant or workflow cases; category and executable gaps are itemized in the evidence. | `CAP-PFM-MTD-019`, `ATS-PFM-MTD-019` | structured testing coverage audit | coverage-gap |
| `FND-PFM-MTD-082` | medium | The cited deployed owner-deletion test exercises a cascade, not a restricting deletion through CRM; the detailed scenario now describes only its existing proof. | `ATS-PFM-MTD-019-03`, `BR-CAP-PFM-MTD-019-03` | deployed owner-deletion assertions | inconsistency |
| `FND-PFM-MTD-083` | medium | Some existing executable suites, including shared contact-editor measurements, lack a matching detailed or feature scenario; their register entries keep an empty implementation map. | `TST-PFM-MTD-011`, `TST-PFM-MTD-012`, `TST-PFM-MTD-015`, `TST-PFM-MTD-021`, `TST-PFM-MTD-028`, `TST-PFM-MTD-029`, `TST-PFM-MTD-030`, `TST-PFM-MTD-031`, `TST-PFM-MTD-032`, `TST-PFM-MTD-033`, `TST-PFM-MTD-034`, `TST-PFM-MTD-035`, `TST-PFM-MTD-038`, `TST-PFM-MTD-040`, `TST-PFM-MTD-042`, `TST-PFM-MTD-046`, `TST-PFM-MTD-047`, `TST-PFM-MTD-050`, `TST-PFM-MTD-054`, `TST-PFM-MTD-055`, `TST-PFM-MTD-059`, `TST-PFM-MTD-061`, `TST-PFM-MTD-062`, `TST-PFM-MTD-063`, `TST-PFM-MTD-066`, `TST-PFM-MTD-068`, `TST-PFM-MTD-071`, `TST-PFM-MTD-079`, `TST-PFM-MTD-080`, `TST-PFM-MTD-081`, `TST-PFM-MTD-086`, `TST-PFM-MTD-089`, `TST-PFM-MTD-090`, `TST-PFM-MTD-091`, `TST-PFM-MTD-092`, `TST-PFM-MTD-094`, `TST-PFM-MTD-095`, `TST-PFM-MTD-096`, `TST-PFM-MTD-097`, `TST-PFM-MTD-099`, `TST-PFM-MTD-100`, `TST-PFM-MTD-101`, `TST-PFM-MTD-102`, `TST-PFM-MTD-103`, `TST-PFM-MTD-106`, `TST-PFM-MTD-111`, `TST-PFM-MTD-114`, `TST-PFM-MTD-119`, `TST-PFM-MTD-121`, `TST-PFM-MTD-122`, `TST-PFM-MTD-125` | structured executable mapping audit | coverage-gap |
| `FND-PFM-MTD-084` | medium | Proposed feature acceptance cases lack executable proof of their complete joint outcome. | `FAS-PFM-MTD-01`, `FAS-PFM-MTD-02`, `FAS-PFM-MTD-03`, `FAS-PFM-MTD-04`, `FAS-PFM-MTD-05`, `FAS-PFM-MTD-06` | structured feature coverage audit | coverage-gap |

## Continuation Findings

| Id | Severity | Statement | Affects | Evidence | Kind |
|---|---|---|---|---|---|
| `FND-PFM-MTD-085` | medium | Four finding identifiers carry conflicting control-gap and testing-gap descriptions. Their existing records remain intact pending an explicit identity decision; the allocation summary now reserves all existing identifiers. | `FND-PFM-MTD-063`, `FND-PFM-MTD-064`, `FND-PFM-MTD-065`, `FND-PFM-MTD-066` | structured continuation evidence | inconsistency |
