---
id: ATS-ACC-BKS-016
scope: CAP-ACC-BKS-016
product_area: accounting
module: books
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-ACC-BKS-016-01
    title: Apply resource permission tiers
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-01
    preconditions: Reader and administrator principals exist.
    steps: Read each configuration kind and attempt mutations with both principals.
    expected: >-
      The reader can inspect but receives write refusals without changes; valid
      administrator mutations succeed.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-047
      - TST-ACC-BKS-043
      - TST-ACC-BKS-051
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
      refused the create 403 permission_missing
    category: permission
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
        refused the create 403 permission_missing
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#leaves
        the unit as it was after the refusals
      - >-
        services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js#leaves
        the departments as they were after the refusals
      - >-
        services-accounting:modules/books/tests/e2e/document-templates-security.e2e.spec.js#is
        refused the settings’ save 403 permission_missing
  - id: ATS-ACC-BKS-016-02
    title: Require application access and licensing
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-02
    preconditions: 'Callers include denied access, missing licensing and access-only cases.'
    steps: Request resource routes and vocabularies.
    expected: >-
      Access and licensing failures are distinct, and vocabulary reads need
      application access alone.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-048
      - TST-ACC-BKS-047
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/currencies.e2e.spec.js#answers
      403 app_not_permitted to a caller denied accounting.application.access
    category: permission
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/currencies.e2e.spec.js#answers
        403 app_not_permitted to a caller denied accounting.application.access
      - >-
        services-accounting:modules/books/tests/e2e/currencies.e2e.spec.js#answers
        403 app_unlicensed in a tenant whose licence does not carry Accounting
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#answers
        the fifteen default GL account purposes in display order
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#refuses
        that principal the business unit list 403 permission_missing (premise:
        the vocabularies need less)
  - id: ATS-ACC-BKS-016-03
    title: Separate resource permissions
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-03
    preconditions: The caller administers business units only.
    steps: Read departments and templates and create a department.
    expected: Every unrelated-resource request receives a permission refusal.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-043
      - TST-ACC-BKS-051
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js#is
      refused a department create 403 permission_missing, though it may update
      the unit
    category: permission
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js#is
        refused a department create 403 permission_missing, though it may update
        the unit
      - >-
        services-accounting:modules/books/tests/e2e/document-templates-security.e2e.spec.js#is
        refused the template list 403 permission_missing
  - id: ATS-ACC-BKS-016-04
    title: Confine records to their workspace
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-04
    preconditions: Two workspaces contain colliding identities.
    steps: >-
      Attempt foreign reads, listings, deletion and references, including a
      cross-workspace database row.
    expected: >-
      Foreign data stays absent and inaccessible and the database refuses an
      invalid reference.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-047
      - TST-ACC-BKS-063
      - TST-ACC-BKS-046
      - TST-ACC-BKS-024
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#answers
      404 in tenant B to a read of tenant A’s business unit
    category: invariant
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#answers
        404 in tenant B to a read of tenant A’s business unit
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#answers
        400 in tenant B to a GL account naming tenant A’s unit
      - >-
        services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js#refuses
        a business unit inserted with another tenant’s tenant_id (WITH CHECK)
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to a body whose tenant_id is not the path’s
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0040.spec.ts#ACT-ACC-0040
  - id: ATS-ACC-BKS-016-05
    title: Reject stale or incomplete replacements
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-05
    preconditions: Records have known current versions.
    steps: >-
      Save without version, with an old version, without ordinary optional or
      required values, and with unknown properties.
    expected: >-
      Version, required and unknown-property failures are refused; omitted
      ordinary optional values clear.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-046
      - TST-ACC-BKS-072
      - TST-ACC-BKS-058
      - TST-ACC-BKS-025
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      400 to a replacement without sys_version
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to a replacement without sys_version
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        409 StaleObject to a replacement at the version before the last
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/bank-accounts.integration.spec.js#answers
        the replaced record at version 2, the cleared description left out
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming is_active to a replacement that leaves it out
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to a property the contract does not carry
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0041.spec.ts#ACT-ACC-0041
  - id: ATS-ACC-BKS-016-06
    title: Clean text before validation
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-06
    preconditions: No prior record is required.
    steps: Save padded names and whitespace-only names.
    expected: Padding is removed and blank required names fail.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-050
      - TST-ACC-BKS-061
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
      400 naming name for a name of nothing but spaces
    category: validation
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
        400 naming name for a name of nothing but spaces
      - >-
        services-accounting:modules/books/tests/integration/db/accounting-dimensions.table.integration.spec.js#trims
        every text column it stores, and turns a blank description into null
  - id: ATS-ACC-BKS-016-07
    title: Respect configured locks
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-07
    preconditions: Records have full and delete-only locks.
    steps: Replace and delete under each lock.
    expected: The mutation is accepted or refused according to the lock’s scope.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-089
      - TST-ACC-BKS-102
    provenance: test
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/gl-accounts.integration.spec.js#refuses
      an account locked against updates
    category: rule
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/gl-accounts.integration.spec.js#refuses
        an account locked against updates
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/gl-accounts.integration.spec.js#refuses
        an account locked against deletes
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/tax-zones.integration.spec.js#refuses
        a replacement of a zone locked against updates and deletes, and a delete
        of one locked against deletes
  - id: ATS-ACC-BKS-016-08
    title: Validate page requests and offset syntax
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-08
    preconditions: An unchanged collection spans multiple pages.
    steps: >-
      Read continuations, exceed the size limit and send a malformed offset
      cursor.
    expected: Pages cover the collection once; invalid limits and malformed syntax fail.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-046
    provenance: test
    source: >-
      services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
      a page of the limit with the cursor of the next page
    category: boundary
    binding_evidence:
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        a page of the limit with the cursor of the next page
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to a limit above 200
      - >-
        services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js#answers
        400 to a cursor the list never answered
  - id: ATS-ACC-BKS-016-09
    title: Keep reader editors safe
    level: browser
    proves:
      - BR-CAP-ACC-BKS-016-09
    preconditions: A reader principal is available.
    steps: Open configuration lists and editors.
    expected: Lists load and editors expose no working mutation controls.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to:
      - TST-ACC-BKS-011
      - TST-ACC-BKS-012
    provenance: test
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0013.spec.ts#ACT-ACC-0013
    category: permission
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0013.spec.ts#ACT-ACC-0013
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0014.spec.ts#ACT-ACC-0014
  - id: ATS-ACC-BKS-016-10
    title: Audit configuration without alteration
    level: browser
    proves:
      - AS-JNY-ACC-BKS-005-01
      - AS-JNY-ACC-BKS-005-02
      - AS-JNY-ACC-BKS-005-03
    preconditions: A reader and isolated workspace records exist.
    steps: Complete the configuration audit journey.
    expected: >-
      Local configuration is inspectable, writes fail and foreign-workspace data
      remains absent.
    negative: true
    data_needs: The setup needs no extra fixture records.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0013.spec.ts#ACT-ACC-0013
    category: interaction
    binding_evidence:
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0013.spec.ts#ACT-ACC-0013
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0014.spec.ts#ACT-ACC-0014
      - >-
        react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0040.spec.ts#ACT-ACC-0040
    component_bindings:
      - TST-ACC-BKS-011
      - TST-ACC-BKS-012
      - TST-ACC-BKS-024
    finding: FND-ACC-BKS-084
    note: >-
      The original component assertions use independent fixtures; no existing
      suite executes this complete journey with shared records.
  - id: ATS-ACC-BKS-016-11
    title: Refuse the second replacement of a shared read version
    category: concurrency
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-05
    preconditions: >-
      Two administrators read the same version of the relevant mutable record.
      Each prepares a different otherwise valid replacement.
    steps: >-
      Release both replacement requests from a barrier. Read the record again
      and retry the losing payload at its original version.
    expected: >-
      One replacement commits, the other is stale, and repeating the stale
      request preserves the winning values.
    negative: true
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 naming is_active to a replacement that leaves it out
    interaction_with:
      - CAP-ACC-BKS-016
    binding_evidence: []
  - id: ATS-ACC-BKS-016-12
    title: Resource grants govern unit setup atomically
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-01
      - BR-CAP-ACC-BKS-001-03
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Attempt creation as a reader, inspect unit and calendar absence, then
      repeat as an administrator.
    expected: >-
      The refused creation leaves no setup and the authorized creation supplies
      complete books.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
        refused the create 403 permission_missing
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/fiscal-years.integration.spec.js#gives
        the new unit exactly its two years, the one containing today and the
        next
    exercises:
      - CAP-ACC-BKS-016
      - CAP-ACC-BKS-001
    workflows:
      - WF-ACC-BKS-002
      - WF-ACC-BKS-003
    binding_evidence: []
  - id: ATS-ACC-BKS-016-13
    title: Read-only chart access preserves protected destinations
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-01
      - BR-CAP-ACC-BKS-005-05
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Read chart and defaults as a reader, attempt account replacement and
      removal, then compare the stored account and assignments.
    expected: Reader access leaves every account and default unchanged.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
        refused the create 403 permission_missing
      - >-
        services-accounting:modules/books/tests/integration/services/persistence/gl-accounts.integration.spec.js#refuses
        deactivating the unit’s Accounts Receivable default, naming the purpose
    exercises:
      - CAP-ACC-BKS-016
      - CAP-ACC-BKS-005
    workflows: []
    binding_evidence: []
  - id: ATS-ACC-BKS-016-14
    title: Workspace availability precedes configuration access
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-02
      - BR-CAP-ACC-BKS-019-07
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Exercise an ordinary configuration read against each observed workspace
      availability state with reader, administrator and staff contexts.
    expected: >-
      The request gate applies the cited availability exceptions before
      configuration work can proceed.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-accounting:modules/books/tests/e2e/currencies.e2e.spec.js#answers
        403 app_unlicensed in a tenant whose licence does not carry Accounting
      - >-
        services-accounting:modules/maintenance/tests/unit/lifecycle/tenant-availability.spec.js#serves
        only an active tenant that is not disabled, and refuses every other
        combination
    exercises:
      - CAP-ACC-BKS-016
      - CAP-ACC-BKS-019
    workflows: []
    binding_evidence: []
  - id: ATS-ACC-BKS-016-15
    title: A stale document choice leaves the unit unchanged
    category: interaction
    level: api
    proves:
      - BR-CAP-ACC-BKS-016-05
      - BR-CAP-ACC-BKS-015-04
    preconditions: >-
      Run-owned records satisfy the preconditions of the referenced capability
      proofs.
    steps: >-
      Save one valid unit document selection, then submit a different valid
      selection at the old version and resolve content.
    expected: >-
      The stale choice cannot replace the saved selection or change subsequent
      resolution.
    negative: false
    data_needs: >-
      Run-owned records for the stated setup; retain the initial values for
      comparison.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
        400 naming is_active to a replacement that leaves it out
      - >-
        services-accounting:modules/books/tests/e2e/document-templates.e2e.spec.js#answers
        400 to a business unit naming an inactive template
    exercises:
      - CAP-ACC-BKS-016
      - CAP-ACC-BKS-015
    workflows:
      - WF-ACC-BKS-002
    binding_evidence: []
evidence:
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0013.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0014.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0040.spec.ts
  - >-
    Verified source file:
    react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0041.spec.ts
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/business-units.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/currencies.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/departments.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/document-templates-security.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/accounting-dimensions.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/db/configuration-records.table.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/bank-accounts.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/gl-accounts.integration.spec.js
  - >-
    Verified source file:
    services-accounting:modules/books/tests/integration/services/persistence/tax-zones.integration.spec.js
product_intent: proposed
coverage:
  rule: covered
  transition: not-applicable
  validation: covered
  permission: covered
  edge: 'gap: FND-ACC-BKS-077'
  failure: 'gap: FND-ACC-BKS-077'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  rule:
    scenarios:
      - ATS-ACC-BKS-016-07
    provenance: documented
    source:
      - ATS-ACC-BKS-016-07
  transition:
    reason: >-
      This capability initiates no independent state-model transition; its edits
      or reads use the owning record lifecycle and related-capability scenarios.
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  validation:
    scenarios:
      - ATS-ACC-BKS-016-05
      - ATS-ACC-BKS-016-06
    provenance: documented
    source:
      - ATS-ACC-BKS-016-05
      - ATS-ACC-BKS-016-06
  permission:
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
  edge:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-077
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-077
  failure:
    scenarios: []
    provenance: unknown
    source: FND-ACC-BKS-077
    reason: >-
      No scenario isolates this category for the capability at the pinned
      revision.
    gap: FND-ACC-BKS-077
  boundary:
    scenarios:
      - ATS-ACC-BKS-016-08
    provenance: documented
    source:
      - ATS-ACC-BKS-016-08
  concurrency:
    scenarios:
      - ATS-ACC-BKS-016-11
    provenance: documented
    source:
      - ATS-ACC-BKS-016-11
  invariant:
    scenarios:
      - ATS-ACC-BKS-016-04
    provenance: documented
    source:
      - ATS-ACC-BKS-016-04
  interaction:
    scenarios:
      - ATS-ACC-BKS-016-10
      - ATS-ACC-BKS-016-12
      - ATS-ACC-BKS-016-13
      - ATS-ACC-BKS-016-14
      - ATS-ACC-BKS-016-15
    provenance: documented
    source:
      - ATS-ACC-BKS-016-10
      - ATS-ACC-BKS-016-12
      - ATS-ACC-BKS-016-13
      - ATS-ACC-BKS-016-14
      - ATS-ACC-BKS-016-15
rule_coverage:
  - rule: BR-CAP-ACC-BKS-016-01
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-12
      - ATS-ACC-BKS-016-13
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#is
      refused the create 403 permission_missing
  - rule: BR-CAP-ACC-BKS-016-02
    scenarios:
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-14
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/currencies.e2e.spec.js#answers
      403 app_unlicensed in a tenant whose licence does not carry Accounting
  - rule: BR-CAP-ACC-BKS-016-03
    scenarios:
      - ATS-ACC-BKS-016-03
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/accounting-dimensions-security.e2e.spec.js#is
      refused a department create 403 permission_missing, though it may update
      the unit
  - rule: BR-CAP-ACC-BKS-016-04
    scenarios:
      - ATS-ACC-BKS-016-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/configuration-security.e2e.spec.js#answers
      404 in tenant B to a read of tenant A’s business unit
  - rule: BR-CAP-ACC-BKS-016-05
    scenarios:
      - ATS-ACC-BKS-016-05
      - ATS-ACC-BKS-016-11
      - ATS-ACC-BKS-016-15
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/payment-terms.e2e.spec.js#answers
      400 naming is_active to a replacement that leaves it out
  - rule: BR-CAP-ACC-BKS-016-06
    scenarios:
      - ATS-ACC-BKS-016-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/e2e/departments.e2e.spec.js#answers
      400 naming name for a name of nothing but spaces
  - rule: BR-CAP-ACC-BKS-016-07
    scenarios:
      - ATS-ACC-BKS-016-07
    provenance: documented
    source: >-
      services-accounting:modules/books/services/persistence/gl-accounts.ts:updateGlAccount
  - rule: BR-CAP-ACC-BKS-016-08
    scenarios:
      - ATS-ACC-BKS-016-08
    provenance: documented
    source: 'services-accounting:modules/books/aws/api/paging.ts:decodeCursor'
  - rule: BR-CAP-ACC-BKS-016-09
    scenarios:
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      react-console:acceptance/accounting/playwright/journeys/configuration/ACT-ACC-0013.spec.ts#ACT-ACC-0013
related_coverage:
  - capability: CAP-ACC-BKS-001
    scenarios:
      - ATS-ACC-BKS-016-12
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - capability: CAP-ACC-BKS-005
    scenarios:
      - ATS-ACC-BKS-016-13
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - capability: CAP-ACC-BKS-019
    scenarios:
      - ATS-ACC-BKS-016-14
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
workflow_coverage:
  - workflow: WF-ACC-BKS-002
    interactions:
      - ATS-ACC-BKS-016-12
      - ATS-ACC-BKS-016-15
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-002-replace-a-business-units-settings.md
    gap: FND-ACC-BKS-077
  - workflow: WF-ACC-BKS-003
    interactions:
      - ATS-ACC-BKS-016-12
    provenance: documented
    source: >-
      specs/accounting/books/design/workflows/WF-ACC-BKS-003-delete-a-business-unit-and-its-owned-setup.md
    gap: FND-ACC-BKS-077
coverage_interpretation: >-
  Covered means a specified scenario exists. Proposed scenarios and registered
  bindings do not establish a passed run or verified conformance.
invariant_coverage:
  - invariant: INV-DOM-ACC-BKS-006-01
    scenarios:
      - ATS-ACC-BKS-012-01
      - ATS-ACC-BKS-012-02
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      to be deactivated, 409 payment_method_system
  - invariant: INV-DOM-ACC-BKS-006-02
    scenarios:
      - ATS-ACC-BKS-012-03
      - ATS-ACC-BKS-012-04
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/payment-methods.integration.spec.js#refuses
      an offline method offered in the portal, naming the rule
  - invariant: INV-DOM-ACC-BKS-006-03
    scenarios:
      - ATS-ACC-BKS-011-03
      - ATS-ACC-BKS-013-06
    provenance: documented
    source: >-
      services-accounting:modules/books/tests/integration/services/persistence/tax-classes.integration.spec.js#translates
      the refusal of each restrict foreign key to a tax class into a 409 naming
      it, the invoice lines among them
  - invariant: INV-DOM-ACC-BKS-006-04
    scenarios:
      - ATS-ACC-BKS-017-01
    provenance: documented
    source: >-
      services-accounting:modules/books/db/settings.table.ts:settings_template_references_trigger
  - invariant: INV-DOM-ACC-BKS-006-05
    scenarios:
      - ATS-ACC-BKS-018-10
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/db/schedules.table.ts;
      services-accounting:modules/maintenance/aws/lambda/CONSUMER.ts:handler;
      services-accounting:package-lock.json
  - invariant: INV-DOM-ACC-BKS-006-06
    scenarios:
      - ATS-ACC-BKS-018-05
      - ATS-ACC-BKS-018-07
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/integration/services/scheduling/schedules-end-to-end.integration.spec.js#pauses
      the schedule after the fifth failure in a row
  - invariant: INV-DOM-ACC-BKS-006-07
    scenarios:
      - ATS-ACC-BKS-019-04
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/integration/db/declaration-completeness.integration.spec.js#leaves
      no tenant-keyed table undeclared
  - invariant: INV-DOM-ACC-BKS-006-08
    scenarios:
      - ATS-ACC-BKS-019-05
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/integration/services/exports/seed-everything.integration.spec.js#stops
      a batch whose record carries a Stripe secret’s shape, blocked with nothing
      staged
  - invariant: INV-DOM-ACC-BKS-006-09
    scenarios:
      - ATS-ACC-BKS-019-06
    provenance: documented
    source: >-
      services-accounting:modules/maintenance/tests/unit/lifecycle/tenant-availability.spec.js#serves
      only an active tenant that is not disabled, and refuses every other
      combination
permission_coverage:
  - key: accounting.application.access
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.business-units.read
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.business-units.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.gl-accounts.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.bank-accounts.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.merchant-accounts.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.departments.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.accounting-projects.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.payment-terms.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.payment-methods.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.payment-methods.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.tax-classes.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.tax-zones.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.exchange-rates.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.fiscal-years.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.document-templates.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.settings.create
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.settings.delete
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
  - key: accounting.settings.bulk
    where_checked: api
    scenarios:
      - ATS-ACC-BKS-016-01
      - ATS-ACC-BKS-016-02
      - ATS-ACC-BKS-016-03
      - ATS-ACC-BKS-016-09
    provenance: documented
    source: >-
      specs/accounting/books/planning/capabilities/CAP-ACC-BKS-016-control-who-may-see-and-change-the-books-configuration.md
reviewed_at: '2026-10-23'
---

# Control access and safe changes to books configuration: Capability Test Specification

## Coverage

- Apply resource permission tiers.
- Require application access and licensing.
- Separate resource permissions.
- Confine records to their workspace.
- Reject stale or incomplete replacements.
- Clean text before validation.
- Respect configured locks.
- Validate page requests and offset syntax.
- Keep reader editors safe.

The structured coverage map distinguishes specified examples from remaining findings. Proposed examples require executable proof before qualification.

## Interactions With Related Capabilities

- Audit configuration without alteration.
- Resource grants govern unit setup atomically.
- Read-only chart access preserves protected destinations.
- Workspace availability precedes configuration access.
- A stale document choice leaves the unit unchanged.

Related-capability and workflow references identify the seams each scenario exercises. The lifecycle coverage record retains transitions that still need individual proof.

## Binding Review

The pinned service and browser assertions support the registered bindings. Original test references remain beside each scenario so partial evidence and unresolved conformance remain reviewable.
