Project plan · Revision 2 · 7 October 2026
Custody first. Fixes next. Then one slice at a time.
Allodial's plan to move Hippocrates Wellness off SDSOL's HNS platform: secure HHI's code and data, close the 5 Critical defects among 55 open tracker items, and replace the system module by module on open source, with zero record loss.
What the engagement covers
Four jobs, in this order, each with a gate before the next.
This revision supersedes rev1, which stopped partway through custody. It adds the full phase plan, the rules for when to announce, the record-safety rules, the open-source stack and the order of the slices.
Principles
Seven rules every later decision answers to.
- 01
HHI owns everything. Allodial operates on HHI's behalf.Every repo, tenant, account and key sits in HHI's name, and Allodial gets delegated access. The takeover stays clean, and HHI cannot be locked in a second time, including by us.
- 02
Custody before announcement.SDSOL hears about the transition only after HHI holds the code, data, keys and accounts, unless one of the triggers in §3 forces it earlier.
- 03
No deception.HHI asks only for things it is entitled to, and gives reasons that are true. If SDSOL asks directly whether HHI is changing vendors, HHI does not lie; it can say it doesn't discuss vendor strategy. Quiet is fine. False is not.
- 04
Fix first, then replace.Stabilizing HNS buys the operational goodwill and the time a careful rebuild needs.
- 05
Strangler fig, not big bang.New services sit in front of or beside HNS and take over one slice at a time. Every slice has a rollback.
- 06
No record is ever destroyed.Legacy data is archived immutably, each entity has exactly one writer at any moment, and every migration is reconciled. Money ties out to the cent.
- 07
Open source first.Custom code goes only where HHI's workflow is unusual, which mainly means campus scheduling.
Pre-contract · Weeks −2 to 0
Clear the conflicts, read the contract and pay the bills before asking for anything.
| Item | Owner | Notes |
|---|---|---|
| 1.1MB conflict disclosure | Allodial + HHI | MB is HHI Sales Director and an Allodial co-founder. HHI's approver and signatory on the Allodial contract should be someone other than MB, with the conflict waiver in writing (already being drafted). This protects the deal if it is challenged later. |
| 1.2Pull the HHI–SDSOL agreement | HHI → Allodial counsel | Read for IP and work-product assignment, source-delivery obligations, escrow, termination notice, transition-assistance duties, non-solicit, reverse-engineering limits, hosting ownership, data-handling terms and payment status. §2's tactics depend on what this says. |
| 1.3Bring SDSOL invoices current | HHI | An unpaid balance is SDSOL's best leverage to hold back code. Pay current, undisputed invoices before any custody request. Disputed items go in writing and stay separate. |
| 1.4Allodial–HHI MSA + phased SOW | Allodial | One SOW per phase, each with an exit. Confidentiality covering SDSOL materials. Add a BAA if any HNS data counts as PHI (open question Q4). |
| 1.5HHI-owned admin identity | HHI (Allodial sets up) | An HHI-domain mailbox and account, e.g. it-admin@hippocrateswellness.org, owned by HHI, with MFA held by an HHI officer. Allodial operates it under the MSA. Every custody request in §2 goes out under this identity. |
| 1.6HHI-owned code and storage homes | Allodial | An HHI GitHub (or Azure DevOps) org and an HHI cloud storage account with immutable (WORM) retention. Allodial engineers are members of HHI's org. |
Contract read, invoices current, MSA and SOW signed, HHI identity and storage live.
Quiet custody
HHI holds the code. Allodial works from HHI's copy.
Allodial never appears in any system SDSOL can see until announcement day. Asking for its own source, data and keys is ordinary governance for any client of a custom-software shop, and SDSOL's docs haven't been updated since January 2026, so a documentation and custody refresh is easy to justify. None of these requests implies a vendor change. They should still go out one at a time over 2–4 weeks: a single list reads like an exit.
2.1 · Take today, without asking SDSOL
Accounts HHI almost certainly already owns as merchant or licensee. Confirm each one, add the HHI admin identity and read the configuration. That alone tells us how HNS is wired.
- Microsoft 365 / Entra ID tenant. The Outlook/Graph sync app registration should be in HHI's tenant. Record its permissions and secret expiry.
- Authorize.Net merchant account (HHI is merchant of record): API login IDs, CIM profiles, settlement reports. These reports are the ground truth for money reconciliation later.
- Cin7 Core, Shopify, Dialpad. Check whether API keys and webhooks point at HNS endpoints.
- Domain registrar and DNS for hippocrateswellness.org and any app subdomains. DNS control is what lets us cut traffic over later.
- AWS account behind SES, if it is in HHI's name.
- Apple App Store / Google Play developer accounts. Find out today whose name these are in. If they are SDSOL's, moving them takes weeks and needs SDSOL's cooperation, so this is the item most likely to set the earliest announcement date.
2.2 · Ask SDSOL, one item at a time, framed as governance
| Request | True reason HHI can give | What it gets us |
|---|---|---|
| AProduction database backup | Disaster recovery and data retention. HHI should hold its own records. A full .bak delivered monthly to HHI's storage, starting now. | All the data, plus the live schema. Allodial can start analysis right away. |
| BSource repo ownership | Client custody of work product is standard practice, and HHI's continuity planning requires it. Move the repo(s) into HHI's GitHub org with SDSOL keeping write access; second choice, HHI admin as owner on SDSOL's repo. | The code, full history and CI config. Allodial works from a mirror in a separate HHI org, so SDSOL sees no Allodial accounts. |
| CCloud tenant ownership | HHI should own the infrastructure it pays for, with billing in HHI's name. Move the subscription to HHI's tenant, or add the HHI admin as Owner. | Visibility into infrastructure and the deployment pipeline, and the ability to rotate secrets later. |
| DCredentials inventory | Security hygiene and key-person risk. Every secret and where it lives; values go into an HHI-owned vault. | The rotation list for announcement day. |
| EUpdated docs + deployment runbook | Docs are 9 months stale, and HHI needs current SOPs anyway (GEN-01, GEN-02). | Shortens Allodial's ramp-up. |
| FTracker responses | The tracker has no SDSOL responses. Classification and target date for all 55 items. | SDSOL's own view of root causes, and a record of their performance. |
Who sends them: an HHI officer other than MB, from the HHI identity. Allodial writes the drafts; Allodial's name does not appear in them. If SDSOL stalls or refuses B, that is information: use the contract (1.2) to escalate while the work below keeps moving.
2.3 · Work that needs no code at all · from Week 0
- Black-box reproduction. With HHI staff logins, reproduce the Critical and High bugs and record exact steps, screenshots and timing. Start with FD-01, FD-02, FD-04, SO-01, SO-03, SO-05, SALES-01, EO-03 and VIDA-01.
- Data analysis from backup A, restored into an Allodial-isolated, HHI-owned environment: confirm the timezone hypothesis behind FD-04 and SO-03, find the overlapping bookings behind SO-01, and trace house-credit history behind SALES-01 through
ActivityLogs. - Synthetic test data.
hns_synth_oct26_apr27_900.sqlitecan drive tests without exposing guest PII. - Fallback if B is blocked, legal sign-off first. If the compiled .NET 9 assemblies are deployed in an HHI-owned tenant, they decompile to readable C# with ILSpy. Only if counsel confirms the contract permits it. A last resort, not a plan.
Custody complete. HHI holds the DB backup, the repo or a verified mirror, tenant ownership or Owner access, the credentials inventory, and confirmed ownership of every §2.1 account including the app stores. Gate 1 is the earliest sensible announcement date.
When to announce
Announce on A-day, with the fixes in hand.
A-day is the first business day after Gate 1 and after the §4 fix pack is ready to ship. Ideally both land together.
- 1
SDSOL asks HHI directly about a vendor change (Principle 3).
- 2
Allodial needs to appear in any system SDSOL can see: shared repo, prod tenant, tracker or email threads.
- 3
Allodial needs to deploy anything to production. Two uncoordinated teams deploying to one system is how records get lost.
- 4
The contract's termination notice period, counted back from HHI's planned end date, requires it.
- 5
An app-store transfer needs SDSOL's cooperation and its lead time puts it on the critical path.
- 6
Any sign of a leak. A clean announcement beats one SDSOL pieces together from rumor.
- 1
Rotate every secret SDSOL knows: DB logins, Azure app-registration secret, Authorize.Net transaction key, Cin7/Shopify/Dialpad keys, SES credentials, push certs.
- 2
Downgrade SDSOL's access to read-only, or remove it, per the agreed transition terms.
- 3
Take a fresh full backup and a WORM snapshot (§6).
- 4
Freeze deployments: no SDSOL deploys after A-day without Allodial review.
- 5
Send a written transition request under the contract: knowledge-transfer hours, open-branch handover, work in progress.
How the announcement is worded, and whether SDSOL is kept on for a paid transition period, is HHI's call. Allodial drafts both options.
Phase 1 · Stabilize HNS
Built quietly on the mirror, shipped from A-day.
Fixes are prepared during the quiet period and deployed only after A-day (trigger 3). On day one HHI gets visible relief, which is the strongest case for the transition.
| Fix pack | Tracker items | Likely root cause | Approach |
|---|---|---|---|
| FP1Dates and time zones | FD-01, FD-02, FD-04, SO-03 | UTC stored, local date derived inconsistently. Filters truncate to UTC midnight. | Normalize on America/New_York at the query layer with one shared date-range helper. Regression tests across DST changes. |
| FP2Double-booking and lost appointments | SO-01, SO-04, EM-11, VIDA-02 | No transactional conflict check on staff, room or equipment. | Overlap check inside a serializable transaction, or a slot-claim table with a unique index. Exceptions block booking and carry a reason. |
| FP3Money integrity | SALES-01, EO-01, EO-03, EO-04, EM-08, VIDA-01, FD-08 | House credits changed without ledger entries. Authorization-hold config. Duplicate posting or display. | Append-only house-credit ledger (balance = sum of entries). 48-hour hold configurable per service. Reconcile against Authorize.Net. Audit history first: balances may already be wrong. |
| FP4Performance | SO-05 | Missing indexes and N+1 queries in itinerary generation. | Profile with Query Store; add indexes and projection queries. Itinerary in under 5 seconds, from about 5 minutes. |
| FP5Visibility and permissions | EM-01, SO-02, SO-07, ADMIN-02, GEN-05 | Role-matrix gaps. | Fix the permission matrix. Add a read-only Security role. |
Configuration and training items (EM-02, FD-06, GEN-04, SALES-04 monitoring) are handled as admin setup and SOP work. The remaining enhancements (HK, SH, SALES-05, ADMIN-01, ADMIN-03) are not built into HNS; they become requirements for the replacement slices, so nothing is invested in code being retired.
All 5 Critical items closed and verified by HHI staff, house-credit balances reconciled and signed off by HHI finance, and CI with automated tests running on HHI's repo.
Phase 2 · Platform foundation
An open-source platform that sits in front of HNS, from Gate 1.
Runs alongside Phase 1. Every layer is open source unless noted, and the SaaS that already works stays.
| Layer | Choice | Why |
|---|---|---|
| Edge / strangler router | YARP MIT, .NET | Same stack as HNS. Routes each path to legacy or new, so cutover is a config change per route and rollback is the same change in reverse. |
| Identity / RBAC | Keycloak Apache-2.0, federated with Entra ID | One login across legacy and new. HHI's 15+ roles become managed groups instead of hard-coded logic. |
| New system of record | PostgreSQL | Range types plus EXCLUDE constraints prevent double-booking at the database level, permanently fixing the SO-01 class of bug. |
| Legacy → new data flow | Debezium SQL Server connector (CDC) | Streams every legacy change to new services during shadow and dual-run. Nothing goes through ad-hoc exports. |
| Reporting / BI | Metabase AGPL, on a read replica | Quick win for SALES-05 and finance reporting, with no write risk. |
| Observability | OpenTelemetry + Grafana / Prometheus / Loki, GlitchTip for errors | HHI has had no visibility into failures. This gives it that. |
| Feature flags | Unleash Apache-2.0 | Per-department rollout inside a slice, e.g. Salon first, then Energy Medicine. |
| Background jobs | Hangfire LGPL core or a Postgres-native queue | Replaces whatever HNS uses for the nightly Cin7 sync and scheduled jobs. |
| Kept as SaaS | Authorize.Net, Cin7 Core, Shopify, Dialpad, M365, SES | These work and aren't the problem. Re-point their integrations slice by slice. |
ADR-1 · Base application platform
Decided at Gate 2, after a two-week bake-off against real HHI workflows using the synthetic database. Leaning: B for back office, with an A-style custom service for campus scheduling. Scheduling (rooms, staff, equipment, itineraries) is what makes HHI different and where HNS fails most, so we own that code. Everything generic comes from open source.
| A · Custom .NET + OSS | B · Odoo + OCA · leaning | C · ERPNext / Frappe | |
|---|---|---|---|
| Fit | Matches HNS skills and stack. Full control over scheduling. | Highest OSS coverage of purchasing, POS, CRM and finance (OCA/pms plus OCA purchase, POS and accounting), with a custom scheduling service. The ERP engagement already discussed. | GPL. Strong ERP core. |
| Risk | Most custom code. Back-office functions (POs, POS) rebuilt from scratch. | Odoo Appointments is Enterprise-only, so scheduling stays custom either way. OCA pms maturity needs a hands-on check. Python stack. | Weakest hospitality and spa fit. More custom work than B. |
ADR-1 decided, router in front of HNS in passthrough mode, Keycloak SSO live for legacy, CDC streaming into Postgres, Metabase live.
Record safety
Nine non-negotiables. No record is lost, and money ties out to the cent.
- 01
Immutable legacy archive.A full SQL Server backup plus a Parquet export of every table at A-day and before each slice cutover, in HHI WORM storage with SHA-256 manifests. Retained indefinitely, or for HHI's retention period as set by counsel. Retiring HNS never deletes its data.
- 02
One writer per entity.A published ownership table (entity → system of record → date). An entity is never writable in two systems at once. Changes are signed off by Allodial and HHI.
- 03
Shadow, then dual-run, then cutover.Shadow: the new service computes results from CDC data that users don't see. Dual-run: staff use the new UI and results are compared to legacy daily. Cutover: the router flips and the new system becomes the writer.
- 04
Reconciliation gates every cutover.Row counts, per-record hashes on migrated fields, and money totals tied to the cent against Authorize.Net settlement and Cin7. Any variance stops the cutover.
- 05
Rollback is rehearsed, not hoped for.Each slice has a written rollback with a time limit (default 72 hours). Writes made in the new system during that window are replayed to legacy by a tested script.
- 06
Payment data never moves.Card data stays in Authorize.Net CIM; we migrate profile IDs, never card numbers. The 4 AES-encrypted fields are re-encrypted under an HHI-owned key.
- 07
Audit history is carried forward.HNS ActivityLogs migrates into the new audit store, so a guest's full history stays queryable after decommission.
- 08
Cutovers happen in low-occupancy windows,with HHI department leads on site and Allodial on call.
- 09
Restores are tested monthly.A backup that has never been restored doesn't count.
Phase 3 · Piecemeal replacement
Low risk and high pain first. Money and reservations last.
Each slice runs shadow → dual-run → cutover → 30-day hypercare.
| Slice | Absorbs | Base | Risk | Duration |
|---|---|---|---|---|
| S1Reporting and BI (read-only) | SALES-05, SH-04, finance views | Metabase | Very low | 3–4 wks |
| S2Itinerary and schedule printing | SO-03, SO-05, EM-03, SO-02 | Custom read-only rendering service on CDC | Low | 4–6 wks |
| S3Housekeeping and maintenance work orders | HK-01, HK-02, HK-03 | OSS work-order module (Odoo Maintenance in B) | Low | 6–8 wks |
| S4Purchasing / POs | SH-01, SH-02, SH-03, SH-04 | Odoo Purchase (B) + Cin7 | Medium | 6–8 wks |
| S5Guest profiles and CRM | SO-06, EO-02, GEN-03, GEN-07 | Odoo contacts / CRM (B) + merge tooling | Medium | 8 wks |
| S6Campus scheduling engine | FD-03, FD-05, FD-07, EM-04, EM-05, EM-07, EO-05, VIDA-02, GEN-06 | Custom service on Postgres EXCLUDE constraints, Outlook via Graph | High | 12–16 wks per department, behind flags |
| S7Payments, folios and house credits | SALES-02, SALES-03, EM-06, EM-09, EM-10 | Odoo POS / accounting (B) + append-only credit ledger | High | 10–12 wks |
| S8Reservations / PMS core | Remaining Sales & Reservations | OCA pms (B) or custom | Highest | 12+ wks |
| S9Guest mobile app | — | Rebuilt on the new APIs, published from HHI's developer accounts | Medium | 8–10 wks alongside S6–S8 |
| S10Decommission HNS | — | Final archive (§6.1); read-only legacy viewer kept 12 months, then archive only | Low | 4 wks |
Rough calendar · months from Gate 0
Only S6–S8 are on the critical path. Estimates firm up after Gate 2.
Team and cadence
A small Allodial team, an HHI sponsor who isn't MB, and a super user per department.
Delivery team
- Engagement lead
- Tech lead and architect
- 2–3 engineers: one .NET, one Postgres / data
- QA and test automation
- CTO signs off on architecture: ADR-1 and each slice design
Owners and validators
- Executive sponsor, not MB (per 1.1)
- Finance lead for reconciliation sign-off
- One super user per department for dual-run validation
How we report
- Weekly status to HHI
- Cutover go / no-go per slice, with written sign-off
- Monthly steering review
Risks
What could go wrong, and what we do about it.
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| SDSOL refuses or slow-walks custody (§2.2 B) | Medium | High | Invoices current first (1.3), contract escalation, work from the DB backup and black-box testing meanwhile; decompile only with legal sign-off. |
| SDSOL figures out the plan early | Medium | Medium | Truthful framing, staggered requests, no Allodial footprint. If it happens, announce immediately (§3). |
| SDSOL degrades or sabotages after announcement | Low | High | Custody and credential rotation on A-day, deployment freeze, WORM backups. |
| App-store accounts held by SDSOL | Unknown | Medium | Identify in Week 0. Treat as a possible early-announcement trigger. |
| House-credit or payment balances already wrong | Medium | High | Forensic ledger reconstruction from ActivityLogs + Authorize.Net before any migration. HHI finance signs off on opening balances. |
| Guest data is PHI | Unknown | High | Decide Q4 early. BAA, access logging and data minimization in the new design. |
| Key-person risk on the Allodial side | Medium | Medium | Everything in HHI's repo, ADRs written down, runbooks per slice. |
| Scope creep from the 55-item backlog | High | Medium | Enhancements go to the slice backlog. Only defects get fixed in HNS. |
| MB conflict challenged later | Low | High | Section 1.1 waiver, non-MB approver. |
Open questions
Seven answers we need, and who has them.
| # | Question | For |
|---|---|---|
| Q1 | What does the HHI–SDSOL contract say on IP assignment, termination notice and transition assistance? | HHI / counsel |
| Q2 | Whose names are the Azure/AWS prod tenant and the Apple/Google developer accounts in? | HHI, via the HHI admin identity |
| Q3 | Is HHI current on SDSOL invoices? Any disputed amounts? | HHI finance |
| Q4 | Does HNS store health information that makes HHI a HIPAA covered entity or makes the data PHI (e.g. Energy Medicine or medical program notes)? | HHI / counsel |
| Q5 | What does “HNS” stand for? | MB |
| Q6 | Does HHI want SDSOL on a paid transition period after A-day, or a clean exit? | HHI sponsor |
| Q7 | Busiest and quietest operating periods, to choose cutover windows? | HHI ops |