---
id: TST-PFM-SEC-083
title: Invitation arc database and service checks
kind: integration
product_area: platform
module: security
revision: 2
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: services-platform
files:
  - modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js
implements:
  - ATS-PFM-SEC-005-01
  - ATS-PFM-SEC-005-02
  - ATS-PFM-SEC-005-05
  - ATS-PFM-SEC-005-11
  - ATS-PFM-SEC-005-12
  - ATS-PFM-SEC-011-03
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 3
isolation: Use the prepared test database and suite-owned fixture rows; retain shared seed records.
assertion_evidence:
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#the
      invitation journey: invited, provisioned, e-mailed, accepted
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      1: the administrator invites the person
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#creates
      the user as invited
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#creates
      it with the e-mail the invitation will go to
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      the invitation it wrote
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      when the invitation will expire
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      that the invitation e-mail was sent
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      no token the administrator could read
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      2: the invite creates the sign-in account
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      the person’s sign-in account as an active identity in the pool of their wall
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#leaves
      the person invited until they accept
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      3: the invitation e-mail that left for the person
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#goes
      to the invited address
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#carries
      the invitation subject the console and the deployed suite both expect
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#carries
      an acceptance link on the console’s acceptance path
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#carries
      the token in that link
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      only the hash of the token it sent
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      when the invitation went out
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      4: the acceptance page summarises the link without anybody signing in
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      the person, the masked address, the expiry, the organization and the kind of account, and
      nothing else
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#masks
      the address, so a valid token never becomes an address
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#names
      the organization by its name and never by its id, which is what the page shows the person
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      5: the person accepts with a password of their own
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      the acceptance as done
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      the user the token named, and no other
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      it as a first acceptance rather than a repeat
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#sets
      the password in the pool, on the account provisioning made
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#makes
      the account active
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#spends
      the invitation, stamping when it was accepted
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#counts
      the presentation of the token against the invitation, beside the send that reached the person
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      6: the token, once spent
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#no
      longer summarises, saying only that the link does not work
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#answers
      a repeated acceptance as the success it already was
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#leaves
      the account active after the repeated acceptance
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#sends
      no second e-mail for any of it
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      7: the trail the journey left behind
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      the invitation and the acceptance, newest first
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      the provisioning as succeeded
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      the person themselves as the actor of their own acceptance
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#keeps
      the raw token out of the trail
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#the
      invitation journey: a resent invitation, the first link dead
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      1: the resend supersedes what was outstanding
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#supersedes
      the one invitation that was outstanding
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#writes
      a new invitation rather than reissuing the old one
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#leaves
      the person with both invitations on record, newest first
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#sends
      the second invitation as its own message
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#gives
      the second message a token of its own
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#finds
      the account the invite made rather than creating a second one
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      2: the token of the first e-mail, now superseded
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#no
      longer summarises, and says it was superseded
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#is
      refused on acceptance, with the same sentence a token that never existed gets, and the same
      code the summary gave
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#leaves
      the person invited after that refusal
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#records
      the refusal in the trail with the reason the administrator can act on
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#stage
      3: the token of the second e-mail
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#accepts
      the invitation
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#makes
      the account active
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#spends
      the second invitation and not the first
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#the
      trail the journey left
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#wrote
      a security audit row for every lifecycle outcome, so the scan below reads a real trail
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#finds
      the raw token in the e-mail that carried it, which is what makes the absence below mean
      anything
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#carries
      neither the raw token nor its hash anywhere in what it recorded
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#carries
      no password either, having been given one
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#the
      invitation journey: a person brought back can sign in again
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#a
      revoked person invited back
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#was
      disabled in the pool by the revocation, which is what the way back has to undo
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#is
      invited back on the same row
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#enables
      the same pool account at acceptance
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#leaves
      the pool account enabled and the person active, so they can sign in
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#a
      suspended person reinstated
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#was
      disabled in the pool by the suspension
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#enables
      the pool account again and reports no problem with it
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#the
      invitation journey: why a link does not work
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#a
      link that sat in the inbox too long
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#says
      the invitation expired
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#a
      link whose membership was withdrawn
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#says
      the invitation was revoked
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#a
      link whose account was suspended
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#says
      the invitation was revoked, because a withdrawn link is one fact however it was withdrawn
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#a
      link nobody was ever sent
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#says
      there is no such invitation, for a token of the right shape that names nothing
  - provenance: test
    source: >-
      services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js#says
      the same for a token that is not even the right shape, so the shape is no oracle either
dependency_evidence: >-
  The prepared PostgreSQL database supplies the persisted fixtures and constraints exercised here.
  The suite controls Cognito, message delivery at the declared seams; those collaborators remain
  outside its live proof.
evidence:
  - >-
    services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js
  - >-
    Static review at the recorded source revision; executable results remain not-run and conformance
    remains not-verified.
binding_note: >-
  Each binding names the scenario to which this file contributes assertions. A binding is not a
  recorded pass and does not extend the file’s dependency boundary.
examiner: codex
examined_at: '2026-10-23'
final_text: OpenAI
dependency_review:
  provenance: test
  source: >-
    services-platform:modules/security/tests/integration/lifecycle/invitation/invitation-arc.integration.spec.js
  explicit_no_doubles: false
  identified_double_boundaries:
    - Cognito
    - message delivery
---
# Invitation arc database and service checks

## Verification Boundary

The file exercises database or service behavior through the local integration harness. The assertion references identify the source checks for invitation arc.

## What This Suite Proves

The source assertions support the observations named in the bound scenarios. A scenario spanning multiple files must retain the other files’ contributions.

## What It Does Not Prove

This examination does not run the suite. Passing behavior, deployed conformance and the behavior of substituted dependencies require separate execution evidence.

## Real Dependencies and Test Doubles

The prepared PostgreSQL database supplies the persisted fixtures and constraints exercised here. The suite controls Cognito, message delivery at the declared seams; those collaborators remain outside its live proof.

## Must Not Be Doubled

Keep the queried database, applicable constraints and transaction boundaries real. Provider substitutes cannot establish delivery, cloud execution or cross-service recovery.
