Context
The previous CRM could not express the real graph: institutes related to contacts related to applicants related to tasks, with permissions that were not “admin or not.”
System boundary
In scope
- relationship model
- filters
- boards
- permissions
- migration
Out of scope
marketing automation blasts
Architecture
Entities are nodes with typed edges. Status is a workflow on an entity, not a column that everyone edits. Permissions attach to relationship and role, not to a hidden screen flag.
- Institutes
- Contacts
- Applicants
- Tasks
- Statuses
- Permissions
- Typed edges
- Permissions are data
- Institutes
- Contacts
- Applicants
- Tasks
- Statuses
- Permissions
Counts from the published record. They describe structure, not a measured result.
How do the system domains relate?
relationships
- storeInstitutes
- storeContacts
workflow
- processApplicants
- serviceTasks
- serviceStatuses
policy
- interfacePermissions
- InstitutesContacts
- InstitutesApplicants
- ContactsApplicants
- ApplicantsTasks
- ApplicantsStatuses
- ContactsPermissions
- InstitutesPermissions
Critical flows
An institute owns contacts
an applicant is linked
tasks and statuses move the case
permission checks decide who sees which edge.
Stages
Decisions
Graph before screens
If the model cannot say “this contact at this institute,” the UI will lie.
Permissions are data
A new role must be configurable without a deploy. Hardcoded admin checks do not survive the client.
Migrate with dual write, then cut
Legacy import is a project. Shadow reads until the graph is complete.
When it fails
| Condition | Detection | Response |
|---|---|---|
| Orphan applicant | Required institute/contact edge | Block create |
| Permission miss | Policy deny | Empty result, not 500 |
| Legacy id collision | Import keymap | Halt batch; keep map |
Infrastructure
- Application
- relational store
- search/filter indexes
- queued migration jobs
- audit of permission changes
Outcome
Operations run on an explicit relationship graph with permissions that match how the organisation actually works.
Current state
In production as an anonymized public record. Legacy cutover complete for the published scope.