---
id: ATS-PFM-ELG-020
scope: CAP-PFM-ELG-020
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-020-01
    title: Separate catalogue and settings authority
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-01
    preconditions: Readers and managers are available.
    steps: Inspect catalogue and settings and attempt changes.
    expected: 'Both read the catalogue, while only managers read or replace settings.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#lists the catalog with
        the tenant’s settings merged in
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses the settings to
        a caller without manage, with 403
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#answers 404 for a
        definition nobody registered
    provenance: test
    source: >-
      services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#lists the catalog with the
      tenant’s settings merged in
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#lists the catalog with
        the tenant’s settings merged in
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#lists the catalog with
        the tenant’s settings merged in
    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-020-02
    title: Restrict surface configuration
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-02
    preconditions: A kind supports console only.
    steps: Choose portal and then disable the kind.
    expected: Portal is rejected and disablement succeeds.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a surface the definition does not have
      - TST-PFM-ELG-395
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/items.queries.integration.spec.js#says
        nothing_enabled where the tenant has disabled every definition on the console
      - TST-PFM-ELG-393
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
      a surface the definition does not have
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a surface the definition does not have
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a surface the definition does not have
    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-020-03
    title: Reject settings outside bounds
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-03
    preconditions: A bounded kind is not rank-adjustable.
    steps: 'Try excessive values, rank adjustment and an adjustment of eleven.'
    expected: Each failure identifies the unsupported value or change.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a value outside its declared bounds, naming it
      - TST-PFM-ELG-395
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a rank adjustment on a definition that is not tenant-adjustable
      - >-
        services-platform:modules/attention/tests/unit/request-schemas.spec.js#refuses a tenant rank
        adjustment outside -10..10, naming the field
      - TST-PFM-ELG-407
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses a value outside
        its declared bounds with 400
      - TST-PFM-ELG-388
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
      a value outside its declared bounds, naming it
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a value outside its declared bounds, naming it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a value outside its declared bounds, naming it
    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-020-04
    title: Validate template presentation
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-04
    preconditions: A kind supplies example facts.
    steps: 'Try unknown-fact wording, excessive title length, portal wording and a valid override.'
    expected: The invalid three fail and the valid wording is stored and rendered.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a template override that names an undeclared fact
      - TST-PFM-ELG-395
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#accepts
        a template override that renders the examples
      - >-
        services-platform:modules/attention/tests/unit/request-schemas.spec.js#refuses a title
        override longer than 200 characters
      - TST-PFM-ELG-407
      - >-
        services-platform:modules/attention/tests/unit/request-schemas.spec.js#refuses a portal
        template override while the portal is held
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
      a template override that names an undeclared fact
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a template override that names an undeclared fact
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a template override that names an undeclared fact
    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-020-05
    title: Respect follow-up permissions and bounds
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-05
    preconditions: A kind prohibits workspace escalation.
    steps: 'Request escalation, an unknown role and a sub-hour reminder interval.'
    expected: Every incompatible change fails.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        an escalation on a definition that does not let the tenant change it
      - TST-PFM-ELG-395
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        an escalation to a role no product role carries
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        a reminder cadence shorter than an hour
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
      an escalation on a definition that does not let the tenant change it
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        an escalation on a definition that does not let the tenant change it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        an escalation on a definition that does not let the tenant change it
    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-020-06
    title: Protect settings replacement
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-06
    preconditions: A settings version has been read.
    steps: 'Replace it, reuse the old version and change wording and rank.'
    expected: Stale replacement fails and accepted changes audit their earlier and replacement values.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, then
        refuses the same write at the old version with 409
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#audits
        a change of the template overrides and the rank adjustment with both before and after
      - TST-PFM-ELG-395
    provenance: test
    source: >-
      services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, then refuses
      the same write at the old version with 409
    category: concurrency
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, then
        refuses the same write at the old version with 409
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, then
        refuses the same write at the old version with 409
    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-020-07
    title: Limit personal hiding
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-07
      - INV-DOM-PFM-ELG-005-09
    preconditions: Required and advisory kinds are available.
    steps: 'Hide each, hide an unknown kind, use an old version and request hidden entries.'
    expected: Only valid advisory hiding succeeds and explicit inclusion restores its display.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, hiding an
        advisory definition from the caller’s list
      - TST-PFM-ELG-388
      - >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#refuses to hide a
        required definition with 400 naming it
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#refuses
        to hide a definition that does not exist
      - TST-PFM-ELG-394
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#refuses
        a stale version, the row unchanged
      - >-
        services-platform:modules/attention/tests/integration/services/read/viewer-summary.integration.spec.js#shows
        a hidden definition when asked to include it
      - TST-PFM-ELG-399
    provenance: test
    source: >-
      services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, hiding an
      advisory definition from the caller’s list
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, hiding an
        advisory definition from the caller’s list
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/e2e/attention.e2e.spec.js#writes them, hiding an
        advisory definition from 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-020-08
    title: Keep preference choices personal
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-08
    preconditions: Two people share the organization and one has not saved preferences.
    steps: 'Read the untouched preferences, change the other person’s hidden kinds and read both again.'
    expected: >-
      The untouched person starts with no hidden kinds and the other person’s choices do not alter
      that view.
    negative: false
    data_needs: Existing evidence fixtures provide the described setup.
    bound_to:
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
        one person’s preferences their own
      - TST-PFM-ELG-394
      - >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#answers
        the defaults to a person who wrote none
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
      one person’s preferences their own
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
        one person’s preferences their own
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
        one person’s preferences their own
    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-020-09
    title: Hide presentation without resolving work
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-017-06
      - BR-CAP-PFM-ELG-020-07
    exercises:
      - CAP-PFM-ELG-020
      - CAP-PFM-ELG-017
    preconditions: An advisory and a required occurrence reach one person.
    steps: >-
      Hide the advisory in personal preferences, request hidden items explicitly, then disable the
      kind in shared settings.
    expected: >-
      Personal hiding affects only that person, explicit inclusion restores the advisory and shared
      disablement leaves stored occurrences open.
    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.integration.spec.js#pages
      each sort by its keyset without repeating or dropping an item;
      services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#refuses
      to hide a required definition, naming it, the row unchanged
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/tests/integration/services/read/viewer-summary.integration.spec.js#pages
        each sort by its keyset without repeating or dropping an item;
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#refuses
        to hide a required definition, naming it, the row unchanged
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/tests/integration/services/read/viewer-summary.integration.spec.js#pages
        each sort by its keyset without repeating or dropping an item;
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#refuses
        to hide a required definition, naming it, the row unchanged
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-020-10
    title: Recheck settings before reminder delivery
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-019-05
      - BR-CAP-PFM-ELG-020-05
    exercises:
      - CAP-PFM-ELG-020
      - CAP-PFM-ELG-019
    preconditions: A reminder is planned under an enabled kind policy.
    steps: Disable its reminder policy at the current settings version and invoke delivery.
    expected: The sender records a disabled-policy skip and sends no message.
    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/reminders/reminders.integration.spec.js#skips
      a due reminder whose item was resolved before it went;
      services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
      an escalation on a definition that does not let the tenant change it
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/tests/integration/services/reminders/reminders.integration.spec.js#skips
        a due reminder whose item was resolved before it went;
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        an escalation on a definition that does not let the tenant change it
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/attention/tests/integration/services/reminders/reminders.integration.spec.js#skips
        a due reminder whose item was resolved before it went;
        services-platform:modules/attention/tests/integration/services/persistence/settings.integration.spec.js#refuses
        an escalation on a definition that does not let the tenant change it
    binding_scope: This sequence is proposed and has no executable proof binding.
  - title: Keep private choices independent
    category: invariant
    level: api
    proves:
      - BR-CAP-PFM-ELG-020-08
    preconditions: Two staff members can read the same advisory kind and neither has preferences.
    steps: >-
      Hide that advisory for one person, inspect both preference rows and request the other person’s
      view.
    expected: Only the owner’s hidden-kind choice changes; the other person retains default visibility.
    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/preferences.integration.spec.js
      - TST-PFM-ELG-394
    provenance: test
    source: >-
      services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
      one person’s preferences their own
    id: ATS-PFM-ELG-020-11
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
        one person’s preferences their own
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/attention/tests/integration/services/persistence/preferences.integration.spec.js#keeps
        one person’s preferences their own
    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
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/aws/api/attention.routes.ts (definitions, settings,
    preferences), services/persistence/settings.ts, preferences.ts, definitions.ts,
    db/attention-settings.table.ts, attention-preferences.table.ts; rule-level source and test
    references
  - >-
    react-console: app/(console)/console/[tenantId]/settings: shared and personal attention screens
    absent
related_coverage:
  - capability: CAP-PFM-ELG-017
    scenario: ATS-PFM-ELG-020-09
  - capability: CAP-PFM-ELG-019
    scenario: ATS-PFM-ELG-020-10
coverage:
  rule: covered
  transition: 'gap: FND-PFM-ELG-072'
  validation: covered
  permission: 'gap: FND-PFM-ELG-072'
  edge: 'gap: FND-PFM-ELG-072'
  failure: 'gap: FND-PFM-ELG-072'
  boundary: covered
  concurrency: covered
  invariant: 'gap: FND-PFM-ELG-072'
  interaction: covered
invariant_gaps:
  - invariant: INV-DOM-PFM-ELG-005-01
    finding: FND-PFM-ELG-072
    source: >-
      services-platform:modules/attention/db/attention-item-keys.table.ts;
      services-platform:modules/attention/services/persistence/items.ts:deleteOrphans
transition_coverage: []
permission_coverage:
  - key: platform.attention.read
    finding: FND-PFM-ELG-072
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: platform.attention.manage
    finding: FND-PFM-ELG-072
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: platform.attention.use
    finding: FND-PFM-ELG-072
    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: >-
    Shared disablement must be checked against lists, retained occurrences and delivery together.
    Private preference races, exact text and cadence bounds and failed audited settings writes need
    proof.
---

# Adjust shared attention and personal visibility: 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-020-01` | `ATS-PFM-ELG-020-01` |
| `BR-CAP-PFM-ELG-020-02` | `ATS-PFM-ELG-020-02` |
| `BR-CAP-PFM-ELG-020-03` | `ATS-PFM-ELG-020-03` |
| `BR-CAP-PFM-ELG-020-04` | `ATS-PFM-ELG-020-04` |
| `BR-CAP-PFM-ELG-020-05` | `ATS-PFM-ELG-020-05`, `ATS-PFM-ELG-020-10` |
| `BR-CAP-PFM-ELG-020-06` | `ATS-PFM-ELG-020-06` |
| `BR-CAP-PFM-ELG-020-07` | `ATS-PFM-ELG-020-07`, `ATS-PFM-ELG-020-09` |
| `BR-CAP-PFM-ELG-020-08` | `ATS-PFM-ELG-020-08`, `ATS-PFM-ELG-020-11` |

## Interactions With Related Capabilities

Hide presentation without resolving work. Hide the advisory in personal preferences, request hidden items explicitly, then disable the kind in shared settings.

Recheck settings before reminder delivery. Disable its reminder policy at the current settings version and invoke delivery.
