---
id: ATS-PFM-ELG-018
scope: CAP-PFM-ELG-018
product_area: platform
module: eligibility
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-ELG-018-01
    title: Reject actions on final occurrences
    level: unit
    proves:
      - BR-CAP-PFM-ELG-018-01
      - INV-DOM-PFM-ELG-005-04
    preconditions: Resolved and expired occurrences exist.
    steps: Attempt every personal response.
    expected: Every response fails because the occurrence is closed.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/unit/rules.spec.js#refuses every action on an item
        that is no longer open
      - TST-PFM-ELG-408
    provenance: test
    source: >-
      services-platform:modules/attention/tests/unit/rules.spec.js#refuses every action on an item
      that is no longer open
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/unit/rules.spec.js#refuses every action on an item
        that is no longer open
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/unit/rules.spec.js#refuses every action on an item
        that is no longer open
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-018-02
    title: Mark seen without clearing work
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-02
    preconditions: A required item is unread.
    steps: Acknowledge and inspect the summary.
    expected: 'The action is stored and audited, the item remains and its unread contribution ends.'
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - 'services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#acknowledges an item'
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#acknowledges
        an item and records attention.acknowledged against its definition
      - TST-PFM-ELG-396
    provenance: test
    source: 'services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#acknowledges an item'
    category: transition
    action_evidence:
      provenance: test
      source: 'services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#acknowledges an item'
    assertion_evidence:
      provenance: test
      source: 'services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#acknowledges an item'
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-018-03
    title: Prevent required dismissal
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-03
      - AS-JNY-PFM-ELG-004-05
      - INV-DOM-PFM-ELG-005-05
    preconditions: A required occurrence exists.
    steps: Attempt dismissal.
    expected: It fails as not dismissible without audit mutation.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses dismissing a
        required item, with 409 not_dismissable
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#refuses
        dismissing a required item as not_dismissable, writing no trail
      - TST-PFM-ELG-396
      - >-
        react-console:acceptance/platform-attention/playwright/journeys/attention/RA-ACC-0103.spec.ts#RA-ACC-0103
      - TST-PFM-ELG-370
    provenance: test
    source: >-
      services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses dismissing a
      required item, with 409 not_dismissable
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses dismissing a
        required item, with 409 not_dismissable
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses dismissing a
        required item, with 409 not_dismissable
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-018-04
    title: Check postponement bounds
    level: unit
    proves:
      - BR-CAP-PFM-ELG-018-04
    preconditions: A required kind allows one snooze and an advisory is present.
    steps: 'Try repeated or excessive required snoozes, advisory snoozes of 90 and 91 days and a past end.'
    expected: 'Required excesses, 91 days and past ends fail while a 90-day advisory snooze passes.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses a second snooze
        of a required item allowed once, with 409 snooze_limit
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/unit/rules.spec.js#refuses a required item’s
        snooze past its definition’s duration as snooze_limit
      - TST-PFM-ELG-408
      - >-
        services-platform:modules/attention/tests/unit/rules.spec.js#lets an advisory be snoozed as
        often as wanted, up to ninety days at a time
      - >-
        services-platform:modules/attention/tests/unit/rules.spec.js#refuses a snooze that ends in
        the past as snooze_in_past
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses a snooze without
        its end, with 400 naming until
    provenance: test
    source: >-
      services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses a second snooze of
      a required item allowed once, with 409 snooze_limit
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses a second snooze
        of a required item allowed once, with 409 snooze_limit
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses a second snooze
        of a required item allowed once, with 409 snooze_limit
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-018-05
    title: Remove optional dismissed work
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-05
    preconditions: An advisory occurrence is visible.
    steps: Dismiss and inspect the list.
    expected: Its personal dismissal is audited and it no longer appears.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#dismisses an advisory,
        which then leaves the caller’s list
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#dismisses
        an advisory and records attention.dismissed
      - TST-PFM-ELG-396
    provenance: test
    source: >-
      services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#dismisses an advisory,
      which then leaves the caller’s list
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#dismisses an advisory,
        which then leaves the caller’s list
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#dismisses an advisory,
        which then leaves the caller’s list
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-018-06
    title: Version personal responses
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-07
    preconditions: An open item is available.
    steps: 'Acknowledge, snooze and end the snooze.'
    expected: >-
      Each action advances state and is audited, with unsnooze distinguished within the snooze
      event.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#advances
        the state’s version with each action
      - TST-PFM-ELG-396
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#unsnoozes,
        recorded as attention.snoozed with action unsnooze
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#advances
      the state’s version with each action
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#advances
        the state’s version with each action
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#advances
        the state’s version with each action
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-018-07
    title: Update unread totals without clearing the condition
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-017-07
      - BR-CAP-PFM-ELG-018-02
    exercises:
      - CAP-PFM-ELG-018
      - CAP-PFM-ELG-017
    preconditions: A required occurrence appears unread to one person.
    steps: 'Acknowledge it, snooze it, end the snooze and inspect the list and summary at each stage.'
    expected: >-
      Acknowledgement removes its unread contribution; snooze hides it temporarily and ending snooze
      restores an acknowledged item.
    negative: false
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: >-
      services-platform:modules/attention/tests/integration/services/read/viewer-summary-cap.integration.spec.js#stops
      a group of 501 open items at 500 and says it is capped;
      services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#acknowledges
      an item and records attention.acknowledged against its definition
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/tests/integration/services/read/viewer-summary-cap.integration.spec.js#stops
        a group of 501 open items at 500 and says it is capped;
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#acknowledges
        an item and records attention.acknowledged against its definition
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/tests/integration/services/read/viewer-summary-cap.integration.spec.js#stops
        a group of 501 open items at 500 and says it is capped;
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#acknowledges
        an item and records attention.acknowledged against its definition
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-018-08
    title: Suppress queued reminders after a response
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-04
      - BR-CAP-PFM-ELG-019-05
    exercises:
      - CAP-PFM-ELG-018
      - CAP-PFM-ELG-019
    preconditions: A reminder is planned for an open occurrence.
    steps: >-
      Snooze the occurrence before sending, invoke delivery, then inspect its skip record and
      outgoing requests.
    expected: The queued reminder records a snoozed skip and creates no message.
    negative: true
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: 'services-platform:modules/attention/services/reminders/send-reminders.ts:sendTenantReminders'
    action_evidence:
      provenance: proposed
      source: 'services-platform:modules/attention/services/reminders/send-reminders.ts:sendTenantReminders'
    assertion_evidence:
      provenance: proposed
      source: 'services-platform:modules/attention/services/reminders/send-reminders.ts:sendTenantReminders'
    binding_scope: This sequence is proposed and has no executable proof binding.
  - title: Return explicitly from a snooze
    category: transition
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-06
      - BR-CAP-PFM-ELG-018-07
    preconditions: An open required occurrence is snoozed by its addressed person.
    steps: 'End the snooze, read the personal state and inspect the audit.'
    expected: The snooze end is cleared and the audit distinguishes the explicit return action.
    negative: false
    data_needs: 'Run-owned fixtures, separate caller contexts and a controlled clock where required.'
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js
      - TST-PFM-ELG-396
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#unsnoozes,
      recorded as attention.snoozed with action unsnooze
    id: ATS-PFM-ELG-018-09
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#unsnoozes,
        recorded as attention.snoozed with action unsnooze
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/states.integration.spec.js#unsnoozes,
        recorded as attention.snoozed with action unsnooze
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - title: Return at snooze expiry with acknowledgement retained
    category: boundary
    level: api
    proves:
      - BR-CAP-PFM-ELG-018-06
      - BR-CAP-PFM-ELG-018-02
    preconditions: An acknowledged open occurrence is snoozed until a known future instant.
    steps: 'Read immediately before, exactly at and immediately after the end, without running the sweep.'
    expected: >-
      Ordinary visibility returns at the end while acknowledgement remains and the stored occurrence
      stays open.
    negative: true
    data_needs: 'Run-owned fixtures, separate caller contexts and a controlled clock where required.'
    bound_to: []
    provenance: proposed
    source: >-
      services-platform:modules/attention/services/persistence/items.ts;
      services-platform:modules/attention/services/persistence/states.ts:applyStateAction
    id: ATS-PFM-ELG-018-10
    limitations:
      - FND-PFM-ELG-042
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/services/persistence/items.ts;
        services-platform:modules/attention/services/persistence/states.ts:applyStateAction
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/services/persistence/items.ts;
        services-platform:modules/attention/services/persistence/states.ts:applyStateAction
    binding_scope: This sequence is proposed and has no executable proof binding.
  - title: Expose competing first personal responses
    category: concurrency
    level: api
    proves:
      - INV-DOM-PFM-ELG-005-08
      - BR-CAP-PFM-ELG-018-07
    preconditions: An open occurrence reaches one person and has no personal response row.
    steps: >-
      Pause two first actions after the audience read, release their insertions together and inspect
      outcomes and state.
    expected: >-
      A first-insert collision can refuse one request rather than transparently retrying; the stored
      state and accepted audit remain inspectable.
    negative: true
    data_needs: 'Run-owned fixtures, separate caller contexts and a controlled clock where required.'
    bound_to: []
    provenance: proposed
    source: 'services-platform:modules/attention/services/persistence/states.ts:applyStateAction'
    id: ATS-PFM-ELG-018-11
    limitations:
      - FND-PFM-ELG-042
    action_evidence:
      provenance: proposed
      source: 'services-platform:modules/attention/services/persistence/states.ts:applyStateAction'
    assertion_evidence:
      provenance: proposed
      source: 'services-platform:modules/attention/services/persistence/states.ts:applyStateAction'
    binding_scope: This sequence is proposed and has no executable proof binding.
evidence:
  - >-
    services-platform: docs/attention.md;
    docs/milestones/PLAT-M15-home-attention-and-responsibilities.md,
    PLAT-M16-attention-follow-up-and-tuning.md, PLAT-M17-attention-on-records-and-events.md,
    PLAT-M18-workspace-defined-attention.md, plans/PLAT-M15-plan.md, plans/PLAT-M16-plan.md;
    docs/proposals/responsibilities-and-attention/16-decisions.md; aws/platform.service.ts
    (ATTENTION_PERMISSIONS); modules/attention/rules.ts (decideStateAction),
    services/persistence/states.ts, aws/api/attention.routes.ts (acknowledge, snooze, unsnooze,
    dismiss), db/attention-states.table.ts; rule-level source and test references
  - >-
    react-console: components/attention/attention-item-row.tsx, attention-parts.tsx;
    acceptance/platform-attention/journeys/attention/RA-ACC-0103.
related_coverage:
  - capability: CAP-PFM-ELG-017
    scenario: ATS-PFM-ELG-018-07
  - capability: CAP-PFM-ELG-019
    scenario: ATS-PFM-ELG-018-08
coverage:
  rule: 'gap: FND-PFM-ELG-070'
  transition: 'gap: FND-PFM-ELG-070'
  validation: covered
  permission: 'gap: FND-PFM-ELG-070'
  edge: 'gap: FND-PFM-ELG-070'
  failure: 'gap: FND-PFM-ELG-070'
  boundary: covered
  concurrency: 'gap: FND-PFM-ELG-070'
  invariant: 'gap: FND-PFM-ELG-070'
  interaction: covered
invariant_gaps:
  - invariant: INV-DOM-PFM-ELG-005-01
    finding: FND-PFM-ELG-070
    source: >-
      services-platform:modules/attention/db/attention-item-keys.table.ts;
      services-platform:modules/attention/services/persistence/items.ts:deleteOrphans
transition_coverage:
  - model: STATE-PFM-ELG-008
    from: unread
    to: acknowledged
    trigger: acknowledgeMyAttentionItem
    source: 'services-platform:modules/attention/services/persistence/states.ts:applyStateAction'
    scenario: ATS-PFM-ELG-018-02
  - model: STATE-PFM-ELG-008
    from: unread
    to: snoozed
    trigger: snoozeMyAttentionItem
    source: 'services-platform:modules/attention/rules.ts:decideStateAction'
    scenario: ATS-PFM-ELG-018-04
  - model: STATE-PFM-ELG-008
    from: acknowledged
    to: snoozed
    trigger: snoozeMyAttentionItem
    source: 'services-platform:modules/attention/rules.ts:decideStateAction'
    scenario: ATS-PFM-ELG-018-06
  - model: STATE-PFM-ELG-008
    from: snoozed
    to: unread
    trigger: Explicit unsnoozeMyAttentionItem or effective snooze expiry
    finding: FND-PFM-ELG-070
    source: 'services-platform:modules/attention/services/persistence/states.ts:applyStateAction'
  - model: STATE-PFM-ELG-008
    from: unread
    to: dismissed
    trigger: dismissMyAttentionItem
    source: 'services-platform:modules/attention/rules.ts:decideStateAction'
    scenario: ATS-PFM-ELG-018-05
  - model: STATE-PFM-ELG-008
    from: acknowledged
    to: dismissed
    trigger: dismissMyAttentionItem
    finding: FND-PFM-ELG-070
    source: 'services-platform:modules/attention/rules.ts:decideStateAction'
  - model: STATE-PFM-ELG-008
    from: snoozed
    to: acknowledged
    trigger: Explicit unsnoozeMyAttentionItem or effective snooze expiry
    source: 'services-platform:modules/attention/services/persistence/states.ts:applyStateAction'
    scenario: ATS-PFM-ELG-018-06
permission_coverage:
  - key: platform.attention.use
    finding: FND-PFM-ELG-070
    reason: A capability-level authority scenario does not prove every operation protected by this key.
coverage_notes:
  meaning: >-
    Covered means a detailed scenario exists; it does not mean the scenario ran or every executable
    assertion conforms.
  gaps: >-
    Automatic snooze return, retained acknowledgement after expiry and explicit return need
    independent cases. First-action collisions and closure or audience changes during an action need
    race tests.
---

# Manage personal responses to attention items: Capability Test Specification

## Coverage

The scenarios check observable outcomes against the cited contracts. The coverage map retains partial proof and unresolved design boundaries as findings.

| Required Rule | Scenarios |
|---|---|
| `BR-CAP-PFM-ELG-018-01` | `ATS-PFM-ELG-018-01` |
| `BR-CAP-PFM-ELG-018-02` | `ATS-PFM-ELG-018-02`, `ATS-PFM-ELG-018-07`, `ATS-PFM-ELG-018-10` |
| `BR-CAP-PFM-ELG-018-03` | `ATS-PFM-ELG-018-03` |
| `BR-CAP-PFM-ELG-018-04` | `ATS-PFM-ELG-018-04`, `ATS-PFM-ELG-018-08` |
| `BR-CAP-PFM-ELG-018-05` | `ATS-PFM-ELG-018-05` |
| `BR-CAP-PFM-ELG-018-06` | `ATS-PFM-ELG-018-09`, `ATS-PFM-ELG-018-10` |
| `BR-CAP-PFM-ELG-018-07` | `ATS-PFM-ELG-018-06`, `ATS-PFM-ELG-018-09`, `ATS-PFM-ELG-018-11` |

## Interactions With Related Capabilities

Update unread totals without clearing the condition. Acknowledge it, snooze it, end the snooze and inspect the list and summary at each stage.

Suppress queued reminders after a response. Snooze the occurrence before sending, invoke delivery, then inspect its skip record and outgoing requests.
