Org X-Ray — Migration Readiness Report

What your Salesforce org contains — and how much of it converts to code you own. Modeled on the Lightning Experience Readiness Report your admins already know: a scored summary, category findings, and a recommended action plan. Generated by OpenForce from your org’s exported metadata; every number below is counted, not estimated.

Migration Readiness

Overall readiness for an exit onto owned code, scored from your metadata.

21.8% READY TODAY

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.

96ready today (deterministic)
36needs translation (LLM + verification)
308needs a person / not in a pipeline yet
442metadata files scanned

Findings — Coverage: what converts today vs what needs translation

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.

21.8% ready today · 8.2% needs translation · 70.0% needs a person / not in a pipeline yet

Ready today 96 items

Transcribed today — deterministic transcription, running now, no AI in the loop.

ArtifactCount
Objects → PostgreSQL tables (Prisma models)6
Fields → typed columns68
Validation rules → Zod validators (formula subset)0
Record types → per-variant schemas0
List views → table configs + SQL filters7
Search layouts → Postgres full-text indexes5
Permission sets → RBAC policies + row security3
Page layouts → React detail + edit views7

Needs translation 36 items

Translation required — Apex, Flows and out-of-subset formulas go through the LLM + verification harness.

ArtifactCount
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 triggers0
Flows
44 elements to translate
10
Workflow rules0

Needs a person / not in a pipeline yet 308 items

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.

ArtifactCount
Profiles (permission sets cover the RBAC path today)0
Email templates the classifier can't auto-render0
Reports the SQL generator refuses0
Dashboards not fully rendered0
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

Recommended action plan

An ordered plan built from what this org actually contains — steps for artifact types you don’t have are omitted.

  1. Review the coverage report
    Confirm the counted inventory above against your org and flag anything the metadata snapshot missed before scoping the conversion. Every number here is counted, not estimated.
  2. Convert schema and declarative logic
    Auto-transcribe 96 items — objects, fields, validation-rule formulas in the deterministic subset, record types, list views, search, permission sets and layouts — into owned code. Deterministic: runs today, no AI in the loop.
  3. Translate and parity-verify Apex and Flows
    Run 26 Apex class(es) and 0 trigger(s) (1,897 lines, 36 SOQL — 32 already deterministic SQL) and 10 Flow(s) (44 elements) through the LLM + verification harness. Each output is checked for behavioral parity against the source — translated, then verified, never trusted blind.
  4. Migrate data and cut over
    Export record data from the 6 object(s), load into PostgreSQL, run both systems in parallel to prove parity, then retire the Salesforce seats. After cutover the per-seat license line item is $0.

Exit bill of materials

What a migration of this org produces and what remains as translation work.

DeliverableQuantity
PostgreSQL tables (Prisma models)6
Typed columns68
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 indexes5
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 translate0

Cost exposure

Seats200
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.

Stay vs. Own — 5-year savings

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.

LineStay 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.

Integrations

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.

KindCount
namedCredential1
remoteSite1
apexCallout5

7 integration point(s) total — 2 mapped to an owned-stack equivalent, 5 flagged for human design work.

Custom UI components

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 found15
LWC15
Aura0
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.

Reports & dashboards

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).

Reports0
  auto-translatable to SQL0
  refused (see reasons below)0
Dashboards0
  fully rendered (every panel)0
  panels rendered0
  panels refused (see reasons below)0

Formula & roll-up fields

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.

Sharing model

Org-wide defaults, role hierarchy, and sharing rules — parsed and counted, not compiled into RLS here.

Org-wide defaults, role hierarchy, and sharing rules — parsed only, not compiled into RLS policies here (that step needs a real owner-column wiring the engine doesn't have yet; see the transcription CLI's Sharing→RLS output for that artifact). Default-deny: anything not modeled below grants nothing.

Objects with OWD modeled6
Roles0
Role hierarchy depth0
Sharing rules modeled0
Constructs flagged / not modeled1

OWD mix

Org-wide defaultObjects
ControlledByParent3
ReadWrite3

Flagged count always includes a standing advisory for Manual sharing: it is per-record runtime data with no metadata file to parse, so it can never be transcribed from a snapshot alone.

Appendix · Inventory

Everything found in the metadata snapshot, by type — the raw counts behind the readiness score above.

MetadataCount
Objects6
Fields68
Validation rules0
Record types0
List views7
Search layouts5
Permission sets3
Page layouts7
Profiles0
Flows10 (44 elements)
Apex classes26
Apex triggers0
Apex source lines1,897
SOQL statements (measured)36
SOQL translating deterministically today32 (88.9%)
Workflow rules0
Email templates0
Reports0
Other: (no extension)18
Other: .aievaluationdefinition-meta.xml1
Other: .app-meta.xml2
Other: .asset3
Other: .asset-meta.xml3
Other: .bot-meta.xml2
Other: .botversion-meta.xml2
Other: .brandingset-meta.xml1
Other: .compactlayout-meta.xml1
Other: .corswhitelistorigin-meta.xml4
Other: .csptrustedsite-meta.xml5
Other: .css16
Other: .digitalexperience-meta.xml1
Other: .digitalexperienceconfig-meta.xml1
Other: .embeddedserviceconfig-meta.xml1
Other: .flexipage-meta.xml9
Other: .genaifunction-meta.xml11
Other: .genaiplannerbundle2
Other: .genaiplugin-meta.xml3
Other: .genaiprompttemplate-meta.xml4
Other: .html16
Other: .jpeg1
Other: .js23
Other: .js-meta.xml15
Other: .json98
Other: .lightningexperiencetheme-meta.xml1
Other: .messagingchannel-meta.xml1
Other: .navigationmenu-meta.xml1
Other: .network-meta.xml2
Other: .page1
Other: .page-meta.xml1
Other: .png17
Other: .presenceuserconfig-meta.xml1
Other: .queue-meta.xml1
Other: .queueroutingconfig-meta.xml1
Other: .quickaction-meta.xml1
Other: .resource-meta.xml2
Other: .servicechannel-meta.xml1
Other: .servicepresencestatus-meta.xml1
Other: .settings-meta.xml1
Other: .site-meta.xml3
Other: .svg4
Other: .tab-meta.xml5
Other: .woff23
Total files scanned442

Flow element histogram

ElementCount
assignments10
start10
recordLookups8
actionCalls5
recordCreates4
decisions2
formulas2
loops1
screens1
recordUpdates1