---
id: CAP-PFM-ELG-015
title: Identify and repair gaps in responsibility coverage
feature: FEAT-PFM-ELG-04
product_area: platform
module: eligibility
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - RA-ACC-0003
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-platform:docs/milestones/plans/PLAT-M15-plan.md#2. Scope'
  - 'services-platform:docs/milestones/plans/PLAT-M15-plan.md#PLAT-M15-S07'
  - >-
    services-platform:docs/proposals/responsibilities-and-attention/16-decisions.md#D-02
purpose: >-
  Organizations need to know when an area expected to be held has nobody
  responsible. Defaults and gap reporting support that oversight.
outcomes:
  - Registration supplies declared default holders for a new area.
  - Administrators see coverage gaps until an eligible holder is assigned.
concepts:
  - CON-PFM-ELG-004
  - CON-PFM-ELG-005
actors:
  - ACT-PFM-024
  - ACT-PFM-026
  - ACT-PFM-007
surfaces:
  - console
  - api
  - job
preconditions: []
postconditions: []
permissions:
  - key: platform.responsibilities.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-ELG-015-01
    proved_by: [ATS-PFM-ELG-015-01, TST-PFM-ELG-503, TST-PFM-ELG-506]
    statement: >-
      Responsibility registration validates an application’s complete list and
      rejects foreign keys, unsupported scope or derivation objects, unknown
      roles and missing fallback areas without partial writes.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/responsibilities/tests/integration/services/registration/register-service-responsibilities.integration.spec.js#refuses
      a malformed manifest whole, as ObjectInvalid, writing nothing
    origin: none
  - id: BR-CAP-PFM-ELG-015-02
    proved_by: [ATS-PFM-ELG-015-02, TST-PFM-ELG-503]
    statement: >-
      Registration updates changed areas, skips unchanged ones, retains omitted
      areas as retired and replaces role defaults.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/responsibilities/tests/integration/services/registration/register-service-responsibilities.integration.spec.js#retires
      a definition the manifest no longer declares, and keeps its row
    origin: none
  - id: BR-CAP-PFM-ELG-015-03
    proved_by: [ATS-PFM-ELG-015-03, TST-PFM-ELG-501]
    statement: >-
      Changed registrations reconcile operational workspaces within a 30-second
      budget, initializing defaults and uncovered-area state, with remaining
      work deferred to nightly processing.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/responsibilities/tests/integration/services/reconcile/reconcile-after-registration.integration.spec.js#gives
      the tenant the role default of a newly registered definition
    origin: none
  - id: BR-CAP-PFM-ELG-015-04
    proved_by: [ATS-PFM-ELG-014-10, ATS-PFM-ELG-015-04, ATS-PFM-ELG-015-08, TST-PFM-ELG-502]
    statement: >-
      Nightly reconciliation creates declared role defaults, respects removed
      defaults, ends undeclared ones and makes no changes on an identical rerun.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/responsibilities/tests/integration/services/reconcile/reconcile-tenant.integration.spec.js#(a)
      writes one active role-default assignment of the declared role at the
      tenant
    origin: >-
      services-platform:docs/proposals/responsibilities-and-attention/16-decisions.md#D-02
  - id: BR-CAP-PFM-ELG-015-05
    proved_by: [ATS-PFM-ELG-013-14, ATS-PFM-ELG-015-05, ATS-PFM-ELG-015-07, ATS-PFM-ELG-015-10, TST-PFM-ELG-499, TST-PFM-ELG-502]
    statement: >-
      An always-held area without a workspace-level active primary appears in
      the unassigned report, updated atomically by assignment changes and
      cleared when coverage returns.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/responsibilities/tests/integration/services/persistence/unassigned-responsibilities.integration.spec.js#opens
      the row at once when the only assignment of an area is ended
    origin: none
  - id: BR-CAP-PFM-ELG-015-06
    proved_by: [ATS-PFM-ELG-015-06, ATS-PFM-ELG-015-09, ATS-PFM-ELG-015-10, ATS-PFM-ELG-016-13, TST-PFM-ELG-378, TST-PFM-ELG-390, TST-PFM-ELG-391]
    statement: >-
      Unassigned areas produce advisory attention for administrators and clear
      when covered, with post-write attention refresh failures leaving the
      responsibility write successful.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/evaluate/refresh-unassigned-attention.integration.spec.js#resolves
      the item as cleared when the refresh runs after the assignment
    origin: none
  - id: BR-CAP-PFM-ELG-015-07
    proved_by: []
    statement: >-
      Responsibility readers can inspect uncovered areas and follow their
      assignment links.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: false
    provenance: test
    source: >-
      services-platform:modules/responsibilities/tests/e2e/responsibilities.e2e.spec.js#answers
      the unassigned report
    origin: none
  - id: BR-CAP-PFM-ELG-015-08
    proved_by: []
    statement: >-
      Applications synchronize record-derived holdings through a function that
      inserts missing holdings and ends obsolete ones without deleting history.
    kind: invariant
    enforced_at:
      - database
    must_prove: true
    provenance: observed
    source: >-
      services-platform:db/migrations/20261019011302_responsibilities.sql:platform.sync_derived_responsibilities
    origin: none
  - id: BR-CAP-PFM-ELG-015-09
    proved_by: []
    statement: >-
      Derived synchronization requires the transaction’s workspace and actor, a
      valid application and derivation key, an array of active responsibility
      entries declared derivable from that application’s objects with people,
      allowed holder kinds, valid scopes and ordered dates, and no repeated
      responsibility at a scope; it serializes each derivation, validates before
      writing, refreshes changed dates and audits inserts, endings and refreshes
      in the same transaction.
    kind: validation
    enforced_at:
      - database
    must_prove: true
    provenance: observed
    source: >-
      services-platform:db/migrations/20261019011302_responsibilities.sql:platform.sync_derived_responsibilities
    origin: none
scenarios:
  - id: SC-CAP-PFM-ELG-015-01
    given: An application adds an always-held financial-close area without defaults.
    when: Its changed registration completes.
    then: >-
      Workspaces gain an uncovered-area report promptly and assignment clears
      the gap.
    provenance: test
    source: >-
      react-console:acceptance/platform-attention/playwright/journeys/responsibilities/RA-ACC-0003.spec.ts#RA-ACC-0003
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-PFM-ELG-013
  - CAP-PFM-ELG-016
journeys:
  - JNY-PFM-ELG-006
open_questions: []
evidence:
  - >-
    services-platform: docs/responsibilities.md;
    docs/milestones/PLAT-M15-home-attention-and-responsibilities.md and
    plans/PLAT-M15-plan.md;
    docs/proposals/responsibilities-and-attention/16-decisions.md;
    aws/platform.service.ts (RESPONSIBILITIES_PERMISSIONS);
    modules/responsibilities/services/registration/**, services/reconcile/**
    (reconcile-workspace.ts, reconcile-after-registration.ts,
    nightly-reconcile-workflow.ts),
    services/persistence/unassigned-responsibilities.ts,
    aws/logic/responsibilities-reconcile.step-function.ts,
    aws/lambda/RECONCILE_SCHEDULER.handler.ts, REGISTRATION.handler.ts,
    db/unassigned-responsibilities.table.ts,
    responsibility-reconcile-jobs.table.ts, _job_steps, _job_events;
    modules/attention/services/evaluate/refresh-unassigned-attention.ts,
    platform-attention.ts; rule-level source and test references
  - >-
    react-console: components/responsibilities/responsibilities-settings.tsx
    (the Nobody looks after this panel);
    acceptance/platform-attention/journeys/responsibilities/RA-ACC-0003.
controls: [TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CHG-005, TC-CHG-006, TC-CRY-001, TC-CRY-002, TC-CRY-003, TC-CRY-004, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-DAT-004, TC-IAM-001, TC-IAM-006, TC-LOG-002, TC-LOG-003, TC-LOG-005, TC-MON-001, TC-PI-001, TC-PI-003, TC-PI-005, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-ELG-04-01, FAS-PFM-ELG-04-03, FAS-PFM-ELG-04-04, FAS-PFM-ELG-04-05]
suites: [TST-PFM-ELG-378, TST-PFM-ELG-390, TST-PFM-ELG-391, TST-PFM-ELG-499, TST-PFM-ELG-501, TST-PFM-ELG-502, TST-PFM-ELG-503, TST-PFM-ELG-506]
---
# Identify and repair gaps in responsibility coverage

## Purpose

Organizations need to know when an area expected to be held has nobody responsible. Defaults and gap reporting support that oversight.

## How It Works

Applications declare their responsibility areas and defaults during deployment. Platform validates and applies the declaration set. Changed declarations trigger bounded immediate reconciliation. Nightly work completes remaining reconciliation and revisits each workspace. Removed defaults remain removed. Assignment changes update the uncovered-area report as part of the write. Attention refresh turns an uncovered area into an administrator-facing advisory. Giving the area a holder clears that advisory when refresh succeeds. Applications can also synchronize holdings derived from their own records without discarding history.

## Relationships

Coverage repair maintains declared responsibility defaults and publishes uncovered-area attention.
