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.

6.5% 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.

721ready today (deterministic)
1,062needs translation (LLM + verification)
9,362needs a person / not in a pipeline yet
12,194metadata 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.

6.5% ready today · 9.5% needs translation · 84.0% needs a person / not in a pipeline yet

Ready today 721 items

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

ArtifactCount
Objects → PostgreSQL tables (Prisma models)51
Fields → typed columns597
Validation rules → Zod validators (formula subset)3
Record types → per-variant schemas0
List views → table configs + SQL filters17
Search layouts → Postgres full-text indexes6
Permission sets → RBAC policies + row security0
Page layouts → React detail + edit views46
Email templates → render modules
deterministic {!Object.Field} merge templates
1

Needs translation 1,062 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
317,863 lines, 2,471 SOQL statements — 1,940 (78.5%) already translate to SQL deterministically
1,035
Apex triggers26
Flows0
Workflow rules1

Needs a person / not in a pipeline yet 9,362 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 refuses
Matrix/joined/custom-summary or unknown-object shapes — see Reports & dashboards section
8
Dashboards not fully rendered0
Integration points (named credentials, connected apps, remote sites)
see Integrations section — endpoints need a human-designed replacement
4
Sharing metadata (roles, sharing rules files)0
Custom UI components (LWC/Aura)
100% require manual rewrite — see Components section
176
Other metadata files (see inventory)9,174

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 721 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 1,035 Apex class(es) and 26 trigger(s) (317,863 lines, 2,471 SOQL — 1,940 already deterministic SQL) 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 51 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)51
Typed columns597
Validators (Zod)
0 of 3 formulas need manual/LLM translation
3
Access policies (RBAC + row security)0
Generated views (React detail/edit + list views)109
Full-text search indexes6
Flows to translate
0 elements total
0
Apex classes to translate
317,863 source lines, 2,471 SOQL statements — 1,940 → SQL deterministically today
1,035
Apex triggers to translate26

Cost exposure

Seat count / per-seat cost not provided — the license-exposure comparison is omitted rather than estimated. Re-run the X-Ray with those two numbers to see annual spend vs one-time conversion.

Stay vs. Own — 5-year savings

Provide --seats N --cost PERSEAT_MONTHLY to the X-Ray to model the savings of replacing Salesforce with a stack you own.

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
remoteSite4
apexCallout37

41 integration point(s) total — 4 mapped to an owned-stack equivalent, 37 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 found176
LWC122
Aura54
Simple (display-only)77
Moderate (one data dependency)0
Complex (imperative calls / events / multiple dependencies)99

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

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

Report refusal reasons

ConstructReports
unknown report object2
unknown field3
unresolved report type2
custom filter logic1

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)2
Query-time resolvers (cross-object formulas)2
Flagged (outside the supported subset)4

9 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 modeled51
Roles0
Role hierarchy depth0
Sharing rules modeled0
Constructs flagged / not modeled29

OWD mix

Org-wide defaultObjects
Private28
ControlledByParent8
ReadWrite15

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
Objects51
Fields597
Validation rules3
Record types0
List views17
Search layouts6
Permission sets0
Page layouts46
Profiles0
Flows0
Apex classes1,035
Apex triggers26
Apex source lines317,863
SOQL statements (measured)2,471
SOQL translating deterministically today1,940 (78.5%)
Workflow rules1
Email templates1
Reports8
Other: (no extension)1
Other: .app4
Other: .app-meta.xml5
Other: .cmp35
Other: .cmp-meta.xml35
Other: .compactlayout-meta.xml11
Other: .component19
Other: .component-meta.xml19
Other: .css97
Other: .csv1
Other: .design2
Other: .document-meta.xml2
Other: .documentfolder-meta.xml1
Other: .emailfolder-meta.xml1
Other: .eot2
Other: .evt13
Other: .evt-meta.xml13
Other: .featureparameterboolean-meta.xml12
Other: .featureparameterdate-meta.xml1
Other: .featureparameterinteger-meta.xml14
Other: .fieldset-meta.xml18
Other: .fieldtranslation-meta.xml6,492
Other: .flexipage-meta.xml4
Other: .gif4
Other: .globalvalueset-meta.xml1
Other: .globalvaluesettranslation-meta.xml8
Other: .html109
Other: .intf1
Other: .intf-meta.xml1
Other: .js301
Other: .js-meta.xml122
Other: .json145
Other: .labels-meta.xml2
Other: .letter-meta.xml1
Other: .matchingrule-meta.xml1
Other: .md-meta.xml193
Other: .notiftype-meta.xml1
Other: .objecttranslation-meta.xml578
Other: .page79
Other: .page-meta.xml79
Other: .png426
Other: .psd1
Other: .py1
Other: .quickaction-meta.xml26
Other: .reportfolder-meta.xml1
Other: .reporttype-meta.xml1
Other: .resource-meta.xml2
Other: .sh1
Other: .snap1
Other: .svg225
Other: .tab-meta.xml17
Other: .tokens1
Other: .tokens-meta.xml1
Other: .translation-meta.xml8
Other: .ttf2
Other: .txt8
Other: .weblink-meta.xml22
Other: .woff2
Total files scanned12,194