CommunityPay uses a controlled vocabulary for its institutional artifacts and enforcement mechanisms. This reference defines each term precisely, maps it to the production code artifact that implements it, and identifies the lineage classification that governs its mutability.
This page is intended for CPAs, underwriters, escrow officers, and integration partners who need to understand exactly what CommunityPay means when it uses these terms in evidence packs, exports, and attestations.
Lineage Classifications
Every data artifact in CommunityPay has a lineage classification that determines its mutability rules:
| Classification | Mutability | Purpose |
|---|---|---|
| SNAPSHOT | Immutable after activation; versioned | Definitions, rules, trigger conditions |
| ROOT_EVENT | Status updates allowed; history tracked | Active records with lifecycle (exclusions, packets) |
| LINK_EVENT | Append-only; no updates or deletes | Events, notifications, status transitions |
| ARTIFACT | Fully immutable; no updates or deletes | Evaluation results, decisions, trigger hits |
These classifications are enforced at the application layer through save() and delete(). ARTIFACT records use ImmutableModelMixin or an equivalent override, which refuses any attempt to update or delete through those methods. A queryset update does not call them, which is why ARTIFACT records also carry content hashes and why the ledger's own rules are held by database triggers and constraints.
Enforcement Constructs
EnforcementDecision
An immutable record of a financial authorization decision. Every production financial flow — journal entries, fund transfers, bill payments, invoice creation, payment receipts, and year-end closures — produces an EnforcementDecision before execution.
| Field | Description |
|---|---|
| event_type | PRE_PERSIST, POST_PERSIST, or PERSIST_ERROR |
| decision | ALLOW, BLOCK, OVERRIDE, or ERROR |
| flow_name | Canonical flow (journal_entry, fund_transfer, bill_payment, invoice_creation, payment_receipt, year_end_close, loan_origination, loan_payment, loan_accrual, trust_transaction) |
| guard_results | JSON: per-guard outcomes with timing |
| correlation_id | UUID for request tracing across events |
| decision_seq | Ordering within a correlation (0 = PRE, 1 = POST, 2 = ERROR) |
Lineage: ARTIFACT (immutable via ImmutableModelMixin)
Production status: Blocking has been live since the cutover on January 24, 2025. A database constraint trigger refuses any journal entry that carries no decision.
EnforcementDispatcher
The mandatory choke point for all enforcement decisions. A service — not a model. Every protected flow calls dispatcher.enforce_pre_persist() and receives an EnforcementOutcome.
Design law: "No decision logged = precise signal of bypass or bug."
Guard
A stateless enforcement primitive that checks one specific invariant. Guards are:
- Stateless: Same inputs produce same outputs
- Independent: No guard depends on another guard's result
- Composable: Guards combine into chains via Flow configuration
18 production guards are registered in the Guard Manifest:
| ID | Name | Category | Invariant |
|---|---|---|---|
| GUARD_001 | BalanceGuard | INVARIANT | Debits equal credits |
| GUARD_002 | ClosedPeriodGuard | TEMPORAL | No posting to closed periods |
| GUARD_003 | FundSegregationGuard | POLICY | Operating/Reserve fund boundaries |
| GUARD_004 | SubledgerGuard | INVARIANT | The bill, invoice, vendor, and unit records a posting references exist and belong to the association |
| GUARD_005 | InvariantGuard | INVARIANT | Line count, required references, and allowed account types for the transaction type |
| GUARD_006 | FundEligibilityGuard | ELIGIBILITY | An expense account posting to a reserve fund is marked reserve-eligible; it does not read L5 rules |
| GUARD_007 | BillPaymentGuard | POLICY | The payment spends a live approval bound to the bill's amount, vendor and fund — and, on the Stripe rail, the payout destination approved with them; no duplicate payment |
| GUARD_008 | ReversalGuard | INVARIANT | Reversal entries match originals |
| GUARD_009 | TrustSegregationGuard | INVARIANT | Trust and operating funds never commingle |
| GUARD_010 | VendorRiskGuard | POLICY | Debarment, license status (suspended or revoked), license expiry, insurance expiry, and active contractor strikes for a vendor linked to a contractor licensing record, read at payment time; an unlinked vendor passes and the decision records that it could not be evaluated |
| GUARD_011 | DisbursementComplianceGuard | POLICY | State disbursement rules read against the bill's live approval: board approval above the state cap, board approval for a reserve fund payment at any amount, two distinct approvers above the dual signature threshold |
| GUARD_012 | LoanCovenantGuard | POLICY | Debt covenant evaluation |
| GUARD_013 | PaymentSplitGuard | INVARIANT | Loan payment allocation across principal, interest, and fees |
| GUARD_014 | InterestCalculationGuard | INVARIANT | Accrued interest matches the loan's amortization basis |
| GUARD_015 | ConnectBalanceGuard | POLICY | The Stripe Connect balance can fund the vendor payout, on a snapshot that is current and for this account |
| GUARD_016 | FundConsistencyGuard | POLICY | Every fund-boundary cash line belongs to the entry's own fund, and a cash transfer between funds carries out one approved fund transfer |
| GUARD_017 | L5ExclusionGuard | RISK_INTELLIGENCE | Refuses posting for an entity carrying an active L5 bind-block exclusion |
| GUARD_018 | FundPolicyGuard | POLICY | The paying fund's own board policies, read against the bill: which expense accounts may draw from the fund, and the board vote or approver seat a payment at or over the policy's amount requires, on the bill's live approval |
Guard Manifest
A registry of all guards, validated by a test in the suite. Guard IDs are stable — changing or removing a guard ID would break the audit trail. The manifest includes a get_manifest_hash() function that produces a SHA-256 fingerprint of the entire guard configuration.
Flow
A named mapping from transaction type to guard sequence. Flows determine which guards run for each transaction type.
10 canonical flows exist. The guard column is the set the manifest selects for that flow, in evaluation order:
| Flow | Guards | Count | Approval step |
|---|---|---|---|
| journal_entry | balance, closed_period, fund_segregation, fund_consistency, trust_segregation, subledger, invariant, l5_exclusion, fund_eligibility (reversal joins them on a reversal) | 9, or 10 on a reversal | No |
| fund_transfer | balance, closed_period, fund_segregation, fund_consistency, trust_segregation, subledger, invariant, l5_exclusion, fund_eligibility, loan_covenant | 10 | Yes — every transfer, approved and completed on the transfer record |
| bill_payment | balance, closed_period, fund_segregation, fund_consistency, trust_segregation, subledger, invariant, l5_exclusion, fund_eligibility, bill_payment, vendor_risk, disbursement_compliance, fund_policy, loan_covenant (connect_balance joins them on the Stripe payout rail) | 14, or 15 on the Stripe rail | Yes — every bill |
| invoice_creation | balance, closed_period, fund_segregation, fund_consistency, subledger, invariant, l5_exclusion, fund_eligibility | 8 | No |
| payment_receipt | balance, closed_period, fund_segregation, fund_consistency, subledger, invariant, l5_exclusion, fund_eligibility | 8 | No |
| year_end_close | balance, closed_period, fund_segregation, fund_consistency, subledger, invariant, l5_exclusion, fund_eligibility | 8 | No |
| loan_origination | balance, closed_period, fund_segregation, fund_consistency, subledger, invariant, l5_exclusion, fund_eligibility, loan_covenant | 9 | No |
| loan_payment | balance, closed_period, fund_segregation, fund_consistency, subledger, invariant, l5_exclusion, fund_eligibility, loan_covenant, payment_split | 10 | No |
| loan_accrual | balance, closed_period, fund_segregation, fund_consistency, subledger, invariant, l5_exclusion, fund_eligibility, interest_calculation | 9 | No |
| trust_transaction | balance, closed_period, fund_segregation, fund_consistency, trust_segregation, subledger, invariant, l5_exclusion, fund_eligibility | 9 | No — a trust disbursement is gated on an accepted membership of that association carrying financial authority |
Bills and fund transfers are the only documents an approval step opens. A workflow recorded against any other document type is marked "Not enforced" and is never consulted.
AuditOverride
A controlled bypass of a guard decision. Overrides are never automatic. They require explicit user action, a documented reason, and an expiration.
| Field | Description |
|---|---|
| scope | CLOSED_PERIOD, FUND_SEG, YEAR_CLOSE, INTEGRITY_GATE (recordable; no control consults it today), VENDOR_RISK, DISBURSE_COMP |
| reason | The written justification, at least 20 characters |
| authorized_by | The user who authorized it, and authorized_at when |
| expires_at | When it stops being usable. The maximum duration is fixed per scope — 24 hours for VENDOR_RISK, DISBURSE_COMP and INTEGRITY_GATE, 14 days for FUND_SEG, 30 days for CLOSED_PERIOD, and 90 days for YEAR_CLOSE |
| is_active | Whether it can still be used |
| bill, amount_cents | The one payment a bill-bound override authorizes |
| consumed_at, consumed_by_entry | When a posting used it up, and which entry did |
| times_used | How many times it has been applied |
A VENDOR_RISK or DISBURSE_COMP override — the two that stand between association money and an external bank account — names one bill and one amount, and one posting uses it up. A second payment needs a second override, authorized separately. Before this binding shipped, these two named nothing but the association and were never used up: one override cleared every disbursement in the association for 24 hours.
A VENDOR_RISK or DISBURSE_COMP override is stamped with the entry that used it up, inside the posting that used it, and a posting that names no user is refused rather than overridden. Every use is also written to an immutable AuditOverrideUsage row naming the user, the journal entry, and the enforcement decision. For the four other scopes that row is the only record of a use, and the recorder that writes it logs a failure rather than refusing the posting.
Lineage: ROOT_EVENT (status updates tracked)
EnforcementOutcome
The return type from enforcement evaluation. Contains the decision, all guard results, timing, blocking guard identification, and context fields for POST_PERSIST recording. This is a runtime dataclass — not persisted directly. The EnforcementDecision model is the persisted form.
Institutional Packet Types
InstitutionalPacket
The canonical record for every institutional output. All packet types share this model with type-specific evidence snapshots.
| Field | Description |
|---|---|
| packet_type | HDEP, GCA, FADR, RC, RSR, LDS, CEP, BP, FSR, CMR (the CARI lender, insurer, title, and buyer reports use their own type codes) |
| reference_number | Human-readable: {TYPE}-{HOA}-{SCOPE}-{DATE}-v{VER} |
| public_id | UUID for external API references |
| evidence_snapshot | Frozen JSON of all financial and governance data |
| content_hash | SHA-256 of canonical JSON evidence snapshot |
| previous_packet_hash | Links to predecessor for chain continuity |
| version | Increments with each regeneration for same HOA/type/scope |
| status | draft, generated, delivered, superseded, void |
Lineage: ROOT_EVENT (lifecycle status mutable; evidence fields immutable)
HDEP (HOA Disclosure & Evidence Packet)
A comprehensive disclosure package for resale transactions. Contains financial summaries, reserve study status, governance attestation, vendor compliance, and assessment schedules for a specific unit.
Scope: Per unit (e.g., A204 for unit A204)
GCA (Governance Controls Attestation)
A board-facing report on internal control effectiveness. Measures control pass rates, override patterns, exclusion activity, and vendor compliance across a reporting period.
Scope: Per HOA/period (e.g., 2025-Q1)
Assessment levels: STRONG (a pass rate of 95% or more, with no high-severity flag), ADEQUATE (85% or more), NEEDS_IMPROVEMENT (70% or more), DEFICIENT (below 70%)
FADR (Funds Authorization & Disbursement Record)
A complete payment evidence chain for escrow and audit. Documents every step from bill creation through payment execution, including the full approval chain, policy snapshots, journal entry lines, and vendor compliance status at payment time.
Scope: Per HOA/period (e.g., 2025-01)
Verification status: VERIFIED, NEEDS_REVIEW, FLAGGED
RC (Resale Certificate)
A statute-mapped resale disclosure for unit sales. Generated from compliance profiles that define jurisdiction-specific requirements (e.g., WA RCW 64.34.425 for Washington condominiums).
Scope: Per unit
RSR (Reserve Funding Status Report)
A reserve funding analysis with component inventory, remaining useful life calculations, funding scenarios, and 30-year cash flow projections.
Scope: Per HOA/period
LDS (Loan Disclosure Statement)
The disclosure packet for a loan. Contains the loan instrument terms, the full amortization schedule, the balance rollforward, covenant status, and the reconciliation of the loan subledger to the general ledger.
Scope: Per loan
CEP (Close Evidence Pack)
The month-end close bundle. Captures the fiscal period at close: trial balance, bank reconciliation proof, enforcement decisions, integrity scans, budget variance, and the exception register, in 12 evidence sections with 14 deterministic risk flags.
Scope: Per fiscal period (YYYY-MM)
BP (Board Packet)
The packet a board reads each month, assembled from the report services in the order a treasurer reads them: cash position and bank reconciliations first, then the statements, the agings, the budget comparison, and the schedules and registers. A board can set its own order; a stored order cannot drop a section.
Scope: Per HOA/period
FSR (Fiduciary Shield Report)
Governance proof from enforcement telemetry: guard performance, block analysis, override audit, and risk flags, aggregated for a period.
Scope: Per HOA/period (e.g., 2026-02)
CMR (CARI Market Report)
A CARI report generated through the same attestation service as the other CARI reports.
Risk Intelligence Constructs
ExclusionTrigger
A versioned definition of conditions that create exclusions (bind blocks). Triggers define what signals to evaluate, what thresholds to apply, and what effect fires when conditions are met.
| Field | Description |
|---|---|
| trigger_id | Stable UUID across versions |
| code | Machine-readable identifier (e.g., HIGH_DISPUTE_RATE) |
| trigger_type | THRESHOLD, PATTERN, EVENT, COMPOUND |
| effect_type | BLOCK (block binding), REVIEW (require manual review), WARN (warning only) |
| severity | LOW, MEDIUM, HIGH, CRITICAL |
| conditions | JSON expression format with signal references |
| conditions_hash | SHA-256 of conditions JSON for immutability verification |
Lineage: SNAPSHOT (conditions immutable once ACTIVE; versioned)
Exclusion
An active hold on an entity. Created when an ExclusionTrigger fires. Exclusions are never deleted — they are lifted, expired, or overturned on appeal.
| Status | Meaning |
|---|---|
| PENDING | Awaiting review |
| ACTIVE | Currently enforced |
| APPEALED | Under appeal |
| LIFTED | Lifted early |
| EXPIRED | Duration elapsed |
| OVERTURNED | Overturned on appeal |
Lineage: ROOT_EVENT (status transitions tracked via ExclusionStatusHistory)
ExclusionTriggerHit
An immutable record that a trigger's conditions were met for a specific entity at a specific time. Contains the evaluated signals, computed values, and the trigger version that was active.
Lineage: ARTIFACT (fully immutable)
EligibilityRule
A declarative rule that defines eligibility criteria. Rules are versioned and immutable once published.
| Field | Description |
|---|---|
| code | Stable identifier (e.g., TENURE_6M) |
| expression | Evaluable expression referencing signal values |
| action | ALLOW (if every condition holds), DENY (if any condition fails), or REFER (to manual review) |
| category | TENURE, FINANCIAL, GOVERNANCE, COMPLIANCE, VOLUME, COMPOSITE |
| status | DRAFT, ACTIVE, DEPRECATED, ARCHIVED |
Lineage: SNAPSHOT (expression immutable once ACTIVE)
EligibilityEvaluation
An immutable record of a complete eligibility evaluation. Captures all rule versions active at evaluation time, all signal values, and the per-rule pass/fail results.
Lineage: ARTIFACT (fully immutable)
Signal Provider
A component that gathers the values eligibility and exclusion evaluation read. Signals are registered in one registry, in five namespaces — RISK_SIGNAL, TELEMETRY, UNDERWRITING, VENDOR_COMPLIANCE, and DEBT_SERVICE — and return typed key-value pairs.
Vendor Intelligence Constructs
VECR (Vendor Eligibility & Compliance Record)
A vendor attestation. Contains credential status (COI, license, bond, W9), compliance history, performance metrics, and an eligibility determination.
Eligibility statuses: ELIGIBLE, CONDITIONAL, INELIGIBLE, REVIEW_REQUIRED
Content hash: SHA-256 of all sections for tamper detection.
BuildRated Score
A composite vendor quality score (0-100) computed from five components: licensing, insurance, bonding, payment history, and violations.
Compliance Alert
A notification raised for a vendor linked to a contractor record when a certificate of insurance, license, or bond approaches or passes expiration, or a W-9 is missing. Alert types are COI_EXPIRING, COI_EXPIRED, LICENSE_EXPIRING, LICENSE_EXPIRED, BOND_EXPIRING, BOND_EXPIRED, W9_MISSING, and MULTIPLE_ISSUES. Alerts are raised when the vendor compliance sweep runs; no scheduled sweep runs today.
CARI Constructs (Community Association Risk Index)
CARI
Community Association Risk Index. A deterministic, consent-gated index that summarizes attested governance, financial, and operational risk signals for community associations, derived directly from an authoritative system of record. CARI is not a credit score and does not make eligibility or lending decisions. See What Is a Community Association Risk Index? for an introduction and CARI Methodology and Scoring Framework for the full technical specification.
CARI Score
A composite numeric value (0-100, higher = healthier) computed from five weighted components: Financial Health (30%), Governance (25%), Vendor Risk (15%), Enforcement Integrity (15%), and Payment Behavior (15%). Scores are immutable after computation and include a SHA-256 calculation hash for deterministic verification.
Lineage: ARTIFACT (immutable via save override; append-only time series)
CARI Grade
A letter grade (A+ through F) derived from the CARI Score using published threshold mappings. Grade thresholds are defined in the active ScoreMethodology version.
| Grade Range | Score Threshold |
|---|---|
| A+ | 97+ |
| A | 93-96 |
| A- | 90-92 |
| B+ | 87-89 |
| B | 83-86 |
| B- | 80-82 |
| C+ | 77-79 |
| C | 73-76 |
| C- | 70-72 |
| D | 60-69 |
| F | Below 60 |
CARI Confidence
An assessment of data completeness behind a CARI Score. Three tiers:
| Level | Data Completeness | Meaning |
|---|---|---|
| HIGH | 80%+ of signals available | Score is well-supported by evidence |
| MEDIUM | 50-79% of signals available | Score is directionally reliable |
| LOW | Below 50% of signals available | Score should be interpreted with caution |
ScoreMethodology
A versioned, immutable record of scoring weights, grade thresholds, and confidence tiers. Only one methodology version is ACTIVE at any time. Historical scores always reference the methodology version used at computation time.
Lineage: SNAPSHOT (immutable once ACTIVE)
CariConsent
An HOA's explicit authorization for third-party access to its CARI data. Score queries are rejected without active consent. Consent can be scoped to all subscribers, a specific subscriber, or a subscriber type.
| Consent Type | Scope |
|---|---|
| ALL_SUBSCRIBERS | Any authorized subscriber may access |
| SPECIFIC_SUBSCRIBER | Named subscriber only |
| SUBSCRIBER_TYPE | All subscribers of a given type (e.g., all lenders) |
Lineage: ROOT_EVENT (revocable; status transitions tracked)
CariSubscriber
A third-party organization authorized to consume CARI data via API. Subscribers are classified by type (Lender, Insurer, Title Company, Escrow, Real Estate, Other) and tier (Basic, Professional, Enterprise) which governs rate limits and feature access.
APIKey
A hashed API credential for machine-to-machine authentication. The raw key is shown once at creation and stored as a SHA-256 hash. Keys have scoped permissions (score:read, report:generate, monitor:subscribe, webhook:manage) and optional expiration.
Lineage: ROOT_EVENT (revocable; last_used_at updated on use)
CARI Monitor
A subscriber's request to receive a notification when an HOA's CARI Score changes. Scores are computed nightly. Monitors can filter by event type (score.changed, score.grade_changed, score.threshold_breached, score.state_changed) and custom thresholds (floor/ceiling alerts).
One event ignores the filter. score.state_changed fires when an association's score stops carrying a number, or starts carrying one again, and it reaches every active monitor on that association. A withheld score breaches no threshold and moves no grade, so a narrowed subscription would otherwise receive nothing and hold its last known score on file as the current answer.
CARI Report Types
| Type | Packet type code | Audience | Scope |
|---|---|---|---|
| CARI Lender Report | cari_lender |
Mortgage underwriters | HOA |
| CARI Insurer Report | cari_insurer |
D&O insurance pricing | HOA |
| CARI Title Report | cari_title |
Escrow/title companies | HOA + Unit |
| CARI Buyer Report | cari_buyer |
Homebuyers | HOA + Unit |
All CARI reports are generated as InstitutionalPackets with SHA-256 content hashes, version chains, and full audit trails via BaseAttestationService.
Money-Out Constructs
Step-Up Confirmation
A fresh authenticator or recovery code, given within the last ten minutes, before an action that moves money or decides who may. A text-message code never confirms one. A new authenticator cannot confirm until the account's owner approves it from an email.
Bank PIN
An association secret, separate from any login, checked on the server. Changing it takes the current PIN and a step-up confirmation. Five wrong tries lock it. Staff cannot set it.
ConnectExternalAccount
One row for each bank on an association's processor account, with a fixed role — the association's payout bank or a vendor destination — and a flag for the one pinned payout bank. Database constraints refuse a vendor bank as the pin and refuse two pins.
Payout Bank Pin
The one bank to which an association's automatic payouts may sweep. It is verified against the processor every hour and on every bank and payout event. If the processor's default bank is not the pin, automatic payouts pause until a person releases them. Changing the pin takes two board members, and the first payout to the new bank is held.
VendorPayment
The record of one vendor payment, written in the same transaction as the posting and the bill's payment application. Processor events stamp it; they never post.
VendorBankChange
A change of a vendor's bank. The new bank waits three business days before the rail pays it. A different board member can end the wait early, with a step-up confirmation and the bank PIN, after calling the vendor at a number already on file.
DutySettingChange
One change to one separation-of-duties setting, never updated and never deleted.
Invoice Inbox Gate
One of 23 deterministic checks run on an emailed invoice. The strongest gate that fails sets the outcome: submitted for approval, drafted, or held with one plain sentence. The inbox never approves and never pays.
Bank Feed
Daily posted transactions and the live bank balance, read through Stripe Financial Connections. The feed matches one to one by machine and never posts an entry. A person reconciles and completes the month.
Decision Chain
Each enforcement decision carries a hash that includes the one before it. The chain is anchored in an immutable integrity snapshot, so deleting a decision and recomputing the links after it is detected.
Ledger Rules
The eight database triggers and 29 constraints the database holds on the ledger. A nightly probe reads the database catalog to confirm each is installed.
ArtifactAttestation
A board member's attestation on an institutional artifact. Identity and binding fields are locked; the lifecycle status can move.
Governance Constructs
GovernanceAttestation
A formal attestation of governance effectiveness for a specific period. Generated from weekly GovernanceDigest aggregations and exception register data.
Exception Register
An automatically generated register of governance exceptions. Populated from exclusion events, escalation events, and SLA breaches. Auditors typically build these manually; CommunityPay generates them from source data.
Control Plane Health Snapshot
Technical metrics about enforcement dispatcher operation: guard execution statistics, decision distribution, average evaluation time, and guard-specific performance data.
Export Constructs
Institutional Export
A machine-parseable JSON export designed for consumption by external validators.
| Export Type | Consumer | Schema version |
|---|---|---|
| AUDIT_READINESS | CPAs, external auditors | 1.3 |
| CONTROLS_RISK_SNAPSHOT | Insurance underwriters | 1.1 |
| ESCROW_DISCLOSURE | Escrow officers, title companies | 1.0 |
All exports include ExportMetadata with a SHA-256 content hash.
Cryptographic Constructs
Content Hash
SHA-256 hex digest computed from canonical JSON serialization of an evidence snapshot. Canonical JSON uses sorted keys, minimal separators ((",",":")) and UTF-8 encoding to ensure identical data always produces identical hashes.
Previous Packet Hash
The content hash of the preceding version of the same packet type/scope, stored on successor packets to create a tamper-evident chain.
Conditions Hash
SHA-256 hex digest of an ExclusionTrigger's conditions JSON, computed at save time. Used to enforce immutability of ACTIVE trigger conditions — if the hash changes, the save is rejected.
Manifest Hash
SHA-256 fingerprint of the entire Guard Manifest configuration. Changes to the manifest (adding, removing, or modifying guard definitions) produce a different hash, enabling a test in the suite to verify that the manifest hasn't been silently altered.
This reference describes production constructs as of October 2026. Definitions evolve with the platform; request a current vocabulary reference for diligence.
How CommunityPay Enforces This
- Every term maps to a production code artifact with a stable identifier
- Artifact types follow SNAPSHOT / ROOT_EVENT / LINK_EVENT / ARTIFACT lineage classifications
- All definitions are grounded in production schema — not aspirational
- Each institutional export names its schema version in its metadata