# Softcrum Suite > Internal engineering documentation for the Softcrum Suite: constitution, standards, architecture decisions and module specifications. ## Docs - [Softcrum Suite — internal documentation](https://internal.softcrum.com/index.md): The engineering source of truth: the constitution, the standards, the architecture decisions and the specification system that every module is built from. - [Internal Documentation — Softcrum Suite](https://internal.softcrum.com/repository-map.md): Private Mintlify project and the engineering source of truth. The same markdown files serve both: agents read them from the repository, humans read them rendered. One source, no sync. - [Glossary — Additions (Engage/CRM)](https://internal.softcrum.com/glossary.md): Rules: English is canonical in code, events, and repo docs (DEC-I1). "Cliente final" NEVER "usuario"; "member" NEVER "user". Spanish terms appear only in UI copy and the ES side of Mintlify. - [Design Registry (English mirror)](https://internal.softcrum.com/en/design/overview.md): The Spanish design source of truth. Everything else in these docs — the constitution amendment, the standards, the ADRs, the specs — cites the DEC ids defined here. - [Decision Registry — CRM + Loyalty modules and cross-cutting standards (v1.0)](https://internal.softcrum.com/en/design/decision-registry-v1.md): The design source of truth. Closes the v1 questionnaire of 50 questions and debate rounds 1 to 4, August 2026. - [Documentation Generation Plan — CRM + Loyalty (v1.0)](https://internal.softcrum.com/en/design/documentation-plan-v1.md): Turns the decision registry into the actual repository and Mintlify documentation. English in the repository (DEC-I1), English and Spanish in Mintlify. Each batch closes against verifiable criteria. - [Open Questions Register — Loyalty (v1.1)](https://internal.softcrum.com/en/design/open-questions-v1.md): Two answers changed the design rather than merely ratifying it. - [Open Questions Register — Remaining modules (v2.0)](https://internal.softcrum.com/en/design/open-questions-v2.md): Consolidates the 70 unique questions from identity, core, messaging and crm. Answer format: OQ-XXX-NN: answer. Each carries a recommendation (REC). The loyalty questions closed in open-questions-v1.md. - [Constitution](https://internal.softcrum.com/constitution/overview.md): The constitution is the closed set of rules agents may not work around — the port categories, the architectural rules, the standards index. It lives at the repository root as AGENTS.md. - [Constitution Amendment A1 — Port Categories, Per-Module Adapter Binding, New Standards](https://internal.softcrum.com/constitution/amendment-A1-ports-and-standards.md): Date: 2026-08-15 · References: DEC-C3, DEC-C4, DEC-E1..E8, ADR-19. - [Founding Constitution — RECONSTRUCTION FOR VALIDATION](https://internal.softcrum.com/constitution/founding-constitution.md): This document is a reconstruction, not a recovered original. - [Standards](https://internal.softcrum.com/standards/overview.md): How to build anything in this repository. Every standard is written as MUST / NEVER rules with anti-examples, so an agent can self-check a diff against it. - [Standard — Public API (v2)](https://internal.softcrum.com/standards/api.md): Canonical: https://api.softcrum.com/v1/{module}/{resource} (no /api segment). Modules: core, loyalty, messaging, crm (suite modules join as they expose public APIs). - [Standard — Data (v2, major update for Engage/CRM)](https://internal.softcrum.com/standards/data.md): Scope: every table, migration, and query in the monorepo. References: DEC-A, DEC-B. - [Standard — Dependencies and Versions](https://internal.softcrum.com/standards/dependencies.md): Scope: every package.json in the monorepo, plus the Node and pnpm versions themselves. The goal is a stack that is current and reproducible. Those pull against each other, and this document is where the tension is resolved. - [Standard — Domain Events (v2)](https://internal.softcrum.com/standards/events.md): { id: uuidv7, name, tenant_id, occurred_at, correlation_id, causation_id, actor: {type: user|member|api_key|system, id}, version: int, payload }. - [Standard — Jobs, Queues & Workers (v2)](https://internal.softcrum.com/standards/jobs.md): Interface in packages/core: publish(queue, payload, opts), schedule(queue, payload, runAt). Payloads are Zod-validated envelopes: { job_id: uuidv7, tenant_id, correlation_id, kind, data }. - [Standard — Notifications (NEW)](https://internal.softcrum.com/standards/notifications.md): email · in_app · webhook · push · sms (adapter F1b behind provider ADR) · whatsapp (F2) · live_activity (F2). The channel row and the NotificationChannelPort exist from day 1 even when the adapter arrives later. - [Standard — Security (amendments v2)](https://internal.softcrum.com/standards/security.md): - Machine roles: API keys and OAuth clients receive roles exactly like users; permission checks are identical ({module}.{resource}.{action}). - [Architecture Decision Records](https://internal.softcrum.com/adr/overview.md): Single cross-cutting series for the whole platform (DEC-I4) — ADRs are not per module. Use TEMPLATE.md for new entries. Status flow: Proposed → Accepted → Superseded. - [ADR-NNN — Title in the imperative](https://internal.softcrum.com/adr/TEMPLATE.md): The forces at play: the constraint, the volume, the regulation, the benchmark evidence. - [ADR-001 — Monorepo, Closed Stack and Vendor Policy](https://internal.softcrum.com/adr/adr-001-monorepo-and-closed-stack.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-002 — Multi-Tenancy: Shared Schema, RLS, Cell-Ready](https://internal.softcrum.com/adr/adr-002-multi-tenancy-model.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-003 — Hexagonal Architecture and the Closed Port List](https://internal.softcrum.com/adr/adr-003-hexagonal-and-ports.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-004 — Transactional Outbox as the Only Event Path](https://internal.softcrum.com/adr/adr-004-transactional-outbox.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-005 — Better Auth for the Organizational Realm](https://internal.softcrum.com/adr/adr-005-better-auth-organizational-realm.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-006 — Entitlements Engine: Plans Gate Capabilities](https://internal.softcrum.com/adr/adr-006-entitlements-engine.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-007 — Pusher for Realtime](https://internal.softcrum.com/adr/adr-007-pusher-realtime.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-008 — Billing: Dual Merchant of Record plus Chilean Tax Documents](https://internal.softcrum.com/adr/adr-008-billing-and-merchant-of-record.md): Status: Proposed (RECONSTRUCTION — requires validation) · Date: 2026-08-17 (reconstructed) Refs: ../constitution/founding-constitution.md. - [ADR-009 — customer-core as Shared Bounded Context](https://internal.softcrum.com/adr/adr-009-customer-core-shared-context.md): Loyalty, Messaging and CRM all need contact profiles, identities, consents, behavioral events and segments. Building these inside any one module couples the others to it and forces refactors when new modules need segments. - [ADR-010 — Member Identity: Separate Better Auth Realm + Token Exchange](https://internal.softcrum.com/adr/adr-010-member-identity.md): End customers (members) are a distinct population from console users; Softcrum must be the identity authority (D4) while embedded/headless integrations keep their own login UX. - [ADR-011 — Points Ledger: Immutable, Dual Currency, FIFO Lots](https://internal.softcrum.com/adr/adr-011-points-ledger.md): loyalty.ledger_transactions is append-only; types (parametric): earn|redeem|expire|revoke|adjust; states pending→available (earn confirms after the tenant-configured return window). A mutable balance column is FORBIDDEN. - [ADR-012 — Segment DSL v1 + Incremental Evaluation](https://internal.softcrum.com/adr/adr-012-segment-dsl.md): Declarative JSON DSL, versioned, deliberately restricted so per-event incremental evaluation is possible: typed profile attribute conditions · event aggregates with window (count, sum(property), first_seen. - [ADR-013 — Ingestion Pipeline: Fast-Ack + Queue + Idempotent Processor](https://internal.softcrum.com/adr/adr-013-ingestion-pipeline.md): POST /v1/core/track|identify|batch: authenticate → Zod validate → Upstash rate-limit → enqueue (QueuePort) → 202 with event id. p95 <100 ms. - [ADR-014 — Billable Metric: Marketable Contact](https://internal.softcrum.com/adr/adr-014-billable-metric.md): The billable base is the MARKETABLE contact: active consent on ≥1 channel AND not suppressed. Stored historical/cold contacts: free and unlimited (anti-abuse technical caps only). - [ADR-015 — Dual-Rail Multi-Channel Sending](https://internal.softcrum.com/adr/adr-015-dual-rail-sending.md): Provider rate limits are shared across ALL tenants (Resend limits apply per team). One tenant's marketing blast can starve every tenant's transactional email (OTPs, invitations). - [ADR-016 — Vercel-Style Pricing + In-House Rating Engine](https://internal.softcrum.com/adr/adr-016-pricing-rating-engine.md): Published unit prices; included allowances per plan; metered consumption from core.usage_snapshots (30-min deltas); projected-spend panel; tenant-configurable spend caps (self-service face of enforcement, DEC-G2). - [ADR-017 — CQRS-Lite + Audit Log; Event Sourcing Rejected as Norm](https://internal.softcrum.com/adr/adr-017-cqrs-lite.md): Every command handler executes ONE transaction: aggregate state change + outbox event(s) + core.audit_log row (typed actor, entity, action, FULL old→new diff, correlation_id). Reads are projections with documented rebuild procedures. - [ADR-018 — Partitioning Standard on Supabase](https://internal.softcrum.com/adr/adr-018-partitioning.md): Monthly RANGE partitions on designated append-only tables only (data.md §4 list). Custom SQL migrations own the DDL; a cron job pre-creates N+2 months; DEFAULT partition alerts on any row. - [ADR-019 — Cascading Notification System](https://internal.softcrum.com/adr/adr-019-notification-cascade.md): Channel resolution is a pure core function over four config levels (platform → tenant → module → event type) plus recipient gates (consent, suppression, preferences, quiet hours/caps for marketing). - [ADR-020 — Mobile White-Label Strategy (Expo + React Native)](https://internal.softcrum.com/adr/adr-020-mobile-whitelabel.md): Apple guideline 4.3 and white-label policy push per-tenant binaries to the CLIENT's own developer account; per-tenant build pipelines are operationally expensive. - [ADR-021 — Multi-Program from Day One](https://internal.softcrum.com/adr/adr-021-multi-program-from-day-one.md): DEC-H2 decided that multi-program would be schema-only in F1: program_id on every loyalty. - [ADR-022 — identity as a Separate Bounded Context](https://internal.softcrum.com/adr/adr-022-identity-bounded-context.md): DEC-B1 named four Postgres schemas: core, loyalty, messaging, crm. Authentication and. - [Canonical Slices](https://internal.softcrum.com/slices/overview.md): A canonical slice is the complete reference implementation of one archetype. Agents copy it instead of re-deriving the pattern, which is what keeps generated code uniform across the suite. - [Canonical Slice #1 (RECONSTRUCTION) — createInitiative: Synchronous Command Archetype](https://internal.softcrum.com/slices/create-initiative.md): The synchronous command archetype: a request arrives, the system validates it, changes state inside one transaction and answers with the result. Reconstructed for validation, since half the task specs declare it. - [Canonical Slice #2 (SPEC) — trackEvent: Asynchronous Event Pipeline Archetype](https://internal.softcrum.com/slices/track-event.md): Coexists with createInitiative (synchronous command archetype). Every task spec declares which archetype it follows (DEC-I5). Implemented by TS-004; becomes WALKTHROUGH status once real. - [The Specification System](https://internal.softcrum.com/modules/overview.md): How a module goes from an idea to merged code, and how we prove afterwards what was decided, when, why, and by whom. This is the operational manual; the repository README.md carries the short version for anyone arriving for the first time. - [Module name](https://internal.softcrum.com/modules/TEMPLATE-prd.md): The one-paragraph version, written as if announcing it. If this paragraph is hard to write, the module is not understood yet — that is the signal to keep thinking, not to start building. - [Short noun phrase, not a sentence](https://internal.softcrum.com/modules/TEMPLATE-feature-spec.md): One sentence: what a tenant or member can do after this ships that they could not before. If you cannot write that sentence, this is not a feature — it is a section of another one. - [Module — identity (IDN)](https://internal.softcrum.com/modules/identity/overview.md): The organizational realm and the platform's access control plane. Schema identity. Established by ADR-022. - [identity](https://internal.softcrum.com/modules/identity/prd.md): identity is how the platform knows who is asking and whether they may. It holds our customers' staff, the roles they carry, the machines that act on their behalf. - [Module Spec — identity (schema identity)](https://internal.softcrum.com/modules/identity/spec.md): Owns the organizational realm and the platform's access control plane: who our customers' staff are, what they may do, and how machines prove they may do it. Depends on nothing (ADR-022). - [Organizations, Users, Memberships and Invitations](https://internal.softcrum.com/modules/identity/features/fs-idn-0001-organizations-and-users.md): After this ships, a company has an account, its administrator can invite the team, and someone who works with three of our customers signs in once. - [Permission Registry and RBAC](https://internal.softcrum.com/modules/identity/features/fs-idn-0002-permission-registry-rbac.md): After this ships, "the call centre can read contacts but never their national IDs" is a configuration a tenant administrator makes in a minute, and it is enforced by the same code path for a person and for an API key. - [Authentication Methods](https://internal.softcrum.com/modules/identity/features/fs-idn-0003-authentication-methods.md): After this ships, a user can sign in with a password, a link in their inbox, or their device's biometrics — and none of those paths can be used to reach a member's data. - [Sessions and Device Management](https://internal.softcrum.com/modules/identity/features/fs-idn-0004-sessions-and-devices.md): After this ships, a user can see every device signed into their account and cut off the one they left at a client's office. - [Multi-Factor Authentication](https://internal.softcrum.com/modules/identity/features/fs-idn-0005-mfa.md): After this ships, a stolen password is not enough to reach a tenant's customer data. - [Machine Credentials — API Keys](https://internal.softcrum.com/modules/identity/features/fs-idn-0006-api-keys.md): After this ships, a tenant's point of sale can call our API with a key that does exactly what it needs and nothing more, and rotating that key does not take the till offline. - [OAuth2 Provider — Sign in with Softcrum](https://internal.softcrum.com/modules/identity/features/fs-idn-0007-oauth-provider.md): After this ships, a third-party app can ask a tenant "may I read your contacts and award points?" and get a scoped token — and a tenant's own site can offer "Sign in with Softcrum" so their customers reuse the identity they already have. - [Social Login and Enterprise SSO](https://internal.softcrum.com/modules/identity/features/fs-idn-0008-social-sso.md): After this ships, a team signs in with the Google account they already use, and an enterprise customer routes their whole organization through their own identity provider. - [Support Impersonation](https://internal.softcrum.com/modules/identity/features/fs-idn-0009-impersonation.md): After this ships, an operator can see exactly what a stuck customer sees — and that customer can see that it happened, when, and why. - [Module — customer-core (CORE)](https://internal.softcrum.com/modules/core/overview.md): Owns the contact, its identity, its behaviour, its consent, and the platform cross-cutting tables. Nobody else owns the contact. Schema core. - [customer-core](https://internal.softcrum.com/modules/core/prd.md): customer-core is the layer that knows who a customer is. It resolves identities across the systems a company already runs, holds their attributes and their consent, records what they do, and computes which segments they belong to. - [Module Spec — customer-core (schema core)](https://internal.softcrum.com/modules/core/spec.md): Owns the contact, its identity, its behavior, its consent, and platform cross-cutting tables. Nobody else owns the contact. - [Platform Catalogs](https://internal.softcrum.com/modules/core/features/fs-core-0001-platform-catalogs.md): After this ships, every other table in the platform has the catalogs it needs to reference, and the TypeScript unions those catalogs generate exist for the whole monorepo to compile against. - [Contacts and National IDs](https://internal.softcrum.com/modules/core/features/fs-core-0002-contacts.md): After this ships, a company can store its customers — people and companies alike — with a national ID that is actually validated for its country, and the ID is masked from everyone who has no business seeing it. - [Identity Resolution and Merges](https://internal.softcrum.com/modules/core/features/fs-core-0003-identity-resolution.md): After this ships, the same person arriving from a point of sale, an ecommerce and an email link becomes one contact instead of three. - [Consent as History](https://internal.softcrum.com/modules/core/features/fs-core-0004-consents.md): After this ships, we can prove — with a timestamp and evidence — that a specific person agreed to be contacted on a specific channel for a specific purpose, and exactly when they stopped agreeing. - [Audit Log](https://internal.softcrum.com/modules/core/features/fs-core-0005-audit-log.md): After this ships, every state change in the platform can be traced to who did it, what it changed from and to, and which request caused it. - [Event Ingestion and Tracked Events](https://internal.softcrum.com/modules/core/features/fs-core-0006-event-ingestion.md): After this ships, a tenant's point of sale can send "this customer paid invoice 889" and get an answer in under 100 ms, with everything downstream happening within seconds. - [Job Infrastructure — Processed Jobs and Dead Letters](https://internal.softcrum.com/modules/core/features/fs-core-0007-job-infrastructure.md): After this ships, no worker in the platform can double-apply an effect, and no failure can vanish without a record. - [Segment DSL and Incremental Evaluation](https://internal.softcrum.com/modules/core/features/fs-core-0008-segments.md): After this ships, "customers who spent over 500 000 in the last 90 days" is a live audience that updates within seconds of a purchase, not a nightly report. - [Member Identity and Token Exchange](https://internal.softcrum.com/modules/core/features/fs-core-0009-member-identity.md): After this ships, a member can sign in to our portal with a magic link — or keep signing in to the tenant's own site and still reach our API, without ever seeing a Softcrum login screen. - [Usage Snapshots and Metering](https://internal.softcrum.com/modules/core/features/fs-core-0010-usage-snapshots.md): After this ships, a tenant can see what they have consumed against what they contracted, updated every 30 minutes, and we can bill from the same numbers they are looking at. - [Custom Attribute Definitions](https://internal.softcrum.com/modules/core/features/fs-core-0011-custom-attributes.md): After this ships, a gym can store "membership plan" and a clinic can store "insurance provider" on a contact, and both can segment on it — without either becoming a schema migration. - [Vertical Event Taxonomies](https://internal.softcrum.com/modules/core/features/fs-core-0012-event-taxonomies.md): After this ships, a subscription business starts with invoice_paid, payment_late and service_anniversary already defined, instead of a blank page and a naming argument. - [CSV Import and Merge Review Queue](https://internal.softcrum.com/modules/core/features/fs-core-0013-imports.md): After this ships, a company can upload years of customer history on day one, see exactly what happened to every row, and review the duplicates a human should decide on. - [Erasure and Portability (ARCO Rights)](https://internal.softcrum.com/modules/core/features/fs-core-0014-erasure-portability.md): After this ships, a person can ask to be deleted and it actually happens across the whole suite, within a committed deadline, with proof it happened. - [Module — Loyalty (LOY)](https://internal.softcrum.com/modules/loyalty/overview.md): Programs, points ledger, rules engine, rewards, coupons, referrals and tiers. Schema loyalty. Depends on core; never on messaging or crm. - [Loyalty](https://internal.softcrum.com/modules/loyalty/prd.md): Softcrum Loyalty is a headless engine for customer loyalty and incentives. A company connects its own systems — point of sale, ecommerce, ERP, billing — and behavioural events start flowing in. - [Module Spec — loyalty (schema loyalty)](https://internal.softcrum.com/modules/loyalty/spec.md): Event → conditions (profile attrs, segment/tier membership, aggregates, frequency) → effects (parametric rule_effect_types, is_system seed: award_points, issue_coupon, send_webhook, trigger_campaign; F2 row: apply_discount per DEC-H4). - [Programs and Point Currencies](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0001-programs-and-currencies.md): After this ships, a tenant can create and name loyalty programs with their own point currencies, and every other loyalty table has a program to belong to. - [Points Ledger and FIFO Lots](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0002-points-ledger.md): After this ships, points can be awarded, held, expired and revoked with a complete, auditable history — and the outstanding liability can be computed from first principles at any moment. - [Balance Projection and Drift Reconciliation](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0003-balance-projection.md): After this ships, a member's balance can be read in milliseconds without touching the ledger, and we can prove that the fast number and the true number agree. - [Rules Engine — Conditions and Effects](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0004-rules-engine.md): After this ships, a tenant can say "when a customer pays an invoice, give them one point per thousand pesos" in the console, and it happens — without an engineer. - [Rewards Catalog](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0005-rewards-catalog.md): After this ships, a tenant can define what points actually buy, and a member can see it. - [Redemptions — Parent/Child, Idempotent, Rollback](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0006-redemptions.md): After this ships, a point of sale can redeem a member's points over a flaky connection and be certain that a retry never charges them twice. - [Coupons and Mass Code Generation](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0007-coupons.md): After this ships, a rule can issue a member a unique coupon code, and a point of sale can validate and burn it in one call. - [Stacking Rules](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0008-stacking-rules.md): After this ships, a tenant can state which benefits may be combined, and the engine enforces it instead of the cashier improvising. - [Referrals — Double-Sided Rewards and Anti-Fraud](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0009-referrals.md): After this ships, a member can invite someone, and both get rewarded — when the invitation turns into a real customer, not before. - [Tiers and Qualification Windows](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0010-tiers.md): After this ships, a member can be Gold, know exactly what keeps them Gold, and get better earning rates for being Gold. - [Expiring Points and Retention Scans](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0011-expiring-points.md): After this ships, a member hears "you have 1 200 points expiring in two weeks" before they lose them, instead of discovering it afterwards. - [Gamification — Badges and Challenges](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0012-gamification.md): After this ships, a member can be working toward something specific — "three visits this month unlocks a free coffee" — rather than only accumulating a number. - [apply_discount Effect](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0013-apply-discount.md): After this ships, a tenant's checkout can ask "what does this cart cost for this member?" and get an answer — turning the loyalty engine into a promotions engine. - [Wallet Passes (Apple and Google)](https://internal.softcrum.com/modules/loyalty/features/fs-loy-0014-wallet-passes.md): After this ships, a member adds their loyalty card to their phone's wallet from a link in an email — no app download — and it updates itself when their balance changes. - [Module — messaging (MSG)](https://internal.softcrum.com/modules/messaging/overview.md): Templates, campaigns, sends, deliverability, suppressions — and the platform-wide notification routing every other module depends on. Schema messaging. - [messaging](https://internal.softcrum.com/modules/messaging/prd.md): messaging is how anything in the suite reaches a human. It decides whether a message may be sent at all, on which channel, renders it, queues it on the right rail, delivers it through a provider, and tracks what happened to it. - [Module Spec — messaging (schema messaging)](https://internal.softcrum.com/modules/messaging/spec.md): Owns templates, campaigns, sends, deliverability, suppressions AND the platform-wide notification routing (standards/notifications.md). - [Channel Catalog and Cascade Resolution](https://internal.softcrum.com/modules/messaging/features/fs-msg-0001-channel-cascade.md): After this ships, any module can ask "may I notify this person about this, and how" and get an answer that already accounts for our operational state, the tenant's configuration and the person's own choices. - [Message Templates](https://internal.softcrum.com/modules/messaging/features/fs-msg-0002-templates.md): After this ships, a message looks like the tenant's brand, says the member's name correctly, and cannot go out with a variable that does not exist. - [Sends and Status History](https://internal.softcrum.com/modules/messaging/features/fs-msg-0003-sends-and-status.md): After this ships, "did the customer get the email about their points?" is one query, and the answer chains all the way back to the purchase that caused it. - [Suppressions and Preference Center](https://internal.softcrum.com/modules/messaging/features/fs-msg-0004-suppressions-preferences.md): After this ships, one click stops the messages a member does not want, and a bounced address is never emailed twice. - [Dual-Rail Dispatch and Workers](https://internal.softcrum.com/modules/messaging/features/fs-msg-0005-dual-rail-dispatch.md): After this ships, a tenant can blast a million emails and another tenant's login codes still arrive in seconds. - [Channel Adapters — Email, In-App, Webhook, Push](https://internal.softcrum.com/modules/messaging/features/fs-msg-0006-channel-adapters.md): After this ships, a resolved message actually reaches a person — by email, in the app, as a push, or into the tenant's own system. - [Campaigns and Triggers](https://internal.softcrum.com/modules/messaging/features/fs-msg-0007-campaigns-and-triggers.md): After this ships, a tenant sets up "email everyone on their birthday" once, and it runs correctly every day for years, in each member's own timezone. - [Sender Domains and Deliverability](https://internal.softcrum.com/modules/messaging/features/fs-msg-0008-sender-domains.md): After this ships, a tenant's mail comes from their own domain, and one tenant's bad list cannot damage everybody else's reputation. - [SMS Adapter](https://internal.softcrum.com/modules/messaging/features/fs-msg-0009-sms-adapter.md): After this ships, a tenant can send an OTP or a delivery alert by SMS in the countries where they are registered to do so. - [Module — crm (CRM)](https://internal.softcrum.com/modules/crm/overview.md): Thin by design: notes, activities, lists, and the timeline 360. Schema crm. Depends on core; never on loyalty, messaging or identity. - [crm](https://internal.softcrum.com/modules/crm/prd.md): crm is the human layer over everything the suite already knows. It holds what a person wrote about a customer, what someone has to do next, and the one screen that shows a customer's whole history — purchases, points, messages and notes. - [Module Spec — crm (schema crm)](https://internal.softcrum.com/modules/crm/spec.md): Thin by design: consumes core; adds workspace surfaces. - [Notes](https://internal.softcrum.com/modules/crm/features/fs-crm-0001-notes.md): After this ships, what an agent learned on a call survives the call. - [Activities](https://internal.softcrum.com/modules/crm/features/fs-crm-0002-activities.md): After this ships, "call this customer back on Thursday" is something the system remembers instead of a note on somebody's desk. - [Lists and Saved Views](https://internal.softcrum.com/modules/crm/features/fs-crm-0003-lists-and-views.md): After this ships, "the twelve people who came to the launch event" is something a tenant can keep, and no segment rule could ever have expressed it. - [Timeline 360](https://internal.softcrum.com/modules/crm/features/fs-crm-0004-timeline.md): After this ships, a support agent sees "bought on Tuesday → rule awarded 450 points → we emailed → they opened it → redeemed on Thursday" as one chain, on one screen. - [Reserved Object Model](https://internal.softcrum.com/modules/crm/features/fs-crm-0005-object-model.md): After this ships, deals and pipelines can be added later without a data migration — and nothing in v1 uses them. - [Task Specs](https://internal.softcrum.com/task-specs/overview.md): Executable units of work. Each declares its canonical slice archetype (DEC-I5), its scope, what is explicitly out of scope, and acceptance criteria that include the p95 budgets. - [TS-001 — Foundational Migration (Engage/CRM)](https://internal.softcrum.com/task-specs/ts-001-foundational-migration.md): Objective: schemas core/loyalty/messaging/crm with all v1 tables, parametric seeds, designated partitions, platform tables. - [TS-002 — QueuePort & NotificationChannelPort + F1 Adapters](https://internal.softcrum.com/task-specs/ts-002-ports-and-adapters.md): Objective: both ports in packages/core; adapters VercelQueueAdapter, ResendEmailAdapter, FcmPushAdapter, InAppAdapter, WebhookAdapter; per-module composition-root binding. - [TS-003 — Ingestion Pipeline (track/identify/batch)](https://internal.softcrum.com/task-specs/ts-003-ingestion-pipeline.md): Objective: Runtime endpoints with fast-ack + processor through segment evaluation (rules engine stubbed to no-op effects). - [TS-004 — Canonical Slice trackEvent (rules → ledger → notifications → webhook)](https://internal.softcrum.com/task-specs/ts-004-track-event-slice.md): Objective: complete the pipeline with a real earning rule producing points, notification via cascade, webhook out — then promote slice doc SPEC→WALKTHROUGH. - [TS-005 — CI Extensions for the New Standards](https://internal.softcrum.com/task-specs/ts-005-ci-extensions.md): In: lint partition-key predicate on designated tables (query AST scan or drizzle wrapper rule) · rule: every route file exports exactly one required permission constant. - [Runbooks](https://internal.softcrum.com/runbooks/overview.md): Each runbook must be executable, step by step, by a person with no prior context — that is the acceptance criterion, not thoroughness. - [Runbook — Personal Data Breach (72 h) — BLOCKING before commercial launch](https://internal.softcrum.com/runbooks/breach-72h.md): Roles: Incident Lead (DPO — Daniel, provisional) · Tech Lead · Comms. Clock starts at DETECTION (log timestamp). - [Runbook — Dead Letter Review & Replay](https://internal.softcrum.com/runbooks/dead-letter-replay.md): 1. Alert fires (new rows in core.dead_letters). Triage by queue + last_error grouping in Softcrum Ops. 2. Poison (schema-invalid): fix producer, mark discarded with reason. 3. - [Runbook — Email Deliverability & Domain Setup](https://internal.softcrum.com/runbooks/deliverability.md): 1. Tenant sender domain: create in Resend; give tenant SPF/DKIM DNS records from console; verify; until verified, sends use shared subdomain (default tier per DEC-F4). 2. - [Runbook — Partition Management](https://internal.softcrum.com/runbooks/partitions.md): 1. Monthly (automated, verify): cron creates partitions N+2 for all designated tables; check job green + partitions exist (\d+ core.tracked_events). 2. - [Runbook — Tenant Restore (Engage/CRM extension)](https://internal.softcrum.com/runbooks/tenant-restore-extension.md): Extends the suite tenant-restore runbook (pre-G1 requirement) with module data: - Restore order: core catalogs → contacts/identities/consents → tracked_events partitions in range → loyalty (programs, currencies, ledger. - [Diagrams](https://internal.softcrum.com/diagrams/overview.md): Tooling is fixed by DEC-I2: the diagram-design skill (cathrynlavery/diagram-design) — 27 editorial diagram types, self-contained HTML + SVG, brand-token onboarding from a website, SVG/PNG export. Mermaid is not the standard here. - [Diagram Specs — render with the diagram-design skill (Claude Code)](https://internal.softcrum.com/diagrams/diagram-specs.md): Onboard the skill once against the Softcrum site so all diagrams inherit brand tokens; export SVG for Mintlify (/diagram-design:export --svg-only). Source HTML lives in repo. One section = one diagram; type names match the skill's catalog. - [Legal Package — WORKING DRAFTS (v0.1, August 2026)](https://internal.softcrum.com/en/legal/overview.md): Target regulatory context: Ley 21.719 (fully in force 2026-12-01, APDP operational), Ley 19.628 in whatever survives, LGPD (Brazil) as the strictest floor for South American operation, and the law of each supported country. - [Data Processing Annex (DPA) — DRAFT v0.1](https://internal.softcrum.com/en/legal/dpa.md): Between [SOFTCRUM SpA], RUT [__] ("the Processor") and the client identified in the Service Order ("the Controller"). Forms an integral part of the Terms of Service. - [DPIA Template (Impact Assessment) — for tenants — DRAFT v0.1](https://internal.softcrum.com/en/legal/dpia-template.md): 1. Description of the processing (modules, flows, volumes, active event taxonomy). 2. Necessity and proportionality (purpose, minimisation: is an identity document needed?, retention periods). 3. - [Data Protection Officer Designation Record — DRAFT v0.1](https://internal.softcrum.com/en/legal/dpo-designation.md): Softcrum SpA designates as Data Protection Officer (DPO), on a provisional basis until a new designation, Daniel [surnames], [role: founder]. - [Softcrum Privacy Policy — DRAFT v0.1](https://internal.softcrum.com/en/legal/privacy-policy.md): 1. Who we are and our roles. Softcrum SpA, RUT [__], domiciled at [__]. In respect of the data of our platform users, site visitors and prospects, we act as controller. - [Feature Spec — Tenant RAT Generator (Comply synergy)](https://internal.softcrum.com/en/legal/rat-generator-spec.md): Translation of a document whose original is in Spanish: ../../legal/rat-generator-spec.md. This one is a feature spec rather than a legal instrument, so no binding-language caveat applies. - [Record of Processing Activities — Softcrum as PROCESSOR — DRAFT v0.1](https://internal.softcrum.com/en/legal/rat-interno.md): Softcrum's record of processing activities as PROCESSOR. The activities where it acts as controller — accounts, billing, telemetry — live in a separate record. - [Annex of Security Measures (TOMs) — DRAFT v0.1](https://internal.softcrum.com/en/legal/security-annex.md): Organizational. Role-based access with least privilege (RBAC module.resource.action); mandatory MFA in the console and in Ops; time-boxed support impersonation, reason-required and audited, visible to the client; annual training. - [Softcrum Sub-processors — DRAFT v0.1 (public list, trust center)](https://internal.softcrum.com/en/legal/subprocessors.md): The sub-processors Softcrum relies on, what each one processes and where it runs. Changes are announced [30] days ahead by email plus a trust-center changelog. - [Terms of Service — core clauses — DRAFT v0.1](https://internal.softcrum.com/en/legal/tos.md): (Full structure for the lawyer to develop; the economic clauses reflect the DEC-G3 model.).