Overall readiness for an exit onto owned code, scored from your metadata.
Significant custom logic
Plan for guided translation — the deterministic core is smaller in this org.
This score is coverage of auto-transcription: the share of inventoried items that convert deterministically today, with no AI in the loop. Validation-rule formulas outside the deterministic subset are counted against it, so the number is honest rather than flattering.
Category-by-category, in the Readiness-Report rhythm: what is ready, what needs attention, what is blocked. Each metadata item weighs 1. Validation rules whose formulas fall outside the deterministic subset are counted against today’s coverage — they were flagged by running the actual generator on your rules.
Transcribed today — deterministic transcription, running now, no AI in the loop.
| Artifact | Count |
|---|---|
| Objects → PostgreSQL tables (Prisma models) | 6 |
| Fields → typed columns | 68 |
| Validation rules → Zod validators (formula subset) | 0 |
| Record types → per-variant schemas | 0 |
| List views → table configs + SQL filters | 7 |
| Search layouts → Postgres full-text indexes | 5 |
| Permission sets → RBAC policies + row security | 3 |
| Page layouts → React detail + edit views | 7 |
Translation required — Apex, Flows and out-of-subset formulas go through the LLM + verification harness.
| Artifact | Count |
|---|---|
| Validation-rule formulas outside the deterministic subset flagged by the real generator, not estimated | 0 |
| Apex classes 1,897 lines, 36 SOQL statements — 32 (88.9%) already translate to SQL deterministically | 26 |
| Apex triggers | 0 |
| Flows 44 elements to translate | 10 |
| Workflow rules | 0 |
Inventoried but not yet in either automated pipeline — scoped for human work (UI rewrites, endpoint design) or awaiting an engine surface; counted against readiness so the score stays honest.
| Artifact | Count |
|---|---|
| Profiles (permission sets cover the RBAC path today) | 0 |
| Email templates the classifier can't auto-render | 0 |
| Reports the SQL generator refuses | 0 |
| Dashboards not fully rendered | 0 |
| Integration points (named credentials, connected apps, remote sites) see Integrations section — endpoints need a human-designed replacement | 2 |
| Sharing metadata (roles, sharing rules files) | 0 |
| Custom UI components (LWC/Aura) 100% require manual rewrite — see Components section | 15 |
| Other metadata files (see inventory) | 291 |
An ordered plan built from what this org actually contains — steps for artifact types you don’t have are omitted.
What a migration of this org produces and what remains as translation work.
| Deliverable | Quantity |
|---|---|
| PostgreSQL tables (Prisma models) | 6 |
| Typed columns | 68 |
| Validators (Zod) 0 of 0 formulas need manual/LLM translation | 0 |
| Access policies (RBAC + row security) | 3 |
| Generated views (React detail/edit + list views) | 21 |
| Full-text search indexes | 5 |
| Flows to translate 44 elements total | 10 |
| Apex classes to translate 1,897 source lines, 36 SOQL statements — 32 → SQL deterministically today | 26 |
| Apex triggers to translate | 0 |
| Seats | 200 |
| Current per-seat cost | $175/user/mo |
| Annual license spend — recurring every year | $420,000/yr |
| Agentforce-era add-on exposure at renewal $125–$550/user/mo add-ons (published 2026 list) — range shown, not a prediction | $300,000–$1,320,000/yr additional |
A migration is a one-time conversion of the bill of materials above into code you own — after which the per-seat line item is $0 and the recurring cost is your own hosting and maintenance. This report does not estimate the conversion price; it scopes exactly what the conversion consists of.
Every figure below is computed from this org's measured cost exposure. Assumptions (tunable per deal): one-time conversion = 1.25× current annual license; aftercare = 12%/yr of former spend (flat, not per-seat); Salesforce escalation 8%/yr; all-in TCO 1.5× license.
| Line | Stay on Salesforce (5 yr) | Own it with OpenForce (5 yr) |
|---|---|---|
| License (with 8%/yr escalation) | $2,463,972 | — |
| All-in TCO (1.5× license) | $3,695,959 | — |
| Agentforce add-on (if adopted) | $1,500,000 – $6,600,000 | — |
| One-time conversion (1.25× annual) | — | $525,000 |
| Aftercare (12%/yr, flat) | — | $201,600 |
| 5-year total | $3,695,959 – $10,295,959 | $726,600 |
Net saved: $2,969,359 (up to $9,569,359 if they adopt Agentforce) · Payback ≈ 15 months · then you own the code, forever.
Outbound/inbound integration points this org depends on — counted and mapped where an owned-stack equivalent exists, flagged honestly where it doesn't.
Named credentials, connected apps, remote-site entries, and outbound Apex callouts this org depends on. Endpoint business logic and live credentials are never inspected or fabricated — only counted and mapped where an owned-stack equivalent exists.
| Kind | Count |
|---|---|
namedCredential | 1 |
remoteSite | 1 |
apexCallout | 5 |
7 integration point(s) total — 2 mapped to an owned-stack equivalent, 5 flagged for human design work.
LWC/Aura bundles found on disk — inventoried and scoped, not auto-converted.
Custom UI (Lightning Web Components / Aura). There is no trustworthy automated LWC/Aura→React translator — faking one would ship silently-wrong UI. Every component here needs a human rewrite; the value is precise scoping (public API, data dependencies, events), not a fabricated conversion.
| Components found | 15 |
| LWC | 15 |
| Aura | 0 |
| Simple (display-only) | 10 |
| Moderate (one data dependency) | 0 |
| Complex (imperative calls / events / multiple dependencies) | 5 |
100% need manual rewrite — stated honestly, not hidden inside the coverage score.
What the real report/dashboard generator can translate to SQL/config today vs what it honestly refuses.
Reports translate to a single deterministic SQL SELECT when their shape allows it (Tabular/Summary, implicit-AND filters, no custom summary formulas); Matrix/joined reports and other unsupported shapes are honestly refused, never approximated. Dashboard panels are resolved through the SAME translate/refuse machinery: a panel renders only when it binds exactly to what its backing report produces, and is refused — by construct — whenever the value would have to be fabricated (a renderable chart kind alone is not enough).
| Reports | 0 |
| auto-translatable to SQL | 0 |
| refused (see reasons below) | 0 |
| Dashboards | 0 |
| fully rendered (every panel) | 0 |
| panels rendered | 0 |
| panels refused (see reasons below) | 0 |
Computed fields, classified by the owned-stack construct each becomes.
Computed fields, split by the owned-stack construct they become: a same-object formula becomes a Postgres GENERATED ALWAYS AS column; a cross-object formula becomes a query-time resolver (generated columns can't reference another table's row); a roll-up summary becomes a trigger-maintained aggregate. Anything outside that subset is flagged, never guessed.
| Generated columns (same-object formulas) | 1 |
| Rollup triggers (roll-up summaries) | 3 |
| Query-time resolvers (cross-object formulas) | 9 |
| Flagged (outside the supported subset) | 10 |
23 computed field(s) classified total.
Everything found in the metadata snapshot, by type — the raw counts behind the readiness score above.
| Metadata | Count |
|---|---|
| Objects | 6 |
| Fields | 68 |
| Validation rules | 0 |
| Record types | 0 |
| List views | 7 |
| Search layouts | 5 |
| Permission sets | 3 |
| Page layouts | 7 |
| Profiles | 0 |
| Flows | 10 (44 elements) |
| Apex classes | 26 |
| Apex triggers | 0 |
| Apex source lines | 1,897 |
| SOQL statements (measured) | 36 |
| SOQL translating deterministically today | 32 (88.9%) |
| Workflow rules | 0 |
| Email templates | 0 |
| Reports | 0 |
| Other: (no extension) | 18 |
| Other: .aievaluationdefinition-meta.xml | 1 |
| Other: .app-meta.xml | 2 |
| Other: .asset | 3 |
| Other: .asset-meta.xml | 3 |
| Other: .bot-meta.xml | 2 |
| Other: .botversion-meta.xml | 2 |
| Other: .brandingset-meta.xml | 1 |
| Other: .compactlayout-meta.xml | 1 |
| Other: .corswhitelistorigin-meta.xml | 4 |
| Other: .csptrustedsite-meta.xml | 5 |
| Other: .css | 16 |
| Other: .digitalexperience-meta.xml | 1 |
| Other: .digitalexperienceconfig-meta.xml | 1 |
| Other: .embeddedserviceconfig-meta.xml | 1 |
| Other: .flexipage-meta.xml | 9 |
| Other: .genaifunction-meta.xml | 11 |
| Other: .genaiplannerbundle | 2 |
| Other: .genaiplugin-meta.xml | 3 |
| Other: .genaiprompttemplate-meta.xml | 4 |
| Other: .html | 16 |
| Other: .jpeg | 1 |
| Other: .js | 23 |
| Other: .js-meta.xml | 15 |
| Other: .json | 98 |
| Other: .lightningexperiencetheme-meta.xml | 1 |
| Other: .messagingchannel-meta.xml | 1 |
| Other: .navigationmenu-meta.xml | 1 |
| Other: .network-meta.xml | 2 |
| Other: .page | 1 |
| Other: .page-meta.xml | 1 |
| Other: .png | 17 |
| Other: .presenceuserconfig-meta.xml | 1 |
| Other: .queue-meta.xml | 1 |
| Other: .queueroutingconfig-meta.xml | 1 |
| Other: .quickaction-meta.xml | 1 |
| Other: .resource-meta.xml | 2 |
| Other: .servicechannel-meta.xml | 1 |
| Other: .servicepresencestatus-meta.xml | 1 |
| Other: .settings-meta.xml | 1 |
| Other: .site-meta.xml | 3 |
| Other: .svg | 4 |
| Other: .tab-meta.xml | 5 |
| Other: .woff2 | 3 |
| Total files scanned | 442 |
| Element | Count |
|---|---|
assignments | 10 |
start | 10 |
recordLookups | 8 |
actionCalls | 5 |
recordCreates | 4 |
decisions | 2 |
formulas | 2 |
loops | 1 |
screens | 1 |
recordUpdates | 1 |