---
id: ATS-ACC-REC-016
scope: CAP-ACC-REC-016
product_area: accounting
module: reconciliation
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-REC-016-01
    title: Single-person warning acceptance
    level: api
    proves:
      - BR-CAP-ACC-REC-016-01
    preconditions: A warning is open.
    steps: Accept with a resolution and retry its key.
    expected: 'Acceptance is immediate without approver or pending request, and replay returns that result.'
    negative: false
    data_needs: No additional fixture beyond the case setup.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#accepts
        a warning by one user, without a second and with no request
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#answers
        the stored acceptance for the same key and request
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#answers 200 with a
        warning accepted by one user, with no approver
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#accepts
        an accepted warning with no approver
      - TST-ACC-REC-066
      - TST-ACC-REC-024
      - TST-ACC-REC-043
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#accepts
      a warning by one user, without a second and with no request
    category: rule
  - id: ATS-ACC-REC-016-02
    title: Blocker request remains blocking
    level: api
    proves:
      - BR-CAP-ACC-REC-016-02
      - BR-CAP-ACC-REC-016-05
    preconditions: An open blocker is available.
    steps: 'Request acceptance, repeat the pending request and supply a client-selected approver.'
    expected: The first request leaves it open and blocking; duplicate and supplied-approver requests fail.
    negative: true
    data_needs: No additional fixture beyond the case setup.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#records
        a blocker’s acceptance request by the first user and leaves it open (`exception.acceptance-requested`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        a second acceptance request while one is pending (409, `acceptance_already_requested`)
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#answers 200 with the
        blocker still open and its acceptance requested by the caller
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#refuses an approvedById
        in the body with 400 approved_by_id_not_allowed
      - TST-ACC-REC-066
      - TST-ACC-REC-024
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#records
      a blocker’s acceptance request by the first user and leaves it open (`exception.acceptance-requested`)
    category: interaction
  - id: ATS-ACC-REC-016-03
    title: Independent blocker approval and repeat
    level: api
    proves:
      - BR-CAP-ACC-REC-016-03
      - BR-CAP-ACC-REC-016-04
    preconditions: A blocker has a pending acceptance request.
    steps: >-
      Approve as requester, stale version and independent approver, retry approval and try a blocker without a
      request.
    expected: >-
      Invalid approvals fail; independent approval preserves requester and approver and returns the accepted
      result on repeat.
    negative: true
    data_needs: Provide Two approvers for this case.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        the requester’s own approval (403, `second_user_required`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        an approval at a version that is not the exception’s (409, `stale_version`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#accepts
        the blocker on a second user’s approval, the requester its resolver (`exception.accepted`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#answers
        the approver’s own approval again under a new key (state idempotency)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        the approval of a blocker with no acceptance requested (409, `no_acceptance_requested`)
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#answers 200 with the
        blocker accepted, the requester its resolver and the second user its approver
      - TST-ACC-REC-066
      - TST-ACC-REC-024
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
      the requester’s own approval (403, `second_user_required`)
    category: permission
  - id: ATS-ACC-REC-016-04
    title: Requester-only withdrawal
    level: api
    proves:
      - BR-CAP-ACC-REC-016-06
    preconditions: A pending blocker request exists.
    steps: 'Withdraw as another person, then requester, then repeat withdrawal.'
    expected: The outsider and repeat fail; requester clears the request and leaves an open blocker with history.
    negative: true
    data_needs: Provide Two approvers for this case.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        another user’s withdrawal (403, `acceptance_requester_only`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#withdraws
        the request by its requester, clearing it and leaving the blocker open
        (`exception.acceptance-withdrawn`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        a withdrawal with no acceptance requested (409, `no_acceptance_requested`)
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#records
        each refused withdrawal as `exception.acceptance-withdrawal-refused`
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#records the withdrawal in
        the exception’s history
      - TST-ACC-REC-066
      - TST-ACC-REC-024
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
      another user’s withdrawal (403, `acceptance_requester_only`)
    category: transition
  - id: ATS-ACC-REC-016-05
    title: Database acceptance guards
    level: api
    proves:
      - BR-CAP-ACC-REC-016-07
    preconditions: Direct exception writes exercise acceptance constraints.
    steps: >-
      Omit blocker approver, reuse requester or resolver, add a warning approver and put a request on a
      warning.
    expected: Every incompatible acceptance row is rejected.
    negative: true
    data_needs: No additional fixture beyond the case setup.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#refuses
        an accepted blocker with no approver
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#refuses
        an approver who is the acceptance’s own requester
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#refuses
        an approver who is the exception’s own resolver
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#refuses
        an accepted warning with an approver
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#refuses
        an acceptance request on a warning
      - >-
        services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#accepts
        an accepted blocker with its request and an approver other than its requester and resolver
      - TST-ACC-REC-043
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/integration/db/reconciliation-exceptions.table.integration.spec.js#refuses
      an accepted blocker with no approver
    category: invariant
  - id: ATS-ACC-REC-016-06
    title: Resolution removes pending acceptance
    level: api
    proves:
      - BR-CAP-ACC-REC-016-08
    preconditions: An open blocker awaits approval.
    steps: Resolve one example manually and clear another through its detector.
    expected: Both paths clear the pending request and record the resolution.
    negative: false
    data_needs: No additional fixture beyond the case setup.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#clears
        a pending acceptance request when the exception is resolved, saying so in `exception.resolved`
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#clears
        a pending acceptance request when its condition is cleared
      - TST-ACC-REC-066
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#clears
      a pending acceptance request when the exception is resolved, saying so in `exception.resolved`
    category: permission
  - id: ATS-ACC-REC-016-07
    title: 'Accept authorization, keys and refusal history'
    level: api
    proves:
      - BR-CAP-ACC-REC-016-09
      - BR-CAP-ACC-REC-016-10
    preconditions: A caller has update but lacks accept.
    steps: 'Try acceptance with that caller, omit a key and change a keyed body.'
    expected: Missing authority and keys and changed requests fail with acceptance refusals recorded as applicable.
    negative: true
    data_needs: Assign callers through the relevant role policies.
    bound_to:
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#refuses a principal who
        may update exceptions but not accept them with 403
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#refuses an accept without
        an Idempotency-Key with 400 idempotency_key_required
      - >-
        services-accounting:modules/reconciliation/tests/integration/services/persistence/reconciliation-exceptions.integration.spec.js#refuses
        the request’s key sent with another request (409, `idempotency_key_reused`)
      - >-
        services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#records each refused
        acceptance command in the exception’s history
      - TST-ACC-REC-024
      - TST-ACC-REC-066
    provenance: test
    source: >-
      services-accounting:modules/reconciliation/tests/e2e/outstanding.e2e.spec.js#refuses a principal who may
      update exceptions but not accept them with 403
    category: validation
  - id: ATS-ACC-REC-016-08
    title: Browser approval request and API result
    level: browser
    proves:
      - BR-CAP-ACC-REC-016-11
      - AS-JNY-ACC-REC-005-02
    preconditions: Mock mode shows a pending blocker acceptance.
    steps: 'Open its detail and approve as another person, comparing separate API acceptance evidence.'
    expected: >-
      The browser sends its current version; API assertions establish accepted status and independent
      approval.
    negative: false
    data_needs: Use reconciliation mock route handlers.
    bound_to:
      - >-
        react-console:e2e/mock/accounting-reconciliation.mock.spec.ts#a second person approves a request to
        accept an exception
      - >-
        react-console:acceptance/accounting/playwright/journeys/reconciliation-close/ACT-ACC-0605.spec.ts#ACT-ACC-0605
      - TST-ACC-REC-022
      - TST-ACC-REC-013
    provenance: test
    source: >-
      react-console:e2e/mock/accounting-reconciliation.mock.spec.ts#a second person approves a request to
      accept an exception
    category: interaction
  - id: ATS-ACC-REC-016-09
    title: Independent acceptance changes readiness
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-REC-016-02
      - BR-CAP-ACC-REC-016-05
      - BR-CAP-ACC-REC-018-04
    interacts_with:
      - CAP-ACC-REC-018
    relies_on:
      - ATS-ACC-REC-016-02
      - ATS-ACC-REC-018-03
    preconditions: Use one isolated workspace with the financial records and caller roles required by the relied-on cases.
    steps:
      - do: 'Request acceptance of an overdue blocker, assess, approve independently and assess again.'
        expect: The request leaves the blocker; completed acceptance removes that overdue blocker.
        provenance: proposed
        source:
          - >-
            specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-016-accept-a-problem-under-policy-with-a-second-persons-approval.md
          - >-
            specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-018-tell-month-end-close-what-stops-a-period-from-closing.md
    expected: The request leaves the blocker; completed acceptance removes that overdue blocker.
    negative: false
    data_needs: >-
      Local merchant and bank accounts, an open operational batch and distinct preparation and approval
      callers.
    bound_to: []
    provenance: proposed
    source:
      - >-
        specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-016-accept-a-problem-under-policy-with-a-second-persons-approval.md
      - >-
        specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-018-tell-month-end-close-what-stops-a-period-from-closing.md
  - id: ATS-ACC-REC-016-10
    title: Acceptance derives the acting approver
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-REC-016-03
      - BR-CAP-ACC-REC-016-04
      - BR-CAP-ACC-REC-020-02
    interacts_with:
      - CAP-ACC-REC-020
    relies_on:
      - ATS-ACC-REC-016-03
      - ATS-ACC-REC-020-02
    preconditions: Use one isolated workspace with the financial records and caller roles required by the relied-on cases.
    steps:
      - do: 'Request acceptance, try supplying an approval identity and approve as a second authorized person.'
        expect: Supplied identity fails and completion names the actual requester and approver.
        provenance: proposed
        source:
          - >-
            specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-016-accept-a-problem-under-policy-with-a-second-persons-approval.md
          - >-
            specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-020-keep-preparing-apart-from-approving-and-leave-a-trail-of.md
    expected: Supplied identity fails and completion names the actual requester and approver.
    negative: false
    data_needs: >-
      Local merchant and bank accounts, an open operational batch and distinct preparation and approval
      callers.
    bound_to: []
    provenance: proposed
    source:
      - >-
        specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-016-accept-a-problem-under-policy-with-a-second-persons-approval.md
      - >-
        specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-020-keep-preparing-apart-from-approving-and-leave-a-trail-of.md
  - id: ATS-ACC-REC-016-11
    title: Acceptance history keeps guarded refusals
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-REC-016-09
      - BR-CAP-ACC-REC-016-10
      - BR-CAP-ACC-REC-020-05
    interacts_with:
      - CAP-ACC-REC-020
    relies_on:
      - ATS-ACC-REC-016-07
      - ATS-ACC-REC-020-05
    preconditions: Use one isolated workspace with the financial records and caller roles required by the relied-on cases.
    steps:
      - do: 'Request acceptance, try self-approval, approve independently and inspect history.'
        expect: Refusal and completion retain their actual actors without allowing requester approval.
        provenance: proposed
        source:
          - >-
            specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-016-accept-a-problem-under-policy-with-a-second-persons-approval.md
          - >-
            specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-020-keep-preparing-apart-from-approving-and-leave-a-trail-of.md
    expected: Refusal and completion retain their actual actors without allowing requester approval.
    negative: true
    data_needs: >-
      Local merchant and bank accounts, an open operational batch and distinct preparation and approval
      callers.
    bound_to: []
    provenance: proposed
    source:
      - >-
        specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-016-accept-a-problem-under-policy-with-a-second-persons-approval.md
      - >-
        specs/accounting/reconciliation/planning/capabilities/CAP-ACC-REC-020-keep-preparing-apart-from-approving-and-leave-a-trail-of.md
evidence:
  - >-
    Bindings identify existing tests at the pinned revisions; proposed cases remain unbound and describe the
    proof still needed.
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  invariant: covered
  interaction: covered
  edge: 'gap: FND-ACC-REC-061'
  failure: 'gap: FND-ACC-REC-061'
  boundary: 'gap: FND-ACC-REC-061'
  concurrency: 'gap: FND-ACC-REC-061'
coverage_notes:
  design_completeness: >-
    Covered categories count specified cases, including proposed cases. Exhaustive state-transition,
    permission-key and domain-invariant traceability remains a separate proof gap.
---

# Accept an understood problem with the required approval: Capability Test Specification

## Coverage

| Rule | Proved by |
|---|---|
| `BR-CAP-ACC-REC-016-01` | `ATS-ACC-REC-016-01` |
| `BR-CAP-ACC-REC-016-02` | `ATS-ACC-REC-016-02` |
| `BR-CAP-ACC-REC-016-03` | `ATS-ACC-REC-016-03` |
| `BR-CAP-ACC-REC-016-04` | `ATS-ACC-REC-016-03` |
| `BR-CAP-ACC-REC-016-05` | `ATS-ACC-REC-016-02` |
| `BR-CAP-ACC-REC-016-06` | `ATS-ACC-REC-016-04` |
| `BR-CAP-ACC-REC-016-07` | `ATS-ACC-REC-016-05` |
| `BR-CAP-ACC-REC-016-08` | `ATS-ACC-REC-016-06` |
| `BR-CAP-ACC-REC-016-09` | `ATS-ACC-REC-016-07` |
| `BR-CAP-ACC-REC-016-10` | `ATS-ACC-REC-016-07` |

## Interactions With Related Capabilities

Blocker request remains blocking. Browser approval request and API result. Independent acceptance changes readiness. Acceptance derives the acting approver. Acceptance history keeps guarded refusals. Proposed interaction cases require executable proof.
